summaryrefslogtreecommitdiffstats
path: root/media/webm
diff options
context:
space:
mode:
authorxhwang@chromium.org <xhwang@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-08-02 01:21:12 +0000
committerxhwang@chromium.org <xhwang@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-08-02 01:21:12 +0000
commit55ae5ecc5017ecce6b2d42d383d7e6fff3e78703 (patch)
treeae0eca7575207502e37356dd63fc6d54ff793300 /media/webm
parent6c7a6d221aefd8bf35e5e4368e91b532b5fd12c3 (diff)
downloadchromium_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.cc21
-rw-r--r--media/webm/webm_cluster_parser.h6
-rw-r--r--media/webm/webm_cluster_parser_unittest.cc4
-rw-r--r--media/webm/webm_content_encodings.cc6
-rw-r--r--media/webm/webm_content_encodings.h9
-rw-r--r--media/webm/webm_content_encodings_client.cc3
-rw-r--r--media/webm/webm_content_encodings_client_unittest.cc14
-rw-r--r--media/webm/webm_stream_parser.cc16
-rw-r--r--media/webm/webm_tracks_parser.cc13
-rw-r--r--media/webm/webm_tracks_parser.h5
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