Chromium Code Reviews| 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> |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 30 #include "content/renderer/media/webmediasource_impl.h" | 30 #include "content/renderer/media/webmediasource_impl.h" |
| 31 #include "content/renderer/pepper/pepper_webplugin_impl.h" | 31 #include "content/renderer/pepper/pepper_webplugin_impl.h" |
| 32 #include "gpu/GLES2/gl2extchromium.h" | 32 #include "gpu/GLES2/gl2extchromium.h" |
| 33 #include "media/audio/null_audio_sink.h" | 33 #include "media/audio/null_audio_sink.h" |
| 34 #include "media/base/bind_to_loop.h" | 34 #include "media/base/bind_to_loop.h" |
| 35 #include "media/base/filter_collection.h" | 35 #include "media/base/filter_collection.h" |
| 36 #include "media/base/limits.h" | 36 #include "media/base/limits.h" |
| 37 #include "media/base/media_log.h" | 37 #include "media/base/media_log.h" |
| 38 #include "media/base/media_switches.h" | 38 #include "media/base/media_switches.h" |
| 39 #include "media/base/pipeline.h" | 39 #include "media/base/pipeline.h" |
| 40 #include "media/base/text_renderer.h" | |
| 40 #include "media/base/video_frame.h" | 41 #include "media/base/video_frame.h" |
| 41 #include "media/filters/audio_renderer_impl.h" | 42 #include "media/filters/audio_renderer_impl.h" |
| 42 #include "media/filters/chunk_demuxer.h" | 43 #include "media/filters/chunk_demuxer.h" |
| 43 #include "media/filters/ffmpeg_audio_decoder.h" | 44 #include "media/filters/ffmpeg_audio_decoder.h" |
| 44 #include "media/filters/ffmpeg_demuxer.h" | 45 #include "media/filters/ffmpeg_demuxer.h" |
| 45 #include "media/filters/ffmpeg_video_decoder.h" | 46 #include "media/filters/ffmpeg_video_decoder.h" |
| 46 #include "media/filters/gpu_video_accelerator_factories.h" | 47 #include "media/filters/gpu_video_accelerator_factories.h" |
| 47 #include "media/filters/gpu_video_decoder.h" | 48 #include "media/filters/gpu_video_decoder.h" |
| 48 #include "media/filters/opus_audio_decoder.h" | 49 #include "media/filters/opus_audio_decoder.h" |
| 49 #include "media/filters/video_renderer_base.h" | 50 #include "media/filters/video_renderer_base.h" |
| (...skipping 886 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 936 if (init_data_type_.empty()) | 937 if (init_data_type_.empty()) |
| 937 init_data_type_ = type; | 938 init_data_type_ = type; |
| 938 | 939 |
| 939 const uint8* init_data_ptr = init_data.empty() ? NULL : &init_data[0]; | 940 const uint8* init_data_ptr = init_data.empty() ? NULL : &init_data[0]; |
| 940 GetClient()->keyNeeded(WebString(), | 941 GetClient()->keyNeeded(WebString(), |
| 941 WebString(), | 942 WebString(), |
| 942 init_data_ptr, | 943 init_data_ptr, |
| 943 init_data.size()); | 944 init_data.size()); |
| 944 } | 945 } |
| 945 | 946 |
| 946 scoped_ptr<media::TextTrack> | 947 void WebMediaPlayerImpl::OnAddTextTrack( |
| 947 WebMediaPlayerImpl::OnTextTrack(media::TextKind kind, | 948 media::TextKind kind, |
| 948 const std::string& label, | 949 const std::string& label, |
| 949 const std::string& language) { | 950 const std::string& language, |
| 950 typedef WebInbandTextTrackImpl::Kind webkind_t; | 951 const media::AddTextTrackDoneCB& done_cb) { |
| 951 const webkind_t webkind = static_cast<webkind_t>(kind); | 952 DCHECK(main_loop_->BelongsToCurrentThread()); |
| 952 const WebKit::WebString weblabel = WebKit::WebString::fromUTF8(label); | |
| 953 const WebKit::WebString weblanguage = WebKit::WebString::fromUTF8(language); | |
| 954 | 953 |
| 955 WebInbandTextTrackImpl* const text_track = | 954 const WebInbandTextTrackImpl::Kind web_kind = |
| 956 new WebInbandTextTrackImpl(webkind, weblabel, weblanguage, | 955 static_cast<WebInbandTextTrackImpl::Kind>(kind); |
| 957 text_track_index_++); | 956 const WebKit::WebString web_label = WebKit::WebString::fromUTF8(label); |
| 957 const WebKit::WebString web_language = WebKit::WebString::fromUTF8(language); | |
| 958 | 958 |
| 959 return scoped_ptr<media::TextTrack>(new TextTrackImpl(GetClient(), | 959 WebInbandTextTrackImpl* const web_inband_text_track = |
|
acolwell GONE FROM CHROMIUM
2013/10/21 20:10:40
nit: use scoped_ptr here.
Matthew Heaney (Chromium)
2013/10/23 05:09:01
Done.
| |
| 960 text_track)); | 960 new WebInbandTextTrackImpl(web_kind, web_label, web_language, |
| 961 text_track_index_++); | |
| 962 | |
| 963 scoped_ptr<media::TextTrack> text_track( | |
| 964 new TextTrackImpl(main_loop_, GetClient(), web_inband_text_track)); | |
| 965 | |
| 966 done_cb.Run(text_track.Pass()); | |
| 961 } | 967 } |
| 962 | 968 |
| 963 void WebMediaPlayerImpl::OnKeyError(const std::string& session_id, | 969 void WebMediaPlayerImpl::OnKeyError(const std::string& session_id, |
| 964 media::MediaKeys::KeyError error_code, | 970 media::MediaKeys::KeyError error_code, |
| 965 int system_code) { | 971 int system_code) { |
| 966 DCHECK(main_loop_->BelongsToCurrentThread()); | 972 DCHECK(main_loop_->BelongsToCurrentThread()); |
| 967 | 973 |
| 968 EmeUMAHistogramEnumeration(current_key_system_, "KeyError", | 974 EmeUMAHistogramEnumeration(current_key_system_, "KeyError", |
| 969 error_code, media::MediaKeys::kMaxKeyError); | 975 error_code, media::MediaKeys::kMaxKeyError); |
| 970 | 976 |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1021 } | 1027 } |
| 1022 | 1028 |
| 1023 void WebMediaPlayerImpl::StartPipeline() { | 1029 void WebMediaPlayerImpl::StartPipeline() { |
| 1024 const CommandLine* cmd_line = CommandLine::ForCurrentProcess(); | 1030 const CommandLine* cmd_line = CommandLine::ForCurrentProcess(); |
| 1025 bool increase_preroll_on_underflow = true; | 1031 bool increase_preroll_on_underflow = true; |
| 1026 | 1032 |
| 1027 // Keep track if this is a MSE or non-MSE playback. | 1033 // Keep track if this is a MSE or non-MSE playback. |
| 1028 UMA_HISTOGRAM_BOOLEAN("Media.MSE.Playback", | 1034 UMA_HISTOGRAM_BOOLEAN("Media.MSE.Playback", |
| 1029 (load_type_ == LoadTypeMediaSource)); | 1035 (load_type_ == LoadTypeMediaSource)); |
| 1030 | 1036 |
| 1037 const bool enable_inband_text_tracks = | |
| 1038 cmd_line->HasSwitch(switches::kEnableInbandTextTracks); | |
| 1039 | |
| 1031 // Figure out which demuxer to use. | 1040 // Figure out which demuxer to use. |
| 1032 if (load_type_ != LoadTypeMediaSource) { | 1041 if (load_type_ != LoadTypeMediaSource) { |
| 1033 DCHECK(!chunk_demuxer_); | 1042 DCHECK(!chunk_demuxer_); |
| 1034 DCHECK(data_source_); | 1043 DCHECK(data_source_); |
| 1035 | 1044 |
| 1036 demuxer_.reset(new media::FFmpegDemuxer( | 1045 demuxer_.reset(new media::FFmpegDemuxer( |
| 1037 media_loop_, data_source_.get(), | 1046 media_loop_, data_source_.get(), |
| 1038 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnNeedKey), | 1047 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnNeedKey), |
| 1048 enable_inband_text_tracks, | |
| 1039 media_log_)); | 1049 media_log_)); |
| 1040 } else { | 1050 } else { |
| 1041 DCHECK(!chunk_demuxer_); | 1051 DCHECK(!chunk_demuxer_); |
| 1042 DCHECK(!data_source_); | 1052 DCHECK(!data_source_); |
| 1043 | 1053 |
| 1044 media::AddTextTrackCB add_text_track_cb; | |
| 1045 | |
| 1046 if (cmd_line->HasSwitch(switches::kEnableInbandTextTracks)) { | |
| 1047 add_text_track_cb = | |
| 1048 base::Bind(&WebMediaPlayerImpl::OnTextTrack, base::Unretained(this)); | |
| 1049 } | |
| 1050 | |
| 1051 chunk_demuxer_ = new media::ChunkDemuxer( | 1054 chunk_demuxer_ = new media::ChunkDemuxer( |
| 1052 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnDemuxerOpened), | 1055 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnDemuxerOpened), |
| 1053 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnNeedKey), | 1056 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnNeedKey), |
| 1054 add_text_track_cb, | 1057 enable_inband_text_tracks, |
| 1055 base::Bind(&LogMediaSourceError, media_log_)); | 1058 base::Bind(&LogMediaSourceError, media_log_)); |
| 1056 demuxer_.reset(chunk_demuxer_); | 1059 demuxer_.reset(chunk_demuxer_); |
| 1057 | 1060 |
| 1058 #if !defined(OS_CHROMEOS) | 1061 #if !defined(OS_CHROMEOS) |
| 1059 // Disable GpuVideoDecoder creation on platforms other than CrOS until | 1062 // Disable GpuVideoDecoder creation on platforms other than CrOS until |
| 1060 // they support codec config changes. | 1063 // they support codec config changes. |
| 1061 // TODO(acolwell): Remove this once http://crbug.com/151045 is fixed. | 1064 // TODO(acolwell): Remove this once http://crbug.com/151045 is fixed. |
| 1062 gpu_factories_ = NULL; | 1065 gpu_factories_ = NULL; |
| 1063 #endif | 1066 #endif |
| 1064 | 1067 |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1114 scoped_ptr<media::VideoRenderer> video_renderer( | 1117 scoped_ptr<media::VideoRenderer> video_renderer( |
| 1115 new media::VideoRendererBase( | 1118 new media::VideoRendererBase( |
| 1116 media_loop_, | 1119 media_loop_, |
| 1117 video_decoders.Pass(), | 1120 video_decoders.Pass(), |
| 1118 set_decryptor_ready_cb, | 1121 set_decryptor_ready_cb, |
| 1119 base::Bind(&WebMediaPlayerImpl::FrameReady, base::Unretained(this)), | 1122 base::Bind(&WebMediaPlayerImpl::FrameReady, base::Unretained(this)), |
| 1120 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::SetOpaque), | 1123 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::SetOpaque), |
| 1121 true)); | 1124 true)); |
| 1122 filter_collection->SetVideoRenderer(video_renderer.Pass()); | 1125 filter_collection->SetVideoRenderer(video_renderer.Pass()); |
| 1123 | 1126 |
| 1127 if (enable_inband_text_tracks) { | |
| 1128 media::AddTextTrackCB add_text_track_cb = | |
| 1129 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnAddTextTrack); | |
|
acolwell GONE FROM CHROMIUM
2013/10/21 20:10:40
nit: Inline below.
Matthew Heaney (Chromium)
2013/10/23 05:09:01
Done.
| |
| 1130 | |
| 1131 scoped_ptr<media::TextRenderer> text_renderer( | |
| 1132 new media::TextRenderer( | |
| 1133 media_loop_, | |
| 1134 add_text_track_cb)); | |
| 1135 | |
| 1136 filter_collection->SetTextRenderer(text_renderer.Pass()); | |
| 1137 } | |
| 1138 | |
| 1124 // ... and we're ready to go! | 1139 // ... and we're ready to go! |
| 1125 starting_ = true; | 1140 starting_ = true; |
| 1126 pipeline_->Start( | 1141 pipeline_->Start( |
| 1127 filter_collection.Pass(), | 1142 filter_collection.Pass(), |
| 1128 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineEnded), | 1143 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineEnded), |
| 1129 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineError), | 1144 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineError), |
| 1130 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineSeek), | 1145 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineSeek), |
| 1131 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineBufferingState), | 1146 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineBufferingState), |
| 1132 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnDurationChange)); | 1147 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnDurationChange)); |
| 1133 } | 1148 } |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1243 &WebMediaPlayerImpl::Repaint, AsWeakPtr())); | 1258 &WebMediaPlayerImpl::Repaint, AsWeakPtr())); |
| 1244 } | 1259 } |
| 1245 | 1260 |
| 1246 void WebMediaPlayerImpl::SetPlaybackRate(float playback_rate) { | 1261 void WebMediaPlayerImpl::SetPlaybackRate(float playback_rate) { |
| 1247 pipeline_->SetPlaybackRate(playback_rate); | 1262 pipeline_->SetPlaybackRate(playback_rate); |
| 1248 if (data_source_) | 1263 if (data_source_) |
| 1249 data_source_->SetPlaybackRate(playback_rate); | 1264 data_source_->SetPlaybackRate(playback_rate); |
| 1250 } | 1265 } |
| 1251 | 1266 |
| 1252 } // namespace content | 1267 } // namespace content |
| OLD | NEW |