ZslProcessor.cpp revision e382ee28709b83264a46b09e8f766c5ef42efa35
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 174bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala#define LOG_TAG "Camera2-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 100768cf093dade9085e0ad6305d9f7c16ae9ad9e26Eino-Ville Talvala // Erase entire ZSL queue since we've now completed the capture and preview 101768cf093dade9085e0ad6305d9f7c16ae9ad9e26Eino-Ville Talvala // is stopped. 102768cf093dade9085e0ad6305d9f7c16ae9ad9e26Eino-Ville Talvala clearZslQueueLocked(); 103768cf093dade9085e0ad6305d9f7c16ae9ad9e26Eino-Ville Talvala 104da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mState = RUNNING; 105da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 106da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 107da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalastatus_t ZslProcessor::updateStream(const Parameters ¶ms) { 108da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ATRACE_CALL(); 109da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGV("%s: Configuring ZSL streams", __FUNCTION__); 110da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala status_t res; 111da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 112da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala Mutex::Autolock l(mInputMutex); 113da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 114da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala sp<Camera2Client> client = mClient.promote(); 115da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (client == 0) return OK; 116da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala sp<Camera2Device> device = client->getCameraDevice(); 117da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 118da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (mZslConsumer == 0) { 119da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala // Create CPU buffer queue endpoint 120da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mZslConsumer = new BufferItemConsumer( 121da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala GRALLOC_USAGE_HW_CAMERA_ZSL, 122da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala kZslBufferDepth, 123da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala true); 124da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mZslConsumer->setFrameAvailableListener(this); 125da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mZslConsumer->setName(String8("Camera2Client::ZslConsumer")); 126da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mZslWindow = new SurfaceTextureClient( 127da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mZslConsumer->getProducerInterface()); 128da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 129da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 130da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (mZslStreamId != NO_STREAM) { 131da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala // Check if stream parameters have to change 132da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala uint32_t currentWidth, currentHeight; 133da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = device->getStreamInfo(mZslStreamId, 134da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ¤tWidth, ¤tHeight, 0); 135da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) { 136da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGE("%s: Camera %d: Error querying capture output stream info: " 137da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala "%s (%d)", __FUNCTION__, 138da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala client->getCameraId(), strerror(-res), res); 139da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return res; 140da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 1416e4db898bac9499a8abe7e6b6fbf729b78f6bd68Eino-Ville Talvala if (currentWidth != (uint32_t)params.fastInfo.arrayWidth || 1426e4db898bac9499a8abe7e6b6fbf729b78f6bd68Eino-Ville Talvala currentHeight != (uint32_t)params.fastInfo.arrayHeight) { 14347512a7da600ababdfd052b574488b9e499c22f6Eino-Ville Talvala res = device->deleteReprocessStream(mZslReprocessStreamId); 144da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) { 145da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to delete old reprocess stream " 146da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala "for ZSL: %s (%d)", __FUNCTION__, 147da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala client->getCameraId(), strerror(-res), res); 148da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return res; 149da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 150da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = device->deleteStream(mZslStreamId); 151da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) { 152da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to delete old output stream " 153da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala "for ZSL: %s (%d)", __FUNCTION__, 154da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala client->getCameraId(), strerror(-res), res); 155da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return res; 156da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 157da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mZslStreamId = NO_STREAM; 158da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 159da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 160da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 161da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (mZslStreamId == NO_STREAM) { 162da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala // Create stream for HAL production 1636e4db898bac9499a8abe7e6b6fbf729b78f6bd68Eino-Ville Talvala // TODO: Sort out better way to select resolution for ZSL 164e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala int streamType = params.quirks.useZslFormat ? 165e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala (int)CAMERA2_HAL_PIXEL_FORMAT_ZSL : 166e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala (int)HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED; 167da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = device->createStream(mZslWindow, 1686e4db898bac9499a8abe7e6b6fbf729b78f6bd68Eino-Ville Talvala params.fastInfo.arrayWidth, params.fastInfo.arrayHeight, 169e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala streamType, 0, 170da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &mZslStreamId); 171da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) { 172da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGE("%s: Camera %d: Can't create output stream for ZSL: " 173da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala "%s (%d)", __FUNCTION__, client->getCameraId(), 174da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala strerror(-res), res); 175da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return res; 176da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 177da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = device->createReprocessStreamFromStream(mZslStreamId, 178da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &mZslReprocessStreamId); 179da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) { 180da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGE("%s: Camera %d: Can't create reprocess stream for ZSL: " 181da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala "%s (%d)", __FUNCTION__, client->getCameraId(), 182da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala strerror(-res), res); 183da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return res; 184da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 185da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 186da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala client->registerFrameListener(Camera2Client::kPreviewRequestId, this); 187da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 188da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return OK; 189da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 190da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 191da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalastatus_t ZslProcessor::deleteStream() { 192da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ATRACE_CALL(); 193da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala status_t res; 194da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 195da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala Mutex::Autolock l(mInputMutex); 196da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 197da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (mZslStreamId != NO_STREAM) { 198da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala sp<Camera2Client> client = mClient.promote(); 199da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (client == 0) return OK; 200da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala sp<Camera2Device> device = client->getCameraDevice(); 201da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 20247512a7da600ababdfd052b574488b9e499c22f6Eino-Ville Talvala res = device->deleteReprocessStream(mZslReprocessStreamId); 20347512a7da600ababdfd052b574488b9e499c22f6Eino-Ville Talvala if (res != OK) { 20447512a7da600ababdfd052b574488b9e499c22f6Eino-Ville Talvala ALOGE("%s: Camera %d: Cannot delete ZSL reprocessing stream %d: " 20547512a7da600ababdfd052b574488b9e499c22f6Eino-Ville Talvala "%s (%d)", __FUNCTION__, client->getCameraId(), 20647512a7da600ababdfd052b574488b9e499c22f6Eino-Ville Talvala mZslReprocessStreamId, strerror(-res), res); 20747512a7da600ababdfd052b574488b9e499c22f6Eino-Ville Talvala return res; 20847512a7da600ababdfd052b574488b9e499c22f6Eino-Ville Talvala } 20947512a7da600ababdfd052b574488b9e499c22f6Eino-Ville Talvala 210da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mZslReprocessStreamId = NO_STREAM; 21147512a7da600ababdfd052b574488b9e499c22f6Eino-Ville Talvala res = device->deleteStream(mZslStreamId); 21247512a7da600ababdfd052b574488b9e499c22f6Eino-Ville Talvala if (res != OK) { 21347512a7da600ababdfd052b574488b9e499c22f6Eino-Ville Talvala ALOGE("%s: Camera %d: Cannot delete ZSL output stream %d: " 21447512a7da600ababdfd052b574488b9e499c22f6Eino-Ville Talvala "%s (%d)", __FUNCTION__, client->getCameraId(), 21547512a7da600ababdfd052b574488b9e499c22f6Eino-Ville Talvala mZslStreamId, strerror(-res), res); 21647512a7da600ababdfd052b574488b9e499c22f6Eino-Ville Talvala return res; 21747512a7da600ababdfd052b574488b9e499c22f6Eino-Ville Talvala } 218cf70d3469332445dc3ffd09729da3538612b1bb2Eino-Ville Talvala 219cf70d3469332445dc3ffd09729da3538612b1bb2Eino-Ville Talvala mZslWindow.clear(); 220cf70d3469332445dc3ffd09729da3538612b1bb2Eino-Ville Talvala mZslConsumer.clear(); 221cf70d3469332445dc3ffd09729da3538612b1bb2Eino-Ville Talvala 222da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mZslStreamId = NO_STREAM; 223da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 224da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return OK; 225da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 226da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 227da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaint ZslProcessor::getStreamId() const { 228da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala Mutex::Autolock l(mInputMutex); 229da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return mZslStreamId; 230da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 231da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 232da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaint ZslProcessor::getReprocessStreamId() const { 233da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala Mutex::Autolock l(mInputMutex); 234da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return mZslReprocessStreamId; 235da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 236da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 237da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalastatus_t ZslProcessor::pushToReprocess(int32_t requestId) { 238da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGV("%s: Send in reprocess request with id %d", 239da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala __FUNCTION__, requestId); 240da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala Mutex::Autolock l(mInputMutex); 241da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala status_t res; 242da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala sp<Camera2Client> client = mClient.promote(); 243da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 24497b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala if (client == 0) return INVALID_OPERATION; 24597b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala 24697b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala IF_ALOGV() { 24797b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala dumpZslQueue(-1); 24897b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala } 24997b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala 250da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (mZslQueueTail != mZslQueueHead) { 251bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala CameraMetadata request; 252bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala size_t index = mZslQueueTail; 253bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala while (request.isEmpty() && index != mZslQueueHead) { 254bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala request = mZslQueue[index].frame; 255bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala index = (index + 1) % kZslBufferDepth; 256bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala } 257bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala if (request.isEmpty()) { 25897b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala ALOGV("%s: ZSL queue has no valid frames to send yet.", 25997b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala __FUNCTION__); 26097b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala return NOT_ENOUGH_DATA; 26197b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala } 26297b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala // Verify that the frame is reasonable for reprocessing 26397b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala 26497b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala camera_metadata_entry_t entry; 26597b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala entry = request.find(ANDROID_CONTROL_AE_STATE); 26697b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala if (entry.count == 0) { 26797b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala ALOGE("%s: ZSL queue frame has no AE state field!", 26897b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala __FUNCTION__); 269bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala return BAD_VALUE; 270bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala } 27197b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala if (entry.data.u8[0] != ANDROID_CONTROL_AE_STATE_CONVERGED && 27297b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala entry.data.u8[0] != ANDROID_CONTROL_AE_STATE_LOCKED) { 27397b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala ALOGV("%s: ZSL queue frame AE state is %d, need full capture", 27497b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala __FUNCTION__, entry.data.u8[0]); 27597b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala return NOT_ENOUGH_DATA; 27697b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala } 27797b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala 278da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala buffer_handle_t *handle = 279bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala &(mZslQueue[index].buffer.mGraphicBuffer->handle); 280bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala 281da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala uint8_t requestType = ANDROID_REQUEST_TYPE_REPROCESS; 282da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = request.update(ANDROID_REQUEST_TYPE, 283da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &requestType, 1); 284da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala uint8_t inputStreams[1] = { mZslReprocessStreamId }; 285da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res == OK) request.update(ANDROID_REQUEST_INPUT_STREAMS, 286da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala inputStreams, 1); 287da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala uint8_t outputStreams[1] = { client->getCaptureStreamId() }; 288da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res == OK) request.update(ANDROID_REQUEST_OUTPUT_STREAMS, 289da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala outputStreams, 1); 290da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = request.update(ANDROID_REQUEST_ID, 291da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &requestId, 1); 292da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 293da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK ) { 294da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGE("%s: Unable to update frame to a reprocess request", __FUNCTION__); 295da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return INVALID_OPERATION; 296da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 297da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 298da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = client->getCameraDevice()->pushReprocessBuffer(mZslReprocessStreamId, 299da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala handle, this); 300da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) { 301da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGE("%s: Unable to push buffer for reprocessing: %s (%d)", 302da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala __FUNCTION__, strerror(-res), res); 303da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return res; 304da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 305da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 306da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = client->getCameraDevice()->capture(request); 307da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK ) { 308da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGE("%s: Unable to send ZSL reprocess request to capture: %s (%d)", 309da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala __FUNCTION__, strerror(-res), res); 310da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return res; 311da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 312da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 313da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mState = LOCKED; 314da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } else { 31597b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala ALOGV("%s: No ZSL buffers yet", __FUNCTION__); 31697b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala return NOT_ENOUGH_DATA; 317da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 318da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return OK; 319da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 320da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 321768cf093dade9085e0ad6305d9f7c16ae9ad9e26Eino-Ville Talvalastatus_t ZslProcessor::clearZslQueue() { 322768cf093dade9085e0ad6305d9f7c16ae9ad9e26Eino-Ville Talvala Mutex::Autolock l(mInputMutex); 323768cf093dade9085e0ad6305d9f7c16ae9ad9e26Eino-Ville Talvala // If in middle of capture, can't clear out queue 324768cf093dade9085e0ad6305d9f7c16ae9ad9e26Eino-Ville Talvala if (mState == LOCKED) return OK; 325768cf093dade9085e0ad6305d9f7c16ae9ad9e26Eino-Ville Talvala 326768cf093dade9085e0ad6305d9f7c16ae9ad9e26Eino-Ville Talvala return clearZslQueueLocked(); 327768cf093dade9085e0ad6305d9f7c16ae9ad9e26Eino-Ville Talvala} 328768cf093dade9085e0ad6305d9f7c16ae9ad9e26Eino-Ville Talvala 329768cf093dade9085e0ad6305d9f7c16ae9ad9e26Eino-Ville Talvalastatus_t ZslProcessor::clearZslQueueLocked() { 330768cf093dade9085e0ad6305d9f7c16ae9ad9e26Eino-Ville Talvala for (size_t i = 0; i < mZslQueue.size(); i++) { 331768cf093dade9085e0ad6305d9f7c16ae9ad9e26Eino-Ville Talvala if (mZslQueue[i].buffer.mTimestamp != 0) { 332768cf093dade9085e0ad6305d9f7c16ae9ad9e26Eino-Ville Talvala mZslConsumer->releaseBuffer(mZslQueue[i].buffer); 333768cf093dade9085e0ad6305d9f7c16ae9ad9e26Eino-Ville Talvala } 334768cf093dade9085e0ad6305d9f7c16ae9ad9e26Eino-Ville Talvala mZslQueue.replaceAt(i); 335768cf093dade9085e0ad6305d9f7c16ae9ad9e26Eino-Ville Talvala } 336768cf093dade9085e0ad6305d9f7c16ae9ad9e26Eino-Ville Talvala mZslQueueHead = 0; 337768cf093dade9085e0ad6305d9f7c16ae9ad9e26Eino-Ville Talvala mZslQueueTail = 0; 338768cf093dade9085e0ad6305d9f7c16ae9ad9e26Eino-Ville Talvala return OK; 339768cf093dade9085e0ad6305d9f7c16ae9ad9e26Eino-Ville Talvala} 340768cf093dade9085e0ad6305d9f7c16ae9ad9e26Eino-Ville Talvala 341da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalavoid ZslProcessor::dump(int fd, const Vector<String16>& args) const { 34297b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala Mutex::Autolock l(mInputMutex); 34397b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala dumpZslQueue(fd); 344da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 345da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 346da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalabool ZslProcessor::threadLoop() { 347da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala status_t res; 348da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 349da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala { 350da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala Mutex::Autolock l(mInputMutex); 351da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala while (!mZslBufferAvailable) { 352da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = mZslBufferAvailableSignal.waitRelative(mInputMutex, 353da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala kWaitDuration); 354da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res == TIMED_OUT) return true; 355da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 356da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mZslBufferAvailable = false; 357da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 358da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 359da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala do { 360da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala sp<Camera2Client> client = mClient.promote(); 361da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (client == 0) return false; 362da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = processNewZslBuffer(client); 363da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } while (res == OK); 364da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 365da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return true; 366da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 367da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 368da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalastatus_t ZslProcessor::processNewZslBuffer(sp<Camera2Client> &client) { 369da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ATRACE_CALL(); 370da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala status_t res; 371bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala 372bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala ALOGVV("Trying to get next buffer"); 373bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala BufferItemConsumer::BufferItem item; 374bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala res = mZslConsumer->acquireBuffer(&item); 375bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala if (res != OK) { 376bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala if (res != BufferItemConsumer::NO_BUFFER_AVAILABLE) { 377bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala ALOGE("%s: Camera %d: Error receiving ZSL image buffer: " 378bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala "%s (%d)", __FUNCTION__, 379bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala client->getCameraId(), strerror(-res), res); 380bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala } else { 381bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala ALOGVV(" No buffer"); 382bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala } 383bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala return res; 384bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala } 385bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala 386da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala Mutex::Autolock l(mInputMutex); 387da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 388da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (mState == LOCKED) { 389bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala ALOGVV("In capture, discarding new ZSL buffers"); 390da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mZslConsumer->releaseBuffer(item); 391da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return OK; 392da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 393da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 394da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGVV("Got ZSL buffer: head: %d, tail: %d", mZslQueueHead, mZslQueueTail); 395da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 396da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if ( (mZslQueueHead + 1) % kZslBufferDepth == mZslQueueTail) { 397bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala ALOGVV("Releasing oldest buffer"); 398da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mZslConsumer->releaseBuffer(mZslQueue[mZslQueueTail].buffer); 399da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mZslQueue.replaceAt(mZslQueueTail); 400da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mZslQueueTail = (mZslQueueTail + 1) % kZslBufferDepth; 401da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 402da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 403da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ZslPair &queueHead = mZslQueue.editItemAt(mZslQueueHead); 404da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 405bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala queueHead.buffer = item; 406da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala queueHead.frame.release(); 407da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 408da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mZslQueueHead = (mZslQueueHead + 1) % kZslBufferDepth; 409da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 410bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala ALOGVV(" Acquired buffer, timestamp %lld", queueHead.buffer.mTimestamp); 411da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 412da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala findMatchesLocked(); 413da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 414da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return OK; 415da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 416da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 417da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalavoid ZslProcessor::findMatchesLocked() { 418bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala ALOGVV("Scanning"); 419da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala for (size_t i = 0; i < mZslQueue.size(); i++) { 420da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ZslPair &queueEntry = mZslQueue.editItemAt(i); 421da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala nsecs_t bufferTimestamp = queueEntry.buffer.mTimestamp; 422bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala IF_ALOGV() { 423bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala camera_metadata_entry_t entry; 424bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala nsecs_t frameTimestamp = 0; 425bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala if (!queueEntry.frame.isEmpty()) { 426bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala entry = queueEntry.frame.find(ANDROID_SENSOR_TIMESTAMP); 427bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala frameTimestamp = entry.data.i64[0]; 428bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala } 429bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala ALOGVV(" %d: b: %lld\tf: %lld", i, 430bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala bufferTimestamp, frameTimestamp ); 431bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala } 432da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (queueEntry.frame.isEmpty() && bufferTimestamp != 0) { 433da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala // Have buffer, no matching frame. Look for one 434da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala for (size_t j = 0; j < mFrameList.size(); j++) { 435da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala bool match = false; 436da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala CameraMetadata &frame = mFrameList.editItemAt(j); 437da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (!frame.isEmpty()) { 438da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala camera_metadata_entry_t entry; 439da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala entry = frame.find(ANDROID_SENSOR_TIMESTAMP); 440da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (entry.count == 0) { 441da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGE("%s: Can't find timestamp in frame!", 442da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala __FUNCTION__); 443da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala continue; 444da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 445da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala nsecs_t frameTimestamp = entry.data.i64[0]; 446da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (bufferTimestamp == frameTimestamp) { 447da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGVV("%s: Found match %lld", __FUNCTION__, 448da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala frameTimestamp); 449da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala match = true; 450da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } else { 451da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala int64_t delta = abs(bufferTimestamp - frameTimestamp); 452da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if ( delta < 1000000) { 453da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGVV("%s: Found close match %lld (delta %lld)", 454da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala __FUNCTION__, bufferTimestamp, delta); 455da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala match = true; 456da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 457da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 458da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 459da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (match) { 460da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala queueEntry.frame.acquire(frame); 461da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala break; 462da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 463da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 464da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 465da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 466da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 467da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 46897b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvalavoid ZslProcessor::dumpZslQueue(int fd) const { 46997b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala String8 header("ZSL queue contents:"); 47097b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala String8 indent(" "); 47197b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala ALOGV("%s", header.string()); 47297b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala if (fd != -1) { 47397b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala header = indent + header + "\n"; 47497b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala write(fd, header.string(), header.size()); 47597b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala } 47697b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala for (size_t i = 0; i < mZslQueue.size(); i++) { 47797b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala const ZslPair &queueEntry = mZslQueue[i]; 47897b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala nsecs_t bufferTimestamp = queueEntry.buffer.mTimestamp; 47997b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala camera_metadata_ro_entry_t entry; 48097b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala nsecs_t frameTimestamp = 0; 48197b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala int frameAeState = -1; 48297b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala if (!queueEntry.frame.isEmpty()) { 48397b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala entry = queueEntry.frame.find(ANDROID_SENSOR_TIMESTAMP); 48497b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala if (entry.count > 0) frameTimestamp = entry.data.i64[0]; 48597b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala entry = queueEntry.frame.find(ANDROID_CONTROL_AE_STATE); 48697b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala if (entry.count > 0) frameAeState = entry.data.u8[0]; 48797b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala } 48897b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala String8 result = 48997b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala String8::format(" %d: b: %lld\tf: %lld, AE state: %d", i, 49097b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala bufferTimestamp, frameTimestamp, frameAeState); 49197b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala ALOGV("%s", result.string()); 49297b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala if (fd != -1) { 49397b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala result = indent + result + "\n"; 49497b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala write(fd, result.string(), result.size()); 49597b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala } 49697b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala 49797b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala } 49897b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala} 49997b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala 500da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}; // namespace camera2 501da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}; // namespace android 502