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

Yasuhisa Nakamura email@hidden
2011年 8月 14日 (日) 04:23:53 JST


中村です。

古賀さんのパッチをあててみました。

2011年 8月 13日(土)11:41 に Shin-ya Koga さんは書きました:
> で、linux-2.6.26-at13 に入っている UVC ドライバのソースを追って

linux-2.6.26-at14でやっています。
at13とat14とで、uvcvideoのソースは同じようです。


> 上記の変更を加えることにより、アイソクロナス転送のパケット落ち
> が発生したフレームデータは、UVC ヘッダの Frame ID が切り替わっ
> た際(新しいフレームに切り替わった際)か、UVC ヘッダに EOF が
> 記録された際に、正常フレームをキューイングするタイミングで捨て
> られると思います。

画像の初めの方(1〜2KBあたり)で欠落したとき、
そのうしろが全部なくなるだけのようです。
以前同様、なくならないのもあります。

output_file.soで保存したものをうちのサーバにおいておきました。
圧縮がききにくい被写体
 http://iktech.jp/mjpg-streamer-data/6_imdl.cgi
 http://iktech.jp/mjpg-streamer-data/6/
圧縮がききやすい被写体
 http://iktech.jp/mjpg-streamer-data/7_imdl.cgi
 http://iktech.jp/mjpg-streamer-data/7/

圧縮がききにくい被写体では、圧縮がききやすい被写体ででているような
画像乱れは、今回もこちらでは発生していません。
(628バイトになるのはあいかわらず存在します)

手元のソース修正に間違いはないと思いますが、
念のため、diffをつけておきます。

// uvc_queue.cの if のカッコの数があっていなかったので
// そこだけは修正しました。
// Makefileで EXTRA_CFLAGS = -DENABLE_DROP_INCOMPLETE_FRAME してます。

diff -ru uvc-orig/Makefile uvc/Makefile
--- uvc-orig/Makefile   2011-03-25 13:10:29.000000000 +0900
+++ uvc/Makefile        2011-08-14 02:42:48.000000000 +0900
@@ -1,3 +1,4 @@
+EXTRA_CFLAGS = -DENABLE_DROP_INCOMPLETE_FRAME
 uvcvideo-objs  := uvc_driver.o uvc_queue.o uvc_v4l2.o uvc_video.o uvc_ctrl.o \
                  uvc_status.o uvc_isight.o
 obj-$(CONFIG_USB_VIDEO_CLASS) += uvcvideo.o
diff -ru uvc-orig/uvc_queue.c uvc/uvc_queue.c
--- uvc-orig/uvc_queue.c        2011-03-25 13:10:29.000000000 +0900
+++ uvc/uvc_queue.c     2011-08-14 03:54:55.000000000 +0900
@@ -453,8 +453,14 @@
        struct uvc_buffer *nextbuf;
        unsigned long flags;

+#ifdef ENABLE_DROP_INCOMPLETE_FRAME
+       if (((queue->flags & UVC_QUEUE_DROP_INCOMPLETE) &&
+           buf->buf.length != buf->buf.bytesused)
+       || buf->state == UVC_BUF_STATE_ERROR) {
+#else
        if ((queue->flags & UVC_QUEUE_DROP_INCOMPLETE) &&
            buf->buf.length != buf->buf.bytesused) {
+#endif
                buf->state = UVC_BUF_STATE_QUEUED;
                buf->buf.bytesused = 0;
                return buf;
diff -ru uvc-orig/uvc_video.c uvc/uvc_video.c
--- uvc-orig/uvc_video.c        2011-03-25 13:10:29.000000000 +0900
+++ uvc/uvc_video.c     2011-08-14 03:56:35.000000000 +0900
@@ -360,7 +360,13 @@
        if (fid != video->last_fid && buf->buf.bytesused != 0) {
                uvc_trace(UVC_TRACE_FRAME, "Frame complete (FID bit "
                                "toggled).\n");
+#ifdef ENABLE_DROP_INCOMPLETE_FRAME
+               if (buf->state != UVC_BUF_STATE_ERROR) {
+                       buf->state = UVC_BUF_STATE_DONE;
+               }
+#else
                buf->state = UVC_BUF_STATE_DONE;
+#endif
                return -EAGAIN;
        }

@@ -401,7 +407,13 @@
                uvc_trace(UVC_TRACE_FRAME, "Frame complete (EOF found).\n");
                if (data[0] == len)
                        uvc_trace(UVC_TRACE_FRAME, "EOF in empty payload.\n");
+#ifdef ENABLE_DROP_INCOMPLETE_FRAME
+               if (buf->state != UVC_BUF_STATE_ERROR) {
+                   buf->state = UVC_BUF_STATE_DONE;
+               }
+#else
                buf->state = UVC_BUF_STATE_DONE;
+#endif
                if (video->dev->quirks & UVC_QUIRK_STREAM_NO_FID)
                        video->last_fid ^= UVC_STREAM_FID;
        }
@@ -424,6 +436,9 @@
                if (urb->iso_frame_desc[i].status < 0) {
                        uvc_trace(UVC_TRACE_FRAME, "USB isochronous frame "
                                "lost (%d).\n", urb->iso_frame_desc[i].status);
+#ifdef ENABLE_DROP_INCOMPLETE_FRAME
+                       buf->state = UVC_BUF_STATE_ERROR;  // mark as eror frame
+#endif
                        continue;
                }

-- 
なかむら





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