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

Unified 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: incorporated more of aaron's comments Created 7 years, 3 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 side-by-side diff with in-line comments
Download patch
Index: content/renderer/media/webmediaplayer_impl.cc
diff --git a/content/renderer/media/webmediaplayer_impl.cc b/content/renderer/media/webmediaplayer_impl.cc
index a99c3aef5920e14e1db9ac4e0afb103eb5867f8b..31015e4f4019f02edb2e8f2d83f1f55ff98bbe1a 100644
--- a/content/renderer/media/webmediaplayer_impl.cc
+++ b/content/renderer/media/webmediaplayer_impl.cc
@@ -15,6 +15,7 @@
#include "base/debug/crash_logging.h"
#include "base/message_loop/message_loop_proxy.h"
#include "base/metrics/histogram.h"
+#include "base/stl_util.h"
#include "base/strings/string_number_conversions.h"
#include "base/synchronization/waitable_event.h"
#include "cc/layers/video_layer.h"
@@ -37,6 +38,8 @@
#include "media/base/media_log.h"
#include "media/base/media_switches.h"
#include "media/base/pipeline.h"
+#include "media/base/text_cue.h"
+#include "media/base/text_renderer.h"
#include "media/base/video_frame.h"
#include "media/filters/audio_renderer_impl.h"
#include "media/filters/chunk_demuxer.h"
@@ -46,6 +49,7 @@
#include "media/filters/gpu_video_accelerator_factories.h"
#include "media/filters/gpu_video_decoder.h"
#include "media/filters/opus_audio_decoder.h"
+#include "media/filters/text_decoder_impl.h"
#include "media/filters/video_renderer_base.h"
#include "media/filters/vpx_video_decoder.h"
#include "third_party/WebKit/public/platform/WebMediaSource.h"
@@ -960,6 +964,15 @@ WebMediaPlayerImpl::OnTextTrack(media::TextKind kind,
text_track));
}
+void WebMediaPlayerImpl::AddTextStream(media::DemuxerStream* text_stream,
+ media::TextKind kind,
+ const std::string& label,
+ const std::string& language) {
+ DCHECK(main_loop_->BelongsToCurrentThread());
+ scoped_ptr<media::TextTrack> text_track = OnTextTrack(kind, label, language);
+ text_track_map_[text_stream] = text_track.release();
acolwell GONE FROM CHROMIUM 2013/09/25 23:23:10 I don't think you need the map here. You can hide
Matthew Heaney (Chromium) 2013/09/29 03:31:23 Done.
+}
+
void WebMediaPlayerImpl::OnKeyError(const std::string& session_id,
media::MediaKeys::KeyError error_code,
int system_code) {
@@ -1028,6 +1041,9 @@ void WebMediaPlayerImpl::StartPipeline() {
UMA_HISTOGRAM_BOOLEAN("Media.MSE.Playback",
(load_type_ == LoadTypeMediaSource));
+ const bool enable_inband_text_tracks =
+ cmd_line->HasSwitch(switches::kEnableInbandTextTracks);
+
// Figure out which demuxer to use.
if (load_type_ != LoadTypeMediaSource) {
DCHECK(!chunk_demuxer_);
@@ -1036,14 +1052,17 @@ void WebMediaPlayerImpl::StartPipeline() {
demuxer_.reset(new media::FFmpegDemuxer(
media_loop_, data_source_.get(),
BIND_TO_RENDER_LOOP_1(&WebMediaPlayerImpl::OnNeedKey, ""),
+ enable_inband_text_tracks,
media_log_));
} else {
DCHECK(!chunk_demuxer_);
DCHECK(!data_source_);
+ // TODO(matthewjheaney): Once we have resolved the threading issues,
+ // change the chunk demuxer to user the same mechanism as for ffmpeg.
media::AddTextTrackCB add_text_track_cb;
- if (cmd_line->HasSwitch(switches::kEnableInbandTextTracks)) {
+ if (enable_inband_text_tracks) {
add_text_track_cb =
base::Bind(&WebMediaPlayerImpl::OnTextTrack, base::Unretained(this));
}
@@ -1121,6 +1140,20 @@ void WebMediaPlayerImpl::StartPipeline() {
true));
filter_collection->SetVideoRenderer(video_renderer.Pass());
+ if (load_type_ != LoadTypeMediaSource && enable_inband_text_tracks) {
+ scoped_ptr<media::TextDecoder> text_decoder(
+ new media::TextDecoderImpl(media_loop_));
+
+ scoped_ptr<media::TextRenderer> text_renderer(
+ new media::TextRenderer(
+ media_loop_,
+ text_decoder.Pass(),
+ BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::AddTextStream),
+ BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::CueReady)));
+
+ filter_collection->SetTextRenderer(text_renderer.Pass());
+ }
+
// ... and we're ready to go!
starting_ = true;
pipeline_->Start(
@@ -1177,6 +1210,8 @@ void WebMediaPlayerImpl::Destroy() {
&base::WaitableEvent::Signal, base::Unretained(&waiter)));
waiter.Wait();
+ STLDeleteValues(&text_track_map_);
+
// Let V8 know we are not using extra resources anymore.
if (incremented_externally_allocated_memory_) {
v8::V8::AdjustAmountOfExternalAllocatedMemory(-kPlayerExtraMemory);
@@ -1243,4 +1278,26 @@ void WebMediaPlayerImpl::FrameReady(
&WebMediaPlayerImpl::Repaint, AsWeakPtr()));
}
+void WebMediaPlayerImpl::CueReady(
acolwell GONE FROM CHROMIUM 2013/09/25 23:23:10 You shouldn't need this. You can hide the thread h
Matthew Heaney (Chromium) 2013/09/29 03:31:23 Done.
+ media::DemuxerStream* text_stream,
+ const scoped_refptr<media::TextCue>& text_cue) {
+ DCHECK(main_loop_->BelongsToCurrentThread());
+ DCHECK_NE(text_stream, static_cast<media::DemuxerStream*>(NULL));
+ DCHECK(text_cue != NULL && !text_cue->text().empty());
+
+ TextTrackMap::iterator it = text_track_map_.find(text_stream);
+ DCHECK(it != text_track_map_.end());
+
+ media::TextTrack* text_track = it->second;
+ DCHECK_NE(text_track, static_cast<media::TextTrack*>(NULL));
+
+ base::TimeDelta start = text_cue->timestamp();
+ base::TimeDelta end = start + text_cue->duration();
+
+ text_track->addWebVTTCue(start, end,
+ text_cue->id(),
+ text_cue->text(),
+ text_cue->settings());
+}
+
} // namespace content

Powered by Google App Engine
This is Rietveld 408576698