😺

Jetson AGX Orin のgstreamerでAV1のハードウェアエンコードを試す(その2)

2022/05/18に公開

前回の記事ではJPEGのデコードにソフトウェア実装のものしか使えませんでした。
この記事を参考に試したところ、mjpegのハードウェアデコードの方法を見つけることができました。
https://dream-soft.mydns.jp/blog/developper/smarthome/2020/09/2291/

nvjpegdec を使う方法

gst-launch-1.0 v4l2src device="/dev/video0" ! \
    'image/jpeg, width=1280, height=720, framerate=30/1' ! \
    nvjpegdec ! 'video/x-raw' ! \
    nvvidconv ! 'video/x-raw(memory:NVMM), format=(string)I420' ! \
    nvv4l2av1enc enable-headers=1 bitrate=1000000 ! \
    filesink location=a5.ivf -e

nvjpegdecは出力先にvideo/x-rawvideo/x-raw(memory:NVMM)が選べるはずなのですが、後者だとうまくいきません。
JPEGのデコード処理はGPUメモリ上でやると思うのですが、それを一度CPUメモリに転送してから再度av1のエンコードのためにGPUメモリに転送することになるので遠回りしている感じがあります。

nvv4l2decoder を使う方法

おそらく本命はこちら。nvv4l2decoderにmjpegを指定してデコードします。
こちらだとGPUメモリに置いたままで処理が進んでいきます。

gst-launch-1.0 v4l2src device="/dev/video0" ! \
    'image/jpeg, width=1280, height=720, framerate=30/1' ! \
    nvv4l2decoder mjpeg=1 ! 'video/x-raw(memory:NVMM)' ! \
    nvvidconv ! 'video/x-raw(memory:NVMM), format=(string)I420' ! \
    nvv4l2av1enc enable-headers=1 bitrate=1000000 ! \
    filesink location=a6.ivf -e

Discussion