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 |