Chromium Code Reviews| 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 0e631f47b763811057e2747fcd5718a21708846d..93e06960f2f0f0ff5b69ef6f2244b985f434179a 100644 |
| --- a/media/formats/mp4/mp4_stream_parser_unittest.cc |
| +++ b/media/formats/mp4/mp4_stream_parser_unittest.cc |
| @@ -12,23 +12,43 @@ |
| #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. |
| +#define CONTAINS_STRING(arg, x) (std::string::npos != (arg).find(x)) |
| + |
| +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 +57,7 @@ class MP4StreamParserTest : public testing::Test { |
| } |
| protected: |
| + scoped_refptr<StrictMock<MockMediaLog>> media_log_; |
| scoped_ptr<MP4StreamParser> parser_; |
| bool configs_received_; |
| AudioDecoderConfig audio_decoder_config_; |
| @@ -149,7 +170,7 @@ class MP4StreamParserTest : public testing::Test { |
| 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 +193,30 @@ class MP4StreamParserTest : public testing::Test { |
| TEST_F(MP4StreamParserTest, UnalignedAppend) { |
| // Test small, non-segment-aligned appends (small enough to exercise |
| // incremental append system) |
| + EXPECT_MEDIA_LOG_STRING(VideoCodecLog("avc1.6401f")); |
| + EXPECT_MEDIA_LOG_STRING(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_STRING(VideoCodecLog("avc1.6401f")); |
| + EXPECT_MEDIA_LOG_STRING(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_STRING(VideoCodecLog("avc1.6401f")); |
| + EXPECT_MEDIA_LOG_STRING(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_STRING(VideoCodecLog("avc1.6401f")).Times(2); |
| + EXPECT_MEDIA_LOG_STRING(AudioCodecLog("mp4a.40.2")).Times(2); |
| InitializeParser(); |
| scoped_refptr<DecoderBuffer> buffer = |
| @@ -200,6 +229,8 @@ TEST_F(MP4StreamParserTest, Flush) { |
| } |
| TEST_F(MP4StreamParserTest, Reinitialization) { |
| + EXPECT_MEDIA_LOG_STRING(VideoCodecLog("avc1.6401f")).Times(2); |
| + EXPECT_MEDIA_LOG_STRING(AudioCodecLog("mp4a.40.2")).Times(2); |
| InitializeParser(); |
| scoped_refptr<DecoderBuffer> buffer = |
| @@ -213,14 +244,19 @@ TEST_F(MP4StreamParserTest, Reinitialization) { |
| } |
| TEST_F(MP4StreamParserTest, MPEG2_AAC_LC) { |
| + InSequence s; |
|
chcunningham
2015/08/19 19:36:18
Do you need this? Ditto for line 279.
chcunningham
2015/08/19 20:06:43
ignore... I read up on InSequence. Kinda whacky, b
wolenetz
2015/08/24 20:13:52
Acknowledged.
|
| 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_STRING(AudioCodecLog("mp4a.67")); |
| + EXPECT_MEDIA_LOG_STRING(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_STRING(VideoCodecLog("avc1.6401f")); |
| + EXPECT_MEDIA_LOG_STRING(AudioCodecLog("mp4a.40.2")); |
| InitializeParser(); |
| scoped_refptr<DecoderBuffer> buffer = |
| @@ -240,18 +276,23 @@ TEST_F(MP4StreamParserTest, NoMoovAfterFlush) { |
| // 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_STRING(AudioCodecLog("mp4a.40.2")).Times(2); |
| + EXPECT_MEDIA_LOG_STRING(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_STRING(VideoCodecLog("avc1.4d4028")); |
| ParseMP4File("bear-1280x720-av_with-aud-nalus_frag.mp4", 512); |
| } |
| @@ -262,6 +303,7 @@ TEST_F(MP4StreamParserTest, CENC) { |
| scoped_refptr<DecoderBuffer> buffer = |
| ReadTestDataFile("bear-1280x720-v_frag-cenc.mp4"); |
| + EXPECT_MEDIA_LOG_STRING(VideoCodecLog("avc1.6401f")); |
| EXPECT_TRUE(AppendDataInPieces(buffer->data(), buffer->data_size(), 512)); |
| } |
| @@ -271,6 +313,7 @@ TEST_F(MP4StreamParserTest, NaturalSizeWithoutPASP) { |
| scoped_refptr<DecoderBuffer> buffer = |
| ReadTestDataFile("bear-640x360-non_square_pixel-without_pasp.mp4"); |
| + EXPECT_MEDIA_LOG_STRING(VideoCodecLog("avc1.6401e")); |
| EXPECT_TRUE(AppendDataInPieces(buffer->data(), buffer->data_size(), 512)); |
| EXPECT_EQ(gfx::Size(638, 360), video_decoder_config_.natural_size()); |
| } |
| @@ -281,6 +324,7 @@ TEST_F(MP4StreamParserTest, NaturalSizeWithPASP) { |
| scoped_refptr<DecoderBuffer> buffer = |
| ReadTestDataFile("bear-640x360-non_square_pixel-with_pasp.mp4"); |
| + EXPECT_MEDIA_LOG_STRING(VideoCodecLog("avc1.6401e")); |
| EXPECT_TRUE(AppendDataInPieces(buffer->data(), buffer->data_size(), 512)); |
| EXPECT_EQ(gfx::Size(638, 360), video_decoder_config_.natural_size()); |
| } |