summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--media/base/mock_media_log.h10
-rw-r--r--media/filters/source_buffer_stream_unittest.cc51
-rw-r--r--media/formats/webm/webm_cluster_parser.cc21
-rw-r--r--media/formats/webm/webm_cluster_parser_unittest.cc253
-rw-r--r--media/formats/webm/webm_content_encodings_client_unittest.cc49
-rw-r--r--media/formats/webm/webm_tracks_parser_unittest.cc80
6 files changed, 308 insertions, 156 deletions
diff --git a/media/base/mock_media_log.h b/media/base/mock_media_log.h
index 04c0116..421c2d2 100644
--- a/media/base/mock_media_log.h
+++ b/media/base/mock_media_log.h
@@ -5,9 +5,19 @@
#ifndef MEDIA_BASE_MOCK_MEDIA_LOG_H_
#define MEDIA_BASE_MOCK_MEDIA_LOG_H_
+#include <string>
+
#include "media/base/media_log.h"
#include "testing/gmock/include/gmock/gmock.h"
+// Helper macros to reduce boilerplate when verifying media log entries.
+// |outer| is the std::string searched for substring |sub|.
+#define CONTAINS_STRING(outer, sub) (std::string::npos != (outer).find(sub))
+
+// "media_log_" is expected to be a scoped_refptr<MockMediaLog>, optionally a
+// StrictMock, in scope of the usage of this macro.
+#define EXPECT_MEDIA_LOG(x) EXPECT_CALL(*media_log_, DoAddEventLogString((x)))
+
namespace media {
class MockMediaLog : public MediaLog {
diff --git a/media/filters/source_buffer_stream_unittest.cc b/media/filters/source_buffer_stream_unittest.cc
index d9f1dee..887c4b1 100644
--- a/media/filters/source_buffer_stream_unittest.cc
+++ b/media/filters/source_buffer_stream_unittest.cc
@@ -25,11 +25,6 @@ using ::testing::HasSubstr;
using ::testing::InSequence;
using ::testing::StrictMock;
-// Helper macros to reduce boilerplate when verifying media log entries.
-#define EXPECT_MEDIA_LOG_STRING(x) \
- EXPECT_CALL(*media_log_, DoAddEventLogString((x)))
-#define CONTAINS_STRING(arg, x) (std::string::npos != (arg).find(x))
-
namespace media {
typedef StreamParser::BufferQueue BufferQueue;
@@ -776,7 +771,7 @@ TEST_F(SourceBufferStreamTest, Append_AdjacentRanges) {
}
TEST_F(SourceBufferStreamTest, Append_DoesNotBeginWithKeyframe) {
- EXPECT_MEDIA_LOG_STRING(ContainsMissingKeyframeLog()).Times(2);
+ EXPECT_MEDIA_LOG(ContainsMissingKeyframeLog()).Times(2);
// Append fails because the range doesn't begin with a keyframe.
NewSegmentAppend_ExpectFailure(3, 2);
@@ -799,7 +794,7 @@ TEST_F(SourceBufferStreamTest, Append_DoesNotBeginWithKeyframe) {
}
TEST_F(SourceBufferStreamTest, Append_DoesNotBeginWithKeyframe_Adjacent) {
- EXPECT_MEDIA_LOG_STRING(ContainsMissingKeyframeLog());
+ EXPECT_MEDIA_LOG(ContainsMissingKeyframeLog());
// Append 8 buffers at positions 0 through 7.
NewSegmentAppend(0, 8);
@@ -1466,7 +1461,7 @@ TEST_F(SourceBufferStreamTest, End_Overlap_Selected_NoKeyframeAfterNew) {
// after: |A a a a a A| |B b b b b B|
// track: |a|
TEST_F(SourceBufferStreamTest, End_Overlap_Selected_NoKeyframeAfterNew2) {
- EXPECT_MEDIA_LOG_STRING(ContainsTrackBufferExhaustionSkipLog(133));
+ EXPECT_MEDIA_LOG(ContainsTrackBufferExhaustionSkipLog(133));
// Append 7 buffers at positions 10 through 16.
NewSegmentAppend(10, 7, &kDataA);
@@ -1732,7 +1727,7 @@ TEST_F(SourceBufferStreamTest, Overlap_OneByOne_BetweenMediaSegments) {
// new : 0K 30 60 90 120K
// after: 0K 30 60 90 *120K* 130K
TEST_F(SourceBufferStreamTest, Overlap_OneByOne_TrackBuffer) {
- EXPECT_MEDIA_LOG_STRING(ContainsTrackBufferExhaustionSkipLog(50));
+ EXPECT_MEDIA_LOG(ContainsTrackBufferExhaustionSkipLog(50));
NewSegmentAppendOneByOne("10K 40 70 100K 125 130D30K");
CheckExpectedRangesByTimestamp("{ [10,160) }");
@@ -1764,7 +1759,7 @@ TEST_F(SourceBufferStreamTest, Overlap_OneByOne_TrackBuffer) {
// new : 110K 130
// after: 0K 30 60 90 *110K* 130
TEST_F(SourceBufferStreamTest, Overlap_OneByOne_TrackBuffer2) {
- EXPECT_MEDIA_LOG_STRING(ContainsTrackBufferExhaustionSkipLog(40));
+ EXPECT_MEDIA_LOG(ContainsTrackBufferExhaustionSkipLog(40));
NewSegmentAppendOneByOne("10K 40 70 100K 125 130D30K");
CheckExpectedRangesByTimestamp("{ [10,160) }");
@@ -1796,7 +1791,7 @@ TEST_F(SourceBufferStreamTest, Overlap_OneByOne_TrackBuffer2) {
// after: 0K 30 50K 80 110 140 * (waiting for keyframe)
// track: 70
TEST_F(SourceBufferStreamTest, Overlap_OneByOne_TrackBuffer3) {
- EXPECT_MEDIA_LOG_STRING(ContainsTrackBufferExhaustionSkipLog(80));
+ EXPECT_MEDIA_LOG(ContainsTrackBufferExhaustionSkipLog(80));
NewSegmentAppendOneByOne("10K 40 70 100K 125 130D30K");
CheckExpectedRangesByTimestamp("{ [10,160) }");
@@ -1893,7 +1888,7 @@ TEST_F(SourceBufferStreamTest, Overlap_OneByOne_TrackBuffer5) {
// after: 0K 30 60 90 *120K* 130K ... 200K 230 260K 290
// track: 70
TEST_F(SourceBufferStreamTest, Overlap_OneByOne_TrackBuffer6) {
- EXPECT_MEDIA_LOG_STRING(ContainsTrackBufferExhaustionSkipLog(50));
+ EXPECT_MEDIA_LOG(ContainsTrackBufferExhaustionSkipLog(50));
NewSegmentAppendOneByOne("10K 40 70 100K 125 130D30K");
NewSegmentAppendOneByOne("200K 230");
@@ -2711,7 +2706,7 @@ TEST_F(SourceBufferStreamTest, GarbageCollection_NeedsMoreData) {
}
TEST_F(SourceBufferStreamTest, GarbageCollection_TrackBuffer) {
- EXPECT_MEDIA_LOG_STRING(ContainsTrackBufferExhaustionSkipLog(99));
+ EXPECT_MEDIA_LOG(ContainsTrackBufferExhaustionSkipLog(99));
// Set memory limit to 3 buffers.
SetMemoryLimit(3);
@@ -3548,7 +3543,7 @@ TEST_F(SourceBufferStreamTest, SameTimestamp_Video_TwoAppends) {
// Verify that a non-keyframe followed by a keyframe with the same timestamp
// is not allowed.
TEST_F(SourceBufferStreamTest, SameTimestamp_Video_Invalid_1) {
- EXPECT_MEDIA_LOG_STRING(ContainsSameTimestampAt30MillisecondsLog());
+ EXPECT_MEDIA_LOG(ContainsSameTimestampAt30MillisecondsLog());
Seek(0);
NewSegmentAppend("0K 30");
@@ -3556,7 +3551,7 @@ TEST_F(SourceBufferStreamTest, SameTimestamp_Video_Invalid_1) {
}
TEST_F(SourceBufferStreamTest, SameTimestamp_Video_Invalid_2) {
- EXPECT_MEDIA_LOG_STRING(ContainsSameTimestampAt30MillisecondsLog());
+ EXPECT_MEDIA_LOG(ContainsSameTimestampAt30MillisecondsLog());
Seek(0);
NewSegmentAppend_ExpectFailure("0K 30 30K 60");
@@ -3615,7 +3610,7 @@ TEST_F(SourceBufferStreamTest, SameTimestamp_Audio) {
}
TEST_F(SourceBufferStreamTest, SameTimestamp_Audio_Invalid_1) {
- EXPECT_MEDIA_LOG_STRING(ContainsSameTimestampAt30MillisecondsLog());
+ EXPECT_MEDIA_LOG(ContainsSameTimestampAt30MillisecondsLog());
AudioDecoderConfig config(kCodecMP3, kSampleFormatF32, CHANNEL_LAYOUT_STEREO,
44100, NULL, 0, false);
@@ -4096,7 +4091,7 @@ TEST_F(SourceBufferStreamTest,
}
TEST_F(SourceBufferStreamTest, Audio_SpliceFrame_Basic) {
- EXPECT_MEDIA_LOG_STRING(ContainsGeneratedSpliceLog(3000, 11000));
+ EXPECT_MEDIA_LOG(ContainsGeneratedSpliceLog(3000, 11000));
SetAudioStream();
Seek(0);
@@ -4107,7 +4102,7 @@ TEST_F(SourceBufferStreamTest, Audio_SpliceFrame_Basic) {
}
TEST_F(SourceBufferStreamTest, Audio_SpliceFrame_NoExactSplices) {
- EXPECT_MEDIA_LOG_STRING(
+ EXPECT_MEDIA_LOG(
HasSubstr("Skipping splice frame generation: first new buffer at 10000us "
"begins at or before existing buffer at 10000us."));
@@ -4122,8 +4117,8 @@ TEST_F(SourceBufferStreamTest, Audio_SpliceFrame_NoExactSplices) {
// Do not allow splices on top of splices.
TEST_F(SourceBufferStreamTest, Audio_SpliceFrame_NoDoubleSplice) {
InSequence s;
- EXPECT_MEDIA_LOG_STRING(ContainsGeneratedSpliceLog(3000, 11000));
- EXPECT_MEDIA_LOG_STRING(
+ EXPECT_MEDIA_LOG(ContainsGeneratedSpliceLog(3000, 11000));
+ EXPECT_MEDIA_LOG(
HasSubstr("Skipping splice frame generation: overlapped buffers at "
"10000us are in a previously buffered splice."));
@@ -4158,7 +4153,7 @@ TEST_F(SourceBufferStreamTest, Audio_SpliceFrame_NoSplice) {
}
TEST_F(SourceBufferStreamTest, Audio_SpliceFrame_CorrectMediaSegmentStartTime) {
- EXPECT_MEDIA_LOG_STRING(ContainsGeneratedSpliceLog(5000, 1000));
+ EXPECT_MEDIA_LOG(ContainsGeneratedSpliceLog(5000, 1000));
SetAudioStream();
Seek(0);
@@ -4173,7 +4168,7 @@ TEST_F(SourceBufferStreamTest, Audio_SpliceFrame_CorrectMediaSegmentStartTime) {
}
TEST_F(SourceBufferStreamTest, Audio_SpliceFrame_ConfigChange) {
- EXPECT_MEDIA_LOG_STRING(ContainsGeneratedSpliceLog(3000, 5000));
+ EXPECT_MEDIA_LOG(ContainsGeneratedSpliceLog(3000, 5000));
SetAudioStream();
@@ -4198,7 +4193,7 @@ TEST_F(SourceBufferStreamTest, Audio_SpliceFrame_ConfigChange) {
// Ensure splices are not created if there are not enough frames to crossfade.
TEST_F(SourceBufferStreamTest, Audio_SpliceFrame_NoTinySplices) {
- EXPECT_MEDIA_LOG_STRING(HasSubstr(
+ EXPECT_MEDIA_LOG(HasSubstr(
"Skipping splice frame generation: not enough samples for splicing new "
"buffer at 1000us. Have 1000us, but need 2000us."));
@@ -4218,7 +4213,7 @@ TEST_F(SourceBufferStreamTest, Audio_SpliceFrame_NoTinySplices) {
}
TEST_F(SourceBufferStreamTest, Audio_SpliceFrame_NoMillisecondSplices) {
- EXPECT_MEDIA_LOG_STRING(
+ EXPECT_MEDIA_LOG(
HasSubstr("Skipping splice frame generation: not enough samples for "
"splicing new buffer at 1250us. Have 750us, but need 1000us."));
@@ -4249,7 +4244,7 @@ TEST_F(SourceBufferStreamTest, Audio_SpliceFrame_NoMillisecondSplices) {
}
TEST_F(SourceBufferStreamTest, Audio_SpliceFrame_Preroll) {
- EXPECT_MEDIA_LOG_STRING(ContainsGeneratedSpliceLog(3000, 11000));
+ EXPECT_MEDIA_LOG(ContainsGeneratedSpliceLog(3000, 11000));
SetAudioStream();
Seek(0);
@@ -4532,7 +4527,7 @@ TEST_F(SourceBufferStreamTest, TrackBuffer_ExhaustionWithSkipForward) {
// Confirm the large jump occurs and warning log is generated.
// If this test is changed, update
// TrackBufferExhaustion_ImmediateNewTrackBuffer accordingly.
- EXPECT_MEDIA_LOG_STRING(ContainsTrackBufferExhaustionSkipLog(91));
+ EXPECT_MEDIA_LOG(ContainsTrackBufferExhaustionSkipLog(91));
CheckExpectedBuffers("40 131K 141");
CheckNoNextBuffer();
@@ -4564,8 +4559,8 @@ TEST_F(SourceBufferStreamTest,
CheckExpectedRangesByTimestamp("{ [0,172) }");
InSequence s;
- EXPECT_MEDIA_LOG_STRING(ContainsTrackBufferExhaustionSkipLog(91));
- EXPECT_MEDIA_LOG_STRING(ContainsTrackBufferExhaustionSkipLog(11));
+ EXPECT_MEDIA_LOG(ContainsTrackBufferExhaustionSkipLog(91));
+ EXPECT_MEDIA_LOG(ContainsTrackBufferExhaustionSkipLog(11));
CheckExpectedBuffers("131K 141 152K 162");
CheckNoNextBuffer();
diff --git a/media/formats/webm/webm_cluster_parser.cc b/media/formats/webm/webm_cluster_parser.cc
index 92b508b..38a9f42 100644
--- a/media/formats/webm/webm_cluster_parser.cc
+++ b/media/formats/webm/webm_cluster_parser.cc
@@ -241,8 +241,9 @@ base::TimeDelta WebMClusterParser::ReadOpusDuration(const uint8_t* data,
// things go sideways.
LIMITED_MEDIA_LOG(DEBUG, media_log_, num_duration_errors_,
kMaxDurationErrorLogs)
- << "Warning, demuxed Opus packet with encoded duration: " << duration
- << ". Should be no greater than " << kPacketDurationMax;
+ << "Warning, demuxed Opus packet with encoded duration: "
+ << duration.InMilliseconds() << "ms. Should be no greater than "
+ << kPacketDurationMax.InMilliseconds() << "ms.";
}
return duration;
@@ -561,10 +562,9 @@ bool WebMClusterParser::OnBlock(bool is_simple_block,
if (duration_difference.magnitude() > kWarnDurationDiff) {
LIMITED_MEDIA_LOG(DEBUG, media_log_, num_duration_errors_,
kMaxDurationErrorLogs)
- << "BlockDuration "
- << "(" << block_duration_time_delta << ") "
- << "differs significantly from encoded duration "
- << "(" << encoded_duration << ").";
+ << "BlockDuration (" << block_duration_time_delta.InMilliseconds()
+ << "ms) differs significantly from encoded duration ("
+ << encoded_duration.InMilliseconds() << "ms).";
}
}
} else if (block_duration_time_delta != kNoTimestamp()) {
@@ -693,10 +693,11 @@ void WebMClusterParser::Track::ApplyDurationEstimateIfNeeded() {
LIMITED_MEDIA_LOG(INFO, media_log_, num_duration_estimates_,
kMaxDurationEstimateLogs)
- << "Estimating WebM block duration to be " << estimated_duration << " "
- << "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.";
+ << "Estimating WebM block duration to be "
+ << estimated_duration.InMilliseconds()
+ << "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.";
DVLOG(2) << __FUNCTION__ << " new dur : ts "
<< last_added_buffer_missing_duration_->timestamp().InSecondsF()
diff --git a/media/formats/webm/webm_cluster_parser_unittest.cc b/media/formats/webm/webm_cluster_parser_unittest.cc
index eaeb318..db3321a 100644
--- a/media/formats/webm/webm_cluster_parser_unittest.cc
+++ b/media/formats/webm/webm_cluster_parser_unittest.cc
@@ -4,12 +4,15 @@
#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"
@@ -17,24 +20,53 @@
#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 {
-enum {
- kTimecodeScale = 1000000, // Timecode scale for millisecond timestamps.
- kAudioTrackNum = 1,
- kVideoTrackNum = 2,
- kTextTrackNum = 3,
- kTestAudioFrameDefaultDurationInMs = 13,
- kTestVideoFrameDefaultDurationInMs = 17
-};
+// 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;
// Test duration defaults must differ from parser estimation defaults to know
// which durations parser used when emitting buffers.
@@ -83,58 +115,6 @@ const uint8_t kEncryptedFrame[] = {
// 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,
int block_count) {
@@ -313,7 +293,9 @@ void AppendToEnd(const WebMClusterParser::BufferQueue& src,
class WebMClusterParserTest : public testing::Test {
public:
- WebMClusterParserTest() : parser_(CreateDefaultParser()) {}
+ WebMClusterParserTest()
+ : media_log_(new StrictMock<MockMediaLog>()),
+ parser_(CreateDefaultParser()) {}
protected:
void ResetParserToHaveDefaultDurations() {
@@ -330,6 +312,59 @@ class WebMClusterParserTest : public testing::Test {
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:
@@ -356,6 +391,8 @@ TEST_F(WebMClusterParserTest, HeldBackBufferHoldsBackAllTracks) {
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},
@@ -363,7 +400,7 @@ TEST_F(WebMClusterParserTest, HeldBackBufferHoldsBackAllTracks) {
{kAudioTrackNum, 23, kTestAudioFrameDefaultDurationInMs, true, NULL, 0},
{kVideoTrackNum, 33, 33, true, NULL, 0},
{kAudioTrackNum, 36, kTestAudioFrameDefaultDurationInMs, true, NULL, 0},
- {kVideoTrackNum, 66, 33, true, NULL, 0},
+ {kVideoTrackNum, 66, kExpectedVideoEstimationInMs, true, NULL, 0},
{kAudioTrackNum, 70, kTestAudioFrameDefaultDurationInMs, true, NULL, 0},
{kAudioTrackNum, 83, kTestAudioFrameDefaultDurationInMs, true, NULL, 0},
};
@@ -400,6 +437,12 @@ TEST_F(WebMClusterParserTest, HeldBackBufferHoldsBackAllTracks) {
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) {
@@ -561,6 +604,8 @@ TEST_F(WebMClusterParserTest, IgnoredTracks) {
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));
@@ -590,6 +635,8 @@ TEST_F(WebMClusterParserTest, ParseTextTracks) {
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));
@@ -649,6 +696,8 @@ TEST_F(WebMClusterParserTest, ParseMultipleTextTracks) {
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);
@@ -671,6 +720,11 @@ TEST_F(WebMClusterParserTest, ParseEncryptedBlock) {
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());
@@ -771,16 +825,17 @@ TEST_F(WebMClusterParserTest, ParseWithoutAnyDurationsSimpleBlocks) {
// 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},
- // Estimated from minimum audio dur
- {kAudioTrackNum, 68, 22, true, NULL, 0},
- // Estimated from maximum video dur
- {kVideoTrackNum, 100, 34, true, NULL, 0},
+ {kAudioTrackNum, 68, kExpectedAudioEstimationInMs, true, NULL, 0},
+ {kVideoTrackNum, 100, kExpectedVideoEstimationInMs, true, NULL, 0},
};
int block_count1 = arraysize(kBlockInfo1);
@@ -801,6 +856,10 @@ TEST_F(WebMClusterParserTest, ParseWithoutAnyDurationsSimpleBlocks) {
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));
@@ -809,13 +868,17 @@ TEST_F(WebMClusterParserTest, ParseWithoutAnyDurationsSimpleBlocks) {
// each track.
const BlockInfo kBlockInfo2[] = {
// Estimate carries over across clusters
- {kAudioTrackNum, 200, 22, true, NULL, 0},
+ {kAudioTrackNum, 200, kExpectedAudioEstimationInMs, true, NULL, 0},
// Estimate carries over across clusters
- {kVideoTrackNum, 201, 34, true, NULL, 0},
+ {kVideoTrackNum, 201, kExpectedVideoEstimationInMs, 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));
@@ -830,16 +893,17 @@ TEST_F(WebMClusterParserTest, ParseWithoutAnyDurationsBlockGroups) {
// 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},
- // Estimated from minimum audio dur
- {kAudioTrackNum, 68, -22, false, NULL, 0},
- // Estimated from maximum video dur
- {kVideoTrackNum, 100, -34, false, NULL, 0},
+ {kAudioTrackNum, 68, -kExpectedAudioEstimationInMs, false, NULL, 0},
+ {kVideoTrackNum, 100, -kExpectedVideoEstimationInMs, false, NULL, 0},
};
int block_count1 = arraysize(kBlockInfo1);
@@ -860,6 +924,10 @@ TEST_F(WebMClusterParserTest, ParseWithoutAnyDurationsBlockGroups) {
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));
@@ -867,12 +935,16 @@ TEST_F(WebMClusterParserTest, ParseWithoutAnyDurationsBlockGroups) {
// Verify that the estimated frame duration is tracked across clusters for
// each track.
const BlockInfo kBlockInfo2[] = {
- {kAudioTrackNum, 200, -22, false, NULL, 0},
- {kVideoTrackNum, 201, -34, false, NULL, 0},
+ {kAudioTrackNum, 200, -kExpectedAudioEstimationInMs, false, NULL, 0},
+ {kVideoTrackNum, 201, -kExpectedVideoEstimationInMs, 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));
@@ -939,6 +1011,10 @@ TEST_F(WebMClusterParserTest,
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));
@@ -961,12 +1037,14 @@ TEST_F(WebMClusterParserTest,
}
TEST_F(WebMClusterParserTest, ReadOpusDurationsSimpleBlockAtEndOfCluster) {
- // Reset parser to expect Opus codec audio.
- parser_.reset(CreateParserWithKeyIdsAndAudioCodec(std::string(),
- std::string(), kCodecOpus));
+ InSequence s;
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(),
@@ -976,6 +1054,11 @@ TEST_F(WebMClusterParserTest, ReadOpusDurationsSimpleBlockAtEndOfCluster) {
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));
@@ -987,14 +1070,24 @@ TEST_F(WebMClusterParserTest, ReadOpusDurationsSimpleBlockAtEndOfCluster) {
}
TEST_F(WebMClusterParserTest, PreferOpusDurationsOverBlockDurations) {
- // Reset parser to expect Opus codec audio.
- parser_.reset(CreateParserWithKeyIdsAndAudioCodec(std::string(),
- std::string(), kCodecOpus));
+ // Exhaustively testing expected media logs' emission sequence in this test at
+ // least causes 10x execution time. Therefore, no InSequence is used here, but
+ // the set of expected messages is verified.
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,
diff --git a/media/formats/webm/webm_content_encodings_client_unittest.cc b/media/formats/webm/webm_content_encodings_client_unittest.cc
index 22049eb..d31ad27 100644
--- a/media/formats/webm/webm_content_encodings_client_unittest.cc
+++ b/media/formats/webm/webm_content_encodings_client_unittest.cc
@@ -2,18 +2,56 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+#include "media/formats/webm/webm_content_encodings_client.h"
+
+#include <string>
+
#include "base/bind.h"
+#include "base/strings/string_number_conversions.h"
+#include "media/base/mock_media_log.h"
#include "media/formats/webm/webm_constants.h"
-#include "media/formats/webm/webm_content_encodings_client.h"
#include "media/formats/webm/webm_parser.h"
+#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
+using ::testing::StrictMock;
+
namespace media {
+// Matchers for verifying common media log entry strings.
+MATCHER(MissingContentEncoding, "") {
+ return CONTAINS_STRING(arg, "Missing ContentEncoding.");
+}
+
+MATCHER(UnexpectedContentEncodingOrder, "") {
+ return CONTAINS_STRING(arg, "Unexpected ContentEncodingOrder.");
+}
+
+MATCHER(UnexpectedContentEncodingScope, "") {
+ return CONTAINS_STRING(arg, "Unexpected ContentEncodingScope.");
+}
+
+MATCHER(ContentCompressionNotSupported, "") {
+ return CONTAINS_STRING(arg, "ContentCompression not supported.");
+}
+
+MATCHER(MissingContentEncryption, "") {
+ return CONTAINS_STRING(
+ arg,
+ "ContentEncodingType is encryption but ContentEncryption is missing.");
+}
+
+MATCHER_P(UnexpectedContentEncAlgo, algo, "") {
+ return CONTAINS_STRING(
+ arg, "Unexpected ContentEncAlgo " + base::IntToString(algo) + ".");
+}
+
class WebMContentEncodingsClientTest : public testing::Test {
public:
WebMContentEncodingsClientTest()
- : client_(new MediaLog()), parser_(kWebMIdContentEncodings, &client_) {}
+ : media_log_(new StrictMock<MockMediaLog>()),
+ client_(media_log_),
+ parser_(kWebMIdContentEncodings, &client_) {}
void ParseAndExpectToFail(const uint8* buf, int size) {
int result = parser_.Parse(buf, size);
@@ -21,6 +59,7 @@ class WebMContentEncodingsClientTest : public testing::Test {
}
protected:
+ scoped_refptr<StrictMock<MockMediaLog>> media_log_;
WebMContentEncodingsClient client_;
WebMListParser parser_;
};
@@ -30,6 +69,7 @@ TEST_F(WebMContentEncodingsClientTest, EmptyContentEncodings) {
0x6D, 0x80, 0x80, // ContentEncodings (size = 0)
};
int size = sizeof(kContentEncodings);
+ EXPECT_MEDIA_LOG(MissingContentEncoding());
ParseAndExpectToFail(kContentEncodings, size);
}
@@ -182,6 +222,7 @@ TEST_F(WebMContentEncodingsClientTest, InvalidContentEncodingOrder) {
0x50, 0x35, 0x80, // ContentEncryption (size = 0)
};
int size = sizeof(kContentEncodings);
+ EXPECT_MEDIA_LOG(UnexpectedContentEncodingOrder());
ParseAndExpectToFail(kContentEncodings, size);
}
@@ -194,6 +235,7 @@ TEST_F(WebMContentEncodingsClientTest, InvalidContentEncodingScope) {
0x50, 0x35, 0x80, // ContentEncryption (size = 0)
};
int size = sizeof(kContentEncodings);
+ EXPECT_MEDIA_LOG(UnexpectedContentEncodingScope());
ParseAndExpectToFail(kContentEncodings, size);
}
@@ -205,6 +247,7 @@ TEST_F(WebMContentEncodingsClientTest, InvalidContentEncodingType) {
0x50, 0x35, 0x80, // ContentEncryption (size = 0)
};
int size = sizeof(kContentEncodings);
+ EXPECT_MEDIA_LOG(ContentCompressionNotSupported());
ParseAndExpectToFail(kContentEncodings, size);
}
@@ -217,6 +260,7 @@ TEST_F(WebMContentEncodingsClientTest, MissingContentEncryption) {
// ContentEncryption missing
};
int size = sizeof(kContentEncodings);
+ EXPECT_MEDIA_LOG(MissingContentEncryption());
ParseAndExpectToFail(kContentEncodings, size);
}
@@ -231,6 +275,7 @@ TEST_F(WebMContentEncodingsClientTest, InvalidContentEncAlgo) {
0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
};
int size = sizeof(kContentEncodings);
+ EXPECT_MEDIA_LOG(UnexpectedContentEncAlgo(0xEE));
ParseAndExpectToFail(kContentEncodings, size);
}
diff --git a/media/formats/webm/webm_tracks_parser_unittest.cc b/media/formats/webm/webm_tracks_parser_unittest.cc
index 39854ef..4fc6cee 100644
--- a/media/formats/webm/webm_tracks_parser_unittest.cc
+++ b/media/formats/webm/webm_tracks_parser_unittest.cc
@@ -5,14 +5,17 @@
#include "base/logging.h"
#include "media/base/buffers.h"
#include "media/base/channel_layout.h"
+#include "media/base/mock_media_log.h"
#include "media/formats/webm/tracks_builder.h"
#include "media/formats/webm/webm_constants.h"
#include "media/formats/webm/webm_tracks_parser.h"
#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 {
@@ -21,33 +24,37 @@ static const double kDefaultTimecodeScaleInUs = 1000.0; // 1 ms resolution
class WebMTracksParserTest : public testing::Test {
public:
- WebMTracksParserTest() {}
+ WebMTracksParserTest() : media_log_(new StrictMock<MockMediaLog>()) {}
+
+ protected:
+ void VerifyTextTrackInfo(const uint8* buffer,
+ int buffer_size,
+ TextKind text_kind,
+ const std::string& name,
+ const std::string& language) {
+ scoped_ptr<WebMTracksParser> parser(
+ new WebMTracksParser(media_log_, false));
+
+ int result = parser->Parse(buffer, buffer_size);
+ EXPECT_GT(result, 0);
+ EXPECT_EQ(result, buffer_size);
+
+ const WebMTracksParser::TextTracks& text_tracks = parser->text_tracks();
+ EXPECT_EQ(text_tracks.size(), WebMTracksParser::TextTracks::size_type(1));
+
+ const WebMTracksParser::TextTracks::const_iterator itr =
+ text_tracks.begin();
+ EXPECT_EQ(itr->first, 1); // track num
+
+ const TextTrackConfig& config = itr->second;
+ EXPECT_EQ(config.kind(), text_kind);
+ EXPECT_TRUE(config.label() == name);
+ EXPECT_TRUE(config.language() == language);
+ }
+
+ scoped_refptr<StrictMock<MockMediaLog>> media_log_;
};
-static void VerifyTextTrackInfo(const uint8* buffer,
- int buffer_size,
- TextKind text_kind,
- const std::string& name,
- const std::string& language) {
- scoped_ptr<WebMTracksParser> parser(
- new WebMTracksParser(new MediaLog(), false));
-
- int result = parser->Parse(buffer, buffer_size);
- EXPECT_GT(result, 0);
- EXPECT_EQ(result, buffer_size);
-
- const WebMTracksParser::TextTracks& text_tracks = parser->text_tracks();
- EXPECT_EQ(text_tracks.size(), WebMTracksParser::TextTracks::size_type(1));
-
- const WebMTracksParser::TextTracks::const_iterator itr = text_tracks.begin();
- EXPECT_EQ(itr->first, 1); // track num
-
- const TextTrackConfig& config = itr->second;
- EXPECT_EQ(config.kind(), text_kind);
- EXPECT_TRUE(config.label() == name);
- EXPECT_TRUE(config.language() == language);
-}
-
TEST_F(WebMTracksParserTest, SubtitleNoNameNoLang) {
InSequence s;
@@ -96,8 +103,10 @@ TEST_F(WebMTracksParserTest, IgnoringTextTracks) {
tb.AddTextTrack(2, 2, kWebMCodecSubtitles, "Commentary", "fre");
const std::vector<uint8> buf = tb.Finish();
- scoped_ptr<WebMTracksParser> parser(
- new WebMTracksParser(new MediaLog(), true));
+ scoped_ptr<WebMTracksParser> parser(new WebMTracksParser(media_log_, true));
+
+ EXPECT_MEDIA_LOG(HasSubstr("Ignoring text track 1"));
+ EXPECT_MEDIA_LOG(HasSubstr("Ignoring text track 2"));
int result = parser->Parse(&buf[0], buf.size());
EXPECT_GT(result, 0);
@@ -110,7 +119,7 @@ TEST_F(WebMTracksParserTest, IgnoringTextTracks) {
EXPECT_TRUE(ignored_tracks.find(2) != ignored_tracks.end());
// Test again w/o ignoring the test tracks.
- parser.reset(new WebMTracksParser(new MediaLog(), false));
+ parser.reset(new WebMTracksParser(media_log_, false));
result = parser->Parse(&buf[0], buf.size());
EXPECT_GT(result, 0);
@@ -130,8 +139,7 @@ TEST_F(WebMTracksParserTest, AudioVideoDefaultDurationUnset) {
tb.AddVideoTrack(2, 2, "V_VP8", "video", "", -1, 320, 240);
const std::vector<uint8> buf = tb.Finish();
- scoped_ptr<WebMTracksParser> parser(
- new WebMTracksParser(new MediaLog(), true));
+ scoped_ptr<WebMTracksParser> parser(new WebMTracksParser(media_log_, true));
int result = parser->Parse(&buf[0], buf.size());
EXPECT_LE(0, result);
EXPECT_EQ(static_cast<int>(buf.size()), result);
@@ -160,8 +168,7 @@ TEST_F(WebMTracksParserTest, AudioVideoDefaultDurationSet) {
tb.AddVideoTrack(2, 2, "V_VP8", "video", "", 987654321, 320, 240);
const std::vector<uint8> buf = tb.Finish();
- scoped_ptr<WebMTracksParser> parser(
- new WebMTracksParser(new MediaLog(), true));
+ scoped_ptr<WebMTracksParser> parser(new WebMTracksParser(media_log_, true));
int result = parser->Parse(&buf[0], buf.size());
EXPECT_LE(0, result);
EXPECT_EQ(static_cast<int>(buf.size()), result);
@@ -183,8 +190,10 @@ TEST_F(WebMTracksParserTest, InvalidZeroDefaultDurationSet) {
tb.AddAudioTrack(1, 1, "A_VORBIS", "audio", "", 0, 2, 8000);
const std::vector<uint8> buf = tb.Finish();
- scoped_ptr<WebMTracksParser> parser(
- new WebMTracksParser(new MediaLog(), true));
+ scoped_ptr<WebMTracksParser> parser(new WebMTracksParser(media_log_, true));
+
+ EXPECT_MEDIA_LOG(HasSubstr("Illegal 0ns audio TrackEntry DefaultDuration"));
+
EXPECT_EQ(-1, parser->Parse(&buf[0], buf.size()));
}
@@ -195,8 +204,7 @@ TEST_F(WebMTracksParserTest, HighTrackUID) {
tb.AddAudioTrack(1, 1ULL << 31, "A_VORBIS", "audio", "", 40, 2, 8000);
const std::vector<uint8> buf = tb.Finish();
- scoped_ptr<WebMTracksParser> parser(
- new WebMTracksParser(new MediaLog(), true));
+ scoped_ptr<WebMTracksParser> parser(new WebMTracksParser(media_log_, true));
EXPECT_GT(parser->Parse(&buf[0], buf.size()),0);
}