[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