Armadilloフォーラム

i.MX8のハードウェアエンコード使用時のセグメンテーションフォルトについて

jfurukawa

2025年6月13日 11時56分

==========
製品型番:AX2210-C00Z
Debian/ABOSバージョン:v3.21.3-at.7
カーネルバージョン:5.10.236-cip55
3G/LTE モジュール情報 (Debianのみ):なし
その他:imxlib_version 2.2.0
==========

お世話になっております。
Armadillo X2を使用して、カメラ映像の
①AWS KinesisVideoStreamsへの配信
②録画
③画像撮影
を行っておりますがセグメンテーションフォルトが発生すると、i.MX8のハードウェアが不安定になる問題があるようです。

再起動すれば一応回復しますが、できれば再起動以外の解決策を見つけたいと考えています。

コンソールから実行しているテストコマンドは以下の通りです。

gst-launch-1.0 -e \
rtspsrc location=rtsp://admin:1234@192.168.1.100/Ch1 latency=200 ! \
rtph265depay ! \
vpudec output-format=NV12 ! \
vpuenc_h264 bitrate=2000 ! \
h264parse ! \
splitmuxsink \
muxer=mp4mux \
location=record_%05d.mp4 \
max-size-time=10000000000

セグメンテーションフォルトが発生する前までは問題なく動作しますが、一度発生するとその後は正常に動かなくなります。

現状、プログラムを段階的に確認していったところ、vpuenc_h264 のところでストリームが止まっているのを確認しました。

こちらに関して、設定誤りなどありましたらご返信いただければと存じます。

コメント

at_dominique.m…

2025年6月13日 12時45分

jfurukawaさん

お世話になっています、
マルティネです。

去年は vpudec でも苦戦してましたが、vpuenc でも問題は発生しますね…

> コンソールから実行しているテストコマンドは以下の通りです。
>
> gst-launch-1.0 -e \
> rtspsrc location=rtsp://admin:1234@192.168.1.100/Ch1 latency=200 ! \
> rtph265depay ! \
> vpudec output-format=NV12 ! \
> vpuenc_h264 bitrate=2000 ! \
> h264parse ! \
> splitmuxsink \
> muxer=mp4mux \
> location=record_%05d.mp4 \
> max-size-time=10000000000
>
> セグメンテーションフォルトが発生する前までは問題なく動作しますが、一度発生するとその後は正常に動かなくなります。

vpuenc ではないですが、以前こちらも「vpu でエラーした後に vpu を利用できなくなる」問題は確認しました。
そのため、vpudec でエラーしてもその後に vpuenc を利用できないなども十分ありえると思います。

再起動以外の回復方法を当時深くに調べてないですが、セグメンテーションフォルトの方を修正すればこちらの問題はなくなりますのでそちらの方向で解析を進みたいと思います。

お手数ですが、いくつかを確認させてください:
* こちらの問題は上記の gst-launch-1.0 コマンド単体(他のアプリケーションすべて停止状態)でも発生していますか?どれぐらいの頻度で発生しているか等の情報が分かれば教えていただければ幸いです。
* 正直なところこちらで再現できないと segfault の修正は難しいと思いますので、こちらで再現できるために受信した h265 ストリームを保存してファイルからの再生で再現を目指したいと思います。
全く未確認ですが、以下の2つのコマンドでファイルの保存・ファイルからの再生はできると思いますが、それで再現できますでしょうか?

# 保存
gst-launch-1.0 -e \
  rtspsrc location=rtsp://admin:1234@192.168.1.100/Ch1 latency=200 ! \
  rtph265depay ! \
  mpegtsmux ! \
  filesink location=file.ts
 
# 無限の再現 (h265parse ではなく tsdemux が必要かもしれません?)
gst-launch-1.0 -e \
    multifilesrc location=file.ts loop=true ! \
    h265parse ! \
    vpudec output-format=NV12 ! \
    vpuenc_h264 bitrate=2000 ! \
    h264parse ! \
    splitmuxsink \
      muxer=mp4mux \
      location=record_%05d.mp4 \
      max-size-time=10000000000

これで再現できたファイルを作成できれば、提供していただければ解析します。

よろしくお願いします

