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

Side by Side Diff: media/base/android/media_source_player_unittest.cc

Issue 113963005: Use decoder's timestamp instead of the timestamp from AU during prerolling (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: addressing comments Created 6 years, 11 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
« no previous file with comments | « media/base/android/media_decoder_job.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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 <string> 5 #include <string>
6 6
7 #include "base/basictypes.h" 7 #include "base/basictypes.h"
8 #include "base/memory/scoped_ptr.h" 8 #include "base/memory/scoped_ptr.h"
9 #include "base/strings/stringprintf.h" 9 #include "base/strings/stringprintf.h"
10 #include "media/base/android/media_codec_bridge.h" 10 #include "media/base/android/media_codec_bridge.h"
(...skipping 413 matching lines...) Expand 10 before | Expand all | Expand 10 after
424 // Send back the seek done notification. This should trigger the player to 424 // Send back the seek done notification. This should trigger the player to
425 // call OnReadFromDemuxer() again. 425 // call OnReadFromDemuxer() again.
426 EXPECT_EQ(original_num_data_requests, demuxer_->num_data_requests()); 426 EXPECT_EQ(original_num_data_requests, demuxer_->num_data_requests());
427 player_.OnDemuxerSeekDone(kNoTimestamp()); 427 player_.OnDemuxerSeekDone(kNoTimestamp());
428 EXPECT_EQ(original_num_data_requests + 1, demuxer_->num_data_requests()); 428 EXPECT_EQ(original_num_data_requests + 1, demuxer_->num_data_requests());
429 429
430 // No other seek should have been requested. 430 // No other seek should have been requested.
431 EXPECT_EQ(original_num_seeks + 1, demuxer_->num_seek_requests()); 431 EXPECT_EQ(original_num_seeks + 1, demuxer_->num_seek_requests());
432 } 432 }
433 433
434 // Preroll the decoder job to |target_timestamp|. The first access unit
435 // to decode will have a timestamp equal to |start_timestamp|.
436 // TODO(qinmin): Add additional test cases for out-of-order decodes.
wolenetz 2014/01/02 23:24:22 nit: I would prefer we add a Chromium bug to track
qinmin 2014/01/02 23:35:22 Done.
437 void PrerollDecoderToTime(bool is_audio,
438 const base::TimeDelta& start_timestamp,
439 const base::TimeDelta& target_timestamp) {
440 EXPECT_EQ(target_timestamp, player_.GetCurrentTime());
441 // |start_timestamp| must be smaller than |target_timestamp|.
442 EXPECT_LE(start_timestamp, target_timestamp);
443 DemuxerData data = is_audio ? CreateReadFromDemuxerAckForAudio(1) :
444 CreateReadFromDemuxerAckForVideo();
445 int current_timestamp = start_timestamp.InMilliseconds();
446
447 // Send some data with access unit timestamps before the |target_timestamp|,
448 // and continue sending the data until preroll finishes.
449 // This simulates the common condition that AUs received after browser
450 // seek begin with timestamps before the seek target, and don't
451 // immediately complete preroll.
452 while (IsPrerolling(is_audio)) {
453 data.access_units[0].timestamp =
454 base::TimeDelta::FromMilliseconds(current_timestamp);
455 player_.OnDemuxerDataAvailable(data);
456 EXPECT_TRUE(GetMediaDecoderJob(is_audio)->is_decoding());
457 EXPECT_EQ(target_timestamp, player_.GetCurrentTime());
458 current_timestamp += 30;
459 message_loop_.Run();
460 }
461 EXPECT_LT(target_timestamp, player_.GetCurrentTime());
wolenetz 2014/01/02 23:24:22 It's possible that prerolling has completed and th
qinmin 2014/01/02 23:35:22 Done.
462 }
463
434 DemuxerData CreateReadFromDemuxerAckWithConfigChanged(bool is_audio, 464 DemuxerData CreateReadFromDemuxerAckWithConfigChanged(bool is_audio,
435 int config_unit_index) { 465 int config_unit_index) {
436 DemuxerData data; 466 DemuxerData data;
437 data.type = is_audio ? DemuxerStream::AUDIO : DemuxerStream::VIDEO; 467 data.type = is_audio ? DemuxerStream::AUDIO : DemuxerStream::VIDEO;
438 data.access_units.resize(config_unit_index + 1); 468 data.access_units.resize(config_unit_index + 1);
439 469
440 for (int i = 0; i < config_unit_index; ++i) 470 for (int i = 0; i < config_unit_index; ++i)
441 data.access_units[i] = CreateAccessUnitWithData(is_audio, i); 471 data.access_units[i] = CreateAccessUnitWithData(is_audio, i);
442 472
443 data.access_units[config_unit_index].status = DemuxerStream::kConfigChanged; 473 data.access_units[config_unit_index].status = DemuxerStream::kConfigChanged;
(...skipping 896 matching lines...) Expand 10 before | Expand all | Expand 10 after
1340 } 1370 }
1341 1371
1342 TEST_F(MediaSourcePlayerTest, PrerollAudioAfterSeek) { 1372 TEST_F(MediaSourcePlayerTest, PrerollAudioAfterSeek) {
1343 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); 1373 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE();
1344 1374
1345 // Test decoder job will preroll the media to the seek position. 1375 // Test decoder job will preroll the media to the seek position.
1346 StartAudioDecoderJob(true); 1376 StartAudioDecoderJob(true);
1347 1377
1348 SeekPlayerWithAbort(true, base::TimeDelta::FromMilliseconds(100)); 1378 SeekPlayerWithAbort(true, base::TimeDelta::FromMilliseconds(100));
1349 EXPECT_TRUE(IsPrerolling(true)); 1379 EXPECT_TRUE(IsPrerolling(true));
1350 EXPECT_EQ(100.0, GetPrerollTimestamp().InMillisecondsF()); 1380 PrerollDecoderToTime(
1351 1381 true, base::TimeDelta(), base::TimeDelta::FromMilliseconds(100));
1352 // Send some data before the seek position.
1353 for (int i = 1; i < 4; ++i) {
1354 player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForAudio(i));
1355 EXPECT_TRUE(GetMediaDecoderJob(true)->is_decoding());
1356 message_loop_.Run();
1357 }
1358 EXPECT_EQ(100.0, player_.GetCurrentTime().InMillisecondsF());
1359 EXPECT_TRUE(IsPrerolling(true));
1360
1361 // Send data after the seek position.
1362 DemuxerData data = CreateReadFromDemuxerAckForAudio(3);
1363 data.access_units[0].timestamp = base::TimeDelta::FromMilliseconds(100);
1364 player_.OnDemuxerDataAvailable(data);
1365 message_loop_.Run();
1366 EXPECT_LT(100.0, player_.GetCurrentTime().InMillisecondsF());
1367 EXPECT_FALSE(IsPrerolling(true));
1368 } 1382 }
1369 1383
1370 TEST_F(MediaSourcePlayerTest, PrerollVideoAfterSeek) { 1384 TEST_F(MediaSourcePlayerTest, PrerollVideoAfterSeek) {
1371 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); 1385 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE();
1372 1386
1373 // Test decoder job will preroll the media to the seek position. 1387 // Test decoder job will preroll the media to the seek position.
1374 CreateNextTextureAndSetVideoSurface(); 1388 CreateNextTextureAndSetVideoSurface();
1375 StartVideoDecoderJob(true); 1389 StartVideoDecoderJob(true);
1376 1390
1377 SeekPlayerWithAbort(false, base::TimeDelta::FromMilliseconds(100)); 1391 SeekPlayerWithAbort(false, base::TimeDelta::FromMilliseconds(100));
1378 EXPECT_TRUE(IsPrerolling(false)); 1392 EXPECT_TRUE(IsPrerolling(false));
1379 EXPECT_EQ(100.0, GetPrerollTimestamp().InMillisecondsF()); 1393 PrerollDecoderToTime(
1380 1394 false, base::TimeDelta(), base::TimeDelta::FromMilliseconds(100));
1381 // Send some data before the seek position.
1382 DemuxerData data;
1383 for (int i = 1; i < 4; ++i) {
1384 data = CreateReadFromDemuxerAckForVideo();
1385 data.access_units[0].timestamp = base::TimeDelta::FromMilliseconds(i * 30);
1386 player_.OnDemuxerDataAvailable(data);
1387 EXPECT_TRUE(GetMediaDecoderJob(false)->is_decoding());
1388 message_loop_.Run();
1389 }
1390 EXPECT_EQ(100.0, player_.GetCurrentTime().InMillisecondsF());
1391 EXPECT_TRUE(IsPrerolling(false));
1392
1393 // Send data at the seek position.
1394 data = CreateReadFromDemuxerAckForVideo();
1395 data.access_units[0].timestamp = base::TimeDelta::FromMilliseconds(100);
1396 player_.OnDemuxerDataAvailable(data);
1397 message_loop_.Run();
1398
1399 // TODO(wolenetz/qinmin): Player's maintenance of current time for video-only
1400 // streams depends on decoder output, which may be initially inaccurate, and
1401 // encoded video test data may also need updating. Verify at least that AU
1402 // timestamp-based preroll logic has determined video preroll has completed.
1403 // See http://crbug.com/310823 and http://b/11356652.
1404 EXPECT_FALSE(IsPrerolling(false));
1405 } 1395 }
1406 1396
1407 TEST_F(MediaSourcePlayerTest, SeekingAfterCompletingPrerollRestartsPreroll) { 1397 TEST_F(MediaSourcePlayerTest, SeekingAfterCompletingPrerollRestartsPreroll) {
1408 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); 1398 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE();
1409 1399
1410 // Test decoder job will begin prerolling upon seek, when it was not 1400 // Test decoder job will begin prerolling upon seek, when it was not
1411 // prerolling prior to the seek. 1401 // prerolling prior to the seek.
1412 StartAudioDecoderJob(true); 1402 StartAudioDecoderJob(true);
1413 MediaDecoderJob* decoder_job = GetMediaDecoderJob(true); 1403 MediaDecoderJob* decoder_job = GetMediaDecoderJob(true);
1414 EXPECT_TRUE(IsPrerolling(true)); 1404 EXPECT_TRUE(IsPrerolling(true));
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
1446 EXPECT_EQ(decoder_job, GetMediaDecoderJob(true)); 1436 EXPECT_EQ(decoder_job, GetMediaDecoderJob(true));
1447 } 1437 }
1448 1438
1449 TEST_F(MediaSourcePlayerTest, PrerollContinuesAcrossReleaseAndStart) { 1439 TEST_F(MediaSourcePlayerTest, PrerollContinuesAcrossReleaseAndStart) {
1450 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); 1440 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE();
1451 1441
1452 // Test decoder job will resume media prerolling if interrupted by Release() 1442 // Test decoder job will resume media prerolling if interrupted by Release()
1453 // and Start(). 1443 // and Start().
1454 StartAudioDecoderJob(true); 1444 StartAudioDecoderJob(true);
1455 1445
1456 SeekPlayerWithAbort(true, base::TimeDelta::FromMilliseconds(100)); 1446 base::TimeDelta target_timestamp = base::TimeDelta::FromMilliseconds(100);
1447 SeekPlayerWithAbort(true, target_timestamp);
1457 EXPECT_TRUE(IsPrerolling(true)); 1448 EXPECT_TRUE(IsPrerolling(true));
1458 EXPECT_EQ(100.0, GetPrerollTimestamp().InMillisecondsF()); 1449 EXPECT_EQ(100.0, GetPrerollTimestamp().InMillisecondsF());
1459 1450
1460 // Send some data before the seek position. 1451 // Send some data before the seek position.
1461 // Test uses 'large' number of iterations because decoder job may not get 1452 // Test uses 'large' number of iterations because decoder job may not get
1462 // MEDIA_CODEC_OK output status until after a few dequeue output attempts. 1453 // MEDIA_CODEC_OK output status until after a few dequeue output attempts.
1463 // This allows decoder status to stabilize prior to AU timestamp reaching 1454 // This allows decoder status to stabilize prior to AU timestamp reaching
1464 // the preroll target. 1455 // the preroll target.
1465 DemuxerData data; 1456 DemuxerData data;
1466 for (int i = 0; i < 10; ++i) { 1457 for (int i = 0; i < 10; ++i) {
(...skipping 18 matching lines...) Expand all
1485 player_.OnDemuxerDataAvailable(data); 1476 player_.OnDemuxerDataAvailable(data);
1486 EXPECT_TRUE(GetMediaDecoderJob(true)->is_decoding()); 1477 EXPECT_TRUE(GetMediaDecoderJob(true)->is_decoding());
1487 message_loop_.Run(); 1478 message_loop_.Run();
1488 } 1479 }
1489 EXPECT_TRUE(IsPrerolling(true)); 1480 EXPECT_TRUE(IsPrerolling(true));
1490 } 1481 }
1491 EXPECT_EQ(100.0, player_.GetCurrentTime().InMillisecondsF()); 1482 EXPECT_EQ(100.0, player_.GetCurrentTime().InMillisecondsF());
1492 EXPECT_TRUE(IsPrerolling(true)); 1483 EXPECT_TRUE(IsPrerolling(true));
1493 1484
1494 // Send data after the seek position. 1485 // Send data after the seek position.
1495 data = CreateReadFromDemuxerAckForAudio(3); 1486 PrerollDecoderToTime(true, target_timestamp, target_timestamp);
1496 data.access_units[0].timestamp = base::TimeDelta::FromMilliseconds(100);
1497 player_.OnDemuxerDataAvailable(data);
1498 message_loop_.Run();
1499 EXPECT_LT(100.0, player_.GetCurrentTime().InMillisecondsF());
1500 EXPECT_FALSE(IsPrerolling(true));
1501 } 1487 }
1502 1488
1503 TEST_F(MediaSourcePlayerTest, PrerollContinuesAcrossConfigChange) { 1489 TEST_F(MediaSourcePlayerTest, PrerollContinuesAcrossConfigChange) {
1504 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); 1490 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE();
1505 1491
1506 // Test decoder job will resume media prerolling if interrupted by 1492 // Test decoder job will resume media prerolling if interrupted by
1507 // |kConfigChanged| and OnDemuxerConfigsAvailable(). 1493 // |kConfigChanged| and OnDemuxerConfigsAvailable().
1508 StartAudioDecoderJob(true); 1494 StartAudioDecoderJob(true);
1509 1495
1510 SeekPlayerWithAbort(true, base::TimeDelta::FromMilliseconds(100)); 1496 SeekPlayerWithAbort(true, base::TimeDelta::FromMilliseconds(100));
1511 EXPECT_TRUE(IsPrerolling(true)); 1497 EXPECT_TRUE(IsPrerolling(true));
1512 EXPECT_EQ(100.0, GetPrerollTimestamp().InMillisecondsF()); 1498 EXPECT_EQ(100.0, GetPrerollTimestamp().InMillisecondsF());
1513 1499
1514 // In response to data request, simulate that demuxer signals config change by 1500 // In response to data request, simulate that demuxer signals config change by
1515 // sending an AU with |kConfigChanged|. Player should prepare to reconfigure 1501 // sending an AU with |kConfigChanged|. Player should prepare to reconfigure
1516 // the audio decoder job, and should request new demuxer configs. 1502 // the audio decoder job, and should request new demuxer configs.
1517 DemuxerData data = CreateReadFromDemuxerAckWithConfigChanged(true, 0); 1503 DemuxerData data = CreateReadFromDemuxerAckWithConfigChanged(true, 0);
1518 EXPECT_EQ(0, demuxer_->num_config_requests()); 1504 EXPECT_EQ(0, demuxer_->num_config_requests());
1519 player_.OnDemuxerDataAvailable(data); 1505 player_.OnDemuxerDataAvailable(data);
1520 EXPECT_EQ(1, demuxer_->num_config_requests()); 1506 EXPECT_EQ(1, demuxer_->num_config_requests());
1521 1507
1522 // Simulate arrival of new configs. 1508 // Simulate arrival of new configs.
1523 player_.OnDemuxerConfigsAvailable(CreateAudioDemuxerConfigs(kCodecVorbis)); 1509 player_.OnDemuxerConfigsAvailable(CreateAudioDemuxerConfigs(kCodecVorbis));
1524 1510
1525 // Send some data before the seek position. 1511 PrerollDecoderToTime(
1526 for (int i = 1; i < 4; ++i) { 1512 true, base::TimeDelta(), base::TimeDelta::FromMilliseconds(100));
1527 player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForAudio(i));
1528 EXPECT_TRUE(GetMediaDecoderJob(true)->is_decoding());
1529 message_loop_.Run();
1530 }
1531 EXPECT_EQ(100.0, player_.GetCurrentTime().InMillisecondsF());
1532 EXPECT_TRUE(IsPrerolling(true));
1533
1534 // Send data after the seek position.
1535 data = CreateReadFromDemuxerAckForAudio(3);
1536 data.access_units[0].timestamp = base::TimeDelta::FromMilliseconds(100);
1537 player_.OnDemuxerDataAvailable(data);
1538 message_loop_.Run();
1539 EXPECT_LT(100.0, player_.GetCurrentTime().InMillisecondsF());
1540 EXPECT_FALSE(IsPrerolling(true));
1541 } 1513 }
1542 1514
1543 TEST_F(MediaSourcePlayerTest, SimultaneousAudioVideoConfigChange) { 1515 TEST_F(MediaSourcePlayerTest, SimultaneousAudioVideoConfigChange) {
1544 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); 1516 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE();
1545 1517
1546 // Test that the player allows simultaneous audio and video config change, 1518 // Test that the player allows simultaneous audio and video config change,
1547 // such as might occur during OnPrefetchDone() if next access unit for both 1519 // such as might occur during OnPrefetchDone() if next access unit for both
1548 // audio and video jobs is |kConfigChanged|. 1520 // audio and video jobs is |kConfigChanged|.
1549 CreateNextTextureAndSetVideoSurface(); 1521 CreateNextTextureAndSetVideoSurface();
1550 Start(CreateAudioVideoDemuxerConfigs(), true); 1522 Start(CreateAudioVideoDemuxerConfigs(), true);
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
1626 BrowserSeekPlayer(false); 1598 BrowserSeekPlayer(false);
1627 1599
1628 // Simulate browser seek is done, but to a later time than was requested. 1600 // Simulate browser seek is done, but to a later time than was requested.
1629 EXPECT_LT(player_.GetCurrentTime().InMillisecondsF(), 100); 1601 EXPECT_LT(player_.GetCurrentTime().InMillisecondsF(), 100);
1630 player_.OnDemuxerSeekDone(base::TimeDelta::FromMilliseconds(100)); 1602 player_.OnDemuxerSeekDone(base::TimeDelta::FromMilliseconds(100));
1631 EXPECT_TRUE(GetMediaDecoderJob(false)); 1603 EXPECT_TRUE(GetMediaDecoderJob(false));
1632 EXPECT_EQ(100.0, player_.GetCurrentTime().InMillisecondsF()); 1604 EXPECT_EQ(100.0, player_.GetCurrentTime().InMillisecondsF());
1633 EXPECT_EQ(100.0, GetPrerollTimestamp().InMillisecondsF()); 1605 EXPECT_EQ(100.0, GetPrerollTimestamp().InMillisecondsF());
1634 EXPECT_EQ(2, demuxer_->num_data_requests()); 1606 EXPECT_EQ(2, demuxer_->num_data_requests());
1635 1607
1636 // Send some data with access unit timestamps before the actual browser seek 1608 PrerollDecoderToTime(
1637 // position. This is a bit unrealistic in this case where the browser seek 1609 false, base::TimeDelta(), base::TimeDelta::FromMilliseconds(100));
1638 // jumped forward and next data from demuxer would normally begin at this
1639 // browser seek position, immediately completing preroll. For simplicity and
1640 // coverage, this test simulates the more common condition that AUs received
1641 // after browser seek begin with timestamps before the seek target, and don't
1642 // immediately complete preroll.
1643 DemuxerData data;
1644 for (int i = 1; i < 4; ++i) {
1645 data = CreateReadFromDemuxerAckForVideo();
1646 data.access_units[0].timestamp = base::TimeDelta::FromMilliseconds(i * 30);
1647 player_.OnDemuxerDataAvailable(data);
1648 EXPECT_TRUE(GetMediaDecoderJob(false)->is_decoding());
1649 message_loop_.Run();
1650 EXPECT_TRUE(IsPrerolling(false));
1651 }
1652
1653 EXPECT_EQ(100.0, player_.GetCurrentTime().InMillisecondsF());
1654
1655 // Send data after the browser seek position.
1656 data = CreateReadFromDemuxerAckForVideo();
1657 data.access_units[0].timestamp = base::TimeDelta::FromMilliseconds(120);
1658 player_.OnDemuxerDataAvailable(data);
1659 message_loop_.Run();
1660 EXPECT_FALSE(IsPrerolling(false));
1661 } 1610 }
1662 1611
1663 TEST_F(MediaSourcePlayerTest, VideoDemuxerConfigChange) { 1612 TEST_F(MediaSourcePlayerTest, VideoDemuxerConfigChange) {
1664 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); 1613 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE();
1665 1614
1666 // Test that video config change notification results in request for demuxer 1615 // Test that video config change notification results in request for demuxer
1667 // configuration, and that a video decoder job results without any browser 1616 // configuration, and that a video decoder job results without any browser
1668 // seek necessary once the new demuxer config arrives. 1617 // seek necessary once the new demuxer config arrives.
1669 StartConfigChange(false, true, 1); 1618 StartConfigChange(false, true, 1);
1670 MediaDecoderJob* first_job = GetMediaDecoderJob(false); 1619 MediaDecoderJob* first_job = GetMediaDecoderJob(false);
(...skipping 442 matching lines...) Expand 10 before | Expand all | Expand 10 after
2113 2062
2114 std::vector<std::string> codec_avc(1, "avc1"); 2063 std::vector<std::string> codec_avc(1, "avc1");
2115 EXPECT_FALSE(IsTypeSupported(invalid_uuid, kL3, kVideoMp4, codec_avc)); 2064 EXPECT_FALSE(IsTypeSupported(invalid_uuid, kL3, kVideoMp4, codec_avc));
2116 EXPECT_FALSE(IsTypeSupported(invalid_uuid, kL1, kVideoMp4, codec_avc)); 2065 EXPECT_FALSE(IsTypeSupported(invalid_uuid, kL1, kVideoMp4, codec_avc));
2117 } 2066 }
2118 2067
2119 // TODO(xhwang): Are these IsTypeSupported tests device specific? 2068 // TODO(xhwang): Are these IsTypeSupported tests device specific?
2120 // TODO(xhwang): Add more IsTypeSupported tests. 2069 // TODO(xhwang): Add more IsTypeSupported tests.
2121 2070
2122 } // namespace media 2071 } // namespace media
OLDNEW
« no previous file with comments | « media/base/android/media_decoder_job.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698