OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "media/gpu/dxva_picture_buffer_win.h" | 5 #include "media/gpu/dxva_picture_buffer_win.h" |
6 | 6 |
7 #include "media/gpu/dxva_video_decode_accelerator_win.h" | 7 #include "media/gpu/dxva_video_decode_accelerator_win.h" |
8 #include "third_party/angle/include/EGL/egl.h" | 8 #include "third_party/angle/include/EGL/egl.h" |
9 #include "third_party/angle/include/EGL/eglext.h" | 9 #include "third_party/angle/include/EGL/eglext.h" |
10 #include "ui/gl/gl_bindings.h" | 10 #include "ui/gl/gl_bindings.h" |
(...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
233 desc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET; | 233 desc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET; |
234 desc.CPUAccessFlags = 0; | 234 desc.CPUAccessFlags = 0; |
235 desc.MiscFlags = decoder.use_keyed_mutex_ | 235 desc.MiscFlags = decoder.use_keyed_mutex_ |
236 ? D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX | 236 ? D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX |
237 : D3D11_RESOURCE_MISC_SHARED; | 237 : D3D11_RESOURCE_MISC_SHARED; |
238 | 238 |
239 HRESULT hr = decoder.d3d11_device_->CreateTexture2D( | 239 HRESULT hr = decoder.d3d11_device_->CreateTexture2D( |
240 &desc, nullptr, dx11_decoding_texture_.GetAddressOf()); | 240 &desc, nullptr, dx11_decoding_texture_.GetAddressOf()); |
241 RETURN_ON_HR_FAILURE(hr, "Failed to create texture", false); | 241 RETURN_ON_HR_FAILURE(hr, "Failed to create texture", false); |
242 if (decoder.use_keyed_mutex_) { | 242 if (decoder.use_keyed_mutex_) { |
243 hr = dx11_keyed_mutex_.QueryFrom(dx11_decoding_texture_.Get()); | 243 hr = dx11_decoding_texture_.CopyTo(dx11_keyed_mutex_.GetAddressOf()); |
244 RETURN_ON_HR_FAILURE(hr, "Failed to get keyed mutex", false); | 244 RETURN_ON_HR_FAILURE(hr, "Failed to get keyed mutex", false); |
245 } | 245 } |
246 | 246 |
247 base::win::ScopedComPtr<IDXGIResource> resource; | 247 base::win::ScopedComPtr<IDXGIResource> resource; |
248 hr = resource.QueryFrom(dx11_decoding_texture_.Get()); | 248 hr = dx11_decoding_texture_.CopyTo(resource.GetAddressOf()); |
249 DCHECK(SUCCEEDED(hr)); | 249 DCHECK(SUCCEEDED(hr)); |
250 hr = resource->GetSharedHandle(&texture_share_handle_); | 250 hr = resource->GetSharedHandle(&texture_share_handle_); |
251 RETURN_ON_FAILURE(SUCCEEDED(hr) && texture_share_handle_, | 251 RETURN_ON_FAILURE(SUCCEEDED(hr) && texture_share_handle_, |
252 "Failed to query shared handle", false); | 252 "Failed to query shared handle", false); |
253 | 253 |
254 } else { | 254 } else { |
255 HRESULT hr = E_FAIL; | 255 HRESULT hr = E_FAIL; |
256 hr = decoder.d3d9_device_ex_->CreateTexture( | 256 hr = decoder.d3d9_device_ex_->CreateTexture( |
257 picture_buffer_.size().width(), picture_buffer_.size().height(), 1, | 257 picture_buffer_.size().width(), picture_buffer_.size().height(), 1, |
258 D3DUSAGE_RENDERTARGET, use_rgb ? D3DFMT_X8R8G8B8 : D3DFMT_A8R8G8B8, | 258 D3DUSAGE_RENDERTARGET, use_rgb ? D3DFMT_X8R8G8B8 : D3DFMT_A8R8G8B8, |
(...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
480 | 480 |
481 current_d3d_sample_ = sample; | 481 current_d3d_sample_ = sample; |
482 EGLDisplay egl_display = gl::GLSurfaceEGL::GetHardwareDisplay(); | 482 EGLDisplay egl_display = gl::GLSurfaceEGL::GetHardwareDisplay(); |
483 | 483 |
484 base::win::ScopedComPtr<IMFMediaBuffer> output_buffer; | 484 base::win::ScopedComPtr<IMFMediaBuffer> output_buffer; |
485 HRESULT hr = | 485 HRESULT hr = |
486 current_d3d_sample_->GetBufferByIndex(0, output_buffer.GetAddressOf()); | 486 current_d3d_sample_->GetBufferByIndex(0, output_buffer.GetAddressOf()); |
487 RETURN_ON_HR_FAILURE(hr, "Failed to get buffer from output sample", false); | 487 RETURN_ON_HR_FAILURE(hr, "Failed to get buffer from output sample", false); |
488 | 488 |
489 base::win::ScopedComPtr<IMFDXGIBuffer> dxgi_buffer; | 489 base::win::ScopedComPtr<IMFDXGIBuffer> dxgi_buffer; |
490 hr = dxgi_buffer.QueryFrom(output_buffer.Get()); | 490 hr = output_buffer.CopyTo(dxgi_buffer.GetAddressOf()); |
491 RETURN_ON_HR_FAILURE(hr, "Failed to get DXGIBuffer from output sample", | 491 RETURN_ON_HR_FAILURE(hr, "Failed to get DXGIBuffer from output sample", |
492 false); | 492 false); |
493 hr = dxgi_buffer->GetResource( | 493 hr = dxgi_buffer->GetResource( |
494 IID_PPV_ARGS(dx11_decoding_texture_.GetAddressOf())); | 494 IID_PPV_ARGS(dx11_decoding_texture_.GetAddressOf())); |
495 RETURN_ON_HR_FAILURE(hr, "Failed to get texture from output sample", false); | 495 RETURN_ON_HR_FAILURE(hr, "Failed to get texture from output sample", false); |
496 UINT subresource; | 496 UINT subresource; |
497 dxgi_buffer->GetSubresourceIndex(&subresource); | 497 dxgi_buffer->GetSubresourceIndex(&subresource); |
498 | 498 |
499 EGLAttrib frame_attributes[] = { | 499 EGLAttrib frame_attributes[] = { |
500 EGL_D3D_TEXTURE_SUBRESOURCE_ID_ANGLE, subresource, EGL_NONE, | 500 EGL_D3D_TEXTURE_SUBRESOURCE_ID_ANGLE, subresource, EGL_NONE, |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
583 desc.SampleDesc.Quality = 0; | 583 desc.SampleDesc.Quality = 0; |
584 desc.Usage = D3D11_USAGE_DEFAULT; | 584 desc.Usage = D3D11_USAGE_DEFAULT; |
585 desc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET; | 585 desc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET; |
586 desc.CPUAccessFlags = 0; | 586 desc.CPUAccessFlags = 0; |
587 desc.MiscFlags = D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX; | 587 desc.MiscFlags = D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX; |
588 | 588 |
589 HRESULT hr = decoder.d3d11_device_->CreateTexture2D( | 589 HRESULT hr = decoder.d3d11_device_->CreateTexture2D( |
590 &desc, nullptr, decoder_copy_texture_.GetAddressOf()); | 590 &desc, nullptr, decoder_copy_texture_.GetAddressOf()); |
591 RETURN_ON_HR_FAILURE(hr, "Failed to create texture", false); | 591 RETURN_ON_HR_FAILURE(hr, "Failed to create texture", false); |
592 DCHECK(decoder.use_keyed_mutex_); | 592 DCHECK(decoder.use_keyed_mutex_); |
593 hr = dx11_keyed_mutex_.QueryFrom(decoder_copy_texture_.Get()); | 593 hr = decoder_copy_texture_.CopyTo(dx11_keyed_mutex_.GetAddressOf()); |
594 RETURN_ON_HR_FAILURE(hr, "Failed to get keyed mutex", false); | 594 RETURN_ON_HR_FAILURE(hr, "Failed to get keyed mutex", false); |
595 | 595 |
596 base::win::ScopedComPtr<IDXGIResource> resource; | 596 base::win::ScopedComPtr<IDXGIResource> resource; |
597 hr = resource.QueryFrom(decoder_copy_texture_.Get()); | 597 hr = decoder_copy_texture_.CopyTo(resource.GetAddressOf()); |
598 DCHECK(SUCCEEDED(hr)); | 598 DCHECK(SUCCEEDED(hr)); |
599 hr = resource->GetSharedHandle(&texture_share_handle_); | 599 hr = resource->GetSharedHandle(&texture_share_handle_); |
600 RETURN_ON_FAILURE(SUCCEEDED(hr) && texture_share_handle_, | 600 RETURN_ON_FAILURE(SUCCEEDED(hr) && texture_share_handle_, |
601 "Failed to query shared handle", false); | 601 "Failed to query shared handle", false); |
602 | 602 |
603 hr = decoder.angle_device_->OpenSharedResource( | 603 hr = decoder.angle_device_->OpenSharedResource( |
604 texture_share_handle_, IID_PPV_ARGS(angle_copy_texture_.GetAddressOf())); | 604 texture_share_handle_, IID_PPV_ARGS(angle_copy_texture_.GetAddressOf())); |
605 RETURN_ON_HR_FAILURE(hr, "Failed to open shared resource", false); | 605 RETURN_ON_HR_FAILURE(hr, "Failed to open shared resource", false); |
606 hr = egl_keyed_mutex_.QueryFrom(angle_copy_texture_.Get()); | 606 hr = angle_copy_texture_.CopyTo(egl_keyed_mutex_.GetAddressOf()); |
607 RETURN_ON_HR_FAILURE(hr, "Failed to get ANGLE mutex", false); | 607 RETURN_ON_HR_FAILURE(hr, "Failed to get ANGLE mutex", false); |
608 return true; | 608 return true; |
609 } | 609 } |
610 | 610 |
611 bool EGLStreamCopyPictureBuffer::CopyOutputSampleDataToPictureBuffer( | 611 bool EGLStreamCopyPictureBuffer::CopyOutputSampleDataToPictureBuffer( |
612 DXVAVideoDecodeAccelerator* decoder, | 612 DXVAVideoDecodeAccelerator* decoder, |
613 IDirect3DSurface9* dest_surface, | 613 IDirect3DSurface9* dest_surface, |
614 ID3D11Texture2D* dx11_texture, | 614 ID3D11Texture2D* dx11_texture, |
615 int input_buffer_id) { | 615 int input_buffer_id) { |
616 DCHECK_EQ(BOUND, state_); | 616 DCHECK_EQ(BOUND, state_); |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
679 RETURN_ON_FAILURE(result, "Could not release stream", false); | 679 RETURN_ON_FAILURE(result, "Could not release stream", false); |
680 } | 680 } |
681 return true; | 681 return true; |
682 } | 682 } |
683 | 683 |
684 bool EGLStreamCopyPictureBuffer::AllowOverlay() const { | 684 bool EGLStreamCopyPictureBuffer::AllowOverlay() const { |
685 return true; | 685 return true; |
686 } | 686 } |
687 | 687 |
688 } // namespace media | 688 } // namespace media |
OLD | NEW |