| Index: content/common/gpu/media/dxva_video_decode_accelerator_win.cc
|
| diff --git a/content/common/gpu/media/dxva_video_decode_accelerator_win.cc b/content/common/gpu/media/dxva_video_decode_accelerator_win.cc
|
| index fb6e38132279481da687c98c18e0538e85819872..af0285bfbed15a3d19cc5acd912482018e791c6d 100644
|
| --- a/content/common/gpu/media/dxva_video_decode_accelerator_win.cc
|
| +++ b/content/common/gpu/media/dxva_video_decode_accelerator_win.cc
|
| @@ -848,8 +848,8 @@ DXVAVideoDecodeAccelerator::PendingSampleInfo::PendingSampleInfo(
|
| DXVAVideoDecodeAccelerator::PendingSampleInfo::~PendingSampleInfo() {}
|
|
|
| DXVAVideoDecodeAccelerator::DXVAVideoDecodeAccelerator(
|
| - const base::Callback<bool(void)>& make_context_current,
|
| - gfx::GLContext* gl_context,
|
| + const GetGLContextCallback& get_gl_context_cb,
|
| + const MakeGLContextCurrentCallback& make_context_current_cb,
|
| bool enable_accelerated_vpx_decode)
|
| : client_(NULL),
|
| dev_manager_reset_token_(0),
|
| @@ -859,14 +859,14 @@ DXVAVideoDecodeAccelerator::DXVAVideoDecodeAccelerator(
|
| pictures_requested_(false),
|
| inputs_before_decode_(0),
|
| sent_drain_message_(false),
|
| - make_context_current_(make_context_current),
|
| + get_gl_context_cb_(get_gl_context_cb),
|
| + make_context_current_cb_(make_context_current_cb),
|
| codec_(media::kUnknownVideoCodec),
|
| decoder_thread_("DXVAVideoDecoderThread"),
|
| pending_flush_(false),
|
| use_dx11_(false),
|
| use_keyed_mutex_(false),
|
| dx11_video_format_converter_media_type_needs_init_(true),
|
| - gl_context_(gl_context),
|
| using_angle_device_(false),
|
| enable_accelerated_vpx_decode_(enable_accelerated_vpx_decode),
|
| weak_this_factory_(this) {
|
| @@ -881,6 +881,11 @@ DXVAVideoDecodeAccelerator::~DXVAVideoDecodeAccelerator() {
|
|
|
| bool DXVAVideoDecodeAccelerator::Initialize(const Config& config,
|
| Client* client) {
|
| + if (get_gl_context_cb_.is_null() || make_context_current_cb_.is_null()) {
|
| + NOTREACHED() << "GL callbacks are required for this VDA";
|
| + return false;
|
| + }
|
| +
|
| if (config.is_encrypted) {
|
| NOTREACHED() << "Encrypted streams are not supported for this VDA";
|
| return false;
|
| @@ -1248,7 +1253,7 @@ void DXVAVideoDecodeAccelerator::ReusePictureBuffer(int32_t picture_buffer_id) {
|
| base::Unretained(this)));
|
| }
|
| } else {
|
| - RETURN_AND_NOTIFY_ON_FAILURE(make_context_current_.Run(),
|
| + RETURN_AND_NOTIFY_ON_FAILURE(make_context_current_cb_.Run(),
|
| "Failed to make context current",
|
| PLATFORM_FAILURE, );
|
| it->second->ResetReuseFence();
|
| @@ -1270,7 +1275,7 @@ void DXVAVideoDecodeAccelerator::WaitForOutputBuffer(int32_t picture_buffer_id,
|
| DCHECK(picture_buffer->waiting_to_reuse());
|
|
|
| gfx::GLFence* fence = picture_buffer->reuse_fence();
|
| - RETURN_AND_NOTIFY_ON_FAILURE(make_context_current_.Run(),
|
| + RETURN_AND_NOTIFY_ON_FAILURE(make_context_current_cb_.Run(),
|
| "Failed to make context current",
|
| PLATFORM_FAILURE, );
|
| if (count <= kMaxIterationsForANGLEReuseFlush && !fence->HasCompleted()) {
|
| @@ -1364,7 +1369,9 @@ void DXVAVideoDecodeAccelerator::Destroy() {
|
| delete this;
|
| }
|
|
|
| -bool DXVAVideoDecodeAccelerator::CanDecodeOnIOThread() {
|
| +bool DXVAVideoDecodeAccelerator::TryToSetupDecodeOnSeparateThread(
|
| + const base::WeakPtr<Client>& decode_client,
|
| + const scoped_refptr<base::SingleThreadTaskRunner>& decode_task_runner) {
|
| return false;
|
| }
|
|
|
| @@ -1697,15 +1704,16 @@ bool DXVAVideoDecodeAccelerator::CheckDecoderDxvaSupport() {
|
| DVLOG(1) << "Failed to set Low latency mode on decoder. Error: " << hr;
|
| }
|
|
|
| + auto gl_context = get_gl_context_cb_.Run();
|
| + RETURN_ON_FAILURE(gl_context, "Couldn't get GL context", false);
|
| +
|
| // The decoder should use DX11 iff
|
| // 1. The underlying H/W decoder supports it.
|
| // 2. We have a pointer to the MFCreateDXGIDeviceManager function needed for
|
| // this. This should always be true for Windows 8+.
|
| // 3. ANGLE is using DX11.
|
| - DCHECK(gl_context_);
|
| if (create_dxgi_device_manager_ &&
|
| - (gl_context_->GetGLRenderer().find("Direct3D11") !=
|
| - std::string::npos)) {
|
| + (gl_context->GetGLRenderer().find("Direct3D11") != std::string::npos)) {
|
| UINT32 dx11_aware = 0;
|
| attributes->GetUINT32(MF_SA_D3D11_AWARE, &dx11_aware);
|
| use_dx11_ = !!dx11_aware;
|
| @@ -1907,8 +1915,9 @@ void DXVAVideoDecodeAccelerator::ProcessPendingSamples() {
|
| if (!output_picture_buffers_.size())
|
| return;
|
|
|
| - RETURN_AND_NOTIFY_ON_FAILURE(make_context_current_.Run(),
|
| - "Failed to make context current", PLATFORM_FAILURE,);
|
| + RETURN_AND_NOTIFY_ON_FAILURE(make_context_current_cb_.Run(),
|
| + "Failed to make context current",
|
| + PLATFORM_FAILURE, );
|
|
|
| OutputBuffers::iterator index;
|
|
|
| @@ -2004,7 +2013,7 @@ void DXVAVideoDecodeAccelerator::Invalidate() {
|
| return;
|
|
|
| // Best effort to make the GL context current.
|
| - make_context_current_.Run();
|
| + make_context_current_cb_.Run();
|
|
|
| decoder_thread_.Stop();
|
| weak_this_factory_.InvalidateWeakPtrs();
|
| @@ -2297,8 +2306,9 @@ void DXVAVideoDecodeAccelerator::HandleResolutionChanged(int width,
|
| }
|
|
|
| void DXVAVideoDecodeAccelerator::DismissStaleBuffers(bool force) {
|
| - RETURN_AND_NOTIFY_ON_FAILURE(make_context_current_.Run(),
|
| - "Failed to make context current", PLATFORM_FAILURE, );
|
| + RETURN_AND_NOTIFY_ON_FAILURE(make_context_current_cb_.Run(),
|
| + "Failed to make context current",
|
| + PLATFORM_FAILURE, );
|
|
|
| OutputBuffers::iterator index;
|
|
|
| @@ -2320,8 +2330,9 @@ void DXVAVideoDecodeAccelerator::DismissStaleBuffers(bool force) {
|
|
|
| void DXVAVideoDecodeAccelerator::DeferredDismissStaleBuffer(
|
| int32_t picture_buffer_id) {
|
| - RETURN_AND_NOTIFY_ON_FAILURE(make_context_current_.Run(),
|
| - "Failed to make context current", PLATFORM_FAILURE, );
|
| + RETURN_AND_NOTIFY_ON_FAILURE(make_context_current_cb_.Run(),
|
| + "Failed to make context current",
|
| + PLATFORM_FAILURE, );
|
|
|
| OutputBuffers::iterator it = stale_output_picture_buffers_.find(
|
| picture_buffer_id);
|
| @@ -2437,8 +2448,9 @@ void DXVAVideoDecodeAccelerator::CopySurfaceComplete(
|
| if (picture_buffer->available())
|
| return;
|
|
|
| - RETURN_AND_NOTIFY_ON_FAILURE(make_context_current_.Run(),
|
| - "Failed to make context current", PLATFORM_FAILURE,);
|
| + RETURN_AND_NOTIFY_ON_FAILURE(make_context_current_cb_.Run(),
|
| + "Failed to make context current",
|
| + PLATFORM_FAILURE, );
|
|
|
| DCHECK(!output_picture_buffers_.empty());
|
|
|
|
|