Fix timestamps and durations if the first packets have no durations nor timestamps,
authorMichael Niedermayer <michaelni@gmx.at>
Fri, 15 Feb 2008 20:32:32 +0000 (20:32 +0000)
committerMichael Niedermayer <michaelni@gmx.at>
Fri, 15 Feb 2008 20:32:32 +0000 (20:32 +0000)
and the information needed to guess the duration only becomes known at a later packet.

Originally committed as revision 11963 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavformat/utils.c
tests/seek.regression.ref

index 04a33a0405938b0e6aac9797ff14d78473d72390..79d502cd9e1d6a7d85b96d57795bc50590ac25ae 100644 (file)
@@ -632,6 +632,24 @@ static void update_initial_timestamps(AVFormatContext *s, int stream_index,
         st->start_time = pts;
 }
 
+static void update_initial_durations(AVFormatContext *s, AVStream *st, AVPacket *pkt)
+{
+    AVPacketList *pktl= s->packet_buffer;
+
+    assert(pkt->duration && !st->cur_dts);
+
+    for(; pktl; pktl= pktl->next){
+        if(pktl->pkt.stream_index != pkt->stream_index)
+            continue;
+        if(pktl->pkt.pts == pktl->pkt.dts && pktl->pkt.dts == AV_NOPTS_VALUE){
+            pktl->pkt.pts= pktl->pkt.dts= st->cur_dts;
+            st->cur_dts += pkt->duration;
+            pktl->pkt.duration= pkt->duration;
+        }else
+            break;
+    }
+}
+
 static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
                                AVCodecParserContext *pc, AVPacket *pkt)
 {
@@ -647,6 +665,9 @@ static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
         compute_frame_duration(&num, &den, st, pc, pkt);
         if (den && num) {
             pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den, den * (int64_t)st->time_base.num);
+
+            if(pkt->dts == AV_NOPTS_VALUE && pkt->pts == AV_NOPTS_VALUE && st->cur_dts == 0)
+                update_initial_durations(s, st, pkt);
         }
     }
 
index cb2679b8ef1a95d68b06a22025dac050e36539d1..9e39ef2580fb85af26e611ddf63ab0e9e86948be 100644 (file)
@@ -1075,57 +1075,57 @@ ret: 0 st: 0 dts:0.480000 pts:0.480000 pos:165884 size:12719 flags:1
 ret:-1 st:-1 ts:-0.645825 flags:1
 ----------------
 tests/data/a-mp2.mp2
-ret: 0 st: 0 dts:-102481911520608.625000 pts:-102481911520608.625000 pos:0 size:417 flags:1
+ret: 0 st: 0 dts:0.000000 pts:0.000000 pos:0 size:417 flags:1
 ret: 0 st:-1 ts:-1.000000 flags:0
-ret: 0 st: 0 dts:0.000000 pts:0.000000 pos:417 size:418 flags:1
+ret: 0 st: 0 dts:0.026122 pts:0.026122 pos:417 size:418 flags:1
 ret: 0 st:-1 ts:1.894167 flags:1
-ret: 0 st: 0 dts:1.880800 pts:1.880800 pos:30511 size:417 flags:1
+ret: 0 st: 0 dts:1.880800 pts:1.880800 pos:30093 size:418 flags:1
 ret: 0 st: 0 ts:0.788333 flags:0
-ret: 0 st: 0 dts:0.809789 pts:0.809789 pos:13374 size:418 flags:1
+ret: 0 st: 0 dts:0.809789 pts:0.809789 pos:12956 size:418 flags:1
 ret: 0 st: 0 ts:-0.317500 flags:1
 ret: 0 st: 0 dts:0.000000 pts:0.000000 pos:0 size:417 flags:1
 ret: 0 st:-1 ts:2.576668 flags:0
-ret: 0 st: 0 dts:2.586100 pts:2.586100 pos:41795 size:418 flags:1
+ret: 0 st: 0 dts:2.586100 pts:2.586100 pos:41377 size:418 flags:1
 ret: 0 st:-1 ts:1.470835 flags:1
-ret: 0 st: 0 dts:1.462844 pts:1.462844 pos:23823 size:418 flags:1
+ret: 0 st: 0 dts:1.462844 pts:1.462844 pos:23405 size:418 flags:1
 ret: 0 st: 0 ts:0.365000 flags:0
-ret: 0 st: 0 dts:0.365711 pts:0.365711 pos:6269 size:418 flags:1
+ret: 0 st: 0 dts:0.365711 pts:0.365711 pos:5851 size:418 flags:1
 ret: 0 st: 0 ts:-0.740833 flags:1
 ret: 0 st: 0 dts:0.000000 pts:0.000000 pos:0 size:417 flags:1
 ret: 0 st:-1 ts:2.153336 flags:0
