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_MEDIA_FOUNDATION_VIDEO_ENCODE_ACCELERATOR_WIN_H_ | 5 #ifndef MEDIA_GPU_MEDIA_FOUNDATION_VIDEO_ENCODE_ACCELERATOR_WIN_H_ |
6 #define MEDIA_GPU_MEDIA_FOUNDATION_VIDEO_ENCODE_ACCELERATOR_WIN_H_ | 6 #define MEDIA_GPU_MEDIA_FOUNDATION_VIDEO_ENCODE_ACCELERATOR_WIN_H_ |
7 | 7 |
8 #include <mfapi.h> | 8 #include <mfapi.h> |
9 #include <mfidl.h> | 9 #include <mfidl.h> |
10 #include <stdint.h> | 10 #include <stdint.h> |
11 #include <strmif.h> | 11 #include <strmif.h> |
12 | 12 |
13 #include <deque> | 13 #include <deque> |
14 #include <memory> | 14 #include <memory> |
15 | 15 |
16 #include "base/bind.h" | 16 #include "base/bind.h" |
17 #include "base/memory/weak_ptr.h" | 17 #include "base/memory/weak_ptr.h" |
18 #include "base/sequenced_task_runner.h" | |
19 #include "base/single_thread_task_runner.h" | 18 #include "base/single_thread_task_runner.h" |
20 #include "base/threading/thread.h" | 19 #include "base/threading/thread.h" |
21 #include "base/threading/thread_checker.h" | |
22 #include "base/win/scoped_comptr.h" | 20 #include "base/win/scoped_comptr.h" |
23 #include "media/gpu/media_gpu_export.h" | 21 #include "media/gpu/media_gpu_export.h" |
24 #include "media/video/video_encode_accelerator.h" | 22 #include "media/video/video_encode_accelerator.h" |
25 | 23 |
26 namespace media { | 24 namespace media { |
27 | 25 |
28 // Media Foundation implementation of the VideoEncodeAccelerator interface for | 26 // Media Foundation implementation of the VideoEncodeAccelerator interface for |
29 // Windows. | 27 // Windows. |
30 // This class saves the task runner on which it is constructed and returns | 28 // This class saves the task runner on which it is constructed and runs client |
31 // encoded data to the client using that same task runner. This class has | 29 // callbacks using that same task runner. If TryToSetupEncodeOnSeparateThread() |
32 // DCHECKs to makes sure that methods are called in sequence. It starts an | 30 // is called, it uses the given |encode_task_runner| instead to return encoded |
33 // internal encoder thread on which VideoEncodeAccelerator implementation tasks | 31 // data. This class has DCHECKs to makes sure that methods are called in the |
34 // are posted. | 32 // correct task runners. It starts an internal encoder thread on which |
33 // VideoEncodeAccelerator implementation tasks are posted. | |
35 class MEDIA_GPU_EXPORT MediaFoundationVideoEncodeAccelerator | 34 class MEDIA_GPU_EXPORT MediaFoundationVideoEncodeAccelerator |
36 : public VideoEncodeAccelerator { | 35 : public VideoEncodeAccelerator { |
37 public: | 36 public: |
38 MediaFoundationVideoEncodeAccelerator(); | 37 MediaFoundationVideoEncodeAccelerator(); |
39 | 38 |
40 // VideoEncodeAccelerator implementation. | 39 // VideoEncodeAccelerator implementation. |
41 VideoEncodeAccelerator::SupportedProfiles GetSupportedProfiles() override; | 40 VideoEncodeAccelerator::SupportedProfiles GetSupportedProfiles() override; |
42 bool Initialize(VideoPixelFormat input_format, | 41 bool Initialize(VideoPixelFormat input_format, |
43 const gfx::Size& input_visible_size, | 42 const gfx::Size& input_visible_size, |
44 VideoCodecProfile output_profile, | 43 VideoCodecProfile output_profile, |
45 uint32_t initial_bitrate, | 44 uint32_t initial_bitrate, |
46 Client* client) override; | 45 Client* client) override; |
47 void Encode(const scoped_refptr<VideoFrame>& frame, | 46 void Encode(const scoped_refptr<VideoFrame>& frame, |
48 bool force_keyframe) override; | 47 bool force_keyframe) override; |
49 void UseOutputBitstreamBuffer(const BitstreamBuffer& buffer) override; | 48 void UseOutputBitstreamBuffer(const BitstreamBuffer& buffer) override; |
50 void RequestEncodingParametersChange(uint32_t bitrate, | 49 void RequestEncodingParametersChange(uint32_t bitrate, |
51 uint32_t framerate) override; | 50 uint32_t framerate) override; |
52 void Destroy() override; | 51 void Destroy() override; |
52 bool TryToSetupEncodeOnSeparateThread( | |
53 const base::WeakPtr<Client>& encode_client, | |
54 const scoped_refptr<base::SingleThreadTaskRunner>& encode_task_runner) | |
55 override; | |
53 | 56 |
54 // Preload dlls required for encoding. | 57 // Preload dlls required for encoding. |
55 static void PreSandboxInitialization(); | 58 static void PreSandboxInitialization(); |
56 | 59 |
57 protected: | 60 protected: |
58 ~MediaFoundationVideoEncodeAccelerator() override; | 61 ~MediaFoundationVideoEncodeAccelerator() override; |
59 | 62 |
60 private: | 63 private: |
61 // Holds output buffers coming from the client ready to be filled. | 64 // Holds output buffers coming from the client ready to be filled. |
62 struct BitstreamBufferRef; | 65 struct BitstreamBufferRef; |
63 | 66 |
64 // Holds output buffers coming from the encoder. | 67 // Holds output buffers coming from the encoder. |
65 class EncodeOutput; | 68 class EncodeOutput; |
66 | 69 |
67 // Creates an hardware encoder backed IMFTransform instance on |encoder_|. | 70 // Creates an hardware encoder backed IMFTransform instance on |encoder_|. |
68 bool CreateHardwareEncoderMFT(); | 71 bool CreateHardwareEncoderMFT(); |
69 | 72 |
70 // Initializes and allocates memory for input and output samples. | 73 // Initializes and allocates memory for input and output samples. |
71 bool InitializeInputOutputSamples(); | 74 bool InitializeInputOutputSamples(); |
72 | 75 |
73 // Initializes encoder parameters for real-time use. | 76 // Initializes encoder parameters for real-time use. |
74 bool SetEncoderModes(); | 77 bool SetEncoderModes(); |
75 | 78 |
76 // Helper function to notify the client of an error on |client_task_runner_|. | 79 // Helper function to notify the client of an error on |
80 // |main_client_task_runner_|. | |
77 void NotifyError(VideoEncodeAccelerator::Error error); | 81 void NotifyError(VideoEncodeAccelerator::Error error); |
78 | 82 |
79 // Encoding tasks to be run on |encoder_thread_|. | 83 // Encoding tasks to be run on |encoder_thread_|. |
80 void EncodeTask(scoped_refptr<VideoFrame> frame, bool force_keyframe); | 84 void EncodeTask(scoped_refptr<VideoFrame> frame, bool force_keyframe); |
81 | 85 |
82 // Checks for and copies encoded output on |encoder_thread_|. | 86 // Checks for and copies encoded output on |encoder_thread_|. |
83 void ProcessOutput(); | 87 void ProcessOutput(); |
84 | 88 |
85 // Inserts the output buffers for reuse on |encoder_thread_|. | 89 // Inserts the output buffers for reuse on |encoder_thread_|. |
86 void UseOutputBitstreamBufferTask( | 90 void UseOutputBitstreamBufferTask( |
87 std::unique_ptr<BitstreamBufferRef> buffer_ref); | 91 std::unique_ptr<BitstreamBufferRef> buffer_ref); |
88 | 92 |
89 // Copies EncodeOutput into a BitstreamBuffer and returns it to the |client_|. | 93 // Copies EncodeOutput into a BitstreamBuffer and returns it to the |
94 // |encode_client_|. | |
90 void ReturnBitstreamBuffer( | 95 void ReturnBitstreamBuffer( |
91 std::unique_ptr<EncodeOutput> encode_output, | 96 std::unique_ptr<EncodeOutput> encode_output, |
92 std::unique_ptr<MediaFoundationVideoEncodeAccelerator::BitstreamBufferRef> | 97 std::unique_ptr<MediaFoundationVideoEncodeAccelerator::BitstreamBufferRef> |
93 buffer_ref); | 98 buffer_ref); |
94 | 99 |
95 // Changes encode parameters on |encoder_thread_|. | 100 // Changes encode parameters on |encoder_thread_|. |
96 void RequestEncodingParametersChangeTask(uint32_t bitrate, | 101 void RequestEncodingParametersChangeTask(uint32_t bitrate, |
97 uint32_t framerate); | 102 uint32_t framerate); |
98 | 103 |
99 // Destroys encode session on |encoder_thread_|. | 104 // Destroys encode session on |encoder_thread_|. |
(...skipping 18 matching lines...) Expand all Loading... | |
118 base::win::ScopedComPtr<IMFTransform> encoder_; | 123 base::win::ScopedComPtr<IMFTransform> encoder_; |
119 base::win::ScopedComPtr<ICodecAPI> codec_api_; | 124 base::win::ScopedComPtr<ICodecAPI> codec_api_; |
120 | 125 |
121 base::win::ScopedComPtr<IMFMediaType> imf_input_media_type_; | 126 base::win::ScopedComPtr<IMFMediaType> imf_input_media_type_; |
122 base::win::ScopedComPtr<IMFMediaType> imf_output_media_type_; | 127 base::win::ScopedComPtr<IMFMediaType> imf_output_media_type_; |
123 | 128 |
124 base::win::ScopedComPtr<IMFSample> input_sample_; | 129 base::win::ScopedComPtr<IMFSample> input_sample_; |
125 base::win::ScopedComPtr<IMFSample> output_sample_; | 130 base::win::ScopedComPtr<IMFSample> output_sample_; |
126 | 131 |
127 // To expose client callbacks from VideoEncodeAccelerator. | 132 // To expose client callbacks from VideoEncodeAccelerator. |
128 // NOTE: all calls to this object *MUST* be executed on |client_task_runner_|. | 133 // NOTE: all calls to this object *MUST* be executed on |
129 base::WeakPtr<Client> client_; | 134 // |main_client_task_runner_|. |
130 std::unique_ptr<base::WeakPtrFactory<Client>> client_ptr_factory_; | 135 base::WeakPtr<Client> main_client_; |
136 std::unique_ptr<base::WeakPtrFactory<Client>> main_client_weak_factory_; | |
137 scoped_refptr<base::SingleThreadTaskRunner> main_client_task_runner_; | |
131 | 138 |
132 // Our original calling task runner for the child thread. | 139 // Used to run client callback BitstreamBufferReady() on the encode task |
Pawel Osciak
2016/10/27 01:45:19
s/encode task runner/encode_client_task_runner_/
emircan
2016/10/27 17:53:30
Done.
| |
133 const scoped_refptr<base::SequencedTaskRunner> client_task_runner_; | 140 // runner if given by TryToSetupEncodeOnSeparateThread(). |
134 // Sequence checker to enforce that the methods of this object are called in | 141 base::WeakPtr<Client> encode_client_; |
135 // sequence. | 142 scoped_refptr<base::SingleThreadTaskRunner> encode_client_task_runner_; |
136 base::SequenceChecker sequence_checker_; | |
137 | 143 |
138 // This thread services tasks posted from the VEA API entry points by the | 144 // This thread services tasks posted from the VEA API entry points by the |
139 // GPU child thread and CompressionCallback() posted from device thread. | 145 // GPU child thread and CompressionCallback() posted from device thread. |
140 base::Thread encoder_thread_; | 146 base::Thread encoder_thread_; |
141 scoped_refptr<base::SingleThreadTaskRunner> encoder_thread_task_runner_; | 147 scoped_refptr<base::SingleThreadTaskRunner> encoder_thread_task_runner_; |
142 | 148 |
143 // Declared last to ensure that all weak pointers are invalidated before | 149 // Declared last to ensure that all weak pointers are invalidated before |
144 // other destructors run. | 150 // other destructors run. |
145 base::WeakPtrFactory<MediaFoundationVideoEncodeAccelerator> | 151 base::WeakPtrFactory<MediaFoundationVideoEncodeAccelerator> |
146 encoder_task_weak_factory_; | 152 encoder_task_weak_factory_; |
147 | 153 |
148 DISALLOW_COPY_AND_ASSIGN(MediaFoundationVideoEncodeAccelerator); | 154 DISALLOW_COPY_AND_ASSIGN(MediaFoundationVideoEncodeAccelerator); |
149 }; | 155 }; |
150 | 156 |
151 } // namespace media | 157 } // namespace media |
152 | 158 |
153 #endif // MEDIA_GPU_MEDIA_FOUNDATION_VIDEO_ENCODE_ACCELERATOR_WIN_H_ | 159 #endif // MEDIA_GPU_MEDIA_FOUNDATION_VIDEO_ENCODE_ACCELERATOR_WIN_H_ |
OLD | NEW |