[FFmpeg-cvslog] oggdec: Make sure start time correction is applied once to each stream

Michael Niedermayer git at videolan.org
Wed Aug 24 23:35:37 CEST 2011


ffmpeg | branch: master | Michael Niedermayer <michaelni at gmx.at> | Wed Aug 24 23:13:57 2011 +0200| [d2cab951e32d7688d41f475cd55475772c70dd39] | committer: Michael Niedermayer

oggdec: Make sure start time correction is applied once to each stream

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

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

 libavformat/oggdec.c |   20 ++++++++++++++++----
 libavformat/oggdec.h |    1 +
 2 files changed, 17 insertions(+), 4 deletions(-)

diff --git a/libavformat/oggdec.c b/libavformat/oggdec.c
index cd55922..3d7c87f 100644
--- a/libavformat/oggdec.c
+++ b/libavformat/oggdec.c
@@ -452,6 +452,7 @@ static int ogg_get_length(AVFormatContext *s)
     struct ogg *ogg = s->priv_data;
     int i;
     int64_t size, end;
+    int streams_left=0;
 
     if(!s->pb->seekable)
         return 0;
@@ -473,8 +474,14 @@ static int ogg_get_length(AVFormatContext *s)
             ogg->streams[i].codec) {
             s->streams[i]->duration =
                 ogg_gptopts (s, i, ogg->streams[i].granule, NULL);
-            if (s->streams[i]->start_time != AV_NOPTS_VALUE)
+            if (s->streams[i]->start_time != AV_NOPTS_VALUE){
                 s->streams[i]->duration -= s->streams[i]->start_time;
+                streams_left-= (ogg->streams[i].got_start==-1);
+                ogg->streams[i].got_start= 1;
+            }else if(!ogg->streams[i].got_start){
+                ogg->streams[i].got_start= -1;
+                streams_left++;
+            }
         }
     }
 
@@ -485,9 +492,14 @@ static int ogg_get_length(AVFormatContext *s)
     while (!ogg_read_page (s, &i)){
         if (ogg->streams[i].granule != -1 && ogg->streams[i].granule != 0 &&
             ogg->streams[i].codec) {
-            s->streams[i]->duration -=
-                ogg_gptopts (s, i, ogg->streams[i].granule, NULL);
-            break;
+            if(s->streams[i]->duration && s->streams[i]->start_time == AV_NOPTS_VALUE && !ogg->streams[i].got_start){
+                s->streams[i]->duration -=
+                    ogg_gptopts (s, i, ogg->streams[i].granule, NULL);
+                ogg->streams[i].got_start= 1;
+                streams_left--;
+            }
+            if(streams_left<=0)
+                break;
         }
     }
     ogg_restore (s, 0);
diff --git a/libavformat/oggdec.h b/libavformat/oggdec.h
index 184a628..7f5452f 100644
--- a/libavformat/oggdec.h
+++ b/libavformat/oggdec.h
@@ -75,6 +75,7 @@ struct ogg_stream {
     int incomplete; ///< whether we're expecting a continuation in the next page
     int page_end;   ///< current packet is the last one completed in the page
     int keyframe_seek;
+    int got_start;
     void *private;
 };
 



More information about the ffmpeg-cvslog mailing list