diff options
author | dalecurtis@google.com <dalecurtis@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-01-04 20:20:15 +0000 |
---|---|---|
committer | dalecurtis@google.com <dalecurtis@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-01-04 20:20:15 +0000 |
commit | b5eca3cffa0afa077d24d98a1f7d9e4b44e5ad4e (patch) | |
tree | 585aaec1a953b456b45a67817b4a933f1a8b04f5 /media/base/audio_decoder_config.h | |
parent | cb9a7a1586961248f6acb16aa7c13a6a1bff5afd (diff) | |
download | chromium_src-b5eca3cffa0afa077d24d98a1f7d9e4b44e5ad4e.zip chromium_src-b5eca3cffa0afa077d24d98a1f7d9e4b44e5ad4e.tar.gz chromium_src-b5eca3cffa0afa077d24d98a1f7d9e4b44e5ad4e.tar.bz2 |
Roll FFMpeg for M26. Fix ffmpeg float audio decoding.
FFmpeg now outputs float for some audio decoders. Unfortunately our pipeline
doesn't support float between the FFmpegAudioDecoder and AudioRenderer at
present. As such, we need to convert the data into an integer format first.
As a byproduct of this, AMR support for ChromeOS is finally fixed and adding
support for PCM float is trivial.
In summary this patch adds:
- A SampleFormat property to AudioDecoderConfig.
- AVSampleFormat <-> SampleFormat converters in FFmpegCommon.
- Fixes ChromeOS AMR playback.
- Finally plumbs pcm_f32le support (enabled in FFmpeg long ago).
- Add decoder support for float planar and float interleaved playback.
BUG=109085, 158187, 167069
TEST=unittests, layout tests, and demos all pass under tooling without issue.
Review URL: https://codereview.chromium.org/11280301
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@175180 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'media/base/audio_decoder_config.h')
-rw-r--r-- | media/base/audio_decoder_config.h | 46 |
1 files changed, 32 insertions, 14 deletions
diff --git a/media/base/audio_decoder_config.h b/media/base/audio_decoder_config.h index 221e49c..fa29946 100644 --- a/media/base/audio_decoder_config.h +++ b/media/base/audio_decoder_config.h @@ -15,7 +15,7 @@ namespace media { enum AudioCodec { // These values are histogrammed over time; do not change their ordinal // values. When deleting a codec replace it with a dummy value; when adding a - // codec, do so at the bottom (and update kAudioCodecMax). + // codec, do so at the bottom before kAudioCodecMax. kUnknownAudioCodec = 0, kCodecAAC, kCodecMP3, @@ -34,7 +34,24 @@ enum AudioCodec { // The only acceptable time to add a new codec is if there is production code // that uses said codec in the same CL. - kAudioCodecMax = kCodecOpus // Must equal the last "real" codec above. + // Must always be last! + kAudioCodecMax +}; + +enum SampleFormat { + // These values are histogrammed over time; do not change their ordinal + // values. When deleting a sample format replace it with a dummy value; when + // adding a sample format, do so at the bottom before kSampleFormatMax. + kUnknownSampleFormat = 0, + kSampleFormatU8, // Unsigned 8-bit w/ bias of 128. + kSampleFormatS16, // Signed 16-bit. + kSampleFormatS32, // Signed 32-bit. + kSampleFormatF32, // Float 32-bit. + kSampleFormatPlanarS16, // Signed 16-bit planar. + kSampleFormatPlanarF32, // Float 32-bit planar. + + // Must always be last! + kSampleFormatMax }; // TODO(dalecurtis): FFmpeg API uses |bytes_per_channel| instead of @@ -48,7 +65,7 @@ class MEDIA_EXPORT AudioDecoderConfig { // Constructs an initialized object. It is acceptable to pass in NULL for // |extra_data|, otherwise the memory is copied. - AudioDecoderConfig(AudioCodec codec, int bits_per_channel, + 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); @@ -56,11 +73,10 @@ class MEDIA_EXPORT AudioDecoderConfig { ~AudioDecoderConfig(); // Resets the internal state of this object. - void Initialize(AudioCodec codec, int bits_per_channel, + void 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); + bool is_encrypted, bool record_stats); // Deep copies |audio_config|. void CopyFrom(const AudioDecoderConfig& audio_config); @@ -73,24 +89,26 @@ class MEDIA_EXPORT AudioDecoderConfig { // Note: The contents of |extra_data_| are compared not the raw pointers. bool Matches(const AudioDecoderConfig& config) const; - AudioCodec codec() const; - int bits_per_channel() const; - ChannelLayout channel_layout() const; - int samples_per_second() const; - int bytes_per_frame() const; + AudioCodec codec() const { return codec_; } + int bits_per_channel() const { return bits_per_channel_; } + ChannelLayout channel_layout() const { return channel_layout_; } + int samples_per_second() const { return samples_per_second_; } + SampleFormat sample_format() const { return sample_format_; } + int bytes_per_frame() const { return bytes_per_frame_; } // Optional byte data required to initialize audio decoders such as Vorbis // codebooks. - uint8* extra_data() const; - size_t extra_data_size() const; + uint8* extra_data() const { return extra_data_.get(); } + size_t extra_data_size() const { return extra_data_size_; } // Whether the audio stream is potentially encrypted. // Note that in a potentially encrypted audio stream, individual buffers // can be encrypted or not encrypted. - bool is_encrypted() const; + bool is_encrypted() const { return is_encrypted_; } private: AudioCodec codec_; + SampleFormat sample_format_; int bits_per_channel_; ChannelLayout channel_layout_; int samples_per_second_; |