13abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen/* 23abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen * Copyright 2016 The Android Open Source Project 33abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen * 43abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen * Licensed under the Apache License, Version 2.0 (the "License"); 53abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen * you may not use this file except in compliance with the License. 63abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen * You may obtain a copy of the License at 73abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen * 83abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen * http://www.apache.org/licenses/LICENSE-2.0 93abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen * 103abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen * Unless required by applicable law or agreed to in writing, software 113abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen * distributed under the License is distributed on an "AS IS" BASIS, 123abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 133abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen * See the License for the specific language governing permissions and 143abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen * limitations under the License. 153abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen */ 163abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen 173abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen#ifndef HDR_PLUS_CLIENT_H 183abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen#define HDR_PLUS_CLIENT_H 193abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen 20acd7b6df604b58a2074dbab75332808ac8485963Chien-Yu Chen#include "CameraMetadata.h" 213abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen#include "hardware/camera3.h" 223abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen#include "HdrPlusClientListener.h" 233abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen#include "HdrPlusTypes.h" 243abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen 25acd7b6df604b58a2074dbab75332808ac8485963Chien-Yu Chenusing ::android::hardware::camera::common::V1_0::helper::CameraMetadata; 263abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chennamespace android { 273abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen 283abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen/** 293abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen * HdrPlusClient 303abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen * 313abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen * HdrPlusClient class can be used to connect to HDR+ service to perform HDR+ processing on 323abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen * Easel. 333abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen */ 343abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chenclass HdrPlusClient { 353abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chenpublic: 361e830e1db2f5600eeedb8d7ed0a3abcf6770497dChien-Yu Chen // HdrPlusClientListener is the listener to receive callbacks from HDR+ client. The listener 371e830e1db2f5600eeedb8d7ed0a3abcf6770497dChien-Yu Chen // must be valid during the life cycle of HdrPlusClient 381e830e1db2f5600eeedb8d7ed0a3abcf6770497dChien-Yu Chen HdrPlusClient(HdrPlusClientListener *) {}; 393abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen /* 403abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen * The recommended way to create an HdrPlusClient instance is via 413abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen * EaselManagerClient::openHdrPlusClientAsync() or EaselManagerClient::openHdrPlusClientAsync(). 423abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen * EaselManagerClient will make sure Easel is in a valid state to open an HDR+ client. To close 433abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen * an HdrPlusClient, use EaselManagerClient::closeHdrPlusClient. 443abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen */ 453abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen virtual ~HdrPlusClient() {}; 463abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen 473abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen /* 483abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen * Connect to HDR+ service. 493abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen * 503abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen * If EaselManagerClient is used to create the HdrPlusClient, it is already connected. 513abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen * 523abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen * Returns: 533abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen * 0: on success. 543abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen * -EEXIST: if it's already connected. 553abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen * -ENODEV: if connecting failed due to a serious error. 563abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen */ 571e830e1db2f5600eeedb8d7ed0a3abcf6770497dChien-Yu Chen virtual status_t connect() = 0; 583abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen 593abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen /* 603abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen * Set the static metadata of current camera device. 613abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen * 623abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen * Must be called after connect() and before configuring streams. 633abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen * 643abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen * staticMetadata is the static metadata of current camera device. 653abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen * 663abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen * Returns: 673abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen * 0: on success. 683abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen * -ENODEV: if HDR+ service is not connected. 693abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen */ 703abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen virtual status_t setStaticMetadata(const camera_metadata_t &staticMetadata) = 0; 713abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen 723abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen /* 733abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen * Configure streams. 743abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen * 753abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen * Must be called when configuration changes including input (sensor) resolution and format, and 763abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen * output resolutions and formats. 773abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen * 783abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen * inputConfig contains the information about the input frames or sensor configurations. 793abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen * outputConfigs is a vector of output stream configurations. 803abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen * 813abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen * Returns: 823abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen * 0: on success. 833abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen * -EINVAL: if outputConfigs is empty or the configurations are not supported. 843abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen * -ENODEV: if HDR+ service is not connected. 853abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen */ 863abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen virtual status_t configureStreams(const pbcamera::InputConfiguration &inputConfig, 873abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen const std::vector<pbcamera::StreamConfiguration> &outputConfigs) = 0; 883abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen 893abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen /* 903abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen * Enable or disable ZSL HDR+ mode. 913abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen * 923abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen * When ZSL HDR+ mode is enabled, Easel will capture ZSL RAW buffers. ZSL HDR+ mode should be 933abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen * disabled to reduce power consumption when HDR+ processing is not necessary, e.g in video 943abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen * mode. 953abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen * 963abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen * enabled is a flag indicating whether to enable ZSL HDR+ mode. 973abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen * 983abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen * Returns: 993abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen * 0: on success. 1003abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen * -ENODEV: if HDR+ service is not connected, or streams are not configured. 1013abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen */ 1023abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen virtual status_t setZslHdrPlusMode(bool enabled) = 0; 1033abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen 1043abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen /* 1053abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen * Submit a capture request for HDR+ outputs. 1063abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen * 1073abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen * For each output buffer in CaptureRequest, it will be returned in a CaptureResult via 1083abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen * HdrPlusClientListener::onCaptureResult(). HdrPlusClientListener::onCaptureResult() may be 1093abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen * invoked multiple times to return all output buffers in one CaptureRequest. Each output 1103abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen * buffer will be returned in CaptureResult only once. 1113abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen * 1123abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen * request is a CaptureRequest containing output buffers to be filled by HDR+ service. 113acd7b6df604b58a2074dbab75332808ac8485963Chien-Yu Chen * requestMetadata is the metadata for this request. 1143abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen * 1153abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen * Returns: 1163abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen * 0: on success. 1173abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen * -EINVAL: if the request is invalid such as containing invalid stream IDs. 1183abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen */ 119acd7b6df604b58a2074dbab75332808ac8485963Chien-Yu Chen virtual status_t submitCaptureRequest(pbcamera::CaptureRequest *request, 120acd7b6df604b58a2074dbab75332808ac8485963Chien-Yu Chen const CameraMetadata &requestMetadata) = 0; 1213abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen 1223abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen /* 1233abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen * Send an input buffer to HDR+ service. This is used when HDR+ service's input buffers come 1243abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen * from the client rather than MIPI. 1253abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen * 1263abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen * inputBuffer is the input buffer to send to HDR+ service. After this method returns, the 1273abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen * buffer has been copied (with DMA) to HDR+ service and the caller has the 1283abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen * ownership of the buffer. 1293abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen */ 1303abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen virtual void notifyInputBuffer(const pbcamera::StreamBuffer &inputBuffer, 1313abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen int64_t timestampNs) = 0; 1323abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen 1333abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen /* 1343abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen * Notify about result metadata of a frame that AP captured. This may be called multiple times 1353abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen * for a frame to send multiple partial metadata and lastMetadata must be false except for the 1363abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen * last partial metadata. When there is only one metadata for a frame, lastMetadata must be 1373abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen * true. 1383abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen * 1393abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen * frameNumber is a unique frame number that the metadata belong to. 1403abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen * resultMetadata is the result metadata of a frame that AP captured. 1413abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen * lastMetadata is a flag indicating whether this is the last metadata for the frame number. 1423abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen */ 1433abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen virtual void notifyFrameMetadata(uint32_t frameNumber, const camera_metadata_t &resultMetadata, 1443abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen bool lastMetadata=true) = 0; 1453abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen 14672865869512448012c5691889acd741bfef5c574Chien-Yu Chen /* 14772865869512448012c5691889acd741bfef5c574Chien-Yu Chen * Notify Easel has encountered a fatal error and HDR+ client should stop sending messages 14872865869512448012c5691889acd741bfef5c574Chien-Yu Chen * to Easel. 14972865869512448012c5691889acd741bfef5c574Chien-Yu Chen */ 15072865869512448012c5691889acd741bfef5c574Chien-Yu Chen virtual void nofityEaselFatalError() = 0; 15172865869512448012c5691889acd741bfef5c574Chien-Yu Chen 1523abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chenprivate: 1533abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen // Disallow copy and assign. 1543abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen HdrPlusClient(const HdrPlusClient&) = delete; 1553abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen void operator=(const HdrPlusClient&) = delete; 1563abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen}; 1573abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen 1583abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen} // namespace android 1593abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen 1603abce7438ef6a0a79483ccba9d706e312242be96Chien-Yu Chen#endif // HDR_PLUS_CLIENT_H 161