OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 <stddef.h> | 5 #include <stddef.h> |
6 #include <stdint.h> | 6 #include <stdint.h> |
7 | 7 |
8 #include <map> | 8 #include <map> |
9 #include <string> | 9 #include <string> |
10 #include <vector> | 10 #include <vector> |
(...skipping 15 matching lines...) Expand all Loading... |
26 #include "media/filters/frame_processor.h" | 26 #include "media/filters/frame_processor.h" |
27 #include "testing/gtest/include/gtest/gtest.h" | 27 #include "testing/gtest/include/gtest/gtest.h" |
28 | 28 |
29 using ::testing::InSequence; | 29 using ::testing::InSequence; |
30 using ::testing::StrictMock; | 30 using ::testing::StrictMock; |
31 using ::testing::Values; | 31 using ::testing::Values; |
32 | 32 |
33 namespace media { | 33 namespace media { |
34 | 34 |
35 typedef StreamParser::BufferQueue BufferQueue; | 35 typedef StreamParser::BufferQueue BufferQueue; |
36 typedef StreamParser::TextBufferQueueMap TextBufferQueueMap; | |
37 typedef StreamParser::TrackId TrackId; | 36 typedef StreamParser::TrackId TrackId; |
38 | 37 |
39 // Used for setting expectations on callbacks. Using a StrictMock also lets us | 38 // Used for setting expectations on callbacks. Using a StrictMock also lets us |
40 // test for missing or extra callbacks. | 39 // test for missing or extra callbacks. |
41 class FrameProcessorTestCallbackHelper { | 40 class FrameProcessorTestCallbackHelper { |
42 public: | 41 public: |
43 FrameProcessorTestCallbackHelper() {} | 42 FrameProcessorTestCallbackHelper() {} |
44 virtual ~FrameProcessorTestCallbackHelper() {} | 43 virtual ~FrameProcessorTestCallbackHelper() {} |
45 | 44 |
46 MOCK_METHOD1(PossibleDurationIncrease, void(base::TimeDelta new_duration)); | 45 MOCK_METHOD1(PossibleDurationIncrease, void(base::TimeDelta new_duration)); |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
145 } | 144 } |
146 | 145 |
147 buffer->set_duration(frame_duration_); | 146 buffer->set_duration(frame_duration_); |
148 buffers.push_back(buffer); | 147 buffers.push_back(buffer); |
149 } | 148 } |
150 return buffers; | 149 return buffers; |
151 } | 150 } |
152 | 151 |
153 void ProcessFrames(const std::string& audio_timestamps, | 152 void ProcessFrames(const std::string& audio_timestamps, |
154 const std::string& video_timestamps) { | 153 const std::string& video_timestamps) { |
| 154 StreamParser::BufferQueueMap buffer_queue_map; |
| 155 const auto& audio_buffers = |
| 156 StringToBufferQueue(audio_timestamps, audio_id_, DemuxerStream::AUDIO); |
| 157 if (!audio_buffers.empty()) |
| 158 buffer_queue_map.insert(std::make_pair(audio_id_, audio_buffers)); |
| 159 const auto& video_buffers = |
| 160 StringToBufferQueue(video_timestamps, video_id_, DemuxerStream::VIDEO); |
| 161 if (!video_buffers.empty()) |
| 162 buffer_queue_map.insert(std::make_pair(video_id_, video_buffers)); |
155 ASSERT_TRUE(frame_processor_->ProcessFrames( | 163 ASSERT_TRUE(frame_processor_->ProcessFrames( |
156 StringToBufferQueue(audio_timestamps, audio_id_, DemuxerStream::AUDIO), | 164 buffer_queue_map, append_window_start_, append_window_end_, |
157 StringToBufferQueue(video_timestamps, video_id_, DemuxerStream::VIDEO), | |
158 empty_text_buffers_, append_window_start_, append_window_end_, | |
159 ×tamp_offset_)); | 165 ×tamp_offset_)); |
160 } | 166 } |
161 | 167 |
162 void CheckExpectedRangesByTimestamp(ChunkDemuxerStream* stream, | 168 void CheckExpectedRangesByTimestamp(ChunkDemuxerStream* stream, |
163 const std::string& expected) { | 169 const std::string& expected) { |
164 // Note, DemuxerStream::TEXT streams return [0,duration (==infinity here)) | 170 // Note, DemuxerStream::TEXT streams return [0,duration (==infinity here)) |
165 Ranges<base::TimeDelta> r = stream->GetBufferedRanges(kInfiniteDuration); | 171 Ranges<base::TimeDelta> r = stream->GetBufferedRanges(kInfiniteDuration); |
166 | 172 |
167 std::stringstream ss; | 173 std::stringstream ss; |
168 ss << "{ "; | 174 ss << "{ "; |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
263 std::unique_ptr<FrameProcessor> frame_processor_; | 269 std::unique_ptr<FrameProcessor> frame_processor_; |
264 base::TimeDelta append_window_start_; | 270 base::TimeDelta append_window_start_; |
265 base::TimeDelta append_window_end_; | 271 base::TimeDelta append_window_end_; |
266 base::TimeDelta timestamp_offset_; | 272 base::TimeDelta timestamp_offset_; |
267 base::TimeDelta frame_duration_; | 273 base::TimeDelta frame_duration_; |
268 std::unique_ptr<ChunkDemuxerStream> audio_; | 274 std::unique_ptr<ChunkDemuxerStream> audio_; |
269 std::unique_ptr<ChunkDemuxerStream> video_; | 275 std::unique_ptr<ChunkDemuxerStream> video_; |
270 const TrackId audio_id_; | 276 const TrackId audio_id_; |
271 const TrackId video_id_; | 277 const TrackId video_id_; |
272 const BufferQueue empty_queue_; | 278 const BufferQueue empty_queue_; |
273 const TextBufferQueueMap empty_text_buffers_; | |
274 | 279 |
275 // StoreStatusAndBuffer's most recent result. | 280 // StoreStatusAndBuffer's most recent result. |
276 DemuxerStream::Status last_read_status_; | 281 DemuxerStream::Status last_read_status_; |
277 scoped_refptr<DecoderBuffer> last_read_buffer_; | 282 scoped_refptr<DecoderBuffer> last_read_buffer_; |
278 bool read_callback_called_; | 283 bool read_callback_called_; |
279 | 284 |
280 private: | 285 private: |
281 void StoreStatusAndBuffer(DemuxerStream::Status status, | 286 void StoreStatusAndBuffer(DemuxerStream::Status status, |
282 const scoped_refptr<DecoderBuffer>& buffer) { | 287 const scoped_refptr<DecoderBuffer>& buffer) { |
283 if (status == DemuxerStream::kOk && buffer.get()) { | 288 if (status == DemuxerStream::kOk && buffer.get()) { |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
321 } | 326 } |
322 } | 327 } |
323 | 328 |
324 DISALLOW_COPY_AND_ASSIGN(FrameProcessorTest); | 329 DISALLOW_COPY_AND_ASSIGN(FrameProcessorTest); |
325 }; | 330 }; |
326 | 331 |
327 TEST_F(FrameProcessorTest, WrongTypeInAppendedBuffer) { | 332 TEST_F(FrameProcessorTest, WrongTypeInAppendedBuffer) { |
328 AddTestTracks(HAS_AUDIO); | 333 AddTestTracks(HAS_AUDIO); |
329 EXPECT_FALSE(in_coded_frame_group()); | 334 EXPECT_FALSE(in_coded_frame_group()); |
330 | 335 |
331 ASSERT_FALSE(frame_processor_->ProcessFrames( | 336 StreamParser::BufferQueueMap buffer_queue_map; |
332 StringToBufferQueue("0K", audio_id_, DemuxerStream::VIDEO), empty_queue_, | 337 const auto& audio_buffers = |
333 empty_text_buffers_, append_window_start_, append_window_end_, | 338 StringToBufferQueue("0K", audio_id_, DemuxerStream::VIDEO); |
334 ×tamp_offset_)); | 339 buffer_queue_map.insert(std::make_pair(audio_id_, audio_buffers)); |
| 340 ASSERT_FALSE( |
| 341 frame_processor_->ProcessFrames(buffer_queue_map, append_window_start_, |
| 342 append_window_end_, ×tamp_offset_)); |
335 EXPECT_FALSE(in_coded_frame_group()); | 343 EXPECT_FALSE(in_coded_frame_group()); |
336 EXPECT_EQ(base::TimeDelta(), timestamp_offset_); | 344 EXPECT_EQ(base::TimeDelta(), timestamp_offset_); |
337 CheckExpectedRangesByTimestamp(audio_.get(), "{ }"); | 345 CheckExpectedRangesByTimestamp(audio_.get(), "{ }"); |
338 CheckReadStalls(audio_.get()); | 346 CheckReadStalls(audio_.get()); |
339 } | 347 } |
340 | 348 |
341 TEST_F(FrameProcessorTest, NonMonotonicallyIncreasingTimestampInOneCall) { | 349 TEST_F(FrameProcessorTest, NonMonotonicallyIncreasingTimestampInOneCall) { |
342 AddTestTracks(HAS_AUDIO); | 350 AddTestTracks(HAS_AUDIO); |
343 | 351 |
344 ASSERT_FALSE(frame_processor_->ProcessFrames( | 352 StreamParser::BufferQueueMap buffer_queue_map; |
345 StringToBufferQueue("10K 0K", audio_id_, DemuxerStream::AUDIO), | 353 const auto& audio_buffers = |
346 empty_queue_, empty_text_buffers_, append_window_start_, | 354 StringToBufferQueue("10K 0K", audio_id_, DemuxerStream::AUDIO); |
347 append_window_end_, ×tamp_offset_)); | 355 buffer_queue_map.insert(std::make_pair(audio_id_, audio_buffers)); |
| 356 ASSERT_FALSE( |
| 357 frame_processor_->ProcessFrames(buffer_queue_map, append_window_start_, |
| 358 append_window_end_, ×tamp_offset_)); |
348 EXPECT_FALSE(in_coded_frame_group()); | 359 EXPECT_FALSE(in_coded_frame_group()); |
349 EXPECT_EQ(base::TimeDelta(), timestamp_offset_); | 360 EXPECT_EQ(base::TimeDelta(), timestamp_offset_); |
350 CheckExpectedRangesByTimestamp(audio_.get(), "{ }"); | 361 CheckExpectedRangesByTimestamp(audio_.get(), "{ }"); |
351 CheckReadStalls(audio_.get()); | 362 CheckReadStalls(audio_.get()); |
352 } | 363 } |
353 | 364 |
354 TEST_P(FrameProcessorTest, AudioOnly_SingleFrame) { | 365 TEST_P(FrameProcessorTest, AudioOnly_SingleFrame) { |
355 // Tests A: P(A) -> (a) | 366 // Tests A: P(A) -> (a) |
356 InSequence s; | 367 InSequence s; |
357 AddTestTracks(HAS_AUDIO); | 368 AddTestTracks(HAS_AUDIO); |
(...skipping 530 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
888 StreamParserBuffer* last_read_parser_buffer = | 899 StreamParserBuffer* last_read_parser_buffer = |
889 static_cast<StreamParserBuffer*>(last_read_buffer_.get()); | 900 static_cast<StreamParserBuffer*>(last_read_buffer_.get()); |
890 ASSERT_EQ(base::TimeDelta::FromMilliseconds(0), | 901 ASSERT_EQ(base::TimeDelta::FromMilliseconds(0), |
891 last_read_parser_buffer->preroll_buffer()->duration()); | 902 last_read_parser_buffer->preroll_buffer()->duration()); |
892 } | 903 } |
893 | 904 |
894 INSTANTIATE_TEST_CASE_P(SequenceMode, FrameProcessorTest, Values(true)); | 905 INSTANTIATE_TEST_CASE_P(SequenceMode, FrameProcessorTest, Values(true)); |
895 INSTANTIATE_TEST_CASE_P(SegmentsMode, FrameProcessorTest, Values(false)); | 906 INSTANTIATE_TEST_CASE_P(SegmentsMode, FrameProcessorTest, Values(false)); |
896 | 907 |
897 } // namespace media | 908 } // namespace media |
OLD | NEW |