Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(165)

Side by Side Diff: content/renderer/media/webmediaplayer_impl.cc

Issue 23702007: Render inband text tracks in the media pipeline (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: incorporate aaron's comments (10/22) Created 7 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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 WebKit::WebString weblabel = WebKit::WebString::fromUTF8(label);
1003 const WebKit::WebString weblanguage = WebKit::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 WebKit::WebString web_label =
1005 WebKit::WebString::fromUTF8(config.label());
1006 const WebKit::WebString web_language =
1007 WebKit::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 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
1071 } 1077 }
1072 1078
1073 void WebMediaPlayerImpl::StartPipeline() { 1079 void WebMediaPlayerImpl::StartPipeline() {
1074 const CommandLine* cmd_line = CommandLine::ForCurrentProcess(); 1080 const CommandLine* cmd_line = CommandLine::ForCurrentProcess();
1075 bool increase_preroll_on_underflow = true; 1081 bool increase_preroll_on_underflow = true;
1076 1082
1077 // Keep track if this is a MSE or non-MSE playback. 1083 // Keep track if this is a MSE or non-MSE playback.
1078 UMA_HISTOGRAM_BOOLEAN("Media.MSE.Playback", 1084 UMA_HISTOGRAM_BOOLEAN("Media.MSE.Playback",
1079 (load_type_ == LoadTypeMediaSource)); 1085 (load_type_ == LoadTypeMediaSource));
1080 1086
1087 const bool enable_inband_text_tracks =
1088 cmd_line->HasSwitch(switches::kEnableInbandTextTracks);
1089
1081 // Figure out which demuxer to use. 1090 // Figure out which demuxer to use.
1082 if (load_type_ != LoadTypeMediaSource) { 1091 if (load_type_ != LoadTypeMediaSource) {
1083 DCHECK(!chunk_demuxer_); 1092 DCHECK(!chunk_demuxer_);
1084 DCHECK(data_source_); 1093 DCHECK(data_source_);
1085 1094
1086 demuxer_.reset(new media::FFmpegDemuxer( 1095 demuxer_.reset(new media::FFmpegDemuxer(
1087 media_loop_, data_source_.get(), 1096 media_loop_, data_source_.get(),
1088 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnNeedKey), 1097 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnNeedKey),
1098 enable_inband_text_tracks,
1089 media_log_)); 1099 media_log_));
1090 } else { 1100 } else {
1091 DCHECK(!chunk_demuxer_); 1101 DCHECK(!chunk_demuxer_);
1092 DCHECK(!data_source_); 1102 DCHECK(!data_source_);
1093 1103
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( 1104 chunk_demuxer_ = new media::ChunkDemuxer(
1102 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnDemuxerOpened), 1105 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnDemuxerOpened),
1103 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnNeedKey), 1106 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnNeedKey),
1104 add_text_track_cb, 1107 enable_inband_text_tracks,
1105 base::Bind(&LogMediaSourceError, media_log_)); 1108 base::Bind(&LogMediaSourceError, media_log_));
1106 demuxer_.reset(chunk_demuxer_); 1109 demuxer_.reset(chunk_demuxer_);
1107 1110
1108 #if !defined(OS_CHROMEOS) 1111 #if !defined(OS_CHROMEOS)
1109 // Disable GpuVideoDecoder creation on platforms other than CrOS until 1112 // Disable GpuVideoDecoder creation on platforms other than CrOS until
1110 // they support codec config changes. 1113 // they support codec config changes.
1111 // TODO(acolwell): Remove this once http://crbug.com/151045 is fixed. 1114 // TODO(acolwell): Remove this once http://crbug.com/151045 is fixed.
1112 gpu_factories_ = NULL; 1115 gpu_factories_ = NULL;
1113 #endif 1116 #endif
1114 1117
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
1164 scoped_ptr<media::VideoRenderer> video_renderer( 1167 scoped_ptr<media::VideoRenderer> video_renderer(
1165 new media::VideoRendererBase( 1168 new media::VideoRendererBase(
1166 media_loop_, 1169 media_loop_,
1167 video_decoders.Pass(), 1170 video_decoders.Pass(),
1168 set_decryptor_ready_cb, 1171 set_decryptor_ready_cb,
1169 base::Bind(&WebMediaPlayerImpl::FrameReady, base::Unretained(this)), 1172 base::Bind(&WebMediaPlayerImpl::FrameReady, base::Unretained(this)),
1170 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::SetOpaque), 1173 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::SetOpaque),
1171 true)); 1174 true));
1172 filter_collection->SetVideoRenderer(video_renderer.Pass()); 1175 filter_collection->SetVideoRenderer(video_renderer.Pass());
1173 1176
1177 if (enable_inband_text_tracks) {
1178 scoped_ptr<media::TextRenderer> text_renderer(
1179 new media::TextRenderer(
1180 media_loop_,
1181 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnAddTextTrack)));
1182
1183 filter_collection->SetTextRenderer(text_renderer.Pass());
1184 }
1185
1174 // ... and we're ready to go! 1186 // ... and we're ready to go!
1175 starting_ = true; 1187 starting_ = true;
1176 pipeline_->Start( 1188 pipeline_->Start(
1177 filter_collection.Pass(), 1189 filter_collection.Pass(),
1178 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineEnded), 1190 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineEnded),
1179 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineError), 1191 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineError),
1180 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineSeek), 1192 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineSeek),
1181 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineBufferingState), 1193 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineBufferingState),
1182 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnDurationChange)); 1194 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnDurationChange));
1183 } 1195 }
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after
1318 // The |current_frame_| wasn't painted, it is being replaced, and we haven't 1330 // The |current_frame_| wasn't painted, it is being replaced, and we haven't
1319 // even gotten the chance to request a repaint for it yet. Mark it as dropped. 1331 // even gotten the chance to request a repaint for it yet. Mark it as dropped.
1320 TRACE_EVENT0("media", "WebMediaPlayerImpl:frameDropped"); 1332 TRACE_EVENT0("media", "WebMediaPlayerImpl:frameDropped");
1321 DVLOG(1) << "Frame dropped before being painted: " 1333 DVLOG(1) << "Frame dropped before being painted: "
1322 << current_frame_->GetTimestamp().InSecondsF(); 1334 << current_frame_->GetTimestamp().InSecondsF();
1323 if (frames_dropped_before_paint_ < kuint32max) 1335 if (frames_dropped_before_paint_ < kuint32max)
1324 frames_dropped_before_paint_++; 1336 frames_dropped_before_paint_++;
1325 } 1337 }
1326 1338
1327 } // namespace content 1339 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698