am 76a54294: Merge change I155e2ad0 into eclair-mr2
Merge commit '76a5429407e821c22508eca92e7475b6433cd668' into eclair-mr2-plus-aosp * commit '76a5429407e821c22508eca92e7475b6433cd668': Re-enable CameraSource.
This commit is contained in:
@@ -26,12 +26,11 @@
|
|||||||
|
|
||||||
namespace android {
|
namespace android {
|
||||||
|
|
||||||
class ICamera;
|
|
||||||
class ICameraClient;
|
|
||||||
class IMemory;
|
class IMemory;
|
||||||
|
class ISurface;
|
||||||
|
class Camera;
|
||||||
|
|
||||||
class CameraSource : public MediaSource,
|
class CameraSource : public MediaSource {
|
||||||
public MediaBufferObserver {
|
|
||||||
public:
|
public:
|
||||||
static CameraSource *Create();
|
static CameraSource *Create();
|
||||||
|
|
||||||
@@ -45,24 +44,25 @@ public:
|
|||||||
virtual status_t read(
|
virtual status_t read(
|
||||||
MediaBuffer **buffer, const ReadOptions *options = NULL);
|
MediaBuffer **buffer, const ReadOptions *options = NULL);
|
||||||
|
|
||||||
virtual void notifyCallback(int32_t msgType, int32_t ext1, int32_t ext2);
|
|
||||||
virtual void dataCallback(int32_t msgType, const sp<IMemory>& data);
|
|
||||||
|
|
||||||
virtual void signalBufferReturned(MediaBuffer *buffer);
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
CameraSource(const sp<ICamera> &camera, const sp<ICameraClient> &client);
|
friend class CameraSourceListener;
|
||||||
|
|
||||||
sp<ICamera> mCamera;
|
sp<Camera> mCamera;
|
||||||
sp<ICameraClient> mCameraClient;
|
|
||||||
|
|
||||||
Mutex mLock;
|
Mutex mLock;
|
||||||
Condition mFrameAvailableCondition;
|
Condition mFrameAvailableCondition;
|
||||||
List<sp<IMemory> > mFrames;
|
List<sp<IMemory> > mFrames;
|
||||||
|
List<int64_t> mFrameTimes;
|
||||||
|
|
||||||
int mNumFrames;
|
int mWidth, mHeight;
|
||||||
|
int64_t mFirstFrameTimeUs;
|
||||||
|
int32_t mNumFrames;
|
||||||
bool mStarted;
|
bool mStarted;
|
||||||
|
|
||||||
|
CameraSource(const sp<Camera> &camera);
|
||||||
|
|
||||||
|
void dataCallback(int32_t msgType, const sp<IMemory> &data);
|
||||||
|
|
||||||
CameraSource(const CameraSource &);
|
CameraSource(const CameraSource &);
|
||||||
CameraSource &operator=(const CameraSource &);
|
CameraSource &operator=(const CameraSource &);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ ifeq ($(BUILD_WITH_FULL_STAGEFRIGHT),true)
|
|||||||
LOCAL_SRC_FILES += \
|
LOCAL_SRC_FILES += \
|
||||||
AMRExtractor.cpp \
|
AMRExtractor.cpp \
|
||||||
CachingDataSource.cpp \
|
CachingDataSource.cpp \
|
||||||
|
CameraSource.cpp \
|
||||||
DataSource.cpp \
|
DataSource.cpp \
|
||||||
FileSource.cpp \
|
FileSource.cpp \
|
||||||
HTTPDataSource.cpp \
|
HTTPDataSource.cpp \
|
||||||
|
|||||||
@@ -21,120 +21,142 @@
|
|||||||
#include <binder/IServiceManager.h>
|
#include <binder/IServiceManager.h>
|
||||||
#include <media/stagefright/CameraSource.h>
|
#include <media/stagefright/CameraSource.h>
|
||||||
#include <media/stagefright/MediaDebug.h>
|
#include <media/stagefright/MediaDebug.h>
|
||||||
|
#include <media/stagefright/MediaDefs.h>
|
||||||
#include <media/stagefright/MediaErrors.h>
|
#include <media/stagefright/MediaErrors.h>
|
||||||
#include <media/stagefright/MetaData.h>
|
#include <media/stagefright/MetaData.h>
|
||||||
#include <ui/ICameraClient.h>
|
#include <ui/Camera.h>
|
||||||
#include <ui/ICameraService.h>
|
#include <ui/CameraParameters.h>
|
||||||
|
#include <ui/GraphicBuffer.h>
|
||||||
|
#include <ui/ISurface.h>
|
||||||
#include <ui/Overlay.h>
|
#include <ui/Overlay.h>
|
||||||
#include <utils/String16.h>
|
#include <utils/String8.h>
|
||||||
|
|
||||||
namespace android {
|
namespace android {
|
||||||
|
|
||||||
class CameraBuffer : public MediaBuffer {
|
static int64_t getNowUs() {
|
||||||
public:
|
struct timeval tv;
|
||||||
CameraBuffer(const sp<IMemory> &frame)
|
gettimeofday(&tv, NULL);
|
||||||
: MediaBuffer(frame->pointer(), frame->size()),
|
|
||||||
mFrame(frame) {
|
|
||||||
}
|
|
||||||
|
|
||||||
sp<IMemory> releaseFrame() {
|
return (int64_t)tv.tv_usec + tv.tv_sec * 1000000;
|
||||||
sp<IMemory> frame = mFrame;
|
}
|
||||||
mFrame.clear();
|
|
||||||
return frame;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
struct DummySurface : public BnSurface {
|
||||||
sp<IMemory> mFrame;
|
|
||||||
};
|
|
||||||
|
|
||||||
class CameraSourceClient : public BnCameraClient {
|
|
||||||
public:
|
|
||||||
CameraSourceClient()
|
|
||||||
: mSource(NULL) {
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual void notifyCallback(int32_t msgType, int32_t ext1, int32_t ext2) {
|
|
||||||
CHECK(mSource != NULL);
|
|
||||||
mSource->notifyCallback(msgType, ext1, ext2);
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual void dataCallback(int32_t msgType, const sp<IMemory> &data) {
|
|
||||||
CHECK(mSource != NULL);
|
|
||||||
mSource->dataCallback(msgType, data);
|
|
||||||
}
|
|
||||||
|
|
||||||
void setCameraSource(CameraSource *source) {
|
|
||||||
mSource = source;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
CameraSource *mSource;
|
|
||||||
};
|
|
||||||
|
|
||||||
class DummySurface : public BnSurface {
|
|
||||||
public:
|
|
||||||
DummySurface() {}
|
DummySurface() {}
|
||||||
|
|
||||||
|
virtual sp<GraphicBuffer> requestBuffer(int bufferIdx, int usage) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
virtual status_t registerBuffers(const BufferHeap &buffers) {
|
virtual status_t registerBuffers(const BufferHeap &buffers) {
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void postBuffer(ssize_t offset) {
|
virtual void postBuffer(ssize_t offset) {}
|
||||||
}
|
virtual void unregisterBuffers() {}
|
||||||
|
|
||||||
virtual void unregisterBuffers() {
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual sp<OverlayRef> createOverlay(
|
virtual sp<OverlayRef> createOverlay(
|
||||||
uint32_t w, uint32_t h, int32_t format) {
|
uint32_t w, uint32_t h, int32_t format) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual ~DummySurface() {}
|
||||||
|
|
||||||
|
DummySurface(const DummySurface &);
|
||||||
|
DummySurface &operator=(const DummySurface &);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct CameraSourceListener : public CameraListener {
|
||||||
|
CameraSourceListener(const sp<CameraSource> &source);
|
||||||
|
|
||||||
|
virtual void notify(int32_t msgType, int32_t ext1, int32_t ext2);
|
||||||
|
virtual void postData(int32_t msgType, const sp<IMemory> &dataPtr);
|
||||||
|
|
||||||
|
virtual void postDataTimestamp(
|
||||||
|
nsecs_t timestamp, int32_t msgType, const sp<IMemory>& dataPtr);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual ~CameraSourceListener();
|
||||||
|
|
||||||
|
private:
|
||||||
|
wp<CameraSource> mSource;
|
||||||
|
|
||||||
|
CameraSourceListener(const CameraSourceListener &);
|
||||||
|
CameraSourceListener &operator=(const CameraSourceListener &);
|
||||||
|
};
|
||||||
|
|
||||||
|
CameraSourceListener::CameraSourceListener(const sp<CameraSource> &source)
|
||||||
|
: mSource(source) {
|
||||||
|
}
|
||||||
|
|
||||||
|
CameraSourceListener::~CameraSourceListener() {
|
||||||
|
}
|
||||||
|
|
||||||
|
void CameraSourceListener::notify(int32_t msgType, int32_t ext1, int32_t ext2) {
|
||||||
|
LOGV("notify(%d, %d, %d)", msgType, ext1, ext2);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CameraSourceListener::postData(int32_t msgType, const sp<IMemory> &dataPtr) {
|
||||||
|
LOGV("postData(%d, ptr:%p, size:%d)",
|
||||||
|
msgType, dataPtr->pointer(), dataPtr->size());
|
||||||
|
|
||||||
|
sp<CameraSource> source = mSource.promote();
|
||||||
|
if (source.get() != NULL) {
|
||||||
|
source->dataCallback(msgType, dataPtr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CameraSourceListener::postDataTimestamp(
|
||||||
|
nsecs_t timestamp, int32_t msgType, const sp<IMemory>& dataPtr) {
|
||||||
|
LOGV("postDataTimestamp(%lld, %d, ptr:%p, size:%d)",
|
||||||
|
timestamp, msgType, dataPtr->pointer(), dataPtr->size());
|
||||||
|
}
|
||||||
|
|
||||||
// static
|
// static
|
||||||
CameraSource *CameraSource::Create() {
|
CameraSource *CameraSource::Create() {
|
||||||
sp<IServiceManager> sm = defaultServiceManager();
|
sp<Camera> camera = Camera::connect();
|
||||||
|
|
||||||
sp<ICameraService> service =
|
if (camera.get() == NULL) {
|
||||||
interface_cast<ICameraService>(
|
return NULL;
|
||||||
sm->getService(String16("media.camera")));
|
}
|
||||||
|
|
||||||
sp<CameraSourceClient> client = new CameraSourceClient;
|
return new CameraSource(camera);
|
||||||
sp<ICamera> camera = service->connect(client);
|
|
||||||
|
|
||||||
CameraSource *source = new CameraSource(camera, client);
|
|
||||||
client->setCameraSource(source);
|
|
||||||
|
|
||||||
return source;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
CameraSource::CameraSource(
|
CameraSource::CameraSource(const sp<Camera> &camera)
|
||||||
const sp<ICamera> &camera, const sp<ICameraClient> &client)
|
|
||||||
: mCamera(camera),
|
: mCamera(camera),
|
||||||
mCameraClient(client),
|
mWidth(0),
|
||||||
|
mHeight(0),
|
||||||
|
mFirstFrameTimeUs(0),
|
||||||
mNumFrames(0),
|
mNumFrames(0),
|
||||||
mStarted(false) {
|
mStarted(false) {
|
||||||
printf("params: \"%s\"\n", mCamera->getParameters().string());
|
String8 s = mCamera->getParameters();
|
||||||
|
printf("params: \"%s\"\n", s.string());
|
||||||
|
|
||||||
|
CameraParameters params(s);
|
||||||
|
params.getPreviewSize(&mWidth, &mHeight);
|
||||||
}
|
}
|
||||||
|
|
||||||
CameraSource::~CameraSource() {
|
CameraSource::~CameraSource() {
|
||||||
if (mStarted) {
|
if (mStarted) {
|
||||||
stop();
|
stop();
|
||||||
}
|
}
|
||||||
|
|
||||||
mCamera->disconnect();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
status_t CameraSource::start(MetaData *) {
|
status_t CameraSource::start(MetaData *) {
|
||||||
CHECK(!mStarted);
|
CHECK(!mStarted);
|
||||||
|
|
||||||
status_t err = mCamera->lock();
|
mCamera->setListener(new CameraSourceListener(this));
|
||||||
|
|
||||||
|
sp<ISurface> dummy = new DummySurface;
|
||||||
|
status_t err = mCamera->setPreviewDisplay(dummy);
|
||||||
CHECK_EQ(err, OK);
|
CHECK_EQ(err, OK);
|
||||||
|
|
||||||
err = mCamera->setPreviewDisplay(new DummySurface);
|
mCamera->setPreviewCallbackFlags(
|
||||||
CHECK_EQ(err, OK);
|
FRAME_CALLBACK_FLAG_ENABLE_MASK
|
||||||
mCamera->setPreviewCallbackFlag(1);
|
| FRAME_CALLBACK_FLAG_COPY_OUT_MASK);
|
||||||
mCamera->startPreview();
|
|
||||||
|
err = mCamera->startPreview();
|
||||||
CHECK_EQ(err, OK);
|
CHECK_EQ(err, OK);
|
||||||
|
|
||||||
mStarted = true;
|
mStarted = true;
|
||||||
@@ -146,7 +168,6 @@ status_t CameraSource::stop() {
|
|||||||
CHECK(mStarted);
|
CHECK(mStarted);
|
||||||
|
|
||||||
mCamera->stopPreview();
|
mCamera->stopPreview();
|
||||||
mCamera->unlock();
|
|
||||||
|
|
||||||
mStarted = false;
|
mStarted = false;
|
||||||
|
|
||||||
@@ -157,8 +178,8 @@ sp<MetaData> CameraSource::getFormat() {
|
|||||||
sp<MetaData> meta = new MetaData;
|
sp<MetaData> meta = new MetaData;
|
||||||
meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_RAW);
|
meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_RAW);
|
||||||
meta->setInt32(kKeyColorFormat, OMX_COLOR_FormatYUV420SemiPlanar);
|
meta->setInt32(kKeyColorFormat, OMX_COLOR_FormatYUV420SemiPlanar);
|
||||||
meta->setInt32(kKeyWidth, 480);
|
meta->setInt32(kKeyWidth, mWidth);
|
||||||
meta->setInt32(kKeyHeight, 320);
|
meta->setInt32(kKeyHeight, mHeight);
|
||||||
|
|
||||||
return meta;
|
return meta;
|
||||||
}
|
}
|
||||||
@@ -175,6 +196,7 @@ status_t CameraSource::read(
|
|||||||
}
|
}
|
||||||
|
|
||||||
sp<IMemory> frame;
|
sp<IMemory> frame;
|
||||||
|
int64_t frameTime;
|
||||||
|
|
||||||
{
|
{
|
||||||
Mutex::Autolock autoLock(mLock);
|
Mutex::Autolock autoLock(mLock);
|
||||||
@@ -184,40 +206,33 @@ status_t CameraSource::read(
|
|||||||
|
|
||||||
frame = *mFrames.begin();
|
frame = *mFrames.begin();
|
||||||
mFrames.erase(mFrames.begin());
|
mFrames.erase(mFrames.begin());
|
||||||
|
|
||||||
|
frameTime = *mFrameTimes.begin();
|
||||||
|
mFrameTimes.erase(mFrameTimes.begin());
|
||||||
}
|
}
|
||||||
|
|
||||||
int count = mNumFrames++;
|
*buffer = new MediaBuffer(frame->size());
|
||||||
|
memcpy((*buffer)->data(), frame->pointer(), frame->size());
|
||||||
*buffer = new CameraBuffer(frame);
|
(*buffer)->set_range(0, frame->size());
|
||||||
|
|
||||||
(*buffer)->meta_data()->clear();
|
(*buffer)->meta_data()->clear();
|
||||||
(*buffer)->meta_data()->setInt64(kKeyTime, (count * 1000000) / 15);
|
(*buffer)->meta_data()->setInt64(kKeyTime, frameTime);
|
||||||
|
|
||||||
(*buffer)->add_ref();
|
|
||||||
(*buffer)->setObserver(this);
|
|
||||||
|
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CameraSource::notifyCallback(int32_t msgType, int32_t ext1, int32_t ext2) {
|
|
||||||
printf("notifyCallback %d, %d, %d\n", msgType, ext1, ext2);
|
|
||||||
}
|
|
||||||
|
|
||||||
void CameraSource::dataCallback(int32_t msgType, const sp<IMemory> &data) {
|
void CameraSource::dataCallback(int32_t msgType, const sp<IMemory> &data) {
|
||||||
Mutex::Autolock autoLock(mLock);
|
Mutex::Autolock autoLock(mLock);
|
||||||
|
|
||||||
|
int64_t nowUs = getNowUs();
|
||||||
|
if (mNumFrames == 0) {
|
||||||
|
mFirstFrameTimeUs = nowUs;
|
||||||
|
}
|
||||||
|
++mNumFrames;
|
||||||
|
|
||||||
mFrames.push_back(data);
|
mFrames.push_back(data);
|
||||||
|
mFrameTimes.push_back(nowUs - mFirstFrameTimeUs);
|
||||||
mFrameAvailableCondition.signal();
|
mFrameAvailableCondition.signal();
|
||||||
}
|
}
|
||||||
|
|
||||||
void CameraSource::signalBufferReturned(MediaBuffer *_buffer) {
|
|
||||||
CameraBuffer *buffer = static_cast<CameraBuffer *>(_buffer);
|
|
||||||
|
|
||||||
mCamera->releaseRecordingFrame(buffer->releaseFrame());
|
|
||||||
|
|
||||||
buffer->setObserver(NULL);
|
|
||||||
buffer->release();
|
|
||||||
buffer = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace android
|
} // namespace android
|
||||||
|
|||||||
Reference in New Issue
Block a user