xref: /aosp_15_r20/hardware/interfaces/camera/device/default/ExternalCameraUtils.h (revision 4d7e907c777eeecc4c5bd7cf640a754fac206ff7)
1*4d7e907cSAndroid Build Coastguard Worker /*
2*4d7e907cSAndroid Build Coastguard Worker  * Copyright (C) 2022 The Android Open Source Project
3*4d7e907cSAndroid Build Coastguard Worker  *
4*4d7e907cSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*4d7e907cSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*4d7e907cSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*4d7e907cSAndroid Build Coastguard Worker  *
8*4d7e907cSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*4d7e907cSAndroid Build Coastguard Worker  *
10*4d7e907cSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*4d7e907cSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*4d7e907cSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*4d7e907cSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*4d7e907cSAndroid Build Coastguard Worker  * limitations under the License.
15*4d7e907cSAndroid Build Coastguard Worker  */
16*4d7e907cSAndroid Build Coastguard Worker 
17*4d7e907cSAndroid Build Coastguard Worker #ifndef HARDWARE_INTERFACES_CAMERA_DEVICE_DEFAULT_EXTERNALCAMERAUTILS_H_
18*4d7e907cSAndroid Build Coastguard Worker #define HARDWARE_INTERFACES_CAMERA_DEVICE_DEFAULT_EXTERNALCAMERAUTILS_H_
19*4d7e907cSAndroid Build Coastguard Worker 
20*4d7e907cSAndroid Build Coastguard Worker #include <CameraMetadata.h>
21*4d7e907cSAndroid Build Coastguard Worker #include <HandleImporter.h>
22*4d7e907cSAndroid Build Coastguard Worker #include <aidl/android/hardware/camera/common/Status.h>
23*4d7e907cSAndroid Build Coastguard Worker #include <aidl/android/hardware/camera/device/CaptureResult.h>
24*4d7e907cSAndroid Build Coastguard Worker #include <aidl/android/hardware/camera/device/ErrorCode.h>
25*4d7e907cSAndroid Build Coastguard Worker #include <aidl/android/hardware/camera/device/NotifyMsg.h>
26*4d7e907cSAndroid Build Coastguard Worker #include <aidl/android/hardware/graphics/common/BufferUsage.h>
27*4d7e907cSAndroid Build Coastguard Worker #include <aidl/android/hardware/graphics/common/PixelFormat.h>
28*4d7e907cSAndroid Build Coastguard Worker #include <android/hardware/graphics/mapper/2.0/IMapper.h>
29*4d7e907cSAndroid Build Coastguard Worker #include <android/hardware/graphics/mapper/3.0/IMapper.h>
30*4d7e907cSAndroid Build Coastguard Worker #include <android/hardware/graphics/mapper/4.0/IMapper.h>
31*4d7e907cSAndroid Build Coastguard Worker #include <tinyxml2.h>
32*4d7e907cSAndroid Build Coastguard Worker #include <map>
33*4d7e907cSAndroid Build Coastguard Worker #include <unordered_map>
34*4d7e907cSAndroid Build Coastguard Worker #include <unordered_set>
35*4d7e907cSAndroid Build Coastguard Worker 
36*4d7e907cSAndroid Build Coastguard Worker using ::aidl::android::hardware::camera::common::Status;
37*4d7e907cSAndroid Build Coastguard Worker using ::aidl::android::hardware::camera::device::CaptureResult;
38*4d7e907cSAndroid Build Coastguard Worker using ::aidl::android::hardware::camera::device::ErrorCode;
39*4d7e907cSAndroid Build Coastguard Worker using ::aidl::android::hardware::camera::device::NotifyMsg;
40*4d7e907cSAndroid Build Coastguard Worker using ::aidl::android::hardware::graphics::common::BufferUsage;
41*4d7e907cSAndroid Build Coastguard Worker using ::aidl::android::hardware::graphics::common::PixelFormat;
42*4d7e907cSAndroid Build Coastguard Worker using ::android::hardware::camera::common::V1_0::helper::CameraMetadata;
43*4d7e907cSAndroid Build Coastguard Worker using ::android::hardware::camera::common::V1_0::helper::HandleImporter;
44*4d7e907cSAndroid Build Coastguard Worker using ::android::hardware::graphics::mapper::V2_0::IMapper;
45*4d7e907cSAndroid Build Coastguard Worker using ::android::hardware::graphics::mapper::V2_0::YCbCrLayout;
46*4d7e907cSAndroid Build Coastguard Worker 
47*4d7e907cSAndroid Build Coastguard Worker namespace android {
48*4d7e907cSAndroid Build Coastguard Worker namespace hardware {
49*4d7e907cSAndroid Build Coastguard Worker namespace camera {
50*4d7e907cSAndroid Build Coastguard Worker 
51*4d7e907cSAndroid Build Coastguard Worker namespace external {
52*4d7e907cSAndroid Build Coastguard Worker namespace common {
53*4d7e907cSAndroid Build Coastguard Worker 
54*4d7e907cSAndroid Build Coastguard Worker struct Size {
55*4d7e907cSAndroid Build Coastguard Worker     int32_t width;
56*4d7e907cSAndroid Build Coastguard Worker     int32_t height;
57*4d7e907cSAndroid Build Coastguard Worker 
58*4d7e907cSAndroid Build Coastguard Worker     bool operator==(const Size& other) const {
59*4d7e907cSAndroid Build Coastguard Worker         return (width == other.width && height == other.height);
60*4d7e907cSAndroid Build Coastguard Worker     }
61*4d7e907cSAndroid Build Coastguard Worker };
62*4d7e907cSAndroid Build Coastguard Worker 
63*4d7e907cSAndroid Build Coastguard Worker struct SizeHasher {
operatorSizeHasher64*4d7e907cSAndroid Build Coastguard Worker     size_t operator()(const Size& sz) const {
65*4d7e907cSAndroid Build Coastguard Worker         size_t result = 1;
66*4d7e907cSAndroid Build Coastguard Worker         result = 31 * result + sz.width;
67*4d7e907cSAndroid Build Coastguard Worker         result = 31 * result + sz.height;
68*4d7e907cSAndroid Build Coastguard Worker         return result;
69*4d7e907cSAndroid Build Coastguard Worker     }
70*4d7e907cSAndroid Build Coastguard Worker };
71*4d7e907cSAndroid Build Coastguard Worker 
72*4d7e907cSAndroid Build Coastguard Worker struct ExternalCameraConfig {
73*4d7e907cSAndroid Build Coastguard Worker     static const char* kDefaultCfgPath;
74*4d7e907cSAndroid Build Coastguard Worker     static ExternalCameraConfig loadFromCfg(const char* cfgPath = kDefaultCfgPath);
75*4d7e907cSAndroid Build Coastguard Worker 
76*4d7e907cSAndroid Build Coastguard Worker     // CameraId base offset for numerical representation
77*4d7e907cSAndroid Build Coastguard Worker     uint32_t cameraIdOffset;
78*4d7e907cSAndroid Build Coastguard Worker 
79*4d7e907cSAndroid Build Coastguard Worker     // List of internal V4L2 video nodes external camera HAL must ignore.
80*4d7e907cSAndroid Build Coastguard Worker     std::unordered_set<std::string> mInternalDevices;
81*4d7e907cSAndroid Build Coastguard Worker 
82*4d7e907cSAndroid Build Coastguard Worker     // Maximal size of a JPEG buffer, in bytes
83*4d7e907cSAndroid Build Coastguard Worker     int32_t maxJpegBufSize;
84*4d7e907cSAndroid Build Coastguard Worker 
85*4d7e907cSAndroid Build Coastguard Worker     // Maximum Size that can sustain 30fps streaming
86*4d7e907cSAndroid Build Coastguard Worker     Size maxVideoSize;
87*4d7e907cSAndroid Build Coastguard Worker 
88*4d7e907cSAndroid Build Coastguard Worker     // Size of v4l2 buffer queue when streaming <= kMaxVideoSize
89*4d7e907cSAndroid Build Coastguard Worker     uint32_t numVideoBuffers;
90*4d7e907cSAndroid Build Coastguard Worker 
91*4d7e907cSAndroid Build Coastguard Worker     // Size of v4l2 buffer queue when streaming > kMaxVideoSize
92*4d7e907cSAndroid Build Coastguard Worker     uint32_t numStillBuffers;
93*4d7e907cSAndroid Build Coastguard Worker 
94*4d7e907cSAndroid Build Coastguard Worker     // Indication that the device connected supports depth output
95*4d7e907cSAndroid Build Coastguard Worker     bool depthEnabled;
96*4d7e907cSAndroid Build Coastguard Worker 
97*4d7e907cSAndroid Build Coastguard Worker     struct FpsLimitation {
98*4d7e907cSAndroid Build Coastguard Worker         Size size;
99*4d7e907cSAndroid Build Coastguard Worker         double fpsUpperBound;
100*4d7e907cSAndroid Build Coastguard Worker     };
101*4d7e907cSAndroid Build Coastguard Worker     std::vector<FpsLimitation> fpsLimits;
102*4d7e907cSAndroid Build Coastguard Worker     std::vector<FpsLimitation> depthFpsLimits;
103*4d7e907cSAndroid Build Coastguard Worker 
104*4d7e907cSAndroid Build Coastguard Worker     // Minimum output stream size
105*4d7e907cSAndroid Build Coastguard Worker     Size minStreamSize;
106*4d7e907cSAndroid Build Coastguard Worker 
107*4d7e907cSAndroid Build Coastguard Worker     // The value of android.sensor.orientation
108*4d7e907cSAndroid Build Coastguard Worker     int32_t orientation;
109*4d7e907cSAndroid Build Coastguard Worker 
110*4d7e907cSAndroid Build Coastguard Worker   private:
111*4d7e907cSAndroid Build Coastguard Worker     ExternalCameraConfig();
112*4d7e907cSAndroid Build Coastguard Worker     static bool updateFpsList(tinyxml2::XMLElement* fpsList, std::vector<FpsLimitation>& fpsLimits);
113*4d7e907cSAndroid Build Coastguard Worker };
114*4d7e907cSAndroid Build Coastguard Worker 
115*4d7e907cSAndroid Build Coastguard Worker }  // namespace common
116*4d7e907cSAndroid Build Coastguard Worker }  // namespace external
117*4d7e907cSAndroid Build Coastguard Worker 
118*4d7e907cSAndroid Build Coastguard Worker namespace device {
119*4d7e907cSAndroid Build Coastguard Worker namespace implementation {
120*4d7e907cSAndroid Build Coastguard Worker 
121*4d7e907cSAndroid Build Coastguard Worker struct SupportedV4L2Format {
122*4d7e907cSAndroid Build Coastguard Worker     int32_t width;
123*4d7e907cSAndroid Build Coastguard Worker     int32_t height;
124*4d7e907cSAndroid Build Coastguard Worker     uint32_t fourcc;
125*4d7e907cSAndroid Build Coastguard Worker     // All supported frame rate for this w/h/fourcc combination
126*4d7e907cSAndroid Build Coastguard Worker     struct FrameRate {
127*4d7e907cSAndroid Build Coastguard Worker         // Duration (in seconds) of a single frame.
128*4d7e907cSAndroid Build Coastguard Worker         // Numerator and denominator of the frame duration are stored separately.
129*4d7e907cSAndroid Build Coastguard Worker         // For ex. a frame lasting 1/30 of a second will be stored as {1, 30}
130*4d7e907cSAndroid Build Coastguard Worker         uint32_t durationNumerator;         // frame duration numerator.   Ex: 1
131*4d7e907cSAndroid Build Coastguard Worker         uint32_t durationDenominator;       // frame duration denominator. Ex: 30
132*4d7e907cSAndroid Build Coastguard Worker         double getFramesPerSecond() const;  // FPS as double.        Ex: 30.0
133*4d7e907cSAndroid Build Coastguard Worker     };
134*4d7e907cSAndroid Build Coastguard Worker     std::vector<FrameRate> frameRates;
135*4d7e907cSAndroid Build Coastguard Worker };
136*4d7e907cSAndroid Build Coastguard Worker 
137*4d7e907cSAndroid Build Coastguard Worker // A Base class with basic information about a frame
138*4d7e907cSAndroid Build Coastguard Worker struct Frame : public std::enable_shared_from_this<Frame> {
139*4d7e907cSAndroid Build Coastguard Worker   public:
140*4d7e907cSAndroid Build Coastguard Worker     Frame(uint32_t width, uint32_t height, uint32_t fourcc);
141*4d7e907cSAndroid Build Coastguard Worker     virtual ~Frame();
142*4d7e907cSAndroid Build Coastguard Worker     const int32_t mWidth;
143*4d7e907cSAndroid Build Coastguard Worker     const int32_t mHeight;
144*4d7e907cSAndroid Build Coastguard Worker     const uint32_t mFourcc;
145*4d7e907cSAndroid Build Coastguard Worker 
146*4d7e907cSAndroid Build Coastguard Worker     // getData might involve map/allocation
147*4d7e907cSAndroid Build Coastguard Worker     virtual int getData(uint8_t** outData, size_t* dataSize) = 0;
148*4d7e907cSAndroid Build Coastguard Worker };
149*4d7e907cSAndroid Build Coastguard Worker 
150*4d7e907cSAndroid Build Coastguard Worker // A class provide access to a dequeued V4L2 frame buffer (mostly in MJPG format)
151*4d7e907cSAndroid Build Coastguard Worker // Also contains necessary information to enqueue the buffer back to V4L2 buffer queue
152*4d7e907cSAndroid Build Coastguard Worker class V4L2Frame : public Frame {
153*4d7e907cSAndroid Build Coastguard Worker   public:
154*4d7e907cSAndroid Build Coastguard Worker     V4L2Frame(uint32_t w, uint32_t h, uint32_t fourcc, int bufIdx, int fd, uint32_t dataSize,
155*4d7e907cSAndroid Build Coastguard Worker               uint64_t offset);
156*4d7e907cSAndroid Build Coastguard Worker     virtual ~V4L2Frame();
157*4d7e907cSAndroid Build Coastguard Worker 
158*4d7e907cSAndroid Build Coastguard Worker     virtual int getData(uint8_t** outData, size_t* dataSize) override;
159*4d7e907cSAndroid Build Coastguard Worker 
160*4d7e907cSAndroid Build Coastguard Worker     const int mBufferIndex;  // for later enqueue
161*4d7e907cSAndroid Build Coastguard Worker     int map(uint8_t** data, size_t* dataSize);
162*4d7e907cSAndroid Build Coastguard Worker     int unmap();
163*4d7e907cSAndroid Build Coastguard Worker 
164*4d7e907cSAndroid Build Coastguard Worker   private:
165*4d7e907cSAndroid Build Coastguard Worker     std::mutex mLock;
166*4d7e907cSAndroid Build Coastguard Worker     const int mFd;  // used for mmap but doesn't claim ownership
167*4d7e907cSAndroid Build Coastguard Worker     const size_t mDataSize;
168*4d7e907cSAndroid Build Coastguard Worker     const uint64_t mOffset;  // used for mmap
169*4d7e907cSAndroid Build Coastguard Worker     uint8_t* mData = nullptr;
170*4d7e907cSAndroid Build Coastguard Worker     bool mMapped = false;
171*4d7e907cSAndroid Build Coastguard Worker };
172*4d7e907cSAndroid Build Coastguard Worker 
173*4d7e907cSAndroid Build Coastguard Worker // A RAII class representing a CPU allocated YUV frame used as intermediate buffers
174*4d7e907cSAndroid Build Coastguard Worker // when generating output images.
175*4d7e907cSAndroid Build Coastguard Worker class AllocatedFrame : public Frame {
176*4d7e907cSAndroid Build Coastguard Worker   public:
177*4d7e907cSAndroid Build Coastguard Worker     AllocatedFrame(uint32_t w, uint32_t h);  // only support V4L2_PIX_FMT_YUV420 for now
178*4d7e907cSAndroid Build Coastguard Worker     ~AllocatedFrame() override;
179*4d7e907cSAndroid Build Coastguard Worker 
180*4d7e907cSAndroid Build Coastguard Worker     virtual int getData(uint8_t** outData, size_t* dataSize) override;
181*4d7e907cSAndroid Build Coastguard Worker 
182*4d7e907cSAndroid Build Coastguard Worker     int allocate(YCbCrLayout* out = nullptr);
183*4d7e907cSAndroid Build Coastguard Worker     int getLayout(YCbCrLayout* out);
184*4d7e907cSAndroid Build Coastguard Worker     int getCroppedLayout(const IMapper::Rect&, YCbCrLayout* out);  // return non-zero for bad input
185*4d7e907cSAndroid Build Coastguard Worker   private:
186*4d7e907cSAndroid Build Coastguard Worker     std::mutex mLock;
187*4d7e907cSAndroid Build Coastguard Worker     std::vector<uint8_t> mData;
188*4d7e907cSAndroid Build Coastguard Worker     size_t mBufferSize;  // size of mData before padding. Actual size of mData might be slightly
189*4d7e907cSAndroid Build Coastguard Worker                          // bigger to horizontally pad the frame for jpeglib.
190*4d7e907cSAndroid Build Coastguard Worker };
191*4d7e907cSAndroid Build Coastguard Worker 
192*4d7e907cSAndroid Build Coastguard Worker enum CroppingType { HORIZONTAL = 0, VERTICAL = 1 };
193*4d7e907cSAndroid Build Coastguard Worker 
194*4d7e907cSAndroid Build Coastguard Worker // Aspect ratio is defined as width/height here and ExternalCameraDevice
195*4d7e907cSAndroid Build Coastguard Worker // will guarantee all supported sizes has width >= height (so aspect ratio >= 1.0)
196*4d7e907cSAndroid Build Coastguard Worker #define ASPECT_RATIO(sz) (static_cast<float>((sz).width) / (sz).height)
197*4d7e907cSAndroid Build Coastguard Worker const float kMaxAspectRatio = std::numeric_limits<float>::max();
198*4d7e907cSAndroid Build Coastguard Worker const float kMinAspectRatio = 1.f;
199*4d7e907cSAndroid Build Coastguard Worker 
200*4d7e907cSAndroid Build Coastguard Worker bool isAspectRatioClose(float ar1, float ar2);
201*4d7e907cSAndroid Build Coastguard Worker 
202*4d7e907cSAndroid Build Coastguard Worker struct HalStreamBuffer {
203*4d7e907cSAndroid Build Coastguard Worker     int32_t streamId;
204*4d7e907cSAndroid Build Coastguard Worker     int64_t bufferId;
205*4d7e907cSAndroid Build Coastguard Worker     int32_t width;
206*4d7e907cSAndroid Build Coastguard Worker     int32_t height;
207*4d7e907cSAndroid Build Coastguard Worker     ::aidl::android::hardware::graphics::common::PixelFormat format;
208*4d7e907cSAndroid Build Coastguard Worker     ::aidl::android::hardware::graphics::common::BufferUsage usage;
209*4d7e907cSAndroid Build Coastguard Worker     buffer_handle_t* bufPtr;
210*4d7e907cSAndroid Build Coastguard Worker     int acquireFence;
211*4d7e907cSAndroid Build Coastguard Worker     bool fenceTimeout;
212*4d7e907cSAndroid Build Coastguard Worker };
213*4d7e907cSAndroid Build Coastguard Worker 
214*4d7e907cSAndroid Build Coastguard Worker struct HalRequest {
215*4d7e907cSAndroid Build Coastguard Worker     int32_t frameNumber;
216*4d7e907cSAndroid Build Coastguard Worker     common::V1_0::helper::CameraMetadata setting;
217*4d7e907cSAndroid Build Coastguard Worker     std::shared_ptr<Frame> frameIn;
218*4d7e907cSAndroid Build Coastguard Worker     nsecs_t shutterTs;
219*4d7e907cSAndroid Build Coastguard Worker     std::vector<HalStreamBuffer> buffers;
220*4d7e907cSAndroid Build Coastguard Worker };
221*4d7e907cSAndroid Build Coastguard Worker 
222*4d7e907cSAndroid Build Coastguard Worker static const uint64_t BUFFER_ID_NO_BUFFER = 0;
223*4d7e907cSAndroid Build Coastguard Worker 
224*4d7e907cSAndroid Build Coastguard Worker // buffers currently circulating between HAL and camera service
225*4d7e907cSAndroid Build Coastguard Worker // key: bufferId sent via HIDL interface
226*4d7e907cSAndroid Build Coastguard Worker // value: imported buffer_handle_t
227*4d7e907cSAndroid Build Coastguard Worker // Buffer will be imported during processCaptureRequest (or requestStreamBuffer
228*4d7e907cSAndroid Build Coastguard Worker // in the case of HAL buffer manager is enabled) and will be freed
229*4d7e907cSAndroid Build Coastguard Worker // when the stream is deleted or camera device session is closed
230*4d7e907cSAndroid Build Coastguard Worker typedef std::unordered_map<uint64_t, buffer_handle_t> CirculatingBuffers;
231*4d7e907cSAndroid Build Coastguard Worker 
232*4d7e907cSAndroid Build Coastguard Worker aidl::android::hardware::camera::common::Status importBufferImpl(
233*4d7e907cSAndroid Build Coastguard Worker         /*inout*/ std::map<int, CirculatingBuffers>& circulatingBuffers,
234*4d7e907cSAndroid Build Coastguard Worker         /*inout*/ HandleImporter& handleImporter, int32_t streamId, uint64_t bufId,
235*4d7e907cSAndroid Build Coastguard Worker         buffer_handle_t buf,
236*4d7e907cSAndroid Build Coastguard Worker         /*out*/ buffer_handle_t** outBufPtr);
237*4d7e907cSAndroid Build Coastguard Worker 
238*4d7e907cSAndroid Build Coastguard Worker static const uint32_t FLEX_YUV_GENERIC =
239*4d7e907cSAndroid Build Coastguard Worker         static_cast<uint32_t>('F') | static_cast<uint32_t>('L') << 8 |
240*4d7e907cSAndroid Build Coastguard Worker         static_cast<uint32_t>('E') << 16 | static_cast<uint32_t>('X') << 24;
241*4d7e907cSAndroid Build Coastguard Worker 
242*4d7e907cSAndroid Build Coastguard Worker // returns FLEX_YUV_GENERIC for formats other than YV12/YU12/NV12/NV21
243*4d7e907cSAndroid Build Coastguard Worker uint32_t getFourCcFromLayout(const YCbCrLayout&);
244*4d7e907cSAndroid Build Coastguard Worker 
245*4d7e907cSAndroid Build Coastguard Worker using ::android::hardware::camera::external::common::Size;
246*4d7e907cSAndroid Build Coastguard Worker int getCropRect(CroppingType ct, const Size& inSize, const Size& outSize, IMapper::Rect* out);
247*4d7e907cSAndroid Build Coastguard Worker 
248*4d7e907cSAndroid Build Coastguard Worker int formatConvert(const YCbCrLayout& in, const YCbCrLayout& out, Size sz, uint32_t format);
249*4d7e907cSAndroid Build Coastguard Worker 
250*4d7e907cSAndroid Build Coastguard Worker int encodeJpegYU12(const Size& inSz, const YCbCrLayout& inLayout, int jpegQuality,
251*4d7e907cSAndroid Build Coastguard Worker                    const void* app1Buffer, size_t app1Size, void* out, size_t maxOutSize,
252*4d7e907cSAndroid Build Coastguard Worker                    size_t& actualCodeSize);
253*4d7e907cSAndroid Build Coastguard Worker 
254*4d7e907cSAndroid Build Coastguard Worker Size getMaxThumbnailResolution(const common::V1_0::helper::CameraMetadata&);
255*4d7e907cSAndroid Build Coastguard Worker 
256*4d7e907cSAndroid Build Coastguard Worker void freeReleaseFences(std::vector<CaptureResult>&);
257*4d7e907cSAndroid Build Coastguard Worker 
258*4d7e907cSAndroid Build Coastguard Worker status_t fillCaptureResultCommon(common::V1_0::helper::CameraMetadata& md, nsecs_t timestamp,
259*4d7e907cSAndroid Build Coastguard Worker                                  camera_metadata_ro_entry& activeArraySize);
260*4d7e907cSAndroid Build Coastguard Worker 
261*4d7e907cSAndroid Build Coastguard Worker // Interface for OutputThread calling back to parent
262*4d7e907cSAndroid Build Coastguard Worker struct OutputThreadInterface {
~OutputThreadInterfaceOutputThreadInterface263*4d7e907cSAndroid Build Coastguard Worker     virtual ~OutputThreadInterface() {}
264*4d7e907cSAndroid Build Coastguard Worker     virtual aidl::android::hardware::camera::common::Status importBuffer(
265*4d7e907cSAndroid Build Coastguard Worker             int32_t streamId, uint64_t bufId, buffer_handle_t buf,
266*4d7e907cSAndroid Build Coastguard Worker             /*out*/ buffer_handle_t** outBufPtr) = 0;
267*4d7e907cSAndroid Build Coastguard Worker 
268*4d7e907cSAndroid Build Coastguard Worker     virtual void notifyError(int32_t frameNumber, int32_t streamId, ErrorCode ec) = 0;
269*4d7e907cSAndroid Build Coastguard Worker 
270*4d7e907cSAndroid Build Coastguard Worker     // Callbacks are fired within the method if msgs/results are nullptr.
271*4d7e907cSAndroid Build Coastguard Worker     // Otherwise the callbacks will be returned and caller is responsible to
272*4d7e907cSAndroid Build Coastguard Worker     // fire the callback later
273*4d7e907cSAndroid Build Coastguard Worker     virtual aidl::android::hardware::camera::common::Status processCaptureRequestError(
274*4d7e907cSAndroid Build Coastguard Worker             const std::shared_ptr<HalRequest>&,
275*4d7e907cSAndroid Build Coastguard Worker             /*out*/ std::vector<NotifyMsg>* msgs,
276*4d7e907cSAndroid Build Coastguard Worker             /*out*/ std::vector<CaptureResult>* results) = 0;
277*4d7e907cSAndroid Build Coastguard Worker 
processCaptureRequestErrorOutputThreadInterface278*4d7e907cSAndroid Build Coastguard Worker     virtual aidl::android::hardware::camera::common::Status processCaptureRequestError(
279*4d7e907cSAndroid Build Coastguard Worker             const std::shared_ptr<HalRequest>& reqs) final {
280*4d7e907cSAndroid Build Coastguard Worker         return processCaptureRequestError(reqs, nullptr, nullptr);
281*4d7e907cSAndroid Build Coastguard Worker     }
282*4d7e907cSAndroid Build Coastguard Worker 
283*4d7e907cSAndroid Build Coastguard Worker     virtual aidl::android::hardware::camera::common::Status processCaptureResult(
284*4d7e907cSAndroid Build Coastguard Worker             std::shared_ptr<HalRequest>&) = 0;
285*4d7e907cSAndroid Build Coastguard Worker 
286*4d7e907cSAndroid Build Coastguard Worker     virtual ssize_t getJpegBufferSize(int32_t width, int32_t height) const = 0;
287*4d7e907cSAndroid Build Coastguard Worker };
288*4d7e907cSAndroid Build Coastguard Worker 
289*4d7e907cSAndroid Build Coastguard Worker // A CPU copy of a mapped V4L2Frame. Will map the input V4L2 frame.
290*4d7e907cSAndroid Build Coastguard Worker class AllocatedV4L2Frame : public Frame {
291*4d7e907cSAndroid Build Coastguard Worker   public:
292*4d7e907cSAndroid Build Coastguard Worker     AllocatedV4L2Frame(std::shared_ptr<V4L2Frame> frameIn);
293*4d7e907cSAndroid Build Coastguard Worker     ~AllocatedV4L2Frame() override;
294*4d7e907cSAndroid Build Coastguard Worker     virtual int getData(uint8_t** outData, size_t* dataSize) override;
295*4d7e907cSAndroid Build Coastguard Worker 
296*4d7e907cSAndroid Build Coastguard Worker   private:
297*4d7e907cSAndroid Build Coastguard Worker     std::vector<uint8_t> mData;
298*4d7e907cSAndroid Build Coastguard Worker };
299*4d7e907cSAndroid Build Coastguard Worker 
300*4d7e907cSAndroid Build Coastguard Worker }  // namespace implementation
301*4d7e907cSAndroid Build Coastguard Worker }  // namespace device
302*4d7e907cSAndroid Build Coastguard Worker }  // namespace camera
303*4d7e907cSAndroid Build Coastguard Worker }  // namespace hardware
304*4d7e907cSAndroid Build Coastguard Worker }  // namespace android
305*4d7e907cSAndroid Build Coastguard Worker 
306*4d7e907cSAndroid Build Coastguard Worker #endif  // HARDWARE_INTERFACES_CAMERA_DEVICE_DEFAULT_EXTERNALCAMERAUTILS_H_
307