Armadilloフォーラム

vpudec使用時にArmadilloがハングアップする事象について

jfurukawa

2024年6月26日 20時21分

Armadillo-IoT G4で、以下に示すGStreamer エレメントでvpudecを使用してカメラデバイスから映像の取得を行おうとしていますが
コマンドを実行後、ArmadilloがハングアップしTeraTermなどのコンソール上から操作ができない状態になってしまいます。

コマンドの設定等で間違いありましたらご教示いただけますでしょうか。

・Gstreamerコマンド
gst-launch-1.0 rtspsrc location=rtsp://id:pass@xxx.xxx.xxx.xxx:port/h265 protocols=4 short-header=TRUE ! rtph265depay ! h265parse ! vpudec output-format=2 ! video/x-raw,format=I420,width=1920,height=1080 ! videoscale ! video/x-raw,format=I420,width=1280,height=720 ! fakesink

・補足
カメラで設定された解像度から期待する解像度に変換してから配信したいという要件があり上記のような設定を行っています。

コメント

at_dominique.m…

2024年6月27日 10時26分

jfurukawaさん

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

いくつかを確認させてください。

> Armadillo-IoT G4で、以下に示すGStreamer エレメントでvpudecを使用してカメラデバイスから映像の取得を行おうとしていますが
> コマンドを実行後、ArmadilloがハングアップしTeraTermなどのコンソール上から操作ができない状態になってしまいます。

どれぐらいの時間で固まるか分かりますか?
TeraTerm をあらかじめ開けた状態で再現すると操作できなくなる前にメッセージが表示されますでしょうか?
操作できなくなった後に数分待つと自動的に再起動されますでしょうか?(watchdogタイマーによるリセット)

> コマンドの設定等で間違いありましたらご教示いただけますでしょうか。
>
> ・Gstreamerコマンド
> gst-launch-1.0 rtspsrc location=rtsp://id:pass@xxx.xxx.xxx.xxx:port/h265 protocols=4 short-header=TRUE ! rtph265depay ! h265parse ! vpudec output-format=2 ! video/x-raw,format=I420,width=1920,height=1080 ! videoscale ! video/x-raw,format=I420,width=1280,height=720 ! fakesink

これで問題ないと思いますので、こちらで再現して細かい確認を行いたいですが、rtsp のストリームをファイルに保存して共有できますでしょうか?

以下のコマンドでファイルとして保存されると思います:

gst-launch-1.0 rtspsrc location=rtsp://xxx/h265 protocols=4 short-header=TRUE '!' rtph265depay '!' mpegtsmux '!' filesink location=file.ts

保存したファイルをこういう風に処理すると再現できると思いますが、そこまで確認していただければ大変助かります:

gst-launch-1.0 multifilesrc location=foo.ts loop=true ! h265parse ! vpudec output-format=2 ! video/x-raw,format=I420,width=1920,height=1080 ! videoscale ! video/x-raw,format=I420,width=1280,height=720 ! fakesink

再現できなくても ts ファイルで何か分かるかもしれませんので、20-30秒ぐらいのサンプルをいただければ確認します。

> ・補足
> カメラで設定された解像度から期待する解像度に変換してから配信したいという要件があり上記のような設定を行っています。

すでに確認の上だと思いますが、解像度をカメラの設定では変更できないですね?

お手数ですが、よろしくお願いします。

jfurukawa

2024年6月27日 13時36分

マルティネ様

お世話になっております。
ご連絡ありがとうございます。

ご質問いただいた件について回答いたします。

> どれぐらいの時間で固まるか分かりますか?
> TeraTerm をあらかじめ開けた状態で再現すると操作できなくなる前にメッセージが表示されますでしょうか?
> 操作できなくなった後に数分待つと自動的に再起動されますでしょうか?(watchdogタイマーによるリセット)
現在までに事象が一度だけしか起きていないたため、現在もう一度再現できないか確認しています。
そのときは、数分待っても再起動しませんでした。

>以下のコマンドでファイルとして保存されると思います:
コマンドを実行して取得したtsファイルを添付ファイルとしてお送りしますのでご確認をお願いいたします。
こちらでファイルを処理して再現できるかは今確認しているので結果がわかったら再度ご連絡いたします。
ちなみに、foo.tsは取得したファイル名であっていますでしょうか?

>すでに確認の上だと思いますが、解像度をカメラの設定では変更できないですね?
カメラの設定でも変更は可能ですがGstreamerで一律同じ解像度に調整したいという要望があってGstreamer側で処理できないかを確認しています。

jfurukawa

2024年6月27日 13時37分

すみません。tsファイルは許可されていないファイルとしてアップロードすることができませんでした。
なにか別の方法で共有は可能でしょうか?

at_dominique.m…

2024年6月27日 14時39分

jfurukawaさん

> すみません。tsファイルは許可されていないファイルとしてアップロードすることができませんでした。
> なにか別の方法で共有は可能でしょうか?

