skip run in sequence, fix C0023S01.mxf
authorBaptiste Coudurier <baptiste.coudurier@gmail.com>
Tue, 17 Oct 2006 11:23:04 +0000 (11:23 +0000)
committerBaptiste Coudurier <baptiste.coudurier@gmail.com>
Tue, 17 Oct 2006 11:23:04 +0000 (11:23 +0000)
Originally committed as revision 6720 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavformat/mxf.c

index ca30c5e..c0aa508 100644 (file)
@@ -943,11 +943,29 @@ static const MXFMetadataReadTableEntry mxf_metadata_read_table[] = {
     { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, NULL },
 };
 
+static int mxf_read_sync(ByteIOContext *pb, const uint8_t *key, unsigned size)
+{
+    int i, b;
+    for (i = 0; i < size && !url_feof(pb); i++) {
+        b = get_byte(pb);
+        if (b == key[0])
+            i = 0;
+        else if (b != key[i])
+            i = -1;
+    }
+    return i == size;
+}
+
 static int mxf_read_header(AVFormatContext *s, AVFormatParameters *ap)
 {
     MXFContext *mxf = s->priv_data;
     KLVPacket klv;
 
+    if (!mxf_read_sync(&s->pb, mxf_header_partition_pack_key, 14)) {
+        av_log(s, AV_LOG_ERROR, "could not find header partition pack key\n");
+        return -1;
+    }
+    url_fseek(&s->pb, -14, SEEK_CUR);
     mxf->fc = s;
     while (!url_feof(&s->pb)) {
         const MXFMetadataReadTableEntry *function;
@@ -1031,7 +1049,6 @@ static int mxf_read_seek(AVFormatContext *s, int stream_index, int64_t sample_ti
 {
     AVStream *st = s->streams[stream_index];
     int64_t seconds;
-    int i;
 
     if (!s->bit_rate)
         return -1;
@@ -1039,20 +1056,13 @@ static int mxf_read_seek(AVFormatContext *s, int stream_index, int64_t sample_ti
         sample_time = 0;
     seconds = av_rescale(sample_time, st->time_base.num, st->time_base.den);
     url_fseek(&s->pb, (s->bit_rate * seconds) >> 3, SEEK_SET);
-    /* sync on KLV essence element */
-    for (i = 0; i < 12 && url_ftell(&s->pb) < s->file_size; i++) {
-        int b = get_byte(&s->pb);
-        if (b == mxf_essence_element_key[0])
-            i = 0;
-        else if (b != mxf_essence_element_key[i])
-            i = -1;
-    }
-    if (i == 12) { /* found KLV key */
-        url_fseek(&s->pb, -12, SEEK_CUR);
-        av_update_cur_dts(s, st, sample_time);
-        return 0;
-    }
-    return -1;
+    if (!mxf_read_sync(&s->pb, mxf_essence_element_key, 12))
+        return -1;
+
+    /* found KLV key */
+    url_fseek(&s->pb, -12, SEEK_CUR);
+    av_update_cur_dts(s, st, sample_time);
+    return 0;
 }
 
 AVInputFormat mxf_demuxer = {