On May 12, 2011, at 3:12 AM, "Steffen Ebersbach" <[email protected]> wrote:
> Am 12.5.2011 09:02, schrieb Dmitriy K: >> Hi all! >> >> I use libav to decode MJPEG frames from IP-camera and to show some pixels >> from them on a SDL-surface. >> SDL takes only RGB pixels so I have to convert YUV from MJPEG frame to RGB. >> I have AVFrame after avcodec_decode_video() and as I see, there data[0] >> stands for Y component, data[1] - V component and data[2] - U component. >> Also, U and V components arrays are twice shorter, so that 1 U or V >> component stands for 2 Y components. >> Then I use formulas found in wikipedia to convert YUV to RGB: >> > Yes it's the YUV 4:2:2 format, that is often use in JPEG. > >> R=Y + 1.370705*(U - 128); >> G=Y - 0.698001*(V - 128) - 0.337633*(U - 128); >> B=Y + 1.732446*(V - 128); >> >> But in final picture I got colors mismatch in highly white and highly black >> regions. >> For example in pixels that should be black, I have blue or red pixels, and >> in white regions - only green. >> >> So I have two questions: >> 1) Am I right in my vision of YUV components position in AVFrame->data >> arrays ? >> 2) Is there any way to solve problems with colors mismatch? >> >> > > The formulas are right, but this is not recommend. In libav you can use the > swscale libary to do this conversion. It's an easy way for this task. > > Steffen > > _______________________________________________ > Libav-user mailing list > [email protected] > http://ffmpeg.org/mailman/listinfo/libav-user If you insist on doing conversion yourself, watch out for overflow and underflow. The formulae can produce values outside the legal values fir RGB. _______________________________________________ Libav-user mailing list [email protected] http://ffmpeg.org/mailman/listinfo/libav-user
