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 598 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
609 demuxer_->num_browser_seek_requests()); | 609 demuxer_->num_browser_seek_requests()); |
610 EXPECT_EQ(expected_num_data_requests, demuxer_->num_data_requests()); | 610 EXPECT_EQ(expected_num_data_requests, demuxer_->num_data_requests()); |
611 } | 611 } |
612 | 612 |
613 // Creates a new media codec bridge and feeds it data ending with a | 613 // Creates a new media codec bridge and feeds it data ending with a |
614 // |kConfigChanged| access unit. If |config_unit_in_prefetch| is true, sends | 614 // |kConfigChanged| access unit. If |config_unit_in_prefetch| is true, sends |
615 // feeds the config change AU in response to the job's first read request | 615 // feeds the config change AU in response to the job's first read request |
616 // (prefetch). If false, regular data is fed and decoded prior to feeding the | 616 // (prefetch). If false, regular data is fed and decoded prior to feeding the |
617 // config change AU in response to the second data request (after prefetch | 617 // config change AU in response to the second data request (after prefetch |
618 // completed). |config_unit_index| controls which access unit is | 618 // completed). |config_unit_index| controls which access unit is |
619 // |kConfigChanged|. | 619 // |kConfigChanged|. If |enable_adaptive_playback| is true, config change will |
| 620 // not cause the decoder to recreate the media codec bridge. Otherwise, the |
| 621 // decoder has to drain all its data before recreating the new codec. |
620 void SendConfigChangeToDecoder(bool is_audio, | 622 void SendConfigChangeToDecoder(bool is_audio, |
621 bool config_unit_in_prefetch, | 623 bool config_unit_in_prefetch, |
622 int config_unit_index) { | 624 int config_unit_index, |
| 625 bool enable_adaptive_playback) { |
623 EXPECT_FALSE(GetMediaCodecBridge(is_audio)); | 626 EXPECT_FALSE(GetMediaCodecBridge(is_audio)); |
624 if (is_audio) { | 627 if (is_audio) { |
625 StartAudioDecoderJob(); | 628 StartAudioDecoderJob(); |
626 } else { | 629 } else { |
627 CreateNextTextureAndSetVideoSurface(); | 630 CreateNextTextureAndSetVideoSurface(); |
628 StartVideoDecoderJob(); | 631 StartVideoDecoderJob(); |
629 } | 632 } |
630 | 633 |
631 int expected_num_data_requests = demuxer_->num_data_requests(); | 634 int expected_num_data_requests = demuxer_->num_data_requests(); |
632 // Feed and decode a standalone access unit so the player exits prefetch. | 635 // Feed and decode a standalone access unit so the player exits prefetch. |
633 if (!config_unit_in_prefetch) { | 636 if (!config_unit_in_prefetch) { |
634 if (is_audio) | 637 if (is_audio) { |
635 player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForAudio(0)); | 638 player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForAudio(0)); |
636 else | 639 } else { |
637 player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForVideo()); | 640 player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForVideo()); |
| 641 EnableAdaptiveVideoPlayback(enable_adaptive_playback); |
| 642 } |
638 | 643 |
639 WaitForDecodeDone(is_audio, !is_audio); | 644 WaitForDecodeDone(is_audio, !is_audio); |
640 | 645 |
641 // We should have completed the prefetch phase at this point. | 646 // We should have completed the prefetch phase at this point. |
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 } | 649 } |
645 | 650 |
646 DemuxerConfigs configs = is_audio ? | 651 DemuxerConfigs configs = is_audio ? |
647 CreateAudioDemuxerConfigs(kCodecAAC, false) : | 652 CreateAudioDemuxerConfigs(kCodecAAC, false) : |
648 CreateVideoDemuxerConfigs(true); | 653 CreateVideoDemuxerConfigs(true); |
649 // Feed and decode access units with data for any units prior to | 654 // Feed and decode access units with data for any units prior to |
650 // |config_unit_index|, and a |kConfigChanged| unit at that index. | 655 // |config_unit_index|, and a |kConfigChanged| unit at that index. |
651 // Player should prepare to reconfigure the decoder job, and should request | 656 // Player should prepare to reconfigure the decoder job, and should request |
652 // new demuxer configs. | 657 // new demuxer configs. |
653 player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckWithConfigChanged( | 658 player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckWithConfigChanged( |
654 is_audio, config_unit_index, configs)); | 659 is_audio, config_unit_index, configs)); |
655 | 660 |
656 expected_num_data_requests++; | 661 expected_num_data_requests++; |
657 EXPECT_EQ(expected_num_data_requests, demuxer_->num_data_requests()); | 662 EXPECT_EQ(expected_num_data_requests, demuxer_->num_data_requests()); |
658 if (is_audio) | 663 if (is_audio) |
659 player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForAudio(0)); | 664 player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForAudio(0)); |
660 else | 665 else |
661 player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForVideo()); | 666 player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForVideo()); |
| 667 |
| 668 // If the adaptive playback setting was not passed to the MediaCodecBridge |
| 669 // earlier, do it here. |
| 670 if (config_unit_in_prefetch && !is_audio) |
| 671 EnableAdaptiveVideoPlayback(enable_adaptive_playback); |
662 } | 672 } |
663 | 673 |
664 // Send a config change to the decoder job and drain the decoder so that the | 674 // Send a config change to the decoder job and drain the decoder so that the |
665 // config change is processed. | 675 // config change is processed. |
666 void StartConfigChange(bool is_audio, | 676 void StartConfigChange(bool is_audio, |
667 bool config_unit_in_prefetch, | 677 bool config_unit_in_prefetch, |
668 int config_unit_index) { | 678 int config_unit_index, |
| 679 bool enable_adaptive_playback) { |
669 SendConfigChangeToDecoder(is_audio, config_unit_in_prefetch, | 680 SendConfigChangeToDecoder(is_audio, config_unit_in_prefetch, |
670 config_unit_index); | 681 config_unit_index, enable_adaptive_playback); |
671 EXPECT_EQ(!config_unit_in_prefetch && config_unit_index == 0, | 682 |
672 IsDrainingDecoder(is_audio)); | 683 EXPECT_EQ(!config_unit_in_prefetch && !enable_adaptive_playback && |
| 684 config_unit_index == 0, IsDrainingDecoder(is_audio)); |
673 int expected_num_data_requests = demuxer_->num_data_requests(); | 685 int expected_num_data_requests = demuxer_->num_data_requests(); |
674 // Run until decoder starts to request new data. | 686 // Run until decoder starts to request new data. |
675 while (demuxer_->num_data_requests() == expected_num_data_requests) | 687 while (demuxer_->num_data_requests() == expected_num_data_requests) |
676 message_loop_.RunUntilIdle(); | 688 message_loop_.RunUntilIdle(); |
677 EXPECT_FALSE(IsDrainingDecoder(is_audio)); | 689 EXPECT_FALSE(IsDrainingDecoder(is_audio)); |
678 } | 690 } |
679 | 691 |
| 692 void EnableAdaptiveVideoPlayback(bool enable) { |
| 693 EXPECT_TRUE(GetMediaCodecBridge(false)); |
| 694 static_cast<VideoCodecBridge*>(GetMediaCodecBridge(false))-> |
| 695 set_adaptive_playback_supported_for_testing( |
| 696 enable ? 1 : 0); |
| 697 } |
| 698 |
680 void CreateNextTextureAndSetVideoSurface() { | 699 void CreateNextTextureAndSetVideoSurface() { |
681 gfx::SurfaceTexture* surface_texture; | 700 gfx::SurfaceTexture* surface_texture; |
682 if (surface_texture_a_is_next_) { | 701 if (surface_texture_a_is_next_) { |
683 surface_texture_a_ = gfx::SurfaceTexture::Create(next_texture_id_++); | 702 surface_texture_a_ = gfx::SurfaceTexture::Create(next_texture_id_++); |
684 surface_texture = surface_texture_a_.get(); | 703 surface_texture = surface_texture_a_.get(); |
685 } else { | 704 } else { |
686 surface_texture_b_ = gfx::SurfaceTexture::Create(next_texture_id_++); | 705 surface_texture_b_ = gfx::SurfaceTexture::Create(next_texture_id_++); |
687 surface_texture = surface_texture_b_.get(); | 706 surface_texture = surface_texture_b_.get(); |
688 } | 707 } |
689 | 708 |
(...skipping 962 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1652 | 1671 |
1653 // Test that the player allows simultaneous audio and video config change, | 1672 // Test that the player allows simultaneous audio and video config change, |
1654 // such as might occur during OnPrefetchDone() if next access unit for both | 1673 // such as might occur during OnPrefetchDone() if next access unit for both |
1655 // audio and video jobs is |kConfigChanged|. | 1674 // audio and video jobs is |kConfigChanged|. |
1656 CreateNextTextureAndSetVideoSurface(); | 1675 CreateNextTextureAndSetVideoSurface(); |
1657 Start(CreateAudioVideoDemuxerConfigs()); | 1676 Start(CreateAudioVideoDemuxerConfigs()); |
1658 player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForAudio(0)); | 1677 player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForAudio(0)); |
1659 player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForVideo()); | 1678 player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForVideo()); |
1660 EXPECT_TRUE(GetMediaCodecBridge(true)); | 1679 EXPECT_TRUE(GetMediaCodecBridge(true)); |
1661 EXPECT_TRUE(GetMediaCodecBridge(false)); | 1680 EXPECT_TRUE(GetMediaCodecBridge(false)); |
| 1681 EnableAdaptiveVideoPlayback(false); |
1662 WaitForAudioVideoDecodeDone(); | 1682 WaitForAudioVideoDecodeDone(); |
1663 | 1683 |
1664 // Simulate audio |kConfigChanged| prefetched as standalone access unit. | 1684 // Simulate audio |kConfigChanged| prefetched as standalone access unit. |
1665 DemuxerConfigs audio_configs = CreateAudioDemuxerConfigs(kCodecVorbis, true); | 1685 DemuxerConfigs audio_configs = CreateAudioDemuxerConfigs(kCodecVorbis, true); |
1666 player_.OnDemuxerDataAvailable( | 1686 player_.OnDemuxerDataAvailable( |
1667 CreateReadFromDemuxerAckWithConfigChanged(true, 0, audio_configs)); | 1687 CreateReadFromDemuxerAckWithConfigChanged(true, 0, audio_configs)); |
1668 | 1688 |
1669 // Simulate video |kConfigChanged| prefetched as standalone access unit. | 1689 // Simulate video |kConfigChanged| prefetched as standalone access unit. |
1670 player_.OnDemuxerDataAvailable( | 1690 player_.OnDemuxerDataAvailable( |
1671 CreateReadFromDemuxerAckWithConfigChanged( | 1691 CreateReadFromDemuxerAckWithConfigChanged( |
1672 false, 0, CreateVideoDemuxerConfigs(true))); | 1692 false, 0, CreateVideoDemuxerConfigs(true))); |
1673 EXPECT_EQ(6, demuxer_->num_data_requests()); | 1693 EXPECT_EQ(6, demuxer_->num_data_requests()); |
1674 EXPECT_TRUE(IsDrainingDecoder(true)); | 1694 EXPECT_TRUE(IsDrainingDecoder(true)); |
1675 EXPECT_TRUE(IsDrainingDecoder(false)); | 1695 EXPECT_TRUE(IsDrainingDecoder(false)); |
1676 | 1696 |
1677 // Waiting for decoder to finish draining. | 1697 // Waiting for decoder to finish draining. |
1678 while (IsDrainingDecoder(true) || IsDrainingDecoder(false)) | 1698 while (IsDrainingDecoder(true) || IsDrainingDecoder(false)) |
1679 message_loop_.RunUntilIdle(); | 1699 message_loop_.RunUntilIdle(); |
1680 } | 1700 } |
1681 | 1701 |
| 1702 TEST_F(MediaSourcePlayerTest, |
| 1703 SimultaneousAudioVideoConfigChangeWithAdaptivePlayback) { |
| 1704 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); |
| 1705 |
| 1706 // Test that the player allows simultaneous audio and video config change with |
| 1707 // adaptive video playback enabled. |
| 1708 CreateNextTextureAndSetVideoSurface(); |
| 1709 Start(CreateAudioVideoDemuxerConfigs()); |
| 1710 player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForAudio(0)); |
| 1711 player_.OnDemuxerDataAvailable(CreateReadFromDemuxerAckForVideo()); |
| 1712 EXPECT_TRUE(GetMediaCodecBridge(true)); |
| 1713 EXPECT_TRUE(GetMediaCodecBridge(false)); |
| 1714 EnableAdaptiveVideoPlayback(true); |
| 1715 WaitForAudioVideoDecodeDone(); |
| 1716 |
| 1717 // Simulate audio |kConfigChanged| prefetched as standalone access unit. |
| 1718 DemuxerConfigs audio_configs = CreateAudioDemuxerConfigs(kCodecVorbis, true); |
| 1719 player_.OnDemuxerDataAvailable( |
| 1720 CreateReadFromDemuxerAckWithConfigChanged(true, 0, audio_configs)); |
| 1721 |
| 1722 // Simulate video |kConfigChanged| prefetched as standalone access unit. |
| 1723 player_.OnDemuxerDataAvailable( |
| 1724 CreateReadFromDemuxerAckWithConfigChanged( |
| 1725 false, 0, CreateVideoDemuxerConfigs(true))); |
| 1726 EXPECT_EQ(6, demuxer_->num_data_requests()); |
| 1727 EXPECT_TRUE(IsDrainingDecoder(true)); |
| 1728 EXPECT_FALSE(IsDrainingDecoder(false)); |
| 1729 |
| 1730 // Waiting for audio decoder to finish draining. |
| 1731 while (IsDrainingDecoder(true)) |
| 1732 message_loop_.RunUntilIdle(); |
| 1733 } |
| 1734 |
1682 TEST_F(MediaSourcePlayerTest, DemuxerConfigRequestedIfInPrefetchUnit0) { | 1735 TEST_F(MediaSourcePlayerTest, DemuxerConfigRequestedIfInPrefetchUnit0) { |
1683 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); | 1736 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); |
1684 | 1737 |
1685 // Test that the player detects need for and requests demuxer configs if | 1738 // Test that the player detects need for and requests demuxer configs if |
1686 // the |kConfigChanged| unit is the very first unit in the set of units | 1739 // the |kConfigChanged| unit is the very first unit in the set of units |
1687 // received in OnDemuxerDataAvailable() ostensibly while | 1740 // received in OnDemuxerDataAvailable() ostensibly while |
1688 // |PREFETCH_DONE_EVENT_PENDING|. | 1741 // |PREFETCH_DONE_EVENT_PENDING|. |
1689 StartConfigChange(true, true, 0); | 1742 StartConfigChange(true, true, 0, false); |
1690 } | 1743 } |
1691 | 1744 |
1692 TEST_F(MediaSourcePlayerTest, DemuxerConfigRequestedIfInPrefetchUnit1) { | 1745 TEST_F(MediaSourcePlayerTest, DemuxerConfigRequestedIfInPrefetchUnit1) { |
1693 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); | 1746 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); |
1694 | 1747 |
1695 // Test that the player detects need for and requests demuxer configs if | 1748 // Test that the player detects need for and requests demuxer configs if |
1696 // the |kConfigChanged| unit is not the first unit in the set of units | 1749 // the |kConfigChanged| unit is not the first unit in the set of units |
1697 // received in OnDemuxerDataAvailable() ostensibly while | 1750 // received in OnDemuxerDataAvailable() ostensibly while |
1698 // |PREFETCH_DONE_EVENT_PENDING|. | 1751 // |PREFETCH_DONE_EVENT_PENDING|. |
1699 StartConfigChange(true, true, 1); | 1752 StartConfigChange(true, true, 1, false); |
1700 } | 1753 } |
1701 | 1754 |
1702 TEST_F(MediaSourcePlayerTest, DemuxerConfigRequestedIfInUnit0AfterPrefetch) { | 1755 TEST_F(MediaSourcePlayerTest, DemuxerConfigRequestedIfInUnit0AfterPrefetch) { |
1703 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); | 1756 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); |
1704 | 1757 |
1705 // Test that the player detects need for and requests demuxer configs if | 1758 // Test that the player detects need for and requests demuxer configs if |
1706 // the |kConfigChanged| unit is the very first unit in the set of units | 1759 // the |kConfigChanged| unit is the very first unit in the set of units |
1707 // received in OnDemuxerDataAvailable() from data requested ostensibly while | 1760 // received in OnDemuxerDataAvailable() from data requested ostensibly while |
1708 // not prefetching. | 1761 // not prefetching. |
1709 StartConfigChange(true, false, 0); | 1762 StartConfigChange(true, false, 0, false); |
1710 } | 1763 } |
1711 | 1764 |
1712 TEST_F(MediaSourcePlayerTest, DemuxerConfigRequestedIfInUnit1AfterPrefetch) { | 1765 TEST_F(MediaSourcePlayerTest, DemuxerConfigRequestedIfInUnit1AfterPrefetch) { |
1713 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); | 1766 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); |
1714 | 1767 |
1715 // Test that the player detects need for and requests demuxer configs if | 1768 // Test that the player detects need for and requests demuxer configs if |
1716 // the |kConfigChanged| unit is not the first unit in the set of units | 1769 // the |kConfigChanged| unit is not the first unit in the set of units |
1717 // received in OnDemuxerDataAvailable() from data requested ostensibly while | 1770 // received in OnDemuxerDataAvailable() from data requested ostensibly while |
1718 // not prefetching. | 1771 // not prefetching. |
1719 StartConfigChange(true, false, 1); | 1772 StartConfigChange(true, false, 1, false); |
1720 } | 1773 } |
1721 | 1774 |
1722 TEST_F(MediaSourcePlayerTest, BrowserSeek_PrerollAfterBrowserSeek) { | 1775 TEST_F(MediaSourcePlayerTest, BrowserSeek_PrerollAfterBrowserSeek) { |
1723 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); | 1776 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); |
1724 | 1777 |
1725 // Test decoder job will preroll the media to the actual seek position | 1778 // Test decoder job will preroll the media to the actual seek position |
1726 // resulting from a browser seek. | 1779 // resulting from a browser seek. |
1727 BrowserSeekPlayer(false); | 1780 BrowserSeekPlayer(false); |
1728 | 1781 |
1729 // Simulate browser seek is done, but to a later time than was requested. | 1782 // Simulate browser seek is done, but to a later time than was requested. |
1730 EXPECT_LT(player_.GetCurrentTime().InMillisecondsF(), 100); | 1783 EXPECT_LT(player_.GetCurrentTime().InMillisecondsF(), 100); |
1731 player_.OnDemuxerSeekDone(base::TimeDelta::FromMilliseconds(100)); | 1784 player_.OnDemuxerSeekDone(base::TimeDelta::FromMilliseconds(100)); |
1732 // Because next AU is not I-frame, MediaCodecBridge will not be recreated. | 1785 // Because next AU is not I-frame, MediaCodecBridge will not be recreated. |
1733 EXPECT_FALSE(GetMediaCodecBridge(false)); | 1786 EXPECT_FALSE(GetMediaCodecBridge(false)); |
1734 EXPECT_EQ(100.0, player_.GetCurrentTime().InMillisecondsF()); | 1787 EXPECT_EQ(100.0, player_.GetCurrentTime().InMillisecondsF()); |
1735 EXPECT_EQ(100.0, GetPrerollTimestamp().InMillisecondsF()); | 1788 EXPECT_EQ(100.0, GetPrerollTimestamp().InMillisecondsF()); |
1736 EXPECT_EQ(3, demuxer_->num_data_requests()); | 1789 EXPECT_EQ(3, demuxer_->num_data_requests()); |
1737 | 1790 |
1738 PrerollDecoderToTime( | 1791 PrerollDecoderToTime( |
1739 false, base::TimeDelta(), base::TimeDelta::FromMilliseconds(100)); | 1792 false, base::TimeDelta(), base::TimeDelta::FromMilliseconds(100)); |
1740 } | 1793 } |
1741 | 1794 |
1742 TEST_F(MediaSourcePlayerTest, VideoDemuxerConfigChange) { | 1795 TEST_F(MediaSourcePlayerTest, VideoDemuxerConfigChange) { |
1743 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); | 1796 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); |
1744 | 1797 |
1745 // Test that video config change notification results in creating a new | 1798 // Test that video config change notification results in creating a new |
1746 // video codec without any browser seek. | 1799 // video codec without any browser seek. |
1747 StartConfigChange(false, true, 1); | 1800 StartConfigChange(false, true, 1, false); |
1748 | 1801 |
1749 // New video codec should have been created and configured, without any | 1802 // New video codec should have been created and configured, without any |
1750 // browser seek. | 1803 // browser seek. |
1751 EXPECT_TRUE(GetMediaCodecBridge(false)); | 1804 EXPECT_TRUE(GetMediaCodecBridge(false)); |
1752 EXPECT_EQ(3, demuxer_->num_data_requests()); | 1805 EXPECT_EQ(3, demuxer_->num_data_requests()); |
1753 EXPECT_EQ(0, demuxer_->num_seek_requests()); | 1806 EXPECT_EQ(0, demuxer_->num_seek_requests()); |
| 1807 |
| 1808 // 2 codecs should have been created, one before the config change, and one |
| 1809 // after it. |
| 1810 EXPECT_EQ(2, manager_.num_resources_requested()); |
| 1811 EXPECT_EQ(1, manager_.num_resources_released()); |
| 1812 } |
| 1813 |
| 1814 TEST_F(MediaSourcePlayerTest, VideoDemuxerConfigChangeWithAdaptivePlayback) { |
| 1815 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); |
| 1816 |
| 1817 // Test that if codec supports adaptive playback, no new codec should be |
| 1818 // created beyond the one used to decode the prefetch media data prior to |
| 1819 // the kConfigChanged. |
| 1820 StartConfigChange(false, true, 1, true); |
| 1821 |
| 1822 // No browser seek should be needed. |
| 1823 EXPECT_TRUE(GetMediaCodecBridge(false)); |
| 1824 EXPECT_EQ(3, demuxer_->num_data_requests()); |
| 1825 EXPECT_EQ(0, demuxer_->num_seek_requests()); |
| 1826 |
| 1827 // Only 1 codec should have been created so far. |
| 1828 EXPECT_EQ(1, manager_.num_resources_requested()); |
1754 } | 1829 } |
1755 | 1830 |
1756 TEST_F(MediaSourcePlayerTest, DecoderDrainInterruptedBySeek) { | 1831 TEST_F(MediaSourcePlayerTest, DecoderDrainInterruptedBySeek) { |
1757 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); | 1832 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); |
1758 | 1833 |
1759 // Test if a decoder is being drained while receiving a seek request, draining | 1834 // Test if a decoder is being drained while receiving a seek request, draining |
1760 // is canceled. | 1835 // is canceled. |
1761 SendConfigChangeToDecoder(true, false, 0); | 1836 SendConfigChangeToDecoder(true, false, 0, false); |
1762 EXPECT_TRUE(IsDrainingDecoder(true)); | 1837 EXPECT_TRUE(IsDrainingDecoder(true)); |
1763 | 1838 |
1764 player_.SeekTo(base::TimeDelta::FromMilliseconds(100)); | 1839 player_.SeekTo(base::TimeDelta::FromMilliseconds(100)); |
1765 WaitForAudioDecodeDone(); | 1840 WaitForAudioDecodeDone(); |
1766 EXPECT_FALSE(IsDrainingDecoder(true)); | 1841 EXPECT_FALSE(IsDrainingDecoder(true)); |
1767 player_.OnDemuxerSeekDone(kNoTimestamp()); | 1842 player_.OnDemuxerSeekDone(kNoTimestamp()); |
1768 | 1843 |
1769 EXPECT_EQ(1, demuxer_->num_seek_requests()); | 1844 EXPECT_EQ(1, demuxer_->num_seek_requests()); |
1770 EXPECT_EQ(4, demuxer_->num_data_requests()); | 1845 EXPECT_EQ(4, demuxer_->num_data_requests()); |
1771 } | 1846 } |
1772 | 1847 |
1773 TEST_F(MediaSourcePlayerTest, DecoderDrainInterruptedByRelease) { | 1848 TEST_F(MediaSourcePlayerTest, DecoderDrainInterruptedByRelease) { |
1774 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); | 1849 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); |
1775 | 1850 |
1776 // Test if a decoder is being drained while receiving a release request, | 1851 // Test if a decoder is being drained while receiving a release request, |
1777 // draining is canceled. | 1852 // draining is canceled. |
1778 SendConfigChangeToDecoder(true, false, 0); | 1853 SendConfigChangeToDecoder(true, false, 0, false); |
1779 EXPECT_TRUE(IsDrainingDecoder(true)); | 1854 EXPECT_TRUE(IsDrainingDecoder(true)); |
1780 | 1855 |
1781 ReleasePlayer(); | 1856 ReleasePlayer(); |
1782 WaitForAudioDecodeDone(); | 1857 WaitForAudioDecodeDone(); |
1783 EXPECT_EQ(3, demuxer_->num_data_requests()); | 1858 EXPECT_EQ(3, demuxer_->num_data_requests()); |
1784 EXPECT_FALSE(IsDrainingDecoder(true)); | 1859 EXPECT_FALSE(IsDrainingDecoder(true)); |
1785 | 1860 |
1786 EXPECT_FALSE(GetMediaCodecBridge(true)); | 1861 EXPECT_FALSE(GetMediaCodecBridge(true)); |
1787 EXPECT_FALSE(player_.IsPlaying()); | 1862 EXPECT_FALSE(player_.IsPlaying()); |
1788 | 1863 |
1789 player_.Start(); | 1864 player_.Start(); |
1790 EXPECT_TRUE(player_.IsPlaying()); | 1865 EXPECT_TRUE(player_.IsPlaying()); |
1791 EXPECT_EQ(3, demuxer_->num_data_requests()); | 1866 EXPECT_EQ(3, demuxer_->num_data_requests()); |
1792 } | 1867 } |
1793 | 1868 |
1794 TEST_F(MediaSourcePlayerTest, DecoderDrainInterruptedBySurfaceChange) { | 1869 TEST_F(MediaSourcePlayerTest, DecoderDrainInterruptedBySurfaceChange) { |
1795 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); | 1870 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); |
1796 | 1871 |
1797 // Test if a video decoder is being drained while surface changes, draining | 1872 // Test if a video decoder is being drained while surface changes, draining |
1798 // is canceled. | 1873 // is canceled. |
1799 SendConfigChangeToDecoder(false, false, 0); | 1874 SendConfigChangeToDecoder(false, false, 0, false); |
1800 EXPECT_TRUE(IsDrainingDecoder(false)); | 1875 EXPECT_TRUE(IsDrainingDecoder(false)); |
1801 | 1876 |
1802 CreateNextTextureAndSetVideoSurface(); | 1877 CreateNextTextureAndSetVideoSurface(); |
1803 WaitForVideoDecodeDone(); | 1878 WaitForVideoDecodeDone(); |
1804 | 1879 |
1805 EXPECT_FALSE(IsDrainingDecoder(false)); | 1880 EXPECT_FALSE(IsDrainingDecoder(false)); |
1806 EXPECT_FALSE(GetMediaCodecBridge(false)); | 1881 EXPECT_FALSE(GetMediaCodecBridge(false)); |
1807 EXPECT_TRUE(player_.IsPlaying()); | 1882 EXPECT_TRUE(player_.IsPlaying()); |
1808 EXPECT_EQ(3, demuxer_->num_data_requests()); | 1883 EXPECT_EQ(3, demuxer_->num_data_requests()); |
1809 | 1884 |
(...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1995 // No further seek should have been requested since before Release(), above. | 2070 // No further seek should have been requested since before Release(), above. |
1996 EXPECT_EQ(1, demuxer_->num_seek_requests()); | 2071 EXPECT_EQ(1, demuxer_->num_seek_requests()); |
1997 } | 2072 } |
1998 | 2073 |
1999 TEST_F(MediaSourcePlayerTest, ConfigChangedThenReleaseThenStart) { | 2074 TEST_F(MediaSourcePlayerTest, ConfigChangedThenReleaseThenStart) { |
2000 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); | 2075 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); |
2001 | 2076 |
2002 // Test if Release() occurs after |kConfigChanged| is processed, new data | 2077 // Test if Release() occurs after |kConfigChanged| is processed, new data |
2003 // requested of demuxer, and the requested data arrive before the next | 2078 // requested of demuxer, and the requested data arrive before the next |
2004 // Start(), then the player starts to decode the new data without any seek. | 2079 // Start(), then the player starts to decode the new data without any seek. |
2005 StartConfigChange(true, true, 0); | 2080 StartConfigChange(true, true, 0, false); |
2006 ReleasePlayer(); | 2081 ReleasePlayer(); |
2007 | 2082 |
2008 EXPECT_TRUE(GetMediaCodecBridge(true)); | 2083 EXPECT_TRUE(GetMediaCodecBridge(true)); |
2009 EXPECT_FALSE(player_.IsPlaying()); | 2084 EXPECT_FALSE(player_.IsPlaying()); |
2010 EXPECT_EQ(3, demuxer_->num_data_requests()); | 2085 EXPECT_EQ(3, demuxer_->num_data_requests()); |
2011 player_.OnDemuxerDataAvailable( | 2086 player_.OnDemuxerDataAvailable( |
2012 CreateReadFromDemuxerAckWithConfigChanged( | 2087 CreateReadFromDemuxerAckWithConfigChanged( |
2013 true, 4, CreateAudioDemuxerConfigs(kCodecVorbis, false))); | 2088 true, 4, CreateAudioDemuxerConfigs(kCodecVorbis, false))); |
2014 WaitForAudioDecodeDone(); | 2089 WaitForAudioDecodeDone(); |
2015 EXPECT_FALSE(GetMediaCodecBridge(true)); | 2090 EXPECT_FALSE(GetMediaCodecBridge(true)); |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2129 | 2204 |
2130 DemuxerConfigs configs = CreateAudioDemuxerConfigs(kCodecVorbis, true); | 2205 DemuxerConfigs configs = CreateAudioDemuxerConfigs(kCodecVorbis, true); |
2131 DemuxerData data = CreateReadFromDemuxerAckWithConfigChanged( | 2206 DemuxerData data = CreateReadFromDemuxerAckWithConfigChanged( |
2132 true, 0, configs); | 2207 true, 0, configs); |
2133 player_.OnDemuxerDataAvailable(data); | 2208 player_.OnDemuxerDataAvailable(data); |
2134 WaitForAudioDecodeDone(); | 2209 WaitForAudioDecodeDone(); |
2135 DecodeAudioDataUntilOutputBecomesAvailable(); | 2210 DecodeAudioDataUntilOutputBecomesAvailable(); |
2136 } | 2211 } |
2137 | 2212 |
2138 } // namespace media | 2213 } // namespace media |
OLD | NEW |