| Index: chromecast/media/cma/public/video_config.cc
|
| diff --git a/chromecast/media/cma/public/video_config.cc b/chromecast/media/cma/public/video_config.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..0cfb004b8e5737402244fec0e72b63c957b5bfcc
|
| --- /dev/null
|
| +++ b/chromecast/media/cma/public/video_config.cc
|
| @@ -0,0 +1,126 @@
|
| +// Copyright 2015 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/video_config.h"
|
| +
|
| +#include "media/base/video_decoder_config.h"
|
| +
|
| +// Make sure the enum values of media::VideoCodec and
|
| +// chromecast::media::VideoConfig::Codec are matched.
|
| +#define STATIC_ASSERT_ENUM_MATCH_CODEC(name) \
|
| + static_assert( \
|
| + ::media::name == static_cast< ::media::VideoCodec>( \
|
| + chromecast::media::VideoConfig::name), \
|
| + #name " value must match in media and chromecast::media::VideoConfig.")
|
| +
|
| +// Make sure the enum values of media::VideoCodecProfile and
|
| +// chromecast::media::VideoConfig::CodecProfile are matched.
|
| +#define STATIC_ASSERT_ENUM_MATCH_CODEC_PROFILE(name) \
|
| + static_assert( \
|
| + ::media::name == static_cast< ::media::VideoCodecProfile>( \
|
| + chromecast::media::VideoConfig::name), \
|
| + #name " value must match in media and chromecast::media::VideoConfig.")
|
| +
|
| +namespace chromecast {
|
| +namespace media {
|
| +
|
| +STATIC_ASSERT_ENUM_MATCH_CODEC(kUnknownVideoCodec);
|
| +STATIC_ASSERT_ENUM_MATCH_CODEC(kCodecH264);
|
| +STATIC_ASSERT_ENUM_MATCH_CODEC(kCodecVC1);
|
| +STATIC_ASSERT_ENUM_MATCH_CODEC(kCodecMPEG2);
|
| +STATIC_ASSERT_ENUM_MATCH_CODEC(kCodecMPEG4);
|
| +STATIC_ASSERT_ENUM_MATCH_CODEC(kCodecTheora);
|
| +STATIC_ASSERT_ENUM_MATCH_CODEC(kCodecVP8);
|
| +STATIC_ASSERT_ENUM_MATCH_CODEC(kCodecVP9);
|
| +
|
| +STATIC_ASSERT_ENUM_MATCH_CODEC_PROFILE(VIDEO_CODEC_PROFILE_UNKNOWN);
|
| +STATIC_ASSERT_ENUM_MATCH_CODEC_PROFILE(VIDEO_CODEC_PROFILE_MIN);
|
| +STATIC_ASSERT_ENUM_MATCH_CODEC_PROFILE(H264PROFILE_BASELINE);
|
| +STATIC_ASSERT_ENUM_MATCH_CODEC_PROFILE(H264PROFILE_MAIN);
|
| +STATIC_ASSERT_ENUM_MATCH_CODEC_PROFILE(H264PROFILE_EXTENDED);
|
| +STATIC_ASSERT_ENUM_MATCH_CODEC_PROFILE(H264PROFILE_HIGH);
|
| +STATIC_ASSERT_ENUM_MATCH_CODEC_PROFILE(H264PROFILE_HIGH10PROFILE);
|
| +STATIC_ASSERT_ENUM_MATCH_CODEC_PROFILE(H264PROFILE_HIGH422PROFILE);
|
| +STATIC_ASSERT_ENUM_MATCH_CODEC_PROFILE(H264PROFILE_HIGH444PREDICTIVEPROFILE);
|
| +STATIC_ASSERT_ENUM_MATCH_CODEC_PROFILE(H264PROFILE_SCALABLEBASELINE);
|
| +STATIC_ASSERT_ENUM_MATCH_CODEC_PROFILE(H264PROFILE_SCALABLEHIGH);
|
| +STATIC_ASSERT_ENUM_MATCH_CODEC_PROFILE(H264PROFILE_STEREOHIGH);
|
| +STATIC_ASSERT_ENUM_MATCH_CODEC_PROFILE(H264PROFILE_MULTIVIEWHIGH);
|
| +STATIC_ASSERT_ENUM_MATCH_CODEC_PROFILE(VP8PROFILE_ANY);
|
| +STATIC_ASSERT_ENUM_MATCH_CODEC_PROFILE(VP9PROFILE_ANY);
|
| +
|
| +VideoConfig::VideoConfig()
|
| + : codec_(kUnknownVideoCodec),
|
| + profile_(VIDEO_CODEC_PROFILE_UNKNOWN),
|
| + is_encrypted_(false) {
|
| +}
|
| +
|
| +VideoConfig::VideoConfig(Codec codec,
|
| + CodecProfile profile,
|
| + const uint8* extra_data,
|
| + size_t extra_data_size,
|
| + bool is_encrypted) {
|
| + Initialize(codec, profile, extra_data, extra_data_size, is_encrypted);
|
| +}
|
| +
|
| +VideoConfig::~VideoConfig() {}
|
| +
|
| +void VideoConfig::Initialize(Codec codec,
|
| + CodecProfile profile,
|
| + const uint8* extra_data,
|
| + size_t extra_data_size,
|
| + bool is_encrypted) {
|
| + codec_ = codec;
|
| + profile_ = profile;
|
| + is_encrypted_ = is_encrypted;
|
| + extra_data_.assign(extra_data, extra_data + extra_data_size);
|
| +}
|
| +
|
| +bool VideoConfig::IsValidConfig() const {
|
| + return (codec_ != kUnknownVideoCodec);
|
| +}
|
| +
|
| +bool VideoConfig::Matches(const VideoConfig& config) const {
|
| + return ((codec() == config.codec()) &&
|
| + (profile() == config.profile()) &&
|
| + (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 VideoConfig::AsHumanReadableString() const {
|
| + std::ostringstream s;
|
| + s << "codec: " << GetHumanReadableCodecName()
|
| + << " profile: " << profile()
|
| + << " has extra data? " << (extra_data() ? "true" : "false")
|
| + << " encrypted? " << (is_encrypted() ? "true" : "false");
|
| + return s.str();
|
| +}
|
| +
|
| +std::string VideoConfig::GetHumanReadableCodecName() const {
|
| + switch (codec()) {
|
| + case kUnknownVideoCodec:
|
| + return "unknown";
|
| + case kCodecH264:
|
| + return "h264";
|
| + case kCodecVC1:
|
| + return "vc1";
|
| + case kCodecMPEG2:
|
| + return "mpeg2video";
|
| + case kCodecMPEG4:
|
| + return "mpeg4";
|
| + case kCodecTheora:
|
| + return "theora";
|
| + case kCodecVP8:
|
| + return "vp8";
|
| + case kCodecVP9:
|
| + return "vp9";
|
| + }
|
| + NOTREACHED();
|
| + return "";
|
| +}
|
| +
|
| +} // namespace media
|
| +} // namespace chromecast
|
|
|