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 73846ed9ca49fe06c767ceb61b69566311ecfc06..fb795c507c25f8a406720c6c65771d2ecc93ba5a 100644 |
--- a/media/tools/player_x11/player_x11.cc |
+++ b/media/tools/player_x11/player_x11.cc |
@@ -123,6 +123,33 @@ void TerminateHandler(int signal) { |
g_running = false; |
} |
+void PeriodicalUpdate(MessageLoop* message_loop, bool audio_only) { |
+ if (!g_running) { |
+ message_loop->Quit(); |
+ return; |
+ } |
+ |
+ // Consume all the X events |
+ while (XPending(g_display)) { |
+ XEvent e; |
+ XNextEvent(g_display, &e); |
+ if (e.type == Expose) { |
+ if (!audio_only) { |
+ // Tell the renderer to paint. |
+ DCHECK(Renderer::instance()); |
+ Renderer::instance()->Paint(); |
+ } |
+ } else if (e.type == ButtonPress) { |
+ g_running = false; |
+ message_loop->Quit(); |
+ return; |
+ } |
+ } |
+ |
+ message_loop->PostDelayedTask(FROM_HERE, |
+ NewRunnableFunction(PeriodicalUpdate, message_loop, audio_only), 10); |
+} |
+ |
int main(int argc, char** argv) { |
// Read arguments. |
if (argc == 1) { |
@@ -164,32 +191,17 @@ int main(int argc, char** argv) { |
// Check if video is present. |
audio_only = !pipeline->IsRendered(media::mime_type::kMajorTypeVideo); |
- while (g_running) { |
- if (XPending(g_display)) { |
- XEvent e; |
- XNextEvent(g_display, &e); |
- if (e.type == Expose) { |
- if (!audio_only) { |
- // Tell the renderer to paint. |
- DCHECK(Renderer::instance()); |
- Renderer::instance()->Paint(); |
- } |
- } else if (e.type == ButtonPress) { |
- // Stop the playback. |
- break; |
- } |
- } else { |
- // If there's no event in the queue, make an expose event. |
- XEvent event; |
- event.type = Expose; |
- XSendEvent(g_display, g_window, true, ExposureMask, &event); |
- |
- // TODO(hclam): It is rather arbitrary to sleep for 10ms and wait |
- // for the next event. We should submit an expose event when |
- // a frame is available but not firing an expose event every 10ms. |
- usleep(10000); |
- } |
+ MessageLoop message_loop; |
+ if (!audio_only) { |
+ // Tell the renderer to paint. |
+ DCHECK(Renderer::instance()); |
+ Renderer::instance()->set_glx_thread_message_loop(&message_loop); |
} |
+ |
+ message_loop.PostTask(FROM_HERE, |
+ NewRunnableFunction(PeriodicalUpdate, &message_loop, audio_only)); |
+ message_loop.Run(); |
+ |
pipeline->Stop(NULL); |
} else{ |
std::cout << "Pipeline initialization failed..." << std::endl; |