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..c1de6df21586d20806551d53e6b86bdf29d6452a 100644 |
--- a/media/filters/opus_audio_decoder.cc |
+++ b/media/filters/opus_audio_decoder.cc |
@@ -157,6 +157,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 +182,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 skip_samples; |
int channel_mapping; |
int num_streams; |
int num_coupled; |
+ int16 gain_db; |
uint8 stream_map[kMaxVorbisChannels]; |
}; |
@@ -213,6 +218,8 @@ static bool ParseOpusExtraData(const uint8* data, int data_size, |
extra_data->skip_samples = |
ReadLE16(data, data_size, kOpusExtraDataSkipSamplesOffset); |
+ extra_data->gain_db = static_cast<int16>( |
+ ReadLE16(data, data_size, kOpusExtraDataGainOffset)); |
extra_data->channel_mapping = *(data + kOpusExtraDataChannelMappingOffset); |
@@ -502,6 +509,14 @@ 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(ERROR) << "Failed to set OPUS header gain; status=" |
+ << opus_strerror(status); |
+ return false; |
+ } |
+ |
channel_layout_ = config.channel_layout(); |
samples_per_second_ = config.samples_per_second(); |
output_timestamp_helper_.reset( |