[FFmpeg-devel] The -colormartix option seems broken setting bt709

David Favor david at davidfavor.com
Tue Nov 5 23:53:22 CET 2013


David Favor wrote:
> Summary.
> 
> I have a video clip which fails to play on Roku devices.
> 
> The problem appears to be colormatrix related parameters are NULL.
> 
> Forcing colormatrix to bt709 allows the video to play + the only way
> to do this appears to be using x264 options.
> 
> Problems...
> 
> 1) video is missing the following parameters. video plays when these
>    parameters are set to BT.709 via -x264opts below.
> 
>    Color primaries                          : NULL
>    Transfer characteristics                 : NULL
>    Matrix coefficients                      : NULL
> 
> 2) ffmpeg -vf colormatrix=src:dst seems to have no idea how to do a
>    conversion from a null colormatrix to another colormatrix
> 
> 3) ffmpeg allows incorrect dst colormatrix matching when filter is 
> called...
>    so -vf colormatrix=bt601:bt709 is accepted, where the mismatch between
>    src=NULL when src=bt601 should probably throw a mismatch error.
> 
> The fix is to force setting all the parameters in #1 by passing options 
> to x264...
> 
>    -x264opts colorprim=bt709:transfer=bt709:colormatrix=bt709:fullrange=off
> 
> Seems like this might be a bug.
> _______
> 
> Here's the clip...
> 
> David-Favor-iMac> avinfo broken-cm-bt709.mp4
> broken-cm-bt709.mp4
>    Duration: 00:01:00.02, start: 0.000000, bitrate: 1213 kb/s
>    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 
> 1280x720 [SAR 1:1 DAR 16:9], 1112 kb/s, 23.98 fps, 23.98 tbr, 96k tbn, 
> 47.95 tbc (default)
>    Stream #0:1(eng): Audio: aac (mp4a / 0x6134706D), 48000 Hz, stereo, 
> fltp, 96 kb/s (default)
> 
> Notice 'yuv420p' instead of most videos which are 'yuv420p(tv, bt709)'.
> 
> Mediainfo shows key info missing from video.
> 
> David-Favor-iMac> mediainfo broken-cm-bt709.mp4 | egrep 'Color 
> primaries|Transfer characteristics|Matrix coefficients'
> 
> The first thing I tried was to simply change the colormatrix + the docs 
> say...
> 
>    http://ffmpeg.org/ffmpeg-filters.html#colormatrix
>    Specify the source and destination color matrix. Both values must be 
> specified.
> 
> So specifying a null src fails as expected...
> 
> David-Favor-iMac> ffmpeg -y -i broken-cm-bt709.mp4 -c:a copy -threads 0 
> -c:v libx264 -preset:v veryfast -crf:v 20 -vf colormatrix=:bt709 -r 
> 23.98 broken-cm-bt709-fixed.mp4
> ffmpeg version 2.1.0-2013-11-02-57805-g1a6948f Copyright (c) 2000-2013 
> the FFmpeg developers
>   built on Nov  2 2013 08:06:01 with gcc 4.8.2 (MacPots gcc48 4.8.2_0)
>   configuration: --prefix=/david-favor-tools/osx-10.9 --enable-pic 
> --enable-gpl --disable-debug --extra-cflags='-I 
> /david-favor-tools/osx-10.9/include -I /opt/local/include' 
> --extra-ldflags='-Wl,-rpath,/david-favor-tools/osx-10.9/lib 
> -Wl,-rpath,/opt/local/lib -L /david-favor-tools/osx-10.9/lib -L 
> /opt/local/lib' --enable-version3 --enable-shared --disable-static 
> --enable-ffplay --enable-ffprobe --enable-ffserver 
> --enable-runtime-cpudetect --enable-nonfree --enable-zlib --enable-bzlib 
> --enable-openssl --enable-libmp3lame --enable-libfaac --enable-libvpx 
> --enable-libtheora --enable-libvorbis --enable-libxvid --enable-libopus 
> --enable-libopenjpeg --enable-libfreetype --enable-libx264 
> --enable-postproc --enable-frei0r --enable-libopencore-amrnb 
> --enable-libmodplug --enable-libass --enable-openssl
>   libavutil      52. 49.100 / 52. 49.100
>   libavcodec     55. 40.101 / 55. 40.101
>   libavformat    55. 21.100 / 55. 21.100
>   libavdevice    55.  5.100 / 55.  5.100
>   libavfilter     3. 90.100 /  3. 90.100
>   libswscale      2.  5.101 /  2.  5.101
>   libswresample   0. 17.104 /  0. 17.104
>   libpostproc    52.  3.100 / 52.  3.100
> Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'broken-cm-bt709.mp4':
>   Metadata:
>     major_brand     : isom
>     minor_version   : 512
>     compatible_brands: isomiso2avc1mp41
>     encoder         : Lavf55.19.104
>   Duration: 00:01:00.02, start: 0.000000, bitrate: 1213 kb/s
>     Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 
> 1280x720 [SAR 1:1 DAR 16:9], 1112 kb/s, 23.98 fps, 23.98 tbr, 96k tbn, 
> 47.95 tbc (default)
>     Metadata:
>       handler_name    : VideoHandler
>     Stream #0:1(eng): Audio: aac (mp4a / 0x6134706D), 48000 Hz, stereo, 
> fltp, 96 kb/s (default)
>     Metadata:
>       handler_name    : SoundHandler
> [colormatrix @ 0x7fa9da424d20] [Eval @ 0x7fff50be9110] Undefined 
> constant or missing '(' in ''
> [colormatrix @ 0x7fa9da424d20] Unable to parse option value ""
> [colormatrix @ 0x7fa9da424d20] [Eval @ 0x7fff50be9170] Undefined 
> constant or missing '(' in ''
> [colormatrix @ 0x7fa9da424d20] Unable to parse option value ""
> [colormatrix @ 0x7fa9da424d20] Error setting option src to value .
> [Parsed_colormatrix_0 @ 0x7fa9da4230a0] Error applying options to the 
> filter.
> [AVFilterGraph @ 0x7fa9da4231a0] Error initializing filter 'colormatrix' 
> with args ':bt709'
> Error opening filters!
> 
> This works... even though the src (bt601) is bogus (fails to match 
> whatever the null setting is).
> And colormatrix is still unset 'yuv420p' instead of 'yuv420p(tv, bt709)'
> 
> David-Favor-iMac> avinfo broken-cm-bt709-fixed.mp4
> broken-cm-bt709-fixed.mp4
>    Duration: 00:01:00.22, start: 0.000000, bitrate: 1749 kb/s
>    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 
> 1280x720 [SAR 1:1 DAR 16:9], 1648 kb/s, 23.98 fps, 23.98 tbr, 19184 tbn, 
> 47.96 tbc (default)
>    Stream #0:1(eng): Audio: aac (mp4a / 0x6134706D), 48000 Hz, stereo, 
> fltp, 96 kb/s (default)
> 
> The only way colormatrix seems to be effected is to pass options 
> directly to x264, so this works...
> 
> David-Favor-iMac> ffmpeg -i broken-cm-bt709.mp4 -c:a copy -threads 0 
> -c:v libx264 -preset:v veryfast -crf:v 20 -x264opts 
> colorprim=bt709:transfer=bt709:colormatrix=bt709:fullrange=off -r 23.98 
> broken-cm-bt709-fixed.mp4
> ffmpeg version 2.1.0-2013-11-02-57805-g1a6948f Copyright (c) 2000-2013 
> the FFmpeg developers
>   built on Nov  2 2013 08:06:01 with gcc 4.8.2 (MacPots gcc48 4.8.2_0)
>   configuration: --prefix=/david-favor-tools/osx-10.9 --enable-pic 
> --enable-gpl --disable-debug --extra-cflags='-I 
> /david-favor-tools/osx-10.9/include -I /opt/local/include' 
> --extra-ldflags='-Wl,-rpath,/david-favor-tools/osx-10.9/lib 
> -Wl,-rpath,/opt/local/lib -L /david-favor-tools/osx-10.9/lib -L 
> /opt/local/lib' --enable-version3 --enable-shared --disable-static 
> --enable-ffplay --enable-ffprobe --enable-ffserver 
> --enable-runtime-cpudetect --enable-nonfree --enable-zlib --enable-bzlib 
> --enable-openssl --enable-libmp3lame --enable-libfaac --enable-libvpx 
> --enable-libtheora --enable-libvorbis --enable-libxvid --enable-libopus 
> --enable-libopenjpeg --enable-libfreetype --enable-libx264 
> --enable-postproc --enable-frei0r --enable-libopencore-amrnb 
> --enable-libmodplug --enable-libass --enable-openssl
>   libavutil      52. 49.100 / 52. 49.100
>   libavcodec     55. 40.101 / 55. 40.101
>   libavformat    55. 21.100 / 55. 21.100
>   libavdevice    55.  5.100 / 55.  5.100
>   libavfilter     3. 90.100 /  3. 90.100
>   libswscale      2.  5.101 /  2.  5.101
>   libswresample   0. 17.104 /  0. 17.104
>   libpostproc    52.  3.100 / 52.  3.100
> Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'broken-cm-bt709.mp4':
>   Metadata:
>     major_brand     : isom
>     minor_version   : 512
>     compatible_brands: isomiso2avc1mp41
>     encoder         : Lavf55.19.104
>   Duration: 00:01:00.02, start: 0.000000, bitrate: 1213 kb/s
>     Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 
> 1280x720 [SAR 1:1 DAR 16:9], 1112 kb/s, 23.98 fps, 23.98 tbr, 96k tbn, 
> 47.95 tbc (default)
>     Metadata:
>       handler_name    : VideoHandler
>     Stream #0:1(eng): Audio: aac (mp4a / 0x6134706D), 48000 Hz, stereo, 
> fltp, 96 kb/s (default)
>     Metadata:
>       handler_name    : SoundHandler
> File 'broken-cm-bt709-fixed.mp4' already exists. Overwrite ? [y/N] y
> [libx264 @ 0x7fe15080c400] using SAR=1/1
> [libx264 @ 0x7fe15080c400] using cpu capabilities: MMX2 SSE2Fast SSSE3 
> SSE4.2
> [libx264 @ 0x7fe15080c400] profile High, level 3.1
> [libx264 @ 0x7fe15080c400] 264 - core 138 - H.264/MPEG-4 AVC codec - 
> Copyleft 2003-2013 - http://www.videolan.org/x264.html - options: 
> cabac=1 ref=1 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=2 psy=1 
> psy_rd=1.00:0.00 mixed_ref=0 me_range=16 chroma_me=1 trellis=0 8x8dct=1 
> cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=0 threads=12 
> lookahead_threads=4 sliced_threads=0 nr=0 decimate=1 interlaced=0 
> bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 
> b_bias=0 direct=1 weightb=1 open_gop=0 weightp=1 keyint=250 
> keyint_min=23 scenecut=40 intra_refresh=0 rc_lookahead=10 rc=crf 
> mbtree=1 crf=20.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 
> aq=1:1.00
> Output #0, mp4, to 'broken-cm-bt709-fixed.mp4':
>   Metadata:
>     major_brand     : isom
>     minor_version   : 512
>     compatible_brands: isomiso2avc1mp41
>     encoder         : Lavf55.21.100
>     Stream #0:0(und): Video: h264 (libx264) ([33][0][0][0] / 0x0021), 
> yuv420p, 1280x720 [SAR 1:1 DAR 16:9], q=-1--1, 19184 tbn, 23.98 tbc 
> (default)
>     Metadata:
>       handler_name    : VideoHandler
>     Stream #0:1(eng): Audio: aac ([64][0][0][0] / 0x0040), 48000 Hz, 
> stereo, 96 kb/s (default)
>     Metadata:
>       handler_name    : SoundHandler
> Stream mapping:
>   Stream #0:0 -> #0:0 (h264 -> libx264)
>   Stream #0:1 -> #0:1 (copy)
> Press [q] to stop, [?] for help
> frame= 1444 fps=132 q=-1.0 Lsize=   12740kB time=00:01:00.13 
> bitrate=1735.6kbits/s dup=5 drop=0
> video:11997kB audio:703kB subtitle:0 global headers:0kB muxing overhead 
> 0.308973%
> [libx264 @ 0x7fe15080c400] frame I:13    Avg QP:10.82  size: 17746
> [libx264 @ 0x7fe15080c400] frame P:775   Avg QP:16.92  size: 13198
> [libx264 @ 0x7fe15080c400] frame B:656   Avg QP:17.75  size:  2782
> [libx264 @ 0x7fe15080c400] consecutive B-frames: 26.8% 37.1%  2.3% 33.8%
> [libx264 @ 0x7fe15080c400] mb I  I16..4: 62.5% 28.2%  9.3%
> [libx264 @ 0x7fe15080c400] mb P  I16..4: 18.0% 10.8%  0.7%  P16..4: 
> 23.0% 10.9%  5.1%  0.0%  0.0%    skip:31.4%
> [libx264 @ 0x7fe15080c400] mb B  I16..4:  1.3%  0.4%  0.0%  B16..8: 
> 15.8%  3.5%  0.3%  direct: 4.2%  skip:74.4%  L0:33.3% L1:53.2% BI:13.5%
> [libx264 @ 0x7fe15080c400] 8x8 transform intra:35.7% inter:39.8%
> [libx264 @ 0x7fe15080c400] coded y,uvDC,uvAC intra: 26.2% 33.5% 6.5% 
> inter: 8.3% 10.3% 0.5%
> [libx264 @ 0x7fe15080c400] i16 v,h,dc,p: 61% 22% 13%  5%
> [libx264 @ 0x7fe15080c400] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 23% 23% 29%  
> 3%  4%  5%  4%  4%  5%
> [libx264 @ 0x7fe15080c400] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 29% 22% 18%  
> 5%  5%  6%  5%  6%  5%
> [libx264 @ 0x7fe15080c400] i8c dc,h,v,p: 66% 15% 16%  2%
> [libx264 @ 0x7fe15080c400] Weighted P-Frames: Y:8.0% UV:5.7%
> [libx264 @ 0x7fe15080c400] kb/s:1632.05
> 
> Now colormatrix is set + the video plays on Roku devices...
> 
> avinfo broken-cm-bt709-fixed.mp4
> broken-cm-bt709-fixed.mp4
>    Duration: 00:01:00.22, start: 0.000000, bitrate: 1733 kb/s
>    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, 
> bt709), 1280x720 [SAR 1:1 DAR 16:9], 1632 kb/s, 23.98 fps, 23.98 tbr, 
> 19184 tbn, 47.96 tbc (default)
>    Stream #0:1(eng): Audio: aac (mp4a / 0x6134706D), 48000 Hz, stereo, 
> fltp, 96 kb/s (default)
> 

Still haven't found a way to fix this without transcoding. Ugh.

Still seems like a bug.

-- 
Love Living Well Doing What You Love?
http://DavidFavor.com/books can help!


More information about the ffmpeg-devel mailing list