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 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
82 DCHECK(number >= 0 && number < GG_LONGLONG(0x00FFFFFFFFFFFFFF)); | 82 DCHECK(number >= 0 && number < GG_LONGLONG(0x00FFFFFFFFFFFFFF)); |
83 buffer[0] = 0x01; | 83 buffer[0] = 0x01; |
84 int64 tmp = number; | 84 int64 tmp = number; |
85 for (int i = 7; i > 0; i--) { | 85 for (int i = 7; i > 0; i--) { |
86 buffer[i] = tmp & 0xff; | 86 buffer[i] = tmp & 0xff; |
87 tmp >>= 8; | 87 tmp >>= 8; |
88 } | 88 } |
89 } | 89 } |
90 | 90 |
91 MATCHER_P(HasTimestamp, timestamp_in_ms, "") { | 91 MATCHER_P(HasTimestamp, timestamp_in_ms, "") { |
92 return arg.get() && !arg->IsEndOfStream() && | 92 return arg.get() && !arg->end_of_stream() && |
93 arg->GetTimestamp().InMilliseconds() == timestamp_in_ms; | 93 arg->timestamp().InMilliseconds() == timestamp_in_ms; |
94 } | 94 } |
95 | 95 |
96 MATCHER(IsEndOfStream, "") { return arg.get() && arg->IsEndOfStream(); } | 96 MATCHER(IsEndOfStream, "") { return arg.get() && arg->end_of_stream(); } |
97 | 97 |
98 static void OnReadDone(const base::TimeDelta& expected_time, | 98 static void OnReadDone(const base::TimeDelta& expected_time, |
99 bool* called, | 99 bool* called, |
100 DemuxerStream::Status status, | 100 DemuxerStream::Status status, |
101 const scoped_refptr<DecoderBuffer>& buffer) { | 101 const scoped_refptr<DecoderBuffer>& buffer) { |
102 EXPECT_EQ(status, DemuxerStream::kOk); | 102 EXPECT_EQ(status, DemuxerStream::kOk); |
103 EXPECT_EQ(expected_time, buffer->GetTimestamp()); | 103 EXPECT_EQ(expected_time, buffer->timestamp()); |
104 *called = true; | 104 *called = true; |
105 } | 105 } |
106 | 106 |
107 static void OnReadDone_AbortExpected( | 107 static void OnReadDone_AbortExpected( |
108 bool* called, DemuxerStream::Status status, | 108 bool* called, DemuxerStream::Status status, |
109 const scoped_refptr<DecoderBuffer>& buffer) { | 109 const scoped_refptr<DecoderBuffer>& buffer) { |
110 EXPECT_EQ(status, DemuxerStream::kAborted); | 110 EXPECT_EQ(status, DemuxerStream::kAborted); |
111 EXPECT_EQ(NULL, buffer.get()); | 111 EXPECT_EQ(NULL, buffer.get()); |
112 *called = true; | 112 *called = true; |
113 } | 113 } |
114 | 114 |
115 static void OnReadDone_EOSExpected(bool* called, | 115 static void OnReadDone_EOSExpected(bool* called, |
116 DemuxerStream::Status status, | 116 DemuxerStream::Status status, |
117 const scoped_refptr<DecoderBuffer>& buffer) { | 117 const scoped_refptr<DecoderBuffer>& buffer) { |
118 EXPECT_EQ(status, DemuxerStream::kOk); | 118 EXPECT_EQ(status, DemuxerStream::kOk); |
119 EXPECT_TRUE(buffer->IsEndOfStream()); | 119 EXPECT_TRUE(buffer->end_of_stream()); |
120 *called = true; | 120 *called = true; |
121 } | 121 } |
122 | 122 |
123 static void OnSeekDone_OKExpected(bool* called, PipelineStatus status) { | 123 static void OnSeekDone_OKExpected(bool* called, PipelineStatus status) { |
124 EXPECT_EQ(status, PIPELINE_OK); | 124 EXPECT_EQ(status, PIPELINE_OK); |
125 *called = true; | 125 *called = true; |
126 } | 126 } |
127 | 127 |
128 class ChunkDemuxerTest : public testing::Test { | 128 class ChunkDemuxerTest : public testing::Test { |
129 protected: | 129 protected: |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
178 scoped_refptr<DecoderBuffer> video_content_encodings; | 178 scoped_refptr<DecoderBuffer> video_content_encodings; |
179 | 179 |
180 ebml_header = ReadTestDataFile("webm_ebml_element"); | 180 ebml_header = ReadTestDataFile("webm_ebml_element"); |
181 | 181 |
182 info = ReadTestDataFile("webm_info_element"); | 182 info = ReadTestDataFile("webm_info_element"); |
183 | 183 |
184 int tracks_element_size = 0; | 184 int tracks_element_size = 0; |
185 | 185 |
186 if (has_audio) { | 186 if (has_audio) { |
187 audio_track_entry = ReadTestDataFile("webm_vorbis_track_entry"); | 187 audio_track_entry = ReadTestDataFile("webm_vorbis_track_entry"); |
188 tracks_element_size += audio_track_entry->GetDataSize(); | 188 tracks_element_size += audio_track_entry->data_size(); |
189 if (is_audio_encrypted) { | 189 if (is_audio_encrypted) { |
190 audio_content_encodings = ReadTestDataFile("webm_content_encodings"); | 190 audio_content_encodings = ReadTestDataFile("webm_content_encodings"); |
191 tracks_element_size += audio_content_encodings->GetDataSize(); | 191 tracks_element_size += audio_content_encodings->data_size(); |
192 } | 192 } |
193 } | 193 } |
194 | 194 |
195 if (has_video) { | 195 if (has_video) { |
196 video_track_entry = ReadTestDataFile("webm_vp8_track_entry"); | 196 video_track_entry = ReadTestDataFile("webm_vp8_track_entry"); |
197 tracks_element_size += video_track_entry->GetDataSize(); | 197 tracks_element_size += video_track_entry->data_size(); |
198 if (is_video_encrypted) { | 198 if (is_video_encrypted) { |
199 video_content_encodings = ReadTestDataFile("webm_content_encodings"); | 199 video_content_encodings = ReadTestDataFile("webm_content_encodings"); |
200 tracks_element_size += video_content_encodings->GetDataSize(); | 200 tracks_element_size += video_content_encodings->data_size(); |
201 } | 201 } |
202 } | 202 } |
203 | 203 |
204 *size = ebml_header->GetDataSize() + info->GetDataSize() + | 204 *size = ebml_header->data_size() + info->data_size() + |
205 kTracksHeaderSize + tracks_element_size; | 205 kTracksHeaderSize + tracks_element_size; |
206 | 206 |
207 buffer->reset(new uint8[*size]); | 207 buffer->reset(new uint8[*size]); |
208 | 208 |
209 uint8* buf = buffer->get(); | 209 uint8* buf = buffer->get(); |
210 memcpy(buf, ebml_header->GetData(), ebml_header->GetDataSize()); | 210 memcpy(buf, ebml_header->data(), ebml_header->data_size()); |
211 buf += ebml_header->GetDataSize(); | 211 buf += ebml_header->data_size(); |
212 | 212 |
213 memcpy(buf, info->GetData(), info->GetDataSize()); | 213 memcpy(buf, info->data(), info->data_size()); |
214 buf += info->GetDataSize(); | 214 buf += info->data_size(); |
215 | 215 |
216 memcpy(buf, kTracksHeader, kTracksHeaderSize); | 216 memcpy(buf, kTracksHeader, kTracksHeaderSize); |
217 WriteInt64(buf + kTracksSizeOffset, tracks_element_size); | 217 WriteInt64(buf + kTracksSizeOffset, tracks_element_size); |
218 buf += kTracksHeaderSize; | 218 buf += kTracksHeaderSize; |
219 | 219 |
220 // TODO(xhwang): Simplify this! Probably have test data files that contain | 220 // TODO(xhwang): Simplify this! Probably have test data files that contain |
221 // ContentEncodings directly instead of trying to create one at run-time. | 221 // ContentEncodings directly instead of trying to create one at run-time. |
222 if (has_audio) { | 222 if (has_audio) { |
223 memcpy(buf, audio_track_entry->GetData(), | 223 memcpy(buf, audio_track_entry->data(), |
224 audio_track_entry->GetDataSize()); | 224 audio_track_entry->data_size()); |
225 if (is_audio_encrypted) { | 225 if (is_audio_encrypted) { |
226 memcpy(buf + audio_track_entry->GetDataSize(), | 226 memcpy(buf + audio_track_entry->data_size(), |
227 audio_content_encodings->GetData(), | 227 audio_content_encodings->data(), |
228 audio_content_encodings->GetDataSize()); | 228 audio_content_encodings->data_size()); |
229 WriteInt64(buf + kAudioTrackSizeOffset, | 229 WriteInt64(buf + kAudioTrackSizeOffset, |
230 audio_track_entry->GetDataSize() + | 230 audio_track_entry->data_size() + |
231 audio_content_encodings->GetDataSize() - | 231 audio_content_encodings->data_size() - |
232 kAudioTrackEntryHeaderSize); | 232 kAudioTrackEntryHeaderSize); |
233 buf += audio_content_encodings->GetDataSize(); | 233 buf += audio_content_encodings->data_size(); |
234 } | 234 } |
235 buf += audio_track_entry->GetDataSize(); | 235 buf += audio_track_entry->data_size(); |
236 } | 236 } |
237 | 237 |
238 if (has_video) { | 238 if (has_video) { |
239 memcpy(buf, video_track_entry->GetData(), | 239 memcpy(buf, video_track_entry->data(), |
240 video_track_entry->GetDataSize()); | 240 video_track_entry->data_size()); |
241 if (is_video_encrypted) { | 241 if (is_video_encrypted) { |
242 memcpy(buf + video_track_entry->GetDataSize(), | 242 memcpy(buf + video_track_entry->data_size(), |
243 video_content_encodings->GetData(), | 243 video_content_encodings->data(), |
244 video_content_encodings->GetDataSize()); | 244 video_content_encodings->data_size()); |
245 WriteInt64(buf + kVideoTrackSizeOffset, | 245 WriteInt64(buf + kVideoTrackSizeOffset, |
246 video_track_entry->GetDataSize() + | 246 video_track_entry->data_size() + |
247 video_content_encodings->GetDataSize() - | 247 video_content_encodings->data_size() - |
248 kVideoTrackEntryHeaderSize); | 248 kVideoTrackEntryHeaderSize); |
249 buf += video_content_encodings->GetDataSize(); | 249 buf += video_content_encodings->data_size(); |
250 } | 250 } |
251 buf += video_track_entry->GetDataSize(); | 251 buf += video_track_entry->data_size(); |
252 } | 252 } |
253 } | 253 } |
254 | 254 |
255 ChunkDemuxer::Status AddId() { | 255 ChunkDemuxer::Status AddId() { |
256 return AddId(kSourceId, true, true); | 256 return AddId(kSourceId, true, true); |
257 } | 257 } |
258 | 258 |
259 ChunkDemuxer::Status AddId(const std::string& source_id, | 259 ChunkDemuxer::Status AddId(const std::string& source_id, |
260 bool has_audio, bool has_video) { | 260 bool has_audio, bool has_video) { |
261 std::vector<std::string> codecs; | 261 std::vector<std::string> codecs; |
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
453 | 453 |
454 EXPECT_CALL(*this, DemuxerOpened()); | 454 EXPECT_CALL(*this, DemuxerOpened()); |
455 demuxer_->Initialize( | 455 demuxer_->Initialize( |
456 &host_, CreateInitDoneCB(base::TimeDelta::FromMilliseconds(2744), | 456 &host_, CreateInitDoneCB(base::TimeDelta::FromMilliseconds(2744), |
457 PIPELINE_OK)); | 457 PIPELINE_OK)); |
458 | 458 |
459 if (AddId(kSourceId, true, true) != ChunkDemuxer::kOk) | 459 if (AddId(kSourceId, true, true) != ChunkDemuxer::kOk) |
460 return false; | 460 return false; |
461 | 461 |
462 // Append the whole bear1 file. | 462 // Append the whole bear1 file. |
463 AppendData(bear1->GetData(), bear1->GetDataSize()); | 463 AppendData(bear1->data(), bear1->data_size()); |
464 CheckExpectedRanges(kSourceId, "{ [0,2737) }"); | 464 CheckExpectedRanges(kSourceId, "{ [0,2737) }"); |
465 | 465 |
466 // Append initialization segment for bear2. | 466 // Append initialization segment for bear2. |
467 // Note: Offsets here and below are derived from | 467 // Note: Offsets here and below are derived from |
468 // media/test/data/bear-640x360-manifest.js and | 468 // media/test/data/bear-640x360-manifest.js and |
469 // media/test/data/bear-320x240-manifest.js which were | 469 // media/test/data/bear-320x240-manifest.js which were |
470 // generated from media/test/data/bear-640x360.webm and | 470 // generated from media/test/data/bear-640x360.webm and |
471 // media/test/data/bear-320x240.webm respectively. | 471 // media/test/data/bear-320x240.webm respectively. |
472 AppendData(bear2->GetData(), 4340); | 472 AppendData(bear2->data(), 4340); |
473 | 473 |
474 // Append a media segment that goes from [0.527000, 1.014000). | 474 // Append a media segment that goes from [0.527000, 1.014000). |
475 AppendData(bear2->GetData() + 55290, 18785); | 475 AppendData(bear2->data() + 55290, 18785); |
476 CheckExpectedRanges(kSourceId, "{ [0,1028) [1201,2737) }"); | 476 CheckExpectedRanges(kSourceId, "{ [0,1028) [1201,2737) }"); |
477 | 477 |
478 // Append initialization segment for bear1 & fill gap with [779-1197) | 478 // Append initialization segment for bear1 & fill gap with [779-1197) |
479 // segment. | 479 // segment. |
480 AppendData(bear1->GetData(), 4370); | 480 AppendData(bear1->data(), 4370); |
481 AppendData(bear1->GetData() + 72737, 28183); | 481 AppendData(bear1->data() + 72737, 28183); |
482 CheckExpectedRanges(kSourceId, "{ [0,2737) }"); | 482 CheckExpectedRanges(kSourceId, "{ [0,2737) }"); |
483 | 483 |
484 EndOfStream(PIPELINE_OK); | 484 EndOfStream(PIPELINE_OK); |
485 return true; | 485 return true; |
486 } | 486 } |
487 | 487 |
488 void ShutdownDemuxer() { | 488 void ShutdownDemuxer() { |
489 if (demuxer_) { | 489 if (demuxer_) { |
490 demuxer_->Shutdown(); | 490 demuxer_->Shutdown(); |
491 message_loop_.RunUntilIdle(); | 491 message_loop_.RunUntilIdle(); |
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
699 DemuxerStream::Status* status, | 699 DemuxerStream::Status* status, |
700 base::TimeDelta* last_timestamp) { | 700 base::TimeDelta* last_timestamp) { |
701 DemuxerStream* stream = demuxer_->GetStream(type); | 701 DemuxerStream* stream = demuxer_->GetStream(type); |
702 scoped_refptr<DecoderBuffer> buffer; | 702 scoped_refptr<DecoderBuffer> buffer; |
703 | 703 |
704 *last_timestamp = kNoTimestamp(); | 704 *last_timestamp = kNoTimestamp(); |
705 do { | 705 do { |
706 stream->Read(base::Bind(&ChunkDemuxerTest::StoreStatusAndBuffer, | 706 stream->Read(base::Bind(&ChunkDemuxerTest::StoreStatusAndBuffer, |
707 base::Unretained(this), status, &buffer)); | 707 base::Unretained(this), status, &buffer)); |
708 base::MessageLoop::current()->RunUntilIdle(); | 708 base::MessageLoop::current()->RunUntilIdle(); |
709 if (*status == DemuxerStream::kOk && !buffer->IsEndOfStream()) | 709 if (*status == DemuxerStream::kOk && !buffer->end_of_stream()) |
710 *last_timestamp = buffer->GetTimestamp(); | 710 *last_timestamp = buffer->timestamp(); |
711 } while (*status == DemuxerStream::kOk && !buffer->IsEndOfStream()); | 711 } while (*status == DemuxerStream::kOk && !buffer->end_of_stream()); |
712 } | 712 } |
713 | 713 |
714 void ExpectEndOfStream(DemuxerStream::Type type) { | 714 void ExpectEndOfStream(DemuxerStream::Type type) { |
715 EXPECT_CALL(*this, ReadDone(DemuxerStream::kOk, IsEndOfStream())); | 715 EXPECT_CALL(*this, ReadDone(DemuxerStream::kOk, IsEndOfStream())); |
716 demuxer_->GetStream(type)->Read(base::Bind( | 716 demuxer_->GetStream(type)->Read(base::Bind( |
717 &ChunkDemuxerTest::ReadDone, base::Unretained(this))); | 717 &ChunkDemuxerTest::ReadDone, base::Unretained(this))); |
718 message_loop_.RunUntilIdle(); | 718 message_loop_.RunUntilIdle(); |
719 } | 719 } |
720 | 720 |
721 void ExpectRead(DemuxerStream::Type type, int64 timestamp_in_ms) { | 721 void ExpectRead(DemuxerStream::Type type, int64 timestamp_in_ms) { |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
759 bool has_audio, bool has_video) { | 759 bool has_audio, bool has_video) { |
760 EXPECT_CALL(*this, DemuxerOpened()); | 760 EXPECT_CALL(*this, DemuxerOpened()); |
761 demuxer_->Initialize( | 761 demuxer_->Initialize( |
762 &host_, CreateInitDoneCB(duration, PIPELINE_OK)); | 762 &host_, CreateInitDoneCB(duration, PIPELINE_OK)); |
763 | 763 |
764 if (AddId(kSourceId, has_audio, has_video) != ChunkDemuxer::kOk) | 764 if (AddId(kSourceId, has_audio, has_video) != ChunkDemuxer::kOk) |
765 return false; | 765 return false; |
766 | 766 |
767 // Read a WebM file into memory and send the data to the demuxer. | 767 // Read a WebM file into memory and send the data to the demuxer. |
768 scoped_refptr<DecoderBuffer> buffer = ReadTestDataFile(filename); | 768 scoped_refptr<DecoderBuffer> buffer = ReadTestDataFile(filename); |
769 AppendDataInPieces(buffer->GetData(), buffer->GetDataSize(), 512); | 769 AppendDataInPieces(buffer->data(), buffer->data_size(), 512); |
770 | 770 |
771 // Verify that the timestamps on the first few packets match what we | 771 // Verify that the timestamps on the first few packets match what we |
772 // expect. | 772 // expect. |
773 for (size_t i = 0; | 773 for (size_t i = 0; |
774 (timestamps[i].audio_time_ms != kSkip || | 774 (timestamps[i].audio_time_ms != kSkip || |
775 timestamps[i].video_time_ms != kSkip); | 775 timestamps[i].video_time_ms != kSkip); |
776 i++) { | 776 i++) { |
777 bool audio_read_done = false; | 777 bool audio_read_done = false; |
778 bool video_read_done = false; | 778 bool video_read_done = false; |
779 | 779 |
(...skipping 418 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1198 EXPECT_EQ(expected, audio_read_done_); | 1198 EXPECT_EQ(expected, audio_read_done_); |
1199 EXPECT_EQ(expected, video_read_done_); | 1199 EXPECT_EQ(expected, video_read_done_); |
1200 } | 1200 } |
1201 | 1201 |
1202 private: | 1202 private: |
1203 static void OnEndOfStreamReadDone( | 1203 static void OnEndOfStreamReadDone( |
1204 bool* called, | 1204 bool* called, |
1205 DemuxerStream::Status status, | 1205 DemuxerStream::Status status, |
1206 const scoped_refptr<DecoderBuffer>& buffer) { | 1206 const scoped_refptr<DecoderBuffer>& buffer) { |
1207 EXPECT_EQ(status, DemuxerStream::kOk); | 1207 EXPECT_EQ(status, DemuxerStream::kOk); |
1208 EXPECT_TRUE(buffer->IsEndOfStream()); | 1208 EXPECT_TRUE(buffer->end_of_stream()); |
1209 *called = true; | 1209 *called = true; |
1210 } | 1210 } |
1211 | 1211 |
1212 Demuxer* demuxer_; | 1212 Demuxer* demuxer_; |
1213 bool audio_read_done_; | 1213 bool audio_read_done_; |
1214 bool video_read_done_; | 1214 bool video_read_done_; |
1215 | 1215 |
1216 DISALLOW_COPY_AND_ASSIGN(EndOfStreamHelper); | 1216 DISALLOW_COPY_AND_ASSIGN(EndOfStreamHelper); |
1217 }; | 1217 }; |
1218 | 1218 |
(...skipping 1428 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2647 // don't get removed. | 2647 // don't get removed. |
2648 // | 2648 // |
2649 // NOTE: The current GC algorithm tries to preserve the GOP at the | 2649 // NOTE: The current GC algorithm tries to preserve the GOP at the |
2650 // current position as well as the last appended GOP. This is | 2650 // current position as well as the last appended GOP. This is |
2651 // why there are 2 ranges in the expectations. | 2651 // why there are 2 ranges in the expectations. |
2652 AppendSingleStreamCluster(kSourceId, kAudioTrackNum, 700, 5); | 2652 AppendSingleStreamCluster(kSourceId, kAudioTrackNum, 700, 5); |
2653 CheckExpectedRanges(kSourceId, "{ [500,592) [792,815) }"); | 2653 CheckExpectedRanges(kSourceId, "{ [500,592) [792,815) }"); |
2654 } | 2654 } |
2655 | 2655 |
2656 } // namespace media | 2656 } // namespace media |
OLD | NEW |