• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2023 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 #pragma once
18 
19 #include <functional>
20 #include <memory>
21 #include <tuple>
22 #include <vector>
23 #include <stdint.h>
24 
25 #include <aidl/android/hardware/camera/device/CameraMetadata.h>
26 #include <aidl/android/hardware/camera/device/CaptureResult.h>
27 #include <aidl/android/hardware/camera/device/HalStream.h>
28 #include <aidl/android/hardware/camera/device/RequestTemplate.h>
29 #include <aidl/android/hardware/camera/device/Stream.h>
30 #include <aidl/android/hardware/camera/device/StreamBuffer.h>
31 #include <aidl/android/hardware/graphics/common/BufferUsage.h>
32 #include <aidl/android/hardware/graphics/common/Dataspace.h>
33 #include <aidl/android/hardware/graphics/common/PixelFormat.h>
34 
35 #include <cutils/native_handle.h>
36 #include <system/camera_metadata.h>
37 #include <system/graphics.h>
38 
39 #include "Rect.h"
40 #include "Span.h"
41 #include "CachedStreamBuffer.h"
42 
43 namespace android {
44 namespace hardware {
45 namespace camera {
46 namespace provider {
47 namespace implementation {
48 namespace hw {
49 
50 using aidl::android::hardware::camera::device::CameraMetadata;
51 using aidl::android::hardware::camera::device::HalStream;
52 using aidl::android::hardware::camera::device::RequestTemplate;
53 using aidl::android::hardware::camera::device::Stream;
54 using aidl::android::hardware::camera::device::StreamBuffer;
55 using aidl::android::hardware::graphics::common::BufferUsage;
56 using aidl::android::hardware::graphics::common::Dataspace;
57 using aidl::android::hardware::graphics::common::PixelFormat;
58 
59 struct HwCaptureRequest {
60     CameraMetadata metadataUpdate;
61     std::vector<CachedStreamBuffer*> buffers;
62     int32_t frameNumber;
63 };
64 
65 // pass `true` to process the buffer, pass `false` to return an error asap to
66 // release the underlying buffer to the framework.
67 using DelayedStreamBuffer = std::function<StreamBuffer(bool)>;
68 
69 struct HwCamera {
70     static constexpr int32_t kErrorBadFormat = -1;
71     static constexpr int32_t kErrorBadUsage = -2;
72     static constexpr int32_t kErrorBadDataspace = -3;
73 
~HwCameraHwCamera74     virtual ~HwCamera() {}
75 
76     virtual std::tuple<PixelFormat, BufferUsage, Dataspace, int32_t>
77         overrideStreamParams(PixelFormat, BufferUsage, Dataspace) const = 0;
78 
79     virtual bool configure(const CameraMetadata& sessionParams, size_t nStreams,
80                            const Stream* streams, const HalStream* halStreams) = 0;
81     virtual void close() = 0;
82 
83     virtual std::tuple<int64_t, int64_t, CameraMetadata, std::vector<StreamBuffer>,
84                        std::vector<DelayedStreamBuffer>>
85         processCaptureRequest(CameraMetadata, Span<CachedStreamBuffer*>) = 0;
86 
87     static int64_t getFrameDuration(const camera_metadata_t*, int64_t def,
88                                     int64_t min, int64_t max);
89 
90     static bool compressJpeg(Rect<uint16_t> imageSize,
91                              const android_ycbcr& imageYcbcr,
92                              const CameraMetadata& metadata,
93                              const native_handle_t* jpegBuffer,
94                              size_t jpegBufferSize);
95 
96     ////////////////////////////////////////////////////////////////////////////
97     virtual Span<const std::pair<int32_t, int32_t>> getTargetFpsRanges() const = 0;
98     virtual std::tuple<int32_t, int32_t, int32_t, int32_t> getAeCompensationRange() const;
99     virtual std::pair<float, float> getZoomRatioRange() const;
100     virtual std::pair<int, int> getSupportedFlashStrength() const;
101     virtual Span<const Rect<uint16_t>> getAvailableThumbnailSizes() const = 0;
102     virtual int32_t getJpegMaxSize() const;
103     virtual bool isBackFacing() const = 0;
104     virtual Span<const float> getAvailableApertures() const;
105     virtual Span<const float> getAvailableFocalLength() const;
106     virtual float getHyperfocalDistance() const;
107     virtual float getMinimumFocusDistance() const;
108     virtual std::tuple<int32_t, int32_t, int32_t> getMaxNumOutputStreams() const = 0;
109     virtual int32_t getPipelineMaxDepth() const;
110     virtual uint32_t getAvailableCapabilitiesBitmap() const;
111     virtual Span<const PixelFormat> getSupportedPixelFormats() const = 0;
112     virtual Span<const Rect<uint16_t>> getSupportedResolutions() const = 0;
113     virtual float getMaxDigitalZoom() const;
114     virtual int64_t getMinFrameDurationNs() const = 0;
115     virtual int64_t getStallFrameDurationNs() const;
116     virtual int32_t getSensorOrientation() const;
117     virtual Rect<uint16_t> getSensorSize() const = 0;
118     virtual float getSensorDPI() const;
119     virtual std::pair<int32_t, int32_t> getSensorSensitivityRange() const;
120     virtual std::pair<int64_t, int64_t> getSensorExposureTimeRange() const = 0;
121     virtual int64_t getSensorMaxFrameDuration() const = 0;
122 
123     ////////////////////////////////////////////////////////////////////////////
124     virtual std::pair<int32_t, int32_t> getDefaultTargetFpsRange(RequestTemplate) const = 0;
125     virtual float getDefaultAperture() const;
126     virtual float getDefaultFocalLength() const;
127     virtual int32_t getDefaultSensorSensitivity() const;
128     virtual int64_t getDefaultSensorExpTime() const = 0;
129     virtual int64_t getDefaultSensorFrameDuration() const = 0;
130 };
131 
132 using HwCameraFactoryProduct = std::unique_ptr<HwCamera>;
133 using HwCameraFactory = std::function<HwCameraFactoryProduct()>;
134 
135 }  // namespace hw
136 }  // namespace implementation
137 }  // namespace provider
138 }  // namespace camera
139 }  // namespace hardware
140 }  // namespace android
141