16ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen/*
26ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen * Copyright 2017 The Android Open Source Project
36ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen *
46ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen * Licensed under the Apache License, Version 2.0 (the "License");
56ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen * you may not use this file except in compliance with the License.
66ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen * You may obtain a copy of the License at
76ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen *
86ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen *      http://www.apache.org/licenses/LICENSE-2.0
96ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen *
106ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen * Unless required by applicable law or agreed to in writing, software
116ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen * distributed under the License is distributed on an "AS IS" BASIS,
126ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen * See the License for the specific language governing permissions and
146ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen * limitations under the License.
156ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen */
166ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen#ifndef __HDRPLUSCLIENTLISTENERHANDLERTHREAD__
176ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen#define __HDRPLUSCLIENTLISTENERHANDLERTHREAD__
186ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen
196ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen// System dependencies
206ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen#include <utils/Thread.h>
216ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen#include <queue>
226ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen
236ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen#include "EaselManagerClient.h"
246ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen#include "HdrPlusClient.h"
256ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen
266ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chenusing ::android::hardware::camera::common::V1_0::helper::CameraMetadata;
276ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chenusing namespace android;
286ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen
296ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chennamespace qcamera {
306ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen
316ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen/*
326ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen * A thread to handle callbacks from HDR+ client. When a callback from HDR+ client is invoked,
336ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen * HDR+ client callback thread will return and the threadloop of QCamera3HdrPlusListenerThread
346ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen * will call the callback handlers in QCamera3HWI, to avoid deadlock in HDR+ client callback thread.
356ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen */
366ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chenclass QCamera3HdrPlusListenerThread : public HdrPlusClientListener, public Thread
376ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen{
386ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chenpublic:
396ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen    // listener is an HdrPlusClientListener to forward the callbacks in the thread loop.
406ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen    QCamera3HdrPlusListenerThread(HdrPlusClientListener *listener);
416ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen    virtual ~QCamera3HdrPlusListenerThread();
426ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen
436ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen    // Request the thread to exit.
446ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen    void requestExit() override;
456ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen
466ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chenprivate:
476ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen    // HDR+ client callbacks.
486ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen    void onOpened(std::unique_ptr<HdrPlusClient> client) override;
496ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen    void onOpenFailed(status_t err) override;
506ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen    void onFatalError() override;
516ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen    void onCaptureResult(pbcamera::CaptureResult *result,
526ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen            const camera_metadata_t &resultMetadata) override;
536ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen    void onFailedCaptureResult(pbcamera::CaptureResult *failedResult) override;
546ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen    void onShutter(uint32_t requestId, int64_t apSensorTimestampNs) override;
556ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen    void onNextCaptureReady(uint32_t requestId) override;
566ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen    void onPostview(uint32_t requestId, std::unique_ptr<std::vector<uint8_t>> postview,
576ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen            uint32_t width, uint32_t height, uint32_t stride, int32_t format) override;
586ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen
596ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen    bool threadLoop() override;
606ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen
616ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen    // The following functions handle the pending callbacks by calling the callback handlers
626ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen    // in QCamera3HWI.
636ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen    bool hasPendingEventsLocked();
646ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen    void handlePendingClient();
656ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen    void handleNextCaptureReady();
666ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen    void handleCaptureResult();
676ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen    void handleFatalError();
686ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen    void handleOpenError();
696ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen    void handleShutter();
706ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen    void handlePostview();
716ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen
726ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen    struct PendingResult {
736ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen        pbcamera::CaptureResult result;
746ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen        camera_metadata_t *metadata;
756ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen        bool isFailed;
766ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen    };
776ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen
786ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen    struct PendingPostview {
796ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen        uint32_t requestId;
806ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen        std::unique_ptr<std::vector<uint8_t>> postview;
816ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen        uint32_t width;
826ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen        uint32_t height;
836ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen        uint32_t stride;
846ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen        int32_t format;
856ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen    };
866ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen
876ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen    enum CallbackType {
886ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen        CALLBACK_TYPE_OPENED = 0,
896ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen        CALLBACK_TYPE_OPENFAILED,
906ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen        CALLBACK_TYPE_FATAL_ERROR,
916ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen        CALLBACK_TYPE_CAPTURE_RESULT,
926ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen        CALLBACK_TYPE_SHUTTER,
936ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen        CALLBACK_TYPE_NEXT_CAPTURE_READY,
946ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen        CALLBACK_TYPE_POSTVIEW,
956ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen    };
966ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen
976ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen    HdrPlusClientListener *mListener;
986ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen
996ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen    std::mutex mCallbackLock;
1006ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen
1016ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen    // Condition for a new callback. Protected by mCallbackLock.
1026ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen    std::condition_variable mCallbackCond;
1036ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen    // If exit has been requested. Protected by mCallbackLock.
1046ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen    bool mExitRequested;
1056ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen
1066ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen    // The following variables store pending callbacks. Protected by mCallbackLock.
1076ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen    std::unique_ptr<HdrPlusClient> mClient;
1086ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen    std::queue<uint32_t> mNextCaptureReadyIds;
1096ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen    std::queue<PendingResult> mResults;
1106ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen    bool mFatalError;
1116ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen    status_t mOpenError;
1126ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen    std::queue<std::pair<uint32_t, int64_t>> mShutters;
1136ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen    std::queue<PendingPostview> mPostviews;
1146ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen
1156ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen    // A queue of pending callback types, in the same order as invoked by HDR+ client.
1166ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen    // Protected by mCallbackLock.
1176ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen    std::queue<CallbackType> mPendingCallbacks;
1186ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen};
1196ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen
1206ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen}; // namespace qcamera
1216ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen
1226ed36ca0e31f927e8ae93c51ef8c0733a9e2aa05Chien-Yu Chen#endif /* __HDRPLUSCLIENTLISTENERHANDLERTHREAD__ */