1e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter/*
2e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter * Copyright (C) 2012 The Android Open Source Project
3e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter *
4e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter * Licensed under the Apache License, Version 2.0 (the "License");
5e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter * you may not use this file except in compliance with the License.
6e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter * You may obtain a copy of the License at
7e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter *
8e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter *      http://www.apache.org/licenses/LICENSE-2.0
9e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter *
10e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter * Unless required by applicable law or agreed to in writing, software
11e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter * distributed under the License is distributed on an "AS IS" BASIS,
12e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter * See the License for the specific language governing permissions and
14e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter * limitations under the License.
15e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter */
16e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter
174bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala//#define LOG_NDEBUG 0
184bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala#define LOG_TAG "Camera2-BurstCapture"
19e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter
20e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter#include <utils/Log.h>
21e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter#include <utils/Trace.h>
22e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter
23e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter#include "BurstCapture.h"
24e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter
257b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "api1/Camera2Client.h"
267b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "api1/client2/JpegCompressor.h"
27e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter
28e538206d15282afbc5b168d60b1026a5dfcd13c0James Painternamespace android {
29e538206d15282afbc5b168d60b1026a5dfcd13c0James Painternamespace camera2 {
30e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter
31e538206d15282afbc5b168d60b1026a5dfcd13c0James PainterBurstCapture::BurstCapture(wp<Camera2Client> client, wp<CaptureSequencer> sequencer):
32e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    mCaptureStreamId(NO_STREAM),
33e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    mClient(client),
34e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    mSequencer(sequencer)
35e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter{
36e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter}
37e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter
38e538206d15282afbc5b168d60b1026a5dfcd13c0James PainterBurstCapture::~BurstCapture() {
39e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter}
40e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter
41ddf3c5025e2f6f35a4c188c19f30142c64a092c4Igor Murashkinstatus_t BurstCapture::start(Vector<CameraMetadata> &/*metadatas*/,
42ddf3c5025e2f6f35a4c188c19f30142c64a092c4Igor Murashkin                             int32_t /*firstCaptureId*/) {
43e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    ALOGE("Not completely implemented");
44e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    return INVALID_OPERATION;
45e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter}
46e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter
4704f101c35eaa90b1f95939afac30674ec1611e6fDan Stozavoid BurstCapture::onFrameAvailable(const BufferItem &/*item*/) {
48e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    ALOGV("%s", __FUNCTION__);
49e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    Mutex::Autolock l(mInputMutex);
50e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    if(!mInputChanged) {
51e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter        mInputChanged = true;
52e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter        mInputSignal.signal();
53e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    }
54e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter}
55e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter
56e538206d15282afbc5b168d60b1026a5dfcd13c0James Painterbool BurstCapture::threadLoop() {
57e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    status_t res;
58e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    {
59e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter        Mutex::Autolock l(mInputMutex);
60e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter        while(!mInputChanged) {
61e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter            res = mInputSignal.waitRelative(mInputMutex, kWaitDuration);
62e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter            if(res == TIMED_OUT) return true;
63e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter        }
64e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter        mInputChanged = false;
65e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    }
66e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter
67e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    do {
68e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter        sp<Camera2Client> client = mClient.promote();
69e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter        if(client == 0) return false;
70e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter        ALOGV("%s: Calling processFrameAvailable()", __FUNCTION__);
71e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter        res = processFrameAvailable(client);
72e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    } while(res == OK);
73e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter
74e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    return true;
75e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter}
76e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter
77e538206d15282afbc5b168d60b1026a5dfcd13c0James PainterCpuConsumer::LockedBuffer* BurstCapture::jpegEncode(
78e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    CpuConsumer::LockedBuffer *imgBuffer,
79ddf3c5025e2f6f35a4c188c19f30142c64a092c4Igor Murashkin    int /*quality*/)
80e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter{
81e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    ALOGV("%s", __FUNCTION__);
82e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter
83e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    CpuConsumer::LockedBuffer *imgEncoded = new CpuConsumer::LockedBuffer;
84e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    uint8_t *data = new uint8_t[ANDROID_JPEG_MAX_SIZE];
85e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    imgEncoded->data = data;
86e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    imgEncoded->width = imgBuffer->width;
87e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    imgEncoded->height = imgBuffer->height;
88e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    imgEncoded->stride = imgBuffer->stride;
89e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter
90e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    Vector<CpuConsumer::LockedBuffer*> buffers;
91e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    buffers.push_back(imgBuffer);
92e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    buffers.push_back(imgEncoded);
93e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter
94e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    sp<JpegCompressor> jpeg = new JpegCompressor();
95ddf3c5025e2f6f35a4c188c19f30142c64a092c4Igor Murashkin    jpeg->start(buffers, 1);
96e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter
97e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    bool success = jpeg->waitForDone(10 * 1e9);
98e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    if(success) {
99e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter        return buffers[1];
100e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    }
101e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    else {
102e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter        ALOGE("%s: JPEG encode timed out", __FUNCTION__);
103e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter        return NULL;  // TODO: maybe change function return value to status_t
104e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    }
105e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter}
106e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter
107ddf3c5025e2f6f35a4c188c19f30142c64a092c4Igor Murashkinstatus_t BurstCapture::processFrameAvailable(sp<Camera2Client> &/*client*/) {
108e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    ALOGE("Not implemented");
109e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    return INVALID_OPERATION;
110e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter}
111e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter
112e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter} // namespace camera2
113e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter} // namespace android
114