Upstream version 5.34.104.0
[platform/framework/web/crosswalk.git] / src / content / renderer / media / video_capture_impl_manager.cc
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.
4
5 #include "content/renderer/media/video_capture_impl_manager.h"
6
7 #include "base/bind.h"
8 #include "base/bind_helpers.h"
9 #include "content/public/renderer/render_thread.h"
10 #include "content/renderer/media/video_capture_impl.h"
11 #include "content/renderer/media/video_capture_message_filter.h"
12 #include "media/base/bind_to_current_loop.h"
13
14 namespace content {
15
16 VideoCaptureHandle::VideoCaptureHandle(
17     media::VideoCapture* impl, base::Closure destruction_cb)
18     : impl_(impl), destruction_cb_(destruction_cb) {
19 }
20
21 VideoCaptureHandle::~VideoCaptureHandle() {
22   destruction_cb_.Run();
23 }
24
25 void VideoCaptureHandle::StartCapture(
26     EventHandler* handler,
27     const media::VideoCaptureParams& params) {
28   impl_->StartCapture(handler, params);
29 }
30
31 void VideoCaptureHandle::StopCapture(EventHandler* handler) {
32   impl_->StopCapture(handler);
33 }
34
35 bool VideoCaptureHandle::CaptureStarted() {
36   return impl_->CaptureStarted();
37 }
38
39 int VideoCaptureHandle::CaptureFrameRate() {
40   return impl_->CaptureFrameRate();
41 }
42
43 void VideoCaptureHandle::GetDeviceSupportedFormats(
44     const DeviceFormatsCallback& callback) {
45   impl_->GetDeviceSupportedFormats(callback);
46 }
47
48 void VideoCaptureHandle::GetDeviceFormatsInUse(
49     const DeviceFormatsInUseCallback& callback) {
50   impl_->GetDeviceFormatsInUse(callback);
51 }
52
53 VideoCaptureImplManager::VideoCaptureImplManager()
54     : filter_(new VideoCaptureMessageFilter()),
55       weak_factory_(this) {
56 }
57
58 VideoCaptureImplManager::~VideoCaptureImplManager() {
59   DCHECK(thread_checker_.CalledOnValidThread());
60 }
61
62 scoped_ptr<VideoCaptureHandle> VideoCaptureImplManager::UseDevice(
63     media::VideoCaptureSessionId id) {
64   DCHECK(thread_checker_.CalledOnValidThread());
65
66   VideoCaptureImpl* video_capture_device = NULL;
67   VideoCaptureDeviceMap::iterator it = devices_.find(id);
68   if (it == devices_.end()) {
69     video_capture_device = CreateVideoCaptureImpl(id, filter_.get());
70     devices_[id] =
71         std::make_pair(1, linked_ptr<VideoCaptureImpl>(video_capture_device));
72     video_capture_device->Init();
73   } else {
74     ++it->second.first;
75     video_capture_device = it->second.second.get();
76   }
77
78   // This callback ensures UnrefDevice() happens on the render thread.
79   return scoped_ptr<VideoCaptureHandle>(
80       new VideoCaptureHandle(
81           video_capture_device,
82           media::BindToCurrentLoop(
83               base::Bind(
84                   &VideoCaptureImplManager::UnrefDevice,
85                   weak_factory_.GetWeakPtr(),
86                   id))));
87 }
88
89 VideoCaptureImpl* VideoCaptureImplManager::CreateVideoCaptureImpl(
90     media::VideoCaptureSessionId id,
91     VideoCaptureMessageFilter* filter) const {
92   return new VideoCaptureImpl(id, filter);
93 }
94
95 void VideoCaptureImplManager::UnrefDevice(
96     media::VideoCaptureSessionId id) {
97   DCHECK(thread_checker_.CalledOnValidThread());
98   VideoCaptureDeviceMap::iterator it = devices_.find(id);
99   DCHECK(it != devices_.end());
100
101   DCHECK(it->second.first);
102   --it->second.first;
103   if (!it->second.first) {
104     VideoCaptureImpl* impl = it->second.second.release();
105     devices_.erase(id);
106     impl->DeInit(base::Bind(&base::DeletePointer<VideoCaptureImpl>, impl));
107   }
108 }
109
110 void VideoCaptureImplManager::SuspendDevices(bool suspend) {
111   DCHECK(thread_checker_.CalledOnValidThread());
112   for (VideoCaptureDeviceMap::iterator it = devices_.begin();
113        it != devices_.end(); ++it)
114     it->second.second->SuspendCapture(suspend);
115 }
116
117 }  // namespace content