> jfurukawaさん
>
> お世話になっています、
> マルティネです。
>
> 去年は vpudec でも苦戦してましたが、vpuenc でも問題は発生しますね…
>
> > コンソールから実行しているテストコマンドは以下の通りです。
> >
> > gst-launch-1.0 -e \
> > rtspsrc location=rtsp://admin:1234@192.168.1.100/Ch1 latency=200 ! \
> > rtph265depay ! \
> > vpudec output-format=NV12 ! \
> > vpuenc_h264 bitrate=2000 ! \
> > h264parse ! \
> > splitmuxsink \
> > muxer=mp4mux \
> > location=record_%05d.mp4 \
> > max-size-time=10000000000
> >
> > セグメンテーションフォルトが発生する前までは問題なく動作しますが、一度発生するとその後は正常に動かなくなります。
>
> vpuenc ではないですが、以前こちらも「vpu でエラーした後に vpu を利用できなくなる」問題は確認しました。
> そのため、vpudec でエラーしてもその後に vpuenc を利用できないなども十分ありえると思います。
>
> 再起動以外の回復方法を当時深くに調べてないですが、セグメンテーションフォルトの方を修正すればこちらの問題はなくなりますのでそちらの方向で解析を進みたいと思います。
>
>
> お手数ですが、いくつかを確認させてください:
> * こちらの問題は上記の gst-launch-1.0 コマンド単体(他のアプリケーションすべて停止状態)でも発生していますか?どれぐらいの頻度で発生しているか等の情報が分かれば教えていただければ幸いです。
> * 正直なところこちらで再現できないと segfault の修正は難しいと思いますので、こちらで再現できるために受信した h265 ストリームを保存してファイルからの再生で再現を目指したいと思います。
> 全く未確認ですが、以下の2つのコマンドでファイルの保存・ファイルからの再生はできると思いますが、それで再現できますでしょうか?
>

> # 保存
> gst-launch-1.0 -e \
>   rtspsrc location=rtsp://admin:1234@192.168.1.100/Ch1 latency=200 ! \
>   rtph265depay ! \
>   mpegtsmux ! \
>   filesink location=file.ts
> 
> # 無限の再現 (h265parse ではなく tsdemux が必要かもしれません?)
> gst-launch-1.0 -e \
>     multifilesrc location=file.ts loop=true ! \
>     h265parse ! \
>     vpudec output-format=NV12 ! \
>     vpuenc_h264 bitrate=2000 ! \
>     h264parse ! \
>     splitmuxsink \
>       muxer=mp4mux \
>       location=record_%05d.mp4 \
>       max-size-time=10000000000
> 

>
> これで再現できたファイルを作成できれば、提供していただければ解析します。
>
> よろしくお願いします

マルティネ様
お世話になっております。迅速なご返信ありがとうございます。
再現成功しました。マルチチャンネル環境で使用すると、20分以内に確実に発生します。

再現時の内容とデバッグログを添付しましたのでご確認のほどよろしくお願いいたします。

ファイル ファイルの説明
vpudec Debug log.txt

at_dominique.m…

2025年6月13日 17時21分

マルティネです。

> 再現成功しました。マルチチャンネル環境で使用すると、20分以内に確実に発生します。

マルチチャンネルというのはログに入ってるコマンドを別のチャンネルで何回か実行していることでしょうか?
ストリームを src/vrawtee/enctee/arawtee で分裂していることだけでしょうか?

> 再現時の内容とデバッグログを添付しましたのでご確認のほどよろしくお願いいたします。

バックトレースありがとうございます。libfslvpuwrap.so.3 の decoding 処理で失敗していますね…
/opt/firmware の中の so ファイルのデバッグ symbol はないので、すみませんがやっぱり自分が再現できるようにするか、デバッグ用ファームウェアパーティションを準備してインストールしていただきたいです。
(幸いなことに、こちらのライブラリはソースがありますのでデバグビルドはできます)

ひとまずの確認は https://github.com/NXP/imx-vpuwrap.githttps://github.com/nxp-imx/imx-gst1.0-plugin に関係ありそうな修正がないかを確認しましたが、なさそうです(頭の関数に変更なかったです)

再現できそうなファイルを取得できれば一番だと思いますがひとまずデバグ情報の分かる imx_lib.img をビルドしましたので、個別で送らせていただきます。
使い方は、imx_lib.img ファイルを dd 等で /dev/mmcblk2p4 に書き込んで、コンテナ上で deb ファイルをインストールすれば再現した際にライン情報やローカル変数を取得できるはずです。

よろしくお願いします