Commit 42ab5e74 authored by Frank Liberato's avatar Frank Liberato Committed by Commit Bot

Send HDR output metadata even without stream metadata.

This CL causes dxva video decoder to send the output metadata for the
display, even if the stream doesn't provide metadata of its own.

For AMD cards, this CL also causes it to send empty stream metadata,
rather than omit sending it.  Otherwise, it crashes intermittently.

Bug: 1045586
Change-Id: If0a478bade4453c235f9f6d77c453e6ea3c179e2
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2020744Reviewed-by: default avatarTed Meyer <tmathmeyer@chromium.org>
Reviewed-by: default avatarZhenyao Mo <zmo@chromium.org>
Commit-Queue: Frank Liberato <liberato@chromium.org>
Cr-Commit-Position: refs/heads/master@{#737452}
parent cae4dadb
......@@ -3543,6 +3543,18 @@
"GL_EXT_memory_object_fd",
"GL_EXT_semaphore_fd"
]
},
{
"id": 332,
"cr_bugs": [1045586],
"description": "Send empty video hdr metadata due to crashes on AMD",
"os": {
"type": "win"
},
"vendor_id": "0x1002",
"features": [
"use_empty_video_hdr_metadata"
]
}
]
}
......@@ -110,6 +110,7 @@ unpack_image_height_workaround_with_unpack_buffer
unpack_overlapping_rows_separately_unpack_buffer
use_client_side_arrays_for_stream_buffers
use_copyteximage2d_instead_of_readpixels_on_multisampled_textures
use_empty_video_hdr_metadata
use_eqaa_storage_samples_2
use_es2_for_oopr
use_gpu_driver_workaround_for_testing
......
......@@ -522,7 +522,8 @@ DXVAVideoDecodeAccelerator::DXVAVideoDecodeAccelerator(
using_debug_device_(false),
enable_accelerated_vpx_decode_(
!workarounds.disable_accelerated_vpx_decode),
processing_config_changed_(false) {
processing_config_changed_(false),
use_empty_video_hdr_metadata_(workarounds.use_empty_video_hdr_metadata) {
weak_ptr_ = weak_this_factory_.GetWeakPtr();
memset(&input_stream_info_, 0, sizeof(input_stream_info_));
memset(&output_stream_info_, 0, sizeof(output_stream_info_));
......@@ -2839,15 +2840,13 @@ bool DXVAVideoDecodeAccelerator::InitializeID3D11VideoProcessor(
void DXVAVideoDecodeAccelerator::SetDX11ProcessorHDRMetadataIfNeeded() {
DCHECK(display_helper_);
// TODO: check workarounds.
// If we don't know the input metadata, then do nothing.
if (!config_.hdr_metadata)
return;
// If we don't know the input metadata, then we'll still send the
// monitor output.
// Similarly, do nothing without display metadata.
auto display_metadata = display_helper_->GetDisplayMetadata();
if (!display_metadata)
// Do nothing without display metadata.
auto dxgi_display_metadata = display_helper_->GetDisplayMetadata();
if (!dxgi_display_metadata)
return;
// If we can't get a VideoContext2, then just hope for the best.
......@@ -2855,16 +2854,25 @@ void DXVAVideoDecodeAccelerator::SetDX11ProcessorHDRMetadataIfNeeded() {
if (FAILED(video_context_.As(&video_context2)))
return;
DXGI_HDR_METADATA_HDR10 stream_metadata =
DisplayHelper::HdrMetadataToDXGI(*config_.hdr_metadata);
// If we have stream metadata, then use it. Otherwise, send in empty
// stream metadata. For the Radeon 5700, at least, this seems to do
// something sane. Not setting the metadata crashes intermittently.
if (config_.hdr_metadata || use_empty_video_hdr_metadata_) {
HDRMetadata stream_metadata;
if (config_.hdr_metadata)
stream_metadata = *config_.hdr_metadata;
DXGI_HDR_METADATA_HDR10 dxgi_stream_metadata =
DisplayHelper::HdrMetadataToDXGI(stream_metadata);
video_context2->VideoProcessorSetStreamHDRMetaData(
d3d11_processor_.Get(), 0, DXGI_HDR_METADATA_TYPE_HDR10,
sizeof(stream_metadata), &stream_metadata);
video_context2->VideoProcessorSetStreamHDRMetaData(
d3d11_processor_.Get(), 0, DXGI_HDR_METADATA_TYPE_HDR10,
sizeof(dxgi_stream_metadata), &dxgi_stream_metadata);
}
video_context2->VideoProcessorSetOutputHDRMetaData(
d3d11_processor_.Get(), DXGI_HDR_METADATA_TYPE_HDR10,
sizeof(*display_metadata), &(*display_metadata));
sizeof(*dxgi_display_metadata), &(*dxgi_display_metadata));
}
bool DXVAVideoDecodeAccelerator::GetVideoFrameDimensions(IMFSample* sample,
......
......@@ -606,6 +606,7 @@ class MEDIA_GPU_EXPORT DXVAVideoDecodeAccelerator
VideoColorSpace current_color_space_;
base::Optional<DisplayHelper> display_helper_;
bool use_empty_video_hdr_metadata_ = false;
// WeakPtrFactory for posting tasks back to |this|.
base::WeakPtrFactory<DXVAVideoDecodeAccelerator> weak_this_factory_{this};
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment