[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