avformat/utils: factor ff_find_last_ts() out of ff_gen_search()
authorMichael Niedermayer <michaelni@gmx.at>
Sat, 6 Jul 2013 19:52:07 +0000 (21:52 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Sat, 6 Jul 2013 20:27:35 +0000 (22:27 +0200)
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
libavformat/internal.h
libavformat/utils.c

index ee66e8c..1f74069 100644 (file)
@@ -242,6 +242,9 @@ int ff_seek_frame_binary(AVFormatContext *s, int stream_index,
  */
 void ff_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp);
 
+int ff_find_last_ts(AVFormatContext *s, int stream_index, int64_t *ts, int64_t *pos,
+                    int64_t (*read_timestamp)(struct AVFormatContext *, int , int64_t *, int64_t ));
+
 /**
  * Perform a binary search using read_timestamp().
  *
index f7822ee..6acc7c8 100644 (file)
@@ -1745,14 +1745,50 @@ int ff_seek_frame_binary(AVFormatContext *s, int stream_index, int64_t target_ts
     return 0;
 }
 
+int ff_find_last_ts(AVFormatContext *s, int stream_index, int64_t *ts, int64_t *pos,
+                    int64_t (*read_timestamp)(struct AVFormatContext *, int , int64_t *, int64_t ))
+{
+    int64_t step= 1024;
+    int64_t limit, ts_max;
+    int64_t filesize = avio_size(s->pb);
+    int64_t pos_max = filesize - 1;
+    do{
+        limit = pos_max;
+        pos_max = FFMAX(0, (pos_max) - step);
+        ts_max = ff_read_timestamp(s, stream_index, &pos_max, limit, read_timestamp);
+        step += step;
+    }while(ts_max == AV_NOPTS_VALUE && 2*limit > step);
+    if (ts_max == AV_NOPTS_VALUE)
+        return -1;
+
+    for(;;){
+        int64_t tmp_pos = pos_max + 1;
+        int64_t tmp_ts = ff_read_timestamp(s, stream_index, &tmp_pos, INT64_MAX, read_timestamp);
+        if(tmp_ts == AV_NOPTS_VALUE)
+            break;
+        ts_max  = tmp_ts;
+        pos_max = tmp_pos;
+        if(tmp_pos >= filesize)
+            break;
+    }
+
+    if (ts)
+        *ts = ts_max;
+    if (pos)
+        *pos = pos_max;
+
+    return 0;
+}
+
 int64_t ff_gen_search(AVFormatContext *s, int stream_index, int64_t target_ts,
                       int64_t pos_min, int64_t pos_max, int64_t pos_limit,
                       int64_t ts_min, int64_t ts_max, int flags, int64_t *ts_ret,
                       int64_t (*read_timestamp)(struct AVFormatContext *, int , int64_t *, int64_t ))
 {
     int64_t pos, ts;
-    int64_t start_pos, filesize;
+    int64_t start_pos;
     int no_change;
+    int ret;
 
     av_dlog(s, "gen_seek: %d %s\n", stream_index, av_ts2str(target_ts));
 
@@ -1769,29 +1805,8 @@ int64_t ff_gen_search(AVFormatContext *s, int stream_index, int64_t target_ts,
     }
 
     if(ts_max == AV_NOPTS_VALUE){
-        int64_t step= 1024;
-        int64_t limit;
-        filesize = avio_size(s->pb);
-        pos_max = filesize - 1;
-        do{
-            limit = pos_max;
-            pos_max = FFMAX(0, pos_max - step);
-            ts_max = ff_read_timestamp(s, stream_index, &pos_max, limit, read_timestamp);
-            step += step;
-        }while(ts_max == AV_NOPTS_VALUE && 2*limit > step);
-        if (ts_max == AV_NOPTS_VALUE)
-            return -1;
-
-        for(;;){
-            int64_t tmp_pos= pos_max + 1;
-            int64_t tmp_ts= ff_read_timestamp(s, stream_index, &tmp_pos, INT64_MAX, read_timestamp);
-            if(tmp_ts == AV_NOPTS_VALUE)
-                break;
-            ts_max= tmp_ts;
-            pos_max= tmp_pos;
-            if(tmp_pos >= filesize)
-                break;
-        }
+        if ((ret = ff_find_last_ts(s, stream_index, &ts_max, &pos_max, read_timestamp)) < 0)
+            return ret;
         pos_limit= pos_max;
     }