Index: media/gpu/dxva_picture_buffer_win.h |
diff --git a/media/gpu/dxva_picture_buffer_win.h b/media/gpu/dxva_picture_buffer_win.h |
index 29d502d1d09a9bbb6ec019ae723849a3b203dc27..87d627d38529ce911349bfeff753806c45c4e9f2 100644 |
--- a/media/gpu/dxva_picture_buffer_win.h |
+++ b/media/gpu/dxva_picture_buffer_win.h |
@@ -48,6 +48,7 @@ class DXVAPictureBuffer { |
bool available() const { return state_ == UNUSED; } |
State state() const { return state_; } |
+ const PictureBuffer& picture_buffer() const { return picture_buffer_; } |
int id() const { return picture_buffer_.id(); } |
@@ -66,6 +67,10 @@ class DXVAPictureBuffer { |
// support. |
virtual bool AllowOverlay() const = 0; |
+ // Returns true if BindSampleToTexture should be used. Otherwise |
+ // CopyOutputSampleDataToPicture should be used. |
+ virtual bool CanBindSamples() const = 0; |
+ |
bool waiting_to_reuse() const { return state_ == WAITING_TO_REUSE; } |
virtual gl::GLFence* reuse_fence(); |
@@ -73,7 +78,8 @@ class DXVAPictureBuffer { |
// |dest_surface| |
virtual bool CopySurfaceComplete(IDirect3DSurface9* src_surface, |
IDirect3DSurface9* dest_surface); |
- virtual bool BindSampleToTexture(base::win::ScopedComPtr<IMFSample> sample); |
+ virtual bool BindSampleToTexture(DXVAVideoDecodeAccelerator* decoder, |
+ base::win::ScopedComPtr<IMFSample> sample); |
protected: |
explicit DXVAPictureBuffer(const PictureBuffer& buffer); |
@@ -108,6 +114,7 @@ class PbufferPictureBuffer : public DXVAPictureBuffer { |
bool CopySurfaceComplete(IDirect3DSurface9* src_surface, |
IDirect3DSurface9* dest_surface) override; |
bool AllowOverlay() const override; |
+ bool CanBindSamples() const override; |
protected: |
EGLSurface decoding_surface_; |
@@ -149,8 +156,30 @@ class EGLStreamPictureBuffer : public DXVAPictureBuffer { |
bool Initialize(); |
bool ReusePictureBuffer() override; |
- bool BindSampleToTexture(base::win::ScopedComPtr<IMFSample> sample) override; |
+ bool BindSampleToTexture(DXVAVideoDecodeAccelerator* decoder, |
+ base::win::ScopedComPtr<IMFSample> sample) override; |
+ bool AllowOverlay() const override; |
+ bool CanBindSamples() const override; |
+ |
+ private: |
+ EGLStreamKHR stream_; |
+ |
+ base::win::ScopedComPtr<IMFSample> current_d3d_sample_; |
+ base::win::ScopedComPtr<ID3D11Texture2D> dx11_decoding_texture_; |
+}; |
+ |
+// Shares the decoded texture with ANGLE without copying by using an EGL stream. |
+class EGLStreamDelayedCopyPictureBuffer : public DXVAPictureBuffer { |
+ public: |
+ explicit EGLStreamDelayedCopyPictureBuffer(const PictureBuffer& buffer); |
+ ~EGLStreamDelayedCopyPictureBuffer() override; |
+ |
+ bool Initialize(const DXVAVideoDecodeAccelerator& decoder); |
+ bool ReusePictureBuffer() override; |
+ bool BindSampleToTexture(DXVAVideoDecodeAccelerator* decoder, |
+ base::win::ScopedComPtr<IMFSample> sample) override; |
bool AllowOverlay() const override; |
+ bool CanBindSamples() const override; |
private: |
EGLStreamKHR stream_; |
@@ -175,6 +204,7 @@ class EGLStreamCopyPictureBuffer : public DXVAPictureBuffer { |
bool CopySurfaceComplete(IDirect3DSurface9* src_surface, |
IDirect3DSurface9* dest_surface) override; |
bool AllowOverlay() const override; |
+ bool CanBindSamples() const override; |
private: |
EGLStreamKHR stream_; |