18a94683196406b83b14218d1beef66067f126a16keunyoung/* 28a94683196406b83b14218d1beef66067f126a16keunyoung * Copyright (C) 2012 The Android Open Source Project 38a94683196406b83b14218d1beef66067f126a16keunyoung * 48a94683196406b83b14218d1beef66067f126a16keunyoung * Licensed under the Apache License, Version 2.0 (the "License"); 58a94683196406b83b14218d1beef66067f126a16keunyoung * you may not use this file except in compliance with the License. 68a94683196406b83b14218d1beef66067f126a16keunyoung * You may obtain a copy of the License at 78a94683196406b83b14218d1beef66067f126a16keunyoung * 88a94683196406b83b14218d1beef66067f126a16keunyoung * http://www.apache.org/licenses/LICENSE-2.0 98a94683196406b83b14218d1beef66067f126a16keunyoung * 108a94683196406b83b14218d1beef66067f126a16keunyoung * Unless required by applicable law or agreed to in writing, software 118a94683196406b83b14218d1beef66067f126a16keunyoung * distributed under the License is distributed on an "AS IS" BASIS, 128a94683196406b83b14218d1beef66067f126a16keunyoung * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 138a94683196406b83b14218d1beef66067f126a16keunyoung * See the License for the specific language governing permissions and 148a94683196406b83b14218d1beef66067f126a16keunyoung * limitations under the License. 158a94683196406b83b14218d1beef66067f126a16keunyoung */ 168a94683196406b83b14218d1beef66067f126a16keunyoung 178a94683196406b83b14218d1beef66067f126a16keunyoung/* 188a94683196406b83b14218d1beef66067f126a16keunyoung * Contains implementation of a class EmulatedFakeCamera2 that encapsulates 198a94683196406b83b14218d1beef66067f126a16keunyoung * functionality of an advanced fake camera. 208a94683196406b83b14218d1beef66067f126a16keunyoung */ 218a94683196406b83b14218d1beef66067f126a16keunyoung 223725c7c982eac52ec64a625e82f306822452941cColin Cross#include <inttypes.h> 233725c7c982eac52ec64a625e82f306822452941cColin Cross 248a94683196406b83b14218d1beef66067f126a16keunyoung//#define LOG_NDEBUG 0 258a94683196406b83b14218d1beef66067f126a16keunyoung#define LOG_TAG "EmulatedCamera_FakeCamera2" 268a94683196406b83b14218d1beef66067f126a16keunyoung#include <utils/Log.h> 278a94683196406b83b14218d1beef66067f126a16keunyoung 288a94683196406b83b14218d1beef66067f126a16keunyoung#include "EmulatedFakeCamera2.h" 298a94683196406b83b14218d1beef66067f126a16keunyoung#include "EmulatedCameraFactory.h" 308a94683196406b83b14218d1beef66067f126a16keunyoung#include <ui/Rect.h> 318a94683196406b83b14218d1beef66067f126a16keunyoung#include <ui/GraphicBufferMapper.h> 328a94683196406b83b14218d1beef66067f126a16keunyoung#include "gralloc_cb.h" 338a94683196406b83b14218d1beef66067f126a16keunyoung 347e145808ae3a1b17c0ce4baf06199153ff4e9e9bChih-Hung Hsieh#define ERROR_CAMERA_NOT_PRESENT (-EPIPE) 354dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin 364dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin#define CAMERA2_EXT_TRIGGER_TESTING_DISCONNECT 0xFFFFFFFF 374dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin 388a94683196406b83b14218d1beef66067f126a16keunyoungnamespace android { 398a94683196406b83b14218d1beef66067f126a16keunyoung 408a94683196406b83b14218d1beef66067f126a16keunyoungconst int64_t USEC = 1000LL; 418a94683196406b83b14218d1beef66067f126a16keunyoungconst int64_t MSEC = USEC * 1000LL; 428a94683196406b83b14218d1beef66067f126a16keunyoungconst int64_t SEC = MSEC * 1000LL; 438a94683196406b83b14218d1beef66067f126a16keunyoung 448a94683196406b83b14218d1beef66067f126a16keunyoungconst uint32_t EmulatedFakeCamera2::kAvailableFormats[4] = { 45b30540c189f3e7d2bd77c783ecf50647921d3afdEino-Ville Talvala HAL_PIXEL_FORMAT_RAW16, 468a94683196406b83b14218d1beef66067f126a16keunyoung HAL_PIXEL_FORMAT_BLOB, 478a94683196406b83b14218d1beef66067f126a16keunyoung HAL_PIXEL_FORMAT_RGBA_8888, 488a94683196406b83b14218d1beef66067f126a16keunyoung // HAL_PIXEL_FORMAT_YV12, 498a94683196406b83b14218d1beef66067f126a16keunyoung HAL_PIXEL_FORMAT_YCrCb_420_SP 508a94683196406b83b14218d1beef66067f126a16keunyoung}; 518a94683196406b83b14218d1beef66067f126a16keunyoung 528a94683196406b83b14218d1beef66067f126a16keunyoungconst uint32_t EmulatedFakeCamera2::kAvailableRawSizes[2] = { 538a94683196406b83b14218d1beef66067f126a16keunyoung 640, 480 548a94683196406b83b14218d1beef66067f126a16keunyoung // Sensor::kResolution[0], Sensor::kResolution[1] 558a94683196406b83b14218d1beef66067f126a16keunyoung}; 568a94683196406b83b14218d1beef66067f126a16keunyoung 578a94683196406b83b14218d1beef66067f126a16keunyoungconst uint64_t EmulatedFakeCamera2::kAvailableRawMinDurations[1] = { 5879f8dcdb2da221f2e6992f53a83c36b95332fc2eEino-Ville Talvala static_cast<uint64_t>(Sensor::kFrameDurationRange[0]) 598a94683196406b83b14218d1beef66067f126a16keunyoung}; 608a94683196406b83b14218d1beef66067f126a16keunyoung 618a94683196406b83b14218d1beef66067f126a16keunyoungconst uint32_t EmulatedFakeCamera2::kAvailableProcessedSizesBack[4] = { 628a94683196406b83b14218d1beef66067f126a16keunyoung 640, 480, 320, 240 638a94683196406b83b14218d1beef66067f126a16keunyoung // Sensor::kResolution[0], Sensor::kResolution[1] 648a94683196406b83b14218d1beef66067f126a16keunyoung}; 658a94683196406b83b14218d1beef66067f126a16keunyoung 668a94683196406b83b14218d1beef66067f126a16keunyoungconst uint32_t EmulatedFakeCamera2::kAvailableProcessedSizesFront[4] = { 678a94683196406b83b14218d1beef66067f126a16keunyoung 320, 240, 160, 120 688a94683196406b83b14218d1beef66067f126a16keunyoung // Sensor::kResolution[0], Sensor::kResolution[1] 698a94683196406b83b14218d1beef66067f126a16keunyoung}; 708a94683196406b83b14218d1beef66067f126a16keunyoung 718a94683196406b83b14218d1beef66067f126a16keunyoungconst uint64_t EmulatedFakeCamera2::kAvailableProcessedMinDurations[1] = { 7279f8dcdb2da221f2e6992f53a83c36b95332fc2eEino-Ville Talvala static_cast<uint64_t>(Sensor::kFrameDurationRange[0]) 738a94683196406b83b14218d1beef66067f126a16keunyoung}; 748a94683196406b83b14218d1beef66067f126a16keunyoung 758a94683196406b83b14218d1beef66067f126a16keunyoungconst uint32_t EmulatedFakeCamera2::kAvailableJpegSizesBack[2] = { 768a94683196406b83b14218d1beef66067f126a16keunyoung 640, 480 778a94683196406b83b14218d1beef66067f126a16keunyoung // Sensor::kResolution[0], Sensor::kResolution[1] 788a94683196406b83b14218d1beef66067f126a16keunyoung}; 798a94683196406b83b14218d1beef66067f126a16keunyoung 808a94683196406b83b14218d1beef66067f126a16keunyoungconst uint32_t EmulatedFakeCamera2::kAvailableJpegSizesFront[2] = { 818a94683196406b83b14218d1beef66067f126a16keunyoung 320, 240 828a94683196406b83b14218d1beef66067f126a16keunyoung // Sensor::kResolution[0], Sensor::kResolution[1] 838a94683196406b83b14218d1beef66067f126a16keunyoung}; 848a94683196406b83b14218d1beef66067f126a16keunyoung 858a94683196406b83b14218d1beef66067f126a16keunyoung 868a94683196406b83b14218d1beef66067f126a16keunyoungconst uint64_t EmulatedFakeCamera2::kAvailableJpegMinDurations[1] = { 8779f8dcdb2da221f2e6992f53a83c36b95332fc2eEino-Ville Talvala static_cast<uint64_t>(Sensor::kFrameDurationRange[0]) 888a94683196406b83b14218d1beef66067f126a16keunyoung}; 898a94683196406b83b14218d1beef66067f126a16keunyoung 908a94683196406b83b14218d1beef66067f126a16keunyoung 918a94683196406b83b14218d1beef66067f126a16keunyoungEmulatedFakeCamera2::EmulatedFakeCamera2(int cameraId, 928a94683196406b83b14218d1beef66067f126a16keunyoung bool facingBack, 938a94683196406b83b14218d1beef66067f126a16keunyoung struct hw_module_t* module) 948a94683196406b83b14218d1beef66067f126a16keunyoung : EmulatedCamera2(cameraId,module), 954dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin mFacingBack(facingBack), 964dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin mIsConnected(false) 978a94683196406b83b14218d1beef66067f126a16keunyoung{ 988a94683196406b83b14218d1beef66067f126a16keunyoung ALOGD("Constructing emulated fake camera 2 facing %s", 998a94683196406b83b14218d1beef66067f126a16keunyoung facingBack ? "back" : "front"); 1008a94683196406b83b14218d1beef66067f126a16keunyoung} 1018a94683196406b83b14218d1beef66067f126a16keunyoung 1028a94683196406b83b14218d1beef66067f126a16keunyoungEmulatedFakeCamera2::~EmulatedFakeCamera2() { 1038a94683196406b83b14218d1beef66067f126a16keunyoung if (mCameraInfo != NULL) { 1048a94683196406b83b14218d1beef66067f126a16keunyoung free_camera_metadata(mCameraInfo); 1058a94683196406b83b14218d1beef66067f126a16keunyoung } 1068a94683196406b83b14218d1beef66067f126a16keunyoung} 1078a94683196406b83b14218d1beef66067f126a16keunyoung 1088a94683196406b83b14218d1beef66067f126a16keunyoung/**************************************************************************** 1098a94683196406b83b14218d1beef66067f126a16keunyoung * Public API overrides 1108a94683196406b83b14218d1beef66067f126a16keunyoung ***************************************************************************/ 1118a94683196406b83b14218d1beef66067f126a16keunyoung 1128a94683196406b83b14218d1beef66067f126a16keunyoungstatus_t EmulatedFakeCamera2::Initialize() { 1138a94683196406b83b14218d1beef66067f126a16keunyoung status_t res; 1148a94683196406b83b14218d1beef66067f126a16keunyoung 1158a94683196406b83b14218d1beef66067f126a16keunyoung res = constructStaticInfo(&mCameraInfo, true); 1168a94683196406b83b14218d1beef66067f126a16keunyoung if (res != OK) { 1178a94683196406b83b14218d1beef66067f126a16keunyoung ALOGE("%s: Unable to allocate static info: %s (%d)", 1188a94683196406b83b14218d1beef66067f126a16keunyoung __FUNCTION__, strerror(-res), res); 1198a94683196406b83b14218d1beef66067f126a16keunyoung return res; 1208a94683196406b83b14218d1beef66067f126a16keunyoung } 1218a94683196406b83b14218d1beef66067f126a16keunyoung res = constructStaticInfo(&mCameraInfo, false); 1228a94683196406b83b14218d1beef66067f126a16keunyoung if (res != OK) { 1238a94683196406b83b14218d1beef66067f126a16keunyoung ALOGE("%s: Unable to fill in static info: %s (%d)", 1248a94683196406b83b14218d1beef66067f126a16keunyoung __FUNCTION__, strerror(-res), res); 1258a94683196406b83b14218d1beef66067f126a16keunyoung return res; 1268a94683196406b83b14218d1beef66067f126a16keunyoung } 1278a94683196406b83b14218d1beef66067f126a16keunyoung if (res != OK) return res; 1288a94683196406b83b14218d1beef66067f126a16keunyoung 1298a94683196406b83b14218d1beef66067f126a16keunyoung mNextStreamId = 1; 1308a94683196406b83b14218d1beef66067f126a16keunyoung mNextReprocessStreamId = 1; 1318a94683196406b83b14218d1beef66067f126a16keunyoung mRawStreamCount = 0; 1328a94683196406b83b14218d1beef66067f126a16keunyoung mProcessedStreamCount = 0; 1338a94683196406b83b14218d1beef66067f126a16keunyoung mJpegStreamCount = 0; 1348a94683196406b83b14218d1beef66067f126a16keunyoung mReprocessStreamCount = 0; 1358a94683196406b83b14218d1beef66067f126a16keunyoung 1368a94683196406b83b14218d1beef66067f126a16keunyoung return NO_ERROR; 1378a94683196406b83b14218d1beef66067f126a16keunyoung} 1388a94683196406b83b14218d1beef66067f126a16keunyoung 1398a94683196406b83b14218d1beef66067f126a16keunyoung/**************************************************************************** 1408a94683196406b83b14218d1beef66067f126a16keunyoung * Camera module API overrides 1418a94683196406b83b14218d1beef66067f126a16keunyoung ***************************************************************************/ 1428a94683196406b83b14218d1beef66067f126a16keunyoung 1438a94683196406b83b14218d1beef66067f126a16keunyoungstatus_t EmulatedFakeCamera2::connectCamera(hw_device_t** device) { 1448a94683196406b83b14218d1beef66067f126a16keunyoung status_t res; 1458a94683196406b83b14218d1beef66067f126a16keunyoung ALOGV("%s", __FUNCTION__); 1468a94683196406b83b14218d1beef66067f126a16keunyoung 1474dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin { 1484dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin Mutex::Autolock l(mMutex); 1494dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin if (!mStatusPresent) { 1504dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin ALOGE("%s: Camera ID %d is unplugged", __FUNCTION__, 1514dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin mCameraID); 1524dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin return -ENODEV; 1534dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin } 1544dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin } 1554dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin 1568a94683196406b83b14218d1beef66067f126a16keunyoung mConfigureThread = new ConfigureThread(this); 1578a94683196406b83b14218d1beef66067f126a16keunyoung mReadoutThread = new ReadoutThread(this); 1588a94683196406b83b14218d1beef66067f126a16keunyoung mControlThread = new ControlThread(this); 1592de81ad1fbadb0b2dd26830f6bb97c19c783969fEino-Ville Talvala mSensor = new Sensor(); 16057ac67ad91c44ffd875b186f124234c2ab1958f3Eino-Ville Talvala mJpegCompressor = new JpegCompressor(); 1618a94683196406b83b14218d1beef66067f126a16keunyoung 1628a94683196406b83b14218d1beef66067f126a16keunyoung mNextStreamId = 1; 1638a94683196406b83b14218d1beef66067f126a16keunyoung mNextReprocessStreamId = 1; 1648a94683196406b83b14218d1beef66067f126a16keunyoung 1658a94683196406b83b14218d1beef66067f126a16keunyoung res = mSensor->startUp(); 1668a94683196406b83b14218d1beef66067f126a16keunyoung if (res != NO_ERROR) return res; 1678a94683196406b83b14218d1beef66067f126a16keunyoung 1688a94683196406b83b14218d1beef66067f126a16keunyoung res = mConfigureThread->run("EmulatedFakeCamera2::configureThread"); 1698a94683196406b83b14218d1beef66067f126a16keunyoung if (res != NO_ERROR) return res; 1708a94683196406b83b14218d1beef66067f126a16keunyoung 1718a94683196406b83b14218d1beef66067f126a16keunyoung res = mReadoutThread->run("EmulatedFakeCamera2::readoutThread"); 1728a94683196406b83b14218d1beef66067f126a16keunyoung if (res != NO_ERROR) return res; 1738a94683196406b83b14218d1beef66067f126a16keunyoung 1748a94683196406b83b14218d1beef66067f126a16keunyoung res = mControlThread->run("EmulatedFakeCamera2::controlThread"); 1758a94683196406b83b14218d1beef66067f126a16keunyoung if (res != NO_ERROR) return res; 1768a94683196406b83b14218d1beef66067f126a16keunyoung 1774dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin status_t ret = EmulatedCamera2::connectCamera(device); 1784dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin 1794dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin if (ret >= 0) { 1804dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin mIsConnected = true; 1814dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin } 1824dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin 1834dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin return ret; 1844dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin} 1854dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin 1864dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkinstatus_t EmulatedFakeCamera2::plugCamera() { 1874dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin { 1884dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin Mutex::Autolock l(mMutex); 1894dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin 1904dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin if (!mStatusPresent) { 1914dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin ALOGI("%s: Plugged back in", __FUNCTION__); 1924dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin mStatusPresent = true; 1934dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin } 1944dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin } 1954dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin 1964dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin return NO_ERROR; 1974dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin} 1984dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin 1994dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkinstatus_t EmulatedFakeCamera2::unplugCamera() { 2004dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin { 2014dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin Mutex::Autolock l(mMutex); 2024dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin 2034dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin if (mStatusPresent) { 2044dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin ALOGI("%s: Unplugged camera", __FUNCTION__); 2054dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin mStatusPresent = false; 2064dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin } 2074dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin } 2084dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin 2094dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin return closeCamera(); 2104dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin} 2114dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin 2124dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkincamera_device_status_t EmulatedFakeCamera2::getHotplugStatus() { 2134dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin Mutex::Autolock l(mMutex); 2144dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin return mStatusPresent ? 2154dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin CAMERA_DEVICE_STATUS_PRESENT : 2164dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin CAMERA_DEVICE_STATUS_NOT_PRESENT; 2178a94683196406b83b14218d1beef66067f126a16keunyoung} 2188a94683196406b83b14218d1beef66067f126a16keunyoung 2194dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin 2204dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin 2218a94683196406b83b14218d1beef66067f126a16keunyoungstatus_t EmulatedFakeCamera2::closeCamera() { 2228a94683196406b83b14218d1beef66067f126a16keunyoung { 2238a94683196406b83b14218d1beef66067f126a16keunyoung Mutex::Autolock l(mMutex); 2248a94683196406b83b14218d1beef66067f126a16keunyoung 2258a94683196406b83b14218d1beef66067f126a16keunyoung status_t res; 2268a94683196406b83b14218d1beef66067f126a16keunyoung ALOGV("%s", __FUNCTION__); 2278a94683196406b83b14218d1beef66067f126a16keunyoung 2284dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin if (!mIsConnected) { 2294dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin return NO_ERROR; 2304dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin } 2314dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin 2328a94683196406b83b14218d1beef66067f126a16keunyoung res = mSensor->shutDown(); 2338a94683196406b83b14218d1beef66067f126a16keunyoung if (res != NO_ERROR) { 2348a94683196406b83b14218d1beef66067f126a16keunyoung ALOGE("%s: Unable to shut down sensor: %d", __FUNCTION__, res); 2358a94683196406b83b14218d1beef66067f126a16keunyoung return res; 2368a94683196406b83b14218d1beef66067f126a16keunyoung } 2378a94683196406b83b14218d1beef66067f126a16keunyoung 2388a94683196406b83b14218d1beef66067f126a16keunyoung mConfigureThread->requestExit(); 2398a94683196406b83b14218d1beef66067f126a16keunyoung mReadoutThread->requestExit(); 2408a94683196406b83b14218d1beef66067f126a16keunyoung mControlThread->requestExit(); 2418a94683196406b83b14218d1beef66067f126a16keunyoung mJpegCompressor->cancel(); 2428a94683196406b83b14218d1beef66067f126a16keunyoung } 2438a94683196406b83b14218d1beef66067f126a16keunyoung 2448a94683196406b83b14218d1beef66067f126a16keunyoung // give up the lock since we will now block and the threads 2458a94683196406b83b14218d1beef66067f126a16keunyoung // can call back into this object 2468a94683196406b83b14218d1beef66067f126a16keunyoung mConfigureThread->join(); 2478a94683196406b83b14218d1beef66067f126a16keunyoung mReadoutThread->join(); 2488a94683196406b83b14218d1beef66067f126a16keunyoung mControlThread->join(); 2498a94683196406b83b14218d1beef66067f126a16keunyoung 2508a94683196406b83b14218d1beef66067f126a16keunyoung ALOGV("%s exit", __FUNCTION__); 2514dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin 2524dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin { 2534dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin Mutex::Autolock l(mMutex); 2544dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin mIsConnected = false; 2554dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin } 2564dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin 2578a94683196406b83b14218d1beef66067f126a16keunyoung return NO_ERROR; 2588a94683196406b83b14218d1beef66067f126a16keunyoung} 2598a94683196406b83b14218d1beef66067f126a16keunyoung 2608a94683196406b83b14218d1beef66067f126a16keunyoungstatus_t EmulatedFakeCamera2::getCameraInfo(struct camera_info *info) { 2618a94683196406b83b14218d1beef66067f126a16keunyoung info->facing = mFacingBack ? CAMERA_FACING_BACK : CAMERA_FACING_FRONT; 2628a94683196406b83b14218d1beef66067f126a16keunyoung info->orientation = gEmulatedCameraFactory.getFakeCameraOrientation(); 2638a94683196406b83b14218d1beef66067f126a16keunyoung return EmulatedCamera2::getCameraInfo(info); 2648a94683196406b83b14218d1beef66067f126a16keunyoung} 2658a94683196406b83b14218d1beef66067f126a16keunyoung 2668a94683196406b83b14218d1beef66067f126a16keunyoung/**************************************************************************** 2678a94683196406b83b14218d1beef66067f126a16keunyoung * Camera device API overrides 2688a94683196406b83b14218d1beef66067f126a16keunyoung ***************************************************************************/ 2698a94683196406b83b14218d1beef66067f126a16keunyoung 2708a94683196406b83b14218d1beef66067f126a16keunyoung/** Request input queue */ 2718a94683196406b83b14218d1beef66067f126a16keunyoung 2728a94683196406b83b14218d1beef66067f126a16keunyoungint EmulatedFakeCamera2::requestQueueNotify() { 2738a94683196406b83b14218d1beef66067f126a16keunyoung ALOGV("Request queue notification received"); 2748a94683196406b83b14218d1beef66067f126a16keunyoung 2758a94683196406b83b14218d1beef66067f126a16keunyoung ALOG_ASSERT(mRequestQueueSrc != NULL, 2768a94683196406b83b14218d1beef66067f126a16keunyoung "%s: Request queue src not set, but received queue notification!", 2778a94683196406b83b14218d1beef66067f126a16keunyoung __FUNCTION__); 2788a94683196406b83b14218d1beef66067f126a16keunyoung ALOG_ASSERT(mFrameQueueDst != NULL, 2798a94683196406b83b14218d1beef66067f126a16keunyoung "%s: Request queue src not set, but received queue notification!", 2808a94683196406b83b14218d1beef66067f126a16keunyoung __FUNCTION__); 2818a94683196406b83b14218d1beef66067f126a16keunyoung ALOG_ASSERT(mStreams.size() != 0, 2828a94683196406b83b14218d1beef66067f126a16keunyoung "%s: No streams allocated, but received queue notification!", 2838a94683196406b83b14218d1beef66067f126a16keunyoung __FUNCTION__); 2848a94683196406b83b14218d1beef66067f126a16keunyoung return mConfigureThread->newRequestAvailable(); 2858a94683196406b83b14218d1beef66067f126a16keunyoung} 2868a94683196406b83b14218d1beef66067f126a16keunyoung 2878a94683196406b83b14218d1beef66067f126a16keunyoungint EmulatedFakeCamera2::getInProgressCount() { 2888a94683196406b83b14218d1beef66067f126a16keunyoung Mutex::Autolock l(mMutex); 2898a94683196406b83b14218d1beef66067f126a16keunyoung 2904dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin if (!mStatusPresent) { 2914dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin ALOGW("%s: Camera was physically disconnected", __FUNCTION__); 2924dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin return ERROR_CAMERA_NOT_PRESENT; 2934dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin } 2944dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin 2958a94683196406b83b14218d1beef66067f126a16keunyoung int requestCount = 0; 2968a94683196406b83b14218d1beef66067f126a16keunyoung requestCount += mConfigureThread->getInProgressCount(); 2978a94683196406b83b14218d1beef66067f126a16keunyoung requestCount += mReadoutThread->getInProgressCount(); 2988a94683196406b83b14218d1beef66067f126a16keunyoung requestCount += mJpegCompressor->isBusy() ? 1 : 0; 2998a94683196406b83b14218d1beef66067f126a16keunyoung 3008a94683196406b83b14218d1beef66067f126a16keunyoung return requestCount; 3018a94683196406b83b14218d1beef66067f126a16keunyoung} 3028a94683196406b83b14218d1beef66067f126a16keunyoung 3038a94683196406b83b14218d1beef66067f126a16keunyoungint EmulatedFakeCamera2::constructDefaultRequest( 3048a94683196406b83b14218d1beef66067f126a16keunyoung int request_template, 3058a94683196406b83b14218d1beef66067f126a16keunyoung camera_metadata_t **request) { 3068a94683196406b83b14218d1beef66067f126a16keunyoung 3078a94683196406b83b14218d1beef66067f126a16keunyoung if (request == NULL) return BAD_VALUE; 3088a94683196406b83b14218d1beef66067f126a16keunyoung if (request_template < 0 || request_template >= CAMERA2_TEMPLATE_COUNT) { 3098a94683196406b83b14218d1beef66067f126a16keunyoung return BAD_VALUE; 3108a94683196406b83b14218d1beef66067f126a16keunyoung } 3114dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin 3124dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin { 3134dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin Mutex::Autolock l(mMutex); 3144dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin if (!mStatusPresent) { 3154dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin ALOGW("%s: Camera was physically disconnected", __FUNCTION__); 3164dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin return ERROR_CAMERA_NOT_PRESENT; 3174dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin } 3184dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin } 3194dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin 3208a94683196406b83b14218d1beef66067f126a16keunyoung status_t res; 3218a94683196406b83b14218d1beef66067f126a16keunyoung // Pass 1, calculate size and allocate 3228a94683196406b83b14218d1beef66067f126a16keunyoung res = constructDefaultRequest(request_template, 3238a94683196406b83b14218d1beef66067f126a16keunyoung request, 3248a94683196406b83b14218d1beef66067f126a16keunyoung true); 3258a94683196406b83b14218d1beef66067f126a16keunyoung if (res != OK) { 3268a94683196406b83b14218d1beef66067f126a16keunyoung return res; 3278a94683196406b83b14218d1beef66067f126a16keunyoung } 3288a94683196406b83b14218d1beef66067f126a16keunyoung // Pass 2, build request 3298a94683196406b83b14218d1beef66067f126a16keunyoung res = constructDefaultRequest(request_template, 3308a94683196406b83b14218d1beef66067f126a16keunyoung request, 3318a94683196406b83b14218d1beef66067f126a16keunyoung false); 3328a94683196406b83b14218d1beef66067f126a16keunyoung if (res != OK) { 3338a94683196406b83b14218d1beef66067f126a16keunyoung ALOGE("Unable to populate new request for template %d", 3348a94683196406b83b14218d1beef66067f126a16keunyoung request_template); 3358a94683196406b83b14218d1beef66067f126a16keunyoung } 3368a94683196406b83b14218d1beef66067f126a16keunyoung 3378a94683196406b83b14218d1beef66067f126a16keunyoung return res; 3388a94683196406b83b14218d1beef66067f126a16keunyoung} 3398a94683196406b83b14218d1beef66067f126a16keunyoung 3408a94683196406b83b14218d1beef66067f126a16keunyoungint EmulatedFakeCamera2::allocateStream( 3418a94683196406b83b14218d1beef66067f126a16keunyoung uint32_t width, 3428a94683196406b83b14218d1beef66067f126a16keunyoung uint32_t height, 3438a94683196406b83b14218d1beef66067f126a16keunyoung int format, 3448a94683196406b83b14218d1beef66067f126a16keunyoung const camera2_stream_ops_t *stream_ops, 3458a94683196406b83b14218d1beef66067f126a16keunyoung uint32_t *stream_id, 3468a94683196406b83b14218d1beef66067f126a16keunyoung uint32_t *format_actual, 3478a94683196406b83b14218d1beef66067f126a16keunyoung uint32_t *usage, 3488a94683196406b83b14218d1beef66067f126a16keunyoung uint32_t *max_buffers) { 3498a94683196406b83b14218d1beef66067f126a16keunyoung Mutex::Autolock l(mMutex); 3508a94683196406b83b14218d1beef66067f126a16keunyoung 3514dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin if (!mStatusPresent) { 3524dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin ALOGW("%s: Camera was physically disconnected", __FUNCTION__); 3534dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin return ERROR_CAMERA_NOT_PRESENT; 3544dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin } 3554dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin 3568a94683196406b83b14218d1beef66067f126a16keunyoung // Temporary shim until FORMAT_ZSL is removed 3578a94683196406b83b14218d1beef66067f126a16keunyoung if (format == CAMERA2_HAL_PIXEL_FORMAT_ZSL) { 3588a94683196406b83b14218d1beef66067f126a16keunyoung format = HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED; 3598a94683196406b83b14218d1beef66067f126a16keunyoung } 3608a94683196406b83b14218d1beef66067f126a16keunyoung 3618a94683196406b83b14218d1beef66067f126a16keunyoung if (format != HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED) { 3628a94683196406b83b14218d1beef66067f126a16keunyoung unsigned int numFormats = sizeof(kAvailableFormats) / sizeof(uint32_t); 3638a94683196406b83b14218d1beef66067f126a16keunyoung unsigned int formatIdx = 0; 3648a94683196406b83b14218d1beef66067f126a16keunyoung unsigned int sizeOffsetIdx = 0; 3658a94683196406b83b14218d1beef66067f126a16keunyoung for (; formatIdx < numFormats; formatIdx++) { 3668a94683196406b83b14218d1beef66067f126a16keunyoung if (format == (int)kAvailableFormats[formatIdx]) break; 3678a94683196406b83b14218d1beef66067f126a16keunyoung } 3688a94683196406b83b14218d1beef66067f126a16keunyoung if (formatIdx == numFormats) { 3698a94683196406b83b14218d1beef66067f126a16keunyoung ALOGE("%s: Format 0x%x is not supported", __FUNCTION__, format); 3708a94683196406b83b14218d1beef66067f126a16keunyoung return BAD_VALUE; 3718a94683196406b83b14218d1beef66067f126a16keunyoung } 3728a94683196406b83b14218d1beef66067f126a16keunyoung } 3738a94683196406b83b14218d1beef66067f126a16keunyoung 3748a94683196406b83b14218d1beef66067f126a16keunyoung const uint32_t *availableSizes; 3758a94683196406b83b14218d1beef66067f126a16keunyoung size_t availableSizeCount; 3768a94683196406b83b14218d1beef66067f126a16keunyoung switch (format) { 377b30540c189f3e7d2bd77c783ecf50647921d3afdEino-Ville Talvala case HAL_PIXEL_FORMAT_RAW16: 3788a94683196406b83b14218d1beef66067f126a16keunyoung availableSizes = kAvailableRawSizes; 3798a94683196406b83b14218d1beef66067f126a16keunyoung availableSizeCount = sizeof(kAvailableRawSizes)/sizeof(uint32_t); 3808a94683196406b83b14218d1beef66067f126a16keunyoung break; 3818a94683196406b83b14218d1beef66067f126a16keunyoung case HAL_PIXEL_FORMAT_BLOB: 3828a94683196406b83b14218d1beef66067f126a16keunyoung availableSizes = mFacingBack ? 3838a94683196406b83b14218d1beef66067f126a16keunyoung kAvailableJpegSizesBack : kAvailableJpegSizesFront; 3848a94683196406b83b14218d1beef66067f126a16keunyoung availableSizeCount = mFacingBack ? 3858a94683196406b83b14218d1beef66067f126a16keunyoung sizeof(kAvailableJpegSizesBack)/sizeof(uint32_t) : 3868a94683196406b83b14218d1beef66067f126a16keunyoung sizeof(kAvailableJpegSizesFront)/sizeof(uint32_t); 3878a94683196406b83b14218d1beef66067f126a16keunyoung break; 3888a94683196406b83b14218d1beef66067f126a16keunyoung case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED: 3898a94683196406b83b14218d1beef66067f126a16keunyoung case HAL_PIXEL_FORMAT_RGBA_8888: 3908a94683196406b83b14218d1beef66067f126a16keunyoung case HAL_PIXEL_FORMAT_YV12: 3918a94683196406b83b14218d1beef66067f126a16keunyoung case HAL_PIXEL_FORMAT_YCrCb_420_SP: 3928a94683196406b83b14218d1beef66067f126a16keunyoung availableSizes = mFacingBack ? 3938a94683196406b83b14218d1beef66067f126a16keunyoung kAvailableProcessedSizesBack : kAvailableProcessedSizesFront; 3948a94683196406b83b14218d1beef66067f126a16keunyoung availableSizeCount = mFacingBack ? 3958a94683196406b83b14218d1beef66067f126a16keunyoung sizeof(kAvailableProcessedSizesBack)/sizeof(uint32_t) : 3968a94683196406b83b14218d1beef66067f126a16keunyoung sizeof(kAvailableProcessedSizesFront)/sizeof(uint32_t); 3978a94683196406b83b14218d1beef66067f126a16keunyoung break; 3988a94683196406b83b14218d1beef66067f126a16keunyoung default: 3998a94683196406b83b14218d1beef66067f126a16keunyoung ALOGE("%s: Unknown format 0x%x", __FUNCTION__, format); 4008a94683196406b83b14218d1beef66067f126a16keunyoung return BAD_VALUE; 4018a94683196406b83b14218d1beef66067f126a16keunyoung } 4028a94683196406b83b14218d1beef66067f126a16keunyoung 4038a94683196406b83b14218d1beef66067f126a16keunyoung unsigned int resIdx = 0; 4048a94683196406b83b14218d1beef66067f126a16keunyoung for (; resIdx < availableSizeCount; resIdx++) { 4058a94683196406b83b14218d1beef66067f126a16keunyoung if (availableSizes[resIdx * 2] == width && 4068a94683196406b83b14218d1beef66067f126a16keunyoung availableSizes[resIdx * 2 + 1] == height) break; 4078a94683196406b83b14218d1beef66067f126a16keunyoung } 4088a94683196406b83b14218d1beef66067f126a16keunyoung if (resIdx == availableSizeCount) { 4098a94683196406b83b14218d1beef66067f126a16keunyoung ALOGE("%s: Format 0x%x does not support resolution %d, %d", __FUNCTION__, 4108a94683196406b83b14218d1beef66067f126a16keunyoung format, width, height); 4118a94683196406b83b14218d1beef66067f126a16keunyoung return BAD_VALUE; 4128a94683196406b83b14218d1beef66067f126a16keunyoung } 4138a94683196406b83b14218d1beef66067f126a16keunyoung 4148a94683196406b83b14218d1beef66067f126a16keunyoung switch (format) { 415b30540c189f3e7d2bd77c783ecf50647921d3afdEino-Ville Talvala case HAL_PIXEL_FORMAT_RAW16: 4168a94683196406b83b14218d1beef66067f126a16keunyoung if (mRawStreamCount >= kMaxRawStreamCount) { 4178a94683196406b83b14218d1beef66067f126a16keunyoung ALOGE("%s: Cannot allocate another raw stream (%d already allocated)", 4188a94683196406b83b14218d1beef66067f126a16keunyoung __FUNCTION__, mRawStreamCount); 4198a94683196406b83b14218d1beef66067f126a16keunyoung return INVALID_OPERATION; 4208a94683196406b83b14218d1beef66067f126a16keunyoung } 4218a94683196406b83b14218d1beef66067f126a16keunyoung mRawStreamCount++; 4228a94683196406b83b14218d1beef66067f126a16keunyoung break; 4238a94683196406b83b14218d1beef66067f126a16keunyoung case HAL_PIXEL_FORMAT_BLOB: 4248a94683196406b83b14218d1beef66067f126a16keunyoung if (mJpegStreamCount >= kMaxJpegStreamCount) { 4258a94683196406b83b14218d1beef66067f126a16keunyoung ALOGE("%s: Cannot allocate another JPEG stream (%d already allocated)", 4268a94683196406b83b14218d1beef66067f126a16keunyoung __FUNCTION__, mJpegStreamCount); 4278a94683196406b83b14218d1beef66067f126a16keunyoung return INVALID_OPERATION; 4288a94683196406b83b14218d1beef66067f126a16keunyoung } 4298a94683196406b83b14218d1beef66067f126a16keunyoung mJpegStreamCount++; 4308a94683196406b83b14218d1beef66067f126a16keunyoung break; 4318a94683196406b83b14218d1beef66067f126a16keunyoung default: 4328a94683196406b83b14218d1beef66067f126a16keunyoung if (mProcessedStreamCount >= kMaxProcessedStreamCount) { 4338a94683196406b83b14218d1beef66067f126a16keunyoung ALOGE("%s: Cannot allocate another processed stream (%d already allocated)", 4348a94683196406b83b14218d1beef66067f126a16keunyoung __FUNCTION__, mProcessedStreamCount); 4358a94683196406b83b14218d1beef66067f126a16keunyoung return INVALID_OPERATION; 4368a94683196406b83b14218d1beef66067f126a16keunyoung } 4378a94683196406b83b14218d1beef66067f126a16keunyoung mProcessedStreamCount++; 4388a94683196406b83b14218d1beef66067f126a16keunyoung } 4398a94683196406b83b14218d1beef66067f126a16keunyoung 4408a94683196406b83b14218d1beef66067f126a16keunyoung Stream newStream; 4418a94683196406b83b14218d1beef66067f126a16keunyoung newStream.ops = stream_ops; 4428a94683196406b83b14218d1beef66067f126a16keunyoung newStream.width = width; 4438a94683196406b83b14218d1beef66067f126a16keunyoung newStream.height = height; 4448a94683196406b83b14218d1beef66067f126a16keunyoung newStream.format = format; 4458a94683196406b83b14218d1beef66067f126a16keunyoung // TODO: Query stride from gralloc 4468a94683196406b83b14218d1beef66067f126a16keunyoung newStream.stride = width; 4478a94683196406b83b14218d1beef66067f126a16keunyoung 4488a94683196406b83b14218d1beef66067f126a16keunyoung mStreams.add(mNextStreamId, newStream); 4498a94683196406b83b14218d1beef66067f126a16keunyoung 4508a94683196406b83b14218d1beef66067f126a16keunyoung *stream_id = mNextStreamId; 4518a94683196406b83b14218d1beef66067f126a16keunyoung if (format_actual) *format_actual = format; 4528a94683196406b83b14218d1beef66067f126a16keunyoung *usage = GRALLOC_USAGE_HW_CAMERA_WRITE; 4538a94683196406b83b14218d1beef66067f126a16keunyoung *max_buffers = kMaxBufferCount; 4548a94683196406b83b14218d1beef66067f126a16keunyoung 4558a94683196406b83b14218d1beef66067f126a16keunyoung ALOGV("Stream allocated: %d, %d x %d, 0x%x. U: %x, B: %d", 4568a94683196406b83b14218d1beef66067f126a16keunyoung *stream_id, width, height, format, *usage, *max_buffers); 4578a94683196406b83b14218d1beef66067f126a16keunyoung 4588a94683196406b83b14218d1beef66067f126a16keunyoung mNextStreamId++; 4598a94683196406b83b14218d1beef66067f126a16keunyoung return NO_ERROR; 4608a94683196406b83b14218d1beef66067f126a16keunyoung} 4618a94683196406b83b14218d1beef66067f126a16keunyoung 4628a94683196406b83b14218d1beef66067f126a16keunyoungint EmulatedFakeCamera2::registerStreamBuffers( 4638a94683196406b83b14218d1beef66067f126a16keunyoung uint32_t stream_id, 4648a94683196406b83b14218d1beef66067f126a16keunyoung int num_buffers, 4658a94683196406b83b14218d1beef66067f126a16keunyoung buffer_handle_t *buffers) { 4668a94683196406b83b14218d1beef66067f126a16keunyoung Mutex::Autolock l(mMutex); 4678a94683196406b83b14218d1beef66067f126a16keunyoung 4684dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin if (!mStatusPresent) { 4694dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin ALOGW("%s: Camera was physically disconnected", __FUNCTION__); 4704dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin return ERROR_CAMERA_NOT_PRESENT; 4714dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin } 4724dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin 4738a94683196406b83b14218d1beef66067f126a16keunyoung ALOGV("%s: Stream %d registering %d buffers", __FUNCTION__, 4748a94683196406b83b14218d1beef66067f126a16keunyoung stream_id, num_buffers); 4758a94683196406b83b14218d1beef66067f126a16keunyoung // Need to find out what the final concrete pixel format for our stream is 4768a94683196406b83b14218d1beef66067f126a16keunyoung // Assumes that all buffers have the same format. 4778a94683196406b83b14218d1beef66067f126a16keunyoung if (num_buffers < 1) { 4788a94683196406b83b14218d1beef66067f126a16keunyoung ALOGE("%s: Stream %d only has %d buffers!", 4798a94683196406b83b14218d1beef66067f126a16keunyoung __FUNCTION__, stream_id, num_buffers); 4808a94683196406b83b14218d1beef66067f126a16keunyoung return BAD_VALUE; 4818a94683196406b83b14218d1beef66067f126a16keunyoung } 4828a94683196406b83b14218d1beef66067f126a16keunyoung const cb_handle_t *streamBuffer = 4838a94683196406b83b14218d1beef66067f126a16keunyoung reinterpret_cast<const cb_handle_t*>(buffers[0]); 4848a94683196406b83b14218d1beef66067f126a16keunyoung 4858a94683196406b83b14218d1beef66067f126a16keunyoung int finalFormat = streamBuffer->format; 4868a94683196406b83b14218d1beef66067f126a16keunyoung 4878a94683196406b83b14218d1beef66067f126a16keunyoung if (finalFormat == HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED) { 4888a94683196406b83b14218d1beef66067f126a16keunyoung ALOGE("%s: Stream %d: Bad final pixel format " 4898a94683196406b83b14218d1beef66067f126a16keunyoung "HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED; " 4908a94683196406b83b14218d1beef66067f126a16keunyoung "concrete pixel format required!", __FUNCTION__, stream_id); 4918a94683196406b83b14218d1beef66067f126a16keunyoung return BAD_VALUE; 4928a94683196406b83b14218d1beef66067f126a16keunyoung } 4938a94683196406b83b14218d1beef66067f126a16keunyoung 4948a94683196406b83b14218d1beef66067f126a16keunyoung ssize_t streamIndex = mStreams.indexOfKey(stream_id); 4958a94683196406b83b14218d1beef66067f126a16keunyoung if (streamIndex < 0) { 4968a94683196406b83b14218d1beef66067f126a16keunyoung ALOGE("%s: Unknown stream id %d!", __FUNCTION__, stream_id); 4978a94683196406b83b14218d1beef66067f126a16keunyoung return BAD_VALUE; 4988a94683196406b83b14218d1beef66067f126a16keunyoung } 4998a94683196406b83b14218d1beef66067f126a16keunyoung 5008a94683196406b83b14218d1beef66067f126a16keunyoung Stream &stream = mStreams.editValueAt(streamIndex); 5018a94683196406b83b14218d1beef66067f126a16keunyoung 5028a94683196406b83b14218d1beef66067f126a16keunyoung ALOGV("%s: Stream %d format set to %x, previously %x", 5038a94683196406b83b14218d1beef66067f126a16keunyoung __FUNCTION__, stream_id, finalFormat, stream.format); 5048a94683196406b83b14218d1beef66067f126a16keunyoung 5058a94683196406b83b14218d1beef66067f126a16keunyoung stream.format = finalFormat; 5068a94683196406b83b14218d1beef66067f126a16keunyoung 5078a94683196406b83b14218d1beef66067f126a16keunyoung return NO_ERROR; 5088a94683196406b83b14218d1beef66067f126a16keunyoung} 5098a94683196406b83b14218d1beef66067f126a16keunyoung 5108a94683196406b83b14218d1beef66067f126a16keunyoungint EmulatedFakeCamera2::releaseStream(uint32_t stream_id) { 5118a94683196406b83b14218d1beef66067f126a16keunyoung Mutex::Autolock l(mMutex); 5128a94683196406b83b14218d1beef66067f126a16keunyoung 5138a94683196406b83b14218d1beef66067f126a16keunyoung ssize_t streamIndex = mStreams.indexOfKey(stream_id); 5148a94683196406b83b14218d1beef66067f126a16keunyoung if (streamIndex < 0) { 5158a94683196406b83b14218d1beef66067f126a16keunyoung ALOGE("%s: Unknown stream id %d!", __FUNCTION__, stream_id); 5168a94683196406b83b14218d1beef66067f126a16keunyoung return BAD_VALUE; 5178a94683196406b83b14218d1beef66067f126a16keunyoung } 5188a94683196406b83b14218d1beef66067f126a16keunyoung 5198a94683196406b83b14218d1beef66067f126a16keunyoung if (isStreamInUse(stream_id)) { 5208a94683196406b83b14218d1beef66067f126a16keunyoung ALOGE("%s: Cannot release stream %d; in use!", __FUNCTION__, 5218a94683196406b83b14218d1beef66067f126a16keunyoung stream_id); 5228a94683196406b83b14218d1beef66067f126a16keunyoung return BAD_VALUE; 5238a94683196406b83b14218d1beef66067f126a16keunyoung } 5248a94683196406b83b14218d1beef66067f126a16keunyoung 5258a94683196406b83b14218d1beef66067f126a16keunyoung switch(mStreams.valueAt(streamIndex).format) { 526b30540c189f3e7d2bd77c783ecf50647921d3afdEino-Ville Talvala case HAL_PIXEL_FORMAT_RAW16: 5278a94683196406b83b14218d1beef66067f126a16keunyoung mRawStreamCount--; 5288a94683196406b83b14218d1beef66067f126a16keunyoung break; 5298a94683196406b83b14218d1beef66067f126a16keunyoung case HAL_PIXEL_FORMAT_BLOB: 5308a94683196406b83b14218d1beef66067f126a16keunyoung mJpegStreamCount--; 5318a94683196406b83b14218d1beef66067f126a16keunyoung break; 5328a94683196406b83b14218d1beef66067f126a16keunyoung default: 5338a94683196406b83b14218d1beef66067f126a16keunyoung mProcessedStreamCount--; 5348a94683196406b83b14218d1beef66067f126a16keunyoung break; 5358a94683196406b83b14218d1beef66067f126a16keunyoung } 5368a94683196406b83b14218d1beef66067f126a16keunyoung 5378a94683196406b83b14218d1beef66067f126a16keunyoung mStreams.removeItemsAt(streamIndex); 5388a94683196406b83b14218d1beef66067f126a16keunyoung 5398a94683196406b83b14218d1beef66067f126a16keunyoung return NO_ERROR; 5408a94683196406b83b14218d1beef66067f126a16keunyoung} 5418a94683196406b83b14218d1beef66067f126a16keunyoung 5428a94683196406b83b14218d1beef66067f126a16keunyoungint EmulatedFakeCamera2::allocateReprocessStreamFromStream( 5438a94683196406b83b14218d1beef66067f126a16keunyoung uint32_t output_stream_id, 5448a94683196406b83b14218d1beef66067f126a16keunyoung const camera2_stream_in_ops_t *stream_ops, 5458a94683196406b83b14218d1beef66067f126a16keunyoung uint32_t *stream_id) { 5468a94683196406b83b14218d1beef66067f126a16keunyoung Mutex::Autolock l(mMutex); 5478a94683196406b83b14218d1beef66067f126a16keunyoung 5484dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin if (!mStatusPresent) { 5494dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin ALOGW("%s: Camera was physically disconnected", __FUNCTION__); 5504dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin return ERROR_CAMERA_NOT_PRESENT; 5514dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin } 5524dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin 5538a94683196406b83b14218d1beef66067f126a16keunyoung ssize_t baseStreamIndex = mStreams.indexOfKey(output_stream_id); 5548a94683196406b83b14218d1beef66067f126a16keunyoung if (baseStreamIndex < 0) { 5558a94683196406b83b14218d1beef66067f126a16keunyoung ALOGE("%s: Unknown output stream id %d!", __FUNCTION__, output_stream_id); 5568a94683196406b83b14218d1beef66067f126a16keunyoung return BAD_VALUE; 5578a94683196406b83b14218d1beef66067f126a16keunyoung } 5588a94683196406b83b14218d1beef66067f126a16keunyoung 5598a94683196406b83b14218d1beef66067f126a16keunyoung const Stream &baseStream = mStreams[baseStreamIndex]; 5608a94683196406b83b14218d1beef66067f126a16keunyoung 5618a94683196406b83b14218d1beef66067f126a16keunyoung // We'll reprocess anything we produced 5628a94683196406b83b14218d1beef66067f126a16keunyoung 5638a94683196406b83b14218d1beef66067f126a16keunyoung if (mReprocessStreamCount >= kMaxReprocessStreamCount) { 5648a94683196406b83b14218d1beef66067f126a16keunyoung ALOGE("%s: Cannot allocate another reprocess stream (%d already allocated)", 5658a94683196406b83b14218d1beef66067f126a16keunyoung __FUNCTION__, mReprocessStreamCount); 5668a94683196406b83b14218d1beef66067f126a16keunyoung return INVALID_OPERATION; 5678a94683196406b83b14218d1beef66067f126a16keunyoung } 5688a94683196406b83b14218d1beef66067f126a16keunyoung mReprocessStreamCount++; 5698a94683196406b83b14218d1beef66067f126a16keunyoung 5708a94683196406b83b14218d1beef66067f126a16keunyoung ReprocessStream newStream; 5718a94683196406b83b14218d1beef66067f126a16keunyoung newStream.ops = stream_ops; 5728a94683196406b83b14218d1beef66067f126a16keunyoung newStream.width = baseStream.width; 5738a94683196406b83b14218d1beef66067f126a16keunyoung newStream.height = baseStream.height; 5748a94683196406b83b14218d1beef66067f126a16keunyoung newStream.format = baseStream.format; 5758a94683196406b83b14218d1beef66067f126a16keunyoung newStream.stride = baseStream.stride; 5768a94683196406b83b14218d1beef66067f126a16keunyoung newStream.sourceStreamId = output_stream_id; 5778a94683196406b83b14218d1beef66067f126a16keunyoung 5788a94683196406b83b14218d1beef66067f126a16keunyoung *stream_id = mNextReprocessStreamId; 5798a94683196406b83b14218d1beef66067f126a16keunyoung mReprocessStreams.add(mNextReprocessStreamId, newStream); 5808a94683196406b83b14218d1beef66067f126a16keunyoung 5818a94683196406b83b14218d1beef66067f126a16keunyoung ALOGV("Reprocess stream allocated: %d: %d, %d, 0x%x. Parent stream: %d", 5828a94683196406b83b14218d1beef66067f126a16keunyoung *stream_id, newStream.width, newStream.height, newStream.format, 5838a94683196406b83b14218d1beef66067f126a16keunyoung output_stream_id); 5848a94683196406b83b14218d1beef66067f126a16keunyoung 5858a94683196406b83b14218d1beef66067f126a16keunyoung mNextReprocessStreamId++; 5868a94683196406b83b14218d1beef66067f126a16keunyoung return NO_ERROR; 5878a94683196406b83b14218d1beef66067f126a16keunyoung} 5888a94683196406b83b14218d1beef66067f126a16keunyoung 5898a94683196406b83b14218d1beef66067f126a16keunyoungint EmulatedFakeCamera2::releaseReprocessStream(uint32_t stream_id) { 5908a94683196406b83b14218d1beef66067f126a16keunyoung Mutex::Autolock l(mMutex); 5918a94683196406b83b14218d1beef66067f126a16keunyoung 5928a94683196406b83b14218d1beef66067f126a16keunyoung ssize_t streamIndex = mReprocessStreams.indexOfKey(stream_id); 5938a94683196406b83b14218d1beef66067f126a16keunyoung if (streamIndex < 0) { 5948a94683196406b83b14218d1beef66067f126a16keunyoung ALOGE("%s: Unknown reprocess stream id %d!", __FUNCTION__, stream_id); 5958a94683196406b83b14218d1beef66067f126a16keunyoung return BAD_VALUE; 5968a94683196406b83b14218d1beef66067f126a16keunyoung } 5978a94683196406b83b14218d1beef66067f126a16keunyoung 5988a94683196406b83b14218d1beef66067f126a16keunyoung if (isReprocessStreamInUse(stream_id)) { 5998a94683196406b83b14218d1beef66067f126a16keunyoung ALOGE("%s: Cannot release reprocessing stream %d; in use!", __FUNCTION__, 6008a94683196406b83b14218d1beef66067f126a16keunyoung stream_id); 6018a94683196406b83b14218d1beef66067f126a16keunyoung return BAD_VALUE; 6028a94683196406b83b14218d1beef66067f126a16keunyoung } 6038a94683196406b83b14218d1beef66067f126a16keunyoung 6048a94683196406b83b14218d1beef66067f126a16keunyoung mReprocessStreamCount--; 6058a94683196406b83b14218d1beef66067f126a16keunyoung mReprocessStreams.removeItemsAt(streamIndex); 6068a94683196406b83b14218d1beef66067f126a16keunyoung 6078a94683196406b83b14218d1beef66067f126a16keunyoung return NO_ERROR; 6088a94683196406b83b14218d1beef66067f126a16keunyoung} 6098a94683196406b83b14218d1beef66067f126a16keunyoung 6108a94683196406b83b14218d1beef66067f126a16keunyoungint EmulatedFakeCamera2::triggerAction(uint32_t trigger_id, 6118a94683196406b83b14218d1beef66067f126a16keunyoung int32_t ext1, 6128a94683196406b83b14218d1beef66067f126a16keunyoung int32_t ext2) { 6138a94683196406b83b14218d1beef66067f126a16keunyoung Mutex::Autolock l(mMutex); 6144dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin 6154dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin if (trigger_id == CAMERA2_EXT_TRIGGER_TESTING_DISCONNECT) { 6164dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin ALOGI("%s: Disconnect trigger - camera must be closed", __FUNCTION__); 6174dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin mStatusPresent = false; 6184dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin 6194dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin gEmulatedCameraFactory.onStatusChanged( 6204dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin mCameraID, 6214dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin CAMERA_DEVICE_STATUS_NOT_PRESENT); 6224dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin } 6234dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin 6244dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin if (!mStatusPresent) { 6254dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin ALOGW("%s: Camera was physically disconnected", __FUNCTION__); 6264dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin return ERROR_CAMERA_NOT_PRESENT; 6274dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin } 6284dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin 6298a94683196406b83b14218d1beef66067f126a16keunyoung return mControlThread->triggerAction(trigger_id, 6308a94683196406b83b14218d1beef66067f126a16keunyoung ext1, ext2); 6318a94683196406b83b14218d1beef66067f126a16keunyoung} 6328a94683196406b83b14218d1beef66067f126a16keunyoung 6338a94683196406b83b14218d1beef66067f126a16keunyoung/** Shutdown and debug methods */ 6348a94683196406b83b14218d1beef66067f126a16keunyoung 6358a94683196406b83b14218d1beef66067f126a16keunyoungint EmulatedFakeCamera2::dump(int fd) { 6368a94683196406b83b14218d1beef66067f126a16keunyoung String8 result; 6378a94683196406b83b14218d1beef66067f126a16keunyoung 6388a94683196406b83b14218d1beef66067f126a16keunyoung result.appendFormat(" Camera HAL device: EmulatedFakeCamera2\n"); 6398a94683196406b83b14218d1beef66067f126a16keunyoung result.appendFormat(" Streams:\n"); 6408a94683196406b83b14218d1beef66067f126a16keunyoung for (size_t i = 0; i < mStreams.size(); i++) { 6418a94683196406b83b14218d1beef66067f126a16keunyoung int id = mStreams.keyAt(i); 6428a94683196406b83b14218d1beef66067f126a16keunyoung const Stream& s = mStreams.valueAt(i); 6438a94683196406b83b14218d1beef66067f126a16keunyoung result.appendFormat( 6448a94683196406b83b14218d1beef66067f126a16keunyoung " Stream %d: %d x %d, format 0x%x, stride %d\n", 6458a94683196406b83b14218d1beef66067f126a16keunyoung id, s.width, s.height, s.format, s.stride); 6468a94683196406b83b14218d1beef66067f126a16keunyoung } 6478a94683196406b83b14218d1beef66067f126a16keunyoung 6488a94683196406b83b14218d1beef66067f126a16keunyoung write(fd, result.string(), result.size()); 6498a94683196406b83b14218d1beef66067f126a16keunyoung 6508a94683196406b83b14218d1beef66067f126a16keunyoung return NO_ERROR; 6518a94683196406b83b14218d1beef66067f126a16keunyoung} 6528a94683196406b83b14218d1beef66067f126a16keunyoung 6538a94683196406b83b14218d1beef66067f126a16keunyoungvoid EmulatedFakeCamera2::signalError() { 6548a94683196406b83b14218d1beef66067f126a16keunyoung // TODO: Let parent know so we can shut down cleanly 6558a94683196406b83b14218d1beef66067f126a16keunyoung ALOGE("Worker thread is signaling a serious error"); 6568a94683196406b83b14218d1beef66067f126a16keunyoung} 6578a94683196406b83b14218d1beef66067f126a16keunyoung 6588a94683196406b83b14218d1beef66067f126a16keunyoung/** Pipeline control worker thread methods */ 6598a94683196406b83b14218d1beef66067f126a16keunyoung 6608a94683196406b83b14218d1beef66067f126a16keunyoungEmulatedFakeCamera2::ConfigureThread::ConfigureThread(EmulatedFakeCamera2 *parent): 6618a94683196406b83b14218d1beef66067f126a16keunyoung Thread(false), 6628a94683196406b83b14218d1beef66067f126a16keunyoung mParent(parent), 6638a94683196406b83b14218d1beef66067f126a16keunyoung mRequestCount(0), 6648a94683196406b83b14218d1beef66067f126a16keunyoung mNextBuffers(NULL) { 6658a94683196406b83b14218d1beef66067f126a16keunyoung mRunning = false; 6668a94683196406b83b14218d1beef66067f126a16keunyoung} 6678a94683196406b83b14218d1beef66067f126a16keunyoung 6688a94683196406b83b14218d1beef66067f126a16keunyoungEmulatedFakeCamera2::ConfigureThread::~ConfigureThread() { 6698a94683196406b83b14218d1beef66067f126a16keunyoung} 6708a94683196406b83b14218d1beef66067f126a16keunyoung 6718a94683196406b83b14218d1beef66067f126a16keunyoungstatus_t EmulatedFakeCamera2::ConfigureThread::readyToRun() { 6728a94683196406b83b14218d1beef66067f126a16keunyoung Mutex::Autolock lock(mInputMutex); 6738a94683196406b83b14218d1beef66067f126a16keunyoung 6748a94683196406b83b14218d1beef66067f126a16keunyoung ALOGV("Starting up ConfigureThread"); 6758a94683196406b83b14218d1beef66067f126a16keunyoung mRequest = NULL; 6768a94683196406b83b14218d1beef66067f126a16keunyoung mActive = false; 6778a94683196406b83b14218d1beef66067f126a16keunyoung mRunning = true; 6788a94683196406b83b14218d1beef66067f126a16keunyoung 6798a94683196406b83b14218d1beef66067f126a16keunyoung mInputSignal.signal(); 6808a94683196406b83b14218d1beef66067f126a16keunyoung return NO_ERROR; 6818a94683196406b83b14218d1beef66067f126a16keunyoung} 6828a94683196406b83b14218d1beef66067f126a16keunyoung 6838a94683196406b83b14218d1beef66067f126a16keunyoungstatus_t EmulatedFakeCamera2::ConfigureThread::waitUntilRunning() { 6848a94683196406b83b14218d1beef66067f126a16keunyoung Mutex::Autolock lock(mInputMutex); 6858a94683196406b83b14218d1beef66067f126a16keunyoung if (!mRunning) { 6868a94683196406b83b14218d1beef66067f126a16keunyoung ALOGV("Waiting for configure thread to start"); 6878a94683196406b83b14218d1beef66067f126a16keunyoung mInputSignal.wait(mInputMutex); 6888a94683196406b83b14218d1beef66067f126a16keunyoung } 6898a94683196406b83b14218d1beef66067f126a16keunyoung return OK; 6908a94683196406b83b14218d1beef66067f126a16keunyoung} 6918a94683196406b83b14218d1beef66067f126a16keunyoung 6928a94683196406b83b14218d1beef66067f126a16keunyoungstatus_t EmulatedFakeCamera2::ConfigureThread::newRequestAvailable() { 6938a94683196406b83b14218d1beef66067f126a16keunyoung waitUntilRunning(); 6948a94683196406b83b14218d1beef66067f126a16keunyoung 6958a94683196406b83b14218d1beef66067f126a16keunyoung Mutex::Autolock lock(mInputMutex); 6968a94683196406b83b14218d1beef66067f126a16keunyoung 6978a94683196406b83b14218d1beef66067f126a16keunyoung mActive = true; 6988a94683196406b83b14218d1beef66067f126a16keunyoung mInputSignal.signal(); 6998a94683196406b83b14218d1beef66067f126a16keunyoung 7008a94683196406b83b14218d1beef66067f126a16keunyoung return OK; 7018a94683196406b83b14218d1beef66067f126a16keunyoung} 7028a94683196406b83b14218d1beef66067f126a16keunyoung 7038a94683196406b83b14218d1beef66067f126a16keunyoungbool EmulatedFakeCamera2::ConfigureThread::isStreamInUse(uint32_t id) { 7048a94683196406b83b14218d1beef66067f126a16keunyoung Mutex::Autolock lock(mInternalsMutex); 7058a94683196406b83b14218d1beef66067f126a16keunyoung 7068a94683196406b83b14218d1beef66067f126a16keunyoung if (mNextBuffers == NULL) return false; 7078a94683196406b83b14218d1beef66067f126a16keunyoung for (size_t i=0; i < mNextBuffers->size(); i++) { 7088a94683196406b83b14218d1beef66067f126a16keunyoung if ((*mNextBuffers)[i].streamId == (int)id) return true; 7098a94683196406b83b14218d1beef66067f126a16keunyoung } 7108a94683196406b83b14218d1beef66067f126a16keunyoung return false; 7118a94683196406b83b14218d1beef66067f126a16keunyoung} 7128a94683196406b83b14218d1beef66067f126a16keunyoung 7138a94683196406b83b14218d1beef66067f126a16keunyoungint EmulatedFakeCamera2::ConfigureThread::getInProgressCount() { 7148a94683196406b83b14218d1beef66067f126a16keunyoung Mutex::Autolock lock(mInputMutex); 7158a94683196406b83b14218d1beef66067f126a16keunyoung return mRequestCount; 7168a94683196406b83b14218d1beef66067f126a16keunyoung} 7178a94683196406b83b14218d1beef66067f126a16keunyoung 7188a94683196406b83b14218d1beef66067f126a16keunyoungbool EmulatedFakeCamera2::ConfigureThread::threadLoop() { 7198a94683196406b83b14218d1beef66067f126a16keunyoung status_t res; 7208a94683196406b83b14218d1beef66067f126a16keunyoung 7218a94683196406b83b14218d1beef66067f126a16keunyoung // Check if we're currently processing or just waiting 7228a94683196406b83b14218d1beef66067f126a16keunyoung { 7238a94683196406b83b14218d1beef66067f126a16keunyoung Mutex::Autolock lock(mInputMutex); 7248a94683196406b83b14218d1beef66067f126a16keunyoung if (!mActive) { 7258a94683196406b83b14218d1beef66067f126a16keunyoung // Inactive, keep waiting until we've been signaled 7268a94683196406b83b14218d1beef66067f126a16keunyoung status_t res; 7278a94683196406b83b14218d1beef66067f126a16keunyoung res = mInputSignal.waitRelative(mInputMutex, kWaitPerLoop); 7288a94683196406b83b14218d1beef66067f126a16keunyoung if (res != NO_ERROR && res != TIMED_OUT) { 7298a94683196406b83b14218d1beef66067f126a16keunyoung ALOGE("%s: Error waiting for input requests: %d", 7308a94683196406b83b14218d1beef66067f126a16keunyoung __FUNCTION__, res); 7318a94683196406b83b14218d1beef66067f126a16keunyoung return false; 7328a94683196406b83b14218d1beef66067f126a16keunyoung } 7338a94683196406b83b14218d1beef66067f126a16keunyoung if (!mActive) return true; 7348a94683196406b83b14218d1beef66067f126a16keunyoung ALOGV("New request available"); 7358a94683196406b83b14218d1beef66067f126a16keunyoung } 7368a94683196406b83b14218d1beef66067f126a16keunyoung // Active 7378a94683196406b83b14218d1beef66067f126a16keunyoung } 7384dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin 7398a94683196406b83b14218d1beef66067f126a16keunyoung if (mRequest == NULL) { 7408a94683196406b83b14218d1beef66067f126a16keunyoung Mutex::Autolock il(mInternalsMutex); 7418a94683196406b83b14218d1beef66067f126a16keunyoung 7428a94683196406b83b14218d1beef66067f126a16keunyoung ALOGV("Configure: Getting next request"); 7438a94683196406b83b14218d1beef66067f126a16keunyoung res = mParent->mRequestQueueSrc->dequeue_request( 7448a94683196406b83b14218d1beef66067f126a16keunyoung mParent->mRequestQueueSrc, 7458a94683196406b83b14218d1beef66067f126a16keunyoung &mRequest); 7468a94683196406b83b14218d1beef66067f126a16keunyoung if (res != NO_ERROR) { 7478a94683196406b83b14218d1beef66067f126a16keunyoung ALOGE("%s: Error dequeuing next request: %d", __FUNCTION__, res); 7488a94683196406b83b14218d1beef66067f126a16keunyoung mParent->signalError(); 7498a94683196406b83b14218d1beef66067f126a16keunyoung return false; 7508a94683196406b83b14218d1beef66067f126a16keunyoung } 7518a94683196406b83b14218d1beef66067f126a16keunyoung if (mRequest == NULL) { 7528a94683196406b83b14218d1beef66067f126a16keunyoung ALOGV("Configure: Request queue empty, going inactive"); 7538a94683196406b83b14218d1beef66067f126a16keunyoung // No requests available, go into inactive mode 7548a94683196406b83b14218d1beef66067f126a16keunyoung Mutex::Autolock lock(mInputMutex); 7558a94683196406b83b14218d1beef66067f126a16keunyoung mActive = false; 7568a94683196406b83b14218d1beef66067f126a16keunyoung return true; 7578a94683196406b83b14218d1beef66067f126a16keunyoung } else { 7588a94683196406b83b14218d1beef66067f126a16keunyoung Mutex::Autolock lock(mInputMutex); 7598a94683196406b83b14218d1beef66067f126a16keunyoung mRequestCount++; 7608a94683196406b83b14218d1beef66067f126a16keunyoung } 7618a94683196406b83b14218d1beef66067f126a16keunyoung 7628a94683196406b83b14218d1beef66067f126a16keunyoung camera_metadata_entry_t type; 7638a94683196406b83b14218d1beef66067f126a16keunyoung res = find_camera_metadata_entry(mRequest, 7648a94683196406b83b14218d1beef66067f126a16keunyoung ANDROID_REQUEST_TYPE, 7658a94683196406b83b14218d1beef66067f126a16keunyoung &type); 7668a94683196406b83b14218d1beef66067f126a16keunyoung if (res != NO_ERROR) { 7678a94683196406b83b14218d1beef66067f126a16keunyoung ALOGE("%s: error reading request type", __FUNCTION__); 7688a94683196406b83b14218d1beef66067f126a16keunyoung mParent->signalError(); 7698a94683196406b83b14218d1beef66067f126a16keunyoung return false; 7708a94683196406b83b14218d1beef66067f126a16keunyoung } 7718a94683196406b83b14218d1beef66067f126a16keunyoung bool success = false;; 7728a94683196406b83b14218d1beef66067f126a16keunyoung switch (type.data.u8[0]) { 7738a94683196406b83b14218d1beef66067f126a16keunyoung case ANDROID_REQUEST_TYPE_CAPTURE: 7748a94683196406b83b14218d1beef66067f126a16keunyoung success = setupCapture(); 7758a94683196406b83b14218d1beef66067f126a16keunyoung break; 7768a94683196406b83b14218d1beef66067f126a16keunyoung case ANDROID_REQUEST_TYPE_REPROCESS: 7778a94683196406b83b14218d1beef66067f126a16keunyoung success = setupReprocess(); 7788a94683196406b83b14218d1beef66067f126a16keunyoung break; 7798a94683196406b83b14218d1beef66067f126a16keunyoung default: 7808a94683196406b83b14218d1beef66067f126a16keunyoung ALOGE("%s: Unexpected request type %d", 7818a94683196406b83b14218d1beef66067f126a16keunyoung __FUNCTION__, type.data.u8[0]); 7828a94683196406b83b14218d1beef66067f126a16keunyoung mParent->signalError(); 7838a94683196406b83b14218d1beef66067f126a16keunyoung break; 7848a94683196406b83b14218d1beef66067f126a16keunyoung } 7858a94683196406b83b14218d1beef66067f126a16keunyoung if (!success) return false; 7868a94683196406b83b14218d1beef66067f126a16keunyoung 7878a94683196406b83b14218d1beef66067f126a16keunyoung } 7888a94683196406b83b14218d1beef66067f126a16keunyoung 7898a94683196406b83b14218d1beef66067f126a16keunyoung if (mWaitingForReadout) { 7908a94683196406b83b14218d1beef66067f126a16keunyoung bool readoutDone; 7918a94683196406b83b14218d1beef66067f126a16keunyoung readoutDone = mParent->mReadoutThread->waitForReady(kWaitPerLoop); 7928a94683196406b83b14218d1beef66067f126a16keunyoung if (!readoutDone) return true; 7938a94683196406b83b14218d1beef66067f126a16keunyoung 7948a94683196406b83b14218d1beef66067f126a16keunyoung if (mNextNeedsJpeg) { 7958a94683196406b83b14218d1beef66067f126a16keunyoung ALOGV("Configure: Waiting for JPEG compressor"); 7968a94683196406b83b14218d1beef66067f126a16keunyoung } else { 7978a94683196406b83b14218d1beef66067f126a16keunyoung ALOGV("Configure: Waiting for sensor"); 7988a94683196406b83b14218d1beef66067f126a16keunyoung } 7998a94683196406b83b14218d1beef66067f126a16keunyoung mWaitingForReadout = false; 8008a94683196406b83b14218d1beef66067f126a16keunyoung } 8018a94683196406b83b14218d1beef66067f126a16keunyoung 8028a94683196406b83b14218d1beef66067f126a16keunyoung if (mNextNeedsJpeg) { 8038a94683196406b83b14218d1beef66067f126a16keunyoung bool jpegDone; 8048a94683196406b83b14218d1beef66067f126a16keunyoung jpegDone = mParent->mJpegCompressor->waitForDone(kWaitPerLoop); 8058a94683196406b83b14218d1beef66067f126a16keunyoung if (!jpegDone) return true; 8068a94683196406b83b14218d1beef66067f126a16keunyoung 8078a94683196406b83b14218d1beef66067f126a16keunyoung ALOGV("Configure: Waiting for sensor"); 8088a94683196406b83b14218d1beef66067f126a16keunyoung mNextNeedsJpeg = false; 8098a94683196406b83b14218d1beef66067f126a16keunyoung } 8108a94683196406b83b14218d1beef66067f126a16keunyoung 8118a94683196406b83b14218d1beef66067f126a16keunyoung if (mNextIsCapture) { 8128a94683196406b83b14218d1beef66067f126a16keunyoung return configureNextCapture(); 8138a94683196406b83b14218d1beef66067f126a16keunyoung } else { 8148a94683196406b83b14218d1beef66067f126a16keunyoung return configureNextReprocess(); 8158a94683196406b83b14218d1beef66067f126a16keunyoung } 8168a94683196406b83b14218d1beef66067f126a16keunyoung} 8178a94683196406b83b14218d1beef66067f126a16keunyoung 8188a94683196406b83b14218d1beef66067f126a16keunyoungbool EmulatedFakeCamera2::ConfigureThread::setupCapture() { 8198a94683196406b83b14218d1beef66067f126a16keunyoung status_t res; 8208a94683196406b83b14218d1beef66067f126a16keunyoung 8218a94683196406b83b14218d1beef66067f126a16keunyoung mNextIsCapture = true; 8228a94683196406b83b14218d1beef66067f126a16keunyoung // Get necessary parameters for sensor config 8238a94683196406b83b14218d1beef66067f126a16keunyoung mParent->mControlThread->processRequest(mRequest); 8248a94683196406b83b14218d1beef66067f126a16keunyoung 8258a94683196406b83b14218d1beef66067f126a16keunyoung camera_metadata_entry_t streams; 8268a94683196406b83b14218d1beef66067f126a16keunyoung res = find_camera_metadata_entry(mRequest, 8278a94683196406b83b14218d1beef66067f126a16keunyoung ANDROID_REQUEST_OUTPUT_STREAMS, 8288a94683196406b83b14218d1beef66067f126a16keunyoung &streams); 8298a94683196406b83b14218d1beef66067f126a16keunyoung if (res != NO_ERROR) { 8308a94683196406b83b14218d1beef66067f126a16keunyoung ALOGE("%s: error reading output stream tag", __FUNCTION__); 8318a94683196406b83b14218d1beef66067f126a16keunyoung mParent->signalError(); 8328a94683196406b83b14218d1beef66067f126a16keunyoung return false; 8338a94683196406b83b14218d1beef66067f126a16keunyoung } 8348a94683196406b83b14218d1beef66067f126a16keunyoung 8358a94683196406b83b14218d1beef66067f126a16keunyoung mNextBuffers = new Buffers; 8368a94683196406b83b14218d1beef66067f126a16keunyoung mNextNeedsJpeg = false; 8378a94683196406b83b14218d1beef66067f126a16keunyoung ALOGV("Configure: Setting up buffers for capture"); 8388a94683196406b83b14218d1beef66067f126a16keunyoung for (size_t i = 0; i < streams.count; i++) { 839e8122dff1ef2de4d41835265a59d8960e7800faeZhijun He int streamId = streams.data.i32[i]; 8408a94683196406b83b14218d1beef66067f126a16keunyoung const Stream &s = mParent->getStreamInfo(streamId); 8418a94683196406b83b14218d1beef66067f126a16keunyoung if (s.format == HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED) { 8428a94683196406b83b14218d1beef66067f126a16keunyoung ALOGE("%s: Stream %d does not have a concrete pixel format, but " 8438a94683196406b83b14218d1beef66067f126a16keunyoung "is included in a request!", __FUNCTION__, streamId); 8448a94683196406b83b14218d1beef66067f126a16keunyoung mParent->signalError(); 8458a94683196406b83b14218d1beef66067f126a16keunyoung return false; 8468a94683196406b83b14218d1beef66067f126a16keunyoung } 8478a94683196406b83b14218d1beef66067f126a16keunyoung StreamBuffer b; 8488a94683196406b83b14218d1beef66067f126a16keunyoung b.streamId = streams.data.u8[i]; 8498a94683196406b83b14218d1beef66067f126a16keunyoung b.width = s.width; 8508a94683196406b83b14218d1beef66067f126a16keunyoung b.height = s.height; 8518a94683196406b83b14218d1beef66067f126a16keunyoung b.format = s.format; 8528a94683196406b83b14218d1beef66067f126a16keunyoung b.stride = s.stride; 8538a94683196406b83b14218d1beef66067f126a16keunyoung mNextBuffers->push_back(b); 8543725c7c982eac52ec64a625e82f306822452941cColin Cross ALOGV("Configure: Buffer %zu: Stream %d, %d x %d, format 0x%x, " 8558a94683196406b83b14218d1beef66067f126a16keunyoung "stride %d", 8568a94683196406b83b14218d1beef66067f126a16keunyoung i, b.streamId, b.width, b.height, b.format, b.stride); 8578a94683196406b83b14218d1beef66067f126a16keunyoung if (b.format == HAL_PIXEL_FORMAT_BLOB) { 8588a94683196406b83b14218d1beef66067f126a16keunyoung mNextNeedsJpeg = true; 8598a94683196406b83b14218d1beef66067f126a16keunyoung } 8608a94683196406b83b14218d1beef66067f126a16keunyoung } 8618a94683196406b83b14218d1beef66067f126a16keunyoung 8628a94683196406b83b14218d1beef66067f126a16keunyoung camera_metadata_entry_t e; 8638a94683196406b83b14218d1beef66067f126a16keunyoung res = find_camera_metadata_entry(mRequest, 8648a94683196406b83b14218d1beef66067f126a16keunyoung ANDROID_REQUEST_FRAME_COUNT, 8658a94683196406b83b14218d1beef66067f126a16keunyoung &e); 8668a94683196406b83b14218d1beef66067f126a16keunyoung if (res != NO_ERROR) { 8678a94683196406b83b14218d1beef66067f126a16keunyoung ALOGE("%s: error reading frame count tag: %s (%d)", 8688a94683196406b83b14218d1beef66067f126a16keunyoung __FUNCTION__, strerror(-res), res); 8698a94683196406b83b14218d1beef66067f126a16keunyoung mParent->signalError(); 8708a94683196406b83b14218d1beef66067f126a16keunyoung return false; 8718a94683196406b83b14218d1beef66067f126a16keunyoung } 8728a94683196406b83b14218d1beef66067f126a16keunyoung mNextFrameNumber = *e.data.i32; 8738a94683196406b83b14218d1beef66067f126a16keunyoung 8748a94683196406b83b14218d1beef66067f126a16keunyoung res = find_camera_metadata_entry(mRequest, 8758a94683196406b83b14218d1beef66067f126a16keunyoung ANDROID_SENSOR_EXPOSURE_TIME, 8768a94683196406b83b14218d1beef66067f126a16keunyoung &e); 8778a94683196406b83b14218d1beef66067f126a16keunyoung if (res != NO_ERROR) { 8788a94683196406b83b14218d1beef66067f126a16keunyoung ALOGE("%s: error reading exposure time tag: %s (%d)", 8798a94683196406b83b14218d1beef66067f126a16keunyoung __FUNCTION__, strerror(-res), res); 8808a94683196406b83b14218d1beef66067f126a16keunyoung mParent->signalError(); 8818a94683196406b83b14218d1beef66067f126a16keunyoung return false; 8828a94683196406b83b14218d1beef66067f126a16keunyoung } 8838a94683196406b83b14218d1beef66067f126a16keunyoung mNextExposureTime = *e.data.i64; 8848a94683196406b83b14218d1beef66067f126a16keunyoung 8858a94683196406b83b14218d1beef66067f126a16keunyoung res = find_camera_metadata_entry(mRequest, 8868a94683196406b83b14218d1beef66067f126a16keunyoung ANDROID_SENSOR_FRAME_DURATION, 8878a94683196406b83b14218d1beef66067f126a16keunyoung &e); 8888a94683196406b83b14218d1beef66067f126a16keunyoung if (res != NO_ERROR) { 8898a94683196406b83b14218d1beef66067f126a16keunyoung ALOGE("%s: error reading frame duration tag", __FUNCTION__); 8908a94683196406b83b14218d1beef66067f126a16keunyoung mParent->signalError(); 8918a94683196406b83b14218d1beef66067f126a16keunyoung return false; 8928a94683196406b83b14218d1beef66067f126a16keunyoung } 8938a94683196406b83b14218d1beef66067f126a16keunyoung mNextFrameDuration = *e.data.i64; 8948a94683196406b83b14218d1beef66067f126a16keunyoung 8958a94683196406b83b14218d1beef66067f126a16keunyoung if (mNextFrameDuration < 8968a94683196406b83b14218d1beef66067f126a16keunyoung mNextExposureTime + Sensor::kMinVerticalBlank) { 8978a94683196406b83b14218d1beef66067f126a16keunyoung mNextFrameDuration = mNextExposureTime + Sensor::kMinVerticalBlank; 8988a94683196406b83b14218d1beef66067f126a16keunyoung } 8998a94683196406b83b14218d1beef66067f126a16keunyoung res = find_camera_metadata_entry(mRequest, 9008a94683196406b83b14218d1beef66067f126a16keunyoung ANDROID_SENSOR_SENSITIVITY, 9018a94683196406b83b14218d1beef66067f126a16keunyoung &e); 9028a94683196406b83b14218d1beef66067f126a16keunyoung if (res != NO_ERROR) { 9038a94683196406b83b14218d1beef66067f126a16keunyoung ALOGE("%s: error reading sensitivity tag", __FUNCTION__); 9048a94683196406b83b14218d1beef66067f126a16keunyoung mParent->signalError(); 9058a94683196406b83b14218d1beef66067f126a16keunyoung return false; 9068a94683196406b83b14218d1beef66067f126a16keunyoung } 9078a94683196406b83b14218d1beef66067f126a16keunyoung mNextSensitivity = *e.data.i32; 9088a94683196406b83b14218d1beef66067f126a16keunyoung 9098a94683196406b83b14218d1beef66067f126a16keunyoung // Start waiting on readout thread 9108a94683196406b83b14218d1beef66067f126a16keunyoung mWaitingForReadout = true; 9118a94683196406b83b14218d1beef66067f126a16keunyoung ALOGV("Configure: Waiting for readout thread"); 9128a94683196406b83b14218d1beef66067f126a16keunyoung 9138a94683196406b83b14218d1beef66067f126a16keunyoung return true; 9148a94683196406b83b14218d1beef66067f126a16keunyoung} 9158a94683196406b83b14218d1beef66067f126a16keunyoung 9168a94683196406b83b14218d1beef66067f126a16keunyoungbool EmulatedFakeCamera2::ConfigureThread::configureNextCapture() { 9178a94683196406b83b14218d1beef66067f126a16keunyoung bool vsync = mParent->mSensor->waitForVSync(kWaitPerLoop); 9188a94683196406b83b14218d1beef66067f126a16keunyoung if (!vsync) return true; 9198a94683196406b83b14218d1beef66067f126a16keunyoung 9208a94683196406b83b14218d1beef66067f126a16keunyoung Mutex::Autolock il(mInternalsMutex); 9218a94683196406b83b14218d1beef66067f126a16keunyoung ALOGV("Configure: Configuring sensor for capture %d", mNextFrameNumber); 9228a94683196406b83b14218d1beef66067f126a16keunyoung mParent->mSensor->setExposureTime(mNextExposureTime); 9238a94683196406b83b14218d1beef66067f126a16keunyoung mParent->mSensor->setFrameDuration(mNextFrameDuration); 9248a94683196406b83b14218d1beef66067f126a16keunyoung mParent->mSensor->setSensitivity(mNextSensitivity); 9258a94683196406b83b14218d1beef66067f126a16keunyoung 9268a94683196406b83b14218d1beef66067f126a16keunyoung getBuffers(); 9278a94683196406b83b14218d1beef66067f126a16keunyoung 9288a94683196406b83b14218d1beef66067f126a16keunyoung ALOGV("Configure: Done configure for capture %d", mNextFrameNumber); 9298a94683196406b83b14218d1beef66067f126a16keunyoung mParent->mReadoutThread->setNextOperation(true, mRequest, mNextBuffers); 9308a94683196406b83b14218d1beef66067f126a16keunyoung mParent->mSensor->setDestinationBuffers(mNextBuffers); 9318a94683196406b83b14218d1beef66067f126a16keunyoung 9328a94683196406b83b14218d1beef66067f126a16keunyoung mRequest = NULL; 9338a94683196406b83b14218d1beef66067f126a16keunyoung mNextBuffers = NULL; 9348a94683196406b83b14218d1beef66067f126a16keunyoung 9358a94683196406b83b14218d1beef66067f126a16keunyoung Mutex::Autolock lock(mInputMutex); 9368a94683196406b83b14218d1beef66067f126a16keunyoung mRequestCount--; 9378a94683196406b83b14218d1beef66067f126a16keunyoung 9388a94683196406b83b14218d1beef66067f126a16keunyoung return true; 9398a94683196406b83b14218d1beef66067f126a16keunyoung} 9408a94683196406b83b14218d1beef66067f126a16keunyoung 9418a94683196406b83b14218d1beef66067f126a16keunyoungbool EmulatedFakeCamera2::ConfigureThread::setupReprocess() { 9428a94683196406b83b14218d1beef66067f126a16keunyoung status_t res; 9438a94683196406b83b14218d1beef66067f126a16keunyoung 9448a94683196406b83b14218d1beef66067f126a16keunyoung mNextNeedsJpeg = true; 9458a94683196406b83b14218d1beef66067f126a16keunyoung mNextIsCapture = false; 9468a94683196406b83b14218d1beef66067f126a16keunyoung 9478a94683196406b83b14218d1beef66067f126a16keunyoung camera_metadata_entry_t reprocessStreams; 9488a94683196406b83b14218d1beef66067f126a16keunyoung res = find_camera_metadata_entry(mRequest, 9498a94683196406b83b14218d1beef66067f126a16keunyoung ANDROID_REQUEST_INPUT_STREAMS, 9508a94683196406b83b14218d1beef66067f126a16keunyoung &reprocessStreams); 9518a94683196406b83b14218d1beef66067f126a16keunyoung if (res != NO_ERROR) { 9528a94683196406b83b14218d1beef66067f126a16keunyoung ALOGE("%s: error reading output stream tag", __FUNCTION__); 9538a94683196406b83b14218d1beef66067f126a16keunyoung mParent->signalError(); 9548a94683196406b83b14218d1beef66067f126a16keunyoung return false; 9558a94683196406b83b14218d1beef66067f126a16keunyoung } 9568a94683196406b83b14218d1beef66067f126a16keunyoung 9578a94683196406b83b14218d1beef66067f126a16keunyoung mNextBuffers = new Buffers; 9588a94683196406b83b14218d1beef66067f126a16keunyoung 9598a94683196406b83b14218d1beef66067f126a16keunyoung ALOGV("Configure: Setting up input buffers for reprocess"); 9608a94683196406b83b14218d1beef66067f126a16keunyoung for (size_t i = 0; i < reprocessStreams.count; i++) { 961e8122dff1ef2de4d41835265a59d8960e7800faeZhijun He int streamId = reprocessStreams.data.i32[i]; 9628a94683196406b83b14218d1beef66067f126a16keunyoung const ReprocessStream &s = mParent->getReprocessStreamInfo(streamId); 9638a94683196406b83b14218d1beef66067f126a16keunyoung if (s.format != HAL_PIXEL_FORMAT_RGB_888) { 9648a94683196406b83b14218d1beef66067f126a16keunyoung ALOGE("%s: Only ZSL reprocessing supported!", 9658a94683196406b83b14218d1beef66067f126a16keunyoung __FUNCTION__); 9668a94683196406b83b14218d1beef66067f126a16keunyoung mParent->signalError(); 9678a94683196406b83b14218d1beef66067f126a16keunyoung return false; 9688a94683196406b83b14218d1beef66067f126a16keunyoung } 9698a94683196406b83b14218d1beef66067f126a16keunyoung StreamBuffer b; 9708a94683196406b83b14218d1beef66067f126a16keunyoung b.streamId = -streamId; 9718a94683196406b83b14218d1beef66067f126a16keunyoung b.width = s.width; 9728a94683196406b83b14218d1beef66067f126a16keunyoung b.height = s.height; 9738a94683196406b83b14218d1beef66067f126a16keunyoung b.format = s.format; 9748a94683196406b83b14218d1beef66067f126a16keunyoung b.stride = s.stride; 9758a94683196406b83b14218d1beef66067f126a16keunyoung mNextBuffers->push_back(b); 9768a94683196406b83b14218d1beef66067f126a16keunyoung } 9778a94683196406b83b14218d1beef66067f126a16keunyoung 9788a94683196406b83b14218d1beef66067f126a16keunyoung camera_metadata_entry_t streams; 9798a94683196406b83b14218d1beef66067f126a16keunyoung res = find_camera_metadata_entry(mRequest, 9808a94683196406b83b14218d1beef66067f126a16keunyoung ANDROID_REQUEST_OUTPUT_STREAMS, 9818a94683196406b83b14218d1beef66067f126a16keunyoung &streams); 9828a94683196406b83b14218d1beef66067f126a16keunyoung if (res != NO_ERROR) { 9838a94683196406b83b14218d1beef66067f126a16keunyoung ALOGE("%s: error reading output stream tag", __FUNCTION__); 9848a94683196406b83b14218d1beef66067f126a16keunyoung mParent->signalError(); 9858a94683196406b83b14218d1beef66067f126a16keunyoung return false; 9868a94683196406b83b14218d1beef66067f126a16keunyoung } 9878a94683196406b83b14218d1beef66067f126a16keunyoung 9888a94683196406b83b14218d1beef66067f126a16keunyoung ALOGV("Configure: Setting up output buffers for reprocess"); 9898a94683196406b83b14218d1beef66067f126a16keunyoung for (size_t i = 0; i < streams.count; i++) { 990e8122dff1ef2de4d41835265a59d8960e7800faeZhijun He int streamId = streams.data.i32[i]; 9918a94683196406b83b14218d1beef66067f126a16keunyoung const Stream &s = mParent->getStreamInfo(streamId); 9928a94683196406b83b14218d1beef66067f126a16keunyoung if (s.format != HAL_PIXEL_FORMAT_BLOB) { 9938a94683196406b83b14218d1beef66067f126a16keunyoung // TODO: Support reprocess to YUV 9948a94683196406b83b14218d1beef66067f126a16keunyoung ALOGE("%s: Non-JPEG output stream %d for reprocess not supported", 9958a94683196406b83b14218d1beef66067f126a16keunyoung __FUNCTION__, streamId); 9968a94683196406b83b14218d1beef66067f126a16keunyoung mParent->signalError(); 9978a94683196406b83b14218d1beef66067f126a16keunyoung return false; 9988a94683196406b83b14218d1beef66067f126a16keunyoung } 9998a94683196406b83b14218d1beef66067f126a16keunyoung StreamBuffer b; 10008a94683196406b83b14218d1beef66067f126a16keunyoung b.streamId = streams.data.u8[i]; 10018a94683196406b83b14218d1beef66067f126a16keunyoung b.width = s.width; 10028a94683196406b83b14218d1beef66067f126a16keunyoung b.height = s.height; 10038a94683196406b83b14218d1beef66067f126a16keunyoung b.format = s.format; 10048a94683196406b83b14218d1beef66067f126a16keunyoung b.stride = s.stride; 10058a94683196406b83b14218d1beef66067f126a16keunyoung mNextBuffers->push_back(b); 10063725c7c982eac52ec64a625e82f306822452941cColin Cross ALOGV("Configure: Buffer %zu: Stream %d, %d x %d, format 0x%x, " 10078a94683196406b83b14218d1beef66067f126a16keunyoung "stride %d", 10088a94683196406b83b14218d1beef66067f126a16keunyoung i, b.streamId, b.width, b.height, b.format, b.stride); 10098a94683196406b83b14218d1beef66067f126a16keunyoung } 10108a94683196406b83b14218d1beef66067f126a16keunyoung 10118a94683196406b83b14218d1beef66067f126a16keunyoung camera_metadata_entry_t e; 10128a94683196406b83b14218d1beef66067f126a16keunyoung res = find_camera_metadata_entry(mRequest, 10138a94683196406b83b14218d1beef66067f126a16keunyoung ANDROID_REQUEST_FRAME_COUNT, 10148a94683196406b83b14218d1beef66067f126a16keunyoung &e); 10158a94683196406b83b14218d1beef66067f126a16keunyoung if (res != NO_ERROR) { 10168a94683196406b83b14218d1beef66067f126a16keunyoung ALOGE("%s: error reading frame count tag: %s (%d)", 10178a94683196406b83b14218d1beef66067f126a16keunyoung __FUNCTION__, strerror(-res), res); 10188a94683196406b83b14218d1beef66067f126a16keunyoung mParent->signalError(); 10198a94683196406b83b14218d1beef66067f126a16keunyoung return false; 10208a94683196406b83b14218d1beef66067f126a16keunyoung } 10218a94683196406b83b14218d1beef66067f126a16keunyoung mNextFrameNumber = *e.data.i32; 10228a94683196406b83b14218d1beef66067f126a16keunyoung 10238a94683196406b83b14218d1beef66067f126a16keunyoung return true; 10248a94683196406b83b14218d1beef66067f126a16keunyoung} 10258a94683196406b83b14218d1beef66067f126a16keunyoung 10268a94683196406b83b14218d1beef66067f126a16keunyoungbool EmulatedFakeCamera2::ConfigureThread::configureNextReprocess() { 10278a94683196406b83b14218d1beef66067f126a16keunyoung Mutex::Autolock il(mInternalsMutex); 10288a94683196406b83b14218d1beef66067f126a16keunyoung 10298a94683196406b83b14218d1beef66067f126a16keunyoung getBuffers(); 10308a94683196406b83b14218d1beef66067f126a16keunyoung 10318a94683196406b83b14218d1beef66067f126a16keunyoung ALOGV("Configure: Done configure for reprocess %d", mNextFrameNumber); 10328a94683196406b83b14218d1beef66067f126a16keunyoung mParent->mReadoutThread->setNextOperation(false, mRequest, mNextBuffers); 10338a94683196406b83b14218d1beef66067f126a16keunyoung 10348a94683196406b83b14218d1beef66067f126a16keunyoung mRequest = NULL; 10358a94683196406b83b14218d1beef66067f126a16keunyoung mNextBuffers = NULL; 10368a94683196406b83b14218d1beef66067f126a16keunyoung 10378a94683196406b83b14218d1beef66067f126a16keunyoung Mutex::Autolock lock(mInputMutex); 10388a94683196406b83b14218d1beef66067f126a16keunyoung mRequestCount--; 10398a94683196406b83b14218d1beef66067f126a16keunyoung 10408a94683196406b83b14218d1beef66067f126a16keunyoung return true; 10418a94683196406b83b14218d1beef66067f126a16keunyoung} 10428a94683196406b83b14218d1beef66067f126a16keunyoung 10438a94683196406b83b14218d1beef66067f126a16keunyoungbool EmulatedFakeCamera2::ConfigureThread::getBuffers() { 10448a94683196406b83b14218d1beef66067f126a16keunyoung status_t res; 10458a94683196406b83b14218d1beef66067f126a16keunyoung /** Get buffers to fill for this frame */ 10468a94683196406b83b14218d1beef66067f126a16keunyoung for (size_t i = 0; i < mNextBuffers->size(); i++) { 10478a94683196406b83b14218d1beef66067f126a16keunyoung StreamBuffer &b = mNextBuffers->editItemAt(i); 10488a94683196406b83b14218d1beef66067f126a16keunyoung 10498a94683196406b83b14218d1beef66067f126a16keunyoung if (b.streamId > 0) { 10508a94683196406b83b14218d1beef66067f126a16keunyoung Stream s = mParent->getStreamInfo(b.streamId); 10518a94683196406b83b14218d1beef66067f126a16keunyoung ALOGV("Configure: Dequeing buffer from stream %d", b.streamId); 10528a94683196406b83b14218d1beef66067f126a16keunyoung res = s.ops->dequeue_buffer(s.ops, &(b.buffer) ); 10538a94683196406b83b14218d1beef66067f126a16keunyoung if (res != NO_ERROR || b.buffer == NULL) { 10548a94683196406b83b14218d1beef66067f126a16keunyoung ALOGE("%s: Unable to dequeue buffer from stream %d: %s (%d)", 10558a94683196406b83b14218d1beef66067f126a16keunyoung __FUNCTION__, b.streamId, strerror(-res), res); 10568a94683196406b83b14218d1beef66067f126a16keunyoung mParent->signalError(); 10578a94683196406b83b14218d1beef66067f126a16keunyoung return false; 10588a94683196406b83b14218d1beef66067f126a16keunyoung } 10598a94683196406b83b14218d1beef66067f126a16keunyoung 10608a94683196406b83b14218d1beef66067f126a16keunyoung /* Lock the buffer from the perspective of the graphics mapper */ 10618a94683196406b83b14218d1beef66067f126a16keunyoung const Rect rect(s.width, s.height); 10628a94683196406b83b14218d1beef66067f126a16keunyoung 10638a94683196406b83b14218d1beef66067f126a16keunyoung res = GraphicBufferMapper::get().lock(*(b.buffer), 10648a94683196406b83b14218d1beef66067f126a16keunyoung GRALLOC_USAGE_HW_CAMERA_WRITE, 10658a94683196406b83b14218d1beef66067f126a16keunyoung rect, (void**)&(b.img) ); 10668a94683196406b83b14218d1beef66067f126a16keunyoung 10678a94683196406b83b14218d1beef66067f126a16keunyoung if (res != NO_ERROR) { 10688a94683196406b83b14218d1beef66067f126a16keunyoung ALOGE("%s: grbuffer_mapper.lock failure: %s (%d)", 10698a94683196406b83b14218d1beef66067f126a16keunyoung __FUNCTION__, strerror(-res), res); 10708a94683196406b83b14218d1beef66067f126a16keunyoung s.ops->cancel_buffer(s.ops, 10718a94683196406b83b14218d1beef66067f126a16keunyoung b.buffer); 10728a94683196406b83b14218d1beef66067f126a16keunyoung mParent->signalError(); 10738a94683196406b83b14218d1beef66067f126a16keunyoung return false; 10748a94683196406b83b14218d1beef66067f126a16keunyoung } 10758a94683196406b83b14218d1beef66067f126a16keunyoung } else { 10768a94683196406b83b14218d1beef66067f126a16keunyoung ReprocessStream s = mParent->getReprocessStreamInfo(-b.streamId); 10778a94683196406b83b14218d1beef66067f126a16keunyoung ALOGV("Configure: Acquiring buffer from reprocess stream %d", 10788a94683196406b83b14218d1beef66067f126a16keunyoung -b.streamId); 10798a94683196406b83b14218d1beef66067f126a16keunyoung res = s.ops->acquire_buffer(s.ops, &(b.buffer) ); 10808a94683196406b83b14218d1beef66067f126a16keunyoung if (res != NO_ERROR || b.buffer == NULL) { 10818a94683196406b83b14218d1beef66067f126a16keunyoung ALOGE("%s: Unable to acquire buffer from reprocess stream %d: " 10828a94683196406b83b14218d1beef66067f126a16keunyoung "%s (%d)", __FUNCTION__, -b.streamId, 10838a94683196406b83b14218d1beef66067f126a16keunyoung strerror(-res), res); 10848a94683196406b83b14218d1beef66067f126a16keunyoung mParent->signalError(); 10858a94683196406b83b14218d1beef66067f126a16keunyoung return false; 10868a94683196406b83b14218d1beef66067f126a16keunyoung } 10878a94683196406b83b14218d1beef66067f126a16keunyoung 10888a94683196406b83b14218d1beef66067f126a16keunyoung /* Lock the buffer from the perspective of the graphics mapper */ 10898a94683196406b83b14218d1beef66067f126a16keunyoung const Rect rect(s.width, s.height); 10908a94683196406b83b14218d1beef66067f126a16keunyoung 10918a94683196406b83b14218d1beef66067f126a16keunyoung res = GraphicBufferMapper::get().lock(*(b.buffer), 10928a94683196406b83b14218d1beef66067f126a16keunyoung GRALLOC_USAGE_HW_CAMERA_READ, 10938a94683196406b83b14218d1beef66067f126a16keunyoung rect, (void**)&(b.img) ); 10948a94683196406b83b14218d1beef66067f126a16keunyoung if (res != NO_ERROR) { 10958a94683196406b83b14218d1beef66067f126a16keunyoung ALOGE("%s: grbuffer_mapper.lock failure: %s (%d)", 10968a94683196406b83b14218d1beef66067f126a16keunyoung __FUNCTION__, strerror(-res), res); 10978a94683196406b83b14218d1beef66067f126a16keunyoung s.ops->release_buffer(s.ops, 10988a94683196406b83b14218d1beef66067f126a16keunyoung b.buffer); 10998a94683196406b83b14218d1beef66067f126a16keunyoung mParent->signalError(); 11008a94683196406b83b14218d1beef66067f126a16keunyoung return false; 11018a94683196406b83b14218d1beef66067f126a16keunyoung } 11028a94683196406b83b14218d1beef66067f126a16keunyoung } 11038a94683196406b83b14218d1beef66067f126a16keunyoung } 11048a94683196406b83b14218d1beef66067f126a16keunyoung return true; 11058a94683196406b83b14218d1beef66067f126a16keunyoung} 11068a94683196406b83b14218d1beef66067f126a16keunyoung 11078a94683196406b83b14218d1beef66067f126a16keunyoungEmulatedFakeCamera2::ReadoutThread::ReadoutThread(EmulatedFakeCamera2 *parent): 11088a94683196406b83b14218d1beef66067f126a16keunyoung Thread(false), 11098a94683196406b83b14218d1beef66067f126a16keunyoung mParent(parent), 11108a94683196406b83b14218d1beef66067f126a16keunyoung mRunning(false), 11118a94683196406b83b14218d1beef66067f126a16keunyoung mActive(false), 11128a94683196406b83b14218d1beef66067f126a16keunyoung mRequestCount(0), 11138a94683196406b83b14218d1beef66067f126a16keunyoung mRequest(NULL), 11148a94683196406b83b14218d1beef66067f126a16keunyoung mBuffers(NULL) { 11158a94683196406b83b14218d1beef66067f126a16keunyoung mInFlightQueue = new InFlightQueue[kInFlightQueueSize]; 11168a94683196406b83b14218d1beef66067f126a16keunyoung mInFlightHead = 0; 11178a94683196406b83b14218d1beef66067f126a16keunyoung mInFlightTail = 0; 11188a94683196406b83b14218d1beef66067f126a16keunyoung} 11198a94683196406b83b14218d1beef66067f126a16keunyoung 11208a94683196406b83b14218d1beef66067f126a16keunyoungEmulatedFakeCamera2::ReadoutThread::~ReadoutThread() { 11212cbbe5ffb511337b815f83aa8d3e6a29907cd4deAdam Buchbinder delete[] mInFlightQueue; 11228a94683196406b83b14218d1beef66067f126a16keunyoung} 11238a94683196406b83b14218d1beef66067f126a16keunyoung 11248a94683196406b83b14218d1beef66067f126a16keunyoungstatus_t EmulatedFakeCamera2::ReadoutThread::readyToRun() { 11258a94683196406b83b14218d1beef66067f126a16keunyoung Mutex::Autolock lock(mInputMutex); 11268a94683196406b83b14218d1beef66067f126a16keunyoung ALOGV("Starting up ReadoutThread"); 11278a94683196406b83b14218d1beef66067f126a16keunyoung mRunning = true; 11288a94683196406b83b14218d1beef66067f126a16keunyoung mInputSignal.signal(); 11298a94683196406b83b14218d1beef66067f126a16keunyoung return NO_ERROR; 11308a94683196406b83b14218d1beef66067f126a16keunyoung} 11318a94683196406b83b14218d1beef66067f126a16keunyoung 11328a94683196406b83b14218d1beef66067f126a16keunyoungstatus_t EmulatedFakeCamera2::ReadoutThread::waitUntilRunning() { 11338a94683196406b83b14218d1beef66067f126a16keunyoung Mutex::Autolock lock(mInputMutex); 11348a94683196406b83b14218d1beef66067f126a16keunyoung if (!mRunning) { 11358a94683196406b83b14218d1beef66067f126a16keunyoung ALOGV("Waiting for readout thread to start"); 11368a94683196406b83b14218d1beef66067f126a16keunyoung mInputSignal.wait(mInputMutex); 11378a94683196406b83b14218d1beef66067f126a16keunyoung } 11388a94683196406b83b14218d1beef66067f126a16keunyoung return OK; 11398a94683196406b83b14218d1beef66067f126a16keunyoung} 11408a94683196406b83b14218d1beef66067f126a16keunyoung 11418a94683196406b83b14218d1beef66067f126a16keunyoungbool EmulatedFakeCamera2::ReadoutThread::waitForReady(nsecs_t timeout) { 11428a94683196406b83b14218d1beef66067f126a16keunyoung status_t res; 11438a94683196406b83b14218d1beef66067f126a16keunyoung Mutex::Autolock lock(mInputMutex); 11448a94683196406b83b14218d1beef66067f126a16keunyoung while (!readyForNextCapture()) { 11458a94683196406b83b14218d1beef66067f126a16keunyoung res = mReadySignal.waitRelative(mInputMutex, timeout); 11468a94683196406b83b14218d1beef66067f126a16keunyoung if (res == TIMED_OUT) return false; 11478a94683196406b83b14218d1beef66067f126a16keunyoung if (res != OK) { 11488a94683196406b83b14218d1beef66067f126a16keunyoung ALOGE("%s: Error waiting for ready: %s (%d)", __FUNCTION__, 11498a94683196406b83b14218d1beef66067f126a16keunyoung strerror(-res), res); 11508a94683196406b83b14218d1beef66067f126a16keunyoung return false; 11518a94683196406b83b14218d1beef66067f126a16keunyoung } 11528a94683196406b83b14218d1beef66067f126a16keunyoung } 11538a94683196406b83b14218d1beef66067f126a16keunyoung return true; 11548a94683196406b83b14218d1beef66067f126a16keunyoung} 11558a94683196406b83b14218d1beef66067f126a16keunyoung 11568a94683196406b83b14218d1beef66067f126a16keunyoungbool EmulatedFakeCamera2::ReadoutThread::readyForNextCapture() { 11578a94683196406b83b14218d1beef66067f126a16keunyoung return (mInFlightTail + 1) % kInFlightQueueSize != mInFlightHead; 11588a94683196406b83b14218d1beef66067f126a16keunyoung} 11598a94683196406b83b14218d1beef66067f126a16keunyoung 11608a94683196406b83b14218d1beef66067f126a16keunyoungvoid EmulatedFakeCamera2::ReadoutThread::setNextOperation( 11618a94683196406b83b14218d1beef66067f126a16keunyoung bool isCapture, 11628a94683196406b83b14218d1beef66067f126a16keunyoung camera_metadata_t *request, 11638a94683196406b83b14218d1beef66067f126a16keunyoung Buffers *buffers) { 11648a94683196406b83b14218d1beef66067f126a16keunyoung Mutex::Autolock lock(mInputMutex); 11658a94683196406b83b14218d1beef66067f126a16keunyoung if ( !readyForNextCapture() ) { 11668a94683196406b83b14218d1beef66067f126a16keunyoung ALOGE("In flight queue full, dropping captures"); 11678a94683196406b83b14218d1beef66067f126a16keunyoung mParent->signalError(); 11688a94683196406b83b14218d1beef66067f126a16keunyoung return; 11698a94683196406b83b14218d1beef66067f126a16keunyoung } 11708a94683196406b83b14218d1beef66067f126a16keunyoung mInFlightQueue[mInFlightTail].isCapture = isCapture; 11718a94683196406b83b14218d1beef66067f126a16keunyoung mInFlightQueue[mInFlightTail].request = request; 11728a94683196406b83b14218d1beef66067f126a16keunyoung mInFlightQueue[mInFlightTail].buffers = buffers; 11738a94683196406b83b14218d1beef66067f126a16keunyoung mInFlightTail = (mInFlightTail + 1) % kInFlightQueueSize; 11748a94683196406b83b14218d1beef66067f126a16keunyoung mRequestCount++; 11758a94683196406b83b14218d1beef66067f126a16keunyoung 11768a94683196406b83b14218d1beef66067f126a16keunyoung if (!mActive) { 11778a94683196406b83b14218d1beef66067f126a16keunyoung mActive = true; 11788a94683196406b83b14218d1beef66067f126a16keunyoung mInputSignal.signal(); 11798a94683196406b83b14218d1beef66067f126a16keunyoung } 11808a94683196406b83b14218d1beef66067f126a16keunyoung} 11818a94683196406b83b14218d1beef66067f126a16keunyoung 11828a94683196406b83b14218d1beef66067f126a16keunyoungbool EmulatedFakeCamera2::ReadoutThread::isStreamInUse(uint32_t id) { 11838a94683196406b83b14218d1beef66067f126a16keunyoung // acquire in same order as threadLoop 11848a94683196406b83b14218d1beef66067f126a16keunyoung Mutex::Autolock iLock(mInternalsMutex); 11858a94683196406b83b14218d1beef66067f126a16keunyoung Mutex::Autolock lock(mInputMutex); 11868a94683196406b83b14218d1beef66067f126a16keunyoung 11878a94683196406b83b14218d1beef66067f126a16keunyoung size_t i = mInFlightHead; 11888a94683196406b83b14218d1beef66067f126a16keunyoung while (i != mInFlightTail) { 11898a94683196406b83b14218d1beef66067f126a16keunyoung for (size_t j = 0; j < mInFlightQueue[i].buffers->size(); j++) { 11908a94683196406b83b14218d1beef66067f126a16keunyoung if ( (*(mInFlightQueue[i].buffers))[j].streamId == (int)id ) 11918a94683196406b83b14218d1beef66067f126a16keunyoung return true; 11928a94683196406b83b14218d1beef66067f126a16keunyoung } 11938a94683196406b83b14218d1beef66067f126a16keunyoung i = (i + 1) % kInFlightQueueSize; 11948a94683196406b83b14218d1beef66067f126a16keunyoung } 11958a94683196406b83b14218d1beef66067f126a16keunyoung 11968a94683196406b83b14218d1beef66067f126a16keunyoung 11978a94683196406b83b14218d1beef66067f126a16keunyoung if (mBuffers != NULL) { 11988a94683196406b83b14218d1beef66067f126a16keunyoung for (i = 0; i < mBuffers->size(); i++) { 11998a94683196406b83b14218d1beef66067f126a16keunyoung if ( (*mBuffers)[i].streamId == (int)id) return true; 12008a94683196406b83b14218d1beef66067f126a16keunyoung } 12018a94683196406b83b14218d1beef66067f126a16keunyoung } 12028a94683196406b83b14218d1beef66067f126a16keunyoung 12038a94683196406b83b14218d1beef66067f126a16keunyoung return false; 12048a94683196406b83b14218d1beef66067f126a16keunyoung} 12058a94683196406b83b14218d1beef66067f126a16keunyoung 12068a94683196406b83b14218d1beef66067f126a16keunyoungint EmulatedFakeCamera2::ReadoutThread::getInProgressCount() { 12078a94683196406b83b14218d1beef66067f126a16keunyoung Mutex::Autolock lock(mInputMutex); 12088a94683196406b83b14218d1beef66067f126a16keunyoung 12098a94683196406b83b14218d1beef66067f126a16keunyoung return mRequestCount; 12108a94683196406b83b14218d1beef66067f126a16keunyoung} 12118a94683196406b83b14218d1beef66067f126a16keunyoung 12128a94683196406b83b14218d1beef66067f126a16keunyoungbool EmulatedFakeCamera2::ReadoutThread::threadLoop() { 12138a94683196406b83b14218d1beef66067f126a16keunyoung static const nsecs_t kWaitPerLoop = 10000000L; // 10 ms 12148a94683196406b83b14218d1beef66067f126a16keunyoung status_t res; 12158a94683196406b83b14218d1beef66067f126a16keunyoung int32_t frameNumber; 12168a94683196406b83b14218d1beef66067f126a16keunyoung 12178a94683196406b83b14218d1beef66067f126a16keunyoung // Check if we're currently processing or just waiting 12188a94683196406b83b14218d1beef66067f126a16keunyoung { 12198a94683196406b83b14218d1beef66067f126a16keunyoung Mutex::Autolock lock(mInputMutex); 12208a94683196406b83b14218d1beef66067f126a16keunyoung if (!mActive) { 12218a94683196406b83b14218d1beef66067f126a16keunyoung // Inactive, keep waiting until we've been signaled 12228a94683196406b83b14218d1beef66067f126a16keunyoung res = mInputSignal.waitRelative(mInputMutex, kWaitPerLoop); 12238a94683196406b83b14218d1beef66067f126a16keunyoung if (res != NO_ERROR && res != TIMED_OUT) { 12248a94683196406b83b14218d1beef66067f126a16keunyoung ALOGE("%s: Error waiting for capture requests: %d", 12258a94683196406b83b14218d1beef66067f126a16keunyoung __FUNCTION__, res); 12268a94683196406b83b14218d1beef66067f126a16keunyoung mParent->signalError(); 12278a94683196406b83b14218d1beef66067f126a16keunyoung return false; 12288a94683196406b83b14218d1beef66067f126a16keunyoung } 12298a94683196406b83b14218d1beef66067f126a16keunyoung if (!mActive) return true; 12308a94683196406b83b14218d1beef66067f126a16keunyoung } 12318a94683196406b83b14218d1beef66067f126a16keunyoung // Active, see if we need a new request 12328a94683196406b83b14218d1beef66067f126a16keunyoung if (mRequest == NULL) { 12338a94683196406b83b14218d1beef66067f126a16keunyoung if (mInFlightHead == mInFlightTail) { 12348a94683196406b83b14218d1beef66067f126a16keunyoung // Go inactive 12358a94683196406b83b14218d1beef66067f126a16keunyoung ALOGV("Waiting for sensor data"); 12368a94683196406b83b14218d1beef66067f126a16keunyoung mActive = false; 12378a94683196406b83b14218d1beef66067f126a16keunyoung return true; 12388a94683196406b83b14218d1beef66067f126a16keunyoung } else { 12398a94683196406b83b14218d1beef66067f126a16keunyoung Mutex::Autolock iLock(mInternalsMutex); 12408a94683196406b83b14218d1beef66067f126a16keunyoung mReadySignal.signal(); 12418a94683196406b83b14218d1beef66067f126a16keunyoung mIsCapture = mInFlightQueue[mInFlightHead].isCapture; 12428a94683196406b83b14218d1beef66067f126a16keunyoung mRequest = mInFlightQueue[mInFlightHead].request; 12438a94683196406b83b14218d1beef66067f126a16keunyoung mBuffers = mInFlightQueue[mInFlightHead].buffers; 12448a94683196406b83b14218d1beef66067f126a16keunyoung mInFlightQueue[mInFlightHead].request = NULL; 12458a94683196406b83b14218d1beef66067f126a16keunyoung mInFlightQueue[mInFlightHead].buffers = NULL; 12468a94683196406b83b14218d1beef66067f126a16keunyoung mInFlightHead = (mInFlightHead + 1) % kInFlightQueueSize; 12473725c7c982eac52ec64a625e82f306822452941cColin Cross ALOGV("Ready to read out request %p, %zu buffers", 12488a94683196406b83b14218d1beef66067f126a16keunyoung mRequest, mBuffers->size()); 12498a94683196406b83b14218d1beef66067f126a16keunyoung } 12508a94683196406b83b14218d1beef66067f126a16keunyoung } 12518a94683196406b83b14218d1beef66067f126a16keunyoung } 12528a94683196406b83b14218d1beef66067f126a16keunyoung 12538a94683196406b83b14218d1beef66067f126a16keunyoung // Active with request, wait on sensor to complete 12548a94683196406b83b14218d1beef66067f126a16keunyoung 12558a94683196406b83b14218d1beef66067f126a16keunyoung nsecs_t captureTime; 12568a94683196406b83b14218d1beef66067f126a16keunyoung 12578a94683196406b83b14218d1beef66067f126a16keunyoung if (mIsCapture) { 12588a94683196406b83b14218d1beef66067f126a16keunyoung bool gotFrame; 12598a94683196406b83b14218d1beef66067f126a16keunyoung gotFrame = mParent->mSensor->waitForNewFrame(kWaitPerLoop, 12608a94683196406b83b14218d1beef66067f126a16keunyoung &captureTime); 12618a94683196406b83b14218d1beef66067f126a16keunyoung 12628a94683196406b83b14218d1beef66067f126a16keunyoung if (!gotFrame) return true; 12638a94683196406b83b14218d1beef66067f126a16keunyoung } 12648a94683196406b83b14218d1beef66067f126a16keunyoung 12658a94683196406b83b14218d1beef66067f126a16keunyoung Mutex::Autolock iLock(mInternalsMutex); 12668a94683196406b83b14218d1beef66067f126a16keunyoung 12678a94683196406b83b14218d1beef66067f126a16keunyoung camera_metadata_entry_t entry; 12688a94683196406b83b14218d1beef66067f126a16keunyoung if (!mIsCapture) { 12698a94683196406b83b14218d1beef66067f126a16keunyoung res = find_camera_metadata_entry(mRequest, 12708a94683196406b83b14218d1beef66067f126a16keunyoung ANDROID_SENSOR_TIMESTAMP, 12718a94683196406b83b14218d1beef66067f126a16keunyoung &entry); 12728a94683196406b83b14218d1beef66067f126a16keunyoung if (res != NO_ERROR) { 12738a94683196406b83b14218d1beef66067f126a16keunyoung ALOGE("%s: error reading reprocessing timestamp: %s (%d)", 12748a94683196406b83b14218d1beef66067f126a16keunyoung __FUNCTION__, strerror(-res), res); 12758a94683196406b83b14218d1beef66067f126a16keunyoung mParent->signalError(); 12768a94683196406b83b14218d1beef66067f126a16keunyoung return false; 12778a94683196406b83b14218d1beef66067f126a16keunyoung } 12788a94683196406b83b14218d1beef66067f126a16keunyoung captureTime = entry.data.i64[0]; 12798a94683196406b83b14218d1beef66067f126a16keunyoung } 12808a94683196406b83b14218d1beef66067f126a16keunyoung 12818a94683196406b83b14218d1beef66067f126a16keunyoung res = find_camera_metadata_entry(mRequest, 12828a94683196406b83b14218d1beef66067f126a16keunyoung ANDROID_REQUEST_FRAME_COUNT, 12838a94683196406b83b14218d1beef66067f126a16keunyoung &entry); 12848a94683196406b83b14218d1beef66067f126a16keunyoung if (res != NO_ERROR) { 12858a94683196406b83b14218d1beef66067f126a16keunyoung ALOGE("%s: error reading frame count tag: %s (%d)", 12868a94683196406b83b14218d1beef66067f126a16keunyoung __FUNCTION__, strerror(-res), res); 12878a94683196406b83b14218d1beef66067f126a16keunyoung mParent->signalError(); 12888a94683196406b83b14218d1beef66067f126a16keunyoung return false; 12898a94683196406b83b14218d1beef66067f126a16keunyoung } 12908a94683196406b83b14218d1beef66067f126a16keunyoung frameNumber = *entry.data.i32; 12918a94683196406b83b14218d1beef66067f126a16keunyoung 12928a94683196406b83b14218d1beef66067f126a16keunyoung res = find_camera_metadata_entry(mRequest, 12938a94683196406b83b14218d1beef66067f126a16keunyoung ANDROID_REQUEST_METADATA_MODE, 12948a94683196406b83b14218d1beef66067f126a16keunyoung &entry); 12958a94683196406b83b14218d1beef66067f126a16keunyoung if (res != NO_ERROR) { 12968a94683196406b83b14218d1beef66067f126a16keunyoung ALOGE("%s: error reading metadata mode tag: %s (%d)", 12978a94683196406b83b14218d1beef66067f126a16keunyoung __FUNCTION__, strerror(-res), res); 12988a94683196406b83b14218d1beef66067f126a16keunyoung mParent->signalError(); 12998a94683196406b83b14218d1beef66067f126a16keunyoung return false; 13008a94683196406b83b14218d1beef66067f126a16keunyoung } 13018a94683196406b83b14218d1beef66067f126a16keunyoung 13028a94683196406b83b14218d1beef66067f126a16keunyoung // Got sensor data and request, construct frame and send it out 13038a94683196406b83b14218d1beef66067f126a16keunyoung ALOGV("Readout: Constructing metadata and frames for request %d", 13048a94683196406b83b14218d1beef66067f126a16keunyoung frameNumber); 13058a94683196406b83b14218d1beef66067f126a16keunyoung 13068a94683196406b83b14218d1beef66067f126a16keunyoung if (*entry.data.u8 == ANDROID_REQUEST_METADATA_MODE_FULL) { 13078a94683196406b83b14218d1beef66067f126a16keunyoung ALOGV("Readout: Metadata requested, constructing"); 13088a94683196406b83b14218d1beef66067f126a16keunyoung 13098a94683196406b83b14218d1beef66067f126a16keunyoung camera_metadata_t *frame = NULL; 13108a94683196406b83b14218d1beef66067f126a16keunyoung 13118a94683196406b83b14218d1beef66067f126a16keunyoung size_t frame_entries = get_camera_metadata_entry_count(mRequest); 13128a94683196406b83b14218d1beef66067f126a16keunyoung size_t frame_data = get_camera_metadata_data_count(mRequest); 13138a94683196406b83b14218d1beef66067f126a16keunyoung 13148a94683196406b83b14218d1beef66067f126a16keunyoung // TODO: Dynamically calculate based on enabled statistics, etc 13158a94683196406b83b14218d1beef66067f126a16keunyoung frame_entries += 10; 13168a94683196406b83b14218d1beef66067f126a16keunyoung frame_data += 100; 13178a94683196406b83b14218d1beef66067f126a16keunyoung 13188a94683196406b83b14218d1beef66067f126a16keunyoung res = mParent->mFrameQueueDst->dequeue_frame(mParent->mFrameQueueDst, 13198a94683196406b83b14218d1beef66067f126a16keunyoung frame_entries, frame_data, &frame); 13208a94683196406b83b14218d1beef66067f126a16keunyoung 13218a94683196406b83b14218d1beef66067f126a16keunyoung if (res != NO_ERROR || frame == NULL) { 13228a94683196406b83b14218d1beef66067f126a16keunyoung ALOGE("%s: Unable to dequeue frame metadata buffer", __FUNCTION__); 13238a94683196406b83b14218d1beef66067f126a16keunyoung mParent->signalError(); 13248a94683196406b83b14218d1beef66067f126a16keunyoung return false; 13258a94683196406b83b14218d1beef66067f126a16keunyoung } 13268a94683196406b83b14218d1beef66067f126a16keunyoung 13278a94683196406b83b14218d1beef66067f126a16keunyoung res = append_camera_metadata(frame, mRequest); 13288a94683196406b83b14218d1beef66067f126a16keunyoung if (res != NO_ERROR) { 13298a94683196406b83b14218d1beef66067f126a16keunyoung ALOGE("Unable to append request metadata"); 13308a94683196406b83b14218d1beef66067f126a16keunyoung } 13318a94683196406b83b14218d1beef66067f126a16keunyoung 13328a94683196406b83b14218d1beef66067f126a16keunyoung if (mIsCapture) { 13338a94683196406b83b14218d1beef66067f126a16keunyoung add_camera_metadata_entry(frame, 13348a94683196406b83b14218d1beef66067f126a16keunyoung ANDROID_SENSOR_TIMESTAMP, 13358a94683196406b83b14218d1beef66067f126a16keunyoung &captureTime, 13368a94683196406b83b14218d1beef66067f126a16keunyoung 1); 13378a94683196406b83b14218d1beef66067f126a16keunyoung 13388a94683196406b83b14218d1beef66067f126a16keunyoung collectStatisticsMetadata(frame); 13398a94683196406b83b14218d1beef66067f126a16keunyoung // TODO: Collect all final values used from sensor in addition to timestamp 13408a94683196406b83b14218d1beef66067f126a16keunyoung } 13418a94683196406b83b14218d1beef66067f126a16keunyoung 13428a94683196406b83b14218d1beef66067f126a16keunyoung ALOGV("Readout: Enqueue frame %d", frameNumber); 13438a94683196406b83b14218d1beef66067f126a16keunyoung mParent->mFrameQueueDst->enqueue_frame(mParent->mFrameQueueDst, 13448a94683196406b83b14218d1beef66067f126a16keunyoung frame); 13458a94683196406b83b14218d1beef66067f126a16keunyoung } 13468a94683196406b83b14218d1beef66067f126a16keunyoung ALOGV("Readout: Free request"); 13478a94683196406b83b14218d1beef66067f126a16keunyoung res = mParent->mRequestQueueSrc->free_request(mParent->mRequestQueueSrc, mRequest); 13488a94683196406b83b14218d1beef66067f126a16keunyoung if (res != NO_ERROR) { 13498a94683196406b83b14218d1beef66067f126a16keunyoung ALOGE("%s: Unable to return request buffer to queue: %d", 13508a94683196406b83b14218d1beef66067f126a16keunyoung __FUNCTION__, res); 13518a94683196406b83b14218d1beef66067f126a16keunyoung mParent->signalError(); 13528a94683196406b83b14218d1beef66067f126a16keunyoung return false; 13538a94683196406b83b14218d1beef66067f126a16keunyoung } 13548a94683196406b83b14218d1beef66067f126a16keunyoung mRequest = NULL; 13558a94683196406b83b14218d1beef66067f126a16keunyoung 13568a94683196406b83b14218d1beef66067f126a16keunyoung int compressedBufferIndex = -1; 13573725c7c982eac52ec64a625e82f306822452941cColin Cross ALOGV("Readout: Processing %zu buffers", mBuffers->size()); 13588a94683196406b83b14218d1beef66067f126a16keunyoung for (size_t i = 0; i < mBuffers->size(); i++) { 13598a94683196406b83b14218d1beef66067f126a16keunyoung const StreamBuffer &b = (*mBuffers)[i]; 13603725c7c982eac52ec64a625e82f306822452941cColin Cross ALOGV("Readout: Buffer %zu: Stream %d, %d x %d, format 0x%x, stride %d", 13618a94683196406b83b14218d1beef66067f126a16keunyoung i, b.streamId, b.width, b.height, b.format, b.stride); 13628a94683196406b83b14218d1beef66067f126a16keunyoung if (b.streamId > 0) { 13638a94683196406b83b14218d1beef66067f126a16keunyoung if (b.format == HAL_PIXEL_FORMAT_BLOB) { 13648a94683196406b83b14218d1beef66067f126a16keunyoung // Assumes only one BLOB buffer type per capture 13658a94683196406b83b14218d1beef66067f126a16keunyoung compressedBufferIndex = i; 13668a94683196406b83b14218d1beef66067f126a16keunyoung } else { 13673725c7c982eac52ec64a625e82f306822452941cColin Cross ALOGV("Readout: Sending image buffer %zu (%p) to output stream %d", 13688a94683196406b83b14218d1beef66067f126a16keunyoung i, (void*)*(b.buffer), b.streamId); 13698a94683196406b83b14218d1beef66067f126a16keunyoung GraphicBufferMapper::get().unlock(*(b.buffer)); 13708a94683196406b83b14218d1beef66067f126a16keunyoung const Stream &s = mParent->getStreamInfo(b.streamId); 13718a94683196406b83b14218d1beef66067f126a16keunyoung res = s.ops->enqueue_buffer(s.ops, captureTime, b.buffer); 13728a94683196406b83b14218d1beef66067f126a16keunyoung if (res != OK) { 13738a94683196406b83b14218d1beef66067f126a16keunyoung ALOGE("Error enqueuing image buffer %p: %s (%d)", b.buffer, 13748a94683196406b83b14218d1beef66067f126a16keunyoung strerror(-res), res); 13758a94683196406b83b14218d1beef66067f126a16keunyoung mParent->signalError(); 13768a94683196406b83b14218d1beef66067f126a16keunyoung } 13778a94683196406b83b14218d1beef66067f126a16keunyoung } 13788a94683196406b83b14218d1beef66067f126a16keunyoung } 13798a94683196406b83b14218d1beef66067f126a16keunyoung } 13808a94683196406b83b14218d1beef66067f126a16keunyoung 13818a94683196406b83b14218d1beef66067f126a16keunyoung if (compressedBufferIndex == -1) { 13828a94683196406b83b14218d1beef66067f126a16keunyoung delete mBuffers; 13838a94683196406b83b14218d1beef66067f126a16keunyoung } else { 13848a94683196406b83b14218d1beef66067f126a16keunyoung ALOGV("Readout: Starting JPEG compression for buffer %d, stream %d", 13858a94683196406b83b14218d1beef66067f126a16keunyoung compressedBufferIndex, 13868a94683196406b83b14218d1beef66067f126a16keunyoung (*mBuffers)[compressedBufferIndex].streamId); 138757ac67ad91c44ffd875b186f124234c2ab1958f3Eino-Ville Talvala mJpegTimestamp = captureTime; 138857ac67ad91c44ffd875b186f124234c2ab1958f3Eino-Ville Talvala // Takes ownership of mBuffers 138957ac67ad91c44ffd875b186f124234c2ab1958f3Eino-Ville Talvala mParent->mJpegCompressor->start(mBuffers, this); 13908a94683196406b83b14218d1beef66067f126a16keunyoung } 139157ac67ad91c44ffd875b186f124234c2ab1958f3Eino-Ville Talvala mBuffers = NULL; 13928a94683196406b83b14218d1beef66067f126a16keunyoung 13938a94683196406b83b14218d1beef66067f126a16keunyoung Mutex::Autolock l(mInputMutex); 13948a94683196406b83b14218d1beef66067f126a16keunyoung mRequestCount--; 13958a94683196406b83b14218d1beef66067f126a16keunyoung ALOGV("Readout: Done with request %d", frameNumber); 13968a94683196406b83b14218d1beef66067f126a16keunyoung return true; 13978a94683196406b83b14218d1beef66067f126a16keunyoung} 13988a94683196406b83b14218d1beef66067f126a16keunyoung 139957ac67ad91c44ffd875b186f124234c2ab1958f3Eino-Ville Talvalavoid EmulatedFakeCamera2::ReadoutThread::onJpegDone( 140057ac67ad91c44ffd875b186f124234c2ab1958f3Eino-Ville Talvala const StreamBuffer &jpegBuffer, bool success) { 140157ac67ad91c44ffd875b186f124234c2ab1958f3Eino-Ville Talvala status_t res; 140257ac67ad91c44ffd875b186f124234c2ab1958f3Eino-Ville Talvala if (!success) { 140357ac67ad91c44ffd875b186f124234c2ab1958f3Eino-Ville Talvala ALOGE("%s: Error queueing compressed image buffer %p", 140457ac67ad91c44ffd875b186f124234c2ab1958f3Eino-Ville Talvala __FUNCTION__, jpegBuffer.buffer); 140557ac67ad91c44ffd875b186f124234c2ab1958f3Eino-Ville Talvala mParent->signalError(); 140657ac67ad91c44ffd875b186f124234c2ab1958f3Eino-Ville Talvala return; 140757ac67ad91c44ffd875b186f124234c2ab1958f3Eino-Ville Talvala } 140857ac67ad91c44ffd875b186f124234c2ab1958f3Eino-Ville Talvala 140957ac67ad91c44ffd875b186f124234c2ab1958f3Eino-Ville Talvala // Write to JPEG output stream 141057ac67ad91c44ffd875b186f124234c2ab1958f3Eino-Ville Talvala ALOGV("%s: Compression complete, pushing to stream %d", __FUNCTION__, 141157ac67ad91c44ffd875b186f124234c2ab1958f3Eino-Ville Talvala jpegBuffer.streamId); 141257ac67ad91c44ffd875b186f124234c2ab1958f3Eino-Ville Talvala 141357ac67ad91c44ffd875b186f124234c2ab1958f3Eino-Ville Talvala GraphicBufferMapper::get().unlock(*(jpegBuffer.buffer)); 141457ac67ad91c44ffd875b186f124234c2ab1958f3Eino-Ville Talvala const Stream &s = mParent->getStreamInfo(jpegBuffer.streamId); 141557ac67ad91c44ffd875b186f124234c2ab1958f3Eino-Ville Talvala res = s.ops->enqueue_buffer(s.ops, mJpegTimestamp, jpegBuffer.buffer); 141657ac67ad91c44ffd875b186f124234c2ab1958f3Eino-Ville Talvala} 141757ac67ad91c44ffd875b186f124234c2ab1958f3Eino-Ville Talvala 141857ac67ad91c44ffd875b186f124234c2ab1958f3Eino-Ville Talvalavoid EmulatedFakeCamera2::ReadoutThread::onJpegInputDone( 141957ac67ad91c44ffd875b186f124234c2ab1958f3Eino-Ville Talvala const StreamBuffer &inputBuffer) { 142057ac67ad91c44ffd875b186f124234c2ab1958f3Eino-Ville Talvala status_t res; 142157ac67ad91c44ffd875b186f124234c2ab1958f3Eino-Ville Talvala GraphicBufferMapper::get().unlock(*(inputBuffer.buffer)); 142257ac67ad91c44ffd875b186f124234c2ab1958f3Eino-Ville Talvala const ReprocessStream &s = 142357ac67ad91c44ffd875b186f124234c2ab1958f3Eino-Ville Talvala mParent->getReprocessStreamInfo(-inputBuffer.streamId); 142457ac67ad91c44ffd875b186f124234c2ab1958f3Eino-Ville Talvala res = s.ops->release_buffer(s.ops, inputBuffer.buffer); 142557ac67ad91c44ffd875b186f124234c2ab1958f3Eino-Ville Talvala if (res != OK) { 142657ac67ad91c44ffd875b186f124234c2ab1958f3Eino-Ville Talvala ALOGE("Error releasing reprocess buffer %p: %s (%d)", 142757ac67ad91c44ffd875b186f124234c2ab1958f3Eino-Ville Talvala inputBuffer.buffer, strerror(-res), res); 142857ac67ad91c44ffd875b186f124234c2ab1958f3Eino-Ville Talvala mParent->signalError(); 142957ac67ad91c44ffd875b186f124234c2ab1958f3Eino-Ville Talvala } 143057ac67ad91c44ffd875b186f124234c2ab1958f3Eino-Ville Talvala} 143157ac67ad91c44ffd875b186f124234c2ab1958f3Eino-Ville Talvala 14328a94683196406b83b14218d1beef66067f126a16keunyoungstatus_t EmulatedFakeCamera2::ReadoutThread::collectStatisticsMetadata( 14338a94683196406b83b14218d1beef66067f126a16keunyoung camera_metadata_t *frame) { 14348a94683196406b83b14218d1beef66067f126a16keunyoung // Completely fake face rectangles, don't correspond to real faces in scene 14358a94683196406b83b14218d1beef66067f126a16keunyoung ALOGV("Readout: Collecting statistics metadata"); 14368a94683196406b83b14218d1beef66067f126a16keunyoung 14378a94683196406b83b14218d1beef66067f126a16keunyoung status_t res; 14388a94683196406b83b14218d1beef66067f126a16keunyoung camera_metadata_entry_t entry; 14398a94683196406b83b14218d1beef66067f126a16keunyoung res = find_camera_metadata_entry(frame, 14408a94683196406b83b14218d1beef66067f126a16keunyoung ANDROID_STATISTICS_FACE_DETECT_MODE, 14418a94683196406b83b14218d1beef66067f126a16keunyoung &entry); 14428a94683196406b83b14218d1beef66067f126a16keunyoung if (res != OK) { 14438a94683196406b83b14218d1beef66067f126a16keunyoung ALOGE("%s: Unable to find face detect mode!", __FUNCTION__); 14448a94683196406b83b14218d1beef66067f126a16keunyoung return BAD_VALUE; 14458a94683196406b83b14218d1beef66067f126a16keunyoung } 14468a94683196406b83b14218d1beef66067f126a16keunyoung 14478a94683196406b83b14218d1beef66067f126a16keunyoung if (entry.data.u8[0] == ANDROID_STATISTICS_FACE_DETECT_MODE_OFF) return OK; 14488a94683196406b83b14218d1beef66067f126a16keunyoung 14498a94683196406b83b14218d1beef66067f126a16keunyoung // The coordinate system for the face regions is the raw sensor pixel 14508a94683196406b83b14218d1beef66067f126a16keunyoung // coordinates. Here, we map from the scene coordinates (0-19 in both axis) 14518a94683196406b83b14218d1beef66067f126a16keunyoung // to raw pixels, for the scene defined in fake-pipeline2/Scene.cpp. We 14528a94683196406b83b14218d1beef66067f126a16keunyoung // approximately place two faces on top of the windows of the house. No 14538a94683196406b83b14218d1beef66067f126a16keunyoung // actual faces exist there, but might one day. Note that this doesn't 14548a94683196406b83b14218d1beef66067f126a16keunyoung // account for the offsets used to account for aspect ratio differences, so 14558a94683196406b83b14218d1beef66067f126a16keunyoung // the rectangles don't line up quite right. 14568a94683196406b83b14218d1beef66067f126a16keunyoung const size_t numFaces = 2; 14578a94683196406b83b14218d1beef66067f126a16keunyoung int32_t rects[numFaces * 4] = { 145879f8dcdb2da221f2e6992f53a83c36b95332fc2eEino-Ville Talvala static_cast<int32_t>(Sensor::kResolution[0] * 10 / 20), 145979f8dcdb2da221f2e6992f53a83c36b95332fc2eEino-Ville Talvala static_cast<int32_t>(Sensor::kResolution[1] * 15 / 20), 146079f8dcdb2da221f2e6992f53a83c36b95332fc2eEino-Ville Talvala static_cast<int32_t>(Sensor::kResolution[0] * 12 / 20), 146179f8dcdb2da221f2e6992f53a83c36b95332fc2eEino-Ville Talvala static_cast<int32_t>(Sensor::kResolution[1] * 17 / 20), 146279f8dcdb2da221f2e6992f53a83c36b95332fc2eEino-Ville Talvala 146379f8dcdb2da221f2e6992f53a83c36b95332fc2eEino-Ville Talvala static_cast<int32_t>(Sensor::kResolution[0] * 16 / 20), 146479f8dcdb2da221f2e6992f53a83c36b95332fc2eEino-Ville Talvala static_cast<int32_t>(Sensor::kResolution[1] * 15 / 20), 146579f8dcdb2da221f2e6992f53a83c36b95332fc2eEino-Ville Talvala static_cast<int32_t>(Sensor::kResolution[0] * 18 / 20), 146679f8dcdb2da221f2e6992f53a83c36b95332fc2eEino-Ville Talvala static_cast<int32_t>(Sensor::kResolution[1] * 17 / 20) 14678a94683196406b83b14218d1beef66067f126a16keunyoung }; 14688a94683196406b83b14218d1beef66067f126a16keunyoung // To simulate some kind of real detection going on, we jitter the rectangles on 14698a94683196406b83b14218d1beef66067f126a16keunyoung // each frame by a few pixels in each dimension. 14708a94683196406b83b14218d1beef66067f126a16keunyoung for (size_t i = 0; i < numFaces * 4; i++) { 14718a94683196406b83b14218d1beef66067f126a16keunyoung rects[i] += (int32_t)(((float)rand() / RAND_MAX) * 6 - 3); 14728a94683196406b83b14218d1beef66067f126a16keunyoung } 14738a94683196406b83b14218d1beef66067f126a16keunyoung // The confidence scores (0-100) are similarly jittered. 14748a94683196406b83b14218d1beef66067f126a16keunyoung uint8_t scores[numFaces] = { 85, 95 }; 14758a94683196406b83b14218d1beef66067f126a16keunyoung for (size_t i = 0; i < numFaces; i++) { 14768a94683196406b83b14218d1beef66067f126a16keunyoung scores[i] += (int32_t)(((float)rand() / RAND_MAX) * 10 - 5); 14778a94683196406b83b14218d1beef66067f126a16keunyoung } 14788a94683196406b83b14218d1beef66067f126a16keunyoung 14798a94683196406b83b14218d1beef66067f126a16keunyoung res = add_camera_metadata_entry(frame, ANDROID_STATISTICS_FACE_RECTANGLES, 14808a94683196406b83b14218d1beef66067f126a16keunyoung rects, numFaces * 4); 14818a94683196406b83b14218d1beef66067f126a16keunyoung if (res != OK) { 14828a94683196406b83b14218d1beef66067f126a16keunyoung ALOGE("%s: Unable to add face rectangles!", __FUNCTION__); 14838a94683196406b83b14218d1beef66067f126a16keunyoung return BAD_VALUE; 14848a94683196406b83b14218d1beef66067f126a16keunyoung } 14858a94683196406b83b14218d1beef66067f126a16keunyoung 14868a94683196406b83b14218d1beef66067f126a16keunyoung res = add_camera_metadata_entry(frame, ANDROID_STATISTICS_FACE_SCORES, 14878a94683196406b83b14218d1beef66067f126a16keunyoung scores, numFaces); 14888a94683196406b83b14218d1beef66067f126a16keunyoung if (res != OK) { 14898a94683196406b83b14218d1beef66067f126a16keunyoung ALOGE("%s: Unable to add face scores!", __FUNCTION__); 14908a94683196406b83b14218d1beef66067f126a16keunyoung return BAD_VALUE; 14918a94683196406b83b14218d1beef66067f126a16keunyoung } 14928a94683196406b83b14218d1beef66067f126a16keunyoung 14938a94683196406b83b14218d1beef66067f126a16keunyoung if (entry.data.u8[0] == ANDROID_STATISTICS_FACE_DETECT_MODE_SIMPLE) return OK; 14948a94683196406b83b14218d1beef66067f126a16keunyoung 14958a94683196406b83b14218d1beef66067f126a16keunyoung // Advanced face detection options - add eye/mouth coordinates. The 14968a94683196406b83b14218d1beef66067f126a16keunyoung // coordinates in order are (leftEyeX, leftEyeY, rightEyeX, rightEyeY, 14978a94683196406b83b14218d1beef66067f126a16keunyoung // mouthX, mouthY). The mapping is the same as the face rectangles. 14988a94683196406b83b14218d1beef66067f126a16keunyoung int32_t features[numFaces * 6] = { 149979f8dcdb2da221f2e6992f53a83c36b95332fc2eEino-Ville Talvala static_cast<int32_t>(Sensor::kResolution[0] * 10.5 / 20), 150079f8dcdb2da221f2e6992f53a83c36b95332fc2eEino-Ville Talvala static_cast<int32_t>(Sensor::kResolution[1] * 16 / 20), 150179f8dcdb2da221f2e6992f53a83c36b95332fc2eEino-Ville Talvala static_cast<int32_t>(Sensor::kResolution[0] * 11.5 / 20), 150279f8dcdb2da221f2e6992f53a83c36b95332fc2eEino-Ville Talvala static_cast<int32_t>(Sensor::kResolution[1] * 16 / 20), 150379f8dcdb2da221f2e6992f53a83c36b95332fc2eEino-Ville Talvala static_cast<int32_t>(Sensor::kResolution[0] * 11 / 20), 150479f8dcdb2da221f2e6992f53a83c36b95332fc2eEino-Ville Talvala static_cast<int32_t>(Sensor::kResolution[1] * 16.5 / 20), 150579f8dcdb2da221f2e6992f53a83c36b95332fc2eEino-Ville Talvala 150679f8dcdb2da221f2e6992f53a83c36b95332fc2eEino-Ville Talvala static_cast<int32_t>(Sensor::kResolution[0] * 16.5 / 20), 150779f8dcdb2da221f2e6992f53a83c36b95332fc2eEino-Ville Talvala static_cast<int32_t>(Sensor::kResolution[1] * 16 / 20), 150879f8dcdb2da221f2e6992f53a83c36b95332fc2eEino-Ville Talvala static_cast<int32_t>(Sensor::kResolution[0] * 17.5 / 20), 150979f8dcdb2da221f2e6992f53a83c36b95332fc2eEino-Ville Talvala static_cast<int32_t>(Sensor::kResolution[1] * 16 / 20), 151079f8dcdb2da221f2e6992f53a83c36b95332fc2eEino-Ville Talvala static_cast<int32_t>(Sensor::kResolution[0] * 17 / 20), 151179f8dcdb2da221f2e6992f53a83c36b95332fc2eEino-Ville Talvala static_cast<int32_t>(Sensor::kResolution[1] * 16.5 / 20), 15128a94683196406b83b14218d1beef66067f126a16keunyoung }; 15138a94683196406b83b14218d1beef66067f126a16keunyoung // Jitter these a bit less than the rects 15148a94683196406b83b14218d1beef66067f126a16keunyoung for (size_t i = 0; i < numFaces * 6; i++) { 15158a94683196406b83b14218d1beef66067f126a16keunyoung features[i] += (int32_t)(((float)rand() / RAND_MAX) * 4 - 2); 15168a94683196406b83b14218d1beef66067f126a16keunyoung } 15178a94683196406b83b14218d1beef66067f126a16keunyoung // These are unique IDs that are used to identify each face while it's 15188a94683196406b83b14218d1beef66067f126a16keunyoung // visible to the detector (if a face went away and came back, it'd get a 15198a94683196406b83b14218d1beef66067f126a16keunyoung // new ID). 15208a94683196406b83b14218d1beef66067f126a16keunyoung int32_t ids[numFaces] = { 15218a94683196406b83b14218d1beef66067f126a16keunyoung 100, 200 15228a94683196406b83b14218d1beef66067f126a16keunyoung }; 15238a94683196406b83b14218d1beef66067f126a16keunyoung 15248a94683196406b83b14218d1beef66067f126a16keunyoung res = add_camera_metadata_entry(frame, ANDROID_STATISTICS_FACE_LANDMARKS, 15258a94683196406b83b14218d1beef66067f126a16keunyoung features, numFaces * 6); 15268a94683196406b83b14218d1beef66067f126a16keunyoung if (res != OK) { 15278a94683196406b83b14218d1beef66067f126a16keunyoung ALOGE("%s: Unable to add face landmarks!", __FUNCTION__); 15288a94683196406b83b14218d1beef66067f126a16keunyoung return BAD_VALUE; 15298a94683196406b83b14218d1beef66067f126a16keunyoung } 15308a94683196406b83b14218d1beef66067f126a16keunyoung 15318a94683196406b83b14218d1beef66067f126a16keunyoung res = add_camera_metadata_entry(frame, ANDROID_STATISTICS_FACE_IDS, 15328a94683196406b83b14218d1beef66067f126a16keunyoung ids, numFaces); 15338a94683196406b83b14218d1beef66067f126a16keunyoung if (res != OK) { 15348a94683196406b83b14218d1beef66067f126a16keunyoung ALOGE("%s: Unable to add face scores!", __FUNCTION__); 15358a94683196406b83b14218d1beef66067f126a16keunyoung return BAD_VALUE; 15368a94683196406b83b14218d1beef66067f126a16keunyoung } 15378a94683196406b83b14218d1beef66067f126a16keunyoung 15388a94683196406b83b14218d1beef66067f126a16keunyoung return OK; 15398a94683196406b83b14218d1beef66067f126a16keunyoung} 15408a94683196406b83b14218d1beef66067f126a16keunyoung 15418a94683196406b83b14218d1beef66067f126a16keunyoungEmulatedFakeCamera2::ControlThread::ControlThread(EmulatedFakeCamera2 *parent): 15428a94683196406b83b14218d1beef66067f126a16keunyoung Thread(false), 15438a94683196406b83b14218d1beef66067f126a16keunyoung mParent(parent) { 15448a94683196406b83b14218d1beef66067f126a16keunyoung mRunning = false; 15458a94683196406b83b14218d1beef66067f126a16keunyoung} 15468a94683196406b83b14218d1beef66067f126a16keunyoung 15478a94683196406b83b14218d1beef66067f126a16keunyoungEmulatedFakeCamera2::ControlThread::~ControlThread() { 15488a94683196406b83b14218d1beef66067f126a16keunyoung} 15498a94683196406b83b14218d1beef66067f126a16keunyoung 15508a94683196406b83b14218d1beef66067f126a16keunyoungstatus_t EmulatedFakeCamera2::ControlThread::readyToRun() { 15518a94683196406b83b14218d1beef66067f126a16keunyoung Mutex::Autolock lock(mInputMutex); 15528a94683196406b83b14218d1beef66067f126a16keunyoung 15538a94683196406b83b14218d1beef66067f126a16keunyoung ALOGV("Starting up ControlThread"); 15548a94683196406b83b14218d1beef66067f126a16keunyoung mRunning = true; 15558a94683196406b83b14218d1beef66067f126a16keunyoung mStartAf = false; 15568a94683196406b83b14218d1beef66067f126a16keunyoung mCancelAf = false; 15578a94683196406b83b14218d1beef66067f126a16keunyoung mStartPrecapture = false; 15588a94683196406b83b14218d1beef66067f126a16keunyoung 15598a94683196406b83b14218d1beef66067f126a16keunyoung mControlMode = ANDROID_CONTROL_MODE_AUTO; 15608a94683196406b83b14218d1beef66067f126a16keunyoung 15618a94683196406b83b14218d1beef66067f126a16keunyoung mEffectMode = ANDROID_CONTROL_EFFECT_MODE_OFF; 15628a94683196406b83b14218d1beef66067f126a16keunyoung mSceneMode = ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY; 15638a94683196406b83b14218d1beef66067f126a16keunyoung 15648a94683196406b83b14218d1beef66067f126a16keunyoung mAfMode = ANDROID_CONTROL_AF_MODE_AUTO; 15658a94683196406b83b14218d1beef66067f126a16keunyoung mAfModeChange = false; 15668a94683196406b83b14218d1beef66067f126a16keunyoung 15678a94683196406b83b14218d1beef66067f126a16keunyoung mAeMode = ANDROID_CONTROL_AE_MODE_ON; 15688a94683196406b83b14218d1beef66067f126a16keunyoung mAwbMode = ANDROID_CONTROL_AWB_MODE_AUTO; 15698a94683196406b83b14218d1beef66067f126a16keunyoung 15708a94683196406b83b14218d1beef66067f126a16keunyoung mAfTriggerId = 0; 15718a94683196406b83b14218d1beef66067f126a16keunyoung mPrecaptureTriggerId = 0; 15728a94683196406b83b14218d1beef66067f126a16keunyoung 15738a94683196406b83b14218d1beef66067f126a16keunyoung mAfState = ANDROID_CONTROL_AF_STATE_INACTIVE; 15748a94683196406b83b14218d1beef66067f126a16keunyoung mAeState = ANDROID_CONTROL_AE_STATE_INACTIVE; 15758a94683196406b83b14218d1beef66067f126a16keunyoung mAwbState = ANDROID_CONTROL_AWB_STATE_INACTIVE; 15768a94683196406b83b14218d1beef66067f126a16keunyoung 15778a94683196406b83b14218d1beef66067f126a16keunyoung mExposureTime = kNormalExposureTime; 15788a94683196406b83b14218d1beef66067f126a16keunyoung 15798a94683196406b83b14218d1beef66067f126a16keunyoung mInputSignal.signal(); 15808a94683196406b83b14218d1beef66067f126a16keunyoung return NO_ERROR; 15818a94683196406b83b14218d1beef66067f126a16keunyoung} 15828a94683196406b83b14218d1beef66067f126a16keunyoung 15838a94683196406b83b14218d1beef66067f126a16keunyoungstatus_t EmulatedFakeCamera2::ControlThread::waitUntilRunning() { 15848a94683196406b83b14218d1beef66067f126a16keunyoung Mutex::Autolock lock(mInputMutex); 15858a94683196406b83b14218d1beef66067f126a16keunyoung if (!mRunning) { 15868a94683196406b83b14218d1beef66067f126a16keunyoung ALOGV("Waiting for control thread to start"); 15878a94683196406b83b14218d1beef66067f126a16keunyoung mInputSignal.wait(mInputMutex); 15888a94683196406b83b14218d1beef66067f126a16keunyoung } 15898a94683196406b83b14218d1beef66067f126a16keunyoung return OK; 15908a94683196406b83b14218d1beef66067f126a16keunyoung} 15918a94683196406b83b14218d1beef66067f126a16keunyoung 15928a94683196406b83b14218d1beef66067f126a16keunyoung// Override android.control.* fields with 3A values before sending request to sensor 15938a94683196406b83b14218d1beef66067f126a16keunyoungstatus_t EmulatedFakeCamera2::ControlThread::processRequest(camera_metadata_t *request) { 15948a94683196406b83b14218d1beef66067f126a16keunyoung Mutex::Autolock lock(mInputMutex); 15958a94683196406b83b14218d1beef66067f126a16keunyoung // TODO: Add handling for all android.control.* fields here 15968a94683196406b83b14218d1beef66067f126a16keunyoung camera_metadata_entry_t mode; 15978a94683196406b83b14218d1beef66067f126a16keunyoung status_t res; 15988a94683196406b83b14218d1beef66067f126a16keunyoung 15998a94683196406b83b14218d1beef66067f126a16keunyoung#define READ_IF_OK(res, what, def) \ 16008a94683196406b83b14218d1beef66067f126a16keunyoung (((res) == OK) ? (what) : (uint8_t)(def)) 16018a94683196406b83b14218d1beef66067f126a16keunyoung 16028a94683196406b83b14218d1beef66067f126a16keunyoung res = find_camera_metadata_entry(request, 16038a94683196406b83b14218d1beef66067f126a16keunyoung ANDROID_CONTROL_MODE, 16048a94683196406b83b14218d1beef66067f126a16keunyoung &mode); 16058a94683196406b83b14218d1beef66067f126a16keunyoung mControlMode = READ_IF_OK(res, mode.data.u8[0], ANDROID_CONTROL_MODE_OFF); 16068a94683196406b83b14218d1beef66067f126a16keunyoung 16078a94683196406b83b14218d1beef66067f126a16keunyoung // disable all 3A 16088a94683196406b83b14218d1beef66067f126a16keunyoung if (mControlMode == ANDROID_CONTROL_MODE_OFF) { 16098a94683196406b83b14218d1beef66067f126a16keunyoung mEffectMode = ANDROID_CONTROL_EFFECT_MODE_OFF; 1610c653d1c8455317956955c9a633018be4e15a113dRuben Brunk mSceneMode = ANDROID_CONTROL_SCENE_MODE_DISABLED; 16118a94683196406b83b14218d1beef66067f126a16keunyoung mAfMode = ANDROID_CONTROL_AF_MODE_OFF; 16128a94683196406b83b14218d1beef66067f126a16keunyoung mAeLock = ANDROID_CONTROL_AE_LOCK_ON; 16138a94683196406b83b14218d1beef66067f126a16keunyoung mAeMode = ANDROID_CONTROL_AE_MODE_OFF; 16148a94683196406b83b14218d1beef66067f126a16keunyoung mAfModeChange = true; 16158a94683196406b83b14218d1beef66067f126a16keunyoung mStartAf = false; 16168a94683196406b83b14218d1beef66067f126a16keunyoung mCancelAf = true; 16178a94683196406b83b14218d1beef66067f126a16keunyoung mAeState = ANDROID_CONTROL_AE_STATE_INACTIVE; 16188a94683196406b83b14218d1beef66067f126a16keunyoung mAwbMode = ANDROID_CONTROL_AWB_MODE_OFF; 16198a94683196406b83b14218d1beef66067f126a16keunyoung return res; 16208a94683196406b83b14218d1beef66067f126a16keunyoung } 16218a94683196406b83b14218d1beef66067f126a16keunyoung 16228a94683196406b83b14218d1beef66067f126a16keunyoung res = find_camera_metadata_entry(request, 16238a94683196406b83b14218d1beef66067f126a16keunyoung ANDROID_CONTROL_EFFECT_MODE, 16248a94683196406b83b14218d1beef66067f126a16keunyoung &mode); 16258a94683196406b83b14218d1beef66067f126a16keunyoung mEffectMode = READ_IF_OK(res, mode.data.u8[0], 16268a94683196406b83b14218d1beef66067f126a16keunyoung ANDROID_CONTROL_EFFECT_MODE_OFF); 16278a94683196406b83b14218d1beef66067f126a16keunyoung 16288a94683196406b83b14218d1beef66067f126a16keunyoung res = find_camera_metadata_entry(request, 16298a94683196406b83b14218d1beef66067f126a16keunyoung ANDROID_CONTROL_SCENE_MODE, 16308a94683196406b83b14218d1beef66067f126a16keunyoung &mode); 16318a94683196406b83b14218d1beef66067f126a16keunyoung mSceneMode = READ_IF_OK(res, mode.data.u8[0], 1632c653d1c8455317956955c9a633018be4e15a113dRuben Brunk ANDROID_CONTROL_SCENE_MODE_DISABLED); 16338a94683196406b83b14218d1beef66067f126a16keunyoung 16348a94683196406b83b14218d1beef66067f126a16keunyoung res = find_camera_metadata_entry(request, 16358a94683196406b83b14218d1beef66067f126a16keunyoung ANDROID_CONTROL_AF_MODE, 16368a94683196406b83b14218d1beef66067f126a16keunyoung &mode); 16378a94683196406b83b14218d1beef66067f126a16keunyoung if (mAfMode != mode.data.u8[0]) { 16388a94683196406b83b14218d1beef66067f126a16keunyoung ALOGV("AF new mode: %d, old mode %d", mode.data.u8[0], mAfMode); 16398a94683196406b83b14218d1beef66067f126a16keunyoung mAfMode = mode.data.u8[0]; 16408a94683196406b83b14218d1beef66067f126a16keunyoung mAfModeChange = true; 16418a94683196406b83b14218d1beef66067f126a16keunyoung mStartAf = false; 16428a94683196406b83b14218d1beef66067f126a16keunyoung mCancelAf = false; 16438a94683196406b83b14218d1beef66067f126a16keunyoung } 16448a94683196406b83b14218d1beef66067f126a16keunyoung 16458a94683196406b83b14218d1beef66067f126a16keunyoung res = find_camera_metadata_entry(request, 16468a94683196406b83b14218d1beef66067f126a16keunyoung ANDROID_CONTROL_AE_MODE, 16478a94683196406b83b14218d1beef66067f126a16keunyoung &mode); 16488a94683196406b83b14218d1beef66067f126a16keunyoung mAeMode = READ_IF_OK(res, mode.data.u8[0], 16498a94683196406b83b14218d1beef66067f126a16keunyoung ANDROID_CONTROL_AE_MODE_OFF); 16508a94683196406b83b14218d1beef66067f126a16keunyoung 16518a94683196406b83b14218d1beef66067f126a16keunyoung res = find_camera_metadata_entry(request, 16528a94683196406b83b14218d1beef66067f126a16keunyoung ANDROID_CONTROL_AE_LOCK, 16538a94683196406b83b14218d1beef66067f126a16keunyoung &mode); 16548a94683196406b83b14218d1beef66067f126a16keunyoung uint8_t aeLockVal = READ_IF_OK(res, mode.data.u8[0], 16558a94683196406b83b14218d1beef66067f126a16keunyoung ANDROID_CONTROL_AE_LOCK_ON); 16568a94683196406b83b14218d1beef66067f126a16keunyoung bool aeLock = (aeLockVal == ANDROID_CONTROL_AE_LOCK_ON); 16578a94683196406b83b14218d1beef66067f126a16keunyoung if (mAeLock && !aeLock) { 16588a94683196406b83b14218d1beef66067f126a16keunyoung mAeState = ANDROID_CONTROL_AE_STATE_INACTIVE; 16598a94683196406b83b14218d1beef66067f126a16keunyoung } 16608a94683196406b83b14218d1beef66067f126a16keunyoung mAeLock = aeLock; 16618a94683196406b83b14218d1beef66067f126a16keunyoung 16628a94683196406b83b14218d1beef66067f126a16keunyoung res = find_camera_metadata_entry(request, 16638a94683196406b83b14218d1beef66067f126a16keunyoung ANDROID_CONTROL_AWB_MODE, 16648a94683196406b83b14218d1beef66067f126a16keunyoung &mode); 16658a94683196406b83b14218d1beef66067f126a16keunyoung mAwbMode = READ_IF_OK(res, mode.data.u8[0], 16668a94683196406b83b14218d1beef66067f126a16keunyoung ANDROID_CONTROL_AWB_MODE_OFF); 16678a94683196406b83b14218d1beef66067f126a16keunyoung 16688a94683196406b83b14218d1beef66067f126a16keunyoung // TODO: Override more control fields 16698a94683196406b83b14218d1beef66067f126a16keunyoung 16708a94683196406b83b14218d1beef66067f126a16keunyoung if (mAeMode != ANDROID_CONTROL_AE_MODE_OFF) { 16718a94683196406b83b14218d1beef66067f126a16keunyoung camera_metadata_entry_t exposureTime; 16728a94683196406b83b14218d1beef66067f126a16keunyoung res = find_camera_metadata_entry(request, 16738a94683196406b83b14218d1beef66067f126a16keunyoung ANDROID_SENSOR_EXPOSURE_TIME, 16748a94683196406b83b14218d1beef66067f126a16keunyoung &exposureTime); 16758a94683196406b83b14218d1beef66067f126a16keunyoung if (res == OK) { 16768a94683196406b83b14218d1beef66067f126a16keunyoung exposureTime.data.i64[0] = mExposureTime; 16778a94683196406b83b14218d1beef66067f126a16keunyoung } 16788a94683196406b83b14218d1beef66067f126a16keunyoung } 16798a94683196406b83b14218d1beef66067f126a16keunyoung 16808a94683196406b83b14218d1beef66067f126a16keunyoung#undef READ_IF_OK 16818a94683196406b83b14218d1beef66067f126a16keunyoung 16828a94683196406b83b14218d1beef66067f126a16keunyoung return OK; 16838a94683196406b83b14218d1beef66067f126a16keunyoung} 16848a94683196406b83b14218d1beef66067f126a16keunyoung 16858a94683196406b83b14218d1beef66067f126a16keunyoungstatus_t EmulatedFakeCamera2::ControlThread::triggerAction(uint32_t msgType, 16868a94683196406b83b14218d1beef66067f126a16keunyoung int32_t ext1, int32_t ext2) { 16878a94683196406b83b14218d1beef66067f126a16keunyoung ALOGV("%s: Triggering %d (%d, %d)", __FUNCTION__, msgType, ext1, ext2); 16888a94683196406b83b14218d1beef66067f126a16keunyoung Mutex::Autolock lock(mInputMutex); 16898a94683196406b83b14218d1beef66067f126a16keunyoung switch (msgType) { 16908a94683196406b83b14218d1beef66067f126a16keunyoung case CAMERA2_TRIGGER_AUTOFOCUS: 16918a94683196406b83b14218d1beef66067f126a16keunyoung mAfTriggerId = ext1; 16928a94683196406b83b14218d1beef66067f126a16keunyoung mStartAf = true; 16938a94683196406b83b14218d1beef66067f126a16keunyoung mCancelAf = false; 16948a94683196406b83b14218d1beef66067f126a16keunyoung break; 16958a94683196406b83b14218d1beef66067f126a16keunyoung case CAMERA2_TRIGGER_CANCEL_AUTOFOCUS: 16968a94683196406b83b14218d1beef66067f126a16keunyoung mAfTriggerId = ext1; 16978a94683196406b83b14218d1beef66067f126a16keunyoung mStartAf = false; 16988a94683196406b83b14218d1beef66067f126a16keunyoung mCancelAf = true; 16998a94683196406b83b14218d1beef66067f126a16keunyoung break; 17008a94683196406b83b14218d1beef66067f126a16keunyoung case CAMERA2_TRIGGER_PRECAPTURE_METERING: 17018a94683196406b83b14218d1beef66067f126a16keunyoung mPrecaptureTriggerId = ext1; 17028a94683196406b83b14218d1beef66067f126a16keunyoung mStartPrecapture = true; 17038a94683196406b83b14218d1beef66067f126a16keunyoung break; 17048a94683196406b83b14218d1beef66067f126a16keunyoung default: 17058a94683196406b83b14218d1beef66067f126a16keunyoung ALOGE("%s: Unknown action triggered: %d (arguments %d %d)", 17068a94683196406b83b14218d1beef66067f126a16keunyoung __FUNCTION__, msgType, ext1, ext2); 17078a94683196406b83b14218d1beef66067f126a16keunyoung return BAD_VALUE; 17088a94683196406b83b14218d1beef66067f126a16keunyoung } 17098a94683196406b83b14218d1beef66067f126a16keunyoung return OK; 17108a94683196406b83b14218d1beef66067f126a16keunyoung} 17118a94683196406b83b14218d1beef66067f126a16keunyoung 17128a94683196406b83b14218d1beef66067f126a16keunyoungconst nsecs_t EmulatedFakeCamera2::ControlThread::kControlCycleDelay = 100 * MSEC; 17138a94683196406b83b14218d1beef66067f126a16keunyoungconst nsecs_t EmulatedFakeCamera2::ControlThread::kMinAfDuration = 500 * MSEC; 17148a94683196406b83b14218d1beef66067f126a16keunyoungconst nsecs_t EmulatedFakeCamera2::ControlThread::kMaxAfDuration = 900 * MSEC; 17158a94683196406b83b14218d1beef66067f126a16keunyoungconst float EmulatedFakeCamera2::ControlThread::kAfSuccessRate = 0.9; 17168a94683196406b83b14218d1beef66067f126a16keunyoung // Once every 5 seconds 17178a94683196406b83b14218d1beef66067f126a16keunyoungconst float EmulatedFakeCamera2::ControlThread::kContinuousAfStartRate = 17188a94683196406b83b14218d1beef66067f126a16keunyoung kControlCycleDelay / 5.0 * SEC; 17198a94683196406b83b14218d1beef66067f126a16keunyoungconst nsecs_t EmulatedFakeCamera2::ControlThread::kMinAeDuration = 500 * MSEC; 17208a94683196406b83b14218d1beef66067f126a16keunyoungconst nsecs_t EmulatedFakeCamera2::ControlThread::kMaxAeDuration = 2 * SEC; 17218a94683196406b83b14218d1beef66067f126a16keunyoungconst nsecs_t EmulatedFakeCamera2::ControlThread::kMinPrecaptureAeDuration = 100 * MSEC; 17228a94683196406b83b14218d1beef66067f126a16keunyoungconst nsecs_t EmulatedFakeCamera2::ControlThread::kMaxPrecaptureAeDuration = 400 * MSEC; 17238a94683196406b83b14218d1beef66067f126a16keunyoung // Once every 3 seconds 17248a94683196406b83b14218d1beef66067f126a16keunyoungconst float EmulatedFakeCamera2::ControlThread::kAeScanStartRate = 17258a94683196406b83b14218d1beef66067f126a16keunyoung kControlCycleDelay / 3000000000.0; 17268a94683196406b83b14218d1beef66067f126a16keunyoung 17278a94683196406b83b14218d1beef66067f126a16keunyoungconst nsecs_t EmulatedFakeCamera2::ControlThread::kNormalExposureTime = 10 * MSEC; 17288a94683196406b83b14218d1beef66067f126a16keunyoungconst nsecs_t EmulatedFakeCamera2::ControlThread::kExposureJump = 2 * MSEC; 17298a94683196406b83b14218d1beef66067f126a16keunyoungconst nsecs_t EmulatedFakeCamera2::ControlThread::kMinExposureTime = 1 * MSEC; 17308a94683196406b83b14218d1beef66067f126a16keunyoung 17318a94683196406b83b14218d1beef66067f126a16keunyoungbool EmulatedFakeCamera2::ControlThread::threadLoop() { 17328a94683196406b83b14218d1beef66067f126a16keunyoung bool afModeChange = false; 17338a94683196406b83b14218d1beef66067f126a16keunyoung bool afTriggered = false; 17348a94683196406b83b14218d1beef66067f126a16keunyoung bool afCancelled = false; 17358a94683196406b83b14218d1beef66067f126a16keunyoung uint8_t afState; 17368a94683196406b83b14218d1beef66067f126a16keunyoung uint8_t afMode; 17378a94683196406b83b14218d1beef66067f126a16keunyoung int32_t afTriggerId; 17388a94683196406b83b14218d1beef66067f126a16keunyoung bool precaptureTriggered = false; 17398a94683196406b83b14218d1beef66067f126a16keunyoung uint8_t aeState; 17408a94683196406b83b14218d1beef66067f126a16keunyoung uint8_t aeMode; 17418a94683196406b83b14218d1beef66067f126a16keunyoung bool aeLock; 17428a94683196406b83b14218d1beef66067f126a16keunyoung int32_t precaptureTriggerId; 17438a94683196406b83b14218d1beef66067f126a16keunyoung nsecs_t nextSleep = kControlCycleDelay; 17448a94683196406b83b14218d1beef66067f126a16keunyoung 17458a94683196406b83b14218d1beef66067f126a16keunyoung { 17468a94683196406b83b14218d1beef66067f126a16keunyoung Mutex::Autolock lock(mInputMutex); 17478a94683196406b83b14218d1beef66067f126a16keunyoung if (mStartAf) { 17488a94683196406b83b14218d1beef66067f126a16keunyoung ALOGD("Starting AF trigger processing"); 17498a94683196406b83b14218d1beef66067f126a16keunyoung afTriggered = true; 17508a94683196406b83b14218d1beef66067f126a16keunyoung mStartAf = false; 17518a94683196406b83b14218d1beef66067f126a16keunyoung } else if (mCancelAf) { 17528a94683196406b83b14218d1beef66067f126a16keunyoung ALOGD("Starting cancel AF trigger processing"); 17538a94683196406b83b14218d1beef66067f126a16keunyoung afCancelled = true; 17548a94683196406b83b14218d1beef66067f126a16keunyoung mCancelAf = false; 17558a94683196406b83b14218d1beef66067f126a16keunyoung } 17568a94683196406b83b14218d1beef66067f126a16keunyoung afState = mAfState; 17578a94683196406b83b14218d1beef66067f126a16keunyoung afMode = mAfMode; 17588a94683196406b83b14218d1beef66067f126a16keunyoung afModeChange = mAfModeChange; 17598a94683196406b83b14218d1beef66067f126a16keunyoung mAfModeChange = false; 17608a94683196406b83b14218d1beef66067f126a16keunyoung 17618a94683196406b83b14218d1beef66067f126a16keunyoung afTriggerId = mAfTriggerId; 17628a94683196406b83b14218d1beef66067f126a16keunyoung 17638a94683196406b83b14218d1beef66067f126a16keunyoung if(mStartPrecapture) { 17648a94683196406b83b14218d1beef66067f126a16keunyoung ALOGD("Starting precapture trigger processing"); 17658a94683196406b83b14218d1beef66067f126a16keunyoung precaptureTriggered = true; 17668a94683196406b83b14218d1beef66067f126a16keunyoung mStartPrecapture = false; 17678a94683196406b83b14218d1beef66067f126a16keunyoung } 17688a94683196406b83b14218d1beef66067f126a16keunyoung aeState = mAeState; 17698a94683196406b83b14218d1beef66067f126a16keunyoung aeMode = mAeMode; 17708a94683196406b83b14218d1beef66067f126a16keunyoung aeLock = mAeLock; 17718a94683196406b83b14218d1beef66067f126a16keunyoung precaptureTriggerId = mPrecaptureTriggerId; 17728a94683196406b83b14218d1beef66067f126a16keunyoung } 17738a94683196406b83b14218d1beef66067f126a16keunyoung 17748a94683196406b83b14218d1beef66067f126a16keunyoung if (afCancelled || afModeChange) { 17758a94683196406b83b14218d1beef66067f126a16keunyoung ALOGV("Resetting AF state due to cancel/mode change"); 17768a94683196406b83b14218d1beef66067f126a16keunyoung afState = ANDROID_CONTROL_AF_STATE_INACTIVE; 17778a94683196406b83b14218d1beef66067f126a16keunyoung updateAfState(afState, afTriggerId); 17788a94683196406b83b14218d1beef66067f126a16keunyoung mAfScanDuration = 0; 17798a94683196406b83b14218d1beef66067f126a16keunyoung mLockAfterPassiveScan = false; 17808a94683196406b83b14218d1beef66067f126a16keunyoung } 17818a94683196406b83b14218d1beef66067f126a16keunyoung 17828a94683196406b83b14218d1beef66067f126a16keunyoung uint8_t oldAfState = afState; 17838a94683196406b83b14218d1beef66067f126a16keunyoung 17848a94683196406b83b14218d1beef66067f126a16keunyoung if (afTriggered) { 17858a94683196406b83b14218d1beef66067f126a16keunyoung afState = processAfTrigger(afMode, afState); 17868a94683196406b83b14218d1beef66067f126a16keunyoung } 17878a94683196406b83b14218d1beef66067f126a16keunyoung 17888a94683196406b83b14218d1beef66067f126a16keunyoung afState = maybeStartAfScan(afMode, afState); 17898a94683196406b83b14218d1beef66067f126a16keunyoung afState = updateAfScan(afMode, afState, &nextSleep); 17908a94683196406b83b14218d1beef66067f126a16keunyoung updateAfState(afState, afTriggerId); 17918a94683196406b83b14218d1beef66067f126a16keunyoung 17928a94683196406b83b14218d1beef66067f126a16keunyoung if (precaptureTriggered) { 17938a94683196406b83b14218d1beef66067f126a16keunyoung aeState = processPrecaptureTrigger(aeMode, aeState); 17948a94683196406b83b14218d1beef66067f126a16keunyoung } 17958a94683196406b83b14218d1beef66067f126a16keunyoung 17968a94683196406b83b14218d1beef66067f126a16keunyoung aeState = maybeStartAeScan(aeMode, aeLock, aeState); 17978a94683196406b83b14218d1beef66067f126a16keunyoung aeState = updateAeScan(aeMode, aeLock, aeState, &nextSleep); 17988a94683196406b83b14218d1beef66067f126a16keunyoung updateAeState(aeState, precaptureTriggerId); 17998a94683196406b83b14218d1beef66067f126a16keunyoung 18008a94683196406b83b14218d1beef66067f126a16keunyoung int ret; 18018a94683196406b83b14218d1beef66067f126a16keunyoung timespec t; 18028a94683196406b83b14218d1beef66067f126a16keunyoung t.tv_sec = 0; 18038a94683196406b83b14218d1beef66067f126a16keunyoung t.tv_nsec = nextSleep; 18048a94683196406b83b14218d1beef66067f126a16keunyoung do { 18058a94683196406b83b14218d1beef66067f126a16keunyoung ret = nanosleep(&t, &t); 18068a94683196406b83b14218d1beef66067f126a16keunyoung } while (ret != 0); 18078a94683196406b83b14218d1beef66067f126a16keunyoung 18088a94683196406b83b14218d1beef66067f126a16keunyoung if (mAfScanDuration > 0) { 18098a94683196406b83b14218d1beef66067f126a16keunyoung mAfScanDuration -= nextSleep; 18108a94683196406b83b14218d1beef66067f126a16keunyoung } 18118a94683196406b83b14218d1beef66067f126a16keunyoung if (mAeScanDuration > 0) { 18128a94683196406b83b14218d1beef66067f126a16keunyoung mAeScanDuration -= nextSleep; 18138a94683196406b83b14218d1beef66067f126a16keunyoung } 18148a94683196406b83b14218d1beef66067f126a16keunyoung 18158a94683196406b83b14218d1beef66067f126a16keunyoung return true; 18168a94683196406b83b14218d1beef66067f126a16keunyoung} 18178a94683196406b83b14218d1beef66067f126a16keunyoung 18188a94683196406b83b14218d1beef66067f126a16keunyoungint EmulatedFakeCamera2::ControlThread::processAfTrigger(uint8_t afMode, 18198a94683196406b83b14218d1beef66067f126a16keunyoung uint8_t afState) { 18208a94683196406b83b14218d1beef66067f126a16keunyoung switch (afMode) { 18218a94683196406b83b14218d1beef66067f126a16keunyoung case ANDROID_CONTROL_AF_MODE_OFF: 18228a94683196406b83b14218d1beef66067f126a16keunyoung case ANDROID_CONTROL_AF_MODE_EDOF: 18238a94683196406b83b14218d1beef66067f126a16keunyoung // Do nothing 18248a94683196406b83b14218d1beef66067f126a16keunyoung break; 18258a94683196406b83b14218d1beef66067f126a16keunyoung case ANDROID_CONTROL_AF_MODE_MACRO: 18268a94683196406b83b14218d1beef66067f126a16keunyoung case ANDROID_CONTROL_AF_MODE_AUTO: 18278a94683196406b83b14218d1beef66067f126a16keunyoung switch (afState) { 18288a94683196406b83b14218d1beef66067f126a16keunyoung case ANDROID_CONTROL_AF_STATE_INACTIVE: 18298a94683196406b83b14218d1beef66067f126a16keunyoung case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED: 18308a94683196406b83b14218d1beef66067f126a16keunyoung case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED: 18318a94683196406b83b14218d1beef66067f126a16keunyoung // Start new focusing cycle 18328a94683196406b83b14218d1beef66067f126a16keunyoung mAfScanDuration = ((double)rand() / RAND_MAX) * 18338a94683196406b83b14218d1beef66067f126a16keunyoung (kMaxAfDuration - kMinAfDuration) + kMinAfDuration; 18348a94683196406b83b14218d1beef66067f126a16keunyoung afState = ANDROID_CONTROL_AF_STATE_ACTIVE_SCAN; 18353725c7c982eac52ec64a625e82f306822452941cColin Cross ALOGV("%s: AF scan start, duration %" PRId64 " ms", 18368a94683196406b83b14218d1beef66067f126a16keunyoung __FUNCTION__, mAfScanDuration / 1000000); 18378a94683196406b83b14218d1beef66067f126a16keunyoung break; 18388a94683196406b83b14218d1beef66067f126a16keunyoung case ANDROID_CONTROL_AF_STATE_ACTIVE_SCAN: 18398a94683196406b83b14218d1beef66067f126a16keunyoung // Ignore new request, already scanning 18408a94683196406b83b14218d1beef66067f126a16keunyoung break; 18418a94683196406b83b14218d1beef66067f126a16keunyoung default: 18428a94683196406b83b14218d1beef66067f126a16keunyoung ALOGE("Unexpected AF state in AUTO/MACRO AF mode: %d", 18438a94683196406b83b14218d1beef66067f126a16keunyoung afState); 18448a94683196406b83b14218d1beef66067f126a16keunyoung } 18458a94683196406b83b14218d1beef66067f126a16keunyoung break; 18468a94683196406b83b14218d1beef66067f126a16keunyoung case ANDROID_CONTROL_AF_MODE_CONTINUOUS_PICTURE: 18478a94683196406b83b14218d1beef66067f126a16keunyoung switch (afState) { 18488a94683196406b83b14218d1beef66067f126a16keunyoung // Picture mode waits for passive scan to complete 18498a94683196406b83b14218d1beef66067f126a16keunyoung case ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN: 18508a94683196406b83b14218d1beef66067f126a16keunyoung mLockAfterPassiveScan = true; 18518a94683196406b83b14218d1beef66067f126a16keunyoung break; 18528a94683196406b83b14218d1beef66067f126a16keunyoung case ANDROID_CONTROL_AF_STATE_INACTIVE: 18538a94683196406b83b14218d1beef66067f126a16keunyoung afState = ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED; 18548a94683196406b83b14218d1beef66067f126a16keunyoung break; 18558a94683196406b83b14218d1beef66067f126a16keunyoung case ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED: 18568a94683196406b83b14218d1beef66067f126a16keunyoung afState = ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED; 18578a94683196406b83b14218d1beef66067f126a16keunyoung break; 18588a94683196406b83b14218d1beef66067f126a16keunyoung case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED: 18598a94683196406b83b14218d1beef66067f126a16keunyoung case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED: 18608a94683196406b83b14218d1beef66067f126a16keunyoung // Must cancel to get out of these states 18618a94683196406b83b14218d1beef66067f126a16keunyoung break; 18628a94683196406b83b14218d1beef66067f126a16keunyoung default: 18638a94683196406b83b14218d1beef66067f126a16keunyoung ALOGE("Unexpected AF state in CONTINUOUS_PICTURE AF mode: %d", 18648a94683196406b83b14218d1beef66067f126a16keunyoung afState); 18658a94683196406b83b14218d1beef66067f126a16keunyoung } 18668a94683196406b83b14218d1beef66067f126a16keunyoung break; 18678a94683196406b83b14218d1beef66067f126a16keunyoung case ANDROID_CONTROL_AF_MODE_CONTINUOUS_VIDEO: 18688a94683196406b83b14218d1beef66067f126a16keunyoung switch (afState) { 18698a94683196406b83b14218d1beef66067f126a16keunyoung // Video mode does not wait for passive scan to complete 18708a94683196406b83b14218d1beef66067f126a16keunyoung case ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN: 18718a94683196406b83b14218d1beef66067f126a16keunyoung case ANDROID_CONTROL_AF_STATE_INACTIVE: 18728a94683196406b83b14218d1beef66067f126a16keunyoung afState = ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED; 18738a94683196406b83b14218d1beef66067f126a16keunyoung break; 18748a94683196406b83b14218d1beef66067f126a16keunyoung case ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED: 18758a94683196406b83b14218d1beef66067f126a16keunyoung afState = ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED; 18768a94683196406b83b14218d1beef66067f126a16keunyoung break; 18778a94683196406b83b14218d1beef66067f126a16keunyoung case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED: 18788a94683196406b83b14218d1beef66067f126a16keunyoung case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED: 18798a94683196406b83b14218d1beef66067f126a16keunyoung // Must cancel to get out of these states 18808a94683196406b83b14218d1beef66067f126a16keunyoung break; 18818a94683196406b83b14218d1beef66067f126a16keunyoung default: 18828a94683196406b83b14218d1beef66067f126a16keunyoung ALOGE("Unexpected AF state in CONTINUOUS_VIDEO AF mode: %d", 18838a94683196406b83b14218d1beef66067f126a16keunyoung afState); 18848a94683196406b83b14218d1beef66067f126a16keunyoung } 18858a94683196406b83b14218d1beef66067f126a16keunyoung break; 18868a94683196406b83b14218d1beef66067f126a16keunyoung default: 18878a94683196406b83b14218d1beef66067f126a16keunyoung break; 18888a94683196406b83b14218d1beef66067f126a16keunyoung } 18898a94683196406b83b14218d1beef66067f126a16keunyoung return afState; 18908a94683196406b83b14218d1beef66067f126a16keunyoung} 18918a94683196406b83b14218d1beef66067f126a16keunyoung 18928a94683196406b83b14218d1beef66067f126a16keunyoungint EmulatedFakeCamera2::ControlThread::maybeStartAfScan(uint8_t afMode, 18938a94683196406b83b14218d1beef66067f126a16keunyoung uint8_t afState) { 18948a94683196406b83b14218d1beef66067f126a16keunyoung if ((afMode == ANDROID_CONTROL_AF_MODE_CONTINUOUS_VIDEO || 18958a94683196406b83b14218d1beef66067f126a16keunyoung afMode == ANDROID_CONTROL_AF_MODE_CONTINUOUS_PICTURE) && 18968a94683196406b83b14218d1beef66067f126a16keunyoung (afState == ANDROID_CONTROL_AF_STATE_INACTIVE || 18978a94683196406b83b14218d1beef66067f126a16keunyoung afState == ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED)) { 18988a94683196406b83b14218d1beef66067f126a16keunyoung 18998a94683196406b83b14218d1beef66067f126a16keunyoung bool startScan = ((double)rand() / RAND_MAX) < kContinuousAfStartRate; 19008a94683196406b83b14218d1beef66067f126a16keunyoung if (startScan) { 19018a94683196406b83b14218d1beef66067f126a16keunyoung // Start new passive focusing cycle 19028a94683196406b83b14218d1beef66067f126a16keunyoung mAfScanDuration = ((double)rand() / RAND_MAX) * 19038a94683196406b83b14218d1beef66067f126a16keunyoung (kMaxAfDuration - kMinAfDuration) + kMinAfDuration; 19048a94683196406b83b14218d1beef66067f126a16keunyoung afState = ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN; 19053725c7c982eac52ec64a625e82f306822452941cColin Cross ALOGV("%s: AF passive scan start, duration %" PRId64 " ms", 19068a94683196406b83b14218d1beef66067f126a16keunyoung __FUNCTION__, mAfScanDuration / 1000000); 19078a94683196406b83b14218d1beef66067f126a16keunyoung } 19088a94683196406b83b14218d1beef66067f126a16keunyoung } 19098a94683196406b83b14218d1beef66067f126a16keunyoung return afState; 19108a94683196406b83b14218d1beef66067f126a16keunyoung} 19118a94683196406b83b14218d1beef66067f126a16keunyoung 19128a94683196406b83b14218d1beef66067f126a16keunyoungint EmulatedFakeCamera2::ControlThread::updateAfScan(uint8_t afMode, 19138a94683196406b83b14218d1beef66067f126a16keunyoung uint8_t afState, nsecs_t *maxSleep) { 19148a94683196406b83b14218d1beef66067f126a16keunyoung if (! (afState == ANDROID_CONTROL_AF_STATE_ACTIVE_SCAN || 19158a94683196406b83b14218d1beef66067f126a16keunyoung afState == ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN ) ) { 19168a94683196406b83b14218d1beef66067f126a16keunyoung return afState; 19178a94683196406b83b14218d1beef66067f126a16keunyoung } 19188a94683196406b83b14218d1beef66067f126a16keunyoung 19198a94683196406b83b14218d1beef66067f126a16keunyoung if (mAfScanDuration <= 0) { 19208a94683196406b83b14218d1beef66067f126a16keunyoung ALOGV("%s: AF scan done", __FUNCTION__); 19218a94683196406b83b14218d1beef66067f126a16keunyoung switch (afMode) { 19228a94683196406b83b14218d1beef66067f126a16keunyoung case ANDROID_CONTROL_AF_MODE_MACRO: 19238a94683196406b83b14218d1beef66067f126a16keunyoung case ANDROID_CONTROL_AF_MODE_AUTO: { 19248a94683196406b83b14218d1beef66067f126a16keunyoung bool success = ((double)rand() / RAND_MAX) < kAfSuccessRate; 19258a94683196406b83b14218d1beef66067f126a16keunyoung if (success) { 19268a94683196406b83b14218d1beef66067f126a16keunyoung afState = ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED; 19278a94683196406b83b14218d1beef66067f126a16keunyoung } else { 19288a94683196406b83b14218d1beef66067f126a16keunyoung afState = ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED; 19298a94683196406b83b14218d1beef66067f126a16keunyoung } 19308a94683196406b83b14218d1beef66067f126a16keunyoung break; 19318a94683196406b83b14218d1beef66067f126a16keunyoung } 19328a94683196406b83b14218d1beef66067f126a16keunyoung case ANDROID_CONTROL_AF_MODE_CONTINUOUS_PICTURE: 19338a94683196406b83b14218d1beef66067f126a16keunyoung if (mLockAfterPassiveScan) { 19348a94683196406b83b14218d1beef66067f126a16keunyoung afState = ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED; 19358a94683196406b83b14218d1beef66067f126a16keunyoung mLockAfterPassiveScan = false; 19368a94683196406b83b14218d1beef66067f126a16keunyoung } else { 19378a94683196406b83b14218d1beef66067f126a16keunyoung afState = ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED; 19388a94683196406b83b14218d1beef66067f126a16keunyoung } 19398a94683196406b83b14218d1beef66067f126a16keunyoung break; 19408a94683196406b83b14218d1beef66067f126a16keunyoung case ANDROID_CONTROL_AF_MODE_CONTINUOUS_VIDEO: 19418a94683196406b83b14218d1beef66067f126a16keunyoung afState = ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED; 19428a94683196406b83b14218d1beef66067f126a16keunyoung break; 19438a94683196406b83b14218d1beef66067f126a16keunyoung default: 19448a94683196406b83b14218d1beef66067f126a16keunyoung ALOGE("Unexpected AF mode in scan state"); 19458a94683196406b83b14218d1beef66067f126a16keunyoung } 19468a94683196406b83b14218d1beef66067f126a16keunyoung } else { 19478a94683196406b83b14218d1beef66067f126a16keunyoung if (mAfScanDuration <= *maxSleep) { 19488a94683196406b83b14218d1beef66067f126a16keunyoung *maxSleep = mAfScanDuration; 19498a94683196406b83b14218d1beef66067f126a16keunyoung } 19508a94683196406b83b14218d1beef66067f126a16keunyoung } 19518a94683196406b83b14218d1beef66067f126a16keunyoung return afState; 19528a94683196406b83b14218d1beef66067f126a16keunyoung} 19538a94683196406b83b14218d1beef66067f126a16keunyoung 19548a94683196406b83b14218d1beef66067f126a16keunyoungvoid EmulatedFakeCamera2::ControlThread::updateAfState(uint8_t newState, 19558a94683196406b83b14218d1beef66067f126a16keunyoung int32_t triggerId) { 19568a94683196406b83b14218d1beef66067f126a16keunyoung Mutex::Autolock lock(mInputMutex); 19578a94683196406b83b14218d1beef66067f126a16keunyoung if (mAfState != newState) { 19588a94683196406b83b14218d1beef66067f126a16keunyoung ALOGV("%s: Autofocus state now %d, id %d", __FUNCTION__, 19598a94683196406b83b14218d1beef66067f126a16keunyoung newState, triggerId); 19608a94683196406b83b14218d1beef66067f126a16keunyoung mAfState = newState; 19618a94683196406b83b14218d1beef66067f126a16keunyoung mParent->sendNotification(CAMERA2_MSG_AUTOFOCUS, 19628a94683196406b83b14218d1beef66067f126a16keunyoung newState, triggerId, 0); 19638a94683196406b83b14218d1beef66067f126a16keunyoung } 19648a94683196406b83b14218d1beef66067f126a16keunyoung} 19658a94683196406b83b14218d1beef66067f126a16keunyoung 19668a94683196406b83b14218d1beef66067f126a16keunyoungint EmulatedFakeCamera2::ControlThread::processPrecaptureTrigger(uint8_t aeMode, 19678a94683196406b83b14218d1beef66067f126a16keunyoung uint8_t aeState) { 19688a94683196406b83b14218d1beef66067f126a16keunyoung switch (aeMode) { 19698a94683196406b83b14218d1beef66067f126a16keunyoung case ANDROID_CONTROL_AE_MODE_OFF: 19708a94683196406b83b14218d1beef66067f126a16keunyoung // Don't do anything for these 19718a94683196406b83b14218d1beef66067f126a16keunyoung return aeState; 19728a94683196406b83b14218d1beef66067f126a16keunyoung case ANDROID_CONTROL_AE_MODE_ON: 19738a94683196406b83b14218d1beef66067f126a16keunyoung case ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH: 19748a94683196406b83b14218d1beef66067f126a16keunyoung case ANDROID_CONTROL_AE_MODE_ON_ALWAYS_FLASH: 19758a94683196406b83b14218d1beef66067f126a16keunyoung case ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE: 19768a94683196406b83b14218d1beef66067f126a16keunyoung // Trigger a precapture cycle 19778a94683196406b83b14218d1beef66067f126a16keunyoung aeState = ANDROID_CONTROL_AE_STATE_PRECAPTURE; 19788a94683196406b83b14218d1beef66067f126a16keunyoung mAeScanDuration = ((double)rand() / RAND_MAX) * 19798a94683196406b83b14218d1beef66067f126a16keunyoung (kMaxPrecaptureAeDuration - kMinPrecaptureAeDuration) + 19808a94683196406b83b14218d1beef66067f126a16keunyoung kMinPrecaptureAeDuration; 19813725c7c982eac52ec64a625e82f306822452941cColin Cross ALOGD("%s: AE precapture scan start, duration %" PRId64 " ms", 19828a94683196406b83b14218d1beef66067f126a16keunyoung __FUNCTION__, mAeScanDuration / 1000000); 19838a94683196406b83b14218d1beef66067f126a16keunyoung 19848a94683196406b83b14218d1beef66067f126a16keunyoung } 19858a94683196406b83b14218d1beef66067f126a16keunyoung return aeState; 19868a94683196406b83b14218d1beef66067f126a16keunyoung} 19878a94683196406b83b14218d1beef66067f126a16keunyoung 19888a94683196406b83b14218d1beef66067f126a16keunyoungint EmulatedFakeCamera2::ControlThread::maybeStartAeScan(uint8_t aeMode, 19898a94683196406b83b14218d1beef66067f126a16keunyoung bool aeLocked, 19908a94683196406b83b14218d1beef66067f126a16keunyoung uint8_t aeState) { 19918a94683196406b83b14218d1beef66067f126a16keunyoung if (aeLocked) return aeState; 19928a94683196406b83b14218d1beef66067f126a16keunyoung switch (aeMode) { 19938a94683196406b83b14218d1beef66067f126a16keunyoung case ANDROID_CONTROL_AE_MODE_OFF: 19948a94683196406b83b14218d1beef66067f126a16keunyoung break; 19958a94683196406b83b14218d1beef66067f126a16keunyoung case ANDROID_CONTROL_AE_MODE_ON: 19968a94683196406b83b14218d1beef66067f126a16keunyoung case ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH: 19978a94683196406b83b14218d1beef66067f126a16keunyoung case ANDROID_CONTROL_AE_MODE_ON_ALWAYS_FLASH: 19988a94683196406b83b14218d1beef66067f126a16keunyoung case ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE: { 19998a94683196406b83b14218d1beef66067f126a16keunyoung if (aeState != ANDROID_CONTROL_AE_STATE_INACTIVE && 20008a94683196406b83b14218d1beef66067f126a16keunyoung aeState != ANDROID_CONTROL_AE_STATE_CONVERGED) break; 20018a94683196406b83b14218d1beef66067f126a16keunyoung 20028a94683196406b83b14218d1beef66067f126a16keunyoung bool startScan = ((double)rand() / RAND_MAX) < kAeScanStartRate; 20038a94683196406b83b14218d1beef66067f126a16keunyoung if (startScan) { 20048a94683196406b83b14218d1beef66067f126a16keunyoung mAeScanDuration = ((double)rand() / RAND_MAX) * 20058a94683196406b83b14218d1beef66067f126a16keunyoung (kMaxAeDuration - kMinAeDuration) + kMinAeDuration; 20068a94683196406b83b14218d1beef66067f126a16keunyoung aeState = ANDROID_CONTROL_AE_STATE_SEARCHING; 20073725c7c982eac52ec64a625e82f306822452941cColin Cross ALOGV("%s: AE scan start, duration %" PRId64 " ms", 20088a94683196406b83b14218d1beef66067f126a16keunyoung __FUNCTION__, mAeScanDuration / 1000000); 20098a94683196406b83b14218d1beef66067f126a16keunyoung } 20108a94683196406b83b14218d1beef66067f126a16keunyoung } 20118a94683196406b83b14218d1beef66067f126a16keunyoung } 20128a94683196406b83b14218d1beef66067f126a16keunyoung 20138a94683196406b83b14218d1beef66067f126a16keunyoung return aeState; 20148a94683196406b83b14218d1beef66067f126a16keunyoung} 20158a94683196406b83b14218d1beef66067f126a16keunyoung 20168a94683196406b83b14218d1beef66067f126a16keunyoungint EmulatedFakeCamera2::ControlThread::updateAeScan(uint8_t aeMode, 20178a94683196406b83b14218d1beef66067f126a16keunyoung bool aeLock, uint8_t aeState, nsecs_t *maxSleep) { 20188a94683196406b83b14218d1beef66067f126a16keunyoung if (aeLock && aeState != ANDROID_CONTROL_AE_STATE_PRECAPTURE) { 20198a94683196406b83b14218d1beef66067f126a16keunyoung mAeScanDuration = 0; 20208a94683196406b83b14218d1beef66067f126a16keunyoung aeState = ANDROID_CONTROL_AE_STATE_LOCKED; 20218a94683196406b83b14218d1beef66067f126a16keunyoung } else if ((aeState == ANDROID_CONTROL_AE_STATE_SEARCHING) || 20228a94683196406b83b14218d1beef66067f126a16keunyoung (aeState == ANDROID_CONTROL_AE_STATE_PRECAPTURE ) ) { 20238a94683196406b83b14218d1beef66067f126a16keunyoung if (mAeScanDuration <= 0) { 20244dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin ALOGV("%s: AE scan done", __FUNCTION__); 20258a94683196406b83b14218d1beef66067f126a16keunyoung aeState = aeLock ? 20268a94683196406b83b14218d1beef66067f126a16keunyoung ANDROID_CONTROL_AE_STATE_LOCKED :ANDROID_CONTROL_AE_STATE_CONVERGED; 20278a94683196406b83b14218d1beef66067f126a16keunyoung 20288a94683196406b83b14218d1beef66067f126a16keunyoung Mutex::Autolock lock(mInputMutex); 20298a94683196406b83b14218d1beef66067f126a16keunyoung mExposureTime = kNormalExposureTime; 20308a94683196406b83b14218d1beef66067f126a16keunyoung } else { 20318a94683196406b83b14218d1beef66067f126a16keunyoung if (mAeScanDuration <= *maxSleep) { 20328a94683196406b83b14218d1beef66067f126a16keunyoung *maxSleep = mAeScanDuration; 20338a94683196406b83b14218d1beef66067f126a16keunyoung } 20348a94683196406b83b14218d1beef66067f126a16keunyoung 20358a94683196406b83b14218d1beef66067f126a16keunyoung int64_t exposureDelta = 20368a94683196406b83b14218d1beef66067f126a16keunyoung ((double)rand() / RAND_MAX) * 2 * kExposureJump - 20378a94683196406b83b14218d1beef66067f126a16keunyoung kExposureJump; 20388a94683196406b83b14218d1beef66067f126a16keunyoung Mutex::Autolock lock(mInputMutex); 20398a94683196406b83b14218d1beef66067f126a16keunyoung mExposureTime = mExposureTime + exposureDelta; 20408a94683196406b83b14218d1beef66067f126a16keunyoung if (mExposureTime < kMinExposureTime) mExposureTime = kMinExposureTime; 20418a94683196406b83b14218d1beef66067f126a16keunyoung } 20428a94683196406b83b14218d1beef66067f126a16keunyoung } 20438a94683196406b83b14218d1beef66067f126a16keunyoung 20448a94683196406b83b14218d1beef66067f126a16keunyoung return aeState; 20458a94683196406b83b14218d1beef66067f126a16keunyoung} 20468a94683196406b83b14218d1beef66067f126a16keunyoung 20478a94683196406b83b14218d1beef66067f126a16keunyoung 20488a94683196406b83b14218d1beef66067f126a16keunyoungvoid EmulatedFakeCamera2::ControlThread::updateAeState(uint8_t newState, 20498a94683196406b83b14218d1beef66067f126a16keunyoung int32_t triggerId) { 20508a94683196406b83b14218d1beef66067f126a16keunyoung Mutex::Autolock lock(mInputMutex); 20518a94683196406b83b14218d1beef66067f126a16keunyoung if (mAeState != newState) { 20524dc85efabf08b5b700a6ec0c9b435b40334e72c4Igor Murashkin ALOGV("%s: Autoexposure state now %d, id %d", __FUNCTION__, 20538a94683196406b83b14218d1beef66067f126a16keunyoung newState, triggerId); 20548a94683196406b83b14218d1beef66067f126a16keunyoung mAeState = newState; 20558a94683196406b83b14218d1beef66067f126a16keunyoung mParent->sendNotification(CAMERA2_MSG_AUTOEXPOSURE, 20568a94683196406b83b14218d1beef66067f126a16keunyoung newState, triggerId, 0); 20578a94683196406b83b14218d1beef66067f126a16keunyoung } 20588a94683196406b83b14218d1beef66067f126a16keunyoung} 20598a94683196406b83b14218d1beef66067f126a16keunyoung 20608a94683196406b83b14218d1beef66067f126a16keunyoung/** Private methods */ 20618a94683196406b83b14218d1beef66067f126a16keunyoung 20628a94683196406b83b14218d1beef66067f126a16keunyoungstatus_t EmulatedFakeCamera2::constructStaticInfo( 20638a94683196406b83b14218d1beef66067f126a16keunyoung camera_metadata_t **info, 20648a94683196406b83b14218d1beef66067f126a16keunyoung bool sizeRequest) const { 20658a94683196406b83b14218d1beef66067f126a16keunyoung 20668a94683196406b83b14218d1beef66067f126a16keunyoung size_t entryCount = 0; 20678a94683196406b83b14218d1beef66067f126a16keunyoung size_t dataCount = 0; 20688a94683196406b83b14218d1beef66067f126a16keunyoung status_t ret; 20698a94683196406b83b14218d1beef66067f126a16keunyoung 20708a94683196406b83b14218d1beef66067f126a16keunyoung#define ADD_OR_SIZE( tag, data, count ) \ 20718a94683196406b83b14218d1beef66067f126a16keunyoung if ( ( ret = addOrSize(*info, sizeRequest, &entryCount, &dataCount, \ 20728a94683196406b83b14218d1beef66067f126a16keunyoung tag, data, count) ) != OK ) return ret 20738a94683196406b83b14218d1beef66067f126a16keunyoung 20748a94683196406b83b14218d1beef66067f126a16keunyoung // android.lens 20758a94683196406b83b14218d1beef66067f126a16keunyoung 20768a94683196406b83b14218d1beef66067f126a16keunyoung // 5 cm min focus distance for back camera, infinity (fixed focus) for front 20778a94683196406b83b14218d1beef66067f126a16keunyoung const float minFocusDistance = mFacingBack ? 1.0/0.05 : 0.0; 20788a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE, 20798a94683196406b83b14218d1beef66067f126a16keunyoung &minFocusDistance, 1); 20808a94683196406b83b14218d1beef66067f126a16keunyoung // 5 m hyperfocal distance for back camera, infinity (fixed focus) for front 20818a94683196406b83b14218d1beef66067f126a16keunyoung const float hyperFocalDistance = mFacingBack ? 1.0/5.0 : 0.0; 20828a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_LENS_INFO_HYPERFOCAL_DISTANCE, 20838a94683196406b83b14218d1beef66067f126a16keunyoung &minFocusDistance, 1); 20848a94683196406b83b14218d1beef66067f126a16keunyoung 20858a94683196406b83b14218d1beef66067f126a16keunyoung static const float focalLength = 3.30f; // mm 20868a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS, 20878a94683196406b83b14218d1beef66067f126a16keunyoung &focalLength, 1); 20888a94683196406b83b14218d1beef66067f126a16keunyoung static const float aperture = 2.8f; 20898a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_LENS_INFO_AVAILABLE_APERTURES, 20908a94683196406b83b14218d1beef66067f126a16keunyoung &aperture, 1); 20918a94683196406b83b14218d1beef66067f126a16keunyoung static const float filterDensity = 0; 20928a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_LENS_INFO_AVAILABLE_FILTER_DENSITIES, 20938a94683196406b83b14218d1beef66067f126a16keunyoung &filterDensity, 1); 20948a94683196406b83b14218d1beef66067f126a16keunyoung static const uint8_t availableOpticalStabilization = 20958a94683196406b83b14218d1beef66067f126a16keunyoung ANDROID_LENS_OPTICAL_STABILIZATION_MODE_OFF; 20968a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION, 20978a94683196406b83b14218d1beef66067f126a16keunyoung &availableOpticalStabilization, 1); 20988a94683196406b83b14218d1beef66067f126a16keunyoung 20998a94683196406b83b14218d1beef66067f126a16keunyoung static const int32_t lensShadingMapSize[] = {1, 1}; 21008a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_LENS_INFO_SHADING_MAP_SIZE, lensShadingMapSize, 21018a94683196406b83b14218d1beef66067f126a16keunyoung sizeof(lensShadingMapSize)/sizeof(int32_t)); 21028a94683196406b83b14218d1beef66067f126a16keunyoung 21038a94683196406b83b14218d1beef66067f126a16keunyoung int32_t lensFacing = mFacingBack ? 21048a94683196406b83b14218d1beef66067f126a16keunyoung ANDROID_LENS_FACING_BACK : ANDROID_LENS_FACING_FRONT; 21058a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_LENS_FACING, &lensFacing, 1); 21068a94683196406b83b14218d1beef66067f126a16keunyoung 21078a94683196406b83b14218d1beef66067f126a16keunyoung // android.sensor 21088a94683196406b83b14218d1beef66067f126a16keunyoung 21098a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_SENSOR_INFO_EXPOSURE_TIME_RANGE, 21108a94683196406b83b14218d1beef66067f126a16keunyoung Sensor::kExposureTimeRange, 2); 21118a94683196406b83b14218d1beef66067f126a16keunyoung 21128a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_SENSOR_INFO_MAX_FRAME_DURATION, 21138a94683196406b83b14218d1beef66067f126a16keunyoung &Sensor::kFrameDurationRange[1], 1); 21148a94683196406b83b14218d1beef66067f126a16keunyoung 21150049ee8925212a3a5ff095a8a66cab184adf8f1bZhijun He ADD_OR_SIZE(ANDROID_SENSOR_INFO_SENSITIVITY_RANGE, 21160049ee8925212a3a5ff095a8a66cab184adf8f1bZhijun He Sensor::kSensitivityRange, 21170049ee8925212a3a5ff095a8a66cab184adf8f1bZhijun He sizeof(Sensor::kSensitivityRange) 21180049ee8925212a3a5ff095a8a66cab184adf8f1bZhijun He /sizeof(int32_t)); 21198a94683196406b83b14218d1beef66067f126a16keunyoung 21208a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT, 21218a94683196406b83b14218d1beef66067f126a16keunyoung &Sensor::kColorFilterArrangement, 1); 21228a94683196406b83b14218d1beef66067f126a16keunyoung 21238a94683196406b83b14218d1beef66067f126a16keunyoung static const float sensorPhysicalSize[2] = {3.20f, 2.40f}; // mm 21248a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_SENSOR_INFO_PHYSICAL_SIZE, 21258a94683196406b83b14218d1beef66067f126a16keunyoung sensorPhysicalSize, 2); 21268a94683196406b83b14218d1beef66067f126a16keunyoung 21278a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_SENSOR_INFO_PIXEL_ARRAY_SIZE, 21288a94683196406b83b14218d1beef66067f126a16keunyoung Sensor::kResolution, 2); 21298a94683196406b83b14218d1beef66067f126a16keunyoung 21308a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE, 21318a94683196406b83b14218d1beef66067f126a16keunyoung Sensor::kResolution, 2); 21328a94683196406b83b14218d1beef66067f126a16keunyoung 21338a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_SENSOR_INFO_WHITE_LEVEL, 21348a94683196406b83b14218d1beef66067f126a16keunyoung &Sensor::kMaxRawValue, 1); 21358a94683196406b83b14218d1beef66067f126a16keunyoung 21368a94683196406b83b14218d1beef66067f126a16keunyoung static const int32_t blackLevelPattern[4] = { 213779f8dcdb2da221f2e6992f53a83c36b95332fc2eEino-Ville Talvala static_cast<int32_t>(Sensor::kBlackLevel), 213879f8dcdb2da221f2e6992f53a83c36b95332fc2eEino-Ville Talvala static_cast<int32_t>(Sensor::kBlackLevel), 213979f8dcdb2da221f2e6992f53a83c36b95332fc2eEino-Ville Talvala static_cast<int32_t>(Sensor::kBlackLevel), 214079f8dcdb2da221f2e6992f53a83c36b95332fc2eEino-Ville Talvala static_cast<int32_t>(Sensor::kBlackLevel) 21418a94683196406b83b14218d1beef66067f126a16keunyoung }; 21428a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_SENSOR_BLACK_LEVEL_PATTERN, 21438a94683196406b83b14218d1beef66067f126a16keunyoung blackLevelPattern, sizeof(blackLevelPattern)/sizeof(int32_t)); 21448a94683196406b83b14218d1beef66067f126a16keunyoung 21458a94683196406b83b14218d1beef66067f126a16keunyoung //TODO: sensor color calibration fields 21468a94683196406b83b14218d1beef66067f126a16keunyoung 21478a94683196406b83b14218d1beef66067f126a16keunyoung // android.flash 21488a94683196406b83b14218d1beef66067f126a16keunyoung static const uint8_t flashAvailable = 0; 21498a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_FLASH_INFO_AVAILABLE, &flashAvailable, 1); 21508a94683196406b83b14218d1beef66067f126a16keunyoung 21518a94683196406b83b14218d1beef66067f126a16keunyoung static const int64_t flashChargeDuration = 0; 21528a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_FLASH_INFO_CHARGE_DURATION, &flashChargeDuration, 1); 21538a94683196406b83b14218d1beef66067f126a16keunyoung 21548a94683196406b83b14218d1beef66067f126a16keunyoung // android.tonemap 21558a94683196406b83b14218d1beef66067f126a16keunyoung 21568a94683196406b83b14218d1beef66067f126a16keunyoung static const int32_t tonemapCurvePoints = 128; 21578a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_TONEMAP_MAX_CURVE_POINTS, &tonemapCurvePoints, 1); 21588a94683196406b83b14218d1beef66067f126a16keunyoung 21598a94683196406b83b14218d1beef66067f126a16keunyoung // android.scaler 21608a94683196406b83b14218d1beef66067f126a16keunyoung 21618a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_FORMATS, 21628a94683196406b83b14218d1beef66067f126a16keunyoung kAvailableFormats, 21638a94683196406b83b14218d1beef66067f126a16keunyoung sizeof(kAvailableFormats)/sizeof(uint32_t)); 21648a94683196406b83b14218d1beef66067f126a16keunyoung 21658a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_RAW_SIZES, 21668a94683196406b83b14218d1beef66067f126a16keunyoung kAvailableRawSizes, 21678a94683196406b83b14218d1beef66067f126a16keunyoung sizeof(kAvailableRawSizes)/sizeof(uint32_t)); 21688a94683196406b83b14218d1beef66067f126a16keunyoung 21698a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_RAW_MIN_DURATIONS, 21708a94683196406b83b14218d1beef66067f126a16keunyoung kAvailableRawMinDurations, 21718a94683196406b83b14218d1beef66067f126a16keunyoung sizeof(kAvailableRawMinDurations)/sizeof(uint64_t)); 21728a94683196406b83b14218d1beef66067f126a16keunyoung 21738a94683196406b83b14218d1beef66067f126a16keunyoung if (mFacingBack) { 21748a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES, 21758a94683196406b83b14218d1beef66067f126a16keunyoung kAvailableProcessedSizesBack, 21768a94683196406b83b14218d1beef66067f126a16keunyoung sizeof(kAvailableProcessedSizesBack)/sizeof(uint32_t)); 21778a94683196406b83b14218d1beef66067f126a16keunyoung } else { 21788a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES, 21798a94683196406b83b14218d1beef66067f126a16keunyoung kAvailableProcessedSizesFront, 21808a94683196406b83b14218d1beef66067f126a16keunyoung sizeof(kAvailableProcessedSizesFront)/sizeof(uint32_t)); 21818a94683196406b83b14218d1beef66067f126a16keunyoung } 21828a94683196406b83b14218d1beef66067f126a16keunyoung 21838a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_PROCESSED_MIN_DURATIONS, 21848a94683196406b83b14218d1beef66067f126a16keunyoung kAvailableProcessedMinDurations, 21858a94683196406b83b14218d1beef66067f126a16keunyoung sizeof(kAvailableProcessedMinDurations)/sizeof(uint64_t)); 21868a94683196406b83b14218d1beef66067f126a16keunyoung 21878a94683196406b83b14218d1beef66067f126a16keunyoung if (mFacingBack) { 21888a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_JPEG_SIZES, 21898a94683196406b83b14218d1beef66067f126a16keunyoung kAvailableJpegSizesBack, 21908a94683196406b83b14218d1beef66067f126a16keunyoung sizeof(kAvailableJpegSizesBack)/sizeof(uint32_t)); 21918a94683196406b83b14218d1beef66067f126a16keunyoung } else { 21928a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_JPEG_SIZES, 21938a94683196406b83b14218d1beef66067f126a16keunyoung kAvailableJpegSizesFront, 21948a94683196406b83b14218d1beef66067f126a16keunyoung sizeof(kAvailableJpegSizesFront)/sizeof(uint32_t)); 21958a94683196406b83b14218d1beef66067f126a16keunyoung } 21968a94683196406b83b14218d1beef66067f126a16keunyoung 21978a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_JPEG_MIN_DURATIONS, 21988a94683196406b83b14218d1beef66067f126a16keunyoung kAvailableJpegMinDurations, 21998a94683196406b83b14218d1beef66067f126a16keunyoung sizeof(kAvailableJpegMinDurations)/sizeof(uint64_t)); 22008a94683196406b83b14218d1beef66067f126a16keunyoung 22018a94683196406b83b14218d1beef66067f126a16keunyoung static const float maxZoom = 10; 22028a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM, 22038a94683196406b83b14218d1beef66067f126a16keunyoung &maxZoom, 1); 22048a94683196406b83b14218d1beef66067f126a16keunyoung 22058a94683196406b83b14218d1beef66067f126a16keunyoung // android.jpeg 22068a94683196406b83b14218d1beef66067f126a16keunyoung 22078a94683196406b83b14218d1beef66067f126a16keunyoung static const int32_t jpegThumbnailSizes[] = { 22088a94683196406b83b14218d1beef66067f126a16keunyoung 0, 0, 22098a94683196406b83b14218d1beef66067f126a16keunyoung 160, 120, 22108a94683196406b83b14218d1beef66067f126a16keunyoung 320, 240 22118a94683196406b83b14218d1beef66067f126a16keunyoung }; 22128a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES, 22138a94683196406b83b14218d1beef66067f126a16keunyoung jpegThumbnailSizes, sizeof(jpegThumbnailSizes)/sizeof(int32_t)); 22148a94683196406b83b14218d1beef66067f126a16keunyoung 22158a94683196406b83b14218d1beef66067f126a16keunyoung static const int32_t jpegMaxSize = JpegCompressor::kMaxJpegSize; 22168a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_JPEG_MAX_SIZE, &jpegMaxSize, 1); 22178a94683196406b83b14218d1beef66067f126a16keunyoung 22188a94683196406b83b14218d1beef66067f126a16keunyoung // android.stats 22198a94683196406b83b14218d1beef66067f126a16keunyoung 22208a94683196406b83b14218d1beef66067f126a16keunyoung static const uint8_t availableFaceDetectModes[] = { 22218a94683196406b83b14218d1beef66067f126a16keunyoung ANDROID_STATISTICS_FACE_DETECT_MODE_OFF, 22228a94683196406b83b14218d1beef66067f126a16keunyoung ANDROID_STATISTICS_FACE_DETECT_MODE_SIMPLE, 22238a94683196406b83b14218d1beef66067f126a16keunyoung ANDROID_STATISTICS_FACE_DETECT_MODE_FULL 22248a94683196406b83b14218d1beef66067f126a16keunyoung }; 22258a94683196406b83b14218d1beef66067f126a16keunyoung 22268a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES, 22278a94683196406b83b14218d1beef66067f126a16keunyoung availableFaceDetectModes, 22288a94683196406b83b14218d1beef66067f126a16keunyoung sizeof(availableFaceDetectModes)); 22298a94683196406b83b14218d1beef66067f126a16keunyoung 22308a94683196406b83b14218d1beef66067f126a16keunyoung static const int32_t maxFaceCount = 8; 22318a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_STATISTICS_INFO_MAX_FACE_COUNT, 22328a94683196406b83b14218d1beef66067f126a16keunyoung &maxFaceCount, 1); 22338a94683196406b83b14218d1beef66067f126a16keunyoung 22348a94683196406b83b14218d1beef66067f126a16keunyoung static const int32_t histogramSize = 64; 22358a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_STATISTICS_INFO_HISTOGRAM_BUCKET_COUNT, 22368a94683196406b83b14218d1beef66067f126a16keunyoung &histogramSize, 1); 22378a94683196406b83b14218d1beef66067f126a16keunyoung 22388a94683196406b83b14218d1beef66067f126a16keunyoung static const int32_t maxHistogramCount = 1000; 22398a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_STATISTICS_INFO_MAX_HISTOGRAM_COUNT, 22408a94683196406b83b14218d1beef66067f126a16keunyoung &maxHistogramCount, 1); 22418a94683196406b83b14218d1beef66067f126a16keunyoung 22428a94683196406b83b14218d1beef66067f126a16keunyoung static const int32_t sharpnessMapSize[2] = {64, 64}; 22438a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_STATISTICS_INFO_SHARPNESS_MAP_SIZE, 22448a94683196406b83b14218d1beef66067f126a16keunyoung sharpnessMapSize, sizeof(sharpnessMapSize)/sizeof(int32_t)); 22458a94683196406b83b14218d1beef66067f126a16keunyoung 22468a94683196406b83b14218d1beef66067f126a16keunyoung static const int32_t maxSharpnessMapValue = 1000; 22478a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_STATISTICS_INFO_MAX_SHARPNESS_MAP_VALUE, 22488a94683196406b83b14218d1beef66067f126a16keunyoung &maxSharpnessMapValue, 1); 22498a94683196406b83b14218d1beef66067f126a16keunyoung 22508a94683196406b83b14218d1beef66067f126a16keunyoung // android.control 22518a94683196406b83b14218d1beef66067f126a16keunyoung 22528a94683196406b83b14218d1beef66067f126a16keunyoung static const uint8_t availableSceneModes[] = { 2253c653d1c8455317956955c9a633018be4e15a113dRuben Brunk ANDROID_CONTROL_SCENE_MODE_DISABLED 22548a94683196406b83b14218d1beef66067f126a16keunyoung }; 22558a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_CONTROL_AVAILABLE_SCENE_MODES, 22568a94683196406b83b14218d1beef66067f126a16keunyoung availableSceneModes, sizeof(availableSceneModes)); 22578a94683196406b83b14218d1beef66067f126a16keunyoung 22588a94683196406b83b14218d1beef66067f126a16keunyoung static const uint8_t availableEffects[] = { 22598a94683196406b83b14218d1beef66067f126a16keunyoung ANDROID_CONTROL_EFFECT_MODE_OFF 22608a94683196406b83b14218d1beef66067f126a16keunyoung }; 22618a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_CONTROL_AVAILABLE_EFFECTS, 22628a94683196406b83b14218d1beef66067f126a16keunyoung availableEffects, sizeof(availableEffects)); 22638a94683196406b83b14218d1beef66067f126a16keunyoung 2264982e58da1a0c67a9cba552cd0d069f87b83cf9dfRuben Brunk static const int32_t max3aRegions[] = {/*AE*/ 0,/*AWB*/ 0,/*AF*/ 0}; 22658a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_CONTROL_MAX_REGIONS, 2266982e58da1a0c67a9cba552cd0d069f87b83cf9dfRuben Brunk max3aRegions, sizeof(max3aRegions)/sizeof(max3aRegions[0])); 22678a94683196406b83b14218d1beef66067f126a16keunyoung 22688a94683196406b83b14218d1beef66067f126a16keunyoung static const uint8_t availableAeModes[] = { 22698a94683196406b83b14218d1beef66067f126a16keunyoung ANDROID_CONTROL_AE_MODE_OFF, 22708a94683196406b83b14218d1beef66067f126a16keunyoung ANDROID_CONTROL_AE_MODE_ON 22718a94683196406b83b14218d1beef66067f126a16keunyoung }; 22728a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_CONTROL_AE_AVAILABLE_MODES, 22738a94683196406b83b14218d1beef66067f126a16keunyoung availableAeModes, sizeof(availableAeModes)); 22748a94683196406b83b14218d1beef66067f126a16keunyoung 22758a94683196406b83b14218d1beef66067f126a16keunyoung static const camera_metadata_rational exposureCompensationStep = { 22768a94683196406b83b14218d1beef66067f126a16keunyoung 1, 3 22778a94683196406b83b14218d1beef66067f126a16keunyoung }; 22788a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_CONTROL_AE_COMPENSATION_STEP, 22798a94683196406b83b14218d1beef66067f126a16keunyoung &exposureCompensationStep, 1); 22808a94683196406b83b14218d1beef66067f126a16keunyoung 22818a94683196406b83b14218d1beef66067f126a16keunyoung int32_t exposureCompensationRange[] = {-9, 9}; 22828a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_CONTROL_AE_COMPENSATION_RANGE, 22838a94683196406b83b14218d1beef66067f126a16keunyoung exposureCompensationRange, 22848a94683196406b83b14218d1beef66067f126a16keunyoung sizeof(exposureCompensationRange)/sizeof(int32_t)); 22858a94683196406b83b14218d1beef66067f126a16keunyoung 22868a94683196406b83b14218d1beef66067f126a16keunyoung static const int32_t availableTargetFpsRanges[] = { 22878a94683196406b83b14218d1beef66067f126a16keunyoung 5, 30, 15, 30 22888a94683196406b83b14218d1beef66067f126a16keunyoung }; 22898a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 22908a94683196406b83b14218d1beef66067f126a16keunyoung availableTargetFpsRanges, 22918a94683196406b83b14218d1beef66067f126a16keunyoung sizeof(availableTargetFpsRanges)/sizeof(int32_t)); 22928a94683196406b83b14218d1beef66067f126a16keunyoung 22938a94683196406b83b14218d1beef66067f126a16keunyoung static const uint8_t availableAntibandingModes[] = { 22948a94683196406b83b14218d1beef66067f126a16keunyoung ANDROID_CONTROL_AE_ANTIBANDING_MODE_OFF, 22958a94683196406b83b14218d1beef66067f126a16keunyoung ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO 22968a94683196406b83b14218d1beef66067f126a16keunyoung }; 22978a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES, 22988a94683196406b83b14218d1beef66067f126a16keunyoung availableAntibandingModes, sizeof(availableAntibandingModes)); 22998a94683196406b83b14218d1beef66067f126a16keunyoung 23008a94683196406b83b14218d1beef66067f126a16keunyoung static const uint8_t availableAwbModes[] = { 23018a94683196406b83b14218d1beef66067f126a16keunyoung ANDROID_CONTROL_AWB_MODE_OFF, 23028a94683196406b83b14218d1beef66067f126a16keunyoung ANDROID_CONTROL_AWB_MODE_AUTO, 23038a94683196406b83b14218d1beef66067f126a16keunyoung ANDROID_CONTROL_AWB_MODE_INCANDESCENT, 23048a94683196406b83b14218d1beef66067f126a16keunyoung ANDROID_CONTROL_AWB_MODE_FLUORESCENT, 23058a94683196406b83b14218d1beef66067f126a16keunyoung ANDROID_CONTROL_AWB_MODE_DAYLIGHT, 23068a94683196406b83b14218d1beef66067f126a16keunyoung ANDROID_CONTROL_AWB_MODE_SHADE 23078a94683196406b83b14218d1beef66067f126a16keunyoung }; 23088a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_CONTROL_AWB_AVAILABLE_MODES, 23098a94683196406b83b14218d1beef66067f126a16keunyoung availableAwbModes, sizeof(availableAwbModes)); 23108a94683196406b83b14218d1beef66067f126a16keunyoung 23118a94683196406b83b14218d1beef66067f126a16keunyoung static const uint8_t availableAfModesBack[] = { 23128a94683196406b83b14218d1beef66067f126a16keunyoung ANDROID_CONTROL_AF_MODE_OFF, 23138a94683196406b83b14218d1beef66067f126a16keunyoung ANDROID_CONTROL_AF_MODE_AUTO, 23148a94683196406b83b14218d1beef66067f126a16keunyoung ANDROID_CONTROL_AF_MODE_MACRO, 23158a94683196406b83b14218d1beef66067f126a16keunyoung ANDROID_CONTROL_AF_MODE_CONTINUOUS_VIDEO, 23168a94683196406b83b14218d1beef66067f126a16keunyoung ANDROID_CONTROL_AF_MODE_CONTINUOUS_PICTURE 23178a94683196406b83b14218d1beef66067f126a16keunyoung }; 23188a94683196406b83b14218d1beef66067f126a16keunyoung 23198a94683196406b83b14218d1beef66067f126a16keunyoung static const uint8_t availableAfModesFront[] = { 23208a94683196406b83b14218d1beef66067f126a16keunyoung ANDROID_CONTROL_AF_MODE_OFF 23218a94683196406b83b14218d1beef66067f126a16keunyoung }; 23228a94683196406b83b14218d1beef66067f126a16keunyoung 23238a94683196406b83b14218d1beef66067f126a16keunyoung if (mFacingBack) { 23248a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_CONTROL_AF_AVAILABLE_MODES, 23258a94683196406b83b14218d1beef66067f126a16keunyoung availableAfModesBack, sizeof(availableAfModesBack)); 23268a94683196406b83b14218d1beef66067f126a16keunyoung } else { 23278a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_CONTROL_AF_AVAILABLE_MODES, 23288a94683196406b83b14218d1beef66067f126a16keunyoung availableAfModesFront, sizeof(availableAfModesFront)); 23298a94683196406b83b14218d1beef66067f126a16keunyoung } 23308a94683196406b83b14218d1beef66067f126a16keunyoung 23318a94683196406b83b14218d1beef66067f126a16keunyoung static const uint8_t availableVstabModes[] = { 23328a94683196406b83b14218d1beef66067f126a16keunyoung ANDROID_CONTROL_VIDEO_STABILIZATION_MODE_OFF 23338a94683196406b83b14218d1beef66067f126a16keunyoung }; 23348a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES, 23358a94683196406b83b14218d1beef66067f126a16keunyoung availableVstabModes, sizeof(availableVstabModes)); 23368a94683196406b83b14218d1beef66067f126a16keunyoung 23378a94683196406b83b14218d1beef66067f126a16keunyoung#undef ADD_OR_SIZE 23388a94683196406b83b14218d1beef66067f126a16keunyoung /** Allocate metadata if sizing */ 23398a94683196406b83b14218d1beef66067f126a16keunyoung if (sizeRequest) { 23403725c7c982eac52ec64a625e82f306822452941cColin Cross ALOGV("Allocating %zu entries, %zu extra bytes for " 23418a94683196406b83b14218d1beef66067f126a16keunyoung "static camera info", 23428a94683196406b83b14218d1beef66067f126a16keunyoung entryCount, dataCount); 23438a94683196406b83b14218d1beef66067f126a16keunyoung *info = allocate_camera_metadata(entryCount, dataCount); 23448a94683196406b83b14218d1beef66067f126a16keunyoung if (*info == NULL) { 23458a94683196406b83b14218d1beef66067f126a16keunyoung ALOGE("Unable to allocate camera static info" 23463725c7c982eac52ec64a625e82f306822452941cColin Cross "(%zu entries, %zu bytes extra data)", 23478a94683196406b83b14218d1beef66067f126a16keunyoung entryCount, dataCount); 23488a94683196406b83b14218d1beef66067f126a16keunyoung return NO_MEMORY; 23498a94683196406b83b14218d1beef66067f126a16keunyoung } 23508a94683196406b83b14218d1beef66067f126a16keunyoung } 23518a94683196406b83b14218d1beef66067f126a16keunyoung return OK; 23528a94683196406b83b14218d1beef66067f126a16keunyoung} 23538a94683196406b83b14218d1beef66067f126a16keunyoung 23548a94683196406b83b14218d1beef66067f126a16keunyoungstatus_t EmulatedFakeCamera2::constructDefaultRequest( 23558a94683196406b83b14218d1beef66067f126a16keunyoung int request_template, 23568a94683196406b83b14218d1beef66067f126a16keunyoung camera_metadata_t **request, 23578a94683196406b83b14218d1beef66067f126a16keunyoung bool sizeRequest) const { 23588a94683196406b83b14218d1beef66067f126a16keunyoung 23598a94683196406b83b14218d1beef66067f126a16keunyoung size_t entryCount = 0; 23608a94683196406b83b14218d1beef66067f126a16keunyoung size_t dataCount = 0; 23618a94683196406b83b14218d1beef66067f126a16keunyoung status_t ret; 23628a94683196406b83b14218d1beef66067f126a16keunyoung 23638a94683196406b83b14218d1beef66067f126a16keunyoung#define ADD_OR_SIZE( tag, data, count ) \ 23648a94683196406b83b14218d1beef66067f126a16keunyoung if ( ( ret = addOrSize(*request, sizeRequest, &entryCount, &dataCount, \ 23658a94683196406b83b14218d1beef66067f126a16keunyoung tag, data, count) ) != OK ) return ret 23668a94683196406b83b14218d1beef66067f126a16keunyoung 23678a94683196406b83b14218d1beef66067f126a16keunyoung /** android.request */ 23688a94683196406b83b14218d1beef66067f126a16keunyoung 23698a94683196406b83b14218d1beef66067f126a16keunyoung static const uint8_t requestType = ANDROID_REQUEST_TYPE_CAPTURE; 23708a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_REQUEST_TYPE, &requestType, 1); 23718a94683196406b83b14218d1beef66067f126a16keunyoung 23728a94683196406b83b14218d1beef66067f126a16keunyoung static const uint8_t metadataMode = ANDROID_REQUEST_METADATA_MODE_FULL; 23738a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_REQUEST_METADATA_MODE, &metadataMode, 1); 23748a94683196406b83b14218d1beef66067f126a16keunyoung 23758a94683196406b83b14218d1beef66067f126a16keunyoung static const int32_t id = 0; 23768a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_REQUEST_ID, &id, 1); 23778a94683196406b83b14218d1beef66067f126a16keunyoung 23788a94683196406b83b14218d1beef66067f126a16keunyoung static const int32_t frameCount = 0; 23798a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_REQUEST_FRAME_COUNT, &frameCount, 1); 23808a94683196406b83b14218d1beef66067f126a16keunyoung 23818a94683196406b83b14218d1beef66067f126a16keunyoung // OUTPUT_STREAMS set by user 23828a94683196406b83b14218d1beef66067f126a16keunyoung entryCount += 1; 23838a94683196406b83b14218d1beef66067f126a16keunyoung dataCount += 5; // TODO: Should be maximum stream number 23848a94683196406b83b14218d1beef66067f126a16keunyoung 23858a94683196406b83b14218d1beef66067f126a16keunyoung /** android.lens */ 23868a94683196406b83b14218d1beef66067f126a16keunyoung 23878a94683196406b83b14218d1beef66067f126a16keunyoung static const float focusDistance = 0; 23888a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_LENS_FOCUS_DISTANCE, &focusDistance, 1); 23898a94683196406b83b14218d1beef66067f126a16keunyoung 23908a94683196406b83b14218d1beef66067f126a16keunyoung static const float aperture = 2.8f; 23918a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_LENS_APERTURE, &aperture, 1); 23928a94683196406b83b14218d1beef66067f126a16keunyoung 23938a94683196406b83b14218d1beef66067f126a16keunyoung static const float focalLength = 5.0f; 23948a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_LENS_FOCAL_LENGTH, &focalLength, 1); 23958a94683196406b83b14218d1beef66067f126a16keunyoung 23968a94683196406b83b14218d1beef66067f126a16keunyoung static const float filterDensity = 0; 23978a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_LENS_FILTER_DENSITY, &filterDensity, 1); 23988a94683196406b83b14218d1beef66067f126a16keunyoung 23998a94683196406b83b14218d1beef66067f126a16keunyoung static const uint8_t opticalStabilizationMode = 24008a94683196406b83b14218d1beef66067f126a16keunyoung ANDROID_LENS_OPTICAL_STABILIZATION_MODE_OFF; 24018a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_LENS_OPTICAL_STABILIZATION_MODE, 24028a94683196406b83b14218d1beef66067f126a16keunyoung &opticalStabilizationMode, 1); 24038a94683196406b83b14218d1beef66067f126a16keunyoung 24048a94683196406b83b14218d1beef66067f126a16keunyoung // FOCUS_RANGE set only in frame 24058a94683196406b83b14218d1beef66067f126a16keunyoung 24068a94683196406b83b14218d1beef66067f126a16keunyoung /** android.sensor */ 24078a94683196406b83b14218d1beef66067f126a16keunyoung 24088a94683196406b83b14218d1beef66067f126a16keunyoung static const int64_t exposureTime = 10 * MSEC; 24098a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_SENSOR_EXPOSURE_TIME, &exposureTime, 1); 24108a94683196406b83b14218d1beef66067f126a16keunyoung 24118a94683196406b83b14218d1beef66067f126a16keunyoung static const int64_t frameDuration = 33333333L; // 1/30 s 24128a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_SENSOR_FRAME_DURATION, &frameDuration, 1); 24138a94683196406b83b14218d1beef66067f126a16keunyoung 24148a94683196406b83b14218d1beef66067f126a16keunyoung static const int32_t sensitivity = 100; 24158a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_SENSOR_SENSITIVITY, &sensitivity, 1); 24168a94683196406b83b14218d1beef66067f126a16keunyoung 24178a94683196406b83b14218d1beef66067f126a16keunyoung // TIMESTAMP set only in frame 24188a94683196406b83b14218d1beef66067f126a16keunyoung 24198a94683196406b83b14218d1beef66067f126a16keunyoung /** android.flash */ 24208a94683196406b83b14218d1beef66067f126a16keunyoung 24218a94683196406b83b14218d1beef66067f126a16keunyoung static const uint8_t flashMode = ANDROID_FLASH_MODE_OFF; 24228a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_FLASH_MODE, &flashMode, 1); 24238a94683196406b83b14218d1beef66067f126a16keunyoung 24248a94683196406b83b14218d1beef66067f126a16keunyoung static const uint8_t flashPower = 10; 24258a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_FLASH_FIRING_POWER, &flashPower, 1); 24268a94683196406b83b14218d1beef66067f126a16keunyoung 24278a94683196406b83b14218d1beef66067f126a16keunyoung static const int64_t firingTime = 0; 24288a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_FLASH_FIRING_TIME, &firingTime, 1); 24298a94683196406b83b14218d1beef66067f126a16keunyoung 24308a94683196406b83b14218d1beef66067f126a16keunyoung /** Processing block modes */ 24318a94683196406b83b14218d1beef66067f126a16keunyoung uint8_t hotPixelMode = 0; 24328a94683196406b83b14218d1beef66067f126a16keunyoung uint8_t demosaicMode = 0; 24338a94683196406b83b14218d1beef66067f126a16keunyoung uint8_t noiseMode = 0; 24348a94683196406b83b14218d1beef66067f126a16keunyoung uint8_t shadingMode = 0; 24358a94683196406b83b14218d1beef66067f126a16keunyoung uint8_t colorMode = 0; 24368a94683196406b83b14218d1beef66067f126a16keunyoung uint8_t tonemapMode = 0; 24378a94683196406b83b14218d1beef66067f126a16keunyoung uint8_t edgeMode = 0; 24388a94683196406b83b14218d1beef66067f126a16keunyoung switch (request_template) { 24398a94683196406b83b14218d1beef66067f126a16keunyoung case CAMERA2_TEMPLATE_STILL_CAPTURE: 24408a94683196406b83b14218d1beef66067f126a16keunyoung // fall-through 24418a94683196406b83b14218d1beef66067f126a16keunyoung case CAMERA2_TEMPLATE_VIDEO_SNAPSHOT: 24428a94683196406b83b14218d1beef66067f126a16keunyoung // fall-through 24438a94683196406b83b14218d1beef66067f126a16keunyoung case CAMERA2_TEMPLATE_ZERO_SHUTTER_LAG: 24448a94683196406b83b14218d1beef66067f126a16keunyoung hotPixelMode = ANDROID_HOT_PIXEL_MODE_HIGH_QUALITY; 24458a94683196406b83b14218d1beef66067f126a16keunyoung demosaicMode = ANDROID_DEMOSAIC_MODE_HIGH_QUALITY; 24468a94683196406b83b14218d1beef66067f126a16keunyoung noiseMode = ANDROID_NOISE_REDUCTION_MODE_HIGH_QUALITY; 24478a94683196406b83b14218d1beef66067f126a16keunyoung shadingMode = ANDROID_SHADING_MODE_HIGH_QUALITY; 24488a94683196406b83b14218d1beef66067f126a16keunyoung colorMode = ANDROID_COLOR_CORRECTION_MODE_HIGH_QUALITY; 24498a94683196406b83b14218d1beef66067f126a16keunyoung tonemapMode = ANDROID_TONEMAP_MODE_HIGH_QUALITY; 24508a94683196406b83b14218d1beef66067f126a16keunyoung edgeMode = ANDROID_EDGE_MODE_HIGH_QUALITY; 24518a94683196406b83b14218d1beef66067f126a16keunyoung break; 24528a94683196406b83b14218d1beef66067f126a16keunyoung case CAMERA2_TEMPLATE_PREVIEW: 24538a94683196406b83b14218d1beef66067f126a16keunyoung // fall-through 24548a94683196406b83b14218d1beef66067f126a16keunyoung case CAMERA2_TEMPLATE_VIDEO_RECORD: 24558a94683196406b83b14218d1beef66067f126a16keunyoung // fall-through 24568a94683196406b83b14218d1beef66067f126a16keunyoung default: 24578a94683196406b83b14218d1beef66067f126a16keunyoung hotPixelMode = ANDROID_HOT_PIXEL_MODE_FAST; 24588a94683196406b83b14218d1beef66067f126a16keunyoung demosaicMode = ANDROID_DEMOSAIC_MODE_FAST; 24598a94683196406b83b14218d1beef66067f126a16keunyoung noiseMode = ANDROID_NOISE_REDUCTION_MODE_FAST; 24608a94683196406b83b14218d1beef66067f126a16keunyoung shadingMode = ANDROID_SHADING_MODE_FAST; 24618a94683196406b83b14218d1beef66067f126a16keunyoung colorMode = ANDROID_COLOR_CORRECTION_MODE_FAST; 24628a94683196406b83b14218d1beef66067f126a16keunyoung tonemapMode = ANDROID_TONEMAP_MODE_FAST; 24638a94683196406b83b14218d1beef66067f126a16keunyoung edgeMode = ANDROID_EDGE_MODE_FAST; 24648a94683196406b83b14218d1beef66067f126a16keunyoung break; 24658a94683196406b83b14218d1beef66067f126a16keunyoung } 24668a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_HOT_PIXEL_MODE, &hotPixelMode, 1); 24678a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_DEMOSAIC_MODE, &demosaicMode, 1); 24688a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_NOISE_REDUCTION_MODE, &noiseMode, 1); 24698a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_SHADING_MODE, &shadingMode, 1); 24708a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_COLOR_CORRECTION_MODE, &colorMode, 1); 24718a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_TONEMAP_MODE, &tonemapMode, 1); 24728a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_EDGE_MODE, &edgeMode, 1); 24738a94683196406b83b14218d1beef66067f126a16keunyoung 24748a94683196406b83b14218d1beef66067f126a16keunyoung /** android.noise */ 24758a94683196406b83b14218d1beef66067f126a16keunyoung static const uint8_t noiseStrength = 5; 24768a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_NOISE_REDUCTION_STRENGTH, &noiseStrength, 1); 24778a94683196406b83b14218d1beef66067f126a16keunyoung 24788a94683196406b83b14218d1beef66067f126a16keunyoung /** android.color */ 24798a94683196406b83b14218d1beef66067f126a16keunyoung static const float colorTransform[9] = { 24808a94683196406b83b14218d1beef66067f126a16keunyoung 1.0f, 0.f, 0.f, 24818a94683196406b83b14218d1beef66067f126a16keunyoung 0.f, 1.f, 0.f, 24828a94683196406b83b14218d1beef66067f126a16keunyoung 0.f, 0.f, 1.f 24838a94683196406b83b14218d1beef66067f126a16keunyoung }; 24848a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_COLOR_CORRECTION_TRANSFORM, colorTransform, 9); 24858a94683196406b83b14218d1beef66067f126a16keunyoung 24868a94683196406b83b14218d1beef66067f126a16keunyoung /** android.tonemap */ 24878a94683196406b83b14218d1beef66067f126a16keunyoung static const float tonemapCurve[4] = { 24888a94683196406b83b14218d1beef66067f126a16keunyoung 0.f, 0.f, 24898a94683196406b83b14218d1beef66067f126a16keunyoung 1.f, 1.f 24908a94683196406b83b14218d1beef66067f126a16keunyoung }; 24918a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_TONEMAP_CURVE_RED, tonemapCurve, 4); 24928a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_TONEMAP_CURVE_GREEN, tonemapCurve, 4); 24938a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_TONEMAP_CURVE_BLUE, tonemapCurve, 4); 24948a94683196406b83b14218d1beef66067f126a16keunyoung 24958a94683196406b83b14218d1beef66067f126a16keunyoung /** android.edge */ 24968a94683196406b83b14218d1beef66067f126a16keunyoung static const uint8_t edgeStrength = 5; 24978a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_EDGE_STRENGTH, &edgeStrength, 1); 24988a94683196406b83b14218d1beef66067f126a16keunyoung 24998a94683196406b83b14218d1beef66067f126a16keunyoung /** android.scaler */ 25008a94683196406b83b14218d1beef66067f126a16keunyoung static const int32_t cropRegion[3] = { 250179f8dcdb2da221f2e6992f53a83c36b95332fc2eEino-Ville Talvala 0, 0, static_cast<int32_t>(Sensor::kResolution[0]) 25028a94683196406b83b14218d1beef66067f126a16keunyoung }; 25038a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_SCALER_CROP_REGION, cropRegion, 3); 25048a94683196406b83b14218d1beef66067f126a16keunyoung 25058a94683196406b83b14218d1beef66067f126a16keunyoung /** android.jpeg */ 25068a94683196406b83b14218d1beef66067f126a16keunyoung static const int32_t jpegQuality = 80; 25078a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_JPEG_QUALITY, &jpegQuality, 1); 25088a94683196406b83b14218d1beef66067f126a16keunyoung 25098a94683196406b83b14218d1beef66067f126a16keunyoung static const int32_t thumbnailSize[2] = { 25108a94683196406b83b14218d1beef66067f126a16keunyoung 640, 480 25118a94683196406b83b14218d1beef66067f126a16keunyoung }; 25128a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_JPEG_THUMBNAIL_SIZE, thumbnailSize, 2); 25138a94683196406b83b14218d1beef66067f126a16keunyoung 25148a94683196406b83b14218d1beef66067f126a16keunyoung static const int32_t thumbnailQuality = 80; 25158a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_JPEG_THUMBNAIL_QUALITY, &thumbnailQuality, 1); 25168a94683196406b83b14218d1beef66067f126a16keunyoung 25178a94683196406b83b14218d1beef66067f126a16keunyoung static const double gpsCoordinates[2] = { 25188a94683196406b83b14218d1beef66067f126a16keunyoung 0, 0 25198a94683196406b83b14218d1beef66067f126a16keunyoung }; 25208a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_JPEG_GPS_COORDINATES, gpsCoordinates, 2); 25218a94683196406b83b14218d1beef66067f126a16keunyoung 25228a94683196406b83b14218d1beef66067f126a16keunyoung static const uint8_t gpsProcessingMethod[32] = "None"; 25238a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_JPEG_GPS_PROCESSING_METHOD, gpsProcessingMethod, 32); 25248a94683196406b83b14218d1beef66067f126a16keunyoung 25258a94683196406b83b14218d1beef66067f126a16keunyoung static const int64_t gpsTimestamp = 0; 25268a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_JPEG_GPS_TIMESTAMP, &gpsTimestamp, 1); 25278a94683196406b83b14218d1beef66067f126a16keunyoung 25288a94683196406b83b14218d1beef66067f126a16keunyoung static const int32_t jpegOrientation = 0; 25298a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_JPEG_ORIENTATION, &jpegOrientation, 1); 25308a94683196406b83b14218d1beef66067f126a16keunyoung 25318a94683196406b83b14218d1beef66067f126a16keunyoung /** android.stats */ 25328a94683196406b83b14218d1beef66067f126a16keunyoung 25338a94683196406b83b14218d1beef66067f126a16keunyoung static const uint8_t faceDetectMode = 25348a94683196406b83b14218d1beef66067f126a16keunyoung ANDROID_STATISTICS_FACE_DETECT_MODE_OFF; 25358a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_STATISTICS_FACE_DETECT_MODE, &faceDetectMode, 1); 25368a94683196406b83b14218d1beef66067f126a16keunyoung 25378a94683196406b83b14218d1beef66067f126a16keunyoung static const uint8_t histogramMode = ANDROID_STATISTICS_HISTOGRAM_MODE_OFF; 25388a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_STATISTICS_HISTOGRAM_MODE, &histogramMode, 1); 25398a94683196406b83b14218d1beef66067f126a16keunyoung 25408a94683196406b83b14218d1beef66067f126a16keunyoung static const uint8_t sharpnessMapMode = 25418a94683196406b83b14218d1beef66067f126a16keunyoung ANDROID_STATISTICS_SHARPNESS_MAP_MODE_OFF; 25428a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_STATISTICS_SHARPNESS_MAP_MODE, &sharpnessMapMode, 1); 25438a94683196406b83b14218d1beef66067f126a16keunyoung 25448a94683196406b83b14218d1beef66067f126a16keunyoung // faceRectangles, faceScores, faceLandmarks, faceIds, histogram, 25458a94683196406b83b14218d1beef66067f126a16keunyoung // sharpnessMap only in frames 25468a94683196406b83b14218d1beef66067f126a16keunyoung 25478a94683196406b83b14218d1beef66067f126a16keunyoung /** android.control */ 25488a94683196406b83b14218d1beef66067f126a16keunyoung 25498a94683196406b83b14218d1beef66067f126a16keunyoung uint8_t controlIntent = 0; 25508a94683196406b83b14218d1beef66067f126a16keunyoung switch (request_template) { 25518a94683196406b83b14218d1beef66067f126a16keunyoung case CAMERA2_TEMPLATE_PREVIEW: 25528a94683196406b83b14218d1beef66067f126a16keunyoung controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_PREVIEW; 25538a94683196406b83b14218d1beef66067f126a16keunyoung break; 25548a94683196406b83b14218d1beef66067f126a16keunyoung case CAMERA2_TEMPLATE_STILL_CAPTURE: 25558a94683196406b83b14218d1beef66067f126a16keunyoung controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE; 25568a94683196406b83b14218d1beef66067f126a16keunyoung break; 25578a94683196406b83b14218d1beef66067f126a16keunyoung case CAMERA2_TEMPLATE_VIDEO_RECORD: 25588a94683196406b83b14218d1beef66067f126a16keunyoung controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_RECORD; 25598a94683196406b83b14218d1beef66067f126a16keunyoung break; 25608a94683196406b83b14218d1beef66067f126a16keunyoung case CAMERA2_TEMPLATE_VIDEO_SNAPSHOT: 25618a94683196406b83b14218d1beef66067f126a16keunyoung controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT; 25628a94683196406b83b14218d1beef66067f126a16keunyoung break; 25638a94683196406b83b14218d1beef66067f126a16keunyoung case CAMERA2_TEMPLATE_ZERO_SHUTTER_LAG: 25648a94683196406b83b14218d1beef66067f126a16keunyoung controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_ZERO_SHUTTER_LAG; 25658a94683196406b83b14218d1beef66067f126a16keunyoung break; 25668a94683196406b83b14218d1beef66067f126a16keunyoung default: 25678a94683196406b83b14218d1beef66067f126a16keunyoung controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_CUSTOM; 25688a94683196406b83b14218d1beef66067f126a16keunyoung break; 25698a94683196406b83b14218d1beef66067f126a16keunyoung } 25708a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_CONTROL_CAPTURE_INTENT, &controlIntent, 1); 25718a94683196406b83b14218d1beef66067f126a16keunyoung 25728a94683196406b83b14218d1beef66067f126a16keunyoung static const uint8_t controlMode = ANDROID_CONTROL_MODE_AUTO; 25738a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_CONTROL_MODE, &controlMode, 1); 25748a94683196406b83b14218d1beef66067f126a16keunyoung 25758a94683196406b83b14218d1beef66067f126a16keunyoung static const uint8_t effectMode = ANDROID_CONTROL_EFFECT_MODE_OFF; 25768a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_CONTROL_EFFECT_MODE, &effectMode, 1); 25778a94683196406b83b14218d1beef66067f126a16keunyoung 25788a94683196406b83b14218d1beef66067f126a16keunyoung static const uint8_t sceneMode = ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY; 25798a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_CONTROL_SCENE_MODE, &sceneMode, 1); 25808a94683196406b83b14218d1beef66067f126a16keunyoung 25818a94683196406b83b14218d1beef66067f126a16keunyoung static const uint8_t aeMode = ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH; 25828a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_CONTROL_AE_MODE, &aeMode, 1); 25838a94683196406b83b14218d1beef66067f126a16keunyoung 25848a94683196406b83b14218d1beef66067f126a16keunyoung static const uint8_t aeLock = ANDROID_CONTROL_AE_LOCK_OFF; 25858a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_CONTROL_AE_LOCK, &aeLock, 1); 25868a94683196406b83b14218d1beef66067f126a16keunyoung 25878a94683196406b83b14218d1beef66067f126a16keunyoung static const int32_t controlRegions[5] = { 258879f8dcdb2da221f2e6992f53a83c36b95332fc2eEino-Ville Talvala 0, 0, 258979f8dcdb2da221f2e6992f53a83c36b95332fc2eEino-Ville Talvala static_cast<int32_t>(Sensor::kResolution[0]), 259079f8dcdb2da221f2e6992f53a83c36b95332fc2eEino-Ville Talvala static_cast<int32_t>(Sensor::kResolution[1]), 259179f8dcdb2da221f2e6992f53a83c36b95332fc2eEino-Ville Talvala 1000 25928a94683196406b83b14218d1beef66067f126a16keunyoung }; 25938a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_CONTROL_AE_REGIONS, controlRegions, 5); 25948a94683196406b83b14218d1beef66067f126a16keunyoung 25958a94683196406b83b14218d1beef66067f126a16keunyoung static const int32_t aeExpCompensation = 0; 25968a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION, &aeExpCompensation, 1); 25978a94683196406b83b14218d1beef66067f126a16keunyoung 25988a94683196406b83b14218d1beef66067f126a16keunyoung static const int32_t aeTargetFpsRange[2] = { 25998a94683196406b83b14218d1beef66067f126a16keunyoung 10, 30 26008a94683196406b83b14218d1beef66067f126a16keunyoung }; 26018a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_CONTROL_AE_TARGET_FPS_RANGE, aeTargetFpsRange, 2); 26028a94683196406b83b14218d1beef66067f126a16keunyoung 26038a94683196406b83b14218d1beef66067f126a16keunyoung static const uint8_t aeAntibandingMode = 26048a94683196406b83b14218d1beef66067f126a16keunyoung ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO; 26058a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_CONTROL_AE_ANTIBANDING_MODE, &aeAntibandingMode, 1); 26068a94683196406b83b14218d1beef66067f126a16keunyoung 26078a94683196406b83b14218d1beef66067f126a16keunyoung static const uint8_t awbMode = 26088a94683196406b83b14218d1beef66067f126a16keunyoung ANDROID_CONTROL_AWB_MODE_AUTO; 26098a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_CONTROL_AWB_MODE, &awbMode, 1); 26108a94683196406b83b14218d1beef66067f126a16keunyoung 26118a94683196406b83b14218d1beef66067f126a16keunyoung static const uint8_t awbLock = ANDROID_CONTROL_AWB_LOCK_OFF; 26128a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_CONTROL_AWB_LOCK, &awbLock, 1); 26138a94683196406b83b14218d1beef66067f126a16keunyoung 26148a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_CONTROL_AWB_REGIONS, controlRegions, 5); 26158a94683196406b83b14218d1beef66067f126a16keunyoung 26168a94683196406b83b14218d1beef66067f126a16keunyoung uint8_t afMode = 0; 26178a94683196406b83b14218d1beef66067f126a16keunyoung switch (request_template) { 26188a94683196406b83b14218d1beef66067f126a16keunyoung case CAMERA2_TEMPLATE_PREVIEW: 26198a94683196406b83b14218d1beef66067f126a16keunyoung afMode = ANDROID_CONTROL_AF_MODE_AUTO; 26208a94683196406b83b14218d1beef66067f126a16keunyoung break; 26218a94683196406b83b14218d1beef66067f126a16keunyoung case CAMERA2_TEMPLATE_STILL_CAPTURE: 26228a94683196406b83b14218d1beef66067f126a16keunyoung afMode = ANDROID_CONTROL_AF_MODE_AUTO; 26238a94683196406b83b14218d1beef66067f126a16keunyoung break; 26248a94683196406b83b14218d1beef66067f126a16keunyoung case CAMERA2_TEMPLATE_VIDEO_RECORD: 26258a94683196406b83b14218d1beef66067f126a16keunyoung afMode = ANDROID_CONTROL_AF_MODE_CONTINUOUS_VIDEO; 26268a94683196406b83b14218d1beef66067f126a16keunyoung break; 26278a94683196406b83b14218d1beef66067f126a16keunyoung case CAMERA2_TEMPLATE_VIDEO_SNAPSHOT: 26288a94683196406b83b14218d1beef66067f126a16keunyoung afMode = ANDROID_CONTROL_AF_MODE_CONTINUOUS_VIDEO; 26298a94683196406b83b14218d1beef66067f126a16keunyoung break; 26308a94683196406b83b14218d1beef66067f126a16keunyoung case CAMERA2_TEMPLATE_ZERO_SHUTTER_LAG: 26318a94683196406b83b14218d1beef66067f126a16keunyoung afMode = ANDROID_CONTROL_AF_MODE_CONTINUOUS_PICTURE; 26328a94683196406b83b14218d1beef66067f126a16keunyoung break; 26338a94683196406b83b14218d1beef66067f126a16keunyoung default: 26348a94683196406b83b14218d1beef66067f126a16keunyoung afMode = ANDROID_CONTROL_AF_MODE_AUTO; 26358a94683196406b83b14218d1beef66067f126a16keunyoung break; 26368a94683196406b83b14218d1beef66067f126a16keunyoung } 26378a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_CONTROL_AF_MODE, &afMode, 1); 26388a94683196406b83b14218d1beef66067f126a16keunyoung 26398a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_CONTROL_AF_REGIONS, controlRegions, 5); 26408a94683196406b83b14218d1beef66067f126a16keunyoung 26418a94683196406b83b14218d1beef66067f126a16keunyoung static const uint8_t vstabMode = 26428a94683196406b83b14218d1beef66067f126a16keunyoung ANDROID_CONTROL_VIDEO_STABILIZATION_MODE_OFF; 26438a94683196406b83b14218d1beef66067f126a16keunyoung ADD_OR_SIZE(ANDROID_CONTROL_VIDEO_STABILIZATION_MODE, &vstabMode, 1); 26448a94683196406b83b14218d1beef66067f126a16keunyoung 26458a94683196406b83b14218d1beef66067f126a16keunyoung // aeState, awbState, afState only in frame 26468a94683196406b83b14218d1beef66067f126a16keunyoung 26478a94683196406b83b14218d1beef66067f126a16keunyoung /** Allocate metadata if sizing */ 26488a94683196406b83b14218d1beef66067f126a16keunyoung if (sizeRequest) { 26493725c7c982eac52ec64a625e82f306822452941cColin Cross ALOGV("Allocating %zu entries, %zu extra bytes for " 26508a94683196406b83b14218d1beef66067f126a16keunyoung "request template type %d", 26518a94683196406b83b14218d1beef66067f126a16keunyoung entryCount, dataCount, request_template); 26528a94683196406b83b14218d1beef66067f126a16keunyoung *request = allocate_camera_metadata(entryCount, dataCount); 26538a94683196406b83b14218d1beef66067f126a16keunyoung if (*request == NULL) { 26548a94683196406b83b14218d1beef66067f126a16keunyoung ALOGE("Unable to allocate new request template type %d " 26553725c7c982eac52ec64a625e82f306822452941cColin Cross "(%zu entries, %zu bytes extra data)", request_template, 26568a94683196406b83b14218d1beef66067f126a16keunyoung entryCount, dataCount); 26578a94683196406b83b14218d1beef66067f126a16keunyoung return NO_MEMORY; 26588a94683196406b83b14218d1beef66067f126a16keunyoung } 26598a94683196406b83b14218d1beef66067f126a16keunyoung } 26608a94683196406b83b14218d1beef66067f126a16keunyoung return OK; 26618a94683196406b83b14218d1beef66067f126a16keunyoung#undef ADD_OR_SIZE 26628a94683196406b83b14218d1beef66067f126a16keunyoung} 26638a94683196406b83b14218d1beef66067f126a16keunyoung 26648a94683196406b83b14218d1beef66067f126a16keunyoungstatus_t EmulatedFakeCamera2::addOrSize(camera_metadata_t *request, 26658a94683196406b83b14218d1beef66067f126a16keunyoung bool sizeRequest, 26668a94683196406b83b14218d1beef66067f126a16keunyoung size_t *entryCount, 26678a94683196406b83b14218d1beef66067f126a16keunyoung size_t *dataCount, 26688a94683196406b83b14218d1beef66067f126a16keunyoung uint32_t tag, 26698a94683196406b83b14218d1beef66067f126a16keunyoung const void *entryData, 26708a94683196406b83b14218d1beef66067f126a16keunyoung size_t entryDataCount) { 26718a94683196406b83b14218d1beef66067f126a16keunyoung status_t res; 26728a94683196406b83b14218d1beef66067f126a16keunyoung if (!sizeRequest) { 26738a94683196406b83b14218d1beef66067f126a16keunyoung return add_camera_metadata_entry(request, tag, entryData, 26748a94683196406b83b14218d1beef66067f126a16keunyoung entryDataCount); 26758a94683196406b83b14218d1beef66067f126a16keunyoung } else { 26768a94683196406b83b14218d1beef66067f126a16keunyoung int type = get_camera_metadata_tag_type(tag); 26778a94683196406b83b14218d1beef66067f126a16keunyoung if (type < 0 ) return BAD_VALUE; 26788a94683196406b83b14218d1beef66067f126a16keunyoung (*entryCount)++; 26798a94683196406b83b14218d1beef66067f126a16keunyoung (*dataCount) += calculate_camera_metadata_entry_data_size(type, 26808a94683196406b83b14218d1beef66067f126a16keunyoung entryDataCount); 26818a94683196406b83b14218d1beef66067f126a16keunyoung return OK; 26828a94683196406b83b14218d1beef66067f126a16keunyoung } 26838a94683196406b83b14218d1beef66067f126a16keunyoung} 26848a94683196406b83b14218d1beef66067f126a16keunyoung 26858a94683196406b83b14218d1beef66067f126a16keunyoungbool EmulatedFakeCamera2::isStreamInUse(uint32_t id) { 26868a94683196406b83b14218d1beef66067f126a16keunyoung // Assumes mMutex is locked; otherwise new requests could enter 26878a94683196406b83b14218d1beef66067f126a16keunyoung // configureThread while readoutThread is being checked 26888a94683196406b83b14218d1beef66067f126a16keunyoung 26898a94683196406b83b14218d1beef66067f126a16keunyoung // Order of isStreamInUse calls matters 26908a94683196406b83b14218d1beef66067f126a16keunyoung if (mConfigureThread->isStreamInUse(id) || 26918a94683196406b83b14218d1beef66067f126a16keunyoung mReadoutThread->isStreamInUse(id) || 26928a94683196406b83b14218d1beef66067f126a16keunyoung mJpegCompressor->isStreamInUse(id) ) { 26938a94683196406b83b14218d1beef66067f126a16keunyoung ALOGE("%s: Stream %d is in use in active requests!", 26948a94683196406b83b14218d1beef66067f126a16keunyoung __FUNCTION__, id); 26958a94683196406b83b14218d1beef66067f126a16keunyoung return true; 26968a94683196406b83b14218d1beef66067f126a16keunyoung } 26978a94683196406b83b14218d1beef66067f126a16keunyoung return false; 26988a94683196406b83b14218d1beef66067f126a16keunyoung} 26998a94683196406b83b14218d1beef66067f126a16keunyoung 27008a94683196406b83b14218d1beef66067f126a16keunyoungbool EmulatedFakeCamera2::isReprocessStreamInUse(uint32_t id) { 27018a94683196406b83b14218d1beef66067f126a16keunyoung // TODO: implement 27028a94683196406b83b14218d1beef66067f126a16keunyoung return false; 27038a94683196406b83b14218d1beef66067f126a16keunyoung} 27048a94683196406b83b14218d1beef66067f126a16keunyoung 27058a94683196406b83b14218d1beef66067f126a16keunyoungconst Stream& EmulatedFakeCamera2::getStreamInfo(uint32_t streamId) { 27068a94683196406b83b14218d1beef66067f126a16keunyoung Mutex::Autolock lock(mMutex); 27078a94683196406b83b14218d1beef66067f126a16keunyoung 27088a94683196406b83b14218d1beef66067f126a16keunyoung return mStreams.valueFor(streamId); 27098a94683196406b83b14218d1beef66067f126a16keunyoung} 27108a94683196406b83b14218d1beef66067f126a16keunyoung 27118a94683196406b83b14218d1beef66067f126a16keunyoungconst ReprocessStream& EmulatedFakeCamera2::getReprocessStreamInfo(uint32_t streamId) { 27128a94683196406b83b14218d1beef66067f126a16keunyoung Mutex::Autolock lock(mMutex); 27138a94683196406b83b14218d1beef66067f126a16keunyoung 27148a94683196406b83b14218d1beef66067f126a16keunyoung return mReprocessStreams.valueFor(streamId); 27158a94683196406b83b14218d1beef66067f126a16keunyoung} 27168a94683196406b83b14218d1beef66067f126a16keunyoung 27178a94683196406b83b14218d1beef66067f126a16keunyoung}; /* namespace android */ 2718