OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 CONTENT_RENDERER_MEDIA_RTC_VIDEO_DECODER_H_ | 5 #ifndef CONTENT_RENDERER_MEDIA_RTC_VIDEO_DECODER_H_ |
6 #define CONTENT_RENDERER_MEDIA_RTC_VIDEO_DECODER_H_ | 6 #define CONTENT_RENDERER_MEDIA_RTC_VIDEO_DECODER_H_ |
7 | 7 |
| 8 #include <stddef.h> |
| 9 #include <stdint.h> |
| 10 |
8 #include <deque> | 11 #include <deque> |
9 #include <list> | 12 #include <list> |
10 #include <map> | 13 #include <map> |
11 #include <set> | 14 #include <set> |
12 #include <utility> | 15 #include <utility> |
13 | 16 |
14 #include "base/basictypes.h" | |
15 #include "base/gtest_prod_util.h" | 17 #include "base/gtest_prod_util.h" |
| 18 #include "base/macros.h" |
16 #include "base/memory/weak_ptr.h" | 19 #include "base/memory/weak_ptr.h" |
17 #include "base/synchronization/lock.h" | 20 #include "base/synchronization/lock.h" |
18 #include "base/threading/thread.h" | 21 #include "base/threading/thread.h" |
19 #include "content/common/content_export.h" | 22 #include "content/common/content_export.h" |
20 #include "media/base/bitstream_buffer.h" | 23 #include "media/base/bitstream_buffer.h" |
21 #include "media/base/video_decoder.h" | 24 #include "media/base/video_decoder.h" |
22 #include "media/video/picture.h" | 25 #include "media/video/picture.h" |
23 #include "media/video/video_decode_accelerator.h" | 26 #include "media/video/video_decode_accelerator.h" |
24 #include "third_party/webrtc/modules/video_coding/include/video_codec_interface.
h" | 27 #include "third_party/webrtc/modules/video_coding/include/video_codec_interface.
h" |
25 #include "ui/gfx/geometry/rect.h" | 28 #include "ui/gfx/geometry/rect.h" |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
74 int32_t RegisterDecodeCompleteCallback( | 77 int32_t RegisterDecodeCompleteCallback( |
75 webrtc::DecodedImageCallback* callback) override; | 78 webrtc::DecodedImageCallback* callback) override; |
76 // Called on Chrome_libJingle_WorkerThread. The child thread is blocked while | 79 // Called on Chrome_libJingle_WorkerThread. The child thread is blocked while |
77 // this runs. | 80 // this runs. |
78 int32_t Release() override; | 81 int32_t Release() override; |
79 // Called on Chrome_libJingle_WorkerThread. The child thread is blocked while | 82 // Called on Chrome_libJingle_WorkerThread. The child thread is blocked while |
80 // this runs. | 83 // this runs. |
81 int32_t Reset() override; | 84 int32_t Reset() override; |
82 | 85 |
83 // VideoDecodeAccelerator::Client implementation. | 86 // VideoDecodeAccelerator::Client implementation. |
84 void ProvidePictureBuffers(uint32 count, | 87 void ProvidePictureBuffers(uint32_t count, |
85 const gfx::Size& size, | 88 const gfx::Size& size, |
86 uint32 texture_target) override; | 89 uint32_t texture_target) override; |
87 void DismissPictureBuffer(int32 id) override; | 90 void DismissPictureBuffer(int32_t id) override; |
88 void PictureReady(const media::Picture& picture) override; | 91 void PictureReady(const media::Picture& picture) override; |
89 void NotifyEndOfBitstreamBuffer(int32 id) override; | 92 void NotifyEndOfBitstreamBuffer(int32_t id) override; |
90 void NotifyFlushDone() override; | 93 void NotifyFlushDone() override; |
91 void NotifyResetDone() override; | 94 void NotifyResetDone() override; |
92 void NotifyError(media::VideoDecodeAccelerator::Error error) override; | 95 void NotifyError(media::VideoDecodeAccelerator::Error error) override; |
93 | 96 |
94 private: | 97 private: |
95 // Metadata of a bitstream buffer. | 98 // Metadata of a bitstream buffer. |
96 struct BufferData { | 99 struct BufferData { |
97 BufferData(int32 bitstream_buffer_id, | 100 BufferData(int32_t bitstream_buffer_id, |
98 uint32_t timestamp, | 101 uint32_t timestamp, |
99 size_t size, | 102 size_t size, |
100 const gfx::Rect& visible_rect); | 103 const gfx::Rect& visible_rect); |
101 BufferData(); | 104 BufferData(); |
102 ~BufferData(); | 105 ~BufferData(); |
103 int32 bitstream_buffer_id; | 106 int32_t bitstream_buffer_id; |
104 uint32_t timestamp; // in 90KHz | 107 uint32_t timestamp; // in 90KHz |
105 size_t size; // buffer size | 108 size_t size; // buffer size |
106 gfx::Rect visible_rect; | 109 gfx::Rect visible_rect; |
107 }; | 110 }; |
108 | 111 |
109 FRIEND_TEST_ALL_PREFIXES(RTCVideoDecoderTest, IsBufferAfterReset); | 112 FRIEND_TEST_ALL_PREFIXES(RTCVideoDecoderTest, IsBufferAfterReset); |
110 FRIEND_TEST_ALL_PREFIXES(RTCVideoDecoderTest, IsFirstBufferAfterReset); | 113 FRIEND_TEST_ALL_PREFIXES(RTCVideoDecoderTest, IsFirstBufferAfterReset); |
111 | 114 |
112 RTCVideoDecoder(webrtc::VideoCodecType type, | 115 RTCVideoDecoder(webrtc::VideoCodecType type, |
113 media::GpuVideoAcceleratorFactories* factories); | 116 media::GpuVideoAcceleratorFactories* factories); |
114 | 117 |
115 // Requests a buffer to be decoded by VDA. | 118 // Requests a buffer to be decoded by VDA. |
116 void RequestBufferDecode(); | 119 void RequestBufferDecode(); |
117 | 120 |
118 bool CanMoreDecodeWorkBeDone(); | 121 bool CanMoreDecodeWorkBeDone(); |
119 | 122 |
120 // Returns true if bitstream buffer id |id_buffer| comes after |id_reset|. | 123 // Returns true if bitstream buffer id |id_buffer| comes after |id_reset|. |
121 // This handles the wraparound. | 124 // This handles the wraparound. |
122 bool IsBufferAfterReset(int32 id_buffer, int32 id_reset); | 125 bool IsBufferAfterReset(int32_t id_buffer, int32_t id_reset); |
123 | 126 |
124 // Returns true if bitstream buffer |id_buffer| is the first buffer after | 127 // Returns true if bitstream buffer |id_buffer| is the first buffer after |
125 // |id_reset|. | 128 // |id_reset|. |
126 bool IsFirstBufferAfterReset(int32 id_buffer, int32 id_reset); | 129 bool IsFirstBufferAfterReset(int32_t id_buffer, int32_t id_reset); |
127 | 130 |
128 // Saves a WebRTC buffer in |decode_buffers_| for decode. | 131 // Saves a WebRTC buffer in |decode_buffers_| for decode. |
129 void SaveToDecodeBuffers_Locked(const webrtc::EncodedImage& input_image, | 132 void SaveToDecodeBuffers_Locked(const webrtc::EncodedImage& input_image, |
130 scoped_ptr<base::SharedMemory> shm_buffer, | 133 scoped_ptr<base::SharedMemory> shm_buffer, |
131 const BufferData& buffer_data); | 134 const BufferData& buffer_data); |
132 | 135 |
133 // Saves a WebRTC buffer in |pending_buffers_| waiting for SHM available. | 136 // Saves a WebRTC buffer in |pending_buffers_| waiting for SHM available. |
134 // Returns true on success. | 137 // Returns true on success. |
135 bool SaveToPendingBuffers_Locked(const webrtc::EncodedImage& input_image, | 138 bool SaveToPendingBuffers_Locked(const webrtc::EncodedImage& input_image, |
136 const BufferData& buffer_data); | 139 const BufferData& buffer_data); |
137 | 140 |
138 // Gets SHM and moves pending buffers to decode buffers. | 141 // Gets SHM and moves pending buffers to decode buffers. |
139 void MovePendingBuffersToDecodeBuffers(); | 142 void MovePendingBuffersToDecodeBuffers(); |
140 | 143 |
141 scoped_refptr<media::VideoFrame> CreateVideoFrame( | 144 scoped_refptr<media::VideoFrame> CreateVideoFrame( |
142 const media::Picture& picture, | 145 const media::Picture& picture, |
143 const media::PictureBuffer& pb, | 146 const media::PictureBuffer& pb, |
144 uint32_t timestamp, | 147 uint32_t timestamp, |
145 const gfx::Rect& visible_rect); | 148 const gfx::Rect& visible_rect); |
146 | 149 |
147 // Resets VDA. | 150 // Resets VDA. |
148 void ResetInternal(); | 151 void ResetInternal(); |
149 | 152 |
150 // Static method is to allow it to run even after RVD is deleted. | 153 // Static method is to allow it to run even after RVD is deleted. |
151 static void ReleaseMailbox(base::WeakPtr<RTCVideoDecoder> decoder, | 154 static void ReleaseMailbox(base::WeakPtr<RTCVideoDecoder> decoder, |
152 media::GpuVideoAcceleratorFactories* factories, | 155 media::GpuVideoAcceleratorFactories* factories, |
153 int64 picture_buffer_id, | 156 int64_t picture_buffer_id, |
154 uint32 texture_id, | 157 uint32_t texture_id, |
155 const gpu::SyncToken& release_sync_token); | 158 const gpu::SyncToken& release_sync_token); |
156 // Tells VDA that a picture buffer can be recycled. | 159 // Tells VDA that a picture buffer can be recycled. |
157 void ReusePictureBuffer(int64 picture_buffer_id); | 160 void ReusePictureBuffer(int64_t picture_buffer_id); |
158 | 161 |
159 // Create |vda_| on |vda_loop_proxy_|. | 162 // Create |vda_| on |vda_loop_proxy_|. |
160 void CreateVDA(media::VideoCodecProfile profile, base::WaitableEvent* waiter); | 163 void CreateVDA(media::VideoCodecProfile profile, base::WaitableEvent* waiter); |
161 | 164 |
162 void DestroyTextures(); | 165 void DestroyTextures(); |
163 void DestroyVDA(); | 166 void DestroyVDA(); |
164 | 167 |
165 // Gets a shared-memory segment of at least |min_size| bytes from | 168 // Gets a shared-memory segment of at least |min_size| bytes from |
166 // |available_shm_segments_|. Returns NULL if there is no buffer or the | 169 // |available_shm_segments_|. Returns NULL if there is no buffer or the |
167 // buffer is not big enough. | 170 // buffer is not big enough. |
168 scoped_ptr<base::SharedMemory> GetSHM_Locked(size_t min_size); | 171 scoped_ptr<base::SharedMemory> GetSHM_Locked(size_t min_size); |
169 | 172 |
170 // Returns a shared-memory segment to the available pool. | 173 // Returns a shared-memory segment to the available pool. |
171 void PutSHM_Locked(scoped_ptr<base::SharedMemory> shm_buffer); | 174 void PutSHM_Locked(scoped_ptr<base::SharedMemory> shm_buffer); |
172 | 175 |
173 // Allocates |count| shared memory buffers of |size| bytes. | 176 // Allocates |count| shared memory buffers of |size| bytes. |
174 void CreateSHM(size_t count, size_t size); | 177 void CreateSHM(size_t count, size_t size); |
175 | 178 |
176 // Stores the buffer metadata to |input_buffer_data_|. | 179 // Stores the buffer metadata to |input_buffer_data_|. |
177 void RecordBufferData(const BufferData& buffer_data); | 180 void RecordBufferData(const BufferData& buffer_data); |
178 // Gets the buffer metadata from |input_buffer_data_|. | 181 // Gets the buffer metadata from |input_buffer_data_|. |
179 void GetBufferData(int32 bitstream_buffer_id, | 182 void GetBufferData(int32_t bitstream_buffer_id, |
180 uint32_t* timestamp, | 183 uint32_t* timestamp, |
181 gfx::Rect* visible_rect); | 184 gfx::Rect* visible_rect); |
182 | 185 |
183 // Records the result of InitDecode to UMA and returns |status|. | 186 // Records the result of InitDecode to UMA and returns |status|. |
184 int32_t RecordInitDecodeUMA(int32_t status); | 187 int32_t RecordInitDecodeUMA(int32_t status); |
185 | 188 |
186 // Assert the contract that this class is operated on the right thread. | 189 // Assert the contract that this class is operated on the right thread. |
187 void DCheckGpuVideoAcceleratorFactoriesTaskRunnerIsCurrent() const; | 190 void DCheckGpuVideoAcceleratorFactoriesTaskRunnerIsCurrent() const; |
188 | 191 |
189 // Query factories_ whether |profile| is supported and return true is so, | 192 // Query factories_ whether |profile| is supported and return true is so, |
190 // false otherwise. If true, also set resolution limits for |profile| | 193 // false otherwise. If true, also set resolution limits for |profile| |
191 // in min/max_resolution_. | 194 // in min/max_resolution_. |
192 bool IsProfileSupported(media::VideoCodecProfile profile); | 195 bool IsProfileSupported(media::VideoCodecProfile profile); |
193 | 196 |
194 // Clear the pending_buffers_ queue, freeing memory. | 197 // Clear the pending_buffers_ queue, freeing memory. |
195 void ClearPendingBuffers(); | 198 void ClearPendingBuffers(); |
196 | 199 |
197 enum State { | 200 enum State { |
198 UNINITIALIZED, // The decoder has not initialized. | 201 UNINITIALIZED, // The decoder has not initialized. |
199 INITIALIZED, // The decoder has initialized. | 202 INITIALIZED, // The decoder has initialized. |
200 RESETTING, // The decoder is being reset. | 203 RESETTING, // The decoder is being reset. |
201 DECODE_ERROR, // Decoding error happened. | 204 DECODE_ERROR, // Decoding error happened. |
202 }; | 205 }; |
203 | 206 |
204 static const int32 ID_LAST; // maximum bitstream buffer id | 207 static const int32_t ID_LAST; // maximum bitstream buffer id |
205 static const int32 ID_HALF; // half of the maximum bitstream buffer id | 208 static const int32_t ID_HALF; // half of the maximum bitstream buffer id |
206 static const int32 ID_INVALID; // indicates Reset or Release never occurred | 209 static const int32_t ID_INVALID; // indicates Reset or Release never occurred |
207 | 210 |
208 // The hardware video decoder. | 211 // The hardware video decoder. |
209 scoped_ptr<media::VideoDecodeAccelerator> vda_; | 212 scoped_ptr<media::VideoDecodeAccelerator> vda_; |
210 | 213 |
211 // The video codec type, as reported by WebRTC. | 214 // The video codec type, as reported by WebRTC. |
212 const webrtc::VideoCodecType video_codec_type_; | 215 const webrtc::VideoCodecType video_codec_type_; |
213 | 216 |
214 // The size of the incoming video frames. | 217 // The size of the incoming video frames. |
215 gfx::Size frame_size_; | 218 gfx::Size frame_size_; |
216 | 219 |
217 media::GpuVideoAcceleratorFactories* const factories_; | 220 media::GpuVideoAcceleratorFactories* const factories_; |
218 | 221 |
219 // The texture target used for decoded pictures. | 222 // The texture target used for decoded pictures. |
220 uint32 decoder_texture_target_; | 223 uint32_t decoder_texture_target_; |
221 | 224 |
222 // Metadata of the buffers that have been sent for decode. | 225 // Metadata of the buffers that have been sent for decode. |
223 std::list<BufferData> input_buffer_data_; | 226 std::list<BufferData> input_buffer_data_; |
224 | 227 |
225 // A map from bitstream buffer IDs to bitstream buffers that are being | 228 // A map from bitstream buffer IDs to bitstream buffers that are being |
226 // processed by VDA. The map owns SHM buffers. | 229 // processed by VDA. The map owns SHM buffers. |
227 std::map<int32, base::SharedMemory*> bitstream_buffers_in_decoder_; | 230 std::map<int32_t, base::SharedMemory*> bitstream_buffers_in_decoder_; |
228 | 231 |
229 // A map from picture buffer IDs to texture-backed picture buffers. | 232 // A map from picture buffer IDs to texture-backed picture buffers. |
230 std::map<int32, media::PictureBuffer> assigned_picture_buffers_; | 233 std::map<int32_t, media::PictureBuffer> assigned_picture_buffers_; |
231 | 234 |
232 // PictureBuffers given to us by VDA via PictureReady, which we sent forward | 235 // PictureBuffers given to us by VDA via PictureReady, which we sent forward |
233 // as VideoFrames to be rendered via read_cb_, and which will be returned | 236 // as VideoFrames to be rendered via read_cb_, and which will be returned |
234 // to us via ReusePictureBuffer. | 237 // to us via ReusePictureBuffer. |
235 typedef std::map<int32 /* picture_buffer_id */, uint32 /* texture_id */> | 238 typedef std::map<int32_t /* picture_buffer_id */, uint32_t /* texture_id */> |
236 PictureBufferTextureMap; | 239 PictureBufferTextureMap; |
237 PictureBufferTextureMap picture_buffers_at_display_; | 240 PictureBufferTextureMap picture_buffers_at_display_; |
238 | 241 |
239 // The id that will be given to the next picture buffer. | 242 // The id that will be given to the next picture buffer. |
240 int32 next_picture_buffer_id_; | 243 int32_t next_picture_buffer_id_; |
241 | 244 |
242 // Protects |state_|, |decode_complete_callback_| , |num_shm_buffers_|, | 245 // Protects |state_|, |decode_complete_callback_| , |num_shm_buffers_|, |
243 // |available_shm_segments_|, |pending_buffers_|, |decode_buffers_|, | 246 // |available_shm_segments_|, |pending_buffers_|, |decode_buffers_|, |
244 // |next_bitstream_buffer_id_| and |reset_bitstream_buffer_id_|. | 247 // |next_bitstream_buffer_id_| and |reset_bitstream_buffer_id_|. |
245 base::Lock lock_; | 248 base::Lock lock_; |
246 | 249 |
247 // The state of RTCVideoDecoder. Guarded by |lock_|. | 250 // The state of RTCVideoDecoder. Guarded by |lock_|. |
248 State state_; | 251 State state_; |
249 | 252 |
250 // Guarded by |lock_|. | 253 // Guarded by |lock_|. |
(...skipping 10 matching lines...) Expand all Loading... |
261 | 264 |
262 // A queue storing WebRTC encoding images (and their metadata) that are | 265 // A queue storing WebRTC encoding images (and their metadata) that are |
263 // waiting for the shared memory. Guarded by |lock_|. | 266 // waiting for the shared memory. Guarded by |lock_|. |
264 std::deque<std::pair<webrtc::EncodedImage, BufferData>> pending_buffers_; | 267 std::deque<std::pair<webrtc::EncodedImage, BufferData>> pending_buffers_; |
265 | 268 |
266 // A queue storing buffers (and their metadata) that will be sent to VDA for | 269 // A queue storing buffers (and their metadata) that will be sent to VDA for |
267 // decode. The queue owns SHM buffers. Guarded by |lock_|. | 270 // decode. The queue owns SHM buffers. Guarded by |lock_|. |
268 std::deque<std::pair<base::SharedMemory*, BufferData>> decode_buffers_; | 271 std::deque<std::pair<base::SharedMemory*, BufferData>> decode_buffers_; |
269 | 272 |
270 // The id that will be given to the next bitstream buffer. Guarded by |lock_|. | 273 // The id that will be given to the next bitstream buffer. Guarded by |lock_|. |
271 int32 next_bitstream_buffer_id_; | 274 int32_t next_bitstream_buffer_id_; |
272 | 275 |
273 // A buffer that has an id less than this should be dropped because Reset or | 276 // A buffer that has an id less than this should be dropped because Reset or |
274 // Release has been called. Guarded by |lock_|. | 277 // Release has been called. Guarded by |lock_|. |
275 int32 reset_bitstream_buffer_id_; | 278 int32_t reset_bitstream_buffer_id_; |
276 | 279 |
277 // Minimum and maximum supported resolutions for the current profile/VDA. | 280 // Minimum and maximum supported resolutions for the current profile/VDA. |
278 gfx::Size min_resolution_; | 281 gfx::Size min_resolution_; |
279 gfx::Size max_resolution_; | 282 gfx::Size max_resolution_; |
280 | 283 |
281 // Must be destroyed, or invalidated, on |vda_loop_proxy_| | 284 // Must be destroyed, or invalidated, on |vda_loop_proxy_| |
282 // NOTE: Weak pointers must be invalidated before all other member variables. | 285 // NOTE: Weak pointers must be invalidated before all other member variables. |
283 base::WeakPtrFactory<RTCVideoDecoder> weak_factory_; | 286 base::WeakPtrFactory<RTCVideoDecoder> weak_factory_; |
284 | 287 |
285 DISALLOW_COPY_AND_ASSIGN(RTCVideoDecoder); | 288 DISALLOW_COPY_AND_ASSIGN(RTCVideoDecoder); |
286 }; | 289 }; |
287 | 290 |
288 } // namespace content | 291 } // namespace content |
289 | 292 |
290 #endif // CONTENT_RENDERER_MEDIA_RTC_VIDEO_DECODER_H_ | 293 #endif // CONTENT_RENDERER_MEDIA_RTC_VIDEO_DECODER_H_ |
OLD | NEW |