Message ID | tencent_0F803A34C13E89573D9D4EE0BE5B1C345709@qq.com |
---|---|
State | Accepted |
Commit | d114f064c6e9294d6cd0453a51cac584120e6799 |
Headers | show |
Series | [FFmpeg-devel] avformat/mov: fix missing extra data updating | expand |
Context | Check | Description |
---|---|---|
andriy/make_aarch64_jetson | success | Make finished |
andriy/make_fate_aarch64_jetson | success | Make fate finished |
andriy/make_armv7_RPi4 | success | Make finished |
andriy/make_fate_armv7_RPi4 | success | Make fate finished |
> On Mar 30, 2022, at 2:04 AM, Zhao Zhili <quinkblack@foxmail.com> wrote: > > The stsc_index is checked and updated for the next sample. If the > next sample needs to update stsd_index and stsc_index, then only > stsc_index is updated, which leads to a missing > AV_PKT_DATA_NEW_EXTRADATA. For example, the sample in the second > chunk needs to update both. > > entry[0] > first_chunk = 1 > samples_per_chunk = 3 > sample_description_index = 1 > entry[1] > first_chunk = 2 > samples_per_chunk = 1 > sample_description_index = 2 > entry[2] > first_chunk = 3 > samples_per_chunk = 8 > sample_description_index = 2 > > The fix is simple: first check and update stsd_index for current > sample, then check and update stsc_index for the next. > --- > libavformat/mov.c | 18 +++++++++--------- > 1 file changed, 9 insertions(+), 9 deletions(-) > > diff --git a/libavformat/mov.c b/libavformat/mov.c > index 6c847de164..c9d4f2ef43 100644 > --- a/libavformat/mov.c > +++ b/libavformat/mov.c > @@ -8591,20 +8591,20 @@ static int mov_read_packet(AVFormatContext *s, AVPacket *pkt) > > /* Multiple stsd handling. */ > if (sc->stsc_data) { > - /* Keep track of the stsc index for the given sample, then check > - * if the stsd index is different from the last used one. */ > + if (sc->stsc_data[sc->stsc_index].id > 0 && > + sc->stsc_data[sc->stsc_index].id - 1 < sc->stsd_count && > + sc->stsc_data[sc->stsc_index].id - 1 != sc->last_stsd_index) { > + ret = mov_change_extradata(sc, pkt); > + if (ret < 0) > + return ret; > + } > + > + /* Update the stsc index for the next sample */ > sc->stsc_sample++; > if (mov_stsc_index_valid(sc->stsc_index, sc->stsc_count) && > mov_get_stsc_samples(sc, sc->stsc_index) == sc->stsc_sample) { > sc->stsc_index++; > sc->stsc_sample = 0; > - /* Do not check indexes after a switch. */ > - } else if (sc->stsc_data[sc->stsc_index].id > 0 && > - sc->stsc_data[sc->stsc_index].id - 1 < sc->stsd_count && > - sc->stsc_data[sc->stsc_index].id - 1 != sc->last_stsd_index) { > - ret = mov_change_extradata(sc, pkt); > - if (ret < 0) > - return ret; > } > } > Multi sample entry is a less used feature. Since we have it, better keep it work. This patch fixed a corner case. Will apply this week unless there are objections.
diff --git a/libavformat/mov.c b/libavformat/mov.c index 6c847de164..c9d4f2ef43 100644 --- a/libavformat/mov.c +++ b/libavformat/mov.c @@ -8591,20 +8591,20 @@ static int mov_read_packet(AVFormatContext *s, AVPacket *pkt) /* Multiple stsd handling. */ if (sc->stsc_data) { - /* Keep track of the stsc index for the given sample, then check - * if the stsd index is different from the last used one. */ + if (sc->stsc_data[sc->stsc_index].id > 0 && + sc->stsc_data[sc->stsc_index].id - 1 < sc->stsd_count && + sc->stsc_data[sc->stsc_index].id - 1 != sc->last_stsd_index) { + ret = mov_change_extradata(sc, pkt); + if (ret < 0) + return ret; + } + + /* Update the stsc index for the next sample */ sc->stsc_sample++; if (mov_stsc_index_valid(sc->stsc_index, sc->stsc_count) && mov_get_stsc_samples(sc, sc->stsc_index) == sc->stsc_sample) { sc->stsc_index++; sc->stsc_sample = 0; - /* Do not check indexes after a switch. */ - } else if (sc->stsc_data[sc->stsc_index].id > 0 && - sc->stsc_data[sc->stsc_index].id - 1 < sc->stsd_count && - sc->stsc_data[sc->stsc_index].id - 1 != sc->last_stsd_index) { - ret = mov_change_extradata(sc, pkt); - if (ret < 0) - return ret; } }