[FFmpeg-devel] [PATCH] lavf/mov: fix hang while seek on a kind of fragmented mp4.

Marton Balint cus at passwd.hu
Sat Feb 2 18:03:25 EET 2019



On Sat, 2 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.

I don't see why you are changing the search to be linear. Is it possible 
the some of the stream fragmens have NOPTS_VALUE but other don't? In this 
case you should keep the binary search and only fall back to linear search 
if binary search finds an AV_NOPTS_VALUE. See similar code in function 
mxf_absolute_bodysid_offset of libavformat/mxfdec.c.

On the other hand, if either all stream segments have AV_NOPTS_VALUE, or 
none of them do, then why don't you simply break out of the loop with error?

Thanks,
Marton


>
> Signed-off-by: Charles Liu <liuchh83 at gmail.com>
> ---
> libavformat/mov.c | 21 +++++++++------------
> 1 file changed, 9 insertions(+), 12 deletions(-)
>
> diff --git a/libavformat/mov.c b/libavformat/mov.c
> index 9b9739f788..ce1130ad07 100644
> --- a/libavformat/mov.c
> +++ b/libavformat/mov.c
> @@ -1266,9 +1266,8 @@ 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;
>     int64_t frag_time;
> -    int id = -1;
> +    int i, frag = 0, id = -1;
>
>     if (st) {
>         // If the stream is referenced by any sidx, limit the search
> @@ -1278,20 +1277,18 @@ static int search_frag_timestamp(MOVFragmentIndex *frag_index,
>             id = st->id;
>     }
> 
> -    a = -1;
> -    b = frag_index->nb_items;
> -
> -    while (b - a > 1) {
> -        m = (a + b) >> 1;
> -        frag_time = get_frag_time(frag_index, m, id);
> +    for (i = 0; i < frag_index->nb_items; i++) {
> +        frag_time = get_frag_time(frag_index, i, id);
>         if (frag_time != AV_NOPTS_VALUE) {
> -            if (frag_time >= timestamp)
> -                b = m;
>             if (frag_time <= timestamp)
> -                a = m;
> +                frag = i;
> +            else {
> +                break;
> +            }
>         }
>     }
> -    return a;
> +
> +    return frag;
> }
> 
> static int update_frag_index(MOVContext *c, int64_t offset)
> -- 
> 2.20.1
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel


More information about the ffmpeg-devel mailing list