Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(317)

Side by Side Diff: media/filters/chunk_demuxer_unittest.cc

Issue 10832151: Add kSeekToStartFudgeRoom to SourceBufferStream (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase ToT Created 8 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | media/filters/source_buffer_stream.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 "base/bind.h" 5 #include "base/bind.h"
6 #include "base/message_loop.h" 6 #include "base/message_loop.h"
7 #include "media/base/audio_decoder_config.h" 7 #include "media/base/audio_decoder_config.h"
8 #include "media/base/decoder_buffer.h" 8 #include "media/base/decoder_buffer.h"
9 #include "media/base/mock_callback.h" 9 #include "media/base/mock_callback.h"
10 #include "media/base/mock_demuxer_host.h" 10 #include "media/base/mock_demuxer_host.h"
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
66 buffer[i] = tmp & 0xff; 66 buffer[i] = tmp & 0xff;
67 tmp >>= 8; 67 tmp >>= 8;
68 } 68 }
69 } 69 }
70 70
71 MATCHER_P(HasTimestamp, timestamp_in_ms, "") { 71 MATCHER_P(HasTimestamp, timestamp_in_ms, "") {
72 return arg && !arg->IsEndOfStream() && 72 return arg && !arg->IsEndOfStream() &&
73 arg->GetTimestamp().InMilliseconds() == timestamp_in_ms; 73 arg->GetTimestamp().InMilliseconds() == timestamp_in_ms;
74 } 74 }
75 75
76 MATCHER(IsEndOfStream, "") {
77 return arg && arg->IsEndOfStream();
78 }
79
76 static void OnReadDone(const base::TimeDelta& expected_time, 80 static void OnReadDone(const base::TimeDelta& expected_time,
77 bool* called, 81 bool* called,
78 DemuxerStream::Status status, 82 DemuxerStream::Status status,
79 const scoped_refptr<DecoderBuffer>& buffer) { 83 const scoped_refptr<DecoderBuffer>& buffer) {
80 EXPECT_EQ(status, DemuxerStream::kOk); 84 EXPECT_EQ(status, DemuxerStream::kOk);
81 EXPECT_EQ(expected_time, buffer->GetTimestamp()); 85 EXPECT_EQ(expected_time, buffer->GetTimestamp());
82 *called = true; 86 *called = true;
83 } 87 }
84 88
85 static void OnReadDone_EOSExpected(bool* called, 89 static void OnReadDone_EOSExpected(bool* called,
(...skipping 493 matching lines...) Expand 10 before | Expand all | Expand 10 after
579 ss << "[" << r.start(i).InMilliseconds() << "," 583 ss << "[" << r.start(i).InMilliseconds() << ","
580 << r.end(i).InMilliseconds() << ") "; 584 << r.end(i).InMilliseconds() << ") ";
581 } 585 }
582 ss << "}"; 586 ss << "}";
583 EXPECT_EQ(ss.str(), expected); 587 EXPECT_EQ(ss.str(), expected);
584 } 588 }
585 589
586 MOCK_METHOD2(ReadDone, void(DemuxerStream::Status status, 590 MOCK_METHOD2(ReadDone, void(DemuxerStream::Status status,
587 const scoped_refptr<DecoderBuffer>&)); 591 const scoped_refptr<DecoderBuffer>&));
588 592
593 void ExpectEndOfStream(DemuxerStream* stream) {
594 EXPECT_CALL(*this, ReadDone(DemuxerStream::kOk, IsEndOfStream()));
595 stream->Read(base::Bind(&ChunkDemuxerTest::ReadDone,
596 base::Unretained(this)));
597 }
598
589 void ExpectRead(DemuxerStream* stream, int64 timestamp_in_ms) { 599 void ExpectRead(DemuxerStream* stream, int64 timestamp_in_ms) {
590 EXPECT_CALL(*this, ReadDone(DemuxerStream::kOk, 600 EXPECT_CALL(*this, ReadDone(DemuxerStream::kOk,
591 HasTimestamp(timestamp_in_ms))); 601 HasTimestamp(timestamp_in_ms)));
592 stream->Read(base::Bind(&ChunkDemuxerTest::ReadDone, 602 stream->Read(base::Bind(&ChunkDemuxerTest::ReadDone,
593 base::Unretained(this))); 603 base::Unretained(this)));
594 } 604 }
595 605
596 void ExpectConfigChanged(DemuxerStream* stream) { 606 void ExpectConfigChanged(DemuxerStream* stream) {
597 EXPECT_CALL(*this, ReadDone(DemuxerStream::kConfigChanged, _)); 607 EXPECT_CALL(*this, ReadDone(DemuxerStream::kConfigChanged, _));
598 stream->Read(base::Bind(&ChunkDemuxerTest::ReadDone, 608 stream->Read(base::Bind(&ChunkDemuxerTest::ReadDone,
(...skipping 1159 matching lines...) Expand 10 before | Expand all | Expand 10 after
1758 ASSERT_TRUE(AppendData(audio_id, cluster_a->data(), cluster_a->size())); 1768 ASSERT_TRUE(AppendData(audio_id, cluster_a->data(), cluster_a->size()));
1759 ASSERT_TRUE(AppendData(video_id, cluster_v->data(), cluster_v->size())); 1769 ASSERT_TRUE(AppendData(video_id, cluster_v->data(), cluster_v->size()));
1760 1770
1761 // Both streams should be able to fulfill a seek to 25. 1771 // Both streams should be able to fulfill a seek to 25.
1762 demuxer_->Seek(base::TimeDelta::FromMilliseconds(25), 1772 demuxer_->Seek(base::TimeDelta::FromMilliseconds(25),
1763 NewExpectedStatusCB(PIPELINE_OK)); 1773 NewExpectedStatusCB(PIPELINE_OK));
1764 GenerateSingleStreamExpectedReads(25, 4, audio, kAudioBlockDuration); 1774 GenerateSingleStreamExpectedReads(25, 4, audio, kAudioBlockDuration);
1765 GenerateSingleStreamExpectedReads(30, 4, video, kVideoBlockDuration); 1775 GenerateSingleStreamExpectedReads(30, 4, video, kVideoBlockDuration);
1766 } 1776 }
1767 1777
1778 TEST_F(ChunkDemuxerTest, TestDifferentStreamTimecodesOutOfRange) {
1779 std::string audio_id = "audio1";
1780 std::string video_id = "video1";
1781 ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id));
1782
1783 scoped_refptr<DemuxerStream> audio =
1784 demuxer_->GetStream(DemuxerStream::AUDIO);
1785 scoped_refptr<DemuxerStream> video =
1786 demuxer_->GetStream(DemuxerStream::VIDEO);
1787
1788 // Generate two streams where the video stream starts 10s after the audio
1789 // stream and append them.
1790 scoped_ptr<Cluster> cluster_v(
1791 GenerateSingleStreamCluster(10000, 4 * kVideoBlockDuration + 10000,
1792 kVideoTrackNum, kVideoBlockDuration));
1793 scoped_ptr<Cluster> cluster_a(
1794 GenerateSingleStreamCluster(0, 4 * kAudioBlockDuration + 0,
1795 kAudioTrackNum, kAudioBlockDuration));
1796 ASSERT_TRUE(AppendData(audio_id, cluster_a->data(), cluster_a->size()));
1797 ASSERT_TRUE(AppendData(video_id, cluster_v->data(), cluster_v->size()));
1798
1799 // Should not be able to fulfill a seek to 0.
1800 demuxer_->Seek(base::TimeDelta::FromMilliseconds(0),
1801 NewExpectedStatusCB(PIPELINE_ERROR_ABORT));
1802 ExpectRead(audio, 0);
1803 ExpectEndOfStream(video);
1804 }
1805
1768 TEST_F(ChunkDemuxerTest, TestClusterWithNoBuffers) { 1806 TEST_F(ChunkDemuxerTest, TestClusterWithNoBuffers) {
1769 ASSERT_TRUE(InitDemuxer(true, true, false)); 1807 ASSERT_TRUE(InitDemuxer(true, true, false));
1770 1808
1771 // Generate and append an empty cluster beginning at 0. 1809 // Generate and append an empty cluster beginning at 0.
1772 ASSERT_TRUE(AppendEmptyCluster(0)); 1810 ASSERT_TRUE(AppendEmptyCluster(0));
1773 1811
1774 // Sanity check that data can be appended after this cluster correctly. 1812 // Sanity check that data can be appended after this cluster correctly.
1775 scoped_ptr<Cluster> media_data(GenerateCluster(0, 2)); 1813 scoped_ptr<Cluster> media_data(GenerateCluster(0, 2));
1776 ASSERT_TRUE(AppendData(media_data->data(), media_data->size())); 1814 ASSERT_TRUE(AppendData(media_data->data(), media_data->size()));
1777 scoped_refptr<DemuxerStream> audio = 1815 scoped_refptr<DemuxerStream> audio =
(...skipping 327 matching lines...) Expand 10 before | Expand all | Expand 10 after
2105 TEST_F(ChunkDemuxerTest, TestTimestampOffsetSeparateStreams) { 2143 TEST_F(ChunkDemuxerTest, TestTimestampOffsetSeparateStreams) {
2106 std::string audio_id = "audio1"; 2144 std::string audio_id = "audio1";
2107 std::string video_id = "video1"; 2145 std::string video_id = "video1";
2108 ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id)); 2146 ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id));
2109 2147
2110 scoped_refptr<DemuxerStream> audio = 2148 scoped_refptr<DemuxerStream> audio =
2111 demuxer_->GetStream(DemuxerStream::AUDIO); 2149 demuxer_->GetStream(DemuxerStream::AUDIO);
2112 scoped_refptr<DemuxerStream> video = 2150 scoped_refptr<DemuxerStream> video =
2113 demuxer_->GetStream(DemuxerStream::VIDEO); 2151 demuxer_->GetStream(DemuxerStream::VIDEO);
2114 2152
2115 scoped_ptr<Cluster> cluster_a( 2153 scoped_ptr<Cluster> cluster_a1(
2116 GenerateSingleStreamCluster( 2154 GenerateSingleStreamCluster(
2117 2500, 2500 + kAudioBlockDuration * 4, kAudioTrackNum, 2155 2500, 2500 + kAudioBlockDuration * 4, kAudioTrackNum,
2118 kAudioBlockDuration)); 2156 kAudioBlockDuration));
2119 2157
2120 scoped_ptr<Cluster> cluster_v( 2158 scoped_ptr<Cluster> cluster_v1(
2159 GenerateSingleStreamCluster(
2160 2500, 2500 + kVideoBlockDuration * 4, kVideoTrackNum,
2161 kVideoBlockDuration));
2162
2163 scoped_ptr<Cluster> cluster_a2(
2164 GenerateSingleStreamCluster(
2165 0, kAudioBlockDuration * 4, kAudioTrackNum, kAudioBlockDuration));
2166
2167 scoped_ptr<Cluster> cluster_v2(
2121 GenerateSingleStreamCluster( 2168 GenerateSingleStreamCluster(
2122 0, kVideoBlockDuration * 4, kVideoTrackNum, kVideoBlockDuration)); 2169 0, kVideoBlockDuration * 4, kVideoTrackNum, kVideoBlockDuration));
2123 2170
2124 ASSERT_TRUE(demuxer_->SetTimestampOffset(audio_id, -2.5)); 2171 ASSERT_TRUE(demuxer_->SetTimestampOffset(audio_id, -2.5));
2125 ASSERT_TRUE(AppendData(audio_id, cluster_a->data(), cluster_a->size())); 2172 ASSERT_TRUE(demuxer_->SetTimestampOffset(video_id, -2.5));
2173 ASSERT_TRUE(AppendData(audio_id, cluster_a1->data(), cluster_a1->size()));
2174 ASSERT_TRUE(AppendData(video_id, cluster_v1->data(), cluster_v1->size()));
2126 GenerateSingleStreamExpectedReads(0, 4, audio, kAudioBlockDuration); 2175 GenerateSingleStreamExpectedReads(0, 4, audio, kAudioBlockDuration);
2176 GenerateSingleStreamExpectedReads(0, 4, video, kVideoBlockDuration);
2127 2177
2178 demuxer_->StartWaitingForSeek();
2179 demuxer_->Seek(base::TimeDelta::FromMilliseconds(27300),
2180 NewExpectedStatusCB(PIPELINE_OK));
2181
2182 ASSERT_TRUE(demuxer_->SetTimestampOffset(audio_id, 27.3));
2128 ASSERT_TRUE(demuxer_->SetTimestampOffset(video_id, 27.3)); 2183 ASSERT_TRUE(demuxer_->SetTimestampOffset(video_id, 27.3));
2129 ASSERT_TRUE(AppendData(video_id, cluster_v->data(), cluster_v->size())); 2184 ASSERT_TRUE(AppendData(audio_id, cluster_a2->data(), cluster_a2->size()));
2185 ASSERT_TRUE(AppendData(video_id, cluster_v2->data(), cluster_v2->size()));
2130 GenerateSingleStreamExpectedReads(27300, 4, video, kVideoBlockDuration); 2186 GenerateSingleStreamExpectedReads(27300, 4, video, kVideoBlockDuration);
2187 GenerateSingleStreamExpectedReads(27300, 4, audio, kAudioBlockDuration);
2131 } 2188 }
2132 2189
2133 TEST_F(ChunkDemuxerTest, TestTimestampOffsetMidParse) { 2190 TEST_F(ChunkDemuxerTest, TestTimestampOffsetMidParse) {
2134 ASSERT_TRUE(InitDemuxer(true, true, false)); 2191 ASSERT_TRUE(InitDemuxer(true, true, false));
2135 2192
2136 scoped_ptr<Cluster> cluster = GenerateCluster(0, 2); 2193 scoped_ptr<Cluster> cluster = GenerateCluster(0, 2);
2137 // Append only part of the cluster data. 2194 // Append only part of the cluster data.
2138 ASSERT_TRUE(AppendData(cluster->data(), cluster->size() - 13)); 2195 ASSERT_TRUE(AppendData(cluster->data(), cluster->size() - 13));
2139 2196
2140 // Setting a timestamp should fail because we're in the middle of a cluster. 2197 // Setting a timestamp should fail because we're in the middle of a cluster.
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
2193 2250
2194 scoped_ptr<Cluster> cluster_a(kDefaultFirstCluster()); 2251 scoped_ptr<Cluster> cluster_a(kDefaultFirstCluster());
2195 ASSERT_TRUE(AppendData(cluster_a->data(), cluster_a->size())); 2252 ASSERT_TRUE(AppendData(cluster_a->data(), cluster_a->size()));
2196 2253
2197 EXPECT_CALL(host_, SetDuration( 2254 EXPECT_CALL(host_, SetDuration(
2198 base::TimeDelta::FromMilliseconds(kDefaultFirstClusterEndTimestamp))); 2255 base::TimeDelta::FromMilliseconds(kDefaultFirstClusterEndTimestamp)));
2199 demuxer_->EndOfStream(PIPELINE_OK); 2256 demuxer_->EndOfStream(PIPELINE_OK);
2200 } 2257 }
2201 2258
2202 } // namespace media 2259 } // namespace media
OLDNEW
« no previous file with comments | « no previous file | media/filters/source_buffer_stream.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698