summaryrefslogtreecommitdiffstats
path: root/media/webm
diff options
context:
space:
mode:
authorxhwang@chromium.org <xhwang@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-03-08 05:09:27 +0000
committerxhwang@chromium.org <xhwang@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-03-08 05:09:27 +0000
commit08819ae89715143453b592abe0115ac1d3076003 (patch)
tree2f271a0ad88893d89a49703a5f6873ede8b5c073 /media/webm
parenta8076b782e9d36f69651c84d5aee2a5ae321dca7 (diff)
downloadchromium_src-08819ae89715143453b592abe0115ac1d3076003.zip
chromium_src-08819ae89715143453b592abe0115ac1d3076003.tar.gz
chromium_src-08819ae89715143453b592abe0115ac1d3076003.tar.bz2
Add AES decryptor and tests.
For now we support decryption in video only. The first encryption key ID in ContentEncodings element will be used as the decryption key ID. Also we assume decryption key is the same as key ID. BUG=117060 TEST=test page with encrypted content plays; added media_unittest Review URL: http://codereview.chromium.org/9298021 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@125560 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'media/webm')
-rw-r--r--media/webm/webm_cluster_parser.cc30
-rw-r--r--media/webm/webm_cluster_parser.h8
-rw-r--r--media/webm/webm_stream_parser.cc13
-rw-r--r--media/webm/webm_tracks_parser.cc20
-rw-r--r--media/webm/webm_tracks_parser.h3
5 files changed, 55 insertions, 19 deletions
diff --git a/media/webm/webm_cluster_parser.cc b/media/webm/webm_cluster_parser.cc
index 92f1dc7..c34cd8d 100644
--- a/media/webm/webm_cluster_parser.cc
+++ b/media/webm/webm_cluster_parser.cc
@@ -6,33 +6,33 @@
#include "base/logging.h"
#include "media/base/data_buffer.h"
-#include "media/ffmpeg/ffmpeg_common.h"
+#include "media/base/decrypt_config.h"
#include "media/webm/webm_constants.h"
namespace media {
-static Buffer* CreateBuffer(const uint8* data, size_t size) {
- // Why FF_INPUT_BUFFER_PADDING_SIZE? FFmpeg assumes all input buffers are
- // padded with this value.
- scoped_array<uint8> buf(new uint8[size + FF_INPUT_BUFFER_PADDING_SIZE]);
- memcpy(buf.get(), data, size);
- memset(buf.get() + size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
- return new DataBuffer(buf.Pass(), size);
-}
-
WebMClusterParser::WebMClusterParser(int64 timecode_scale,
int audio_track_num,
base::TimeDelta audio_default_duration,
int video_track_num,
- base::TimeDelta video_default_duration)
+ base::TimeDelta video_default_duration,
+ const uint8* video_encryption_key_id,
+ int video_encryption_key_id_size)
: timecode_multiplier_(timecode_scale / 1000.0),
audio_track_num_(audio_track_num),
audio_default_duration_(audio_default_duration),
video_track_num_(video_track_num),
video_default_duration_(video_default_duration),
+ video_encryption_key_id_size_(video_encryption_key_id_size),
parser_(kWebMIdCluster, this),
last_block_timecode_(-1),
cluster_timecode_(-1) {
+ CHECK_GE(video_encryption_key_id_size, 0);
+ if (video_encryption_key_id_size > 0) {
+ video_encryption_key_id_.reset(new uint8[video_encryption_key_id_size]);
+ memcpy(video_encryption_key_id_.get(), video_encryption_key_id,
+ video_encryption_key_id_size);
+ }
}
WebMClusterParser::~WebMClusterParser() {}
@@ -115,7 +115,13 @@ bool WebMClusterParser::OnSimpleBlock(int track_num, int timecode,
base::TimeDelta timestamp = base::TimeDelta::FromMicroseconds(
(cluster_timecode_ + timecode) * timecode_multiplier_);
- scoped_refptr<Buffer> buffer(CreateBuffer(data, size));
+ scoped_refptr<DataBuffer> buffer = DataBuffer::CopyFrom(data, size);
+
+ if (track_num == video_track_num_ && video_encryption_key_id_.get()) {
+ buffer->SetDecryptConfig(scoped_ptr<DecryptConfig>(new DecryptConfig(
+ video_encryption_key_id_.get(), video_encryption_key_id_size_)));
+ }
+
buffer->SetTimestamp(timestamp);
BufferQueue* queue = NULL;
diff --git a/media/webm/webm_cluster_parser.h b/media/webm/webm_cluster_parser.h
index 2db3755..8646289 100644
--- a/media/webm/webm_cluster_parser.h
+++ b/media/webm/webm_cluster_parser.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -22,7 +22,9 @@ class WebMClusterParser : public WebMParserClient {
int audio_track_num,
base::TimeDelta audio_default_duration,
int video_track_num,
- base::TimeDelta video_default_duration);
+ base::TimeDelta video_default_duration,
+ const uint8* video_encryption_key_id,
+ int video_encryption_key_id_size);
virtual ~WebMClusterParser();
// Resets the parser state so it can accept a new cluster.
@@ -52,6 +54,8 @@ class WebMClusterParser : public WebMParserClient {
base::TimeDelta audio_default_duration_;
int video_track_num_;
base::TimeDelta video_default_duration_;
+ scoped_array<uint8> video_encryption_key_id_;
+ int video_encryption_key_id_size_;
WebMListParser parser_;
diff --git a/media/webm/webm_stream_parser.cc b/media/webm/webm_stream_parser.cc
index 036f7e7b0..d986deb 100644
--- a/media/webm/webm_stream_parser.cc
+++ b/media/webm/webm_stream_parser.cc
@@ -11,6 +11,7 @@
#include "media/filters/in_memory_url_protocol.h"
#include "media/webm/webm_cluster_parser.h"
#include "media/webm/webm_constants.h"
+#include "media/webm/webm_content_encodings.h"
#include "media/webm/webm_info_parser.h"
#include "media/webm/webm_tracks_parser.h"
@@ -33,6 +34,10 @@ class FFmpegConfigHelper {
const VideoDecoderConfig& video_config() const;
private:
+ static const uint8 kWebMHeader[];
+ static const int kSegmentSizeOffset;
+ static const uint8 kEmptyCluster[];
+
AVFormatContext* CreateFormatContext(const uint8* data, int size);
bool SetupStreamConfigs();
@@ -50,10 +55,6 @@ class FFmpegConfigHelper {
// DestroyAVFormatContext() in the destructor.
AVFormatContext* format_context_;
- static const uint8 kWebMHeader[];
- static const int kSegmentSizeOffset;
- static const uint8 kEmptyCluster[];
-
DISALLOW_COPY_AND_ASSIGN(FFmpegConfigHelper);
};
@@ -305,7 +306,9 @@ int WebMStreamParser::ParseInfoAndTracks(const uint8* data, int size) {
tracks_parser.audio_track_num(),
tracks_parser.audio_default_duration(),
tracks_parser.video_track_num(),
- tracks_parser.video_default_duration()));
+ tracks_parser.video_default_duration(),
+ tracks_parser.video_encryption_key_id(),
+ tracks_parser.video_encryption_key_id_size()));
ChangeState(PARSING_CLUSTERS);
init_cb_.Run(true, duration);
diff --git a/media/webm/webm_tracks_parser.cc b/media/webm/webm_tracks_parser.cc
index 84550b7..7aa85d5 100644
--- a/media/webm/webm_tracks_parser.cc
+++ b/media/webm/webm_tracks_parser.cc
@@ -5,7 +5,9 @@
#include "media/webm/webm_tracks_parser.h"
#include "base/logging.h"
+#include "base/string_util.h"
#include "media/webm/webm_constants.h"
+#include "media/webm/webm_content_encodings.h"
namespace media {
@@ -24,6 +26,24 @@ WebMTracksParser::WebMTracksParser(int64 timecode_scale)
WebMTracksParser::~WebMTracksParser() {}
+const uint8* WebMTracksParser::video_encryption_key_id() const {
+ if (!video_content_encodings_client_.get())
+ return NULL;
+
+ DCHECK(!video_content_encodings_client_->content_encodings().empty());
+ return video_content_encodings_client_->content_encodings()[0]->
+ encryption_key_id();
+}
+
+int WebMTracksParser::video_encryption_key_id_size() const {
+ if (!video_content_encodings_client_.get())
+ return 0;
+
+ DCHECK(!video_content_encodings_client_->content_encodings().empty());
+ return video_content_encodings_client_->content_encodings()[0]->
+ encryption_key_id_size();
+}
+
int WebMTracksParser::Parse(const uint8* buf, int size) {
track_type_ =-1;
track_num_ = -1;
diff --git a/media/webm/webm_tracks_parser.h b/media/webm/webm_tracks_parser.h
index efe45d9..db2c928 100644
--- a/media/webm/webm_tracks_parser.h
+++ b/media/webm/webm_tracks_parser.h
@@ -36,6 +36,9 @@ class WebMTracksParser : public WebMParserClient {
return video_default_duration_;
}
+ const uint8* video_encryption_key_id() const;
+ int video_encryption_key_id_size() const;
+
private:
// WebMParserClient methods
virtual WebMParserClient* OnListStart(int id) OVERRIDE;