Index: media/formats/mpeg/adts_stream_parser.cc |
diff --git a/media/formats/mpeg/adts_stream_parser.cc b/media/formats/mpeg/adts_stream_parser.cc |
index c6543047f94aa9f9edbe2757da357940bb03469c..6aa8782ab51102807a4992ee7ad1696665a0de05 100644 |
--- a/media/formats/mpeg/adts_stream_parser.cc |
+++ b/media/formats/mpeg/adts_stream_parser.cc |
@@ -6,7 +6,9 @@ |
#include <stddef.h> |
+#include "build/build_config.h" |
#include "media/base/media_log.h" |
+#include "media/formats/mp4/aac.h" |
#include "media/formats/mpeg/adts_constants.h" |
namespace media { |
@@ -24,12 +26,12 @@ int ADTSStreamParser::ParseFrameHeader(const uint8_t* data, |
int* sample_rate, |
ChannelLayout* channel_layout, |
int* sample_count, |
- bool* metadata_frame) const { |
+ bool* metadata_frame, |
+ std::vector<uint8_t>* extra_data) const { |
DCHECK(data); |
DCHECK_GE(size, 0); |
- DCHECK(frame_size); |
- if (size < 8) |
+ if (size < kADTSHeaderMinSize) |
return 0; |
BitReader reader(data, size); |
@@ -95,6 +97,23 @@ int ADTSStreamParser::ParseFrameHeader(const uint8_t* data, |
if (metadata_frame) |
*metadata_frame = false; |
+ if (extra_data) { |
+ // See mp4::AAC::Parse() for details. We don't need to worry about writing |
+ // extensions since we can't have extended ADTS by this point (it's |
+ // explicitly rejected as invalid above). |
+ DCHECK_NE(sample_rate_index, 15u); |
+ |
+ // The following code is written according to ISO 14496 Part 3 Table 1.13 - |
+ // Syntax of AudioSpecificConfig. |
+ const uint16_t esds = (((((profile + 1) << 4) + sample_rate_index) << 4) + |
+ channel_layout_index) |
+ << 3; |
+ extra_data->push_back(esds >> 8); |
+ extra_data->push_back(esds & 0xFF); |
+ if (media_log()) |
+ DCHECK(mp4::AAC().Parse(*extra_data, media_log())); |
+ } |
+ |
return bytes_read; |
} |