CameraSource.cpp revision 20111aa043c5f404472bc63b90bc5aad906b1101
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#undef NDEBUG 2020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <assert.h> 2120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 2220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <OMX_Component.h> 2320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 2420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <binder/IServiceManager.h> 2520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <media/stagefright/CameraSource.h> 2620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <media/stagefright/MediaErrors.h> 2720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <media/stagefright/MetaData.h> 2820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <ui/ICameraClient.h> 2920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <ui/ICameraService.h> 3020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <ui/Overlay.h> 3120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <utils/String16.h> 3220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 3320111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubernamespace android { 3420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 3520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass CameraBuffer : public MediaBuffer { 3620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberpublic: 3720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber CameraBuffer(const sp<IMemory> &frame) 3820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber : MediaBuffer(frame->pointer(), frame->size()), 3920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mFrame(frame) { 4020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 4120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 4220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber sp<IMemory> releaseFrame() { 4320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber sp<IMemory> frame = mFrame; 4420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mFrame.clear(); 4520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return frame; 4620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 4720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 4820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberprivate: 4920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber sp<IMemory> mFrame; 5020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}; 5120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 5220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass CameraSourceClient : public BnCameraClient { 5320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberpublic: 5420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber CameraSourceClient() 5520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber : mSource(NULL) { 5620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 5720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 5820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber virtual void notifyCallback(int32_t msgType, int32_t ext1, int32_t ext2) { 5920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber assert(mSource != NULL); 6020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mSource->notifyCallback(msgType, ext1, ext2); 6120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 6220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 6320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber virtual void dataCallback(int32_t msgType, const sp<IMemory> &data) { 6420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber assert(mSource != NULL); 6520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mSource->dataCallback(msgType, data); 6620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 6720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 6820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber void setCameraSource(CameraSource *source) { 6920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mSource = source; 7020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 7120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 7220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberprivate: 7320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber CameraSource *mSource; 7420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}; 7520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 7620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass DummySurface : public BnSurface { 7720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberpublic: 7820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber DummySurface() {} 7920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 8020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber virtual status_t registerBuffers(const BufferHeap &buffers) { 8120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return OK; 8220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 8320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 8420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber virtual void postBuffer(ssize_t offset) { 8520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 8620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 8720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber virtual void unregisterBuffers() { 8820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 8920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 9020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber virtual sp<OverlayRef> createOverlay( 9120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber uint32_t w, uint32_t h, int32_t format) { 9220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return NULL; 9320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 9420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}; 9520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 9620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber// static 9720111aa043c5f404472bc63b90bc5aad906b1101Andreas HuberCameraSource *CameraSource::Create() { 9820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber sp<IServiceManager> sm = defaultServiceManager(); 9920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 10020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber sp<ICameraService> service = 10120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber interface_cast<ICameraService>( 10220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber sm->getService(String16("media.camera"))); 10320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 10420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber sp<CameraSourceClient> client = new CameraSourceClient; 10520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber sp<ICamera> camera = service->connect(client); 10620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 10720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber CameraSource *source = new CameraSource(camera, client); 10820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber client->setCameraSource(source); 10920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 11020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return source; 11120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 11220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 11320111aa043c5f404472bc63b90bc5aad906b1101Andreas HuberCameraSource::CameraSource( 11420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber const sp<ICamera> &camera, const sp<ICameraClient> &client) 11520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber : mCamera(camera), 11620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mCameraClient(client), 11720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mNumFrames(0), 11820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mStarted(false) { 11920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber printf("params: \"%s\"\n", mCamera->getParameters().string()); 12020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 12120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 12220111aa043c5f404472bc63b90bc5aad906b1101Andreas HuberCameraSource::~CameraSource() { 12320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (mStarted) { 12420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber stop(); 12520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 12620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 12720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mCamera->disconnect(); 12820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 12920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 13020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t CameraSource::start(MetaData *) { 13120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber assert(!mStarted); 13220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 13320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber status_t err = mCamera->lock(); 13420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber assert(err == OK); 13520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 13620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber err = mCamera->setPreviewDisplay(new DummySurface); 13720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber assert(err == OK); 13820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mCamera->setPreviewCallbackFlag(1); 13920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mCamera->startPreview(); 14020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber assert(err == OK); 14120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 14220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mStarted = true; 14320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 14420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return OK; 14520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 14620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 14720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t CameraSource::stop() { 14820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber assert(mStarted); 14920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 15020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mCamera->stopPreview(); 15120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mCamera->unlock(); 15220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 15320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mStarted = false; 15420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 15520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return OK; 15620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 15720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 15820111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubersp<MetaData> CameraSource::getFormat() { 15920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber sp<MetaData> meta = new MetaData; 16020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber meta->setCString(kKeyMIMEType, "video/raw"); 16120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber meta->setInt32(kKeyColorFormat, OMX_COLOR_FormatYUV420SemiPlanar); 16220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber meta->setInt32(kKeyWidth, 480); 16320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber meta->setInt32(kKeyHeight, 320); 16420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 16520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return meta; 16620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 16720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 16820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t CameraSource::read( 16920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber MediaBuffer **buffer, const ReadOptions *options) { 17020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber assert(mStarted); 17120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 17220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber *buffer = NULL; 17320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 17420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber int64_t seekTimeUs; 17520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (options && options->getSeekTo(&seekTimeUs)) { 17620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return ERROR_UNSUPPORTED; 17720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 17820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 17920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber sp<IMemory> frame; 18020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 18120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber { 18220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber Mutex::Autolock autoLock(mLock); 18320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber while (mFrames.empty()) { 18420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mFrameAvailableCondition.wait(mLock); 18520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 18620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 18720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber frame = *mFrames.begin(); 18820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mFrames.erase(mFrames.begin()); 18920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 19020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 19120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber int count = mNumFrames++; 19220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 19320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber *buffer = new CameraBuffer(frame); 19420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 19520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber (*buffer)->meta_data()->clear(); 19620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber (*buffer)->meta_data()->setInt32(kKeyTimeScale, 15); 19720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber (*buffer)->meta_data()->setInt32(kKeyTimeUnits, count); 19820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 19920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber (*buffer)->add_ref(); 20020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber (*buffer)->setObserver(this); 20120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 20220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return OK; 20320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 20420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 20520111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubervoid CameraSource::notifyCallback(int32_t msgType, int32_t ext1, int32_t ext2) { 20620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber printf("notifyCallback %d, %d, %d\n", msgType, ext1, ext2); 20720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 20820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 20920111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubervoid CameraSource::dataCallback(int32_t msgType, const sp<IMemory> &data) { 21020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber Mutex::Autolock autoLock(mLock); 21120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 21220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mFrames.push_back(data); 21320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mFrameAvailableCondition.signal(); 21420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 21520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 21620111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubervoid CameraSource::signalBufferReturned(MediaBuffer *_buffer) { 21720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber CameraBuffer *buffer = static_cast<CameraBuffer *>(_buffer); 21820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 21920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mCamera->releaseRecordingFrame(buffer->releaseFrame()); 22020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 22120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber buffer->setObserver(NULL); 22220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber buffer->release(); 22320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber buffer = NULL; 22420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 22520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 22620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} // namespace android 227