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

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/16) 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 19 matching lines...) Expand all
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698