Opened 6 years ago

Closed 5 years ago

#7117 closed defect (fixed)

DVB subtitles render incorrectly

Reported by: leoenc Owned by:
Priority: normal Component: avcodec
Version: git-master Keywords: dvbsub
Cc: Blocked By:
Blocking: Reproduced by developer: yes
Analyzed by developer: yes

Description

Summary of the bug:

Conversion of sup subtitles (pgssub) to DVB subtitles and muxing to mpeg-ts results in bad looking subtitles.
When using the overlay filter instead, they render correctly.

I am using the latest nightly build 20180331-be502ec and testing with VLC Player 3.0.1 (Windows). I also tried playing the dvb output with ffplay but subtitles aren't showing but instead the screen is just flashing from black to video.
I tried with or without canvas_size 1920x1080 and/or s:s 1920x1080, makes no difference.

How to reproduce:
I've attached the input video and subtitles needed to reproduce + both outputs I got on my end.

Output with DVB subtitles which looks wrong:

ffmpeg -y -i input.mp4 -fix_sub_duration -i subtitles.sup -vcodec libx264 -crf 24 -f mpegts -scodec dvbsub output_dvb.ts
ffmpeg version N-90553-gbe502ec6cd Copyright (c) 2000-2018 the FFmpeg developers
  built with gcc 7.3.0 (GCC)
  configuration: --enable-gpl --enable-version3 --enable-sdl2 --enable-bzlib --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex --enable-libxvid --enable-libaom --enable-libmfx --enable-amf --enable-ffnvcodec --enable-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2 --enable-avisynth
  libavutil      56. 12.100 / 56. 12.100
  libavcodec     58. 16.100 / 58. 16.100
  libavformat    58. 10.100 / 58. 10.100
  libavdevice    58.  2.100 / 58.  2.100
  libavfilter     7. 13.100 /  7. 13.100
  libswscale      5.  0.102 /  5.  0.102
  libswresample   3.  0.101 /  3.  0.101
  libpostproc    55.  0.100 / 55.  0.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'input.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 1
    compatible_brands: isomavc1
    creation_time   : 2018-04-01T16:37:29.000000Z
  Duration: 00:00:30.12, start: 0.000000, bitrate: 20 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], 18 kb/s, 25 fps, 25 tbr, 100 tbn, 50 tbc (default)
    Metadata:
      creation_time   : 2018-04-01T16:37:29.000000Z
      handler_name    : 264@GPAC0.7.0-rev0-gbd5c9af-master
Input #1, sup, from 'subtitles.sup':
  Duration: N/A, start: 3.440000, bitrate: N/A
    Stream #1:0: Subtitle: hdmv_pgs_subtitle, 1920x1080
Stream mapping:
  Stream #0:0 -> #0:0 (h264 (native) -> h264 (libx264))
  Stream #1:0 -> #0:1 (hdmv_pgs_subtitle (pgssub) -> dvb_subtitle (dvbsub))
Press [q] to stop, [?] for help
[sup @ 00000271594a0140] Invalid timestamps stream=0, pts=0, dts=303570, size=4974
[libx264 @ 00000271594833c0] using SAR=1/1
[libx264 @ 00000271594833c0] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX FMA3 BMI2 AVX2
[libx264 @ 00000271594833c0] profile High, level 4.0
Output #0, mpegts, to 'output_dvb.ts':
  Metadata:
    major_brand     : isom
    minor_version   : 1
    compatible_brands: isomavc1
    encoder         : Lavf58.10.100
    Stream #0:0(und): Video: h264 (libx264), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], q=-1--1, 25 fps, 90k tbn, 25 tbc (default)
    Metadata:
      creation_time   : 2018-04-01T16:37:29.000000Z
      handler_name    : 264@GPAC0.7.0-rev0-gbd5c9af-master
      encoder         : Lavc58.16.100 libx264
    Side data:
      cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: -1
    Stream #0:1: Subtitle: dvb_subtitle (dvbsub), 1920x1080
    Metadata:
      encoder         : Lavc58.16.100 dvbsub
