1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "media/base/audio_decoder_config.h"
6
7 #include "base/logging.h"
8 #include "base/metrics/histogram.h"
9 #include "base/time/time.h"
10 #include "media/audio/sample_rates.h"
11 #include "media/base/limits.h"
12 #include "media/base/sample_format.h"
13
14 namespace media {
15
AudioDecoderConfig()16 AudioDecoderConfig::AudioDecoderConfig()
17 : codec_(kUnknownAudioCodec),
18 sample_format_(kUnknownSampleFormat),
19 bytes_per_channel_(0),
20 channel_layout_(CHANNEL_LAYOUT_UNSUPPORTED),
21 samples_per_second_(0),
22 bytes_per_frame_(0),
23 is_encrypted_(false) {
24 }
25
AudioDecoderConfig(AudioCodec codec,SampleFormat sample_format,ChannelLayout channel_layout,int samples_per_second,const uint8 * extra_data,size_t extra_data_size,bool is_encrypted)26 AudioDecoderConfig::AudioDecoderConfig(AudioCodec codec,
27 SampleFormat sample_format,
28 ChannelLayout channel_layout,
29 int samples_per_second,
30 const uint8* extra_data,
31 size_t extra_data_size,
32 bool is_encrypted) {
33 Initialize(codec, sample_format, channel_layout, samples_per_second,
34 extra_data, extra_data_size, is_encrypted, true,
35 base::TimeDelta(), base::TimeDelta());
36 }
37
Initialize(AudioCodec codec,SampleFormat sample_format,ChannelLayout channel_layout,int samples_per_second,const uint8 * extra_data,size_t extra_data_size,bool is_encrypted,bool record_stats,base::TimeDelta seek_preroll,base::TimeDelta codec_delay)38 void AudioDecoderConfig::Initialize(AudioCodec codec,
39 SampleFormat sample_format,
40 ChannelLayout channel_layout,
41 int samples_per_second,
42 const uint8* extra_data,
43 size_t extra_data_size,
44 bool is_encrypted,
45 bool record_stats,
46 base::TimeDelta seek_preroll,
47 base::TimeDelta codec_delay) {
48 CHECK((extra_data_size != 0) == (extra_data != NULL));
49
50 if (record_stats) {
51 UMA_HISTOGRAM_ENUMERATION("Media.AudioCodec", codec, kAudioCodecMax);
52 UMA_HISTOGRAM_ENUMERATION("Media.AudioSampleFormat", sample_format,
53 kSampleFormatMax);
54 UMA_HISTOGRAM_ENUMERATION("Media.AudioChannelLayout", channel_layout,
55 CHANNEL_LAYOUT_MAX);
56 AudioSampleRate asr = media::AsAudioSampleRate(samples_per_second);
57 if (asr != kUnexpectedAudioSampleRate) {
58 UMA_HISTOGRAM_ENUMERATION("Media.AudioSamplesPerSecond", asr,
59 kUnexpectedAudioSampleRate);
60 } else {
61 UMA_HISTOGRAM_COUNTS(
62 "Media.AudioSamplesPerSecondUnexpected", samples_per_second);
63 }
64 }
65
66 codec_ = codec;
67 channel_layout_ = channel_layout;
68 samples_per_second_ = samples_per_second;
69 sample_format_ = sample_format;
70 bytes_per_channel_ = SampleFormatToBytesPerChannel(sample_format);
71 extra_data_.assign(extra_data, extra_data + extra_data_size);
72 is_encrypted_ = is_encrypted;
73 seek_preroll_ = seek_preroll;
74 codec_delay_ = codec_delay;
75
76 int channels = ChannelLayoutToChannelCount(channel_layout_);
77 bytes_per_frame_ = channels * bytes_per_channel_;
78 }
79
~AudioDecoderConfig()80 AudioDecoderConfig::~AudioDecoderConfig() {}
81
IsValidConfig() const82 bool AudioDecoderConfig::IsValidConfig() const {
83 return codec_ != kUnknownAudioCodec &&
84 channel_layout_ != CHANNEL_LAYOUT_UNSUPPORTED &&
85 bytes_per_channel_ > 0 &&
86 bytes_per_channel_ <= limits::kMaxBytesPerSample &&
87 samples_per_second_ > 0 &&
88 samples_per_second_ <= limits::kMaxSampleRate &&
89 sample_format_ != kUnknownSampleFormat &&
90 seek_preroll_ >= base::TimeDelta() &&
91 codec_delay_ >= base::TimeDelta();
92 }
93
Matches(const AudioDecoderConfig & config) const94 bool AudioDecoderConfig::Matches(const AudioDecoderConfig& config) const {
95 return ((codec() == config.codec()) &&
96 (bytes_per_channel() == config.bytes_per_channel()) &&
97 (channel_layout() == config.channel_layout()) &&
98 (samples_per_second() == config.samples_per_second()) &&
99 (extra_data_size() == config.extra_data_size()) &&
100 (!extra_data() || !memcmp(extra_data(), config.extra_data(),
101 extra_data_size())) &&
102 (is_encrypted() == config.is_encrypted()) &&
103 (sample_format() == config.sample_format()) &&
104 (seek_preroll() == config.seek_preroll()) &&
105 (codec_delay() == config.codec_delay()));
106 }
107
108 } // namespace media
109