| Index: media/formats/mp4/mp4_stream_parser_unittest.cc
|
| diff --git a/media/formats/mp4/mp4_stream_parser_unittest.cc b/media/formats/mp4/mp4_stream_parser_unittest.cc
|
| index 6617312b1747322084209f45279a4ad285e204b9..620b81f0bcbe54d8bbd96a67dc43505c5d09d2dd 100644
|
| --- a/media/formats/mp4/mp4_stream_parser_unittest.cc
|
| +++ b/media/formats/mp4/mp4_stream_parser_unittest.cc
|
| @@ -12,23 +12,41 @@
|
| #include "base/time/time.h"
|
| #include "media/base/audio_decoder_config.h"
|
| #include "media/base/decoder_buffer.h"
|
| +#include "media/base/mock_media_log.h"
|
| #include "media/base/stream_parser_buffer.h"
|
| #include "media/base/test_data_util.h"
|
| #include "media/base/text_track_config.h"
|
| #include "media/base/video_decoder_config.h"
|
| #include "media/formats/mp4/es_descriptor.h"
|
| #include "media/formats/mp4/mp4_stream_parser.h"
|
| +#include "testing/gmock/include/gmock/gmock.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
|
|
| +using ::testing::InSequence;
|
| +using ::testing::StrictMock;
|
| using base::TimeDelta;
|
|
|
| namespace media {
|
| namespace mp4 {
|
| +
|
| +// Matchers for verifying common media log entry strings.
|
| +MATCHER_P(VideoCodecLog, codec_string, "") {
|
| + return CONTAINS_STRING(arg, "Video codec: " + std::string(codec_string));
|
| +}
|
| +
|
| +MATCHER_P(AudioCodecLog, codec_string, "") {
|
| + return CONTAINS_STRING(arg, "Audio codec: " + std::string(codec_string));
|
| +}
|
| +
|
| +MATCHER(AuxInfoUnavailableLog, "") {
|
| + return CONTAINS_STRING(arg, "Aux Info is not available.");
|
| +}
|
|
|
| class MP4StreamParserTest : public testing::Test {
|
| public:
|
| MP4StreamParserTest()
|
| - : configs_received_(false),
|
| + : media_log_(new StrictMock<MockMediaLog>()),
|
| + configs_received_(false),
|
| lower_bound_(
|
| DecodeTimestamp::FromPresentationTime(base::TimeDelta::Max())) {
|
| std::set<int> audio_object_types;
|
| @@ -37,6 +55,7 @@
|
| }
|
|
|
| protected:
|
| + scoped_refptr<StrictMock<MockMediaLog>> media_log_;
|
| scoped_ptr<MP4StreamParser> parser_;
|
| bool configs_received_;
|
| AudioDecoderConfig audio_decoder_config_;
|
| @@ -149,7 +168,7 @@
|
| base::Bind(&MP4StreamParserTest::KeyNeededF, base::Unretained(this)),
|
| base::Bind(&MP4StreamParserTest::NewSegmentF, base::Unretained(this)),
|
| base::Bind(&MP4StreamParserTest::EndOfSegmentF, base::Unretained(this)),
|
| - new MediaLog());
|
| + media_log_);
|
| }
|
|
|
| void InitializeParser() {
|
| @@ -172,22 +191,30 @@
|
| TEST_F(MP4StreamParserTest, UnalignedAppend) {
|
| // Test small, non-segment-aligned appends (small enough to exercise
|
| // incremental append system)
|
| + EXPECT_MEDIA_LOG(VideoCodecLog("avc1.6401f"));
|
| + EXPECT_MEDIA_LOG(AudioCodecLog("mp4a.40.2"));
|
| ParseMP4File("bear-1280x720-av_frag.mp4", 512);
|
| }
|
|
|
| TEST_F(MP4StreamParserTest, BytewiseAppend) {
|
| // Ensure no incremental errors occur when parsing
|
| + EXPECT_MEDIA_LOG(VideoCodecLog("avc1.6401f"));
|
| + EXPECT_MEDIA_LOG(AudioCodecLog("mp4a.40.2"));
|
| ParseMP4File("bear-1280x720-av_frag.mp4", 1);
|
| }
|
|
|
| TEST_F(MP4StreamParserTest, MultiFragmentAppend) {
|
| // Large size ensures multiple fragments are appended in one call (size is
|
| // larger than this particular test file)
|
| + EXPECT_MEDIA_LOG(VideoCodecLog("avc1.6401f"));
|
| + EXPECT_MEDIA_LOG(AudioCodecLog("mp4a.40.2"));
|
| ParseMP4File("bear-1280x720-av_frag.mp4", 768432);
|
| }
|
|
|
| TEST_F(MP4StreamParserTest, Flush) {
|
| // Flush while reading sample data, then start a new stream.
|
| + EXPECT_MEDIA_LOG(VideoCodecLog("avc1.6401f")).Times(2);
|
| + EXPECT_MEDIA_LOG(AudioCodecLog("mp4a.40.2")).Times(2);
|
| InitializeParser();
|
|
|
| scoped_refptr<DecoderBuffer> buffer =
|
| @@ -200,6 +227,8 @@
|
| }
|
|
|
| TEST_F(MP4StreamParserTest, Reinitialization) {
|
| + EXPECT_MEDIA_LOG(VideoCodecLog("avc1.6401f")).Times(2);
|
| + EXPECT_MEDIA_LOG(AudioCodecLog("mp4a.40.2")).Times(2);
|
| InitializeParser();
|
|
|
| scoped_refptr<DecoderBuffer> buffer =
|
| @@ -213,14 +242,19 @@
|
| }
|
|
|
| TEST_F(MP4StreamParserTest, MPEG2_AAC_LC) {
|
| + InSequence s;
|
| std::set<int> audio_object_types;
|
| audio_object_types.insert(kISO_13818_7_AAC_LC);
|
| parser_.reset(new MP4StreamParser(audio_object_types, false));
|
| + EXPECT_MEDIA_LOG(AudioCodecLog("mp4a.67"));
|
| + EXPECT_MEDIA_LOG(AudioCodecLog("mp4a.40.2"));
|
| ParseMP4File("bear-mpeg2-aac-only_frag.mp4", 512);
|
| }
|
|
|
| // Test that a moov box is not always required after Flush() is called.
|
| TEST_F(MP4StreamParserTest, NoMoovAfterFlush) {
|
| + EXPECT_MEDIA_LOG(VideoCodecLog("avc1.6401f"));
|
| + EXPECT_MEDIA_LOG(AudioCodecLog("mp4a.40.2"));
|
| InitializeParser();
|
|
|
| scoped_refptr<DecoderBuffer> buffer =
|
| @@ -240,18 +274,23 @@
|
| // SampleAuxiliaryInformation{Sizes|Offsets}Box (saiz|saio) are missing.
|
| // The parser should fail instead of crash. See http://crbug.com/361347
|
| TEST_F(MP4StreamParserTest, MissingSampleAuxInfo) {
|
| + InSequence s;
|
| +
|
| // Encrypted test mp4 files have non-zero duration and are treated as
|
| // recorded streams.
|
| InitializeParserAndExpectLiveness(DemuxerStream::LIVENESS_RECORDED);
|
|
|
| scoped_refptr<DecoderBuffer> buffer =
|
| ReadTestDataFile("bear-1280x720-a_frag-cenc_missing-saiz-saio.mp4");
|
| + EXPECT_MEDIA_LOG(AudioCodecLog("mp4a.40.2")).Times(2);
|
| + EXPECT_MEDIA_LOG(AuxInfoUnavailableLog());
|
| EXPECT_FALSE(AppendDataInPieces(buffer->data(), buffer->data_size(), 512));
|
| }
|
|
|
| // Test a file where all video samples start with an Access Unit
|
| // Delimiter (AUD) NALU.
|
| TEST_F(MP4StreamParserTest, VideoSamplesStartWithAUDs) {
|
| + EXPECT_MEDIA_LOG(VideoCodecLog("avc1.4d4028"));
|
| ParseMP4File("bear-1280x720-av_with-aud-nalus_frag.mp4", 512);
|
| }
|
|
|
| @@ -262,6 +301,7 @@
|
|
|
| scoped_refptr<DecoderBuffer> buffer =
|
| ReadTestDataFile("bear-1280x720-v_frag-cenc.mp4");
|
| + EXPECT_MEDIA_LOG(VideoCodecLog("avc1.6401f"));
|
| EXPECT_TRUE(AppendDataInPieces(buffer->data(), buffer->data_size(), 512));
|
| }
|
|
|
| @@ -271,6 +311,7 @@
|
| scoped_refptr<DecoderBuffer> buffer =
|
| ReadTestDataFile("bear-640x360-non_square_pixel-without_pasp.mp4");
|
|
|
| + EXPECT_MEDIA_LOG(VideoCodecLog("avc1.6401e"));
|
| EXPECT_TRUE(AppendDataInPieces(buffer->data(), buffer->data_size(), 512));
|
| EXPECT_EQ(gfx::Size(639, 360), video_decoder_config_.natural_size());
|
| }
|
| @@ -281,6 +322,7 @@
|
| scoped_refptr<DecoderBuffer> buffer =
|
| ReadTestDataFile("bear-640x360-non_square_pixel-with_pasp.mp4");
|
|
|
| + EXPECT_MEDIA_LOG(VideoCodecLog("avc1.6401e"));
|
| EXPECT_TRUE(AppendDataInPieces(buffer->data(), buffer->data_size(), 512));
|
| EXPECT_EQ(gfx::Size(639, 360), video_decoder_config_.natural_size());
|
| }
|
|
|