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 20 matching lines...) Expand all Loading... |
31 #include "content/renderer/media/webmediasource_impl.h" | 31 #include "content/renderer/media/webmediasource_impl.h" |
32 #include "content/renderer/pepper/pepper_webplugin_impl.h" | 32 #include "content/renderer/pepper/pepper_webplugin_impl.h" |
33 #include "gpu/GLES2/gl2extchromium.h" | 33 #include "gpu/GLES2/gl2extchromium.h" |
34 #include "media/audio/null_audio_sink.h" | 34 #include "media/audio/null_audio_sink.h" |
35 #include "media/base/bind_to_loop.h" | 35 #include "media/base/bind_to_loop.h" |
36 #include "media/base/filter_collection.h" | 36 #include "media/base/filter_collection.h" |
37 #include "media/base/limits.h" | 37 #include "media/base/limits.h" |
38 #include "media/base/media_log.h" | 38 #include "media/base/media_log.h" |
39 #include "media/base/media_switches.h" | 39 #include "media/base/media_switches.h" |
40 #include "media/base/pipeline.h" | 40 #include "media/base/pipeline.h" |
| 41 #include "media/base/text_renderer.h" |
41 #include "media/base/video_frame.h" | 42 #include "media/base/video_frame.h" |
42 #include "media/filters/audio_renderer_impl.h" | 43 #include "media/filters/audio_renderer_impl.h" |
43 #include "media/filters/chunk_demuxer.h" | 44 #include "media/filters/chunk_demuxer.h" |
44 #include "media/filters/ffmpeg_audio_decoder.h" | 45 #include "media/filters/ffmpeg_audio_decoder.h" |
45 #include "media/filters/ffmpeg_demuxer.h" | 46 #include "media/filters/ffmpeg_demuxer.h" |
46 #include "media/filters/ffmpeg_video_decoder.h" | 47 #include "media/filters/ffmpeg_video_decoder.h" |
47 #include "media/filters/gpu_video_accelerator_factories.h" | 48 #include "media/filters/gpu_video_accelerator_factories.h" |
48 #include "media/filters/gpu_video_decoder.h" | 49 #include "media/filters/gpu_video_decoder.h" |
49 #include "media/filters/opus_audio_decoder.h" | 50 #include "media/filters/opus_audio_decoder.h" |
50 #include "media/filters/video_renderer_base.h" | 51 #include "media/filters/video_renderer_base.h" |
(...skipping 935 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
986 if (init_data_type_.empty()) | 987 if (init_data_type_.empty()) |
987 init_data_type_ = type; | 988 init_data_type_ = type; |
988 | 989 |
989 const uint8* init_data_ptr = init_data.empty() ? NULL : &init_data[0]; | 990 const uint8* init_data_ptr = init_data.empty() ? NULL : &init_data[0]; |
990 GetClient()->keyNeeded(WebString(), | 991 GetClient()->keyNeeded(WebString(), |
991 WebString(), | 992 WebString(), |
992 init_data_ptr, | 993 init_data_ptr, |
993 init_data.size()); | 994 init_data.size()); |
994 } | 995 } |
995 | 996 |
996 scoped_ptr<media::TextTrack> | 997 void WebMediaPlayerImpl::OnAddTextTrack( |
997 WebMediaPlayerImpl::OnTextTrack(media::TextKind kind, | 998 const media::TextTrackConfig& config, |
998 const std::string& label, | 999 const media::AddTextTrackDoneCB& done_cb) { |
999 const std::string& language) { | 1000 DCHECK(main_loop_->BelongsToCurrentThread()); |
1000 typedef WebInbandTextTrackImpl::Kind webkind_t; | |
1001 const webkind_t webkind = static_cast<webkind_t>(kind); | |
1002 const blink::WebString weblabel = blink::WebString::fromUTF8(label); | |
1003 const blink::WebString weblanguage = blink::WebString::fromUTF8(language); | |
1004 | 1001 |
1005 WebInbandTextTrackImpl* const text_track = | 1002 const WebInbandTextTrackImpl::Kind web_kind = |
1006 new WebInbandTextTrackImpl(webkind, weblabel, weblanguage, | 1003 static_cast<WebInbandTextTrackImpl::Kind>(config.kind()); |
1007 text_track_index_++); | 1004 const blink::WebString web_label = |
| 1005 blink::WebString::fromUTF8(config.label()); |
| 1006 const blink::WebString web_language = |
| 1007 blink::WebString::fromUTF8(config.language()); |
1008 | 1008 |
1009 return scoped_ptr<media::TextTrack>(new TextTrackImpl(GetClient(), | 1009 scoped_ptr<WebInbandTextTrackImpl> web_inband_text_track( |
1010 text_track)); | 1010 new WebInbandTextTrackImpl(web_kind, web_label, web_language, |
| 1011 text_track_index_++)); |
| 1012 |
| 1013 scoped_ptr<media::TextTrack> text_track( |
| 1014 new TextTrackImpl(main_loop_, GetClient(), web_inband_text_track.Pass())); |
| 1015 |
| 1016 done_cb.Run(text_track.Pass()); |
1011 } | 1017 } |
1012 | 1018 |
1013 void WebMediaPlayerImpl::OnKeyError(const std::string& session_id, | 1019 void WebMediaPlayerImpl::OnKeyError(const std::string& session_id, |
1014 media::MediaKeys::KeyError error_code, | 1020 media::MediaKeys::KeyError error_code, |
1015 int system_code) { | 1021 int system_code) { |
1016 DCHECK(main_loop_->BelongsToCurrentThread()); | 1022 DCHECK(main_loop_->BelongsToCurrentThread()); |
1017 | 1023 |
1018 EmeUMAHistogramEnumeration(current_key_system_, "KeyError", | 1024 EmeUMAHistogramEnumeration(current_key_system_, "KeyError", |
1019 error_code, media::MediaKeys::kMaxKeyError); | 1025 error_code, media::MediaKeys::kMaxKeyError); |
1020 | 1026 |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1084 DCHECK(data_source_); | 1090 DCHECK(data_source_); |
1085 | 1091 |
1086 demuxer_.reset(new media::FFmpegDemuxer( | 1092 demuxer_.reset(new media::FFmpegDemuxer( |
1087 media_loop_, data_source_.get(), | 1093 media_loop_, data_source_.get(), |
1088 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnNeedKey), | 1094 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnNeedKey), |
1089 media_log_)); | 1095 media_log_)); |
1090 } else { | 1096 } else { |
1091 DCHECK(!chunk_demuxer_); | 1097 DCHECK(!chunk_demuxer_); |
1092 DCHECK(!data_source_); | 1098 DCHECK(!data_source_); |
1093 | 1099 |
1094 media::AddTextTrackCB add_text_track_cb; | |
1095 | |
1096 if (cmd_line->HasSwitch(switches::kEnableInbandTextTracks)) { | |
1097 add_text_track_cb = | |
1098 base::Bind(&WebMediaPlayerImpl::OnTextTrack, base::Unretained(this)); | |
1099 } | |
1100 | |
1101 chunk_demuxer_ = new media::ChunkDemuxer( | 1100 chunk_demuxer_ = new media::ChunkDemuxer( |
1102 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnDemuxerOpened), | 1101 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnDemuxerOpened), |
1103 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnNeedKey), | 1102 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnNeedKey), |
1104 add_text_track_cb, | |
1105 base::Bind(&LogMediaSourceError, media_log_)); | 1103 base::Bind(&LogMediaSourceError, media_log_)); |
1106 demuxer_.reset(chunk_demuxer_); | 1104 demuxer_.reset(chunk_demuxer_); |
1107 | 1105 |
1108 #if !defined(OS_CHROMEOS) | 1106 #if !defined(OS_CHROMEOS) |
1109 // Disable GpuVideoDecoder creation on platforms other than CrOS until | 1107 // Disable GpuVideoDecoder creation on platforms other than CrOS until |
1110 // they support codec config changes. | 1108 // they support codec config changes. |
1111 // TODO(acolwell): Remove this once http://crbug.com/151045 is fixed. | 1109 // TODO(acolwell): Remove this once http://crbug.com/151045 is fixed. |
1112 gpu_factories_ = NULL; | 1110 gpu_factories_ = NULL; |
1113 #endif | 1111 #endif |
1114 | 1112 |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1162 scoped_ptr<media::VideoRenderer> video_renderer( | 1160 scoped_ptr<media::VideoRenderer> video_renderer( |
1163 new media::VideoRendererBase( | 1161 new media::VideoRendererBase( |
1164 media_loop_, | 1162 media_loop_, |
1165 video_decoders.Pass(), | 1163 video_decoders.Pass(), |
1166 set_decryptor_ready_cb, | 1164 set_decryptor_ready_cb, |
1167 base::Bind(&WebMediaPlayerImpl::FrameReady, base::Unretained(this)), | 1165 base::Bind(&WebMediaPlayerImpl::FrameReady, base::Unretained(this)), |
1168 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::SetOpaque), | 1166 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::SetOpaque), |
1169 true)); | 1167 true)); |
1170 filter_collection->SetVideoRenderer(video_renderer.Pass()); | 1168 filter_collection->SetVideoRenderer(video_renderer.Pass()); |
1171 | 1169 |
| 1170 if (cmd_line->HasSwitch(switches::kEnableInbandTextTracks)) { |
| 1171 scoped_ptr<media::TextRenderer> text_renderer( |
| 1172 new media::TextRenderer( |
| 1173 media_loop_, |
| 1174 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnAddTextTrack))); |
| 1175 |
| 1176 filter_collection->SetTextRenderer(text_renderer.Pass()); |
| 1177 } |
| 1178 |
1172 // ... and we're ready to go! | 1179 // ... and we're ready to go! |
1173 starting_ = true; | 1180 starting_ = true; |
1174 pipeline_->Start( | 1181 pipeline_->Start( |
1175 filter_collection.Pass(), | 1182 filter_collection.Pass(), |
1176 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineEnded), | 1183 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineEnded), |
1177 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineError), | 1184 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineError), |
1178 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineSeek), | 1185 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineSeek), |
1179 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineBufferingState), | 1186 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineBufferingState), |
1180 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnDurationChange)); | 1187 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnDurationChange)); |
1181 } | 1188 } |
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1316 // The |current_frame_| wasn't painted, it is being replaced, and we haven't | 1323 // The |current_frame_| wasn't painted, it is being replaced, and we haven't |
1317 // even gotten the chance to request a repaint for it yet. Mark it as dropped. | 1324 // even gotten the chance to request a repaint for it yet. Mark it as dropped. |
1318 TRACE_EVENT0("media", "WebMediaPlayerImpl:frameDropped"); | 1325 TRACE_EVENT0("media", "WebMediaPlayerImpl:frameDropped"); |
1319 DVLOG(1) << "Frame dropped before being painted: " | 1326 DVLOG(1) << "Frame dropped before being painted: " |
1320 << current_frame_->GetTimestamp().InSecondsF(); | 1327 << current_frame_->GetTimestamp().InSecondsF(); |
1321 if (frames_dropped_before_paint_ < kuint32max) | 1328 if (frames_dropped_before_paint_ < kuint32max) |
1322 frames_dropped_before_paint_++; | 1329 frames_dropped_before_paint_++; |
1323 } | 1330 } |
1324 | 1331 |
1325 } // namespace content | 1332 } // namespace content |
OLD | NEW |