[SCM] libav/experimental: simplify, completely ignore streams not recognized, that fixes seeking for some files

siretart at users.alioth.debian.org siretart at users.alioth.debian.org
Sun Jun 30 15:48:02 UTC 2013


The following commit has been merged in the experimental branch:
commit a2fe3b58697901c216f394caf47be574f5cc42e3
Author: Baptiste Coudurier <baptiste.coudurier at gmail.com>
Date:   Mon Jun 12 13:09:19 2006 +0000

    simplify, completely ignore streams not recognized, that fixes seeking for some files
    
    Originally committed as revision 5468 to svn://svn.ffmpeg.org/ffmpeg/trunk

diff --git a/libavformat/mov.c b/libavformat/mov.c
index b2ee069..ac21d5a 100644
--- a/libavformat/mov.c
+++ b/libavformat/mov.c
@@ -287,7 +287,6 @@ struct MOVParseTableEntry;
 
 typedef struct MOVStreamContext {
     int ffindex; /* the ffmpeg stream id */
-    int is_ff_stream; /* Is this stream presented to ffmpeg ? i.e. is this an audio or video stream ? */
     long next_chunk;
     long chunk_count;
     int64_t *chunk_offsets;
@@ -1664,7 +1663,7 @@ static int mov_read_header(AVFormatContext *s, AVFormatParameters *ap)
 {
     MOVContext *mov = (MOVContext *) s->priv_data;
     ByteIOContext *pb = &s->pb;
-    int i, j, nb, err;
+    int i, j, err;
     MOV_atom_t atom = { 0, 0, 0 };
 
     mov->fc = s;
@@ -1689,36 +1688,35 @@ static int mov_read_header(AVFormatContext *s, AVFormatParameters *ap)
         url_fseek(pb, mov->mdat_offset, SEEK_SET);
 
     mov->next_chunk_offset = mov->mdat_offset; /* initialise reading */
-    mov->total_streams = nb = s->nb_streams;
 
-#if 1
     for(i=0; i<s->nb_streams;) {
+        MOVStreamContext *sc = (MOVStreamContext *)s->streams[i]->priv_data;
+
         if(s->streams[i]->codec->codec_type == CODEC_TYPE_MOV_OTHER) {/* not audio, not video, delete */
             av_free(s->streams[i]);
-            for(j=i+1; j<s->nb_streams; j++)
+            mov_free_stream_context(sc);
+            for(j=i+1; j<s->nb_streams; j++) {
                 s->streams[j-1] = s->streams[j];
+                mov->streams[j-1] = mov->streams[j];
+            }
             s->nb_streams--;
-        } else
+        } else {
+            if(!sc->time_rate)
+                sc->time_rate=1;
+            if(!sc->time_scale)
+                sc->time_scale= mov->time_scale;
+            av_set_pts_info(s->streams[i], 64, sc->time_rate, sc->time_scale);
+
+            if(s->streams[i]->duration != AV_NOPTS_VALUE){
+                assert(s->streams[i]->duration % sc->time_rate == 0);
+                s->streams[i]->duration /= sc->time_rate;
+            }
+            sc->ffindex = i;
             i++;
-    }
-    for(i=0; i<s->nb_streams;i++) {
-        MOVStreamContext *sc = (MOVStreamContext *)s->streams[i]->priv_data;
-
-        if(!sc->time_rate)
-            sc->time_rate=1;
-        if(!sc->time_scale)
-            sc->time_scale= mov->time_scale;
-        av_set_pts_info(s->streams[i], 64, sc->time_rate, sc->time_scale);
-
-        if(s->streams[i]->duration != AV_NOPTS_VALUE){
-            assert(s->streams[i]->duration % sc->time_rate == 0);
-            s->streams[i]->duration /= sc->time_rate;
         }
-
-        sc->ffindex = i;
-        sc->is_ff_stream = 1;
     }
-#endif
+    mov->total_streams = s->nb_streams;
+
     return 0;
 }
 
@@ -1807,7 +1805,7 @@ again:
         mov->next_chunk_offset = offset;
     }
 
-    if(!sc->is_ff_stream || (s->streams[sc->ffindex]->discard >= AVDISCARD_ALL)) {
+    if(s->streams[sc->ffindex]->discard >= AVDISCARD_ALL) {
         url_fskip(&s->pb, (offset - mov->next_chunk_offset));
         mov->next_chunk_offset = offset;
         offset = INT64_MAX;

-- 
Libav/FFmpeg packaging



More information about the pkg-multimedia-commits mailing list