diff options
author | xhwang@chromium.org <xhwang@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-08-02 01:21:12 +0000 |
---|---|---|
committer | xhwang@chromium.org <xhwang@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-08-02 01:21:12 +0000 |
commit | 55ae5ecc5017ecce6b2d42d383d7e6fff3e78703 (patch) | |
tree | ae0eca7575207502e37356dd63fc6d54ff793300 /media/webm | |
parent | 6c7a6d221aefd8bf35e5e4368e91b532b5fd12c3 (diff) | |
download | chromium_src-55ae5ecc5017ecce6b2d42d383d7e6fff3e78703.zip chromium_src-55ae5ecc5017ecce6b2d42d383d7e6fff3e78703.tar.gz chromium_src-55ae5ecc5017ecce6b2d42d383d7e6fff3e78703.tar.bz2 |
Use std::string for decryption key ID in webm parser.
TBR=ddorwin@chromium.org
BUG=130689
TEST=media_unittests
Review URL: https://chromiumcodereview.appspot.com/10826098
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@149556 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'media/webm')
-rw-r--r-- | media/webm/webm_cluster_parser.cc | 21 | ||||
-rw-r--r-- | media/webm/webm_cluster_parser.h | 6 | ||||
-rw-r--r-- | media/webm/webm_cluster_parser_unittest.cc | 4 | ||||
-rw-r--r-- | media/webm/webm_content_encodings.cc | 6 | ||||
-rw-r--r-- | media/webm/webm_content_encodings.h | 9 | ||||
-rw-r--r-- | media/webm/webm_content_encodings_client.cc | 3 | ||||
-rw-r--r-- | media/webm/webm_content_encodings_client_unittest.cc | 14 | ||||
-rw-r--r-- | media/webm/webm_stream_parser.cc | 16 | ||||
-rw-r--r-- | media/webm/webm_tracks_parser.cc | 13 | ||||
-rw-r--r-- | media/webm/webm_tracks_parser.h | 5 |
10 files changed, 38 insertions, 59 deletions
diff --git a/media/webm/webm_cluster_parser.cc b/media/webm/webm_cluster_parser.cc index e9ef93e..8348890 100644 --- a/media/webm/webm_cluster_parser.cc +++ b/media/webm/webm_cluster_parser.cc @@ -4,6 +4,8 @@ #include "media/webm/webm_cluster_parser.h" +#include <vector> + #include "base/logging.h" #include "base/sys_byteorder.h" #include "media/base/data_buffer.h" @@ -33,10 +35,9 @@ static scoped_array<uint8> GenerateCounterBlock(uint64 iv) { WebMClusterParser::WebMClusterParser(int64 timecode_scale, int audio_track_num, int video_track_num, - const uint8* video_encryption_key_id, - int video_encryption_key_id_size) + const std::string& video_encryption_key_id) : timecode_multiplier_(timecode_scale / 1000.0), - video_encryption_key_id_size_(video_encryption_key_id_size), + video_encryption_key_id_(video_encryption_key_id), parser_(kWebMIdCluster, this), last_block_timecode_(-1), block_data_size_(-1), @@ -46,12 +47,6 @@ WebMClusterParser::WebMClusterParser(int64 timecode_scale, cluster_ended_(false), audio_(audio_track_num), video_(video_track_num) { - 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() {} @@ -220,8 +215,8 @@ bool WebMClusterParser::OnBlock(int track_num, int timecode, // Every encrypted Block has an HMAC and IV prepended to it. Current encrypted // WebM request for comments specification is here // http://wiki.webmproject.org/encryption/webm-encryption-rfc - bool encrypted = track_num == video_.track_num() && - video_encryption_key_id_.get(); + bool encrypted = + track_num == video_.track_num() && !video_encryption_key_id_.empty(); // If encrypted skip past the HMAC. Encrypted buffers must include the IV and // the encrypted frame because the decryptor will verify this data before // decryption. The HMAC and IV will be copied into DecryptConfig. @@ -240,9 +235,7 @@ bool WebMClusterParser::OnBlock(int track_num, int timecode, scoped_array<uint8> counter_block(GenerateCounterBlock(iv)); buffer->SetDecryptConfig(scoped_ptr<DecryptConfig>(new DecryptConfig( - std::string( - reinterpret_cast<const char*>(video_encryption_key_id_.get()), - video_encryption_key_id_size_), + video_encryption_key_id_, std::string( reinterpret_cast<const char*>(counter_block.get()), DecryptConfig::kDecryptionKeySize), diff --git a/media/webm/webm_cluster_parser.h b/media/webm/webm_cluster_parser.h index bbcbf37..988f224 100644 --- a/media/webm/webm_cluster_parser.h +++ b/media/webm/webm_cluster_parser.h @@ -22,8 +22,7 @@ class MEDIA_EXPORT WebMClusterParser : public WebMParserClient { WebMClusterParser(int64 timecode_scale, int audio_track_num, int video_track_num, - const uint8* video_encryption_key_id, - int video_encryption_key_id_size); + const std::string& video_encryption_key_id); virtual ~WebMClusterParser(); // Resets the parser state so it can accept a new cluster. @@ -75,8 +74,7 @@ class MEDIA_EXPORT WebMClusterParser : public WebMParserClient { double timecode_multiplier_; // Multiplier used to convert timecodes into // microseconds. - scoped_array<uint8> video_encryption_key_id_; - int video_encryption_key_id_size_; + std::string video_encryption_key_id_; WebMListParser parser_; diff --git a/media/webm/webm_cluster_parser_unittest.cc b/media/webm/webm_cluster_parser_unittest.cc index 7ed6c6c..3737e38 100644 --- a/media/webm/webm_cluster_parser_unittest.cc +++ b/media/webm/webm_cluster_parser_unittest.cc @@ -2,6 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include <algorithm> + #include "base/logging.h" #include "media/webm/cluster_builder.h" #include "media/webm/webm_cluster_parser.h" @@ -125,7 +127,7 @@ class WebMClusterParserTest : public testing::Test { : parser_(new WebMClusterParser(kTimecodeScale, kAudioTrackNum, kVideoTrackNum, - NULL, 0)) { + std::string())) { } protected: diff --git a/media/webm/webm_content_encodings.cc b/media/webm/webm_content_encodings.cc index 540ac99..9789c0f 100644 --- a/media/webm/webm_content_encodings.cc +++ b/media/webm/webm_content_encodings.cc @@ -12,7 +12,6 @@ ContentEncoding::ContentEncoding() scope_(kScopeInvalid), type_(kTypeInvalid), encryption_algo_(kEncAlgoInvalid), - encryption_key_id_size_(0), cipher_mode_(kCipherModeInvalid) { } @@ -22,9 +21,8 @@ void ContentEncoding::SetEncryptionKeyId(const uint8* encryption_key_id, int size) { DCHECK(encryption_key_id); DCHECK_GT(size, 0); - encryption_key_id_.reset(new uint8[size]); - memcpy(encryption_key_id_.get(), encryption_key_id, size); - encryption_key_id_size_ = size; + encryption_key_id_.assign(reinterpret_cast<const char*>(encryption_key_id), + size); } } // namespace media diff --git a/media/webm/webm_content_encodings.h b/media/webm/webm_content_encodings.h index ea903d8..2866f25 100644 --- a/media/webm/webm_content_encodings.h +++ b/media/webm/webm_content_encodings.h @@ -5,6 +5,8 @@ #ifndef MEDIA_WEBM_WEBM_CONTENT_ENCODINGS_H_ #define MEDIA_WEBM_WEBM_CONTENT_ENCODINGS_H_ +#include <string> + #include "base/basictypes.h" #include "base/memory/scoped_ptr.h" #include "media/base/media_export.h" @@ -64,9 +66,7 @@ class MEDIA_EXPORT ContentEncoding { encryption_algo_ = encryption_algo; } - const uint8* encryption_key_id() const { return encryption_key_id_.get(); } - int encryption_key_id_size() const { return encryption_key_id_size_; } - + const std::string& encryption_key_id() const { return encryption_key_id_; } void SetEncryptionKeyId(const uint8* encryption_key_id, int size); CipherMode cipher_mode() const { return cipher_mode_; } @@ -77,8 +77,7 @@ class MEDIA_EXPORT ContentEncoding { Scope scope_; Type type_; EncryptionAlgo encryption_algo_; - scoped_array<uint8> encryption_key_id_; - int encryption_key_id_size_; + std::string encryption_key_id_; CipherMode cipher_mode_; DISALLOW_COPY_AND_ASSIGN(ContentEncoding); diff --git a/media/webm/webm_content_encodings_client.cc b/media/webm/webm_content_encodings_client.cc index a24b4bf..2541e0b 100644 --- a/media/webm/webm_content_encodings_client.cc +++ b/media/webm/webm_content_encodings_client.cc @@ -248,8 +248,7 @@ bool WebMContentEncodingsClient::OnBinary(int id, const uint8* data, int size) { DCHECK_GT(size, 0); if (id == kWebMIdContentEncKeyID) { - if (cur_content_encoding_->encryption_key_id() || - cur_content_encoding_->encryption_key_id_size()) { + if (!cur_content_encoding_->encryption_key_id().empty()) { DVLOG(1) << "Unexpected multiple ContentEncKeyID"; return false; } diff --git a/media/webm/webm_content_encodings_client_unittest.cc b/media/webm/webm_content_encodings_client_unittest.cc index e7e37d1..bf45bd7 100644 --- a/media/webm/webm_content_encodings_client_unittest.cc +++ b/media/webm/webm_content_encodings_client_unittest.cc @@ -67,8 +67,7 @@ TEST_F(WebMContentEncodingsClientTest, SingleContentEncoding) { EXPECT_EQ(ContentEncoding::kTypeEncryption, content_encodings[0]->type()); EXPECT_EQ(ContentEncoding::kEncAlgoAes, content_encodings[0]->encryption_algo()); - EXPECT_TRUE(content_encodings[0]->encryption_key_id()); - EXPECT_EQ(8, content_encodings[0]->encryption_key_id_size()); + EXPECT_EQ(8u, content_encodings[0]->encryption_key_id().size()); } TEST_F(WebMContentEncodingsClientTest, MultipleContentEncoding) { @@ -107,8 +106,7 @@ TEST_F(WebMContentEncodingsClientTest, MultipleContentEncoding) { EXPECT_EQ(ContentEncoding::kTypeEncryption, content_encodings[i]->type()); EXPECT_EQ(!i ? ContentEncoding::kEncAlgoAes : ContentEncoding::kEncAlgoDes, content_encodings[i]->encryption_algo()); - EXPECT_TRUE(content_encodings[i]->encryption_key_id()); - EXPECT_EQ(8, content_encodings[i]->encryption_key_id_size()); + EXPECT_EQ(8u, content_encodings[i]->encryption_key_id().size()); } } @@ -136,8 +134,7 @@ TEST_F(WebMContentEncodingsClientTest, DefaultValues) { EXPECT_EQ(ContentEncoding::kTypeEncryption, content_encodings[0]->type()); EXPECT_EQ(ContentEncoding::kEncAlgoNotEncrypted, content_encodings[0]->encryption_algo()); - EXPECT_FALSE(content_encodings[0]->encryption_key_id()); - EXPECT_EQ(0, content_encodings[0]->encryption_key_id_size()); + EXPECT_TRUE(content_encodings[0]->encryption_key_id().empty()); } TEST_F(WebMContentEncodingsClientTest, ContentEncodingsClientReuse) { @@ -172,8 +169,7 @@ TEST_F(WebMContentEncodingsClientTest, ContentEncodingsClientReuse) { EXPECT_EQ(ContentEncoding::kTypeEncryption, content_encodings[0]->type()); EXPECT_EQ(ContentEncoding::kEncAlgoAes, content_encodings[0]->encryption_algo()); - EXPECT_TRUE(content_encodings[0]->encryption_key_id()); - EXPECT_EQ(8, content_encodings[0]->encryption_key_id_size()); + EXPECT_EQ(8u, content_encodings[0]->encryption_key_id().size()); } TEST_F(WebMContentEncodingsClientTest, InvalidContentEncodingOrder) { @@ -237,4 +233,4 @@ TEST_F(WebMContentEncodingsClientTest, InvalidContentEncAlgo) { ParseAndExpectToFail(kContentEncodings, size); } -} // media +} // namespace media diff --git a/media/webm/webm_stream_parser.cc b/media/webm/webm_stream_parser.cc index 5119d1e..db990cd 100644 --- a/media/webm/webm_stream_parser.cc +++ b/media/webm/webm_stream_parser.cc @@ -4,6 +4,8 @@ #include "media/webm/webm_stream_parser.h" +#include <string> + #include "base/callback.h" #include "base/logging.h" #include "media/ffmpeg/ffmpeg_common.h" @@ -357,21 +359,21 @@ int WebMStreamParser::ParseInfoAndTracks(const uint8* data, int size) { } // TODO(xhwang): Support decryption of audio (see http://crbug.com/123421). - if (tracks_parser.video_encryption_key_id()) { - int key_id_size = tracks_parser.video_encryption_key_id_size(); + if (!tracks_parser.video_encryption_key_id().empty()) { + std::string key_id = tracks_parser.video_encryption_key_id(); + int key_id_size = key_id.size(); CHECK_GT(key_id_size, 0); CHECK_LT(key_id_size, 2048); - scoped_array<uint8> key_id(new uint8[key_id_size]); - memcpy(key_id.get(), tracks_parser.video_encryption_key_id(), key_id_size); - need_key_cb_.Run(key_id.Pass(), key_id_size); + scoped_array<uint8> key_id_array(new uint8[key_id_size]); + memcpy(key_id_array.get(), key_id.data(), key_id_size); + need_key_cb_.Run(key_id_array.Pass(), key_id_size); } cluster_parser_.reset(new WebMClusterParser( info_parser.timecode_scale(), tracks_parser.audio_track_num(), tracks_parser.video_track_num(), - tracks_parser.video_encryption_key_id(), - tracks_parser.video_encryption_key_id_size())); + tracks_parser.video_encryption_key_id())); ChangeState(kParsingClusters); diff --git a/media/webm/webm_tracks_parser.cc b/media/webm/webm_tracks_parser.cc index 29c8f2f..bf039bf 100644 --- a/media/webm/webm_tracks_parser.cc +++ b/media/webm/webm_tracks_parser.cc @@ -25,24 +25,15 @@ WebMTracksParser::WebMTracksParser() WebMTracksParser::~WebMTracksParser() {} -const uint8* WebMTracksParser::video_encryption_key_id() const { +const std::string& WebMTracksParser::video_encryption_key_id() const { if (!video_content_encodings_client_.get()) - return NULL; + return EmptyString(); 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 ec7b790..b4e0a58 100644 --- a/media/webm/webm_tracks_parser.h +++ b/media/webm/webm_tracks_parser.h @@ -5,6 +5,8 @@ #ifndef MEDIA_WEBM_WEBM_TRACKS_PARSER_H_ #define MEDIA_WEBM_WEBM_TRACKS_PARSER_H_ +#include <string> + #include "base/compiler_specific.h" #include "base/memory/scoped_ptr.h" #include "base/time.h" @@ -29,8 +31,7 @@ class WebMTracksParser : public WebMParserClient { int64 audio_track_num() const { return audio_track_num_; } int64 video_track_num() const { return video_track_num_; } - const uint8* video_encryption_key_id() const; - int video_encryption_key_id_size() const; + const std::string& video_encryption_key_id() const; private: // WebMParserClient methods |