CameraSource.cpp revision 35a055b8bfc6f3cbea409b2897caf936654519cb
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 17c32cd79d9ad4aba7d959b5b3be7361b4715e6f18James Dong//#define LOG_NDEBUG 0 18c32cd79d9ad4aba7d959b5b3be7361b4715e6f18James Dong#define LOG_TAG "CameraSource" 19c32cd79d9ad4aba7d959b5b3be7361b4715e6f18James Dong#include <utils/Log.h> 2020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 2120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <OMX_Component.h> 2220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 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> 283cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#include <camera/Camera.h> 293cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#include <camera/CameraParameters.h> 30be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber#include <ui/GraphicBuffer.h> 3120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <ui/Overlay.h> 323cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#include <surfaceflinger/ISurface.h> 33be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber#include <utils/String8.h> 3420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 3520111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubernamespace android { 3620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 37be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huberstruct DummySurface : public BnSurface { 38be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber DummySurface() {} 3920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 40be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber virtual sp<GraphicBuffer> requestBuffer(int bufferIdx, int usage) { 41be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber return NULL; 4220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 4320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 44be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber virtual status_t registerBuffers(const BufferHeap &buffers) { 45be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber return OK; 4620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 4720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 48be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber virtual void postBuffer(ssize_t offset) {} 49be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber virtual void unregisterBuffers() {} 5020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 51be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber virtual sp<OverlayRef> createOverlay( 52a2a05bf4d24df4ccd2942bfc3766a2430701e8baChih-Chung Chang uint32_t w, uint32_t h, int32_t format, int32_t orientation) { 53be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber return NULL; 5420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 5520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 56be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huberprotected: 57be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber virtual ~DummySurface() {} 58be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber 59be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber DummySurface(const DummySurface &); 60be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber DummySurface &operator=(const DummySurface &); 61be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber}; 62be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber 63be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huberstruct CameraSourceListener : public CameraListener { 64be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber CameraSourceListener(const sp<CameraSource> &source); 65be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber 66be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber virtual void notify(int32_t msgType, int32_t ext1, int32_t ext2); 67be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber virtual void postData(int32_t msgType, const sp<IMemory> &dataPtr); 68be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber 69be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber virtual void postDataTimestamp( 70be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber nsecs_t timestamp, int32_t msgType, const sp<IMemory>& dataPtr); 71be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber 72be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huberprotected: 73be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber virtual ~CameraSourceListener(); 74be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber 7520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberprivate: 76be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber wp<CameraSource> mSource; 77be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber 78be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber CameraSourceListener(const CameraSourceListener &); 79be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber CameraSourceListener &operator=(const CameraSourceListener &); 8020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}; 8120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 82be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas HuberCameraSourceListener::CameraSourceListener(const sp<CameraSource> &source) 83be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber : mSource(source) { 84be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber} 8520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 86be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas HuberCameraSourceListener::~CameraSourceListener() { 87be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber} 8820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 89be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Hubervoid CameraSourceListener::notify(int32_t msgType, int32_t ext1, int32_t ext2) { 90be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber LOGV("notify(%d, %d, %d)", msgType, ext1, ext2); 91be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber} 9220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 93be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Hubervoid CameraSourceListener::postData(int32_t msgType, const sp<IMemory> &dataPtr) { 94be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber LOGV("postData(%d, ptr:%p, size:%d)", 95be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber msgType, dataPtr->pointer(), dataPtr->size()); 96be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber} 97be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber 98be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Hubervoid CameraSourceListener::postDataTimestamp( 99be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber nsecs_t timestamp, int32_t msgType, const sp<IMemory>& dataPtr) { 100c32cd79d9ad4aba7d959b5b3be7361b4715e6f18James Dong 101c32cd79d9ad4aba7d959b5b3be7361b4715e6f18James Dong sp<CameraSource> source = mSource.promote(); 102c32cd79d9ad4aba7d959b5b3be7361b4715e6f18James Dong if (source.get() != NULL) { 103c32cd79d9ad4aba7d959b5b3be7361b4715e6f18James Dong source->dataCallbackTimestamp(timestamp/1000, msgType, dataPtr); 104c32cd79d9ad4aba7d959b5b3be7361b4715e6f18James Dong } 105be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber} 10620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 10720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber// static 10820111aa043c5f404472bc63b90bc5aad906b1101Andreas HuberCameraSource *CameraSource::Create() { 10935a055b8bfc6f3cbea409b2897caf936654519cbChih-Chung Chang sp<Camera> camera = Camera::connect(0); 11020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 111be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber if (camera.get() == NULL) { 112be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber return NULL; 113be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber } 11420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 115be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber return new CameraSource(camera); 11620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 11720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 11830ab66297501757d745b9ae10da61adcd891f497Andreas Huber// static 119c32cd79d9ad4aba7d959b5b3be7361b4715e6f18James DongCameraSource *CameraSource::CreateFromCamera(const sp<Camera> &camera) { 12030ab66297501757d745b9ae10da61adcd891f497Andreas Huber if (camera.get() == NULL) { 12130ab66297501757d745b9ae10da61adcd891f497Andreas Huber return NULL; 12230ab66297501757d745b9ae10da61adcd891f497Andreas Huber } 12330ab66297501757d745b9ae10da61adcd891f497Andreas Huber 12430ab66297501757d745b9ae10da61adcd891f497Andreas Huber return new CameraSource(camera); 12530ab66297501757d745b9ae10da61adcd891f497Andreas Huber} 12630ab66297501757d745b9ae10da61adcd891f497Andreas Huber 127be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas HuberCameraSource::CameraSource(const sp<Camera> &camera) 12820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber : mCamera(camera), 129be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber mWidth(0), 130be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber mHeight(0), 131be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber mFirstFrameTimeUs(0), 132c32cd79d9ad4aba7d959b5b3be7361b4715e6f18James Dong mLastFrameTimestampUs(0), 13313aec890216948b0c364f8f92792129d0335f506James Dong mNumFramesReceived(0), 13413aec890216948b0c364f8f92792129d0335f506James Dong mNumFramesEncoded(0), 13513aec890216948b0c364f8f92792129d0335f506James Dong mNumFramesDropped(0), 13620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mStarted(false) { 137be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber String8 s = mCamera->getParameters(); 138be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber printf("params: \"%s\"\n", s.string()); 139be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber 140be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber CameraParameters params(s); 141be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber params.getPreviewSize(&mWidth, &mHeight); 14220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 14320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 14420111aa043c5f404472bc63b90bc5aad906b1101Andreas HuberCameraSource::~CameraSource() { 14520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (mStarted) { 14620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber stop(); 14720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 14820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 14920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 15030ab66297501757d745b9ae10da61adcd891f497Andreas Hubervoid CameraSource::setPreviewSurface(const sp<ISurface> &surface) { 15130ab66297501757d745b9ae10da61adcd891f497Andreas Huber mPreviewSurface = surface; 15230ab66297501757d745b9ae10da61adcd891f497Andreas Huber} 15330ab66297501757d745b9ae10da61adcd891f497Andreas Huber 15420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t CameraSource::start(MetaData *) { 155c32cd79d9ad4aba7d959b5b3be7361b4715e6f18James Dong LOGV("start"); 1560c89199745bc1bf05b997fc7c342017807676b6fAndreas Huber CHECK(!mStarted); 15720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 158be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber mCamera->setListener(new CameraSourceListener(this)); 15920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 16030ab66297501757d745b9ae10da61adcd891f497Andreas Huber status_t err = 16130ab66297501757d745b9ae10da61adcd891f497Andreas Huber mCamera->setPreviewDisplay( 16230ab66297501757d745b9ae10da61adcd891f497Andreas Huber mPreviewSurface != NULL ? mPreviewSurface : new DummySurface); 1630c89199745bc1bf05b997fc7c342017807676b6fAndreas Huber CHECK_EQ(err, OK); 164be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber 165c32cd79d9ad4aba7d959b5b3be7361b4715e6f18James Dong err = mCamera->startRecording(); 1660c89199745bc1bf05b997fc7c342017807676b6fAndreas Huber CHECK_EQ(err, OK); 16720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 16820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mStarted = true; 16920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 17020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return OK; 17120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 17220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 17320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t CameraSource::stop() { 174c32cd79d9ad4aba7d959b5b3be7361b4715e6f18James Dong LOGV("stop"); 175c32cd79d9ad4aba7d959b5b3be7361b4715e6f18James Dong Mutex::Autolock autoLock(mLock); 17620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mStarted = false; 177c32cd79d9ad4aba7d959b5b3be7361b4715e6f18James Dong mFrameAvailableCondition.signal(); 178c32cd79d9ad4aba7d959b5b3be7361b4715e6f18James Dong mCamera->setListener(NULL); 179c32cd79d9ad4aba7d959b5b3be7361b4715e6f18James Dong mCamera->stopRecording(); 18020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 181c32cd79d9ad4aba7d959b5b3be7361b4715e6f18James Dong releaseQueuedFrames(); 18213aec890216948b0c364f8f92792129d0335f506James Dong LOGI("Frames received/encoded/dropped: %d/%d/%d, timestamp (us) last/first: %lld/%lld", 18313aec890216948b0c364f8f92792129d0335f506James Dong mNumFramesReceived, mNumFramesEncoded, mNumFramesDropped, 184c32cd79d9ad4aba7d959b5b3be7361b4715e6f18James Dong mLastFrameTimestampUs, mFirstFrameTimeUs); 18513aec890216948b0c364f8f92792129d0335f506James Dong 18613aec890216948b0c364f8f92792129d0335f506James Dong CHECK_EQ(mNumFramesReceived, mNumFramesEncoded + mNumFramesDropped); 18720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return OK; 18820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 18920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 190c32cd79d9ad4aba7d959b5b3be7361b4715e6f18James Dongvoid CameraSource::releaseQueuedFrames() { 191c32cd79d9ad4aba7d959b5b3be7361b4715e6f18James Dong List<sp<IMemory> >::iterator it; 192c32cd79d9ad4aba7d959b5b3be7361b4715e6f18James Dong while (!mFrames.empty()) { 193c32cd79d9ad4aba7d959b5b3be7361b4715e6f18James Dong it = mFrames.begin(); 194c32cd79d9ad4aba7d959b5b3be7361b4715e6f18James Dong mCamera->releaseRecordingFrame(*it); 195c32cd79d9ad4aba7d959b5b3be7361b4715e6f18James Dong mFrames.erase(it); 19613aec890216948b0c364f8f92792129d0335f506James Dong ++mNumFramesDropped; 197c32cd79d9ad4aba7d959b5b3be7361b4715e6f18James Dong } 198c32cd79d9ad4aba7d959b5b3be7361b4715e6f18James Dong} 199c32cd79d9ad4aba7d959b5b3be7361b4715e6f18James Dong 20020111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubersp<MetaData> CameraSource::getFormat() { 20120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber sp<MetaData> meta = new MetaData; 20218291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_RAW); 20320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber meta->setInt32(kKeyColorFormat, OMX_COLOR_FormatYUV420SemiPlanar); 204be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber meta->setInt32(kKeyWidth, mWidth); 205be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber meta->setInt32(kKeyHeight, mHeight); 20620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 20720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return meta; 20820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 20920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 21020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t CameraSource::read( 21120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber MediaBuffer **buffer, const ReadOptions *options) { 212c32cd79d9ad4aba7d959b5b3be7361b4715e6f18James Dong LOGV("read"); 21320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 21420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber *buffer = NULL; 21520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 21620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber int64_t seekTimeUs; 21720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (options && options->getSeekTo(&seekTimeUs)) { 21820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return ERROR_UNSUPPORTED; 21920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 22020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 22120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber sp<IMemory> frame; 222be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber int64_t frameTime; 22320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 22420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber { 22520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber Mutex::Autolock autoLock(mLock); 226c32cd79d9ad4aba7d959b5b3be7361b4715e6f18James Dong while (mStarted && mFrames.empty()) { 22720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mFrameAvailableCondition.wait(mLock); 22820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 229c32cd79d9ad4aba7d959b5b3be7361b4715e6f18James Dong if (!mStarted) { 230c32cd79d9ad4aba7d959b5b3be7361b4715e6f18James Dong return OK; 231c32cd79d9ad4aba7d959b5b3be7361b4715e6f18James Dong } 23220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber frame = *mFrames.begin(); 23320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mFrames.erase(mFrames.begin()); 23420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 235be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber frameTime = *mFrameTimes.begin(); 236be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber mFrameTimes.erase(mFrameTimes.begin()); 23713aec890216948b0c364f8f92792129d0335f506James Dong ++mNumFramesEncoded; 238be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber } 23920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 240be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber *buffer = new MediaBuffer(frame->size()); 241be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber memcpy((*buffer)->data(), frame->pointer(), frame->size()); 242be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber (*buffer)->set_range(0, frame->size()); 243c32cd79d9ad4aba7d959b5b3be7361b4715e6f18James Dong mCamera->releaseRecordingFrame(frame); 24420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 24520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber (*buffer)->meta_data()->clear(); 246be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber (*buffer)->meta_data()->setInt64(kKeyTime, frameTime); 24720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 24820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return OK; 24920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 25020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 251c32cd79d9ad4aba7d959b5b3be7361b4715e6f18James Dongvoid CameraSource::dataCallbackTimestamp(int64_t timestampUs, 252c32cd79d9ad4aba7d959b5b3be7361b4715e6f18James Dong int32_t msgType, const sp<IMemory> &data) { 253c32cd79d9ad4aba7d959b5b3be7361b4715e6f18James Dong LOGV("dataCallbackTimestamp: timestamp %lld us", timestampUs); 254c32cd79d9ad4aba7d959b5b3be7361b4715e6f18James Dong mLastFrameTimestampUs = timestampUs; 25520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber Mutex::Autolock autoLock(mLock); 256c32cd79d9ad4aba7d959b5b3be7361b4715e6f18James Dong if (!mStarted) { 257c32cd79d9ad4aba7d959b5b3be7361b4715e6f18James Dong mCamera->releaseRecordingFrame(data); 25813aec890216948b0c364f8f92792129d0335f506James Dong ++mNumFramesReceived; 25913aec890216948b0c364f8f92792129d0335f506James Dong ++mNumFramesDropped; 260c32cd79d9ad4aba7d959b5b3be7361b4715e6f18James Dong return; 261c32cd79d9ad4aba7d959b5b3be7361b4715e6f18James Dong } 26220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 26313aec890216948b0c364f8f92792129d0335f506James Dong if (mNumFramesReceived == 0) { 264c32cd79d9ad4aba7d959b5b3be7361b4715e6f18James Dong mFirstFrameTimeUs = timestampUs; 265be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber } 26613aec890216948b0c364f8f92792129d0335f506James Dong ++mNumFramesReceived; 267be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber 26820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mFrames.push_back(data); 269c32cd79d9ad4aba7d959b5b3be7361b4715e6f18James Dong mFrameTimes.push_back(timestampUs - mFirstFrameTimeUs); 27020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mFrameAvailableCondition.signal(); 27120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 27220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 27320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} // namespace android 274