Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(753)

Unified Diff: media/mp4/aac.cc

Issue 10795050: Fix MediaSource code so it can handle HE-AAC content that uses implicit signalling. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Address CR comments. Created 8 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « media/mp4/aac.h ('k') | media/mp4/aac_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: media/mp4/aac.cc
diff --git a/media/mp4/aac.cc b/media/mp4/aac.cc
index 01c831d5f80f3cf81825d7404f9e40772438352c..2804d6b87eb6b91997e19aa78868edd51bcce11c 100644
--- a/media/mp4/aac.cc
+++ b/media/mp4/aac.cc
@@ -4,13 +4,15 @@
#include "media/mp4/aac.h"
+#include <algorithm>
+
#include "base/logging.h"
#include "media/base/bit_reader.h"
#include "media/mp4/rcheck.h"
// The following conversion table is extracted from ISO 14496 Part 3 -
// Table 1.16 - Sampling Frequency Index.
-static const uint32 kFrequencyMap[] = {
+static const int kFrequencyMap[] = {
96000, 88200, 64000, 48000, 44100, 32000, 24000,
22050, 16000, 12000, 11025, 8000, 7350
};
@@ -44,7 +46,7 @@ namespace mp4 {
AAC::AAC()
: profile_(0), frequency_index_(0), channel_config_(0), frequency_(0),
- channel_layout_(CHANNEL_LAYOUT_UNSUPPORTED) {
+ extension_frequency_(0), channel_layout_(CHANNEL_LAYOUT_UNSUPPORTED) {
}
AAC::~AAC() {
@@ -57,9 +59,10 @@ bool AAC::Parse(const std::vector<uint8>& data) {
BitReader reader(&data[0], data.size());
uint8 extension_type = 0;
bool ps_present = false;
- uint8 extension_frequency_index;
+ uint8 extension_frequency_index = 0xff;
frequency_ = 0;
+ extension_frequency_ = 0;
// The following code is written according to ISO 14496 Part 3 Table 1.13 -
// Syntax of AudioSpecificConfig.
@@ -71,15 +74,13 @@ bool AAC::Parse(const std::vector<uint8>& data) {
RCHECK(reader.ReadBits(24, &frequency_));
RCHECK(reader.ReadBits(4, &channel_config_));
- extension_frequency_index = frequency_index_;
-
- // Read extension configuration
+ // Read extension configuration.
if (profile_ == 5 || profile_ == 29) {
ps_present = (profile_ == 29);
extension_type = 5;
RCHECK(reader.ReadBits(4, &extension_frequency_index));
if (extension_frequency_index == 0xf)
- RCHECK(reader.ReadBits(24, &frequency_));
+ RCHECK(reader.ReadBits(24, &extension_frequency_));
RCHECK(reader.ReadBits(5, &profile_));
}
@@ -101,7 +102,7 @@ bool AAC::Parse(const std::vector<uint8>& data) {
RCHECK(reader.ReadBits(4, &extension_frequency_index));
if (extension_frequency_index == 0xf)
- RCHECK(reader.ReadBits(24, &frequency_));
+ RCHECK(reader.ReadBits(24, &extension_frequency_));
RCHECK(reader.ReadBits(11, &sync_extension_type));
@@ -115,8 +116,13 @@ bool AAC::Parse(const std::vector<uint8>& data) {
}
if (frequency_ == 0) {
+ RCHECK(frequency_index_ < arraysize(kFrequencyMap));
+ frequency_ = kFrequencyMap[frequency_index_];
+ }
+
+ if (extension_frequency_ == 0 && extension_frequency_index != 0xff) {
RCHECK(extension_frequency_index < arraysize(kFrequencyMap));
- frequency_ = kFrequencyMap[extension_frequency_index];
+ extension_frequency_ = kFrequencyMap[extension_frequency_index];
}
// When Parametric Stereo is on, mono will be played as stereo.
@@ -130,8 +136,19 @@ bool AAC::Parse(const std::vector<uint8>& data) {
channel_config_ <= 7;
}
-uint32 AAC::frequency() const {
- return frequency_;
+int AAC::GetOutputSamplesPerSecond(bool sbr_in_mimetype) const {
+ if (extension_frequency_ > 0)
+ return extension_frequency_;
+
+ if (!sbr_in_mimetype)
+ return frequency_;
+
+ // The following code is written according to ISO 14496 Part 3 Table 1.11 and
+ // Table 1.22. (Table 1.11 refers to the capping to 48000, Table 1.22 refers
+ // to SBR doubling the AAC sample rate.)
+ // TODO(acolwell) : Extend sample rate cap to 96kHz for Level 5 content.
+ DCHECK_GT(frequency_, 0);
+ return std::min(2 * frequency_, 48000);
}
ChannelLayout AAC::channel_layout() const {
« no previous file with comments | « media/mp4/aac.h ('k') | media/mp4/aac_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698