Armadilloフォーラム

Gstreamerのデコードエラーについて

sg.motono

2018年3月27日 11時28分

いつもお世話になっております。本野と申します。

Armadillo-840にネットワークカメラを接続し、Gstreamerを用いて映像(H.264)の録画・再生動作の確認を行っています。
解像度最大1920x1080、フレームレート最大30fpsの録画再生を実現したいのですが
解像度を1920x1080に設定した場合、フレームレートを20fps以下に設定しないと
録画生成したファイルの再生ができません。
(これより大きいフレームレート設定の場合、デコードエラーが発生する)

テスト環境
 HW: Armadillo-840
 FW: squashfs-a800-firmware-v3.02.img
 フレームワーク:
    gstreamer-1.6.2
    gst-plugins-base-1.6.2
    gst-plugins-good-1.6.2
    gst-plugins-bad-1.6.2
    gst-plugins-at-acm_1.0.2

結果
 以下のようなコマンド実行で録画ファイルの再生に失敗します。
 
 #準備(映像領域を表示しておく)

 echo 0 > /sys/class/graphics/fb1/blank

 #録画

 gst-launch-1.0 -e rtspsrc
   'location=rtsp://ID:PASSWORD@IPアドレス:ポート番号/onvif/profile2/media.smp' 
   latency=2000 ! rtph264depay ! video/x-h264, framerate=30/1 ! h264parse
   config-interval=1 ! splitmuxsink max-size-time=120000000000
   location=test%05d.mp4 muxer=mp4mux

 #再生

 gst-launch-1.0 filesrc 'location=test00000.mp4' ! qtdemux ! acmh264dec
   stride=1024 ! videoscale add-borders=TRUE ! video/x-raw, width=1024, height=576, framerate=30/1 ! acmfbdevsink device=/dev/fb1

 #エラーメッセージ

 ERROR: from element /GstPipeline:pipeline0/GstAcmH264Dec:acmh264dec0: 
   ストリームをデコードできません
 追加のデバッグ情報:
 gstacmh264dec.c(1470): gst_acm_h264_dec_handle_frame (): 
   /GstPipeline:pipeline0/GstAcmH264Dec:acmh264dec0:
 could not dequeue buffer. 5 (入力/出力エラーです)
 ERROR: pipeline doesn't want to preroll.

この件に関しまして、問題原因の切り分け、もしくは対処法についてご教授頂けないでしょうか。
何卒よろしくお願い申し上げます。

コメント

>  #再生
>

>  gst-launch-1.0 filesrc 'location=test00000.mp4' ! qtdemux ! acmh264dec
>    stride=1024 ! videoscale add-borders=TRUE ! video/x-raw, width=1024, height=576, framerate=30/1 ! acmfbdevsink device=/dev/fb1
> 

acmh264decはスケーリングする機能を持っています。caps( video/x-raw,....という節)
が設定されていれば、出力はそれにあわせて拡縮されるためvideoscaleは必要ありません。

また、acmfbdevsinkは、acmh264dec用にdma転送可能なバッファを提供する
ので間にvideoscaleを入れるとフレームがmemcpyされてCPUが無駄に動作するので、
そういった意味でもvideoscaleは入れない方が良いです。

ただ、videoscaleを入れてもエラーはしないとは思うのですが、
この使い方は、想定していなかったのでvideoscaleを外して発生の有無を
確認してみてください。

>  #エラーメッセージ
>

>  ERROR: from element /GstPipeline:pipeline0/GstAcmH264Dec:acmh264dec0: 
>    ストリームをデコードできません
>  追加のデバッグ情報:
>  gstacmh264dec.c(1470): gst_acm_h264_dec_handle_frame (): 
>    /GstPipeline:pipeline0/GstAcmH264Dec:acmh264dec0:
>  could not dequeue buffer. 5 (入力/出力エラーです)
>  ERROR: pipeline doesn't want to preroll.
> 

>
> この件に関しまして、問題原因の切り分け、もしくは対処法についてご教授頂けないでしょうか。
> 何卒よろしくお願い申し上げます。
>
>
>
>

