blob: e97dfd0f0f3cef4c13bac36dfea4086abd1fbc51 [file] [log] [blame]
Alex Ray7ee0b7a2012-11-06 00:12:49 -08001/*
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 CAMERA_H_
18#define CAMERA_H_
19
20#include <pthread.h>
Alex Raya0ed4be2013-02-25 15:02:16 -080021#include <hardware/hardware.h>
22#include <hardware/camera3.h>
Alex Rayb0be1032013-05-28 15:52:47 -070023#include "Metadata.h"
Alex Raybcaf7882013-02-28 16:04:35 -080024#include "Stream.h"
Alex Ray7ee0b7a2012-11-06 00:12:49 -080025
26namespace default_camera_hal {
27// Camera represents a physical camera on a device.
28// This is constructed when the HAL module is loaded, one per physical camera.
29// It is opened by the framework, and must be closed before it can be opened
30// again.
Alex Ray7ee0b7a2012-11-06 00:12:49 -080031class Camera {
32 public:
33 // id is used to distinguish cameras. 0 <= id < NUM_CAMERAS.
34 // module is a handle to the HAL module, used when the device is opened.
Alex Raya0ed4be2013-02-25 15:02:16 -080035 Camera(int id);
Alex Ray7ee0b7a2012-11-06 00:12:49 -080036 ~Camera();
Alex Raya48dd3f2012-12-19 12:21:38 -080037
38 // Common Camera Device Operations (see <hardware/camera_common.h>)
Alex Raya0ed4be2013-02-25 15:02:16 -080039 int open(const hw_module_t *module, hw_device_t **device);
Alex Rayb0be1032013-05-28 15:52:47 -070040 int getInfo(struct camera_info *info);
Alex Raya48dd3f2012-12-19 12:21:38 -080041 int close();
Alex Raya0ed4be2013-02-25 15:02:16 -080042
43 // Camera v3 Device Operations (see <hardware/camera3.h>)
44 int initialize(const camera3_callback_ops_t *callback_ops);
45 int configureStreams(camera3_stream_configuration_t *stream_list);
46 int registerStreamBuffers(const camera3_stream_buffer_set_t *buf_set);
47 const camera_metadata_t *constructDefaultRequestSettings(int type);
48 int processCaptureRequest(camera3_capture_request_t *request);
49 void getMetadataVendorTagOps(vendor_tag_query_ops_t *ops);
50 void dump(int fd);
51
52 // Camera device handle returned to framework for use
53 camera3_device_t mDevice;
Alex Raya48dd3f2012-12-19 12:21:38 -080054
Alex Ray7ee0b7a2012-11-06 00:12:49 -080055 private:
Alex Rayb0be1032013-05-28 15:52:47 -070056 // Separate initialization method for static metadata
57 int initStaticInfo();
Alex Raybcaf7882013-02-28 16:04:35 -080058 // Reuse a stream already created by this device
59 Stream *reuseStream(camera3_stream_t *astream);
60 // Destroy all streams in a stream array, and the array itself
61 void destroyStreams(Stream **array, int count);
62 // Verify a set of streams is valid in aggregate
63 bool isValidStreamSet(Stream **array, int count);
64 // Calculate usage and max_bufs of each stream
65 void setupStreams(Stream **array, int count);
Alex Raybfcbd952013-03-20 13:20:02 -070066 // Copy new settings for re-use and clean up old settings.
67 void setSettings(const camera_metadata_t *new_settings);
Alex Ray11bbeef2013-04-26 14:47:08 -070068 // Verify settings are valid for a capture
69 bool isValidCaptureSettings(const camera_metadata_t *settings);
70 // Verify settings are valid for reprocessing an input buffer
71 bool isValidReprocessSettings(const camera_metadata_t *settings);
Alex Ray083315c2013-04-26 19:32:29 -070072 // Process an output buffer
73 int processCaptureBuffer(const camera3_stream_buffer_t *in,
74 camera3_stream_buffer_t *out);
Alex Raybcaf7882013-02-28 16:04:35 -080075
Alex Ray7ee0b7a2012-11-06 00:12:49 -080076 // Identifier used by framework to distinguish cameras
Alex Ray1f8af672013-02-28 15:40:08 -080077 const int mId;
Alex Rayb0be1032013-05-28 15:52:47 -070078 // Metadata containing persistent camera characteristics
79 Metadata mMetadata;
80 // camera_metadata structure containing static characteristics
81 camera_metadata_t *mStaticInfo;
Alex Raya0ed4be2013-02-25 15:02:16 -080082 // Busy flag indicates camera is in use
Alex Ray7ee0b7a2012-11-06 00:12:49 -080083 bool mBusy;
Alex Raya0ed4be2013-02-25 15:02:16 -080084 // Camera device operations handle shared by all devices
85 const static camera3_device_ops_t sOps;
86 // Methods used to call back into the framework
87 const camera3_callback_ops_t *mCallbackOps;
Alex Ray7ee0b7a2012-11-06 00:12:49 -080088 // Lock protecting the Camera object for modifications
89 pthread_mutex_t mMutex;
Alex Raybcaf7882013-02-28 16:04:35 -080090 // Array of handles to streams currently in use by the device
91 Stream **mStreams;
92 // Number of streams in mStreams
93 int mNumStreams;
Alex Raybfcbd952013-03-20 13:20:02 -070094 // Most recent request settings seen, memoized to be reused
95 camera_metadata_t *mSettings;
Alex Ray7ee0b7a2012-11-06 00:12:49 -080096};
97} // namespace default_camera_hal
98
99#endif // CAMERA_H_