OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 "content/renderer/media/webmediaplayer_impl.h" | 5 #include "content/renderer/media/webmediaplayer_impl.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <limits> | 8 #include <limits> |
9 #include <string> | 9 #include <string> |
10 #include <vector> | 10 #include <vector> |
11 | 11 |
12 #include "base/bind.h" | 12 #include "base/bind.h" |
13 #include "base/callback.h" | 13 #include "base/callback.h" |
14 #include "base/callback_helpers.h" | 14 #include "base/callback_helpers.h" |
15 #include "base/command_line.h" | |
16 #include "base/debug/alias.h" | 15 #include "base/debug/alias.h" |
17 #include "base/debug/crash_logging.h" | 16 #include "base/debug/crash_logging.h" |
18 #include "base/debug/trace_event.h" | 17 #include "base/debug/trace_event.h" |
19 #include "base/message_loop/message_loop_proxy.h" | 18 #include "base/message_loop/message_loop_proxy.h" |
20 #include "base/metrics/histogram.h" | 19 #include "base/metrics/histogram.h" |
21 #include "base/single_thread_task_runner.h" | 20 #include "base/single_thread_task_runner.h" |
22 #include "base/synchronization/waitable_event.h" | 21 #include "base/synchronization/waitable_event.h" |
23 #include "cc/blink/web_layer_impl.h" | 22 #include "cc/blink/web_layer_impl.h" |
24 #include "cc/layers/video_layer.h" | 23 #include "cc/layers/video_layer.h" |
25 #include "content/public/common/content_switches.h" | |
26 #include "content/public/renderer/render_frame.h" | 24 #include "content/public/renderer/render_frame.h" |
27 #include "content/renderer/media/buffered_data_source.h" | 25 #include "content/renderer/media/buffered_data_source.h" |
28 #include "content/renderer/media/crypto/encrypted_media_player_support.h" | 26 #include "content/renderer/media/crypto/encrypted_media_player_support.h" |
29 #include "content/renderer/media/render_media_log.h" | 27 #include "content/renderer/media/render_media_log.h" |
30 #include "content/renderer/media/texttrack_impl.h" | 28 #include "content/renderer/media/texttrack_impl.h" |
31 #include "content/renderer/media/webaudiosourceprovider_impl.h" | 29 #include "content/renderer/media/webaudiosourceprovider_impl.h" |
32 #include "content/renderer/media/webinbandtexttrack_impl.h" | 30 #include "content/renderer/media/webinbandtexttrack_impl.h" |
33 #include "content/renderer/media/webmediaplayer_delegate.h" | 31 #include "content/renderer/media/webmediaplayer_delegate.h" |
34 #include "content/renderer/media/webmediaplayer_params.h" | 32 #include "content/renderer/media/webmediaplayer_params.h" |
35 #include "content/renderer/media/webmediaplayer_util.h" | 33 #include "content/renderer/media/webmediaplayer_util.h" |
36 #include "content/renderer/media/webmediasource_impl.h" | 34 #include "content/renderer/media/webmediasource_impl.h" |
37 #include "content/renderer/render_thread_impl.h" | 35 #include "content/renderer/render_thread_impl.h" |
38 #include "gpu/GLES2/gl2extchromium.h" | 36 #include "gpu/GLES2/gl2extchromium.h" |
39 #include "gpu/command_buffer/common/mailbox_holder.h" | 37 #include "gpu/command_buffer/common/mailbox_holder.h" |
40 #include "media/audio/null_audio_sink.h" | 38 #include "media/audio/null_audio_sink.h" |
41 #include "media/base/audio_hardware_config.h" | 39 #include "media/base/audio_hardware_config.h" |
42 #include "media/base/bind_to_current_loop.h" | 40 #include "media/base/bind_to_current_loop.h" |
43 #include "media/base/filter_collection.h" | |
44 #include "media/base/limits.h" | 41 #include "media/base/limits.h" |
45 #include "media/base/media_log.h" | 42 #include "media/base/media_log.h" |
46 #include "media/base/media_switches.h" | |
47 #include "media/base/pipeline.h" | 43 #include "media/base/pipeline.h" |
48 #include "media/base/text_renderer.h" | 44 #include "media/base/text_renderer.h" |
49 #include "media/base/video_frame.h" | 45 #include "media/base/video_frame.h" |
50 #include "media/filters/audio_renderer_impl.h" | 46 #include "media/filters/audio_renderer_impl.h" |
51 #include "media/filters/chunk_demuxer.h" | 47 #include "media/filters/chunk_demuxer.h" |
52 #include "media/filters/ffmpeg_audio_decoder.h" | 48 #include "media/filters/ffmpeg_audio_decoder.h" |
53 #include "media/filters/ffmpeg_demuxer.h" | 49 #include "media/filters/ffmpeg_demuxer.h" |
54 #include "media/filters/ffmpeg_video_decoder.h" | 50 #include "media/filters/ffmpeg_video_decoder.h" |
55 #include "media/filters/gpu_video_accelerator_factories.h" | 51 #include "media/filters/gpu_video_accelerator_factories.h" |
56 #include "media/filters/gpu_video_decoder.h" | 52 #include "media/filters/gpu_video_decoder.h" |
(...skipping 811 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
868 // Create renderer. | 864 // Create renderer. |
869 return scoped_ptr<media::Renderer>(new media::RendererImpl( | 865 return scoped_ptr<media::Renderer>(new media::RendererImpl( |
870 media_task_runner_, | 866 media_task_runner_, |
871 demuxer_.get(), | 867 demuxer_.get(), |
872 audio_renderer.Pass(), | 868 audio_renderer.Pass(), |
873 video_renderer.Pass())); | 869 video_renderer.Pass())); |
874 } | 870 } |
875 | 871 |
876 void WebMediaPlayerImpl::StartPipeline() { | 872 void WebMediaPlayerImpl::StartPipeline() { |
877 DCHECK(main_task_runner_->BelongsToCurrentThread()); | 873 DCHECK(main_task_runner_->BelongsToCurrentThread()); |
878 const CommandLine* cmd_line = CommandLine::ForCurrentProcess(); | |
879 | 874 |
880 // Keep track if this is a MSE or non-MSE playback. | 875 // Keep track if this is a MSE or non-MSE playback. |
881 UMA_HISTOGRAM_BOOLEAN("Media.MSE.Playback", | 876 UMA_HISTOGRAM_BOOLEAN("Media.MSE.Playback", |
882 (load_type_ == LoadTypeMediaSource)); | 877 (load_type_ == LoadTypeMediaSource)); |
883 | 878 |
884 media::LogCB mse_log_cb; | 879 media::LogCB mse_log_cb; |
885 media::Demuxer::NeedKeyCB need_key_cb = | 880 media::Demuxer::NeedKeyCB need_key_cb = |
886 encrypted_media_support_->CreateNeedKeyCB(); | 881 encrypted_media_support_->CreateNeedKeyCB(); |
887 | 882 |
888 // Figure out which demuxer to use. | 883 // Figure out which demuxer to use. |
(...skipping 12 matching lines...) Expand all Loading... |
901 mse_log_cb = base::Bind(&LogMediaSourceError, media_log_); | 896 mse_log_cb = base::Bind(&LogMediaSourceError, media_log_); |
902 | 897 |
903 chunk_demuxer_ = new media::ChunkDemuxer( | 898 chunk_demuxer_ = new media::ChunkDemuxer( |
904 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnDemuxerOpened), | 899 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnDemuxerOpened), |
905 need_key_cb, | 900 need_key_cb, |
906 mse_log_cb, | 901 mse_log_cb, |
907 true); | 902 true); |
908 demuxer_.reset(chunk_demuxer_); | 903 demuxer_.reset(chunk_demuxer_); |
909 } | 904 } |
910 | 905 |
911 scoped_ptr<media::FilterCollection> filter_collection( | |
912 new media::FilterCollection()); | |
913 filter_collection->SetDemuxer(demuxer_.get()); | |
914 filter_collection->SetRenderer(CreateRenderer()); | |
915 | |
916 if (cmd_line->HasSwitch(switches::kEnableInbandTextTracks)) { | |
917 scoped_ptr<media::TextRenderer> text_renderer( | |
918 new media::TextRenderer( | |
919 media_task_runner_, | |
920 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnAddTextTrack))); | |
921 | |
922 filter_collection->SetTextRenderer(text_renderer.Pass()); | |
923 } | |
924 | |
925 // ... and we're ready to go! | 906 // ... and we're ready to go! |
926 seeking_ = true; | 907 seeking_ = true; |
927 pipeline_.Start( | 908 pipeline_.Start( |
928 filter_collection.Pass(), | 909 demuxer_.get(), |
| 910 CreateRenderer(), |
929 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineEnded), | 911 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineEnded), |
930 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineError), | 912 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineError), |
931 BIND_TO_RENDER_LOOP1(&WebMediaPlayerImpl::OnPipelineSeeked, false), | 913 BIND_TO_RENDER_LOOP1(&WebMediaPlayerImpl::OnPipelineSeeked, false), |
932 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineMetadata), | 914 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineMetadata), |
933 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineBufferingStateChanged), | 915 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineBufferingStateChanged), |
934 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnDurationChanged)); | 916 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnDurationChanged), |
| 917 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnAddTextTrack)); |
935 } | 918 } |
936 | 919 |
937 void WebMediaPlayerImpl::SetNetworkState(WebMediaPlayer::NetworkState state) { | 920 void WebMediaPlayerImpl::SetNetworkState(WebMediaPlayer::NetworkState state) { |
938 DVLOG(1) << __FUNCTION__ << "(" << state << ")"; | 921 DVLOG(1) << __FUNCTION__ << "(" << state << ")"; |
939 DCHECK(main_task_runner_->BelongsToCurrentThread()); | 922 DCHECK(main_task_runner_->BelongsToCurrentThread()); |
940 network_state_ = state; | 923 network_state_ = state; |
941 // Always notify to ensure client has the latest value. | 924 // Always notify to ensure client has the latest value. |
942 client_->networkStateChanged(); | 925 client_->networkStateChanged(); |
943 } | 926 } |
944 | 927 |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1030 compositor_task_runner_->PostTask(FROM_HERE, | 1013 compositor_task_runner_->PostTask(FROM_HERE, |
1031 base::Bind(&GetCurrentFrameAndSignal, | 1014 base::Bind(&GetCurrentFrameAndSignal, |
1032 base::Unretained(compositor_), | 1015 base::Unretained(compositor_), |
1033 &video_frame, | 1016 &video_frame, |
1034 &event)); | 1017 &event)); |
1035 event.Wait(); | 1018 event.Wait(); |
1036 return video_frame; | 1019 return video_frame; |
1037 } | 1020 } |
1038 | 1021 |
1039 } // namespace content | 1022 } // namespace content |
OLD | NEW |