OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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_V4L2_SLICE_VIDEO_DECODE_ACCELERATOR_H_ | 5 #ifndef MEDIA_GPU_V4L2_SLICE_VIDEO_DECODE_ACCELERATOR_H_ |
6 #define MEDIA_GPU_V4L2_SLICE_VIDEO_DECODE_ACCELERATOR_H_ | 6 #define MEDIA_GPU_V4L2_SLICE_VIDEO_DECODE_ACCELERATOR_H_ |
7 | 7 |
8 #include <linux/videodev2.h> | 8 #include <linux/videodev2.h> |
9 #include <stddef.h> | 9 #include <stddef.h> |
10 #include <stdint.h> | 10 #include <stdint.h> |
11 | 11 |
12 #include <memory> | 12 #include <memory> |
13 #include <queue> | 13 #include <queue> |
14 #include <utility> | 14 #include <utility> |
15 #include <vector> | 15 #include <vector> |
16 | 16 |
17 #include "base/macros.h" | 17 #include "base/macros.h" |
18 #include "base/memory/linked_ptr.h" | 18 #include "base/memory/linked_ptr.h" |
19 #include "base/memory/ref_counted.h" | 19 #include "base/memory/ref_counted.h" |
20 #include "base/memory/weak_ptr.h" | 20 #include "base/memory/weak_ptr.h" |
21 #include "base/synchronization/waitable_event.h" | 21 #include "base/synchronization/waitable_event.h" |
22 #include "base/threading/thread.h" | 22 #include "base/threading/thread.h" |
23 #include "media/gpu/gpu_video_decode_accelerator_helpers.h" | 23 #include "media/gpu/gpu_video_decode_accelerator_helpers.h" |
24 #include "media/gpu/h264_decoder.h" | 24 #include "media/gpu/h264_decoder.h" |
25 #include "media/gpu/media_gpu_export.h" | 25 #include "media/gpu/media_gpu_export.h" |
26 #include "media/gpu/v4l2_device.h" | 26 #include "media/gpu/v4l2_device.h" |
27 #include "media/gpu/vp8_decoder.h" | 27 #include "media/gpu/vp8_decoder.h" |
| 28 #include "media/gpu/vp9_decoder.h" |
28 #include "media/video/video_decode_accelerator.h" | 29 #include "media/video/video_decode_accelerator.h" |
29 | 30 |
30 namespace media { | 31 namespace media { |
31 | 32 |
32 // An implementation of VideoDecodeAccelerator that utilizes the V4L2 slice | 33 // An implementation of VideoDecodeAccelerator that utilizes the V4L2 slice |
33 // level codec API for decoding. The slice level API provides only a low-level | 34 // level codec API for decoding. The slice level API provides only a low-level |
34 // decoding functionality and requires userspace to provide support for parsing | 35 // decoding functionality and requires userspace to provide support for parsing |
35 // the input stream and managing decoder state across frames. | 36 // the input stream and managing decoder state across frames. |
36 class MEDIA_GPU_EXPORT V4L2SliceVideoDecodeAccelerator | 37 class MEDIA_GPU_EXPORT V4L2SliceVideoDecodeAccelerator |
37 : public VideoDecodeAccelerator { | 38 : public VideoDecodeAccelerator { |
(...skipping 21 matching lines...) Expand all Loading... |
59 bool TryToSetupDecodeOnSeparateThread( | 60 bool TryToSetupDecodeOnSeparateThread( |
60 const base::WeakPtr<Client>& decode_client, | 61 const base::WeakPtr<Client>& decode_client, |
61 const scoped_refptr<base::SingleThreadTaskRunner>& decode_task_runner) | 62 const scoped_refptr<base::SingleThreadTaskRunner>& decode_task_runner) |
62 override; | 63 override; |
63 | 64 |
64 static VideoDecodeAccelerator::SupportedProfiles GetSupportedProfiles(); | 65 static VideoDecodeAccelerator::SupportedProfiles GetSupportedProfiles(); |
65 | 66 |
66 private: | 67 private: |
67 class V4L2H264Accelerator; | 68 class V4L2H264Accelerator; |
68 class V4L2VP8Accelerator; | 69 class V4L2VP8Accelerator; |
| 70 class V4L2VP9Accelerator; |
69 | 71 |
70 // Record for input buffers. | 72 // Record for input buffers. |
71 struct InputRecord { | 73 struct InputRecord { |
72 InputRecord(); | 74 InputRecord(); |
73 int32_t input_id; | 75 int32_t input_id; |
74 void* address; | 76 void* address; |
75 size_t length; | 77 size_t length; |
76 size_t bytes_used; | 78 size_t bytes_used; |
77 bool at_device; | 79 bool at_device; |
78 }; | 80 }; |
(...skipping 25 matching lines...) Expand all Loading... |
104 // Below methods are used by accelerator implementations. | 106 // Below methods are used by accelerator implementations. |
105 // | 107 // |
106 // Append slice data in |data| of size |size| to pending hardware | 108 // Append slice data in |data| of size |size| to pending hardware |
107 // input buffer with |index|. This buffer will be submitted for decode | 109 // input buffer with |index|. This buffer will be submitted for decode |
108 // on the next DecodeSurface(). Return true on success. | 110 // on the next DecodeSurface(). Return true on success. |
109 bool SubmitSlice(int index, const uint8_t* data, size_t size); | 111 bool SubmitSlice(int index, const uint8_t* data, size_t size); |
110 | 112 |
111 // Submit controls in |ext_ctrls| to hardware. Return true on success. | 113 // Submit controls in |ext_ctrls| to hardware. Return true on success. |
112 bool SubmitExtControls(struct v4l2_ext_controls* ext_ctrls); | 114 bool SubmitExtControls(struct v4l2_ext_controls* ext_ctrls); |
113 | 115 |
| 116 // Gets current control values for controls in |ext_ctrls| from the driver. |
| 117 // Return true on success. |
| 118 bool GetExtControls(struct v4l2_ext_controls* ext_ctrls); |
| 119 |
| 120 // Return true if the driver exposes V4L2 control |ctrl_id|, false otherwise. |
| 121 bool IsCtrlExposed(uint32_t ctrl_id); |
| 122 |
114 // Decode of |dec_surface| is ready to be submitted and all codec-specific | 123 // Decode of |dec_surface| is ready to be submitted and all codec-specific |
115 // settings are set in hardware. | 124 // settings are set in hardware. |
116 void DecodeSurface(const scoped_refptr<V4L2DecodeSurface>& dec_surface); | 125 void DecodeSurface(const scoped_refptr<V4L2DecodeSurface>& dec_surface); |
117 | 126 |
118 // |dec_surface| is ready to be outputted once decode is finished. | 127 // |dec_surface| is ready to be outputted once decode is finished. |
119 // This can be called before decode is actually done in hardware, and this | 128 // This can be called before decode is actually done in hardware, and this |
120 // method is responsible for maintaining the ordering, i.e. the surfaces will | 129 // method is responsible for maintaining the ordering, i.e. the surfaces will |
121 // be outputted in the same order as SurfaceReady calls. To do so, the | 130 // be outputted in the same order as SurfaceReady calls. To do so, the |
122 // surfaces are put on decoder_display_queue_ and sent to output in that | 131 // surfaces are put on decoder_display_queue_ and sent to output in that |
123 // order once all preceding surfaces are sent. | 132 // order once all preceding surfaces are sent. |
(...skipping 293 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
417 // all previously-queued frames, so we can finish the flush/reset/surface | 426 // all previously-queued frames, so we can finish the flush/reset/surface |
418 // change flows. These can stack. | 427 // change flows. These can stack. |
419 bool decoder_flushing_; | 428 bool decoder_flushing_; |
420 bool decoder_resetting_; | 429 bool decoder_resetting_; |
421 bool surface_set_change_pending_; | 430 bool surface_set_change_pending_; |
422 | 431 |
423 // Hardware accelerators. | 432 // Hardware accelerators. |
424 // TODO(posciak): Try to have a superclass here if possible. | 433 // TODO(posciak): Try to have a superclass here if possible. |
425 std::unique_ptr<V4L2H264Accelerator> h264_accelerator_; | 434 std::unique_ptr<V4L2H264Accelerator> h264_accelerator_; |
426 std::unique_ptr<V4L2VP8Accelerator> vp8_accelerator_; | 435 std::unique_ptr<V4L2VP8Accelerator> vp8_accelerator_; |
| 436 std::unique_ptr<V4L2VP9Accelerator> vp9_accelerator_; |
427 | 437 |
428 // Codec-specific software decoder in use. | 438 // Codec-specific software decoder in use. |
429 std::unique_ptr<AcceleratedVideoDecoder> decoder_; | 439 std::unique_ptr<AcceleratedVideoDecoder> decoder_; |
430 | 440 |
431 // Surfaces queued to device to keep references to them while decoded. | 441 // Surfaces queued to device to keep references to them while decoded. |
432 using V4L2DecodeSurfaceByOutputId = | 442 using V4L2DecodeSurfaceByOutputId = |
433 std::map<int, scoped_refptr<V4L2DecodeSurface>>; | 443 std::map<int, scoped_refptr<V4L2DecodeSurface>>; |
434 V4L2DecodeSurfaceByOutputId surfaces_at_device_; | 444 V4L2DecodeSurfaceByOutputId surfaces_at_device_; |
435 | 445 |
436 // Surfaces sent to client to keep references to them while displayed. | 446 // Surfaces sent to client to keep references to them while displayed. |
(...skipping 18 matching lines...) Expand all Loading... |
455 MakeGLContextCurrentCallback make_context_current_cb_; | 465 MakeGLContextCurrentCallback make_context_current_cb_; |
456 | 466 |
457 // The WeakPtrFactory for |weak_this_|. | 467 // The WeakPtrFactory for |weak_this_|. |
458 base::WeakPtrFactory<V4L2SliceVideoDecodeAccelerator> weak_this_factory_; | 468 base::WeakPtrFactory<V4L2SliceVideoDecodeAccelerator> weak_this_factory_; |
459 | 469 |
460 DISALLOW_COPY_AND_ASSIGN(V4L2SliceVideoDecodeAccelerator); | 470 DISALLOW_COPY_AND_ASSIGN(V4L2SliceVideoDecodeAccelerator); |
461 }; | 471 }; |
462 | 472 |
463 class V4L2H264Picture; | 473 class V4L2H264Picture; |
464 class V4L2VP8Picture; | 474 class V4L2VP8Picture; |
| 475 class V4L2VP9Picture; |
465 | 476 |
466 } // namespace media | 477 } // namespace media |
467 | 478 |
468 #endif // MEDIA_GPU_V4L2_SLICE_VIDEO_DECODE_ACCELERATOR_H_ | 479 #endif // MEDIA_GPU_V4L2_SLICE_VIDEO_DECODE_ACCELERATOR_H_ |
OLD | NEW |