OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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_VIDEO_DECODE_ACCELERATOR_WIN_H_ | 5 #ifndef MEDIA_GPU_DXVA_VIDEO_DECODE_ACCELERATOR_WIN_H_ |
6 #define MEDIA_GPU_DXVA_VIDEO_DECODE_ACCELERATOR_WIN_H_ | 6 #define MEDIA_GPU_DXVA_VIDEO_DECODE_ACCELERATOR_WIN_H_ |
7 | 7 |
8 #include <d3d11.h> | 8 #include <d3d11.h> |
9 #include <d3d9.h> | 9 #include <d3d9.h> |
10 #include <initguid.h> | 10 #include <initguid.h> |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
64 // TODO(ananta) | 64 // TODO(ananta) |
65 // Move this to a common place so that all VDA's can use this. | 65 // Move this to a common place so that all VDA's can use this. |
66 class H264ConfigChangeDetector { | 66 class H264ConfigChangeDetector { |
67 public: | 67 public: |
68 H264ConfigChangeDetector(); | 68 H264ConfigChangeDetector(); |
69 ~H264ConfigChangeDetector(); | 69 ~H264ConfigChangeDetector(); |
70 | 70 |
71 // Detects stream configuration changes. | 71 // Detects stream configuration changes. |
72 // Returns false on failure. | 72 // Returns false on failure. |
73 bool DetectConfig(const uint8_t* stream, unsigned int size); | 73 bool DetectConfig(const uint8_t* stream, unsigned int size); |
74 | |
75 bool config_changed() const { return config_changed_; } | 74 bool config_changed() const { return config_changed_; } |
76 | 75 |
77 gfx::ColorSpace current_color_space() const; | 76 gfx::ColorSpace current_color_space() const; |
78 | 77 |
79 private: | 78 private: |
80 // These fields are used to track the SPS/PPS in the H.264 bitstream and | 79 // These fields are used to track the SPS/PPS in the H.264 bitstream and |
81 // are eventually compared against the SPS/PPS in the bitstream to detect | 80 // are eventually compared against the SPS/PPS in the bitstream to detect |
82 // a change. | 81 // a change. |
83 int last_sps_id_; | 82 int last_sps_id_; |
84 std::vector<uint8_t> last_sps_; | 83 std::vector<uint8_t> last_sps_; |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
162 // some second generation Intel GPU drivers crash if we create a video | 161 // some second generation Intel GPU drivers crash if we create a video |
163 // device with a resolution higher then 1920 x 1088. This function | 162 // device with a resolution higher then 1920 x 1088. This function |
164 // checks if the GPU is in this list and if yes returns true. | 163 // checks if the GPU is in this list and if yes returns true. |
165 static bool IsLegacyGPU(ID3D11Device* device); | 164 static bool IsLegacyGPU(ID3D11Device* device); |
166 | 165 |
167 // Creates and initializes an instance of the D3D device and the | 166 // Creates and initializes an instance of the D3D device and the |
168 // corresponding device manager. The device manager instance is eventually | 167 // corresponding device manager. The device manager instance is eventually |
169 // passed to the IMFTransform interface implemented by the decoder. | 168 // passed to the IMFTransform interface implemented by the decoder. |
170 bool CreateD3DDevManager(); | 169 bool CreateD3DDevManager(); |
171 | 170 |
| 171 // TODO(hubbe): COMMENT |
| 172 bool CreateVideoProcessor(); |
| 173 |
172 // Creates and initializes an instance of the DX11 device and the | 174 // Creates and initializes an instance of the DX11 device and the |
173 // corresponding device manager. The device manager instance is eventually | 175 // corresponding device manager. The device manager instance is eventually |
174 // passed to the IMFTransform interface implemented by the decoder. | 176 // passed to the IMFTransform interface implemented by the decoder. |
175 bool CreateDX11DevManager(); | 177 bool CreateDX11DevManager(); |
176 | 178 |
177 // Creates, initializes and sets the media codec types for the decoder. | 179 // Creates, initializes and sets the media codec types for the decoder. |
178 bool InitDecoder(VideoCodecProfile profile); | 180 bool InitDecoder(VideoCodecProfile profile); |
179 | 181 |
180 // Validates whether the decoder supports hardware video acceleration. | 182 // Validates whether the decoder supports hardware video acceleration. |
181 bool CheckDecoderDxvaSupport(); | 183 bool CheckDecoderDxvaSupport(); |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
275 // Returns if we have output samples waiting to be processed. We only | 277 // Returns if we have output samples waiting to be processed. We only |
276 // allow one output sample to be present in the output queue at any given | 278 // allow one output sample to be present in the output queue at any given |
277 // time. | 279 // time. |
278 bool OutputSamplesPresent(); | 280 bool OutputSamplesPresent(); |
279 | 281 |
280 // Copies the source surface |src_surface| to the destination |dest_surface|. | 282 // Copies the source surface |src_surface| to the destination |dest_surface|. |
281 // The copying is done on the decoder thread. | 283 // The copying is done on the decoder thread. |
282 void CopySurface(IDirect3DSurface9* src_surface, | 284 void CopySurface(IDirect3DSurface9* src_surface, |
283 IDirect3DSurface9* dest_surface, | 285 IDirect3DSurface9* dest_surface, |
284 int picture_buffer_id, | 286 int picture_buffer_id, |
285 int input_buffer_id); | 287 int input_buffer_id, |
| 288 const gfx::ColorSpace& color_space); |
286 | 289 |
287 // This is a notification that the source surface |src_surface| was copied to | 290 // This is a notification that the source surface |src_surface| was copied to |
288 // the destination |dest_surface|. Received on the main thread. | 291 // the destination |dest_surface|. Received on the main thread. |
289 void CopySurfaceComplete(IDirect3DSurface9* src_surface, | 292 void CopySurfaceComplete(IDirect3DSurface9* src_surface, |
290 IDirect3DSurface9* dest_surface, | 293 IDirect3DSurface9* dest_surface, |
291 int picture_buffer_id, | 294 int picture_buffer_id, |
292 int input_buffer_id); | 295 int input_buffer_id); |
293 | 296 |
294 void BindPictureBufferToSample(base::win::ScopedComPtr<IMFSample> sample, | 297 void BindPictureBufferToSample(base::win::ScopedComPtr<IMFSample> sample, |
295 int picture_buffer_id, | 298 int picture_buffer_id, |
296 int input_buffer_id); | 299 int input_buffer_id); |
297 | 300 |
298 // Copies the source texture |src_texture| to the destination |dest_texture|. | 301 // Copies the source texture |src_texture| to the destination |dest_texture|. |
299 // The copying is done on the decoder thread. | 302 // The copying is done on the decoder thread. |
300 void CopyTexture(ID3D11Texture2D* src_texture, | 303 void CopyTexture(ID3D11Texture2D* src_texture, |
301 ID3D11Texture2D* dest_texture, | 304 ID3D11Texture2D* dest_texture, |
302 base::win::ScopedComPtr<IDXGIKeyedMutex> dest_keyed_mutex, | 305 base::win::ScopedComPtr<IDXGIKeyedMutex> dest_keyed_mutex, |
303 uint64_t keyed_mutex_value, | 306 uint64_t keyed_mutex_value, |
304 int picture_buffer_id, | 307 int picture_buffer_id, |
305 int input_buffer_id); | 308 int input_buffer_id, |
| 309 const gfx::ColorSpace& color_space); |
306 | 310 |
307 // Copies the |video_frame| to the destination |dest_texture|. | 311 // Copies the |video_frame| to the destination |dest_texture|. |
308 void CopyTextureOnDecoderThread( | 312 void CopyTextureOnDecoderThread( |
309 ID3D11Texture2D* dest_texture, | 313 ID3D11Texture2D* dest_texture, |
310 base::win::ScopedComPtr<IDXGIKeyedMutex> dest_keyed_mutex, | 314 base::win::ScopedComPtr<IDXGIKeyedMutex> dest_keyed_mutex, |
311 uint64_t keyed_mutex_value, | 315 uint64_t keyed_mutex_value, |
312 IMFSample* video_frame, | 316 IMFSample* video_frame, |
313 int picture_buffer_id, | 317 int picture_buffer_id, |
314 int input_buffer_id); | 318 int input_buffer_id); |
315 | 319 |
316 // Flushes the decoder device to ensure that the decoded surface is copied | 320 // Flushes the decoder device to ensure that the decoded surface is copied |
317 // to the target surface. |iterations| helps to maintain an upper limit on | 321 // to the target surface. |iterations| helps to maintain an upper limit on |
318 // the number of times we try to complete the flush operation. | 322 // the number of times we try to complete the flush operation. |
319 void FlushDecoder(int iterations, | 323 void FlushDecoder(int iterations, |
320 IDirect3DSurface9* src_surface, | 324 IDirect3DSurface9* src_surface, |
321 IDirect3DSurface9* dest_surface, | 325 IDirect3DSurface9* dest_surface, |
322 int picture_buffer_id, | 326 int picture_buffer_id, |
323 int input_buffer_id); | 327 int input_buffer_id); |
324 | 328 |
325 // Polls to wait for GPU commands to be finished on the picture buffer | 329 // Polls to wait for GPU commands to be finished on the picture buffer |
326 // before reusing it. | 330 // before reusing it. |
327 void WaitForOutputBuffer(int32_t picture_buffer_id, int count); | 331 void WaitForOutputBuffer(int32_t picture_buffer_id, int count); |
328 | 332 |
329 // Initializes the DX11 Video format converter media types. | 333 // Initializes the DX11 Video format converter media types. |
330 // Returns true on success. | 334 // Returns true on success. |
331 bool InitializeDX11VideoFormatConverterMediaType(int width, int height); | 335 bool InitializeDX11VideoFormatConverterMediaType( |
| 336 int width, |
| 337 int height, |
| 338 const gfx::ColorSpace& color_space); |
332 | 339 |
333 // Returns the output video frame dimensions (width, height). | 340 // Returns the output video frame dimensions (width, height). |
334 // |sample| :- This is the output sample containing the video frame. | 341 // |sample| :- This is the output sample containing the video frame. |
335 // |width| :- The width is returned here. | 342 // |width| :- The width is returned here. |
336 // |height| :- The height is returned here. | 343 // |height| :- The height is returned here. |
337 // Returns true on success. | 344 // Returns true on success. |
338 bool GetVideoFrameDimensions(IMFSample* sample, int* width, int* height); | 345 bool GetVideoFrameDimensions(IMFSample* sample, int* width, int* height); |
339 | 346 |
340 // Sets the output type on the |transform| to the GUID identified by the | 347 // Sets the output type on the |transform| to the GUID identified by the |
341 // the |output_type| parameter. The GUID can be MFVideoFormat_RGB32, | 348 // the |output_type| parameter. The GUID can be MFVideoFormat_RGB32, |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
373 base::win::ScopedComPtr<IDirect3DDeviceManager9> device_manager_; | 380 base::win::ScopedComPtr<IDirect3DDeviceManager9> device_manager_; |
374 base::win::ScopedComPtr<IDirect3DQuery9> query_; | 381 base::win::ScopedComPtr<IDirect3DQuery9> query_; |
375 | 382 |
376 base::win::ScopedComPtr<ID3D11Device> d3d11_device_; | 383 base::win::ScopedComPtr<ID3D11Device> d3d11_device_; |
377 base::win::ScopedComPtr<ID3D11Device> angle_device_; | 384 base::win::ScopedComPtr<ID3D11Device> angle_device_; |
378 base::win::ScopedComPtr<IMFDXGIDeviceManager> d3d11_device_manager_; | 385 base::win::ScopedComPtr<IMFDXGIDeviceManager> d3d11_device_manager_; |
379 base::win::ScopedComPtr<ID3D10Multithread> multi_threaded_; | 386 base::win::ScopedComPtr<ID3D10Multithread> multi_threaded_; |
380 base::win::ScopedComPtr<ID3D11DeviceContext> d3d11_device_context_; | 387 base::win::ScopedComPtr<ID3D11DeviceContext> d3d11_device_context_; |
381 base::win::ScopedComPtr<ID3D11Query> d3d11_query_; | 388 base::win::ScopedComPtr<ID3D11Query> d3d11_query_; |
382 | 389 |
| 390 base::win::ScopedComPtr<IDirectXVideoProcessorService> |
| 391 video_processor_service_; |
| 392 base::win::ScopedComPtr<IDirectXVideoProcessor> processor_; |
| 393 DXVA2_ProcAmpValues default_procamp_values_; |
| 394 |
383 // Ideally the reset token would be a stack variable which is used while | 395 // Ideally the reset token would be a stack variable which is used while |
384 // creating the device manager. However it seems that the device manager | 396 // creating the device manager. However it seems that the device manager |
385 // holds onto the token and attempts to access it if the underlying device | 397 // holds onto the token and attempts to access it if the underlying device |
386 // changes. | 398 // changes. |
387 // TODO(ananta): This needs to be verified. | 399 // TODO(ananta): This needs to be verified. |
388 uint32_t dev_manager_reset_token_; | 400 uint32_t dev_manager_reset_token_; |
389 | 401 |
390 // Reset token for the DX11 device manager. | 402 // Reset token for the DX11 device manager. |
391 uint32_t dx11_dev_manager_reset_token_; | 403 uint32_t dx11_dev_manager_reset_token_; |
392 | 404 |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
485 bool pending_flush_; | 497 bool pending_flush_; |
486 | 498 |
487 // Use CODECAPI_AVLowLatencyMode. | 499 // Use CODECAPI_AVLowLatencyMode. |
488 bool enable_low_latency_; | 500 bool enable_low_latency_; |
489 | 501 |
490 bool share_nv12_textures_; | 502 bool share_nv12_textures_; |
491 | 503 |
492 // Copy NV12 texture to another NV12 texture. | 504 // Copy NV12 texture to another NV12 texture. |
493 bool copy_nv12_textures_; | 505 bool copy_nv12_textures_; |
494 | 506 |
| 507 // When converting YUV to RGB, make sure we tell the blitter about the input |
| 508 // color space so that it can convert it correctly. |
| 509 bool use_color_info_ = true; |
| 510 |
495 // Defaults to false. Indicates if we should use D3D or DX11 interfaces for | 511 // Defaults to false. Indicates if we should use D3D or DX11 interfaces for |
496 // H/W decoding. | 512 // H/W decoding. |
497 bool use_dx11_; | 513 bool use_dx11_; |
498 | 514 |
499 // True when using Microsoft's VP9 HMFT for decoding. | 515 // True when using Microsoft's VP9 HMFT for decoding. |
500 bool using_ms_vp9_mft_ = false; | 516 bool using_ms_vp9_mft_ = false; |
501 | 517 |
502 // True if we should use DXGI keyed mutexes to synchronize between the two | 518 // True if we should use DXGI keyed mutexes to synchronize between the two |
503 // contexts. | 519 // contexts. |
504 bool use_keyed_mutex_; | 520 bool use_keyed_mutex_; |
505 | 521 |
506 // Set to true if the DX11 video format converter input media types need to | 522 // Set to true if the DX11 video format converter input media types need to |
507 // be initialized. Defaults to true. | 523 // be initialized. Defaults to true. |
508 bool dx11_video_format_converter_media_type_needs_init_; | 524 bool dx11_video_format_converter_media_type_needs_init_; |
509 | 525 |
| 526 // Color spaced used when initializing the dx11 format converter. |
| 527 gfx::ColorSpace dx11_converter_color_space_; |
| 528 |
510 // Set to true if we are sharing ANGLE's device. | 529 // Set to true if we are sharing ANGLE's device. |
511 bool using_angle_device_; | 530 bool using_angle_device_; |
512 | 531 |
513 // Enables experimental hardware acceleration for VP8/VP9 video decoding. | 532 // Enables experimental hardware acceleration for VP8/VP9 video decoding. |
514 const gpu::GpuPreferences::VpxDecodeVendors enable_accelerated_vpx_decode_; | 533 const gpu::GpuPreferences::VpxDecodeVendors enable_accelerated_vpx_decode_; |
515 | 534 |
516 // The media foundation H.264 decoder has problems handling changes like | 535 // The media foundation H.264 decoder has problems handling changes like |
517 // resolution change, bitrate change etc. If we reinitialize the decoder | 536 // resolution change, bitrate change etc. If we reinitialize the decoder |
518 // when these changes occur then, the decoder works fine. The | 537 // when these changes occur then, the decoder works fine. The |
519 // H264ConfigChangeDetector class provides functionality to check if the | 538 // H264ConfigChangeDetector class provides functionality to check if the |
(...skipping 11 matching lines...) Expand all Loading... |
531 | 550 |
532 // Function pointer for the MFCreateDXGIDeviceManager API. | 551 // Function pointer for the MFCreateDXGIDeviceManager API. |
533 static CreateDXGIDeviceManager create_dxgi_device_manager_; | 552 static CreateDXGIDeviceManager create_dxgi_device_manager_; |
534 | 553 |
535 DISALLOW_COPY_AND_ASSIGN(DXVAVideoDecodeAccelerator); | 554 DISALLOW_COPY_AND_ASSIGN(DXVAVideoDecodeAccelerator); |
536 }; | 555 }; |
537 | 556 |
538 } // namespace media | 557 } // namespace media |
539 | 558 |
540 #endif // MEDIA_GPU_DXVA_VIDEO_DECODE_ACCELERATOR_WIN_H_ | 559 #endif // MEDIA_GPU_DXVA_VIDEO_DECODE_ACCELERATOR_WIN_H_ |
OLD | NEW |