From d118544f749bae18a188141edba216fed9163eba Mon Sep 17 00:00:00 2001 From: henryhsu Date: Thu, 9 Apr 2015 23:39:14 -0700 Subject: Add VDA supported profile to GPUInfo Different CrOS devices have different supported decode profiles. Add VDA supported profile to GPUInfo so this can be detected in runtime. This is also the preparation of removing --ignore-resolution-limits-for-accelerated-video-decode flag. BUG=350197 TEST=Play a video on Exynos and Intel CrOS devices and make sure Media.GpuVideoDecoderInitializeStatus is 0. Review URL: https://codereview.chromium.org/795633005 Cr-Commit-Position: refs/heads/master@{#324596} --- gpu/config/gpu_info.cc | 40 ++++++++++++++++++++++++++-------------- gpu/config/gpu_info.h | 20 +++++++++++++++++++- gpu/config/gpu_info_collector.cc | 2 ++ gpu/config/gpu_info_unittest.cc | 1 + 4 files changed, 48 insertions(+), 15 deletions(-) (limited to 'gpu') diff --git a/gpu/config/gpu_info.cc b/gpu/config/gpu_info.cc index 3653a10..85d26fb 100644 --- a/gpu/config/gpu_info.cc +++ b/gpu/config/gpu_info.cc @@ -6,8 +6,8 @@ namespace { -void EnumerateGPUDevice(gpu::GPUInfo::Enumerator* enumerator, - const gpu::GPUInfo::GPUDevice& device) { +void EnumerateGPUDevice(const gpu::GPUInfo::GPUDevice& device, + gpu::GPUInfo::Enumerator* enumerator) { enumerator->BeginGPUDevice(); enumerator->AddInt("vendorId", device.vendor_id); enumerator->AddInt("deviceId", device.device_id); @@ -17,9 +17,21 @@ void EnumerateGPUDevice(gpu::GPUInfo::Enumerator* enumerator, enumerator->EndGPUDevice(); } +void EnumerateVideoDecodeAcceleratorSupportedProfile( + const gpu::VideoDecodeAcceleratorSupportedProfile& profile, + gpu::GPUInfo::Enumerator* enumerator) { + enumerator->BeginVideoDecodeAcceleratorSupportedProfile(); + enumerator->AddInt("profile", profile.profile); + enumerator->AddInt("maxResolutionWidth", profile.max_resolution.width()); + enumerator->AddInt("maxResolutionHeight", profile.max_resolution.height()); + enumerator->AddInt("minResolutionWidth", profile.min_resolution.width()); + enumerator->AddInt("minResolutionHeight", profile.min_resolution.height()); + enumerator->EndVideoDecodeAcceleratorSupportedProfile(); +} + void EnumerateVideoEncodeAcceleratorSupportedProfile( - gpu::GPUInfo::Enumerator* enumerator, - const gpu::VideoEncodeAcceleratorSupportedProfile profile) { + const gpu::VideoEncodeAcceleratorSupportedProfile& profile, + gpu::GPUInfo::Enumerator* enumerator) { enumerator->BeginVideoEncodeAcceleratorSupportedProfile(); enumerator->AddInt("profile", profile.profile); enumerator->AddInt("maxResolutionWidth", profile.max_resolution.width()); @@ -101,7 +113,9 @@ void GPUInfo::EnumerateFields(Enumerator* enumerator) const { CollectInfoResult dx_diagnostics_info_state; DxDiagNode dx_diagnostics; #endif - std::vector + VideoDecodeAcceleratorSupportedProfiles + video_decode_accelerator_supported_profiles; + VideoEncodeAcceleratorSupportedProfiles video_encode_accelerator_supported_profiles; }; @@ -115,10 +129,9 @@ void GPUInfo::EnumerateFields(Enumerator* enumerator) const { // Required fields (according to DevTools protocol) first. enumerator->AddString("machineModelName", machine_model_name); enumerator->AddString("machineModelVersion", machine_model_version); - EnumerateGPUDevice(enumerator, gpu); - for (size_t ii = 0; ii < secondary_gpus.size(); ++ii) { - EnumerateGPUDevice(enumerator, secondary_gpus[ii]); - } + EnumerateGPUDevice(gpu, enumerator); + for (const auto& secondary_gpu: secondary_gpus) + EnumerateGPUDevice(secondary_gpu, enumerator); enumerator->BeginAuxAttributes(); enumerator->AddTimeDeltaInSecondsF("initializationTime", @@ -159,11 +172,10 @@ void GPUInfo::EnumerateFields(Enumerator* enumerator) const { enumerator->AddInt("DxDiagnosticsInfoState", dx_diagnostics_info_state); #endif // TODO(kbr): add dx_diagnostics on Windows. - for (size_t ii = 0; ii < video_encode_accelerator_supported_profiles.size(); - ++ii) { - EnumerateVideoEncodeAcceleratorSupportedProfile( - enumerator, video_encode_accelerator_supported_profiles[ii]); - } + for (const auto& profile : video_decode_accelerator_supported_profiles) + EnumerateVideoDecodeAcceleratorSupportedProfile(profile, enumerator); + for (const auto& profile : video_encode_accelerator_supported_profiles) + EnumerateVideoEncodeAcceleratorSupportedProfile(profile, enumerator); enumerator->EndAuxAttributes(); } diff --git a/gpu/config/gpu_info.h b/gpu/config/gpu_info.h index cbd8361..f377698 100644 --- a/gpu/config/gpu_info.h +++ b/gpu/config/gpu_info.h @@ -54,6 +54,15 @@ enum VideoCodecProfile { VIDEO_CODEC_PROFILE_MAX = VP9PROFILE_ANY, }; +// Specification of a decoding profile supported by a hardware decoder. +struct GPU_EXPORT VideoDecodeAcceleratorSupportedProfile { + VideoCodecProfile profile; + gfx::Size max_resolution; + gfx::Size min_resolution; +}; +using VideoDecodeAcceleratorSupportedProfiles = + std::vector; + // Specification of an encoding profile supported by a hardware encoder. struct GPU_EXPORT VideoEncodeAcceleratorSupportedProfile { VideoCodecProfile profile; @@ -61,6 +70,8 @@ struct GPU_EXPORT VideoEncodeAcceleratorSupportedProfile { uint32 max_framerate_numerator; uint32 max_framerate_denominator; }; +using VideoEncodeAcceleratorSupportedProfiles = + std::vector; struct GPU_EXPORT GPUInfo { struct GPU_EXPORT GPUDevice { @@ -206,7 +217,9 @@ struct GPU_EXPORT GPUInfo { DxDiagNode dx_diagnostics; #endif - std::vector + VideoDecodeAcceleratorSupportedProfiles + video_decode_accelerator_supported_profiles; + VideoEncodeAcceleratorSupportedProfiles video_encode_accelerator_supported_profiles; // Note: when adding new members, please remember to update EnumerateFields // in gpu_info.cc. @@ -232,6 +245,11 @@ struct GPU_EXPORT GPUInfo { virtual void BeginGPUDevice() = 0; virtual void EndGPUDevice() = 0; + // Markers indicating that a VideoDecodeAcceleratorSupportedProfile is + // being described. + virtual void BeginVideoDecodeAcceleratorSupportedProfile() = 0; + virtual void EndVideoDecodeAcceleratorSupportedProfile() = 0; + // Markers indicating that a VideoEncodeAcceleratorSupportedProfile is // being described. virtual void BeginVideoEncodeAcceleratorSupportedProfile() = 0; diff --git a/gpu/config/gpu_info_collector.cc b/gpu/config/gpu_info_collector.cc index c673057..2403340 100644 --- a/gpu/config/gpu_info_collector.cc +++ b/gpu/config/gpu_info_collector.cc @@ -163,6 +163,8 @@ void MergeGPUInfoGL(GPUInfo* basic_gpu_info, basic_gpu_info->direct_rendering = context_gpu_info.direct_rendering; basic_gpu_info->context_info_state = context_gpu_info.context_info_state; basic_gpu_info->initialization_time = context_gpu_info.initialization_time; + basic_gpu_info->video_decode_accelerator_supported_profiles = + context_gpu_info.video_decode_accelerator_supported_profiles; basic_gpu_info->video_encode_accelerator_supported_profiles = context_gpu_info.video_encode_accelerator_supported_profiles; } diff --git a/gpu/config/gpu_info_unittest.cc b/gpu/config/gpu_info_unittest.cc index 1d5fa6e..21dd4ff 100644 --- a/gpu/config/gpu_info_unittest.cc +++ b/gpu/config/gpu_info_unittest.cc @@ -33,6 +33,7 @@ TEST(GPUInfoBasicTest, EmptyGPUInfo) { #if defined(OS_WIN) EXPECT_EQ(gpu_info.dx_diagnostics_info_state, kCollectInfoNone); #endif + EXPECT_EQ(gpu_info.video_decode_accelerator_supported_profiles.size(), 0u); EXPECT_EQ(gpu_info.video_encode_accelerator_supported_profiles.size(), 0u); } -- cgit v1.1