Chromium Code Reviews| 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_))); |
| } |