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

Side by Side Diff: media/tools/player_x11/player_x11.cc

Issue 237353007: Refactor VideoRendererImpl to use VideoFrameScheduler. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: pretty much done Created 6 years, 8 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 #include <signal.h> 5 #include <signal.h>
6 6
7 #include <iostream> // NOLINT 7 #include <iostream> // NOLINT
8 8
9 #include "base/at_exit.h" 9 #include "base/at_exit.h"
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 11 matching lines...) Expand all
22 #include "media/base/media.h" 22 #include "media/base/media.h"
23 #include "media/base/media_log.h" 23 #include "media/base/media_log.h"
24 #include "media/base/media_switches.h" 24 #include "media/base/media_switches.h"
25 #include "media/base/pipeline.h" 25 #include "media/base/pipeline.h"
26 #include "media/base/video_frame.h" 26 #include "media/base/video_frame.h"
27 #include "media/filters/audio_renderer_impl.h" 27 #include "media/filters/audio_renderer_impl.h"
28 #include "media/filters/ffmpeg_audio_decoder.h" 28 #include "media/filters/ffmpeg_audio_decoder.h"
29 #include "media/filters/ffmpeg_demuxer.h" 29 #include "media/filters/ffmpeg_demuxer.h"
30 #include "media/filters/ffmpeg_video_decoder.h" 30 #include "media/filters/ffmpeg_video_decoder.h"
31 #include "media/filters/file_data_source.h" 31 #include "media/filters/file_data_source.h"
32 #include "media/filters/video_frame_scheduler_impl.h"
33 #include "media/filters/video_frame_scheduler_proxy.h"
32 #include "media/filters/video_renderer_impl.h" 34 #include "media/filters/video_renderer_impl.h"
33 #include "media/tools/player_x11/data_source_logger.h" 35 #include "media/tools/player_x11/data_source_logger.h"
34 36
35 // Include X11 headers here because X11/Xlib.h #define's Status 37 // Include X11 headers here because X11/Xlib.h #define's Status
36 // which causes compiler errors with Status enum declarations 38 // which causes compiler errors with Status enum declarations
37 // in media::DemuxerStream & media::AudioDecoder. 39 // in media::DemuxerStream & media::AudioDecoder.
38 #include <X11/XKBlib.h> 40 #include <X11/XKBlib.h>
39 #include <X11/Xlib.h> 41 #include <X11/Xlib.h>
40 #include "media/tools/player_x11/gl_video_renderer.h" 42 #include "media/tools/player_x11/gl_video_renderer.h"
41 #include "media/tools/player_x11/x11_video_renderer.h" 43 #include "media/tools/player_x11/x11_video_renderer.h"
(...skipping 30 matching lines...) Expand all
72 BlackPixel(g_display, screen), 74 BlackPixel(g_display, screen),
73 BlackPixel(g_display, screen)); 75 BlackPixel(g_display, screen));
74 XStoreName(g_display, g_window, "X11 Media Player"); 76 XStoreName(g_display, g_window, "X11 Media Player");
75 77
76 XSelectInput(g_display, g_window, 78 XSelectInput(g_display, g_window,
77 ExposureMask | ButtonPressMask | KeyPressMask); 79 ExposureMask | ButtonPressMask | KeyPressMask);
78 XMapWindow(g_display, g_window); 80 XMapWindow(g_display, g_window);
79 return true; 81 return true;
80 } 82 }
81 83
82 typedef base::Callback<void(media::VideoFrame*)> PaintCB;
83 void Paint(base::MessageLoop* message_loop, const PaintCB& paint_cb,
84 const scoped_refptr<media::VideoFrame>& video_frame) {
85 if (message_loop != base::MessageLoop::current()) {
86 message_loop->PostTask(FROM_HERE, base::Bind(
87 &Paint, message_loop, paint_cb, video_frame));
88 return;
89 }
90
91 paint_cb.Run(video_frame.get());
92 }
93
94 static void DoNothing() {} 84 static void DoNothing() {}
95 85
96 static void OnStatus(media::PipelineStatus status) {} 86 static void OnStatus(media::PipelineStatus status) {}
97 87
98 static void OnMetadata(media::PipelineMetadata metadata) {} 88 static void OnMetadata(media::PipelineMetadata metadata) {}
99 89
100 static void NeedKey(const std::string& type, 90 static void NeedKey(const std::string& type,
101 const std::vector<uint8>& init_data) { 91 const std::vector<uint8>& init_data) {
102 std::cout << "File is encrypted." << std::endl; 92 std::cout << "File is encrypted." << std::endl;
103 } 93 }
104 94
105 static void SaveStatusAndSignal(base::WaitableEvent* event, 95 static void SaveStatusAndSignal(base::WaitableEvent* event,
106 media::PipelineStatus* status_out, 96 media::PipelineStatus* status_out,
107 media::PipelineStatus status) { 97 media::PipelineStatus status) {
108 *status_out = status; 98 *status_out = status;
109 event->Signal(); 99 event->Signal();
110 } 100 }
111 101
112 // TODO(vrk): Re-enabled audio. (crbug.com/112159) 102 // TODO(vrk): Re-enabled audio. (crbug.com/112159)
113 void InitPipeline( 103 void InitPipeline(
114 media::Pipeline* pipeline, 104 media::Pipeline* pipeline,
115 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, 105 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
116 media::Demuxer* demuxer, 106 media::Demuxer* demuxer,
117 const PaintCB& paint_cb, 107 scoped_ptr<media::VideoFrameScheduler> scheduler,
118 bool /* enable_audio */, 108 bool /* enable_audio */) {
119 base::MessageLoop* paint_message_loop) {
120 // Create our filter factories. 109 // Create our filter factories.
121 scoped_ptr<media::FilterCollection> collection( 110 scoped_ptr<media::FilterCollection> collection(
122 new media::FilterCollection()); 111 new media::FilterCollection());
123 collection->SetDemuxer(demuxer); 112 collection->SetDemuxer(demuxer);
124 113
125 ScopedVector<media::VideoDecoder> video_decoders; 114 ScopedVector<media::VideoDecoder> video_decoders;
126 video_decoders.push_back(new media::FFmpegVideoDecoder(task_runner)); 115 video_decoders.push_back(new media::FFmpegVideoDecoder(task_runner));
127 scoped_ptr<media::VideoRenderer> video_renderer(new media::VideoRendererImpl( 116 scoped_ptr<media::VideoRenderer> video_renderer(
128 task_runner, 117 new media::VideoRendererImpl(task_runner,
129 video_decoders.Pass(), 118 scheduler.Pass(),
130 media::SetDecryptorReadyCB(), 119 video_decoders.Pass(),
131 base::Bind(&Paint, paint_message_loop, paint_cb), 120 media::SetDecryptorReadyCB()));
132 true));
133 collection->SetVideoRenderer(video_renderer.Pass()); 121 collection->SetVideoRenderer(video_renderer.Pass());
134 122
135 ScopedVector<media::AudioDecoder> audio_decoders; 123 ScopedVector<media::AudioDecoder> audio_decoders;
136 audio_decoders.push_back(new media::FFmpegAudioDecoder(task_runner)); 124 audio_decoders.push_back(new media::FFmpegAudioDecoder(task_runner));
137 media::AudioParameters out_params( 125 media::AudioParameters out_params(
138 media::AudioParameters::AUDIO_PCM_LOW_LATENCY, 126 media::AudioParameters::AUDIO_PCM_LOW_LATENCY,
139 media::CHANNEL_LAYOUT_STEREO, 127 media::CHANNEL_LAYOUT_STEREO,
140 44100, 128 44100,
141 16, 129 16,
142 512); 130 512);
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after
270 258
271 // Initialize X11. 259 // Initialize X11.
272 if (!InitX11()) 260 if (!InitX11())
273 return 1; 261 return 1;
274 262
275 // Initialize the pipeline thread and the pipeline. 263 // Initialize the pipeline thread and the pipeline.
276 base::MessageLoop message_loop; 264 base::MessageLoop message_loop;
277 base::Thread media_thread("MediaThread"); 265 base::Thread media_thread("MediaThread");
278 media_thread.Start(); 266 media_thread.Start();
279 267
280 PaintCB paint_cb; 268 media::VideoFrameSchedulerImpl::DisplayCB display_cb;
281 if (command_line->HasSwitch("use-gl")) { 269 if (command_line->HasSwitch("use-gl")) {
282 paint_cb = base::Bind( 270 display_cb = base::Bind(&GlVideoRenderer::Paint,
283 &GlVideoRenderer::Paint, new GlVideoRenderer(g_display, g_window)); 271 new GlVideoRenderer(g_display, g_window));
284 } else { 272 } else {
285 paint_cb = base::Bind( 273 display_cb = base::Bind(&X11VideoRenderer::Paint,
286 &X11VideoRenderer::Paint, new X11VideoRenderer(g_display, g_window)); 274 new X11VideoRenderer(g_display, g_window));
287 } 275 }
288 276
277 scoped_ptr<media::VideoFrameSchedulerImpl> scheduler(
278 new media::VideoFrameSchedulerImpl(message_loop.message_loop_proxy(),
279 display_cb));
280 scoped_ptr<media::VideoFrameScheduler> scheduler_proxy(
281 new media::VideoFrameSchedulerProxy(media_thread.message_loop_proxy(),
282 message_loop.message_loop_proxy(),
283 scheduler.get()));
284
289 scoped_ptr<media::DataSource> data_source(new DataSourceLogger( 285 scoped_ptr<media::DataSource> data_source(new DataSourceLogger(
290 CreateDataSource(filename), command_line->HasSwitch("streaming"))); 286 CreateDataSource(filename), command_line->HasSwitch("streaming")));
291 scoped_ptr<media::Demuxer> demuxer(new media::FFmpegDemuxer( 287 scoped_ptr<media::Demuxer> demuxer(new media::FFmpegDemuxer(
292 media_thread.message_loop_proxy(), data_source.get(), 288 media_thread.message_loop_proxy(), data_source.get(),
293 base::Bind(&NeedKey), new media::MediaLog())); 289 base::Bind(&NeedKey), new media::MediaLog()));
294 290
295 media::Pipeline pipeline(media_thread.message_loop_proxy(), 291 media::Pipeline pipeline(media_thread.message_loop_proxy(),
296 new media::MediaLog()); 292 new media::MediaLog());
297 InitPipeline(&pipeline, media_thread.message_loop_proxy(), demuxer.get(), 293 InitPipeline(&pipeline,
298 paint_cb, command_line->HasSwitch("audio"), &message_loop); 294 media_thread.message_loop_proxy(),
295 demuxer.get(),
296 scheduler_proxy.Pass(),
297 command_line->HasSwitch("audio"));
299 298
300 // Main loop of the application. 299 // Main loop of the application.
301 g_running = true; 300 g_running = true;
302 301
303 message_loop.PostTask(FROM_HERE, base::Bind( 302 message_loop.PostTask(FROM_HERE, base::Bind(
304 &PeriodicalUpdate, base::Unretained(&pipeline), &message_loop)); 303 &PeriodicalUpdate, base::Unretained(&pipeline), &message_loop));
305 message_loop.Run(); 304 message_loop.Run();
306 305
307 // Cleanup tasks. 306 // Cleanup tasks.
308 media_thread.Stop(); 307 media_thread.Stop();
309 308
310 // Release callback which releases video renderer. Do this before cleaning up 309 // Release callback which releases video renderer. Do this before cleaning up
311 // X below since the video renderer has some X cleanup duties as well. 310 // X below since the video renderer has some X cleanup duties as well.
312 paint_cb.Reset(); 311 scheduler.reset();
312 display_cb.Reset();
313 313
314 XDestroyWindow(g_display, g_window); 314 XDestroyWindow(g_display, g_window);
315 XCloseDisplay(g_display); 315 XCloseDisplay(g_display);
316 g_audio_manager = NULL; 316 g_audio_manager = NULL;
317 317
318 return 0; 318 return 0;
319 } 319 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698