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 &params) {
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                &currentWidth, &currentHeight, 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