video_renderer_impl.h revision 010d83a9304c5a91596085d917d248abff47903a
1f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#ifndef MEDIA_FILTERS_VIDEO_RENDERER_IMPL_H_
6f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#define MEDIA_FILTERS_VIDEO_RENDERER_IMPL_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <deque>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h"
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/memory/scoped_vector.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/weak_ptr.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/synchronization/condition_variable.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/synchronization/lock.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/platform_thread.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "media/base/decryptor.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/demuxer_stream.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/pipeline_status.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/video_decoder.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/video_frame.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/video_renderer.h"
22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "media/filters/decoder_stream.h"
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace base {
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class SingleThreadTaskRunner;
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace media {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// VideoRendererImpl creates its own thread for the sole purpose of timing frame
317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// presentation.  It handles reading from the VideoFrameStream and stores the
327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// results in a queue of decoded frames and executing a callback when a frame is
337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// ready for rendering.
34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class MEDIA_EXPORT VideoRendererImpl
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public VideoRenderer,
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      public base::PlatformThread::Delegate {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef base::Callback<void(const scoped_refptr<VideoFrame>&)> PaintCB;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // |decoders| contains the VideoDecoders to use when initializing.
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  //
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |paint_cb| is executed on the video frame timing thread whenever a new
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // frame is available for painting.
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Implementors should avoid doing any sort of heavy work in this method and
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // instead post a task to a common/worker thread to handle rendering.  Slowing
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // down the video thread may result in losing synchronization with audio.
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Setting |drop_frames_| to true causes the renderer to drop expired frames.
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  VideoRendererImpl(
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ScopedVector<VideoDecoder> decoders,
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const SetDecryptorReadyCB& set_decryptor_ready_cb,
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const PaintCB& paint_cb,
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      bool drop_frames);
56f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual ~VideoRendererImpl();
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // VideoRenderer implementation.
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void Initialize(DemuxerStream* stream,
605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          bool low_delay,
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          const PipelineStatusCB& init_cb,
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          const StatisticsCB& statistics_cb,
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          const TimeCB& max_time_cb,
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          const base::Closure& ended_cb,
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          const PipelineStatusCB& error_cb,
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          const TimeDeltaCB& get_time_cb,
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          const TimeDeltaCB& get_duration_cb) OVERRIDE;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Play(const base::Closure& callback) OVERRIDE;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Pause(const base::Closure& callback) OVERRIDE;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Flush(const base::Closure& callback) OVERRIDE;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Preroll(base::TimeDelta time,
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const PipelineStatusCB& cb) OVERRIDE;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Stop(const base::Closure& callback) OVERRIDE;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetPlaybackRate(float playback_rate) OVERRIDE;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // PlatformThread::Delegate implementation.
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void ThreadMain() OVERRIDE;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Callback for |video_frame_stream_| initialization.
81a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  void OnVideoFrameStreamInitialized(bool success);
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Callback for |video_frame_stream_| to deliver decoded video frames and
847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // report video decoding status.
85558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  void FrameReady(VideoFrameStream::Status status,
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  const scoped_refptr<VideoFrame>& frame);
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Helper method for adding a frame to |ready_frames_|.
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void AddReadyFrame_Locked(const scoped_refptr<VideoFrame>& frame);
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Helper method that schedules an asynchronous read from the
927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // |video_frame_stream_| as long as there isn't a pending read and we have
937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // capacity.
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void AttemptRead();
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AttemptRead_Locked();
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Called when VideoFrameStream::Reset() completes.
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void OnVideoFrameStreamResetDone();
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Calculates the duration to sleep for based on |last_timestamp_|,
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the next frame timestamp (may be NULL), and the provided playback rate.
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We don't use |playback_rate_| to avoid locking.
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::TimeDelta CalculateSleepDuration(
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const scoped_refptr<VideoFrame>& next_frame,
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      float playback_rate);
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Helper function that flushes the buffers when a Stop() or error occurs.
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DoStopOrError_Locked();
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Runs |paint_cb_| with the next frame from |ready_frames_|.
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // A read is scheduled to replace the frame.
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void PaintNextReadyFrame_Locked();
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Drops the next frame from |ready_frames_| and runs |statistics_cb_|.
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // A read is scheduled to replace the frame.
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void DropNextReadyFrame_Locked();
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void TransitionToPrerolled_Locked();
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
123a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Returns true of all conditions have been met to transition from
124a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // kPrerolling to kPrerolled.
125a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  bool ShouldTransitionToPrerolled_Locked();
126a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
1274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Runs |statistics_cb_| with |frames_decoded_| and |frames_dropped_|, resets
1284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // them to 0, and then waits on |frame_available_| for up to the
1294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // |wait_duration|.
1304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void UpdateStatsAndWait_Locked(base::TimeDelta wait_duration);
1314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Used for accessing data members.
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Lock lock_;
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
137f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Provides video frames to VideoRendererImpl.
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VideoFrameStream video_frame_stream_;
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
140010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Flag indicating low-delay mode.
141010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bool low_delay_;
142010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Queue of incoming frames yet to be painted.
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::deque<scoped_refptr<VideoFrame> > VideoFrameQueue;
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VideoFrameQueue ready_frames_;
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Keeps track of whether we received the end of stream buffer.
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool received_end_of_stream_;
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Used to signal |thread_| as frames are added to |frames_|.  Rule of thumb:
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // always check |state_| to see if it was set to STOPPED after waking up!
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::ConditionVariable frame_available_;
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // State transition Diagram of this class:
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //       [kUninitialized] -------> [kError]
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //              |
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //              | Initialize()
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //        [kInitializing]
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //              |
1607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  //              V
1617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  //   +------[kFlushed]<---------------OnVideoFrameStreamResetDone()
1627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  //   |          | Preroll() or upon               ^
1637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  //   |          V got first frame            [kFlushing]
1647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  //   |      [kPrerolling]                         ^
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   |          |                                 | Flush()
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   |          V Got enough frames               |
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   |      [kPrerolled]---------------------->[kPaused]
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   |          |                Pause()          ^
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   |          V Play()                          |
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   |       [kPlaying]---------------------------|
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   |          |                Pause()          ^
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   |          V Receive EOF frame.              | Pause()
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   |       [kEnded]-----------------------------+
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   |                                            ^
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   |                                            |
1767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  //   +-----> [kStopped]                 [Any state other than]
1777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  //                                      [kUninitialized/kError]
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simple state tracking variable.
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum State {
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kUninitialized,
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    kInitializing,
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kPrerolled,
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kPaused,
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kFlushing,
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kFlushed,
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kPrerolling,
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kPlaying,
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kEnded,
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kStopped,
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kError,
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  State state_;
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Video thread handle.
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::PlatformThreadHandle thread_;
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Keep track of the outstanding read on the VideoFrameStream. Flushing can
1997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // only complete once the read has completed.
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool pending_read_;
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool drop_frames_;
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  float playback_rate_;
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Playback operation callbacks.
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Closure flush_cb_;
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PipelineStatusCB preroll_cb_;
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Event callbacks.
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PipelineStatusCB init_cb_;
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StatisticsCB statistics_cb_;
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TimeCB max_time_cb_;
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Closure ended_cb_;
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PipelineStatusCB error_cb_;
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TimeDeltaCB get_time_cb_;
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TimeDeltaCB get_duration_cb_;
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::TimeDelta preroll_timestamp_;
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Embedder callback for notifying a new frame is available for painting.
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PaintCB paint_cb_;
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The timestamp of the last frame removed from the |ready_frames_| queue,
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // either for calling |paint_cb_| or for dropping. Set to kNoTimestamp()
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // during flushing.
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::TimeDelta last_timestamp_;
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Keeps track of the number of frames decoded and dropped since the
2304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // last call to |statistics_cb_|. These must be accessed under lock.
2314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  int frames_decoded_;
2324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  int frames_dropped_;
2334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
23423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // NOTE: Weak pointers must be invalidated before all other member variables.
23523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  base::WeakPtrFactory<VideoRendererImpl> weak_factory_;
23623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
237f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(VideoRendererImpl);
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace media
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
242f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif  // MEDIA_FILTERS_VIDEO_RENDERER_IMPL_H_
243