[Armadillo:07431] Re: Armadillo-420 MJPG-streamerの画像乱れ問題について

Masahiro Hanada email@hidden
2011年 7月 29日 (金) 00:18:28 JST


花田です。

先に、古賀さんのコメントにお返事を。

> カメラの設置場所や部屋の明るさ、被写体で症状が変化するとい
> うのは、JPEG の圧縮度合いが変化することにより、カメラからの
> MJPEG ストリームのデータ転送量が増減することの影響ではない
> でしょうか?

これは、その通りですね。

> 件のカメラ(QCAM-200RX)が MJPEG 出力をサポートしているの
> かどうか知らないのですが、

このカメラ自体はMJPEG出力をサポートしており、その上でデータ送出が一定ではない
(mjpg-streamerの出力ストリームとして化け?が見える)
というような現象になってました。

…というあたりで、小谷部さんのコメントに戻りまして。

> >以上の事(今回実験された結果も含め)から、どの辺に問題がある
> >と推測されますか。

根本的には、USBカメラからデータを吸い出しきれていないこと(帯域不足)が
主因となった問題のようです。
その上で、化け頻度が顕著&mjpg-streamer自体がエラー終了してしまうことは、
mjpg-streamer動作上の問題(不具合)であると言えそうです。

対処を試みて比較的良好な結果が得られたので、こちらの内容についてご説明します。


○メモリ帯域不足への対処

mjpg-streamerのinput_uvc周りのコードを精査した結果、
毎回(余分に)メモリコピーしていることがわかりました。

 v4l2でDQUEUE→バッファをtmpにコピー→(再)QUEUE→tmpからネットワーク送出→

という構造になっており、これは(PCに比べ)メモリ帯域が狭い
組み込み環境にはやさしくありません。素直に

 v4l2でDQUEUE→バッファからネットワーク送出→(再)QUEUE→

となるようにできないかと試みました。
# ソースの見た目上はDQUEUE→再QUEUEまでの感覚が長くなるように感じますが、
  どっちみち有限のバッファを使いまわしているだけと考えれば、この方が有利です。

○データ化けの発生検出

カメラデータの吸出しが間に合わず(カメラデバイス側から見て)バッファ
アンダーランした場合に、壊れた(正しいマーカーを持たない/切り詰められた)
jpegデータが返ることがあるようで、これがチラつきの原因となっていました。
発生した場合は当該フレームを捨てる他どうしようもありません
(理想fpsでの取得は無理)ので、簡単処理でこれを行うよう対処しました。

○エラー発生時の再QUEUE処理

jpegデータが切り詰められすぎている(JPEGヘッダサイズ以下)際は
データコピーをしない…こんな処理がもともと入っていたのですが、
これが発生した時に再QUEUEされない不具合があり、結果的に一定回数
(ドライバで用意されたバッファ数分)のエラーが発生するとDQUEUEできるデータが
なくなり終了してしまう…これがmjpg_streamerが落ちる原因のようです。
前述した正常データ判定に失敗した時も含め、正しく(早く)再QUEUEされるよう修正。

以上のようなことをやった結果が、添付のパッチになります。
atmark-distにこれをあててから、再makeしてください。
(一旦cleanしてからの方が安全かもしれません)

帯域不足が完全解消されるわけではありませんので理想fpsには
及ばないことがありますが、手元で20fpsに設定した状態で概ね15〜16fps
かつ画像化けなしで、画像取得できるようになっているようです。

____________________________________________________

    花田 政弘 (はなだ まさひろ)

      (株)アットマークテクノ 開発部
        TEL: 011-207-6550    FAX: 011-207-6570
        URL: http://www.atmark-techno.com/

    E-mail: email@hidden
____________________________________________________
-------------- next part --------------
テキスト形式以外の添付ファイルを保管しました...
ファイル名: atmark-dist_mjpg-streamer.r94-fix.diff
型:         application/octet-stream
サイズ:     6229 バイト
説明:       無し
URL:        <http://lists.atmark-techno.com/pipermail/armadillo/attachments/20110729/e91e92d0/attachment.obj>


armadillo メーリングリストの案内