blob: a0c9f2d8b14e33d25c6375eef2efa7b5f6f4abdd [file] [log] [blame]
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -07001/*
2 * Copyright (C) 2012 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef ANDROID_SERVERS_CAMERA_CAMERA2CLIENT_H
18#define ANDROID_SERVERS_CAMERA_CAMERA2CLIENT_H
19
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070020#include "CameraService.h"
Eino-Ville Talvala7b82efe2013-07-25 17:12:35 -070021#include "common/CameraDeviceBase.h"
22#include "common/Camera2ClientBase.h"
23#include "api1/client2/Parameters.h"
24#include "api1/client2/FrameProcessor.h"
Kwangkyu Park9dd5eda2023-06-20 21:12:06 +090025#include <media/RingBuffer.h>
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070026
27namespace android {
28
Eino-Ville Talvala7b82efe2013-07-25 17:12:35 -070029namespace camera2 {
30
31class StreamingProcessor;
32class JpegProcessor;
Eino-Ville Talvalad309fb92015-11-25 12:12:45 -080033class ZslProcessor;
Eino-Ville Talvala7b82efe2013-07-25 17:12:35 -070034class CaptureSequencer;
35class CallbackProcessor;
36
37}
38
Eino-Ville Talvala73bbd1f2012-09-26 10:45:47 -070039class IMemory;
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070040/**
Eino-Ville Talvalab99c5b82013-02-06 17:20:07 -080041 * Interface between android.hardware.Camera API and Camera HAL device for versions
Eino-Ville Talvalad309fb92015-11-25 12:12:45 -080042 * CAMERA_DEVICE_API_VERSION_3_0 and above.
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070043 */
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -070044class Camera2Client :
Igor Murashkin44cfcf02013-03-01 16:22:28 -080045 public Camera2ClientBase<CameraService::Client>
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070046{
47public:
Eino-Ville Talvalaea0d51b2012-08-28 01:25:43 -070048 /**
49 * ICamera interface (see ICamera for details)
50 */
Eino-Ville Talvala160d4af2012-08-03 09:40:16 -070051
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -080052 virtual binder::Status disconnect();
53 virtual status_t connect(const sp<hardware::ICameraClient>& client);
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070054 virtual status_t lock();
55 virtual status_t unlock();
Eino-Ville Talvala1ce7c342013-08-21 13:57:21 -070056 virtual status_t setPreviewTarget(
Andy McFadden8ba01022012-12-18 09:46:54 -080057 const sp<IGraphicBufferProducer>& bufferProducer);
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070058 virtual void setPreviewCallbackFlag(int flag);
Eino-Ville Talvala3ee35502013-04-02 15:45:11 -070059 virtual status_t setPreviewCallbackTarget(
60 const sp<IGraphicBufferProducer>& callbackProducer);
61
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070062 virtual status_t startPreview();
63 virtual void stopPreview();
64 virtual bool previewEnabled();
Chien-Yu Chen8cca0752015-11-13 15:28:48 -080065 virtual status_t setVideoBufferMode(int32_t videoBufferMode);
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070066 virtual status_t startRecording();
67 virtual void stopRecording();
68 virtual bool recordingEnabled();
69 virtual void releaseRecordingFrame(const sp<IMemory>& mem);
Chien-Yu Chen2d13b1d2016-04-28 12:11:20 -070070 virtual void releaseRecordingFrameHandle(native_handle_t *handle);
Yin-Chia Yehb5df5472017-03-20 19:32:19 -070071 virtual void releaseRecordingFrameHandleBatch(
72 const std::vector<native_handle_t*>& handles);
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070073 virtual status_t autoFocus();
74 virtual status_t cancelAutoFocus();
75 virtual status_t takePicture(int msgType);
76 virtual status_t setParameters(const String8& params);
77 virtual String8 getParameters() const;
78 virtual status_t sendCommand(int32_t cmd, int32_t arg1, int32_t arg2);
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -080079 virtual void notifyError(int32_t errorCode,
Ruben Brunka485dfe2015-04-14 13:43:47 -070080 const CaptureResultExtras& resultExtras);
Chien-Yu Chen8cca0752015-11-13 15:28:48 -080081 virtual status_t setVideoTarget(const sp<IGraphicBufferProducer>& bufferProducer);
Yin-Chia Yehcfab4e12019-09-09 13:08:28 -070082 virtual status_t setAudioRestriction(int mode);
83 virtual int32_t getGlobalAudioRestriction();
Jayant Chowdhary44d5f622023-09-20 03:11:41 +000084 virtual status_t setRotateAndCropOverride(uint8_t rotateAndCrop, bool fromHal = false);
Bharatt Kukreja7146ced2022-10-25 15:45:29 +000085 virtual status_t setAutoframingOverride(uint8_t autoframingMode);
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -070086
Eino-Ville Talvala305cec62020-11-12 14:18:17 -080087 virtual bool supportsCameraMute();
88 virtual status_t setCameraMute(bool enabled);
89
Ravneetaeb20dc2022-03-30 05:33:03 +000090 virtual status_t setCameraServiceWatchdog(bool enabled);
91
Shuzhen Wang16610a62022-12-15 22:38:07 -080092 virtual void setStreamUseCaseOverrides(
93 const std::vector<int64_t>& useCaseOverrides);
94 virtual void clearStreamUseCaseOverrides();
95
Shuzhen Wangaf22e912023-04-11 16:03:17 -070096 virtual bool supportsZoomOverride();
97 virtual status_t setZoomOverride(int32_t zoomOverride);
98
Eino-Ville Talvalaea0d51b2012-08-28 01:25:43 -070099 /**
100 * Interface used by CameraService
101 */
Eino-Ville Talvala160d4af2012-08-03 09:40:16 -0700102
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700103 Camera2Client(const sp<CameraService>& cameraService,
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800104 const sp<hardware::ICameraClient>& cameraClient,
Austin Borger74fca042022-05-23 12:41:21 -0700105 std::shared_ptr<CameraServiceProxyWrapper> cameraServiceProxyWrapper,
Austin Borger249e6592024-03-10 22:28:11 -0700106 std::shared_ptr<AttributionAndPermissionUtils> attributionAndPermissionUtils,
Austin Borgered99f642023-06-01 16:51:35 -0700107 const std::string& clientPackageName,
108 const std::optional<std::string>& clientFeatureId,
109 const std::string& cameraDeviceId,
Yin-Chia Yehc3e9d6f2018-02-06 10:56:32 -0800110 int api1CameraId,
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700111 int cameraFacing,
Emilian Peev8b64f282021-03-25 16:49:57 -0700112 int sensorOrientation,
Igor Murashkinecf17e82012-10-02 16:05:11 -0700113 int clientPid,
Eino-Ville Talvalaceb388d2013-02-19 10:40:14 -0800114 uid_t clientUid,
Shuzhen Wangd4abdf72021-05-28 11:22:50 -0700115 int servicePid,
Austin Borger18b30a72022-10-27 12:20:29 -0700116 bool overrideForPerfClass,
Jayant Chowdhary81d81b02024-02-15 19:13:39 +0000117 int rotationOverride,
Chengfei Taobe683db2023-01-31 18:52:49 +0000118 bool forceSlowJpegMode);
Eino-Ville Talvalab99c5b82013-02-06 17:20:07 -0800119
Eino-Ville Talvala160d4af2012-08-03 09:40:16 -0700120 virtual ~Camera2Client();
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700121
Emilian Peevbd8c5032018-02-14 23:05:40 +0000122 virtual status_t initialize(sp<CameraProviderManager> manager,
Austin Borgered99f642023-06-01 16:51:35 -0700123 const std::string& monitorTags) override;
Eino-Ville Talvalaf69c70d2012-05-20 15:59:14 -0700124
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700125 virtual status_t dump(int fd, const Vector<String16>& args);
126
Eino-Ville Talvalac4003962016-01-13 10:07:04 -0800127 virtual status_t dumpClient(int fd, const Vector<String16>& args);
128
Eino-Ville Talvalaea0d51b2012-08-28 01:25:43 -0700129 /**
Eino-Ville Talvalab99c5b82013-02-06 17:20:07 -0800130 * Interface used by CameraDeviceBase
Eino-Ville Talvalaea0d51b2012-08-28 01:25:43 -0700131 */
Eino-Ville Talvala160d4af2012-08-03 09:40:16 -0700132
Eino-Ville Talvala160d4af2012-08-03 09:40:16 -0700133 virtual void notifyAutoFocus(uint8_t newState, int triggerId);
134 virtual void notifyAutoExposure(uint8_t newState, int triggerId);
Yin-Chia Yeh216db742015-05-18 15:03:35 -0700135 virtual void notifyShutter(const CaptureResultExtras& resultExtras,
136 nsecs_t timestamp);
Eino-Ville Talvala160d4af2012-08-03 09:40:16 -0700137
Eino-Ville Talvalaea0d51b2012-08-28 01:25:43 -0700138 /**
139 * Interface used by independent components of Camera2Client.
140 */
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -0700141
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -0700142 camera2::SharedParameters& getParameters();
143
Emilian Peev2a8e2832019-08-23 13:00:31 -0700144 void notifyRequestId(int32_t requestId);
145
Eino-Ville Talvalada6665c2012-08-29 17:37:16 -0700146 int getPreviewStreamId() const;
147 int getCaptureStreamId() const;
148 int getCallbackStreamId() const;
149 int getRecordingStreamId() const;
150 int getZslStreamId() const;
151
Eino-Ville Talvala4865c522012-10-02 13:30:28 -0700152 status_t registerFrameListener(int32_t minId, int32_t maxId,
Chih-Hung Hsieh8b0b9712016-08-09 14:25:53 -0700153 const wp<camera2::FrameProcessor::FilteredListener>& listener,
Zhijun He25a0aef2014-06-25 11:40:02 -0700154 bool sendPartials = true);
Eino-Ville Talvala4865c522012-10-02 13:30:28 -0700155 status_t removeFrameListener(int32_t minId, int32_t maxId,
Chih-Hung Hsieh8b0b9712016-08-09 14:25:53 -0700156 const wp<camera2::FrameProcessor::FilteredListener>& listener);
Eino-Ville Talvala4865c522012-10-02 13:30:28 -0700157
158 status_t stopStream();
Eino-Ville Talvalada6665c2012-08-29 17:37:16 -0700159
Yin-Chia Yeh355d9c62015-02-24 15:51:43 -0800160 // For the slowJpegMode to create jpeg stream when precapture sequence is done
161 status_t createJpegStreamL(camera2::Parameters &params);
162
Eino-Ville Talvalaea0d51b2012-08-28 01:25:43 -0700163 static size_t calculateBufferSize(int width, int height,
164 int format, int stride);
165
Eino-Ville Talvala4865c522012-10-02 13:30:28 -0700166 static const int32_t kPreviewRequestIdStart = 10000000;
167 static const int32_t kPreviewRequestIdEnd = 20000000;
168
169 static const int32_t kRecordingRequestIdStart = 20000000;
170 static const int32_t kRecordingRequestIdEnd = 30000000;
171
172 static const int32_t kCaptureRequestIdStart = 30000000;
173 static const int32_t kCaptureRequestIdEnd = 40000000;
Eino-Ville Talvalada6665c2012-08-29 17:37:16 -0700174
Eino-Ville Talvala2b07e022013-10-10 15:13:09 -0700175 // Constant strings for ATRACE logging
176 static const char* kAutofocusLabel;
177 static const char* kTakepictureLabel;
178
Yin-Chia Yeh355d9c62015-02-24 15:51:43 -0800179 // Used with stream IDs
180 static const int NO_STREAM = -1;
181
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700182private:
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700183 /** ICamera interface-related private members */
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700184 typedef camera2::Parameters Parameters;
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700185
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -0700186 status_t setPreviewWindowL(const sp<IBinder>& binder,
Chih-Hung Hsieh8b0b9712016-08-09 14:25:53 -0700187 const sp<Surface>& window);
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700188 status_t startPreviewL(Parameters &params, bool restart);
189 void stopPreviewL();
190 status_t startRecordingL(Parameters &params, bool restart);
191 bool recordingEnabledL();
James Dong8da4cd72012-08-04 19:58:07 -0700192
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -0700193 // Individual commands for sendCommand()
194 status_t commandStartSmoothZoomL();
195 status_t commandStopSmoothZoomL();
196 status_t commandSetDisplayOrientationL(int degrees);
197 status_t commandEnableShutterSoundL(bool enable);
198 status_t commandPlayRecordingSoundL();
199 status_t commandStartFaceDetectionL(int type);
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700200 status_t commandStopFaceDetectionL(Parameters &params);
Eino-Ville Talvala36cdfb12012-08-02 17:34:15 -0700201 status_t commandEnableFocusMoveMsgL(bool enable);
202 status_t commandPingL();
203 status_t commandSetVideoBufferCountL(size_t count);
Eino-Ville Talvalad46a6b92015-05-14 17:26:24 -0700204 status_t commandSetVideoFormatL(int format, android_dataspace dataSpace);
Eino-Ville Talvalad4bcfde2012-06-07 17:12:38 -0700205
Eino-Ville Talvala2e19c3c2012-08-26 09:29:28 -0700206 // Current camera device configuration
207 camera2::SharedParameters mParameters;
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -0700208
Eino-Ville Talvala3cca1362012-06-07 10:07:18 -0700209 /** Camera device-related private members */
210
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700211 void setPreviewCallbackFlagL(Parameters &params, int flag);
Eino-Ville Talvala5a4f93e2012-08-29 18:06:32 -0700212 status_t updateRequests(Parameters &params);
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -0700213
Igor Murashkindca254a2013-05-13 14:53:44 -0700214 template <typename ProcessorT>
215 status_t updateProcessorStream(sp<ProcessorT> processor, Parameters params);
Igor Murashkin82db9e62013-05-21 11:38:49 -0700216 template <typename ProcessorT,
217 status_t (ProcessorT::*updateStreamF)(const Parameters &)>
218 status_t updateProcessorStream(sp<ProcessorT> processor, Parameters params);
Igor Murashkindca254a2013-05-13 14:53:44 -0700219
Eino-Ville Talvalaa16733e2012-08-27 23:41:56 -0700220 sp<camera2::FrameProcessor> mFrameProcessor;
Eino-Ville Talvala8ce89d92012-08-10 08:40:26 -0700221
Eino-Ville Talvala73bbd1f2012-09-26 10:45:47 -0700222 /* Preview/Recording related members */
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700223
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700224 sp<IBinder> mPreviewSurface;
Chien-Yu Chen8cca0752015-11-13 15:28:48 -0800225 sp<IBinder> mVideoSurface;
Eino-Ville Talvala73bbd1f2012-09-26 10:45:47 -0700226 sp<camera2::StreamingProcessor> mStreamingProcessor;
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700227
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700228 /** Preview callback related members */
229
Eino-Ville Talvalad86a6882012-08-28 11:34:14 -0700230 sp<camera2::CallbackProcessor> mCallbackProcessor;
Eino-Ville Talvala228a5382012-08-13 12:16:06 -0700231
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700232 /* Still image capture related members */
233
Eino-Ville Talvalada6665c2012-08-29 17:37:16 -0700234 sp<camera2::CaptureSequencer> mCaptureSequencer;
235 sp<camera2::JpegProcessor> mJpegProcessor;
Eino-Ville Talvalad309fb92015-11-25 12:12:45 -0800236 sp<camera2::ZslProcessor> mZslProcessor;
Eino-Ville Talvala174181e2012-08-03 13:53:39 -0700237
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700238 /** Utility members */
Igor Murashkina858ea02014-08-19 14:53:08 -0700239 bool mLegacyMode;
Eino-Ville Talvala9cca4c62012-06-15 15:41:44 -0700240
Eino-Ville Talvala4865c522012-10-02 13:30:28 -0700241 // Wait until the camera device has received the latest control settings
242 status_t syncWithDevice();
Yin-Chia Yeha53021f2014-09-12 14:50:27 -0700243
244 // Video snapshot jpeg size overriding helper function
245 status_t overrideVideoSnapshotSize(Parameters &params);
Yin-Chia Yehdce65c82017-01-06 15:03:53 -0800246
247 template<typename TProviderPtr>
Austin Borgered99f642023-06-01 16:51:35 -0700248 status_t initializeImpl(TProviderPtr providerPtr, const std::string& monitorTags);
Chien-Yu Chenfa52c0f2017-08-22 17:50:54 -0700249
250 bool isZslEnabledInStillTemplate();
Emilian Peev13f35ad2022-04-27 11:28:48 -0700251 // The current rotate & crop mode passed by camera service
252 uint8_t mRotateAndCropMode;
Emilian Peev58aa9c12022-05-24 18:23:10 -0700253 // Synchronize access to 'mRotateAndCropMode'
254 mutable Mutex mRotateAndCropLock;
Emilian Peev13f35ad2022-04-27 11:28:48 -0700255 // Contains the preview stream transformation that would normally be applied
256 // when the display rotation is 0
257 int mRotateAndCropPreviewTransform;
258 // Flag indicating camera device support for the rotate & crop interface
259 bool mRotateAndCropIsSupported;
Emilian Peev2a8e2832019-08-23 13:00:31 -0700260
261 mutable Mutex mLatestRequestMutex;
262 Condition mLatestRequestSignal;
Kwangkyu Park9dd5eda2023-06-20 21:12:06 +0900263 static constexpr size_t kMaxRequestIds = BufferQueueDefs::NUM_BUFFER_SLOTS;
264 RingBuffer<int32_t> mLatestRequestIds, mLatestFailedRequestIds;
Emilian Peev2a8e2832019-08-23 13:00:31 -0700265 status_t waitUntilRequestIdApplied(int32_t requestId, nsecs_t timeout);
266 status_t waitUntilCurrentRequestIdLocked();
Eino-Ville Talvala61ab9f92012-05-17 10:30:54 -0700267};
268
269}; // namespace android
270
271#endif