| Index: media/renderers/video_renderer_impl.h
|
| diff --git a/media/renderers/video_renderer_impl.h b/media/renderers/video_renderer_impl.h
|
| index 7eb9814204eb61b1bd2c04c8d02c1a1ac87e7c4f..52a15fd5f1110186f57be18278e38c6f42976963 100644
|
| --- a/media/renderers/video_renderer_impl.h
|
| +++ b/media/renderers/video_renderer_impl.h
|
| @@ -14,6 +14,7 @@
|
| #include "base/synchronization/condition_variable.h"
|
| #include "base/synchronization/lock.h"
|
| #include "base/threading/platform_thread.h"
|
| +#include "base/timer/timer.h"
|
| #include "media/base/decryptor.h"
|
| #include "media/base/demuxer_stream.h"
|
| #include "media/base/media_log.h"
|
| @@ -23,6 +24,7 @@
|
| #include "media/base/video_renderer.h"
|
| #include "media/base/video_renderer_sink.h"
|
| #include "media/filters/decoder_stream.h"
|
| +#include "media/filters/video_renderer_algorithm.h"
|
|
|
| namespace base {
|
| class SingleThreadTaskRunner;
|
| @@ -79,6 +81,15 @@ class MEDIA_EXPORT VideoRendererImpl
|
| base::TimeTicks deadline_max) override;
|
| void OnFrameDropped() override;
|
|
|
| + void enable_new_video_renderer_for_testing() {
|
| + use_new_video_renderering_path_ = true;
|
| + }
|
| +
|
| + // Enables or disables background rendering. If |enabled|, |timeout| is the
|
| + // amount of time to wait after the last Render() call before starting the
|
| + // background rendering mode.
|
| + void SetBackgroundRenderingForTesting(bool enabled, base::TimeDelta timeout);
|
| +
|
| private:
|
| // Creates a dedicated |thread_| for video rendering.
|
| void CreateVideoThread();
|
| @@ -123,9 +134,44 @@ class MEDIA_EXPORT VideoRendererImpl
|
| // |wait_duration|.
|
| void UpdateStatsAndWait_Locked(base::TimeDelta wait_duration);
|
|
|
| + // Called after we've painted the first frame. If |time_progressing_| is
|
| + // false it Stop() on |sink_|.
|
| + void MaybeStopSinkAfterFirstPaint();
|
| +
|
| + // Resets and primes the |background_rendering_timer_|, when the timer fires
|
| + // it calls the BackgroundRender() method below.
|
| + void StartBackgroundRenderTimer();
|
| +
|
| + // Called by |background_rendering_timer_| when enough time elapses where we
|
| + // haven't seen a Render() call.
|
| + void BackgroundRender();
|
| + void BackgroundRender_Locked();
|
| +
|
| + // Returns true if there is no more room for additional buffered frames.
|
| + bool HaveReachedBufferingCap();
|
| +
|
| + // Starts or stops |sink_| respectively. Do not call while |lock_| is held.
|
| + void StartSink();
|
| + void StopSink();
|
| +
|
| + // Fires |ended_cb_| if there are no remaining usable frames and
|
| + // |received_end_of_stream_| is true. Sets |rendered_end_of_stream_| if it
|
| + // does so. Returns algorithm_->EffectiveFramesQueued().
|
| + size_t MaybeFireEndedCallback();
|
| +
|
| scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
|
|
|
| + // Enables the use of VideoRendererAlgorithm and VideoRendererSink for frame
|
| + // rendering instead of using a thread in a sleep-loop. Set via the command
|
| + // line flag kEnableNewVideoRenderer or via test methods.
|
| + bool use_new_video_renderering_path_;
|
| +
|
| + // Sink which calls into VideoRendererImpl via Render() for video frames. Do
|
| + // not call any methods on the sink while |lock_| is held or the two threads
|
| + // might deadlock. Do not call Start() or Stop() on the sink directly, use
|
| + // StartSink() and StopSink() to ensure background rendering is started.
|
| VideoRendererSink* const sink_;
|
| + bool sink_started_;
|
|
|
| // Used for accessing data members.
|
| base::Lock lock_;
|
| @@ -219,6 +265,36 @@ class MEDIA_EXPORT VideoRendererImpl
|
|
|
| scoped_ptr<base::TickClock> tick_clock_;
|
|
|
| + // Algorithm for selecting which frame to render; manages frames and all
|
| + // timing related information.
|
| + scoped_ptr<VideoRendererAlgorithm> algorithm_;
|
| +
|
| + // Indicates that Render() callbacks from |sink_| have timed out, so we've
|
| + // entered a background rendering mode where dropped frames are not counted.
|
| + bool is_background_rendering_;
|
| +
|
| + // Allows tests to disable the background rendering task.
|
| + bool should_use_background_renderering_;
|
| +
|
| + // Manages expiration of stale video frames if Render() callbacks timeout. Do
|
| + // not access from the thread Render() is called on. Must only be used on
|
| + // |task_runner_|.
|
| + base::RepeatingTimer<VideoRendererImpl> background_rendering_timer_;
|
| +
|
| + // Indicates whether or not media time is currently progressing or not.
|
| + bool time_progressing_;
|
| +
|
| + // Indicates that Render() should only render the first frame and then request
|
| + // that the sink be stopped.
|
| + bool render_first_frame_and_stop_;
|
| +
|
| + // The time to wait for Render() before firing BackgroundRender().
|
| + base::TimeDelta background_rendering_timeout_;
|
| +
|
| + // Updated on every Render() call, checked by |background_rendering_timer_| to
|
| + // determine if background rendering should start.
|
| + base::TimeTicks last_render_time_;
|
| +
|
| // NOTE: Weak pointers must be invalidated before all other member variables.
|
| base::WeakPtrFactory<VideoRendererImpl> weak_factory_;
|
|
|
|
|