[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 メーリングリストの案内