Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2009-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" |
| 11 #include "base/file_path.h" | 11 #include "base/file_path.h" |
| 12 #include "base/scoped_ptr.h" | 12 #include "base/scoped_ptr.h" |
| 13 #include "base/thread.h" | 13 #include "base/thread.h" |
| 14 #include "media/base/media.h" | 14 #include "media/base/media.h" |
| 15 #include "media/base/media_switches.h" | 15 #include "media/base/media_switches.h" |
| 16 #include "media/base/pipeline_impl.h" | 16 #include "media/base/pipeline_impl.h" |
| 17 #include "media/filters/audio_renderer_impl.h" | 17 #include "media/filters/audio_renderer_impl.h" |
| 18 #include "media/filters/ffmpeg_audio_decoder.h" | 18 #include "media/filters/ffmpeg_audio_decoder.h" |
| 19 #include "media/filters/ffmpeg_demuxer.h" | 19 #include "media/filters/ffmpeg_demuxer.h" |
| 20 #include "media/filters/ffmpeg_video_decoder.h" | 20 #include "media/filters/ffmpeg_video_decoder.h" |
| 21 #include "media/filters/file_data_source.h" | 21 #include "media/filters/file_data_source.h" |
| 22 #include "media/filters/null_audio_renderer.h" | 22 #include "media/filters/null_audio_renderer.h" |
| 23 #include "media/filters/omx_video_decoder.h" | 23 #include "media/filters/omx_video_decoder.h" |
| 24 | |
| 25 #if defined(RENDERER_GL) | |
| 26 #include "media/tools/player_x11/gl_video_renderer.h" | |
| 27 #define Renderer GlVideoRenderer | |
|
scherkus (not reviewing)
2010/02/12 01:04:20
typedef doesn't work here?
| |
| 28 #elif RENDERER_GLES | |
| 29 #include "media/tools/player_x11/gles_video_renderer.h" | |
| 30 #define Renderer GlesVideoRenderer | |
| 31 #elif RENDERER_X11 | |
| 24 #include "media/tools/player_x11/x11_video_renderer.h" | 32 #include "media/tools/player_x11/x11_video_renderer.h" |
| 33 #define Renderer X11VideoRenderer | |
| 34 #endif | |
| 25 | 35 |
| 26 Display* g_display = NULL; | 36 Display* g_display = NULL; |
| 27 Window g_window = 0; | 37 Window g_window = 0; |
| 28 bool g_running = false; | 38 bool g_running = false; |
| 29 | 39 |
| 30 // Initialize X11. Returns true if successful. This method creates the X11 | 40 // Initialize X11. Returns true if successful. This method creates the X11 |
| 31 // window. Further initialization is done in X11VideoRenderer. | 41 // window. Further initialization is done in X11VideoRenderer. |
| 32 bool InitX11() { | 42 bool InitX11() { |
| 33 g_display = XOpenDisplay(NULL); | 43 g_display = XOpenDisplay(NULL); |
| 34 if (!g_display) { | 44 if (!g_display) { |
| (...skipping 29 matching lines...) Expand all Loading... | |
| 64 scoped_refptr<media::FilterFactoryCollection> factories = | 74 scoped_refptr<media::FilterFactoryCollection> factories = |
| 65 new media::FilterFactoryCollection(); | 75 new media::FilterFactoryCollection(); |
| 66 factories->AddFactory(media::FileDataSource::CreateFactory()); | 76 factories->AddFactory(media::FileDataSource::CreateFactory()); |
| 67 factories->AddFactory(media::FFmpegAudioDecoder::CreateFactory()); | 77 factories->AddFactory(media::FFmpegAudioDecoder::CreateFactory()); |
| 68 factories->AddFactory(media::FFmpegDemuxer::CreateFilterFactory()); | 78 factories->AddFactory(media::FFmpegDemuxer::CreateFilterFactory()); |
| 69 if (CommandLine::ForCurrentProcess()->HasSwitch( | 79 if (CommandLine::ForCurrentProcess()->HasSwitch( |
| 70 switches::kEnableOpenMax)) { | 80 switches::kEnableOpenMax)) { |
| 71 factories->AddFactory(media::OmxVideoDecoder::CreateFactory()); | 81 factories->AddFactory(media::OmxVideoDecoder::CreateFactory()); |
| 72 } | 82 } |
| 73 factories->AddFactory(media::FFmpegVideoDecoder::CreateFactory()); | 83 factories->AddFactory(media::FFmpegVideoDecoder::CreateFactory()); |
| 74 factories->AddFactory(X11VideoRenderer::CreateFactory(g_display, g_window)); | 84 factories->AddFactory(Renderer::CreateFactory(g_display, g_window)); |
| 75 | 85 |
| 76 if (enable_audio) { | 86 if (enable_audio) { |
| 77 factories->AddFactory(media::AudioRendererImpl::CreateFilterFactory()); | 87 factories->AddFactory(media::AudioRendererImpl::CreateFilterFactory()); |
| 78 } else { | 88 } else { |
| 79 factories->AddFactory(media::NullAudioRenderer::CreateFilterFactory()); | 89 factories->AddFactory(media::NullAudioRenderer::CreateFilterFactory()); |
| 80 } | 90 } |
| 81 | 91 |
| 82 // Creates the pipeline and start it. | 92 // Creates the pipeline and start it. |
| 83 *pipeline = new media::PipelineImpl(message_loop); | 93 *pipeline = new media::PipelineImpl(message_loop); |
| 84 (*pipeline)->Start(factories, filename, NULL); | 94 (*pipeline)->Start(factories, filename, NULL); |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 139 if (InitPipeline(thread->message_loop(), filename.c_str(), | 149 if (InitPipeline(thread->message_loop(), filename.c_str(), |
| 140 enable_audio, &pipeline)) { | 150 enable_audio, &pipeline)) { |
| 141 // Main loop of the application. | 151 // Main loop of the application. |
| 142 g_running = true; | 152 g_running = true; |
| 143 while (g_running) { | 153 while (g_running) { |
| 144 if (XPending(g_display)) { | 154 if (XPending(g_display)) { |
| 145 XEvent e; | 155 XEvent e; |
| 146 XNextEvent(g_display, &e); | 156 XNextEvent(g_display, &e); |
| 147 if (e.type == Expose) { | 157 if (e.type == Expose) { |
| 148 // Tell the renderer to paint. | 158 // Tell the renderer to paint. |
| 149 DCHECK(X11VideoRenderer::instance()); | 159 DCHECK(Renderer::instance()); |
| 150 X11VideoRenderer::instance()->Paint(); | 160 Renderer::instance()->Paint(); |
| 151 } else if (e.type == ButtonPress) { | 161 } else if (e.type == ButtonPress) { |
| 152 // Stop the playback. | 162 // Stop the playback. |
| 153 break; | 163 break; |
| 154 } | 164 } |
| 155 } else { | 165 } else { |
| 156 // If there's no event in the queue, make an expose event. | 166 // If there's no event in the queue, make an expose event. |
| 157 XEvent event; | 167 XEvent event; |
| 158 event.type = Expose; | 168 event.type = Expose; |
| 159 XSendEvent(g_display, g_window, true, ExposureMask, &event); | 169 XSendEvent(g_display, g_window, true, ExposureMask, &event); |
| 160 | 170 |
| 161 // TODO(hclam): It is rather arbitrary to sleep for 10ms and wait | 171 // TODO(hclam): It is rather arbitrary to sleep for 10ms and wait |
| 162 // for the next event. We should submit an expose event when | 172 // for the next event. We should submit an expose event when |
| 163 // a frame is available but not firing an expose event every 10ms. | 173 // a frame is available but not firing an expose event every 10ms. |
| 164 usleep(10000); | 174 usleep(10000); |
| 165 } | 175 } |
| 166 } | 176 } |
| 167 pipeline->Stop(NULL); | 177 pipeline->Stop(NULL); |
| 168 } else{ | 178 } else{ |
| 169 std::cout << "Pipeline initialization failed..." << std::endl; | 179 std::cout << "Pipeline initialization failed..." << std::endl; |
| 170 } | 180 } |
| 171 | 181 |
| 172 // Cleanup tasks. | 182 // Cleanup tasks. |
| 173 thread->Stop(); | 183 thread->Stop(); |
| 174 XDestroyWindow(g_display, g_window); | 184 XDestroyWindow(g_display, g_window); |
| 175 XCloseDisplay(g_display); | 185 XCloseDisplay(g_display); |
| 176 return 0; | 186 return 0; |
| 177 } | 187 } |
| OLD | NEW |