| 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..4e3ed33c6ebe9868c6077bb8585cc9694ad4b1cd 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,14 +188,26 @@ bool WebMClusterParser::OnBlock(int track_num, int timecode,
|
| base::TimeDelta timestamp = base::TimeDelta::FromMicroseconds(
|
| (cluster_timecode_ + timecode) * timecode_multiplier_);
|
|
|
| + bool encrypted = track_num == video_.track_num() &&
|
| + video_encryption_key_id_.get();
|
| +
|
| // 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()) {
|
| + if (encrypted) {
|
| + // 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.
|
| + uint64 network_iv;
|
| + memcpy(&network_iv,
|
| + data + DecryptConfig::kWebMIntegrityCheckSize,
|
| + sizeof(network_iv));
|
| + const uint64 iv = base::NetToHost64(network_iv);
|
| buffer->SetDecryptConfig(scoped_ptr<DecryptConfig>(new DecryptConfig(
|
| + data, DecryptConfig::kWebMIntegrityCheckSize, iv,
|
| video_encryption_key_id_.get(), video_encryption_key_id_size_)));
|
| }
|
|
|
|
|