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 "media/formats/webm/webm_cluster_parser.h" | 5 #include "media/formats/webm/webm_cluster_parser.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 #include <stdint.h> | 8 #include <stdint.h> |
9 | 9 |
10 #include <algorithm> | 10 #include <algorithm> |
(...skipping 276 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
287 for (StreamParser::BufferQueue::const_iterator itr = src.begin(); | 287 for (StreamParser::BufferQueue::const_iterator itr = src.begin(); |
288 itr != src.end(); ++itr) { | 288 itr != src.end(); ++itr) { |
289 dest->push_back(*itr); | 289 dest->push_back(*itr); |
290 } | 290 } |
291 } | 291 } |
292 | 292 |
293 } // namespace | 293 } // namespace |
294 | 294 |
295 class WebMClusterParserTest : public testing::Test { | 295 class WebMClusterParserTest : public testing::Test { |
296 public: | 296 public: |
297 WebMClusterParserTest() | 297 WebMClusterParserTest() : parser_(CreateDefaultParser()) {} |
298 : media_log_(new StrictMock<MockMediaLog>()), | |
299 parser_(CreateDefaultParser()) {} | |
300 | 298 |
301 protected: | 299 protected: |
302 void ResetParserToHaveDefaultDurations() { | 300 void ResetParserToHaveDefaultDurations() { |
303 base::TimeDelta default_audio_duration = base::TimeDelta::FromMilliseconds( | 301 base::TimeDelta default_audio_duration = base::TimeDelta::FromMilliseconds( |
304 kTestAudioFrameDefaultDurationInMs); | 302 kTestAudioFrameDefaultDurationInMs); |
305 base::TimeDelta default_video_duration = base::TimeDelta::FromMilliseconds( | 303 base::TimeDelta default_video_duration = base::TimeDelta::FromMilliseconds( |
306 kTestVideoFrameDefaultDurationInMs); | 304 kTestVideoFrameDefaultDurationInMs); |
307 ASSERT_GE(default_audio_duration, base::TimeDelta()); | 305 ASSERT_GE(default_audio_duration, base::TimeDelta()); |
308 ASSERT_GE(default_video_duration, base::TimeDelta()); | 306 ASSERT_GE(default_video_duration, base::TimeDelta()); |
309 ASSERT_NE(kNoTimestamp, default_audio_duration); | 307 ASSERT_NE(kNoTimestamp, default_audio_duration); |
310 ASSERT_NE(kNoTimestamp, default_video_duration); | 308 ASSERT_NE(kNoTimestamp, default_video_duration); |
311 | 309 |
312 parser_.reset(CreateParserWithDefaultDurationsAndOptionalTextTracks( | 310 parser_.reset(CreateParserWithDefaultDurationsAndOptionalTextTracks( |
313 default_audio_duration, default_video_duration)); | 311 default_audio_duration, default_video_duration)); |
314 } | 312 } |
315 | 313 |
316 // Helper that hard-codes some non-varying constructor parameters. | 314 // Helper that hard-codes some non-varying constructor parameters. |
317 WebMClusterParser* CreateParserHelper( | 315 WebMClusterParser* CreateParserHelper( |
318 base::TimeDelta audio_default_duration, | 316 base::TimeDelta audio_default_duration, |
319 base::TimeDelta video_default_duration, | 317 base::TimeDelta video_default_duration, |
320 const WebMTracksParser::TextTracks& text_tracks, | 318 const WebMTracksParser::TextTracks& text_tracks, |
321 const std::set<int64_t>& ignored_tracks, | 319 const std::set<int64_t>& ignored_tracks, |
322 const std::string& audio_encryption_key_id, | 320 const std::string& audio_encryption_key_id, |
323 const std::string& video_encryption_key_id, | 321 const std::string& video_encryption_key_id, |
324 const AudioCodec audio_codec) { | 322 const AudioCodec audio_codec) { |
325 return new WebMClusterParser( | 323 return new WebMClusterParser( |
326 kTimecodeScale, kAudioTrackNum, audio_default_duration, kVideoTrackNum, | 324 kTimecodeScale, kAudioTrackNum, audio_default_duration, kVideoTrackNum, |
327 video_default_duration, text_tracks, ignored_tracks, | 325 video_default_duration, text_tracks, ignored_tracks, |
328 audio_encryption_key_id, video_encryption_key_id, audio_codec, | 326 audio_encryption_key_id, video_encryption_key_id, audio_codec, |
329 media_log_); | 327 &media_log_); |
330 } | 328 } |
331 | 329 |
332 // Create a default version of the parser for test. | 330 // Create a default version of the parser for test. |
333 WebMClusterParser* CreateDefaultParser() { | 331 WebMClusterParser* CreateDefaultParser() { |
334 return CreateParserHelper(kNoTimestamp, kNoTimestamp, TextTracks(), | 332 return CreateParserHelper(kNoTimestamp, kNoTimestamp, TextTracks(), |
335 std::set<int64_t>(), std::string(), std::string(), | 333 std::set<int64_t>(), std::string(), std::string(), |
336 kUnknownAudioCodec); | 334 kUnknownAudioCodec); |
337 } | 335 } |
338 | 336 |
339 // Create a parser for test with custom audio and video default durations, and | 337 // Create a parser for test with custom audio and video default durations, and |
(...skipping 18 matching lines...) Expand all Loading... |
358 // Create a parser for test with custom encryption key ids and audio codec. | 356 // Create a parser for test with custom encryption key ids and audio codec. |
359 WebMClusterParser* CreateParserWithKeyIdsAndAudioCodec( | 357 WebMClusterParser* CreateParserWithKeyIdsAndAudioCodec( |
360 const std::string& audio_encryption_key_id, | 358 const std::string& audio_encryption_key_id, |
361 const std::string& video_encryption_key_id, | 359 const std::string& video_encryption_key_id, |
362 const AudioCodec audio_codec) { | 360 const AudioCodec audio_codec) { |
363 return CreateParserHelper(kNoTimestamp, kNoTimestamp, TextTracks(), | 361 return CreateParserHelper(kNoTimestamp, kNoTimestamp, TextTracks(), |
364 std::set<int64_t>(), audio_encryption_key_id, | 362 std::set<int64_t>(), audio_encryption_key_id, |
365 video_encryption_key_id, audio_codec); | 363 video_encryption_key_id, audio_codec); |
366 } | 364 } |
367 | 365 |
368 scoped_refptr<StrictMock<MockMediaLog>> media_log_; | 366 StrictMock<MockMediaLog> media_log_; |
369 std::unique_ptr<WebMClusterParser> parser_; | 367 std::unique_ptr<WebMClusterParser> parser_; |
370 | 368 |
371 private: | 369 private: |
372 DISALLOW_COPY_AND_ASSIGN(WebMClusterParserTest); | 370 DISALLOW_COPY_AND_ASSIGN(WebMClusterParserTest); |
373 }; | 371 }; |
374 | 372 |
375 TEST_F(WebMClusterParserTest, HeldBackBufferHoldsBackAllTracks) { | 373 TEST_F(WebMClusterParserTest, HeldBackBufferHoldsBackAllTracks) { |
376 // If a buffer is missing duration and is being held back, then all other | 374 // If a buffer is missing duration and is being held back, then all other |
377 // tracks' buffers that have same or higher (decode) timestamp should be held | 375 // tracks' buffers that have same or higher (decode) timestamp should be held |
378 // back too to keep the timestamps emitted for a cluster monotonically | 376 // back too to keep the timestamps emitted for a cluster monotonically |
(...skipping 708 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1087 int duration_ms = packet_ptr->duration_ms(); // Casts from double. | 1085 int duration_ms = packet_ptr->duration_ms(); // Casts from double. |
1088 if (duration_ms > 120) { | 1086 if (duration_ms > 120) { |
1089 EXPECT_MEDIA_LOG(OpusPacketDurationTooHigh(duration_ms)); | 1087 EXPECT_MEDIA_LOG(OpusPacketDurationTooHigh(duration_ms)); |
1090 } | 1088 } |
1091 | 1089 |
1092 int result = parser_->Parse(cluster->data(), cluster->size()); | 1090 int result = parser_->Parse(cluster->data(), cluster->size()); |
1093 EXPECT_EQ(cluster->size(), result); | 1091 EXPECT_EQ(cluster->size(), result); |
1094 ASSERT_TRUE(VerifyBuffers(parser_, kBlockInfo, block_count)); | 1092 ASSERT_TRUE(VerifyBuffers(parser_, kBlockInfo, block_count)); |
1095 | 1093 |
1096 // Fail early if any iteration fails to meet the logging expectations. | 1094 // Fail early if any iteration fails to meet the logging expectations. |
1097 ASSERT_TRUE(Mock::VerifyAndClearExpectations(media_log_.get())); | 1095 ASSERT_TRUE(Mock::VerifyAndClearExpectations(&media_log_)); |
1098 | 1096 |
1099 loop_count++; | 1097 loop_count++; |
1100 } | 1098 } |
1101 | 1099 |
1102 // Test should minimally cover all the combinations of config and frame count. | 1100 // Test should minimally cover all the combinations of config and frame count. |
1103 ASSERT_GE(loop_count, kNumPossibleOpusConfigs * kMaxOpusPacketFrameCount); | 1101 ASSERT_GE(loop_count, kNumPossibleOpusConfigs * kMaxOpusPacketFrameCount); |
1104 } | 1102 } |
1105 | 1103 |
1106 TEST_F(WebMClusterParserTest, PreferOpusDurationsOverBlockDurations) { | 1104 TEST_F(WebMClusterParserTest, PreferOpusDurationsOverBlockDurations) { |
1107 int loop_count = 0; | 1105 int loop_count = 0; |
(...skipping 26 matching lines...) Expand all Loading... |
1134 int result = parser_->Parse(cluster->data(), cluster->size()); | 1132 int result = parser_->Parse(cluster->data(), cluster->size()); |
1135 EXPECT_EQ(cluster->size(), result); | 1133 EXPECT_EQ(cluster->size(), result); |
1136 | 1134 |
1137 // BlockInfo duration will be used to verify buffer duration, so changing | 1135 // BlockInfo duration will be used to verify buffer duration, so changing |
1138 // duration to be that of the Opus packet to verify it was preferred. | 1136 // duration to be that of the Opus packet to verify it was preferred. |
1139 block_infos[0].duration = packet_ptr->duration_ms(); | 1137 block_infos[0].duration = packet_ptr->duration_ms(); |
1140 | 1138 |
1141 ASSERT_TRUE(VerifyBuffers(parser_, block_infos, block_count)); | 1139 ASSERT_TRUE(VerifyBuffers(parser_, block_infos, block_count)); |
1142 | 1140 |
1143 // Fail early if any iteration fails to meet the logging expectations. | 1141 // Fail early if any iteration fails to meet the logging expectations. |
1144 ASSERT_TRUE(Mock::VerifyAndClearExpectations(media_log_.get())); | 1142 ASSERT_TRUE(Mock::VerifyAndClearExpectations(&media_log_)); |
1145 | 1143 |
1146 loop_count++; | 1144 loop_count++; |
1147 } | 1145 } |
1148 | 1146 |
1149 // Test should minimally cover all the combinations of config and frame count. | 1147 // Test should minimally cover all the combinations of config and frame count. |
1150 ASSERT_GE(loop_count, kNumPossibleOpusConfigs * kMaxOpusPacketFrameCount); | 1148 ASSERT_GE(loop_count, kNumPossibleOpusConfigs * kMaxOpusPacketFrameCount); |
1151 } | 1149 } |
1152 | 1150 |
1153 // Tests that BlockDuration is used to set duration on buffer rather than | 1151 // Tests that BlockDuration is used to set duration on buffer rather than |
1154 // encoded duration in Opus packet (or hard coded duration estimates). Encoded | 1152 // encoded duration in Opus packet (or hard coded duration estimates). Encoded |
(...skipping 17 matching lines...) Expand all Loading... |
1172 int block_count = arraysize(kBlockInfo); | 1170 int block_count = arraysize(kBlockInfo); |
1173 std::unique_ptr<Cluster> cluster(CreateCluster(0, kBlockInfo, block_count)); | 1171 std::unique_ptr<Cluster> cluster(CreateCluster(0, kBlockInfo, block_count)); |
1174 int result = parser_->Parse(cluster->data(), cluster->size()); | 1172 int result = parser_->Parse(cluster->data(), cluster->size()); |
1175 EXPECT_EQ(cluster->size(), result); | 1173 EXPECT_EQ(cluster->size(), result); |
1176 | 1174 |
1177 // Will verify that duration of buffer matches that of BlockDuration. | 1175 // Will verify that duration of buffer matches that of BlockDuration. |
1178 ASSERT_TRUE(VerifyBuffers(parser_, kBlockInfo, block_count)); | 1176 ASSERT_TRUE(VerifyBuffers(parser_, kBlockInfo, block_count)); |
1179 } | 1177 } |
1180 | 1178 |
1181 } // namespace media | 1179 } // namespace media |
OLD | NEW |