[FFmpeg-devel] [RFC] Interlaced material, pix_fmt change, auto-inserted scaler
Mark Himsley
mark at mdsh.com
Tue Jul 26 22:11:20 CEST 2011
On 26/07/11 13:29, Michael Niedermayer wrote:
> On Tue, Jul 26, 2011 at 01:46:01PM +0200, Michael Niedermayer wrote:
>> On Tue, Jul 26, 2011 at 09:49:09AM +0100, Mark Himsley wrote:
>>> On 26/07/11 01:11, Michael Niedermayer wrote:
>>>> On Mon, Jul 25, 2011 at 06:12:25PM +0100, Mark Himsley wrote:
>>>>> Sorry for a very long rational for a very short patch.
>>>>>
>>>>> Cutting to the chase: What do you think of the attached patch?
>>>>>
>>>>>
>>>>> Basically: I have been getting some strange colour artefacts when I
>>>>> convert from yuv420p to yuv422p on interlaced material.
>>>>>
>>>>> Here is a demonstration clip:
>>>>> http://commondatastorage.googleapis.com/himslm01/976_0003_01.AVI
>>>>>
>>>>> The clip is an original DV25 clip created in a camera. The important
>>>>> part is the first 200 frames where there is a whip-pan across a bright
>>>>> green light switch.
>>>>>
>>>>> If I convert that clip to a 422 format, I've chosen DV50 for ease of
>>>>> this demonstration but I have also created IMX30 MPEG 2 video and it
>>>>> shows the same issue I'm trying to describe:
>>>>>
>>>>> ffmpeg -loglevel debug -i 976_0003_01.AVI -vcodec dvvideo -pix_fmt
>>>>> yuv422p -acodec pcm_s16le 976_0003_01.DV50.avi
>>>>>
>>>>> (full output of that command is below)
>>>>>
>>>>> If I look at the 422 output at field rate (for instance in a video
>>>>> editor) then I can see that something is wrong with the chroma.
>>>>>
>>>>> I think I can also demonstrate that using FFmpeg by using the yadif
>>>>> video filter on the original 420 and the new 422 copy:
>>>>>
>>>>> ffmpeg -loglevel debug -i 976_0003_01.DV50.avi -vframes 200 -vf yadif=1
>>>>> -r 50 -f image2 422%04d.png
>>>>>
>>>>> frame 122 is a good one to compare,
>>>>>
>>>>> png taken from original footage:
>>>>> http://commondatastorage.googleapis.com/himslm01/orig0122.png
>>>>>
>>>>> png taken from conversion to 422:
>>>>> http://commondatastorage.googleapis.com/himslm01/4220122.png
>>>>>
>>>>> You can see the big difference.
>>>>>
>>>>>
>>>>> But I noticed that if I specifically add an interlaced aware scale in
>>>>> the video filter, the chroma is correct.
>>>>>
>>>>> ffmpeg -loglevel debug -i 976_0003_01.AVI -vcodec dvvideo -pix_fmt
>>>>> yuv422p -acodec pcm_s16le -vf scale=0:0:interl=-1 976_0003_01.DV50-vf.avi
>>>>>
>>>>>
>>>>> The attached patch makes scale default to being interlaced aware. Is
>>>>> that a bad thing?
>>>>>
>>>>>
>>>>> If you feel this patch will be ok I'll send it again along with updated
>>>>> documentation with no training white space.
>>>>
>>>> it should be ok
>>>>
>>>> [...]
>>>
>>> Two patches attached.
>>>
>>> ffmpeg-scale-default-interlaced-aware.diff: make scale filter default to
>>> interlaced aware scaling& format changing dependent on source frames
>>> interlaced flag
>>>
>>> ffmpeg-scale-default-interlaced-aware-format.diff: reformat to usual
>>> coding standards
>>
>> both applied
>
> but not pushed, due to:
>
> --- ./tests/ref/vsynth1/dnxhd_1080i 2011-07-14 21:41:40.425374187 +0200
> +++ tests/data/fate/vsynth1-dnxhd_1080i 2011-07-26 13:45:49.895749789 +0200
> @@ -1,4 +1,4 @@
> 34949ea38da2cf6a8406ad600ad95cfa *./tests/data/vsynth1/dnxhd-1080i.mov
> 3031875 ./tests/data/vsynth1/dnxhd-1080i.mov
> -0c651e840f860592f0d5b66030d9fa32 *./tests/data/dnxhd_1080i.vsynth1.out.yuv
> -stddev: 6.29 PSNR: 32.15 MAXDIFF: 64 bytes: 760320/ 7603200
> +3c3226518a0f56468bf56a6682e31fae *./tests/data/dnxhd_1080i.vsynth1.out.yuv
> +stddev: 14.22 PSNR: 25.07 MAXDIFF: 119 bytes: 760320/ 7603200
> make: *** [fate-vsynth1-dnxhd_1080i] Error 1
> make: *** Waiting for unfinished jobs....
> --- ./tests/ref/vsynth1/dv 2011-07-11 03:51:36.225253709 +0200
> +++ tests/data/fate/vsynth1-dv 2011-07-26 13:45:53.105749789 +0200
> @@ -1,8 +1,8 @@
> 27ade3031b17214cf81c19cbf70f37d7 *./tests/data/vsynth1/dv.dv
> 7200000 ./tests/data/vsynth1/dv.dv
> -02ac7cdeab91d4d5621e7ce96dddc498 *./tests/data/dv.vsynth1.out.yuv
> -stddev: 6.90 PSNR: 31.34 MAXDIFF: 76 bytes: 7603200/ 7603200
> +31b3c8f0fa8ae336c561ccdee5738376 *./tests/data/dv.vsynth1.out.yuv
> +stddev: 12.83 PSNR: 25.96 MAXDIFF: 125 bytes: 7603200/ 7603200
> bd67f2431db160d4bb6dcd791cea6efd *./tests/data/vsynth1/dv411.dv
> 7200000 ./tests/data/vsynth1/dv411.dv
> -b6640a3a572353f51284acb746eb00c4 *./tests/data/dv.vsynth1.out.yuv
> -stddev: 30.76 PSNR: 18.37 MAXDIFF: 205 bytes: 7603200/ 7603200
> +7baa332c913fc9b65b7b24830acd74e0 *./tests/data/dv.vsynth1.out.yuv
> +stddev: 31.72 PSNR: 18.10 MAXDIFF: 206 bytes: 7603200/ 7603200
> make: *** [fate-vsynth1-dv] Error 1
> --- ./tests/ref/vsynth1/dv50 2011-07-11 03:51:36.225253709 +0200
> +++ tests/data/fate/vsynth1-dv50 2011-07-26 13:45:53.885749789 +0200
> @@ -1,4 +1,4 @@
> 26dba84f0ea895b914ef5b333d8394ac *./tests/data/vsynth1/dv50.dv
> 14400000 ./tests/data/vsynth1/dv50.dv
> -a2ff093e93ffed10f730fa21df02fc50 *./tests/data/dv50.vsynth1.out.yuv
> -stddev: 1.72 PSNR: 43.38 MAXDIFF: 29 bytes: 7603200/ 7603200
> +0f612929578f4955c88690b36a783d79 *./tests/data/dv50.vsynth1.out.yuv
> +stddev: 20.25 PSNR: 22.00 MAXDIFF: 224 bytes: 7603200/ 7603200
>
>
> [...]
I think I understand the output of fate. Taking the last example, it's
suggesting that the PSNR has reduced from over 43 to 22, which would be
a devastating difference.
So, that's DV, DV50, DV411 and dnxhd_1080i. I wonder - are these all
formats where the decoder always flags the video as interlaced?
Please bare with me as I work out what the fate tests do. In all my
viewing tests of the our problem media the output looked better with the
patch, so I hope it's the fate tests that are flawed ;-)
--
Mark
More information about the ffmpeg-devel
mailing list