すみません、このフォーラムでは .ts として添付できないですね…
お手数ですが tar.gz か zip ファイルに入れていただければ添付できるようになると思います。

> 現在までに事象が一度だけしか起きていないたため、現在もう一度再現できないか確認しています。
> そのときは、数分待っても再起動しませんでした。

了解しました。

> >以下のコマンドでファイルとして保存されると思います:
> コマンドを実行して取得したtsファイルを添付ファイルとしてお送りしますのでご確認をお願いいたします。
> こちらでファイルを処理して再現できるかは今確認しているので結果がわかったら再度ご連絡いたします。
> ちなみに、foo.tsは取得したファイル名であっていますでしょうか?

すみません、一つ目の保存するコマンドでは「file.ts」にリネームしていましたが、確認のコマンドは手元で確認していた「foo.ts」のままでした。
foo.ts を取得したファイル名に変更していただければ幸いです。

> >すでに確認の上だと思いますが、解像度をカメラの設定では変更できないですね?
> カメラの設定でも変更は可能ですがGstreamerで一律同じ解像度に調整したいという要望があってGstreamer側で処理できないかを確認しています。

了解しました。
ファイルをいただいたら確認します。

よろしくお願いします。

jfurukawa

2024年6月27日 14時46分

マルティネ様

お世話になっております。
ファイル添付の方法についてもご教示くださりありがとうございます。
添付しなおしましたのでご確認のほどよろしくお願いいたします。

ファイル ファイルの説明
file.zip tsファイル

jfurukawa

2024年6月27日 15時14分

マルティネ様

お世話になっております。
取得したtsファイルからの再生でもハングアップすることがか確認できましたのでご報告いたします。
使用したコマンドは下記のものです。
gst-launch-1.0 multifilesrc location=file.ts loop=true ! h265parse ! vpudec output-format=2 ! video/x-raw,format=I420,width=1920,height=1080 ! videoscale ! video/x-raw,format=I420,width=1280,height=720 ! fakesink

jfurukawa

2024年6月27日 15時18分

マルティネ様

度々申し訳ございません。
上記でハングアップが発生後、Armadilloが自動で再起動が開始されましたので合わせてご報告いたします。

以上、よろしくお願いいたします。

at_dominique.m…

2024年6月27日 17時39分

jfurukawaさん

ファイルと確認ありがとうございます。

> 添付しなおしましたのでご確認のほどよろしくお願いいたします。
> gst-launch-1.0 multifilesrc location=file.ts loop=true ! h265parse ! vpudec output-format=2 ! video/x-raw,format=I420,width=1920,height=1080 ! videoscale ! video/x-raw,format=I420,width=1280,height=720 ! fakesink

この file.ts / コマンドですが、そのコマンドで処理に入る前に gstreamer がどこかで固まります(armadilloまで固まりません)
ffmpeg によると 1280x720 の h264 ストリームですので、コマンドが期待している h265 の 1920x1080 と違うところでエラーしているようです。

試しにコマンドを h264parse, 1280x720 -> 1920x1080 に変更してみたら確かに色々おかしいに見えますので追加調査が必要ですが、ひとまずストリームを確認したかったのでファイルはこれであっていますか?(sha256sum は ATDE か armadillo にでも実行できます)

$ sha256sum file.*
1fd518ff3ca815c8f90d42fdbffc48702b16535bba5c321d45191e9bfa860e7c  file.ts
f9c99db8cd80fd5ed2248f37a022b62dce9251338b5dd6b85ec2ab1517dbf71d  file.zip
$ ffmpeg -i file.ts
...
  Duration: 00:00:31.24, start: 3600.105678, bitrate: 1756 kb/s
  Program 1 
  Stream #0:0[0x41]: Video: h264 (High) (HDMV / 0x564D4448), yuvj420p(pc, bt709, progressive), 1280x720 [SAR 1:1 DAR 16:9], 30 fps, 30 tbr, 90k tbn

> 上記でハングアップが発生後、Armadilloが自動で再起動が開始されましたので合わせてご報告いたします。

了解しました。

今のファイルで再現できた問題は、メモリが暴走していて不足になった際に固まる状態になりますが、厳密では固まっているよりものすごくなっているだけで watchdog がまだ動いている状態に見えます。

そのため、こちらで再現している物は少し違うと思いますので、すみませんがハングする前に以下のような出力があると思いますが:

Setting pipeline to PAUSED ...
====== VPUDEC: 4.6.1 build on Aug 18 2023 01:11:55. ======
	wrapper: 3.0.0 (VPUWRAPPER_ARM64_LINUX Build on Apr 22 2022 06:11:12)
	vpulib: 1.1.1
	firmware: 1.1.1.43690
Pipeline is PREROLLING ...
 
Pipeline is PREROLLED ...
Setting pipeline to PLAYING ...
New clock: GstSystemClock
 
