Armadilloフォーラム

動画再生時のブランク部分の塗りつぶしについて

e-yamada

2015年5月12日 19時00分

お世話になります。
Armadillo-840にて動画再生時のブランク部分の塗りつぶし(黒色)をなくし、任意の背景色(白色など)に変更したいと考えております。
下記の書き込み内容を参考に、GStreamerのプラグインのソース変更・ビルドまでを実施しました。

 https://armadillo.atmark-techno.com/forum/armadillo/644

 https://armadillo.atmark-techno.com/forum/armadillo/750

【GStreamerのソース取得(ATDE)】
atmark@atde5:/$ sudo apt-get install libtool
atmark@atde5:/$ sudo apt-get install automake
atmark@atde5:/$ wget http://download.atmark-techno.com/armadillo-840/cross-dev/source/gst-pl…
atmark@atde5:/$ tar xzf gst-plugins-at-acm_1.0.2.tar.gz
atmark@atde5:/$ cd gst-plugins-at-acm_1.0.2

【ソースコードの変更】
・変更ファイル:gst-plugins-at-acm_1.0.2/src/gstacmfbdevsink.c
・変更箇所  :
  static gboolean
  do_blank_screen(GstAcmFBDevSink *me)
  {
    gboolean ret = TRUE;
    int vsyncArg = 0;
    int r;

★   return ret; ←一行追加

    ・
    ・
  }

【GStreamerのコンパイル(ATDE)】
■コンパイルエラー対策の為、"/usr/arm-linux-gnueabihf/"配下のインクルードファイルをコピー
atmark@atde5:~/gst-plugins-at-acm_1.0.2$ cp -r /usr/arm-linux-gnueabihf/include/gstreamer-1.0/gst/ ./

atmark@atde5:~/gst-plugins-at-acm_1.0.2$ autoreconf -vfi
atmark@atde5:~/gst-plugins-at-acm_1.0.2$ PKG_CONFIG_LIBDIR=/usr/arm-linux-gnueabihf/lib/pkgconfig ./configure --build=$(./config.guess) --host=arm-linux-gnueabihf

■src/Makefile内の"GST_CFLAGS"に下記を追記
-I/usr/arm-linux-gnueabihf/include/gstreamer-1.0

atmark@atde5:~/gst-plugins-at-acm_1.0.2$ make

■make完了後に"/src/.libs"にsoファイルが作成される
atmark@atde5:~/gst-plugins-at-acm_1.0.2/src$ cd ./.libs/
atmark@atde5:~/gst-plugins-at-acm_1.0.2/src/.libs$ ls

■soファイルをarmadilloにコピー(FTPを使用)
[root@armadillo840-0]# cp /home/ftp/pub/libgstacmaacdec.so /usr/lib/gstreamer-1.0/
[root@armadillo840-0]# cp /home/ftp/pub/libgstacmaacenc.so /usr/lib/gstreamer-1.0/
[root@armadillo840-0]# cp /home/ftp/pub/libgstacmfbdevsink.so /usr/lib/gstreamer-1.0/
[root@armadillo840-0]# cp /home/ftp/pub/libgstacmh264dec.so /usr/lib/gstreamer-1.0/
[root@armadillo840-0]# cp /home/ftp/pub/libgstacmh264enc.so /usr/lib/gstreamer-1.0/
[root@armadillo840-0]# cp /home/ftp/pub/libgstacmjpegenc.so /usr/lib/gstreamer-1.0/

■動画再生(モニタの解像度は1280*1024)
system("gst-launch-1.0 filesrc location=/mnt/test.mp4 ! qtdemux ! queue ! acmh264dec stride=1280 x-offset=0 y-offset=152 ! video/x-raw,width=1280,height=720 ! acmfbdevsink");

この状態で動画再生(MP4)を行うと、下記の表示となりました。

・再生開始前:描画した背景画像が表示
・動画再生中:動画のブランク部分は黒と背景画像の交互での表示(ちらついた状態)
・再生終了後:動画のブランク部分は背景画像が表示

do_blank_screen()の処理を行わないように変更を行ったものの、動画再生中にはブランク処理が動作しており、
結果として画面がちらつくようになっているのですが、このブランク処理を停止する方法について情報がございましたらご教示いただけませんでしょうか。

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

コメント

at_kojiro.yamada

2015年5月14日 11時12分

> do_blank_screen()の処理を行わないように変更を行ったものの、動画再生中に
> はブランク処理が動作しており、結果として画面がちらつくようになっている
> のですが、このブランク処理を停止する方法について情報がございましたらご
> 教示いただけませんでしょうか。

背景画像をどのように書き込んでいるのか教えていただけませんか?

黒と背景画像が交互に表示されてしまうのは、
おそらく、フレームバッファが持っている全てのバッファに背景画像を書き込
めていないためだと思います。

ご返信いただきありがとうございます。
なんとか自己解決できましたので、報告させていただきます。

【ソースコードの変更】
do_blank_screen()の処理を行わないようにしたうえで、下記の変更を実施。

・変更ファイル:gst-plugins-at-acm_1.0.2/src/gstacmfbdevsink.c
・変更箇所  :
  static GstFlowReturn
  gst_acm_fbdevsink_render (GstBaseSink * bsink, GstBuffer * buf)
    ・
    ・
        if (timeDiff < (me->priv->framerate_sec + me->priv->lateness_sec)) {
/* ★ コメントアウト
          r = ioctl (me->fd, FBIOPAN_DISPLAY, &(me->varinfo));
          if (0 != r) {
            goto fbiopan_display_failed;
          }
*/
    ・
    ・
  }

■GStreamerのコンパイル後、作成されたsoファイルをarmadilloにコピー

■armadillo上にて、QT GUIアプリを実行
・GUIアプリのソース:
  MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent),
  {
    // 背景色の設定
    QPalette plt(palette());
    plt.setColor(QPalette::Background, Qt::white);
    this->setAutoFillBackground(true);
    this->setPalette(plt);
    this->show();

    // 動画再生
    system("gst-launch-1.0 filesrc location=/mnt/test.mp4 ! qtdemux ! queue ! acmh264dec stride=1280 x-offset=0 y-offset=152 ! video/x-raw,width=1280,height=720 ! acmfbdevsink");
  }

■この状態で動画再生(MP4)を行うと、下記の表示となりました。

・再生開始前:背景色(白)が表示
・動画再生中:動画のブランク部分が背景色(白)で表示
・再生終了後:動画のブランク部分は背景色(白)で表示

上記の変更にて、動画のブランク部分については画面の更新が行われない動作(背景がそのまま表示)となりました。

> 背景画像をどのように書き込んでいるのか教えていただけませんか?
>
> 黒と背景画像が交互に表示されてしまうのは、
> おそらく、フレームバッファが持っている全てのバッファに背景画像を書き込
> めていないためだと思います。
>

背景画像については、paintEventイベントにてQPainter→drawImageにて書き込みを行っておりました。

現在は背景画像の表示中に動画の再生を行うと、動画のブランク部分には背景画像がそのまま表示された状態となっていますが、ここはなんとか自前で対策予定としております。

今後もまた詰まるような事がありましたら、問い合わせをさせていただきたいと思いますので、その際は何卒よろしくお願いいたします。