| Index: media/tools/player_x11/player_x11.cc
|
| diff --git a/media/tools/player_x11/player_x11.cc b/media/tools/player_x11/player_x11.cc
|
| index d71cd1a876d901fdc47257fed69afccfb829f7ba..ecd242dc85af24d64045ac005cff4b7b8137cd3b 100644
|
| --- a/media/tools/player_x11/player_x11.cc
|
| +++ b/media/tools/player_x11/player_x11.cc
|
| @@ -29,6 +29,8 @@
|
| #include "media/filters/ffmpeg_demuxer.h"
|
| #include "media/filters/ffmpeg_video_decoder.h"
|
| #include "media/filters/file_data_source.h"
|
| +#include "media/filters/video_frame_scheduler_impl.h"
|
| +#include "media/filters/video_frame_scheduler_proxy.h"
|
| #include "media/filters/video_renderer_impl.h"
|
| #include "media/tools/player_x11/data_source_logger.h"
|
|
|
| @@ -79,18 +81,6 @@ bool InitX11() {
|
| return true;
|
| }
|
|
|
| -typedef base::Callback<void(media::VideoFrame*)> PaintCB;
|
| -void Paint(base::MessageLoop* message_loop, const PaintCB& paint_cb,
|
| - const scoped_refptr<media::VideoFrame>& video_frame) {
|
| - if (message_loop != base::MessageLoop::current()) {
|
| - message_loop->PostTask(FROM_HERE, base::Bind(
|
| - &Paint, message_loop, paint_cb, video_frame));
|
| - return;
|
| - }
|
| -
|
| - paint_cb.Run(video_frame.get());
|
| -}
|
| -
|
| static void DoNothing() {}
|
|
|
| static void OnStatus(media::PipelineStatus status) {}
|
| @@ -114,9 +104,8 @@ void InitPipeline(
|
| media::Pipeline* pipeline,
|
| const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
|
| media::Demuxer* demuxer,
|
| - const PaintCB& paint_cb,
|
| - bool /* enable_audio */,
|
| - base::MessageLoop* paint_message_loop) {
|
| + scoped_ptr<media::VideoFrameScheduler> scheduler,
|
| + bool /* enable_audio */) {
|
| // Create our filter factories.
|
| scoped_ptr<media::FilterCollection> collection(
|
| new media::FilterCollection());
|
| @@ -124,12 +113,11 @@ void InitPipeline(
|
|
|
| ScopedVector<media::VideoDecoder> video_decoders;
|
| video_decoders.push_back(new media::FFmpegVideoDecoder(task_runner));
|
| - scoped_ptr<media::VideoRenderer> video_renderer(new media::VideoRendererImpl(
|
| - task_runner,
|
| - video_decoders.Pass(),
|
| - media::SetDecryptorReadyCB(),
|
| - base::Bind(&Paint, paint_message_loop, paint_cb),
|
| - true));
|
| + scoped_ptr<media::VideoRenderer> video_renderer(
|
| + new media::VideoRendererImpl(task_runner,
|
| + scheduler.Pass(),
|
| + video_decoders.Pass(),
|
| + media::SetDecryptorReadyCB()));
|
| collection->SetVideoRenderer(video_renderer.Pass());
|
|
|
| ScopedVector<media::AudioDecoder> audio_decoders;
|
| @@ -277,15 +265,23 @@ int main(int argc, char** argv) {
|
| base::Thread media_thread("MediaThread");
|
| media_thread.Start();
|
|
|
| - PaintCB paint_cb;
|
| + media::VideoFrameSchedulerImpl::DisplayCB display_cb;
|
| if (command_line->HasSwitch("use-gl")) {
|
| - paint_cb = base::Bind(
|
| - &GlVideoRenderer::Paint, new GlVideoRenderer(g_display, g_window));
|
| + display_cb = base::Bind(&GlVideoRenderer::Paint,
|
| + new GlVideoRenderer(g_display, g_window));
|
| } else {
|
| - paint_cb = base::Bind(
|
| - &X11VideoRenderer::Paint, new X11VideoRenderer(g_display, g_window));
|
| + display_cb = base::Bind(&X11VideoRenderer::Paint,
|
| + new X11VideoRenderer(g_display, g_window));
|
| }
|
|
|
| + scoped_ptr<media::VideoFrameSchedulerImpl> scheduler(
|
| + new media::VideoFrameSchedulerImpl(message_loop.message_loop_proxy(),
|
| + display_cb));
|
| + scoped_ptr<media::VideoFrameScheduler> scheduler_proxy(
|
| + new media::VideoFrameSchedulerProxy(media_thread.message_loop_proxy(),
|
| + message_loop.message_loop_proxy(),
|
| + scheduler.get()));
|
| +
|
| scoped_ptr<media::DataSource> data_source(new DataSourceLogger(
|
| CreateDataSource(filename), command_line->HasSwitch("streaming")));
|
| scoped_ptr<media::Demuxer> demuxer(new media::FFmpegDemuxer(
|
| @@ -294,8 +290,11 @@ int main(int argc, char** argv) {
|
|
|
| media::Pipeline pipeline(media_thread.message_loop_proxy(),
|
| new media::MediaLog());
|
| - InitPipeline(&pipeline, media_thread.message_loop_proxy(), demuxer.get(),
|
| - paint_cb, command_line->HasSwitch("audio"), &message_loop);
|
| + InitPipeline(&pipeline,
|
| + media_thread.message_loop_proxy(),
|
| + demuxer.get(),
|
| + scheduler_proxy.Pass(),
|
| + command_line->HasSwitch("audio"));
|
|
|
| // Main loop of the application.
|
| g_running = true;
|
| @@ -309,7 +308,8 @@ int main(int argc, char** argv) {
|
|
|
| // Release callback which releases video renderer. Do this before cleaning up
|
| // X below since the video renderer has some X cleanup duties as well.
|
| - paint_cb.Reset();
|
| + scheduler.reset();
|
| + display_cb.Reset();
|
|
|
| XDestroyWindow(g_display, g_window);
|
| XCloseDisplay(g_display);
|
|
|