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