Index: media/filters/opus_audio_decoder.cc |
diff --git a/media/filters/opus_audio_decoder.cc b/media/filters/opus_audio_decoder.cc |
index e3567209f1a83063e484af89f9222bc693dbe445..6762c9bb6bacbf5e6365fea43770ab1244f355e7 100644 |
--- a/media/filters/opus_audio_decoder.cc |
+++ b/media/filters/opus_audio_decoder.cc |
@@ -24,8 +24,9 @@ |
namespace media { |
-static uint16 ReadLE16(const uint8* data, size_t data_size, int read_offset) { |
- uint16 value = 0; |
+template <typename T> |
+static T ReadLE16(const uint8* data, size_t data_size, int read_offset) { |
+ T value = 0; |
DCHECK_LE(read_offset + sizeof(value), data_size); |
memcpy(&value, data + read_offset, sizeof(value)); |
return base::ByteSwapToLE16(value); |
@@ -157,6 +158,9 @@ static const int kOpusExtraDataChannelsOffset = 9; |
// Offset to the pre-skip value in the Opus extra data. |
static const int kOpusExtraDataSkipSamplesOffset = 10; |
+// Offset to the gain value in the Opus extra data. |
+static const int kOpusExtraDataGainOffset = 16; |
+ |
// Offset to the channel mapping byte in the Opus extra data. |
static const int kOpusExtraDataChannelMappingOffset = 18; |
@@ -179,16 +183,18 @@ struct OpusExtraData { |
skip_samples(0), |
channel_mapping(0), |
num_streams(0), |
- num_coupled(0) { |
+ num_coupled(0), |
+ gain_db(0) { |
memcpy(stream_map, |
kDefaultOpusChannelLayout, |
kMaxChannelsWithDefaultLayout); |
} |
int channels; |
- int skip_samples; |
+ uint16_t skip_samples; |
int channel_mapping; |
int num_streams; |
int num_coupled; |
+ int16_t gain_db; |
uint8 stream_map[kMaxVorbisChannels]; |
}; |
@@ -212,7 +218,9 @@ static bool ParseOpusExtraData(const uint8* data, int data_size, |
} |
extra_data->skip_samples = |
- ReadLE16(data, data_size, kOpusExtraDataSkipSamplesOffset); |
+ ReadLE16<uint16_t>(data, data_size, kOpusExtraDataSkipSamplesOffset); |
+ extra_data->gain_db = |
+ ReadLE16<int16_t>(data, data_size, kOpusExtraDataGainOffset); |
acolwell GONE FROM CHROMIUM
2013/12/16 21:37:08
nit: How about just putting a static_cast<int16_t>
DaleCurtis
2013/12/16 22:21:04
Nice catch, I've reverted this in place of just us
|
extra_data->channel_mapping = *(data + kOpusExtraDataChannelMappingOffset); |
@@ -502,6 +510,13 @@ bool OpusAudioDecoder::ConfigureDecoder() { |
return false; |
} |
+ status = opus_multistream_decoder_ctl( |
+ opus_decoder_, OPUS_SET_GAIN(opus_extra_data.gain_db)); |
+ if (status != OPUS_OK) { |
+ DLOG(WARNING) << "Failed to set OPUS header gain. status=" |
+ << opus_strerror(status); |
acolwell GONE FROM CHROMIUM
2013/12/16 21:37:08
nit: Shouldn't we return false here since this is
DaleCurtis
2013/12/16 22:21:04
While the docs don't make it clear, errors will be
vignesh
2013/12/16 22:24:51
We do strict checking on other fields (like codec_
DaleCurtis
2013/12/16 22:28:02
The bounds are int16_min -> int16_max, it's enforc
|
+ } |
+ |
channel_layout_ = config.channel_layout(); |
samples_per_second_ = config.samples_per_second(); |
output_timestamp_helper_.reset( |