-ret: 0 st: 0 dts:2.168144 pts:2.168144 pos:35108 size:418 flags:1
+ret: 0 st: 0 dts:2.168144 pts:2.168144 pos:34690 size:418 flags:1
 ret: 0 st:-1 ts:1.047503 flags:1
-ret: 0 st: 0 dts:1.044889 pts:1.044889 pos:17136 size:418 flags:1
+ret: 0 st: 0 dts:1.044889 pts:1.044889 pos:16718 size:418 flags:1
 ret: 0 st: 0 ts:-0.058333 flags:0
 ret: 0 st: 0 dts:0.000000 pts:0.000000 pos:0 size:417 flags:1
 ret: 0 st: 0 ts:2.835833 flags:1
-ret: 0 st: 0 dts:2.821200 pts:2.821200 pos:45557 size:418 flags:1
+ret: 0 st: 0 dts:2.821200 pts:2.821200 pos:45139 size:418 flags:1
 ret: 0 st:-1 ts:1.730004 flags:0
-ret: 0 st: 0 dts:1.750189 pts:1.750189 pos:28421 size:418 flags:1
+ret: 0 st: 0 dts:1.750189 pts:1.750189 pos:28003 size:418 flags:1
 ret: 0 st:-1 ts:0.624171 flags:1
-ret: 0 st: 0 dts:0.600811 pts:0.600811 pos:10031 size:417 flags:1
+ret: 0 st: 0 dts:0.600811 pts:0.600811 pos:9613 size:418 flags:1
 ret: 0 st: 0 ts:-0.481667 flags:0
 ret: 0 st: 0 dts:0.000000 pts:0.000000 pos:0 size:417 flags:1
 ret: 0 st: 0 ts:2.412500 flags:1
-ret: 0 st: 0 dts:2.403244 pts:2.403244 pos:38870 size:418 flags:1
+ret: 0 st: 0 dts:2.403244 pts:2.403244 pos:38452 size:418 flags:1
 ret: 0 st:-1 ts:1.306672 flags:0
-ret: 0 st: 0 dts:1.332233 pts:1.332233 pos:21733 size:418 flags:1
+ret: 0 st: 0 dts:1.332233 pts:1.332233 pos:21315 size:418 flags:1
 ret: 0 st:-1 ts:0.200839 flags:1
-ret: 0 st: 0 dts:0.182856 pts:0.182856 pos:3343 size:418 flags:1
+ret: 0 st: 0 dts:0.182856 pts:0.182856 pos:2925 size:418 flags:1
 ret: 0 st: 0 ts:-0.904989 flags:0
 ret: 0 st: 0 dts:0.000000 pts:0.000000 pos:0 size:417 flags:1
 ret: 0 st: 0 ts:1.989178 flags:1
-ret: 0 st: 0 dts:1.985289 pts:1.985289 pos:32182 size:418 flags:1
+ret: 0 st: 0 dts:1.985289 pts:1.985289 pos:31764 size:418 flags:1
 ret: 0 st:-1 ts:0.883340 flags:0
-ret: 0 st: 0 dts:0.888156 pts:0.888156 pos:14628 size:418 flags:1
+ret: 0 st: 0 dts:0.888156 pts:0.888156 pos:14210 size:418 flags:1
 ret: 0 st:-1 ts:-0.222493 flags:1
 ret: 0 st: 0 dts:0.000000 pts:0.000000 pos:0 size:417 flags:1
 ret: 0 st: 0 ts:2.671678 flags:0
-ret: 0 st: 0 dts:2.690589 pts:2.690589 pos:43467 size:418 flags:1
+ret: 0 st: 0 dts:2.690589 pts:2.690589 pos:43049 size:418 flags:1
 ret: 0 st: 0 ts:1.565844 flags:1
-ret: 0 st: 0 dts:1.541211 pts:1.541211 pos:25077 size:418 flags:1
+ret: 0 st: 0 dts:1.541211 pts:1.541211 pos:24659 size:418 flags:1
 ret: 0 st:-1 ts:0.460008 flags:0
-ret: 0 st: 0 dts:0.470200 pts:0.470200 pos:7941 size:418 flags:1
+ret: 0 st: 0 dts:0.470200 pts:0.470200 pos:7523 size:418 flags:1
 ret: 0 st:-1 ts:-0.645825 flags:1
 ret: 0 st: 0 dts:0.000000 pts:0.000000 pos:0 size:417 flags:1
 ----------------