khronosfws/openmax_al/src/gst_adaptation/xacameraadaptctx.c
author hgs
Fri, 14 May 2010 18:19:45 -0500
changeset 20 b67dd1fc57c5
parent 19 4a629bc82c5e
permissions -rw-r--r--
201019
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
19
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
hgs
parents:
diff changeset
     3
* All rights reserved.
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
*
hgs
parents:
diff changeset
     9
* Initial Contributors:
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
*
hgs
parents:
diff changeset
    12
* Contributors:
hgs
parents:
diff changeset
    13
*
hgs
parents:
diff changeset
    14
* Description: 
hgs
parents:
diff changeset
    15
*
hgs
parents:
diff changeset
    16
*/
hgs
parents:
diff changeset
    17
hgs
parents:
diff changeset
    18
#include <string.h>
20
hgs
parents: 19
diff changeset
    19
#include <gst/gst.h>
19
hgs
parents:
diff changeset
    20
#include "xacameraadaptctx.h"
hgs
parents:
diff changeset
    21
#include "xaadaptationgst.h"
20
hgs
parents: 19
diff changeset
    22
#include <gst/interfaces/photography.h>
19
hgs
parents:
diff changeset
    23
//#include "XAStaticCapsAdaptation.h"
hgs
parents:
diff changeset
    24
hgs
parents:
diff changeset
    25
hgs
parents:
diff changeset
    26
XAboolean cameraRealized = XA_BOOLEAN_FALSE;
hgs
parents:
diff changeset
    27
XACameraAdaptationCtx_* cameraCtx = NULL;
hgs
parents:
diff changeset
    28
hgs
parents:
diff changeset
    29
/*
hgs
parents:
diff changeset
    30
 * gboolean XACameraAdapt_GstBusCb( GstBus *bus, GstMessage *message, gpointer data )
hgs
parents:
diff changeset
    31
 * MediaPlayer Gst-bus message handler (Callback)
hgs
parents:
diff changeset
    32
 */
hgs
parents:
diff changeset
    33
gboolean XACameraAdapt_GstBusCb( GstBus *bus, GstMessage *message, gpointer data )
hgs
parents:
diff changeset
    34
{
hgs
parents:
diff changeset
    35
    XACameraAdaptationCtx* mCtx = (XACameraAdaptationCtx*)data;
hgs
parents:
diff changeset
    36
    XAAdaptEvent event = {XA_CAMERAITFEVENTS,XA_CAMERACBEVENT_FOCUSSTATUS,1,NULL};
hgs
parents:
diff changeset
    37
    XAuint32 status;
hgs
parents:
diff changeset
    38
hgs
parents:
diff changeset
    39
    /* only listen to pipeline messages */
hgs
parents:
diff changeset
    40
    if(GST_MESSAGE_SRC(message)==(GstObject*)(mCtx->baseObj.bin) )
hgs
parents:
diff changeset
    41
    {
hgs
parents:
diff changeset
    42
        DEBUG_API_A2("->XACameraAdapt_GstBusCb:\"%s\" from object \"%s\"",
hgs
parents:
diff changeset
    43
                        GST_MESSAGE_TYPE_NAME(message), GST_OBJECT_NAME(GST_MESSAGE_SRC(message)));
hgs
parents:
diff changeset
    44
hgs
parents:
diff changeset
    45
        if ( GST_MESSAGE_TYPE(message)== GST_MESSAGE_ASYNC_DONE )
hgs
parents:
diff changeset
    46
        {
hgs
parents:
diff changeset
    47
            /* some async sequence ended */
hgs
parents:
diff changeset
    48
            XAAdaptationGst_CompleteAsyncWait((&mCtx->baseObj));
hgs
parents:
diff changeset
    49
        }
hgs
parents:
diff changeset
    50
        else if (strncmp(GST_MESSAGE_TYPE_NAME(message), GST_PHOTOGRAPHY_AUTOFOCUS_DONE,
hgs
parents:
diff changeset
    51
                            strlen(GST_PHOTOGRAPHY_AUTOFOCUS_DONE))==0 )
hgs
parents:
diff changeset
    52
        {
hgs
parents:
diff changeset
    53
            DEBUG_INFO("Autofocus done!.")
hgs
parents:
diff changeset
    54
            status = XA_CAMERA_FOCUSMODESTATUS_REACHED;
hgs
parents:
diff changeset
    55
            event.data = &status;
hgs
parents:
diff changeset
    56
            XAAdaptationBase_SendAdaptEvents(&(mCtx->baseObj.baseObj), &event );
hgs
parents:
diff changeset
    57
        }
hgs
parents:
diff changeset
    58
        else if ( strncmp(GST_MESSAGE_TYPE_NAME(message), GST_PHOTOGRAPHY_SHAKE_RISK,
hgs
parents:
diff changeset
    59
                            strlen(GST_PHOTOGRAPHY_SHAKE_RISK)) ==0 )
hgs
parents:
diff changeset
    60
        {
hgs
parents:
diff changeset
    61
            DEBUG_INFO("Camera shake risk!")
hgs
parents:
diff changeset
    62
        }
hgs
parents:
diff changeset
    63
        DEBUG_API("<-XACameraAdapt_GstBusCb");
hgs
parents:
diff changeset
    64
    }
hgs
parents:
diff changeset
    65
    return TRUE;
hgs
parents:
diff changeset
    66
}
hgs
parents:
diff changeset
    67
