ZslProcessor.cpp revision da6665cbd06ca58d3357c3002b7366d13e23f152
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__); 61da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 62da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 63da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalavoid ZslProcessor::onFrameAvailable() { 64da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala Mutex::Autolock l(mInputMutex); 65da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (!mZslBufferAvailable) { 66da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mZslBufferAvailable = true; 67da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mZslBufferAvailableSignal.signal(); 68da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 69da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 70da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 71da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalavoid ZslProcessor::onFrameAvailable(int32_t frameId, CameraMetadata &frame) { 72da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala Mutex::Autolock l(mInputMutex); 73da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala camera_metadata_entry_t entry; 74da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala entry = frame.find(ANDROID_SENSOR_TIMESTAMP); 75da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala nsecs_t timestamp = entry.data.i64[0]; 76da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGVV("Got preview frame for timestamp %lld", timestamp); 77da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 78da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (mState != RUNNING) return; 79da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 80da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mFrameList.editItemAt(mFrameListHead).acquire(frame); 81da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mFrameListHead = (mFrameListHead + 1) % kFrameListDepth; 82da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 83da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala findMatchesLocked(); 84da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 85da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 86da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalavoid ZslProcessor::onBufferReleased(buffer_handle_t *handle) { 87da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala Mutex::Autolock l(mInputMutex); 88da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 89da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala buffer_handle_t *expectedHandle = 90da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &(mZslQueue[mZslQueueTail].buffer.mGraphicBuffer->handle); 91da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 92da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (handle != expectedHandle) { 93da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGE("%s: Expected buffer %p, got buffer %p", 94da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala __FUNCTION__, expectedHandle, handle); 95da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 96da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 97da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mState = RUNNING; 98da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 99da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 100da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalastatus_t ZslProcessor::updateStream(const Parameters ¶ms) { 101da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ATRACE_CALL(); 102da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGV("%s: Configuring ZSL streams", __FUNCTION__); 103da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala status_t res; 104da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 105da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala Mutex::Autolock l(mInputMutex); 106da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 107da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala sp<Camera2Client> client = mClient.promote(); 108da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (client == 0) return OK; 109da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala sp<Camera2Device> device = client->getCameraDevice(); 110da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 111da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (mZslConsumer == 0) { 112da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala // Create CPU buffer queue endpoint 113da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mZslConsumer = new BufferItemConsumer( 114da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala GRALLOC_USAGE_HW_CAMERA_ZSL, 115da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala kZslBufferDepth, 116da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala true); 117da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mZslConsumer->setFrameAvailableListener(this); 118da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mZslConsumer->setName(String8("Camera2Client::ZslConsumer")); 119da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mZslWindow = new SurfaceTextureClient( 120da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mZslConsumer->getProducerInterface()); 121da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 122da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 123da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (mZslStreamId != NO_STREAM) { 124da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala // Check if stream parameters have to change 125da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala uint32_t currentWidth, currentHeight; 126da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = device->getStreamInfo(mZslStreamId, 127da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ¤tWidth, ¤tHeight, 0); 128da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) { 129da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGE("%s: Camera %d: Error querying capture output stream info: " 130da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala "%s (%d)", __FUNCTION__, 131da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala client->getCameraId(), strerror(-res), res); 132da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return res; 133da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 134da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (currentWidth != (uint32_t)params.pictureWidth || 135da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala currentHeight != (uint32_t)params.pictureHeight) { 136da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = device->deleteStream(mZslReprocessStreamId); 137da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) { 138da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to delete old reprocess stream " 139da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala "for ZSL: %s (%d)", __FUNCTION__, 140da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala client->getCameraId(), strerror(-res), res); 141da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return res; 142da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 143da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = device->deleteStream(mZslStreamId); 144da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) { 145da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to delete old output 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 mZslStreamId = NO_STREAM; 151da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 152da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 153da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 154da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (mZslStreamId == NO_STREAM) { 155da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala // Create stream for HAL production 156da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = device->createStream(mZslWindow, 157da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala params.pictureWidth, params.pictureHeight, 158da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED, 0, 159da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &mZslStreamId); 160da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) { 161da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGE("%s: Camera %d: Can't create output stream for ZSL: " 162da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala "%s (%d)", __FUNCTION__, client->getCameraId(), 163da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala strerror(-res), res); 164da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return res; 165da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 166da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = device->createReprocessStreamFromStream(mZslStreamId, 167da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &mZslReprocessStreamId); 168da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) { 169da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGE("%s: Camera %d: Can't create reprocess stream for ZSL: " 170da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala "%s (%d)", __FUNCTION__, client->getCameraId(), 171da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala strerror(-res), res); 172da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return res; 173da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 174da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 175da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala client->registerFrameListener(Camera2Client::kPreviewRequestId, this); 176da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 177da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return OK; 178da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 179da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 180da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalastatus_t ZslProcessor::deleteStream() { 181da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ATRACE_CALL(); 182da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala status_t res; 183da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 184da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala Mutex::Autolock l(mInputMutex); 185da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 186da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (mZslStreamId != NO_STREAM) { 187da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala sp<Camera2Client> client = mClient.promote(); 188da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (client == 0) return OK; 189da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala sp<Camera2Device> device = client->getCameraDevice(); 190da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 191da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala device->deleteStream(mZslReprocessStreamId); 192da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mZslReprocessStreamId = NO_STREAM; 193da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala device->deleteStream(mZslStreamId); 194da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mZslStreamId = NO_STREAM; 195da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 196da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return OK; 197da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 198da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 199da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaint ZslProcessor::getStreamId() const { 200da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala Mutex::Autolock l(mInputMutex); 201da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return mZslStreamId; 202da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 203da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 204da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaint ZslProcessor::getReprocessStreamId() const { 205da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala Mutex::Autolock l(mInputMutex); 206da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return mZslReprocessStreamId; 207da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 208da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 209da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalastatus_t ZslProcessor::pushToReprocess(int32_t requestId) { 210da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGV("%s: Send in reprocess request with id %d", 211da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala __FUNCTION__, requestId); 212da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala Mutex::Autolock l(mInputMutex); 213da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala status_t res; 214da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala sp<Camera2Client> client = mClient.promote(); 215da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 216da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (client == 0) return false; 217da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 218da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (mZslQueueTail != mZslQueueHead) { 219da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala buffer_handle_t *handle = 220da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &(mZslQueue[mZslQueueTail].buffer.mGraphicBuffer->handle); 221da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala CameraMetadata request = mZslQueue[mZslQueueTail].frame; 222da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala uint8_t requestType = ANDROID_REQUEST_TYPE_REPROCESS; 223da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = request.update(ANDROID_REQUEST_TYPE, 224da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &requestType, 1); 225da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala uint8_t inputStreams[1] = { mZslReprocessStreamId }; 226da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res == OK) request.update(ANDROID_REQUEST_INPUT_STREAMS, 227da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala inputStreams, 1); 228da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala uint8_t outputStreams[1] = { client->getCaptureStreamId() }; 229da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res == OK) request.update(ANDROID_REQUEST_OUTPUT_STREAMS, 230da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala outputStreams, 1); 231da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = request.update(ANDROID_REQUEST_ID, 232da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala &requestId, 1); 233da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 234da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK ) { 235da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGE("%s: Unable to update frame to a reprocess request", __FUNCTION__); 236da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return INVALID_OPERATION; 237da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 238da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 239da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = client->getCameraDevice()->pushReprocessBuffer(mZslReprocessStreamId, 240da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala handle, this); 241da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) { 242da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGE("%s: Unable to push buffer for reprocessing: %s (%d)", 243da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala __FUNCTION__, strerror(-res), res); 244da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return res; 245da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 246da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 247da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = client->getCameraDevice()->capture(request); 248da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK ) { 249da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGE("%s: Unable to send ZSL reprocess request to capture: %s (%d)", 250da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala __FUNCTION__, strerror(-res), res); 251da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return res; 252da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 253da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 254da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mState = LOCKED; 255da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } else { 256da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGE("%s: Nothing to push", __FUNCTION__); 257da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return BAD_VALUE; 258da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 259da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return OK; 260da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 261da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 262da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalavoid ZslProcessor::dump(int fd, const Vector<String16>& args) const { 263da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 264da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 265da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalabool ZslProcessor::threadLoop() { 266da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala status_t res; 267da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 268da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala { 269da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala Mutex::Autolock l(mInputMutex); 270da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala while (!mZslBufferAvailable) { 271da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = mZslBufferAvailableSignal.waitRelative(mInputMutex, 272da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala kWaitDuration); 273da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res == TIMED_OUT) return true; 274da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 275da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mZslBufferAvailable = false; 276da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 277da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 278da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala do { 279da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala sp<Camera2Client> client = mClient.promote(); 280da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (client == 0) return false; 281da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = processNewZslBuffer(client); 282da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } while (res == OK); 283da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 284da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return true; 285da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 286da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 287da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalastatus_t ZslProcessor::processNewZslBuffer(sp<Camera2Client> &client) { 288da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ATRACE_CALL(); 289da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala status_t res; 290da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala Mutex::Autolock l(mInputMutex); 291da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 292da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (mState == LOCKED) { 293da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala BufferItemConsumer::BufferItem item; 294da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = mZslConsumer->acquireBuffer(&item); 295da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) { 296da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != BufferItemConsumer::NO_BUFFER_AVAILABLE) { 297da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGE("%s: Camera %d: Error receiving ZSL image buffer: " 298da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala "%s (%d)", __FUNCTION__, 299da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala client->getCameraId(), strerror(-res), res); 300da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 301da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return res; 302da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 303da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mZslConsumer->releaseBuffer(item); 304da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return OK; 305da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 306da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 307da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGVV("Got ZSL buffer: head: %d, tail: %d", mZslQueueHead, mZslQueueTail); 308da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 309da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if ( (mZslQueueHead + 1) % kZslBufferDepth == mZslQueueTail) { 310da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mZslConsumer->releaseBuffer(mZslQueue[mZslQueueTail].buffer); 311da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mZslQueue.replaceAt(mZslQueueTail); 312da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mZslQueueTail = (mZslQueueTail + 1) % kZslBufferDepth; 313da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 314da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 315da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ZslPair &queueHead = mZslQueue.editItemAt(mZslQueueHead); 316da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 317da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala res = mZslConsumer->acquireBuffer(&(queueHead.buffer)); 318da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != OK) { 319da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (res != BufferItemConsumer::NO_BUFFER_AVAILABLE) { 320da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGE("%s: Camera %d: Error receiving ZSL image buffer: " 321da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala "%s (%d)", __FUNCTION__, 322da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala client->getCameraId(), strerror(-res), res); 323da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 324da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return res; 325da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 326da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala queueHead.frame.release(); 327da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 328da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala mZslQueueHead = (mZslQueueHead + 1) % kZslBufferDepth; 329da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 330da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGVV(" Added buffer, timestamp %lld", queueHead.buffer.mTimestamp); 331da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 332da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala findMatchesLocked(); 333da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 334da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala return OK; 335da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 336da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 337da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalavoid ZslProcessor::findMatchesLocked() { 338da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala for (size_t i = 0; i < mZslQueue.size(); i++) { 339da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ZslPair &queueEntry = mZslQueue.editItemAt(i); 340da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala nsecs_t bufferTimestamp = queueEntry.buffer.mTimestamp; 341da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (queueEntry.frame.isEmpty() && bufferTimestamp != 0) { 342da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala // Have buffer, no matching frame. Look for one 343da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala for (size_t j = 0; j < mFrameList.size(); j++) { 344da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala bool match = false; 345da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala CameraMetadata &frame = mFrameList.editItemAt(j); 346da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (!frame.isEmpty()) { 347da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala camera_metadata_entry_t entry; 348da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala entry = frame.find(ANDROID_SENSOR_TIMESTAMP); 349da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (entry.count == 0) { 350da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGE("%s: Can't find timestamp in frame!", 351da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala __FUNCTION__); 352da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala continue; 353da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 354da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala nsecs_t frameTimestamp = entry.data.i64[0]; 355da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (bufferTimestamp == frameTimestamp) { 356da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGVV("%s: Found match %lld", __FUNCTION__, 357da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala frameTimestamp); 358da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala match = true; 359da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } else { 360da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala int64_t delta = abs(bufferTimestamp - frameTimestamp); 361da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if ( delta < 1000000) { 362da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala ALOGVV("%s: Found close match %lld (delta %lld)", 363da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala __FUNCTION__, bufferTimestamp, delta); 364da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala match = true; 365da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 366da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 367da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 368da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala if (match) { 369da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala queueEntry.frame.acquire(frame); 370da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala break; 371da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 372da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 373da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 374da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala } 375da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala} 376da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala 377da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}; // namespace camera2 378da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}; // namespace android 379