123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199 |
- // 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 "media/gpu/gpu_video_accelerator_util.h"
- namespace media {
- // Make sure the enum values of VideoCodecProfile and
- // gpu::VideoCodecProfile match.
- #define STATIC_ASSERT_ENUM_MATCH(name) \
- static_assert(name == static_cast<VideoCodecProfile>(gpu::name), \
- #name " value must match in media and gpu.")
- STATIC_ASSERT_ENUM_MATCH(VIDEO_CODEC_PROFILE_UNKNOWN);
- STATIC_ASSERT_ENUM_MATCH(VIDEO_CODEC_PROFILE_MIN);
- STATIC_ASSERT_ENUM_MATCH(H264PROFILE_BASELINE);
- STATIC_ASSERT_ENUM_MATCH(H264PROFILE_MAIN);
- STATIC_ASSERT_ENUM_MATCH(H264PROFILE_EXTENDED);
- STATIC_ASSERT_ENUM_MATCH(H264PROFILE_HIGH);
- STATIC_ASSERT_ENUM_MATCH(H264PROFILE_HIGH10PROFILE);
- STATIC_ASSERT_ENUM_MATCH(H264PROFILE_HIGH422PROFILE);
- STATIC_ASSERT_ENUM_MATCH(H264PROFILE_HIGH444PREDICTIVEPROFILE);
- STATIC_ASSERT_ENUM_MATCH(H264PROFILE_SCALABLEBASELINE);
- STATIC_ASSERT_ENUM_MATCH(H264PROFILE_SCALABLEHIGH);
- STATIC_ASSERT_ENUM_MATCH(H264PROFILE_STEREOHIGH);
- STATIC_ASSERT_ENUM_MATCH(H264PROFILE_MULTIVIEWHIGH);
- STATIC_ASSERT_ENUM_MATCH(VP8PROFILE_ANY);
- STATIC_ASSERT_ENUM_MATCH(VP9PROFILE_PROFILE0);
- STATIC_ASSERT_ENUM_MATCH(VP9PROFILE_PROFILE1);
- STATIC_ASSERT_ENUM_MATCH(VP9PROFILE_PROFILE2);
- STATIC_ASSERT_ENUM_MATCH(VP9PROFILE_PROFILE3);
- STATIC_ASSERT_ENUM_MATCH(HEVCPROFILE_MAIN);
- STATIC_ASSERT_ENUM_MATCH(HEVCPROFILE_MAIN10);
- STATIC_ASSERT_ENUM_MATCH(HEVCPROFILE_MAIN_STILL_PICTURE);
- STATIC_ASSERT_ENUM_MATCH(HEVCPROFILE_REXT);
- STATIC_ASSERT_ENUM_MATCH(HEVCPROFILE_HIGH_THROUGHPUT);
- STATIC_ASSERT_ENUM_MATCH(HEVCPROFILE_MULTIVIEW_MAIN);
- STATIC_ASSERT_ENUM_MATCH(HEVCPROFILE_SCALABLE_MAIN);
- STATIC_ASSERT_ENUM_MATCH(HEVCPROFILE_3D_MAIN);
- STATIC_ASSERT_ENUM_MATCH(HEVCPROFILE_SCREEN_EXTENDED);
- STATIC_ASSERT_ENUM_MATCH(HEVCPROFILE_SCALABLE_REXT);
- STATIC_ASSERT_ENUM_MATCH(HEVCPROFILE_HIGH_THROUGHPUT_SCREEN_EXTENDED);
- STATIC_ASSERT_ENUM_MATCH(DOLBYVISION_PROFILE0);
- STATIC_ASSERT_ENUM_MATCH(DOLBYVISION_PROFILE4);
- STATIC_ASSERT_ENUM_MATCH(DOLBYVISION_PROFILE5);
- STATIC_ASSERT_ENUM_MATCH(DOLBYVISION_PROFILE7);
- STATIC_ASSERT_ENUM_MATCH(DOLBYVISION_PROFILE8);
- STATIC_ASSERT_ENUM_MATCH(DOLBYVISION_PROFILE9);
- STATIC_ASSERT_ENUM_MATCH(AV1PROFILE_PROFILE_MAIN);
- STATIC_ASSERT_ENUM_MATCH(AV1PROFILE_PROFILE_HIGH);
- STATIC_ASSERT_ENUM_MATCH(AV1PROFILE_PROFILE_PRO);
- STATIC_ASSERT_ENUM_MATCH(VIDEO_CODEC_PROFILE_MAX);
- // static
- VideoDecodeAccelerator::Capabilities
- GpuVideoAcceleratorUtil::ConvertGpuToMediaDecodeCapabilities(
- const gpu::VideoDecodeAcceleratorCapabilities& gpu_capabilities) {
- VideoDecodeAccelerator::Capabilities capabilities;
- capabilities.supported_profiles =
- ConvertGpuToMediaDecodeProfiles(gpu_capabilities.supported_profiles);
- capabilities.flags = gpu_capabilities.flags;
- return capabilities;
- }
- // static
- VideoDecodeAccelerator::SupportedProfiles
- GpuVideoAcceleratorUtil::ConvertGpuToMediaDecodeProfiles(
- const gpu::VideoDecodeAcceleratorSupportedProfiles& gpu_profiles) {
- VideoDecodeAccelerator::SupportedProfiles profiles;
- for (const auto& gpu_profile : gpu_profiles) {
- VideoDecodeAccelerator::SupportedProfile profile;
- profile.profile = static_cast<VideoCodecProfile>(gpu_profile.profile);
- profile.max_resolution = gpu_profile.max_resolution;
- profile.min_resolution = gpu_profile.min_resolution;
- profile.encrypted_only = gpu_profile.encrypted_only;
- profiles.push_back(profile);
- }
- return profiles;
- }
- // static
- gpu::VideoDecodeAcceleratorCapabilities
- GpuVideoAcceleratorUtil::ConvertMediaToGpuDecodeCapabilities(
- const VideoDecodeAccelerator::Capabilities& media_capabilities) {
- gpu::VideoDecodeAcceleratorCapabilities capabilities;
- capabilities.supported_profiles =
- ConvertMediaToGpuDecodeProfiles(media_capabilities.supported_profiles);
- capabilities.flags = media_capabilities.flags;
- return capabilities;
- }
- // static
- gpu::VideoDecodeAcceleratorSupportedProfiles
- GpuVideoAcceleratorUtil::ConvertMediaToGpuDecodeProfiles(
- const VideoDecodeAccelerator::SupportedProfiles& media_profiles) {
- gpu::VideoDecodeAcceleratorSupportedProfiles profiles;
- for (const auto& media_profile : media_profiles) {
- gpu::VideoDecodeAcceleratorSupportedProfile profile;
- profile.profile =
- static_cast<gpu::VideoCodecProfile>(media_profile.profile);
- profile.max_resolution = media_profile.max_resolution;
- profile.min_resolution = media_profile.min_resolution;
- profile.encrypted_only = media_profile.encrypted_only;
- profiles.push_back(profile);
- }
- return profiles;
- }
- // static
- gpu::VideoDecodeAcceleratorSupportedProfiles
- GpuVideoAcceleratorUtil::ConvertMediaConfigsToGpuDecodeProfiles(
- const SupportedVideoDecoderConfigs& configs) {
- gpu::VideoDecodeAcceleratorSupportedProfiles profiles;
- for (const auto& config : configs) {
- for (int i = config.profile_min; i <= config.profile_max; i++) {
- gpu::VideoDecodeAcceleratorSupportedProfile profile;
- profile.profile = static_cast<gpu::VideoCodecProfile>(i);
- profile.min_resolution = config.coded_size_min;
- profile.max_resolution = config.coded_size_max;
- profile.encrypted_only = config.require_encrypted;
- profiles.push_back(profile);
- }
- }
- return profiles;
- }
- // static
- VideoEncodeAccelerator::SupportedProfiles
- GpuVideoAcceleratorUtil::ConvertGpuToMediaEncodeProfiles(
- const gpu::VideoEncodeAcceleratorSupportedProfiles& gpu_profiles) {
- VideoEncodeAccelerator::SupportedProfiles profiles;
- for (const auto& gpu_profile : gpu_profiles) {
- VideoEncodeAccelerator::SupportedProfile profile;
- profile.profile = static_cast<VideoCodecProfile>(gpu_profile.profile);
- profile.min_resolution = gpu_profile.min_resolution;
- profile.max_resolution = gpu_profile.max_resolution;
- profile.max_framerate_numerator = gpu_profile.max_framerate_numerator;
- profile.max_framerate_denominator = gpu_profile.max_framerate_denominator;
- // If VBR is supported in the future, remove this hard-coding of CBR.
- profile.rate_control_modes = media::VideoEncodeAccelerator::kConstantMode;
- profiles.push_back(profile);
- }
- return profiles;
- }
- // static
- gpu::VideoEncodeAcceleratorSupportedProfiles
- GpuVideoAcceleratorUtil::ConvertMediaToGpuEncodeProfiles(
- const VideoEncodeAccelerator::SupportedProfiles& media_profiles) {
- gpu::VideoEncodeAcceleratorSupportedProfiles profiles;
- for (const auto& media_profile : media_profiles) {
- gpu::VideoEncodeAcceleratorSupportedProfile profile;
- profile.profile =
- static_cast<gpu::VideoCodecProfile>(media_profile.profile);
- profile.min_resolution = media_profile.min_resolution;
- profile.max_resolution = media_profile.max_resolution;
- profile.max_framerate_numerator = media_profile.max_framerate_numerator;
- profile.max_framerate_denominator = media_profile.max_framerate_denominator;
- profiles.push_back(profile);
- }
- return profiles;
- }
- // static
- void GpuVideoAcceleratorUtil::InsertUniqueDecodeProfiles(
- const VideoDecodeAccelerator::SupportedProfiles& new_profiles,
- VideoDecodeAccelerator::SupportedProfiles* media_profiles) {
- for (const auto& profile : new_profiles) {
- bool duplicate = false;
- for (const auto& media_profile : *media_profiles) {
- if (media_profile.profile == profile.profile) {
- duplicate = true;
- break;
- }
- }
- if (!duplicate)
- media_profiles->push_back(profile);
- }
- }
- // static
- void GpuVideoAcceleratorUtil::InsertUniqueEncodeProfiles(
- const VideoEncodeAccelerator::SupportedProfiles& new_profiles,
- VideoEncodeAccelerator::SupportedProfiles* media_profiles) {
- for (const auto& profile : new_profiles) {
- bool duplicate = false;
- for (const auto& media_profile : *media_profiles) {
- if (media_profile == profile) {
- duplicate = true;
- break;
- }
- }
- if (!duplicate)
- media_profiles->push_back(profile);
- }
- }
- } // namespace media
|