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

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

Issue 11471006: Log MediaSource parsing errors to the MediaLog so they can appear in chrome:media-internals. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix nit. Created 8 years 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
« no previous file with comments | « media/mp4/track_run_iterator.cc ('k') | media/webm/webm_cluster_parser.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "media/mp4/box_definitions.h" 8 #include "media/mp4/box_definitions.h"
9 #include "media/mp4/rcheck.h" 9 #include "media/mp4/rcheck.h"
10 #include "media/mp4/track_run_iterator.h" 10 #include "media/mp4/track_run_iterator.h"
(...skipping 30 matching lines...) Expand all
41 namespace mp4 { 41 namespace mp4 {
42 42
43 class TrackRunIteratorTest : public testing::Test { 43 class TrackRunIteratorTest : public testing::Test {
44 public: 44 public:
45 TrackRunIteratorTest() { 45 TrackRunIteratorTest() {
46 CreateMovie(); 46 CreateMovie();
47 } 47 }
48 48
49 protected: 49 protected:
50 Movie moov_; 50 Movie moov_;
51 LogCB log_cb_;
51 scoped_ptr<TrackRunIterator> iter_; 52 scoped_ptr<TrackRunIterator> iter_;
52 53
53 void CreateMovie() { 54 void CreateMovie() {
54 moov_.header.timescale = 1000; 55 moov_.header.timescale = 1000;
55 moov_.tracks.resize(3); 56 moov_.tracks.resize(3);
56 moov_.extends.tracks.resize(2); 57 moov_.extends.tracks.resize(2);
57 moov_.tracks[0].header.track_id = 1; 58 moov_.tracks[0].header.track_id = 1;
58 moov_.tracks[0].media.header.timescale = kAudioScale; 59 moov_.tracks[0].media.header.timescale = kAudioScale;
59 SampleDescription& desc1 = 60 SampleDescription& desc1 =
60 moov_.tracks[0].media.information.sample_table.description; 61 moov_.tracks[0].media.information.sample_table.description;
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
146 } 147 }
147 148
148 void SetAscending(std::vector<uint32>* vec) { 149 void SetAscending(std::vector<uint32>* vec) {
149 vec->resize(10); 150 vec->resize(10);
150 for (size_t i = 0; i < vec->size(); i++) 151 for (size_t i = 0; i < vec->size(); i++)
151 (*vec)[i] = i+1; 152 (*vec)[i] = i+1;
152 } 153 }
153 }; 154 };
154 155
155 TEST_F(TrackRunIteratorTest, NoRunsTest) { 156 TEST_F(TrackRunIteratorTest, NoRunsTest) {
156 iter_.reset(new TrackRunIterator(&moov_)); 157 iter_.reset(new TrackRunIterator(&moov_, log_cb_));
157 ASSERT_TRUE(iter_->Init(MovieFragment())); 158 ASSERT_TRUE(iter_->Init(MovieFragment()));
158 EXPECT_FALSE(iter_->IsRunValid()); 159 EXPECT_FALSE(iter_->IsRunValid());
159 EXPECT_FALSE(iter_->IsSampleValid()); 160 EXPECT_FALSE(iter_->IsSampleValid());
160 } 161 }
161 162
162 TEST_F(TrackRunIteratorTest, BasicOperationTest) { 163 TEST_F(TrackRunIteratorTest, BasicOperationTest) {
163 iter_.reset(new TrackRunIterator(&moov_)); 164 iter_.reset(new TrackRunIterator(&moov_, log_cb_));
164 MovieFragment moof = CreateFragment(); 165 MovieFragment moof = CreateFragment();
165 166
166 // Test that runs are sorted correctly, and that properties of the initial 167 // Test that runs are sorted correctly, and that properties of the initial
167 // sample of the first run are correct 168 // sample of the first run are correct
168 ASSERT_TRUE(iter_->Init(moof)); 169 ASSERT_TRUE(iter_->Init(moof));
169 EXPECT_TRUE(iter_->IsRunValid()); 170 EXPECT_TRUE(iter_->IsRunValid());
170 EXPECT_FALSE(iter_->is_encrypted()); 171 EXPECT_FALSE(iter_->is_encrypted());
171 EXPECT_EQ(iter_->track_id(), 1u); 172 EXPECT_EQ(iter_->track_id(), 1u);
172 EXPECT_EQ(iter_->sample_offset(), 100); 173 EXPECT_EQ(iter_->sample_offset(), 100);
173 EXPECT_EQ(iter_->sample_size(), 1); 174 EXPECT_EQ(iter_->sample_size(), 1);
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
211 iter_->sample_offset()); 212 iter_->sample_offset());
212 iter_->AdvanceRun(); 213 iter_->AdvanceRun();
213 EXPECT_FALSE(iter_->IsRunValid()); 214 EXPECT_FALSE(iter_->IsRunValid());
214 } 215 }
215 216
216 TEST_F(TrackRunIteratorTest, TrackExtendsDefaultsTest) { 217 TEST_F(TrackRunIteratorTest, TrackExtendsDefaultsTest) {
217 moov_.extends.tracks[0].default_sample_duration = 50; 218 moov_.extends.tracks[0].default_sample_duration = 50;
218 moov_.extends.tracks[0].default_sample_size = 3; 219 moov_.extends.tracks[0].default_sample_size = 3;
219 moov_.extends.tracks[0].default_sample_flags = 220 moov_.extends.tracks[0].default_sample_flags =
220 kSampleIsDifferenceSampleFlagMask; 221 kSampleIsDifferenceSampleFlagMask;
221 iter_.reset(new TrackRunIterator(&moov_)); 222 iter_.reset(new TrackRunIterator(&moov_, log_cb_));
222 MovieFragment moof = CreateFragment(); 223 MovieFragment moof = CreateFragment();
223 moof.tracks[0].header.has_default_sample_flags = false; 224 moof.tracks[0].header.has_default_sample_flags = false;
224 moof.tracks[0].header.default_sample_size = 0; 225 moof.tracks[0].header.default_sample_size = 0;
225 moof.tracks[0].header.default_sample_duration = 0; 226 moof.tracks[0].header.default_sample_duration = 0;
226 moof.tracks[0].runs[0].sample_sizes.clear(); 227 moof.tracks[0].runs[0].sample_sizes.clear();
227 ASSERT_TRUE(iter_->Init(moof)); 228 ASSERT_TRUE(iter_->Init(moof));
228 iter_->AdvanceSample(); 229 iter_->AdvanceSample();
229 EXPECT_FALSE(iter_->is_keyframe()); 230 EXPECT_FALSE(iter_->is_keyframe());
230 EXPECT_EQ(iter_->sample_size(), 3); 231 EXPECT_EQ(iter_->sample_size(), 3);
231 EXPECT_EQ(iter_->sample_offset(), moof.tracks[0].runs[0].data_offset + 3); 232 EXPECT_EQ(iter_->sample_offset(), moof.tracks[0].runs[0].data_offset + 3);
232 EXPECT_EQ(iter_->duration(), TimeDeltaFromRational(50, kAudioScale)); 233 EXPECT_EQ(iter_->duration(), TimeDeltaFromRational(50, kAudioScale));
233 EXPECT_EQ(iter_->dts(), TimeDeltaFromRational(50, kAudioScale)); 234 EXPECT_EQ(iter_->dts(), TimeDeltaFromRational(50, kAudioScale));
234 } 235 }
235 236
236 TEST_F(TrackRunIteratorTest, FirstSampleFlagTest) { 237 TEST_F(TrackRunIteratorTest, FirstSampleFlagTest) {
237 // Ensure that keyframes are flagged correctly in the face of BMFF boxes which 238 // Ensure that keyframes are flagged correctly in the face of BMFF boxes which
238 // explicitly specify the flags for the first sample in a run and rely on 239 // explicitly specify the flags for the first sample in a run and rely on
239 // defaults for all subsequent samples 240 // defaults for all subsequent samples
240 iter_.reset(new TrackRunIterator(&moov_)); 241 iter_.reset(new TrackRunIterator(&moov_, log_cb_));
241 MovieFragment moof = CreateFragment(); 242 MovieFragment moof = CreateFragment();
242 moof.tracks[1].header.has_default_sample_flags = true; 243 moof.tracks[1].header.has_default_sample_flags = true;
243 moof.tracks[1].header.default_sample_flags = 244 moof.tracks[1].header.default_sample_flags =
244 kSampleIsDifferenceSampleFlagMask; 245 kSampleIsDifferenceSampleFlagMask;
245 moof.tracks[1].runs[0].sample_flags.resize(1); 246 moof.tracks[1].runs[0].sample_flags.resize(1);
246 ASSERT_TRUE(iter_->Init(moof)); 247 ASSERT_TRUE(iter_->Init(moof));
247 iter_->AdvanceRun(); 248 iter_->AdvanceRun();
248 EXPECT_TRUE(iter_->is_keyframe()); 249 EXPECT_TRUE(iter_->is_keyframe());
249 iter_->AdvanceSample(); 250 iter_->AdvanceSample();
250 EXPECT_FALSE(iter_->is_keyframe()); 251 EXPECT_FALSE(iter_->is_keyframe());
251 } 252 }
252 253
253 TEST_F(TrackRunIteratorTest, MinDecodeTest) { 254 TEST_F(TrackRunIteratorTest, MinDecodeTest) {
254 iter_.reset(new TrackRunIterator(&moov_)); 255 iter_.reset(new TrackRunIterator(&moov_, log_cb_));
255 MovieFragment moof = CreateFragment(); 256 MovieFragment moof = CreateFragment();
256 moof.tracks[0].decode_time.decode_time = kAudioScale; 257 moof.tracks[0].decode_time.decode_time = kAudioScale;
257 ASSERT_TRUE(iter_->Init(moof)); 258 ASSERT_TRUE(iter_->Init(moof));
258 EXPECT_EQ(TimeDeltaFromRational(moof.tracks[1].decode_time.decode_time, 259 EXPECT_EQ(TimeDeltaFromRational(moof.tracks[1].decode_time.decode_time,
259 kVideoScale), 260 kVideoScale),
260 iter_->GetMinDecodeTimestamp()); 261 iter_->GetMinDecodeTimestamp());
261 } 262 }
262 263
263 TEST_F(TrackRunIteratorTest, ReorderingTest) { 264 TEST_F(TrackRunIteratorTest, ReorderingTest) {
264 // Test frame reordering and edit list support. The frames have the following 265 // Test frame reordering and edit list support. The frames have the following
265 // decode timestamps: 266 // decode timestamps:
266 // 267 //
267 // 0ms 40ms 120ms 240ms 268 // 0ms 40ms 120ms 240ms
268 // | 0 | 1 - | 2 - - | 269 // | 0 | 1 - | 2 - - |
269 // 270 //
270 // ...and these composition timestamps, after edit list adjustment: 271 // ...and these composition timestamps, after edit list adjustment:
271 // 272 //
272 // 0ms 40ms 160ms 240ms 273 // 0ms 40ms 160ms 240ms
273 // | 0 | 2 - - | 1 - | 274 // | 0 | 2 - - | 1 - |
274 275
275 // Create an edit list with one entry, with an initial start time of 80ms 276 // Create an edit list with one entry, with an initial start time of 80ms
276 // (that is, 2 / kVideoTimescale) and a duration of zero (which is treated as 277 // (that is, 2 / kVideoTimescale) and a duration of zero (which is treated as
277 // infinite according to 14496-12:2012). This will cause the first 80ms of the 278 // infinite according to 14496-12:2012). This will cause the first 80ms of the
278 // media timeline - which will be empty, due to CTS biasing - to be discarded. 279 // media timeline - which will be empty, due to CTS biasing - to be discarded.
279 iter_.reset(new TrackRunIterator(&moov_)); 280 iter_.reset(new TrackRunIterator(&moov_, log_cb_));
280 EditListEntry entry; 281 EditListEntry entry;
281 entry.segment_duration = 0; 282 entry.segment_duration = 0;
282 entry.media_time = 2; 283 entry.media_time = 2;
283 entry.media_rate_integer = 1; 284 entry.media_rate_integer = 1;
284 entry.media_rate_fraction = 0; 285 entry.media_rate_fraction = 0;
285 moov_.tracks[1].edit.list.edits.push_back(entry); 286 moov_.tracks[1].edit.list.edits.push_back(entry);
286 287
287 // Add CTS offsets. Without bias, the CTS offsets for the first three frames 288 // Add CTS offsets. Without bias, the CTS offsets for the first three frames
288 // would simply be [0, 3, -2]. Since CTS offsets should be non-negative for 289 // would simply be [0, 3, -2]. Since CTS offsets should be non-negative for
289 // maximum compatibility, these values are biased up to [2, 5, 0], and the 290 // maximum compatibility, these values are biased up to [2, 5, 0], and the
(...skipping 16 matching lines...) Expand all
306 EXPECT_EQ(iter_->dts(), TimeDeltaFromRational(1, kVideoScale)); 307 EXPECT_EQ(iter_->dts(), TimeDeltaFromRational(1, kVideoScale));
307 EXPECT_EQ(iter_->cts(), TimeDeltaFromRational(4, kVideoScale)); 308 EXPECT_EQ(iter_->cts(), TimeDeltaFromRational(4, kVideoScale));
308 EXPECT_EQ(iter_->duration(), TimeDeltaFromRational(2, kVideoScale)); 309 EXPECT_EQ(iter_->duration(), TimeDeltaFromRational(2, kVideoScale));
309 iter_->AdvanceSample(); 310 iter_->AdvanceSample();
310 EXPECT_EQ(iter_->dts(), TimeDeltaFromRational(3, kVideoScale)); 311 EXPECT_EQ(iter_->dts(), TimeDeltaFromRational(3, kVideoScale));
311 EXPECT_EQ(iter_->cts(), TimeDeltaFromRational(1, kVideoScale)); 312 EXPECT_EQ(iter_->cts(), TimeDeltaFromRational(1, kVideoScale));
312 EXPECT_EQ(iter_->duration(), TimeDeltaFromRational(3, kVideoScale)); 313 EXPECT_EQ(iter_->duration(), TimeDeltaFromRational(3, kVideoScale));
313 } 314 }
314 315
315 TEST_F(TrackRunIteratorTest, IgnoreUnknownAuxInfoTest) { 316 TEST_F(TrackRunIteratorTest, IgnoreUnknownAuxInfoTest) {
316 iter_.reset(new TrackRunIterator(&moov_)); 317 iter_.reset(new TrackRunIterator(&moov_, log_cb_));
317 MovieFragment moof = CreateFragment(); 318 MovieFragment moof = CreateFragment();
318 moof.tracks[1].auxiliary_offset.offsets.push_back(50); 319 moof.tracks[1].auxiliary_offset.offsets.push_back(50);
319 moof.tracks[1].auxiliary_size.default_sample_info_size = 2; 320 moof.tracks[1].auxiliary_size.default_sample_info_size = 2;
320 moof.tracks[1].auxiliary_size.sample_count = 2; 321 moof.tracks[1].auxiliary_size.sample_count = 2;
321 moof.tracks[1].runs[0].sample_count = 2; 322 moof.tracks[1].runs[0].sample_count = 2;
322 ASSERT_TRUE(iter_->Init(moof)); 323 ASSERT_TRUE(iter_->Init(moof));
323 iter_->AdvanceRun(); 324 iter_->AdvanceRun();
324 EXPECT_FALSE(iter_->AuxInfoNeedsToBeCached()); 325 EXPECT_FALSE(iter_->AuxInfoNeedsToBeCached());
325 } 326 }
326 327
327 TEST_F(TrackRunIteratorTest, DecryptConfigTest) { 328 TEST_F(TrackRunIteratorTest, DecryptConfigTest) {
328 AddEncryption(&moov_.tracks[1]); 329 AddEncryption(&moov_.tracks[1]);
329 iter_.reset(new TrackRunIterator(&moov_)); 330 iter_.reset(new TrackRunIterator(&moov_, log_cb_));
330 331
331 MovieFragment moof = CreateFragment(); 332 MovieFragment moof = CreateFragment();
332 AddAuxInfoHeaders(50, &moof.tracks[1]); 333 AddAuxInfoHeaders(50, &moof.tracks[1]);
333 334
334 ASSERT_TRUE(iter_->Init(moof)); 335 ASSERT_TRUE(iter_->Init(moof));
335 336
336 // The run for track 2 will be first, since its aux info offset is the first 337 // The run for track 2 will be first, since its aux info offset is the first
337 // element in the file. 338 // element in the file.
338 EXPECT_EQ(iter_->track_id(), 2u); 339 EXPECT_EQ(iter_->track_id(), 2u);
339 EXPECT_TRUE(iter_->is_encrypted()); 340 EXPECT_TRUE(iter_->is_encrypted());
(...skipping 19 matching lines...) Expand all
359 config = iter_->GetDecryptConfig(); 360 config = iter_->GetDecryptConfig();
360 EXPECT_EQ(config->subsamples().size(), 2u); 361 EXPECT_EQ(config->subsamples().size(), 2u);
361 EXPECT_EQ(config->subsamples()[0].clear_bytes, 1u); 362 EXPECT_EQ(config->subsamples()[0].clear_bytes, 1u);
362 EXPECT_EQ(config->subsamples()[1].cypher_bytes, 4u); 363 EXPECT_EQ(config->subsamples()[1].cypher_bytes, 4u);
363 } 364 }
364 365
365 // It is legal for aux info blocks to be shared among multiple formats. 366 // It is legal for aux info blocks to be shared among multiple formats.
366 TEST_F(TrackRunIteratorTest, SharedAuxInfoTest) { 367 TEST_F(TrackRunIteratorTest, SharedAuxInfoTest) {
367 AddEncryption(&moov_.tracks[0]); 368 AddEncryption(&moov_.tracks[0]);
368 AddEncryption(&moov_.tracks[1]); 369 AddEncryption(&moov_.tracks[1]);
369 iter_.reset(new TrackRunIterator(&moov_)); 370 iter_.reset(new TrackRunIterator(&moov_, log_cb_));
370 371
371 MovieFragment moof = CreateFragment(); 372 MovieFragment moof = CreateFragment();
372 moof.tracks[0].runs.resize(1); 373 moof.tracks[0].runs.resize(1);
373 AddAuxInfoHeaders(50, &moof.tracks[0]); 374 AddAuxInfoHeaders(50, &moof.tracks[0]);
374 AddAuxInfoHeaders(50, &moof.tracks[1]); 375 AddAuxInfoHeaders(50, &moof.tracks[1]);
375 moof.tracks[0].auxiliary_size.default_sample_info_size = 8; 376 moof.tracks[0].auxiliary_size.default_sample_info_size = 8;
376 377
377 ASSERT_TRUE(iter_->Init(moof)); 378 ASSERT_TRUE(iter_->Init(moof));
378 EXPECT_EQ(iter_->track_id(), 1u); 379 EXPECT_EQ(iter_->track_id(), 1u);
379 EXPECT_EQ(iter_->aux_info_offset(), 50); 380 EXPECT_EQ(iter_->aux_info_offset(), 50);
(...skipping 21 matching lines...) Expand all
401 // unreasonable behavior demonstrated here: 402 // unreasonable behavior demonstrated here:
402 // byte 50: track 2, run 1 aux info 403 // byte 50: track 2, run 1 aux info
403 // byte 100: track 1, run 1 data 404 // byte 100: track 1, run 1 data
404 // byte 200: track 2, run 1 data 405 // byte 200: track 2, run 1 data
405 // byte 201: track 1, run 2 aux info (*inside* track 2, run 1 data) 406 // byte 201: track 1, run 2 aux info (*inside* track 2, run 1 data)
406 // byte 10000: track 1, run 2 data 407 // byte 10000: track 1, run 2 data
407 // byte 20000: track 1, run 1 aux info 408 // byte 20000: track 1, run 1 aux info
408 TEST_F(TrackRunIteratorTest, UnexpectedOrderingTest) { 409 TEST_F(TrackRunIteratorTest, UnexpectedOrderingTest) {
409 AddEncryption(&moov_.tracks[0]); 410 AddEncryption(&moov_.tracks[0]);
410 AddEncryption(&moov_.tracks[1]); 411 AddEncryption(&moov_.tracks[1]);
411 iter_.reset(new TrackRunIterator(&moov_)); 412 iter_.reset(new TrackRunIterator(&moov_, log_cb_));
412 413
413 MovieFragment moof = CreateFragment(); 414 MovieFragment moof = CreateFragment();
414 AddAuxInfoHeaders(20000, &moof.tracks[0]); 415 AddAuxInfoHeaders(20000, &moof.tracks[0]);
415 moof.tracks[0].auxiliary_offset.offsets.push_back(201); 416 moof.tracks[0].auxiliary_offset.offsets.push_back(201);
416 moof.tracks[0].auxiliary_size.sample_count += 2; 417 moof.tracks[0].auxiliary_size.sample_count += 2;
417 moof.tracks[0].auxiliary_size.default_sample_info_size = 8; 418 moof.tracks[0].auxiliary_size.default_sample_info_size = 8;
418 moof.tracks[0].runs[1].sample_count = 2; 419 moof.tracks[0].runs[1].sample_count = 2;
419 AddAuxInfoHeaders(50, &moof.tracks[1]); 420 AddAuxInfoHeaders(50, &moof.tracks[1]);
420 moof.tracks[1].runs[0].sample_sizes[0] = 5; 421 moof.tracks[1].runs[0].sample_sizes[0] = 5;
421 422
(...skipping 15 matching lines...) Expand all
437 EXPECT_EQ(iter_->track_id(), 1u); 438 EXPECT_EQ(iter_->track_id(), 1u);
438 EXPECT_EQ(iter_->aux_info_offset(), 201); 439 EXPECT_EQ(iter_->aux_info_offset(), 201);
439 EXPECT_EQ(iter_->sample_offset(), 10000); 440 EXPECT_EQ(iter_->sample_offset(), 10000);
440 EXPECT_EQ(iter_->GetMaxClearOffset(), 201); 441 EXPECT_EQ(iter_->GetMaxClearOffset(), 201);
441 EXPECT_TRUE(iter_->CacheAuxInfo(kAuxInfo, arraysize(kAuxInfo))); 442 EXPECT_TRUE(iter_->CacheAuxInfo(kAuxInfo, arraysize(kAuxInfo)));
442 EXPECT_EQ(iter_->GetMaxClearOffset(), 10000); 443 EXPECT_EQ(iter_->GetMaxClearOffset(), 10000);
443 } 444 }
444 445
445 } // namespace mp4 446 } // namespace mp4
446 } // namespace media 447 } // namespace media
OLDNEW
« no previous file with comments | « media/mp4/track_run_iterator.cc ('k') | media/webm/webm_cluster_parser.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698