[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