Index: media/webm/webm_cluster_parser_unittest.cc |
diff --git a/media/webm/webm_cluster_parser_unittest.cc b/media/webm/webm_cluster_parser_unittest.cc |
index 07deb05515ac7c3256b92a250178ec3c1722d579..dc7332975d4aa455494eda280a69eac10fd694a9 100644 |
--- a/media/webm/webm_cluster_parser_unittest.cc |
+++ b/media/webm/webm_cluster_parser_unittest.cc |
@@ -6,6 +6,7 @@ |
#include "base/bind.h" |
#include "base/logging.h" |
+#include "media/base/decrypt_config.h" |
#include "media/webm/cluster_builder.h" |
#include "media/webm/webm_cluster_parser.h" |
#include "media/webm/webm_constants.h" |
@@ -32,7 +33,7 @@ struct BlockInfo { |
bool use_simple_block; |
}; |
-const BlockInfo kDefaultBlockInfo[] = { |
+static const BlockInfo kDefaultBlockInfo[] = { |
{ kAudioTrackNum, 0, 23, true }, |
{ kAudioTrackNum, 23, 23, true }, |
{ kVideoTrackNum, 33, 34, true }, |
@@ -42,6 +43,11 @@ const BlockInfo kDefaultBlockInfo[] = { |
{ kVideoTrackNum, 100, 33, false }, |
}; |
+static const uint8 kEncryptedFrame[] = { |
+ 0x01, // Block is encrypted |
+ 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 // IV |
+}; |
+ |
static scoped_ptr<Cluster> CreateCluster(int timecode, |
const BlockInfo* block_info, |
int block_count) { |
@@ -67,6 +73,18 @@ static scoped_ptr<Cluster> CreateCluster(int timecode, |
return cb.Finish(); |
} |
+// Creates a Cluster with one encrypted Block. |bytes_to_write| is number of |
+// bytes of the encrypted frame to write. |
+static scoped_ptr<Cluster> CreateEncryptedCluster(int bytes_to_write) { |
+ CHECK_GT(bytes_to_write, 0); |
+ CHECK_LE(bytes_to_write, static_cast<int>(sizeof(kEncryptedFrame))); |
+ |
+ ClusterBuilder cb; |
+ cb.SetClusterTimecode(0); |
+ cb.AddSimpleBlock(kVideoTrackNum, 0, 0, kEncryptedFrame, bytes_to_write); |
+ return cb.Finish(); |
+} |
+ |
static bool VerifyBuffers(const WebMClusterParser::BufferQueue& audio_buffers, |
const WebMClusterParser::BufferQueue& video_buffers, |
const WebMClusterParser::BufferQueue& text_buffers, |
@@ -165,6 +183,15 @@ static bool VerifyTextBuffers( |
return true; |
} |
+static bool VerifyEncryptedBuffer( |
+ scoped_refptr<StreamParserBuffer> buffer) { |
+ EXPECT_TRUE(buffer->GetDecryptConfig()); |
+ EXPECT_EQ(static_cast<unsigned long>(DecryptConfig::kDecryptionKeySize), |
+ buffer->GetDecryptConfig()->iv().length()); |
+ const uint8* data = buffer->GetData(); |
+ return data[0] & kWebMFlagEncryptedFrame; |
+} |
+ |
static void AppendToEnd(const WebMClusterParser::BufferQueue& src, |
WebMClusterParser::BufferQueue* dest) { |
for (WebMClusterParser::BufferQueue::const_iterator itr = src.begin(); |
@@ -440,4 +467,32 @@ TEST_F(WebMClusterParserTest, ParseMultipleTextTracks) { |
} |
} |
+TEST_F(WebMClusterParserTest, ParseEncryptedBlock) { |
+ scoped_ptr<Cluster> cluster(CreateEncryptedCluster(sizeof(kEncryptedFrame))); |
+ |
+ parser_.reset(new WebMClusterParser( |
+ kTimecodeScale, kAudioTrackNum, kVideoTrackNum, |
+ std::set<int>(), |
+ std::set<int64>(), "", "video_key_id", |
+ LogCB())); |
+ int result = parser_->Parse(cluster->data(), cluster->size()); |
+ EXPECT_EQ(cluster->size(), result); |
+ ASSERT_EQ(1UL, parser_->video_buffers().size()); |
+ scoped_refptr<StreamParserBuffer> buffer = parser_->video_buffers()[0]; |
+ EXPECT_TRUE(VerifyEncryptedBuffer(buffer)); |
+} |
+ |
+TEST_F(WebMClusterParserTest, ParseBadEncryptedBlock) { |
+ scoped_ptr<Cluster> cluster( |
+ CreateEncryptedCluster(sizeof(kEncryptedFrame) - 1)); |
+ |
+ parser_.reset(new WebMClusterParser( |
+ kTimecodeScale, kAudioTrackNum, kVideoTrackNum, |
+ std::set<int>(), |
+ std::set<int64>(), "", "video_key_id", |
+ LogCB())); |
+ int result = parser_->Parse(cluster->data(), cluster->size()); |
+ EXPECT_EQ(-1, result); |
+} |
+ |
} // namespace media |