hgs
parents:
diff changeset
    68
/*
hgs
parents:
diff changeset
    69
 * XAAdaptationGstCtx* XACameraAdapt_Create()
hgs
parents:
diff changeset
    70
 * Allocates memory for Camera Adaptation Context and makes 1st phase initialization
hgs
parents:
diff changeset
    71
 * @returns XACameraAdaptationCtx* - Pointer to created context
hgs
parents:
diff changeset
    72
 */
hgs
parents:
diff changeset
    73
XAAdaptationBaseCtx* XACameraAdapt_Create(XAuint32 deviceID)
hgs
parents:
diff changeset
    74
{
hgs
parents:
diff changeset
    75
    XACameraAdaptationCtx *pSelf = (XACameraAdaptationCtx*) calloc(1, sizeof(XACameraAdaptationCtx));
hgs
parents:
diff changeset
    76
    DEBUG_API("->XACameraAdapt_Create");
hgs
parents:
diff changeset
    77
    if ( pSelf)
hgs
parents:
diff changeset
    78
    {
hgs
parents:
diff changeset
    79
        if( XAAdaptationGst_Init(&(pSelf->baseObj),XACameraAdaptation)
hgs
parents:
diff changeset
    80
                    != XA_RESULT_SUCCESS )
hgs
parents:
diff changeset
    81
        {
hgs
parents:
diff changeset
    82
            DEBUG_ERR("Failed to init base context!!!");
hgs
parents:
diff changeset
    83
            free(pSelf);
hgs
parents:
diff changeset
    84
            pSelf = NULL;
hgs
parents:
diff changeset
    85
        }
hgs
parents:
diff changeset
    86
        else
hgs
parents:
diff changeset
    87
        {
hgs
parents:
diff changeset
    88
            pSelf->deviceID = deviceID;
hgs
parents:
diff changeset
    89
            pSelf->curMirror = XA_VIDEOMIRROR_NONE;
hgs
parents:
diff changeset
    90
            pSelf->curRotation = 0;
hgs
parents:
diff changeset
    91
            pSelf->recording = XA_BOOLEAN_FALSE;
hgs
parents:
diff changeset
    92
            pSelf->playing = XA_BOOLEAN_FALSE;
hgs
parents:
diff changeset
    93
            pSelf->snapshotting = XA_BOOLEAN_FALSE;
hgs
parents:
diff changeset
    94
            cameraCtx = pSelf; /* Store global pointer */
hgs
parents:
diff changeset
    95
            DEBUG_INFO_A1("Stored global camera ponter to %x", cameraCtx);
hgs
parents:
diff changeset
    96
            cameraRealized = XA_BOOLEAN_FALSE;
hgs
parents:
diff changeset
    97
        }
hgs
parents:
diff changeset
    98
    }
hgs
parents:
diff changeset
    99
hgs
parents:
diff changeset
   100
    DEBUG_API("<-XACameraAdapt_Create");
hgs
parents:
diff changeset
   101
    return (XAAdaptationBaseCtx*)&pSelf->baseObj;
hgs
parents:
diff changeset
   102
}
hgs
parents:
diff changeset
   103
