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 47e538206d15282afbc5b168d60b1026a5dfcd13c0James Paintervoid BurstCapture::onFrameAvailable() { 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