ZslProcessor3.cpp revision cb0652e5a850b2fcd919e977247e87239efaf70e
12fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin/* 22fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin * Copyright (C) 2013 The Android Open Source Project 32fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin * 42fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin * Licensed under the Apache License, Version 2.0 (the "License"); 52fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin * you may not use this file except in compliance with the License. 62fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin * You may obtain a copy of the License at 72fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin * 82fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin * http://www.apache.org/licenses/LICENSE-2.0 92fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin * 102fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin * Unless required by applicable law or agreed to in writing, software 112fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin * distributed under the License is distributed on an "AS IS" BASIS, 122fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin * See the License for the specific language governing permissions and 142fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin * limitations under the License. 152fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin */ 162fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 172fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin#define LOG_TAG "Camera2-ZslProcessor3" 182fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin#define ATRACE_TAG ATRACE_TAG_CAMERA 192fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin//#define LOG_NDEBUG 0 202fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin//#define LOG_NNDEBUG 0 212fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 222fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin#ifdef LOG_NNDEBUG 232fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin#define ALOGVV(...) ALOGV(__VA_ARGS__) 242fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin#else 252fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin#define ALOGVV(...) ((void)0) 262fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin#endif 272fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 28e5729fac81c8a984e984fefc90afc64135817d4fColin Cross#include <inttypes.h> 29e5729fac81c8a984e984fefc90afc64135817d4fColin Cross 302fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin#include <utils/Log.h> 312fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin#include <utils/Trace.h> 322fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin#include <gui/Surface.h> 332fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 347b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "common/CameraDeviceBase.h" 357b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "api1/Camera2Client.h" 367b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "api1/client2/CaptureSequencer.h" 377b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "api1/client2/ZslProcessor3.h" 387b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "device3/Camera3Device.h" 392fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 402fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkinnamespace android { 412fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkinnamespace camera2 { 422fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 432fba584544e8687b526e3388bf7160b696da1dbaIgor MurashkinZslProcessor3::ZslProcessor3( 442fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin sp<Camera2Client> client, 452fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin wp<CaptureSequencer> sequencer): 462fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin Thread(false), 472fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin mState(RUNNING), 482fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin mClient(client), 492fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin mSequencer(sequencer), 502fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin mId(client->getCameraId()), 512fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin mZslStreamId(NO_STREAM), 522fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin mFrameListHead(0), 532fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin mZslQueueHead(0), 542fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin mZslQueueTail(0) { 552fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin mZslQueue.insertAt(0, kZslBufferDepth); 562fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin mFrameList.insertAt(0, kFrameListDepth); 572fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin sp<CaptureSequencer> captureSequencer = mSequencer.promote(); 582fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin if (captureSequencer != 0) captureSequencer->setZslProcessor(this); 592fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin} 602fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 612fba584544e8687b526e3388bf7160b696da1dbaIgor MurashkinZslProcessor3::~ZslProcessor3() { 622fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin ALOGV("%s: Exit", __FUNCTION__); 632fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin deleteStream(); 642fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin} 652fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 66cb0652e5a850b2fcd919e977247e87239efaf70eJianing Weivoid ZslProcessor3::onResultAvailable(const CaptureResult &result) { 67cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei ATRACE_CALL(); 68cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei ALOGV("%s:", __FUNCTION__); 692fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin Mutex::Autolock l(mInputMutex); 702fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin camera_metadata_ro_entry_t entry; 71cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei entry = result.mMetadata.find(ANDROID_SENSOR_TIMESTAMP); 722fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin nsecs_t timestamp = entry.data.i64[0]; 732fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin (void)timestamp; 74e5729fac81c8a984e984fefc90afc64135817d4fColin Cross ALOGVV("Got preview metadata for timestamp %" PRId64, timestamp); 752fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 762fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin if (mState != RUNNING) return; 772fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 78cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei mFrameList.editItemAt(mFrameListHead) = result.mMetadata; 792fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin mFrameListHead = (mFrameListHead + 1) % kFrameListDepth; 802fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin} 812fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 822fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkinstatus_t ZslProcessor3::updateStream(const Parameters ¶ms) { 832fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin ATRACE_CALL(); 842fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin ALOGV("%s: Configuring ZSL streams", __FUNCTION__); 852fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin status_t res; 862fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 872fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin Mutex::Autolock l(mInputMutex); 882fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 892fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin sp<Camera2Client> client = mClient.promote(); 902fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin if (client == 0) { 912fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin ALOGE("%s: Camera %d: Client does not exist", __FUNCTION__, mId); 922fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin return INVALID_OPERATION; 932fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 942fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin sp<Camera3Device> device = 952fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin static_cast<Camera3Device*>(client->getCameraDevice().get()); 962fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin if (device == 0) { 972fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin ALOGE("%s: Camera %d: Device does not exist", __FUNCTION__, mId); 982fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin return INVALID_OPERATION; 992fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 1002fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 1012fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin if (mZslStreamId != NO_STREAM) { 1022fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin // Check if stream parameters have to change 1032fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin uint32_t currentWidth, currentHeight; 1042fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin res = device->getStreamInfo(mZslStreamId, 1052fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin ¤tWidth, ¤tHeight, 0); 1062fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin if (res != OK) { 1072fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin ALOGE("%s: Camera %d: Error querying capture output stream info: " 1082fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin "%s (%d)", __FUNCTION__, 1092fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin client->getCameraId(), strerror(-res), res); 1102fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin return res; 1112fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 1122fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin if (currentWidth != (uint32_t)params.fastInfo.arrayWidth || 1132fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin currentHeight != (uint32_t)params.fastInfo.arrayHeight) { 1142fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin ALOGV("%s: Camera %d: Deleting stream %d since the buffer " 1152fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin "dimensions changed", 1162fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin __FUNCTION__, client->getCameraId(), mZslStreamId); 1172fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin res = device->deleteStream(mZslStreamId); 1185282713a976184e41451315f1286d8075b257d58Igor Murashkin if (res == -EBUSY) { 1195282713a976184e41451315f1286d8075b257d58Igor Murashkin ALOGV("%s: Camera %d: Device is busy, call updateStream again " 1205282713a976184e41451315f1286d8075b257d58Igor Murashkin " after it becomes idle", __FUNCTION__, mId); 1215282713a976184e41451315f1286d8075b257d58Igor Murashkin return res; 1225282713a976184e41451315f1286d8075b257d58Igor Murashkin } else if(res != OK) { 1232fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin ALOGE("%s: Camera %d: Unable to delete old output stream " 1242fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin "for ZSL: %s (%d)", __FUNCTION__, 1252fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin client->getCameraId(), strerror(-res), res); 1262fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin return res; 1272fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 1282fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin mZslStreamId = NO_STREAM; 1292fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 1302fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 1312fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 1322fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin if (mZslStreamId == NO_STREAM) { 1332fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin // Create stream for HAL production 1342fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin // TODO: Sort out better way to select resolution for ZSL 1352fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 1362fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin // Note that format specified internally in Camera3ZslStream 1372fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin res = device->createZslStream( 1382fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin params.fastInfo.arrayWidth, params.fastInfo.arrayHeight, 1392fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin kZslBufferDepth, 1402fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin &mZslStreamId, 1412fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin &mZslStream); 1422fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin if (res != OK) { 1432fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin ALOGE("%s: Camera %d: Can't create ZSL stream: " 1442fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin "%s (%d)", __FUNCTION__, client->getCameraId(), 1452fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin strerror(-res), res); 1462fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin return res; 1472fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 1482fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 1492fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin client->registerFrameListener(Camera2Client::kPreviewRequestIdStart, 1502fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin Camera2Client::kPreviewRequestIdEnd, 1512fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin this); 1522fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 1532fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin return OK; 1542fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin} 1552fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 1562fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkinstatus_t ZslProcessor3::deleteStream() { 1572fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin ATRACE_CALL(); 1582fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin status_t res; 1592fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 1602fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin Mutex::Autolock l(mInputMutex); 1612fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 1622fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin if (mZslStreamId != NO_STREAM) { 1632fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin sp<Camera2Client> client = mClient.promote(); 1642fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin if (client == 0) { 1652fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin ALOGE("%s: Camera %d: Client does not exist", __FUNCTION__, mId); 1662fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin return INVALID_OPERATION; 1672fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 1682fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 1692fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin sp<Camera3Device> device = 1702fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin reinterpret_cast<Camera3Device*>(client->getCameraDevice().get()); 1712fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin if (device == 0) { 1722fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin ALOGE("%s: Camera %d: Device does not exist", __FUNCTION__, mId); 1732fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin return INVALID_OPERATION; 1742fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 1752fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 1762fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin res = device->deleteStream(mZslStreamId); 1772fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin if (res != OK) { 1782fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin ALOGE("%s: Camera %d: Cannot delete ZSL output stream %d: " 1792fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin "%s (%d)", __FUNCTION__, client->getCameraId(), 1802fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin mZslStreamId, strerror(-res), res); 1812fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin return res; 1822fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 1832fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 1842fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin mZslStreamId = NO_STREAM; 1852fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 1862fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin return OK; 1872fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin} 1882fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 1892fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkinint ZslProcessor3::getStreamId() const { 1902fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin Mutex::Autolock l(mInputMutex); 1912fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin return mZslStreamId; 1922fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin} 1932fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 1942fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkinstatus_t ZslProcessor3::pushToReprocess(int32_t requestId) { 1952fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin ALOGV("%s: Send in reprocess request with id %d", 1962fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin __FUNCTION__, requestId); 1972fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin Mutex::Autolock l(mInputMutex); 1982fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin status_t res; 1992fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin sp<Camera2Client> client = mClient.promote(); 2002fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 2012fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin if (client == 0) { 2022fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin ALOGE("%s: Camera %d: Client does not exist", __FUNCTION__, mId); 2032fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin return INVALID_OPERATION; 2042fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 2052fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 2062fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin IF_ALOGV() { 2072fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin dumpZslQueue(-1); 2082fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 2092fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 2102fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin size_t metadataIdx; 2112fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin nsecs_t candidateTimestamp = getCandidateTimestampLocked(&metadataIdx); 2122fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 2132fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin if (candidateTimestamp == -1) { 2142fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin ALOGE("%s: Could not find good candidate for ZSL reprocessing", 2152fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin __FUNCTION__); 2162fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin return NOT_ENOUGH_DATA; 2172fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 2182fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 2192fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin res = mZslStream->enqueueInputBufferByTimestamp(candidateTimestamp, 2202fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin /*actualTimestamp*/NULL); 2212fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 2222fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin if (res == mZslStream->NO_BUFFER_AVAILABLE) { 2232fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin ALOGV("%s: No ZSL buffers yet", __FUNCTION__); 2242fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin return NOT_ENOUGH_DATA; 2252fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } else if (res != OK) { 2262fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin ALOGE("%s: Unable to push buffer for reprocessing: %s (%d)", 2272fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin __FUNCTION__, strerror(-res), res); 2282fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin return res; 2292fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 2302fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 2312fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin { 2322fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin CameraMetadata request = mFrameList[metadataIdx]; 2332fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 2342fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin // Verify that the frame is reasonable for reprocessing 2352fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 2362fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin camera_metadata_entry_t entry; 2372fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin entry = request.find(ANDROID_CONTROL_AE_STATE); 2382fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin if (entry.count == 0) { 2392fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin ALOGE("%s: ZSL queue frame has no AE state field!", 2402fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin __FUNCTION__); 2412fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin return BAD_VALUE; 2422fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 2432fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin if (entry.data.u8[0] != ANDROID_CONTROL_AE_STATE_CONVERGED && 2442fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin entry.data.u8[0] != ANDROID_CONTROL_AE_STATE_LOCKED) { 2452fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin ALOGV("%s: ZSL queue frame AE state is %d, need full capture", 2462fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin __FUNCTION__, entry.data.u8[0]); 2472fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin return NOT_ENOUGH_DATA; 2482fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 2492fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 2502fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin uint8_t requestType = ANDROID_REQUEST_TYPE_REPROCESS; 2512fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin res = request.update(ANDROID_REQUEST_TYPE, 2522fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin &requestType, 1); 253d1d6467d3bcbc1305eeba0176a2edf04925c368eZhijun He int32_t inputStreams[1] = 254d1d6467d3bcbc1305eeba0176a2edf04925c368eZhijun He { mZslStreamId }; 2552fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin if (res == OK) request.update(ANDROID_REQUEST_INPUT_STREAMS, 2562fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin inputStreams, 1); 2572fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin // TODO: Shouldn't we also update the latest preview frame? 258d1d6467d3bcbc1305eeba0176a2edf04925c368eZhijun He int32_t outputStreams[1] = 259d1d6467d3bcbc1305eeba0176a2edf04925c368eZhijun He { client->getCaptureStreamId() }; 2602fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin if (res == OK) request.update(ANDROID_REQUEST_OUTPUT_STREAMS, 2612fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin outputStreams, 1); 2622fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin res = request.update(ANDROID_REQUEST_ID, 2632fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin &requestId, 1); 2642fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 2652fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin if (res != OK ) { 2662fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin ALOGE("%s: Unable to update frame to a reprocess request", 2672fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin __FUNCTION__); 2682fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin return INVALID_OPERATION; 2692fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 2702fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 2712fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin res = client->stopStream(); 2722fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin if (res != OK) { 2732fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin ALOGE("%s: Camera %d: Unable to stop preview for ZSL capture: " 2742fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin "%s (%d)", 2752fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin __FUNCTION__, client->getCameraId(), strerror(-res), res); 2762fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin return INVALID_OPERATION; 2772fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 2782fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 279491e341211b4772c75f719158f6b397e1c40497dZhijun He // Flush device to clear out all in-flight requests pending in HAL. 280491e341211b4772c75f719158f6b397e1c40497dZhijun He res = client->getCameraDevice()->flush(); 281491e341211b4772c75f719158f6b397e1c40497dZhijun He if (res != OK) { 282491e341211b4772c75f719158f6b397e1c40497dZhijun He ALOGE("%s: Camera %d: Failed to flush device: " 283491e341211b4772c75f719158f6b397e1c40497dZhijun He "%s (%d)", 284491e341211b4772c75f719158f6b397e1c40497dZhijun He __FUNCTION__, client->getCameraId(), strerror(-res), res); 285491e341211b4772c75f719158f6b397e1c40497dZhijun He return res; 286491e341211b4772c75f719158f6b397e1c40497dZhijun He } 287491e341211b4772c75f719158f6b397e1c40497dZhijun He 2882fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin // Update JPEG settings 2892fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin { 2902fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin SharedParameters::Lock l(client->getParameters()); 2912fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin res = l.mParameters.updateRequestJpeg(&request); 2922fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin if (res != OK) { 2932fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin ALOGE("%s: Camera %d: Unable to update JPEG entries of ZSL " 2942fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin "capture request: %s (%d)", __FUNCTION__, 2952fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin client->getCameraId(), 2962fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin strerror(-res), res); 2972fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin return res; 2982fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 2992fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 3002fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 3012fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin mLatestCapturedRequest = request; 3022fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin res = client->getCameraDevice()->capture(request); 3032fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin if (res != OK ) { 3042fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin ALOGE("%s: Unable to send ZSL reprocess request to capture: %s" 3052fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin " (%d)", __FUNCTION__, strerror(-res), res); 3062fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin return res; 3072fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 3082fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 3092fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin mState = LOCKED; 3102fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 3112fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 3122fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin return OK; 3132fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin} 3142fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 3152fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkinstatus_t ZslProcessor3::clearZslQueue() { 3162fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin Mutex::Autolock l(mInputMutex); 3172fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin // If in middle of capture, can't clear out queue 3182fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin if (mState == LOCKED) return OK; 3192fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 3202fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin return clearZslQueueLocked(); 3212fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin} 3222fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 3232fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkinstatus_t ZslProcessor3::clearZslQueueLocked() { 32461675c0a7b5d88d5f525b1a1926fab6a7b2c7904Igor Murashkin if (mZslStream != 0) { 32561675c0a7b5d88d5f525b1a1926fab6a7b2c7904Igor Murashkin return mZslStream->clearInputRingBuffer(); 32661675c0a7b5d88d5f525b1a1926fab6a7b2c7904Igor Murashkin } 32761675c0a7b5d88d5f525b1a1926fab6a7b2c7904Igor Murashkin return OK; 3282fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin} 3292fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 3302fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkinvoid ZslProcessor3::dump(int fd, const Vector<String16>& /*args*/) const { 3312fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin Mutex::Autolock l(mInputMutex); 3322fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin if (!mLatestCapturedRequest.isEmpty()) { 3332fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin String8 result(" Latest ZSL capture request:\n"); 3342fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin write(fd, result.string(), result.size()); 3352fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin mLatestCapturedRequest.dump(fd, 2, 6); 3362fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } else { 3372fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin String8 result(" Latest ZSL capture request: none yet\n"); 3382fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin write(fd, result.string(), result.size()); 3392fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 3402fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin dumpZslQueue(fd); 3412fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin} 3422fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 3432fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkinbool ZslProcessor3::threadLoop() { 344241b52798809d8db3d369af05ace1f73f723f29bEino-Ville Talvala // TODO: remove dependency on thread. For now, shut thread down right 345241b52798809d8db3d369af05ace1f73f723f29bEino-Ville Talvala // away. 346241b52798809d8db3d369af05ace1f73f723f29bEino-Ville Talvala return false; 3472fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin} 3482fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 3492fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkinvoid ZslProcessor3::dumpZslQueue(int fd) const { 3502fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin String8 header("ZSL queue contents:"); 3512fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin String8 indent(" "); 3522fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin ALOGV("%s", header.string()); 3532fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin if (fd != -1) { 3542fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin header = indent + header + "\n"; 3552fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin write(fd, header.string(), header.size()); 3562fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 3572fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin for (size_t i = 0; i < mZslQueue.size(); i++) { 3582fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin const ZslPair &queueEntry = mZslQueue[i]; 3592fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin nsecs_t bufferTimestamp = queueEntry.buffer.mTimestamp; 3602fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin camera_metadata_ro_entry_t entry; 3612fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin nsecs_t frameTimestamp = 0; 3622fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin int frameAeState = -1; 3632fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin if (!queueEntry.frame.isEmpty()) { 3642fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin entry = queueEntry.frame.find(ANDROID_SENSOR_TIMESTAMP); 3652fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin if (entry.count > 0) frameTimestamp = entry.data.i64[0]; 3662fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin entry = queueEntry.frame.find(ANDROID_CONTROL_AE_STATE); 3672fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin if (entry.count > 0) frameAeState = entry.data.u8[0]; 3682fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 3692fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin String8 result = 370e5729fac81c8a984e984fefc90afc64135817d4fColin Cross String8::format(" %zu: b: %" PRId64 "\tf: %" PRId64 ", AE state: %d", i, 3712fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin bufferTimestamp, frameTimestamp, frameAeState); 3722fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin ALOGV("%s", result.string()); 3732fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin if (fd != -1) { 3742fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin result = indent + result + "\n"; 3752fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin write(fd, result.string(), result.size()); 3762fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 3772fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 3782fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 3792fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin} 3802fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 3812fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkinnsecs_t ZslProcessor3::getCandidateTimestampLocked(size_t* metadataIdx) const { 3822fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin /** 3832fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin * Find the smallest timestamp we know about so far 3842fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin * - ensure that aeState is either converged or locked 3852fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin */ 3862fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 3872fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin size_t idx = 0; 3882fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin nsecs_t minTimestamp = -1; 3894345d5b57a93ec6d003df84f5cce2db7cccfbd86Igor Murashkin 3904345d5b57a93ec6d003df84f5cce2db7cccfbd86Igor Murashkin size_t emptyCount = mFrameList.size(); 3914345d5b57a93ec6d003df84f5cce2db7cccfbd86Igor Murashkin 3922fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin for (size_t j = 0; j < mFrameList.size(); j++) { 3932fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin const CameraMetadata &frame = mFrameList[j]; 3942fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin if (!frame.isEmpty()) { 3954345d5b57a93ec6d003df84f5cce2db7cccfbd86Igor Murashkin 3964345d5b57a93ec6d003df84f5cce2db7cccfbd86Igor Murashkin emptyCount--; 3974345d5b57a93ec6d003df84f5cce2db7cccfbd86Igor Murashkin 3982fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin camera_metadata_ro_entry_t entry; 3992fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin entry = frame.find(ANDROID_SENSOR_TIMESTAMP); 4002fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin if (entry.count == 0) { 4012fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin ALOGE("%s: Can't find timestamp in frame!", 4022fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin __FUNCTION__); 4032fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin continue; 4042fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 4052fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin nsecs_t frameTimestamp = entry.data.i64[0]; 406c2c874d88df1b4be52f5415de6606785691bba1fMansoor Aftab if (minTimestamp > frameTimestamp || minTimestamp == -1) { 4072fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 4082fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin entry = frame.find(ANDROID_CONTROL_AE_STATE); 4094345d5b57a93ec6d003df84f5cce2db7cccfbd86Igor Murashkin 4102fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin if (entry.count == 0) { 4114345d5b57a93ec6d003df84f5cce2db7cccfbd86Igor Murashkin /** 4124345d5b57a93ec6d003df84f5cce2db7cccfbd86Igor Murashkin * This is most likely a HAL bug. The aeState field is 4134345d5b57a93ec6d003df84f5cce2db7cccfbd86Igor Murashkin * mandatory, so it should always be in a metadata packet. 4144345d5b57a93ec6d003df84f5cce2db7cccfbd86Igor Murashkin */ 4152fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin ALOGW("%s: ZSL queue frame has no AE state field!", 4162fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin __FUNCTION__); 4172fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin continue; 4182fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 4192fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin if (entry.data.u8[0] != ANDROID_CONTROL_AE_STATE_CONVERGED && 4202fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin entry.data.u8[0] != ANDROID_CONTROL_AE_STATE_LOCKED) { 4212fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin ALOGVV("%s: ZSL queue frame AE state is %d, need " 4222fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin "full capture", __FUNCTION__, entry.data.u8[0]); 4232fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin continue; 4242fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 4252fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 4262fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin minTimestamp = frameTimestamp; 4272fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin idx = j; 4282fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 429efb0fd232388b1f726c59f2ec20eea2d3ea8465dIgor Murashkin 430e5729fac81c8a984e984fefc90afc64135817d4fColin Cross ALOGVV("%s: Saw timestamp %" PRId64, __FUNCTION__, frameTimestamp); 4312fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 4322fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 4332fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 4344345d5b57a93ec6d003df84f5cce2db7cccfbd86Igor Murashkin if (emptyCount == mFrameList.size()) { 4354345d5b57a93ec6d003df84f5cce2db7cccfbd86Igor Murashkin /** 4364345d5b57a93ec6d003df84f5cce2db7cccfbd86Igor Murashkin * This could be mildly bad and means our ZSL was triggered before 4374345d5b57a93ec6d003df84f5cce2db7cccfbd86Igor Murashkin * there were any frames yet received by the camera framework. 4384345d5b57a93ec6d003df84f5cce2db7cccfbd86Igor Murashkin * 4394345d5b57a93ec6d003df84f5cce2db7cccfbd86Igor Murashkin * This is a fairly corner case which can happen under: 4404345d5b57a93ec6d003df84f5cce2db7cccfbd86Igor Murashkin * + a user presses the shutter button real fast when the camera starts 4414345d5b57a93ec6d003df84f5cce2db7cccfbd86Igor Murashkin * (startPreview followed immediately by takePicture). 4424345d5b57a93ec6d003df84f5cce2db7cccfbd86Igor Murashkin * + burst capture case (hitting shutter button as fast possible) 4434345d5b57a93ec6d003df84f5cce2db7cccfbd86Igor Murashkin * 4444345d5b57a93ec6d003df84f5cce2db7cccfbd86Igor Murashkin * If this happens in steady case (preview running for a while, call 4454345d5b57a93ec6d003df84f5cce2db7cccfbd86Igor Murashkin * a single takePicture) then this might be a fwk bug. 4464345d5b57a93ec6d003df84f5cce2db7cccfbd86Igor Murashkin */ 4474345d5b57a93ec6d003df84f5cce2db7cccfbd86Igor Murashkin ALOGW("%s: ZSL queue has no metadata frames", __FUNCTION__); 4484345d5b57a93ec6d003df84f5cce2db7cccfbd86Igor Murashkin } 4494345d5b57a93ec6d003df84f5cce2db7cccfbd86Igor Murashkin 450e5729fac81c8a984e984fefc90afc64135817d4fColin Cross ALOGV("%s: Candidate timestamp %" PRId64 " (idx %zu), empty frames: %zu", 4514345d5b57a93ec6d003df84f5cce2db7cccfbd86Igor Murashkin __FUNCTION__, minTimestamp, idx, emptyCount); 4524345d5b57a93ec6d003df84f5cce2db7cccfbd86Igor Murashkin 4532fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin if (metadataIdx) { 4542fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin *metadataIdx = idx; 4552fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 4562fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 4572fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin return minTimestamp; 4582fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin} 4592fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 4602fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkinvoid ZslProcessor3::onBufferAcquired(const BufferInfo& /*bufferInfo*/) { 4612fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin // Intentionally left empty 4622fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin // Although theoretically we could use this to get better dump info 4632fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin} 4642fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 4652fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkinvoid ZslProcessor3::onBufferReleased(const BufferInfo& bufferInfo) { 4662fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin Mutex::Autolock l(mInputMutex); 4672fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 4682fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin // ignore output buffers 4692fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin if (bufferInfo.mOutput) { 4702fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin return; 4712fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin } 4722fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 4732fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin // TODO: Verify that the buffer is in our queue by looking at timestamp 4742fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin // theoretically unnecessary unless we change the following assumptions: 4752fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin // -- only 1 buffer reprocessed at a time (which is the case now) 4762fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 4772fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin // Erase entire ZSL queue since we've now completed the capture and preview 4782fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin // is stopped. 4792fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin // 4802fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin // We need to guarantee that if we do two back-to-back captures, 4812fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin // the second won't use a buffer that's older/the same as the first, which 4822fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin // is theoretically possible if we don't clear out the queue and the 4832fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin // selection criteria is something like 'newest'. Clearing out the queue 4842fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin // on a completed capture ensures we'll only use new data. 4852fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin ALOGV("%s: Memory optimization, clearing ZSL queue", 4862fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin __FUNCTION__); 4872fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin clearZslQueueLocked(); 4882fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 4892fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin // Required so we accept more ZSL requests 4902fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin mState = RUNNING; 4912fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin} 4922fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin 4932fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin}; // namespace camera2 4942fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin}; // namespace android 495