00:00:36.8 / 99:99:99.

タイミングが表示されるか、進んでいるかを教えていただければ今の問題を優先できますので、お願いします。

よろしくお願いします。

jfurukawa

2024年6月27日 18時29分

マルティネ様

お世話になっております。ご連絡ありがとうございます。

> 試しにコマンドを h264parse, 1280x720 -> 1920x1080 に変更してみたら確かに色々おかしいに見えますので追加調査が必要ですが、ひとまずストリームを確認したかったのでファイルはこれであっていますか?(sha256sum は ATDE か armadillo にでも実行できます)
すみません。添付ファイルが間違っていたので再度添付ファイルで送付いたします。

> > 上記でハングアップが発生後、Armadilloが自動で再起動が開始されましたので合わせてご報告いたします。
>
> 了解しました。
>
> 今のファイルで再現できた問題は、メモリが暴走していて不足になった際に固まる状態になりますが、厳密では固まっているよりものすごくなっているだけで watchdog がまだ動いている状態に見えます。
>
> そのため、こちらで再現している物は少し違うと思いますので、すみませんがハングする前に以下のような出力があると思いますが:
>

> Setting pipeline to PAUSED ...
> ====== VPUDEC: 4.6.1 build on Aug 18 2023 01:11:55. ======
> 	wrapper: 3.0.0 (VPUWRAPPER_ARM64_LINUX Build on Apr 22 2022 06:11:12)
> 	vpulib: 1.1.1
> 	firmware: 1.1.1.43690
> Pipeline is PREROLLING ...
> 
> Pipeline is PREROLLED ...
> Setting pipeline to PLAYING ...
> New clock: GstSystemClock
> 
> 00:00:36.8 / 99:99:99.
> 

>
> タイミングが表示されるか、進んでいるかを教えていただければ今の問題を優先できますので、お願いします。

00:00:36.8 / 99:99:99.
00:00:36.8の部分が00:00:00.0から更新されるか?ということでしょうか?
私の環境では00:00:00.0からカウントされていませんでした。(そのあと、すぐにHangします。)

ファイル ファイルの説明
file.zip

at_dominique.m…

2024年7月2日 11時16分

jfurukawaさん

お待たせしました、マルティネです。

> すみません。添付ファイルが間違っていたので再度添付ファイルで送付いたします。

何度もすみません。こちらのファイルですと、videoscale なくても vpudec の時点で gstreamer がすべての frame を drop して何も処理しないようです…
これもまた何かの不具合だと思いますが、今追っている「再生時間が 00:00:00.0 のまま armadillo がフリーズします」問題と異なるのでこのファイルを一旦保留しました。

最初にいただいた h264 のサンプルを以下のコマンドで処理すると同じ問題を発生できたと思います:

gst-launch-1.0 multifilesrc location=file.ts loop=true ! h264parse ! vpudec output-format=2 ! video/x-raw,format=I420,width=1280,height=720 ! videoscale ! video/x-raw,format=I420,width=1920,height=1080 ! fakesink

こちらの問題は最後まで確認できてませんが、見たところで buffer(画像データ)のリストに何かの問題があって、永遠にメモリをコピーしてメモリがすべて消費された際に armadillo が固まります。
修正まではできてませんが、vpudec を別のデコーダーに入れ替えてみて videoscale を試したら videoscale の性能は恐らくここで行いたい処理にはたりないと思います(ビデオのスピードよりやや遅いので、リアルタイムのストリームには使えません)

そこですみません、このコマンドでいいと言っていましたが、Armadillo IoT G4 での「imxvideoconvert_g2d」を代わりに使用すると早く rescale できます。
また、今まで発生していた問題も発生しなくなります。(videoconvert は遅いので NXP が恐らくあまりテストされてなかったと思います…)

以下のコマンドでいかがでしょうか?

gst-launch-1.0 multifilesrc location=file_h264.ts loop=true ! h264parse ! vpudec output-format=2 ! video/x-raw,format=I420,width=1280,height=720 ! imxvideoconvert_g2d ! video/x-raw,width=1920,height=1080 ! autovideosink

注意点:
* 最新のファイルは処理できないので最初の h264 のファイルで確認しました。 元々の画像が化けていると思いますのでどのみち何も見えてませんが、そのファイルで vpudec を使うと全画面緑色の映像になってしまいます(他の decoder は灰色です)。お手数ですが問題あったら画像を見えるサンプルをまたいただければ助かります。
* `imxvideoconvert_g2d` は `videoconvert` と違って出力に format=I420 を指定するとエラーしますが、出力を確認したらちゃんと yuvj420p になりますので省略しても問題ないと思います。
* また配信すると `vpuenc_{h264かhevc} ! mpegtsmux` も必要になると思います。こちらも filesink で確認して大丈夫そうでした。

大変お手数ですが、よろしくお願いします。