Index: patched-ffmpeg-mt/libavformat/seek.c |
=================================================================== |
--- patched-ffmpeg-mt/libavformat/seek.c (revision 41250) |
+++ patched-ffmpeg-mt/libavformat/seek.c (working copy) |
@@ -22,10 +22,10 @@ |
#include "seek.h" |
#include "libavutil/mem.h" |
+#include "internal.h" |
// NOTE: implementation should be moved here in another patch, to keep patches |
// separated. |
-extern void av_read_frame_flush(AVFormatContext *s); |
/** |
* helper structure describing keyframe search state of one stream |
@@ -48,38 +48,6 @@ |
} AVSyncPoint; |
/** |
- * Compare two timestamps exactly, taking their respective time bases into account. |
- * |
- * @param ts_a timestamp A |
- * @param tb_a time base for timestamp A |
- * @param ts_b timestamp B |
- * @param tb_b time base for timestamp A |
- * @return -1, 0 or 1 if timestamp A is less than, equal or greater than timestamp B |
- */ |
-static int compare_ts(int64_t ts_a, AVRational tb_a, int64_t ts_b, AVRational tb_b) |
-{ |
- int64_t a, b, res; |
- |
- if (ts_a == INT64_MIN) |
- return ts_a < ts_b ? -1 : 0; |
- if (ts_a == INT64_MAX) |
- return ts_a > ts_b ? 1 : 0; |
- if (ts_b == INT64_MIN) |
- return ts_a > ts_b ? 1 : 0; |
- if (ts_b == INT64_MAX) |
- return ts_a < ts_b ? -1 : 0; |
- |
- a = ts_a * tb_a.num * tb_b.den; |
- b = ts_b * tb_b.num * tb_a.den; |
- |
- res = a - b; |
- if (!res) |
- return 0; |
- else |
- return (res >> 63) | 1; |
-} |
- |
-/** |
* Compute a distance between timestamps. |
* |
* Distances are only comparable, if same time bases are used for computing |
@@ -216,7 +184,7 @@ |
} |
if (sp->term_ts != AV_NOPTS_VALUE && |
- compare_ts(ts, ts_tb, sp->term_ts, sp->term_ts_tb) > 0) { |
+ av_compare_ts(ts, ts_tb, sp->term_ts, sp->term_ts_tb) > 0) { |
// past the end position from last iteration, ignore packet |
if (!sp->terminated) { |
sp->terminated = 1; |
@@ -233,7 +201,7 @@ |
continue; |
} |
- if (compare_ts(ts, ts_tb, timestamp, timebase) <= 0) { |
+ if (av_compare_ts(ts, ts_tb, timestamp, timebase) <= 0) { |
// keyframe found before target timestamp |
if (sp->pos_lo == INT64_MAX) { |
// found first keyframe lower than target timestamp |
@@ -246,7 +214,7 @@ |
sp->pos_lo = pos; |
} |
} |
- if (compare_ts(ts, ts_tb, timestamp, timebase) >= 0) { |
+ if (av_compare_ts(ts, ts_tb, timestamp, timebase) >= 0) { |
// keyframe found after target timestamp |
if (sp->pos_hi == INT64_MAX) { |
// found first keyframe higher than target timestamp |
@@ -391,15 +359,15 @@ |
min_distance = INT64_MAX; |
// Find timestamp closest to requested timestamp within min/max limits. |
if (sp->pos_lo != INT64_MAX |
- && compare_ts(ts_min, time_base, sp->ts_lo, st->time_base) <= 0 |
- && compare_ts(sp->ts_lo, st->time_base, ts_max, time_base) <= 0) { |
+ && av_compare_ts(ts_min, time_base, sp->ts_lo, st->time_base) <= 0 |
+ && av_compare_ts(sp->ts_lo, st->time_base, ts_max, time_base) <= 0) { |
// low timestamp is in range |
min_distance = ts_distance(ts, time_base, sp->ts_lo, st->time_base); |
min_pos = sp->pos_lo; |
} |
if (sp->pos_hi != INT64_MAX |
- && compare_ts(ts_min, time_base, sp->ts_hi, st->time_base) <= 0 |
- && compare_ts(sp->ts_hi, st->time_base, ts_max, time_base) <= 0) { |
+ && av_compare_ts(ts_min, time_base, sp->ts_hi, st->time_base) <= 0 |
+ && av_compare_ts(sp->ts_hi, st->time_base, ts_max, time_base) <= 0) { |
// high timestamp is in range, check distance |
distance = ts_distance(sp->ts_hi, st->time_base, ts, time_base); |
if (distance < min_distance) { |