OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 "content/renderer/media/capture_video_decoder.h" | 6 #include "content/renderer/media/capture_video_decoder.h" |
7 #include "content/renderer/media/video_capture_impl.h" | 7 #include "content/renderer/media/video_capture_impl.h" |
8 #include "content/renderer/media/video_capture_impl_manager.h" | 8 #include "content/renderer/media/video_capture_impl_manager.h" |
9 #include "media/base/filters.h" | 9 #include "media/base/filters.h" |
10 #include "media/base/limits.h" | 10 #include "media/base/limits.h" |
11 #include "media/base/mock_callback.h" | 11 #include "media/base/mock_callback.h" |
12 #include "media/base/mock_filter_host.h" | 12 #include "media/base/mock_filter_host.h" |
13 #include "media/base/mock_filters.h" | 13 #include "media/base/mock_filters.h" |
14 #include "media/base/pipeline_status.h" | 14 #include "media/base/pipeline_status.h" |
15 #include "testing/gtest/include/gtest/gtest.h" | 15 #include "testing/gtest/include/gtest/gtest.h" |
16 | 16 |
17 using ::testing::_; | 17 using ::testing::_; |
18 using ::testing::AnyNumber; | 18 using ::testing::AnyNumber; |
19 using ::testing::Return; | 19 using ::testing::Return; |
20 using ::testing::StrictMock; | 20 using ::testing::StrictMock; |
21 | 21 |
22 static const media::VideoCaptureSessionId kVideoStreamId = 1; | 22 static const media::VideoCaptureSessionId kVideoStreamId = 1; |
23 | 23 |
24 ACTION_P(ReturnFrameFromRenderer, decoder) { | |
25 decoder->ProduceVideoFrame(arg0); | |
26 } | |
27 | |
28 ACTION_P3(CreateDataBufferFromCapture, decoder, vc_impl, data_buffer_number) { | 24 ACTION_P3(CreateDataBufferFromCapture, decoder, vc_impl, data_buffer_number) { |
29 for (int i = 0; i < data_buffer_number; i++) { | 25 for (int i = 0; i < data_buffer_number; i++) { |
30 media::VideoCapture::VideoFrameBuffer* buffer; | 26 media::VideoCapture::VideoFrameBuffer* buffer; |
31 buffer = new media::VideoCapture::VideoFrameBuffer(); | 27 buffer = new media::VideoCapture::VideoFrameBuffer(); |
32 buffer->width = arg1.width; | 28 buffer->width = arg1.width; |
33 buffer->height = arg1.height; | 29 buffer->height = arg1.height; |
34 int length = buffer->width * buffer->height * 3 / 2; | 30 int length = buffer->width * buffer->height * 3 / 2; |
35 buffer->memory_pointer = new uint8[length]; | 31 buffer->memory_pointer = new uint8[length]; |
36 buffer->buffer_size = length; | 32 buffer->buffer_size = length; |
37 decoder->OnBufferReady(vc_impl, buffer); | 33 decoder->OnBufferReady(vc_impl, buffer); |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
91 media::VideoCapture::VideoCaptureCapability capability; | 87 media::VideoCapture::VideoCaptureCapability capability; |
92 capability.width = 176; | 88 capability.width = 176; |
93 capability.height = 144; | 89 capability.height = 144; |
94 capability.max_fps = 30; | 90 capability.max_fps = 30; |
95 capability.expected_capture_delay = 0; | 91 capability.expected_capture_delay = 0; |
96 capability.raw_type = media::VideoFrame::I420; | 92 capability.raw_type = media::VideoFrame::I420; |
97 capability.interlaced = false; | 93 capability.interlaced = false; |
98 | 94 |
99 decoder_ = new CaptureVideoDecoder(message_loop_proxy_, | 95 decoder_ = new CaptureVideoDecoder(message_loop_proxy_, |
100 kVideoStreamId, vc_manager_, capability); | 96 kVideoStreamId, vc_manager_, capability); |
101 renderer_ = new media::MockVideoRenderer(); | |
102 | |
103 decoder_->set_host(&host_); | 97 decoder_->set_host(&host_); |
104 decoder_->set_consume_video_frame_callback( | |
105 base::Bind(&media::MockVideoRenderer::ConsumeVideoFrame, | |
106 base::Unretained(renderer_.get()))); | |
107 EXPECT_CALL(statistics_callback_object_, OnStatistics(_)) | 98 EXPECT_CALL(statistics_callback_object_, OnStatistics(_)) |
108 .Times(AnyNumber()); | 99 .Times(AnyNumber()); |
| 100 |
| 101 read_cb_ = base::Bind(&CaptureVideoDecoderTest::FrameReady, |
| 102 base::Unretained(this)); |
109 } | 103 } |
110 | 104 |
111 virtual ~CaptureVideoDecoderTest() { | 105 virtual ~CaptureVideoDecoderTest() { |
112 message_loop_->RunAllPending(); | 106 message_loop_->RunAllPending(); |
113 } | 107 } |
114 | 108 |
115 media::StatisticsCallback NewStatisticsCallback() { | 109 media::StatisticsCallback NewStatisticsCallback() { |
116 return base::Bind(&media::MockStatisticsCallback::OnStatistics, | 110 return base::Bind(&media::MockStatisticsCallback::OnStatistics, |
117 base::Unretained(&statistics_callback_object_)); | 111 base::Unretained(&statistics_callback_object_)); |
118 } | 112 } |
119 | 113 |
| 114 MOCK_METHOD1(FrameReady, void(scoped_refptr<media::VideoFrame>)); |
| 115 |
120 // Fixture members. | 116 // Fixture members. |
121 scoped_refptr<CaptureVideoDecoder> decoder_; | 117 scoped_refptr<CaptureVideoDecoder> decoder_; |
122 scoped_refptr<MockVideoCaptureImplManager> vc_manager_; | 118 scoped_refptr<MockVideoCaptureImplManager> vc_manager_; |
123 scoped_refptr<media::MockVideoRenderer> renderer_; | |
124 media::MockStatisticsCallback statistics_callback_object_; | 119 media::MockStatisticsCallback statistics_callback_object_; |
125 StrictMock<media::MockFilterHost> host_; | 120 StrictMock<media::MockFilterHost> host_; |
126 scoped_ptr<MessageLoop> message_loop_; | 121 scoped_ptr<MessageLoop> message_loop_; |
127 scoped_refptr<base::MessageLoopProxy> message_loop_proxy_; | 122 scoped_refptr<base::MessageLoopProxy> message_loop_proxy_; |
| 123 media::VideoDecoder::ReadCB read_cb_; |
128 | 124 |
129 private: | 125 private: |
130 DISALLOW_COPY_AND_ASSIGN(CaptureVideoDecoderTest); | 126 DISALLOW_COPY_AND_ASSIGN(CaptureVideoDecoderTest); |
131 }; | 127 }; |
132 | 128 |
133 TEST_F(CaptureVideoDecoderTest, Play) { | 129 TEST_F(CaptureVideoDecoderTest, Play) { |
134 int data_buffer_number = 1; | 130 int data_buffer_number = 1; |
135 media::VideoCapture::EventHandler* capture_client = | 131 media::VideoCapture::EventHandler* capture_client = |
136 static_cast<media::VideoCapture::EventHandler*>(decoder_); | 132 static_cast<media::VideoCapture::EventHandler*>(decoder_); |
137 scoped_ptr<MockVideoCaptureImpl> vc_impl( | 133 scoped_ptr<MockVideoCaptureImpl> vc_impl( |
138 new MockVideoCaptureImpl(kVideoStreamId, | 134 new MockVideoCaptureImpl(kVideoStreamId, |
139 message_loop_proxy_, | 135 message_loop_proxy_, |
140 new VideoCaptureMessageFilter())); | 136 new VideoCaptureMessageFilter())); |
141 | 137 |
142 EXPECT_CALL(*vc_manager_, AddDevice(_, _)) | 138 EXPECT_CALL(*vc_manager_, AddDevice(_, _)) |
143 .WillOnce(Return(vc_impl.get())); | 139 .WillOnce(Return(vc_impl.get())); |
144 decoder_->Initialize(NULL, | 140 decoder_->Initialize(NULL, |
145 media::NewExpectedClosure(), | 141 media::NewExpectedClosure(), |
146 NewStatisticsCallback()); | 142 NewStatisticsCallback()); |
147 message_loop_->RunAllPending(); | 143 message_loop_->RunAllPending(); |
148 | 144 |
149 EXPECT_CALL(*renderer_, ConsumeVideoFrame(_)) | 145 EXPECT_CALL(*this, FrameReady(_)); |
150 .WillRepeatedly(ReturnFrameFromRenderer(decoder_.get())); | 146 decoder_->Read(read_cb_); |
| 147 |
151 EXPECT_CALL(*vc_impl, StartCapture(capture_client, _)) | 148 EXPECT_CALL(*vc_impl, StartCapture(capture_client, _)) |
152 .Times(1) | 149 .Times(1) |
153 .WillOnce(CreateDataBufferFromCapture(capture_client, vc_impl.get(), | 150 .WillOnce(CreateDataBufferFromCapture(capture_client, vc_impl.get(), |
154 data_buffer_number)); | 151 data_buffer_number)); |
155 EXPECT_CALL(*vc_impl, FeedBuffer(_)) | 152 EXPECT_CALL(*vc_impl, FeedBuffer(_)) |
156 .Times(data_buffer_number) | 153 .Times(data_buffer_number) |
157 .WillRepeatedly(DeleteDataBuffer()); | 154 .WillRepeatedly(DeleteDataBuffer()); |
158 decoder_->Seek(base::TimeDelta(), | 155 decoder_->Seek(base::TimeDelta(), |
159 media::NewExpectedStatusCB(media::PIPELINE_OK)); | 156 media::NewExpectedStatusCB(media::PIPELINE_OK)); |
160 decoder_->Play(media::NewExpectedClosure()); | 157 decoder_->Play(media::NewExpectedClosure()); |
161 message_loop_->RunAllPending(); | 158 message_loop_->RunAllPending(); |
162 | 159 |
163 EXPECT_CALL(*vc_impl, StopCapture(capture_client)) | 160 EXPECT_CALL(*vc_impl, StopCapture(capture_client)) |
164 .Times(1) | 161 .Times(1) |
165 .WillOnce(CaptureStopped(capture_client, vc_impl.get())); | 162 .WillOnce(CaptureStopped(capture_client, vc_impl.get())); |
166 EXPECT_CALL(*vc_manager_, RemoveDevice(_, _)) | 163 EXPECT_CALL(*vc_manager_, RemoveDevice(_, _)) |
167 .WillOnce(Return()); | 164 .WillOnce(Return()); |
168 decoder_->Stop(media::NewExpectedClosure()); | 165 decoder_->Stop(media::NewExpectedClosure()); |
169 message_loop_->RunAllPending(); | 166 message_loop_->RunAllPending(); |
170 } | 167 } |
OLD | NEW |