[sup @ 00000271594a0140] Invalid timestamps stream=0, pts=0, dts=767997, size=6238
[sup @ 00000271594a0140] Invalid timestamps stream=0, pts=0, dts=1135096, size=9926
frame=  150 fps=0.0 q=29.0 size=      27kB time=00:00:06.68 bitrate=  33.1kbits/s sp[sup @ 00000271594a0140] Invalid timestamps stream=0, pts=0, dts=1635183, size=17502
frame=  310 fps=309 q=29.0 size=      80kB time=00:00:11.80 bitrate=  55.6kbits/s sp[sup @ 00000271594a0140] Invalid timestamps stream=0, pts=0, dts=2218393, size=18698
frame=  478 fps=317 q=29.0 size=     133kB time=00:00:18.60 bitrate=  58.7kbits/s spframe=  639 fps=318 q=29.0 size=     187kB time=00:00:24.20 bitrate=  63.1kbits/s spframe=  753 fps=310 q=-1.0 Lsize=     221kB time=00:00:30.00 bitrate=  60.3kbits/s speed=12.3x
video:54kB audio:0kB subtitle:65kB other streams:0kB global headers:0kB muxing overhead: 85.350807%
[libx264 @ 00000271594833c0] frame I:4     Avg QP: 8.50  size:   642
[libx264 @ 00000271594833c0] frame P:190   Avg QP:10.10  size:    77
[libx264 @ 00000271594833c0] frame B:559   Avg QP:13.67  size:    69
[libx264 @ 00000271594833c0] consecutive B-frames:  0.9%  0.3%  0.0% 98.8%
[libx264 @ 00000271594833c0] mb I  I16..4: 100.0%  0.0%  0.0%
[libx264 @ 00000271594833c0] mb P  I16..4:  0.0%  0.0%  0.0%  P16..4:  0.0%  0.0%  0.0%  0.0%  0.0%    skip:100.0%
[libx264 @ 00000271594833c0] mb B  I16..4:  0.0%  0.0%  0.0%  B16..8:  0.0%  0.0%  0.0%  direct: 0.0%  skip:100.0%
[libx264 @ 00000271594833c0] 8x8 transform intra:0.0%
[libx264 @ 00000271594833c0] coded y,uvDC,uvAC intra: 0.0% 0.0% 0.0% inter: 0.0% 0.0% 0.0%
[libx264 @ 00000271594833c0] i16 v,h,dc,p: 99%  0%  1%  0%
[libx264 @ 00000271594833c0] i8c dc,h,v,p: 100%  0%  0%  0%
[libx264 @ 00000271594833c0] Weighted P-Frames: Y:0.0% UV:0.0%
[libx264 @ 00000271594833c0] kb/s:14.75

Output with overlay subtitles which looks correct:

ffmpeg -y -i input.mp4 -i subtitles.sup -filter_complex "[1:s]scale=width=1920:height=1080[sub];[0:v][sub]overlay" -vcodec libx264 -crf 24 -f mpegts output_overlay.ts
ffmpeg version N-90553-gbe502ec6cd Copyright (c) 2000-2018 the FFmpeg developers
  built with gcc 7.3.0 (GCC)
  configuration: --enable-gpl --enable-version3 --enable-sdl2 --enable-bzlib --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex --enable-libxvid --enable-libaom --enable-libmfx --enable-amf --enable-ffnvcodec --enable-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2 --enable-avisynth
  libavutil      56. 12.100 / 56. 12.100
  libavcodec     58. 16.100 / 58. 16.100
  libavformat    58. 10.100 / 58. 10.100
  libavdevice    58.  2.100 / 58.  2.100
  libavfilter     7. 13.100 /  7. 13.100
  libswscale      5.  0.102 /  5.  0.102
  libswresample   3.  0.101 /  3.  0.101
  libpostproc    55.  0.100 / 55.  0.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'input.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 1
    compatible_brands: isomavc1
    creation_time   : 2018-04-01T16:37:29.000000Z
  Duration: 00:00:30.12, start: 0.000000, bitrate: 20 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], 18 kb/s, 25 fps, 25 tbr, 100 tbn, 50 tbc (default)
    Metadata:
      creation_time   : 2018-04-01T16:37:29.000000Z
      handler_name    : 264@GPAC0.7.0-rev0-gbd5c9af-master
