Opened 11 years ago
Last modified 20 months ago
#4444 new defect
Transparency gets lost when scaling pal8
| Reported by: | Carl Eugen Hoyos | Owned by: | |
|---|---|---|---|
| Priority: | normal | Component: | swscale |
| Version: | git-master | Keywords: | pal8 alpha |
| Cc: | Blocked By: | ||
| Blocking: | Reproduced by developer: | no | |
| Analyzed by developer: | no |
Description
$ ffmpeg -i alpha.png -s 168x168 out.png
ffmpeg version N-71320-gc4b2017 Copyright (c) 2000-2015 the FFmpeg developers
built with gcc 4.7 (SUSE Linux)
configuration: --enable-gpl
libavutil 54. 22.100 / 54. 22.100
libavcodec 56. 34.100 / 56. 34.100
libavformat 56. 29.100 / 56. 29.100
libavdevice 56. 4.100 / 56. 4.100
libavfilter 5. 13.101 / 5. 13.101
libswscale 3. 1.101 / 3. 1.101
libswresample 1. 1.100 / 1. 1.100
libpostproc 53. 3.100 / 53. 3.100
Input #0, png_pipe, from 'alpha.png':
Duration: N/A, bitrate: N/A
Stream #0:0: Video: png, pal8, 21x21 [SAR 5:6 DAR 5:6], 25 tbr, 25 tbn, 25 tbc
Output #0, apng, to 'out.png':
Metadata:
encoder : Lavf56.29.100
Stream #0:0: Video: apng, pal8, 168x168 [SAR 5:6 DAR 5:6], q=2-31, 200 kb/s, 25 fps, 25 tbn, 25 tbc
Metadata:
encoder : Lavc56.34.100 apng
Stream mapping:
Stream #0:0 -> #0:0 (png (native) -> apng (native))
Press [q] to stop, [?] for help
[apng @ 0x36fd040] Only a single frame so saving as a normal PNG.
frame= 1 fps=0.0 q=0.0 Lsize= 4kB time=00:00:00.04 bitrate= 823.4kbits/s
video:3kB audio:0kB subtitle:0kB other streams:0kB global headers:1kB muxing overhead: 24.418253%
The output file is opaque.
Attachments (1)
Note:
See TracTickets
for help on using tickets.



So, the fundamental problem here is that swscale does not support "true" PAL8 output. Instead a hack is performed by converting instead to BGR8 and then just tagging that as PAL8 (using avpriv_set_systematic_pal2).
The proper handling of paletted output would require generating a suitable palette and then dithering the image using that set of colors. (See vf_palettegen/paletteuse)
With the new graph dispatch infrastructure, it would be fairly straightforward to incorporate those filters as extra output passes, although it will require moving some code around. However, I propose simply dropping the "systematic" PAL8 output hack for now, at least in the case of inputs with an alpha channel.
Edit: That said, palettegen/paletteuse currently also do not support alpha transparent palettes.