From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752874AbXLZU5y (ORCPT ); Wed, 26 Dec 2007 15:57:54 -0500 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1751758AbXLZU5q (ORCPT ); Wed, 26 Dec 2007 15:57:46 -0500 Received: from fg-out-1718.google.com ([72.14.220.155]:34788 "EHLO fg-out-1718.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751320AbXLZU5o (ORCPT ); Wed, 26 Dec 2007 15:57:44 -0500 DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=date:from:to:cc:subject:message-id:in-reply-to:references:x-mailer:mime-version:content-type:content-transfer-encoding; b=Kf1lxXmj/fXgTA1Yit3hD2AV0B4G6TFc75eMyiTC3tbAvSf7NYfD6D5eQ7XiPnvEGYkKFeTEBHwpeAZyvq1PrZCW7mZ2LRr3pB5cEnnlxu+TtBwBi51G7OGUIoqhZSQu+CVeGhGDTie3wd8tyfjc0GROdB12I5mcgiNTlg5yNEk= Date: Wed, 26 Dec 2007 14:57:34 -0600 From: David Hilvert To: Greg KH , linux-usb@vger.kernel.org Cc: linux-kernel@vger.kernel.org, dmitri@users.sourceforge.net Subject: Re: Regarding request for IBM camera patch to be applied to the main tree Message-Id: <20071226145734.031f568e.dhilvert@gmail.com> In-Reply-To: <20071221223209.GA24780@kroah.com> References: <20071221223209.GA24780@kroah.com> X-Mailer: Sylpheed 2.4.7 (GTK+ 2.12.1; i486-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Fri, 21 Dec 2007 14:32:09 -0800 Greg KH wrote: > On Fri, Dec 21, 2007 at 03:21:30PM -0600, David Hilvert wrote: > > > > http://www.linux-usb.org/ibmcam/ > > > > > > http://auricle.dyndns.org/xvp610/ > > > > [Remainder of private e-mail context snipped; message has been blind-CC'ed to > > the original recipients. Please CC any replies intended for me.] > > > > As the author of the second patch noted, I had avoided sending it to lkml due > > to the difficulty of determining whether the patch is correct (e.g., having no > > ill effect on other cameras), due, in turn, to lack of documentation for this > > series of cameras. Perhaps dmitri could comment further on this, if he has > > time and access to test on any other cameras that might fall under the 'model > > 3' designation (whatever this designation might mean). The (rather old, now) > > patch in question (against 2.6.1 or so, and perhaps other versions) follows; if > > I recall correctly, it was designed to minimize change lines rather than > > provide for overall clarity, so that a clearer final implementation is probably > > possible. > > > > > > diff -urN linux-2.6.1/drivers/usb/media/ibmcam.c linux-2.6.1-patched/drivers/usb/media/ibmcam.c > > --- linux-2.6.1/drivers/usb/media/ibmcam.c Fri Jan 9 00:59:19 2004 > > +++ linux-2.6.1-patched/drivers/usb/media/ibmcam.c Fri Feb 6 14:54:33 2004 > > I suggest forward porting it to the latest tree and submit it to the usb > video maintainers for inclusion. > > thanks, > > greg k-h Port to 2.6.23.12 follows: --- linux-2.6.23.12/drivers/media/video/usbvideo/ibmcam.c 2007-12-18 21:55:57.000000000 +0000 +++ linux-2.6.23.12-patched/drivers/media/video/usbvideo/ibmcam.c 2007-12-26 20:34:45.000000000 +0000 @@ -802,6 +802,21 @@ return scan_Continue; } +/* + * ibmcam_model3_parse_lines() + * + * | Even lines | Odd Lines | + * -----------------------------------| + * |YYY........Y|UYVYUYVY.........UYVY| + * |YYY........Y|UYVYUYVY.........UYVY| + * |............|.....................| + * |YYY........Y|UYVYUYVY.........UYVY| + * |------------+---------------------| + * + * There is one (U, V) chroma pair for every four luma (Y) values. This + * function reads a pair of lines at a time and obtains missing chroma values + * from adjacent pixels. + */ static enum ParseState ibmcam_model3_parse_lines( struct uvd *uvd, struct usbvideo_frame *frame, @@ -816,6 +831,7 @@ const int ccm = 128; /* Color correction median - see below */ int i, u, v, rw, data_w=0, data_h=0, color_corr; static unsigned char lineBuffer[640*3]; + int line; color_corr = (uvd->vpic.colour - 0x8000) >> 8; /* -128..+127 = -ccm..+(ccm-1)*/ RESTRICT_TO_RANGE(color_corr, -ccm, ccm+1); @@ -869,15 +885,15 @@ return scan_NextFrame; } - /* Make sure there's enough data for the entire line */ - len = 3 * data_w; /* */ + /* Make sure that lineBuffer can store two lines of data */ + len = 3 * data_w; /* */ assert(len <= sizeof(lineBuffer)); - /* Make sure there's enough data for the entire line */ + /* Make sure there's enough data for two lines */ if (RingQueue_GetLength(&uvd->dp) < len) return scan_Out; - /* Suck one line out of the ring queue */ + /* Suck two lines of data out of the ring queue */ RingQueue_Dequeue(&uvd->dp, lineBuffer, len); data = lineBuffer; @@ -887,15 +903,23 @@ rw = (int)VIDEOSIZE_Y(frame->request) - (int)(frame->curline) - 1; RESTRICT_TO_RANGE(rw, 0, VIDEOSIZE_Y(frame->request)-1); - for (i = 0; i < VIDEOSIZE_X(frame->request); i++) { - int y, rv, gv, bv; /* RGB components */ + /* Iterate over two lines. */ + for (line = 0; line < 2; line++) { + for (i = 0; i < VIDEOSIZE_X(frame->request); i++) { + int y; + int rv, gv, bv; /* RGB components */ + + if (i >= data_w) { + RGB24_PUTPIXEL(frame, i, rw, 0, 0, 0); + continue; + } - if (i < data_w) { - y = data[i]; /* Luminosity is the first line */ + /* first line is YYY...Y; second is UYVY...UYVY */ + y = data[(line == 0) ? i : (i*2 + 1)]; /* Apply static color correction */ - u = color[i*2] + hue_corr; - v = color[i*2 + 1] + hue2_corr; + u = color[(i/2)*4] + hue_corr; + v = color[(i/2)*4 + 2] + hue2_corr; /* Apply color correction */ if (color_corr != 0) { @@ -903,13 +927,21 @@ u = 128 + ((ccm + color_corr) * (u - 128)) / ccm; v = 128 + ((ccm + color_corr) * (v - 128)) / ccm; } - } else - y = 0, u = v = 128; - YUV_TO_RGB_BY_THE_BOOK(y, u, v, rv, gv, bv); - RGB24_PUTPIXEL(frame, i, rw, rv, gv, bv); /* Done by deinterlacing now */ + + YUV_TO_RGB_BY_THE_BOOK(y, u, v, rv, gv, bv); + RGB24_PUTPIXEL(frame, i, rw, rv, gv, bv); /* No deinterlacing */ + } + + /* Check for the end of requested data */ + if (rw == 0) + break; + + /* Prepare for the second line */ + rw--; + data = lineBuffer + data_w; } - frame->deinterlace = Deinterlace_FillEvenLines; + frame->deinterlace = Deinterlace_None; /* * Account for number of bytes that we wrote into output V4L frame.