| Index: media/base/android/media_codec_decoder.h
|
| diff --git a/media/base/android/media_codec_decoder.h b/media/base/android/media_codec_decoder.h
|
| index f3faf208030a542ad8590751377f2f092ba7849f..0013bea740979ed13c22d06c3645bad7b93f25b3 100644
|
| --- a/media/base/android/media_codec_decoder.h
|
| +++ b/media/base/android/media_codec_decoder.h
|
| @@ -171,19 +171,20 @@ class MediaCodecDecoder {
|
| virtual void SetDemuxerConfigs(const DemuxerConfigs& configs) = 0;
|
|
|
| // Stops decoder thread, releases the MediaCodecBridge and other resources.
|
| - virtual void ReleaseDecoderResources();
|
| + virtual void ReleaseDecoderResources() = 0;
|
|
|
| // Flushes the MediaCodec, after that resets the AccessUnitQueue and blocks
|
| // the input. Decoder thread should not be running.
|
| virtual void Flush();
|
|
|
| - // Releases MediaCodecBridge.
|
| - void ReleaseMediaCodec();
|
| + // Releases MediaCodecBridge and any related buffers or references.
|
| + virtual void ReleaseMediaCodec();
|
|
|
| // Returns corresponding conditions.
|
| bool IsPrefetchingOrPlaying() const;
|
| bool IsStopped() const;
|
| bool IsCompleted() const;
|
| + bool NotCompletedAndNeedsPreroll() const;
|
|
|
| base::android::ScopedJavaLocalRef<jobject> GetMediaCrypto();
|
|
|
| @@ -194,8 +195,13 @@ class MediaCodecDecoder {
|
| // Configures MediaCodec.
|
| ConfigStatus Configure();
|
|
|
| - // Starts the decoder thread and resumes the playback.
|
| - bool Start(base::TimeDelta current_time);
|
| + // Starts the decoder for prerolling. This method starts the decoder thread.
|
| + bool Preroll(base::TimeDelta preroll_timestamp,
|
| + const base::Closure& preroll_done_cb);
|
| +
|
| + // Starts the decoder after preroll is not needed, starting decoder thread
|
| + // if it has not started yet.
|
| + bool Start(base::TimeDelta start_timestamp);
|
|
|
| // Stops the playback process synchronously. This method stops the decoder
|
| // thread synchronously, and then releases all MediaCodec buffers.
|
| @@ -209,10 +215,22 @@ class MediaCodecDecoder {
|
| // Notification posted when asynchronous stop is done or playback completed.
|
| void OnLastFrameRendered(bool completed);
|
|
|
| + // Notification posted when last prerolled frame has been returned to codec.
|
| + void OnPrerollDone();
|
| +
|
| // Puts the incoming data into AccessUnitQueue.
|
| void OnDemuxerDataAvailable(const DemuxerData& data);
|
|
|
| + // For testing only. Returns true if the decoder is in kPrerolling state.
|
| + bool IsPrerollingForTests() const;
|
| +
|
| protected:
|
| + enum RenderMode {
|
| + kRenderSkip = 0,
|
| + kRenderAfterPreroll,
|
| + kRenderNow,
|
| + };
|
| +
|
| // Returns true if the new DemuxerConfigs requires MediaCodec
|
| // reconfiguration.
|
| virtual bool IsCodecReconfigureNeeded(const DemuxerConfigs& curr,
|
| @@ -224,7 +242,10 @@ class MediaCodecDecoder {
|
|
|
| // Associates PTS with device time so we can calculate delays.
|
| // We use delays for video decoder only.
|
| - virtual void SynchronizePTSWithTime(base::TimeDelta current_time) {}
|
| + virtual void AssociateCurrentTimeWithPTS(base::TimeDelta current_time) {}
|
| +
|
| + // Invalidate delay calculation. We use delays for video decoder only.
|
| + virtual void DissociatePTSFromTime() {}
|
|
|
| // Processes the change of the output format, varies by stream.
|
| virtual void OnOutputFormatChanged() = 0;
|
| @@ -234,16 +255,15 @@ class MediaCodecDecoder {
|
| virtual void Render(int buffer_index,
|
| size_t offset,
|
| size_t size,
|
| - bool render_output,
|
| + RenderMode render_mode,
|
| base::TimeDelta pts,
|
| bool eos_encountered) = 0;
|
|
|
| // Returns the number of delayed task (we might have them for video).
|
| virtual int NumDelayedRenderTasks() const;
|
|
|
| - // Releases output buffers that are dequeued and not released yet (video)
|
| - // if the |release| parameter is set and then remove the references to them.
|
| - virtual void ClearDelayedBuffers(bool release) {}
|
| + // Releases output buffers that are dequeued and not released yet (video).
|
| + virtual void ReleaseDelayedBuffers() {}
|
|
|
| #ifndef NDEBUG
|
| // For video, checks that access unit is the key frame or stand-alone EOS.
|
| @@ -252,11 +272,16 @@ class MediaCodecDecoder {
|
|
|
| // Helper methods.
|
|
|
| + // Synchroniously stop decoder thread.
|
| + void DoEmergencyStop();
|
| +
|
| + // Returns true if we are in the process of sync stop.
|
| + bool InEmergencyStop() const { return GetState() == kInEmergencyStop; }
|
| +
|
| // Notifies the decoder if the frame is the last one.
|
| void CheckLastFrame(bool eos_encountered, bool has_delayed_tasks);
|
|
|
| - // Returns true is we are in the process of sync stop.
|
| - bool InEmergencyStop() const { return GetState() == kInEmergencyStop; }
|
| + const char* AsString(RenderMode render_mode);
|
|
|
| // Protected data.
|
|
|
| @@ -282,6 +307,8 @@ class MediaCodecDecoder {
|
| kStopped = 0,
|
| kPrefetching,
|
| kPrefetched,
|
| + kPrerolling,
|
| + kPrerolled,
|
| kRunning,
|
| kStopping,
|
| kInEmergencyStop,
|
| @@ -325,6 +352,7 @@ class MediaCodecDecoder {
|
| // These notifications are called on corresponding conditions.
|
| base::Closure prefetch_done_cb_;
|
| base::Closure starvation_cb_;
|
| + base::Closure preroll_done_cb_;
|
| base::Closure stop_done_cb_;
|
| base::Closure error_cb_;
|
|
|
| @@ -334,10 +362,19 @@ class MediaCodecDecoder {
|
| // Callback used to post OnCodecError method.
|
| base::Closure internal_error_cb_;
|
|
|
| + // Callback for posting OnPrerollDone method.
|
| + base::Closure internal_preroll_done_cb_;
|
| +
|
| // Internal state.
|
| DecoderState state_;
|
| mutable base::Lock state_lock_;
|
|
|
| + // Preroll timestamp is set if we need preroll and cleared after we done it.
|
| + base::TimeDelta preroll_timestamp_;
|
| +
|
| + // Indicates that playback should start with preroll.
|
| + bool needs_preroll_;
|
| +
|
| // Flag is set when the EOS is enqueued into MediaCodec. Reset by Flush.
|
| bool eos_enqueued_;
|
|
|
|
|