Bug 1093318 - Pass newer AAC profile levels to the platform decoder module. r=edwin
authorJean-Yves Avenard <jyavenard@mozilla.com>
Mon, 17 Nov 2014 09:28:25 +1100
changeset 216637 6ae01e96281ad9450eb32be4df5441b8819e8e5a
parent 216636 bf36fe5a2125fc4d2b923de5adbf5de6c80479d5
child 216638 188d222151669c886938c334089f9295db5302fd
push id27858
push userkwierso@gmail.com
push dateFri, 21 Nov 2014 01:35:46 +0000
treeherdermozilla-central@6309710dd71d [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersedwin
bugs1093318
milestone36.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1093318 - Pass newer AAC profile levels to the platform decoder module. r=edwin
media/libstagefright/binding/DecoderData.cpp
media/libstagefright/binding/include/mp4_demuxer/DecoderData.h
--- a/media/libstagefright/binding/DecoderData.cpp
+++ b/media/libstagefright/binding/DecoderData.cpp
@@ -1,16 +1,17 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #include "mp4_demuxer/Adts.h"
 #include "mp4_demuxer/AnnexB.h"
 #include "mp4_demuxer/ByteReader.h"
 #include "mp4_demuxer/DecoderData.h"
+#include <media/stagefright/foundation/ABitReader.h>
 #include "media/stagefright/MetaData.h"
 #include "media/stagefright/MediaBuffer.h"
 #include "media/stagefright/MediaDefs.h"
 #include "media/stagefright/Utils.h"
 #include "mozilla/ArrayUtils.h"
 #include "include/ESDS.h"
 
 using namespace stagefright;
@@ -145,18 +146,26 @@ AudioDecoderConfig::Update(sp<MetaData>&
   aac_profile = FindInt32(aMetaData, kKeyAACProfile);
 
   if (FindData(aMetaData, kKeyESDS, &extra_data)) {
     ESDS esds(&extra_data[0], extra_data.length());
 
     const void* data;
     size_t size;
     if (esds.getCodecSpecificInfo(&data, &size) == OK) {
-      audio_specific_config.append(reinterpret_cast<const uint8_t*>(data),
-                                   size);
+      const uint8_t* cdata = reinterpret_cast<const uint8_t*>(data);
+      audio_specific_config.append(cdata, size);
+      if (size > 1) {
+        ABitReader br(cdata, size);
+        extended_profile = br.getBits(5);
+
+        if (extended_profile == 31) {  // AAC-ELD => additional 6 bits
+          extended_profile = 32 + br.getBits(6);
+        }
+      }
     }
   }
 }
 
 bool
 AudioDecoderConfig::IsValid()
 {
   return channel_count > 0 && samples_per_second > 0 && frequency_index > 0 &&
--- a/media/libstagefright/binding/include/mp4_demuxer/DecoderData.h
+++ b/media/libstagefright/binding/include/mp4_demuxer/DecoderData.h
@@ -92,24 +92,26 @@ class AudioDecoderConfig : public TrackC
 {
 public:
   AudioDecoderConfig()
     : channel_count(0)
     , bits_per_sample(0)
     , samples_per_second(0)
     , frequency_index(0)
     , aac_profile(0)
+    , extended_profile(0)
   {
   }
 
   uint32_t channel_count;
   uint32_t bits_per_sample;
   uint32_t samples_per_second;
   int8_t frequency_index;
   int8_t aac_profile;
+  int8_t extended_profile;
   mozilla::Vector<uint8_t> extra_data;
   mozilla::Vector<uint8_t> audio_specific_config;
 
   void Update(stagefright::sp<stagefright::MetaData>& aMetaData,
               const char* aMimeType);
   bool IsValid();
 
 private: