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 #ifndef MEDIA_GPU_DXVA_PICTURE_BUFFER_WIN_H_ | 5 #ifndef MEDIA_GPU_DXVA_PICTURE_BUFFER_WIN_H_ |
6 #define MEDIA_GPU_DXVA_PICTURE_BUFFER_WIN_H_ | 6 #define MEDIA_GPU_DXVA_PICTURE_BUFFER_WIN_H_ |
7 | 7 |
8 #include <d3d11.h> | 8 #include <d3d11.h> |
9 #include <d3d9.h> | 9 #include <d3d9.h> |
10 #include <mfidl.h> | 10 #include <mfidl.h> |
(...skipping 30 matching lines...) Expand all Loading... |
41 // client. | 41 // client. |
42 // The dest_surface parameter contains the decoded bits. | 42 // The dest_surface parameter contains the decoded bits. |
43 virtual bool CopyOutputSampleDataToPictureBuffer( | 43 virtual bool CopyOutputSampleDataToPictureBuffer( |
44 DXVAVideoDecodeAccelerator* decoder, | 44 DXVAVideoDecodeAccelerator* decoder, |
45 IDirect3DSurface9* dest_surface, | 45 IDirect3DSurface9* dest_surface, |
46 ID3D11Texture2D* dx11_texture, | 46 ID3D11Texture2D* dx11_texture, |
47 int input_buffer_id); | 47 int input_buffer_id); |
48 | 48 |
49 bool available() const { return state_ == UNUSED; } | 49 bool available() const { return state_ == UNUSED; } |
50 State state() const { return state_; } | 50 State state() const { return state_; } |
| 51 const PictureBuffer& picture_buffer() const { return picture_buffer_; } |
51 | 52 |
52 int id() const { return picture_buffer_.id(); } | 53 int id() const { return picture_buffer_.id(); } |
53 | 54 |
54 gfx::Size size() const { return picture_buffer_.size(); } | 55 gfx::Size size() const { return picture_buffer_.size(); } |
55 void set_bound(); | 56 void set_bound(); |
56 | 57 |
57 scoped_refptr<gl::GLImage> gl_image() { return gl_image_; } | 58 scoped_refptr<gl::GLImage> gl_image() { return gl_image_; } |
58 | 59 |
59 const gfx::ColorSpace& color_space() const { return color_space_; } | 60 const gfx::ColorSpace& color_space() const { return color_space_; } |
60 void set_color_space(const gfx::ColorSpace& color_space) { | 61 void set_color_space(const gfx::ColorSpace& color_space) { |
61 color_space_ = color_space; | 62 color_space_ = color_space; |
62 } | 63 } |
63 | 64 |
64 // Returns true if these could in theory be used as an overlay. May | 65 // Returns true if these could in theory be used as an overlay. May |
65 // still be drawn using GL depending on the scene and precise hardware | 66 // still be drawn using GL depending on the scene and precise hardware |
66 // support. | 67 // support. |
67 virtual bool AllowOverlay() const = 0; | 68 virtual bool AllowOverlay() const = 0; |
68 | 69 |
| 70 // Returns true if BindSampleToTexture should be used. Otherwise |
| 71 // CopyOutputSampleDataToPicture should be used. |
| 72 virtual bool CanBindSamples() const = 0; |
| 73 |
69 bool waiting_to_reuse() const { return state_ == WAITING_TO_REUSE; } | 74 bool waiting_to_reuse() const { return state_ == WAITING_TO_REUSE; } |
70 virtual gl::GLFence* reuse_fence(); | 75 virtual gl::GLFence* reuse_fence(); |
71 | 76 |
72 // Called when the source surface |src_surface| is copied to the destination | 77 // Called when the source surface |src_surface| is copied to the destination |
73 // |dest_surface| | 78 // |dest_surface| |
74 virtual bool CopySurfaceComplete(IDirect3DSurface9* src_surface, | 79 virtual bool CopySurfaceComplete(IDirect3DSurface9* src_surface, |
75 IDirect3DSurface9* dest_surface); | 80 IDirect3DSurface9* dest_surface); |
76 virtual bool BindSampleToTexture(base::win::ScopedComPtr<IMFSample> sample); | 81 virtual bool BindSampleToTexture(DXVAVideoDecodeAccelerator* decoder, |
| 82 base::win::ScopedComPtr<IMFSample> sample); |
77 | 83 |
78 protected: | 84 protected: |
79 explicit DXVAPictureBuffer(const PictureBuffer& buffer); | 85 explicit DXVAPictureBuffer(const PictureBuffer& buffer); |
80 | 86 |
81 State state_ = UNUSED; | 87 State state_ = UNUSED; |
82 PictureBuffer picture_buffer_; | 88 PictureBuffer picture_buffer_; |
83 gfx::ColorSpace color_space_; | 89 gfx::ColorSpace color_space_; |
84 scoped_refptr<gl::GLImage> gl_image_; | 90 scoped_refptr<gl::GLImage> gl_image_; |
85 | 91 |
86 DISALLOW_COPY_AND_ASSIGN(DXVAPictureBuffer); | 92 DISALLOW_COPY_AND_ASSIGN(DXVAPictureBuffer); |
(...skipping 14 matching lines...) Expand all Loading... |
101 bool ReusePictureBuffer() override; | 107 bool ReusePictureBuffer() override; |
102 void ResetReuseFence() override; | 108 void ResetReuseFence() override; |
103 bool CopyOutputSampleDataToPictureBuffer(DXVAVideoDecodeAccelerator* decoder, | 109 bool CopyOutputSampleDataToPictureBuffer(DXVAVideoDecodeAccelerator* decoder, |
104 IDirect3DSurface9* dest_surface, | 110 IDirect3DSurface9* dest_surface, |
105 ID3D11Texture2D* dx11_texture, | 111 ID3D11Texture2D* dx11_texture, |
106 int input_buffer_id) override; | 112 int input_buffer_id) override; |
107 gl::GLFence* reuse_fence() override; | 113 gl::GLFence* reuse_fence() override; |
108 bool CopySurfaceComplete(IDirect3DSurface9* src_surface, | 114 bool CopySurfaceComplete(IDirect3DSurface9* src_surface, |
109 IDirect3DSurface9* dest_surface) override; | 115 IDirect3DSurface9* dest_surface) override; |
110 bool AllowOverlay() const override; | 116 bool AllowOverlay() const override; |
| 117 bool CanBindSamples() const override; |
111 | 118 |
112 protected: | 119 protected: |
113 EGLSurface decoding_surface_; | 120 EGLSurface decoding_surface_; |
114 | 121 |
115 std::unique_ptr<gl::GLFence> reuse_fence_; | 122 std::unique_ptr<gl::GLFence> reuse_fence_; |
116 | 123 |
117 HANDLE texture_share_handle_; | 124 HANDLE texture_share_handle_; |
118 base::win::ScopedComPtr<IDirect3DTexture9> decoding_texture_; | 125 base::win::ScopedComPtr<IDirect3DTexture9> decoding_texture_; |
119 base::win::ScopedComPtr<ID3D11Texture2D> dx11_decoding_texture_; | 126 base::win::ScopedComPtr<ID3D11Texture2D> dx11_decoding_texture_; |
120 | 127 |
(...skipping 21 matching lines...) Expand all Loading... |
142 }; | 149 }; |
143 | 150 |
144 // Shares the decoded texture with ANGLE without copying by using an EGL stream. | 151 // Shares the decoded texture with ANGLE without copying by using an EGL stream. |
145 class EGLStreamPictureBuffer : public DXVAPictureBuffer { | 152 class EGLStreamPictureBuffer : public DXVAPictureBuffer { |
146 public: | 153 public: |
147 explicit EGLStreamPictureBuffer(const PictureBuffer& buffer); | 154 explicit EGLStreamPictureBuffer(const PictureBuffer& buffer); |
148 ~EGLStreamPictureBuffer() override; | 155 ~EGLStreamPictureBuffer() override; |
149 | 156 |
150 bool Initialize(); | 157 bool Initialize(); |
151 bool ReusePictureBuffer() override; | 158 bool ReusePictureBuffer() override; |
152 bool BindSampleToTexture(base::win::ScopedComPtr<IMFSample> sample) override; | 159 bool BindSampleToTexture(DXVAVideoDecodeAccelerator* decoder, |
| 160 base::win::ScopedComPtr<IMFSample> sample) override; |
153 bool AllowOverlay() const override; | 161 bool AllowOverlay() const override; |
| 162 bool CanBindSamples() const override; |
154 | 163 |
155 private: | 164 private: |
156 EGLStreamKHR stream_; | 165 EGLStreamKHR stream_; |
| 166 |
| 167 base::win::ScopedComPtr<IMFSample> current_d3d_sample_; |
| 168 base::win::ScopedComPtr<ID3D11Texture2D> dx11_decoding_texture_; |
| 169 }; |
| 170 |
| 171 // Shares the decoded texture with ANGLE without copying by using an EGL stream. |
| 172 class EGLStreamDelayedCopyPictureBuffer : public DXVAPictureBuffer { |
| 173 public: |
| 174 explicit EGLStreamDelayedCopyPictureBuffer(const PictureBuffer& buffer); |
| 175 ~EGLStreamDelayedCopyPictureBuffer() override; |
| 176 |
| 177 bool Initialize(const DXVAVideoDecodeAccelerator& decoder); |
| 178 bool ReusePictureBuffer() override; |
| 179 bool BindSampleToTexture(DXVAVideoDecodeAccelerator* decoder, |
| 180 base::win::ScopedComPtr<IMFSample> sample) override; |
| 181 bool AllowOverlay() const override; |
| 182 bool CanBindSamples() const override; |
| 183 |
| 184 private: |
| 185 EGLStreamKHR stream_; |
157 | 186 |
158 base::win::ScopedComPtr<IMFSample> current_d3d_sample_; | 187 base::win::ScopedComPtr<IMFSample> current_d3d_sample_; |
159 base::win::ScopedComPtr<ID3D11Texture2D> dx11_decoding_texture_; | 188 base::win::ScopedComPtr<ID3D11Texture2D> dx11_decoding_texture_; |
160 }; | 189 }; |
161 | 190 |
162 // Creates an NV12 texture and copies to it, then shares that with ANGLE. | 191 // Creates an NV12 texture and copies to it, then shares that with ANGLE. |
163 class EGLStreamCopyPictureBuffer : public DXVAPictureBuffer { | 192 class EGLStreamCopyPictureBuffer : public DXVAPictureBuffer { |
164 public: | 193 public: |
165 explicit EGLStreamCopyPictureBuffer(const PictureBuffer& buffer); | 194 explicit EGLStreamCopyPictureBuffer(const PictureBuffer& buffer); |
166 ~EGLStreamCopyPictureBuffer() override; | 195 ~EGLStreamCopyPictureBuffer() override; |
167 | 196 |
168 bool Initialize(const DXVAVideoDecodeAccelerator& decoder); | 197 bool Initialize(const DXVAVideoDecodeAccelerator& decoder); |
169 bool ReusePictureBuffer() override; | 198 bool ReusePictureBuffer() override; |
170 | 199 |
171 bool CopyOutputSampleDataToPictureBuffer(DXVAVideoDecodeAccelerator* decoder, | 200 bool CopyOutputSampleDataToPictureBuffer(DXVAVideoDecodeAccelerator* decoder, |
172 IDirect3DSurface9* dest_surface, | 201 IDirect3DSurface9* dest_surface, |
173 ID3D11Texture2D* dx11_texture, | 202 ID3D11Texture2D* dx11_texture, |
174 int input_buffer_id) override; | 203 int input_buffer_id) override; |
175 bool CopySurfaceComplete(IDirect3DSurface9* src_surface, | 204 bool CopySurfaceComplete(IDirect3DSurface9* src_surface, |
176 IDirect3DSurface9* dest_surface) override; | 205 IDirect3DSurface9* dest_surface) override; |
177 bool AllowOverlay() const override; | 206 bool AllowOverlay() const override; |
| 207 bool CanBindSamples() const override; |
178 | 208 |
179 private: | 209 private: |
180 EGLStreamKHR stream_; | 210 EGLStreamKHR stream_; |
181 | 211 |
182 // This ID3D11Texture2D interface pointer is used to hold a reference to the | 212 // This ID3D11Texture2D interface pointer is used to hold a reference to the |
183 // MFT decoder texture during the course of a copy operation. This reference | 213 // MFT decoder texture during the course of a copy operation. This reference |
184 // is released when the copy completes. | 214 // is released when the copy completes. |
185 base::win::ScopedComPtr<ID3D11Texture2D> dx11_decoding_texture_; | 215 base::win::ScopedComPtr<ID3D11Texture2D> dx11_decoding_texture_; |
186 | 216 |
187 base::win::ScopedComPtr<IDXGIKeyedMutex> egl_keyed_mutex_; | 217 base::win::ScopedComPtr<IDXGIKeyedMutex> egl_keyed_mutex_; |
188 base::win::ScopedComPtr<IDXGIKeyedMutex> dx11_keyed_mutex_; | 218 base::win::ScopedComPtr<IDXGIKeyedMutex> dx11_keyed_mutex_; |
189 | 219 |
190 HANDLE texture_share_handle_; | 220 HANDLE texture_share_handle_; |
191 // This is the texture (created on ANGLE's device) that will be put in the | 221 // This is the texture (created on ANGLE's device) that will be put in the |
192 // EGLStream. | 222 // EGLStream. |
193 base::win::ScopedComPtr<ID3D11Texture2D> angle_copy_texture_; | 223 base::win::ScopedComPtr<ID3D11Texture2D> angle_copy_texture_; |
194 // This is another copy of that shared resource that will be copied to from | 224 // This is another copy of that shared resource that will be copied to from |
195 // the decoder. | 225 // the decoder. |
196 base::win::ScopedComPtr<ID3D11Texture2D> decoder_copy_texture_; | 226 base::win::ScopedComPtr<ID3D11Texture2D> decoder_copy_texture_; |
197 | 227 |
198 // This is the last value that was used to release the keyed mutex. | 228 // This is the last value that was used to release the keyed mutex. |
199 uint64_t keyed_mutex_value_ = 0; | 229 uint64_t keyed_mutex_value_ = 0; |
200 }; | 230 }; |
201 | 231 |
202 } // namespace media | 232 } // namespace media |
203 | 233 |
204 #endif // MEDIA_GPU_DXVA_PICTURE_BUFFER_WIN_H_ | 234 #endif // MEDIA_GPU_DXVA_PICTURE_BUFFER_WIN_H_ |
OLD | NEW |