Opened 9 years ago

Last modified 8 years ago

#4855 new enhancement

Support subtitles in (most likely) broken old vdr recordings

Reported by: Carl Eugen Hoyos Owned by:
Priority: wish Component: avformat
Version: git-master Keywords: mpegps dvbsub dvdsub
Cc: Blocked By:
Blocking: Reproduced by developer: no
Analyzed by developer: no

Description (last modified by Carl Eugen Hoyos)

https://ffmpeg.org/pipermail/ffmpeg-user/2015-September/028406.html
A user uploaded a vdr recording that contains a digital television stream within a mpeg program stream. The recording is supposed to contain subtitles, possibly dvbsub, FFmpeg detects dvdsub but does not decode anything, just like vlc and MPlayer.

$ ffmpeg -i 002.vdr -filter_complex [0:0][0:3]overlay -qscale 2 -t 60 out.avi
ffmpeg version N-75300-g4a38078 Copyright (c) 2000-2015 the FFmpeg developers
  built with gcc 4.7 (SUSE Linux)
  configuration: --enable-gpl
  libavutil      55.  2.100 / 55.  2.100
  libavcodec     57.  2.100 / 57.  2.100
  libavformat    57.  2.100 / 57.  2.100
  libavdevice    57.  0.100 / 57.  0.100
  libavfilter     6.  4.100 /  6.  4.100
  libswscale      4.  0.100 /  4.  0.100
  libswresample   2.  0.100 /  2.  0.100
  libpostproc    54.  0.100 / 54.  0.100
[mpeg @ 0x2d034e0] Format mpeg detected only with low score of 25, misdetection possible!
[NULL @ 0x2d899e0] start time for stream 3 is not set in estimate_timings_from_pts
Input #0, mpeg, from '002.vdr':
  Duration: 00:01:03.96, start: 47298.333311, bitrate: 2244 kb/s
    Stream #0:0[0x1e0]: Video: mpeg2video (Main), yuv420p(tv), 704x576 [SAR 12:11 DAR 4:3], max. 15000 kb/s, 25 fps, 25 tbr, 90k tbn, 50 tbc
    Stream #0:1[0x1c0]: Audio: mp2, 48000 Hz, stereo, s16p, 192 kb/s
    Stream #0:2[0x1c1]: Audio: mp2, 48000 Hz, mono, s16p, 64 kb/s
    Stream #0:3[0x20]: Subtitle: dvd_subtitle
Please use -q:a or -q:v, -qscale is ambiguous
[mpeg @ 0x2d034e0] sub2video: using 704x576 canvas
Output #0, avi, to 'out.avi':
  Metadata:
    ISFT            : Lavf57.2.100
    Stream #0:0: Video: mpeg4 (FMP4 / 0x34504D46), yuv420p, 704x576 [SAR 12:11 DAR 4:3], q=2-31, 200 kb/s, 25 fps, 25 tbn, 25 tbc (default)
    Metadata:
      encoder         : Lavc57.2.100 mpeg4
    Stream #0:1: Audio: ac3 ([0] [0][0] / 0x2000), 48000 Hz, stereo, fltp, 192 kb/s
    Metadata:
      encoder         : Lavc57.2.100 ac3
Stream mapping:
  Stream #0:0 (mpeg2video) -> overlay:main (graph 0)
  Stream #0:3 (dvdsub) -> overlay:overlay (graph 0)
  overlay (graph 0) -> Stream #0:0 (mpeg4)
  Stream #0:1 -> #0:1 (mp2 (native) -> ac3 (native))
Press [q] to stop, [?] for help
[mpeg2video @ 0x2d055e0] 00 motion_type at 36 29
[mpeg2video @ 0x2d055e0] Warning MVs not available
[mpeg2video @ 0x2d055e0] concealing 88 DC, 88 AC, 88 MV errors in P frame
[mpeg2video @ 0x2d055e0] ac-tex damaged at 13 180:00:07.16 bitrate=2335.5kbits/s
[mpeg2video @ 0x2d055e0] Warning MVs not available
[mpeg2video @ 0x2d055e0] concealing 44 DC, 44 AC, 44 MV errors in I frame
[mpeg2video @ 0x2d055e0] ac-tex damaged at 11 900:00:13.96 bitrate=2466.3kbits/s
[mpeg2video @ 0x2d055e0] Warning MVs not available
[mpeg2video @ 0x2d055e0] concealing 44 DC, 44 AC, 44 MV errors in I frame
[mpeg2video @ 0x2d055e0] ac-tex damaged at 2 2300:00:20.68 bitrate=2433.5kbits/s
[mpeg2video @ 0x2d055e0] Warning MVs not available
[mpeg2video @ 0x2d055e0] concealing 44 DC, 44 AC, 44 MV errors in P frame
[mpeg2video @ 0x2d055e0] mb incr damagedB time=00:00:54.16 bitrate=2345.7kbits/s
[mpeg2video @ 0x2d055e0] 00 motion_type at 13 35
[mpeg2video @ 0x2d055e0] Warning MVs not available
[mpeg2video @ 0x2d055e0] concealing 88 DC, 88 AC, 88 MV errors in P frame
frame= 1477 fps=321 q=2.0 Lsize=   17600kB time=00:01:00.00 bitrate=2403.0kbits/s
video:16107kB audio:1404kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.511689%

No subtitles are visible in the output stream, ProjectX is able to export some data.

Change History (2)

comment:1 by keynet, 8 years ago

I got to the bottom of this

Old VDR (1.x) adds a 4 byte "subheader" 0x20, 0x01, 0x00, 0x00 ahead of the subtitle data to indicate beginning of subtitle page. Subsequent fragments have 0x20, 0x01, 0x00, 0x01 headers. It is necessary to decode the packets containing fragments of segments, which may be spread over multiple packets (VDR limits packet size to 2048 bytes by default), so a number of packets may be needed to get a complete PES packet with a complete set of segments describing a single subtitle. VDR puts the PTS for the subtitle in the first packet only.

Once the various fragments are assembled into a set of segments, the subtitles conform to standard EN 300 743 dvbsub segments, and ffmpeg can recognise them.

However ffmpeg often probes them as "bin_data" not "dvbsub" due to broadcasters regularly sending what I call "cleardown" PES packets containing just page and region composition segments, these look like this in dvbsnoop. IMHO dvbsub.c is a bit too simplistic in its stream scoring, and should really recognise these as valid, or at least probe further for "real" subtitle data. Using -analyzeduration and -probesize switches don't usually help much, if at all, in this respect.

VDR hdr:v--v--v--v  ETSI subs >>>>>>
0000:  20 01 00 00 20 00 0f 10  00 02 00 02 3c 84 0f 11    ... .......<...
0010:  00 02 00 0a 01 f0 02 d0  00 20 48 01 00 00 0f 11   ......... H.....
0020:  00 02 00 0a 02 50 02 d0  00 20 48 02 00 00 0f 11   .....P... H.....
0030:  00 02 00 0a 03 40 02 d0  00 20 48 03 00 00 0f 11   .....@... H.....
0040:  00 02 00 0a 04 80 02 d0  00 20 48 04 00 00 0f 80   ......... H.....
0050:  00 02 00 00 ff                                     .....

VDR contains a subtitle assembler in dvbsubtitle.c that shows how reassembly can be done, though my reading of ffmpeg code is that it only wants complete PES packets, so some pre-assembly of fragments may be required

Last edited 8 years ago by keynet (previous) (diff)

comment:2 by Carl Eugen Hoyos, 8 years ago

Description: modified (diff)
Note: See TracTickets for help on using tickets.