| 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 |