| Index: media/webm/webm_cluster_parser.cc
|
| diff --git a/media/webm/webm_cluster_parser.cc b/media/webm/webm_cluster_parser.cc
|
| index 5b18c56e106a520df5e801b1a899a341a1ea8a7e..43149833c7c9382c3dd1d7a939a6eb310e18893e 100644
|
| --- a/media/webm/webm_cluster_parser.cc
|
| +++ b/media/webm/webm_cluster_parser.cc
|
| @@ -5,6 +5,7 @@
|
| #include "media/webm/webm_cluster_parser.h"
|
|
|
| #include "base/logging.h"
|
| +#include "base/sys_byteorder.h"
|
| #include "media/base/data_buffer.h"
|
| #include "media/base/decrypt_config.h"
|
| #include "media/webm/webm_constants.h"
|
| @@ -187,15 +188,33 @@ bool WebMClusterParser::OnBlock(int track_num, int timecode,
|
| base::TimeDelta timestamp = base::TimeDelta::FromMicroseconds(
|
| (cluster_timecode_ + timecode) * timecode_multiplier_);
|
|
|
| + // Every encrypted Block has an HMAC and IV prepended to it. Current WebM
|
| + // encrypted request for comments specification is here
|
| + // http://wiki.webmproject.org/encryption/webm-encryption-rfc
|
| + bool encrypted = track_num == video_.track_num() &&
|
| + video_encryption_key_id_.get();
|
| + // If encrypted skip past the HMAC.
|
| + int data_offset = (encrypted) ? kWebMIntegrityCheckSize : 0;
|
| +
|
| // The first bit of the flags is set when the block contains only keyframes.
|
| // http://www.matroska.org/technical/specs/index.html
|
| bool is_keyframe = (flags & 0x80) != 0;
|
| scoped_refptr<StreamParserBuffer> buffer =
|
| - StreamParserBuffer::CopyFrom(data, size, is_keyframe);
|
| -
|
| - if (track_num == video_.track_num() && video_encryption_key_id_.get()) {
|
| + StreamParserBuffer::CopyFrom(data + data_offset,
|
| + size - data_offset,
|
| + is_keyframe);
|
| +
|
| + if (encrypted) {
|
| + uint64 network_iv;
|
| + memcpy(&network_iv,
|
| + data + kWebMIntegrityCheckSize,
|
| + sizeof(network_iv));
|
| + const uint64 iv = base::NetToHost64(network_iv);
|
| buffer->SetDecryptConfig(scoped_ptr<DecryptConfig>(new DecryptConfig(
|
| - video_encryption_key_id_.get(), video_encryption_key_id_size_)));
|
| + data, kWebMIntegrityCheckSize,
|
| + reinterpret_cast<const uint8*>(&iv), sizeof(iv),
|
| + video_encryption_key_id_.get(), video_encryption_key_id_size_,
|
| + sizeof(iv))));
|
| }
|
|
|
| buffer->SetTimestamp(timestamp);
|
|
|