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