]> granicus.if.org Git - handbrake/commitdiff
ffmpeg: fix static audio with pcm in mp4
authorJohn Stebbins <jstebbins.hb@gmail.com>
Sun, 9 Sep 2018 19:17:23 +0000 (12:17 -0700)
committerJohn Stebbins <jstebbins.hb@gmail.com>
Sun, 9 Sep 2018 19:17:23 +0000 (12:17 -0700)
Fixes https://github.com/HandBrake/HandBrake/issues/1555

contrib/ffmpeg/A03-mp4-pcm.patch [new file with mode: 0644]

diff --git a/contrib/ffmpeg/A03-mp4-pcm.patch b/contrib/ffmpeg/A03-mp4-pcm.patch
new file mode 100644 (file)
index 0000000..d9f4932
--- /dev/null
@@ -0,0 +1,64 @@
+From d2047c14c0789ce3059b840472fb96fd8bd854a9 Mon Sep 17 00:00:00 2001
+From: Justin Ruggles <justin.ruggles@gmail.com>
+Date: Wed, 5 Sep 2018 17:54:57 -0400
+Subject: [PATCH 1/2] 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/1555
+
+Signed-off-by: Derek Buitenhuis <derek.buitenhuis@gmail.com>
+---
+ libavformat/isom.h | 1 +
+ libavformat/mov.c  | 6 +++---
+ 2 files changed, 4 insertions(+), 3 deletions(-)
+
+diff --git a/libavformat/isom.h b/libavformat/isom.h
+index f3a7a8633d..e629663949 100644
+--- a/libavformat/isom.h
++++ b/libavformat/isom.h
+@@ -218,6 +218,7 @@ typedef struct MOVStreamContext {
+     int *extradata_size;
+     int last_stsd_index;
+     int stsd_count;
++    int stsd_version;
+     int32_t *display_matrix;
+     AVStereo3D *stereo3d;
+diff --git a/libavformat/mov.c b/libavformat/mov.c
+index 02c8ec66ed..ec57a05803 100644
+--- a/libavformat/mov.c
++++ b/libavformat/mov.c
+@@ -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.
+     av_log(c->fc, AV_LOG_TRACE, "version =%d, isom =%d\n", version, 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) {
+             sc->samples_per_frame = avio_rb32(pb);
+             avio_rb32(pb); /* bytes per packet */
+@@ -2554,7 +2554,7 @@ static int mov_read_stsd(MOVContext *c, AVIOContext *pb, MOVAtom atom)
+     st = c->fc->streams[c->fc->nb_streams - 1];
+     sc = st->priv_data;
+-    avio_r8(pb); /* version */
++    sc->stsd_version = avio_r8(pb);
+     avio_rb24(pb); /* flags */
+     entries = avio_rb32(pb);
+-- 
+2.17.1
+