Index: media/webm/webm_cluster_parser.cc |
diff --git a/media/webm/webm_cluster_parser.cc b/media/webm/webm_cluster_parser.cc |
index 6cbd71d8904fe75e30306b828e2cea112530238e..a7ec737b5e9553147b0dc7df6b9502c70300738f 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" |
@@ -184,17 +185,31 @@ bool WebMClusterParser::OnBlock(int track_num, int timecode, |
last_block_timecode_ = timecode; |
- base::TimeDelta timestamp = base::TimeDelta::FromMicroseconds( |
+ const base::TimeDelta timestamp = base::TimeDelta::FromMicroseconds( |
(cluster_timecode_ + timecode) * timecode_multiplier_); |
xhwang
2012/06/06 20:54:06
I remember scherkus@ told me that in media stack c
fgalligan1
2012/06/08 21:02:38
Thanks for the info. Done.
|
+ const bool encrypted = track_num == video_.track_num() && |
+ video_encryption_key_id_.get(); |
+ |
+ // Every encrypted Block has an HMAC and IV prepended to every encrypted |
+ // frame. |
+ const uint8* const frame_data = |
+ encrypted ? data + kIntegrityCheckSize + kIVSize : data; |
+ const int frame_size = |
+ encrypted ? size - (kIntegrityCheckSize + kIVSize) : size; |
+ |
// 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; |
+ const bool is_keyframe = (flags & 0x80) != 0; |
scoped_refptr<StreamParserBuffer> buffer = |
- StreamParserBuffer::CopyFrom(data, size, is_keyframe); |
+ StreamParserBuffer::CopyFrom(frame_data, frame_size, is_keyframe); |
- if (track_num == video_.track_num() && video_encryption_key_id_.get()) { |
+ if (encrypted) { |
+ uint64 network_iv; |
+ memcpy(&network_iv, data + kIntegrityCheckSize, sizeof(network_iv)); |
+ const uint64 iv = base::NetToHost64(network_iv); |
buffer->SetDecryptConfig(scoped_ptr<DecryptConfig>(new DecryptConfig( |
+ data, kIntegrityCheckSize, iv, |
video_encryption_key_id_.get(), video_encryption_key_id_size_))); |
} |