[FFmpeg-devel] [PATCH] lavf/mov.c: Fallback to finding non-keyframe in fix_index, if keyframe search fails.
Sasi Inguva
isasi at google.com
Fri Nov 4 00:35:45 EET 2016
Sorry, forgot to add the fate test reference file. Sending it again.
On Thu, Nov 3, 2016 at 12:41 PM, Sasi Inguva <isasi at google.com> wrote:
> Attaching the fate sample.
>
> On Thu, Nov 3, 2016 at 12:39 PM, Sasi Inguva <isasi at google.com> wrote:
>
>> Signed-off-by: Sasi Inguva <isasi at google.com>
>> ---
>> libavformat/mov.c | 30 ++++++++++++++++++++----------
>> tests/fate/mov.mak | 6 +++++-
>> 2 files changed, 25 insertions(+), 11 deletions(-)
>>
>> diff --git a/libavformat/mov.c b/libavformat/mov.c
>> index 4222088..f5b2035 100644
>> --- a/libavformat/mov.c
>> +++ b/libavformat/mov.c
>> @@ -2805,16 +2805,17 @@ static int get_edit_list_entry(MOVContext *mov,
>> }
>>
>> /**
>> - * Find the closest previous keyframe to the timestamp, in e_old index
>> - * entries.
>> + * Find the closest previous frame to the timestamp, in e_old index
>> + * entries. Searching for just any frame / just key frames can be
>> controlled by
>> + * last argument 'flag'.
>> * Returns the index of the entry in st->index_entries if successful,
>> * else returns -1.
>> */
>> -static int64_t find_prev_closest_keyframe_index(AVStream *st,
>> - AVIndexEntry *e_old,
>> - int nb_old,
>> - int64_t timestamp,
>> - int flag)
>> +static int64_t find_prev_closest_index(AVStream *st,
>> + AVIndexEntry *e_old,
>> + int nb_old,
>> + int64_t timestamp,
>> + int flag)
>> {
>> AVIndexEntry *e_keep = st->index_entries;
>> int nb_keep = st->nb_index_entries;
>> @@ -3031,10 +3032,19 @@ static void mov_fix_index(MOVContext *mov,
>> AVStream *st)
>> search_timestamp = FFMAX(search_timestamp - msc->time_scale,
>> e_old[0].timestamp);
>> }
>>
>> - index = find_prev_closest_keyframe_index(st, e_old, nb_old,
>> search_timestamp, 0);
>> + index = find_prev_closest_index(st, e_old, nb_old,
>> search_timestamp, 0);
>> if (index == -1) {
>> - av_log(mov->fc, AV_LOG_ERROR, "Missing key frame while
>> reordering index according to edit list\n");
>> - continue;
>> + av_log(mov->fc, AV_LOG_WARNING,
>> + "st: %d edit list: %"PRId64" Missing key frame while
>> searching for timestamp: %"PRId64"\n",
>> + st->index, edit_list_index, search_timestamp);
>> + index = find_prev_closest_index(st, e_old, nb_old,
>> search_timestamp, AVSEEK_FLAG_ANY);
>> +
>> + if (index == -1) {
>> + av_log(mov->fc, AV_LOG_ERROR,
>> + "st: %d edit list %"PRId64" Cannot find an index
>> entry before timestamp: %"PRId64"\n",
>> + st->index, edit_list_index, search_timestamp);
>> + continue;
>> + }
>> }
>> current = e_old + index;
>>
>> diff --git a/tests/fate/mov.mak b/tests/fate/mov.mak
>> index 6b79832..b6ecbfc 100644
>> --- a/tests/fate/mov.mak
>> +++ b/tests/fate/mov.mak
>> @@ -5,7 +5,8 @@ FATE_MOV = fate-mov-3elist \
>> fate-mov-elist-starts-ctts-2ndsample \
>> fate-mov-1elist-ends-last-bframe \
>> fate-mov-2elist-elist1-ends-bframe \
>> - fate-mov-aac-2048-priming
>> + fate-mov-aac-2048-priming \
>> + fate-mp4-init-nonkeyframe
>>
>> FATE_SAMPLES_AVCONV += $(FATE_MOV)
>>
>> @@ -30,3 +31,6 @@ fate-mov-2elist-elist1-ends-bframe: CMD = framemd5 -i
>> $(TARGET_SAMPLES)/mov/mov-
>>
>> fate-mov-aac-2048-priming: ffprobe$(PROGSSUF)$(EXESUF)
>> fate-mov-aac-2048-priming: CMD = run ffprobe$(PROGSSUF)$(EXESUF)
>> -show_packets -print_format compact $(TARGET_SAMPLES)/mov/aac-2048
>> -priming.mov
>> +
>> +fate-mp4-init-nonkeyframe: ffprobe$(PROGSSUF)$(EXESUF)
>> +fate-mp4-init-nonkeyframe: CMD = run ffprobe$(PROGSSUF)$(EXESUF)
>> -show_packets -print_format compact -select_streams v
>> $(TARGET_SAMPLES)/mov/mp4-init-nonkeyframe.mp4
>> --
>> 2.8.0.rc3.226.g39d4020
>>
>>
>
More information about the ffmpeg-devel
mailing list