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

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: Created 7 years, 4 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..19b515a4be98f47325e2b9d39b62be5a7817818c 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,15 +38,18 @@
#include "media/base/media_log.h"
#include "media/base/media_switches.h"
#include "media/base/pipeline.h"
+#include "media/base/text_buffer.h"
#include "media/base/video_frame.h"
#include "media/filters/audio_renderer_impl.h"
#include "media/filters/chunk_demuxer.h"
#include "media/filters/ffmpeg_audio_decoder.h"
#include "media/filters/ffmpeg_demuxer.h"
+#include "media/filters/ffmpeg_text_decoder.h"
#include "media/filters/ffmpeg_video_decoder.h"
#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_renderer_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,18 @@ WebMediaPlayerImpl::OnTextTrack(media::TextKind kind,
text_track));
}
+void WebMediaPlayerImpl::OnFFmpegTextTrack(media::TextKind kind,
+ const std::string& label,
+ const std::string& language,
+ int index) {
+ DCHECK(main_loop_->BelongsToCurrentThread());
+ if (ffmpeg_text_track_map_.find(index) == ffmpeg_text_track_map_.end()) {
acolwell GONE FROM CHROMIUM 2013/09/12 00:15:15 nit: It seems like we should DCHECK instead. It wo
Matthew Heaney (Chromium) 2013/09/13 19:51:54 Done.
+ scoped_ptr<media::TextTrack> text_track =
+ OnTextTrack(kind, label, language);
+ ffmpeg_text_track_map_.insert(std::make_pair(index, text_track.release()));
+ }
+}
+
void WebMediaPlayerImpl::OnKeyError(const std::string& session_id,
media::MediaKeys::KeyError error_code,
int system_code) {
@@ -1033,9 +1049,17 @@ void WebMediaPlayerImpl::StartPipeline() {
DCHECK(!chunk_demuxer_);
DCHECK(data_source_);
+ media::FFmpegAddTextTrackCB add_text_track_cb;
+
+ if (cmd_line->HasSwitch(switches::kEnableInbandTextTracks)) {
+ add_text_track_cb =
+ BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnFFmpegTextTrack);
+ }
+
demuxer_.reset(new media::FFmpegDemuxer(
media_loop_, data_source_.get(),
BIND_TO_RENDER_LOOP_1(&WebMediaPlayerImpl::OnNeedKey, ""),
+ add_text_track_cb,
acolwell GONE FROM CHROMIUM 2013/09/12 00:15:15 This doesn't seem right to me. It seems like Demux
Matthew Heaney (Chromium) 2013/09/13 19:51:54 OK, just to make sure I understand. The FFmpegDem
acolwell GONE FROM CHROMIUM 2013/09/13 20:57:30 Yes. The demuxers already hold a reference to the
Matthew Heaney (Chromium) 2013/09/20 23:53:54 The ffmpeg demuxer now forwards the AddTextStream
media_log_));
} else {
DCHECK(!chunk_demuxer_);
@@ -1121,6 +1145,19 @@ void WebMediaPlayerImpl::StartPipeline() {
true));
filter_collection->SetVideoRenderer(video_renderer.Pass());
+ if (load_type_ != LoadTypeMediaSource &&
acolwell GONE FROM CHROMIUM 2013/09/12 00:15:15 This should be load_type_ independent. ChunkDemuxe
Matthew Heaney (Chromium) 2013/09/13 19:51:54 Agreed. I figure I can make changes to DemuxerHos
+ cmd_line->HasSwitch(switches::kEnableInbandTextTracks)) {
+ scoped_ptr<media::TextDecoder> text_decoder(
+ new media::FFmpegTextDecoder(media_loop_));
+
+ scoped_ptr<media::TextRenderer> text_renderer(
+ new media::TextRendererImpl(
+ media_loop_,
+ text_decoder.Pass(),
+ BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::CueReady)));
+ filter_collection->SetTextRenderer(text_renderer.Pass());
+ }
+
// ... and we're ready to go!
starting_ = true;
pipeline_->Start(
@@ -1187,6 +1224,8 @@ void WebMediaPlayerImpl::Destroy() {
pipeline_.reset();
demuxer_.reset();
data_source_.reset();
+
+ STLDeleteValues(&ffmpeg_text_track_map_);
}
WebKit::WebMediaPlayerClient* WebMediaPlayerImpl::GetClient() {
@@ -1243,4 +1282,24 @@ void WebMediaPlayerImpl::FrameReady(
&WebMediaPlayerImpl::Repaint, AsWeakPtr()));
}
+void WebMediaPlayerImpl::CueReady(
+ int index,
+ const scoped_refptr<media::TextBuffer>& buf) {
+ DCHECK(main_loop_->BelongsToCurrentThread());
+
+ if (buf == NULL || buf->text().empty())
acolwell GONE FROM CHROMIUM 2013/09/12 00:15:15 nit: These should be DCHECKS.
Matthew Heaney (Chromium) 2013/09/13 19:51:54 Done.
+ return;
+
+ TextTrackMap::iterator it = ffmpeg_text_track_map_.find(index);
acolwell GONE FROM CHROMIUM 2013/09/12 00:15:15 The TextRenderer seems like a better home for this
Matthew Heaney (Chromium) 2013/09/13 19:51:54 Agreed. I think this will go away once I make the
Matthew Heaney (Chromium) 2013/09/20 23:53:54 Actually, I had to leave this here, so that it cou
+ if (it == ffmpeg_text_track_map_.end())
acolwell GONE FROM CHROMIUM 2013/09/12 00:15:15 nit: Shouldn't this be a DCHECK? It seems like thi
Matthew Heaney (Chromium) 2013/09/13 19:51:54 Done.
+ return;
+
+ media::TextTrack* track = it->second;
+ base::TimeDelta start = buf->timestamp();
+ base::TimeDelta end = start + buf->duration();
+
+ track->addWebVTTCue(start, end,
+ buf->id(), buf->text(), buf->settings());
+}
+
} // namespace content

Powered by Google App Engine
This is Rietveld 408576698