[FFmpeg-trac] #2827(FFmpeg:new): Output pixel format should be chosen based on H.264 profile, not the other way around

FFmpeg trac at avcodec.org
Wed Jul 31 07:33:22 CEST 2013


#2827: Output pixel format should be chosen based on H.264 profile, not the other
way around
--------------------------------+---------------------------------------
             Reporter:  MarkZV  |                     Type:  enhancement
               Status:  new     |                 Priority:  normal
            Component:  FFmpeg  |                  Version:  git-master
             Keywords:          |               Blocked By:
             Blocking:          |  Reproduced by developer:  0
Analyzed by developer:  0       |
--------------------------------+---------------------------------------
 Users are more likely to know what they need in terms of H.264 profiles,
 rather than lower level details like pixel formats, cabac, 8x8 transforms,
 etc.  The H.264 profile that is supported by a player or device is usually
 specified in the documentation or technical specifications, and its
 purpose is to make knowledge of the other technical codec parameters
 unnecessary for most users.  It is expected that the other codec
 parameters can be chosen automatically based on the profile.

 Right now that works for some things like cabac but is broken for pixel
 format.  Even when a profile is specified explicitly, FFmpeg will choose a
 pixel format that is not compatible with the profile that is specified.
 It makes the user specify the pixel format even when only 4:2:0 will work.
 There is no indication in the documentation that this is necessary or what
 pixel format should be specified for H.264 baseline, main, or high
 profile.  There is a message within the FFmpeg output but the way it is
 worded sounds like the option is only needed for greater compatibility and
 not for the command to work, and it does not make clear why the user
 should have to worry about pixel formats especially if the profile only
 supports 4:2:0.

 {{{
 $ ffmpeg -f lavfi -i testsrc -t 5 -profile:v baseline out.mp4
 ffmpeg version 2.0-c96b3ae Copyright (c) 2000-2013 the FFmpeg developers
   built on Jul 29 2013 15:12:25 with gcc 4.2.1 (GCC) (Apple Inc. build
 5666) (dot 3)
   configuration: --prefix=/opt/local --enable-swscale --enable-avfilter
 --enable-libmp3lame --enable-libvorbis --enable-libopus --enable-libtheora
 --enable-libschroedinger --enable-libopenjpeg --enable-libmodplug
 --enable-libvpx --enable-libspeex --enable-libass --enable-libbluray
 --enable-gnutls --enable-libfreetype --mandir=/opt/local/share/man
 --enable-shared --enable-pthreads --cc=/usr/bin/gcc-4.2 --arch=x86_64
 --enable-yasm --enable-gpl --enable-postproc --enable-libx264 --enable-
 libxvid --enable-version3 --enable-libopencore-amrnb --enable-libopencore-
 amrwb --enable-nonfree --enable-libfdk-aac --enable-libfaac
   libavutil      52. 40.100 / 52. 40.100
   libavcodec     55. 19.100 / 55. 19.100
   libavformat    55. 12.102 / 55. 12.102
   libavdevice    55.  3.100 / 55.  3.100
   libavfilter     3. 82.100 /  3. 82.100
   libswscale      2.  4.100 /  2.  4.100
   libswresample   0. 17.103 /  0. 17.103
   libpostproc    52.  3.100 / 52.  3.100
 Input #0, lavfi, from 'testsrc':
   Duration: N/A, start: 0.000000, bitrate: N/A
     Stream #0:0: Video: rawvideo (RGB[24] / 0x18424752), rgb24, 320x240
 [SAR 1:1 DAR 4:3], 25 tbr, 25 tbn, 25 tbc
 No pixel format specified, yuv444p for H.264 encoding chosen.
 Use -pix_fmt yuv420p for compatibility with outdated media players.
 x264 [error]: baseline profile doesn't support 4:4:4
 [libx264 @ 0x103801600] Error setting profile baseline.
 [libx264 @ 0x103801600] Possible profiles: baseline main high high10
 high422 high444
 Output #0, mp4, to 'out.mp4':
     Stream #0:0: Video: h264, yuv444p, 320x240 [SAR 1:1 DAR 4:3], q=-1--1,
 90k tbn, 25 tbc
 Stream mapping:
   Stream #0:0 -> #0:0 (rawvideo -> libx264)
 Error while opening encoder for output stream #0:0 - maybe incorrect
 parameters such as bit_rate, rate, width or height
 }}}

 If the principle is to not lose any data unless the user specifies
 otherwise, then the default should be {{{-crf 0}}}.  However I believe
 that the principle is actually to choose defaults that users will find the
 most useful.  Therefore, it seems that by default the libx264 encoder
 should make choices for unspecified settings based on the profile, and
 when no profile or options requiring a higher profile are explicitly
 specified (e.g. {{{-crf 0}}}), it should choose defaults compatible with
 high profile.  Not because high produces the best quality, just as {{{-crf
 23}}} does not produce the best quality, but because high profile (like
 {{{-crf 23}}}) will work well for most people that don't care enough to
 specify a profile.

 In other words a 4:4:4 pixel format should not be automatically chosen
 unless the {{{high444}}} profile was chosen (since that is the only
 profile compatible with 4:4:4), and the {{{high444}}} profile should not
 be chosen unless the user explicitly specifies an option that requires it
 (e.g. {{{-profile:v high444}}} or {{{-crf 0}}}).  An error should be
 reported if the user specifies conflicting options, such as {{{-profile:v
 baseline -crf 0}}}, but no error should be reported if the specified
 parameters can be accommodated by choosing a different value for an
 automatically chosen unspecified parameter.

-- 
Ticket URL: <https://ffmpeg.org/trac/ffmpeg/ticket/2827>
FFmpeg <http://ffmpeg.org>
FFmpeg issue tracker


More information about the FFmpeg-trac mailing list