15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef MEDIA_BASE_AUDIO_DECODER_CONFIG_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MEDIA_BASE_AUDIO_DECODER_CONFIG_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <vector> 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/channel_layout.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/media_export.h" 137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "media/base/sample_format.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace media { 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum AudioCodec { 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // These values are histogrammed over time; do not change their ordinal 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // values. When deleting a codec replace it with a dummy value; when adding a 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // codec, do so at the bottom before kAudioCodecMax. 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kUnknownAudioCodec = 0, 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kCodecAAC, 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kCodecMP3, 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kCodecPCM, 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kCodecVorbis, 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kCodecFLAC, 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kCodecAMR_NB, 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kCodecAMR_WB, 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kCodecPCM_MULAW, 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kCodecGSM_MS, 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kCodecPCM_S16BE, 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kCodecPCM_S24BE, 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kCodecOpus, 34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) kCodecEAC3, 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // DO NOT ADD RANDOM AUDIO CODECS! 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The only acceptable time to add a new codec is if there is production code 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that uses said codec in the same CL. 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Must always be last! 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kAudioCodecMax 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(dalecurtis): FFmpeg API uses |bytes_per_channel| instead of 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |bits_per_channel|, we should switch over since bits are generally confusing 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to work with. 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MEDIA_EXPORT AudioDecoderConfig { 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Constructs an uninitialized object. Clients should call Initialize() with 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // appropriate values before using. 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AudioDecoderConfig(); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Constructs an initialized object. It is acceptable to pass in NULL for 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |extra_data|, otherwise the memory is copied. 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AudioDecoderConfig(AudioCodec codec, SampleFormat sample_format, 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChannelLayout channel_layout, int samples_per_second, 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint8* extra_data, size_t extra_data_size, 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_encrypted); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~AudioDecoderConfig(); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Resets the internal state of this object. 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void Initialize(AudioCodec codec, SampleFormat sample_format, 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChannelLayout channel_layout, int samples_per_second, 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint8* extra_data, size_t extra_data_size, 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool is_encrypted, bool record_stats); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if this object has appropriate configuration values, false 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // otherwise. 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool IsValidConfig() const; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if all fields in |config| match this config. 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note: The contents of |extra_data_| are compared not the raw pointers. 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool Matches(const AudioDecoderConfig& config) const; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AudioCodec codec() const { return codec_; } 777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int bits_per_channel() const { return bytes_per_channel_ * 8; } 787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int bytes_per_channel() const { return bytes_per_channel_; } 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ChannelLayout channel_layout() const { return channel_layout_; } 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int samples_per_second() const { return samples_per_second_; } 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SampleFormat sample_format() const { return sample_format_; } 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int bytes_per_frame() const { return bytes_per_frame_; } 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Optional byte data required to initialize audio decoders such as Vorbis 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // codebooks. 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const uint8* extra_data() const { 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return extra_data_.empty() ? NULL : &extra_data_[0]; 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t extra_data_size() const { return extra_data_.size(); } 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Whether the audio stream is potentially encrypted. 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note that in a potentially encrypted audio stream, individual buffers 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // can be encrypted or not encrypted. 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool is_encrypted() const { return is_encrypted_; } 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AudioCodec codec_; 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SampleFormat sample_format_; 997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int bytes_per_channel_; 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChannelLayout channel_layout_; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int samples_per_second_; 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int bytes_per_frame_; 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<uint8> extra_data_; 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_encrypted_; 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Not using DISALLOW_COPY_AND_ASSIGN here intentionally to allow the compiler 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // generated copy constructor and assignment operator. Since the extra data is 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // typically small, the performance impact is minimal. 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace media 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // MEDIA_BASE_AUDIO_DECODER_CONFIG_H_ 114