CameraSource.cpp revision 30ab66297501757d745b9ae10da61adcd891f497
120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber/* 220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * Copyright (C) 2009 The Android Open Source Project 320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * 420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * you may not use this file except in compliance with the License. 620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * You may obtain a copy of the License at 720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * 820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * 1020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * Unless required by applicable law or agreed to in writing, software 1120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 1220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * See the License for the specific language governing permissions and 1420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * limitations under the License. 1520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber */ 1620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 1720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <sys/time.h> 1820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 1920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <OMX_Component.h> 2020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 2120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <binder/IServiceManager.h> 2230ab66297501757d745b9ae10da61adcd891f497Andreas Huber#include <cutils/properties.h> // for property_get 2320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <media/stagefright/CameraSource.h> 240c89199745bc1bf05b997fc7c342017807676b6fAndreas Huber#include <media/stagefright/MediaDebug.h> 25be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber#include <media/stagefright/MediaDefs.h> 2620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <media/stagefright/MediaErrors.h> 2720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <media/stagefright/MetaData.h> 28be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber#include <ui/Camera.h> 29be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber#include <ui/CameraParameters.h> 30be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber#include <ui/GraphicBuffer.h> 31be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber#include <ui/ISurface.h> 3220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <ui/Overlay.h> 33be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber#include <utils/String8.h> 3420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 3520111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubernamespace android { 3620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 37be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huberstatic int64_t getNowUs() { 38be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber struct timeval tv; 39be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber gettimeofday(&tv, NULL); 4020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 41be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber return (int64_t)tv.tv_usec + tv.tv_sec * 1000000; 42be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber} 4320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 44be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huberstruct DummySurface : public BnSurface { 45be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber DummySurface() {} 4620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 47be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber virtual sp<GraphicBuffer> requestBuffer(int bufferIdx, int usage) { 48be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber return NULL; 4920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 5020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 51be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber virtual status_t registerBuffers(const BufferHeap &buffers) { 52be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber return OK; 5320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 5420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 55be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber virtual void postBuffer(ssize_t offset) {} 56be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber virtual void unregisterBuffers() {} 5720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 58be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber virtual sp<OverlayRef> createOverlay( 59be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber uint32_t w, uint32_t h, int32_t format) { 60be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber return NULL; 6120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 6220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 63be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huberprotected: 64be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber virtual ~DummySurface() {} 65be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber 66be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber DummySurface(const DummySurface &); 67be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber DummySurface &operator=(const DummySurface &); 68be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber}; 69be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber 70be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huberstruct CameraSourceListener : public CameraListener { 71be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber CameraSourceListener(const sp<CameraSource> &source); 72be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber 73be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber virtual void notify(int32_t msgType, int32_t ext1, int32_t ext2); 74be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber virtual void postData(int32_t msgType, const sp<IMemory> &dataPtr); 75be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber 76be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber virtual void postDataTimestamp( 77be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber nsecs_t timestamp, int32_t msgType, const sp<IMemory>& dataPtr); 78be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber 79be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huberprotected: 80be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber virtual ~CameraSourceListener(); 81be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber 8220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberprivate: 83be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber wp<CameraSource> mSource; 84be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber 85be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber CameraSourceListener(const CameraSourceListener &); 86be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber CameraSourceListener &operator=(const CameraSourceListener &); 8720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}; 8820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 89be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas HuberCameraSourceListener::CameraSourceListener(const sp<CameraSource> &source) 90be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber : mSource(source) { 91be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber} 9220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 93be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas HuberCameraSourceListener::~CameraSourceListener() { 94be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber} 9520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 96be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Hubervoid CameraSourceListener::notify(int32_t msgType, int32_t ext1, int32_t ext2) { 97be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber LOGV("notify(%d, %d, %d)", msgType, ext1, ext2); 98be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber} 9920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 100be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Hubervoid CameraSourceListener::postData(int32_t msgType, const sp<IMemory> &dataPtr) { 101be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber LOGV("postData(%d, ptr:%p, size:%d)", 102be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber msgType, dataPtr->pointer(), dataPtr->size()); 103be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber 104be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber sp<CameraSource> source = mSource.promote(); 105be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber if (source.get() != NULL) { 106be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber source->dataCallback(msgType, dataPtr); 10720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 108be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber} 109be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber 110be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Hubervoid CameraSourceListener::postDataTimestamp( 111be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber nsecs_t timestamp, int32_t msgType, const sp<IMemory>& dataPtr) { 112be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber LOGV("postDataTimestamp(%lld, %d, ptr:%p, size:%d)", 113be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber timestamp, msgType, dataPtr->pointer(), dataPtr->size()); 114be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber} 11520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 11620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber// static 11720111aa043c5f404472bc63b90bc5aad906b1101Andreas HuberCameraSource *CameraSource::Create() { 118be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber sp<Camera> camera = Camera::connect(); 11920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 120be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber if (camera.get() == NULL) { 121be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber return NULL; 122be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber } 12320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 124be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber return new CameraSource(camera); 12520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 12620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 12730ab66297501757d745b9ae10da61adcd891f497Andreas Huber// static 12830ab66297501757d745b9ae10da61adcd891f497Andreas HuberCameraSource *CameraSource::CreateFromICamera(const sp<ICamera> &icamera) { 12930ab66297501757d745b9ae10da61adcd891f497Andreas Huber sp<Camera> camera = Camera::create(icamera); 13030ab66297501757d745b9ae10da61adcd891f497Andreas Huber 13130ab66297501757d745b9ae10da61adcd891f497Andreas Huber if (camera.get() == NULL) { 13230ab66297501757d745b9ae10da61adcd891f497Andreas Huber return NULL; 13330ab66297501757d745b9ae10da61adcd891f497Andreas Huber } 13430ab66297501757d745b9ae10da61adcd891f497Andreas Huber 13530ab66297501757d745b9ae10da61adcd891f497Andreas Huber return new CameraSource(camera); 13630ab66297501757d745b9ae10da61adcd891f497Andreas Huber} 13730ab66297501757d745b9ae10da61adcd891f497Andreas Huber 138be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas HuberCameraSource::CameraSource(const sp<Camera> &camera) 13920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber : mCamera(camera), 140be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber mWidth(0), 141be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber mHeight(0), 142be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber mFirstFrameTimeUs(0), 14320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mNumFrames(0), 14420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mStarted(false) { 14530ab66297501757d745b9ae10da61adcd891f497Andreas Huber char value[PROPERTY_VALUE_MAX]; 14630ab66297501757d745b9ae10da61adcd891f497Andreas Huber if (property_get("ro.hardware", value, NULL) && !strcmp(value, "sholes")) { 14730ab66297501757d745b9ae10da61adcd891f497Andreas Huber // The hardware encoder(s) do not support yuv420, but only YCbYCr, 14830ab66297501757d745b9ae10da61adcd891f497Andreas Huber // fortunately the camera also supports this, so we needn't transcode. 14930ab66297501757d745b9ae10da61adcd891f497Andreas Huber mCamera->setParameters(String8("preview-format=yuv422i-yuyv")); 15030ab66297501757d745b9ae10da61adcd891f497Andreas Huber } 15130ab66297501757d745b9ae10da61adcd891f497Andreas Huber 152be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber String8 s = mCamera->getParameters(); 153be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber printf("params: \"%s\"\n", s.string()); 154be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber 155be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber CameraParameters params(s); 156be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber params.getPreviewSize(&mWidth, &mHeight); 15720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 15820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 15920111aa043c5f404472bc63b90bc5aad906b1101Andreas HuberCameraSource::~CameraSource() { 16020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (mStarted) { 16120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber stop(); 16220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 16320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 16420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 16530ab66297501757d745b9ae10da61adcd891f497Andreas Hubervoid CameraSource::setPreviewSurface(const sp<ISurface> &surface) { 16630ab66297501757d745b9ae10da61adcd891f497Andreas Huber mPreviewSurface = surface; 16730ab66297501757d745b9ae10da61adcd891f497Andreas Huber} 16830ab66297501757d745b9ae10da61adcd891f497Andreas Huber 16920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t CameraSource::start(MetaData *) { 1700c89199745bc1bf05b997fc7c342017807676b6fAndreas Huber CHECK(!mStarted); 17120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 172be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber mCamera->setListener(new CameraSourceListener(this)); 17320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 17430ab66297501757d745b9ae10da61adcd891f497Andreas Huber status_t err = 17530ab66297501757d745b9ae10da61adcd891f497Andreas Huber mCamera->setPreviewDisplay( 17630ab66297501757d745b9ae10da61adcd891f497Andreas Huber mPreviewSurface != NULL ? mPreviewSurface : new DummySurface); 1770c89199745bc1bf05b997fc7c342017807676b6fAndreas Huber CHECK_EQ(err, OK); 178be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber 179be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber mCamera->setPreviewCallbackFlags( 180be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber FRAME_CALLBACK_FLAG_ENABLE_MASK 181be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber | FRAME_CALLBACK_FLAG_COPY_OUT_MASK); 182be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber 183be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber err = mCamera->startPreview(); 1840c89199745bc1bf05b997fc7c342017807676b6fAndreas Huber CHECK_EQ(err, OK); 18520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 18620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mStarted = true; 18720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 18820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return OK; 18920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 19020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 19120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t CameraSource::stop() { 1920c89199745bc1bf05b997fc7c342017807676b6fAndreas Huber CHECK(mStarted); 19320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 19420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mCamera->stopPreview(); 19520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 19620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mStarted = false; 19720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 19820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return OK; 19920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 20020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 20120111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubersp<MetaData> CameraSource::getFormat() { 20220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber sp<MetaData> meta = new MetaData; 20318291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_RAW); 20420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber meta->setInt32(kKeyColorFormat, OMX_COLOR_FormatYUV420SemiPlanar); 205be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber meta->setInt32(kKeyWidth, mWidth); 206be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber meta->setInt32(kKeyHeight, mHeight); 20720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 20820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return meta; 20920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 21020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 21120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t CameraSource::read( 21220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber MediaBuffer **buffer, const ReadOptions *options) { 2130c89199745bc1bf05b997fc7c342017807676b6fAndreas Huber CHECK(mStarted); 21420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 21520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber *buffer = NULL; 21620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 21720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber int64_t seekTimeUs; 21820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (options && options->getSeekTo(&seekTimeUs)) { 21920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return ERROR_UNSUPPORTED; 22020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 22120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 22220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber sp<IMemory> frame; 223be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber int64_t frameTime; 22420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 22520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber { 22620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber Mutex::Autolock autoLock(mLock); 22720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber while (mFrames.empty()) { 22820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mFrameAvailableCondition.wait(mLock); 22920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 23020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 23120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber frame = *mFrames.begin(); 23220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mFrames.erase(mFrames.begin()); 23320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 234be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber frameTime = *mFrameTimes.begin(); 235be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber mFrameTimes.erase(mFrameTimes.begin()); 236be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber } 23720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 238be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber *buffer = new MediaBuffer(frame->size()); 239be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber memcpy((*buffer)->data(), frame->pointer(), frame->size()); 240be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber (*buffer)->set_range(0, frame->size()); 24120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 24220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber (*buffer)->meta_data()->clear(); 243be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber (*buffer)->meta_data()->setInt64(kKeyTime, frameTime); 24420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 24520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return OK; 24620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 24720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 24820111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubervoid CameraSource::dataCallback(int32_t msgType, const sp<IMemory> &data) { 24920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber Mutex::Autolock autoLock(mLock); 25020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 251be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber int64_t nowUs = getNowUs(); 252be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber if (mNumFrames == 0) { 253be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber mFirstFrameTimeUs = nowUs; 254be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber } 255be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber ++mNumFrames; 256be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber 25720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mFrames.push_back(data); 258be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber mFrameTimes.push_back(nowUs - mFirstFrameTimeUs); 25920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mFrameAvailableCondition.signal(); 26020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 26120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 26220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} // namespace android 263