| 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) {
|
|
|