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