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