Input #1, sup, from 'subtitles.sup':
  Duration: N/A, start: 3.440000, bitrate: N/A
    Stream #1:0: Subtitle: hdmv_pgs_subtitle, 1920x1080
Stream mapping:
  Stream #0:0 (h264) -> overlay:main
  Stream #1:0 (pgssub) -> scale
  overlay -> Stream #0:0 (libx264)
Press [q] to stop, [?] for help
[sup @ 00000292aeae0600] Invalid timestamps stream=0, pts=0, dts=303570, size=4974
[sup @ 00000292aeae0600] Invalid timestamps stream=0, pts=0, dts=767997, size=6238
[sup @ 00000292aeae0600] sub2video: using 720x576 canvas
[libx264 @ 00000292ae6e2700] using SAR=1/1
[libx264 @ 00000292ae6e2700] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX FMA3 BMI2 AVX2
[libx264 @ 00000292ae6e2700] profile High, level 4.0
Output #0, mpegts, to 'output_overlay.ts':
  Metadata:
    major_brand     : isom
    minor_version   : 1
    compatible_brands: isomavc1
    encoder         : Lavf58.10.100
    Stream #0:0: Video: h264 (libx264), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], q=-1--1, 25 fps, 90k tbn, 25 tbc (default)
    Metadata:
      encoder         : Lavc58.16.100 libx264
    Side data:
      cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: -1
frame=   57 fps=0.0 q=29.0 size=       7kB time=-00:00:00.07 bitrate=N/A speed=N/A  frame=  123 fps=123 q=29.0 size=      20kB time=00:00:02.56 bitrate=  62.9kbits/s sp[sup @ 00000292aeae0600] Invalid timestamps stream=0, pts=0, dts=1135096, size=9926
frame=  189 fps=126 q=29.0 size=      40kB time=00:00:05.20 bitrate=  63.6kbits/s sp[sup @ 00000292aeae0600] Invalid timestamps stream=0, pts=0, dts=1635183, size=17502
frame=  255 fps=127 q=29.0 size=      53kB time=00:00:07.84 bitrate=  55.2kbits/s spframe=  322 fps=128 q=29.0 size=      78kB time=00:00:10.52 bitrate=  60.5kbits/s sp[sup @ 00000292aeae0600] Invalid timestamps stream=0, pts=0, dts=2218393, size=18698
frame=  388 fps=129 q=29.0 size=      91kB time=00:00:13.16 bitrate=  56.5kbits/s spframe=  454 fps=129 q=29.0 size=     125kB time=00:00:15.80 bitrate=  64.6kbits/s spframe=  518 fps=129 q=29.0 size=     137kB time=00:00:18.36 bitrate=  61.2kbits/s spframe=  583 fps=129 q=29.0 size=     149kB time=00:00:20.96 bitrate=  58.4kbits/s spframe=  649 fps=129 q=29.0 size=     184kB time=00:00:23.60 bitrate=  64.0kbits/s spframe=  716 fps=129 q=29.0 size=     198kB time=00:00:26.28 bitrate=  61.6kbits/s spframe=  754 fps=127 q=-1.0 Lsize=     216kB time=00:00:30.04 bitrate=  58.8kbits/s speed=5.07x
video:116kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 85.782951%
[libx264 @ 00000292ae6e2700] frame I:5     Avg QP: 8.08  size: 12890
[libx264 @ 00000292ae6e2700] frame P:190   Avg QP: 9.85  size:    81
[libx264 @ 00000292ae6e2700] frame B:559   Avg QP:13.61  size:    70
[libx264 @ 00000292ae6e2700] consecutive B-frames:  1.1%  0.3%  0.0% 98.7%
[libx264 @ 00000292ae6e2700] mb I  I16..4: 95.4%  3.1%  1.5%
[libx264 @ 00000292ae6e2700] mb P  I16..4:  0.0%  0.0%  0.0%  P16..4:  0.0%  0.0%  0.0%  0.0%  0.0%    skip:100.0%
[libx264 @ 00000292ae6e2700] 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:42.3% L1:57.7% BI: 0.0%
[libx264 @ 00000292ae6e2700] 8x8 transform intra:3.0% inter:6.6%
[libx264 @ 00000292ae6e2700] coded y,uvDC,uvAC intra: 1.0% 1.5% 1.5% inter: 0.0% 0.0% 0.0%
[libx264 @ 00000292ae6e2700] i16 v,h,dc,p: 98%  0%  2%  0%
[libx264 @ 00000292ae6e2700] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 55%  4% 41%  0%  0%  0%  0%  0%  0%
[libx264 @ 00000292ae6e2700] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 43% 18% 14%  3%  4%  6%  5%  4%  3%
[libx264 @ 00000292ae6e2700] i8c dc,h,v,p: 99%  1%  0%  0%
[libx264 @ 00000292ae6e2700] Weighted P-Frames: Y:0.0% UV:0.0%
[libx264 @ 00000292ae6e2700] ref P L0: 90.5%  6.0%  3.6%
[libx264 @ 00000292ae6e2700] ref B L0: 75.5% 24.5%
[libx264 @ 00000292ae6e2700] ref B L1: 98.5%  1.5%
[libx264 @ 00000292ae6e2700] kb/s:0.00

