[FFmpeg-devel] [PATCH] avformat/mov: fix hang while seek on a kind of fragmented mp4.

Carl Eugen Hoyos ceffmpeg at gmail.com
Mon Feb 11 00:24:39 EET 2019


2019-02-10 23:04 GMT+01:00, Marton Balint <cus at passwd.hu>:
>
>
> On Sun, 3 Feb 2019, Charles Liu wrote:
>
>> Binary searching would hang if the fragment items do NOT have timestamp
>> for the specified stream.
>>
>> For example, a fmp4 consists of separated 'moof' boxes for each track, and
>> separated 'sidx' for each segment, but no 'mfra' box.
>> Then every fragment item only have the timestamp for one of its tracks.
>>
>> Signed-off-by: Charles Liu <liuchh83 at gmail.com>
>> ---
>> libavformat/mov.c | 21 ++++++++++++---------
>> 1 file changed, 12 insertions(+), 9 deletions(-)
>>
>> diff --git a/libavformat/mov.c b/libavformat/mov.c
>> index 9b9739f788..35cb619e9f 100644
>> --- a/libavformat/mov.c
>> +++ b/libavformat/mov.c
>> @@ -1266,7 +1266,7 @@ static int64_t get_frag_time(MOVFragmentIndex
>> *frag_index,
>> static int search_frag_timestamp(MOVFragmentIndex *frag_index,
>>                                  AVStream *st, int64_t timestamp)
>> {
>> -    int a, b, m;
>> +    int a, b, m, m0;
>>     int64_t frag_time;
>>     int id = -1;
>>
>> @@ -1282,15 +1282,18 @@ static int search_frag_timestamp(MOVFragmentIndex
>> *frag_index,
>>     b = frag_index->nb_items;
>>
>>     while (b - a > 1) {
>> -        m = (a + b) >> 1;
>> -        frag_time = get_frag_time(frag_index, m, id);
>> -        if (frag_time != AV_NOPTS_VALUE) {
>> -            if (frag_time >= timestamp)
>> -                b = m;
>> -            if (frag_time <= timestamp)
>> -                a = m;
>> -        }
>> +        m0 = m = (a + b) >> 1;
>> +
>> +        while (m < b &&
>> +               (frag_time = get_frag_time(frag_index, m, id)) ==
>> AV_NOPTS_VALUE)
>> +            m++;
>> +
>> +        if (m < b && frag_time <= timestamp)
>> +            a = m;
>> +        else
>> +            b = m0;
>>     }
>> +
>>     return a;
>> }
>>
>
> As this fixes a hang, I will push this version soon.

Please mention ticket #7572 in the commit message.

Thank you, Carl Eugen


More information about the ffmpeg-devel mailing list