Commit 50059bde authored by Reimar Döffinger's avatar Reimar Döffinger

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: 's avatarReimar Döffinger <Reimar.Doeffinger@gmx.de>
parent e0ad7f74
...@@ -103,7 +103,8 @@ typedef struct MOVStreamContext { ...@@ -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) ...@@ -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) ...@@ -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++];
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment