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

Unified Diff: media/webm/webm_stream_parser.cc

Issue 13419002: Media Source dispatches inband text tracks (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: incorporated aaron's comments Created 7 years, 7 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: media/webm/webm_stream_parser.cc
diff --git a/media/webm/webm_stream_parser.cc b/media/webm/webm_stream_parser.cc
index fb070a9210a83f488aff73c41e2bd06736a84f82..9ff1e786891ac0bac06375456010b7b4e2d021f1 100644
--- a/media/webm/webm_stream_parser.cc
+++ b/media/webm/webm_stream_parser.cc
@@ -8,12 +8,14 @@
#include "base/callback.h"
#include "base/logging.h"
+#include "base/stl_util.h"
#include "media/webm/webm_cluster_parser.h"
#include "media/webm/webm_constants.h"
#include "media/webm/webm_content_encodings.h"
#include "media/webm/webm_crypto_helpers.h"
#include "media/webm/webm_info_parser.h"
#include "media/webm/webm_tracks_parser.h"
+#include "media/webm/webm_webvtt_parser.h"
namespace media {
@@ -22,13 +24,17 @@ WebMStreamParser::WebMStreamParser()
waiting_for_buffers_(false) {
}
-WebMStreamParser::~WebMStreamParser() {}
+WebMStreamParser::~WebMStreamParser() {
+ STLDeleteValues(&text_track_map_);
+}
void WebMStreamParser::Init(const InitCB& init_cb,
const NewConfigCB& config_cb,
const NewBuffersCB& audio_cb,
const NewBuffersCB& video_cb,
+ const NewBuffersCB& text_cb,
const NeedKeyCB& need_key_cb,
+ const AddTextTrackCB& add_text_track_cb,
const NewMediaSegmentCB& new_segment_cb,
const base::Closure& end_of_segment_cb,
const LogCB& log_cb) {
@@ -37,6 +43,7 @@ void WebMStreamParser::Init(const InitCB& init_cb,
DCHECK(!init_cb.is_null());
DCHECK(!config_cb.is_null());
DCHECK(!audio_cb.is_null() || !video_cb.is_null());
+ DCHECK(!text_cb.is_null());
DCHECK(!need_key_cb.is_null());
DCHECK(!new_segment_cb.is_null());
DCHECK(!end_of_segment_cb.is_null());
@@ -46,7 +53,9 @@ void WebMStreamParser::Init(const InitCB& init_cb,
config_cb_ = config_cb;
audio_cb_ = audio_cb;
video_cb_ = video_cb;
+ text_cb_ = text_cb;
need_key_cb_ = need_key_cb;
+ add_text_track_cb_ = add_text_track_cb;
new_segment_cb_ = new_segment_cb;
end_of_segment_cb_ = end_of_segment_cb;
log_cb_ = log_cb;
@@ -198,6 +207,23 @@ int WebMStreamParser::ParseInfoAndTracks(const uint8* data, int size) {
return -1;
}
+ typedef std::set<int> TextTracksSet;
acolwell GONE FROM CHROMIUM 2013/05/10 18:41:39 nit: This typedef should probably be in WebMTracks
Matthew Heaney (Chromium) 2013/05/11 07:29:13 Done.
+ const TextTracksSet& text_tracks = tracks_parser.text_tracks();
+
+ for (TextTracksSet::const_iterator itr = text_tracks.begin();
+ itr != text_tracks.end(); ++itr) {
+ // TODO(matthewjheaney): parse track kind, name, lang from track header
acolwell GONE FROM CHROMIUM 2013/05/10 18:41:39 I'd like to see a separate CL with the necessary c
Matthew Heaney (Chromium) 2013/05/11 07:29:13 Done.
+ scoped_ptr<TextTrack> text_cb =
acolwell GONE FROM CHROMIUM 2013/05/10 18:41:39 nit: s/text_cb/text_track/
Matthew Heaney (Chromium) 2013/05/11 07:29:13 Done.
Matthew Heaney (Chromium) 2013/05/11 07:29:13 Done.
+ add_text_track_cb_.Run(kTextSubtitles, "", "");
+
+ // Assume ownership of pointer
+ TextTrack* const text_cb_ptr = text_cb.release();
acolwell GONE FROM CHROMIUM 2013/05/10 18:41:39 nit: Just inline please.
Matthew Heaney (Chromium) 2013/05/11 07:29:13 Done.
Matthew Heaney (Chromium) 2013/05/11 07:29:13 Done.
+
+ // Cache text track object, for use later when we have text track buffers.
+ // (The text track objects are deallocated in the dtor for this class.)
+ text_track_map_.insert(std::make_pair(*itr, text_cb_ptr));
+ }
+
cluster_parser_.reset(new WebMClusterParser(
info_parser.timecode_scale(),
tracks_parser.audio_track_num(),
@@ -268,6 +294,24 @@ int WebMStreamParser::ParseCluster(const uint8* data, int size) {
if (!video_buffers.empty() && !video_cb_.Run(video_buffers))
return -1;
+ WebMClusterParser::TextTrackIterator tt_iter =
+ cluster_parser_->CreateTextTrackIterator();
+
+ int tt_num;
acolwell GONE FROM CHROMIUM 2013/05/10 18:41:39 nit: s/tt_num/track_id/ or s/tt_num/track_number/
Matthew Heaney (Chromium) 2013/05/11 07:29:13 Done.
+ const BufferQueue* tt_buffers;
acolwell GONE FROM CHROMIUM 2013/05/10 18:41:39 nit: s/tt_buffers/buffers since the tt doesn't rea
Matthew Heaney (Chromium) 2013/05/11 07:29:13 Done.
+
+ while (tt_iter(&tt_num, &tt_buffers)) {
+ TextTrackMap::iterator cb_iter = text_track_map_.find(tt_num);
+
+ if (cb_iter == text_track_map_.end())
+ continue;
+
+ if (!tt_buffers->empty() && !text_cb_.Run(*tt_buffers))
+ return -1;
+
+ OnTextBuffers(*tt_buffers, cb_iter->second);
+ }
+
if (cluster_ended)
end_of_segment_cb_.Run();
@@ -282,4 +326,26 @@ void WebMStreamParser::FireNeedKey(const std::string& key_id) {
need_key_cb_.Run(kWebMEncryptInitDataType, key_id_array.Pass(), key_id_size);
}
+void WebMStreamParser::OnTextBuffers(const StreamParser::BufferQueue& buffers,
+ TextTrack* text_cb) {
acolwell GONE FROM CHROMIUM 2013/05/10 18:41:39 nit: when this is moved to ChunkDemuxer s/text_cb/
Matthew Heaney (Chromium) 2013/05/11 07:29:13 Done.
+ for (StreamParser::BufferQueue::const_iterator itr = buffers.begin();
+ itr != buffers.end(); ++itr) {
+ OnTextBuffer(*itr, text_cb);
+ }
+}
+
+void WebMStreamParser::OnTextBuffer(const StreamParserBuffer* buffer,
+ TextTrack* text_cb) {
+ const base::TimeDelta start = buffer->GetTimestamp();
+ const base::TimeDelta end = start + buffer->GetDuration();
+
+ std::string id, settings, content;
+
+ WebMWebVTTParser::Parse(buffer->GetData(),
+ buffer->GetDataSize(),
+ &id, &settings, &content);
+
+ text_cb->addWebVTTCue(start, end, id, content, settings);
+}
+
} // namespace media

Powered by Google App Engine
This is Rietveld 408576698