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 #ifndef MEDIA_BASE_AUDIO_DECODER_CONFIG_H_ 6 #define MEDIA_BASE_AUDIO_DECODER_CONFIG_H_ 7 8 #include <string> 9 #include <vector> 10 11 #include "base/basictypes.h" 12 #include "base/time/time.h" 13 #include "media/base/channel_layout.h" 14 #include "media/base/media_export.h" 15 #include "media/base/sample_format.h" 16 17 namespace media { 18 19 enum AudioCodec { 20 // These values are histogrammed over time; do not change their ordinal 21 // values. When deleting a codec replace it with a dummy value; when adding a 22 // codec, do so at the bottom before kAudioCodecMax, and update the value of 23 // kAudioCodecMax to equal the new codec. 24 kUnknownAudioCodec = 0, 25 kCodecAAC = 1, 26 kCodecMP3 = 2, 27 kCodecPCM = 3, 28 kCodecVorbis = 4, 29 kCodecFLAC = 5, 30 kCodecAMR_NB = 6, 31 kCodecAMR_WB = 7, 32 kCodecPCM_MULAW = 8, 33 kCodecGSM_MS = 9, 34 kCodecPCM_S16BE = 10, 35 kCodecPCM_S24BE = 11, 36 kCodecOpus = 12, 37 // kCodecEAC3 = 13, 38 kCodecPCM_ALAW = 14, 39 // DO NOT ADD RANDOM AUDIO CODECS! 40 // 41 // The only acceptable time to add a new codec is if there is production code 42 // that uses said codec in the same CL. 43 44 // Must always be equal to the largest entry ever logged. 45 kAudioCodecMax = kCodecPCM_ALAW, 46 }; 47 48 // TODO(dalecurtis): FFmpeg API uses |bytes_per_channel| instead of 49 // |bits_per_channel|, we should switch over since bits are generally confusing 50 // to work with. 51 class MEDIA_EXPORT AudioDecoderConfig { 52 public: 53 // Constructs an uninitialized object. Clients should call Initialize() with 54 // appropriate values before using. 55 AudioDecoderConfig(); 56 57 // Constructs an initialized object. It is acceptable to pass in NULL for 58 // |extra_data|, otherwise the memory is copied. 59 AudioDecoderConfig(AudioCodec codec, SampleFormat sample_format, 60 ChannelLayout channel_layout, int samples_per_second, 61 const uint8* extra_data, size_t extra_data_size, 62 bool is_encrypted); 63 64 ~AudioDecoderConfig(); 65 66 // Resets the internal state of this object. |codec_delay| is in frames. 67 void Initialize(AudioCodec codec, SampleFormat sample_format, 68 ChannelLayout channel_layout, int samples_per_second, 69 const uint8* extra_data, size_t extra_data_size, 70 bool is_encrypted, bool record_stats, 71 base::TimeDelta seek_preroll, 72 int codec_delay); 73 74 // Returns true if this object has appropriate configuration values, false 75 // otherwise. 76 bool IsValidConfig() const; 77 78 // Returns true if all fields in |config| match this config. 79 // Note: The contents of |extra_data_| are compared not the raw pointers. 80 bool Matches(const AudioDecoderConfig& config) const; 81 82 // Returns a human-readable string describing |*this|. For debugging & test 83 // output only. 84 std::string AsHumanReadableString() const; 85 86 AudioCodec codec() const { return codec_; } 87 int bits_per_channel() const { return bytes_per_channel_ * 8; } 88 int bytes_per_channel() const { return bytes_per_channel_; } 89 ChannelLayout channel_layout() const { return channel_layout_; } 90 int samples_per_second() const { return samples_per_second_; } 91 SampleFormat sample_format() const { return sample_format_; } 92 int bytes_per_frame() const { return bytes_per_frame_; } 93 base::TimeDelta seek_preroll() const { return seek_preroll_; } 94 int codec_delay() const { return codec_delay_; } 95 96 // Optional byte data required to initialize audio decoders such as Vorbis 97 // codebooks. 98 const uint8* extra_data() const { 99 return extra_data_.empty() ? NULL : &extra_data_[0]; 100 } 101 size_t extra_data_size() const { return extra_data_.size(); } 102 103 // Whether the audio stream is potentially encrypted. 104 // Note that in a potentially encrypted audio stream, individual buffers 105 // can be encrypted or not encrypted. 106 bool is_encrypted() const { return is_encrypted_; } 107 108 private: 109 AudioCodec codec_; 110 SampleFormat sample_format_; 111 int bytes_per_channel_; 112 ChannelLayout channel_layout_; 113 int samples_per_second_; 114 int bytes_per_frame_; 115 std::vector<uint8> extra_data_; 116 bool is_encrypted_; 117 118 // |seek_preroll_| is the duration of the data that the decoder must decode 119 // before the decoded data is valid. 120 base::TimeDelta seek_preroll_; 121 122 // |codec_delay_| is the number of frames the decoder should discard before 123 // returning decoded data. This value can include both decoder delay as well 124 // as padding added during encoding. 125 int codec_delay_; 126 127 // Not using DISALLOW_COPY_AND_ASSIGN here intentionally to allow the compiler 128 // generated copy constructor and assignment operator. Since the extra data is 129 // typically small, the performance impact is minimal. 130 }; 131 132 } // namespace media 133 134 #endif // MEDIA_BASE_AUDIO_DECODER_CONFIG_H_ 135