Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(28)

Unified Diff: chromecast/media/cma/public/audio_config.cc

Issue 1074383002: Introduce VideoConfig/AudioConfig class for CMA backend (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chromecast/media/cma/public/audio_config.cc
diff --git a/chromecast/media/cma/public/audio_config.cc b/chromecast/media/cma/public/audio_config.cc
new file mode 100644
index 0000000000000000000000000000000000000000..78a21c8747eb04c4abbe4b6fcb1d3ad1473108f5
--- /dev/null
+++ b/chromecast/media/cma/public/audio_config.cc
@@ -0,0 +1,201 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chromecast/media/cma/public/audio_config.h"
+
+#include "base/logging.h"
+#include "media/base/audio_decoder_config.h"
+
+// Make sure the enum values of media::AudioCodec and
+// chromecast::media::AudioConfig::Codec are matched.
+#define STATIC_ASSERT_ENUM_MATCH_CODEC(name) \
+ static_assert( \
+ ::media::name == static_cast< ::media::AudioCodec>( \
+ chromecast::media::AudioConfig::name), \
+ #name " value must match in media and chromecast::media::AudioConfig.")
+
+// Make sure the enum values of media::ChannelLayout and
+// chromecast::media::AudioConfig::ChannelLayout are matched.
+#define STATIC_ASSERT_ENUM_MATCH_CHANNEL_LAYOUT(name) \
+ static_assert( \
+ ::media::name == static_cast< ::media::ChannelLayout>( \
+ chromecast::media::AudioConfig::name), \
+ #name " value must match in media and chromecast::media::AudioConfig.")
+
+namespace {
+
+// Maximum audio bytes per sample.
+static int kMaxBytesPerSample = 4;
+
+// Maximum audio sampling rate.
+static int kMaxSampleRate = 192000;
+
+} // namespace
+
+namespace chromecast {
+namespace media {
+
+STATIC_ASSERT_ENUM_MATCH_CODEC(kUnknownAudioCodec);
+STATIC_ASSERT_ENUM_MATCH_CODEC(kCodecAAC);
+STATIC_ASSERT_ENUM_MATCH_CODEC(kCodecMP3);
+STATIC_ASSERT_ENUM_MATCH_CODEC(kCodecPCM);
+STATIC_ASSERT_ENUM_MATCH_CODEC(kCodecVorbis);
+STATIC_ASSERT_ENUM_MATCH_CODEC(kCodecFLAC);
+STATIC_ASSERT_ENUM_MATCH_CODEC(kCodecAMR_NB);
+STATIC_ASSERT_ENUM_MATCH_CODEC(kCodecAMR_WB);
+STATIC_ASSERT_ENUM_MATCH_CODEC(kCodecPCM_MULAW);
+STATIC_ASSERT_ENUM_MATCH_CODEC(kCodecGSM_MS);
+STATIC_ASSERT_ENUM_MATCH_CODEC(kCodecPCM_S16BE);
+STATIC_ASSERT_ENUM_MATCH_CODEC(kCodecPCM_S24BE);
+STATIC_ASSERT_ENUM_MATCH_CODEC(kCodecOpus);
+// STATIC_ASSERT_ENUM_MATCH_CODEC(kCodecEAC3);
+STATIC_ASSERT_ENUM_MATCH_CODEC(kCodecPCM_ALAW);
+STATIC_ASSERT_ENUM_MATCH_CODEC(kCodecALAC);
+
+STATIC_ASSERT_ENUM_MATCH_CHANNEL_LAYOUT(CHANNEL_LAYOUT_NONE);
+STATIC_ASSERT_ENUM_MATCH_CHANNEL_LAYOUT(CHANNEL_LAYOUT_UNSUPPORTED);
+STATIC_ASSERT_ENUM_MATCH_CHANNEL_LAYOUT(CHANNEL_LAYOUT_MONO);
+STATIC_ASSERT_ENUM_MATCH_CHANNEL_LAYOUT(CHANNEL_LAYOUT_STEREO);
+STATIC_ASSERT_ENUM_MATCH_CHANNEL_LAYOUT(CHANNEL_LAYOUT_2_1);
+STATIC_ASSERT_ENUM_MATCH_CHANNEL_LAYOUT(CHANNEL_LAYOUT_SURROUND);
+STATIC_ASSERT_ENUM_MATCH_CHANNEL_LAYOUT(CHANNEL_LAYOUT_4_0);
+STATIC_ASSERT_ENUM_MATCH_CHANNEL_LAYOUT(CHANNEL_LAYOUT_2_2);
+STATIC_ASSERT_ENUM_MATCH_CHANNEL_LAYOUT(CHANNEL_LAYOUT_QUAD);
+STATIC_ASSERT_ENUM_MATCH_CHANNEL_LAYOUT(CHANNEL_LAYOUT_5_0);
+STATIC_ASSERT_ENUM_MATCH_CHANNEL_LAYOUT(CHANNEL_LAYOUT_5_1);
+STATIC_ASSERT_ENUM_MATCH_CHANNEL_LAYOUT(CHANNEL_LAYOUT_5_0_BACK);
+STATIC_ASSERT_ENUM_MATCH_CHANNEL_LAYOUT(CHANNEL_LAYOUT_5_1_BACK);
+STATIC_ASSERT_ENUM_MATCH_CHANNEL_LAYOUT(CHANNEL_LAYOUT_7_0);
+STATIC_ASSERT_ENUM_MATCH_CHANNEL_LAYOUT(CHANNEL_LAYOUT_7_1);
+STATIC_ASSERT_ENUM_MATCH_CHANNEL_LAYOUT(CHANNEL_LAYOUT_7_1_WIDE);
+STATIC_ASSERT_ENUM_MATCH_CHANNEL_LAYOUT(CHANNEL_LAYOUT_STEREO_DOWNMIX);
+STATIC_ASSERT_ENUM_MATCH_CHANNEL_LAYOUT(CHANNEL_LAYOUT_2POINT1);
+STATIC_ASSERT_ENUM_MATCH_CHANNEL_LAYOUT(CHANNEL_LAYOUT_3_1);
+STATIC_ASSERT_ENUM_MATCH_CHANNEL_LAYOUT(CHANNEL_LAYOUT_4_1);
+STATIC_ASSERT_ENUM_MATCH_CHANNEL_LAYOUT(CHANNEL_LAYOUT_6_0);
+STATIC_ASSERT_ENUM_MATCH_CHANNEL_LAYOUT(CHANNEL_LAYOUT_6_0_FRONT);
+STATIC_ASSERT_ENUM_MATCH_CHANNEL_LAYOUT(CHANNEL_LAYOUT_HEXAGONAL);
+STATIC_ASSERT_ENUM_MATCH_CHANNEL_LAYOUT(CHANNEL_LAYOUT_6_1);
+STATIC_ASSERT_ENUM_MATCH_CHANNEL_LAYOUT(CHANNEL_LAYOUT_6_1_BACK);
+STATIC_ASSERT_ENUM_MATCH_CHANNEL_LAYOUT(CHANNEL_LAYOUT_6_1_FRONT);
+STATIC_ASSERT_ENUM_MATCH_CHANNEL_LAYOUT(CHANNEL_LAYOUT_7_0_FRONT);
+STATIC_ASSERT_ENUM_MATCH_CHANNEL_LAYOUT(CHANNEL_LAYOUT_7_1_WIDE_BACK);
+STATIC_ASSERT_ENUM_MATCH_CHANNEL_LAYOUT(CHANNEL_LAYOUT_OCTAGONAL);
+STATIC_ASSERT_ENUM_MATCH_CHANNEL_LAYOUT(CHANNEL_LAYOUT_DISCRETE);
+STATIC_ASSERT_ENUM_MATCH_CHANNEL_LAYOUT(CHANNEL_LAYOUT_STEREO_AND_KEYBOARD_MIC);
+STATIC_ASSERT_ENUM_MATCH_CHANNEL_LAYOUT(CHANNEL_LAYOUT_4_1_QUAD_SIDE);
+
+AudioConfig::AudioConfig()
+ : codec_(kUnknownAudioCodec),
+ channel_layout_(CHANNEL_LAYOUT_UNSUPPORTED),
+ channel_number_(0),
+ bytes_per_channel_(0),
+ samples_per_second_(0),
+ is_encrypted_(false) {}
+
+AudioConfig::AudioConfig(Codec codec,
+ ChannelLayout channel_layout,
+ int channel_number,
+ int bytes_per_channel,
+ int samples_per_second,
+ const uint8* extra_data,
+ size_t extra_data_size,
+ bool is_encrypted) {
+ Initialize(codec, channel_layout, channel_number,
+ bytes_per_channel, samples_per_second,
+ extra_data, extra_data_size, is_encrypted);
+}
+
+void AudioConfig::Initialize(Codec codec,
+ ChannelLayout channel_layout,
+ int channel_number,
+ int bytes_per_channel,
+ int samples_per_second,
+ const uint8* extra_data,
+ size_t extra_data_size,
+ bool is_encrypted) {
+ DCHECK((extra_data_size != 0) == (extra_data != NULL));
+
+ codec_ = codec;
+ channel_layout_ = channel_layout;
+ channel_number_ = channel_number;
+ bytes_per_channel_ = bytes_per_channel;
+ samples_per_second_ = samples_per_second;
+ extra_data_.assign(extra_data, extra_data + extra_data_size);
+ is_encrypted_ = is_encrypted;
+}
+
+AudioConfig::~AudioConfig() {}
+
+bool AudioConfig::IsValidConfig() const {
+ return codec_ != kUnknownAudioCodec &&
+ channel_layout_ != CHANNEL_LAYOUT_UNSUPPORTED &&
+ bytes_per_channel_ > 0 &&
+ bytes_per_channel_ <= kMaxBytesPerSample &&
+ samples_per_second_ > 0 &&
+ samples_per_second_ <= kMaxSampleRate;
+}
+
+bool AudioConfig::Matches(const AudioConfig& config) const {
+ return ((codec() == config.codec()) &&
+ (bytes_per_channel() == config.bytes_per_channel()) &&
+ (channel_number() == config.channel_number()) &&
+ (channel_layout() == config.channel_layout()) &&
+ (samples_per_second() == config.samples_per_second()) &&
+ (extra_data_size() == config.extra_data_size()) &&
+ (!extra_data() || !memcmp(extra_data(), config.extra_data(),
+ extra_data_size())) &&
+ (is_encrypted() == config.is_encrypted()));
+}
+
+std::string AudioConfig::AsHumanReadableString() const {
+ std::ostringstream s;
+ s << "codec: " << GetHumanReadableCodecName()
+ << " bytes_per_channel: " << bytes_per_channel()
+ << " channel_layout: " << channel_layout()
+ << " channel_number: " << channel_number()
+ << " samples_per_second: " << samples_per_second()
+ << " has extra data? " << (extra_data() ? "true" : "false")
+ << " encrypted? " << (is_encrypted() ? "true" : "false");
+ return s.str();
+}
+
+// These names come from src/third_party/ffmpeg/libavcodec/codec_desc.c
+std::string AudioConfig::GetHumanReadableCodecName() const {
+ switch (codec()) {
+ case kUnknownAudioCodec:
+ return "unknown";
+ case kCodecAAC:
+ return "aac";
+ case kCodecMP3:
+ return "mp3";
+ case kCodecPCM:
+ case kCodecPCM_S16BE:
+ case kCodecPCM_S24BE:
+ return "pcm";
+ case kCodecVorbis:
+ return "vorbis";
+ case kCodecFLAC:
+ return "flac";
+ case kCodecAMR_NB:
+ return "amr_nb";
+ case kCodecAMR_WB:
+ return "amr_wb";
+ case kCodecGSM_MS:
+ return "gsm_ms";
+ case kCodecPCM_ALAW:
+ return "pcm_alaw";
+ case kCodecPCM_MULAW:
+ return "pcm_mulaw";
+ case kCodecOpus:
+ return "opus";
+ case kCodecALAC:
+ return "alac";
+ }
+ NOTREACHED();
+ return "";
+}
+
+} // namespace media
+} // namespace chromecast

Powered by Google App Engine
This is Rietveld 408576698