Opened 7 years ago

Closed 5 years ago

#6203 closed defect (invalid)

'Color' filter does not always choose format correctly

Reported by: Misaki Owned by:
Priority: normal Component: avfilter
Version: git-master Keywords:
Cc: Blocked By:
Blocking: Reproduced by developer: no
Analyzed by developer: no

Description

The 'color' filter produces frames of a specific color. This can include alpha channel with a color like "black@0.5". However, if it is followed by a scale filter including scale2ref, the output format of 'color' filter is yuv420p, instead of yuva420p, so the alpha channel is lost.

The context of this is creating a filter chain (for ffplay) that scales down the video and adds a shadow, then overlays it on a zoomed-in image. The shadow's base transparency was lost when adding in the new scale2ref filter.

The above pretty much describes the issue, but here is the example made when I thought it was a bug with the new scale2ref filter:

misaki@dawn:~/software/ffmpeg$  ./ffmpeg -filter_complex color=black@0.5:d=0.1,split,scale2ref[a][b],[b]nullsink,[a]showinfo,split,overlay -f null -
ffmpeg version N-83585-ga5c1c7a8b3-static http://johnvansickle.com/ffmpeg/  Copyright (c) 2000-2017 the FFmpeg developers
  built with gcc 5.4.1 (Debian 5.4.1-5) 20170205
  configuration: --enable-gpl --enable-version3 --enable-static --disable-debug --disable-ffplay --disable-indev=sndio --disable-outdev=sndio --cc=gcc-5 --enable-fontconfig --enable-frei0r --enable-gnutls --enable-gray --enable-libass --enable-libfreetype --enable-libfribidi --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libvidstab --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxvid --enable-libzimg
  libavutil      55. 47.100 / 55. 47.100
  libavcodec     57. 80.101 / 57. 80.101
  libavformat    57. 66.102 / 57. 66.102
  libavdevice    57.  2.100 / 57.  2.100
  libavfilter     6. 73.100 /  6. 73.100
  libswscale      4.  3.101 /  4.  3.101
  libswresample   2.  4.100 /  2.  4.100
  libpostproc    54.  2.100 / 54.  2.100
[Parsed_showinfo_4 @ 0x3e8bac0] config in time_base: 1/25, frame_rate: 25/1
[Parsed_showinfo_4 @ 0x3e8bac0] config out time_base: 0/0, frame_rate: 0/0
Output #0, null, to 'pipe:':
  Metadata:
    encoder         : Lavf57.66.102
    Stream #0:0: Video: wrapped_avframe, yuva420p, 320x240 [SAR 1:1 DAR 4:3], q=2-31, 200 kb/s, 25 fps, 25 tbn, 25 tbc (default)
    Metadata:
      encoder         : Lavc57.80.101 wrapped_avframe
Stream mapping:
  overlay -> Stream #0:0 (wrapped_avframe)
Press [q] to stop, [?] for help
[Parsed_showinfo_4 @ 0x3e8bac0] n:   0 pts:      0 pts_time:0       pos:       -1 fmt:yuva420p sar:1/1 s:320x240 i:P iskey:1 type:I checksum:02EDAAF8 plane_checksum:[35B2C10E 2BAB822B 2BAB822B 77F0E576] mean:[16 128 128 255] stdev:[0.0 0.0 0.0 0.0]
[Parsed_showinfo_4 @ 0x3e8bac0] n:   1 pts:      1 pts_time:0.04    pos:       -1 fmt:yuva420p sar:1/1 s:320x240 i:P iskey:1 type:I checksum:02EDAAF8 plane_checksum:[35B2C10E 2BAB822B 2BAB822B 77F0E576] mean:[16 128 128 255] stdev:[0.0 0.0 0.0 0.0]
[Parsed_showinfo_4 @ 0x3e8bac0] n:   2 pts:      2 pts_time:0.08    pos:       -1 fmt:yuva420p sar:1/1 s:320x240 i:P iskey:1 type:I checksum:02EDAAF8 plane_checksum:[35B2C10E 2BAB822B 2BAB822B 77F0E576] mean:[16 128 128 255] stdev:[0.0 0.0 0.0 0.0]
frame=    3 fps=0.0 q=-0.0 Lsize=N/A time=00:00:00.12 bitrate=N/A speed=7.63x    
video:1kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown
misaki@dawn:~/software/ffmpeg$  ./ffmpeg -filter_complex color=black@0.5:d=0.1,showinfo,split,overlay -f null -
ffmpeg version N-83585-ga5c1c7a8b3-static http://johnvansickle.com/ffmpeg/  Copyright (c) 2000-2017 the FFmpeg developers
  built with gcc 5.4.1 (Debian 5.4.1-5) 20170205
  configuration: --enable-gpl --enable-version3 --enable-static --disable-debug --disable-ffplay --disable-indev=sndio --disable-outdev=sndio --cc=gcc-5 --enable-fontconfig --enable-frei0r --enable-gnutls --enable-gray --enable-libass --enable-libfreetype --enable-libfribidi --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libvidstab --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxvid --enable-libzimg
  libavutil      55. 47.100 / 55. 47.100
  libavcodec     57. 80.101 / 57. 80.101
  libavformat    57. 66.102 / 57. 66.102
  libavdevice    57.  2.100 / 57.  2.100
  libavfilter     6. 73.100 /  6. 73.100
  libswscale      4.  3.101 /  4.  3.101
  libswresample   2.  4.100 /  2.  4.100
  libpostproc    54.  2.100 / 54.  2.100
