Armadilloフォーラム

動画へのtextoverlay

y.nakamura

2015年3月23日 15時34分

中村です。

以前の投稿で、テストパターン(videotestsrc)でのtextoverlayは
できたのですが、動画にオーバレイができずに困っています。
Armadillo-840+純正の液晶です。

(下に書くgst-launchのコマンドラインは読みやすさのために
細かく改行を入れています)

gst-launch-1.0 filesrc location=big-buck-bunny-30sec-800x480.mp4 \
! qtdemux ! acmh264dec ! video/x-raw,format=RGB \
! textoverlay text="Hello" \
! acmfbdevsink device=/dev/fb1 use-dmabuf=false

これを実行すると、次のようなエラーになり再生できません。
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:pipeline0/GstAcmH264Dec:acmh264dec0:
failed gst_video_decoder_finish_frame()
ERROR: pipeline doesn't want to preroll.

上のパイプラインからtextoverlayを外せば問題なく再生できます。
queueを入れていませんが、queueの有無は関係なさそうです。

"format=RGB"を付けているのは、textoverlayで"RGBx"のときに
問題が起きるのを回避するためなのですが、このtextoverlayの
問題については、ここでは省略します。
現象としては、"format=RGB"なし('RGBx'となる?)でも、
"format=RGBx"でも同じです。

エラーメッセージに"Could not decode stream"と出ていますが、
後の方の問題が前(acmh264dec)に影響していることも考えられますので、
fakesinkやfilesinkへ出力するようにしてみたところ、これらは
問題はおきませんでした。

filesinkでファイルに落とし、適当なプログラムを作って、
ファイルの中の生RGBデータをパソコンで表示させてみたところ、
正しく"Hello"という文字がオーバーレイされていました。

そうすると問題なのは textoverlay => acmfbdevsink の接続と思い、
acmfbdevsinkのソースを見てみたり、debug-levelを5くらいにして、
正常な場合(textoverlayなし)とエラーの場合(textoverlayあり)の
デバッグ出力を見比べたりしてみたのですが、どうすればいいのか、
皆目見当がつかない状態です。
ログからパッド接続に問題がありそうというのはわかるのですけど。

acmfbdevsinkを手直しすることになると思うのですが、
なにかアドバイスをいただけますでしょうか?

よろしくお願いいたします。

--
なかむら

コメント

y.nakamura

2015年3月23日 16時56分

中村です。

先ほどの投稿で、
> filesinkでファイルに落とし、適当なプログラムを作って、
> ファイルの中の生RGBデータをパソコンで表示させてみたところ、
> 正しく"Hello"という文字がオーバーレイされていました。
の具体例を書いてませんでした。

こんなのです。
gst-launch-1.0 filesrc location=/mnt/big-buck-bunny-30sec-800x480.mp4 \
! qtdemux ! acmh264dec ! video/x-raw,width=200,height=120,format=RGB \
! textoverlay text="Hello" font-desc="Verdana bold 60px" \
! filesink location=hoge.raw

800x480だと大きくてテストに不便なので200x120にしてます。
で、ファイルにしたhoge.raw(拡張子は適当に付けてます)を、
RGBを直接表示するプログラムを作って表示させました。

「プログラムを作って表示」ではなくて、簡単にパソコンで確認できる
いい方法はないかと考え、avi化すればいいではないか・・・と、
こんなの(↓)も試しました。音声も一緒です。

gst-launch-1.0 filesrc location=/mnt/big-buck-bunny-30sec-800x480.mp4 ! qtdemux name=demux \
demux. ! queue ! acmaacdec \
! audioresample ! audio/x-raw,rate=48000,channels=2 ! queue ! mux. \
demux. ! queue ! acmh264dec ! video/x-raw,width=200,height=120,format=RGB \
! textoverlay text="Hello" font-desc="Verdana bold 60px" \
! videoconvert ! video/x-raw,format=YUY2 ! queue ! mux. \
avimux name=mux ! filesink location=/home/ftp/pub/hoge.avi

textoverlay から videoconvert してavimux に渡すのはOKのようです。

--
なかむら

y.nakamura

2015年3月24日 20時24分

中村です。

投稿のタイトルを「動画へのtextoverlay」としていましたが、
透過pngを用意して、動画にpngで図やテキストを貼り付けるために
videomixerも試してみました。

結果としては、やはり acmfbdevsinkにつなげようと
するとエラーにります。
acmfbdevsinkでなくfbdevsinkでもいいのですが、
なんとかならないものかと考えています。

videomixerは、次の方法で試しました。

pngをvideomixerの入力にするためにimagefreezeが
必要ということなので、
/usr/arm-linux-gnueabihf/lib/gstreamer-1.0/libgstimagefreeze.so
をatmark-dist-xxxxx/romfs/usr/lib/gstreamer-1.0/の下にコピーして
ユーザランドのimageを作り直し。

textoverlayのときと同じように、200x120サイズにして、
filesinkを使って生RGBファイル化。
(1つ前の投稿で書いたようにavi化でもいいのですが・・・)

gst-launch-1.0 \
filesrc location=big-buck-bunny-30sec-800x480.mp4 \
! qtdemux ! acmh264dec ! video/x-raw,width=200,height=120 \
! videoconvert ! video/x-raw,format=RGBA ! mix. \
filesrc location=Hello.png ! pngdec ! imagefreeze \
! videoconvert ! video/x-raw,format=RGBA ! mix. \
videomixer name=mix ! videoconvert ! video/x-raw,format=RGB \
! filesink location=/home/ftp/pub/hoge.raw

ここで、Hello.pngは200x120の透過pngです。
これはエラーなく(動画が終わった後に放置すると落ちますが
これは別の問題ということで、今回は無視)実行できて、
生RGBファイルも想定通りにできあがりました。

LCD(acmfbdevsink)への出力は次のように試しました。

gst-launch-1.0 \
filesrc location=big-buck-bunny-30sec-800x480.mp4 \
! qtdemux ! acmh264dec \
! videoconvert ! video/x-raw,format=RGBA ! mix. \
filesrc location=Hello.png ! pngdec ! imagefreeze \
! videoconvert ! video/x-raw,format=RGBA ! mix. \
videomixer name=mix ! videoconvert ! video/x-raw,format=RGBx \
! acmfbdevsink device=/dev/fb1 use-dmabuf=false

これを実行すると、textoverlayのときと同じエラーになります。
(最後のvideoconvertのformatをRGBxではなくRGBにしても同じ)

--
なかむら