[FFmpeg-devel] The -colormartix has trouble setting bt709

David Favor david at davidfavor.com
Sat Nov 2 15:26:31 CET 2013


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)

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


More information about the ffmpeg-devel mailing list