MOV: Fix old-style muxed raw-audio data.
This patch fixes the sample from trac issue #522. The issue is that the mov demuxer insists on using its calculated sample_size (which is nonsense for old-style tracks) instead of the one encoded in the track. The old raw audio code should be using the value in stsz, because the size of a single sample never makes sense for the size of a full audio packet, whereas the new code will multiply the sample size by the chunk size, so it should use the calculated value. Signed-off-by: Reimar Döffinger <Reimar.Doeffinger@gmx.de>
This commit is contained in:
parent
e0ad7f74c7
commit
50059bde77
@ -103,7 +103,8 @@ typedef struct MOVStreamContext {
|
|||||||
unsigned *stps_data; ///< partial sync sample for mpeg-2 open gop
|
unsigned *stps_data; ///< partial sync sample for mpeg-2 open gop
|
||||||
int ctts_index;
|
int ctts_index;
|
||||||
int ctts_sample;
|
int ctts_sample;
|
||||||
unsigned int sample_size;
|
unsigned int sample_size; ///< may contain value calculated from stsd or value from stsz atom
|
||||||
|
unsigned int alt_sample_size; ///< always contains sample size from stsz atom
|
||||||
unsigned int sample_count;
|
unsigned int sample_count;
|
||||||
int *sample_sizes;
|
int *sample_sizes;
|
||||||
unsigned int keyframe_count;
|
unsigned int keyframe_count;
|
||||||
|
@ -1644,6 +1644,7 @@ static int mov_read_stsz(MOVContext *c, AVIOContext *pb, MOVAtom atom)
|
|||||||
sample_size = avio_rb32(pb);
|
sample_size = avio_rb32(pb);
|
||||||
if (!sc->sample_size) /* do not overwrite value computed in stsd */
|
if (!sc->sample_size) /* do not overwrite value computed in stsd */
|
||||||
sc->sample_size = sample_size;
|
sc->sample_size = sample_size;
|
||||||
|
sc->alt_sample_size = sample_size;
|
||||||
field_size = 32;
|
field_size = 32;
|
||||||
} else {
|
} else {
|
||||||
sample_size = 0;
|
sample_size = 0;
|
||||||
@ -1874,7 +1875,7 @@ static void mov_build_index(MOVContext *mov, AVStream *st)
|
|||||||
}
|
}
|
||||||
if (keyframe)
|
if (keyframe)
|
||||||
distance = 0;
|
distance = 0;
|
||||||
sample_size = sc->sample_size > 0 ? sc->sample_size : sc->sample_sizes[current_sample];
|
sample_size = sc->alt_sample_size > 0 ? sc->alt_sample_size : sc->sample_sizes[current_sample];
|
||||||
if (sc->pseudo_stream_id == -1 ||
|
if (sc->pseudo_stream_id == -1 ||
|
||||||
sc->stsc_data[stsc_index].id - 1 == sc->pseudo_stream_id) {
|
sc->stsc_data[stsc_index].id - 1 == sc->pseudo_stream_id) {
|
||||||
AVIndexEntry *e = &st->index_entries[st->nb_index_entries++];
|
AVIndexEntry *e = &st->index_entries[st->nb_index_entries++];
|
||||||
|
Loading…
x
Reference in New Issue
Block a user