hgs
parents:
diff changeset
   104
/*
hgs
parents:
diff changeset
   105
 * XAresult XACameraAdapt_PostInit()
hgs
parents:
diff changeset
   106
 * 2nd phase initialization of Camera Adaptation Context
hgs
parents:
diff changeset
   107
 */
hgs
parents:
diff changeset
   108
XAresult XACameraAdapt_PostInit(XAAdaptationBaseCtx* bCtx)
hgs
parents:
diff changeset
   109
{
hgs
parents:
diff changeset
   110
    XAresult ret = XA_RESULT_SUCCESS;
hgs
parents:
diff changeset
   111
hgs
parents:
diff changeset
   112
    XACameraAdaptationCtx* ctx = NULL;
hgs
parents:
diff changeset
   113
    DEBUG_API("->XACameraAdapt_PostInit");
hgs
parents:
diff changeset
   114
    if(bCtx == NULL || bCtx->ctxId != XACameraAdaptation)
hgs
parents:
diff changeset
   115
    {
hgs
parents:
diff changeset
   116
        DEBUG_ERR("Invalid parameter!!");
hgs
parents:
diff changeset
   117
        DEBUG_API("<-XACameraAdapt_PostInit");
hgs
parents:
diff changeset
   118
        return XA_RESULT_PARAMETER_INVALID;
hgs
parents:
diff changeset
   119
    }
hgs
parents:
diff changeset
   120
    ctx = (XACameraAdaptationCtx*)bCtx;
hgs
parents:
diff changeset
   121
hgs
parents:
diff changeset
   122
    if ( !ctx )
hgs
parents:
diff changeset
   123
    {
hgs
parents:
diff changeset
   124
        return XA_RESULT_INTERNAL_ERROR;
hgs
parents:
diff changeset
   125
    }
hgs
parents:
diff changeset
   126
hgs
parents:
diff changeset
   127
    XAAdaptationGst_PostInit( &(ctx->baseObj) );
hgs
parents:
diff changeset
   128
hgs
parents:
diff changeset
   129
    ctx->baseObj.bin = gst_element_factory_make( "camerabin", "camera");
hgs
parents:
diff changeset
   130
    if ( !ctx->baseObj.bin )
hgs
parents:
diff changeset
   131
    {
hgs
parents:
diff changeset
   132
        DEBUG_ERR("Failed to create CameraBin");
hgs
parents:
diff changeset
   133
        return XA_RESULT_INTERNAL_ERROR;
hgs
parents:
diff changeset
   134
    }
hgs
parents:
diff changeset
   135
hgs
parents:
diff changeset
   136
    /* Create Gst bus listener. */
hgs
parents:
diff changeset
   137
    ret = XAAdaptationGst_InitGstListener(&(ctx->baseObj));
hgs
parents:
diff changeset
   138
    if( ret!=XA_RESULT_SUCCESS )
hgs
parents:
diff changeset
   139
    {
hgs
parents:
diff changeset
   140
        DEBUG_ERR("Bus listener creation failed!!");
hgs
parents:
diff changeset
   141
        return ret;
hgs
parents:
diff changeset
   142
    }
hgs
parents:
diff changeset
   143
    /* Add Camera specific handler */
hgs
parents:
diff changeset
   144
    if(ctx->baseObj.bus)
hgs
parents:
diff changeset
   145
    {
hgs
parents:
diff changeset
   146
        ctx->baseObj.busCb = XACameraAdapt_GstBusCb;
hgs
parents:
diff changeset
   147
        gst_bus_add_signal_watch( ctx->baseObj.bus);
hgs
parents:
diff changeset
   148
        g_signal_connect(ctx->baseObj.bus, "message::autofocus-done", G_CALLBACK(ctx->baseObj.busCb), ctx );
hgs
parents:
diff changeset
   149
        g_signal_connect(ctx->baseObj.bus, "message::shake-risk", G_CALLBACK(ctx->baseObj.busCb), ctx );
hgs
parents:
diff changeset
   150
        g_signal_connect(ctx->baseObj.bus, "message::async-done", G_CALLBACK(ctx->baseObj.busCb), ctx );
hgs
parents:
diff changeset
   151
    }
hgs
parents:
diff changeset
   152
    else
hgs
parents:
diff changeset
   153
    {
hgs
parents:
diff changeset
   154
        DEBUG_ERR("Failed to create message bus");
hgs
parents:
diff changeset
   155
        return XA_RESULT_INTERNAL_ERROR;
hgs
parents:
diff changeset
   156
    }
hgs
parents:
diff changeset
   157
hgs
parents:
diff changeset
   158
hgs
parents:
diff changeset
   159
    /* SET UP CAMERABIN */
hgs
parents:
diff changeset
   160
hgs
parents:
diff changeset
   161
    /* use test video source if set, camerabin default (v4l2src) otherwise */
hgs
parents:
diff changeset
   162
#ifdef XA_USE_TEST_PLUGINS
hgs
parents:
diff changeset
   163
    if(ctx->deviceID == XA_ADAPTID_VIDEOTESTSRC || ctx->deviceID == XA_DEFAULTDEVICEID_CAMERA )
hgs
parents:
diff changeset
   164
#else
hgs
parents:
diff changeset
   165
    if(ctx->deviceID == XA_ADAPTID_VIDEOTESTSRC )
hgs
parents:
diff changeset
   166
#endif
hgs
parents:
diff changeset
   167
    {
hgs
parents:
diff changeset
   168
        g_object_set( G_OBJECT(ctx->baseObj.bin), "videosrc", gst_element_factory_make("videotestsrc", "videotestsrc"), NULL );
hgs
parents:
diff changeset
   169
    }
hgs
parents:
diff changeset
   170
hgs
parents:
diff changeset
   171
    /* set viewfinder element to be fake for the time of preroll.. if ghost pad added now,
hgs
parents:
diff changeset
   172
     * stupid camerabin makes circular linking...
hgs
parents:
diff changeset
   173
     */
hgs
parents:
diff changeset
   174
    g_object_set( G_OBJECT(ctx->baseObj.bin), "vfsink" ,gst_element_factory_make("fakesink", "fakevfsink"), NULL );
hgs
parents:
diff changeset
   175
hgs
parents:
diff changeset
   176
    /* Setup camerabin to produce raw video */
hgs
parents:
diff changeset
   177
    g_object_set( G_OBJECT(ctx->baseObj.bin), "videomux",NULL, NULL );
hgs
parents:
diff changeset
   178
    g_object_set( G_OBJECT(ctx->baseObj.bin), "videoenc",NULL, NULL );
hgs
parents:
diff changeset
   179
    g_object_set( G_OBJECT(ctx->baseObj.bin), "mute", TRUE, NULL );
hgs
parents:
diff changeset
   180
    g_object_set( G_OBJECT(ctx->baseObj.bin), "async-handling", FALSE, NULL);
hgs
parents:
diff changeset
   181
	g_object_set( G_OBJECT(ctx->baseObj.bin), "mode",(gint)1, NULL);
hgs
parents:
diff changeset
   182
hgs
parents:
diff changeset
   183
hgs
parents:
diff changeset
   184
    /* drive camerabin to READY to create the elements inside bin */
hgs
parents:
diff changeset
   185
    gst_element_set_state( GST_ELEMENT(ctx->baseObj.bin), GST_STATE_READY);
hgs
parents:
diff changeset
   186
hgs
parents:
diff changeset
   187
    if(ctx->deviceID == XA_ADAPTID_VIDEOTESTSRC)
hgs
parents:
diff changeset
   188
    {   /* set properties for videotestsrc */
hgs
parents:
diff changeset
   189
        GstElement *testsrc = gst_bin_get_by_name(GST_BIN(ctx->baseObj.bin), "videotestsrc");
hgs
parents:
diff changeset
   190
        g_object_set( G_OBJECT(testsrc),"is-live", TRUE, NULL);
hgs
parents:
diff changeset
   191
        g_object_set( G_OBJECT(testsrc),"do-timestamp", TRUE, NULL);
hgs
parents:
diff changeset
   192
        gst_object_unref(G_OBJECT(testsrc));
hgs
parents:
diff changeset
   193
    }
hgs
parents:
diff changeset
   194
hgs
parents:
diff changeset
   195
    /* do some filter optimization */
hgs
parents:
diff changeset
   196
#ifdef XA_USE_TEST_PLUGINS
hgs
parents:
diff changeset
   197
    g_object_set( G_OBJECT(ctx->baseObj.bin), "filter-caps",
hgs
parents:
diff changeset
   198
                    gst_caps_new_simple("video/x-raw-yuv",
hgs
parents:
diff changeset
   199
                                        "format", GST_TYPE_FOURCC,GST_MAKE_FOURCC('I','4','2','0'),
hgs
parents:
diff changeset
   200
                                        "framerate",GST_TYPE_FRACTION_RANGE,0,1,30,1, NULL)
hgs
parents:
diff changeset
   201
                ,NULL );
hgs
parents:
diff changeset
   202
#else
hgs
parents:
diff changeset
   203
    g_object_set( G_OBJECT(ctx->baseObj.bin), "filter-caps",
hgs
parents:
diff changeset
   204
                    gst_caps_new_simple("video/x-raw-yuv",
hgs
parents:
diff changeset
   205
                                        "format", GST_TYPE_FOURCC,GST_MAKE_FOURCC('Y','U','Y','2'),
hgs
parents:
diff changeset
   206
                                        "framerate",GST_TYPE_FRACTION_RANGE,0,1,30,1, NULL)
hgs
parents:
diff changeset
   207
                ,NULL );
hgs
parents:
diff changeset
   208
hgs
parents:
diff changeset
   209
#endif
hgs
parents:
diff changeset
   210
hgs
parents:
diff changeset
   211
    /* now, unlink fake sink, create camera post processing pipeline and create ghost pad from it */
hgs
parents:
diff changeset
   212
    {
hgs
parents:
diff changeset
   213
        GstElement *fakesink = gst_bin_get_by_name(GST_BIN(ctx->baseObj.bin),"fakevfsink");
hgs
parents:
diff changeset
   214
        GstPad *fakepad = gst_element_get_static_pad(fakesink,"sink");
hgs
parents:
diff changeset
   215
        GstPad *linkedpad = gst_pad_get_peer(fakepad);
hgs
parents:
diff changeset
   216
        GstElement *linkedelement = gst_pad_get_parent_element(linkedpad);
hgs
parents:
diff changeset
   217
        GstElement * cameraPP = NULL;
hgs
parents:
diff changeset
   218
        GstElement * camfilter = NULL;
hgs
parents:
diff changeset
   219
        GstElement *tee = NULL;
hgs
parents:
diff changeset
   220
hgs
parents:
diff changeset
   221
        /* Unlink fakesink */
hgs
parents:
diff changeset
   222
        gst_element_unlink(linkedelement,fakesink);
hgs
parents:
diff changeset
   223
        /* Create VideoPP pipeline for Camera object */
hgs
parents:
diff changeset
   224
        cameraPP = XAAdaptationGst_CreateVideoPP();
hgs
parents:
diff changeset
   225
        g_object_set( G_OBJECT(cameraPP),"name", "videopp_camera", NULL);
hgs
parents:
diff changeset
   226
        gst_bin_add( GST_BIN(ctx->baseObj.bin), cameraPP );
hgs
parents:
diff changeset
   227
        /*Link videoPP into camera bin last element */
hgs
parents:
diff changeset
   228
        if (! gst_element_link( linkedelement, cameraPP ))
hgs
parents:
diff changeset
   229
            {
hgs
parents:
diff changeset
   230
                 DEBUG_ERR("Could not link VideoPP to Camera bin!!");
hgs
parents:
diff changeset
   231
                 return XA_RESULT_INTERNAL_ERROR;
hgs
parents:
diff changeset
   232
            }
hgs
parents:
diff changeset
   233
hgs
parents:
diff changeset
   234
        /* Add extra filter for caps negotiable after post processing*/
hgs
parents:
diff changeset
   235
        camfilter = gst_element_factory_make("capsfilter", "camfilter");
hgs
parents:
diff changeset
   236
        gst_bin_add( GST_BIN(ctx->baseObj.bin), camfilter );
hgs
parents:
diff changeset
   237
        if(! gst_element_link( cameraPP, camfilter ))
hgs
parents:
diff changeset
   238
            {
hgs
parents:
diff changeset
   239
                 DEBUG_ERR("Could not link camera bin  to camerafilter!!");
hgs
parents:
diff changeset
   240
                 return XA_RESULT_INTERNAL_ERROR;
hgs
parents:
diff changeset
   241
            }
hgs
parents:
diff changeset
   242
hgs
parents:
diff changeset
   243
        /* Add tee element into camerabin */
hgs
parents:
diff changeset
   244
        tee = gst_element_factory_make( "tee", "CamTee");
hgs
parents:
diff changeset
   245
        gst_bin_add( GST_BIN(ctx->baseObj.bin), tee);
hgs
parents:
diff changeset
   246
        if (! gst_element_link( camfilter, tee ))
hgs
parents:
diff changeset
   247
            {
hgs
parents:
diff changeset
   248
                 DEBUG_ERR("Could not link camera filter  to tee element!!");
hgs
parents:
diff changeset
   249
                 return XA_RESULT_INTERNAL_ERROR;
hgs
parents:
diff changeset
   250
            }
hgs
parents:
diff changeset
   251
		/* Unref */
hgs
parents:
diff changeset
   252
        gst_object_unref(linkedelement);
hgs
parents:
diff changeset
   253
        gst_object_unref(linkedpad);
hgs
parents:
diff changeset
   254
        gst_object_unref(fakepad);
hgs
parents:
diff changeset
   255
        gst_bin_remove(GST_BIN(ctx->baseObj.bin),fakesink);
hgs
parents:
diff changeset
   256
        gst_object_unparent(GST_OBJECT(fakesink));
hgs
parents:
diff changeset
   257
    }
hgs
parents:
diff changeset
   258
hgs
parents:
diff changeset
   259
    if ( ret == XA_RESULT_SUCCESS )
hgs
parents:
diff changeset
   260
    {
hgs
parents:
diff changeset
   261
    	cameraRealized = XA_BOOLEAN_TRUE;
hgs
parents:
diff changeset
   262
    }
hgs
parents:
diff changeset
   263
hgs
parents:
diff changeset
   264
    DEBUG_API("<-XACameraAdapt_PostInit");
hgs
parents:
diff changeset
   265
    return ret;
hgs
parents:
diff changeset
   266
}
hgs
parents:
diff changeset
   267
