提交 aa25198f 编写于 作者: C Charles Liu 提交者: Marton Balint

avformat/mov: fix hang while seek on a kind of fragmented mp4

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.

Example:
ffmpeg -f lavfi -i testsrc -f lavfi -i sine -movflags dash+frag_keyframe+skip_trailer+separate_moof -t 1 out.mp4
ffmpeg -ss 0.5 -i out.mp4 -f null none

Also fixes the hang in ticket #7572, but not the reason for having
AV_NOPTS_VALUE timestamps there.
Signed-off-by: NCharles Liu <liuchh83@gmail.com>
Signed-off-by: NMarton Balint <cus@passwd.hu>
上级 00fd38f1
......@@ -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;
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册