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