usbvision: remove RGB format conversion
PATCH 4/4 usbvision: remove RGB format conversion
As V4L2 spec says that drivers shouldn't do any in-kernel image format conversion, remove it.
---
Feel free to drop this patch if the functionality is needed.
drivers/media/video/usbvision/usbvision-core.c +25 -293
@@ -494,9 +494,8 @@ static enum parse_state usbvision_parse_int len;int i;unsigned char yuyv[4 ] = {180 ,128 ,10 ,128 };/* YUV components */ -unsigned char rv, gv, bv;/* RGB components */ -int clipmask_index, bytes_per_pixel; -int stretch_bytes, clipmask_add; +int bytes_per_pixel; +int stretch_bytes; frame = usbvision->cur_frame; f = frame->data + (frame->v4l2_linesize * frame->curline);
@@ -513,78 +512,16 @@ static enum parse_state usbvision_parse_ bytes_per_pixel = frame->v4l2_format.bytes_per_pixel; stretch_bytes = (usbvision->stretch_width -1 ) * bytes_per_pixel; - clipmask_index = frame->curline *MAX_FRAME_WIDTH ; - clipmask_add = usbvision->stretch_width;for (i =0 ; i < frame->frmwidth; i += (2 * usbvision->stretch_width)) {scratch_get (usbvision, &yuyv[0 ],4 ); -if (frame->v4l2_format.format ==V4L2_PIX_FMT_YUYV ) { - *f++ = yuyv[0 ];/* Y */ - *f++ = yuyv[3 ];/* U */ - }else { -YUV_TO_RGB_BY_THE_BOOK (yuyv[0 ], yuyv[1 ], yuyv[3 ], rv, gv, bv); -switch (frame->v4l2_format.format) { -case V4L2_PIX_FMT_RGB565 : - *f++ = (0x1F & rv) | - (0xE0 & (gv <<5 )); - *f++ = (0x07 & (gv >>3 )) | - (0xF8 & bv); -break ; -case V4L2_PIX_FMT_RGB24 : - *f++ = rv; - *f++ = gv; - *f++ = bv; -break ; -case V4L2_PIX_FMT_RGB32 : - *f++ = rv; - *f++ = gv; - *f++ = bv; - f++; -break ; -case V4L2_PIX_FMT_RGB555 : - *f++ = (0x1F & rv) | - (0xE0 & (gv <<5 )); - *f++ = (0x03 & (gv >>3 )) | - (0x7C & (bv <<2 )); -break ; - } - } - clipmask_index += clipmask_add; + *f++ = yuyv[0 ];/* Y */ + *f++ = yuyv[3 ];/* U */ f += stretch_bytes; -if (frame->v4l2_format.format ==V4L2_PIX_FMT_YUYV ) { - *f++ = yuyv[2 ];/* Y */ - *f++ = yuyv[1 ];/* V */ - }else { -YUV_TO_RGB_BY_THE_BOOK (yuyv[2 ], yuyv[1 ], yuyv[3 ], rv, gv, bv); -switch (frame->v4l2_format.format) { -case V4L2_PIX_FMT_RGB565 : - *f++ = (0x1F & rv) | - (0xE0 & (gv <<5 )); - *f++ = (0x07 & (gv >>3 )) | - (0xF8 & bv); -break ; -case V4L2_PIX_FMT_RGB24 : - *f++ = rv; - *f++ = gv; - *f++ = bv; -break ; -case V4L2_PIX_FMT_RGB32 : - *f++ = rv; - *f++ = gv; - *f++ = bv; - f++; -break ; -case V4L2_PIX_FMT_RGB555 : - *f++ = (0x1F & rv) | - (0xE0 & (gv <<5 )); - *f++ = (0x03 & (gv >>3 )) | - (0x7C & (bv <<2 )); -break ; - } - } - clipmask_index += clipmask_add; + *f++ = yuyv[2 ];/* Y */ + *f++ = yuyv[1 ];/* V */ f += stretch_bytes; }
@@ -702,22 +639,20 @@ static enum parse_state usbvision_parse_unsigned char strip_data[USBVISION_STRIP_LEN_MAX ];unsigned char strip_header[USBVISION_STRIP_HEADER_LEN ];int idx, idx_end, strip_len, strip_ptr, startblock_pos, block_pos, block_type_pos; -int clipmask_index, bytes_per_pixel, rc; +int bytes_per_pixel, rc;int image_size; -unsigned char rv, gv, bv;static unsigned char *Y , *U , *V ; frame = usbvision->cur_frame; image_size = frame->frmwidth * frame->frmheight; f = frame->data + (frame->v4l2_linesize * frame->curline); -if (frame->v4l2_format.format ==V4L2_PIX_FMT_YUYV ) {/* initialise u and v pointers */ -/* get base of u and b planes add halfoffset */ - u = frame->data - + image_size - + (frame->frmwidth >>1 ) * frame->curline; - v = u + (image_size >>1 ); - } +/* initialise u and v pointers */ +/* get base of u and b planes add halfoffset */ + u = frame->data + + image_size + + (frame->frmwidth >>1 ) * frame->curline; + v = u + (image_size >>1 );if (frame->curline ==0 )usbvision_adjust_compression (usbvision);
@@ -762,7 +697,6 @@ static enum parse_state usbvision_parse_ } bytes_per_pixel = frame->v4l2_format.bytes_per_pixel; - clipmask_index = frame->curline *MAX_FRAME_WIDTH ;scratch_get (usbvision, strip_data, strip_len);
@@ -788,41 +722,8 @@ static enum parse_state usbvision_parse_ usbvision->strip_len_errors++;for (idx =0 ; idx < idx_end; idx++) { -if (frame->v4l2_format.format ==V4L2_PIX_FMT_YUYV ) { - *f++ =Y [idx]; - *f++ = idx &0x01 ?U [idx /2 ] :V [idx /2 ]; - }else { -YUV_TO_RGB_BY_THE_BOOK (Y [idx],U [idx /2 ],V [idx /2 ], rv, gv, bv); -switch (frame->v4l2_format.format) { -case V4L2_PIX_FMT_GREY : - *f++ =Y [idx]; -break ; -case V4L2_PIX_FMT_RGB555 : - *f++ = (0x1F & rv) | - (0xE0 & (gv <<5 )); - *f++ = (0x03 & (gv >>3 )) | - (0x7C & (bv <<2 )); -break ; -case V4L2_PIX_FMT_RGB565 : - *f++ = (0x1F & rv) | - (0xE0 & (gv <<5 )); - *f++ = (0x07 & (gv >>3 )) | - (0xF8 & bv); -break ; -case V4L2_PIX_FMT_RGB24 : - *f++ = rv; - *f++ = gv; - *f++ = bv; -break ; -case V4L2_PIX_FMT_RGB32 : - *f++ = rv; - *f++ = gv; - *f++ = bv; - f++; -break ; - } - } - clipmask_index++; + *f++ =Y [idx]; + *f++ = idx &0x01 ?U [idx /2 ] :V [idx /2 ]; } *pcopylen += frame->v4l2_linesize;
@@ -857,11 +758,8 @@ static enum parse_state usbvision_parse_const int y_step[] = {0 ,0 ,0 ,2 }, y_step_size =4 ;const int uv_step[] = {0 ,0 ,0 ,4 }, uv_step_size =4 ;unsigned char y[2 ], u, v;/* YUV components */ -int y_, u_, v_, vb, uvg, ur; -int r_, g_, b_;/* RGB components */ -unsigned char g; -int clipmask_even_index, clipmask_odd_index, bytes_per_pixel; -int clipmask_add, stretch_bytes; +int bytes_per_pixel; +int stretch_bytes; frame = usbvision->cur_frame; f_even = frame->data + (frame->v4l2_linesize * frame->curline);
@@ -872,9 +770,6 @@ static enum parse_state usbvision_parse_/* I need two lines to decode the color */ bytes_per_pixel = frame->v4l2_format.bytes_per_pixel; stretch_bytes = (usbvision->stretch_width -1 ) * bytes_per_pixel; - clipmask_even_index = frame->curline *MAX_FRAME_WIDTH ; - clipmask_odd_index = clipmask_even_index +MAX_FRAME_WIDTH ; - clipmask_add = usbvision->stretch_width; pixel_per_line = frame->isoc_header.frame_width;if (scratch_len (usbvision) < (int )pixel_per_line *3 ) {
@@ -901,185 +796,22 @@ static enum parse_state usbvision_parse_scratch_get_extra (usbvision, &u, &u_ptr,1 );scratch_get_extra (usbvision, &v, &v_ptr,1 ); -/* I don't use the YUV_TO_RGB macro for better performance */ - v_ = v -128 ; - u_ = u -128 ; - vb =132252 * v_; - uvg =-53281 * u_ -25625 * v_; - ur =104595 * u_; - -if (frame->v4l2_format.format ==V4L2_PIX_FMT_YUYV ) { - *f_even++ = y[0 ]; - *f_even++ = v; - }else { - y_ =76284 * (y[0 ] -16 ); - - b_ = (y_ + vb) >>16 ; - g_ = (y_ + uvg) >>16 ; - r_ = (y_ + ur) >>16 ; - -switch (frame->v4l2_format.format) { -case V4L2_PIX_FMT_RGB565 : - g =LIMIT_RGB (g_); - *f_even++ = - (0x1F &LIMIT_RGB (r_)) | - (0xE0 & (g <<5 )); - *f_even++ = - (0x07 & (g >>3 )) | - (0xF8 &LIMIT_RGB (b_)); -break ; -case V4L2_PIX_FMT_RGB24 : - *f_even++ =LIMIT_RGB (r_); - *f_even++ =LIMIT_RGB (g_); - *f_even++ =LIMIT_RGB (b_); -break ; -case V4L2_PIX_FMT_RGB32 : - *f_even++ =LIMIT_RGB (r_); - *f_even++ =LIMIT_RGB (g_); - *f_even++ =LIMIT_RGB (b_); - f_even++; -break ; -case V4L2_PIX_FMT_RGB555 : - g =LIMIT_RGB (g_); - *f_even++ = (0x1F &LIMIT_RGB (r_)) | - (0xE0 & (g <<5 )); - *f_even++ = (0x03 & (g >>3 )) | - (0x7C & (LIMIT_RGB (b_) <<2 )); -break ; - } - } - clipmask_even_index += clipmask_add; + *f_even++ = y[0 ]; + *f_even++ = v; f_even += stretch_bytes; -if (frame->v4l2_format.format ==V4L2_PIX_FMT_YUYV ) { - *f_even++ = y[1 ]; - *f_even++ = u; - }else { - y_ =76284 * (y[1 ] -16 ); - - b_ = (y_ + vb) >>16 ; - g_ = (y_ + uvg) >>16 ; - r_ = (y_ + ur) >>16 ; - -switch (frame->v4l2_format.format) { -case V4L2_PIX_FMT_RGB565 : - g =LIMIT_RGB (g_); - *f_even++ = - (0x1F &LIMIT_RGB (r_)) | - (0xE0 & (g <<5 )); - *f_even++ = - (0x07 & (g >>3 )) | - (0xF8 &LIMIT_RGB (b_)); -break ; -case V4L2_PIX_FMT_RGB24 : - *f_even++ =LIMIT_RGB (r_); - *f_even++ =LIMIT_RGB (g_); - *f_even++ =LIMIT_RGB (b_); -break ; -case V4L2_PIX_FMT_RGB32 : - *f_even++ =LIMIT_RGB (r_); - *f_even++ =LIMIT_RGB (g_); - *f_even++ =LIMIT_RGB (b_); - f_even++; -break ; -case V4L2_PIX_FMT_RGB555 : - g =LIMIT_RGB (g_); - *f_even++ = (0x1F &LIMIT_RGB (r_)) | - (0xE0 & (g <<5 )); - *f_even++ = (0x03 & (g >>3 )) | - (0x7C & (LIMIT_RGB (b_) <<2 )); -break ; - } - } - clipmask_even_index += clipmask_add; + *f_even++ = y[1 ]; + *f_even++ = u; f_even += stretch_bytes;scratch_get_extra (usbvision, &y[0 ], &y_ptr,2 ); -if (frame->v4l2_format.format ==V4L2_PIX_FMT_YUYV ) { - *f_odd++ = y[0 ]; - *f_odd++ = v; - }else { - y_ =76284 * (y[0 ] -16 ); - - b_ = (y_ + vb) >>16 ; - g_ = (y_ + uvg) >>16 ; - r_ = (y_ + ur) >>16 ; - -switch (frame->v4l2_format.format) { -case V4L2_PIX_FMT_RGB565 : - g =LIMIT_RGB (g_); - *f_odd++ = - (0x1F &LIMIT_RGB (r_)) | - (0xE0 & (g <<5 )); - *f_odd++ = - (0x07 & (g >>3 )) | - (0xF8 &LIMIT_RGB (b_)); -break ; -case V4L2_PIX_FMT_RGB24 : - *f_odd++ =LIMIT_RGB (r_); - *f_odd++ =LIMIT_RGB (g_); - *f_odd++ =LIMIT_RGB (b_); -break ; -case V4L2_PIX_FMT_RGB32 : - *f_odd++ =LIMIT_RGB (r_); - *f_odd++ =LIMIT_RGB (g_); - *f_odd++ =LIMIT_RGB (b_); - f_odd++; -break ; -case V4L2_PIX_FMT_RGB555 : - g =LIMIT_RGB (g_); - *f_odd++ = (0x1F &LIMIT_RGB (r_)) | - (0xE0 & (g <<5 )); - *f_odd++ = (0x03 & (g >>3 )) | - (0x7C & (LIMIT_RGB (b_) <<2 )); -break ; - } - } - clipmask_odd_index += clipmask_add; + *f_odd++ = y[0 ]; + *f_odd++ = v; f_odd += stretch_bytes; -if (frame->v4l2_format.format ==V4L2_PIX_FMT_YUYV ) { - *f_odd++ = y[1 ]; - *f_odd++ = u; - }else { - y_ =76284 * (y[1 ] -16 ); - - b_ = (y_ + vb) >>16 ; - g_ = (y_ + uvg) >>16 ; - r_ = (y_ + ur) >>16 ; - -switch (frame->v4l2_format.format) { -case V4L2_PIX_FMT_RGB565 : - g =LIMIT_RGB (g_); - *f_odd++ = - (0x1F &LIMIT_RGB (r_)) | - (0xE0 & (g <<5 )); - *f_odd++ = - (0x07 & (g >>3 )) | - (0xF8 &LIMIT_RGB (b_)); -break ; -case V4L2_PIX_FMT_RGB24 : - *f_odd++ =LIMIT_RGB (r_); - *f_odd++ =LIMIT_RGB (g_); - *f_odd++ =LIMIT_RGB (b_); -break ; -case V4L2_PIX_FMT_RGB32 : - *f_odd++ =LIMIT_RGB (r_); - *f_odd++ =LIMIT_RGB (g_); - *f_odd++ =LIMIT_RGB (b_); - f_odd++; -break ; -case V4L2_PIX_FMT_RGB555 : - g =LIMIT_RGB (g_); - *f_odd++ = (0x1F &LIMIT_RGB (r_)) | - (0xE0 & (g <<5 )); - *f_odd++ = (0x03 & (g >>3 )) | - (0x7C & (LIMIT_RGB (b_) <<2 )); -break ; - } - } - clipmask_odd_index += clipmask_add; + *f_odd++ = y[1 ]; + *f_odd++ = u; f_odd += stretch_bytes; }
drivers/media/video/usbvision/usbvision.h +0 -42
48 lines not on this page · raw message
drivers/media/video/usbvision/usbvision-video.c +1 -6
@@ -112,11 +112,6 @@ USBVISION_DRIVER_VERSION_PATCHLEVEL)static int usbvision_nr;static struct usbvision_v4l2_format_st usbvision_v4l2_format[] = { - {1 ,1 ,8 ,V4L2_PIX_FMT_GREY ,"GREY" }, - {1 ,2 ,16 ,V4L2_PIX_FMT_RGB565 ,"RGB565" }, - {1 ,3 ,24 ,V4L2_PIX_FMT_RGB24 ,"RGB24" }, - {1 ,4 ,32 ,V4L2_PIX_FMT_RGB32 ,"RGB32" }, - {1 ,2 ,16 ,V4L2_PIX_FMT_RGB555 ,"RGB555" }, {1 ,2 ,16 ,V4L2_PIX_FMT_YUYV ,"YUV422" }, };
@@ -1452,7 +1447,7 @@ static void usbvision_configure_video(streturn ; model = usbvision->dev_model; - usbvision->palette = usbvision_v4l2_format[2 ];/* V4L2_PIX_FMT_RGB24; */ + usbvision->palette = usbvision_v4l2_format[0 ];if (usbvision_device_data[usbvision->dev_model].vin_reg2_override) { usbvision->vin_reg2_preset =
Signature · 1 line
Ondrej Zary
Quoted 2 lines · Ondrej Zary
As V4L2 spec says that drivers shouldn't do any in-kernel image format conversion, remove it.
Does this classify as breaking the API, and thus require a deprecation period? Is it likely to break any userspace that wasn't planning on doing its own RGB conversions?
Em 27-04-2011 23:48, [email protected] escreveu:
Quoted 7 lines · Ondrej Zary
Quoted 2 lines
As V4L2 spec says that drivers shouldn't do any in-kernel image format conversion, remove it.
Does this classify as breaking the API, and thus require a deprecation period? Is it likely to break any userspace that wasn't planning on doing its own RGB conversions?
Yes, it does. Before we do something like that, we need to write an entry to Documentation/feature-removal-schedule.txt and wait for at least one kernel release before actually removing such feature.
It is not that bad, as libv4l is present on almost all modern distros, but still it is an API breakage and we need to play by the book.
Thanks!
Mauro.