[FFmpeg-cvslog] mpegts: add and use mpegts_get_dts()

Michael Niedermayer git at videolan.org
Fri Oct 21 18:08:54 CEST 2011


ffmpeg | branch: master | Michael Niedermayer <michaelni at gmx.at> | Fri Oct 21 16:11:00 2011 +0200| [de9862a95e0e0a81a3e787e449faa32247feef71] | committer: Michael Niedermayer

mpegts: add and use mpegts_get_dts()

Signed-off-by: Michael Niedermayer <michaelni at gmx.at>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=de9862a95e0e0a81a3e787e449faa32247feef71
---

 libavformat/mpegts.c   |   34 +++++++++++++++++++++++++++++++---
 tests/ref/seek/lavf_ts |   34 +++++++++++++++++-----------------
 2 files changed, 48 insertions(+), 20 deletions(-)

diff --git a/libavformat/mpegts.c b/libavformat/mpegts.c
index 8c74ccb..8399e8b 100644
--- a/libavformat/mpegts.c
+++ b/libavformat/mpegts.c
@@ -1760,6 +1760,33 @@ static int64_t mpegts_get_pcr(AVFormatContext *s, int stream_index,
     return AV_NOPTS_VALUE;
 }
 
+static int64_t mpegts_get_dts(AVFormatContext *s, int stream_index,
+                              int64_t *ppos, int64_t pos_limit)
+{
+    MpegTSContext *ts = s->priv_data;
+    int64_t pos, timestamp;
+    pos = ((*ppos  + ts->raw_packet_size - 1 - ts->pos47) / ts->raw_packet_size) * ts->raw_packet_size + ts->pos47;
+    ff_read_frame_flush(s);
+    if (avio_seek(s->pb, pos, SEEK_SET) < 0)
+        return AV_NOPTS_VALUE;
+    while(pos < pos_limit) {
+        int ret;
+        AVPacket pkt;
+        av_init_packet(&pkt);
+        ret= av_read_frame(s, &pkt);
+        if(ret < 0)
+            return AV_NOPTS_VALUE;
+        av_free_packet(&pkt);
+        if(pkt.stream_index == stream_index && pkt.dts != AV_NOPTS_VALUE){
+            *ppos= pkt.pos;
+            return pkt.dts;
+        }
+        pos = pkt.pos;
+    }
+
+    return AV_NOPTS_VALUE;
+}
+
 #ifdef USE_SYNCPOINT_SEARCH
 
 static int read_seek2(AVFormatContext *s,
@@ -1853,7 +1880,8 @@ static int read_seek(AVFormatContext *s, int stream_index, int64_t target_ts, in
 
     if(av_seek_frame_binary(s, stream_index, target_ts, flags) < 0)
         return -1;
-
+    ff_read_frame_flush(s);
+    return 0;
     pos= avio_tell(s->pb);
 
     for(;;) {
@@ -1936,7 +1964,7 @@ AVInputFormat ff_mpegts_demuxer = {
     .read_packet    = mpegts_read_packet,
     .read_close     = mpegts_read_close,
     .read_seek      = read_seek,
-    .read_timestamp = mpegts_get_pcr,
+    .read_timestamp = mpegts_get_dts,
     .flags = AVFMT_SHOW_IDS|AVFMT_TS_DISCONT,
 #ifdef USE_SYNCPOINT_SEARCH
     .read_seek2 = read_seek2,
@@ -1951,7 +1979,7 @@ AVInputFormat ff_mpegtsraw_demuxer = {
     .read_packet    = mpegts_raw_read_packet,
     .read_close     = mpegts_read_close,
     .read_seek      = read_seek,
-    .read_timestamp = mpegts_get_pcr,
+    .read_timestamp = mpegts_get_dts,
     .flags = AVFMT_SHOW_IDS|AVFMT_TS_DISCONT,
 #ifdef USE_SYNCPOINT_SEARCH
     .read_seek2 = read_seek2,
diff --git a/tests/ref/seek/lavf_ts b/tests/ref/seek/lavf_ts
index 9ed59ef..8e2e4d1 100644
--- a/tests/ref/seek/lavf_ts
+++ b/tests/ref/seek/lavf_ts
@@ -1,53 +1,53 @@
 ret: 0         st: 0 flags:1 dts: 1.360000 pts: 1.400000 pos:    564 size: 24801
 ret: 0         st:-1 flags:0  ts:-1.000000
-ret: 0         st: 0 flags:0 dts: 1.440000 pts: 1.480000 pos:  44932 size: 14502
+ret: 0         st: 0 flags:0 dts: 1.400000 pts: 1.440000 pos:  27072 size: 16433
 ret: 0         st:-1 flags:1  ts: 1.894167
-ret: 0         st: 1 flags:1 dts: 2.131433 pts: 2.131433 pos: 403636 size:   209
+ret: 0         st: 0 flags:0 dts: 1.880000 pts: 1.920000 pos: 216012 size: 17441
 ret: 0         st: 0 flags:0  ts: 0.788333
-ret: 0         st: 0 flags:0 dts: 1.520000 pts: 1.560000 pos:  74260 size: 13388
+ret: 0         st: 0 flags:0 dts: 1.400000 pts: 1.440000 pos:  27072 size: 16433
 ret: 0         st: 0 flags:1  ts:-0.317500
 ret: 0         st: 0 flags:1 dts: 1.360000 pts: 1.400000 pos:    564 size: 24801
 ret: 0         st: 1 flags:0  ts: 2.576667
 ret: 0         st: 1 flags:1 dts: 2.131433 pts: 2.131433 pos: 403636 size:   209
 ret: 0         st: 1 flags:1  ts: 1.470833
-ret: 0         st: 0 flags:0 dts: 2.160000 pts: 2.200000 pos: 325240 size: 12679
+ret: 0         st: 1 flags:1 dts: 1.400000 pts: 1.400000 pos: 172584 size:   208
 ret: 0         st:-1 flags:0  ts: 0.365002
-ret: 0         st: 0 flags:0 dts: 1.440000 pts: 1.480000 pos:  44932 size: 14502
+ret: 0         st: 0 flags:0 dts: 1.400000 pts: 1.440000 pos:  27072 size: 16433
 ret: 0         st:-1 flags:1  ts:-0.740831
 ret: 0         st: 0 flags:1 dts: 1.360000 pts: 1.400000 pos:    564 size: 24801
 ret: 0         st: 0 flags:0  ts: 2.153333
-ret: 0         st: 1 flags:1 dts: 2.131433 pts: 2.131433 pos: 403636 size:   209
+ret: 0         st: 0 flags:0 dts: 2.160000 pts: 2.200000 pos: 325240 size: 12679
 ret: 0         st: 0 flags:1  ts: 1.047500
-ret: 0         st: 0 flags:0 dts: 1.680000 pts: 1.720000 pos: 130096 size: 14133
+ret: 0         st: 0 flags:1 dts: 1.360000 pts: 1.400000 pos:    564 size: 24801
 ret: 0         st: 1 flags:0  ts:-0.058333
-ret: 0         st: 0 flags:0 dts: 1.440000 pts: 1.480000 pos:  44932 size: 14502
+ret: 0         st: 1 flags:1 dts: 1.765711 pts: 1.765711 pos: 322232 size:   209
 ret: 0         st: 1 flags:1  ts: 2.835833
 ret: 0         st: 1 flags:1 dts: 2.131433 pts: 2.131433 pos: 403636 size:   209
 ret: 0         st:-1 flags:0  ts: 1.730004
-ret: 0         st: 1 flags:1 dts: 2.131433 pts: 2.131433 pos: 403636 size:   209
+ret: 0         st: 1 flags:1 dts: 1.400000 pts: 1.400000 pos: 172584 size:   208
 ret: 0         st:-1 flags:1  ts: 0.624171
 ret: 0         st: 0 flags:1 dts: 1.360000 pts: 1.400000 pos:    564 size: 24801
 ret: 0         st: 0 flags:0  ts:-0.481667
-ret: 0         st: 0 flags:0 dts: 1.440000 pts: 1.480000 pos:  44932 size: 14502
+ret: 0         st: 0 flags:0 dts: 1.400000 pts: 1.440000 pos:  27072 size: 16433
 ret: 0         st: 0 flags:1  ts: 2.412500
 ret: 0         st: 1 flags:1 dts: 2.131433 pts: 2.131433 pos: 403636 size:   209
 ret: 0         st: 1 flags:0  ts: 1.306667
-ret: 0         st: 0 flags:0 dts: 2.080000 pts: 2.120000 pos: 294032 size: 13839
+ret: 0         st: 1 flags:1 dts: 1.765711 pts: 1.765711 pos: 322232 size:   209
 ret: 0         st: 1 flags:1  ts: 0.200844
-ret: 0         st: 0 flags:1 dts: 1.360000 pts: 1.400000 pos:    564 size: 24801
+ret: 0         st: 1 flags:1 dts: 1.400000 pts: 1.400000 pos: 172584 size:   208
 ret: 0         st:-1 flags:0  ts:-0.904994
-ret: 0         st: 0 flags:0 dts: 1.440000 pts: 1.480000 pos:  44932 size: 14502
+ret: 0         st: 0 flags:0 dts: 1.400000 pts: 1.440000 pos:  27072 size: 16433
 ret: 0         st:-1 flags:1  ts: 1.989173
-ret: 0         st: 1 flags:1 dts: 2.131433 pts: 2.131433 pos: 403636 size:   209
+ret: 0         st: 0 flags:0 dts: 1.960000 pts: 2.000000 pos: 250980 size: 13438
 ret: 0         st: 0 flags:0  ts: 0.883344
-ret: 0         st: 0 flags:0 dts: 1.600000 pts: 1.640000 pos: 102836 size: 12781
+ret: 0         st: 0 flags:0 dts: 1.400000 pts: 1.440000 pos:  27072 size: 16433
 ret: 0         st: 0 flags:1  ts:-0.222489
 ret: 0         st: 0 flags:1 dts: 1.360000 pts: 1.400000 pos:    564 size: 24801
 ret: 0         st: 1 flags:0  ts: 2.671678
 ret: 0         st: 1 flags:1 dts: 2.131433 pts: 2.131433 pos: 403636 size:   209
 ret: 0         st: 1 flags:1  ts: 1.565844
-ret: 0         st: 0 flags:0 dts: 2.240000 pts: 2.280000 pos: 350996 size: 11307
+ret: 0         st: 1 flags:1 dts: 1.400000 pts: 1.400000 pos: 172584 size:   208
 ret: 0         st:-1 flags:0  ts: 0.460008
-ret: 0         st: 0 flags:0 dts: 1.440000 pts: 1.480000 pos:  44932 size: 14502
+ret: 0         st: 0 flags:0 dts: 1.400000 pts: 1.440000 pos:  27072 size: 16433
 ret: 0         st:-1 flags:1  ts:-0.645825
 ret: 0         st: 0 flags:1 dts: 1.360000 pts: 1.400000 pos:    564 size: 24801



More information about the ffmpeg-cvslog mailing list