> acmh264decはスケーリングする機能を持っています。caps( video/x-raw,....という節)
> が設定されていれば、出力はそれにあわせて拡縮されるためvideoscaleは必要ありません。
>
> また、acmfbdevsinkは、acmh264dec用にdma転送可能なバッファを提供する
> ので間にvideoscaleを入れるとフレームがmemcpyされてCPUが無駄に動作するので、
> そういった意味でもvideoscaleは入れない方が良いです。
>
> ただ、videoscaleを入れてもエラーはしないとは思うのですが、
> この使い方は、想定していなかったのでvideoscaleを外して発生の有無を
> 確認してみてください。

videoscaleについてですが、映像を全画面に表示させるのではなく、
画面内の一部領域に描画を行いたいため意図的に使用しております。

videoscaleを外すと以下のようなエラーメッセージが表示されます。
#再生

gst-launch-1.0 filesrc 'location=test00000.mp4' ! 
qtdemux ! acmh264dec stride=1024 ! video/x-raw, width=1024, height=576 ! 
acmfbdevsink device=/dev/fb1

#エラーメッセージ

ERROR: from element /GstPipeline:pipeline0/GstQTDemux:qtdemux0: 
GStreamer 上で一般的なストリームエラーが起きました
追加のデバッグ情報:
qtdemux.c(5319): gst_qtdemux_loop (): 
/GstPipeline:pipeline0/GstQTDemux:qtdemux0:
streaming stopped, reason not-linked
ERROR: pipeline doesn't want to preroll.
Setting pipeline to NULL ...
Freeing pipeline ...

at_kojiro.yamada

2018年4月23日 16時53分

> videoscaleについてですが、映像を全画面に表示させるのではなく、
> 画面内の一部領域に描画を行いたいため意図的に使用しております。
>
> videoscaleを外すと以下のようなエラーメッセージが表示されます。
> #再生
>

> gst-launch-1.0 filesrc 'location=test00000.mp4' ! 
> qtdemux ! acmh264dec stride=1024 ! video/x-raw, width=1024, height=576 ! 
> acmfbdevsink device=/dev/fb1
> 

Armadillo-840の標準イメージでは、
ほぼ同じパイプラインで動画のスケーリングおよび再生できており、
エラーメッセージは表示されませんでした。

逆に、 videoscale を acmh264dec と acmfbdevsink の間に入れると
エラーとなり再生できません。(後述)

■acmh264decエレメントでスケーリング

ハードウェアは、Armadillo-840 液晶モデル開発セット
ソフトウェアは
Linuxカーネル: http://download.atmark-techno.com/armadillo-840/image/linux-a840-v1.21…
ユーザーランド: http://download.atmark-techno.com/armadillo-840/image/romfs-a840-v1.14…
gstreamer:
    gstreamer-1.0.8
    gst-plugins-base-1.0.8
    gst-plugins-good-1.0.8
    gst-plugins-bad-1.0.8
    gst-plugins-at-acm_1.0.2
動画: http://download.atmark-techno.com/sample/bbb/big-buck-bunny-30sec-fullh…
です。

コマンドは以下のとおりです。

[A840]# gst-launch-1.0 filesrc \
location=/mnt/big-buck-bunny-30sec-fullhd.mp4 ! \
qtdemux ! acmh264dec stride=800 ! \
video/x-raw, width=800, height=480 ! \
acmfbdevsink device=/dev/fb1

※動画ファイルをSDカードに入れて/mntにマウントしています。
※LCDに表示したので、stride, width, heightはLCDの解像度に合わせています。

■videoscaleのエレメントでスケーリング

環境は「acmh264decエレメントでスケーリング」と同じです。

コマンドとエラーメッセージは以下のとおりです。

[A840]# gst-launch-1.0 filesrc \
location=/mnt/big-buck-bunny-30sec-fullhd.mp4 ! \
qtdemux ! acmh264dec ! \
videoscale add-borders=TRUE ! \
video/x-raw, width=800, height=480 ! \
acmfbdevsink device=/dev/fb1
 
Setting pipeline to PAUSED ...
Pipeline is PREROLLING ...
ERROR: from element /GstPipeline:pipeline0/GstAcmH264Dec:acmh264dec0: Could not 
decode stream.
Additional debug info:
gstacmh264dec.c(2345): gst_acm_h264_dec_handle_out_frame (): /GstPipeline:pipeli
ne0/GstAcmH264Dec:acmh264dec0:
failed gst_video_decoder_finish_frame()
ERROR: pipeline doesn't want to preroll.
Setting pipeline to NULL ...
Freeing pipeline ...

