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