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

Unified Diff: media/base/android/media_codec_decoder.h

Issue 1254293003: MediaCodecPlayer implementation (stage 4 - preroll) (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@mtplayer-browserseek
Patch Set: Save the first post-preroll audio buffer and replay it when preroll is done Created 5 years, 5 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 side-by-side diff with in-line comments
Download patch
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 aeaf4ec77957110bb4a0491e5b7f8f1ac7c78677..c3592b000c090cfb3d28102be7f40a1ffeeae039 100644
--- a/media/base/android/media_codec_decoder.h
+++ b/media/base/android/media_codec_decoder.h
@@ -154,6 +154,7 @@ class MediaCodecDecoder {
const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner,
const base::Closure& external_request_data_cb,
const base::Closure& starvation_cb,
+ const base::Closure& preroll_done_cb,
const base::Closure& stop_done_cb,
const base::Closure& error_cb,
const char* decoder_thread_name);
@@ -177,11 +178,12 @@ class MediaCodecDecoder {
// 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 IsPrerollDone() const;
bool IsStopped() const;
bool IsCompleted() const;
@@ -194,8 +196,13 @@ class MediaCodecDecoder {
// Configures MediaCodec.
ConfigStatus Configure();
+ // Sets preroll timestamp. The rendering starts after we reached it.
+ void SetPrerollTimestamp(base::TimeDelta preroll_timestamp);
+
// Starts the decoder thread and resumes the playback.
- bool Start(base::TimeDelta current_time);
+ bool Start(base::TimeDelta start_timestamp);
+
+ void ResumeAfterPreroll();
// Stops the playback process synchronously. This method stops the decoder
// thread synchronously, and then releases all MediaCodec buffers.
@@ -209,10 +216,19 @@ 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);
protected:
+ enum RenderMode {
+ kRenderSkip = 0,
+ kRenderAfterPreroll,
+ kRenderNow,
+ };
+
// Returns true if the new DemuxerConfigs requires MediaCodec
// reconfiguration.
virtual bool IsCodecReconfigureNeeded(const DemuxerConfigs& curr,
@@ -224,7 +240,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;
@@ -233,16 +252,15 @@ class MediaCodecDecoder {
// a delayed task to do it at a later time,
virtual void Render(int buffer_index,
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.
@@ -254,6 +272,8 @@ class MediaCodecDecoder {
// Notifies the decoder if the frame is the last one.
void CheckLastFrame(bool eos_encountered, bool has_delayed_tasks);
+ const char* AsString(RenderMode render_mode);
+
// Protected data.
// Object for posting tasks on Media thread.
@@ -278,6 +298,8 @@ class MediaCodecDecoder {
kStopped = 0,
kPrefetching,
kPrefetched,
+ kPrerolling,
+ kPrerolled,
kRunning,
kStopping,
kInEmergencyStop,
@@ -321,6 +343,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_;
@@ -330,10 +353,16 @@ 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_;
+
// Flag is set when the EOS is enqueued into MediaCodec. Reset by Flush.
bool eos_enqueued_;

Powered by Google App Engine
This is Rietveld 408576698