Opened 14 years ago
Closed 14 years ago
#2005 closed defect (fixed)
Wrong palette colors with DVD subtitles encoding
| Reported by: | Clément Bœsch | Owned by: | |
|---|---|---|---|
| Priority: | normal | Component: | avcodec |
| Version: | git-master | Keywords: | dvdsub |
| Cc: | Blocked By: | ||
| Blocking: | Reproduced by developer: | yes | |
| Analyzed by developer: | yes |
Description (last modified by )
Generate a reference file:
% ./ffmpeg -f lavfi -i testsrc=s=720x480:d=400 ref.mkv
Mux DVD subtitles in:
% ./ffmpeg -i ref.mkv -i ~/fate-samples/sub/vobsub.idx -c copy -y test-remux.mkv
Here, colors are fine (yellow foreground):
mpv --start=03:00 test-remux.mkv mplayer -ss 03:00 test-remux.mkv mplayer2 --ss=03:00 test-remux.mkv
Note: mpv¹ and vlc show this properly, mplayer and mplayer2 display them in black & white (which is fine), ffplay seems to have various troubles.
Now encoding DVD subtitles in:
% ./ffmpeg -i ref.mkv -i ~/fate-samples/sub/vobsub.idx -c copy -c:s dvdsub -y test-encode.mkv
ffmpeg version N-47665-g18eb319 Copyright (c) 2000-2012 the FFmpeg developers
built on Dec 9 2012 18:50:45 with gcc 4.7.2 (GCC)
configuration: --enable-gpl --enable-fontconfig --enable-libfreetype --enable-libmp3lame --enable-libvorbis --enable-libxvid --enable-libx264 --enable-libvpx --enable-libtheora --enable-x11grab --enable-libopenjpeg --enable-libass --enable-libmodplug --enable-libv4l2 --cc=colorgcc --samples=/home/ubitux/fate-samples --prefix=/tmp/ffinstall --enable-runtime-cpudetect --enable-libcelt
libavutil 52. 12.100 / 52. 12.100
libavcodec 54. 79.101 / 54. 79.101
libavformat 54. 48.100 / 54. 48.100
libavdevice 54. 3.102 / 54. 3.102
libavfilter 3. 26.101 / 3. 26.101
libswscale 2. 1.103 / 2. 1.103
libswresample 0. 17.102 / 0. 17.102
libpostproc 52. 2.100 / 52. 2.100
Input #0, matroska,webm, from 'ref.mkv':
Metadata:
ENCODER : Lavf54.48.100
Duration: 00:06:40.08, start: 0.000000, bitrate: 49 kb/s
Stream #0:0: Video: h264 (High 4:4:4 Predictive), yuv444p, 720x480 [SAR 1:1 DAR 3:2], 25 fps, 25 tbr, 1k tbn, 50 tbc (default)
[vobsub @ 0x18e79a0] Estimating duration from bitrate, this may be inaccurate
Input #1, vobsub, from '/home/ubitux/fate-samples/sub/vobsub.idx':
Duration: N/A, bitrate: N/A
Stream #1:0[0x0](en): Subtitle: dvd_subtitle (default)
Output #0, matroska, to 'test-encode.mkv':
Metadata:
encoder : Lavf54.48.100
Stream #0:0: Video: h264, yuv444p, 720x480 [SAR 1:1 DAR 3:2], q=2-31, 25 fps, 1k tbn, 1k tbc (default)
Stream #0:1(en): Subtitle: dvd_subtitle (default)
Stream mapping:
Stream #0:0 -> #0:0 (copy)
Stream #1:0 -> #0:1 (dvdsub -> dvdsub)
Press [q] to stop, [?] for help
frame=10000 fps=884 q=-1.0 Lsize= 2507kB time=00:06:39.96 bitrate= 51.3kbits/s
video:2369kB audio:0kB subtitle:72 global headers:0kB muxing overhead 2.711231%
Problem: the colors of the subtitles are negated (or shuffled dunno). They also appear differently with players displaying them in black and white.
[1]: a mplayer2 fork https://github.com/mpv-player/mpv/, https://github.com/mpv-player/mpv/blob/master/DOCS/man/en/changes.rst
Change History (9)
comment:1 by , 14 years ago
| Description: | modified (diff) |
|---|
comment:2 by , 14 years ago
comment:3 by , 14 years ago
| Description: | modified (diff) |
|---|
When encoding and muxing to nut (which seems to be the only other format where muxing dvd subtitles is possible), the subtitles don't appear at all… (but they do on remux). So it's hard to tell.
follow-up: 8 comment:4 by , 14 years ago
0 0 00c5c5c5 00000000 116427 0 1 00c5c5c5 ffffff00 110562 0 2 00c5c5c5 ff000000 181452 0 3 00c5c5c5 00000000 116427
In other words, the dvdsub encoder considers that the transparent light gray is slightly nearer opaque yellow than transparent black. The culprit is color_distance() in dvdsubenc.c. A quick fix would be to get it to return 0 when both alphas are 0. A possibly better fix would be to multiply everything by alpha, i.e. consider the colors as a cone rather than an hypercube. Do you have any preference?
comment:5 by , 14 years ago
| Analyzed by developer: | set |
|---|---|
| Status: | new → open |
follow-up: 7 comment:6 by , 14 years ago
A possibly better fix would be to multiply everything by alpha
Would that change decoder output to premultiplied alpha?
comment:7 by , 14 years ago
Replying to gjdfgh:
Would that change decoder output to premultiplied alpha?
No: I meant multiply everything only in the distance function used to select the color map.
comment:8 by , 14 years ago
Replying to Cigaes:
0 0 00c5c5c5 00000000 116427 0 1 00c5c5c5 ffffff00 110562 0 2 00c5c5c5 ff000000 181452 0 3 00c5c5c5 00000000 116427In other words, the dvdsub encoder considers that the transparent light gray is slightly nearer opaque yellow than transparent black. The culprit is
color_distance()indvdsubenc.c. A quick fix would be to get it to return 0 when both alphas are 0. A possibly better fix would be to multiply everything by alpha, i.e. consider the colors as a cone rather than an hypercube. Do you have any preference?
If it solves the issue, using the alpha channel as a weight factor for the color sounds like a good idea to me (assuming that's what you meant).



Is this mkv-related or reproducible with other containers as well?