Chromium Code Reviews| 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 |