| Index: media/webm/webm_cluster_parser.cc
|
| diff --git a/media/webm/webm_cluster_parser.cc b/media/webm/webm_cluster_parser.cc
|
| index a6867bc07d9783c863325f9f84dd89705defcf2a..fb1c69b874739719169085cbdcf4278862e95a61 100644
|
| --- a/media/webm/webm_cluster_parser.cc
|
| +++ b/media/webm/webm_cluster_parser.cc
|
| @@ -26,8 +26,10 @@ static std::string GenerateCounterBlock(uint64 iv) {
|
| WebMClusterParser::WebMClusterParser(int64 timecode_scale,
|
| int audio_track_num,
|
| int video_track_num,
|
| + const std::string& audio_encryption_key_id,
|
| const std::string& video_encryption_key_id)
|
| : timecode_multiplier_(timecode_scale / 1000.0),
|
| + audio_encryption_key_id_(audio_encryption_key_id),
|
| video_encryption_key_id_(video_encryption_key_id),
|
| parser_(kWebMIdCluster, this),
|
| last_block_timecode_(-1),
|
| @@ -198,24 +200,34 @@ bool WebMClusterParser::OnBlock(int track_num, int timecode,
|
| return false;
|
| }
|
|
|
| + Track* track = NULL;
|
| + std::string encryption_key_id;
|
| + if (track_num == audio_.track_num()) {
|
| + track = &audio_;
|
| + encryption_key_id = audio_encryption_key_id_;
|
| + } else if (track_num == video_.track_num()) {
|
| + track = &video_;
|
| + encryption_key_id = video_encryption_key_id_;
|
| + } else {
|
| + DVLOG(1) << "Unexpected track number " << track_num;
|
| + return false;
|
| + }
|
| +
|
| last_block_timecode_ = timecode;
|
|
|
| base::TimeDelta timestamp = base::TimeDelta::FromMicroseconds(
|
| (cluster_timecode_ + timecode) * timecode_multiplier_);
|
|
|
| - // Every encrypted Block has a signal byte and IV prepended to it. Current
|
| - // encrypted WebM request for comments specification is here
|
| - // http://wiki.webmproject.org/encryption/webm-encryption-rfc
|
| - bool is_track_encrypted =
|
| - track_num == video_.track_num() && !video_encryption_key_id_.empty();
|
| -
|
| // 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 (is_track_encrypted) {
|
| + // Every encrypted Block has a signal byte and IV prepended to it. Current
|
| + // encrypted WebM request for comments specification is here
|
| + // http://wiki.webmproject.org/encryption/webm-encryption-rfc
|
| + if (!encryption_key_id.empty()) {
|
| uint8 signal_byte = data[0];
|
| int data_offset = sizeof(signal_byte);
|
|
|
| @@ -227,9 +239,8 @@ bool WebMClusterParser::OnBlock(int track_num, int timecode,
|
| if (signal_byte & kWebMFlagEncryptedFrame) {
|
| uint64 network_iv;
|
| memcpy(&network_iv, data + data_offset, sizeof(network_iv));
|
| - const uint64 iv = base::NetToHost64(network_iv);
|
| - counter_block = GenerateCounterBlock(iv);
|
| - data_offset += sizeof(iv);
|
| + data_offset += sizeof(network_iv);
|
| + counter_block = GenerateCounterBlock(base::NetToHost64(network_iv));
|
| }
|
|
|
| // TODO(fgalligan): Revisit if DecryptConfig needs to be set on unencrypted
|
| @@ -237,7 +248,7 @@ bool WebMClusterParser::OnBlock(int track_num, int timecode,
|
| // Unencrypted frames of potentially encrypted streams currently set
|
| // DecryptConfig.
|
| buffer->SetDecryptConfig(scoped_ptr<DecryptConfig>(new DecryptConfig(
|
| - video_encryption_key_id_,
|
| + encryption_key_id,
|
| counter_block,
|
| data_offset,
|
| std::vector<SubsampleEntry>())));
|
| @@ -252,14 +263,7 @@ bool WebMClusterParser::OnBlock(int track_num, int timecode,
|
| block_duration * timecode_multiplier_));
|
| }
|
|
|
| - if (track_num == audio_.track_num()) {
|
| - return audio_.AddBuffer(buffer);
|
| - } else if (track_num == video_.track_num()) {
|
| - return video_.AddBuffer(buffer);
|
| - }
|
| -
|
| - DVLOG(1) << "Unexpected track number " << track_num;
|
| - return false;
|
| + return track->AddBuffer(buffer);
|
| }
|
|
|
| WebMClusterParser::Track::Track(int track_num)
|
|
|