[Parsed_showinfo_1 @ 0x4aaf2c0] config in time_base: 1/25, frame_rate: 25/1
[Parsed_showinfo_1 @ 0x4aaf2c0] config out time_base: 0/0, frame_rate: 0/0
Output #0, null, to 'pipe:':
  Metadata:
    encoder         : Lavf57.66.102
    Stream #0:0: Video: wrapped_avframe, yuva420p, 320x240 [SAR 1:1 DAR 4:3], q=2-31, 200 kb/s, 25 fps, 25 tbn, 25 tbc (default)
    Metadata:
      encoder         : Lavc57.80.101 wrapped_avframe
Stream mapping:
  overlay -> Stream #0:0 (wrapped_avframe)
Press [q] to stop, [?] for help
[Parsed_showinfo_1 @ 0x4aaf2c0] n:   0 pts:      0 pts_time:0       pos:       -1 fmt:yuva420p sar:1/1 s:320x240 i:P iskey:1 type:I checksum:553FA22E plane_checksum:[35B2C10E 2BAB822B 2BAB822B CA42DCAC] mean:[16 128 128 127] stdev:[0.0 0.0 0.0 0.0]
[Parsed_showinfo_1 @ 0x4aaf2c0] n:   1 pts:      1 pts_time:0.04    pos:       -1 fmt:yuva420p sar:1/1 s:320x240 i:P iskey:1 type:I checksum:553FA22E plane_checksum:[35B2C10E 2BAB822B 2BAB822B CA42DCAC] mean:[16 128 128 127] stdev:[0.0 0.0 0.0 0.0]
[Parsed_showinfo_1 @ 0x4aaf2c0] n:   2 pts:      2 pts_time:0.08    pos:       -1 fmt:yuva420p sar:1/1 s:320x240 i:P iskey:1 type:I checksum:553FA22E plane_checksum:[35B2C10E 2BAB822B 2BAB822B CA42DCAC] mean:[16 128 128 127] stdev:[0.0 0.0 0.0 0.0]
frame=    3 fps=0.0 q=-0.0 Lsize=N/A time=00:00:00.12 bitrate=N/A speed= 9.2x    
video:1kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown

The 'split,overlay' is to retain the alpha channel, since otherwise it doesn't exist. In the first case, alpha is at 255 because it was dropped then re-added. In the second case, it is 127.

Verbose output for the first case shows this:

[Parsed_color_0 @ 0x594e700] size:320x240 rate:25/1 duration:0.100000 sar:1/1
[Parsed_scale2ref_2 @ 0x594f6c0] w:iw h:ih flags:'bilinear' interl:0
[Parsed_color_0 @ 0x5950ac0] size:320x240 rate:25/1 duration:0.100000 sar:1/1
[Parsed_scale2ref_2 @ 0x5951b00] w:iw h:ih flags:'bilinear' interl:0
[Parsed_scale2ref_2 @ 0x5951b00] w:320 h:240 fmt:yuv420p sar:1/1 -> w:320 h:240 fmt:yuva420p sar:1/1 flags:0x2

Which reveals that output from 'color' filter was yuv420p, though testing shows that the first resolution and format for the scale2ref filter is actually for the reference frame, not the frame that's modified.

I note that this static build is actually a few weeks old I think but I don't think I could successfully build it myself from the source, so it's the most recent available to me.

Not sure what keywords to add since the color filter has several names.

(In this particular case, you can avoid the problem by adding a format filter between the 'color' and 'scale[2ref]' filters but many people won't realize they need to.)

Change History (1)

comment:1 by Elon Musk, 5 years ago

Resolution: invalid
Status: newclosed

This is not a bug. If you want formats with alpha from color output you need to use format filter.

Note: See TracTickets for help on using tickets.