Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(79)

Side by Side Diff: media/formats/mp4/track_run_iterator_unittest.cc

Issue 447963003: Introduce DecodeTimestamp class to make it easier to distiguish presentation and decode timestamps. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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/basictypes.h" 5 #include "base/basictypes.h"
6 #include "base/logging.h" 6 #include "base/logging.h"
7 #include "base/memory/scoped_ptr.h" 7 #include "base/memory/scoped_ptr.h"
8 #include "base/strings/string_split.h" 8 #include "base/strings/string_split.h"
9 #include "media/formats/mp4/box_definitions.h" 9 #include "media/formats/mp4/box_definitions.h"
10 #include "media/formats/mp4/rcheck.h" 10 #include "media/formats/mp4/rcheck.h"
(...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after
284 MovieFragment moof = CreateFragment(); 284 MovieFragment moof = CreateFragment();
285 285
286 // Test that runs are sorted correctly, and that properties of the initial 286 // Test that runs are sorted correctly, and that properties of the initial
287 // sample of the first run are correct 287 // sample of the first run are correct
288 ASSERT_TRUE(iter_->Init(moof)); 288 ASSERT_TRUE(iter_->Init(moof));
289 EXPECT_TRUE(iter_->IsRunValid()); 289 EXPECT_TRUE(iter_->IsRunValid());
290 EXPECT_FALSE(iter_->is_encrypted()); 290 EXPECT_FALSE(iter_->is_encrypted());
291 EXPECT_EQ(iter_->track_id(), 1u); 291 EXPECT_EQ(iter_->track_id(), 1u);
292 EXPECT_EQ(iter_->sample_offset(), 100); 292 EXPECT_EQ(iter_->sample_offset(), 100);
293 EXPECT_EQ(iter_->sample_size(), 1); 293 EXPECT_EQ(iter_->sample_size(), 1);
294 EXPECT_EQ(iter_->dts(), TimeDeltaFromRational(0, kAudioScale)); 294 EXPECT_EQ(iter_->dts(), DecodeTimestampFromRational(0, kAudioScale));
295 EXPECT_EQ(iter_->cts(), TimeDeltaFromRational(0, kAudioScale)); 295 EXPECT_EQ(iter_->cts(), TimeDeltaFromRational(0, kAudioScale));
296 EXPECT_EQ(iter_->duration(), TimeDeltaFromRational(1024, kAudioScale)); 296 EXPECT_EQ(iter_->duration(), TimeDeltaFromRational(1024, kAudioScale));
297 EXPECT_TRUE(iter_->is_keyframe()); 297 EXPECT_TRUE(iter_->is_keyframe());
298 298
299 // Advance to the last sample in the current run, and test its properties 299 // Advance to the last sample in the current run, and test its properties
300 for (int i = 0; i < 9; i++) iter_->AdvanceSample(); 300 for (int i = 0; i < 9; i++) iter_->AdvanceSample();
301 EXPECT_EQ(iter_->track_id(), 1u); 301 EXPECT_EQ(iter_->track_id(), 1u);
302 EXPECT_EQ(iter_->sample_offset(), 100 + kSumAscending1); 302 EXPECT_EQ(iter_->sample_offset(), 100 + kSumAscending1);
303 EXPECT_EQ(iter_->sample_size(), 10); 303 EXPECT_EQ(iter_->sample_size(), 10);
304 EXPECT_EQ(iter_->dts(), TimeDeltaFromRational(1024 * 9, kAudioScale)); 304 EXPECT_EQ(iter_->dts(), DecodeTimestampFromRational(1024 * 9, kAudioScale));
305 EXPECT_EQ(iter_->duration(), TimeDeltaFromRational(1024, kAudioScale)); 305 EXPECT_EQ(iter_->duration(), TimeDeltaFromRational(1024, kAudioScale));
306 EXPECT_TRUE(iter_->is_keyframe()); 306 EXPECT_TRUE(iter_->is_keyframe());
307 307
308 // Test end-of-run 308 // Test end-of-run
309 iter_->AdvanceSample(); 309 iter_->AdvanceSample();
310 EXPECT_FALSE(iter_->IsSampleValid()); 310 EXPECT_FALSE(iter_->IsSampleValid());
311 311
312 // Test last sample of next run 312 // Test last sample of next run
313 iter_->AdvanceRun(); 313 iter_->AdvanceRun();
314 EXPECT_TRUE(iter_->is_keyframe()); 314 EXPECT_TRUE(iter_->is_keyframe());
315 for (int i = 0; i < 9; i++) iter_->AdvanceSample(); 315 for (int i = 0; i < 9; i++) iter_->AdvanceSample();
316 EXPECT_EQ(iter_->track_id(), 2u); 316 EXPECT_EQ(iter_->track_id(), 2u);
317 EXPECT_EQ(iter_->sample_offset(), 200 + kSumAscending1); 317 EXPECT_EQ(iter_->sample_offset(), 200 + kSumAscending1);
318 EXPECT_EQ(iter_->sample_size(), 10); 318 EXPECT_EQ(iter_->sample_size(), 10);
319 int64 base_dts = kSumAscending1 + moof.tracks[1].decode_time.decode_time; 319 int64 base_dts = kSumAscending1 + moof.tracks[1].decode_time.decode_time;
320 EXPECT_EQ(iter_->dts(), TimeDeltaFromRational(base_dts, kVideoScale)); 320 EXPECT_EQ(iter_->dts(), DecodeTimestampFromRational(base_dts, kVideoScale));
321 EXPECT_EQ(iter_->duration(), TimeDeltaFromRational(10, kVideoScale)); 321 EXPECT_EQ(iter_->duration(), TimeDeltaFromRational(10, kVideoScale));
322 EXPECT_FALSE(iter_->is_keyframe()); 322 EXPECT_FALSE(iter_->is_keyframe());
323 323
324 // Test final run 324 // Test final run
325 iter_->AdvanceRun(); 325 iter_->AdvanceRun();
326 EXPECT_EQ(iter_->track_id(), 1u); 326 EXPECT_EQ(iter_->track_id(), 1u);
327 EXPECT_EQ(iter_->dts(), TimeDeltaFromRational(1024 * 10, kAudioScale)); 327 EXPECT_EQ(iter_->dts(), DecodeTimestampFromRational(1024 * 10, kAudioScale));
328 iter_->AdvanceSample(); 328 iter_->AdvanceSample();
329 EXPECT_EQ(moof.tracks[0].runs[1].data_offset + 329 EXPECT_EQ(moof.tracks[0].runs[1].data_offset +
330 moof.tracks[0].header.default_sample_size, 330 moof.tracks[0].header.default_sample_size,
331 iter_->sample_offset()); 331 iter_->sample_offset());
332 iter_->AdvanceRun(); 332 iter_->AdvanceRun();
333 EXPECT_FALSE(iter_->IsRunValid()); 333 EXPECT_FALSE(iter_->IsRunValid());
334 } 334 }
335 335
336 TEST_F(TrackRunIteratorTest, TrackExtendsDefaultsTest) { 336 TEST_F(TrackRunIteratorTest, TrackExtendsDefaultsTest) {
337 moov_.extends.tracks[0].default_sample_duration = 50; 337 moov_.extends.tracks[0].default_sample_duration = 50;
338 moov_.extends.tracks[0].default_sample_size = 3; 338 moov_.extends.tracks[0].default_sample_size = 3;
339 moov_.extends.tracks[0].default_sample_flags = ToSampleFlags("UN"); 339 moov_.extends.tracks[0].default_sample_flags = ToSampleFlags("UN");
340 iter_.reset(new TrackRunIterator(&moov_, log_cb_)); 340 iter_.reset(new TrackRunIterator(&moov_, log_cb_));
341 MovieFragment moof = CreateFragment(); 341 MovieFragment moof = CreateFragment();
342 moof.tracks[0].header.has_default_sample_flags = false; 342 moof.tracks[0].header.has_default_sample_flags = false;
343 moof.tracks[0].header.default_sample_size = 0; 343 moof.tracks[0].header.default_sample_size = 0;
344 moof.tracks[0].header.default_sample_duration = 0; 344 moof.tracks[0].header.default_sample_duration = 0;
345 moof.tracks[0].runs[0].sample_sizes.clear(); 345 moof.tracks[0].runs[0].sample_sizes.clear();
346 ASSERT_TRUE(iter_->Init(moof)); 346 ASSERT_TRUE(iter_->Init(moof));
347 iter_->AdvanceSample(); 347 iter_->AdvanceSample();
348 EXPECT_FALSE(iter_->is_keyframe()); 348 EXPECT_FALSE(iter_->is_keyframe());
349 EXPECT_EQ(iter_->sample_size(), 3); 349 EXPECT_EQ(iter_->sample_size(), 3);
350 EXPECT_EQ(iter_->sample_offset(), moof.tracks[0].runs[0].data_offset + 3); 350 EXPECT_EQ(iter_->sample_offset(), moof.tracks[0].runs[0].data_offset + 3);
351 EXPECT_EQ(iter_->duration(), TimeDeltaFromRational(50, kAudioScale)); 351 EXPECT_EQ(iter_->duration(), TimeDeltaFromRational(50, kAudioScale));
352 EXPECT_EQ(iter_->dts(), TimeDeltaFromRational(50, kAudioScale)); 352 EXPECT_EQ(iter_->dts(), DecodeTimestampFromRational(50, kAudioScale));
353 } 353 }
354 354
355 TEST_F(TrackRunIteratorTest, FirstSampleFlagTest) { 355 TEST_F(TrackRunIteratorTest, FirstSampleFlagTest) {
356 // Ensure that keyframes are flagged correctly in the face of BMFF boxes which 356 // Ensure that keyframes are flagged correctly in the face of BMFF boxes which
357 // explicitly specify the flags for the first sample in a run and rely on 357 // explicitly specify the flags for the first sample in a run and rely on
358 // defaults for all subsequent samples 358 // defaults for all subsequent samples
359 iter_.reset(new TrackRunIterator(&moov_, log_cb_)); 359 iter_.reset(new TrackRunIterator(&moov_, log_cb_));
360 MovieFragment moof = CreateFragment(); 360 MovieFragment moof = CreateFragment();
361 moof.tracks[1].header.has_default_sample_flags = true; 361 moof.tracks[1].header.has_default_sample_flags = true;
362 moof.tracks[1].header.default_sample_flags = ToSampleFlags("UN"); 362 moof.tracks[1].header.default_sample_flags = ToSampleFlags("UN");
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
401 std::vector<int32>& cts_offsets = 401 std::vector<int32>& cts_offsets =
402 moof.tracks[1].runs[0].sample_composition_time_offsets; 402 moof.tracks[1].runs[0].sample_composition_time_offsets;
403 cts_offsets.resize(10); 403 cts_offsets.resize(10);
404 cts_offsets[0] = 2; 404 cts_offsets[0] = 2;
405 cts_offsets[1] = 5; 405 cts_offsets[1] = 5;
406 cts_offsets[2] = 0; 406 cts_offsets[2] = 0;
407 moof.tracks[1].decode_time.decode_time = 0; 407 moof.tracks[1].decode_time.decode_time = 0;
408 408
409 ASSERT_TRUE(iter_->Init(moof)); 409 ASSERT_TRUE(iter_->Init(moof));
410 iter_->AdvanceRun(); 410 iter_->AdvanceRun();
411 EXPECT_EQ(iter_->dts(), TimeDeltaFromRational(0, kVideoScale)); 411 EXPECT_EQ(iter_->dts(), DecodeTimestampFromRational(0, kVideoScale));
412 EXPECT_EQ(iter_->cts(), TimeDeltaFromRational(0, kVideoScale)); 412 EXPECT_EQ(iter_->cts(), TimeDeltaFromRational(0, kVideoScale));
413 EXPECT_EQ(iter_->duration(), TimeDeltaFromRational(1, kVideoScale)); 413 EXPECT_EQ(iter_->duration(), TimeDeltaFromRational(1, kVideoScale));
414 iter_->AdvanceSample(); 414 iter_->AdvanceSample();
415 EXPECT_EQ(iter_->dts(), TimeDeltaFromRational(1, kVideoScale)); 415 EXPECT_EQ(iter_->dts(), DecodeTimestampFromRational(1, kVideoScale));
416 EXPECT_EQ(iter_->cts(), TimeDeltaFromRational(4, kVideoScale)); 416 EXPECT_EQ(iter_->cts(), TimeDeltaFromRational(4, kVideoScale));
417 EXPECT_EQ(iter_->duration(), TimeDeltaFromRational(2, kVideoScale)); 417 EXPECT_EQ(iter_->duration(), TimeDeltaFromRational(2, kVideoScale));
418 iter_->AdvanceSample(); 418 iter_->AdvanceSample();
419 EXPECT_EQ(iter_->dts(), TimeDeltaFromRational(3, kVideoScale)); 419 EXPECT_EQ(iter_->dts(), DecodeTimestampFromRational(3, kVideoScale));
420 EXPECT_EQ(iter_->cts(), TimeDeltaFromRational(1, kVideoScale)); 420 EXPECT_EQ(iter_->cts(), TimeDeltaFromRational(1, kVideoScale));
421 EXPECT_EQ(iter_->duration(), TimeDeltaFromRational(3, kVideoScale)); 421 EXPECT_EQ(iter_->duration(), TimeDeltaFromRational(3, kVideoScale));
422 } 422 }
423 423
424 TEST_F(TrackRunIteratorTest, IgnoreUnknownAuxInfoTest) { 424 TEST_F(TrackRunIteratorTest, IgnoreUnknownAuxInfoTest) {
425 iter_.reset(new TrackRunIterator(&moov_, log_cb_)); 425 iter_.reset(new TrackRunIterator(&moov_, log_cb_));
426 MovieFragment moof = CreateFragment(); 426 MovieFragment moof = CreateFragment();
427 moof.tracks[1].auxiliary_offset.offsets.push_back(50); 427 moof.tracks[1].auxiliary_offset.offsets.push_back(50);
428 moof.tracks[1].auxiliary_size.default_sample_info_size = 2; 428 moof.tracks[1].auxiliary_size.default_sample_info_size = 2;
429 moof.tracks[1].auxiliary_size.sample_count = 2; 429 moof.tracks[1].auxiliary_size.sample_count = 2;
(...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after
657 657
658 iter_->AdvanceRun(); 658 iter_->AdvanceRun();
659 659
660 // Verify that nothing is marked as a random access point. 660 // Verify that nothing is marked as a random access point.
661 EXPECT_EQ("2 KR P PR P KR K", KeyframeAndRAPInfo(iter_.get())); 661 EXPECT_EQ("2 KR P PR P KR K", KeyframeAndRAPInfo(iter_.get()));
662 } 662 }
663 663
664 664
665 } // namespace mp4 665 } // namespace mp4
666 } // namespace media 666 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698