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

Marton Balint cus at passwd.hu
Mon Feb 11 23:10:05 EET 2019



On Sun, 10 Feb 2019, Carl Eugen Hoyos wrote:

> 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.

Sure. Pushed.

Regards,
Marton


More information about the ffmpeg-devel mailing list