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

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 (9/28) 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_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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698