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"
12 VideoCaptureMessageFilter::VideoCaptureMessageFilter()
17 void VideoCaptureMessageFilter::AddDelegate(Delegate* delegate) {
18 if (++last_device_id_ <= 0)
20 while (delegates_.find(last_device_id_) != delegates_.end())
24 delegates_[last_device_id_] = delegate;
25 delegate->OnDelegateAdded(last_device_id_);
27 pending_delegates_[last_device_id_] = delegate;
31 void VideoCaptureMessageFilter::RemoveDelegate(Delegate* delegate) {
32 for (Delegates::iterator it = delegates_.begin();
33 it != delegates_.end(); it++) {
34 if (it->second == delegate) {
39 for (Delegates::iterator it = pending_delegates_.begin();
40 it != pending_delegates_.end(); it++) {
41 if (it->second == delegate) {
42 pending_delegates_.erase(it);
48 bool VideoCaptureMessageFilter::Send(IPC::Message* message) {
54 return channel_->Send(message);
57 bool VideoCaptureMessageFilter::OnMessageReceived(const IPC::Message& message) {
59 IPC_BEGIN_MESSAGE_MAP(VideoCaptureMessageFilter, message)
60 IPC_MESSAGE_HANDLER(VideoCaptureMsg_BufferReady, OnBufferReceived)
61 IPC_MESSAGE_HANDLER(VideoCaptureMsg_StateChanged, OnDeviceStateChanged)
62 IPC_MESSAGE_HANDLER(VideoCaptureMsg_NewBuffer, OnBufferCreated)
63 IPC_MESSAGE_HANDLER(VideoCaptureMsg_FreeBuffer, OnBufferDestroyed)
64 IPC_MESSAGE_HANDLER(VideoCaptureMsg_DeviceSupportedFormatsEnumerated,
65 OnDeviceSupportedFormatsEnumerated)
66 IPC_MESSAGE_UNHANDLED(handled = false)
71 void VideoCaptureMessageFilter::OnFilterAdded(IPC::Channel* channel) {
72 DVLOG(1) << "VideoCaptureMessageFilter::OnFilterAdded()";
75 for (Delegates::iterator it = pending_delegates_.begin();
76 it != pending_delegates_.end(); it++) {
77 it->second->OnDelegateAdded(it->first);
78 delegates_[it->first] = it->second;
80 pending_delegates_.clear();
83 void VideoCaptureMessageFilter::OnFilterRemoved() {
87 void VideoCaptureMessageFilter::OnChannelClosing() {
91 VideoCaptureMessageFilter::~VideoCaptureMessageFilter() {}
93 VideoCaptureMessageFilter::Delegate* VideoCaptureMessageFilter::find_delegate(
94 int device_id) const {
95 Delegates::const_iterator i = delegates_.find(device_id);
96 return i != delegates_.end() ? i->second : NULL;
99 void VideoCaptureMessageFilter::OnBufferCreated(
101 base::SharedMemoryHandle handle,
104 Delegate* delegate = find_delegate(device_id);
106 DLOG(WARNING) << "OnBufferCreated: Got video frame buffer for a "
107 "non-existent or removed video capture.";
109 // Send the buffer back to Host in case it's waiting for all buffers
111 base::SharedMemory::CloseHandle(handle);
112 Send(new VideoCaptureHostMsg_BufferReady(device_id, buffer_id));
116 delegate->OnBufferCreated(handle, length, buffer_id);
119 void VideoCaptureMessageFilter::OnBufferReceived(
122 base::TimeTicks timestamp,
123 const media::VideoCaptureFormat& format) {
124 Delegate* delegate = find_delegate(device_id);
126 DLOG(WARNING) << "OnBufferReceived: Got video frame buffer for a "
127 "non-existent or removed video capture.";
129 // Send the buffer back to Host in case it's waiting for all buffers
131 Send(new VideoCaptureHostMsg_BufferReady(device_id, buffer_id));
135 delegate->OnBufferReceived(buffer_id, timestamp, format);
138 void VideoCaptureMessageFilter::OnBufferDestroyed(
141 Delegate* delegate = find_delegate(device_id);
143 DLOG(WARNING) << "OnBufferDestroyed: Instructed to free buffer for a "
144 "non-existent or removed video capture.";
148 delegate->OnBufferDestroyed(buffer_id);
151 void VideoCaptureMessageFilter::OnDeviceStateChanged(
153 VideoCaptureState state) {
154 Delegate* delegate = find_delegate(device_id);
156 DLOG(WARNING) << "OnDeviceStateChanged: Got video capture event for a "
157 "non-existent or removed video capture.";
160 delegate->OnStateChanged(state);
163 void VideoCaptureMessageFilter::OnDeviceSupportedFormatsEnumerated(
165 const media::VideoCaptureFormats& supported_formats) {
166 Delegate* delegate = find_delegate(device_id);
168 DLOG(WARNING) << "OnDeviceFormatsEnumerated: unknown device";
171 delegate->OnDeviceSupportedFormatsEnumerated(supported_formats);
174 } // namespace content