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/message_loop.h" | 8 #include "base/message_loop/message_loop.h" |
9 #include "base/strings/string_number_conversions.h" | 9 #include "base/strings/string_number_conversions.h" |
10 #include "base/strings/string_split.h" | 10 #include "base/strings/string_split.h" |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
132 } | 132 } |
133 | 133 |
134 static void OnSeekDone_OKExpected(bool* called, PipelineStatus status) { | 134 static void OnSeekDone_OKExpected(bool* called, PipelineStatus status) { |
135 EXPECT_EQ(status, PIPELINE_OK); | 135 EXPECT_EQ(status, PIPELINE_OK); |
136 *called = true; | 136 *called = true; |
137 } | 137 } |
138 | 138 |
139 static void LogFunc(const std::string& str) { DVLOG(1) << str; } | 139 static void LogFunc(const std::string& str) { DVLOG(1) << str; } |
140 | 140 |
141 class ChunkDemuxerTest : public ::testing::Test { | 141 class ChunkDemuxerTest : public ::testing::Test { |
| 142 public: |
| 143 MOCK_METHOD1(OnNewInitSegment, void(const InitSegment&)); |
| 144 |
142 protected: | 145 protected: |
143 enum CodecsIndex { | 146 enum CodecsIndex { |
144 AUDIO, | 147 AUDIO, |
145 VIDEO, | 148 VIDEO, |
146 MAX_CODECS_INDEX | 149 MAX_CODECS_INDEX |
147 }; | 150 }; |
148 | 151 |
149 // Default cluster to append first for simple tests. | 152 // Default cluster to append first for simple tests. |
150 scoped_ptr<Cluster> kDefaultFirstCluster() { | 153 scoped_ptr<Cluster> kDefaultFirstCluster() { |
151 return GenerateCluster(0, 4); | 154 return GenerateCluster(0, 4); |
(...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
340 | 343 |
341 if (has_video) { | 344 if (has_video) { |
342 codecs.push_back("vp8"); | 345 codecs.push_back("vp8"); |
343 type = "video/webm"; | 346 type = "video/webm"; |
344 } | 347 } |
345 | 348 |
346 if (!has_audio && !has_video) { | 349 if (!has_audio && !has_video) { |
347 return AddId(kSourceId, HAS_AUDIO | HAS_VIDEO); | 350 return AddId(kSourceId, HAS_AUDIO | HAS_VIDEO); |
348 } | 351 } |
349 | 352 |
350 return demuxer_->AddId(source_id, type, codecs); | 353 return demuxer_->AddId(source_id, type, codecs, |
| 354 base::Bind(&ChunkDemuxerTest::OnNewInitSegment, |
| 355 base::Unretained(this))); |
351 } | 356 } |
352 | 357 |
353 ChunkDemuxer::Status AddIdForMp2tSource(const std::string& source_id) { | 358 ChunkDemuxer::Status AddIdForMp2tSource(const std::string& source_id) { |
354 std::vector<std::string> codecs; | 359 std::vector<std::string> codecs; |
355 std::string type = "video/mp2t"; | 360 std::string type = "video/mp2t"; |
356 codecs.push_back("mp4a.40.2"); | 361 codecs.push_back("mp4a.40.2"); |
357 codecs.push_back("avc1.640028"); | 362 codecs.push_back("avc1.640028"); |
358 return demuxer_->AddId(source_id, type, codecs); | 363 return demuxer_->AddId(source_id, type, codecs, |
| 364 base::Bind(&ChunkDemuxerTest::OnNewInitSegment, |
| 365 base::Unretained(this))); |
359 } | 366 } |
360 | 367 |
361 void AppendData(const uint8* data, size_t length) { | 368 void AppendData(const uint8* data, size_t length) { |
362 AppendData(kSourceId, data, length); | 369 AppendData(kSourceId, data, length); |
363 } | 370 } |
364 | 371 |
365 void AppendCluster(const std::string& source_id, | 372 void AppendCluster(const std::string& source_id, |
366 scoped_ptr<Cluster> cluster) { | 373 scoped_ptr<Cluster> cluster) { |
367 AppendData(source_id, cluster->data(), cluster->size()); | 374 AppendData(source_id, cluster->data(), cluster->size()); |
368 } | 375 } |
(...skipping 1582 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1951 } | 1958 } |
1952 | 1959 |
1953 TEST_F(ChunkDemuxerTest, AVHeadersWithAudioOnlyType) { | 1960 TEST_F(ChunkDemuxerTest, AVHeadersWithAudioOnlyType) { |
1954 EXPECT_CALL(*this, DemuxerOpened()); | 1961 EXPECT_CALL(*this, DemuxerOpened()); |
1955 demuxer_->Initialize( | 1962 demuxer_->Initialize( |
1956 &host_, CreateInitDoneCB(kNoTimestamp(), | 1963 &host_, CreateInitDoneCB(kNoTimestamp(), |
1957 DEMUXER_ERROR_COULD_NOT_OPEN), true); | 1964 DEMUXER_ERROR_COULD_NOT_OPEN), true); |
1958 | 1965 |
1959 std::vector<std::string> codecs(1); | 1966 std::vector<std::string> codecs(1); |
1960 codecs[0] = "vorbis"; | 1967 codecs[0] = "vorbis"; |
1961 ASSERT_EQ(demuxer_->AddId(kSourceId, "audio/webm", codecs), | 1968 ASSERT_EQ(ChunkDemuxer::kOk, |
1962 ChunkDemuxer::kOk); | 1969 demuxer_->AddId(kSourceId, "audio/webm", codecs, |
| 1970 base::Bind(&ChunkDemuxerTest::OnNewInitSegment, |
| 1971 base::Unretained(this)))); |
1963 | 1972 |
1964 AppendInitSegment(HAS_AUDIO | HAS_VIDEO); | 1973 AppendInitSegment(HAS_AUDIO | HAS_VIDEO); |
1965 } | 1974 } |
1966 | 1975 |
1967 TEST_F(ChunkDemuxerTest, AVHeadersWithVideoOnlyType) { | 1976 TEST_F(ChunkDemuxerTest, AVHeadersWithVideoOnlyType) { |
1968 EXPECT_CALL(*this, DemuxerOpened()); | 1977 EXPECT_CALL(*this, DemuxerOpened()); |
1969 demuxer_->Initialize( | 1978 demuxer_->Initialize( |
1970 &host_, CreateInitDoneCB(kNoTimestamp(), | 1979 &host_, CreateInitDoneCB(kNoTimestamp(), |
1971 DEMUXER_ERROR_COULD_NOT_OPEN), true); | 1980 DEMUXER_ERROR_COULD_NOT_OPEN), true); |
1972 | 1981 |
1973 std::vector<std::string> codecs(1); | 1982 std::vector<std::string> codecs(1); |
1974 codecs[0] = "vp8"; | 1983 codecs[0] = "vp8"; |
1975 ASSERT_EQ(demuxer_->AddId(kSourceId, "video/webm", codecs), | 1984 ASSERT_EQ(ChunkDemuxer::kOk, |
1976 ChunkDemuxer::kOk); | 1985 demuxer_->AddId(kSourceId, "video/webm", codecs, |
| 1986 base::Bind(&ChunkDemuxerTest::OnNewInitSegment, |
| 1987 base::Unretained(this)))); |
1977 | 1988 |
1978 AppendInitSegment(HAS_AUDIO | HAS_VIDEO); | 1989 AppendInitSegment(HAS_AUDIO | HAS_VIDEO); |
1979 } | 1990 } |
1980 | 1991 |
1981 TEST_F(ChunkDemuxerTest, MultipleHeaders) { | 1992 TEST_F(ChunkDemuxerTest, MultipleHeaders) { |
1982 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); | 1993 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); |
1983 | 1994 |
1984 AppendCluster(kDefaultFirstCluster()); | 1995 AppendCluster(kDefaultFirstCluster()); |
1985 | 1996 |
1986 // Append another identical initialization segment. | 1997 // Append another identical initialization segment. |
(...skipping 534 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2521 TEST_F(ChunkDemuxerTest, CodecPrefixMatching) { | 2532 TEST_F(ChunkDemuxerTest, CodecPrefixMatching) { |
2522 ChunkDemuxer::Status expected = ChunkDemuxer::kNotSupported; | 2533 ChunkDemuxer::Status expected = ChunkDemuxer::kNotSupported; |
2523 | 2534 |
2524 #if defined(USE_PROPRIETARY_CODECS) | 2535 #if defined(USE_PROPRIETARY_CODECS) |
2525 expected = ChunkDemuxer::kOk; | 2536 expected = ChunkDemuxer::kOk; |
2526 #endif | 2537 #endif |
2527 | 2538 |
2528 std::vector<std::string> codecs; | 2539 std::vector<std::string> codecs; |
2529 codecs.push_back("avc1.4D4041"); | 2540 codecs.push_back("avc1.4D4041"); |
2530 | 2541 |
2531 EXPECT_EQ(demuxer_->AddId("source_id", "video/mp4", codecs), expected); | 2542 EXPECT_EQ(expected, |
| 2543 demuxer_->AddId("source_id", "video/mp4", codecs, |
| 2544 base::Bind(&ChunkDemuxerTest::OnNewInitSegment, |
| 2545 base::Unretained(this)))); |
2532 } | 2546 } |
2533 | 2547 |
2534 // Test codec ID's that are not compliant with RFC6381, but have been | 2548 // Test codec ID's that are not compliant with RFC6381, but have been |
2535 // seen in the wild. | 2549 // seen in the wild. |
2536 TEST_F(ChunkDemuxerTest, CodecIDsThatAreNotRFC6381Compliant) { | 2550 TEST_F(ChunkDemuxerTest, CodecIDsThatAreNotRFC6381Compliant) { |
2537 ChunkDemuxer::Status expected = ChunkDemuxer::kNotSupported; | 2551 ChunkDemuxer::Status expected = ChunkDemuxer::kNotSupported; |
2538 | 2552 |
2539 #if defined(USE_PROPRIETARY_CODECS) | 2553 #if defined(USE_PROPRIETARY_CODECS) |
2540 expected = ChunkDemuxer::kOk; | 2554 expected = ChunkDemuxer::kOk; |
2541 #endif | 2555 #endif |
2542 const char* codec_ids[] = { | 2556 const char* codec_ids[] = { |
2543 // GPAC places leading zeros on the audio object type. | 2557 // GPAC places leading zeros on the audio object type. |
2544 "mp4a.40.02", | 2558 "mp4a.40.02", |
2545 "mp4a.40.05" | 2559 "mp4a.40.05" |
2546 }; | 2560 }; |
2547 | 2561 |
2548 for (size_t i = 0; i < arraysize(codec_ids); ++i) { | 2562 for (size_t i = 0; i < arraysize(codec_ids); ++i) { |
2549 std::vector<std::string> codecs; | 2563 std::vector<std::string> codecs; |
2550 codecs.push_back(codec_ids[i]); | 2564 codecs.push_back(codec_ids[i]); |
2551 | 2565 |
2552 ChunkDemuxer::Status result = | 2566 ChunkDemuxer::Status result = |
2553 demuxer_->AddId("source_id", "audio/mp4", codecs); | 2567 demuxer_->AddId("source_id", "audio/mp4", codecs, |
| 2568 base::Bind(&ChunkDemuxerTest::OnNewInitSegment, |
| 2569 base::Unretained(this))); |
2554 | 2570 |
2555 EXPECT_EQ(result, expected) | 2571 EXPECT_EQ(result, expected) |
2556 << "Fail to add codec_id '" << codec_ids[i] << "'"; | 2572 << "Fail to add codec_id '" << codec_ids[i] << "'"; |
2557 | 2573 |
2558 if (result == ChunkDemuxer::kOk) | 2574 if (result == ChunkDemuxer::kOk) |
2559 demuxer_->RemoveId("source_id"); | 2575 demuxer_->RemoveId("source_id"); |
2560 } | 2576 } |
2561 } | 2577 } |
2562 | 2578 |
2563 TEST_F(ChunkDemuxerTest, EndOfStreamStillSetAfterSeek) { | 2579 TEST_F(ChunkDemuxerTest, EndOfStreamStillSetAfterSeek) { |
(...skipping 911 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3475 TEST_F(ChunkDemuxerTest, CuesBetweenClusters) { | 3491 TEST_F(ChunkDemuxerTest, CuesBetweenClusters) { |
3476 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); | 3492 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); |
3477 | 3493 |
3478 AppendCluster(GenerateCluster(0, 0, 4)); | 3494 AppendCluster(GenerateCluster(0, 0, 4)); |
3479 AppendData(kCuesHeader, sizeof(kCuesHeader)); | 3495 AppendData(kCuesHeader, sizeof(kCuesHeader)); |
3480 AppendCluster(GenerateCluster(46, 66, 5)); | 3496 AppendCluster(GenerateCluster(46, 66, 5)); |
3481 CheckExpectedRanges(kSourceId, "{ [0,115) }"); | 3497 CheckExpectedRanges(kSourceId, "{ [0,115) }"); |
3482 } | 3498 } |
3483 | 3499 |
3484 } // namespace media | 3500 } // namespace media |
OLD | NEW |