diff mbox series

[FFmpeg-devel,1/2] avformat/mov: fix frag_index.current out of sync

Message ID tencent_FC35CB817C341F3FBF56AF9C34E0585AE409@qq.com
State New
Headers show
Series [FFmpeg-devel,1/2] avformat/mov: fix frag_index.current out of sync | expand

Checks

Context Check Description
andriy/make_x86 success Make finished
andriy/make_fate_x86 fail Make fate failed

Commit Message

zhilizhao(赵志立) July 30, 2022, 5:14 p.m. UTC
From: Zhao Zhili <zhilizhao@tencent.com>

frag_index.current is used by cenc_filter, and is updated inside
mov_read_moof. It can out of sync regarding to mov_read_packet.

Partly fix ticket #9807.
---
 libavformat/mov.c | 27 ++++++++++++++++++++++++++-
 1 file changed, 26 insertions(+), 1 deletion(-)

Comments

Steven Liu July 31, 2022, 12:26 a.m. UTC | #1
Zhao Zhili <quinkblack@foxmail.com>于2022年7月31日 周日01:15写道:

> From: Zhao Zhili <zhilizhao@tencent.com>
>
> frag_index.current is used by cenc_filter, and is updated inside
> mov_read_moof. It can out of sync regarding to mov_read_packet.
>
> Partly fix ticket #9807.
> ---
>  libavformat/mov.c | 27 ++++++++++++++++++++++++++-
>  1 file changed, 26 insertions(+), 1 deletion(-)
>
> diff --git a/libavformat/mov.c b/libavformat/mov.c
> index a09a762d91..ce12a9e4f1 100644
> --- a/libavformat/mov.c
> +++ b/libavformat/mov.c
> @@ -7095,6 +7095,31 @@ static int cenc_decrypt(MOVContext *c,
> MOVStreamContext *sc, AVEncryptionInfo *s
>      }
>  }
>
> +static MOVFragmentStreamInfo
> *get_frag_stream_info_from_pkt(MOVFragmentIndex *frag_index, AVPacket *pkt,
> int id)
> +{
> +    int current = frag_index->current;
> +
> +    if (!frag_index->nb_items)
> +        return NULL;
> +
> +    // Check frag_index->current is the right one for pkt. It can out of
> sync.
> +    if (current >= 0 && current < frag_index->nb_items) {
> +        if (frag_index->item[current].moof_offset < pkt->pos &&
> +            (current + 1 == frag_index->nb_items ||
> +             frag_index->item[current + 1].moof_offset > pkt->pos))
> +            return get_frag_stream_info(frag_index, current, id);
> +    }
> +
> +
> +    for (int i = 0; i < frag_index->nb_items; i++) {
> +        if (frag_index->item[i].moof_offset > pkt->pos)
> +            break;
> +        current = i;
> +    }
> +    frag_index->current = current;
> +    return get_frag_stream_info(frag_index, current, id);
> +}
> +
>  static int cenc_filter(MOVContext *mov, AVStream* st, MOVStreamContext
> *sc, AVPacket *pkt, int current_index)
>  {
>      MOVFragmentStreamInfo *frag_stream_info;
> @@ -7102,7 +7127,7 @@ static int cenc_filter(MOVContext *mov, AVStream*
> st, MOVStreamContext *sc, AVPa
>      AVEncryptionInfo *encrypted_sample;
>      int encrypted_index, ret;
>
> -    frag_stream_info = get_frag_stream_info(&mov->frag_index,
> mov->frag_index.current, st->id);
> +    frag_stream_info = get_frag_stream_info_from_pkt(&mov->frag_index,
> pkt, st->id);
>      encrypted_index = current_index;
>      encryption_index = NULL;
>      if (frag_stream_info) {
> --
> 2.34.1
>

https://patchwork.ffmpeg.org/project/ffmpeg/list/?series=7071

What about this patch to fix this ticket?

>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
>
zhilizhao(赵志立) Aug. 11, 2022, 7:06 a.m. UTC | #2
> On Jul 31, 2022, at 1:14 AM, Zhao Zhili <quinkblack@foxmail.com> wrote:
> 
> From: Zhao Zhili <zhilizhao@tencent.com>
> 
> frag_index.current is used by cenc_filter, and is updated inside
> mov_read_moof. It can out of sync regarding to mov_read_packet.
> 
> Partly fix ticket #9807.
> ---
> libavformat/mov.c | 27 ++++++++++++++++++++++++++-
> 1 file changed, 26 insertions(+), 1 deletion(-)
> 
> diff --git a/libavformat/mov.c b/libavformat/mov.c
> index a09a762d91..ce12a9e4f1 100644
> --- a/libavformat/mov.c
> +++ b/libavformat/mov.c
> @@ -7095,6 +7095,31 @@ static int cenc_decrypt(MOVContext *c, MOVStreamContext *sc, AVEncryptionInfo *s
>     }
> }


Ping for review.

By the way, there is a fate failure on patchwork which is unlikely
introduced by this patchset (It happened on another patch before).
So how to make patchwork rerun the fate test without resending the
patch again?
Steven Liu Aug. 11, 2022, 7:56 a.m. UTC | #3
"zhilizhao(赵志立)" <quinkblack@foxmail.com> 于2022年8月11日周四 15:07写道:
>
>
>
> > On Jul 31, 2022, at 1:14 AM, Zhao Zhili <quinkblack@foxmail.com> wrote:
> >
> > From: Zhao Zhili <zhilizhao@tencent.com>
> >
> > frag_index.current is used by cenc_filter, and is updated inside
> > mov_read_moof. It can out of sync regarding to mov_read_packet.
> >
> > Partly fix ticket #9807.
> > ---
> > libavformat/mov.c | 27 ++++++++++++++++++++++++++-
> > 1 file changed, 26 insertions(+), 1 deletion(-)
> >
> > diff --git a/libavformat/mov.c b/libavformat/mov.c
> > index a09a762d91..ce12a9e4f1 100644
> > --- a/libavformat/mov.c
> > +++ b/libavformat/mov.c
> > @@ -7095,6 +7095,31 @@ static int cenc_decrypt(MOVContext *c, MOVStreamContext *sc, AVEncryptionInfo *s
> >     }
> > }
>
>
> Ping for review.
>
looks ok to me.

> By the way, there is a fate failure on patchwork which is unlikely
> introduced by this patchset (It happened on another patch before).
> So how to make patchwork rerun the fate test without resending the
> patch again?
make again to test by fate :D
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
diff mbox series

Patch

diff --git a/libavformat/mov.c b/libavformat/mov.c
index a09a762d91..ce12a9e4f1 100644
--- a/libavformat/mov.c
+++ b/libavformat/mov.c
@@ -7095,6 +7095,31 @@  static int cenc_decrypt(MOVContext *c, MOVStreamContext *sc, AVEncryptionInfo *s
     }
 }
 
