Index: media/webm/webm_cluster_parser.cc |
diff --git a/media/webm/webm_cluster_parser.cc b/media/webm/webm_cluster_parser.cc |
index 9991d6b4d15a3fec60a407d84e59a1417b50dafc..94859ecbfa32e500c6b3ddd942ed74a05f6d5a66 100644 |
--- a/media/webm/webm_cluster_parser.cc |
+++ b/media/webm/webm_cluster_parser.cc |
@@ -64,6 +64,7 @@ WebMClusterParser::WebMClusterParser( |
block_duration_(-1), |
block_add_id_(-1), |
block_additional_data_size_(-1), |
+ discard_padding_(-1), |
cluster_timecode_(-1), |
cluster_start_time_(kNoTimestamp()), |
cluster_ended_(false), |
@@ -137,6 +138,7 @@ WebMParserClient* WebMClusterParser::OnListStart(int id) { |
block_data_.reset(); |
block_data_size_ = -1; |
block_duration_ = -1; |
+ discard_padding_ = -1; |
} else if (id == kWebMIdBlockAdditions) { |
block_add_id_ = -1; |
block_additional_data_.reset(); |
@@ -158,13 +160,15 @@ bool WebMClusterParser::OnListEnd(int id) { |
bool result = ParseBlock(false, block_data_.get(), block_data_size_, |
block_additional_data_.get(), |
- block_additional_data_size_, block_duration_); |
+ block_additional_data_size_, block_duration_, |
+ discard_padding_); |
block_data_.reset(); |
block_data_size_ = -1; |
block_duration_ = -1; |
block_add_id_ = -1; |
block_additional_data_.reset(); |
block_additional_data_size_ = -1; |
+ discard_padding_ = -1; |
return result; |
} |
@@ -180,6 +184,9 @@ bool WebMClusterParser::OnUInt(int id, int64 val) { |
case kWebMIdBlockAddID: |
dst = &block_add_id_; |
break; |
+ case kWebMIdDiscardPadding: |
+ dst = &discard_padding_; |
+ break; |
default: |
return true; |
} |
@@ -191,7 +198,8 @@ bool WebMClusterParser::OnUInt(int id, int64 val) { |
bool WebMClusterParser::ParseBlock(bool is_simple_block, const uint8* buf, |
int size, const uint8* additional, |
- int additional_size, int duration) { |
+ int additional_size, int duration, |
+ int64 discard_padding) { |
if (size < 4) |
return false; |
@@ -219,13 +227,14 @@ bool WebMClusterParser::ParseBlock(bool is_simple_block, const uint8* buf, |
const uint8* frame_data = buf + 4; |
int frame_size = size - (frame_data - buf); |
return OnBlock(is_simple_block, track_num, timecode, duration, flags, |
- frame_data, frame_size, additional, additional_size); |
+ frame_data, frame_size, additional, additional_size, |
+ discard_padding); |
} |
bool WebMClusterParser::OnBinary(int id, const uint8* data, int size) { |
switch (id) { |
case kWebMIdSimpleBlock: |
- return ParseBlock(true, data, size, NULL, -1, -1); |
+ return ParseBlock(true, data, size, NULL, -1, -1, -1); |
case kWebMIdBlock: |
if (block_data_) { |
@@ -270,7 +279,8 @@ bool WebMClusterParser::OnBlock(bool is_simple_block, int track_num, |
int block_duration, |
int flags, |
const uint8* data, int size, |
- const uint8* additional, int additional_size) { |
+ const uint8* additional, int additional_size, |
+ int64 discard_padding) { |
DCHECK_GE(size, 0); |
if (cluster_timecode_ == -1) { |
MEDIA_LOG(log_cb_) << "Got a block before cluster timecode."; |
@@ -350,6 +360,10 @@ bool WebMClusterParser::OnBlock(bool is_simple_block, int track_num, |
block_duration * timecode_multiplier_)); |
} |
+ if (discard_padding >= 0) { |
+ buffer->set_discard_padding(discard_padding); |
+ } |
+ |
return track->AddBuffer(buffer); |
} |