CameraSource.cpp revision 653252be963c07c99109d20f942d1f30c52a9360
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 <utils/String8.h> 3120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 3220111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubernamespace android { 3320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 34be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huberstruct CameraSourceListener : public CameraListener { 35be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber CameraSourceListener(const sp<CameraSource> &source); 36be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber 37be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber virtual void notify(int32_t msgType, int32_t ext1, int32_t ext2); 38be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber virtual void postData(int32_t msgType, const sp<IMemory> &dataPtr); 39be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber 40be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber virtual void postDataTimestamp( 41be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber nsecs_t timestamp, int32_t msgType, const sp<IMemory>& dataPtr); 42be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber 43be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huberprotected: 44be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber virtual ~CameraSourceListener(); 45be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber 4620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberprivate: 47be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber wp<CameraSource> mSource; 48be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber 49be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber CameraSourceListener(const CameraSourceListener &); 50be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber CameraSourceListener &operator=(const CameraSourceListener &); 5120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}; 5220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 53be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas HuberCameraSourceListener::CameraSourceListener(const sp<CameraSource> &source) 54be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber : mSource(source) { 55be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber} 5620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 57be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas HuberCameraSourceListener::~CameraSourceListener() { 58be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber} 5920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 60be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Hubervoid CameraSourceListener::notify(int32_t msgType, int32_t ext1, int32_t ext2) { 61be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber LOGV("notify(%d, %d, %d)", msgType, ext1, ext2); 62be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber} 6320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 64be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Hubervoid CameraSourceListener::postData(int32_t msgType, const sp<IMemory> &dataPtr) { 65be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber LOGV("postData(%d, ptr:%p, size:%d)", 66be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber msgType, dataPtr->pointer(), dataPtr->size()); 67be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber} 68be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber 69be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Hubervoid CameraSourceListener::postDataTimestamp( 70be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber nsecs_t timestamp, int32_t msgType, const sp<IMemory>& dataPtr) { 71c32cd79d9ad4aba7d959b5b3be7361b4715e6f18James Dong 72c32cd79d9ad4aba7d959b5b3be7361b4715e6f18James Dong sp<CameraSource> source = mSource.promote(); 73c32cd79d9ad4aba7d959b5b3be7361b4715e6f18James Dong if (source.get() != NULL) { 74c32cd79d9ad4aba7d959b5b3be7361b4715e6f18James Dong source->dataCallbackTimestamp(timestamp/1000, msgType, dataPtr); 75c32cd79d9ad4aba7d959b5b3be7361b4715e6f18James Dong } 76be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber} 7720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 78653252be963c07c99109d20f942d1f30c52a9360James Dongstatic int32_t getColorFormat(const char* colorFormat) { 79653252be963c07c99109d20f942d1f30c52a9360James Dong if (!strcmp(colorFormat, CameraParameters::PIXEL_FORMAT_YUV422SP)) { 80653252be963c07c99109d20f942d1f30c52a9360James Dong return OMX_COLOR_FormatYUV422SemiPlanar; 81653252be963c07c99109d20f942d1f30c52a9360James Dong } 82653252be963c07c99109d20f942d1f30c52a9360James Dong 83653252be963c07c99109d20f942d1f30c52a9360James Dong if (!strcmp(colorFormat, CameraParameters::PIXEL_FORMAT_YUV420SP)) { 84653252be963c07c99109d20f942d1f30c52a9360James Dong return OMX_COLOR_FormatYUV420SemiPlanar; 85653252be963c07c99109d20f942d1f30c52a9360James Dong } 86653252be963c07c99109d20f942d1f30c52a9360James Dong 87653252be963c07c99109d20f942d1f30c52a9360James Dong if (!strcmp(colorFormat, CameraParameters::PIXEL_FORMAT_YUV422I)) { 88653252be963c07c99109d20f942d1f30c52a9360James Dong return OMX_COLOR_FormatYCbYCr; 89653252be963c07c99109d20f942d1f30c52a9360James Dong } 90653252be963c07c99109d20f942d1f30c52a9360James Dong 91653252be963c07c99109d20f942d1f30c52a9360James Dong if (!strcmp(colorFormat, CameraParameters::PIXEL_FORMAT_RGB565)) { 92653252be963c07c99109d20f942d1f30c52a9360James Dong return OMX_COLOR_Format16bitRGB565; 93653252be963c07c99109d20f942d1f30c52a9360James Dong } 94653252be963c07c99109d20f942d1f30c52a9360James Dong 95653252be963c07c99109d20f942d1f30c52a9360James Dong CHECK_EQ(0, "Unknown color format"); 96653252be963c07c99109d20f942d1f30c52a9360James Dong} 97653252be963c07c99109d20f942d1f30c52a9360James Dong 9820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber// static 9920111aa043c5f404472bc63b90bc5aad906b1101Andreas HuberCameraSource *CameraSource::Create() { 10035a055b8bfc6f3cbea409b2897caf936654519cbChih-Chung Chang sp<Camera> camera = Camera::connect(0); 10120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 102be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber if (camera.get() == NULL) { 103be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber return NULL; 104be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber } 10520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 106be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber return new CameraSource(camera); 10720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 10820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 10930ab66297501757d745b9ae10da61adcd891f497Andreas Huber// static 110c32cd79d9ad4aba7d959b5b3be7361b4715e6f18James DongCameraSource *CameraSource::CreateFromCamera(const sp<Camera> &camera) { 11130ab66297501757d745b9ae10da61adcd891f497Andreas Huber if (camera.get() == NULL) { 11230ab66297501757d745b9ae10da61adcd891f497Andreas Huber return NULL; 11330ab66297501757d745b9ae10da61adcd891f497Andreas Huber } 11430ab66297501757d745b9ae10da61adcd891f497Andreas Huber 11530ab66297501757d745b9ae10da61adcd891f497Andreas Huber return new CameraSource(camera); 11630ab66297501757d745b9ae10da61adcd891f497Andreas Huber} 11730ab66297501757d745b9ae10da61adcd891f497Andreas Huber 118be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas HuberCameraSource::CameraSource(const sp<Camera> &camera) 11920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber : mCamera(camera), 120be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber mFirstFrameTimeUs(0), 121c32cd79d9ad4aba7d959b5b3be7361b4715e6f18James Dong mLastFrameTimestampUs(0), 12213aec890216948b0c364f8f92792129d0335f506James Dong mNumFramesReceived(0), 12313aec890216948b0c364f8f92792129d0335f506James Dong mNumFramesEncoded(0), 12413aec890216948b0c364f8f92792129d0335f506James Dong mNumFramesDropped(0), 12520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mStarted(false) { 126be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber String8 s = mCamera->getParameters(); 127be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber printf("params: \"%s\"\n", s.string()); 128be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber 129653252be963c07c99109d20f942d1f30c52a9360James Dong int32_t width, height; 130be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber CameraParameters params(s); 131653252be963c07c99109d20f942d1f30c52a9360James Dong params.getPreviewSize(&width, &height); 132653252be963c07c99109d20f942d1f30c52a9360James Dong 133653252be963c07c99109d20f942d1f30c52a9360James Dong const char *colorFormatStr = params.get(CameraParameters::KEY_VIDEO_FRAME_FORMAT); 134653252be963c07c99109d20f942d1f30c52a9360James Dong CHECK(colorFormatStr != NULL); 135653252be963c07c99109d20f942d1f30c52a9360James Dong int32_t colorFormat = getColorFormat(colorFormatStr); 136653252be963c07c99109d20f942d1f30c52a9360James Dong 137653252be963c07c99109d20f942d1f30c52a9360James Dong mMeta = new MetaData; 138653252be963c07c99109d20f942d1f30c52a9360James Dong mMeta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_RAW); 139653252be963c07c99109d20f942d1f30c52a9360James Dong mMeta->setInt32(kKeyColorFormat, colorFormat); 140653252be963c07c99109d20f942d1f30c52a9360James Dong mMeta->setInt32(kKeyWidth, width); 141653252be963c07c99109d20f942d1f30c52a9360James Dong mMeta->setInt32(kKeyHeight, height); 14220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 14320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 14420111aa043c5f404472bc63b90bc5aad906b1101Andreas HuberCameraSource::~CameraSource() { 14520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (mStarted) { 14620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber stop(); 14720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 14820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 14920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 15020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t CameraSource::start(MetaData *) { 151c32cd79d9ad4aba7d959b5b3be7361b4715e6f18James Dong LOGV("start"); 1520c89199745bc1bf05b997fc7c342017807676b6fAndreas Huber CHECK(!mStarted); 15320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 154be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber mCamera->setListener(new CameraSourceListener(this)); 15565ae665befd929efd1a7d1c9addac41c699f04b2James Dong CHECK_EQ(OK, mCamera->startRecording()); 15620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 15720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mStarted = true; 15820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return OK; 15920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 16020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 16120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t CameraSource::stop() { 162c32cd79d9ad4aba7d959b5b3be7361b4715e6f18James Dong LOGV("stop"); 163c32cd79d9ad4aba7d959b5b3be7361b4715e6f18James Dong Mutex::Autolock autoLock(mLock); 16420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mStarted = false; 165c32cd79d9ad4aba7d959b5b3be7361b4715e6f18James Dong mFrameAvailableCondition.signal(); 166c32cd79d9ad4aba7d959b5b3be7361b4715e6f18James Dong mCamera->setListener(NULL); 167c32cd79d9ad4aba7d959b5b3be7361b4715e6f18James Dong mCamera->stopRecording(); 16820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 169c32cd79d9ad4aba7d959b5b3be7361b4715e6f18James Dong releaseQueuedFrames(); 1707278cf32f1aa6a322f6dff1f8b7dacf7b6dddba6James Dong 1717278cf32f1aa6a322f6dff1f8b7dacf7b6dddba6James Dong while (!mFramesBeingEncoded.empty()) { 1727278cf32f1aa6a322f6dff1f8b7dacf7b6dddba6James Dong LOGI("Number of outstanding frames is being encoded: %d", mFramesBeingEncoded.size()); 1737278cf32f1aa6a322f6dff1f8b7dacf7b6dddba6James Dong mFrameCompleteCondition.wait(mLock); 1747278cf32f1aa6a322f6dff1f8b7dacf7b6dddba6James Dong } 1757278cf32f1aa6a322f6dff1f8b7dacf7b6dddba6James Dong 17613aec890216948b0c364f8f92792129d0335f506James Dong LOGI("Frames received/encoded/dropped: %d/%d/%d, timestamp (us) last/first: %lld/%lld", 17713aec890216948b0c364f8f92792129d0335f506James Dong mNumFramesReceived, mNumFramesEncoded, mNumFramesDropped, 178c32cd79d9ad4aba7d959b5b3be7361b4715e6f18James Dong mLastFrameTimestampUs, mFirstFrameTimeUs); 17913aec890216948b0c364f8f92792129d0335f506James Dong 18013aec890216948b0c364f8f92792129d0335f506James Dong CHECK_EQ(mNumFramesReceived, mNumFramesEncoded + mNumFramesDropped); 18120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return OK; 18220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 18320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 184c32cd79d9ad4aba7d959b5b3be7361b4715e6f18James Dongvoid CameraSource::releaseQueuedFrames() { 185c32cd79d9ad4aba7d959b5b3be7361b4715e6f18James Dong List<sp<IMemory> >::iterator it; 1867278cf32f1aa6a322f6dff1f8b7dacf7b6dddba6James Dong while (!mFramesReceived.empty()) { 1877278cf32f1aa6a322f6dff1f8b7dacf7b6dddba6James Dong it = mFramesReceived.begin(); 188c32cd79d9ad4aba7d959b5b3be7361b4715e6f18James Dong mCamera->releaseRecordingFrame(*it); 1897278cf32f1aa6a322f6dff1f8b7dacf7b6dddba6James Dong mFramesReceived.erase(it); 19013aec890216948b0c364f8f92792129d0335f506James Dong ++mNumFramesDropped; 191c32cd79d9ad4aba7d959b5b3be7361b4715e6f18James Dong } 192c32cd79d9ad4aba7d959b5b3be7361b4715e6f18James Dong} 193c32cd79d9ad4aba7d959b5b3be7361b4715e6f18James Dong 19420111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubersp<MetaData> CameraSource::getFormat() { 195653252be963c07c99109d20f942d1f30c52a9360James Dong return mMeta; 19620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 19720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 1987278cf32f1aa6a322f6dff1f8b7dacf7b6dddba6James Dongvoid CameraSource::signalBufferReturned(MediaBuffer *buffer) { 1997278cf32f1aa6a322f6dff1f8b7dacf7b6dddba6James Dong LOGV("signalBufferReturned: %p", buffer->data()); 2007278cf32f1aa6a322f6dff1f8b7dacf7b6dddba6James Dong for (List<sp<IMemory> >::iterator it = mFramesBeingEncoded.begin(); 2017278cf32f1aa6a322f6dff1f8b7dacf7b6dddba6James Dong it != mFramesBeingEncoded.end(); ++it) { 2027278cf32f1aa6a322f6dff1f8b7dacf7b6dddba6James Dong if ((*it)->pointer() == buffer->data()) { 2037278cf32f1aa6a322f6dff1f8b7dacf7b6dddba6James Dong mCamera->releaseRecordingFrame((*it)); 2047278cf32f1aa6a322f6dff1f8b7dacf7b6dddba6James Dong mFramesBeingEncoded.erase(it); 2057278cf32f1aa6a322f6dff1f8b7dacf7b6dddba6James Dong ++mNumFramesEncoded; 2067278cf32f1aa6a322f6dff1f8b7dacf7b6dddba6James Dong buffer->setObserver(0); 2077278cf32f1aa6a322f6dff1f8b7dacf7b6dddba6James Dong buffer->release(); 2087278cf32f1aa6a322f6dff1f8b7dacf7b6dddba6James Dong mFrameCompleteCondition.signal(); 2097278cf32f1aa6a322f6dff1f8b7dacf7b6dddba6James Dong return; 2107278cf32f1aa6a322f6dff1f8b7dacf7b6dddba6James Dong } 2117278cf32f1aa6a322f6dff1f8b7dacf7b6dddba6James Dong } 2127278cf32f1aa6a322f6dff1f8b7dacf7b6dddba6James Dong CHECK_EQ(0, "signalBufferReturned: bogus buffer"); 2137278cf32f1aa6a322f6dff1f8b7dacf7b6dddba6James Dong} 2147278cf32f1aa6a322f6dff1f8b7dacf7b6dddba6James Dong 21520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t CameraSource::read( 21620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber MediaBuffer **buffer, const ReadOptions *options) { 217c32cd79d9ad4aba7d959b5b3be7361b4715e6f18James Dong LOGV("read"); 21820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 21920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber *buffer = NULL; 22020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 22120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber int64_t seekTimeUs; 22220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (options && options->getSeekTo(&seekTimeUs)) { 22320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return ERROR_UNSUPPORTED; 22420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 22520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 22620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber sp<IMemory> frame; 227be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber int64_t frameTime; 22820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 22920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber { 23020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber Mutex::Autolock autoLock(mLock); 2317278cf32f1aa6a322f6dff1f8b7dacf7b6dddba6James Dong while (mStarted && mFramesReceived.empty()) { 23220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mFrameAvailableCondition.wait(mLock); 23320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 234c32cd79d9ad4aba7d959b5b3be7361b4715e6f18James Dong if (!mStarted) { 235c32cd79d9ad4aba7d959b5b3be7361b4715e6f18James Dong return OK; 236c32cd79d9ad4aba7d959b5b3be7361b4715e6f18James Dong } 2377278cf32f1aa6a322f6dff1f8b7dacf7b6dddba6James Dong frame = *mFramesReceived.begin(); 2387278cf32f1aa6a322f6dff1f8b7dacf7b6dddba6James Dong mFramesReceived.erase(mFramesReceived.begin()); 23920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 240be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber frameTime = *mFrameTimes.begin(); 241be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber mFrameTimes.erase(mFrameTimes.begin()); 24220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 2437278cf32f1aa6a322f6dff1f8b7dacf7b6dddba6James Dong mFramesBeingEncoded.push_back(frame); 2447278cf32f1aa6a322f6dff1f8b7dacf7b6dddba6James Dong *buffer = new MediaBuffer(frame->pointer(), frame->size()); 2457278cf32f1aa6a322f6dff1f8b7dacf7b6dddba6James Dong (*buffer)->setObserver(this); 2467278cf32f1aa6a322f6dff1f8b7dacf7b6dddba6James Dong (*buffer)->add_ref(); 2477278cf32f1aa6a322f6dff1f8b7dacf7b6dddba6James Dong (*buffer)->meta_data()->setInt64(kKeyTime, frameTime); 2487278cf32f1aa6a322f6dff1f8b7dacf7b6dddba6James Dong } 24920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return OK; 25020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 25120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 252c32cd79d9ad4aba7d959b5b3be7361b4715e6f18James Dongvoid CameraSource::dataCallbackTimestamp(int64_t timestampUs, 253c32cd79d9ad4aba7d959b5b3be7361b4715e6f18James Dong int32_t msgType, const sp<IMemory> &data) { 254c32cd79d9ad4aba7d959b5b3be7361b4715e6f18James Dong LOGV("dataCallbackTimestamp: timestamp %lld us", timestampUs); 255c32cd79d9ad4aba7d959b5b3be7361b4715e6f18James Dong mLastFrameTimestampUs = timestampUs; 25620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber Mutex::Autolock autoLock(mLock); 257c32cd79d9ad4aba7d959b5b3be7361b4715e6f18James Dong if (!mStarted) { 258c32cd79d9ad4aba7d959b5b3be7361b4715e6f18James Dong mCamera->releaseRecordingFrame(data); 25913aec890216948b0c364f8f92792129d0335f506James Dong ++mNumFramesReceived; 26013aec890216948b0c364f8f92792129d0335f506James Dong ++mNumFramesDropped; 261c32cd79d9ad4aba7d959b5b3be7361b4715e6f18James Dong return; 262c32cd79d9ad4aba7d959b5b3be7361b4715e6f18James Dong } 26320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 26413aec890216948b0c364f8f92792129d0335f506James Dong if (mNumFramesReceived == 0) { 265c32cd79d9ad4aba7d959b5b3be7361b4715e6f18James Dong mFirstFrameTimeUs = timestampUs; 266be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber } 26713aec890216948b0c364f8f92792129d0335f506James Dong ++mNumFramesReceived; 268be5c74f5da6a93b0d23f96e11848acfcc3b4d1d9Andreas Huber 2697278cf32f1aa6a322f6dff1f8b7dacf7b6dddba6James Dong mFramesReceived.push_back(data); 270c32cd79d9ad4aba7d959b5b3be7361b4715e6f18James Dong mFrameTimes.push_back(timestampUs - mFirstFrameTimeUs); 27120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mFrameAvailableCondition.signal(); 27220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 27320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 27420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} // namespace android 275