+static MOVFragmentStreamInfo *get_frag_stream_info_from_pkt(MOVFragmentIndex *frag_index, AVPacket *pkt, int id)
+{
+    int current = frag_index->current;
+
+    if (!frag_index->nb_items)
+        return NULL;
+
+    // Check frag_index->current is the right one for pkt. It can out of sync.
+    if (current >= 0 && current < frag_index->nb_items) {
+        if (frag_index->item[current].moof_offset < pkt->pos &&
+            (current + 1 == frag_index->nb_items ||
+             frag_index->item[current + 1].moof_offset > pkt->pos))
+            return get_frag_stream_info(frag_index, current, id);
+    }
+
+
+    for (int i = 0; i < frag_index->nb_items; i++) {
+        if (frag_index->item[i].moof_offset > pkt->pos)
+            break;
+        current = i;
+    }
+    frag_index->current = current;
+    return get_frag_stream_info(frag_index, current, id);
+}
+
 static int cenc_filter(MOVContext *mov, AVStream* st, MOVStreamContext *sc, AVPacket *pkt, int current_index)
 {
     MOVFragmentStreamInfo *frag_stream_info;
@@ -7102,7 +7127,7 @@  static int cenc_filter(MOVContext *mov, AVStream* st, MOVStreamContext *sc, AVPa
     AVEncryptionInfo *encrypted_sample;
     int encrypted_index, ret;
 
-    frag_stream_info = get_frag_stream_info(&mov->frag_index, mov->frag_index.current, st->id);
+    frag_stream_info = get_frag_stream_info_from_pkt(&mov->frag_index, pkt, st->id);
     encrypted_index = current_index;
     encryption_index = NULL;
     if (frag_stream_info) {