CameraSource.cpp revision b5ceb9ee21f37ae0817c16490c1fc148dd3eb5e2
1e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber/* 2e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * Copyright (C) 2009 The Android Open Source Project 3e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * 4e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 5e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * you may not use this file except in compliance with the License. 6e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * You may obtain a copy of the License at 7e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * 8e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 9e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * 10e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * Unless required by applicable law or agreed to in writing, software 11e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 12e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * See the License for the specific language governing permissions and 14e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * limitations under the License. 15e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber */ 16e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 17e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#include <sys/time.h> 18e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 19e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#include <OMX_Component.h> 20e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 21e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#include <binder/IServiceManager.h> 22e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#include <media/stagefright/CameraSource.h> 23b5ceb9ee21f37ae0817c16490c1fc148dd3eb5e2Andreas Huber#include <media/stagefright/MediaDebug.h> 24e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#include <media/stagefright/MediaErrors.h> 25e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#include <media/stagefright/MetaData.h> 26e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#include <ui/ICameraClient.h> 27e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#include <ui/ICameraService.h> 28e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#include <ui/Overlay.h> 29e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#include <utils/String16.h> 30e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 31e46b7be812d68e49710b34048662cbf18e2a6550Andreas Hubernamespace android { 32e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 33e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberclass CameraBuffer : public MediaBuffer { 34e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberpublic: 35e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber CameraBuffer(const sp<IMemory> &frame) 36e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber : MediaBuffer(frame->pointer(), frame->size()), 37e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber mFrame(frame) { 38e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber } 39e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 40e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber sp<IMemory> releaseFrame() { 41e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber sp<IMemory> frame = mFrame; 42e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber mFrame.clear(); 43e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber return frame; 44e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber } 45e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 46e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberprivate: 47e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber sp<IMemory> mFrame; 48e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber}; 49e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 50e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberclass CameraSourceClient : public BnCameraClient { 51e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberpublic: 52e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber CameraSourceClient() 53e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber : mSource(NULL) { 54e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber } 55e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 56e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber virtual void notifyCallback(int32_t msgType, int32_t ext1, int32_t ext2) { 57b5ceb9ee21f37ae0817c16490c1fc148dd3eb5e2Andreas Huber CHECK(mSource != NULL); 58e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber mSource->notifyCallback(msgType, ext1, ext2); 59e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber } 60e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 61e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber virtual void dataCallback(int32_t msgType, const sp<IMemory> &data) { 62b5ceb9ee21f37ae0817c16490c1fc148dd3eb5e2Andreas Huber CHECK(mSource != NULL); 63e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber mSource->dataCallback(msgType, data); 64e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber } 65e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 66e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber void setCameraSource(CameraSource *source) { 67e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber mSource = source; 68e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber } 69e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 70e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberprivate: 71e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber CameraSource *mSource; 72e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber}; 73e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 74e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberclass DummySurface : public BnSurface { 75e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberpublic: 76e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber DummySurface() {} 77e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 78e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber virtual status_t registerBuffers(const BufferHeap &buffers) { 79e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber return OK; 80e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber } 81e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 82e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber virtual void postBuffer(ssize_t offset) { 83e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber } 84e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 85e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber virtual void unregisterBuffers() { 86e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber } 87e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 88e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber virtual sp<OverlayRef> createOverlay( 89e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber uint32_t w, uint32_t h, int32_t format) { 90e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber return NULL; 91e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber } 92e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber}; 93e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 94e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber// static 95e46b7be812d68e49710b34048662cbf18e2a6550Andreas HuberCameraSource *CameraSource::Create() { 96e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber sp<IServiceManager> sm = defaultServiceManager(); 97e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 98e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber sp<ICameraService> service = 99e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber interface_cast<ICameraService>( 100e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber sm->getService(String16("media.camera"))); 101e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 102e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber sp<CameraSourceClient> client = new CameraSourceClient; 103e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber sp<ICamera> camera = service->connect(client); 104e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 105e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber CameraSource *source = new CameraSource(camera, client); 106e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber client->setCameraSource(source); 107e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 108e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber return source; 109e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber} 110e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 111e46b7be812d68e49710b34048662cbf18e2a6550Andreas HuberCameraSource::CameraSource( 112e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber const sp<ICamera> &camera, const sp<ICameraClient> &client) 113e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber : mCamera(camera), 114e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber mCameraClient(client), 115e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber mNumFrames(0), 116e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber mStarted(false) { 117e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber printf("params: \"%s\"\n", mCamera->getParameters().string()); 118e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber} 119e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 120e46b7be812d68e49710b34048662cbf18e2a6550Andreas HuberCameraSource::~CameraSource() { 121e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber if (mStarted) { 122e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber stop(); 123e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber } 124e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 125e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber mCamera->disconnect(); 126e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber} 127e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 128e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberstatus_t CameraSource::start(MetaData *) { 129b5ceb9ee21f37ae0817c16490c1fc148dd3eb5e2Andreas Huber CHECK(!mStarted); 130e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 131e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber status_t err = mCamera->lock(); 132b5ceb9ee21f37ae0817c16490c1fc148dd3eb5e2Andreas Huber CHECK_EQ(err, OK); 133e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 134e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber err = mCamera->setPreviewDisplay(new DummySurface); 135b5ceb9ee21f37ae0817c16490c1fc148dd3eb5e2Andreas Huber CHECK_EQ(err, OK); 136e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber mCamera->setPreviewCallbackFlag(1); 137e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber mCamera->startPreview(); 138b5ceb9ee21f37ae0817c16490c1fc148dd3eb5e2Andreas Huber CHECK_EQ(err, OK); 139e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 140e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber mStarted = true; 141e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 142e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber return OK; 143e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber} 144e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 145e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberstatus_t CameraSource::stop() { 146b5ceb9ee21f37ae0817c16490c1fc148dd3eb5e2Andreas Huber CHECK(mStarted); 147e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 148e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber mCamera->stopPreview(); 149e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber mCamera->unlock(); 150e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 151e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber mStarted = false; 152e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 153e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber return OK; 154e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber} 155e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 156e46b7be812d68e49710b34048662cbf18e2a6550Andreas Hubersp<MetaData> CameraSource::getFormat() { 157e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber sp<MetaData> meta = new MetaData; 158e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber meta->setCString(kKeyMIMEType, "video/raw"); 159e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber meta->setInt32(kKeyColorFormat, OMX_COLOR_FormatYUV420SemiPlanar); 160e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber meta->setInt32(kKeyWidth, 480); 161e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber meta->setInt32(kKeyHeight, 320); 162e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 163e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber return meta; 164e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber} 165e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 166e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberstatus_t CameraSource::read( 167e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber MediaBuffer **buffer, const ReadOptions *options) { 168b5ceb9ee21f37ae0817c16490c1fc148dd3eb5e2Andreas Huber CHECK(mStarted); 169e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 170e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber *buffer = NULL; 171e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 172e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber int64_t seekTimeUs; 173e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber if (options && options->getSeekTo(&seekTimeUs)) { 174e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber return ERROR_UNSUPPORTED; 175e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber } 176e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 177e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber sp<IMemory> frame; 178e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 179e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber { 180e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber Mutex::Autolock autoLock(mLock); 181e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber while (mFrames.empty()) { 182e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber mFrameAvailableCondition.wait(mLock); 183e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber } 184e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 185e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber frame = *mFrames.begin(); 186e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber mFrames.erase(mFrames.begin()); 187e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber } 188e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 189e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber int count = mNumFrames++; 190e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 191e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber *buffer = new CameraBuffer(frame); 192e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 193e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber (*buffer)->meta_data()->clear(); 194e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber (*buffer)->meta_data()->setInt32(kKeyTimeScale, 15); 195e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber (*buffer)->meta_data()->setInt32(kKeyTimeUnits, count); 196e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 197e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber (*buffer)->add_ref(); 198e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber (*buffer)->setObserver(this); 199e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 200e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber return OK; 201e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber} 202e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 203e46b7be812d68e49710b34048662cbf18e2a6550Andreas Hubervoid CameraSource::notifyCallback(int32_t msgType, int32_t ext1, int32_t ext2) { 204e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber printf("notifyCallback %d, %d, %d\n", msgType, ext1, ext2); 205e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber} 206e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 207e46b7be812d68e49710b34048662cbf18e2a6550Andreas Hubervoid CameraSource::dataCallback(int32_t msgType, const sp<IMemory> &data) { 208e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber Mutex::Autolock autoLock(mLock); 209e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 210e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber mFrames.push_back(data); 211e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber mFrameAvailableCondition.signal(); 212e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber} 213e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 214e46b7be812d68e49710b34048662cbf18e2a6550Andreas Hubervoid CameraSource::signalBufferReturned(MediaBuffer *_buffer) { 215e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber CameraBuffer *buffer = static_cast<CameraBuffer *>(_buffer); 216e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 217e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber mCamera->releaseRecordingFrame(buffer->releaseFrame()); 218e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 219e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber buffer->setObserver(NULL); 220e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber buffer->release(); 221e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber buffer = NULL; 222e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber} 223e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 224e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber} // namespace android 225