blob: b225aa9f3449740161b1988b6e9fb2ae941c1323 [file] [log] [blame]
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -07001/*
2**
The Android Open Source Projectf013e1a2008-12-17 18:05:43 -08003** Copyright (C) 2008, The Android Open Source Project
4** Copyright (C) 2008 HTC Inc.
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -07005**
6** Licensed under the Apache License, Version 2.0 (the "License");
7** you may not use this file except in compliance with the License.
8** You may obtain a copy of the License at
9**
10** http://www.apache.org/licenses/LICENSE-2.0
11**
12** Unless required by applicable law or agreed to in writing, software
13** distributed under the License is distributed on an "AS IS" BASIS,
14** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15** See the License for the specific language governing permissions and
16** limitations under the License.
17*/
18
19#ifndef ANDROID_SERVERS_CAMERA_CAMERASERVICE_H
20#define ANDROID_SERVERS_CAMERA_CAMERASERVICE_H
21
22#include <ui/ICameraService.h>
23#include <ui/CameraHardwareInterface.h>
The Android Open Source Projectf013e1a2008-12-17 18:05:43 -080024#include <ui/Camera.h>
25
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -070026class android::MemoryHeapBase;
27
28namespace android {
29
30// ----------------------------------------------------------------------------
31
32#define LIKELY( exp ) (__builtin_expect( (exp) != 0, true ))
33#define UNLIKELY( exp ) (__builtin_expect( (exp) != 0, false ))
34
35// When enabled, this feature allows you to send an event to the CameraService
36// so that you can cause all references to the heap object gWeakHeap, defined
37// below, to be printed. You will also need to set DEBUG_REFS=1 and
The Android Open Source Projectf013e1a2008-12-17 18:05:43 -080038// DEBUG_REFS_ENABLED_BY_DEFAULT=0 in libutils/RefBase.cpp. You just have to
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -070039// set gWeakHeap to the appropriate heap you want to track.
40
41#define DEBUG_HEAP_LEAKS 0
42
43// ----------------------------------------------------------------------------
44
45class CameraService : public BnCameraService
46{
47 class Client;
48
49public:
50 static void instantiate();
51
52 // ICameraService interface
53 virtual sp<ICamera> connect(const sp<ICameraClient>& cameraClient);
54
55 virtual status_t dump(int fd, const Vector<String16>& args);
56
57 void removeClient(const sp<ICameraClient>& cameraClient);
58
59#if DEBUG_HEAP_LEAKS
60 virtual status_t onTransact(
61 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags);
62#endif
63
64private:
65
66// ----------------------------------------------------------------------------
67
68 class Client : public BnCamera {
69
70 public:
71 virtual void disconnect();
72
The Android Open Source Projectf013e1a2008-12-17 18:05:43 -080073 // connect new client with existing camera remote
74 virtual status_t connect(const sp<ICameraClient>& client);
75
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -070076 // pass the buffered ISurface to the camera service
77 virtual status_t setPreviewDisplay(const sp<ISurface>& surface);
The Android Open Source Projectf013e1a2008-12-17 18:05:43 -080078
79 // set the frame callback flag to affect how the received frames from
80 // preview are handled.
81 virtual void setFrameCallbackFlag(int frame_callback_flag);
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -070082
83 // start preview mode, must call setPreviewDisplay first
84 virtual status_t startPreview();
85
86 // stop preview mode
87 virtual void stopPreview();
88
89 // auto focus
90 virtual status_t autoFocus();
91
92 // take a picture - returns an IMemory (ref-counted mmap)
93 virtual status_t takePicture();
94
95 // set preview/capture parameters - key/value pairs
96 virtual status_t setParameters(const String8& params);
97
98 // get preview/capture parameters - key/value pairs
99 virtual String8 getParameters() const;
100
101 // our client...
102 const sp<ICameraClient>& getCameraClient() const { return mCameraClient; }
103
104 private:
105 friend class CameraService;
106 Client( const sp<CameraService>& cameraService,
107 const sp<ICameraClient>& cameraClient);
108 Client();
109 virtual ~Client();
110
111 static void previewCallback(const sp<IMemory>& mem, void* user);
112 static void shutterCallback(void *user);
113 static void yuvPictureCallback(const sp<IMemory>& mem, void* user);
114 static void jpegPictureCallback(const sp<IMemory>& mem, void* user);
115 static void autoFocusCallback(bool focused, void* user);
116 static sp<Client> getClientFromCookie(void* user);
117
118 void postShutter();
119 void postRaw(const sp<IMemory>& mem);
120 void postJpeg(const sp<IMemory>& mem);
121 void postFrame(const sp<IMemory>& mem);
The Android Open Source Projectf013e1a2008-12-17 18:05:43 -0800122 void copyFrameAndPostCopiedFrame(sp<IMemoryHeap> heap, size_t offset, size_t size);
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -0700123 void postError(status_t error);
124 void postAutoFocus(bool focused);
125
126 // Ensures atomicity among the public methods
127 mutable Mutex mLock;
128 // mSurfaceLock synchronizes access to mSurface between
129 // setPreviewSurface() and postFrame(). Note that among
The Android Open Source Projectf013e1a2008-12-17 18:05:43 -0800130 // the public methods, all accesses to mSurface are
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -0700131 // syncrhonized by mLock. However, postFrame() is called
The Android Open Source Projectf013e1a2008-12-17 18:05:43 -0800132 // by the CameraHardwareInterface callback, and needs to
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -0700133 // access mSurface. It cannot hold mLock, however, because
134 // stopPreview() may be holding that lock while attempting
135 // top stop preview, and stopPreview itself will block waiting
The Android Open Source Projectf013e1a2008-12-17 18:05:43 -0800136 // for a callback from CameraHardwareInterface. If this
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -0700137 // happens, it will cause a deadlock.
138 mutable Mutex mSurfaceLock;
139 mutable Condition mReady;
140 sp<CameraService> mCameraService;
141 sp<ISurface> mSurface;
142 sp<MemoryHeapBase> mPreviewBuffer;
The Android Open Source Projectf013e1a2008-12-17 18:05:43 -0800143 int mFrameCallbackFlag;
The Android Open Source Project54b6cfa2008-10-21 07:00:00 -0700144
145 // these are immutable once the object is created,
146 // they don't need to be protected by a lock
147 sp<ICameraClient> mCameraClient;
148 sp<CameraHardwareInterface> mHardware;
149 };
150
151// ----------------------------------------------------------------------------
152
153 CameraService();
154 virtual ~CameraService();
155
156 mutable Mutex mLock;
157 wp<Client> mClient;
158
159#if DEBUG_HEAP_LEAKS
160 wp<IMemoryHeap> gWeakHeap;
161#endif
162};
163
164// ----------------------------------------------------------------------------
165
166}; // namespace android
167
168#endif