hgs
parents:
diff changeset
   268
/*
hgs
parents:
diff changeset
   269
 * void XACameraAdapt_Destroy(XACameraAdaptationCtx* ctx)
hgs
parents:
diff changeset
   270
 * Destroys Camera Adaptation Context
hgs
parents:
diff changeset
   271
 * @param ctx - Camera Adaptation context to be destroyed
hgs
parents:
diff changeset
   272
 */
hgs
parents:
diff changeset
   273
void XACameraAdapt_Destroy(XAAdaptationBaseCtx* bCtx)
hgs
parents:
diff changeset
   274
{
hgs
parents:
diff changeset
   275
	XACameraAdaptationCtx* ctx = NULL;
hgs
parents:
diff changeset
   276
hgs
parents:
diff changeset
   277
	DEBUG_API("->XACameraAdapt_Destroy");
hgs
parents:
diff changeset
   278
	if(bCtx == NULL || bCtx->ctxId != XACameraAdaptation )
hgs
parents:
diff changeset
   279
	{
hgs
parents:
diff changeset
   280
		DEBUG_ERR("Invalid parameter!!");
hgs
parents:
diff changeset
   281
		DEBUG_API("<-XACameraAdapt_Destroy");
hgs
parents:
diff changeset
   282
		return;
hgs
parents:
diff changeset
   283
	}
hgs
parents:
diff changeset
   284
	ctx = (XACameraAdaptationCtx*)bCtx;
hgs
parents:
diff changeset
   285
hgs
parents:
diff changeset
   286
    XAAdaptationGst_Free(&(ctx->baseObj));
hgs
parents:
diff changeset
   287
hgs
parents:
diff changeset
   288
    free(ctx);
hgs
parents:
diff changeset
   289
    ctx = NULL;
hgs
parents:
diff changeset
   290
    cameraCtx = NULL;
hgs
parents:
diff changeset
   291
    cameraRealized = XA_BOOLEAN_FALSE;
hgs
parents:
diff changeset
   292
    DEBUG_API("<-XACameraAdapt_Destroy");
hgs
parents:
diff changeset
   293
}
hgs
parents:
diff changeset
   294