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

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: . 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 "media/base/audio_decoder_config.h" 6 #include "media/base/audio_decoder_config.h"
7 #include "media/base/decoder_buffer.h" 7 #include "media/base/decoder_buffer.h"
8 #include "media/base/mock_callback.h" 8 #include "media/base/mock_callback.h"
9 #include "media/base/mock_demuxer_host.h" 9 #include "media/base/mock_demuxer_host.h"
10 #include "media/base/test_data_util.h" 10 #include "media/base/test_data_util.h"
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
65 buffer[i] = tmp & 0xff; 65 buffer[i] = tmp & 0xff;
66 tmp >>= 8; 66 tmp >>= 8;
67 } 67 }
68 } 68 }
69 69
70 MATCHER_P(HasTimestamp, timestamp_in_ms, "") { 70 MATCHER_P(HasTimestamp, timestamp_in_ms, "") {
71 return arg && !arg->IsEndOfStream() && 71 return arg && !arg->IsEndOfStream() &&
72 arg->GetTimestamp().InMilliseconds() == timestamp_in_ms; 72 arg->GetTimestamp().InMilliseconds() == timestamp_in_ms;
73 } 73 }
74 74
75 MATCHER(IsEndOfStream, "") {
76 return arg && arg->IsEndOfStream();
77 }
78
75 static void OnReadDone(const base::TimeDelta& expected_time, 79 static void OnReadDone(const base::TimeDelta& expected_time,
76 bool* called, 80 bool* called,
77 DemuxerStream::Status status, 81 DemuxerStream::Status status,
78 const scoped_refptr<DecoderBuffer>& buffer) { 82 const scoped_refptr<DecoderBuffer>& buffer) {
79 EXPECT_EQ(status, DemuxerStream::kOk); 83 EXPECT_EQ(status, DemuxerStream::kOk);
80 EXPECT_EQ(expected_time, buffer->GetTimestamp()); 84 EXPECT_EQ(expected_time, buffer->GetTimestamp());
81 *called = true; 85 *called = true;
82 } 86 }
83 87
84 static void OnReadDone_EOSExpected(bool* called, 88 static void OnReadDone_EOSExpected(bool* called,
(...skipping 493 matching lines...) Expand 10 before | Expand all | Expand 10 after
578 ss << "[" << r.start(i).InMilliseconds() << "," 582 ss << "[" << r.start(i).InMilliseconds() << ","
579 << r.end(i).InMilliseconds() << ") "; 583 << r.end(i).InMilliseconds() << ") ";
580 } 584 }
581 ss << "}"; 585 ss << "}";
582 EXPECT_EQ(ss.str(), expected); 586 EXPECT_EQ(ss.str(), expected);
583 } 587 }
584 588
585 MOCK_METHOD2(ReadDone, void(DemuxerStream::Status status, 589 MOCK_METHOD2(ReadDone, void(DemuxerStream::Status status,
586 const scoped_refptr<DecoderBuffer>&)); 590 const scoped_refptr<DecoderBuffer>&));
587 591
592 void ExpectStall(DemuxerStream* stream) {
acolwell GONE FROM CHROMIUM 2012/08/04 00:04:51 s/ExpectStall/ExpectEndOfStream/ ? since that look
vrk (LEFT CHROMIUM) 2012/08/06 20:43:42 Done.
593 EXPECT_CALL(*this, ReadDone(DemuxerStream::kOk, IsEndOfStream()));
594 stream->Read(base::Bind(&ChunkDemuxerTest::ReadDone,
595 base::Unretained(this)));
596 }
597
588 void ExpectRead(DemuxerStream* stream, int64 timestamp_in_ms) { 598 void ExpectRead(DemuxerStream* stream, int64 timestamp_in_ms) {
589 EXPECT_CALL(*this, ReadDone(DemuxerStream::kOk, 599 EXPECT_CALL(*this, ReadDone(DemuxerStream::kOk,
590 HasTimestamp(timestamp_in_ms))); 600 HasTimestamp(timestamp_in_ms)));
591 stream->Read(base::Bind(&ChunkDemuxerTest::ReadDone, 601 stream->Read(base::Bind(&ChunkDemuxerTest::ReadDone,
592 base::Unretained(this))); 602 base::Unretained(this)));
593 } 603 }
594 604
595 void ExpectConfigChanged(DemuxerStream* stream) { 605 void ExpectConfigChanged(DemuxerStream* stream) {
596 EXPECT_CALL(*this, ReadDone(DemuxerStream::kConfigChanged, _)); 606 EXPECT_CALL(*this, ReadDone(DemuxerStream::kConfigChanged, _));
597 stream->Read(base::Bind(&ChunkDemuxerTest::ReadDone, 607 stream->Read(base::Bind(&ChunkDemuxerTest::ReadDone,
(...skipping 1160 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 ExpectStall(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 317 matching lines...) Expand 10 before | Expand all | Expand 10 after
2095 scoped_ptr<Cluster> cluster = GenerateCluster(1000, 2); 2133 scoped_ptr<Cluster> cluster = GenerateCluster(1000, 2);
2096 ASSERT_TRUE(AppendData(cluster->data(), cluster->size())); 2134 ASSERT_TRUE(AppendData(cluster->data(), cluster->size()));
2097 2135
2098 scoped_refptr<DemuxerStream> audio = 2136 scoped_refptr<DemuxerStream> audio =
2099 demuxer_->GetStream(DemuxerStream::AUDIO); 2137 demuxer_->GetStream(DemuxerStream::AUDIO);
2100 scoped_refptr<DemuxerStream> video = 2138 scoped_refptr<DemuxerStream> video =
2101 demuxer_->GetStream(DemuxerStream::VIDEO); 2139 demuxer_->GetStream(DemuxerStream::VIDEO);
2102 GenerateExpectedReads(0, 2, audio, video); 2140 GenerateExpectedReads(0, 2, audio, video);
2103 } 2141 }
2104 2142
2105 TEST_F(ChunkDemuxerTest, TestTimestampOffsetSeparateStreams) { 2143 TEST_F(ChunkDemuxerTest, TestTimestampOffsetSeparateStreams) {
vrk (LEFT CHROMIUM) 2012/08/03 23:52:03 Had to fix this test because it was unintentionall
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