mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-04-14 00:58:38 +02:00
avformat/mov: fix missing extra data updating
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. Signed-off-by: Zhao Zhili <zhilizhao@tencent.com>
This commit is contained in:
parent
79286d3eb6
commit
d114f064c6
@ -8745,21 +8745,21 @@ static int mov_read_packet(AVFormatContext *s, AVPacket *pkt)
|
|||||||
|
|
||||||
/* Multiple stsd handling. */
|
/* Multiple stsd handling. */
|
||||||
if (sc->stsc_data) {
|
if (sc->stsc_data) {
|
||||||
/* Keep track of the stsc index for the given sample, then check
|
if (sc->stsc_data[sc->stsc_index].id > 0 &&
|
||||||
* if the stsd index is different from the last used one. */
|
|
||||||
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->stsd_count &&
|
||||||
sc->stsc_data[sc->stsc_index].id - 1 != sc->last_stsd_index) {
|
sc->stsc_data[sc->stsc_index].id - 1 != sc->last_stsd_index) {
|
||||||
ret = mov_change_extradata(sc, pkt);
|
ret = mov_change_extradata(sc, pkt);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mov->aax_mode)
|
if (mov->aax_mode)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user