| OLD | NEW |
| 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 <algorithm> | 5 #include <algorithm> |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/message_loop.h" | 8 #include "base/message_loop.h" |
| 9 #include "media/base/audio_decoder_config.h" | 9 #include "media/base/audio_decoder_config.h" |
| 10 #include "media/base/decoder_buffer.h" | 10 #include "media/base/decoder_buffer.h" |
| (...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 145 | 145 |
| 146 ChunkDemuxerTest() { | 146 ChunkDemuxerTest() { |
| 147 CreateNewDemuxer(); | 147 CreateNewDemuxer(); |
| 148 } | 148 } |
| 149 | 149 |
| 150 void CreateNewDemuxer() { | 150 void CreateNewDemuxer() { |
| 151 base::Closure open_cb = | 151 base::Closure open_cb = |
| 152 base::Bind(&ChunkDemuxerTest::DemuxerOpened, base::Unretained(this)); | 152 base::Bind(&ChunkDemuxerTest::DemuxerOpened, base::Unretained(this)); |
| 153 ChunkDemuxer::NeedKeyCB need_key_cb = | 153 ChunkDemuxer::NeedKeyCB need_key_cb = |
| 154 base::Bind(&ChunkDemuxerTest::DemuxerNeedKey, base::Unretained(this)); | 154 base::Bind(&ChunkDemuxerTest::DemuxerNeedKey, base::Unretained(this)); |
| 155 demuxer_ = new ChunkDemuxer(open_cb, need_key_cb, LogCB()); | 155 demuxer_.reset(new ChunkDemuxer(open_cb, need_key_cb, LogCB())); |
| 156 } | 156 } |
| 157 | 157 |
| 158 virtual ~ChunkDemuxerTest() { | 158 virtual ~ChunkDemuxerTest() { |
| 159 ShutdownDemuxer(); | 159 ShutdownDemuxer(); |
| 160 } | 160 } |
| 161 | 161 |
| 162 void CreateInitSegment(bool has_audio, bool has_video, | 162 void CreateInitSegment(bool has_audio, bool has_video, |
| 163 bool is_audio_encrypted, bool is_video_encrypted, | 163 bool is_audio_encrypted, bool is_video_encrypted, |
| 164 scoped_ptr<uint8[]>* buffer, | 164 scoped_ptr<uint8[]>* buffer, |
| 165 int* size) { | 165 int* size) { |
| (...skipping 389 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 555 AddVideoBlockGroup(&cb, track_number, timecode, block_duration, | 555 AddVideoBlockGroup(&cb, track_number, timecode, block_duration, |
| 556 kWebMFlagKeyframe); | 556 kWebMFlagKeyframe); |
| 557 } else { | 557 } else { |
| 558 cb.AddBlockGroup(track_number, timecode, block_duration, | 558 cb.AddBlockGroup(track_number, timecode, block_duration, |
| 559 kWebMFlagKeyframe, data.get(), size); | 559 kWebMFlagKeyframe, data.get(), size); |
| 560 } | 560 } |
| 561 return cb.Finish(); | 561 return cb.Finish(); |
| 562 } | 562 } |
| 563 | 563 |
| 564 void Read(DemuxerStream::Type type, const DemuxerStream::ReadCB& read_cb) { | 564 void Read(DemuxerStream::Type type, const DemuxerStream::ReadCB& read_cb) { |
| 565 scoped_refptr<DemuxerStream> stream = demuxer_->GetStream(type); | 565 demuxer_->GetStream(type)->Read(read_cb); |
| 566 stream->Read(read_cb); | |
| 567 message_loop_.RunUntilIdle(); | 566 message_loop_.RunUntilIdle(); |
| 568 } | 567 } |
| 569 | 568 |
| 570 void ReadAudio(const DemuxerStream::ReadCB& read_cb) { | 569 void ReadAudio(const DemuxerStream::ReadCB& read_cb) { |
| 571 Read(DemuxerStream::AUDIO, read_cb); | 570 Read(DemuxerStream::AUDIO, read_cb); |
| 572 } | 571 } |
| 573 | 572 |
| 574 void ReadVideo(const DemuxerStream::ReadCB& read_cb) { | 573 void ReadVideo(const DemuxerStream::ReadCB& read_cb) { |
| 575 Read(DemuxerStream::VIDEO, read_cb); | 574 Read(DemuxerStream::VIDEO, read_cb); |
| 576 } | 575 } |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 658 scoped_refptr<DecoderBuffer>* buffer_out, | 657 scoped_refptr<DecoderBuffer>* buffer_out, |
| 659 DemuxerStream::Status status, | 658 DemuxerStream::Status status, |
| 660 const scoped_refptr<DecoderBuffer>& buffer) { | 659 const scoped_refptr<DecoderBuffer>& buffer) { |
| 661 *status_out = status; | 660 *status_out = status; |
| 662 *buffer_out = buffer; | 661 *buffer_out = buffer; |
| 663 } | 662 } |
| 664 | 663 |
| 665 void ReadUntilNotOkOrEndOfStream(DemuxerStream::Type type, | 664 void ReadUntilNotOkOrEndOfStream(DemuxerStream::Type type, |
| 666 DemuxerStream::Status* status, | 665 DemuxerStream::Status* status, |
| 667 base::TimeDelta* last_timestamp) { | 666 base::TimeDelta* last_timestamp) { |
| 668 scoped_refptr<DemuxerStream> stream = demuxer_->GetStream(type); | 667 DemuxerStream* stream = demuxer_->GetStream(type); |
| 669 scoped_refptr<DecoderBuffer> buffer; | 668 scoped_refptr<DecoderBuffer> buffer; |
| 670 | 669 |
| 671 *last_timestamp = kNoTimestamp(); | 670 *last_timestamp = kNoTimestamp(); |
| 672 do { | 671 do { |
| 673 stream->Read(base::Bind(&ChunkDemuxerTest::StoreStatusAndBuffer, | 672 stream->Read(base::Bind(&ChunkDemuxerTest::StoreStatusAndBuffer, |
| 674 base::Unretained(this), status, &buffer)); | 673 base::Unretained(this), status, &buffer)); |
| 675 MessageLoop::current()->RunUntilIdle(); | 674 MessageLoop::current()->RunUntilIdle(); |
| 676 if (*status == DemuxerStream::kOk && !buffer->IsEndOfStream()) | 675 if (*status == DemuxerStream::kOk && !buffer->IsEndOfStream()) |
| 677 *last_timestamp = buffer->GetTimestamp(); | 676 *last_timestamp = buffer->GetTimestamp(); |
| 678 } while (*status == DemuxerStream::kOk && !buffer->IsEndOfStream()); | 677 } while (*status == DemuxerStream::kOk && !buffer->IsEndOfStream()); |
| 679 } | 678 } |
| 680 | 679 |
| 681 void ExpectEndOfStream(DemuxerStream::Type type) { | 680 void ExpectEndOfStream(DemuxerStream::Type type) { |
| 682 scoped_refptr<DemuxerStream> stream = demuxer_->GetStream(type); | |
| 683 EXPECT_CALL(*this, ReadDone(DemuxerStream::kOk, IsEndOfStream())); | 681 EXPECT_CALL(*this, ReadDone(DemuxerStream::kOk, IsEndOfStream())); |
| 684 stream->Read(base::Bind(&ChunkDemuxerTest::ReadDone, | 682 demuxer_->GetStream(type)->Read(base::Bind( |
| 685 base::Unretained(this))); | 683 &ChunkDemuxerTest::ReadDone, base::Unretained(this))); |
| 686 message_loop_.RunUntilIdle(); | 684 message_loop_.RunUntilIdle(); |
| 687 } | 685 } |
| 688 | 686 |
| 689 void ExpectRead(DemuxerStream::Type type, int64 timestamp_in_ms) { | 687 void ExpectRead(DemuxerStream::Type type, int64 timestamp_in_ms) { |
| 690 scoped_refptr<DemuxerStream> stream = demuxer_->GetStream(type); | |
| 691 EXPECT_CALL(*this, ReadDone(DemuxerStream::kOk, | 688 EXPECT_CALL(*this, ReadDone(DemuxerStream::kOk, |
| 692 HasTimestamp(timestamp_in_ms))); | 689 HasTimestamp(timestamp_in_ms))); |
| 693 stream->Read(base::Bind(&ChunkDemuxerTest::ReadDone, | 690 demuxer_->GetStream(type)->Read(base::Bind( |
| 694 base::Unretained(this))); | 691 &ChunkDemuxerTest::ReadDone, base::Unretained(this))); |
| 695 message_loop_.RunUntilIdle(); | 692 message_loop_.RunUntilIdle(); |
| 696 } | 693 } |
| 697 | 694 |
| 698 void ExpectConfigChanged(DemuxerStream::Type type) { | 695 void ExpectConfigChanged(DemuxerStream::Type type) { |
| 699 scoped_refptr<DemuxerStream> stream = demuxer_->GetStream(type); | |
| 700 EXPECT_CALL(*this, ReadDone(DemuxerStream::kConfigChanged, _)); | 696 EXPECT_CALL(*this, ReadDone(DemuxerStream::kConfigChanged, _)); |
| 701 stream->Read(base::Bind(&ChunkDemuxerTest::ReadDone, | 697 demuxer_->GetStream(type)->Read(base::Bind( |
| 702 base::Unretained(this))); | 698 &ChunkDemuxerTest::ReadDone, base::Unretained(this))); |
| 703 message_loop_.RunUntilIdle(); | 699 message_loop_.RunUntilIdle(); |
| 704 } | 700 } |
| 705 | 701 |
| 706 MOCK_METHOD1(Checkpoint, void(int id)); | 702 MOCK_METHOD1(Checkpoint, void(int id)); |
| 707 | 703 |
| 708 struct BufferTimestamps { | 704 struct BufferTimestamps { |
| 709 int video_time_ms; | 705 int video_time_ms; |
| 710 int audio_time_ms; | 706 int audio_time_ms; |
| 711 }; | 707 }; |
| 712 static const int kSkip = -1; | 708 static const int kSkip = -1; |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 775 MOCK_METHOD3(NeedKeyMock, void(const std::string& type, | 771 MOCK_METHOD3(NeedKeyMock, void(const std::string& type, |
| 776 const uint8* init_data, int init_data_size)); | 772 const uint8* init_data, int init_data_size)); |
| 777 void DemuxerNeedKey(const std::string& type, | 773 void DemuxerNeedKey(const std::string& type, |
| 778 scoped_ptr<uint8[]> init_data, int init_data_size) { | 774 scoped_ptr<uint8[]> init_data, int init_data_size) { |
| 779 NeedKeyMock(type, init_data.get(), init_data_size); | 775 NeedKeyMock(type, init_data.get(), init_data_size); |
| 780 } | 776 } |
| 781 | 777 |
| 782 MessageLoop message_loop_; | 778 MessageLoop message_loop_; |
| 783 MockDemuxerHost host_; | 779 MockDemuxerHost host_; |
| 784 | 780 |
| 785 scoped_refptr<ChunkDemuxer> demuxer_; | 781 scoped_ptr<ChunkDemuxer> demuxer_; |
| 786 | 782 |
| 787 private: | 783 private: |
| 788 DISALLOW_COPY_AND_ASSIGN(ChunkDemuxerTest); | 784 DISALLOW_COPY_AND_ASSIGN(ChunkDemuxerTest); |
| 789 }; | 785 }; |
| 790 | 786 |
| 791 TEST_F(ChunkDemuxerTest, TestInit) { | 787 TEST_F(ChunkDemuxerTest, TestInit) { |
| 792 // Test no streams, audio-only, video-only, and audio & video scenarios. | 788 // Test no streams, audio-only, video-only, and audio & video scenarios. |
| 793 // Audio and video streams can be encrypted or not encrypted. | 789 // Audio and video streams can be encrypted or not encrypted. |
| 794 for (int i = 0; i < 16; i++) { | 790 for (int i = 0; i < 16; i++) { |
| 795 bool has_audio = (i & 0x1) != 0; | 791 bool has_audio = (i & 0x1) != 0; |
| (...skipping 13 matching lines...) Expand all Loading... |
| 809 int need_key_count = (is_audio_encrypted ? 1 : 0) + | 805 int need_key_count = (is_audio_encrypted ? 1 : 0) + |
| 810 (is_video_encrypted ? 1 : 0); | 806 (is_video_encrypted ? 1 : 0); |
| 811 EXPECT_CALL(*this, NeedKeyMock(kWebMEncryptInitDataType, NotNull(), | 807 EXPECT_CALL(*this, NeedKeyMock(kWebMEncryptInitDataType, NotNull(), |
| 812 DecryptConfig::kDecryptionKeySize)) | 808 DecryptConfig::kDecryptionKeySize)) |
| 813 .Times(Exactly(need_key_count)); | 809 .Times(Exactly(need_key_count)); |
| 814 } | 810 } |
| 815 | 811 |
| 816 ASSERT_TRUE(InitDemuxerWithEncryptionInfo( | 812 ASSERT_TRUE(InitDemuxerWithEncryptionInfo( |
| 817 has_audio, has_video, is_audio_encrypted, is_video_encrypted)); | 813 has_audio, has_video, is_audio_encrypted, is_video_encrypted)); |
| 818 | 814 |
| 819 scoped_refptr<DemuxerStream> audio_stream = | 815 DemuxerStream* audio_stream = demuxer_->GetStream(DemuxerStream::AUDIO); |
| 820 demuxer_->GetStream(DemuxerStream::AUDIO); | |
| 821 if (has_audio) { | 816 if (has_audio) { |
| 822 ASSERT_TRUE(audio_stream); | 817 ASSERT_TRUE(audio_stream); |
| 823 | 818 |
| 824 const AudioDecoderConfig& config = audio_stream->audio_decoder_config(); | 819 const AudioDecoderConfig& config = audio_stream->audio_decoder_config(); |
| 825 EXPECT_EQ(kCodecVorbis, config.codec()); | 820 EXPECT_EQ(kCodecVorbis, config.codec()); |
| 826 EXPECT_EQ(32, config.bits_per_channel()); | 821 EXPECT_EQ(32, config.bits_per_channel()); |
| 827 EXPECT_EQ(CHANNEL_LAYOUT_STEREO, config.channel_layout()); | 822 EXPECT_EQ(CHANNEL_LAYOUT_STEREO, config.channel_layout()); |
| 828 EXPECT_EQ(44100, config.samples_per_second()); | 823 EXPECT_EQ(44100, config.samples_per_second()); |
| 829 EXPECT_TRUE(config.extra_data()); | 824 EXPECT_TRUE(config.extra_data()); |
| 830 EXPECT_GT(config.extra_data_size(), 0u); | 825 EXPECT_GT(config.extra_data_size(), 0u); |
| 831 EXPECT_EQ(kSampleFormatPlanarF32, config.sample_format()); | 826 EXPECT_EQ(kSampleFormatPlanarF32, config.sample_format()); |
| 832 EXPECT_EQ(is_audio_encrypted, | 827 EXPECT_EQ(is_audio_encrypted, |
| 833 audio_stream->audio_decoder_config().is_encrypted()); | 828 audio_stream->audio_decoder_config().is_encrypted()); |
| 834 } else { | 829 } else { |
| 835 EXPECT_FALSE(audio_stream); | 830 EXPECT_FALSE(audio_stream); |
| 836 } | 831 } |
| 837 | 832 |
| 838 scoped_refptr<DemuxerStream> video_stream = | 833 DemuxerStream* video_stream = demuxer_->GetStream(DemuxerStream::VIDEO); |
| 839 demuxer_->GetStream(DemuxerStream::VIDEO); | |
| 840 if (has_video) { | 834 if (has_video) { |
| 841 EXPECT_TRUE(video_stream); | 835 EXPECT_TRUE(video_stream); |
| 842 EXPECT_EQ(is_video_encrypted, | 836 EXPECT_EQ(is_video_encrypted, |
| 843 video_stream->video_decoder_config().is_encrypted()); | 837 video_stream->video_decoder_config().is_encrypted()); |
| 844 } else { | 838 } else { |
| 845 EXPECT_FALSE(video_stream); | 839 EXPECT_FALSE(video_stream); |
| 846 } | 840 } |
| 847 | 841 |
| 848 ShutdownDemuxer(); | 842 ShutdownDemuxer(); |
| 849 demuxer_ = NULL; | 843 demuxer_.reset(); |
| 850 } | 844 } |
| 851 } | 845 } |
| 852 | 846 |
| 853 // Make sure that the demuxer reports an error if Shutdown() | 847 // Make sure that the demuxer reports an error if Shutdown() |
| 854 // is called before all the initialization segments are appended. | 848 // is called before all the initialization segments are appended. |
| 855 TEST_F(ChunkDemuxerTest, TestShutdownBeforeAllInitSegmentsAppended) { | 849 TEST_F(ChunkDemuxerTest, TestShutdownBeforeAllInitSegmentsAppended) { |
| 856 EXPECT_CALL(*this, DemuxerOpened()); | 850 EXPECT_CALL(*this, DemuxerOpened()); |
| 857 demuxer_->Initialize( | 851 demuxer_->Initialize( |
| 858 &host_, CreateInitDoneCB( | 852 &host_, CreateInitDoneCB( |
| 859 kDefaultDuration(), DEMUXER_ERROR_COULD_NOT_OPEN)); | 853 kDefaultDuration(), DEMUXER_ERROR_COULD_NOT_OPEN)); |
| (...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1083 demuxer_->Initialize( | 1077 demuxer_->Initialize( |
| 1084 &host_, NewExpectedStatusCB(DEMUXER_ERROR_COULD_NOT_OPEN)); | 1078 &host_, NewExpectedStatusCB(DEMUXER_ERROR_COULD_NOT_OPEN)); |
| 1085 | 1079 |
| 1086 ASSERT_EQ(AddId(), ChunkDemuxer::kOk); | 1080 ASSERT_EQ(AddId(), ChunkDemuxer::kOk); |
| 1087 | 1081 |
| 1088 CheckExpectedRanges("{ }"); | 1082 CheckExpectedRanges("{ }"); |
| 1089 demuxer_->EndOfStream(PIPELINE_OK); | 1083 demuxer_->EndOfStream(PIPELINE_OK); |
| 1090 ShutdownDemuxer(); | 1084 ShutdownDemuxer(); |
| 1091 CheckExpectedRanges("{ }"); | 1085 CheckExpectedRanges("{ }"); |
| 1092 demuxer_->RemoveId(kSourceId); | 1086 demuxer_->RemoveId(kSourceId); |
| 1093 demuxer_ = NULL; | 1087 demuxer_.reset(); |
| 1094 } | 1088 } |
| 1095 | 1089 |
| 1096 TEST_F(ChunkDemuxerTest, TestEndOfStreamWithNoMediaAppend) { | 1090 TEST_F(ChunkDemuxerTest, TestEndOfStreamWithNoMediaAppend) { |
| 1097 ASSERT_TRUE(InitDemuxer(true, true)); | 1091 ASSERT_TRUE(InitDemuxer(true, true)); |
| 1098 | 1092 |
| 1099 CheckExpectedRanges("{ }"); | 1093 CheckExpectedRanges("{ }"); |
| 1100 demuxer_->EndOfStream(PIPELINE_OK); | 1094 demuxer_->EndOfStream(PIPELINE_OK); |
| 1101 CheckExpectedRanges("{ }"); | 1095 CheckExpectedRanges("{ }"); |
| 1102 } | 1096 } |
| 1103 | 1097 |
| (...skipping 17 matching lines...) Expand all Loading... |
| 1121 CheckExpectedRanges(kDefaultFirstClusterRange); | 1115 CheckExpectedRanges(kDefaultFirstClusterRange); |
| 1122 | 1116 |
| 1123 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_NETWORK)); | 1117 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_NETWORK)); |
| 1124 demuxer_->EndOfStream(PIPELINE_ERROR_NETWORK); | 1118 demuxer_->EndOfStream(PIPELINE_ERROR_NETWORK); |
| 1125 } | 1119 } |
| 1126 | 1120 |
| 1127 // Helper class to reduce duplicate code when testing end of stream | 1121 // Helper class to reduce duplicate code when testing end of stream |
| 1128 // Read() behavior. | 1122 // Read() behavior. |
| 1129 class EndOfStreamHelper { | 1123 class EndOfStreamHelper { |
| 1130 public: | 1124 public: |
| 1131 explicit EndOfStreamHelper(const scoped_refptr<Demuxer> demuxer) | 1125 explicit EndOfStreamHelper(Demuxer* demuxer) |
| 1132 : demuxer_(demuxer), | 1126 : demuxer_(demuxer), |
| 1133 audio_read_done_(false), | 1127 audio_read_done_(false), |
| 1134 video_read_done_(false) { | 1128 video_read_done_(false) { |
| 1135 } | 1129 } |
| 1136 | 1130 |
| 1137 // Request a read on the audio and video streams. | 1131 // Request a read on the audio and video streams. |
| 1138 void RequestReads() { | 1132 void RequestReads() { |
| 1139 EXPECT_FALSE(audio_read_done_); | 1133 EXPECT_FALSE(audio_read_done_); |
| 1140 EXPECT_FALSE(video_read_done_); | 1134 EXPECT_FALSE(video_read_done_); |
| 1141 | 1135 |
| 1142 scoped_refptr<DemuxerStream> audio = | 1136 DemuxerStream* audio = demuxer_->GetStream(DemuxerStream::AUDIO); |
| 1143 demuxer_->GetStream(DemuxerStream::AUDIO); | 1137 DemuxerStream* video = demuxer_->GetStream(DemuxerStream::VIDEO); |
| 1144 scoped_refptr<DemuxerStream> video = | |
| 1145 demuxer_->GetStream(DemuxerStream::VIDEO); | |
| 1146 | 1138 |
| 1147 audio->Read(base::Bind(&OnEndOfStreamReadDone, &audio_read_done_)); | 1139 audio->Read(base::Bind(&OnEndOfStreamReadDone, &audio_read_done_)); |
| 1148 video->Read(base::Bind(&OnEndOfStreamReadDone, &video_read_done_)); | 1140 video->Read(base::Bind(&OnEndOfStreamReadDone, &video_read_done_)); |
| 1149 MessageLoop::current()->RunUntilIdle(); | 1141 MessageLoop::current()->RunUntilIdle(); |
| 1150 } | 1142 } |
| 1151 | 1143 |
| 1152 // Check to see if |audio_read_done_| and |video_read_done_| variables | 1144 // Check to see if |audio_read_done_| and |video_read_done_| variables |
| 1153 // match |expected|. | 1145 // match |expected|. |
| 1154 void CheckIfReadDonesWereCalled(bool expected) { | 1146 void CheckIfReadDonesWereCalled(bool expected) { |
| 1155 EXPECT_EQ(expected, audio_read_done_); | 1147 EXPECT_EQ(expected, audio_read_done_); |
| 1156 EXPECT_EQ(expected, video_read_done_); | 1148 EXPECT_EQ(expected, video_read_done_); |
| 1157 } | 1149 } |
| 1158 | 1150 |
| 1159 private: | 1151 private: |
| 1160 static void OnEndOfStreamReadDone( | 1152 static void OnEndOfStreamReadDone( |
| 1161 bool* called, | 1153 bool* called, |
| 1162 DemuxerStream::Status status, | 1154 DemuxerStream::Status status, |
| 1163 const scoped_refptr<DecoderBuffer>& buffer) { | 1155 const scoped_refptr<DecoderBuffer>& buffer) { |
| 1164 EXPECT_EQ(status, DemuxerStream::kOk); | 1156 EXPECT_EQ(status, DemuxerStream::kOk); |
| 1165 EXPECT_TRUE(buffer->IsEndOfStream()); | 1157 EXPECT_TRUE(buffer->IsEndOfStream()); |
| 1166 *called = true; | 1158 *called = true; |
| 1167 } | 1159 } |
| 1168 | 1160 |
| 1169 scoped_refptr<Demuxer> demuxer_; | 1161 Demuxer* demuxer_; |
| 1170 bool audio_read_done_; | 1162 bool audio_read_done_; |
| 1171 bool video_read_done_; | 1163 bool video_read_done_; |
| 1172 | 1164 |
| 1173 DISALLOW_COPY_AND_ASSIGN(EndOfStreamHelper); | 1165 DISALLOW_COPY_AND_ASSIGN(EndOfStreamHelper); |
| 1174 }; | 1166 }; |
| 1175 | 1167 |
| 1176 // Make sure that all pending reads that we don't have media data for get an | 1168 // Make sure that all pending reads that we don't have media data for get an |
| 1177 // "end of stream" buffer when EndOfStream() is called. | 1169 // "end of stream" buffer when EndOfStream() is called. |
| 1178 TEST_F(ChunkDemuxerTest, TestEndOfStreamWithPendingReads) { | 1170 TEST_F(ChunkDemuxerTest, TestEndOfStreamWithPendingReads) { |
| 1179 ASSERT_TRUE(InitDemuxer(true, true)); | 1171 ASSERT_TRUE(InitDemuxer(true, true)); |
| 1180 | 1172 |
| 1181 scoped_ptr<Cluster> cluster(GenerateCluster(0, 2)); | 1173 scoped_ptr<Cluster> cluster(GenerateCluster(0, 2)); |
| 1182 AppendData(cluster->data(), cluster->size()); | 1174 AppendData(cluster->data(), cluster->size()); |
| 1183 | 1175 |
| 1184 bool audio_read_done_1 = false; | 1176 bool audio_read_done_1 = false; |
| 1185 bool video_read_done_1 = false; | 1177 bool video_read_done_1 = false; |
| 1186 EndOfStreamHelper end_of_stream_helper_1(demuxer_); | 1178 EndOfStreamHelper end_of_stream_helper_1(demuxer_.get()); |
| 1187 EndOfStreamHelper end_of_stream_helper_2(demuxer_); | 1179 EndOfStreamHelper end_of_stream_helper_2(demuxer_.get()); |
| 1188 | 1180 |
| 1189 ReadAudio(base::Bind(&OnReadDone, | 1181 ReadAudio(base::Bind(&OnReadDone, |
| 1190 base::TimeDelta::FromMilliseconds(0), | 1182 base::TimeDelta::FromMilliseconds(0), |
| 1191 &audio_read_done_1)); | 1183 &audio_read_done_1)); |
| 1192 ReadVideo(base::Bind(&OnReadDone, | 1184 ReadVideo(base::Bind(&OnReadDone, |
| 1193 base::TimeDelta::FromMilliseconds(0), | 1185 base::TimeDelta::FromMilliseconds(0), |
| 1194 &video_read_done_1)); | 1186 &video_read_done_1)); |
| 1195 | 1187 |
| 1196 end_of_stream_helper_1.RequestReads(); | 1188 end_of_stream_helper_1.RequestReads(); |
| 1197 end_of_stream_helper_2.RequestReads(); | 1189 end_of_stream_helper_2.RequestReads(); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 1212 // Make sure that all Read() calls after we get an EndOfStream() | 1204 // Make sure that all Read() calls after we get an EndOfStream() |
| 1213 // call return an "end of stream" buffer. | 1205 // call return an "end of stream" buffer. |
| 1214 TEST_F(ChunkDemuxerTest, TestReadsAfterEndOfStream) { | 1206 TEST_F(ChunkDemuxerTest, TestReadsAfterEndOfStream) { |
| 1215 ASSERT_TRUE(InitDemuxer(true, true)); | 1207 ASSERT_TRUE(InitDemuxer(true, true)); |
| 1216 | 1208 |
| 1217 scoped_ptr<Cluster> cluster(GenerateCluster(0, 2)); | 1209 scoped_ptr<Cluster> cluster(GenerateCluster(0, 2)); |
| 1218 AppendData(cluster->data(), cluster->size()); | 1210 AppendData(cluster->data(), cluster->size()); |
| 1219 | 1211 |
| 1220 bool audio_read_done_1 = false; | 1212 bool audio_read_done_1 = false; |
| 1221 bool video_read_done_1 = false; | 1213 bool video_read_done_1 = false; |
| 1222 EndOfStreamHelper end_of_stream_helper_1(demuxer_); | 1214 EndOfStreamHelper end_of_stream_helper_1(demuxer_.get()); |
| 1223 EndOfStreamHelper end_of_stream_helper_2(demuxer_); | 1215 EndOfStreamHelper end_of_stream_helper_2(demuxer_.get()); |
| 1224 EndOfStreamHelper end_of_stream_helper_3(demuxer_); | 1216 EndOfStreamHelper end_of_stream_helper_3(demuxer_.get()); |
| 1225 | 1217 |
| 1226 ReadAudio(base::Bind(&OnReadDone, | 1218 ReadAudio(base::Bind(&OnReadDone, |
| 1227 base::TimeDelta::FromMilliseconds(0), | 1219 base::TimeDelta::FromMilliseconds(0), |
| 1228 &audio_read_done_1)); | 1220 &audio_read_done_1)); |
| 1229 ReadVideo(base::Bind(&OnReadDone, | 1221 ReadVideo(base::Bind(&OnReadDone, |
| 1230 base::TimeDelta::FromMilliseconds(0), | 1222 base::TimeDelta::FromMilliseconds(0), |
| 1231 &video_read_done_1)); | 1223 &video_read_done_1)); |
| 1232 | 1224 |
| 1233 end_of_stream_helper_1.RequestReads(); | 1225 end_of_stream_helper_1.RequestReads(); |
| 1234 | 1226 |
| (...skipping 882 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2117 EXPECT_CALL(host_, SetDuration( | 2109 EXPECT_CALL(host_, SetDuration( |
| 2118 base::TimeDelta::FromMilliseconds(kDefaultSecondClusterEndTimestamp))); | 2110 base::TimeDelta::FromMilliseconds(kDefaultSecondClusterEndTimestamp))); |
| 2119 demuxer_->EndOfStream(PIPELINE_OK); | 2111 demuxer_->EndOfStream(PIPELINE_OK); |
| 2120 | 2112 |
| 2121 demuxer_->Seek(base::TimeDelta::FromSeconds(0), | 2113 demuxer_->Seek(base::TimeDelta::FromSeconds(0), |
| 2122 NewExpectedStatusCB(PIPELINE_OK)); | 2114 NewExpectedStatusCB(PIPELINE_OK)); |
| 2123 | 2115 |
| 2124 GenerateExpectedReads(0, 4); | 2116 GenerateExpectedReads(0, 4); |
| 2125 GenerateExpectedReads(46, 66, 5); | 2117 GenerateExpectedReads(46, 66, 5); |
| 2126 | 2118 |
| 2127 EndOfStreamHelper end_of_stream_helper(demuxer_); | 2119 EndOfStreamHelper end_of_stream_helper(demuxer_.get()); |
| 2128 end_of_stream_helper.RequestReads(); | 2120 end_of_stream_helper.RequestReads(); |
| 2129 end_of_stream_helper.CheckIfReadDonesWereCalled(true); | 2121 end_of_stream_helper.CheckIfReadDonesWereCalled(true); |
| 2130 } | 2122 } |
| 2131 | 2123 |
| 2132 TEST_F(ChunkDemuxerTest, TestConfigChange_Video) { | 2124 TEST_F(ChunkDemuxerTest, TestConfigChange_Video) { |
| 2133 InSequence s; | 2125 InSequence s; |
| 2134 | 2126 |
| 2135 ASSERT_TRUE(InitDemuxerWithConfigChangeData()); | 2127 ASSERT_TRUE(InitDemuxerWithConfigChangeData()); |
| 2136 | 2128 |
| 2137 DemuxerStream::Status status; | 2129 DemuxerStream::Status status; |
| 2138 base::TimeDelta last_timestamp; | 2130 base::TimeDelta last_timestamp; |
| 2139 | 2131 |
| 2140 scoped_refptr<DemuxerStream> video = | 2132 DemuxerStream* video = demuxer_->GetStream(DemuxerStream::VIDEO); |
| 2141 demuxer_->GetStream(DemuxerStream::VIDEO); | |
| 2142 | 2133 |
| 2143 // Fetch initial video config and verify it matches what we expect. | 2134 // Fetch initial video config and verify it matches what we expect. |
| 2144 const VideoDecoderConfig& video_config_1 = video->video_decoder_config(); | 2135 const VideoDecoderConfig& video_config_1 = video->video_decoder_config(); |
| 2145 ASSERT_TRUE(video_config_1.IsValidConfig()); | 2136 ASSERT_TRUE(video_config_1.IsValidConfig()); |
| 2146 EXPECT_EQ(video_config_1.natural_size().width(), 320); | 2137 EXPECT_EQ(video_config_1.natural_size().width(), 320); |
| 2147 EXPECT_EQ(video_config_1.natural_size().height(), 240); | 2138 EXPECT_EQ(video_config_1.natural_size().height(), 240); |
| 2148 | 2139 |
| 2149 ExpectRead(DemuxerStream::VIDEO, 0); | 2140 ExpectRead(DemuxerStream::VIDEO, 0); |
| 2150 | 2141 |
| 2151 ReadUntilNotOkOrEndOfStream(DemuxerStream::VIDEO, &status, &last_timestamp); | 2142 ReadUntilNotOkOrEndOfStream(DemuxerStream::VIDEO, &status, &last_timestamp); |
| (...skipping 26 matching lines...) Expand all Loading... |
| 2178 } | 2169 } |
| 2179 | 2170 |
| 2180 TEST_F(ChunkDemuxerTest, TestConfigChange_Audio) { | 2171 TEST_F(ChunkDemuxerTest, TestConfigChange_Audio) { |
| 2181 InSequence s; | 2172 InSequence s; |
| 2182 | 2173 |
| 2183 ASSERT_TRUE(InitDemuxerWithConfigChangeData()); | 2174 ASSERT_TRUE(InitDemuxerWithConfigChangeData()); |
| 2184 | 2175 |
| 2185 DemuxerStream::Status status; | 2176 DemuxerStream::Status status; |
| 2186 base::TimeDelta last_timestamp; | 2177 base::TimeDelta last_timestamp; |
| 2187 | 2178 |
| 2188 scoped_refptr<DemuxerStream> audio = | 2179 DemuxerStream* audio = demuxer_->GetStream(DemuxerStream::AUDIO); |
| 2189 demuxer_->GetStream(DemuxerStream::AUDIO); | |
| 2190 | 2180 |
| 2191 // Fetch initial audio config and verify it matches what we expect. | 2181 // Fetch initial audio config and verify it matches what we expect. |
| 2192 const AudioDecoderConfig& audio_config_1 = audio->audio_decoder_config(); | 2182 const AudioDecoderConfig& audio_config_1 = audio->audio_decoder_config(); |
| 2193 ASSERT_TRUE(audio_config_1.IsValidConfig()); | 2183 ASSERT_TRUE(audio_config_1.IsValidConfig()); |
| 2194 EXPECT_EQ(audio_config_1.samples_per_second(), 44100); | 2184 EXPECT_EQ(audio_config_1.samples_per_second(), 44100); |
| 2195 EXPECT_EQ(audio_config_1.extra_data_size(), 3863u); | 2185 EXPECT_EQ(audio_config_1.extra_data_size(), 3863u); |
| 2196 | 2186 |
| 2197 ExpectRead(DemuxerStream::AUDIO, 0); | 2187 ExpectRead(DemuxerStream::AUDIO, 0); |
| 2198 | 2188 |
| 2199 ReadUntilNotOkOrEndOfStream(DemuxerStream::AUDIO, &status, &last_timestamp); | 2189 ReadUntilNotOkOrEndOfStream(DemuxerStream::AUDIO, &status, &last_timestamp); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 2223 // config changes. | 2213 // config changes. |
| 2224 ReadUntilNotOkOrEndOfStream(DemuxerStream::AUDIO, &status, &last_timestamp); | 2214 ReadUntilNotOkOrEndOfStream(DemuxerStream::AUDIO, &status, &last_timestamp); |
| 2225 ASSERT_EQ(status, DemuxerStream::kOk); | 2215 ASSERT_EQ(status, DemuxerStream::kOk); |
| 2226 } | 2216 } |
| 2227 | 2217 |
| 2228 TEST_F(ChunkDemuxerTest, TestConfigChange_Seek) { | 2218 TEST_F(ChunkDemuxerTest, TestConfigChange_Seek) { |
| 2229 InSequence s; | 2219 InSequence s; |
| 2230 | 2220 |
| 2231 ASSERT_TRUE(InitDemuxerWithConfigChangeData()); | 2221 ASSERT_TRUE(InitDemuxerWithConfigChangeData()); |
| 2232 | 2222 |
| 2233 scoped_refptr<DemuxerStream> video = | 2223 DemuxerStream* video = demuxer_->GetStream(DemuxerStream::VIDEO); |
| 2234 demuxer_->GetStream(DemuxerStream::VIDEO); | |
| 2235 | 2224 |
| 2236 // Fetch initial video config and verify it matches what we expect. | 2225 // Fetch initial video config and verify it matches what we expect. |
| 2237 const VideoDecoderConfig& video_config_1 = video->video_decoder_config(); | 2226 const VideoDecoderConfig& video_config_1 = video->video_decoder_config(); |
| 2238 ASSERT_TRUE(video_config_1.IsValidConfig()); | 2227 ASSERT_TRUE(video_config_1.IsValidConfig()); |
| 2239 EXPECT_EQ(video_config_1.natural_size().width(), 320); | 2228 EXPECT_EQ(video_config_1.natural_size().width(), 320); |
| 2240 EXPECT_EQ(video_config_1.natural_size().height(), 240); | 2229 EXPECT_EQ(video_config_1.natural_size().height(), 240); |
| 2241 | 2230 |
| 2242 ExpectRead(DemuxerStream::VIDEO, 0); | 2231 ExpectRead(DemuxerStream::VIDEO, 0); |
| 2243 | 2232 |
| 2244 // Seek to a location with a different config. | 2233 // Seek to a location with a different config. |
| (...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2449 // call. This can happen if video element gets destroyed before | 2438 // call. This can happen if video element gets destroyed before |
| 2450 // the pipeline has a chance to initialize the demuxer. | 2439 // the pipeline has a chance to initialize the demuxer. |
| 2451 TEST_F(ChunkDemuxerTest, TestShutdownBeforeInitialize) { | 2440 TEST_F(ChunkDemuxerTest, TestShutdownBeforeInitialize) { |
| 2452 demuxer_->Shutdown(); | 2441 demuxer_->Shutdown(); |
| 2453 demuxer_->Initialize( | 2442 demuxer_->Initialize( |
| 2454 &host_, CreateInitDoneCB(DEMUXER_ERROR_COULD_NOT_OPEN)); | 2443 &host_, CreateInitDoneCB(DEMUXER_ERROR_COULD_NOT_OPEN)); |
| 2455 message_loop_.RunUntilIdle(); | 2444 message_loop_.RunUntilIdle(); |
| 2456 } | 2445 } |
| 2457 | 2446 |
| 2458 } // namespace media | 2447 } // namespace media |
| OLD | NEW |