Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 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 | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include <vector> | |
| 6 | |
| 7 #include "base/bind.h" | |
| 8 #include "base/logging.h" | |
| 9 #include "base/time/time.h" | |
| 10 #include "media/base/stream_parser_buffer.h" | |
| 11 #include "media/base/video_decoder_config.h" | |
| 12 #include "media/formats/mp2t/es_adapter_video.h" | |
| 13 #include "testing/gtest/include/gtest/gtest.h" | |
| 14 | |
| 15 namespace media { | |
| 16 namespace mp2t { | |
| 17 | |
| 18 namespace { | |
| 19 | |
| 20 VideoDecoderConfig CreateFakeVideoConfig() { | |
| 21 gfx::Size coded_size(320, 240); | |
| 22 gfx::Rect visible_rect(0, 0, 320, 240); | |
| 23 gfx::Size natural_size(320, 240); | |
| 24 return VideoDecoderConfig( | |
| 25 kCodecH264, | |
| 26 H264PROFILE_MAIN, | |
| 27 VideoFrame::I420, | |
| 28 coded_size, | |
| 29 visible_rect, | |
| 30 natural_size, | |
| 31 NULL, 0, false); | |
| 32 } | |
| 33 | |
| 34 std::vector<scoped_refptr<StreamParserBuffer> > | |
|
wolenetz
2014/07/10 23:28:14
nit: use StreamParserBuffer::BufferQueue (a deque)
damienv1
2014/07/11 00:44:41
Done.
| |
| 35 GenerateFakeBuffers(const std::vector<base::TimeDelta>& frame_pts) { | |
| 36 uint8 dummy_buffer[] = {0, 0, 0, 0}; | |
| 37 | |
| 38 std::vector<scoped_refptr<StreamParserBuffer> > buffers(frame_pts.size()); | |
| 39 for (size_t k = 0; k < frame_pts.size(); k++) { | |
| 40 buffers[k] = StreamParserBuffer::CopyFrom( | |
| 41 dummy_buffer, arraysize(dummy_buffer), true, DemuxerStream::VIDEO, 0); | |
| 42 buffers[k]->set_timestamp(frame_pts[k]); | |
| 43 } | |
| 44 return buffers; | |
| 45 } | |
| 46 | |
| 47 std::vector<base::TimeDelta> ConvertToTimeDelta( | |
| 48 const int* timestamp_in_ms, size_t size) { | |
|
wolenetz
2014/07/10 23:28:13
nit: |size| could be misinterpreted as # of bytes
wolenetz
2014/07/10 23:28:14
nit: move to previous line and wrap after 1st para
damienv1
2014/07/11 00:44:42
Done.
damienv1
2014/07/11 00:44:42
Done.
| |
| 49 std::vector<base::TimeDelta> timestamp(size); | |
| 50 for (size_t k = 0; k < size; k++) | |
| 51 timestamp[k] = base::TimeDelta::FromMilliseconds(timestamp_in_ms[k]); | |
| 52 return timestamp; | |
| 53 } | |
| 54 | |
| 55 } | |
| 56 | |
| 57 class EsAdapterVideoTest : public testing::Test { | |
| 58 public: | |
| 59 EsAdapterVideoTest(); | |
| 60 virtual ~EsAdapterVideoTest() {} | |
| 61 | |
| 62 protected: | |
| 63 // Given a set of input pts |pts_ms|, make sure | |
| 64 // the ES adapter computes the expected durations |duration_ms|. | |
| 65 void RunDurationTest(const int* pts_ms, | |
| 66 const int* duration_ms, | |
| 67 size_t size); | |
| 68 | |
| 69 private: | |
| 70 void OnNewConfig(const VideoDecoderConfig& video_config); | |
| 71 void OnNewBuffer(scoped_refptr<StreamParserBuffer> buffer); | |
| 72 | |
| 73 EsAdapterVideo es_adapter_; | |
| 74 | |
| 75 size_t buffer_count_; | |
| 76 std::vector<base::TimeDelta> expected_frame_duration_; | |
| 77 | |
| 78 DISALLOW_COPY_AND_ASSIGN(EsAdapterVideoTest); | |
| 79 }; | |
| 80 | |
| 81 EsAdapterVideoTest::EsAdapterVideoTest() | |
| 82 : es_adapter_(base::Bind(&EsAdapterVideoTest::OnNewConfig, | |
| 83 base::Unretained(this)), | |
| 84 base::Bind(&EsAdapterVideoTest::OnNewBuffer, | |
| 85 base::Unretained(this))), | |
| 86 buffer_count_(0) { | |
| 87 } | |
| 88 | |
| 89 void EsAdapterVideoTest::OnNewConfig(const VideoDecoderConfig& video_config) { | |
| 90 } | |
| 91 | |
| 92 void EsAdapterVideoTest::OnNewBuffer( | |
| 93 scoped_refptr<StreamParserBuffer> buffer) { | |
| 94 ASSERT_LT(buffer_count_, expected_frame_duration_.size()); | |
| 95 EXPECT_EQ(expected_frame_duration_[buffer_count_], buffer->duration()); | |
|
scherkus (not reviewing)
2014/07/10 23:13:58
suggestion for improving the maintainability of th
damienv1
2014/07/11 00:44:42
Pretty convenient indeed.
Thanks for the suggestio
| |
| 96 buffer_count_++; | |
| 97 } | |
| 98 | |
|
wolenetz
2014/07/10 23:28:13
Thanks for adding test coverage - I would like to
damienv1
2014/07/11 00:44:42
Done.
| |
| 99 void EsAdapterVideoTest::RunDurationTest( | |
| 100 const int* pts_ms, | |
| 101 const int* duration_ms, | |
| 102 size_t size) { | |
| 103 std::vector<base::TimeDelta> frame_pts(ConvertToTimeDelta(pts_ms, size)); | |
| 104 expected_frame_duration_ = ConvertToTimeDelta(duration_ms, size); | |
| 105 | |
| 106 // Generate fake buffers with the given PTS. | |
| 107 std::vector<scoped_refptr<StreamParserBuffer> > fake_buffers( | |
| 108 GenerateFakeBuffers(frame_pts)); | |
| 109 | |
| 110 es_adapter_.OnConfigChanged(CreateFakeVideoConfig()); | |
| 111 for (size_t k = 0; k < fake_buffers.size(); k++) | |
| 112 es_adapter_.OnNewBuffer(fake_buffers[k]); | |
| 113 es_adapter_.Flush(); | |
| 114 } | |
| 115 | |
| 116 TEST_F(EsAdapterVideoTest, FrameDurationSimpleGop) { | |
| 117 // PTS for a GOP without B frames - strictly increasing. | |
| 118 int pts_ms[] = {30, 31, 33, 36, 40, 45, 51, 58}; | |
| 119 int duration_ms[] = {1, 2, 3, 4, 5, 6, 7, 7}; | |
| 120 | |
| 121 RunDurationTest(pts_ms, duration_ms, arraysize(pts_ms)); | |
| 122 } | |
| 123 | |
| 124 TEST_F(EsAdapterVideoTest, FrameDurationComplexGop) { | |
| 125 // PTS for a GOP with B frames. | |
| 126 int pts_ms[] = {30, 120, 60, 90, 210, 150, 180, 300, 240, 270}; | |
| 127 int duration_ms[] = {30, 30, 30, 30, 30, 30, 30, 30, 30, 30}; | |
| 128 | |
| 129 RunDurationTest(pts_ms, duration_ms, arraysize(pts_ms)); | |
| 130 } | |
| 131 | |
| 132 } // namespace mp2t | |
| 133 } // namespace media | |
| OLD | NEW |