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

Side by Side Diff: content/renderer/media/video_capture_impl.cc

Issue 955253002: Add metadata to media::VideoFrame and plumb it through IPC/MediaStream. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: tommi's nits addressed Created 5 years, 9 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 // Notes about usage of this object by VideoCaptureImplManager. 5 // Notes about usage of this object by VideoCaptureImplManager.
6 // 6 //
7 // VideoCaptureImplManager access this object by using a Unretained() 7 // VideoCaptureImplManager access this object by using a Unretained()
8 // binding and tasks on the IO thread. It is then important that 8 // binding and tasks on the IO thread. It is then important that
9 // VideoCaptureImpl never post task to itself. All operations must be 9 // VideoCaptureImpl never post task to itself. All operations must be
10 // synchronous. 10 // synchronous.
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after
201 ClientBufferMap::iterator iter = client_buffers_.find(buffer_id); 201 ClientBufferMap::iterator iter = client_buffers_.find(buffer_id);
202 if (iter == client_buffers_.end()) 202 if (iter == client_buffers_.end())
203 return; 203 return;
204 204
205 DCHECK(!iter->second.get() || iter->second->HasOneRef()) 205 DCHECK(!iter->second.get() || iter->second->HasOneRef())
206 << "Instructed to delete buffer we are still using."; 206 << "Instructed to delete buffer we are still using.";
207 client_buffers_.erase(iter); 207 client_buffers_.erase(iter);
208 } 208 }
209 209
210 void VideoCaptureImpl::OnBufferReceived(int buffer_id, 210 void VideoCaptureImpl::OnBufferReceived(int buffer_id,
211 const media::VideoCaptureFormat& format, 211 const gfx::Size& coded_size,
212 const gfx::Rect& visible_rect, 212 const gfx::Rect& visible_rect,
213 base::TimeTicks timestamp) { 213 base::TimeTicks timestamp,
214 const base::DictionaryValue& metadata) {
214 DCHECK(thread_checker_.CalledOnValidThread()); 215 DCHECK(thread_checker_.CalledOnValidThread());
215 216
216 // The capture pipeline supports only I420 for now.
217 DCHECK_EQ(format.pixel_format, media::PIXEL_FORMAT_I420);
218
219 if (state_ != VIDEO_CAPTURE_STATE_STARTED || suspended_) { 217 if (state_ != VIDEO_CAPTURE_STATE_STARTED || suspended_) {
220 Send(new VideoCaptureHostMsg_BufferReady(device_id_, buffer_id, 0)); 218 Send(new VideoCaptureHostMsg_BufferReady(device_id_, buffer_id, 0));
221 return; 219 return;
222 } 220 }
223 221
224 last_frame_format_ = format;
225 if (first_frame_timestamp_.is_null()) 222 if (first_frame_timestamp_.is_null())
226 first_frame_timestamp_ = timestamp; 223 first_frame_timestamp_ = timestamp;
227 224
228 // Used by chrome/browser/extension/api/cast_streaming/performance_test.cc 225 // Used by chrome/browser/extension/api/cast_streaming/performance_test.cc
229 TRACE_EVENT_INSTANT2( 226 TRACE_EVENT_INSTANT2(
230 "cast_perf_test", "OnBufferReceived", 227 "cast_perf_test", "OnBufferReceived",
231 TRACE_EVENT_SCOPE_THREAD, 228 TRACE_EVENT_SCOPE_THREAD,
232 "timestamp", timestamp.ToInternalValue(), 229 "timestamp", timestamp.ToInternalValue(),
233 "time_delta", (timestamp - first_frame_timestamp_).ToInternalValue()); 230 "time_delta", (timestamp - first_frame_timestamp_).ToInternalValue());
234 231
235 ClientBufferMap::iterator iter = client_buffers_.find(buffer_id); 232 ClientBufferMap::iterator iter = client_buffers_.find(buffer_id);
236 DCHECK(iter != client_buffers_.end()); 233 DCHECK(iter != client_buffers_.end());
237 scoped_refptr<ClientBuffer> buffer = iter->second; 234 scoped_refptr<ClientBuffer> buffer = iter->second;
238 scoped_refptr<media::VideoFrame> frame = 235 scoped_refptr<media::VideoFrame> frame =
239 media::VideoFrame::WrapExternalPackedMemory( 236 media::VideoFrame::WrapExternalPackedMemory(
240 media::VideoFrame::I420, 237 media::VideoFrame::I420,
241 last_frame_format_.frame_size, 238 coded_size,
242 visible_rect, 239 visible_rect,
243 gfx::Size(visible_rect.width(), visible_rect.height()), 240 gfx::Size(visible_rect.width(), visible_rect.height()),
244 reinterpret_cast<uint8*>(buffer->buffer->memory()), 241 reinterpret_cast<uint8*>(buffer->buffer->memory()),
245 buffer->buffer_size, 242 buffer->buffer_size,
246 buffer->buffer->handle(), 243 buffer->buffer->handle(),
247 0, 244 0,
248 timestamp - first_frame_timestamp_, 245 timestamp - first_frame_timestamp_,
249 media::BindToCurrentLoop( 246 media::BindToCurrentLoop(
250 base::Bind(&VideoCaptureImpl::OnClientBufferFinished, 247 base::Bind(&VideoCaptureImpl::OnClientBufferFinished,
251 weak_factory_.GetWeakPtr(), 248 weak_factory_.GetWeakPtr(),
252 buffer_id, 249 buffer_id,
253 buffer, 250 buffer,
254 0))); 251 0)));
252 frame->metadata()->MergeInternalValuesFrom(metadata);
255 253
256 for (ClientInfoMap::iterator it = clients_.begin(); it != clients_.end(); 254 for (const auto& entry : clients_)
257 ++it) { 255 entry.second.deliver_frame_cb.Run(frame, timestamp);
258 it->second.deliver_frame_cb.Run(frame, format, timestamp);
259 }
260 } 256 }
261 257
262 void VideoCaptureImpl::OnMailboxBufferReceived( 258 void VideoCaptureImpl::OnMailboxBufferReceived(
263 int buffer_id, 259 int buffer_id,
264 const gpu::MailboxHolder& mailbox_holder, 260 const gpu::MailboxHolder& mailbox_holder,
265 const media::VideoCaptureFormat& format, 261 const gfx::Size& packed_frame_size,
266 base::TimeTicks timestamp) { 262 base::TimeTicks timestamp,
263 const base::DictionaryValue& metadata) {
267 DCHECK(thread_checker_.CalledOnValidThread()); 264 DCHECK(thread_checker_.CalledOnValidThread());
268 265
269 if (state_ != VIDEO_CAPTURE_STATE_STARTED || suspended_) { 266 if (state_ != VIDEO_CAPTURE_STATE_STARTED || suspended_) {
270 Send(new VideoCaptureHostMsg_BufferReady(device_id_, buffer_id, 0)); 267 Send(new VideoCaptureHostMsg_BufferReady(device_id_, buffer_id, 0));
271 return; 268 return;
272 } 269 }
273 270
274 last_frame_format_ = format;
275 if (first_frame_timestamp_.is_null()) 271 if (first_frame_timestamp_.is_null())
276 first_frame_timestamp_ = timestamp; 272 first_frame_timestamp_ = timestamp;
277 273
278 scoped_refptr<media::VideoFrame> frame = media::VideoFrame::WrapNativeTexture( 274 scoped_refptr<media::VideoFrame> frame = media::VideoFrame::WrapNativeTexture(
279 make_scoped_ptr(new gpu::MailboxHolder(mailbox_holder)), 275 make_scoped_ptr(new gpu::MailboxHolder(mailbox_holder)),
280 media::BindToCurrentLoop(base::Bind( 276 media::BindToCurrentLoop(base::Bind(
281 &VideoCaptureImpl::OnClientBufferFinished, weak_factory_.GetWeakPtr(), 277 &VideoCaptureImpl::OnClientBufferFinished, weak_factory_.GetWeakPtr(),
282 buffer_id, scoped_refptr<ClientBuffer>())), 278 buffer_id, scoped_refptr<ClientBuffer>())),
283 last_frame_format_.frame_size, gfx::Rect(last_frame_format_.frame_size), 279 packed_frame_size, gfx::Rect(packed_frame_size), packed_frame_size,
284 last_frame_format_.frame_size, timestamp - first_frame_timestamp_, false); 280 timestamp - first_frame_timestamp_, false);
281 frame->metadata()->MergeInternalValuesFrom(metadata);
285 282
286 for (ClientInfoMap::iterator it = clients_.begin(); it != clients_.end(); 283 for (const auto& entry : clients_)
287 ++it) { 284 entry.second.deliver_frame_cb.Run(frame, timestamp);
288 it->second.deliver_frame_cb.Run(frame, format, timestamp);
289 }
290 } 285 }
291 286
292 void VideoCaptureImpl::OnClientBufferFinished( 287 void VideoCaptureImpl::OnClientBufferFinished(
293 int buffer_id, 288 int buffer_id,
294 const scoped_refptr<ClientBuffer>& /* ignored_buffer */, 289 const scoped_refptr<ClientBuffer>& /* ignored_buffer */,
295 uint32 release_sync_point) { 290 uint32 release_sync_point) {
296 DCHECK(thread_checker_.CalledOnValidThread()); 291 DCHECK(thread_checker_.CalledOnValidThread());
297 Send(new VideoCaptureHostMsg_BufferReady( 292 Send(new VideoCaptureHostMsg_BufferReady(
298 device_id_, buffer_id, release_sync_point)); 293 device_id_, buffer_id, release_sync_point));
299 } 294 }
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
431 ClientInfoMap::iterator it = clients->find(client_id); 426 ClientInfoMap::iterator it = clients->find(client_id);
432 if (it != clients->end()) { 427 if (it != clients->end()) {
433 it->second.state_update_cb.Run(VIDEO_CAPTURE_STATE_STOPPED); 428 it->second.state_update_cb.Run(VIDEO_CAPTURE_STATE_STOPPED);
434 clients->erase(it); 429 clients->erase(it);
435 found = true; 430 found = true;
436 } 431 }
437 return found; 432 return found;
438 } 433 }
439 434
440 } // namespace content 435 } // namespace content
OLDNEW
« no previous file with comments | « content/renderer/media/video_capture_impl.h ('k') | content/renderer/media/video_capture_impl_manager_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698