dear all,
I am wirte a demo to start camera preview/take picture/recording with Camera
class in native lib.
It seems there are two ways to implement this.
1. use surface (this is prefer for me)
2. the callback function(postData) in added camera listener.
virtual void postData(int32_t msgType, const sp<IMemory>& dataPtr)
I set a surface for camera, but can not preview. And I do not how to use the
raw data in callback function.
Could anyone help me out, pls?
Thanks in advance!
#include <cutils/memory.h>
//#include <utils/Log.h>
#include <binder/IPCThreadState.h>
#include <binder/ProcessState.h>
#include <binder/IServiceManager.h>
#include <surfaceflinger/Surface.h>
#include <surfaceflinger/ISurface.h>
#include <surfaceflinger/ISurfaceComposer.h>
#include <surfaceflinger/SurfaceComposerClient.h>
#include <camera/Camera.h>
#include <camera/ICamera.h>
#include <ui/Overlay.h>
using namespace android;
class MyCameraListener : public CameraListener
{
public:
virtual void notify(int32_t msgType, int32_t ext1, int32_t ext2)
{
printf("notify\n");
}
virtual void postData(int32_t msgType, const sp<IMemory>& dataPtr)
{
printf("postData IMemory = %p\n", dataPtr->pointer());
}
virtual void postDataTimestamp(nsecs_t timestamp, int32_t msgType, const
sp<IMemory>& dataPtr)
{
printf("postDataTimestamp\n");
}
};
int main(int argc, char** argv)
{
// set up the thread-pool
sp<ProcessState> proc(ProcessState::self());
ProcessState::self()->startThreadPool();
//create surface
sp<SurfaceComposerClient> client = new SurfaceComposerClient();
sp<SurfaceControl> surfaceControl = client->createSurface(getpid(), 0, 480,
640, PIXEL_FORMAT_RGB_565);
client->openTransaction();
surfaceControl->setLayer(100000);
surfaceControl->setSize(640, 480);
client->closeTransaction();
sp<Surface> surface = surfaceControl->getSurface();
//create camera
sp<Camera> camera = Camera::connect();
if (camera == NULL)
{
printf("Camera::connect() fail \n");
return 0;
}
camera->setPreviewCallbackFlags(FRAME_CALLBACK_FLAG_BARCODE_SCANNER);
//set listener
sp<CameraListener> listener = new MyCameraListener();
camera->setListener(listener);
//set Preview surface
if (NO_INIT == camera->setPreviewDisplay(surface))
{
printf("camera->setPreviewDisplay(surface) fail \n");
}
//start preview
if (NO_INIT == camera->startPreview())
{
printf("ICamera do not be init:startPreview\n");
exit(1);
}
printf("after preview ... \n");
//disconnect camera
camera->disconnect();
IPCThreadState::self()->joinThreadPool();
return 0;
}
2010-10-14
allen
--
unsubscribe: [email protected]
website: http://groups.google.com/group/android-porting