Attachments (7)

dvbsub.jpg (92.0 KB ) - added by leoenc 6 years ago.
dvbsub.2.jpg (92.0 KB ) - added by leoenc 6 years ago.
input.mp4 (76.4 KB ) - added by leoenc 6 years ago.
output_dvb.ts (220.7 KB ) - added by leoenc 6 years ago.
output_overlay.ts (215.5 KB ) - added by leoenc 6 years ago.
overlay.jpg (89.0 KB ) - added by leoenc 6 years ago.
subtitles.sup (58.1 KB ) - added by leoenc 6 years ago.

Download all attachments as: .zip

Change History (12)

by leoenc, 6 years ago

Attachment: dvbsub.jpg added

by leoenc, 6 years ago

Attachment: dvbsub.2.jpg added

by leoenc, 6 years ago

Attachment: input.mp4 added

by leoenc, 6 years ago

Attachment: output_dvb.ts added

by leoenc, 6 years ago

Attachment: output_overlay.ts added

by leoenc, 6 years ago

Attachment: overlay.jpg added

by leoenc, 6 years ago

Attachment: subtitles.sup added

comment:1 by leoenc, 6 years ago

Please ignore attachment dvbsub.2.jpg, its the same as dvbsub.jpg and was added by mistake. couldn't find how to delete attachments here.

comment:2 by Carl Eugen Hoyos, 6 years ago

Can you confirm that the issue is not reproducible with old (!) FFplay?

comment:3 by Carl Eugen Hoyos, 6 years ago

Analyzed by developer: set
Component: undeterminedavcodec
Keywords: dvbsub added
Reproduced by developer: set
Status: newopen
Version: unspecifiedgit-master

Afaict, the issue is that the dvbsub encoder does not write a Display definition segment, see also 1fc20af6af3ec31d0ee665557885b6c20c6d3686
Reproducible with the following command, I will delete most attachments:

$ ffmpeg -f lavfi -i color=s=hd1080 -fix_sub_duration -i subtitles.sup -scodec dvbsub -qscale 2 -mbd 2 -t 30 out.ts
ffmpeg version N-90583-g5710fda Copyright (c) 2000-2018 the FFmpeg developers
  built with gcc 6.3.0 (GCC)
  configuration: --enable-gpl
  libavutil      56. 12.100 / 56. 12.100
  libavcodec     58. 17.100 / 58. 17.100
  libavformat    58. 10.100 / 58. 10.100
  libavdevice    58.  2.100 / 58.  2.100
  libavfilter     7. 14.100 /  7. 14.100
  libswscale      5.  0.102 /  5.  0.102
  libswresample   3.  0.101 /  3.  0.101
  libpostproc    55.  0.100 / 55.  0.100
Input #0, lavfi, from 'color=s=hd1080':
  Duration: N/A, start: 0.000000, bitrate: N/A
    Stream #0:0: Video: rawvideo (I420 / 0x30323449), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], 25 tbr, 25 tbn, 25 tbc
Input #1, sup, from 'subtitles.sup':
  Duration: N/A, start: 3.440000, bitrate: N/A
    Stream #1:0: Subtitle: hdmv_pgs_subtitle, 1920x1080
