[FFmpeg-user] The internal ffmpeg rgb=>yuv pipeline and conversion matrices

Peter Rabbitson rabbit+list at rabbit.us
Mon May 9 11:21:21 CEST 2016

Thank you very much for confirming at least a part of my mental model ;) 
Followup questions inlined below:

On 05/09/2016 10:29 AM, Paul B Mahol wrote:
> On 5/6/16, Peter Rabbitson <rabbit+list at rabbit.us> wrote:
>>  ...
>> == Questions
>> - What is the "default" conversion matrix used within ffmpeg when
>> nothing else is specified. Is it (apparently) bt.601, or does it default
>> to different things depending on input?
> You are using color source filter which is using fixed coeff (bt.601) when
> converting color from rgb to yuv. There is nothing much you can do about
> this.

Is this documented somewhere?

My actual use case btw is 24bit rgb via image2pipe as in:

 > ... -f image2pipe -c:v ppm -i /dev/stdin ...

which behaves the same way as the internal color source I used in the 

>> - If it is bt.601 is it bt470bg or is it smpte170m or in the matrix case
>> it doesn't matter?

I think this question got skipped in the answer.

>> - Is it "ok" to produce 720p video explicitly tagged at bt.601? I ran
>> across multiple writeups on the net suggesting 720p not encoded (is this
>> the right term?) in bt.709 is a big no-no.
> It is "ok" to produce it, but not all encoders support proper tagging right
> colorspace in their bitstream... so better be safe than sorry and not
> produce such files.
>> - Regardless of what the answer to the previous question is: If I wanted
>> to produce the same example video in bt.709 and have it play correctly
>> in both cases - what would the ffmpeg incantation be?
> FFmpeg doesn't play videos, it decodes them. FFplay is more a tool
> for testing than proper playback.

I phrased this last question incorrectly. Given my source *is* rgb, and 
I want to produce a final 1280x720 yuv444p h264 bitsream, to be consumed 
by whatever player (both hardware and softwre):

What is the correct ffmpeg *encoding* incantation?

>> - Am I correct that the inconsistency #00AA00 => #00AB01 is simply "cost
>> of doing YUV business", or is the reason more nuanced/involved?

This question also got skipped, and I am really keen on understanding 
whether colors can in fact roundtrip, or there is a limit due to the 
very physics the different colorspaces model. I see there is a large 
array of knobs to twiddle in `man ffmpeg-scaler` related to chroma but 
there is sadly no layman-friendly entry-point.

More information about the ffmpeg-user mailing list