avformat/mp3dec: split position sync code out
authorMichael Niedermayer <michael@niedermayer.cc>
Sun, 19 Jul 2015 17:31:08 +0000 (19:31 +0200)
committerMichael Niedermayer <michael@niedermayer.cc>
Sun, 19 Jul 2015 17:31:08 +0000 (19:31 +0200)
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
libavformat/mp3dec.c

index 20af7bc..34692ba 100644 (file)
@@ -437,49 +437,23 @@ static int check(AVIOContext *pb, int64_t pos)
     return sd.frame_size;
 }
 
-static int mp3_seek(AVFormatContext *s, int stream_index, int64_t timestamp,
-                    int flags)
+static int64_t sync(AVFormatContext *s, int64_t target_pos, int flags)
 {
-    MP3DecContext *mp3 = s->priv_data;
-    AVIndexEntry *ie, ie1;
-    AVStream *st = s->streams[0];
-    int64_t ret  = av_index_search_timestamp(st, timestamp, flags);
-    int i, j;
     int dir = (flags&AVSEEK_FLAG_BACKWARD) ? -1 : 1;
     int64_t best_pos;
-    int best_score;
-
-    if (mp3->usetoc == 2)
-        return -1; // generic index code
+    int best_score, i, j;
+    int64_t ret;
 
-    if (   mp3->is_cbr
-        && (mp3->usetoc == 0 || !mp3->xing_toc)
-        && st->duration > 0
-        && mp3->header_filesize > s->internal->data_offset
-        && mp3->frames) {
-        ie = &ie1;
-        timestamp = av_clip64(timestamp, 0, st->duration);
-        ie->timestamp = timestamp;
-        ie->pos       = av_rescale(timestamp, mp3->header_filesize, st->duration) + s->internal->data_offset;
-    } else if (mp3->xing_toc) {
-        if (ret < 0)
-            return ret;
-
-        ie = &st->index_entries[ret];
-    } else {
-        return -1;
-    }
-
-    avio_seek(s->pb, FFMAX(ie->pos - SEEK_WINDOW, 0), SEEK_SET);
-    ret = avio_seek(s->pb, ie->pos, SEEK_SET);
+    avio_seek(s->pb, FFMAX(target_pos - SEEK_WINDOW, 0), SEEK_SET);
+    ret = avio_seek(s->pb, target_pos, SEEK_SET);
     if (ret < 0)
         return ret;
 
 #define MIN_VALID 3
-    best_pos = ie->pos;
+    best_pos = target_pos;
     best_score = 999;
     for(i=0; i<SEEK_WINDOW; i++) {
-        int64_t pos = ie->pos + (dir > 0 ? i - SEEK_WINDOW/4 : -i);
+        int64_t pos = target_pos + (dir > 0 ? i - SEEK_WINDOW/4 : -i);
         int64_t candidate = -1;
         int score = 999;
 
@@ -490,7 +464,7 @@ static int mp3_seek(AVFormatContext *s, int stream_index, int64_t timestamp,
             ret = check(s->pb, pos);
             if(ret < 0)
                 break;
-            if ((ie->pos - pos)*dir <= 0 && abs(MIN_VALID/2-j) < score) {
+            if ((target_pos - pos)*dir <= 0 && abs(MIN_VALID/2-j) < score) {
                 candidate = pos;
                 score = abs(MIN_VALID/2-j);
             }
@@ -504,9 +478,43 @@ static int mp3_seek(AVFormatContext *s, int stream_index, int64_t timestamp,
         }
     }
 
-    ret = avio_seek(s->pb, best_pos, SEEK_SET);
-    if (ret < 0)
-        return ret;
+    return avio_seek(s->pb, best_pos, SEEK_SET);
+}
+
+static int mp3_seek(AVFormatContext *s, int stream_index, int64_t timestamp,
+                    int flags)
+{
+    MP3DecContext *mp3 = s->priv_data;
+    AVIndexEntry *ie, ie1;
+    AVStream *st = s->streams[0];
+    int64_t ret  = av_index_search_timestamp(st, timestamp, flags);
+    int64_t best_pos;
+    int i;
+
+    if (mp3->usetoc == 2)
+        return -1; // generic index code
+
+    if (   mp3->is_cbr
+        && (mp3->usetoc == 0 || !mp3->xing_toc)
+        && st->duration > 0
+        && mp3->header_filesize > s->internal->data_offset
+        && mp3->frames) {
+        ie = &ie1;
+        timestamp = av_clip64(timestamp, 0, st->duration);
+        ie->timestamp = timestamp;
+        ie->pos       = av_rescale(timestamp, mp3->header_filesize, st->duration) + s->internal->data_offset;
+    } else if (mp3->xing_toc) {
+        if (ret < 0)
+            return ret;
+
+        ie = &st->index_entries[ret];
+    } else {
+        return -1;
+    }
+
+    best_pos = sync(s, ie->pos, flags);
+    if (best_pos < 0)
+        return best_pos;
 
     if (mp3->is_cbr && ie == &ie1) {
         int frame_duration = av_rescale(st->duration, 1, mp3->frames);