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