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__ */