diff options
author | xhwang@chromium.org <xhwang@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-03-08 05:09:27 +0000 |
---|---|---|
committer | xhwang@chromium.org <xhwang@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-03-08 05:09:27 +0000 |
commit | 08819ae89715143453b592abe0115ac1d3076003 (patch) | |
tree | 2f271a0ad88893d89a49703a5f6873ede8b5c073 /media/webm | |
parent | a8076b782e9d36f69651c84d5aee2a5ae321dca7 (diff) | |
download | chromium_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.cc | 30 | ||||
-rw-r--r-- | media/webm/webm_cluster_parser.h | 8 | ||||
-rw-r--r-- | media/webm/webm_stream_parser.cc | 13 | ||||
-rw-r--r-- | media/webm/webm_tracks_parser.cc | 20 | ||||
-rw-r--r-- | media/webm/webm_tracks_parser.h | 3 |
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; |