// Copyright 2017 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 "media/blink/webmediacapabilitiesclient_impl.h" #include "media/base/audio_codecs.h" #include "media/base/decode_capabilities.h" #include "media/base/mime_util.h" #include "media/base/video_codecs.h" #include "media/base/video_color_space.h" #include "third_party/WebKit/public/platform/modules/media_capabilities/WebAudioConfiguration.h" #include "third_party/WebKit/public/platform/modules/media_capabilities/WebMediaCapabilitiesInfo.h" #include "third_party/WebKit/public/platform/modules/media_capabilities/WebMediaConfiguration.h" #include "third_party/WebKit/public/platform/modules/media_capabilities/WebVideoConfiguration.h" namespace media { WebMediaCapabilitiesClientImpl::WebMediaCapabilitiesClientImpl() = default; WebMediaCapabilitiesClientImpl::~WebMediaCapabilitiesClientImpl() = default; void WebMediaCapabilitiesClientImpl::DecodingInfo( const blink::WebMediaConfiguration& configuration, std::unique_ptr callbacks) { std::unique_ptr info( new blink::WebMediaCapabilitiesInfo()); bool audio_supported = true; bool video_supported = true; if (configuration.audio_configuration) { const blink::WebAudioConfiguration& audio_config = configuration.audio_configuration.value(); AudioCodec audio_codec; bool is_audio_codec_ambiguous; if (!ParseAudioCodecString(audio_config.mime_type.Ascii(), audio_config.codec.Ascii(), &is_audio_codec_ambiguous, &audio_codec)) { // TODO(chcunningham): Replace this and other DVLOGs here with MEDIA_LOG. // MediaCapabilities may need its own tab in chrome://media-internals. DVLOG(2) << __func__ << " Failed to parse audio codec string:" << audio_config.codec.Ascii(); audio_supported = false; } else if (is_audio_codec_ambiguous) { DVLOG(2) << __func__ << " Invalid (ambiguous) audio codec string:" << audio_config.codec.Ascii(); audio_supported = false; } else { AudioConfig audio_config = {audio_codec}; audio_supported = IsSupportedAudioConfig(audio_config); } } if (configuration.video_configuration) { const blink::WebVideoConfiguration& video_config = configuration.video_configuration.value(); VideoCodec video_codec; VideoCodecProfile video_profile; uint8_t video_level; VideoColorSpace video_color_space; bool is_video_codec_ambiguous; if (!ParseVideoCodecString( video_config.mime_type.Ascii(), video_config.codec.Ascii(), &is_video_codec_ambiguous, &video_codec, &video_profile, &video_level, &video_color_space)) { DVLOG(2) << __func__ << " Failed to parse video codec string:" << video_config.codec.Ascii(); video_supported = false; } else if (is_video_codec_ambiguous) { DVLOG(2) << __func__ << " Invalid (ambiguous) video codec string:" << video_config.codec.Ascii(); video_supported = false; } else { VideoConfig video_config = {video_codec, video_profile, video_level, video_color_space}; video_supported = IsSupportedVideoConfig(video_config); } } info->supported = audio_supported && video_supported; // TODO(chcunningham, mlamouri): real implementation for these. info->smooth = info->power_efficient = info->supported; callbacks->OnSuccess(std::move(info)); } } // namespace media