Opened 5 years ago

Closed 5 years ago

Last modified 14 months ago

#658 closed enhancement (fixed)

auto-select yuv420p for RGB inputs with libx264

Reported by: llogan Owned by:
Priority: important Component: avcodec
Version: git-master Keywords:
Cc: Blocked By:
Blocking: Reproduced by developer: yes
Analyzed by developer: no

Description

I've noticed an increasing number of users wondering why their outputs are not playing normally in some video players, and/or why some profiles won't work ("main profile doesn't support 4:4:4" for example). The general answer is to tell them to use "-pix_fmt yuv420p". x264 technically supports RGB, but I think the vast majority of users will want YUV, although they may not know it.

We closed a few similar reports as invalid (#585 and #601) because the current behavior isn't wrong, but it is inconsistent, but now that I see more questions about this I think the default behavior should be changed.

Current behavior:

$ ffmpeg -t 5 -loop 1 -i rgb24.png -vcodec libx264 -preset medium -crf 24 -y output.mp4
ffmpeg version N-34884-g7575980, Copyright (c) 2000-2011 the FFmpeg developers
  built on Nov 15 2011 11:51:13 with gcc 4.6.2
  configuration: --prefix=/usr --enable-gpl --enable-libx264
  libavutil    51. 25. 0 / 51. 25. 0
  libavcodec   53. 34. 0 / 53. 34. 0
  libavformat  53. 20. 0 / 53. 20. 0
  libavdevice  53.  4. 0 / 53.  4. 0
  libavfilter   2. 48. 1 /  2. 48. 1
  libswscale    2.  1. 0 /  2.  1. 0
  libpostproc  51.  2. 0 / 51.  2. 0
[image2 @ 0x2566880] max_analyze_duration 5000000 reached at 5000000
Input #0, image2, from 'rgb24.png':
  Duration: 00:00:00.04, start: 0.000000, bitrate: N/A
    Stream #0:0: Video: png, rgb24, 1000x1000, 25 fps, 25 tbr, 25 tbn, 25 tbc
[buffer @ 0x2566800] w:1000 h:1000 pixfmt:rgb24 tb:1/1000000 sar:0/1 sws_param:
[libx264 @ 0x256fe80] using cpu capabilities: MMX2 SSE2Fast SSSE3 FastShuffle SSE4.2
[libx264 @ 0x256fe80] profile High 4:4:4 Predictive, level 3.2, 4:4:4 8-bit
[libx264 @ 0x256fe80] 264 - core 119 r2106 07efeb4 - H.264/MPEG-4 AVC codec - Copyleft 2003-2011 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=12 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=2 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=24.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
Output #0, mp4, to 'output.mp4':
  Metadata:
    encoder         : Lavf53.20.0
    Stream #0:0: Video: h264 (![0][0][0] / 0x0021), rgb24, 1000x1000, q=-1--1, 25 tbn, 25 tbc
Stream mapping:
  Stream #0:0 -> #0:0 (png -> libx264)
Press [q] to stop, [?] for help
frame=  125 fps= 96 q=-1.0 Lsize=      30kB time=00:00:04.92 bitrate=  49.2kbits/s    
video:27kB audio:0kB global headers:0kB muxing overhead 10.153522%
[libx264 @ 0x256fe80] frame I:1     Avg QP:18.84  size: 18603
[libx264 @ 0x256fe80] frame P:31    Avg QP:31.06  size:   117
[libx264 @ 0x256fe80] frame B:93    Avg QP:31.85  size:    49
[libx264 @ 0x256fe80] consecutive B-frames:  0.8%  0.0%  0.0% 99.2%
[libx264 @ 0x256fe80] mb I  I16..4: 88.5%  5.3%  6.2%
[libx264 @ 0x256fe80] mb P  I16..4:  1.8%  0.0%  0.0%  P16..4:  0.1%  0.0%  0.0%  0.0%  0.0%    skip:98.1%
[libx264 @ 0x256fe80] mb B  I16..4:  0.0%  0.0%  0.0%  B16..8:  0.3%  0.0%  0.0%  direct: 0.0%  skip:99.7%  L0:66.9% L1:33.1% BI: 0.0%
[libx264 @ 0x256fe80] 8x8 transform intra:3.8% inter:36.5%
[libx264 @ 0x256fe80] coded y,u,v intra: 2.3% 2.2% 2.3% inter: 0.0% 0.0% 0.0%
[libx264 @ 0x256fe80] i16 v,h,dc,p: 77% 23%  0%  0%
[libx264 @ 0x256fe80] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 54%  3% 43%  0%  0%  0%  0%  0%  0%
[libx264 @ 0x256fe80] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 44% 27% 18%  2%  2%  2%  2%  2%  1%
[libx264 @ 0x256fe80] Weighted P-Frames: Y:0.0% UV:0.0%
[libx264 @ 0x256fe80] ref P L0: 51.7%  7.9% 37.1%  3.4%
[libx264 @ 0x256fe80] ref B L0: 32.4% 65.3%  2.3%
[libx264 @ 0x256fe80] ref B L1: 98.3%  1.7%
[libx264 @ 0x256fe80] kb/s:42.84

Re-encoding the output with same settings. Note auto-selecting format 'yuv420p':

$ ffmpeg -i output.mp4 -vcodec libx264 -preset medium -crf 24 -y out2.mp4
ffmpeg version N-34884-g7575980, Copyright (c) 2000-2011 the FFmpeg developers
  built on Nov 15 2011 11:51:13 with gcc 4.6.2
  configuration: --prefix=/usr --enable-gpl --enable-libx264
  libavutil    51. 25. 0 / 51. 25. 0
  libavcodec   53. 34. 0 / 53. 34. 0
  libavformat  53. 20. 0 / 53. 20. 0
  libavdevice  53.  4. 0 / 53.  4. 0
  libavfilter   2. 48. 1 /  2. 48. 1
  libswscale    2.  1. 0 /  2.  1. 0
  libpostproc  51.  2. 0 / 51.  2. 0
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'output.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    creation_time   : 1970-01-01 00:00:00
    encoder         : Lavf53.20.0
  Duration: 00:00:05.00, start: 0.000000, bitrate: 48 kb/s
    Stream #0:0(und): Video: h264 (High 4:4:4 Predictive) (avc1 / 0x31637661), gbr24p, 1000x1000, 43 kb/s, 25 fps, 25 tbr, 25 tbn, 50 tbc
    Metadata:
      creation_time   : 1970-01-01 00:00:00
      handler_name    : 
Incompatible pixel format 'gbr24p' for codec 'libx264', auto-selecting format 'yuv420p'
[buffer @ 0x1cf1280] w:1000 h:1000 pixfmt:gbr24p tb:1/1000000 sar:0/1 sws_param:
[buffersink @ 0x1cf1680] auto-inserting filter 'auto-inserted scale 0' between the filter 'src' and the filter 'out'
[scale @ 0x1cf1b60] w:1000 h:1000 fmt:gbr24p -> w:1000 h:1000 fmt:yuv420p flags:0x4
[libx264 @ 0x1cfd920] using cpu capabilities: MMX2 SSE2Fast SSSE3 FastShuffle SSE4.2
[libx264 @ 0x1cfd920] profile High, level 3.2
[libx264 @ 0x1cfd920] 264 - core 119 r2106 07efeb4 - H.264/MPEG-4 AVC codec - Copyleft 2003-2011 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=12 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=2 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=24.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
Output #0, mp4, to 'out2.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    creation_time   : 1970-01-01 00:00:00
    encoder         : Lavf53.20.0
    Stream #0:0(und): Video: h264 (![0][0][0] / 0x0021), yuv420p, 1000x1000, q=-1--1, 25 tbn, 25 tbc
    Metadata:
      creation_time   : 1970-01-01 00:00:00
      handler_name    : 
Stream mapping:
  Stream #0:0 -> #0:0 (h264 -> libx264)
Press [q] to stop, [?] for help
frame=  125 fps= 85 q=-1.0 Lsize=      21kB time=00:00:04.92 bitrate=  35.3kbits/s    
video:18kB audio:0kB global headers:0kB muxing overhead 14.750026%
[libx264 @ 0x1cfd920] frame I:1     Avg QP:16.37  size: 12481
[libx264 @ 0x1cfd920] frame P:32    Avg QP:25.74  size:    65
[libx264 @ 0x1cfd920] frame B:92    Avg QP:28.95  size:    40
[libx264 @ 0x1cfd920] consecutive B-frames:  1.6%  0.0%  2.4% 96.0%
[libx264 @ 0x1cfd920] mb I  I16..4: 93.1%  0.1%  6.9%
[libx264 @ 0x1cfd920] mb P  I16..4:  0.1%  0.0%  0.0%  P16..4:  0.1%  0.0%  0.0%  0.0%  0.0%    skip:99.8%
[libx264 @ 0x1cfd920] mb B  I16..4:  0.0%  0.0%  0.0%  B16..8:  0.0%  0.0%  0.0%  direct: 0.0%  skip:100.0%  L0:36.1% L1:63.9% BI: 0.0%
[libx264 @ 0x1cfd920] 8x8 transform intra:0.0% inter:57.9%
[libx264 @ 0x1cfd920] coded y,uvDC,uvAC intra: 4.8% 10.6% 8.5% inter: 0.0% 0.0% 0.0%
[libx264 @ 0x1cfd920] i16 v,h,dc,p: 84% 15%  2%  0%
[libx264 @ 0x1cfd920] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 75% 12% 12%  0%  0%  0%  0%  0%  0%
[libx264 @ 0x1cfd920] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 44% 28% 19%  2%  1%  2%  2%  1%  1%
[libx264 @ 0x1cfd920] i8c dc,h,v,p: 62% 21% 17%  1%
[libx264 @ 0x1cfd920] Weighted P-Frames: Y:0.0% UV:0.0%
[libx264 @ 0x1cfd920] ref P L0: 66.7%  1.7% 25.8%  5.8%
[libx264 @ 0x1cfd920] ref B L0: 78.6% 14.3%  7.1%
[libx264 @ 0x1cfd920] ref B L1: 94.9%  5.1%
[libx264 @ 0x1cfd920] kb/s:29.14

Also, default behavior of x264 is to choose yuv420p:

$ x264 rgb24.png -o output.h264
Using network protocols without global network initialization. Please use avformat_network_init(), this will become mandatory later.
Using network protocols without global network initialization. Please use avformat_network_init(), this will become mandatory later.
lavf [info]: 1000x1000p 0:1 @ 25/1 fps (vfr)
resize [warning]: converting from rgb24 to yuv420p
x264 [info]: using cpu capabilities: MMX2 SSE2Fast SSSE3 FastShuffle SSE4.2
x264 [info]: profile High, level 3.2
[swscaler @ 0x2f16820] Warning: data is not aligned! This can lead to a speedloss
x264 [info]: frame I:1     Avg QP:25.53  size:  7473                           
x264 [info]: mb I  I16..4: 88.8%  5.4%  5.8%
x264 [info]: 8x8 transform intra:5.4%
x264 [info]: coded y,uvDC,uvAC intra: 3.6% 8.4% 2.7%
x264 [info]: i16 v,h,dc,p: 79% 19%  2%  0%
x264 [info]: i8 v,h,dc,ddl,ddr,vr,hd,vl,hu:  2%  0% 98%  0%  0%  0%  0%  0%  0%
x264 [info]: i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 43% 27% 20%  1%  2%  2%  2%  2%  2%
x264 [info]: i8c dc,h,v,p: 78%  9% 12%  1%
x264 [info]: kb/s:1494.60

encoded 1 frames, 25.58 fps, 1494.60 kb/s

Change History (7)

comment:1 Changed 5 years ago by cehoyos

  • Component changed from undetermined to avcodec
  • Priority changed from wish to important
  • Reproduced by developer set
  • Status changed from new to open

I believe this should at least be discussed, a possible solution would be a private option that "allows" rgb.

comment:2 Changed 5 years ago by llogan

Does a private option make more sense than just setting an appropriate pix_fmt to preserve RGB? With x264 I believe "--output-csp rgb" keeps RGB:

$ x264 rgb24.png --output-csp rgb -o output.h264
Using network protocols without global network initialization. Please use avformat_network_init(), this will become mandatory later.
Using network protocols without global network initialization. Please use avformat_network_init(), this will become mandatory later.
lavf [info]: 1000x1000p 0:1 @ 25/1 fps (vfr)
x264 [info]: using cpu capabilities: MMX2 SSE2Fast SSSE3 FastShuffle SSE4.2
x264 [info]: profile High 4:4:4 Predictive, level 3.2, 4:4:4 8-bit
x264 [info]: frame I:1     Avg QP:26.66  size: 11440                           
x264 [info]: mb I  I16..4: 84.3% 10.3%  5.4%
x264 [info]: 8x8 transform intra:10.3%
x264 [info]: coded y,u,v intra: 2.8% 2.8% 4.1%
x264 [info]: i16 v,h,dc,p: 80% 20%  0%  0%
x264 [info]: i8 v,h,dc,ddl,ddr,vr,hd,vl,hu:  5%  5% 90%  0%  0%  0%  0%  0%  0%
x264 [info]: i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 44% 26% 19%  1%  2%  2%  2%  2%  2%
x264 [info]: kb/s:2288.00

encoded 1 frames, 20.00 fps, 2288.00 kb/s

comment:3 Changed 5 years ago by michael

i dont think this can be done with a private option (but it would be nice otherwise), a seperate AVCodec would work though, like x264rgb

comment:4 Changed 5 years ago by michael

Note, each AVCodec currently needs a seperate AVClass

comment:5 Changed 5 years ago by michael

  • Resolution set to fixed
  • Status changed from open to closed

Locally fixed through a 2nd AVCodec

comment:6 Changed 5 years ago by michael

And a better solution is of course welcome !

comment:7 Changed 14 months ago by rogerdpack

for followers, you can specify it like "ffmpeg -i input -c:v libx264rgb" (and add normal libx264 args after that).

Note: See TracTickets for help on using tickets.