Mark you're a genius :) it works ! However, I changed the conversion formulas for reasons explained here:
http://www.fourcc.org/fccyvrgb.php (see Avery Lee's JFIF Clarification ) So this is the final code : void yuv2rgb(AVPicture *src, PixelFormat src_pix_fmt, AVPicture *dst, PixelFormat dst_pix_fmt, int width, int height) { unsigned char y, u,v; char *rgb = dst->data[0]; unsigned char *yptr = src->data[0]; unsigned char *uptr = src->data[1]; unsigned char *vptr = src->data[2]; int i =0; for (int py=0; py < height; py++) { for (int px =0; px < width; px++, i+= 3) { y = yptr[py*src->linesize[0]+px]; u = uptr[py/2*src->linesize[1]+px/2]; v = vptr[py/2*src->linesize[2]+px/2]; rgb[ i ] = y + 1.402* (v-128); rgb[ i + 1 ] = y - 0.34414* (u-128) - 0.71414 *(v-128); rgb[ i + 2] = y + 1.772 *(u-128); } } } Thanks again for your time. On Sun, Jan 31, 2010 at 12:32 AM, Mark Heath <[email protected]> wrote: > > On 30/01/2010, at 11:00 PM, (*)·´`·.¸.»ÐëÄdMäñ·´`·.¸.»(*) wrote: > >> Mark, >> >>> This would work for chroma subsampling type 411 but not 420. For 420 >>> there >>> is 1 chroma pixel for ever 4 pixels, 2 in the X direction and 2 in the Y >>> direction. >>> >>> So you need something more like: >>> >>> for (py=0; py < height; py++) >>> for (px =0; px < width; px++) { >>> >>> y = yptr[px*width+py]; >>> u = uptr[px/2*width/2+py/2]; >>> v = vptr[px/2*width/2+py/2]; > > > One other thing I forgot, I must remember that I'm using libav here and not > mjpegutils... > > There is additional data at the end of each line of an AVFrame, (I assume > AVPicture is the same) so we > cannot use width as the multiplier. > > see changes below... > > I also see that I swapped the px and py around in my previous version, that > would definitely cause problems. > > Hopefully this one works. > > Mark > >> Thank you very much for your time and your excellent explanation, okay >> so I tried that and still no luck : >> >> unsigned char *yptr = src->data[0]; >> unsigned char *uptr = src->data[1]; >> unsigned char *vptr = src->data[2]; >> int i =0; >> >> for (int py=0; py < height; py++) >> { >> for (int px =0; px < width; px++, i+= 3) >> { > > y = yptr[py*src->linesize[0]+px]; > u = uptr[py/2*src->linesize[1]+px/2]; > v = vptr[py/2*src->linesize[2]+px/2]; > >> >> rgb[i] = y + 1.140 * v; >> rgb[i+1] = y - 0.395 *u - 0.581 *v; >> rgb[i+2] = y + 2.032 * u; >> } >> } >> >> Then I thought maybe data[0] points to the whole yuv array, so I tried >> this: >> >> unsigned char *yptr = src->data[0]; >> unsigned char *uptr = yptr + width * height; >> unsigned char *vptr = uptr + width/4; >> >> but it still doesn't work any suggestions ? >> >> Thanks again. >> _______________________________________________ >> libav-user mailing list >> [email protected] >> https://lists.mplayerhq.hu/mailman/listinfo/libav-user > > > _______________________________________________ > libav-user mailing list > [email protected] > https://lists.mplayerhq.hu/mailman/listinfo/libav-user > _______________________________________________ libav-user mailing list [email protected] https://lists.mplayerhq.hu/mailman/listinfo/libav-user
