[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