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

Side by Side Diff: media/video/capture/fake_video_capture_device.cc

Issue 1064963002: VideoCapture: add support for GpuMemoryBuffer allocation and lifetime mgmt in VideoCaptureBufferPool (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 8 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
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 "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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698