Chromium Code Reviews| Index: media/webm/webm_cluster_parser.cc |
| diff --git a/media/webm/webm_cluster_parser.cc b/media/webm/webm_cluster_parser.cc |
| index 87cccae4da10683d8c11fdeac2aaec178719f222..cf7e6796f155440145f16d75d7f709c61e52d3e8 100644 |
| --- a/media/webm/webm_cluster_parser.cc |
| +++ b/media/webm/webm_cluster_parser.cc |
| @@ -12,6 +12,7 @@ |
| #include "media/base/decrypt_config.h" |
| #include "media/webm/webm_constants.h" |
| #include "media/webm/webm_crypto_helpers.h" |
| +#include "media/webm/webm_webvtt_parser.h" |
| namespace media { |
| @@ -307,6 +308,7 @@ bool WebMClusterParser::OnBlock(bool is_simple_block, int track_num, |
| } |
| Track* track = NULL; |
| + bool is_text = false; |
| std::string encryption_key_id; |
| if (track_num == audio_.track_num()) { |
| track = &audio_; |
| @@ -322,6 +324,7 @@ bool WebMClusterParser::OnBlock(bool is_simple_block, int track_num, |
| if (block_duration < 0) // not specified |
| return false; |
| track = text_track; |
| + is_text = true; |
| } else { |
| MEDIA_LOG(log_cb_) << "Unexpected track number " << track_num; |
| return false; |
| @@ -339,9 +342,34 @@ bool WebMClusterParser::OnBlock(bool is_simple_block, int track_num, |
| bool is_keyframe = |
| is_simple_block ? (flags & 0x80) != 0 : track->IsKeyframe(data, size); |
| - scoped_refptr<StreamParserBuffer> buffer = |
| - StreamParserBuffer::CopyFrom(data, size, additional, additional_size, |
| - is_keyframe); |
| + scoped_refptr<StreamParserBuffer> buffer; |
| + if (!is_text) { |
| + buffer = StreamParserBuffer::CopyFrom(data, size, |
| + additional, additional_size, |
| + is_keyframe); |
| + } else { |
| + std::string id, settings, content; |
| + WebMWebVTTParser::Parse(data, size, |
| + &id, &settings, &content); |
| + |
| + // The DecoderBuffer only supports a single side data item. In the case of |
| + // a WebVTT cue, we can have potentially two side data items. In order to |
| + // avoid disrupting DecoderBuffer any more than we need to, we copy both |
| + // side data items onto a single one, and terminate each with a NUL marker. |
| + std::vector<char> side_data; |
|
acolwell GONE FROM CHROMIUM
2013/10/21 20:10:40
The side_data construction should be in a helper m
Matthew Heaney (Chromium)
2013/10/23 05:09:01
Done.
|
| + side_data.reserve(id.length() + 1 + settings.length() + 1); |
| + side_data.insert(side_data.end(), id.begin(), id.end()); |
| + side_data.push_back(0); |
| + side_data.insert(side_data.end(), settings.begin(), settings.end()); |
| + side_data.push_back(0); |
| + |
| + buffer = StreamParserBuffer::CopyFrom( |
| + reinterpret_cast<const uint8*>(content.data()), |
| + content.length(), |
| + reinterpret_cast<const uint8*>(side_data.data()), |
| + side_data.size(), |
| + is_keyframe); |
| + } |
| // Every encrypted Block has a signal byte and IV prepended to it. Current |
| // encrypted WebM request for comments specification is here |