Xavier JetPack5.01DPでgstreamer

# プラグインの動作確認
gst-inspect-1.0 プラグイン名の出力でプラグインの仕様を表示。
``
gst-inspect-1.0 nvvidconv
``

# cameraソース指定
### usbカメラ
v4l2src device=デバイスファイル
Logitech, Inc. Webcam C270で動作確認済
* 対応フォーマットの確認方法
``
v4l2-ctl --device=/dev/video0 --list-formats-ext
``

```sh:src.sh
#!/bin/sh
SRC="v4l2src device=/dev/video0"
if [ -z $DISPLAY ]; then
        export DISPLAY=:0.0
fi
        
gst-launch-1.0 $SRC ! autovideosink

```
*sshなどで、接続した場合に備え、DISPLAY変数を設定している。
# h264とh265をteeを使って、同時にエンコード
csiカメラ入力、Tを使用して、ファイルh264.mp4とh265.mp4、さらにXwindow出力
tee name=t でパイプは終了。　t. ! queueで新たなパイプ指定開始。
```sh:tee.sh
#!/bin/sh
SRC="usb"
if [ -z $DISPLAY ]; then
        export DISPLAY=:0.0
fi
if [ $SRC = "csi" ];then
        SRC='nvarguscamerasrc sensor-id=0'
        SRC_FORMAT="video/x-raw(memory:NVMM), \
                width=1920, height=1080,format=NV12, framerate=30/1"
else
        SRC="v4l2src device=/dev/video0"
        SRC_FORMAT="video/x-raw,width=640,height=480,framerate=30/1! \
                videoconvert ! video/x-raw,format=NV12 ! \
                nvvidconv ! video/x-raw(memory:NVMM),format=NV12"
fi
echo input source : $SRC
echo input format : $SRC_FORMAT
#export GST_DEBUG=FIXME
gst-launch-1.0 -e $SRC ! $SRC_FORMAT \
   ! tee name=t \
t. ! queue \
   ! nvv4l2h264enc \
   ! h264parse \
   ! qtmux \
   ! filesink location=h264.mp4 \
t. ! queue \
   ! nvv4l2h265enc \
   ! h265parse \
   ! qtmux \
   ! filesink location=h265.mp4 \
t. ! queue \
   ! nvegltransform \
   ! nveglglessink
```
*Xavierとusbカメラc270で動作確認。csiは未確認

# デコード
### h264
```sh:h264.sh
#!/bin/sh
FILE=h264.mp4
if [ -z $DISPLAY ]; then
        export DISPLAY=:0.0
fi

gst-launch-1.0 filesrc location=$FILE !\ 
        qtdemux ! h264parse ! nvv4l2decoder ! \
        nvegltransform ! nveglglessink

```
### h265
```
#!/bin/sh
FILE=h265.mp4
if [ $DISPLAY="" ]; then
        export DISPLAY=:0.0
fi

gst-launch-1.0 filesrc location=$FILE !\
        qtdemux ! h265parse ! nvv4l2decoder ! \
        nvegltransform ! nveglglessink
```

# nvvidconv
### 回転
参照:[NVIDIA Jetson Nano GStreamer example pipelines for video transforming](https://developer.ridgerun.com/wiki/index.php?title=Jetson_Nano/Gstreamer/Example_Pipelines/Streaming)
文字列でも数字でも指定可能
```sh:flip-method.sh
#!/bin/bash
SRC="v4l2src device=/dev/video0"
TEST="vertical-flip"
TEST=0
#   (0): none             - Identity (no rotation)
#   (1): counterclockwise - Rotate counter-clockwise 90 degrees
#   (2): rotate-180       - Rotate 180 degrees
#   (3): clockwise        - Rotate clockwise 90 degrees
#   (4): horizontal-flip  - Flip horizontally
#   (5): upper-right-diagonal - Flip across upper right/lower left diagonal
#   (6): vertical-flip    - Flip vertically
#   (7): upper-left-diagonal - Flip across upper left/lower right diagonal
if [ $DISPLAY="" ]; then
        export DISPLAY=:0.0
fi

echo input: $SRC rotate: $TEST
if [ $TEST -eq 90 ]; then
        gst-launch-1.0 $SRC !\
        nvvidconv flip-method=clockwise !\
        autovideosink
else
        gst-launch-1.0 $SRC !\
        nvvidconv flip-method=$TEST !\
        autovideosink
fi
```
*Xavierとusbカメラc270で動作確認。csiは未確認
*gst-inspect-1.0 nvvidconvで、flip-methodのオプションを確認できる。

### 複数指定
```
#!/bin/bash
if [ -z $DISPLAY ]; then
        export DISPLAY=:0.0
fi
SRC="v4l2src device=/dev/video0"
SRC_FORMAT="video/x-raw,width=640,height=480,framerate=30/1! \
                videoconvert ! video/x-raw,format=NV12 ! \
                nvvidconv ! video/x-raw(memory:NVMM),format=NV12"

export GST_DEBUG=FIXME
gst-launch-1.0 $SRC ! $SRC_FORMAT ! tee name=t \
t. ! queue  \
   ! nvvidconv \
   ! autovideosink \
t. ! queue  \
   ! nvvidconv flip-method=$TEST left=10 right=400 top=10 bottom=300 \
   ! autovideosink \
t. ! queue  \
   ! nvvidconv left=10 right=400 top=10 bottom=300 flip-method=$TEST \
   ! autovideosink
```
# gst-rtsp-server
## コンパイル
* git clone https://github.com/GStreamer/gst-rtsp-server.git
* cd gst-rtsp-server
* git checkout 1.16.2
* ./autogen.sh
 gtk-docがないと表示されたら、aptでgtk-docをインストール。
または、--disable-gtk-doc
 「gst-rtsp-server configured. Type 'make' to build.」
　と表示されれば、makeを実行
* make -j8
* sudo make install

 ## 実行
```
export GST_DEBUG=FIXME
test-launch -p 8554 "v4l2src device=/dev/video0 \
! video/x-raw,width=640,height=480,framerate=30/1 \
! videoconvert ! video/x-raw,format=NV12 \
! nvvidconv ! video/x-raw(memory:NVMM),format=NV12 \
! nvv4l2h264enc \
! rtph264pay name=pay0 pt=96 config-interval=1"
```
# rtsp source
### ファイルに保存
```sh:rtsp_rec.sh
URL="rtsp://hostname:8554/test"
FILE="h264.mp4"
gst-launch-1.0 -e rtspsrc location=$URL ! \
	rtph264depay ! \
	h264parse ! \
	qtmux ! \
	filesink location=$FILE 
```
### ディスプレイに表示
```sh:rtsp_disp.sh
URL="rtsp://hostname:8554/test"
if [ -z $DISPLAY ]; then
        export DISPLAY=:0.0
fi

gst-launch-1.0 -e rtspsrc location=$URL ! \
	rtph264depay ! \
	nvv4l2decoder ! \
	nvvideoconvert ! \
	"video/x-raw(memory:NVMM)",format=NV12 ! \
	nv3dsink
```