Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(416)

Unified Diff: media/webm/webm_cluster_parser.cc

Issue 11088047: Support encrypted audio stream in demuxer. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase Created 8 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « media/webm/webm_cluster_parser.h ('k') | media/webm/webm_cluster_parser_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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)
« no previous file with comments | « media/webm/webm_cluster_parser.h ('k') | media/webm/webm_cluster_parser_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698