OLD | NEW |
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/logging.h" | 8 #include "base/logging.h" |
9 #include "base/memory/scoped_ptr.h" | 9 #include "base/memory/scoped_ptr.h" |
10 #include "base/strings/stringprintf.h" | 10 #include "base/strings/stringprintf.h" |
(...skipping 584 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
595 demuxer_->num_browser_seek_requests()); | 595 demuxer_->num_browser_seek_requests()); |
596 EXPECT_EQ(expected_num_data_requests, demuxer_->num_data_requests()); | 596 EXPECT_EQ(expected_num_data_requests, demuxer_->num_data_requests()); |
597 } | 597 } |
598 | 598 |
599 // Creates a new media codec bridge and feeds it data ending with a | 599 // Creates a new media codec bridge and feeds it data ending with a |
600 // |kConfigChanged| access unit. If |config_unit_in_prefetch| is true, sends | 600 // |kConfigChanged| access unit. If |config_unit_in_prefetch| is true, sends |
601 // feeds the config change AU in response to the job's first read request | 601 // feeds the config change AU in response to the job's first read request |
602 // (prefetch). If false, regular data is fed and decoded prior to feeding the | 602 // (prefetch). If false, regular data is fed and decoded prior to feeding the |
603 // config change AU in response to the second data request (after prefetch | 603 // config change AU in response to the second data request (after prefetch |
604 // completed). |config_unit_index| controls which access unit is | 604 // completed). |config_unit_index| controls which access unit is |
605 // |kConfigChanged|. | 605 // |kConfigChanged|. If |enable_adaptive_playback| is true, config change will |
| 606 // not cause the decoder to recreate the media codec bridge. Otherwise, the |
| 607 // decoder has to drain all its data before recreating the new codec. |
606 void SendConfigChangeToDecoder(bool is_audio, | 608 void SendConfigChangeToDecoder(bool is_audio, |
607 bool config_unit_in_prefetch, | 609 bool config_unit_in_prefetch, |
608 int config_unit_index) { | 610 int config_unit_index, |
| 611 bool enable_adaptive_playback) { |
609 EXPECT_FALSE(GetMediaCodecBridge(is_audio)); | 612 EXPECT_FALSE(GetMediaCodecBridge(is_audio)); |
610 if (is_audio) { | 613 if (is_audio) { |
611 StartAudioDecoderJob(); | 614 StartAudioDecoderJob(); |
612 } else { | 615 } else { |
613 CreateNextTextureAndSetVideoSurface(); | 616 CreateNextTextureAndSetVideoSurface(); |
614 StartVideoDecoderJob(); | 617 StartVideoDecoderJob(); |
615 } | 618 } |
616 | 619 |
617 int expected_num_data_requests = demuxer_->num_data_requests(); | 620 int expected_num_data_requests = demuxer_->num_data_requests(); |
618 // Feed and decode a standalone access unit so the player exits prefetch. | 621 // Feed and decode a standalone access unit so the player exits prefetch. |
619 if (!config_unit_in_prefetch) { | 622 if (!config_unit_in_prefetch) { |
620 if (is_audio) | 623 if (is_audio) { |
621 player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForAudio(0)); | 624 player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForAudio(0)); |
622 else | 625 } else { |
623 player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForVideo()); | 626 player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForVideo()); |
| 627 EnableAdaptiveVideoPlayback(enable_adaptive_playback); |
| 628 } |
624 | 629 |
625 WaitForDecodeDone(is_audio, !is_audio); | 630 WaitForDecodeDone(is_audio, !is_audio); |
626 | 631 |
627 // We should have completed the prefetch phase at this point. | 632 // We should have completed the prefetch phase at this point. |
628 expected_num_data_requests++; | 633 expected_num_data_requests++; |
629 EXPECT_EQ(expected_num_data_requests, demuxer_->num_data_requests()); | 634 EXPECT_EQ(expected_num_data_requests, demuxer_->num_data_requests()); |
630 } | 635 } |
631 | 636 |
632 DemuxerConfigs configs = is_audio ? | 637 DemuxerConfigs configs = is_audio ? |
633 CreateAudioDemuxerConfigs(kCodecAAC, false) : | 638 CreateAudioDemuxerConfigs(kCodecAAC, false) : |
634 CreateVideoDemuxerConfigs(true); | 639 CreateVideoDemuxerConfigs(true); |
635 // Feed and decode access units with data for any units prior to | 640 // Feed and decode access units with data for any units prior to |
636 // |config_unit_index|, and a |kConfigChanged| unit at that index. | 641 // |config_unit_index|, and a |kConfigChanged| unit at that index. |
637 // Player should prepare to reconfigure the decoder job, and should request | 642 // Player should prepare to reconfigure the decoder job, and should request |
638 // new demuxer configs. | 643 // new demuxer configs. |
639 player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckWithConfigChanged( | 644 player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckWithConfigChanged( |
640 is_audio, config_unit_index, configs)); | 645 is_audio, config_unit_index, configs)); |
641 | 646 |
642 expected_num_data_requests++; | 647 expected_num_data_requests++; |
643 EXPECT_EQ(expected_num_data_requests, demuxer_->num_data_requests()); | 648 EXPECT_EQ(expected_num_data_requests, demuxer_->num_data_requests()); |
644 if (is_audio) | 649 if (is_audio) |
645 player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForAudio(0)); | 650 player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForAudio(0)); |
646 else | 651 else |
647 player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForVideo()); | 652 player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForVideo()); |
| 653 |
| 654 // If the adaptive playback setting was not passed to the MediaCodecBridge |
| 655 // earlier, do it here. |
| 656 if (config_unit_in_prefetch && !is_audio) |
| 657 EnableAdaptiveVideoPlayback(enable_adaptive_playback); |
648 } | 658 } |
649 | 659 |
650 // Send a config change to the decoder job and drain the decoder so that the | 660 // Send a config change to the decoder job and drain the decoder so that the |
651 // config change is processed. | 661 // config change is processed. |
652 void StartConfigChange(bool is_audio, | 662 void StartConfigChange(bool is_audio, |
653 bool config_unit_in_prefetch, | 663 bool config_unit_in_prefetch, |
654 int config_unit_index) { | 664 int config_unit_index, |
| 665 bool enable_adaptive_playback) { |
655 SendConfigChangeToDecoder(is_audio, config_unit_in_prefetch, | 666 SendConfigChangeToDecoder(is_audio, config_unit_in_prefetch, |
656 config_unit_index); | 667 config_unit_index, enable_adaptive_playback); |
657 EXPECT_EQ(!config_unit_in_prefetch && config_unit_index == 0, | 668 |
658 IsDrainingDecoder(is_audio)); | 669 EXPECT_EQ(!config_unit_in_prefetch && !enable_adaptive_playback && |
| 670 config_unit_index == 0, IsDrainingDecoder(is_audio)); |
659 int expected_num_data_requests = demuxer_->num_data_requests(); | 671 int expected_num_data_requests = demuxer_->num_data_requests(); |
660 // Run until decoder starts to request new data. | 672 // Run until decoder starts to request new data. |
661 while (demuxer_->num_data_requests() == expected_num_data_requests) | 673 while (demuxer_->num_data_requests() == expected_num_data_requests) |
662 message_loop_.RunUntilIdle(); | 674 message_loop_.RunUntilIdle(); |
663 EXPECT_FALSE(IsDrainingDecoder(is_audio)); | 675 EXPECT_FALSE(IsDrainingDecoder(is_audio)); |
664 } | 676 } |
665 | 677 |
| 678 void EnableAdaptiveVideoPlayback(bool enable) { |
| 679 EXPECT_TRUE(GetMediaCodecBridge(false)); |
| 680 static_cast<VideoCodecBridge*>(GetMediaCodecBridge(false))-> |
| 681 set_adaptive_playback_supported_for_testing( |
| 682 enable ? 1 : 0); |
| 683 } |
| 684 |
666 void CreateNextTextureAndSetVideoSurface() { | 685 void CreateNextTextureAndSetVideoSurface() { |
667 gfx::SurfaceTexture* surface_texture; | 686 gfx::SurfaceTexture* surface_texture; |
668 if (surface_texture_a_is_next_) { | 687 if (surface_texture_a_is_next_) { |
669 surface_texture_a_ = gfx::SurfaceTexture::Create(next_texture_id_++); | 688 surface_texture_a_ = gfx::SurfaceTexture::Create(next_texture_id_++); |
670 surface_texture = surface_texture_a_.get(); | 689 surface_texture = surface_texture_a_.get(); |
671 } else { | 690 } else { |
672 surface_texture_b_ = gfx::SurfaceTexture::Create(next_texture_id_++); | 691 surface_texture_b_ = gfx::SurfaceTexture::Create(next_texture_id_++); |
673 surface_texture = surface_texture_b_.get(); | 692 surface_texture = surface_texture_b_.get(); |
674 } | 693 } |
675 | 694 |
(...skipping 962 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1638 | 1657 |
1639 // Test that the player allows simultaneous audio and video config change, | 1658 // Test that the player allows simultaneous audio and video config change, |
1640 // such as might occur during OnPrefetchDone() if next access unit for both | 1659 // such as might occur during OnPrefetchDone() if next access unit for both |
1641 // audio and video jobs is |kConfigChanged|. | 1660 // audio and video jobs is |kConfigChanged|. |
1642 CreateNextTextureAndSetVideoSurface(); | 1661 CreateNextTextureAndSetVideoSurface(); |
1643 Start(CreateAudioVideoDemuxerConfigs()); | 1662 Start(CreateAudioVideoDemuxerConfigs()); |
1644 player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForAudio(0)); | 1663 player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForAudio(0)); |
1645 player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForVideo()); | 1664 player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForVideo()); |
1646 EXPECT_TRUE(GetMediaCodecBridge(true)); | 1665 EXPECT_TRUE(GetMediaCodecBridge(true)); |
1647 EXPECT_TRUE(GetMediaCodecBridge(false)); | 1666 EXPECT_TRUE(GetMediaCodecBridge(false)); |
| 1667 EnableAdaptiveVideoPlayback(false); |
1648 WaitForAudioVideoDecodeDone(); | 1668 WaitForAudioVideoDecodeDone(); |
1649 | 1669 |
1650 // Simulate audio |kConfigChanged| prefetched as standalone access unit. | 1670 // Simulate audio |kConfigChanged| prefetched as standalone access unit. |
1651 DemuxerConfigs audio_configs = CreateAudioDemuxerConfigs(kCodecVorbis, true); | 1671 DemuxerConfigs audio_configs = CreateAudioDemuxerConfigs(kCodecVorbis, true); |
1652 player_.OnDemuxerDataAvailable( | 1672 player_.OnDemuxerDataAvailable( |
1653 CreateReadFromDemuxerAckWithConfigChanged(true, 0, audio_configs)); | 1673 CreateReadFromDemuxerAckWithConfigChanged(true, 0, audio_configs)); |
1654 | 1674 |
1655 // Simulate video |kConfigChanged| prefetched as standalone access unit. | 1675 // Simulate video |kConfigChanged| prefetched as standalone access unit. |
1656 player_.OnDemuxerDataAvailable( | 1676 player_.OnDemuxerDataAvailable( |
1657 CreateReadFromDemuxerAckWithConfigChanged( | 1677 CreateReadFromDemuxerAckWithConfigChanged( |
1658 false, 0, CreateVideoDemuxerConfigs(true))); | 1678 false, 0, CreateVideoDemuxerConfigs(true))); |
1659 EXPECT_EQ(6, demuxer_->num_data_requests()); | 1679 EXPECT_EQ(6, demuxer_->num_data_requests()); |
1660 EXPECT_TRUE(IsDrainingDecoder(true)); | 1680 EXPECT_TRUE(IsDrainingDecoder(true)); |
1661 EXPECT_TRUE(IsDrainingDecoder(false)); | 1681 EXPECT_TRUE(IsDrainingDecoder(false)); |
1662 | 1682 |
1663 // Waiting for decoder to finish draining. | 1683 // Waiting for decoder to finish draining. |
1664 while (IsDrainingDecoder(true) || IsDrainingDecoder(false)) | 1684 while (IsDrainingDecoder(true) || IsDrainingDecoder(false)) |
1665 message_loop_.RunUntilIdle(); | 1685 message_loop_.RunUntilIdle(); |
1666 } | 1686 } |
1667 | 1687 |
| 1688 TEST_F(MediaSourcePlayerTest, |
| 1689 SimultaneousAudioVideoConfigChangeWithAdaptivePlayback) { |
| 1690 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); |
| 1691 |
| 1692 // Test that the player allows simultaneous audio and video config change with |
| 1693 // adaptive video playback enabled. |
| 1694 CreateNextTextureAndSetVideoSurface(); |
| 1695 Start(CreateAudioVideoDemuxerConfigs()); |
| 1696 player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForAudio(0)); |
| 1697 player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForVideo()); |
| 1698 EXPECT_TRUE(GetMediaCodecBridge(true)); |
| 1699 EXPECT_TRUE(GetMediaCodecBridge(false)); |
| 1700 EnableAdaptiveVideoPlayback(true); |
| 1701 WaitForAudioVideoDecodeDone(); |
| 1702 |
| 1703 // Simulate audio |kConfigChanged| prefetched as standalone access unit. |
| 1704 DemuxerConfigs audio_configs = CreateAudioDemuxerConfigs(kCodecVorbis, true); |
| 1705 player_.OnDemuxerDataAvailable( |
| 1706 CreateReadFromDemuxerAckWithConfigChanged(true, 0, audio_configs)); |
| 1707 |
| 1708 // Simulate video |kConfigChanged| prefetched as standalone access unit. |
| 1709 player_.OnDemuxerDataAvailable( |
| 1710 CreateReadFromDemuxerAckWithConfigChanged( |
| 1711 false, 0, CreateVideoDemuxerConfigs(true))); |
| 1712 EXPECT_EQ(6, demuxer_->num_data_requests()); |
| 1713 EXPECT_TRUE(IsDrainingDecoder(true)); |
| 1714 EXPECT_FALSE(IsDrainingDecoder(false)); |
| 1715 |
| 1716 // Waiting for audio decoder to finish draining. |
| 1717 while (IsDrainingDecoder(true)) |
| 1718 message_loop_.RunUntilIdle(); |
| 1719 } |
| 1720 |
1668 TEST_F(MediaSourcePlayerTest, DemuxerConfigRequestedIfInPrefetchUnit0) { | 1721 TEST_F(MediaSourcePlayerTest, DemuxerConfigRequestedIfInPrefetchUnit0) { |
1669 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); | 1722 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); |
1670 | 1723 |
1671 // Test that the player detects need for and requests demuxer configs if | 1724 // Test that the player detects need for and requests demuxer configs if |
1672 // the |kConfigChanged| unit is the very first unit in the set of units | 1725 // the |kConfigChanged| unit is the very first unit in the set of units |
1673 // received in OnDemuxerDataAvailable() ostensibly while | 1726 // received in OnDemuxerDataAvailable() ostensibly while |
1674 // |PREFETCH_DONE_EVENT_PENDING|. | 1727 // |PREFETCH_DONE_EVENT_PENDING|. |
1675 StartConfigChange(true, true, 0); | 1728 StartConfigChange(true, true, 0, false); |
1676 } | 1729 } |
1677 | 1730 |
1678 TEST_F(MediaSourcePlayerTest, DemuxerConfigRequestedIfInPrefetchUnit1) { | 1731 TEST_F(MediaSourcePlayerTest, DemuxerConfigRequestedIfInPrefetchUnit1) { |
1679 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); | 1732 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); |
1680 | 1733 |
1681 // Test that the player detects need for and requests demuxer configs if | 1734 // Test that the player detects need for and requests demuxer configs if |
1682 // the |kConfigChanged| unit is not the first unit in the set of units | 1735 // the |kConfigChanged| unit is not the first unit in the set of units |
1683 // received in OnDemuxerDataAvailable() ostensibly while | 1736 // received in OnDemuxerDataAvailable() ostensibly while |
1684 // |PREFETCH_DONE_EVENT_PENDING|. | 1737 // |PREFETCH_DONE_EVENT_PENDING|. |
1685 StartConfigChange(true, true, 1); | 1738 StartConfigChange(true, true, 1, false); |
1686 } | 1739 } |
1687 | 1740 |
1688 TEST_F(MediaSourcePlayerTest, DemuxerConfigRequestedIfInUnit0AfterPrefetch) { | 1741 TEST_F(MediaSourcePlayerTest, DemuxerConfigRequestedIfInUnit0AfterPrefetch) { |
1689 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); | 1742 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); |
1690 | 1743 |
1691 // Test that the player detects need for and requests demuxer configs if | 1744 // Test that the player detects need for and requests demuxer configs if |
1692 // the |kConfigChanged| unit is the very first unit in the set of units | 1745 // the |kConfigChanged| unit is the very first unit in the set of units |
1693 // received in OnDemuxerDataAvailable() from data requested ostensibly while | 1746 // received in OnDemuxerDataAvailable() from data requested ostensibly while |
1694 // not prefetching. | 1747 // not prefetching. |
1695 StartConfigChange(true, false, 0); | 1748 StartConfigChange(true, false, 0, false); |
1696 } | 1749 } |
1697 | 1750 |
1698 TEST_F(MediaSourcePlayerTest, DemuxerConfigRequestedIfInUnit1AfterPrefetch) { | 1751 TEST_F(MediaSourcePlayerTest, DemuxerConfigRequestedIfInUnit1AfterPrefetch) { |
1699 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); | 1752 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); |
1700 | 1753 |
1701 // Test that the player detects need for and requests demuxer configs if | 1754 // Test that the player detects need for and requests demuxer configs if |
1702 // the |kConfigChanged| unit is not the first unit in the set of units | 1755 // the |kConfigChanged| unit is not the first unit in the set of units |
1703 // received in OnDemuxerDataAvailable() from data requested ostensibly while | 1756 // received in OnDemuxerDataAvailable() from data requested ostensibly while |
1704 // not prefetching. | 1757 // not prefetching. |
1705 StartConfigChange(true, false, 1); | 1758 StartConfigChange(true, false, 1, false); |
1706 } | 1759 } |
1707 | 1760 |
1708 TEST_F(MediaSourcePlayerTest, BrowserSeek_PrerollAfterBrowserSeek) { | 1761 TEST_F(MediaSourcePlayerTest, BrowserSeek_PrerollAfterBrowserSeek) { |
1709 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); | 1762 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); |
1710 | 1763 |
1711 // Test decoder job will preroll the media to the actual seek position | 1764 // Test decoder job will preroll the media to the actual seek position |
1712 // resulting from a browser seek. | 1765 // resulting from a browser seek. |
1713 BrowserSeekPlayer(false); | 1766 BrowserSeekPlayer(false); |
1714 | 1767 |
1715 // Simulate browser seek is done, but to a later time than was requested. | 1768 // Simulate browser seek is done, but to a later time than was requested. |
1716 EXPECT_LT(player_.GetCurrentTime().InMillisecondsF(), 100); | 1769 EXPECT_LT(player_.GetCurrentTime().InMillisecondsF(), 100); |
1717 player_.OnDemuxerSeekDone(base::TimeDelta::FromMilliseconds(100)); | 1770 player_.OnDemuxerSeekDone(base::TimeDelta::FromMilliseconds(100)); |
1718 // Because next AU is not I-frame, MediaCodecBridge will not be recreated. | 1771 // Because next AU is not I-frame, MediaCodecBridge will not be recreated. |
1719 EXPECT_FALSE(GetMediaCodecBridge(false)); | 1772 EXPECT_FALSE(GetMediaCodecBridge(false)); |
1720 EXPECT_EQ(100.0, player_.GetCurrentTime().InMillisecondsF()); | 1773 EXPECT_EQ(100.0, player_.GetCurrentTime().InMillisecondsF()); |
1721 EXPECT_EQ(100.0, GetPrerollTimestamp().InMillisecondsF()); | 1774 EXPECT_EQ(100.0, GetPrerollTimestamp().InMillisecondsF()); |
1722 EXPECT_EQ(3, demuxer_->num_data_requests()); | 1775 EXPECT_EQ(3, demuxer_->num_data_requests()); |
1723 | 1776 |
1724 PrerollDecoderToTime( | 1777 PrerollDecoderToTime( |
1725 false, base::TimeDelta(), base::TimeDelta::FromMilliseconds(100)); | 1778 false, base::TimeDelta(), base::TimeDelta::FromMilliseconds(100)); |
1726 } | 1779 } |
1727 | 1780 |
1728 TEST_F(MediaSourcePlayerTest, VideoDemuxerConfigChange) { | 1781 TEST_F(MediaSourcePlayerTest, VideoDemuxerConfigChange) { |
1729 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); | 1782 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); |
1730 | 1783 |
1731 // Test that video config change notification results in creating a new | 1784 // Test that video config change notification results in creating a new |
1732 // video codec without any browser seek. | 1785 // video codec without any browser seek. |
1733 StartConfigChange(false, true, 1); | 1786 StartConfigChange(false, true, 1, false); |
1734 | 1787 |
1735 // New video codec should have been created and configured, without any | 1788 // New video codec should have been created and configured, without any |
1736 // browser seek. | 1789 // browser seek. |
1737 EXPECT_TRUE(GetMediaCodecBridge(false)); | 1790 EXPECT_TRUE(GetMediaCodecBridge(false)); |
1738 EXPECT_EQ(3, demuxer_->num_data_requests()); | 1791 EXPECT_EQ(3, demuxer_->num_data_requests()); |
1739 EXPECT_EQ(0, demuxer_->num_seek_requests()); | 1792 EXPECT_EQ(0, demuxer_->num_seek_requests()); |
| 1793 |
| 1794 // 2 codecs should have been created, one before the config change, and one |
| 1795 // after it. |
| 1796 EXPECT_EQ(2, manager_.num_resources_requested()); |
| 1797 EXPECT_EQ(1, manager_.num_resources_released()); |
| 1798 } |
| 1799 |
| 1800 TEST_F(MediaSourcePlayerTest, VideoDemuxerConfigChangeWithAdaptivePlayback) { |
| 1801 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); |
| 1802 |
| 1803 // Test that if codec supports adaptive playback, no new codec should be |
| 1804 // created beyond the one used to decode the prefetch media data prior to |
| 1805 // the kConfigChanged. |
| 1806 StartConfigChange(false, true, 1, true); |
| 1807 |
| 1808 // No browser seek should be needed. |
| 1809 EXPECT_TRUE(GetMediaCodecBridge(false)); |
| 1810 EXPECT_EQ(3, demuxer_->num_data_requests()); |
| 1811 EXPECT_EQ(0, demuxer_->num_seek_requests()); |
| 1812 |
| 1813 // Only 1 codec should have been created so far. |
| 1814 EXPECT_EQ(1, manager_.num_resources_requested()); |
1740 } | 1815 } |
1741 | 1816 |
1742 TEST_F(MediaSourcePlayerTest, DecoderDrainInterruptedBySeek) { | 1817 TEST_F(MediaSourcePlayerTest, DecoderDrainInterruptedBySeek) { |
1743 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); | 1818 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); |
1744 | 1819 |
1745 // Test if a decoder is being drained while receiving a seek request, draining | 1820 // Test if a decoder is being drained while receiving a seek request, draining |
1746 // is canceled. | 1821 // is canceled. |
1747 SendConfigChangeToDecoder(true, false, 0); | 1822 SendConfigChangeToDecoder(true, false, 0, false); |
1748 EXPECT_TRUE(IsDrainingDecoder(true)); | 1823 EXPECT_TRUE(IsDrainingDecoder(true)); |
1749 | 1824 |
1750 player_.SeekTo(base::TimeDelta::FromMilliseconds(100)); | 1825 player_.SeekTo(base::TimeDelta::FromMilliseconds(100)); |
1751 WaitForAudioDecodeDone(); | 1826 WaitForAudioDecodeDone(); |
1752 EXPECT_FALSE(IsDrainingDecoder(true)); | 1827 EXPECT_FALSE(IsDrainingDecoder(true)); |
1753 player_.OnDemuxerSeekDone(kNoTimestamp()); | 1828 player_.OnDemuxerSeekDone(kNoTimestamp()); |
1754 | 1829 |
1755 EXPECT_EQ(1, demuxer_->num_seek_requests()); | 1830 EXPECT_EQ(1, demuxer_->num_seek_requests()); |
1756 EXPECT_EQ(4, demuxer_->num_data_requests()); | 1831 EXPECT_EQ(4, demuxer_->num_data_requests()); |
1757 } | 1832 } |
1758 | 1833 |
1759 TEST_F(MediaSourcePlayerTest, DecoderDrainInterruptedByRelease) { | 1834 TEST_F(MediaSourcePlayerTest, DecoderDrainInterruptedByRelease) { |
1760 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); | 1835 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); |
1761 | 1836 |
1762 // Test if a decoder is being drained while receiving a release request, | 1837 // Test if a decoder is being drained while receiving a release request, |
1763 // draining is canceled. | 1838 // draining is canceled. |
1764 SendConfigChangeToDecoder(true, false, 0); | 1839 SendConfigChangeToDecoder(true, false, 0, false); |
1765 EXPECT_TRUE(IsDrainingDecoder(true)); | 1840 EXPECT_TRUE(IsDrainingDecoder(true)); |
1766 | 1841 |
1767 ReleasePlayer(); | 1842 ReleasePlayer(); |
1768 WaitForAudioDecodeDone(); | 1843 WaitForAudioDecodeDone(); |
1769 EXPECT_EQ(3, demuxer_->num_data_requests()); | 1844 EXPECT_EQ(3, demuxer_->num_data_requests()); |
1770 EXPECT_FALSE(IsDrainingDecoder(true)); | 1845 EXPECT_FALSE(IsDrainingDecoder(true)); |
1771 | 1846 |
1772 EXPECT_FALSE(GetMediaCodecBridge(true)); | 1847 EXPECT_FALSE(GetMediaCodecBridge(true)); |
1773 EXPECT_FALSE(player_.IsPlaying()); | 1848 EXPECT_FALSE(player_.IsPlaying()); |
1774 | 1849 |
1775 player_.Start(); | 1850 player_.Start(); |
1776 EXPECT_TRUE(player_.IsPlaying()); | 1851 EXPECT_TRUE(player_.IsPlaying()); |
1777 EXPECT_EQ(3, demuxer_->num_data_requests()); | 1852 EXPECT_EQ(3, demuxer_->num_data_requests()); |
1778 } | 1853 } |
1779 | 1854 |
1780 TEST_F(MediaSourcePlayerTest, DecoderDrainInterruptedBySurfaceChange) { | 1855 TEST_F(MediaSourcePlayerTest, DecoderDrainInterruptedBySurfaceChange) { |
1781 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); | 1856 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); |
1782 | 1857 |
1783 // Test if a video decoder is being drained while surface changes, draining | 1858 // Test if a video decoder is being drained while surface changes, draining |
1784 // is canceled. | 1859 // is canceled. |
1785 SendConfigChangeToDecoder(false, false, 0); | 1860 SendConfigChangeToDecoder(false, false, 0, false); |
1786 EXPECT_TRUE(IsDrainingDecoder(false)); | 1861 EXPECT_TRUE(IsDrainingDecoder(false)); |
1787 | 1862 |
1788 CreateNextTextureAndSetVideoSurface(); | 1863 CreateNextTextureAndSetVideoSurface(); |
1789 WaitForVideoDecodeDone(); | 1864 WaitForVideoDecodeDone(); |
1790 | 1865 |
1791 EXPECT_FALSE(IsDrainingDecoder(false)); | 1866 EXPECT_FALSE(IsDrainingDecoder(false)); |
1792 EXPECT_FALSE(GetMediaCodecBridge(false)); | 1867 EXPECT_FALSE(GetMediaCodecBridge(false)); |
1793 EXPECT_TRUE(player_.IsPlaying()); | 1868 EXPECT_TRUE(player_.IsPlaying()); |
1794 EXPECT_EQ(3, demuxer_->num_data_requests()); | 1869 EXPECT_EQ(3, demuxer_->num_data_requests()); |
1795 | 1870 |
(...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1981 // No further seek should have been requested since before Release(), above. | 2056 // No further seek should have been requested since before Release(), above. |
1982 EXPECT_EQ(1, demuxer_->num_seek_requests()); | 2057 EXPECT_EQ(1, demuxer_->num_seek_requests()); |
1983 } | 2058 } |
1984 | 2059 |
1985 TEST_F(MediaSourcePlayerTest, ConfigChangedThenReleaseThenStart) { | 2060 TEST_F(MediaSourcePlayerTest, ConfigChangedThenReleaseThenStart) { |
1986 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); | 2061 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); |
1987 | 2062 |
1988 // Test if Release() occurs after |kConfigChanged| is processed, new data | 2063 // Test if Release() occurs after |kConfigChanged| is processed, new data |
1989 // requested of demuxer, and the requested data arrive before the next | 2064 // requested of demuxer, and the requested data arrive before the next |
1990 // Start(), then the player starts to decode the new data without any seek. | 2065 // Start(), then the player starts to decode the new data without any seek. |
1991 StartConfigChange(true, true, 0); | 2066 StartConfigChange(true, true, 0, false); |
1992 ReleasePlayer(); | 2067 ReleasePlayer(); |
1993 | 2068 |
1994 EXPECT_TRUE(GetMediaCodecBridge(true)); | 2069 EXPECT_TRUE(GetMediaCodecBridge(true)); |
1995 EXPECT_FALSE(player_.IsPlaying()); | 2070 EXPECT_FALSE(player_.IsPlaying()); |
1996 EXPECT_EQ(3, demuxer_->num_data_requests()); | 2071 EXPECT_EQ(3, demuxer_->num_data_requests()); |
1997 player_.OnDemuxerDataAvailable( | 2072 player_.OnDemuxerDataAvailable( |
1998 CreateReadFromDemuxerAckWithConfigChanged( | 2073 CreateReadFromDemuxerAckWithConfigChanged( |
1999 true, 4, CreateAudioDemuxerConfigs(kCodecVorbis, false))); | 2074 true, 4, CreateAudioDemuxerConfigs(kCodecVorbis, false))); |
2000 WaitForAudioDecodeDone(); | 2075 WaitForAudioDecodeDone(); |
2001 EXPECT_FALSE(GetMediaCodecBridge(true)); | 2076 EXPECT_FALSE(GetMediaCodecBridge(true)); |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2115 | 2190 |
2116 DemuxerConfigs configs = CreateAudioDemuxerConfigs(kCodecVorbis, true); | 2191 DemuxerConfigs configs = CreateAudioDemuxerConfigs(kCodecVorbis, true); |
2117 DemuxerData data = CreateReadFromDemuxerAckWithConfigChanged( | 2192 DemuxerData data = CreateReadFromDemuxerAckWithConfigChanged( |
2118 true, 0, configs); | 2193 true, 0, configs); |
2119 player_.OnDemuxerDataAvailable(data); | 2194 player_.OnDemuxerDataAvailable(data); |
2120 WaitForAudioDecodeDone(); | 2195 WaitForAudioDecodeDone(); |
2121 DecodeAudioDataUntilOutputBecomesAvailable(); | 2196 DecodeAudioDataUntilOutputBecomesAvailable(); |
2122 } | 2197 } |
2123 | 2198 |
2124 } // namespace media | 2199 } // namespace media |
OLD | NEW |