Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "base/logging.h" | 5 #include "base/logging.h" |
| 6 #include "media/base/channel_layout.h" | 6 #include "media/base/channel_layout.h" |
| 7 #include "media/formats/webm/tracks_builder.h" | 7 #include "media/formats/webm/tracks_builder.h" |
| 8 #include "media/formats/webm/webm_constants.h" | 8 #include "media/formats/webm/webm_constants.h" |
| 9 #include "media/formats/webm/webm_tracks_parser.h" | 9 #include "media/formats/webm/webm_tracks_parser.h" |
| 10 #include "testing/gmock/include/gmock/gmock.h" | 10 #include "testing/gmock/include/gmock/gmock.h" |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 21 class WebMTracksParserTest : public testing::Test { | 21 class WebMTracksParserTest : public testing::Test { |
| 22 public: | 22 public: |
| 23 WebMTracksParserTest() {} | 23 WebMTracksParserTest() {} |
| 24 }; | 24 }; |
| 25 | 25 |
| 26 static void VerifyTextTrackInfo(const uint8* buffer, | 26 static void VerifyTextTrackInfo(const uint8* buffer, |
| 27 int buffer_size, | 27 int buffer_size, |
| 28 TextKind text_kind, | 28 TextKind text_kind, |
| 29 const std::string& name, | 29 const std::string& name, |
| 30 const std::string& language) { | 30 const std::string& language) { |
| 31 scoped_ptr<WebMTracksParser> parser(new WebMTracksParser(LogCB(), false)); | 31 scoped_ptr<WebMTracksParser> parser( |
| 32 new WebMTracksParser(LogCB(), false, false)); | |
| 32 | 33 |
| 33 int result = parser->Parse(buffer, buffer_size); | 34 int result = parser->Parse(buffer, buffer_size); |
| 34 EXPECT_GT(result, 0); | 35 EXPECT_GT(result, 0); |
| 35 EXPECT_EQ(result, buffer_size); | 36 EXPECT_EQ(result, buffer_size); |
| 36 | 37 |
| 37 const WebMTracksParser::TextTracks& text_tracks = parser->text_tracks(); | 38 const WebMTracksParser::TextTracks& text_tracks = parser->text_tracks(); |
| 38 EXPECT_EQ(text_tracks.size(), WebMTracksParser::TextTracks::size_type(1)); | 39 EXPECT_EQ(text_tracks.size(), WebMTracksParser::TextTracks::size_type(1)); |
| 39 | 40 |
| 40 const WebMTracksParser::TextTracks::const_iterator itr = text_tracks.begin(); | 41 const WebMTracksParser::TextTracks::const_iterator itr = text_tracks.begin(); |
| 41 EXPECT_EQ(itr->first, 1); // track num | 42 EXPECT_EQ(itr->first, 1); // track num |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 87 } | 88 } |
| 88 | 89 |
| 89 TEST_F(WebMTracksParserTest, IgnoringTextTracks) { | 90 TEST_F(WebMTracksParserTest, IgnoringTextTracks) { |
| 90 InSequence s; | 91 InSequence s; |
| 91 | 92 |
| 92 TracksBuilder tb; | 93 TracksBuilder tb; |
| 93 tb.AddTextTrack(1, 1, kWebMCodecSubtitles, "Subtitles", "fre"); | 94 tb.AddTextTrack(1, 1, kWebMCodecSubtitles, "Subtitles", "fre"); |
| 94 tb.AddTextTrack(2, 2, kWebMCodecSubtitles, "Commentary", "fre"); | 95 tb.AddTextTrack(2, 2, kWebMCodecSubtitles, "Commentary", "fre"); |
| 95 | 96 |
| 96 const std::vector<uint8> buf = tb.Finish(); | 97 const std::vector<uint8> buf = tb.Finish(); |
| 97 scoped_ptr<WebMTracksParser> parser(new WebMTracksParser(LogCB(), true)); | 98 scoped_ptr<WebMTracksParser> parser( |
| 99 new WebMTracksParser(LogCB(), true, false)); | |
| 98 | 100 |
| 99 int result = parser->Parse(&buf[0], buf.size()); | 101 int result = parser->Parse(&buf[0], buf.size()); |
| 100 EXPECT_GT(result, 0); | 102 EXPECT_GT(result, 0); |
| 101 EXPECT_EQ(result, static_cast<int>(buf.size())); | 103 EXPECT_EQ(result, static_cast<int>(buf.size())); |
| 102 | 104 |
| 103 EXPECT_EQ(parser->text_tracks().size(), 0u); | 105 EXPECT_EQ(parser->text_tracks().size(), 0u); |
| 104 | 106 |
| 105 const std::set<int64>& ignored_tracks = parser->ignored_tracks(); | 107 const std::set<int64>& ignored_tracks = parser->ignored_tracks(); |
| 106 EXPECT_TRUE(ignored_tracks.find(1) != ignored_tracks.end()); | 108 EXPECT_TRUE(ignored_tracks.find(1) != ignored_tracks.end()); |
| 107 EXPECT_TRUE(ignored_tracks.find(2) != ignored_tracks.end()); | 109 EXPECT_TRUE(ignored_tracks.find(2) != ignored_tracks.end()); |
| 108 | 110 |
| 109 // Test again w/o ignoring the test tracks. | 111 // Test again w/o ignoring the test tracks. |
| 110 parser.reset(new WebMTracksParser(LogCB(), false)); | 112 parser.reset(new WebMTracksParser(LogCB(), false, false)); |
| 111 | 113 |
| 112 result = parser->Parse(&buf[0], buf.size()); | 114 result = parser->Parse(&buf[0], buf.size()); |
| 113 EXPECT_GT(result, 0); | 115 EXPECT_GT(result, 0); |
| 114 | 116 |
| 115 EXPECT_EQ(parser->ignored_tracks().size(), 0u); | 117 EXPECT_EQ(parser->ignored_tracks().size(), 0u); |
| 116 EXPECT_EQ(parser->text_tracks().size(), 2u); | 118 EXPECT_EQ(parser->text_tracks().size(), 2u); |
| 117 } | 119 } |
| 118 | 120 |
| 119 TEST_F(WebMTracksParserTest, AudioVideoDefaultDurationUnset) { | 121 TEST_F(WebMTracksParserTest, AudioVideoDefaultDurationUnset) { |
| 120 // Other audio/video decoder config fields are necessary in the test | 122 // Other audio/video decoder config fields are necessary in the test |
| 121 // audio/video TrackEntry configurations. This method does only very minimal | 123 // audio/video TrackEntry configurations. This method does only very minimal |
| 122 // verification of their inclusion and parsing; the goal is to confirm | 124 // verification of their inclusion and parsing; the goal is to confirm |
| 123 // TrackEntry DefaultDuration defaults to -1 if not included in audio or | 125 // TrackEntry DefaultDuration defaults to -1 if not included in audio or |
| 124 // video TrackEntry. | 126 // video TrackEntry. |
| 125 TracksBuilder tb; | 127 TracksBuilder tb; |
| 126 tb.AddAudioTrack(1, 1, "A_VORBIS", "audio", "", -1, 2, 8000); | 128 tb.AddAudioTrack(1, 1, "A_VORBIS", "audio", "", -1, 2, 8000); |
| 127 tb.AddVideoTrack(2, 2, "V_VP8", "video", "", -1, 320, 240); | 129 tb.AddVideoTrack(2, 2, "V_VP8", "video", "", -1, 320, 240); |
| 128 const std::vector<uint8> buf = tb.Finish(); | 130 const std::vector<uint8> buf = tb.Finish(); |
| 129 | 131 |
| 130 scoped_ptr<WebMTracksParser> parser(new WebMTracksParser(LogCB(), true)); | 132 scoped_ptr<WebMTracksParser> parser(new WebMTracksParser(LogCB(), true, false) ); |
|
scherkus (not reviewing)
2014/04/10 21:11:49
80 chars
Sergey Ulanov
2014/04/10 23:10:07
Done.
| |
| 131 int result = parser->Parse(&buf[0], buf.size()); | 133 int result = parser->Parse(&buf[0], buf.size()); |
| 132 EXPECT_LE(0, result); | 134 EXPECT_LE(0, result); |
| 133 EXPECT_EQ(static_cast<int>(buf.size()), result); | 135 EXPECT_EQ(static_cast<int>(buf.size()), result); |
| 134 | 136 |
| 135 EXPECT_EQ(kNoTimestamp(), | 137 EXPECT_EQ(kNoTimestamp(), |
| 136 parser->GetAudioDefaultDuration(kDefaultTimecodeScaleInUs)); | 138 parser->GetAudioDefaultDuration(kDefaultTimecodeScaleInUs)); |
| 137 EXPECT_EQ(kNoTimestamp(), | 139 EXPECT_EQ(kNoTimestamp(), |
| 138 parser->GetVideoDefaultDuration(kDefaultTimecodeScaleInUs)); | 140 parser->GetVideoDefaultDuration(kDefaultTimecodeScaleInUs)); |
| 139 | 141 |
| 140 const VideoDecoderConfig& video_config = parser->video_decoder_config(); | 142 const VideoDecoderConfig& video_config = parser->video_decoder_config(); |
| 141 EXPECT_TRUE(video_config.IsValidConfig()); | 143 EXPECT_TRUE(video_config.IsValidConfig()); |
| 142 EXPECT_EQ(320, video_config.coded_size().width()); | 144 EXPECT_EQ(320, video_config.coded_size().width()); |
| 143 EXPECT_EQ(240, video_config.coded_size().height()); | 145 EXPECT_EQ(240, video_config.coded_size().height()); |
| 144 | 146 |
| 145 const AudioDecoderConfig& audio_config = parser->audio_decoder_config(); | 147 const AudioDecoderConfig& audio_config = parser->audio_decoder_config(); |
| 146 EXPECT_TRUE(audio_config.IsValidConfig()); | 148 EXPECT_TRUE(audio_config.IsValidConfig()); |
| 147 EXPECT_EQ(CHANNEL_LAYOUT_STEREO, audio_config.channel_layout()); | 149 EXPECT_EQ(CHANNEL_LAYOUT_STEREO, audio_config.channel_layout()); |
| 148 EXPECT_EQ(8000, audio_config.samples_per_second()); | 150 EXPECT_EQ(8000, audio_config.samples_per_second()); |
| 149 } | 151 } |
| 150 | 152 |
| 151 TEST_F(WebMTracksParserTest, AudioVideoDefaultDurationSet) { | 153 TEST_F(WebMTracksParserTest, AudioVideoDefaultDurationSet) { |
| 152 // Confirm audio or video TrackEntry DefaultDuration values are parsed, if | 154 // Confirm audio or video TrackEntry DefaultDuration values are parsed, if |
| 153 // present. | 155 // present. |
| 154 TracksBuilder tb; | 156 TracksBuilder tb; |
| 155 tb.AddAudioTrack(1, 1, "A_VORBIS", "audio", "", 12345678, 2, 8000); | 157 tb.AddAudioTrack(1, 1, "A_VORBIS", "audio", "", 12345678, 2, 8000); |
| 156 tb.AddVideoTrack(2, 2, "V_VP8", "video", "", 987654321, 320, 240); | 158 tb.AddVideoTrack(2, 2, "V_VP8", "video", "", 987654321, 320, 240); |
| 157 const std::vector<uint8> buf = tb.Finish(); | 159 const std::vector<uint8> buf = tb.Finish(); |
| 158 | 160 |
| 159 scoped_ptr<WebMTracksParser> parser(new WebMTracksParser(LogCB(), true)); | 161 scoped_ptr<WebMTracksParser> parser( |
| 162 new WebMTracksParser(LogCB(), true, false)); | |
| 160 int result = parser->Parse(&buf[0], buf.size()); | 163 int result = parser->Parse(&buf[0], buf.size()); |
| 161 EXPECT_LE(0, result); | 164 EXPECT_LE(0, result); |
| 162 EXPECT_EQ(static_cast<int>(buf.size()), result); | 165 EXPECT_EQ(static_cast<int>(buf.size()), result); |
| 163 | 166 |
| 164 EXPECT_EQ(base::TimeDelta::FromMicroseconds(12000), | 167 EXPECT_EQ(base::TimeDelta::FromMicroseconds(12000), |
| 165 parser->GetAudioDefaultDuration(kDefaultTimecodeScaleInUs)); | 168 parser->GetAudioDefaultDuration(kDefaultTimecodeScaleInUs)); |
| 166 EXPECT_EQ(base::TimeDelta::FromMicroseconds(985000), | 169 EXPECT_EQ(base::TimeDelta::FromMicroseconds(985000), |
| 167 parser->GetVideoDefaultDuration(5000.0)); // 5 ms resolution | 170 parser->GetVideoDefaultDuration(5000.0)); // 5 ms resolution |
| 168 EXPECT_EQ(kNoTimestamp(), parser->GetAudioDefaultDuration(12346.0)); | 171 EXPECT_EQ(kNoTimestamp(), parser->GetAudioDefaultDuration(12346.0)); |
| 169 EXPECT_EQ(base::TimeDelta::FromMicroseconds(12345), | 172 EXPECT_EQ(base::TimeDelta::FromMicroseconds(12345), |
| 170 parser->GetAudioDefaultDuration(12345.0)); | 173 parser->GetAudioDefaultDuration(12345.0)); |
| 171 EXPECT_EQ(base::TimeDelta::FromMicroseconds(12003), | 174 EXPECT_EQ(base::TimeDelta::FromMicroseconds(12003), |
| 172 parser->GetAudioDefaultDuration(1000.3)); // 1.0003 ms resolution | 175 parser->GetAudioDefaultDuration(1000.3)); // 1.0003 ms resolution |
| 173 } | 176 } |
| 174 | 177 |
| 175 TEST_F(WebMTracksParserTest, InvalidZeroDefaultDurationSet) { | 178 TEST_F(WebMTracksParserTest, InvalidZeroDefaultDurationSet) { |
| 176 // Confirm parse error if TrackEntry DefaultDuration is present, but is 0ns. | 179 // Confirm parse error if TrackEntry DefaultDuration is present, but is 0ns. |
| 177 TracksBuilder tb(true); | 180 TracksBuilder tb(true); |
| 178 tb.AddAudioTrack(1, 1, "A_VORBIS", "audio", "", 0, 2, 8000); | 181 tb.AddAudioTrack(1, 1, "A_VORBIS", "audio", "", 0, 2, 8000); |
| 179 const std::vector<uint8> buf = tb.Finish(); | 182 const std::vector<uint8> buf = tb.Finish(); |
| 180 | 183 |
| 181 scoped_ptr<WebMTracksParser> parser(new WebMTracksParser(LogCB(), true)); | 184 scoped_ptr<WebMTracksParser> parser( |
| 185 new WebMTracksParser(LogCB(), true, false)); | |
| 182 EXPECT_EQ(-1, parser->Parse(&buf[0], buf.size())); | 186 EXPECT_EQ(-1, parser->Parse(&buf[0], buf.size())); |
| 183 } | 187 } |
| 184 | 188 |
| 185 } // namespace media | 189 } // namespace media |
| OLD | NEW |