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_cue.h" | |
|
acolwell GONE FROM CHROMIUM
2013/10/08 15:45:24
nit: no longer needed.
Matthew Heaney (Chromium)
2013/10/13 05:30:17
Done.
| |
| 41 #include "media/base/text_renderer.h" | |
| 40 #include "media/base/video_frame.h" | 42 #include "media/base/video_frame.h" |
| 41 #include "media/filters/audio_renderer_impl.h" | 43 #include "media/filters/audio_renderer_impl.h" |
| 42 #include "media/filters/chunk_demuxer.h" | 44 #include "media/filters/chunk_demuxer.h" |
| 43 #include "media/filters/ffmpeg_audio_decoder.h" | 45 #include "media/filters/ffmpeg_audio_decoder.h" |
| 44 #include "media/filters/ffmpeg_demuxer.h" | 46 #include "media/filters/ffmpeg_demuxer.h" |
| 45 #include "media/filters/ffmpeg_video_decoder.h" | 47 #include "media/filters/ffmpeg_video_decoder.h" |
| 46 #include "media/filters/gpu_video_accelerator_factories.h" | 48 #include "media/filters/gpu_video_accelerator_factories.h" |
| 47 #include "media/filters/gpu_video_decoder.h" | 49 #include "media/filters/gpu_video_decoder.h" |
| 48 #include "media/filters/opus_audio_decoder.h" | 50 #include "media/filters/opus_audio_decoder.h" |
| 51 #include "media/filters/text_decoder_impl.h" | |
| 49 #include "media/filters/video_renderer_base.h" | 52 #include "media/filters/video_renderer_base.h" |
| 50 #include "media/filters/vpx_video_decoder.h" | 53 #include "media/filters/vpx_video_decoder.h" |
| 51 #include "third_party/WebKit/public/platform/WebMediaSource.h" | 54 #include "third_party/WebKit/public/platform/WebMediaSource.h" |
| 52 #include "third_party/WebKit/public/platform/WebRect.h" | 55 #include "third_party/WebKit/public/platform/WebRect.h" |
| 53 #include "third_party/WebKit/public/platform/WebSize.h" | 56 #include "third_party/WebKit/public/platform/WebSize.h" |
| 54 #include "third_party/WebKit/public/platform/WebString.h" | 57 #include "third_party/WebKit/public/platform/WebString.h" |
| 55 #include "third_party/WebKit/public/platform/WebURL.h" | 58 #include "third_party/WebKit/public/platform/WebURL.h" |
| 56 #include "third_party/WebKit/public/web/WebDocument.h" | 59 #include "third_party/WebKit/public/web/WebDocument.h" |
| 57 #include "third_party/WebKit/public/web/WebRuntimeFeatures.h" | 60 #include "third_party/WebKit/public/web/WebRuntimeFeatures.h" |
| 58 #include "third_party/WebKit/public/web/WebView.h" | 61 #include "third_party/WebKit/public/web/WebView.h" |
| (...skipping 882 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 941 GetClient()->keyNeeded(WebString(), | 944 GetClient()->keyNeeded(WebString(), |
| 942 WebString::fromUTF8(session_id), | 945 WebString::fromUTF8(session_id), |
| 943 init_data_ptr, | 946 init_data_ptr, |
| 944 init_data.size()); | 947 init_data.size()); |
| 945 } | 948 } |
| 946 | 949 |
| 947 scoped_ptr<media::TextTrack> | 950 scoped_ptr<media::TextTrack> |
| 948 WebMediaPlayerImpl::OnTextTrack(media::TextKind kind, | 951 WebMediaPlayerImpl::OnTextTrack(media::TextKind kind, |
| 949 const std::string& label, | 952 const std::string& label, |
| 950 const std::string& language) { | 953 const std::string& language) { |
| 954 DCHECK(main_loop_->BelongsToCurrentThread()); | |
| 955 | |
| 951 typedef WebInbandTextTrackImpl::Kind webkind_t; | 956 typedef WebInbandTextTrackImpl::Kind webkind_t; |
| 952 const webkind_t webkind = static_cast<webkind_t>(kind); | 957 const webkind_t webkind = static_cast<webkind_t>(kind); |
| 953 const WebKit::WebString weblabel = WebKit::WebString::fromUTF8(label); | 958 const WebKit::WebString weblabel = WebKit::WebString::fromUTF8(label); |
| 954 const WebKit::WebString weblanguage = WebKit::WebString::fromUTF8(language); | 959 const WebKit::WebString weblanguage = WebKit::WebString::fromUTF8(language); |
| 955 | 960 |
| 956 WebInbandTextTrackImpl* const text_track = | 961 WebInbandTextTrackImpl* const text_track = |
| 957 new WebInbandTextTrackImpl(webkind, weblabel, weblanguage, | 962 new WebInbandTextTrackImpl(webkind, weblabel, weblanguage, |
| 958 text_track_index_++); | 963 text_track_index_++); |
| 959 | 964 |
| 960 return scoped_ptr<media::TextTrack>(new TextTrackImpl(GetClient(), | 965 return scoped_ptr<media::TextTrack>(new TextTrackImpl(main_loop_, |
| 966 GetClient(), | |
| 961 text_track)); | 967 text_track)); |
| 962 } | 968 } |
| 963 | 969 |
| 970 void WebMediaPlayerImpl::OnAddTextStream( | |
| 971 media::DemuxerStream* text_stream, | |
| 972 media::TextKind kind, | |
| 973 const std::string& label, | |
| 974 const std::string& language, | |
| 975 const media::AddTextTrackDoneCB& done_cb) { | |
| 976 DCHECK(main_loop_->BelongsToCurrentThread()); | |
| 977 scoped_ptr<media::TextTrack> text_track = OnTextTrack(kind, label, language); | |
| 978 done_cb.Run(text_stream, text_track.Pass()); | |
|
acolwell GONE FROM CHROMIUM
2013/10/08 15:45:24
WebMediaPlayerImpl should not need to know about D
Matthew Heaney (Chromium)
2013/10/13 05:30:17
Done.
| |
| 979 } | |
| 980 | |
| 964 void WebMediaPlayerImpl::OnKeyError(const std::string& session_id, | 981 void WebMediaPlayerImpl::OnKeyError(const std::string& session_id, |
| 965 media::MediaKeys::KeyError error_code, | 982 media::MediaKeys::KeyError error_code, |
| 966 int system_code) { | 983 int system_code) { |
| 967 DCHECK(main_loop_->BelongsToCurrentThread()); | 984 DCHECK(main_loop_->BelongsToCurrentThread()); |
| 968 | 985 |
| 969 EmeUMAHistogramEnumeration(current_key_system_, "KeyError", | 986 EmeUMAHistogramEnumeration(current_key_system_, "KeyError", |
| 970 error_code, media::MediaKeys::kMaxKeyError); | 987 error_code, media::MediaKeys::kMaxKeyError); |
| 971 | 988 |
| 972 GetClient()->keyError( | 989 GetClient()->keyError( |
| 973 current_key_system_, | 990 current_key_system_, |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1022 } | 1039 } |
| 1023 | 1040 |
| 1024 void WebMediaPlayerImpl::StartPipeline() { | 1041 void WebMediaPlayerImpl::StartPipeline() { |
| 1025 const CommandLine* cmd_line = CommandLine::ForCurrentProcess(); | 1042 const CommandLine* cmd_line = CommandLine::ForCurrentProcess(); |
| 1026 bool increase_preroll_on_underflow = true; | 1043 bool increase_preroll_on_underflow = true; |
| 1027 | 1044 |
| 1028 // Keep track if this is a MSE or non-MSE playback. | 1045 // Keep track if this is a MSE or non-MSE playback. |
| 1029 UMA_HISTOGRAM_BOOLEAN("Media.MSE.Playback", | 1046 UMA_HISTOGRAM_BOOLEAN("Media.MSE.Playback", |
| 1030 (load_type_ == LoadTypeMediaSource)); | 1047 (load_type_ == LoadTypeMediaSource)); |
| 1031 | 1048 |
| 1049 const bool enable_inband_text_tracks = | |
| 1050 cmd_line->HasSwitch(switches::kEnableInbandTextTracks); | |
| 1051 | |
| 1032 // Figure out which demuxer to use. | 1052 // Figure out which demuxer to use. |
| 1033 if (load_type_ != LoadTypeMediaSource) { | 1053 if (load_type_ != LoadTypeMediaSource) { |
| 1034 DCHECK(!chunk_demuxer_); | 1054 DCHECK(!chunk_demuxer_); |
| 1035 DCHECK(data_source_); | 1055 DCHECK(data_source_); |
| 1036 | 1056 |
| 1037 demuxer_.reset(new media::FFmpegDemuxer( | 1057 demuxer_.reset(new media::FFmpegDemuxer( |
| 1038 media_loop_, data_source_.get(), | 1058 media_loop_, data_source_.get(), |
| 1039 BIND_TO_RENDER_LOOP_1(&WebMediaPlayerImpl::OnNeedKey, ""), | 1059 BIND_TO_RENDER_LOOP_1(&WebMediaPlayerImpl::OnNeedKey, ""), |
| 1060 enable_inband_text_tracks, | |
| 1040 media_log_)); | 1061 media_log_)); |
| 1041 } else { | 1062 } else { |
| 1042 DCHECK(!chunk_demuxer_); | 1063 DCHECK(!chunk_demuxer_); |
| 1043 DCHECK(!data_source_); | 1064 DCHECK(!data_source_); |
| 1044 | 1065 |
| 1066 // TODO(matthewjheaney): Once we have resolved the threading issues, | |
| 1067 // change the chunk demuxer to user the same mechanism as for ffmpeg. | |
|
acolwell GONE FROM CHROMIUM
2013/10/08 15:45:24
nit: s/user/use/.
Matthew Heaney (Chromium)
2013/10/13 05:30:17
Done.
| |
| 1045 media::AddTextTrackCB add_text_track_cb; | 1068 media::AddTextTrackCB add_text_track_cb; |
| 1046 | 1069 |
| 1047 if (cmd_line->HasSwitch(switches::kEnableInbandTextTracks)) { | 1070 if (enable_inband_text_tracks) { |
| 1048 add_text_track_cb = | 1071 add_text_track_cb = |
| 1049 base::Bind(&WebMediaPlayerImpl::OnTextTrack, base::Unretained(this)); | 1072 base::Bind(&WebMediaPlayerImpl::OnTextTrack, base::Unretained(this)); |
| 1050 } | 1073 } |
| 1051 | 1074 |
| 1052 chunk_demuxer_ = new media::ChunkDemuxer( | 1075 chunk_demuxer_ = new media::ChunkDemuxer( |
| 1053 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnDemuxerOpened), | 1076 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnDemuxerOpened), |
| 1054 BIND_TO_RENDER_LOOP_1(&WebMediaPlayerImpl::OnNeedKey, ""), | 1077 BIND_TO_RENDER_LOOP_1(&WebMediaPlayerImpl::OnNeedKey, ""), |
| 1055 add_text_track_cb, | 1078 add_text_track_cb, |
| 1056 base::Bind(&LogMediaSourceError, media_log_)); | 1079 base::Bind(&LogMediaSourceError, media_log_)); |
| 1057 demuxer_.reset(chunk_demuxer_); | 1080 demuxer_.reset(chunk_demuxer_); |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1115 scoped_ptr<media::VideoRenderer> video_renderer( | 1138 scoped_ptr<media::VideoRenderer> video_renderer( |
| 1116 new media::VideoRendererBase( | 1139 new media::VideoRendererBase( |
| 1117 media_loop_, | 1140 media_loop_, |
| 1118 video_decoders.Pass(), | 1141 video_decoders.Pass(), |
| 1119 set_decryptor_ready_cb, | 1142 set_decryptor_ready_cb, |
| 1120 base::Bind(&WebMediaPlayerImpl::FrameReady, base::Unretained(this)), | 1143 base::Bind(&WebMediaPlayerImpl::FrameReady, base::Unretained(this)), |
| 1121 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::SetOpaque), | 1144 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::SetOpaque), |
| 1122 true)); | 1145 true)); |
| 1123 filter_collection->SetVideoRenderer(video_renderer.Pass()); | 1146 filter_collection->SetVideoRenderer(video_renderer.Pass()); |
| 1124 | 1147 |
| 1148 if (load_type_ != LoadTypeMediaSource && enable_inband_text_tracks) { | |
| 1149 scoped_ptr<media::TextDecoder> text_decoder( | |
| 1150 new media::TextDecoderImpl(media_loop_)); | |
|
acolwell GONE FROM CHROMIUM
2013/10/08 15:45:24
Move this into the TextRenderer constructor since
Matthew Heaney (Chromium)
2013/10/13 05:30:17
Done.
| |
| 1151 | |
| 1152 media::AddTextTrackCB2 add_text_track_cb = | |
| 1153 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnAddTextStream); | |
| 1154 | |
| 1155 scoped_ptr<media::TextRenderer> text_renderer( | |
| 1156 new media::TextRenderer( | |
| 1157 media_loop_, | |
| 1158 text_decoder.Pass(), | |
| 1159 add_text_track_cb)); | |
| 1160 | |
| 1161 filter_collection->SetTextRenderer(text_renderer.Pass()); | |
| 1162 } | |
| 1163 | |
| 1125 // ... and we're ready to go! | 1164 // ... and we're ready to go! |
| 1126 starting_ = true; | 1165 starting_ = true; |
| 1127 pipeline_->Start( | 1166 pipeline_->Start( |
| 1128 filter_collection.Pass(), | 1167 filter_collection.Pass(), |
| 1129 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineEnded), | 1168 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineEnded), |
| 1130 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineError), | 1169 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineError), |
| 1131 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineSeek), | 1170 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineSeek), |
| 1132 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineBufferingState), | 1171 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineBufferingState), |
| 1133 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnDurationChange)); | 1172 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnDurationChange)); |
| 1134 } | 1173 } |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1238 | 1277 |
| 1239 if (pending_repaint_) | 1278 if (pending_repaint_) |
| 1240 return; | 1279 return; |
| 1241 | 1280 |
| 1242 pending_repaint_ = true; | 1281 pending_repaint_ = true; |
| 1243 main_loop_->PostTask(FROM_HERE, base::Bind( | 1282 main_loop_->PostTask(FROM_HERE, base::Bind( |
| 1244 &WebMediaPlayerImpl::Repaint, AsWeakPtr())); | 1283 &WebMediaPlayerImpl::Repaint, AsWeakPtr())); |
| 1245 } | 1284 } |
| 1246 | 1285 |
| 1247 } // namespace content | 1286 } // namespace content |
| OLD | NEW |