1 /* 2 * Copyright 2016 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 HDR_PLUS_CLIENT_H 18 #define HDR_PLUS_CLIENT_H 19 20 #include "CameraMetadata.h" 21 #include "hardware/camera3.h" 22 #include "HdrPlusClientListener.h" 23 #include "HdrPlusTypes.h" 24 25 using ::android::hardware::camera::common::V1_0::helper::CameraMetadata; 26 namespace android { 27 28 /** 29 * HdrPlusClient 30 * 31 * HdrPlusClient class can be used to connect to HDR+ service to perform HDR+ processing on 32 * Easel. 33 */ 34 class HdrPlusClient { 35 public: 36 // HdrPlusClientListener is the listener to receive callbacks from HDR+ client. The listener 37 // must be valid during the life cycle of HdrPlusClient HdrPlusClient(HdrPlusClientListener *)38 HdrPlusClient(HdrPlusClientListener *) {}; 39 /* 40 * The recommended way to create an HdrPlusClient instance is via 41 * EaselManagerClient::openHdrPlusClientAsync() or EaselManagerClient::openHdrPlusClientAsync(). 42 * EaselManagerClient will make sure Easel is in a valid state to open an HDR+ client. To close 43 * an HdrPlusClient, use EaselManagerClient::closeHdrPlusClient. 44 */ ~HdrPlusClient()45 virtual ~HdrPlusClient() {}; 46 47 /* 48 * Connect to HDR+ service. 49 * 50 * If EaselManagerClient is used to create the HdrPlusClient, it is already connected. 51 * 52 * Returns: 53 * 0: on success. 54 * -EEXIST: if it's already connected. 55 * -ENODEV: if connecting failed due to a serious error. 56 */ 57 virtual status_t connect() = 0; 58 59 /* 60 * Set the static metadata of current camera device. 61 * 62 * Must be called after connect() and before configuring streams. 63 * 64 * staticMetadata is the static metadata of current camera device. 65 * 66 * Returns: 67 * 0: on success. 68 * -ENODEV: if HDR+ service is not connected. 69 */ 70 virtual status_t setStaticMetadata(const camera_metadata_t &staticMetadata) = 0; 71 72 /* 73 * Configure streams. 74 * 75 * Must be called when configuration changes including input (sensor) resolution and format, and 76 * output resolutions and formats. 77 * 78 * inputConfig contains the information about the input frames or sensor configurations. 79 * outputConfigs is a vector of output stream configurations. 80 * 81 * Returns: 82 * 0: on success. 83 * -EINVAL: if outputConfigs is empty or the configurations are not supported. 84 * -ENODEV: if HDR+ service is not connected. 85 */ 86 virtual status_t configureStreams(const pbcamera::InputConfiguration &inputConfig, 87 const std::vector<pbcamera::StreamConfiguration> &outputConfigs) = 0; 88 89 /* 90 * Enable or disable ZSL HDR+ mode. 91 * 92 * When ZSL HDR+ mode is enabled, Easel will capture ZSL RAW buffers. ZSL HDR+ mode should be 93 * disabled to reduce power consumption when HDR+ processing is not necessary, e.g in video 94 * mode. 95 * 96 * enabled is a flag indicating whether to enable ZSL HDR+ mode. 97 * 98 * Returns: 99 * 0: on success. 100 * -ENODEV: if HDR+ service is not connected, or streams are not configured. 101 */ 102 virtual status_t setZslHdrPlusMode(bool enabled) = 0; 103 104 /* 105 * Submit a capture request for HDR+ outputs. 106 * 107 * For each output buffer in CaptureRequest, it will be returned in a CaptureResult via 108 * HdrPlusClientListener::onCaptureResult(). HdrPlusClientListener::onCaptureResult() may be 109 * invoked multiple times to return all output buffers in one CaptureRequest. Each output 110 * buffer will be returned in CaptureResult only once. 111 * 112 * request is a CaptureRequest containing output buffers to be filled by HDR+ service. 113 * requestMetadata is the metadata for this request. 114 * 115 * Returns: 116 * 0: on success. 117 * -EINVAL: if the request is invalid such as containing invalid stream IDs. 118 */ 119 virtual status_t submitCaptureRequest(pbcamera::CaptureRequest *request, 120 const CameraMetadata &requestMetadata) = 0; 121 122 /* 123 * Send an input buffer to HDR+ service. This is used when HDR+ service's input buffers come 124 * from the client rather than MIPI. 125 * 126 * inputBuffer is the input buffer to send to HDR+ service. After this method returns, the 127 * buffer has been copied (with DMA) to HDR+ service and the caller has the 128 * ownership of the buffer. 129 */ 130 virtual void notifyInputBuffer(const pbcamera::StreamBuffer &inputBuffer, 131 int64_t timestampNs) = 0; 132 133 /* 134 * Notify about result metadata of a frame that AP captured. This may be called multiple times 135 * for a frame to send multiple partial metadata and lastMetadata must be false except for the 136 * last partial metadata. When there is only one metadata for a frame, lastMetadata must be 137 * true. 138 * 139 * frameNumber is a unique frame number that the metadata belong to. 140 * resultMetadata is the result metadata of a frame that AP captured. 141 * lastMetadata is a flag indicating whether this is the last metadata for the frame number. 142 */ 143 virtual void notifyFrameMetadata(uint32_t frameNumber, const camera_metadata_t &resultMetadata, 144 bool lastMetadata=true) = 0; 145 146 /* 147 * Notify Easel has encountered a fatal error and HDR+ client should stop sending messages 148 * to Easel. 149 */ 150 virtual void nofityEaselFatalError() = 0; 151 152 private: 153 // Disallow copy and assign. 154 HdrPlusClient(const HdrPlusClient&) = delete; 155 void operator=(const HdrPlusClient&) = delete; 156 }; 157 158 } // namespace android 159 160 #endif // HDR_PLUS_CLIENT_H 161