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

Unified Diff: media/webm/webm_cluster_parser.cc

Issue 23702007: Render inband text tracks in the media pipeline (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: incorporate aaron's comments (10/16) Created 7 years, 2 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_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

Powered by Google App Engine
This is Rietveld 408576698