| OLD | NEW | 
|---|
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 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 MEDIA_RENDERERS_VIDEO_RENDERER_IMPL_H_ | 5 #ifndef MEDIA_RENDERERS_VIDEO_RENDERER_IMPL_H_ | 
| 6 #define MEDIA_RENDERERS_VIDEO_RENDERER_IMPL_H_ | 6 #define MEDIA_RENDERERS_VIDEO_RENDERER_IMPL_H_ | 
| 7 | 7 | 
| 8 #include <stddef.h> | 8 #include <stddef.h> | 
| 9 #include <stdint.h> | 9 #include <stdint.h> | 
| 10 | 10 | 
| (...skipping 10 matching lines...) Expand all  Loading... | 
| 21 #include "media/base/decryptor.h" | 21 #include "media/base/decryptor.h" | 
| 22 #include "media/base/demuxer_stream.h" | 22 #include "media/base/demuxer_stream.h" | 
| 23 #include "media/base/media_log.h" | 23 #include "media/base/media_log.h" | 
| 24 #include "media/base/pipeline_status.h" | 24 #include "media/base/pipeline_status.h" | 
| 25 #include "media/base/video_decoder.h" | 25 #include "media/base/video_decoder.h" | 
| 26 #include "media/base/video_frame.h" | 26 #include "media/base/video_frame.h" | 
| 27 #include "media/base/video_renderer.h" | 27 #include "media/base/video_renderer.h" | 
| 28 #include "media/base/video_renderer_sink.h" | 28 #include "media/base/video_renderer_sink.h" | 
| 29 #include "media/filters/decoder_stream.h" | 29 #include "media/filters/decoder_stream.h" | 
| 30 #include "media/filters/video_renderer_algorithm.h" | 30 #include "media/filters/video_renderer_algorithm.h" | 
|  | 31 #include "media/renderers/default_renderer_factory.h" | 
| 31 #include "media/renderers/gpu_video_accelerator_factories.h" | 32 #include "media/renderers/gpu_video_accelerator_factories.h" | 
| 32 #include "media/video/gpu_memory_buffer_video_frame_pool.h" | 33 #include "media/video/gpu_memory_buffer_video_frame_pool.h" | 
| 33 | 34 | 
| 34 namespace base { | 35 namespace base { | 
| 35 class SingleThreadTaskRunner; | 36 class SingleThreadTaskRunner; | 
| 36 class TickClock; | 37 class TickClock; | 
| 37 } | 38 } | 
| 38 | 39 | 
| 39 namespace media { | 40 namespace media { | 
| 40 | 41 | 
| 41 // VideoRendererImpl handles reading from a VideoFrameStream storing the | 42 // VideoRendererImpl handles reading from a VideoFrameStream storing the | 
| 42 // results in a queue of decoded frames and executing a callback when a frame is | 43 // results in a queue of decoded frames and executing a callback when a frame is | 
| 43 // ready for rendering. | 44 // ready for rendering. | 
| 44 class MEDIA_EXPORT VideoRendererImpl | 45 class MEDIA_EXPORT VideoRendererImpl | 
| 45     : public VideoRenderer, | 46     : public VideoRenderer, | 
| 46       public NON_EXPORTED_BASE(VideoRendererSink::RenderCallback) { | 47       public NON_EXPORTED_BASE(VideoRendererSink::RenderCallback) { | 
| 47  public: | 48  public: | 
| 48   // |decoders| contains the VideoDecoders to use when initializing. | 49   // |decoders| contains the VideoDecoders to use when initializing. | 
| 49   // | 50   // | 
| 50   // Implementors should avoid doing any sort of heavy work in this method and | 51   // Implementors should avoid doing any sort of heavy work in this method and | 
| 51   // instead post a task to a common/worker thread to handle rendering.  Slowing | 52   // instead post a task to a common/worker thread to handle rendering.  Slowing | 
| 52   // down the video thread may result in losing synchronization with audio. | 53   // down the video thread may result in losing synchronization with audio. | 
| 53   // | 54   // | 
| 54   // Setting |drop_frames_| to true causes the renderer to drop expired frames. | 55   // Setting |drop_frames_| to true causes the renderer to drop expired frames. | 
| 55   VideoRendererImpl( | 56   VideoRendererImpl( | 
| 56       const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner, | 57       const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner, | 
| 57       const scoped_refptr<base::TaskRunner>& worker_task_runner, | 58       const scoped_refptr<base::TaskRunner>& worker_task_runner, | 
| 58       VideoRendererSink* sink, | 59       VideoRendererSink* sink, | 
| 59       ScopedVector<VideoDecoder> decoders, | 60       const CreateVideoDecodersCB& create_video_decoders_cb, | 
| 60       bool drop_frames, | 61       bool drop_frames, | 
| 61       GpuVideoAcceleratorFactories* gpu_factories, | 62       GpuVideoAcceleratorFactories* gpu_factories, | 
| 62       const scoped_refptr<MediaLog>& media_log); | 63       const scoped_refptr<MediaLog>& media_log); | 
| 63   ~VideoRendererImpl() override; | 64   ~VideoRendererImpl() override; | 
| 64 | 65 | 
| 65   // VideoRenderer implementation. | 66   // VideoRenderer implementation. | 
| 66   void Initialize(DemuxerStream* stream, | 67   void Initialize(DemuxerStream* stream, | 
| 67                   CdmContext* cdm_context, | 68                   CdmContext* cdm_context, | 
| 68                   RendererClient* client, | 69                   RendererClient* client, | 
| 69                   const TimeSource::WallClockTimeCB& wall_clock_time_cb, | 70                   const TimeSource::WallClockTimeCB& wall_clock_time_cb, | 
| (...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 213   bool low_delay_; | 214   bool low_delay_; | 
| 214 | 215 | 
| 215   // Keeps track of whether we received the end of stream buffer and finished | 216   // Keeps track of whether we received the end of stream buffer and finished | 
| 216   // rendering. | 217   // rendering. | 
| 217   bool received_end_of_stream_; | 218   bool received_end_of_stream_; | 
| 218   bool rendered_end_of_stream_; | 219   bool rendered_end_of_stream_; | 
| 219 | 220 | 
| 220   // Important detail: being in kPlaying doesn't imply that video is being | 221   // Important detail: being in kPlaying doesn't imply that video is being | 
| 221   // rendered. Rather, it means that the renderer is ready to go. The actual | 222   // rendered. Rather, it means that the renderer is ready to go. The actual | 
| 222   // rendering of video is controlled by time advancing via |get_time_cb_|. | 223   // rendering of video is controlled by time advancing via |get_time_cb_|. | 
|  | 224   // Video renderer can be reinitialized completely by calling Initialize again | 
|  | 225   // when it is in a kFlushed state with video sink stopped. | 
| 223   // | 226   // | 
| 224   //   kUninitialized | 227   //    kUninitialized | 
| 225   //         | Initialize() | 228   //  +------> | Initialize() | 
| 226   //         | | 229   //  |        | | 
| 227   //         V | 230   //  |        V | 
| 228   //    kInitializing | 231   //  |   kInitializing | 
| 229   //         | Decoders initialized | 232   //  |        | Decoders initialized | 
| 230   //         | | 233   //  |        | | 
| 231   //         V            Decoders reset | 234   //  |        V            Decoders reset | 
| 232   //      kFlushed <------------------ kFlushing | 235   //  ---- kFlushed <------------------ kFlushing | 
| 233   //         | StartPlayingFrom()         ^ | 236   //           | StartPlayingFrom()         ^ | 
| 234   //         |                            | | 237   //           |                            | | 
| 235   //         |                            | Flush() | 238   //           |                            | Flush() | 
| 236   //         `---------> kPlaying --------' | 239   //           `---------> kPlaying --------' | 
| 237   enum State { | 240   enum State { | 
| 238     kUninitialized, | 241     kUninitialized, | 
| 239     kInitializing, | 242     kInitializing, | 
| 240     kFlushing, | 243     kFlushing, | 
| 241     kFlushed, | 244     kFlushed, | 
| 242     kPlaying | 245     kPlaying | 
| 243   }; | 246   }; | 
| 244   State state_; | 247   State state_; | 
| 245 | 248 | 
|  | 249   // TODO(servolk): Consider using DecoderFactory here instead of the | 
|  | 250   // CreateVideoDecodersCB. | 
|  | 251   CreateVideoDecodersCB create_video_decoders_cb_; | 
|  | 252   GpuVideoAcceleratorFactories* gpu_factories_; | 
|  | 253   scoped_refptr<base::TaskRunner> worker_task_runner_; | 
|  | 254 | 
| 246   // Keep track of the outstanding read on the VideoFrameStream. Flushing can | 255   // Keep track of the outstanding read on the VideoFrameStream. Flushing can | 
| 247   // only complete once the read has completed. | 256   // only complete once the read has completed. | 
| 248   bool pending_read_; | 257   bool pending_read_; | 
| 249 | 258 | 
| 250   bool drop_frames_; | 259   bool drop_frames_; | 
| 251 | 260 | 
| 252   BufferingState buffering_state_; | 261   BufferingState buffering_state_; | 
| 253 | 262 | 
| 254   // Playback operation callbacks. | 263   // Playback operation callbacks. | 
| 255   PipelineStatusCB init_cb_; | 264   PipelineStatusCB init_cb_; | 
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 304   // want to discard video frames that might be received after the stream has | 313   // want to discard video frames that might be received after the stream has | 
| 305   // been reset. | 314   // been reset. | 
| 306   base::WeakPtrFactory<VideoRendererImpl> frame_callback_weak_factory_; | 315   base::WeakPtrFactory<VideoRendererImpl> frame_callback_weak_factory_; | 
| 307 | 316 | 
| 308   DISALLOW_COPY_AND_ASSIGN(VideoRendererImpl); | 317   DISALLOW_COPY_AND_ASSIGN(VideoRendererImpl); | 
| 309 }; | 318 }; | 
| 310 | 319 | 
| 311 }  // namespace media | 320 }  // namespace media | 
| 312 | 321 | 
| 313 #endif  // MEDIA_RENDERERS_VIDEO_RENDERER_IMPL_H_ | 322 #endif  // MEDIA_RENDERERS_VIDEO_RENDERER_IMPL_H_ | 
| OLD | NEW | 
|---|