Please use -q:a or -q:v, -qscale is ambiguous
Stream mapping:
  Stream #0:0 -> #0:0 (rawvideo (native) -> mpeg2video (native))
  Stream #1:0 -> #0:1 (hdmv_pgs_subtitle (pgssub) -> dvb_subtitle (dvbsub))
Press [q] to stop, [?] for help
[sup @ 0x21bf140] Invalid timestamps stream=0, pts=0, dts=303570, size=4974
Output #0, mpegts, to 'out.ts':
  Metadata:
    encoder         : Lavf58.10.100
    Stream #0:0: Video: mpeg2video (Main), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], q=2-31, 200 kb/s, 25 fps, 90k tbn, 25 tbc
    Metadata:
      encoder         : Lavc58.17.100 mpeg2video
    Side data:
      cpb: bitrate max/min/avg: 0/0/200000 buffer size: 0 vbv_delay: -1
    Stream #0:1: Subtitle: dvb_subtitle (dvbsub), 1920x1080
    Metadata:
      encoder         : Lavc58.17.100 dvbsub
[sup @ 0x21bf140] Invalid timestamps stream=0, pts=0, dts=767997, size=6238
[sup @ 0x21bf140] Invalid timestamps stream=0, pts=0, dts=1135096, size=9926
[sup @ 0x21bf140] Invalid timestamps stream=0, pts=0, dts=1635183, size=17502
[sup @ 0x21bf140] Invalid timestamps stream=0, pts=0, dts=2218393, size=18698
frame=  750 fps=213 q=2.0 Lsize=    2809kB time=00:00:29.92 bitrate= 769.0kbits/s speed= 8.5x
video:2470kB audio:0kB subtitle:65kB other streams:0kB global headers:0kB muxing overhead: 10.795754%

in reply to:  2 comment:4 by leoenc, 6 years ago

Replying to cehoyos:

Can you confirm that the issue is not reproducible with old (!) FFplay?

I can confirm. Tested with a build from 2013 and the output looks perfect.

ffplay_old.exe out.ts
ffplay version N-54161-gc329713 Copyright (c) 2003-2013 the FFmpeg developers
  built on Jun 23 2013 14:25:36 with gcc 4.7.3 (GCC)
  configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libcaca --enable-libfreetype --enable-libgsm --enable-libilbc --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libschroedinger --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libxavs --enable-libxvid --enable-zlib
  libavutil      52. 37.101 / 52. 37.101
  libavcodec     55. 16.100 / 55. 16.100
  libavformat    55.  9.100 / 55.  9.100
  libavdevice    55.  2.100 / 55.  2.100
  libavfilter     3. 77.101 /  3. 77.101
  libswscale      2.  3.100 /  2.  3.100
  libswresample   0. 17.102 /  0. 17.102
  libpostproc    52.  3.100 / 52.  3.100
max_analyze_duration 5000000 reached at 5000000 microsecondsf=0/0
Input #0, mpegts, from 'out.ts':
  Duration: 00:00:29.96, start: 1.440000, bitrate: 774 kb/s
  Program 1
    Metadata:
      service_name    : Service01
      service_provider: FFmpeg
    Stream #0:0[0x100]: Video: mpeg2video (Main) ([2][0][0][0] / 0x0002), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], 25 fps, 25 tbr, 90k tbn, 50 tbc
    Stream #0:1[0x101](und): Subtitle: dvb_subtitle ([6][0][0][0] / 0x0006)
  24.74 M-V: -0.028 fd=   0 aq=    0KB vq=  693KB sq=    0B f=0/0

BTW, better use some color for the background when testing, so the subtitle border is visible, e.g.:

ffmpeg -f lavfi -i color=green:s=hd1080 -fix_sub_duration -i subtitles.sup -scodec dvbsub -qscale 2 -mbd 2 -t 30 out.ts

comment:5 by Carl Eugen Hoyos, 5 years ago

Resolution: fixed
Status: openclosed

Fixed by Jernej Fijacko in f86f213a6d3dd749152a105df839172fe4c772d1

Note: See TracTickets for help on using tickets.