Commit d2047c14 authored by Justin Ruggles's avatar Justin Ruggles Committed by Derek Buitenhuis

Use QT format for audio sample descriptors depending on stsd version.

ISOBMFF does not allow AudioSampleEntryV1 in stsd version 0, so
assume the descriptor format is QTFF SoundDescriptionV1. ISOBMFF does
not define a version 2.

This fixes audio decoding for some MP4 files generated with Apple
tools. The additional fields present in SoundDescriptionV1/V2 need to
be read in order to correctly read additional boxes that contain
information required for decoding the stream.

Fixes #7376.

Also see: https://github.com/HandBrake/HandBrake/issues/1555Signed-off-by: 's avatarDerek Buitenhuis <derek.buitenhuis@gmail.com>
parent a75d805e
...@@ -218,6 +218,7 @@ typedef struct MOVStreamContext { ...@@ -218,6 +218,7 @@ typedef struct MOVStreamContext {
int *extradata_size; int *extradata_size;
int last_stsd_index; int last_stsd_index;
int stsd_count; int stsd_count;
int stsd_version;
int32_t *display_matrix; int32_t *display_matrix;
AVStereo3D *stereo3d; AVStereo3D *stereo3d;
......
...@@ -2122,8 +2122,8 @@ static void mov_parse_stsd_audio(MOVContext *c, AVIOContext *pb, ...@@ -2122,8 +2122,8 @@ static void mov_parse_stsd_audio(MOVContext *c, AVIOContext *pb,
// Read QT version 1 fields. In version 0 these do not exist. // Read QT version 1 fields. In version 0 these do not exist.
av_log(c->fc, AV_LOG_TRACE, "version =%d, isom =%d\n", version, c->isom); av_log(c->fc, AV_LOG_TRACE, "version =%d, isom =%d\n", version, c->isom);
if (!c->isom || if (!c->isom ||
(compatible_brands && strstr(compatible_brands->value, "qt "))) { (compatible_brands && strstr(compatible_brands->value, "qt ")) ||
(sc->stsd_version == 0 && version > 0)) {
if (version == 1) { if (version == 1) {
sc->samples_per_frame = avio_rb32(pb); sc->samples_per_frame = avio_rb32(pb);
avio_rb32(pb); /* bytes per packet */ avio_rb32(pb); /* bytes per packet */
...@@ -2554,7 +2554,7 @@ static int mov_read_stsd(MOVContext *c, AVIOContext *pb, MOVAtom atom) ...@@ -2554,7 +2554,7 @@ static int mov_read_stsd(MOVContext *c, AVIOContext *pb, MOVAtom atom)
st = c->fc->streams[c->fc->nb_streams - 1]; st = c->fc->streams[c->fc->nb_streams - 1];
sc = st->priv_data; sc = st->priv_data;
avio_r8(pb); /* version */ sc->stsd_version = avio_r8(pb);
avio_rb24(pb); /* flags */ avio_rb24(pb); /* flags */
entries = avio_rb32(pb); entries = avio_rb32(pb);
......
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