| // Copyright 2019 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/windows/d3d11_video_device_format_support.h" |
| |
| namespace media { |
| |
| FormatSupportChecker::FormatSupportChecker(ComD3D11Device device) |
| : device_(std::move(device)) { |
| } |
| |
| FormatSupportChecker::~FormatSupportChecker() { |
| if (initialized_) |
| enumerator_.Reset(); |
| device_.Reset(); |
| } |
| |
| bool FormatSupportChecker::Initialize() { |
| ComD3D11VideoDevice v_device; |
| if (!device_) |
| return false; |
| |
| if (!SUCCEEDED(device_.As(&v_device))) |
| return false; |
| |
| // The values here should have _no_ effect on supported profiles, but they |
| // are needed anyway for initialization. |
| D3D11_VIDEO_PROCESSOR_CONTENT_DESC desc; |
| desc.InputFrameFormat = D3D11_VIDEO_FRAME_FORMAT_PROGRESSIVE; |
| desc.InputFrameRate.Numerator = 60; |
| desc.InputFrameRate.Denominator = 1; |
| desc.InputWidth = 1920; |
| desc.InputHeight = 1080; |
| desc.OutputFrameRate.Numerator = 60; |
| desc.OutputFrameRate.Denominator = 1; |
| desc.OutputWidth = 1920; |
| desc.OutputHeight = 1080; |
| desc.Usage = D3D11_VIDEO_USAGE_PLAYBACK_NORMAL; |
| |
| if (!SUCCEEDED(v_device->CreateVideoProcessorEnumerator(&desc, &enumerator_))) |
| return false; |
| |
| // For tests, which don't provide one (successfully). |
| if (!enumerator_) |
| return false; |
| |
| // Check that the |CheckFormatSupport| and |CheckVideoProcessorFormat| calls |
| // won't be failing |
| UINT unneeded = 0; |
| DXGI_FORMAT example = DXGI_FORMAT_NV12; |
| if (!SUCCEEDED(device_->CheckFormatSupport(example, &unneeded))) |
| return false; |
| |
| if (!SUCCEEDED(enumerator_->CheckVideoProcessorFormat(example, &unneeded))) |
| return false; |
| |
| initialized_ = true; |
| return true; |
| } |
| |
| bool FormatSupportChecker::CheckOutputFormatSupport(DXGI_FORMAT format) const { |
| if (!device_) |
| return false; |
| |
| DCHECK(initialized_); |
| |
| UINT device = 0, enumerator = 0; |
| if (!SUCCEEDED(device_->CheckFormatSupport(format, &device))) |
| return false; |
| if (!SUCCEEDED(enumerator_->CheckVideoProcessorFormat(format, &enumerator))) |
| return false; |
| |
| return (enumerator & D3D11_VIDEO_PROCESSOR_FORMAT_SUPPORT_OUTPUT) && |
| (device & D3D11_FORMAT_SUPPORT_VIDEO_PROCESSOR_OUTPUT); |
| } |
| |
| } // namespace media |