> ■acmh264decエレメントでスケーリング
>
> ハードウェアは、Armadillo-840 液晶モデル開発セット
(中略)
> 動画: http://download.atmark-techno.com/sample/bbb/big-buck-bunny-30sec-fullh…

リンク先の動画についてはこちらの環境でも再生できました。

#big-buck-bunny-30sec-fullhd.mp4の再生 ⇒ 再生可能

gst-launch-1.0 filesrc 'location=big-buck-bunny-30sec-fullhd.mp4' ! 
qtdemux ! acmh264dec stride=1024 ! videoscale add-borders=TRUE ! 
video/x-raw, width=1024, height=576 ! acmfbdevsink device=/dev/fb1

しかし、ネットワークカメラからgstremerで録画作成した映像では
引き続きエラーが発生します。

#サンプル動画(test00000.mp4)の再生 ⇒ 再生不可能(エラーメッセージが表示されます)

gst-launch-1.0 filesrc 'location=test00000.mp4' ! qtdemux ! acmh264dec
stride=1024 ! videoscale add-borders=TRUE ! video/x-raw, width=1024,
height=576 ! acmfbdevsink device=/dev/fb1

エラーメッセージが発生するサンプル動画を下記リンク先にアップロードしましたのでご確認頂けないでしょうか。
https://1drv.ms/u/s!AhQRPZxyOdT6gSgk1aoT_NBCLEQ9
よろしくお願い致します。

at_kojiro.yamada

2018年4月25日 19時59分

> https://1drv.ms/u/s!AhQRPZxyOdT6gSgk1aoT_NBCLEQ9

上記動画は、Armadillo-840製品マニュアルに記載されている
AVコーデックミドルウェア H.264/AVCデコーダー仕様[1]
を満たしていないようです。

AVコーデックミドルウェア H.264/AVCデコーダー仕様をご確認いただき、
エンコード設定を変更していただくようお願いいたします。

[1] Armadillo-840製品マニュアル(現状の最新バージョン)
https://manual.atmark-techno.com/armadillo-840/armadillo-840_product_ma…

以下は推測ですが、

1080p 30fps の動画は、Maximum bit rateが40Mbpsを超えていたた
めに、再生できなかったのではないかと思います。
また、Format profileもHigh@L5.1となっており、仕様を満たしていませんの
で正常には動作しないと思います。

サンプル動画をご確認頂きありがとうございました。
動画が仕様を満たしておらずご迷惑おかけしました。
エンコーダ側の設定変更が出来ないか確認してみます。

ちなみにArmadillo-840のAC codecミドルウェアの
Format profile High@L5.1へ対応する予定はないでしょうか。

at_kojiro.yamada

2018年5月14日 12時51分

> ちなみにArmadillo-840のAC codecミドルウェアの
> Format profile High@L5.1へ対応する予定はないでしょうか。

申し訳ありませんが、
AVコーデックミドルウェアのFormat profile High@L5.1への対応の予定はありません。

at_kojiro.yamada

2018年3月30日 15時40分

> Armadillo-840にネットワークカメラを接続し、Gstreamerを用いて映像(H.264)の録画・再生動作の確認を行っています。
> 解像度最大1920x1080、フレームレート最大30fpsの録画再生を実現したいのですが
> 解像度を1920x1080に設定した場合、フレームレートを20fps以下に設定しないと
> 録画生成したファイルの再生ができません。
> (これより大きいフレームレート設定の場合、デコードエラーが発生する)

念のため確認なのですが、デコードしようとしている映像はインターレースの1080 30fpsである可能性はないでしょうか?

Armadillo-840 製品マニュアル(下記URL)に記載されているとおり、AVコーデックミドルウェアは
「インタレースシーケンスの場合、30fpsの場合画像サイズ1440x1080まで、画像サイズ1920x1080であれば20fpsまで」となっております。
https://manual.atmark-techno.com/armadillo-840/armadillo-840_product_ma…

> 念のため確認なのですが、デコードしようとしている映像はインターレースの1080 30fpsである可能性はないでしょうか?
>
動画ファイルをmediainfoにて確認したところ"Progressive"となっております。