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