OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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 <iostream> | 5 #include <iostream> |
6 #include <signal.h> | 6 #include <signal.h> |
7 #include <X11/Xlib.h> | 7 #include <X11/Xlib.h> |
8 | 8 |
9 #include "base/at_exit.h" | 9 #include "base/at_exit.h" |
10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
116 | 116 |
117 // And starts the playback. | 117 // And starts the playback. |
118 (*pipeline)->SetPlaybackRate(1.0f); | 118 (*pipeline)->SetPlaybackRate(1.0f); |
119 return true; | 119 return true; |
120 } | 120 } |
121 | 121 |
122 void TerminateHandler(int signal) { | 122 void TerminateHandler(int signal) { |
123 g_running = false; | 123 g_running = false; |
124 } | 124 } |
125 | 125 |
| 126 void PeriodicalUpdate(MessageLoop* message_loop, bool audio_only) { |
| 127 if (!g_running) { |
| 128 message_loop->Quit(); |
| 129 return; |
| 130 } |
| 131 |
| 132 // Consume all the X events |
| 133 while (XPending(g_display)) { |
| 134 XEvent e; |
| 135 XNextEvent(g_display, &e); |
| 136 if (e.type == Expose) { |
| 137 if (!audio_only) { |
| 138 // Tell the renderer to paint. |
| 139 DCHECK(Renderer::instance()); |
| 140 Renderer::instance()->Paint(); |
| 141 } |
| 142 } else if (e.type == ButtonPress) { |
| 143 g_running = false; |
| 144 message_loop->Quit(); |
| 145 return; |
| 146 } |
| 147 } |
| 148 |
| 149 message_loop->PostDelayedTask(FROM_HERE, |
| 150 NewRunnableFunction(PeriodicalUpdate, message_loop, audio_only), 10); |
| 151 } |
| 152 |
126 int main(int argc, char** argv) { | 153 int main(int argc, char** argv) { |
127 // Read arguments. | 154 // Read arguments. |
128 if (argc == 1) { | 155 if (argc == 1) { |
129 std::cout << "Usage: " << argv[0] << " --file=FILE" << std::endl | 156 std::cout << "Usage: " << argv[0] << " --file=FILE" << std::endl |
130 << std::endl | 157 << std::endl |
131 << "Optional arguments:" << std::endl | 158 << "Optional arguments:" << std::endl |
132 << " [--enable-openmax]" | 159 << " [--enable-openmax]" |
133 << " [--audio]" | 160 << " [--audio]" |
134 << " [--alsa-device=DEVICE]" << std::endl; | 161 << " [--alsa-device=DEVICE]" << std::endl; |
135 return 1; | 162 return 1; |
(...skipping 21 matching lines...) Expand all Loading... |
157 thread.reset(new base::Thread("PipelineThread")); | 184 thread.reset(new base::Thread("PipelineThread")); |
158 thread->Start(); | 185 thread->Start(); |
159 if (InitPipeline(thread->message_loop(), filename.c_str(), | 186 if (InitPipeline(thread->message_loop(), filename.c_str(), |
160 enable_audio, &pipeline)) { | 187 enable_audio, &pipeline)) { |
161 // Main loop of the application. | 188 // Main loop of the application. |
162 g_running = true; | 189 g_running = true; |
163 | 190 |
164 // Check if video is present. | 191 // Check if video is present. |
165 audio_only = !pipeline->IsRendered(media::mime_type::kMajorTypeVideo); | 192 audio_only = !pipeline->IsRendered(media::mime_type::kMajorTypeVideo); |
166 | 193 |
167 while (g_running) { | 194 MessageLoop message_loop; |
168 if (XPending(g_display)) { | 195 if (!audio_only) { |
169 XEvent e; | 196 // Tell the renderer to paint. |
170 XNextEvent(g_display, &e); | 197 DCHECK(Renderer::instance()); |
171 if (e.type == Expose) { | 198 Renderer::instance()->set_glx_thread_message_loop(&message_loop); |
172 if (!audio_only) { | 199 } |
173 // Tell the renderer to paint. | |
174 DCHECK(Renderer::instance()); | |
175 Renderer::instance()->Paint(); | |
176 } | |
177 } else if (e.type == ButtonPress) { | |
178 // Stop the playback. | |
179 break; | |
180 } | |
181 } else { | |
182 // If there's no event in the queue, make an expose event. | |
183 XEvent event; | |
184 event.type = Expose; | |
185 XSendEvent(g_display, g_window, true, ExposureMask, &event); | |
186 | 200 |
187 // TODO(hclam): It is rather arbitrary to sleep for 10ms and wait | 201 message_loop.PostTask(FROM_HERE, |
188 // for the next event. We should submit an expose event when | 202 NewRunnableFunction(PeriodicalUpdate, &message_loop, audio_only)); |
189 // a frame is available but not firing an expose event every 10ms. | 203 message_loop.Run(); |
190 usleep(10000); | 204 |
191 } | |
192 } | |
193 pipeline->Stop(NULL); | 205 pipeline->Stop(NULL); |
194 } else{ | 206 } else{ |
195 std::cout << "Pipeline initialization failed..." << std::endl; | 207 std::cout << "Pipeline initialization failed..." << std::endl; |
196 } | 208 } |
197 | 209 |
198 // Cleanup tasks. | 210 // Cleanup tasks. |
199 thread->Stop(); | 211 thread->Stop(); |
200 XDestroyWindow(g_display, g_window); | 212 XDestroyWindow(g_display, g_window); |
201 XCloseDisplay(g_display); | 213 XCloseDisplay(g_display); |
202 return 0; | 214 return 0; |
203 } | 215 } |
OLD | NEW |