From 8f299f2a122645c4ee8eed02c03c233f0b8bd1c7 Mon Sep 17 00:00:00 2001 From: Frank Schaefer Date: Sat, 8 Dec 2012 11:31:28 -0300 Subject: [PATCH] --- yaml --- r: 357151 b: refs/heads/master c: a48370158d134807f5b02655287b91cc000c45ca h: refs/heads/master i: 357149: 4849a6b27d5bacefdbe9d2ac88eba5c4372bc0a2 357147: c4cb9d769d8fd6d4706f6d75945394ff3f6b33bc 357143: 0dca83e23521fa7d8ff7b9379efdf2121fb17a26 357135: ab34d3bc0f351c38649a8426bff4b50fdd36a386 357119: 23e2d649f91f01abe529d95a4be4b59538873c05 v: v3 --- [refs] | 2 +- trunk/drivers/media/usb/em28xx/em28xx-video.c | 77 +++++++++---------- 2 files changed, 37 insertions(+), 42 deletions(-) diff --git a/[refs] b/[refs] index 3fdfbd195047..a73de259c5e9 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 8732533b3284ca078e3ea4a4721e43627ff7fa8e +refs/heads/master: a48370158d134807f5b02655287b91cc000c45ca diff --git a/trunk/drivers/media/usb/em28xx/em28xx-video.c b/trunk/drivers/media/usb/em28xx/em28xx-video.c index 565b6462f152..3a13a7138e73 100644 --- a/trunk/drivers/media/usb/em28xx/em28xx-video.c +++ b/trunk/drivers/media/usb/em28xx/em28xx-video.c @@ -418,8 +418,9 @@ static inline int em28xx_urb_data_copy(struct em28xx *dev, struct urb *urb) } /* capture type 0 = vbi start - capture type 1 = video start - capture type 2 = video in progress */ + capture type 1 = vbi in progress + capture type 2 = video start + capture type 3 = video in progress */ len = actual_length; if (len >= 4) { /* NOTE: headers are always 4 bytes and @@ -438,7 +439,7 @@ static inline int em28xx_urb_data_copy(struct em28xx *dev, struct urb *urb) len -= 4; } else if (p[0] == 0x22 && p[1] == 0x5a) { /* start video */ - dev->capture_type = 1; + dev->capture_type = 2; dev->top_field = !(p[2] & 1); p += 4; len -= 4; @@ -448,51 +449,45 @@ static inline int em28xx_urb_data_copy(struct em28xx *dev, struct urb *urb) * have no continuation header */ if (dev->capture_type == 0) { + dev->capture_type = 1; + if (dev->top_field) { /* Brand new frame */ + if (vbi_buf != NULL) + finish_buffer(dev, vbi_buf); + vbi_buf = get_next_buf(dev, vbi_dma_q); + dev->usb_ctl.vbi_buf = vbi_buf; + if (vbi_buf == NULL) + vbioutp = NULL; + else + vbioutp = + videobuf_to_vmalloc(&vbi_buf->vb); + } + if (vbi_buf != NULL) { + vbi_buf->top_field = dev->top_field; + vbi_buf->pos = 0; + } + } + + if (dev->capture_type == 1) { int vbi_size = dev->vbi_width * dev->vbi_height; - if (dev->vbi_read >= vbi_size) { - /* We've already read all the VBI data, so - treat the rest as video */ - em28xx_isocdbg("dev->vbi_read > vbi_size\n"); - } else if ((dev->vbi_read + len) < vbi_size) { - /* This entire frame is VBI data */ - if (dev->vbi_read == 0 && dev->top_field) { - /* Brand new frame */ - if (vbi_buf != NULL) - finish_buffer(dev, vbi_buf); - vbi_buf = get_next_buf(dev, vbi_dma_q); - dev->usb_ctl.vbi_buf = vbi_buf; - if (vbi_buf == NULL) - vbioutp = NULL; - else - vbioutp = videobuf_to_vmalloc( - &vbi_buf->vb); - } - - if (dev->vbi_read == 0) { - if (vbi_buf != NULL) { - vbi_buf->top_field - = dev->top_field; - vbi_buf->pos = 0; - } - } - - dev->vbi_read += len; - em28xx_copy_vbi(dev, vbi_buf, p, vbioutp, len); - } else { - /* Some of this frame is VBI data and some is - video data */ - int vbi_data_len = vbi_size - dev->vbi_read; - dev->vbi_read += vbi_data_len; + int vbi_data_len = ((dev->vbi_read + len) > vbi_size) ? + (vbi_size - dev->vbi_read) : len; + + /* Copy VBI data */ + if (vbi_buf != NULL) em28xx_copy_vbi(dev, vbi_buf, p, vbioutp, vbi_data_len); - dev->capture_type = 1; + dev->vbi_read += vbi_data_len; + + if (vbi_data_len < len) { + /* Continue with copying video data */ + dev->capture_type = 2; p += vbi_data_len; len -= vbi_data_len; } } - if (dev->capture_type == 1) { - dev->capture_type = 2; + if (dev->capture_type == 2) { + dev->capture_type = 3; if (dev->progressive || dev->top_field) { if (buf != NULL) finish_buffer(dev, buf); @@ -509,7 +504,7 @@ static inline int em28xx_urb_data_copy(struct em28xx *dev, struct urb *urb) } } - if (buf != NULL && dev->capture_type == 2 && len > 0) + if (buf != NULL && dev->capture_type == 3 && len > 0) em28xx_copy_video(dev, buf, p, outp, len); } return rc;