Opened 15 months ago

Last modified 13 months ago

#5474 new defect

pgssub with backward moving timestamps

Reported by: cehoyos Owned by:
Priority: important Component: ffmpeg
Version: git-master Keywords: pgssub regression
Cc: michael, reimar Blocked By:
Blocking: Reproduced by developer: no
Analyzed by developer: no

Description

The subtitles in the sample from ticket #4637 cannot be remuxed to mkv since 38e13f55

$ ffmpeg -i darkgraysubs.m2ts -scodec copy out.mkv
ffmpeg version N-79598-gdbe1dd5 Copyright (c) 2000-2016 the FFmpeg developers
  built with gcc 4.7 (SUSE Linux)
  configuration: --enable-gpl
  libavutil      55. 22.101 / 55. 22.101
  libavcodec     57. 38.100 / 57. 38.100
  libavformat    57. 34.103 / 57. 34.103
  libavdevice    57.  0.101 / 57.  0.101
  libavfilter     6. 44.100 /  6. 44.100
  libswscale      4.  1.100 /  4.  1.100
  libswresample   2.  0.101 /  2.  0.101
  libpostproc    54.  0.100 / 54.  0.100
Input #0, mpegts, from 'darkgraysubs.m2ts':
  Duration: 01:57:18.53, start: 600.000000, bitrate: 0 kb/s
  Program 1
    Stream #0:0[0x1011]: Video: h264 (High) ([27][0][0][0] / 0x001B), yuv420p, 1280x720, 23.98 fps, 23.98 tbr, 90k tbn
    Stream #0:1[0x1100](eng): Audio: ac3 (AC-3 / 0x332D4341), 48000 Hz, stereo, fltp, 96 kb/s
    Stream #0:2[0x1200](eng): Subtitle: hdmv_pgs_subtitle ([144][0][0][0] / 0x0090), 1280x720
[matroska @ 0x39fd440] Using AVStream.codec to pass codec parameters to muxers is deprecated, use AVStream.codecpar instead.
    Last message repeated 2 times
Output #0, matroska, to 'out.mkv':
  Metadata:
    encoder         : Lavf57.34.103
    Stream #0:0: Video: mpeg4 (FMP4 / 0x34504D46), yuv420p, 1280x720, q=2-31, 200 kb/s, 23.98 fps, 1k tbn
    Metadata:
      encoder         : Lavc57.38.100 mpeg4
    Side data:
      cpb: bitrate max/min/avg: 0/0/200000 buffer size: 0 vbv_delay: -1
    Stream #0:1(eng): Audio: ac3 ([0] [0][0] / 0x2000), 48000 Hz, stereo, fltp, 192 kb/s
    Metadata:
      encoder         : Lavc57.38.100 ac3
    Stream #0:2(eng): Subtitle: hdmv_pgs_subtitle ([255][255][255][255] / 0xFFFFFFFF), 1280x720
Stream mapping:
  Stream #0:0 -> #0:0 (h264 (native) -> mpeg4 (native))
  Stream #0:1 -> #0:1 (ac3 (native) -> ac3 (native))
  Stream #0:2 -> #0:2 (copy)
Press [q] to stop, [?] for help
[matroska @ 0x39fd440] Application provided invalid, non monotonically increasing dts to muxer in stream 2: 2002 >= 1973
av_interleaved_write_frame(): Invalid argument
frame=   40 fps=0.0 q=2.0 Lsize=     106kB time=00:00:02.04 bitrate= 426.7kbits/s speed=29.3x
video:56kB audio:48kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 1.484462%
Conversion failed!

Change History (4)

comment:1 Changed 14 months ago by michael

Are you sure that the shifted timestamps from prior the regression where correct ?
iam not sure this is a regression and not out of order subtitles

comment:2 Changed 14 months ago by michael

  • Cc michael added

comment:3 Changed 14 months ago by cehoyos

If I play darkgraysubs.m2ts with current FFplay, the subtitles appear after two seconds for approximately seven seconds. If I run above command line with FFmpeg 2.0, I can play the output mkv file with current FFplay, and again the subtitles appear after two seconds for around seven seconds, same with vlc and MPlayer.

comment:4 Changed 13 months ago by michael

  • Cc reimar added
  • Summary changed from pgssub remuxing regression to pgssub with backward moving timestamps

The timestamps go backward, the error about dts is as such correct
Packet dts:180180 pts:180180
pts 2002000
Packet dts:180151 pts:180151
pts 2001678
Packet dts:177559 pts:177559
pts 1972878
Packet dts:177617 pts:177617
pts 1973522
Packet dts:177617 pts:177617
pts 2002000

diff --git a/libavcodec/pgssubdec.c b/libavcodec/pgssubdec.c
index 133d08b..9c52e46 100644
--- a/libavcodec/pgssubdec.c
+++ b/libavcodec/pgssubdec.c
@@ -637,7 +637,7 @@ static int decode(AVCodecContext *avctx, void *data, int *data_size,
         return -1;
 
     buf_end = buf + buf_size;
-
+av_log(0,0, "Packet dts:%Ld pts:%Ld\n", avpkt->dts, avpkt->pts);
     /* Step through buffer to identify segments */
     while (buf < buf_end) {
         segment_type   = bytestream_get_byte(&buf);
@@ -685,7 +685,7 @@ static int decode(AVCodecContext *avctx, void *data, int *data_size,
 
         buf += segment_length;
     }
-
+av_log(0,0, "pts %Ld\n", ((AVSubtitle*)(data))->pts);
     return buf_size;
 }
 
 

Maybe the maintainer (in CC) can take a look or comment

Note: See TracTickets for help on using tickets.