ZslProcessor.cpp revision 97b38a81ac989ccba02d726011a82541f14166df
1da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala/* 2da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * Copyright (C) 2012 The Android Open Source Project 3da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * 4da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * Licensed under the Apache License, Version 2.0 (the "License"); 5da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * you may not use this file except in compliance with the License. 6da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * You may obtain a copy of the License at 7da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * 8da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * http://www.apache.org/licenses/LICENSE-2.0 9da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * 10da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * Unless required by applicable law or agreed to in writing, software 11da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * distributed under the License is distributed on an "AS IS" BASIS, 12da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * See the License for the specific language governing permissions and 14da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * limitations under the License. 15da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala */ 16da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 17da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#define LOG_TAG "Camera2Client::ZslProcessor" 18da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#define ATRACE_TAG ATRACE_TAG_CAMERA 19da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala//#define LOG_NDEBUG 0 20da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala//#define LOG_NNDEBUG 0 21da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 22da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#ifdef LOG_NNDEBUG 23da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#define ALOGVV(...) ALOGV(__VA_ARGS__) 24da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#else 25da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#define ALOGVV(...) ((void)0) 26da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#endif 27da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 28da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#include <utils/Log.h> 29da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#include <utils/Trace.h> 30da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 31da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#include "ZslProcessor.h" 32da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#include <gui/SurfaceTextureClient.h> 33da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#include "../Camera2Device.h" 34da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#include "../Camera2Client.h" 35da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 36da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 37da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalanamespace android { 38da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalanamespace camera2 { 39da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 40da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville TalvalaZslProcessor::ZslProcessor( 41da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala wp<Camera2Client> client, 42da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala wp<CaptureSequencer> sequencer): 43da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala Thread(false), 44da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mState(RUNNING), 45da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mClient(client), 46da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mSequencer(sequencer), 47da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mZslBufferAvailable(false), 48da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mZslStreamId(NO_STREAM), 49da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mZslReprocessStreamId(NO_STREAM), 50da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mFrameListHead(0), 51da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mZslQueueHead(0), 52da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mZslQueueTail(0) { 53da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mZslQueue.insertAt(0, kZslBufferDepth); 54da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mFrameList.insertAt(0, kFrameListDepth); 55da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala sp<CaptureSequencer> captureSequencer = mSequencer.promote(); 56da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (captureSequencer != 0) captureSequencer->setZslProcessor(this); 57da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 58da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 59da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville TalvalaZslProcessor::~ZslProcessor() { 60da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGV("%s: Exit", __FUNCTION__); 61cf70d3469332445dc3ffd09729da3538612b1bb2Eino-Ville Talvala deleteStream(); 62da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 63da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 64da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalavoid ZslProcessor::onFrameAvailable() { 65da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala Mutex::Autolock l(mInputMutex); 66da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (!mZslBufferAvailable) { 67da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mZslBufferAvailable = true; 68da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mZslBufferAvailableSignal.signal(); 69da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 70da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 71da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 72da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalavoid ZslProcessor::onFrameAvailable(int32_t frameId, CameraMetadata &frame) { 73da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala Mutex::Autolock l(mInputMutex); 74da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala camera_metadata_entry_t entry; 75da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala entry = frame.find(ANDROID_SENSOR_TIMESTAMP); 76da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala nsecs_t timestamp = entry.data.i64[0]; 77da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGVV("Got preview frame for timestamp %lld", timestamp); 78da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 79da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (mState != RUNNING) return; 80da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 81da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mFrameList.editItemAt(mFrameListHead).acquire(frame); 82da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mFrameListHead = (mFrameListHead + 1) % kFrameListDepth; 83da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 84da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala findMatchesLocked(); 85da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 86da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 87da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalavoid ZslProcessor::onBufferReleased(buffer_handle_t *handle) { 88da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala Mutex::Autolock l(mInputMutex); 89da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 9097b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala // Verify that the buffer is in our queue 9197b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala size_t i = 0; 9297b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala for (; i < mZslQueue.size(); i++) { 9397b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala if (&(mZslQueue[i].buffer.mGraphicBuffer->handle) == handle) break; 9497b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala } 9597b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala if (i == mZslQueue.size()) { 9697b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala ALOGW("%s: Released buffer %p not found in queue", 9797b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala __FUNCTION__, handle); 98da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 99da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 100da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mState = RUNNING; 101da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 102da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 103da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalastatus_t ZslProcessor::updateStream(const Parameters ¶ms) { 104da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ATRACE_CALL(); 105da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGV("%s: Configuring ZSL streams", __FUNCTION__); 106da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala status_t res; 107da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 108da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala Mutex::Autolock l(mInputMutex); 109da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 110da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala sp<Camera2Client> client = mClient.promote(); 111da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (client == 0) return OK; 112da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala sp<Camera2Device> device = client->getCameraDevice(); 113da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 114da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (mZslConsumer == 0) { 115da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala // Create CPU buffer queue endpoint 116da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mZslConsumer = new BufferItemConsumer( 117da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala GRALLOC_USAGE_HW_CAMERA_ZSL, 118da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala kZslBufferDepth, 119da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala true); 120da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mZslConsumer->setFrameAvailableListener(this); 121da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mZslConsumer->setName(String8("Camera2Client::ZslConsumer")); 122da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mZslWindow = new SurfaceTextureClient( 123da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mZslConsumer->getProducerInterface()); 124da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 125da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 126da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (mZslStreamId != NO_STREAM) { 127da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala // Check if stream parameters have to change 128da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala uint32_t currentWidth, currentHeight; 129da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = device->getStreamInfo(mZslStreamId, 130da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ¤tWidth, ¤tHeight, 0); 131da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) { 132da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGE("%s: Camera %d: Error querying capture output stream info: " 133da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala "%s (%d)", __FUNCTION__, 134da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala client->getCameraId(), strerror(-res), res); 135da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return res; 136da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 1376e4db898bac9499a8abe7e6b6fbf729b78f6bd68Eino-Ville Talvala if (currentWidth != (uint32_t)params.fastInfo.arrayWidth || 1386e4db898bac9499a8abe7e6b6fbf729b78f6bd68Eino-Ville Talvala currentHeight != (uint32_t)params.fastInfo.arrayHeight) { 13947512a7da600ababdfd052b574488b9e499c22f6Eino-Ville Talvala res = device->deleteReprocessStream(mZslReprocessStreamId); 140da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) { 141da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to delete old reprocess stream " 142da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala "for ZSL: %s (%d)", __FUNCTION__, 143da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala client->getCameraId(), strerror(-res), res); 144da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return res; 145da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 146da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = device->deleteStream(mZslStreamId); 147da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) { 148da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to delete old output stream " 149da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala "for ZSL: %s (%d)", __FUNCTION__, 150da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala client->getCameraId(), strerror(-res), res); 151da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return res; 152da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 153da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mZslStreamId = NO_STREAM; 154da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 155da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 156da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 157da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (mZslStreamId == NO_STREAM) { 158da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala // Create stream for HAL production 1596e4db898bac9499a8abe7e6b6fbf729b78f6bd68Eino-Ville Talvala // TODO: Sort out better way to select resolution for ZSL 160da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = device->createStream(mZslWindow, 1616e4db898bac9499a8abe7e6b6fbf729b78f6bd68Eino-Ville Talvala params.fastInfo.arrayWidth, params.fastInfo.arrayHeight, 162beb1416afd1d331b8e7e93d626f39267acce289aEino-Ville Talvala CAMERA2_HAL_PIXEL_FORMAT_ZSL, 0, 163da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &mZslStreamId); 164da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) { 165da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGE("%s: Camera %d: Can't create output stream for ZSL: " 166da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala "%s (%d)", __FUNCTION__, client->getCameraId(), 167da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala strerror(-res), res); 168da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return res; 169da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 170da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = device->createReprocessStreamFromStream(mZslStreamId, 171da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &mZslReprocessStreamId); 172da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) { 173da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGE("%s: Camera %d: Can't create reprocess stream for ZSL: " 174da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala "%s (%d)", __FUNCTION__, client->getCameraId(), 175da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala strerror(-res), res); 176da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return res; 177da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 178da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 179da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala client->registerFrameListener(Camera2Client::kPreviewRequestId, this); 180da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 181da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return OK; 182da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 183da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 184da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalastatus_t ZslProcessor::deleteStream() { 185da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ATRACE_CALL(); 186da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala status_t res; 187da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 188da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala Mutex::Autolock l(mInputMutex); 189da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 190da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (mZslStreamId != NO_STREAM) { 191da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala sp<Camera2Client> client = mClient.promote(); 192da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (client == 0) return OK; 193da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala sp<Camera2Device> device = client->getCameraDevice(); 194da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 19547512a7da600ababdfd052b574488b9e499c22f6Eino-Ville Talvala res = device->deleteReprocessStream(mZslReprocessStreamId); 19647512a7da600ababdfd052b574488b9e499c22f6Eino-Ville Talvala if (res != OK) { 19747512a7da600ababdfd052b574488b9e499c22f6Eino-Ville Talvala ALOGE("%s: Camera %d: Cannot delete ZSL reprocessing stream %d: " 19847512a7da600ababdfd052b574488b9e499c22f6Eino-Ville Talvala "%s (%d)", __FUNCTION__, client->getCameraId(), 19947512a7da600ababdfd052b574488b9e499c22f6Eino-Ville Talvala mZslReprocessStreamId, strerror(-res), res); 20047512a7da600ababdfd052b574488b9e499c22f6Eino-Ville Talvala return res; 20147512a7da600ababdfd052b574488b9e499c22f6Eino-Ville Talvala } 20247512a7da600ababdfd052b574488b9e499c22f6Eino-Ville Talvala 203da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mZslReprocessStreamId = NO_STREAM; 20447512a7da600ababdfd052b574488b9e499c22f6Eino-Ville Talvala res = device->deleteStream(mZslStreamId); 20547512a7da600ababdfd052b574488b9e499c22f6Eino-Ville Talvala if (res != OK) { 20647512a7da600ababdfd052b574488b9e499c22f6Eino-Ville Talvala ALOGE("%s: Camera %d: Cannot delete ZSL output stream %d: " 20747512a7da600ababdfd052b574488b9e499c22f6Eino-Ville Talvala "%s (%d)", __FUNCTION__, client->getCameraId(), 20847512a7da600ababdfd052b574488b9e499c22f6Eino-Ville Talvala mZslStreamId, strerror(-res), res); 20947512a7da600ababdfd052b574488b9e499c22f6Eino-Ville Talvala return res; 21047512a7da600ababdfd052b574488b9e499c22f6Eino-Ville Talvala } 211cf70d3469332445dc3ffd09729da3538612b1bb2Eino-Ville Talvala 212cf70d3469332445dc3ffd09729da3538612b1bb2Eino-Ville Talvala mZslWindow.clear(); 213cf70d3469332445dc3ffd09729da3538612b1bb2Eino-Ville Talvala mZslConsumer.clear(); 214cf70d3469332445dc3ffd09729da3538612b1bb2Eino-Ville Talvala 215da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mZslStreamId = NO_STREAM; 216da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 217da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return OK; 218da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 219da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 220da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaint ZslProcessor::getStreamId() const { 221da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala Mutex::Autolock l(mInputMutex); 222da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return mZslStreamId; 223da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 224da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 225da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaint ZslProcessor::getReprocessStreamId() const { 226da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala Mutex::Autolock l(mInputMutex); 227da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return mZslReprocessStreamId; 228da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 229da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 230da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalastatus_t ZslProcessor::pushToReprocess(int32_t requestId) { 231da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGV("%s: Send in reprocess request with id %d", 232da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala __FUNCTION__, requestId); 233da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala Mutex::Autolock l(mInputMutex); 234da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala status_t res; 235da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala sp<Camera2Client> client = mClient.promote(); 236da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 23797b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala if (client == 0) return INVALID_OPERATION; 23897b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala 23997b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala IF_ALOGV() { 24097b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala dumpZslQueue(-1); 24197b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala } 24297b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala 243da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 244da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (mZslQueueTail != mZslQueueHead) { 245bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala CameraMetadata request; 246bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala size_t index = mZslQueueTail; 247bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala while (request.isEmpty() && index != mZslQueueHead) { 248bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala request = mZslQueue[index].frame; 249bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala index = (index + 1) % kZslBufferDepth; 250bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala } 251bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala if (request.isEmpty()) { 25297b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala ALOGV("%s: ZSL queue has no valid frames to send yet.", 25397b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala __FUNCTION__); 25497b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala return NOT_ENOUGH_DATA; 25597b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala } 25697b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala // Verify that the frame is reasonable for reprocessing 25797b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala 25897b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala camera_metadata_entry_t entry; 25997b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala entry = request.find(ANDROID_CONTROL_AE_STATE); 26097b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala if (entry.count == 0) { 26197b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala ALOGE("%s: ZSL queue frame has no AE state field!", 26297b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala __FUNCTION__); 263bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala return BAD_VALUE; 264bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala } 26597b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala if (entry.data.u8[0] != ANDROID_CONTROL_AE_STATE_CONVERGED && 26697b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala entry.data.u8[0] != ANDROID_CONTROL_AE_STATE_LOCKED) { 26797b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala ALOGV("%s: ZSL queue frame AE state is %d, need full capture", 26897b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala __FUNCTION__, entry.data.u8[0]); 26997b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala return NOT_ENOUGH_DATA; 27097b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala } 27197b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala 272da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala buffer_handle_t *handle = 273bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala &(mZslQueue[index].buffer.mGraphicBuffer->handle); 274bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala 275da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala uint8_t requestType = ANDROID_REQUEST_TYPE_REPROCESS; 276da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = request.update(ANDROID_REQUEST_TYPE, 277da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &requestType, 1); 278da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala uint8_t inputStreams[1] = { mZslReprocessStreamId }; 279da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res == OK) request.update(ANDROID_REQUEST_INPUT_STREAMS, 280da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala inputStreams, 1); 281da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala uint8_t outputStreams[1] = { client->getCaptureStreamId() }; 282da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res == OK) request.update(ANDROID_REQUEST_OUTPUT_STREAMS, 283da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala outputStreams, 1); 284da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = request.update(ANDROID_REQUEST_ID, 285da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &requestId, 1); 286da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 287da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK ) { 288da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGE("%s: Unable to update frame to a reprocess request", __FUNCTION__); 289da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return INVALID_OPERATION; 290da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 291da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 292da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = client->getCameraDevice()->pushReprocessBuffer(mZslReprocessStreamId, 293da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala handle, this); 294da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) { 295da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGE("%s: Unable to push buffer for reprocessing: %s (%d)", 296da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala __FUNCTION__, strerror(-res), res); 297da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return res; 298da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 299da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 300da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = client->getCameraDevice()->capture(request); 301da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK ) { 302da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGE("%s: Unable to send ZSL reprocess request to capture: %s (%d)", 303da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala __FUNCTION__, strerror(-res), res); 304da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return res; 305da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 306da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 307da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mState = LOCKED; 308da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } else { 30997b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala ALOGV("%s: No ZSL buffers yet", __FUNCTION__); 31097b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala return NOT_ENOUGH_DATA; 311da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 312da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return OK; 313da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 314da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 315da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalavoid ZslProcessor::dump(int fd, const Vector<String16>& args) const { 31697b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala Mutex::Autolock l(mInputMutex); 31797b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala dumpZslQueue(fd); 318da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 319da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 320da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalabool ZslProcessor::threadLoop() { 321da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala status_t res; 322da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 323da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala { 324da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala Mutex::Autolock l(mInputMutex); 325da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala while (!mZslBufferAvailable) { 326da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = mZslBufferAvailableSignal.waitRelative(mInputMutex, 327da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala kWaitDuration); 328da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res == TIMED_OUT) return true; 329da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 330da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mZslBufferAvailable = false; 331da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 332da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 333da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala do { 334da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala sp<Camera2Client> client = mClient.promote(); 335da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (client == 0) return false; 336da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = processNewZslBuffer(client); 337da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } while (res == OK); 338da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 339da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return true; 340da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 341da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 342da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalastatus_t ZslProcessor::processNewZslBuffer(sp<Camera2Client> &client) { 343da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ATRACE_CALL(); 344da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala status_t res; 345bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala 346bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala ALOGVV("Trying to get next buffer"); 347bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala BufferItemConsumer::BufferItem item; 348bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala res = mZslConsumer->acquireBuffer(&item); 349bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala if (res != OK) { 350bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala if (res != BufferItemConsumer::NO_BUFFER_AVAILABLE) { 351bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala ALOGE("%s: Camera %d: Error receiving ZSL image buffer: " 352bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala "%s (%d)", __FUNCTION__, 353bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala client->getCameraId(), strerror(-res), res); 354bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala } else { 355bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala ALOGVV(" No buffer"); 356bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala } 357bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala return res; 358bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala } 359bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala 360da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala Mutex::Autolock l(mInputMutex); 361da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 362da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (mState == LOCKED) { 363bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala ALOGVV("In capture, discarding new ZSL buffers"); 364da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mZslConsumer->releaseBuffer(item); 365da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return OK; 366da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 367da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 368da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGVV("Got ZSL buffer: head: %d, tail: %d", mZslQueueHead, mZslQueueTail); 369da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 370da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if ( (mZslQueueHead + 1) % kZslBufferDepth == mZslQueueTail) { 371bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala ALOGVV("Releasing oldest buffer"); 372da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mZslConsumer->releaseBuffer(mZslQueue[mZslQueueTail].buffer); 373da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mZslQueue.replaceAt(mZslQueueTail); 374da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mZslQueueTail = (mZslQueueTail + 1) % kZslBufferDepth; 375da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 376da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 377da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ZslPair &queueHead = mZslQueue.editItemAt(mZslQueueHead); 378da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 379bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala queueHead.buffer = item; 380da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala queueHead.frame.release(); 381da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 382da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mZslQueueHead = (mZslQueueHead + 1) % kZslBufferDepth; 383da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 384bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala ALOGVV(" Acquired buffer, timestamp %lld", queueHead.buffer.mTimestamp); 385da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 386da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala findMatchesLocked(); 387da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 388da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return OK; 389da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 390da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 391da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalavoid ZslProcessor::findMatchesLocked() { 392bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala ALOGVV("Scanning"); 393da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala for (size_t i = 0; i < mZslQueue.size(); i++) { 394da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ZslPair &queueEntry = mZslQueue.editItemAt(i); 395da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala nsecs_t bufferTimestamp = queueEntry.buffer.mTimestamp; 396bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala IF_ALOGV() { 397bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala camera_metadata_entry_t entry; 398bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala nsecs_t frameTimestamp = 0; 399bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala if (!queueEntry.frame.isEmpty()) { 400bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala entry = queueEntry.frame.find(ANDROID_SENSOR_TIMESTAMP); 401bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala frameTimestamp = entry.data.i64[0]; 402bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala } 403bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala ALOGVV(" %d: b: %lld\tf: %lld", i, 404bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala bufferTimestamp, frameTimestamp ); 405bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala } 406da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (queueEntry.frame.isEmpty() && bufferTimestamp != 0) { 407da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala // Have buffer, no matching frame. Look for one 408da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala for (size_t j = 0; j < mFrameList.size(); j++) { 409da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala bool match = false; 410da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala CameraMetadata &frame = mFrameList.editItemAt(j); 411da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (!frame.isEmpty()) { 412da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala camera_metadata_entry_t entry; 413da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala entry = frame.find(ANDROID_SENSOR_TIMESTAMP); 414da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (entry.count == 0) { 415da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGE("%s: Can't find timestamp in frame!", 416da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala __FUNCTION__); 417da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala continue; 418da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 419da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala nsecs_t frameTimestamp = entry.data.i64[0]; 420da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (bufferTimestamp == frameTimestamp) { 421da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGVV("%s: Found match %lld", __FUNCTION__, 422da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala frameTimestamp); 423da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala match = true; 424da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } else { 425da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala int64_t delta = abs(bufferTimestamp - frameTimestamp); 426da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if ( delta < 1000000) { 427da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGVV("%s: Found close match %lld (delta %lld)", 428da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala __FUNCTION__, bufferTimestamp, delta); 429da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala match = true; 430da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 431da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 432da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 433da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (match) { 434da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala queueEntry.frame.acquire(frame); 435da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala break; 436da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 437da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 438da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 439da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 440da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 441da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 44297b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvalavoid ZslProcessor::dumpZslQueue(int fd) const { 44397b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala String8 header("ZSL queue contents:"); 44497b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala String8 indent(" "); 44597b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala ALOGV("%s", header.string()); 44697b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala if (fd != -1) { 44797b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala header = indent + header + "\n"; 44897b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala write(fd, header.string(), header.size()); 44997b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala } 45097b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala for (size_t i = 0; i < mZslQueue.size(); i++) { 45197b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala const ZslPair &queueEntry = mZslQueue[i]; 45297b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala nsecs_t bufferTimestamp = queueEntry.buffer.mTimestamp; 45397b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala camera_metadata_ro_entry_t entry; 45497b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala nsecs_t frameTimestamp = 0; 45597b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala int frameAeState = -1; 45697b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala if (!queueEntry.frame.isEmpty()) { 45797b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala entry = queueEntry.frame.find(ANDROID_SENSOR_TIMESTAMP); 45897b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala if (entry.count > 0) frameTimestamp = entry.data.i64[0]; 45997b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala entry = queueEntry.frame.find(ANDROID_CONTROL_AE_STATE); 46097b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala if (entry.count > 0) frameAeState = entry.data.u8[0]; 46197b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala } 46297b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala String8 result = 46397b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala String8::format(" %d: b: %lld\tf: %lld, AE state: %d", i, 46497b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala bufferTimestamp, frameTimestamp, frameAeState); 46597b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala ALOGV("%s", result.string()); 46697b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala if (fd != -1) { 46797b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala result = indent + result + "\n"; 46897b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala write(fd, result.string(), result.size()); 46997b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala } 47097b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala 47197b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala } 47297b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala} 47397b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala 474da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}; // namespace camera2 475da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}; // namespace android 476