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