Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(328)

Side by Side Diff: content/common/gpu/media/android_video_decode_accelerator.h

Issue 1862303002: Delay actual flush and reset in AVDA (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Notifications are now set with BindToCurrentLoop() Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 1 // Copyright (c) 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_COMMON_GPU_MEDIA_ANDROID_VIDEO_DECODE_ACCELERATOR_H_ 5 #ifndef CONTENT_COMMON_GPU_MEDIA_ANDROID_VIDEO_DECODE_ACCELERATOR_H_
6 #define CONTENT_COMMON_GPU_MEDIA_ANDROID_VIDEO_DECODE_ACCELERATOR_H_ 6 #define CONTENT_COMMON_GPU_MEDIA_ANDROID_VIDEO_DECODE_ACCELERATOR_H_
7 7
8 #include <stdint.h> 8 #include <stdint.h>
9 9
10 #include <list> 10 #include <list>
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
80 80
81 // Notify strategy that a picture buffer has been assigned. 81 // Notify strategy that a picture buffer has been assigned.
82 virtual void AssignOnePictureBuffer( 82 virtual void AssignOnePictureBuffer(
83 const media::PictureBuffer& picture_buffer, 83 const media::PictureBuffer& picture_buffer,
84 bool have_context) {} 84 bool have_context) {}
85 85
86 // Notify strategy that a picture buffer has been reused. 86 // Notify strategy that a picture buffer has been reused.
87 virtual void ReuseOnePictureBuffer( 87 virtual void ReuseOnePictureBuffer(
88 const media::PictureBuffer& picture_buffer) {} 88 const media::PictureBuffer& picture_buffer) {}
89 89
90 // Release MediaCodec buffers.
91 virtual void ReleaseCodecBuffers(
92 const AndroidVideoDecodeAccelerator::OutputBufferMap& buffers) {}
93
90 // Notify strategy that we have a new android MediaCodec instance. This 94 // Notify strategy that we have a new android MediaCodec instance. This
91 // happens when we're starting up or re-configuring mid-stream. Any 95 // happens when we're starting up or re-configuring mid-stream. Any
92 // previously provided codec should no longer be referenced. 96 // previously provided codec should no longer be referenced.
93 // For convenience, a container of PictureBuffers is provided in case 97 // For convenience, a container of PictureBuffers is provided in case
94 // per-image cleanup is needed. 98 // per-image cleanup is needed.
95 virtual void CodecChanged(media::VideoCodecBridge* codec, 99 virtual void CodecChanged(media::VideoCodecBridge* codec,
96 const OutputBufferMap& buffer_map) = 0; 100 const OutputBufferMap& buffer_map) = 0;
97 101
98 // Notify the strategy that a frame is available. This callback can happen 102 // Notify the strategy that a frame is available. This callback can happen
99 // on any thread at any time. 103 // on any thread at any time.
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
153 157
154 // TODO(timav): evaluate the need for more states in the AVDA state machine. 158 // TODO(timav): evaluate the need for more states in the AVDA state machine.
155 enum State { 159 enum State {
156 NO_ERROR, 160 NO_ERROR,
157 ERROR, 161 ERROR,
158 // Set when we are asynchronously constructing the codec. Will transition 162 // Set when we are asynchronously constructing the codec. Will transition
159 // to NO_ERROR or ERROR depending on success. 163 // to NO_ERROR or ERROR depending on success.
160 WAITING_FOR_CODEC, 164 WAITING_FOR_CODEC,
161 // Set when we have a codec, but it doesn't yet have a key. 165 // Set when we have a codec, but it doesn't yet have a key.
162 WAITING_FOR_KEY, 166 WAITING_FOR_KEY,
163 WAITING_FOR_EOS, 167 };
168
169 enum DrainType {
170 DRAIN_TYPE_NONE,
171 DRAIN_FOR_FLUSH,
172 DRAIN_FOR_RESET,
173 DRAIN_FOR_DESTROY,
164 }; 174 };
165 175
166 // Configuration info for MediaCodec. 176 // Configuration info for MediaCodec.
167 // This is used to shuttle configuration info between threads without needing 177 // This is used to shuttle configuration info between threads without needing
168 // to worry about the lifetime of the AVDA instance. All of these should not 178 // to worry about the lifetime of the AVDA instance. All of these should not
169 // be modified while |state_| is WAITING_FOR_CODEC. 179 // be modified while |state_| is WAITING_FOR_CODEC.
170 class CodecConfig : public base::RefCountedThreadSafe<CodecConfig> { 180 class CodecConfig : public base::RefCountedThreadSafe<CodecConfig> {
171 public: 181 public:
172 CodecConfig(); 182 CodecConfig();
173 183
(...skipping 16 matching lines...) Expand all
190 gfx::Size initial_expected_coded_size_; 200 gfx::Size initial_expected_coded_size_;
191 201
192 protected: 202 protected:
193 friend class base::RefCountedThreadSafe<CodecConfig>; 203 friend class base::RefCountedThreadSafe<CodecConfig>;
194 virtual ~CodecConfig(); 204 virtual ~CodecConfig();
195 205
196 private: 206 private:
197 DISALLOW_COPY_AND_ASSIGN(CodecConfig); 207 DISALLOW_COPY_AND_ASSIGN(CodecConfig);
198 }; 208 };
199 209
210 // A part of destruction process that is sometimes postponed after the drain.
211 void ActualDestroy();
212
200 // Configures |media_codec_| with the given codec parameters from the client. 213 // Configures |media_codec_| with the given codec parameters from the client.
201 // This configuration will (probably) not be complete before this call 214 // This configuration will (probably) not be complete before this call
202 // returns. Multiple calls before completion will be ignored. |state_| 215 // returns. Multiple calls before completion will be ignored. |state_|
203 // must be NO_ERROR or WAITING_FOR_CODEC. Note that, once you call this, 216 // must be NO_ERROR or WAITING_FOR_CODEC. Note that, once you call this,
204 // you should be careful to avoid modifying members of |codec_config_| until 217 // you should be careful to avoid modifying members of |codec_config_| until
205 // |state_| is no longer WAITING_FOR_CODEC. 218 // |state_| is no longer WAITING_FOR_CODEC.
206 void ConfigureMediaCodecAsynchronously(); 219 void ConfigureMediaCodecAsynchronously();
207 220
208 // Like ConfigureMediaCodecAsynchronously, but synchronous. Returns true if 221 // Like ConfigureMediaCodecAsynchronously, but synchronous. Returns true if
209 // and only if |media_codec_| is non-null. Since all configuration is done 222 // and only if |media_codec_| is non-null. Since all configuration is done
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
276 // from breaking. NotifyError will do so immediately, PostError may wait. 289 // from breaking. NotifyError will do so immediately, PostError may wait.
277 // |token| has to match |error_sequence_token_|, or else it's assumed to be 290 // |token| has to match |error_sequence_token_|, or else it's assumed to be
278 // from a post that's prior to a previous reset, and ignored. 291 // from a post that's prior to a previous reset, and ignored.
279 void NotifyError(media::VideoDecodeAccelerator::Error error, int token); 292 void NotifyError(media::VideoDecodeAccelerator::Error error, int token);
280 293
281 // Start or stop our work-polling timer based on whether we did any work, and 294 // Start or stop our work-polling timer based on whether we did any work, and
282 // how long it has been since we've done work. Calling this with true will 295 // how long it has been since we've done work. Calling this with true will
283 // start the timer. Calling it with false may stop the timer. 296 // start the timer. Calling it with false may stop the timer.
284 void ManageTimer(bool did_work); 297 void ManageTimer(bool did_work);
285 298
299 // Start the MediaCodec drain process by adding end_of_stream() buffer to the
300 // encoded buffers queue. When we receive EOS from the output buffer the drain
301 // process completes and we perform the action depending on the |drain_type|.
302 void StartCodecDrain(DrainType drain_type);
303
304 // Returns true if we are currently draining the codec and doing that as part
305 // of Reset() or Destroy() VP8 workaround. (http://598963). We won't display
DaleCurtis 2016/04/21 00:16:07 http://crbug.com/598963
Tima Vaisburd 2016/04/21 21:38:22 Done.
306 // any frames and disable normal errors handling.
307 bool IsDrainingForResetOrDestroy() const;
308
309 // A helper method that performs the operation required after the drain
310 // completion (usually when we receive EOS in the output). The operation
311 // itself depends on the |drain_type_|.
312 void OnDrainCompleted();
313
286 // Resets MediaCodec and buffers/containers used for storing output. These 314 // Resets MediaCodec and buffers/containers used for storing output. These
287 // components need to be reset upon EOS to decode a later stream. Input state 315 // components need to be reset upon EOS to decode a later stream. Input state
288 // (e.g. queued BitstreamBuffers) is not reset, as input following an EOS 316 // (e.g. queued BitstreamBuffers) is not reset, as input following an EOS
289 // is still valid and should be processed. 317 // is still valid and should be processed. Upon competion calls |done_cb| that
290 void ResetCodecState(); 318 // can be a null callback.
319 void ResetCodecState(base::Closure done_cb);
DaleCurtis 2016/04/21 00:16:07 const&
Tima Vaisburd 2016/04/21 21:38:22 Done.
291 320
292 // Return true if and only if we should use deferred rendering. 321 // Return true if and only if we should use deferred rendering.
293 static bool UseDeferredRenderingStrategy( 322 static bool UseDeferredRenderingStrategy(
294 const gpu::GpuPreferences& gpu_preferences); 323 const gpu::GpuPreferences& gpu_preferences);
295 324
296 // Used to DCHECK that we are called on the correct thread. 325 // Used to DCHECK that we are called on the correct thread.
297 base::ThreadChecker thread_checker_; 326 base::ThreadChecker thread_checker_;
298 327
299 // To expose client callbacks from VideoDecodeAccelerator. 328 // To expose client callbacks from VideoDecodeAccelerator.
300 Client* client_; 329 Client* client_;
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
346 // Backing strategy that we'll use to connect PictureBuffers to frames. 375 // Backing strategy that we'll use to connect PictureBuffers to frames.
347 std::unique_ptr<BackingStrategy> strategy_; 376 std::unique_ptr<BackingStrategy> strategy_;
348 377
349 // Helper class that manages asynchronous OnFrameAvailable callbacks. 378 // Helper class that manages asynchronous OnFrameAvailable callbacks.
350 class OnFrameAvailableHandler; 379 class OnFrameAvailableHandler;
351 scoped_refptr<OnFrameAvailableHandler> on_frame_available_handler_; 380 scoped_refptr<OnFrameAvailableHandler> on_frame_available_handler_;
352 381
353 // Time at which we last did useful work on io_timer_. 382 // Time at which we last did useful work on io_timer_.
354 base::TimeTicks most_recent_work_; 383 base::TimeTicks most_recent_work_;
355 384
385 // Type of a drain request. We need to distinguish between DRAIN_FOR_FLUSH
386 // and other types, see IsDrainingForResetOrDestroy().
387 DrainType drain_type_;
388
356 // CDM related stuff. 389 // CDM related stuff.
357 390
358 // Holds a ref-count to the CDM to avoid using the CDM after it's destroyed. 391 // Holds a ref-count to the CDM to avoid using the CDM after it's destroyed.
359 scoped_refptr<media::MediaKeys> cdm_for_reference_holding_only_; 392 scoped_refptr<media::MediaKeys> cdm_for_reference_holding_only_;
360 393
361 media::MediaDrmBridgeCdmContext* media_drm_bridge_cdm_context_; 394 media::MediaDrmBridgeCdmContext* media_drm_bridge_cdm_context_;
362 395
363 // MediaDrmBridge requires registration/unregistration of the player, this 396 // MediaDrmBridge requires registration/unregistration of the player, this
364 // registration id is used for this. 397 // registration id is used for this.
365 int cdm_registration_id_; 398 int cdm_registration_id_;
(...skipping 19 matching lines...) Expand all
385 418
386 // WeakPtrFactory for posting tasks back to |this|. 419 // WeakPtrFactory for posting tasks back to |this|.
387 base::WeakPtrFactory<AndroidVideoDecodeAccelerator> weak_this_factory_; 420 base::WeakPtrFactory<AndroidVideoDecodeAccelerator> weak_this_factory_;
388 421
389 friend class AndroidVideoDecodeAcceleratorTest; 422 friend class AndroidVideoDecodeAcceleratorTest;
390 }; 423 };
391 424
392 } // namespace content 425 } // namespace content
393 426
394 #endif // CONTENT_COMMON_GPU_MEDIA_ANDROID_VIDEO_DECODE_ACCELERATOR_H_ 427 #endif // CONTENT_COMMON_GPU_MEDIA_ANDROID_VIDEO_DECODE_ACCELERATOR_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698