| 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 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 81 DCHECK(number >= 0 && number < GG_LONGLONG(0x00FFFFFFFFFFFFFF)); | 81 DCHECK(number >= 0 && number < GG_LONGLONG(0x00FFFFFFFFFFFFFF)); |
| 82 buffer[0] = 0x01; | 82 buffer[0] = 0x01; |
| 83 int64 tmp = number; | 83 int64 tmp = number; |
| 84 for (int i = 7; i > 0; i--) { | 84 for (int i = 7; i > 0; i--) { |
| 85 buffer[i] = tmp & 0xff; | 85 buffer[i] = tmp & 0xff; |
| 86 tmp >>= 8; | 86 tmp >>= 8; |
| 87 } | 87 } |
| 88 } | 88 } |
| 89 | 89 |
| 90 MATCHER_P(HasTimestamp, timestamp_in_ms, "") { | 90 MATCHER_P(HasTimestamp, timestamp_in_ms, "") { |
| 91 return arg.get() && !arg->IsEndOfStream() && | 91 return arg.get() && !arg->is_end_of_stream() && |
| 92 arg->GetTimestamp().InMilliseconds() == timestamp_in_ms; | 92 arg->get_timestamp().InMilliseconds() == timestamp_in_ms; |
| 93 } | 93 } |
| 94 | 94 |
| 95 MATCHER(IsEndOfStream, "") { return arg.get() && arg->IsEndOfStream(); } | 95 MATCHER(is_end_of_stream, "") { return arg.get() && arg->is_end_of_stream(); } |
| 96 | 96 |
| 97 static void OnReadDone(const base::TimeDelta& expected_time, | 97 static void OnReadDone(const base::TimeDelta& expected_time, |
| 98 bool* called, | 98 bool* called, |
| 99 DemuxerStream::Status status, | 99 DemuxerStream::Status status, |
| 100 const scoped_refptr<DecoderBuffer>& buffer) { | 100 const scoped_refptr<DecoderBuffer>& buffer) { |
| 101 EXPECT_EQ(status, DemuxerStream::kOk); | 101 EXPECT_EQ(status, DemuxerStream::kOk); |
| 102 EXPECT_EQ(expected_time, buffer->GetTimestamp()); | 102 EXPECT_EQ(expected_time, buffer->get_timestamp()); |
| 103 *called = true; | 103 *called = true; |
| 104 } | 104 } |
| 105 | 105 |
| 106 static void OnReadDone_AbortExpected( | 106 static void OnReadDone_AbortExpected( |
| 107 bool* called, DemuxerStream::Status status, | 107 bool* called, DemuxerStream::Status status, |
| 108 const scoped_refptr<DecoderBuffer>& buffer) { | 108 const scoped_refptr<DecoderBuffer>& buffer) { |
| 109 EXPECT_EQ(status, DemuxerStream::kAborted); | 109 EXPECT_EQ(status, DemuxerStream::kAborted); |
| 110 EXPECT_EQ(NULL, buffer.get()); | 110 EXPECT_EQ(NULL, buffer.get()); |
| 111 *called = true; | 111 *called = true; |
| 112 } | 112 } |
| 113 | 113 |
| 114 static void OnReadDone_EOSExpected(bool* called, | 114 static void OnReadDone_EOSExpected(bool* called, |
| 115 DemuxerStream::Status status, | 115 DemuxerStream::Status status, |
| 116 const scoped_refptr<DecoderBuffer>& buffer) { | 116 const scoped_refptr<DecoderBuffer>& buffer) { |
| 117 EXPECT_EQ(status, DemuxerStream::kOk); | 117 EXPECT_EQ(status, DemuxerStream::kOk); |
| 118 EXPECT_TRUE(buffer->IsEndOfStream()); | 118 EXPECT_TRUE(buffer->is_end_of_stream()); |
| 119 *called = true; | 119 *called = true; |
| 120 } | 120 } |
| 121 | 121 |
| 122 static void OnSeekDone_OKExpected(bool* called, PipelineStatus status) { | 122 static void OnSeekDone_OKExpected(bool* called, PipelineStatus status) { |
| 123 EXPECT_EQ(status, PIPELINE_OK); | 123 EXPECT_EQ(status, PIPELINE_OK); |
| 124 *called = true; | 124 *called = true; |
| 125 } | 125 } |
| 126 | 126 |
| 127 class ChunkDemuxerTest : public testing::Test { | 127 class ChunkDemuxerTest : public testing::Test { |
| 128 protected: | 128 protected: |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 177 scoped_refptr<DecoderBuffer> video_content_encodings; | 177 scoped_refptr<DecoderBuffer> video_content_encodings; |
| 178 | 178 |
| 179 ebml_header = ReadTestDataFile("webm_ebml_element"); | 179 ebml_header = ReadTestDataFile("webm_ebml_element"); |
| 180 | 180 |
| 181 info = ReadTestDataFile("webm_info_element"); | 181 info = ReadTestDataFile("webm_info_element"); |
| 182 | 182 |
| 183 int tracks_element_size = 0; | 183 int tracks_element_size = 0; |
| 184 | 184 |
| 185 if (has_audio) { | 185 if (has_audio) { |
| 186 audio_track_entry = ReadTestDataFile("webm_vorbis_track_entry"); | 186 audio_track_entry = ReadTestDataFile("webm_vorbis_track_entry"); |
| 187 tracks_element_size += audio_track_entry->GetDataSize(); | 187 tracks_element_size += audio_track_entry->get_data_size(); |
| 188 if (is_audio_encrypted) { | 188 if (is_audio_encrypted) { |
| 189 audio_content_encodings = ReadTestDataFile("webm_content_encodings"); | 189 audio_content_encodings = ReadTestDataFile("webm_content_encodings"); |
| 190 tracks_element_size += audio_content_encodings->GetDataSize(); | 190 tracks_element_size += audio_content_encodings->get_data_size(); |
| 191 } | 191 } |
| 192 } | 192 } |
| 193 | 193 |
| 194 if (has_video) { | 194 if (has_video) { |
| 195 video_track_entry = ReadTestDataFile("webm_vp8_track_entry"); | 195 video_track_entry = ReadTestDataFile("webm_vp8_track_entry"); |
| 196 tracks_element_size += video_track_entry->GetDataSize(); | 196 tracks_element_size += video_track_entry->get_data_size(); |
| 197 if (is_video_encrypted) { | 197 if (is_video_encrypted) { |
| 198 video_content_encodings = ReadTestDataFile("webm_content_encodings"); | 198 video_content_encodings = ReadTestDataFile("webm_content_encodings"); |
| 199 tracks_element_size += video_content_encodings->GetDataSize(); | 199 tracks_element_size += video_content_encodings->get_data_size(); |
| 200 } | 200 } |
| 201 } | 201 } |
| 202 | 202 |
| 203 *size = ebml_header->GetDataSize() + info->GetDataSize() + | 203 *size = ebml_header->get_data_size() + info->get_data_size() + |
| 204 kTracksHeaderSize + tracks_element_size; | 204 kTracksHeaderSize + tracks_element_size; |
| 205 | 205 |
| 206 buffer->reset(new uint8[*size]); | 206 buffer->reset(new uint8[*size]); |
| 207 | 207 |
| 208 uint8* buf = buffer->get(); | 208 uint8* buf = buffer->get(); |
| 209 memcpy(buf, ebml_header->GetData(), ebml_header->GetDataSize()); | 209 memcpy(buf, ebml_header->get_data(), ebml_header->get_data_size()); |
| 210 buf += ebml_header->GetDataSize(); | 210 buf += ebml_header->get_data_size(); |
| 211 | 211 |
| 212 memcpy(buf, info->GetData(), info->GetDataSize()); | 212 memcpy(buf, info->get_data(), info->get_data_size()); |
| 213 buf += info->GetDataSize(); | 213 buf += info->get_data_size(); |
| 214 | 214 |
| 215 memcpy(buf, kTracksHeader, kTracksHeaderSize); | 215 memcpy(buf, kTracksHeader, kTracksHeaderSize); |
| 216 WriteInt64(buf + kTracksSizeOffset, tracks_element_size); | 216 WriteInt64(buf + kTracksSizeOffset, tracks_element_size); |
| 217 buf += kTracksHeaderSize; | 217 buf += kTracksHeaderSize; |
| 218 | 218 |
| 219 // TODO(xhwang): Simplify this! Probably have test data files that contain | 219 // TODO(xhwang): Simplify this! Probably have test data files that contain |
| 220 // ContentEncodings directly instead of trying to create one at run-time. | 220 // ContentEncodings directly instead of trying to create one at run-time. |
| 221 if (has_audio) { | 221 if (has_audio) { |
| 222 memcpy(buf, audio_track_entry->GetData(), | 222 memcpy(buf, audio_track_entry->get_data(), |
| 223 audio_track_entry->GetDataSize()); | 223 audio_track_entry->get_data_size()); |
| 224 if (is_audio_encrypted) { | 224 if (is_audio_encrypted) { |
| 225 memcpy(buf + audio_track_entry->GetDataSize(), | 225 memcpy(buf + audio_track_entry->get_data_size(), |
| 226 audio_content_encodings->GetData(), | 226 audio_content_encodings->get_data(), |
| 227 audio_content_encodings->GetDataSize()); | 227 audio_content_encodings->get_data_size()); |
| 228 WriteInt64(buf + kAudioTrackSizeOffset, | 228 WriteInt64(buf + kAudioTrackSizeOffset, |
| 229 audio_track_entry->GetDataSize() + | 229 audio_track_entry->get_data_size() + |
| 230 audio_content_encodings->GetDataSize() - | 230 audio_content_encodings->get_data_size() - |
| 231 kAudioTrackEntryHeaderSize); | 231 kAudioTrackEntryHeaderSize); |
| 232 buf += audio_content_encodings->GetDataSize(); | 232 buf += audio_content_encodings->get_data_size(); |
| 233 } | 233 } |
| 234 buf += audio_track_entry->GetDataSize(); | 234 buf += audio_track_entry->get_data_size(); |
| 235 } | 235 } |
| 236 | 236 |
| 237 if (has_video) { | 237 if (has_video) { |
| 238 memcpy(buf, video_track_entry->GetData(), | 238 memcpy(buf, video_track_entry->get_data(), |
| 239 video_track_entry->GetDataSize()); | 239 video_track_entry->get_data_size()); |
| 240 if (is_video_encrypted) { | 240 if (is_video_encrypted) { |
| 241 memcpy(buf + video_track_entry->GetDataSize(), | 241 memcpy(buf + video_track_entry->get_data_size(), |
| 242 video_content_encodings->GetData(), | 242 video_content_encodings->get_data(), |
| 243 video_content_encodings->GetDataSize()); | 243 video_content_encodings->get_data_size()); |
| 244 WriteInt64(buf + kVideoTrackSizeOffset, | 244 WriteInt64(buf + kVideoTrackSizeOffset, |
| 245 video_track_entry->GetDataSize() + | 245 video_track_entry->get_data_size() + |
| 246 video_content_encodings->GetDataSize() - | 246 video_content_encodings->get_data_size() - |
| 247 kVideoTrackEntryHeaderSize); | 247 kVideoTrackEntryHeaderSize); |
| 248 buf += video_content_encodings->GetDataSize(); | 248 buf += video_content_encodings->get_data_size(); |
| 249 } | 249 } |
| 250 buf += video_track_entry->GetDataSize(); | 250 buf += video_track_entry->get_data_size(); |
| 251 } | 251 } |
| 252 } | 252 } |
| 253 | 253 |
| 254 ChunkDemuxer::Status AddId() { | 254 ChunkDemuxer::Status AddId() { |
| 255 return AddId(kSourceId, true, true); | 255 return AddId(kSourceId, true, true); |
| 256 } | 256 } |
| 257 | 257 |
| 258 ChunkDemuxer::Status AddId(const std::string& source_id, | 258 ChunkDemuxer::Status AddId(const std::string& source_id, |
| 259 bool has_audio, bool has_video) { | 259 bool has_audio, bool has_video) { |
| 260 std::vector<std::string> codecs; | 260 std::vector<std::string> codecs; |
| (...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 427 | 427 |
| 428 EXPECT_CALL(*this, DemuxerOpened()); | 428 EXPECT_CALL(*this, DemuxerOpened()); |
| 429 demuxer_->Initialize( | 429 demuxer_->Initialize( |
| 430 &host_, CreateInitDoneCB(base::TimeDelta::FromMilliseconds(2744), | 430 &host_, CreateInitDoneCB(base::TimeDelta::FromMilliseconds(2744), |
| 431 PIPELINE_OK)); | 431 PIPELINE_OK)); |
| 432 | 432 |
| 433 if (AddId(kSourceId, true, true) != ChunkDemuxer::kOk) | 433 if (AddId(kSourceId, true, true) != ChunkDemuxer::kOk) |
| 434 return false; | 434 return false; |
| 435 | 435 |
| 436 // Append the whole bear1 file. | 436 // Append the whole bear1 file. |
| 437 AppendData(bear1->GetData(), bear1->GetDataSize()); | 437 AppendData(bear1->get_data(), bear1->get_data_size()); |
| 438 CheckExpectedRanges(kSourceId, "{ [0,2737) }"); | 438 CheckExpectedRanges(kSourceId, "{ [0,2737) }"); |
| 439 | 439 |
| 440 // Append initialization segment for bear2. | 440 // Append initialization segment for bear2. |
| 441 // Note: Offsets here and below are derived from | 441 // Note: Offsets here and below are derived from |
| 442 // media/test/data/bear-640x360-manifest.js and | 442 // media/test/data/bear-640x360-manifest.js and |
| 443 // media/test/data/bear-320x240-manifest.js which were | 443 // media/test/data/bear-320x240-manifest.js which were |
| 444 // generated from media/test/data/bear-640x360.webm and | 444 // generated from media/test/data/bear-640x360.webm and |
| 445 // media/test/data/bear-320x240.webm respectively. | 445 // media/test/data/bear-320x240.webm respectively. |
| 446 AppendData(bear2->GetData(), 4340); | 446 AppendData(bear2->get_data(), 4340); |
| 447 | 447 |
| 448 // Append a media segment that goes from [0.527000, 1.014000). | 448 // Append a media segment that goes from [0.527000, 1.014000). |
| 449 AppendData(bear2->GetData() + 55290, 18785); | 449 AppendData(bear2->get_data() + 55290, 18785); |
| 450 CheckExpectedRanges(kSourceId, "{ [0,1028) [1201,2737) }"); | 450 CheckExpectedRanges(kSourceId, "{ [0,1028) [1201,2737) }"); |
| 451 | 451 |
| 452 // Append initialization segment for bear1 & fill gap with [779-1197) | 452 // Append initialization segment for bear1 & fill gap with [779-1197) |
| 453 // segment. | 453 // segment. |
| 454 AppendData(bear1->GetData(), 4370); | 454 AppendData(bear1->get_data(), 4370); |
| 455 AppendData(bear1->GetData() + 72737, 28183); | 455 AppendData(bear1->get_data() + 72737, 28183); |
| 456 CheckExpectedRanges(kSourceId, "{ [0,2737) }"); | 456 CheckExpectedRanges(kSourceId, "{ [0,2737) }"); |
| 457 | 457 |
| 458 demuxer_->EndOfStream(PIPELINE_OK); | 458 demuxer_->EndOfStream(PIPELINE_OK); |
| 459 return true; | 459 return true; |
| 460 } | 460 } |
| 461 | 461 |
| 462 void ShutdownDemuxer() { | 462 void ShutdownDemuxer() { |
| 463 if (demuxer_) | 463 if (demuxer_) |
| 464 demuxer_->Shutdown(); | 464 demuxer_->Shutdown(); |
| 465 } | 465 } |
| (...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 672 DemuxerStream::Status* status, | 672 DemuxerStream::Status* status, |
| 673 base::TimeDelta* last_timestamp) { | 673 base::TimeDelta* last_timestamp) { |
| 674 DemuxerStream* stream = demuxer_->GetStream(type); | 674 DemuxerStream* stream = demuxer_->GetStream(type); |
| 675 scoped_refptr<DecoderBuffer> buffer; | 675 scoped_refptr<DecoderBuffer> buffer; |
| 676 | 676 |
| 677 *last_timestamp = kNoTimestamp(); | 677 *last_timestamp = kNoTimestamp(); |
| 678 do { | 678 do { |
| 679 stream->Read(base::Bind(&ChunkDemuxerTest::StoreStatusAndBuffer, | 679 stream->Read(base::Bind(&ChunkDemuxerTest::StoreStatusAndBuffer, |
| 680 base::Unretained(this), status, &buffer)); | 680 base::Unretained(this), status, &buffer)); |
| 681 base::MessageLoop::current()->RunUntilIdle(); | 681 base::MessageLoop::current()->RunUntilIdle(); |
| 682 if (*status == DemuxerStream::kOk && !buffer->IsEndOfStream()) | 682 if (*status == DemuxerStream::kOk && !buffer->is_end_of_stream()) |
| 683 *last_timestamp = buffer->GetTimestamp(); | 683 *last_timestamp = buffer->get_timestamp(); |
| 684 } while (*status == DemuxerStream::kOk && !buffer->IsEndOfStream()); | 684 } while (*status == DemuxerStream::kOk && !buffer->is_end_of_stream()); |
| 685 } | 685 } |
| 686 | 686 |
| 687 void ExpectEndOfStream(DemuxerStream::Type type) { | 687 void ExpectEndOfStream(DemuxerStream::Type type) { |
| 688 EXPECT_CALL(*this, ReadDone(DemuxerStream::kOk, IsEndOfStream())); | 688 EXPECT_CALL(*this, ReadDone(DemuxerStream::kOk, is_end_of_stream())); |
| 689 demuxer_->GetStream(type)->Read(base::Bind( | 689 demuxer_->GetStream(type)->Read(base::Bind( |
| 690 &ChunkDemuxerTest::ReadDone, base::Unretained(this))); | 690 &ChunkDemuxerTest::ReadDone, base::Unretained(this))); |
| 691 message_loop_.RunUntilIdle(); | 691 message_loop_.RunUntilIdle(); |
| 692 } | 692 } |
| 693 | 693 |
| 694 void ExpectRead(DemuxerStream::Type type, int64 timestamp_in_ms) { | 694 void ExpectRead(DemuxerStream::Type type, int64 timestamp_in_ms) { |
| 695 EXPECT_CALL(*this, ReadDone(DemuxerStream::kOk, | 695 EXPECT_CALL(*this, ReadDone(DemuxerStream::kOk, |
| 696 HasTimestamp(timestamp_in_ms))); | 696 HasTimestamp(timestamp_in_ms))); |
| 697 demuxer_->GetStream(type)->Read(base::Bind( | 697 demuxer_->GetStream(type)->Read(base::Bind( |
| 698 &ChunkDemuxerTest::ReadDone, base::Unretained(this))); | 698 &ChunkDemuxerTest::ReadDone, base::Unretained(this))); |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 732 bool has_audio, bool has_video) { | 732 bool has_audio, bool has_video) { |
| 733 EXPECT_CALL(*this, DemuxerOpened()); | 733 EXPECT_CALL(*this, DemuxerOpened()); |
| 734 demuxer_->Initialize( | 734 demuxer_->Initialize( |
| 735 &host_, CreateInitDoneCB(duration, PIPELINE_OK)); | 735 &host_, CreateInitDoneCB(duration, PIPELINE_OK)); |
| 736 | 736 |
| 737 if (AddId(kSourceId, has_audio, has_video) != ChunkDemuxer::kOk) | 737 if (AddId(kSourceId, has_audio, has_video) != ChunkDemuxer::kOk) |
| 738 return false; | 738 return false; |
| 739 | 739 |
| 740 // Read a WebM file into memory and send the data to the demuxer. | 740 // Read a WebM file into memory and send the data to the demuxer. |
| 741 scoped_refptr<DecoderBuffer> buffer = ReadTestDataFile(filename); | 741 scoped_refptr<DecoderBuffer> buffer = ReadTestDataFile(filename); |
| 742 AppendDataInPieces(buffer->GetData(), buffer->GetDataSize(), 512); | 742 AppendDataInPieces(buffer->get_data(), buffer->get_data_size(), 512); |
| 743 | 743 |
| 744 // Verify that the timestamps on the first few packets match what we | 744 // Verify that the timestamps on the first few packets match what we |
| 745 // expect. | 745 // expect. |
| 746 for (size_t i = 0; | 746 for (size_t i = 0; |
| 747 (timestamps[i].audio_time_ms != kSkip || | 747 (timestamps[i].audio_time_ms != kSkip || |
| 748 timestamps[i].video_time_ms != kSkip); | 748 timestamps[i].video_time_ms != kSkip); |
| 749 i++) { | 749 i++) { |
| 750 bool audio_read_done = false; | 750 bool audio_read_done = false; |
| 751 bool video_read_done = false; | 751 bool video_read_done = false; |
| 752 | 752 |
| (...skipping 407 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1160 EXPECT_EQ(expected, audio_read_done_); | 1160 EXPECT_EQ(expected, audio_read_done_); |
| 1161 EXPECT_EQ(expected, video_read_done_); | 1161 EXPECT_EQ(expected, video_read_done_); |
| 1162 } | 1162 } |
| 1163 | 1163 |
| 1164 private: | 1164 private: |
| 1165 static void OnEndOfStreamReadDone( | 1165 static void OnEndOfStreamReadDone( |
| 1166 bool* called, | 1166 bool* called, |
| 1167 DemuxerStream::Status status, | 1167 DemuxerStream::Status status, |
| 1168 const scoped_refptr<DecoderBuffer>& buffer) { | 1168 const scoped_refptr<DecoderBuffer>& buffer) { |
| 1169 EXPECT_EQ(status, DemuxerStream::kOk); | 1169 EXPECT_EQ(status, DemuxerStream::kOk); |
| 1170 EXPECT_TRUE(buffer->IsEndOfStream()); | 1170 EXPECT_TRUE(buffer->is_end_of_stream()); |
| 1171 *called = true; | 1171 *called = true; |
| 1172 } | 1172 } |
| 1173 | 1173 |
| 1174 Demuxer* demuxer_; | 1174 Demuxer* demuxer_; |
| 1175 bool audio_read_done_; | 1175 bool audio_read_done_; |
| 1176 bool video_read_done_; | 1176 bool video_read_done_; |
| 1177 | 1177 |
| 1178 DISALLOW_COPY_AND_ASSIGN(EndOfStreamHelper); | 1178 DISALLOW_COPY_AND_ASSIGN(EndOfStreamHelper); |
| 1179 }; | 1179 }; |
| 1180 | 1180 |
| (...skipping 1371 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2552 EXPECT_FALSE(audio_read_done); | 2552 EXPECT_FALSE(audio_read_done); |
| 2553 EXPECT_FALSE(video_read_done); | 2553 EXPECT_FALSE(video_read_done); |
| 2554 | 2554 |
| 2555 demuxer_->EndOfStream(PIPELINE_OK); | 2555 demuxer_->EndOfStream(PIPELINE_OK); |
| 2556 | 2556 |
| 2557 EXPECT_TRUE(audio_read_done); | 2557 EXPECT_TRUE(audio_read_done); |
| 2558 EXPECT_TRUE(video_read_done); | 2558 EXPECT_TRUE(video_read_done); |
| 2559 } | 2559 } |
| 2560 | 2560 |
| 2561 } // namespace media | 2561 } // namespace media |
| OLD | NEW |