[Libav-user] JPEG YUV->RGB
Jeremy Mordkoff
jlm at ZeeVee.Com
Thu May 12 12:13:20 CEST 2011
On May 12, 2011, at 3:12 AM, "Steffen Ebersbach" <ebersbac at hs-mittweida.de> 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
> Libav-user at ffmpeg.org
> 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.
More information about the Libav-user
mailing list