OLD | NEW |
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 "media/video/capture/fake_video_capture_device.h" | 5 #include "media/video/capture/fake_video_capture_device.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/memory/scoped_ptr.h" | 10 #include "base/memory/scoped_ptr.h" |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
96 capture_format_.frame_size.SetSize(1920, 1080); | 96 capture_format_.frame_size.SetSize(1920, 1080); |
97 else if (params.requested_format.frame_size.width() > 640) | 97 else if (params.requested_format.frame_size.width() > 640) |
98 capture_format_.frame_size.SetSize(1280, 720); | 98 capture_format_.frame_size.SetSize(1280, 720); |
99 else if (params.requested_format.frame_size.width() > 320) | 99 else if (params.requested_format.frame_size.width() > 320) |
100 capture_format_.frame_size.SetSize(640, 480); | 100 capture_format_.frame_size.SetSize(640, 480); |
101 else | 101 else |
102 capture_format_.frame_size.SetSize(320, 240); | 102 capture_format_.frame_size.SetSize(320, 240); |
103 | 103 |
104 switch (device_type_) { | 104 switch (device_type_) { |
105 case USING_OWN_BUFFERS: | 105 case USING_OWN_BUFFERS: |
| 106 case USING_OWN_BUFFERS_TRIPLANAR: |
106 fake_frame_.reset(new uint8[VideoFrame::AllocationSize( | 107 fake_frame_.reset(new uint8[VideoFrame::AllocationSize( |
107 VideoFrame::I420, capture_format_.frame_size)]); | 108 VideoFrame::I420, capture_format_.frame_size)]); |
108 BeepAndScheduleNextCapture( | 109 BeepAndScheduleNextCapture( |
109 base::Bind(&FakeVideoCaptureDevice::CaptureUsingOwnBuffers, | 110 base::Bind(&FakeVideoCaptureDevice::CaptureUsingOwnBuffers, |
110 weak_factory_.GetWeakPtr())); | 111 weak_factory_.GetWeakPtr())); |
111 break; | 112 break; |
112 case USING_CLIENT_BUFFERS: | 113 case USING_CLIENT_BUFFERS: |
113 BeepAndScheduleNextCapture( | 114 BeepAndScheduleNextCapture( |
114 base::Bind(&FakeVideoCaptureDevice::CaptureUsingClientBuffers, | 115 base::Bind(&FakeVideoCaptureDevice::CaptureUsingClientBuffers, |
115 weak_factory_.GetWeakPtr())); | 116 weak_factory_.GetWeakPtr())); |
116 break; | 117 break; |
117 case USING_GPU_MEMORY_BUFFERS: | 118 case USING_GPU_MEMORY_BUFFERS: |
118 BeepAndScheduleNextCapture( | 119 BeepAndScheduleNextCapture( |
119 base::Bind(&FakeVideoCaptureDevice::CaptureUsingGpuMemoryBuffers, | 120 base::Bind(&FakeVideoCaptureDevice::CaptureUsingGpuMemoryBuffers, |
120 weak_factory_.GetWeakPtr())); | 121 weak_factory_.GetWeakPtr())); |
121 break; | 122 break; |
122 default: | 123 default: |
123 client_->OnError("Unknown Fake Video Capture Device type."); | 124 client_->OnError("Unknown Fake Video Capture Device type."); |
124 } | 125 } |
125 } | 126 } |
126 | 127 |
127 void FakeVideoCaptureDevice::StopAndDeAllocate() { | 128 void FakeVideoCaptureDevice::StopAndDeAllocate() { |
128 DCHECK(thread_checker_.CalledOnValidThread()); | 129 DCHECK(thread_checker_.CalledOnValidThread()); |
129 client_.reset(); | 130 client_.reset(); |
130 } | 131 } |
131 | 132 |
132 void FakeVideoCaptureDevice::CaptureUsingOwnBuffers() { | 133 void FakeVideoCaptureDevice::CaptureUsingOwnBuffers() { |
133 DCHECK(thread_checker_.CalledOnValidThread()); | 134 DCHECK(thread_checker_.CalledOnValidThread()); |
134 const size_t frame_size = | 135 const size_t frame_size = capture_format_.ImageAllocationSize(); |
135 VideoFrame::AllocationSize(VideoFrame::I420, capture_format_.frame_size); | |
136 memset(fake_frame_.get(), 0, frame_size); | 136 memset(fake_frame_.get(), 0, frame_size); |
137 | 137 |
138 DrawPacman(false /* use_argb */, | 138 DrawPacman(false /* use_argb */, |
139 fake_frame_.get(), | 139 fake_frame_.get(), |
140 frame_count_, | 140 frame_count_, |
141 kFakeCapturePeriodMs, | 141 kFakeCapturePeriodMs, |
142 capture_format_.frame_size); | 142 capture_format_.frame_size); |
143 | 143 |
144 // Give the captured frame to the client. | 144 // Give the captured frame to the client. |
145 client_->OnIncomingCapturedData(fake_frame_.get(), | 145 if (device_type_ == USING_OWN_BUFFERS) { |
146 frame_size, | 146 client_->OnIncomingCapturedData(fake_frame_.get(), |
147 capture_format_, | 147 frame_size, |
148 0, | 148 capture_format_, |
149 base::TimeTicks::Now()); | 149 0 /* rotation */, |
| 150 base::TimeTicks::Now()); |
| 151 } else if (device_type_ == USING_OWN_BUFFERS_TRIPLANAR) { |
| 152 client_->OnIncomingCapturedYuvData( |
| 153 fake_frame_.get(), |
| 154 fake_frame_.get() + capture_format_.frame_size.GetArea(), |
| 155 fake_frame_.get() + capture_format_.frame_size.GetArea() * 5 / 4, |
| 156 capture_format_.frame_size.width(), |
| 157 capture_format_.frame_size.width() / 2, |
| 158 capture_format_.frame_size.width() / 2, |
| 159 capture_format_, |
| 160 0 /* rotation */, |
| 161 base::TimeTicks::Now()); |
| 162 } |
150 BeepAndScheduleNextCapture( | 163 BeepAndScheduleNextCapture( |
151 base::Bind(&FakeVideoCaptureDevice::CaptureUsingOwnBuffers, | 164 base::Bind(&FakeVideoCaptureDevice::CaptureUsingOwnBuffers, |
152 weak_factory_.GetWeakPtr())); | 165 weak_factory_.GetWeakPtr())); |
153 } | 166 } |
154 | 167 |
155 void FakeVideoCaptureDevice::CaptureUsingClientBuffers() { | 168 void FakeVideoCaptureDevice::CaptureUsingClientBuffers() { |
156 DCHECK(thread_checker_.CalledOnValidThread()); | 169 DCHECK(thread_checker_.CalledOnValidThread()); |
157 | 170 |
158 const scoped_refptr<VideoCaptureDevice::Client::Buffer> capture_buffer = | 171 const scoped_refptr<VideoCaptureDevice::Client::Buffer> capture_buffer = |
159 client_->ReserveOutputBuffer(capture_format_.pixel_format, | 172 client_->ReserveOutputBuffer(capture_format_.pixel_format, |
160 capture_format_.frame_size); | 173 capture_format_.frame_size); |
161 DLOG_IF(ERROR, !capture_buffer) << "Couldn't allocate Capture Buffer"; | 174 DLOG_IF(ERROR, !capture_buffer) << "Couldn't allocate Capture Buffer"; |
162 if (!capture_buffer) | 175 if (!capture_buffer) |
163 return; | 176 return; |
164 | 177 |
165 uint8_t* const data_ptr = static_cast<uint8_t*>(capture_buffer->data()); | 178 const scoped_ptr<media::DataHandle> scoped_data_handle = |
| 179 capture_buffer->GetDataHandle().Pass(); |
| 180 uint8_t* const data_ptr = static_cast<uint8_t*>(scoped_data_handle->data()); |
| 181 DCHECK(data_ptr) << "Buffer has NO backing memory"; |
166 memset(data_ptr, 0, capture_buffer->size()); | 182 memset(data_ptr, 0, capture_buffer->size()); |
167 DCHECK(data_ptr) << "Buffer has NO backing memory"; | |
168 | 183 |
169 DrawPacman(false /* use_argb */, | 184 DrawPacman(false /* use_argb */, |
170 data_ptr, | 185 data_ptr, |
171 frame_count_, | 186 frame_count_, |
172 kFakeCapturePeriodMs, | 187 kFakeCapturePeriodMs, |
173 capture_format_.frame_size); | 188 capture_format_.frame_size); |
174 | 189 |
175 scoped_refptr<VideoFrame> video_frame = | 190 scoped_refptr<VideoFrame> video_frame = |
176 VideoFrame::WrapExternalPackedMemory( | 191 VideoFrame::WrapExternalPackedMemory( |
177 VideoFrame::I420, | 192 VideoFrame::I420, |
178 capture_format_.frame_size, | 193 capture_format_.frame_size, |
179 gfx::Rect(capture_format_.frame_size), | 194 gfx::Rect(capture_format_.frame_size), |
180 capture_format_.frame_size, | 195 capture_format_.frame_size, |
181 static_cast<uint8*>(capture_buffer->data()), | 196 data_ptr, |
182 capture_buffer->size(), | 197 capture_buffer->size(), |
183 base::SharedMemory::NULLHandle(), | 198 base::SharedMemory::NULLHandle(), |
184 0, | 199 0, |
185 base::TimeDelta(), | 200 base::TimeDelta(), |
186 base::Closure()); | 201 base::Closure()); |
187 | 202 |
188 // Give the captured frame to the client. | 203 // Give the captured frame to the client. |
189 client_->OnIncomingCapturedVideoFrame(capture_buffer, | 204 client_->OnIncomingCapturedVideoFrame(capture_buffer, |
190 video_frame, | 205 video_frame, |
191 base::TimeTicks::Now()); | 206 base::TimeTicks::Now()); |
192 BeepAndScheduleNextCapture( | 207 BeepAndScheduleNextCapture( |
193 base::Bind(&FakeVideoCaptureDevice::CaptureUsingClientBuffers, | 208 base::Bind(&FakeVideoCaptureDevice::CaptureUsingClientBuffers, |
194 weak_factory_.GetWeakPtr())); | 209 weak_factory_.GetWeakPtr())); |
195 } | 210 } |
196 | 211 |
197 void FakeVideoCaptureDevice::CaptureUsingGpuMemoryBuffers() { | 212 void FakeVideoCaptureDevice::CaptureUsingGpuMemoryBuffers() { |
198 DCHECK(thread_checker_.CalledOnValidThread()); | 213 DCHECK(thread_checker_.CalledOnValidThread()); |
199 | 214 |
200 NOTIMPLEMENTED(); | 215 const scoped_refptr<VideoCaptureDevice::Client::Buffer> capture_buffer = |
| 216 client_->ReserveOutputBuffer(media::PIXEL_FORMAT_GPUMEMORYBUFFER, |
| 217 capture_format_.frame_size); |
| 218 DLOG_IF(ERROR, !capture_buffer) << "Couldn't allocate Capture Buffer"; |
| 219 if (!capture_buffer) |
| 220 return; |
| 221 |
| 222 const scoped_ptr<media::DataHandle> scoped_data_handle = |
| 223 capture_buffer->GetDataHandle().Pass(); |
| 224 uint8_t* const data_ptr = static_cast<uint8_t*>(scoped_data_handle->data()); |
| 225 DCHECK(data_ptr) << "Buffer has NO backing memory"; |
| 226 memset(data_ptr, 0, capture_buffer->size()); |
| 227 |
| 228 DrawPacman(true /* use_argb */, |
| 229 data_ptr, |
| 230 frame_count_, |
| 231 kFakeCapturePeriodMs, |
| 232 capture_format_.frame_size); |
| 233 |
| 234 // Give the captured frame to the client. |
| 235 const VideoCaptureFormat format(capture_format_.frame_size, |
| 236 capture_format_.frame_rate, |
| 237 media::PIXEL_FORMAT_GPUMEMORYBUFFER); |
| 238 client_->OnIncomingCapturedBuffer(capture_buffer, format, |
| 239 base::TimeTicks::Now()); |
| 240 BeepAndScheduleNextCapture( |
| 241 base::Bind(&FakeVideoCaptureDevice::CaptureUsingGpuMemoryBuffers, |
| 242 weak_factory_.GetWeakPtr())); |
201 } | 243 } |
202 | 244 |
203 void FakeVideoCaptureDevice::BeepAndScheduleNextCapture( | 245 void FakeVideoCaptureDevice::BeepAndScheduleNextCapture( |
204 const base::Closure& next_capture) { | 246 const base::Closure& next_capture) { |
205 // Generate a synchronized beep sound every so many frames. | 247 // Generate a synchronized beep sound every so many frames. |
206 if (frame_count_++ % kFakeCaptureBeepCycle == 0) | 248 if (frame_count_++ % kFakeCaptureBeepCycle == 0) |
207 FakeAudioInputStream::BeepOnce(); | 249 FakeAudioInputStream::BeepOnce(); |
208 | 250 |
209 // Reschedule next CaptureTask. | 251 // Reschedule next CaptureTask. |
210 base::MessageLoop::current()->PostDelayedTask(FROM_HERE, next_capture, | 252 base::MessageLoop::current()->PostDelayedTask(FROM_HERE, next_capture, |
211 base::TimeDelta::FromMilliseconds(kFakeCapturePeriodMs)); | 253 base::TimeDelta::FromMilliseconds(kFakeCapturePeriodMs)); |
212 } | 254 } |
213 | 255 |
214 } // namespace media | 256 } // namespace media |
OLD | NEW |