2019-02-10 23:04 GMT+01:00, Marton Balint <c...@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 <liuch...@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 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel