diff -r 80975da52420 -r 43d09473c595 khronosfws/openmax_al/src/adaptation/xacameraadaptctx.c --- a/khronosfws/openmax_al/src/adaptation/xacameraadaptctx.c Mon May 03 12:59:52 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,283 +0,0 @@ -/* -* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of "Eclipse Public License v1.0" -* which accompanies this distribution, and is available -* at the URL "http://www.eclipse.org/legal/epl-v10.html". -* -* Initial Contributors: -* Nokia Corporation - initial contribution. -* -* Contributors: -* -* Description: -* -*/ - -#include -#include -#include "XACameraAdaptCtx.h" -#include "XAAdaptation.h" -#include -#include "XAStaticCapsAdaptation.h" - - -XAboolean cameraRealized = XA_BOOLEAN_FALSE; -XACameraAdaptationCtx_* cameraCtx = NULL; - -/* - * gboolean XACameraAdapt_GstBusCb( GstBus *bus, GstMessage *message, gpointer data ) - * MediaPlayer Gst-bus message handler (Callback) - */ -gboolean XACameraAdapt_GstBusCb( GstBus *bus, GstMessage *message, gpointer data ) -{ - XACameraAdaptationCtx* mCtx = (XACameraAdaptationCtx*)data; - XAAdaptEvent event = {XA_CAMERAITFEVENTS,XA_CAMERACBEVENT_FOCUSSTATUS,1,NULL}; - XAuint32 status; - - /* only listen to pipeline messages */ - if(GST_MESSAGE_SRC(message)==(GstObject*)(mCtx->baseObj.bin) ) - { - DEBUG_API_A2("->XACameraAdapt_GstBusCb:\"%s\" from object \"%s\"", - GST_MESSAGE_TYPE_NAME(message), GST_OBJECT_NAME(GST_MESSAGE_SRC(message))); - - if ( GST_MESSAGE_TYPE(message)== GST_MESSAGE_ASYNC_DONE ) - { - /* some async sequence ended */ - XAAdaptationBase_CompleteAsyncWait((&mCtx->baseObj)); - } - else if (strncmp(GST_MESSAGE_TYPE_NAME(message), GST_PHOTOGRAPHY_AUTOFOCUS_DONE, - strlen(GST_PHOTOGRAPHY_AUTOFOCUS_DONE))==0 ) - { - DEBUG_INFO("Autofocus done!.") - status = XA_CAMERA_FOCUSMODESTATUS_REACHED; - event.data = &status; - XAAdaptationBase_SendAdaptEvents(&(mCtx->baseObj), &event ); - } - else if ( strncmp(GST_MESSAGE_TYPE_NAME(message), GST_PHOTOGRAPHY_SHAKE_RISK, - strlen(GST_PHOTOGRAPHY_SHAKE_RISK)) ==0 ) - { - DEBUG_INFO("Camera shake risk!") - } - DEBUG_API("<-XACameraAdapt_GstBusCb"); - } - return TRUE; -} - -/* - * XAAdaptationBaseCtx* XACameraAdapt_Create() - * Allocates memory for Camera Adaptation Context and makes 1st phase initialization - * @returns XACameraAdaptationCtx* - Pointer to created context - */ -XAAdaptationBaseCtx* XACameraAdapt_Create(XAuint32 deviceID) -{ - XACameraAdaptationCtx *pSelf = calloc(1, sizeof(XACameraAdaptationCtx)); - DEBUG_API("->XACameraAdapt_Create"); - if ( pSelf) - { - if( XAAdaptationBase_Init(&(pSelf->baseObj),XACameraAdaptation) - != XA_RESULT_SUCCESS ) - { - DEBUG_ERR("Failed to init base context!!!"); - free(pSelf); - pSelf = NULL; - } - else - { - pSelf->deviceID = deviceID; - pSelf->curMirror = XA_VIDEOMIRROR_NONE; - pSelf->curRotation = 0; - pSelf->recording = XA_BOOLEAN_FALSE; - pSelf->playing = XA_BOOLEAN_FALSE; - pSelf->snapshotting = XA_BOOLEAN_FALSE; - cameraCtx = pSelf; /* Store global pointer */ - DEBUG_INFO_A1("Stored global camera ponter to %x", cameraCtx); - cameraRealized = XA_BOOLEAN_FALSE; - } - } - - DEBUG_API("<-XACameraAdapt_Create"); - return (XAAdaptationBaseCtx*)pSelf; -} - -/* - * XAresult XACameraAdapt_PostInit() - * 2nd phase initialization of Camera Adaptation Context - */ -XAresult XACameraAdapt_PostInit(XAAdaptationBaseCtx* bCtx) -{ - XAresult ret = XA_RESULT_SUCCESS; - - XACameraAdaptationCtx* ctx = NULL; - DEBUG_API("->XACameraAdapt_PostInit"); - if(bCtx == NULL || bCtx->ctxId != XACameraAdaptation) - { - DEBUG_ERR("Invalid parameter!!"); - DEBUG_API("<-XACameraAdapt_PostInit"); - return XA_RESULT_PARAMETER_INVALID; - } - ctx = (XACameraAdaptationCtx*)bCtx; - - if ( !ctx ) - { - return XA_RESULT_INTERNAL_ERROR; - } - - XAAdaptationBase_PostInit( &(ctx->baseObj) ); - - ctx->baseObj.bin = gst_element_factory_make( "camerabin", "camera"); - if ( !ctx->baseObj.bin ) - { - DEBUG_ERR("Failed to create CameraBin"); - return XA_RESULT_INTERNAL_ERROR; - } - - /* Create Gst bus listener. */ - ret = XAAdaptationBase_InitGstListener(&(ctx->baseObj)); - if( ret!=XA_RESULT_SUCCESS ) - { - DEBUG_ERR("Bus listener creation failed!!"); - return ret; - } - /* Add Camera specific handler */ - if(ctx->baseObj.bus) - { - ctx->baseObj.busCb = XACameraAdapt_GstBusCb; - gst_bus_add_signal_watch( ctx->baseObj.bus); - g_signal_connect(ctx->baseObj.bus, "message::autofocus-done", G_CALLBACK(ctx->baseObj.busCb), ctx ); - g_signal_connect(ctx->baseObj.bus, "message::shake-risk", G_CALLBACK(ctx->baseObj.busCb), ctx ); - g_signal_connect(ctx->baseObj.bus, "message::async-done", G_CALLBACK(ctx->baseObj.busCb), ctx ); - } - else - { - DEBUG_ERR("Failed to create message bus"); - return XA_RESULT_INTERNAL_ERROR; - } - - - /* SET UP CAMERABIN */ - - /* use test video source if set, camerabin default (v4l2src) otherwise */ -#ifdef XA_USE_TEST_PLUGINS - if(ctx->deviceID == XA_ADAPTID_VIDEOTESTSRC || ctx->deviceID == XA_DEFAULTDEVICEID_CAMERA ) -#else - if(ctx->deviceID == XA_ADAPTID_VIDEOTESTSRC ) -#endif - { - g_object_set( G_OBJECT(ctx->baseObj.bin), "videosrc", gst_element_factory_make("videotestsrc", "videotestsrc"), NULL ); - } - - /* set viewfinder element to be fake for the time of preroll.. if ghost pad added now, - * stupid camerabin makes circular linking... - */ - g_object_set( G_OBJECT(ctx->baseObj.bin), "vfsink" ,gst_element_factory_make("fakesink", "fakevfsink"), NULL ); - - /* Setup camerabin to produce raw video */ - g_object_set( G_OBJECT(ctx->baseObj.bin), "videomux",NULL, NULL ); - g_object_set( G_OBJECT(ctx->baseObj.bin), "videoenc",NULL, NULL ); - g_object_set( G_OBJECT(ctx->baseObj.bin), "mute", TRUE, NULL ); - g_object_set( G_OBJECT(ctx->baseObj.bin), "async-handling", FALSE, NULL); - g_object_set( G_OBJECT(ctx->baseObj.bin), "mode",(gint)1, NULL); - - - /* drive camerabin to READY to create the elements inside bin */ - gst_element_set_state( GST_ELEMENT(ctx->baseObj.bin), GST_STATE_READY); - - if(ctx->deviceID == XA_ADAPTID_VIDEOTESTSRC) - { /* set properties for videotestsrc */ - GstElement *testsrc = gst_bin_get_by_name(GST_BIN(ctx->baseObj.bin), "videotestsrc"); - g_object_set( G_OBJECT(testsrc),"is-live", TRUE, NULL); - g_object_set( G_OBJECT(testsrc),"do-timestamp", TRUE, NULL); - gst_object_unref(G_OBJECT(testsrc)); - } - - /* do some filter optimization */ -#ifdef XA_USE_TEST_PLUGINS - g_object_set( G_OBJECT(ctx->baseObj.bin), "filter-caps", - gst_caps_new_simple("video/x-raw-yuv", - "format", GST_TYPE_FOURCC,GST_MAKE_FOURCC('I','4','2','0'), - "framerate",GST_TYPE_FRACTION_RANGE,0,1,30,1, NULL) - ,NULL ); -#else - g_object_set( G_OBJECT(ctx->baseObj.bin), "filter-caps", - gst_caps_new_simple("video/x-raw-yuv", - "format", GST_TYPE_FOURCC,GST_MAKE_FOURCC('Y','U','Y','2'), - "framerate",GST_TYPE_FRACTION_RANGE,0,1,30,1, NULL) - ,NULL ); -#endif - - - /* now, unlink fake sink, create camera post processing pipeline and create ghost pad from it */ - { - GstElement *fakesink = gst_bin_get_by_name(GST_BIN(ctx->baseObj.bin),"fakevfsink"); - GstPad *fakepad = gst_element_get_static_pad(fakesink,"sink"); - GstPad *linkedpad = gst_pad_get_peer(fakepad); - GstElement *linkedelement = gst_pad_get_parent_element(linkedpad); - GstElement * cameraPP = NULL; - GstElement * camfilter = NULL; - GstElement *tee = NULL; - - /* Unlink fakesink */ - gst_element_unlink(linkedelement,fakesink); - /* Create VideoPP pipeline for Camera object */ - cameraPP = XAAdaptationBase_CreateVideoPP(); - g_object_set( G_OBJECT(cameraPP),"name", "videopp_camera", NULL); - gst_bin_add( GST_BIN(ctx->baseObj.bin), cameraPP ); - /*Link videoPP into camera bin last element */ - gst_element_link( linkedelement, cameraPP ); - - /* Add extra filter for caps negotiable after post processing*/ - camfilter = gst_element_factory_make("capsfilter", "camfilter"); - gst_bin_add( GST_BIN(ctx->baseObj.bin), camfilter ); - gst_element_link( cameraPP, camfilter ); - - /* Add tee element into camerabin */ - tee = gst_element_factory_make( "tee", "CamTee"); - gst_bin_add( GST_BIN(ctx->baseObj.bin), tee); - gst_element_link( camfilter, tee ); - - /* Unref */ - gst_object_unref(linkedelement); - gst_object_unref(linkedpad); - gst_object_unref(fakepad); - gst_bin_remove(GST_BIN(ctx->baseObj.bin),fakesink); - gst_object_unparent(GST_OBJECT(fakesink)); - } - - if ( ret == XA_RESULT_SUCCESS ) - { - cameraRealized = XA_BOOLEAN_TRUE; - } - - DEBUG_API("<-XACameraAdapt_PostInit"); - return ret; -} - -/* - * void XACameraAdapt_Destroy(XACameraAdaptationCtx* ctx) - * Destroys Camera Adaptation Context - * @param ctx - Camera Adaptation context to be destroyed - */ -void XACameraAdapt_Destroy(XAAdaptationBaseCtx* bCtx) -{ - XACameraAdaptationCtx* ctx = NULL; - - DEBUG_API("->XACameraAdapt_Destroy"); - if(bCtx == NULL || bCtx->ctxId != XACameraAdaptation ) - { - DEBUG_ERR("Invalid parameter!!"); - DEBUG_API("<-XACameraAdapt_Destroy"); - return; - } - ctx = (XACameraAdaptationCtx*)bCtx; - - XAAdaptationBase_Free(&(ctx->baseObj)); - - free(ctx); - ctx = NULL; - cameraCtx = NULL; - cameraRealized = XA_BOOLEAN_FALSE; - DEBUG_API("<-XACameraAdapt_Destroy"); -} -