]> granicus.if.org Git - handbrake/commitdiff
Bugfix branch: fix HE-AAC in MKV.
authorRodeo <tdskywalker@gmail.com>
Mon, 18 Jun 2012 19:54:54 +0000 (19:54 +0000)
committerRodeo <tdskywalker@gmail.com>
Mon, 18 Jun 2012 19:54:54 +0000 (19:54 +0000)
HandBrake's output should now play correctly on Sigma-based hardware players (among others).

git-svn-id: svn://svn.handbrake.fr/HandBrake/branches/0.9.x@4752 b64f7644-9d1e-0410-96f1-a4d463321fa5

contrib/libmkv/A02-audio-out-sampling-freq.patch [new file with mode: 0644]
libhb/muxmkv.c

diff --git a/contrib/libmkv/A02-audio-out-sampling-freq.patch b/contrib/libmkv/A02-audio-out-sampling-freq.patch
new file mode 100644 (file)
index 0000000..ea31957
--- /dev/null
@@ -0,0 +1,28 @@
+diff --git a/include/libmkv.h b/include/libmkv.h
+index 146a91f..f03d608 100644
+--- a/include/libmkv.h
++++ b/include/libmkv.h
+@@ -203,6 +204,7 @@ struct mk_TrackConfig_s {
+               } video;
+               struct {
+                       float samplingFreq;     /* Sampling Frequency in Hz */
++                      float outputSamplingFreq;       /* Playback Sampling Frequency in Hz (e.g. for AAC w/SBR) */
+                       unsigned channels;      /* Number of channels for this track */
+                       unsigned bitDepth;      /* Bits per sample (PCM) */
+               } audio;
+diff --git a/src/tracks.c b/src/tracks.c
+index f9c7e48..a2a60ca 100644
+--- a/src/tracks.c
++++ b/src/tracks.c
+@@ -174,6 +174,11 @@ mk_Track *mk_createTrack(mk_Writer *w, mk_TrackConfig *tc)
+                       /* SamplingFrequency */
+                       if (mk_writeFloat(v, MATROSKA_ID_AUDIOSAMPLINGFREQ, tc->extra.audio.samplingFreq) < 0)
+                               return NULL;
++                      if (tc->extra.audio.outputSamplingFreq) {
++                              /* Output SamplingFrequency */
++                              if (mk_writeFloat(v, MATROSKA_ID_AUDIOOUTSAMPLINGFREQ, tc->extra.audio.outputSamplingFreq) < 0)
++                                      return NULL;
++                      }
+                       /* Channels */
+                       if (mk_writeUInt(v, MATROSKA_ID_AUDIOCHANNELS, tc->extra.audio.channels) < 0)
+                               return NULL;
index 7d8af9310395c796f0200d39e38b2e99eb67e271..5debb658d4237314b889db05a51f02bd0864ec19 100644 (file)
@@ -283,7 +283,20 @@ static int MKVInit( hb_mux_object_t * m )
         // MKV lang codes should be ISO-639-2/B
         lang =  lang_for_code2( audio->config.lang.iso639_2 );
         track->language = lang->iso639_2b ? lang->iso639_2b : lang->iso639_2;
-        track->extra.audio.samplingFreq = (float)audio->config.out.samplerate;
+        // sample rate
+        if ((audio->config.out.codec == HB_ACODEC_CA_HAAC) ||
+            (audio->config.out.codec == HB_ACODEC_AAC_PASS &&
+             audio->priv.config.extradata.length == 5))
+        {
+            // For HE-AAC, write outputSamplingFreq too
+            // samplingFreq is half of outputSamplingFreq
+            track->extra.audio.outputSamplingFreq = (float)audio->config.out.samplerate;
+            track->extra.audio.samplingFreq = track->extra.audio.outputSamplingFreq / 2.;
+        }
+        else
+        {
+            track->extra.audio.samplingFreq = (float)audio->config.out.samplerate;
+        }
         if (audio->config.out.codec & HB_ACODEC_PASS_FLAG)
         {
             track->extra.audio.channels = HB_INPUT_CH_LAYOUT_GET_DISCRETE_COUNT(audio->config.in.channel_layout);