[FFmpeg-devel] [PATCH] avformat/mov: fix hang while seek on a kind of fragmented mp4.
Marton Balint
cus at passwd.hu
Mon Feb 11 00:04:49 EET 2019
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. Can be optimized
later to pure binary search, if anybody is still interested.
Regards,
Marton
More information about the ffmpeg-devel
mailing list