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
3 // found in the LICENSE file.
5 #include "content/renderer/media/video_capture_message_filter.h"
7 #include "content/common/media/video_capture_messages.h"
8 #include "content/common/view_messages.h"
9 #include "ipc/ipc_sender.h"
13 VideoCaptureMessageFilter::VideoCaptureMessageFilter()
18 void VideoCaptureMessageFilter::AddDelegate(Delegate* delegate) {
19 if (++last_device_id_ <= 0)
21 while (delegates_.find(last_device_id_) != delegates_.end())
25 delegates_[last_device_id_] = delegate;
26 delegate->OnDelegateAdded(last_device_id_);
28 pending_delegates_[last_device_id_] = delegate;
32 void VideoCaptureMessageFilter::RemoveDelegate(Delegate* delegate) {
33 for (Delegates::iterator it = delegates_.begin();
34 it != delegates_.end(); it++) {
35 if (it->second == delegate) {
40 for (Delegates::iterator it = pending_delegates_.begin();
41 it != pending_delegates_.end(); it++) {
42 if (it->second == delegate) {
43 pending_delegates_.erase(it);
49 bool VideoCaptureMessageFilter::Send(IPC::Message* message) {
55 return sender_->Send(message);
58 bool VideoCaptureMessageFilter::OnMessageReceived(const IPC::Message& message) {
60 IPC_BEGIN_MESSAGE_MAP(VideoCaptureMessageFilter, message)
61 IPC_MESSAGE_HANDLER(VideoCaptureMsg_BufferReady, OnBufferReceived)
62 IPC_MESSAGE_HANDLER(VideoCaptureMsg_MailboxBufferReady,
63 OnMailboxBufferReceived)
64 IPC_MESSAGE_HANDLER(VideoCaptureMsg_StateChanged, OnDeviceStateChanged)
65 IPC_MESSAGE_HANDLER(VideoCaptureMsg_NewBuffer, OnBufferCreated)
66 IPC_MESSAGE_HANDLER(VideoCaptureMsg_FreeBuffer, OnBufferDestroyed)
67 IPC_MESSAGE_HANDLER(VideoCaptureMsg_DeviceSupportedFormatsEnumerated,
68 OnDeviceSupportedFormatsEnumerated)
69 IPC_MESSAGE_HANDLER(VideoCaptureMsg_DeviceFormatsInUseReceived,
70 OnDeviceFormatsInUseReceived)
71 IPC_MESSAGE_UNHANDLED(handled = false)
76 void VideoCaptureMessageFilter::OnFilterAdded(IPC::Sender* sender) {
77 DVLOG(1) << "VideoCaptureMessageFilter::OnFilterAdded()";
80 for (Delegates::iterator it = pending_delegates_.begin();
81 it != pending_delegates_.end(); it++) {
82 it->second->OnDelegateAdded(it->first);
83 delegates_[it->first] = it->second;
85 pending_delegates_.clear();
88 void VideoCaptureMessageFilter::OnFilterRemoved() {
92 void VideoCaptureMessageFilter::OnChannelClosing() {
96 VideoCaptureMessageFilter::~VideoCaptureMessageFilter() {}
98 VideoCaptureMessageFilter::Delegate* VideoCaptureMessageFilter::find_delegate(
99 int device_id) const {
100 Delegates::const_iterator i = delegates_.find(device_id);
101 return i != delegates_.end() ? i->second : NULL;
104 void VideoCaptureMessageFilter::OnBufferCreated(
106 base::SharedMemoryHandle handle,
109 Delegate* delegate = find_delegate(device_id);
111 DLOG(WARNING) << "OnBufferCreated: Got video SHM buffer for a "
112 "non-existent or removed video capture.";
114 // Send the buffer back to Host in case it's waiting for all buffers
116 base::SharedMemory::CloseHandle(handle);
117 Send(new VideoCaptureHostMsg_BufferReady(device_id, buffer_id, 0));
121 delegate->OnBufferCreated(handle, length, buffer_id);
124 void VideoCaptureMessageFilter::OnBufferReceived(
127 const media::VideoCaptureFormat& format,
128 const gfx::Rect& visible_rect,
129 base::TimeTicks timestamp) {
130 Delegate* delegate = find_delegate(device_id);
132 DLOG(WARNING) << "OnBufferReceived: Got video SHM buffer for a "
133 "non-existent or removed video capture.";
135 // Send the buffer back to Host in case it's waiting for all buffers
137 Send(new VideoCaptureHostMsg_BufferReady(device_id, buffer_id, 0));
141 delegate->OnBufferReceived(buffer_id, format, visible_rect, timestamp);
144 void VideoCaptureMessageFilter::OnMailboxBufferReceived(
147 const gpu::MailboxHolder& mailbox_holder,
148 const media::VideoCaptureFormat& format,
149 base::TimeTicks timestamp) {
150 Delegate* delegate = find_delegate(device_id);
153 DLOG(WARNING) << "OnMailboxBufferReceived: Got video mailbox buffer for a "
154 "non-existent or removed video capture.";
156 // Send the buffer back to Host in case it's waiting for all buffers
158 Send(new VideoCaptureHostMsg_BufferReady(device_id, buffer_id, 0));
162 delegate->OnMailboxBufferReceived(
163 buffer_id, mailbox_holder, format, timestamp);
166 void VideoCaptureMessageFilter::OnBufferDestroyed(
169 Delegate* delegate = find_delegate(device_id);
171 DLOG(WARNING) << "OnBufferDestroyed: Instructed to free buffer for a "
172 "non-existent or removed video capture.";
176 delegate->OnBufferDestroyed(buffer_id);
179 void VideoCaptureMessageFilter::OnDeviceStateChanged(
181 VideoCaptureState state) {
182 Delegate* delegate = find_delegate(device_id);
184 DLOG(WARNING) << "OnDeviceStateChanged: Got video capture event for a "
185 "non-existent or removed video capture.";
188 delegate->OnStateChanged(state);
191 void VideoCaptureMessageFilter::OnDeviceSupportedFormatsEnumerated(
193 const media::VideoCaptureFormats& supported_formats) {
194 Delegate* delegate = find_delegate(device_id);
196 DLOG(WARNING) << "OnDeviceFormatsEnumerated: unknown device";
199 delegate->OnDeviceSupportedFormatsEnumerated(supported_formats);
202 void VideoCaptureMessageFilter::OnDeviceFormatsInUseReceived(
204 const media::VideoCaptureFormats& formats_in_use) {
205 Delegate* delegate = find_delegate(device_id);
207 DLOG(WARNING) << "OnDeviceFormatInUse: unknown device";
210 delegate->OnDeviceFormatsInUseReceived(formats_in_use);
213 } // namespace content