Index: media/formats/webm/webm_cluster_parser_unittest.cc |
diff --git a/media/formats/webm/webm_cluster_parser_unittest.cc b/media/formats/webm/webm_cluster_parser_unittest.cc |
index 15145cac53f1e1679cb4995d9cb1356c2f796ec0..eaeb3186da3d37acacbdf6983dd14e2cfe950130 100644 |
--- a/media/formats/webm/webm_cluster_parser_unittest.cc |
+++ b/media/formats/webm/webm_cluster_parser_unittest.cc |
@@ -4,15 +4,12 @@ |
#include <algorithm> |
#include <cstdlib> |
-#include <string> |
#include <vector> |
#include "base/bind.h" |
#include "base/logging.h" |
-#include "base/strings/string_number_conversions.h" |
#include "media/base/audio_decoder_config.h" |
#include "media/base/decrypt_config.h" |
-#include "media/base/mock_media_log.h" |
#include "media/formats/webm/cluster_builder.h" |
#include "media/formats/webm/opus_packet_builder.h" |
#include "media/formats/webm/webm_cluster_parser.h" |
@@ -20,53 +17,24 @@ |
#include "testing/gmock/include/gmock/gmock.h" |
#include "testing/gtest/include/gtest/gtest.h" |
-using ::testing::HasSubstr; |
using ::testing::InSequence; |
using ::testing::Return; |
-using ::testing::StrictMock; |
using ::testing::_; |
namespace media { |
typedef WebMTracksParser::TextTracks TextTracks; |
-// Matchers for verifying common media log entry strings. |
-MATCHER_P(OpusPacketDurationTooHigh, actual_duration_ms, "") { |
- return CONTAINS_STRING( |
- arg, "Warning, demuxed Opus packet with encoded duration: " + |
- base::IntToString(actual_duration_ms) + |
- "ms. Should be no greater than 120ms."); |
-} |
- |
-MATCHER_P(WebMSimpleBlockDurationEstimated, estimated_duration_ms, "") { |
- return CONTAINS_STRING(arg, "Estimating WebM block duration to be " + |
- base::IntToString(estimated_duration_ms) + |
- "ms for the last (Simple)Block in the " |
- "Cluster for this Track. Use BlockGroups " |
- "with BlockDurations at the end of each " |
- "Track in a Cluster to avoid estimation."); |
-} |
- |
-MATCHER_P2(WebMBlockDurationMismatchesOpusDuration, |
- block_duration_ms, |
- opus_duration_ms, |
- "") { |
- return CONTAINS_STRING( |
- arg, "BlockDuration (" + base::IntToString(block_duration_ms) + |
- "ms) differs significantly from encoded duration (" + |
- base::IntToString(opus_duration_ms) + "ms)."); |
-} |
- |
namespace { |
-// Timecode scale for millisecond timestamps. |
-const int kTimecodeScale = 1000000; |
- |
-const int kAudioTrackNum = 1; |
-const int kVideoTrackNum = 2; |
-const int kTextTrackNum = 3; |
-const int kTestAudioFrameDefaultDurationInMs = 13; |
-const int kTestVideoFrameDefaultDurationInMs = 17; |
+enum { |
+ kTimecodeScale = 1000000, // Timecode scale for millisecond timestamps. |
+ kAudioTrackNum = 1, |
+ kVideoTrackNum = 2, |
+ kTextTrackNum = 3, |
+ kTestAudioFrameDefaultDurationInMs = 13, |
+ kTestVideoFrameDefaultDurationInMs = 17 |
+}; |
// Test duration defaults must differ from parser estimation defaults to know |
// which durations parser used when emitting buffers. |
@@ -114,6 +82,58 @@ |
// IV |
0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}; |
+ |
+// Helper that hard-codes some non-varying constructor parameters. |
+WebMClusterParser* CreateParserHelper( |
+ base::TimeDelta audio_default_duration, |
+ base::TimeDelta video_default_duration, |
+ const WebMTracksParser::TextTracks& text_tracks, |
+ const std::set<int64>& ignored_tracks, |
+ const std::string& audio_encryption_key_id, |
+ const std::string& video_encryption_key_id, |
+ const AudioCodec audio_codec) { |
+ return new WebMClusterParser( |
+ kTimecodeScale, kAudioTrackNum, audio_default_duration, kVideoTrackNum, |
+ video_default_duration, text_tracks, ignored_tracks, |
+ audio_encryption_key_id, video_encryption_key_id, audio_codec, |
+ new MediaLog()); |
+} |
+ |
+// Create a default version of the parser for test. |
+WebMClusterParser* CreateDefaultParser() { |
+ return CreateParserHelper(kNoTimestamp(), kNoTimestamp(), TextTracks(), |
+ std::set<int64>(), std::string(), std::string(), |
+ kUnknownAudioCodec); |
+} |
+ |
+// Create a parser for test with custom audio and video default durations, and |
+// optionally custom text tracks. |
+WebMClusterParser* CreateParserWithDefaultDurationsAndOptionalTextTracks( |
+ base::TimeDelta audio_default_duration, |
+ base::TimeDelta video_default_duration, |
+ const WebMTracksParser::TextTracks& text_tracks = TextTracks()) { |
+ return CreateParserHelper(audio_default_duration, video_default_duration, |
+ text_tracks, std::set<int64>(), std::string(), |
+ std::string(), kUnknownAudioCodec); |
+} |
+ |
+// Create a parser for test with custom ignored tracks. |
+WebMClusterParser* CreateParserWithIgnoredTracks( |
+ std::set<int64>& ignored_tracks) { |
+ return CreateParserHelper(kNoTimestamp(), kNoTimestamp(), TextTracks(), |
+ ignored_tracks, std::string(), std::string(), |
+ kUnknownAudioCodec); |
+} |
+ |
+// Create a parser for test with custom encryption key ids and audio codec. |
+WebMClusterParser* CreateParserWithKeyIdsAndAudioCodec( |
+ const std::string& audio_encryption_key_id, |
+ const std::string& video_encryption_key_id, |
+ const AudioCodec audio_codec) { |
+ return CreateParserHelper(kNoTimestamp(), kNoTimestamp(), TextTracks(), |
+ std::set<int64>(), audio_encryption_key_id, |
+ video_encryption_key_id, audio_codec); |
+} |
scoped_ptr<Cluster> CreateCluster(int timecode, |
const BlockInfo* block_info, |
@@ -293,9 +313,7 @@ |
class WebMClusterParserTest : public testing::Test { |
public: |
- WebMClusterParserTest() |
- : media_log_(new StrictMock<MockMediaLog>()), |
- parser_(CreateDefaultParser()) {} |
+ WebMClusterParserTest() : parser_(CreateDefaultParser()) {} |
protected: |
void ResetParserToHaveDefaultDurations() { |
@@ -312,59 +330,6 @@ |
default_audio_duration, default_video_duration)); |
} |
- // Helper that hard-codes some non-varying constructor parameters. |
- WebMClusterParser* CreateParserHelper( |
- base::TimeDelta audio_default_duration, |
- base::TimeDelta video_default_duration, |
- const WebMTracksParser::TextTracks& text_tracks, |
- const std::set<int64>& ignored_tracks, |
- const std::string& audio_encryption_key_id, |
- const std::string& video_encryption_key_id, |
- const AudioCodec audio_codec) { |
- return new WebMClusterParser( |
- kTimecodeScale, kAudioTrackNum, audio_default_duration, kVideoTrackNum, |
- video_default_duration, text_tracks, ignored_tracks, |
- audio_encryption_key_id, video_encryption_key_id, audio_codec, |
- media_log_); |
- } |
- |
- // Create a default version of the parser for test. |
- WebMClusterParser* CreateDefaultParser() { |
- return CreateParserHelper(kNoTimestamp(), kNoTimestamp(), TextTracks(), |
- std::set<int64>(), std::string(), std::string(), |
- kUnknownAudioCodec); |
- } |
- |
- // Create a parser for test with custom audio and video default durations, and |
- // optionally custom text tracks. |
- WebMClusterParser* CreateParserWithDefaultDurationsAndOptionalTextTracks( |
- base::TimeDelta audio_default_duration, |
- base::TimeDelta video_default_duration, |
- const WebMTracksParser::TextTracks& text_tracks = TextTracks()) { |
- return CreateParserHelper(audio_default_duration, video_default_duration, |
- text_tracks, std::set<int64>(), std::string(), |
- std::string(), kUnknownAudioCodec); |
- } |
- |
- // Create a parser for test with custom ignored tracks. |
- WebMClusterParser* CreateParserWithIgnoredTracks( |
- std::set<int64>& ignored_tracks) { |
- return CreateParserHelper(kNoTimestamp(), kNoTimestamp(), TextTracks(), |
- ignored_tracks, std::string(), std::string(), |
- kUnknownAudioCodec); |
- } |
- |
- // Create a parser for test with custom encryption key ids and audio codec. |
- WebMClusterParser* CreateParserWithKeyIdsAndAudioCodec( |
- const std::string& audio_encryption_key_id, |
- const std::string& video_encryption_key_id, |
- const AudioCodec audio_codec) { |
- return CreateParserHelper(kNoTimestamp(), kNoTimestamp(), TextTracks(), |
- std::set<int64>(), audio_encryption_key_id, |
- video_encryption_key_id, audio_codec); |
- } |
- |
- scoped_refptr<StrictMock<MockMediaLog>> media_log_; |
scoped_ptr<WebMClusterParser> parser_; |
private: |
@@ -391,8 +356,6 @@ |
parser_.reset(CreateParserWithDefaultDurationsAndOptionalTextTracks( |
default_audio_duration, kNoTimestamp(), text_tracks)); |
- const int kExpectedVideoEstimationInMs = 33; |
- |
const BlockInfo kBlockInfo[] = { |
{kVideoTrackNum, 0, 33, true, NULL, 0}, |
{kAudioTrackNum, 0, 23, false, NULL, 0}, |
@@ -400,7 +363,7 @@ |
{kAudioTrackNum, 23, kTestAudioFrameDefaultDurationInMs, true, NULL, 0}, |
{kVideoTrackNum, 33, 33, true, NULL, 0}, |
{kAudioTrackNum, 36, kTestAudioFrameDefaultDurationInMs, true, NULL, 0}, |
- {kVideoTrackNum, 66, kExpectedVideoEstimationInMs, true, NULL, 0}, |
+ {kVideoTrackNum, 66, 33, true, NULL, 0}, |
{kAudioTrackNum, 70, kTestAudioFrameDefaultDurationInMs, true, NULL, 0}, |
{kAudioTrackNum, 83, kTestAudioFrameDefaultDurationInMs, true, NULL, 0}, |
}; |
@@ -437,12 +400,6 @@ |
blocks_in_cluster)); |
// Parse all but the last byte unless we need to parse the full cluster. |
bool parse_full_cluster = i == (block_count - 1); |
- |
- if (parse_full_cluster) { |
- EXPECT_MEDIA_LOG( |
- WebMSimpleBlockDurationEstimated(kExpectedVideoEstimationInMs)); |
- } |
- |
int result = parser_->Parse(cluster->data(), parse_full_cluster ? |
cluster->size() : cluster->size() - 1); |
if (parse_full_cluster) { |
@@ -604,8 +561,6 @@ |
scoped_ptr<Cluster> cluster( |
CreateCluster(0, kInputBlockInfo, input_block_count)); |
- EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(23)); |
- EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(34)); |
int result = parser_->Parse(cluster->data(), cluster->size()); |
EXPECT_EQ(cluster->size(), result); |
ASSERT_TRUE(VerifyBuffers(parser_, kOutputBlockInfo, output_block_count)); |
@@ -635,8 +590,6 @@ |
scoped_ptr<Cluster> cluster( |
CreateCluster(0, kInputBlockInfo, input_block_count)); |
- EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(23)); |
- EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(34)); |
int result = parser_->Parse(cluster->data(), cluster->size()); |
EXPECT_EQ(cluster->size(), result); |
ASSERT_TRUE(VerifyBuffers(parser_, kInputBlockInfo, input_block_count)); |
@@ -696,8 +649,6 @@ |
scoped_ptr<Cluster> cluster( |
CreateCluster(0, kInputBlockInfo, input_block_count)); |
- EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(23)); |
- EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(34)); |
int result = parser_->Parse(cluster->data(), cluster->size()); |
EXPECT_EQ(cluster->size(), result); |
@@ -720,11 +671,6 @@ |
parser_.reset(CreateParserWithKeyIdsAndAudioCodec( |
std::string(), "video_key_id", kUnknownAudioCodec)); |
- |
- // The encrypted cluster contains just one block, video. |
- EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated( |
- WebMClusterParser::kDefaultVideoBufferDurationInMs)); |
- |
int result = parser_->Parse(cluster->data(), cluster->size()); |
EXPECT_EQ(cluster->size(), result); |
ASSERT_EQ(1UL, parser_->GetVideoBuffers().size()); |
@@ -825,17 +771,16 @@ |
// cluster. For video tracks we use the maximum seen so far. For audio we use |
// the the minimum. |
// TODO(chcunningham): Move audio over to use the maximum. |
- |
- const int kExpectedAudioEstimationInMs = 22; |
- const int kExpectedVideoEstimationInMs = 34; |
const BlockInfo kBlockInfo1[] = { |
{kAudioTrackNum, 0, 23, true, NULL, 0}, |
{kAudioTrackNum, 23, 22, true, NULL, 0}, |
{kVideoTrackNum, 33, 33, true, NULL, 0}, |
{kAudioTrackNum, 45, 23, true, NULL, 0}, |
{kVideoTrackNum, 66, 34, true, NULL, 0}, |
- {kAudioTrackNum, 68, kExpectedAudioEstimationInMs, true, NULL, 0}, |
- {kVideoTrackNum, 100, kExpectedVideoEstimationInMs, true, NULL, 0}, |
+ // Estimated from minimum audio dur |
+ {kAudioTrackNum, 68, 22, true, NULL, 0}, |
+ // Estimated from maximum video dur |
+ {kVideoTrackNum, 100, 34, true, NULL, 0}, |
}; |
int block_count1 = arraysize(kBlockInfo1); |
@@ -856,10 +801,6 @@ |
parser_->Reset(); |
// Now parse the full first cluster and verify all the blocks are parsed. |
- EXPECT_MEDIA_LOG( |
- WebMSimpleBlockDurationEstimated(kExpectedAudioEstimationInMs)); |
- EXPECT_MEDIA_LOG( |
- WebMSimpleBlockDurationEstimated(kExpectedVideoEstimationInMs)); |
result = parser_->Parse(cluster1->data(), cluster1->size()); |
EXPECT_EQ(cluster1->size(), result); |
ASSERT_TRUE(VerifyBuffers(parser_, kBlockInfo1, block_count1)); |
@@ -868,17 +809,13 @@ |
// each track. |
const BlockInfo kBlockInfo2[] = { |
// Estimate carries over across clusters |
- {kAudioTrackNum, 200, kExpectedAudioEstimationInMs, true, NULL, 0}, |
+ {kAudioTrackNum, 200, 22, true, NULL, 0}, |
// Estimate carries over across clusters |
- {kVideoTrackNum, 201, kExpectedVideoEstimationInMs, true, NULL, 0}, |
+ {kVideoTrackNum, 201, 34, true, NULL, 0}, |
}; |
int block_count2 = arraysize(kBlockInfo2); |
scoped_ptr<Cluster> cluster2(CreateCluster(0, kBlockInfo2, block_count2)); |
- EXPECT_MEDIA_LOG( |
- WebMSimpleBlockDurationEstimated(kExpectedAudioEstimationInMs)); |
- EXPECT_MEDIA_LOG( |
- WebMSimpleBlockDurationEstimated(kExpectedVideoEstimationInMs)); |
result = parser_->Parse(cluster2->data(), cluster2->size()); |
EXPECT_EQ(cluster2->size(), result); |
ASSERT_TRUE(VerifyBuffers(parser_, kBlockInfo2, block_count2)); |
@@ -893,17 +830,16 @@ |
// independently for each track in the cluster. For video tracks we use the |
// maximum seen so far. For audio we use the the minimum. |
// TODO(chcunningham): Move audio over to use the maximum. |
- |
- const int kExpectedAudioEstimationInMs = 22; |
- const int kExpectedVideoEstimationInMs = 34; |
const BlockInfo kBlockInfo1[] = { |
{kAudioTrackNum, 0, -23, false, NULL, 0}, |
{kAudioTrackNum, 23, -22, false, NULL, 0}, |
{kVideoTrackNum, 33, -33, false, NULL, 0}, |
{kAudioTrackNum, 45, -23, false, NULL, 0}, |
{kVideoTrackNum, 66, -34, false, NULL, 0}, |
- {kAudioTrackNum, 68, -kExpectedAudioEstimationInMs, false, NULL, 0}, |
- {kVideoTrackNum, 100, -kExpectedVideoEstimationInMs, false, NULL, 0}, |
+ // Estimated from minimum audio dur |
+ {kAudioTrackNum, 68, -22, false, NULL, 0}, |
+ // Estimated from maximum video dur |
+ {kVideoTrackNum, 100, -34, false, NULL, 0}, |
}; |
int block_count1 = arraysize(kBlockInfo1); |
@@ -924,10 +860,6 @@ |
parser_->Reset(); |
// Now parse the full first cluster and verify all the blocks are parsed. |
- EXPECT_MEDIA_LOG( |
- WebMSimpleBlockDurationEstimated(kExpectedAudioEstimationInMs)); |
- EXPECT_MEDIA_LOG( |
- WebMSimpleBlockDurationEstimated(kExpectedVideoEstimationInMs)); |
result = parser_->Parse(cluster1->data(), cluster1->size()); |
EXPECT_EQ(cluster1->size(), result); |
ASSERT_TRUE(VerifyBuffers(parser_, kBlockInfo1, block_count1)); |
@@ -935,16 +867,12 @@ |
// Verify that the estimated frame duration is tracked across clusters for |
// each track. |
const BlockInfo kBlockInfo2[] = { |
- {kAudioTrackNum, 200, -kExpectedAudioEstimationInMs, false, NULL, 0}, |
- {kVideoTrackNum, 201, -kExpectedVideoEstimationInMs, false, NULL, 0}, |
+ {kAudioTrackNum, 200, -22, false, NULL, 0}, |
+ {kVideoTrackNum, 201, -34, false, NULL, 0}, |
}; |
int block_count2 = arraysize(kBlockInfo2); |
scoped_ptr<Cluster> cluster2(CreateCluster(0, kBlockInfo2, block_count2)); |
- EXPECT_MEDIA_LOG( |
- WebMSimpleBlockDurationEstimated(kExpectedAudioEstimationInMs)); |
- EXPECT_MEDIA_LOG( |
- WebMSimpleBlockDurationEstimated(kExpectedVideoEstimationInMs)); |
result = parser_->Parse(cluster2->data(), cluster2->size()); |
EXPECT_EQ(cluster2->size(), result); |
ASSERT_TRUE(VerifyBuffers(parser_, kBlockInfo2, block_count2)); |
@@ -1011,10 +939,6 @@ |
int block_count = arraysize(kBlockInfo); |
scoped_ptr<Cluster> cluster(CreateCluster(0, kBlockInfo, block_count)); |
- EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated( |
- WebMClusterParser::kDefaultAudioBufferDurationInMs)); |
- EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated( |
- WebMClusterParser::kDefaultVideoBufferDurationInMs)); |
int result = parser_->Parse(cluster->data(), cluster->size()); |
EXPECT_EQ(cluster->size(), result); |
ASSERT_TRUE(VerifyBuffers(parser_, kBlockInfo, block_count)); |
@@ -1037,14 +961,12 @@ |
} |
TEST_F(WebMClusterParserTest, ReadOpusDurationsSimpleBlockAtEndOfCluster) { |
- InSequence s; |
+ // Reset parser to expect Opus codec audio. |
+ parser_.reset(CreateParserWithKeyIdsAndAudioCodec(std::string(), |
+ std::string(), kCodecOpus)); |
int loop_count = 0; |
for (const auto* packet_ptr : BuildAllOpusPackets()) { |
- // Get a new parser each iteration to prevent exceeding the media log cap. |
- parser_.reset(CreateParserWithKeyIdsAndAudioCodec( |
- std::string(), std::string(), kCodecOpus)); |
- |
const BlockInfo kBlockInfo[] = {{kAudioTrackNum, |
0, |
packet_ptr->duration_ms(), |
@@ -1054,11 +976,6 @@ |
int block_count = arraysize(kBlockInfo); |
scoped_ptr<Cluster> cluster(CreateCluster(0, kBlockInfo, block_count)); |
- int duration_ms = packet_ptr->duration_ms(); // Casts from double. |
- if (duration_ms > 120) { |
- EXPECT_MEDIA_LOG(OpusPacketDurationTooHigh(duration_ms)); |
- } |
- |
int result = parser_->Parse(cluster->data(), cluster->size()); |
EXPECT_EQ(cluster->size(), result); |
ASSERT_TRUE(VerifyBuffers(parser_, kBlockInfo, block_count)); |
@@ -1070,22 +987,14 @@ |
} |
TEST_F(WebMClusterParserTest, PreferOpusDurationsOverBlockDurations) { |
- InSequence s; |
+ // Reset parser to expect Opus codec audio. |
+ parser_.reset(CreateParserWithKeyIdsAndAudioCodec(std::string(), |
+ std::string(), kCodecOpus)); |
int loop_count = 0; |
for (const auto* packet_ptr : BuildAllOpusPackets()) { |
- // Get a new parser each iteration to prevent exceeding the media log cap. |
- parser_.reset(CreateParserWithKeyIdsAndAudioCodec( |
- std::string(), std::string(), kCodecOpus)); |
- |
// Setting BlockDuration != Opus duration to see which one the parser uses. |
int block_duration_ms = packet_ptr->duration_ms() + 10; |
- if (packet_ptr->duration_ms() > 120) { |
- EXPECT_MEDIA_LOG(OpusPacketDurationTooHigh(packet_ptr->duration_ms())); |
- } |
- |
- EXPECT_MEDIA_LOG(WebMBlockDurationMismatchesOpusDuration( |
- block_duration_ms, packet_ptr->duration_ms())); |
BlockInfo block_infos[] = {{kAudioTrackNum, |
0, |