khronosfws/openmax_al/src/gst_adaptation/xasnapshotitfadaptation.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>
hgs
parents: 19
diff changeset
    20
#include <gst/app/gstappsrc.h>
hgs
parents: 19
diff changeset
    21
#include <gst/app/gstappsink.h>
19
hgs
parents:
diff changeset
    22
#include "xaadaptationgst.h"
hgs
parents:
diff changeset
    23
#include "xasnapshotitfadaptation.h"
hgs
parents:
diff changeset
    24
#include "xamediarecorderadaptctx.h"
hgs
parents:
diff changeset
    25
#include "xametadataadaptation.h"
hgs
parents:
diff changeset
    26
#include "xacameraadaptctx.h"
hgs
parents:
diff changeset
    27
#include "xacapabilitiesmgr.h"
hgs
parents:
diff changeset
    28
hgs
parents:
diff changeset
    29
#define SSMAXPIC 30
hgs
parents:
diff changeset
    30
#define SSMAXFPS 30 /*technically, same as FPS of video stream*/
hgs
parents:
diff changeset
    31
#define SSMINFPS 1
hgs
parents:
diff changeset
    32
hgs
parents:
diff changeset
    33
extern XAboolean cameraRealized;
hgs
parents:
diff changeset
    34
extern XACameraAdaptationCtx_* cameraCtx;
hgs
parents:
diff changeset
    35
hgs
parents:
diff changeset
    36
/* Forward declarations for internal methods */
hgs
parents:
diff changeset
    37
XAresult XASnapshotItfAdaptation_CreateSnapshotPipeline(XAAdaptationGstCtx* bCtx);
hgs
parents:
diff changeset
    38
XAresult XASnapshotItfAdaptation_FreeSnapshot(XAAdaptationGstCtx* bCtx);
hgs
parents:
diff changeset
    39
const char* XASnapshotItfAdaptation_GetFileSuffix(XADataFormat_MIME* format);
hgs
parents:
diff changeset
    40
void XASnapshotItfAdaptation_AllocNextFilename(char** fname, const char* template);
hgs
parents:
diff changeset
    41
void XASnapshotItfAdaptation_StopSnapshotting(XAAdaptationGstCtx* bCtx);
hgs
parents:
diff changeset
    42
hgs
parents:
diff changeset
    43
/* callbacks */
hgs
parents:
diff changeset
    44
gboolean XASnapshotItfAdaptation_SnapshotBusCb( GstBus *bus, GstMessage *message, gpointer data );
hgs
parents:
diff changeset
    45
void XASnapshotItfAdaptation_BufferHandoffCb( GstElement *extract, GstBuffer *buffer, gpointer data);
hgs
parents:
diff changeset
    46
hgs
parents:
diff changeset
    47
/*********************************
hgs
parents:
diff changeset
    48
 * SnapshotItf adaptation methods
hgs
parents:
diff changeset
    49
 *********************************/
hgs
parents:
diff changeset
    50
hgs
parents:
diff changeset
    51
/*
hgs
parents:
diff changeset
    52
 * XAresult XASnapshotItfAdaptation_InitiateSnapshot(XAAdaptationGstCtx* bCtx,
hgs
parents:
diff changeset
    53
 *                                                 XAuint32 numberOfPictures,
hgs
parents:
diff changeset
    54
 *                                                 XAuint32 fps,
hgs
parents:
diff changeset
    55
 *                                                 XAboolean freezeViewFinder,
hgs
parents:
diff changeset
    56
 *                                                 XADataSink* sink)
hgs
parents:
diff changeset
    57
 */
hgs
parents:
diff changeset
    58
XAresult XASnapshotItfAdaptation_InitiateSnapshot(XAAdaptationGstCtx* bCtx,
hgs
parents:
diff changeset
    59
                                                  XAuint32 numberOfPictures,
hgs
parents:
diff changeset
    60
                                                  XAuint32 fps,
hgs
parents:
diff changeset
    61
                                                  XAboolean freezeViewFinder,
hgs
parents:
diff changeset
    62
                                                  XADataSink* sink)
hgs
parents:
diff changeset
    63
{
hgs
parents:
diff changeset
    64
    XAMediaRecorderAdaptationCtx* mCtx = (XAMediaRecorderAdaptationCtx*)bCtx;
hgs
parents:
diff changeset
    65
    XADataLocator_URI* uri=NULL;
hgs
parents:
diff changeset
    66
hgs
parents:
diff changeset
    67
    DEBUG_API("->XASnapshotItfAdaptation_InitiateSnapshot");
hgs
parents:
diff changeset
    68
    /* Store initialization variables */
hgs
parents:
diff changeset
    69
    mCtx->snapshotVars.numpics = numberOfPictures;
hgs
parents:
diff changeset
    70
    mCtx->snapshotVars.fps = fps;
hgs
parents:
diff changeset
    71
    mCtx->snapshotVars.freeze =freezeViewFinder;
hgs
parents:
diff changeset
    72
    mCtx->snapshotVars.parsenegotiated = FALSE;
hgs
parents:
diff changeset
    73
    mCtx->snapshotVars.snapshotbuffer = NULL;
hgs
parents:
diff changeset
    74
hgs
parents:
diff changeset
    75
    if( sink )
hgs
parents:
diff changeset
    76
    {   /* parse file sink name*/
hgs
parents:
diff changeset
    77
        if( sink->pLocator && *((XAuint32*)(sink->pLocator)) == XA_DATALOCATOR_URI )
hgs
parents:
diff changeset
    78
        {
hgs
parents:
diff changeset
    79
            uri = (XADataLocator_URI*)sink->pLocator;
hgs
parents:
diff changeset
    80
            if ( uri->URI != NULL )
hgs
parents:
diff changeset
    81
            {
hgs
parents:
diff changeset
    82
                /* parse filename template: <prefix><nnnn><suffix> */
hgs
parents:
diff changeset
    83
                mCtx->snapshotVars.fnametemplate = (char*)calloc(1,strlen((char*)uri->URI)+10);
hgs
parents:
diff changeset
    84
                DEBUG_INFO_A1("URI: %s", uri->URI);
hgs
parents:
diff changeset
    85
                if(strncmp((char*)uri->URI, "file://", 7) == 0)
hgs
parents:
diff changeset
    86
                {
hgs
parents:
diff changeset
    87
                    strcat(mCtx->snapshotVars.fnametemplate, (char*)&((uri->URI)[7]));
hgs
parents:
diff changeset
    88
                }
hgs
parents:
diff changeset
    89
                else
hgs
parents:
diff changeset
    90
                {
hgs
parents:
diff changeset
    91
                    strcat(mCtx->snapshotVars.fnametemplate, (char*)uri->URI);
hgs
parents:
diff changeset
    92
                }
hgs
parents:
diff changeset
    93
                strcat(mCtx->snapshotVars.fnametemplate, "%04d.");
hgs
parents:
diff changeset
    94
                strcat(mCtx->snapshotVars.fnametemplate,
hgs
parents:
diff changeset
    95
                        XASnapshotItfAdaptation_GetFileSuffix(sink->pFormat));
hgs
parents:
diff changeset
    96
                DEBUG_INFO_A1("->template name %s", mCtx->snapshotVars.fnametemplate);
hgs
parents:
diff changeset
    97
            }
hgs
parents:
diff changeset
    98
            else
hgs
parents:
diff changeset
    99
            {
hgs
parents:
diff changeset
   100
                DEBUG_ERR("No uri specified.");
hgs
parents:
diff changeset
   101
                return XA_RESULT_PARAMETER_INVALID;
hgs
parents:
diff changeset
   102
            }
hgs
parents:
diff changeset
   103
        }
hgs
parents:
diff changeset
   104
        else
hgs
parents:
diff changeset
   105
        { /* take snapshot to memory buffer */
hgs
parents:
diff changeset
   106
            if( mCtx->snapshotVars.fnametemplate )
hgs
parents:
diff changeset
   107
            {
hgs
parents:
diff changeset
   108
                free( mCtx->snapshotVars.fnametemplate );
hgs
parents:
diff changeset
   109
            }
hgs
parents:
diff changeset
   110
            mCtx->snapshotVars.fnametemplate = NULL;
hgs
parents:
diff changeset
   111
        }
hgs
parents:
diff changeset
   112
        if( sink->pFormat && *((XAuint32*)(sink->pFormat)) == XA_DATAFORMAT_RAWIMAGE )
hgs
parents:
diff changeset
   113
        {
hgs
parents:
diff changeset
   114
            XADataFormat_RawImage* img = ((XADataFormat_RawImage*)sink->pFormat);
hgs
parents:
diff changeset
   115
            /*set needed image settings from the sink structure*/
hgs
parents:
diff changeset
   116
            mCtx->imageEncSettings.encoderId = XA_IMAGECODEC_RAW;
hgs
parents:
diff changeset
   117
            mCtx->imageEncSettings.width = img->width;
hgs
parents:
diff changeset
   118
            mCtx->imageEncSettings.height = img->height;
hgs
parents:
diff changeset
   119
            mCtx->imageEncSettings.colorFormat = img->colorFormat;
hgs
parents:
diff changeset
   120
        }
hgs
parents:
diff changeset
   121
    }
hgs
parents:
diff changeset
   122
    else
hgs
parents:
diff changeset
   123
    {
hgs
parents:
diff changeset
   124
        DEBUG_ERR("XASnapshotItfAdaptation_InitiateSnapshot, invalid data sink!");
hgs
parents:
diff changeset
   125
        DEBUG_ERR("XA_RESULT_PARAMETER_INVALID");
hgs
parents:
diff changeset
   126
        DEBUG_API("<-XASnapshotItfAdaptation_InitiateSnapshot");
hgs
parents:
diff changeset
   127
        return XA_RESULT_PARAMETER_INVALID;
hgs
parents:
diff changeset
   128
    }
hgs
parents:
diff changeset
   129
hgs
parents:
diff changeset
   130
hgs
parents:
diff changeset
   131
    if( mCtx->snapshotVars.sspipeline )
hgs
parents:
diff changeset
   132
    {
hgs
parents:
diff changeset
   133
        XASnapshotItfAdaptation_FreeSnapshot(bCtx);
hgs
parents:
diff changeset
   134
    }
hgs
parents:
diff changeset
   135
    if( XASnapshotItfAdaptation_CreateSnapshotPipeline(bCtx) != XA_RESULT_SUCCESS )
hgs
parents:
diff changeset
   136
    {
hgs
parents:
diff changeset
   137
        DEBUG_ERR("Failed to create pipeline!!");
hgs
parents:
diff changeset
   138
        DEBUG_ERR("XA_RESULT_INTERNAL_ERROR");
hgs
parents:
diff changeset
   139
        DEBUG_API("<-XASnapshotItfAdaptation_InitiateSnapshot");
hgs
parents:
diff changeset
   140
        return XA_RESULT_INTERNAL_ERROR;
hgs
parents:
diff changeset
   141
    }
hgs
parents:
diff changeset
   142
    DEBUG_API("<-XASnapshotItfAdaptation_InitiateSnapshot");
hgs
parents:
diff changeset
   143
    return XA_RESULT_SUCCESS;
hgs
parents:
diff changeset
   144
}
hgs
parents:
diff changeset
   145
hgs
parents:
diff changeset
   146
/*
hgs
parents:
diff changeset
   147
 * XAresult XASnapshotItfAdaptation_TakeSnapshot(XAAdaptationGstCtx* bCtx)
hgs
parents:
diff changeset
   148
 */
hgs
parents:
diff changeset
   149
XAresult XASnapshotItfAdaptation_TakeSnapshot(XAAdaptationGstCtx* bCtx)
hgs
parents:
diff changeset
   150
{
hgs
parents:
diff changeset
   151
    XAMediaRecorderAdaptationCtx* mCtx = NULL;
hgs
parents:
diff changeset
   152
hgs
parents:
diff changeset
   153
    DEBUG_API("->XASnapshotItfAdaptation_TakeSnapshot");
hgs
parents:
diff changeset
   154
    if(!bCtx || bCtx->baseObj.ctxId != XAMediaRecorderAdaptation )
hgs
parents:
diff changeset
   155
    {
hgs
parents:
diff changeset
   156
        DEBUG_ERR("XA_RESULT_PARAMETER_INVALID");
hgs
parents:
diff changeset
   157
        DEBUG_API("<-XASnapshotItfAdaptation_TakeSnapshot");
hgs
parents:
diff changeset
   158
        /* invalid parameter */
hgs
parents:
diff changeset
   159
        return XA_RESULT_PARAMETER_INVALID;
hgs
parents:
diff changeset
   160
    }
hgs
parents:
diff changeset
   161
    mCtx = (XAMediaRecorderAdaptationCtx*)bCtx;
hgs
parents:
diff changeset
   162
    /*to get buffer, base pipeline must be playing...*/
hgs
parents:
diff changeset
   163
    if( GST_STATE(mCtx->baseObj.bin) != GST_STATE_PLAYING )
hgs
parents:
diff changeset
   164
    {
hgs
parents:
diff changeset
   165
        DEBUG_INFO_A1("Parent bin in state %d, set to PLAYING", GST_STATE(mCtx->baseObj.bin));
hgs
parents:
diff changeset
   166
        gst_element_set_state( GST_ELEMENT(mCtx->baseObj.bin), GST_STATE_PLAYING );
hgs
parents:
diff changeset
   167
        gst_element_get_state( GST_ELEMENT(mCtx->baseObj.bin), NULL,NULL, XA_ADAPT_ASYNC_TIMEOUT_SHORT_NSEC);
hgs
parents:
diff changeset
   168
    }
hgs
parents:
diff changeset
   169
    if ( mCtx->isobjvsrc && mCtx->videosource && cameraCtx && cameraRealized )
hgs
parents:
diff changeset
   170
    {
hgs
parents:
diff changeset
   171
    	GstPad *pad=NULL;
hgs
parents:
diff changeset
   172
    	GstPad *pad1=NULL;
hgs
parents:
diff changeset
   173
hgs
parents:
diff changeset
   174
    	cameraCtx->snapshotting = XA_BOOLEAN_TRUE;
hgs
parents:
diff changeset
   175
    	pad = gst_element_get_static_pad( GST_ELEMENT(cameraCtx->baseObj.bin), "MRObjSrc");
hgs
parents:
diff changeset
   176
		if( pad && gst_pad_is_linked(pad) )
hgs
parents:
diff changeset
   177
		{
hgs
parents:
diff changeset
   178
			DEBUG_INFO_A2("unblock element:%s pad:%s",
hgs
parents:
diff changeset
   179
					gst_element_get_name(cameraCtx->baseObj.bin),
hgs
parents:
diff changeset
   180
					gst_pad_get_name(pad));
hgs
parents:
diff changeset
   181
			gst_pad_set_blocked_async(pad, FALSE, XAAdaptationGst_PadBlockCb, NULL);
hgs
parents:
diff changeset
   182
		}
hgs
parents:
diff changeset
   183
hgs
parents:
diff changeset
   184
    	pad1 = gst_element_get_static_pad( GST_ELEMENT(cameraCtx->baseObj.bin), "MPObjSrc");
hgs
parents:
diff changeset
   185
		if( pad1 && gst_pad_is_linked(pad1) )
hgs
parents:
diff changeset
   186
		{
hgs
parents:
diff changeset
   187
			DEBUG_INFO_A2("unblock element:%s pad:%s",
hgs
parents:
diff changeset
   188
					gst_element_get_name(cameraCtx->baseObj.bin),
hgs
parents:
diff changeset
   189
					gst_pad_get_name(pad1));
hgs
parents:
diff changeset
   190
			gst_pad_set_blocked_async(pad, FALSE, XAAdaptationGst_PadBlockCb, NULL);
hgs
parents:
diff changeset
   191
		}
hgs
parents:
diff changeset
   192
hgs
parents:
diff changeset
   193
    	DEBUG_INFO_A1("Using camera from global pointer %x", cameraCtx);
hgs
parents:
diff changeset
   194
    	if ( GST_STATE( GST_ELEMENT(cameraCtx->baseObj.bin)) != GST_STATE_PLAYING )
hgs
parents:
diff changeset
   195
		{
hgs
parents:
diff changeset
   196
			cameraCtx->baseObj.binWantedState = GST_STATE(cameraCtx->baseObj.bin);
hgs
parents:
diff changeset
   197
			DEBUG_INFO_A1("Camerabin state %d, set to PLAYING", GST_STATE(GST_ELEMENT(cameraCtx->baseObj.bin)));
hgs
parents:
diff changeset
   198
			gst_element_set_state( GST_ELEMENT(cameraCtx->baseObj.bin), GST_STATE_PLAYING );
hgs
parents:
diff changeset
   199
			gst_element_get_state( GST_ELEMENT(cameraCtx->baseObj.bin), NULL,NULL, XA_ADAPT_ASYNC_TIMEOUT_SHORT_NSEC);
hgs
parents:
diff changeset
   200
		}
hgs
parents:
diff changeset
   201
	}
hgs
parents:
diff changeset
   202
hgs
parents:
diff changeset
   203
    /* Connect signal for getting current buffer from video pipeline*/
hgs
parents:
diff changeset
   204
    mCtx->snapshotVars.numpicstaken = 0;
hgs
parents:
diff changeset
   205
    mCtx->snapshotVars.waitforbuffer = TRUE;
hgs
parents:
diff changeset
   206
    if(mCtx->videoextract)
hgs
parents:
diff changeset
   207
    {
hgs
parents:
diff changeset
   208
        mCtx->snapshotVars.sighandler = g_signal_connect(mCtx->videoextract, "handoff",
hgs
parents:
diff changeset
   209
                                G_CALLBACK (XASnapshotItfAdaptation_BufferHandoffCb),mCtx);
hgs
parents:
diff changeset
   210
    }
hgs
parents:
diff changeset
   211
    if( mCtx->snapshotVars.sighandler==0 )
hgs
parents:
diff changeset
   212
    {
hgs
parents:
diff changeset
   213
        DEBUG_ERR("XA_RESULT_INTERNAL_ERROR");
hgs
parents:
diff changeset
   214
        DEBUG_API("<-XASnapshotItfAdaptation_TakeSnapshot");
hgs
parents:
diff changeset
   215
        return XA_RESULT_INTERNAL_ERROR;
hgs
parents:
diff changeset
   216
    }
hgs
parents:
diff changeset
   217
    DEBUG_API("<-XASnapshotItfAdaptation_TakeSnapshot");
hgs
parents:
diff changeset
   218
    return XA_RESULT_SUCCESS;
hgs
parents:
diff changeset
   219
}
hgs
parents:
diff changeset
   220
hgs
parents:
diff changeset
   221
/*
hgs
parents:
diff changeset
   222
 * XAresult XASnapshotItfAdaptation_CancelSnapshot(XAAdaptationGstCtx* bCtx)
hgs
parents:
diff changeset
   223
 */
hgs
parents:
diff changeset
   224
XAresult XASnapshotItfAdaptation_CancelSnapshot(XAAdaptationGstCtx* bCtx)
hgs
parents:
diff changeset
   225
{
hgs
parents:
diff changeset
   226
    DEBUG_API("->XASnapshotItfAdaptation_CancelSnapshot");
hgs
parents:
diff changeset
   227
    if(!bCtx || bCtx->baseObj.ctxId != XAMediaRecorderAdaptation )
hgs
parents:
diff changeset
   228
    {
hgs
parents:
diff changeset
   229
        DEBUG_ERR("XA_RESULT_PARAMETER_INVALID");
hgs
parents:
diff changeset
   230
        DEBUG_API("<-XASnapshotItfAdaptation_CancelSnapshot");
hgs
parents:
diff changeset
   231
        /* invalid parameter */
hgs
parents:
diff changeset
   232
        return XA_RESULT_PARAMETER_INVALID;
hgs
parents:
diff changeset
   233
    }
hgs
parents:
diff changeset
   234
hgs
parents:
diff changeset
   235
    XASnapshotItfAdaptation_FreeSnapshot(bCtx);
hgs
parents:
diff changeset
   236
hgs
parents:
diff changeset
   237
    DEBUG_API("<-XASnapshotItfAdaptation_CancelSnapshot");
hgs
parents:
diff changeset
   238
    return XA_RESULT_SUCCESS;
hgs
parents:
diff changeset
   239
}
hgs
parents:
diff changeset
   240
hgs
parents:
diff changeset
   241
/*
hgs
parents:
diff changeset
   242
 * XAresult XASnapshotItfAdaptation_GetMaxPicsPerBurst(XAAdaptationGstCtx* bCtx,
hgs
parents:
diff changeset
   243
 *                                              XAuint32 *maxNumberOfPictures)
hgs
parents:
diff changeset
   244
 */
hgs
parents:
diff changeset
   245
XAresult XASnapshotItfAdaptation_GetMaxPicsPerBurst(XAAdaptationGstCtx* bCtx,
hgs
parents:
diff changeset
   246
                                              XAuint32 *maxNumberOfPictures)
hgs
parents:
diff changeset
   247
{
hgs
parents:
diff changeset
   248
    DEBUG_API("->XASnapshotItfAdaptation_GetMaxPicsPerBurst");
hgs
parents:
diff changeset
   249
    if(!bCtx || bCtx->baseObj.ctxId != XAMediaRecorderAdaptation )
hgs
parents:
diff changeset
   250
    {
hgs
parents:
diff changeset
   251
        DEBUG_ERR("XA_RESULT_PARAMETER_INVALID");
hgs
parents:
diff changeset
   252
        DEBUG_API("<-XASnapshotItfAdaptation_GetMaxPicsPerBurst");
hgs
parents:
diff changeset
   253
        return XA_RESULT_PARAMETER_INVALID;
hgs
parents:
diff changeset
   254
    }
hgs
parents:
diff changeset
   255
    *maxNumberOfPictures = SSMAXPIC;
hgs
parents:
diff changeset
   256
    DEBUG_API("<-XASnapshotItfAdaptation_GetMaxPicsPerBurst");
hgs
parents:
diff changeset
   257
    return XA_RESULT_SUCCESS;
hgs
parents:
diff changeset
   258
}
hgs
parents:
diff changeset
   259
hgs
parents:
diff changeset
   260
/*
hgs
parents:
diff changeset
   261
 * XAresult XASnapshotItfAdaptation_GetBurstFPSRange(XAAdaptationGstCtx* bCtx,
hgs
parents:
diff changeset
   262
 *                                            XAuint32 *minFPS,
hgs
parents:
diff changeset
   263
 *                                           XAuint32 *maxFPS)
hgs
parents:
diff changeset
   264
 */
hgs
parents:
diff changeset
   265
XAresult XASnapshotItfAdaptation_GetBurstFPSRange(XAAdaptationGstCtx* bCtx,
hgs
parents:
diff changeset
   266
                                            XAuint32 *minFPS,
hgs
parents:
diff changeset
   267
                                            XAuint32 *maxFPS)
hgs
parents:
diff changeset
   268
{
hgs
parents:
diff changeset
   269
    DEBUG_API("->XASnapshotItfAdaptation_GetBurstFPSRange");
hgs
parents:
diff changeset
   270
    if(!bCtx || bCtx->baseObj.ctxId != XAMediaRecorderAdaptation )
hgs
parents:
diff changeset
   271
        {
hgs
parents:
diff changeset
   272
            DEBUG_ERR("XA_RESULT_PARAMETER_INVALID");
hgs
parents:
diff changeset
   273
            DEBUG_API("<-XASnapshotItfAdaptation_GetBurstFPSRange");
hgs
parents:
diff changeset
   274
            return XA_RESULT_PARAMETER_INVALID;
hgs
parents:
diff changeset
   275
        }
hgs
parents:
diff changeset
   276
    *minFPS = SSMINFPS;
hgs
parents:
diff changeset
   277
    *maxFPS = SSMAXFPS;
hgs
parents:
diff changeset
   278
hgs
parents:
diff changeset
   279
    DEBUG_API("<-XASnapshotItfAdaptation_GetBurstFPSRange");
hgs
parents:
diff changeset
   280
    return XA_RESULT_SUCCESS;
hgs
parents:
diff changeset
   281
}
hgs
parents:
diff changeset
   282
hgs
parents:
diff changeset
   283
/*
hgs
parents:
diff changeset
   284
 * XAresult XASnapshotItfAdaptation_SetShutterFeedback(XAAdaptationGstCtx* bCtx,
hgs
parents:
diff changeset
   285
 *                                              XAboolean enabled)
hgs
parents:
diff changeset
   286
 */
hgs
parents:
diff changeset
   287
XAresult XASnapshotItfAdaptation_SetShutterFeedback(XAAdaptationGstCtx* bCtx,
hgs
parents:
diff changeset
   288
                                              XAboolean enabled)
hgs
parents:
diff changeset
   289
{
hgs
parents:
diff changeset
   290
    DEBUG_API("->XASnapshotItfAdaptation_SetShutterFeedback");
hgs
parents:
diff changeset
   291
    if(!bCtx || bCtx->baseObj.ctxId != XAMediaRecorderAdaptation )
hgs
parents:
diff changeset
   292
    {
hgs
parents:
diff changeset
   293
        DEBUG_ERR("XA_RESULT_PARAMETER_INVALID");
hgs
parents:
diff changeset
   294
        DEBUG_API("<-XASnapshotItfAdaptation_SetShutterFeedback");
hgs
parents:
diff changeset
   295
        /* invalid parameter */
hgs
parents:
diff changeset
   296
        return XA_RESULT_PARAMETER_INVALID;
hgs
parents:
diff changeset
   297
    }
hgs
parents:
diff changeset
   298
    /* stubbed, no implementation */
hgs
parents:
diff changeset
   299
    DEBUG_API("<-XASnapshotItfAdaptation_SetShutterFeedback");
hgs
parents:
diff changeset
   300
    return XA_RESULT_SUCCESS;
hgs
parents:
diff changeset
   301
}
hgs
parents:
diff changeset
   302
hgs
parents:
diff changeset
   303
/********************
hgs
parents:
diff changeset
   304
 * Internal methods
hgs
parents:
diff changeset
   305
 ********************/
hgs
parents:
diff changeset
   306
hgs
parents:
diff changeset
   307
/*
hgs
parents:
diff changeset
   308
 * void XASnapshotItfAdaptation_StopSnapshotting(XAAdaptationGstCtx* bCtx)
hgs
parents:
diff changeset
   309
 */
hgs
parents:
diff changeset
   310
void XASnapshotItfAdaptation_StopSnapshotting(XAAdaptationGstCtx* bCtx)
hgs
parents:
diff changeset
   311
{
hgs
parents:
diff changeset
   312
    XAMediaRecorderAdaptationCtx* mCtx = (XAMediaRecorderAdaptationCtx*) bCtx;
hgs
parents:
diff changeset
   313
    DEBUG_API("->XASnapshotItfAdaptation_StopSnapshotting");
hgs
parents:
diff changeset
   314
    mCtx->snapshotVars.waitforbuffer = FALSE;
hgs
parents:
diff changeset
   315
    mCtx->snapshotVars.snapshotbuffer = NULL;
hgs
parents:
diff changeset
   316
    if(mCtx->snapshotVars.sighandler)
hgs
parents:
diff changeset
   317
    {
hgs
parents:
diff changeset
   318
        if(mCtx->videoextract)
hgs
parents:
diff changeset
   319
        {
hgs
parents:
diff changeset
   320
            g_signal_handler_disconnect(mCtx->videoextract,mCtx->snapshotVars.sighandler);
hgs
parents:
diff changeset
   321
        }
hgs
parents:
diff changeset
   322
        mCtx->snapshotVars.sighandler = 0;
hgs
parents:
diff changeset
   323
    }
hgs
parents:
diff changeset
   324
    /* did we change the state of parent pipeline?*/
hgs
parents:
diff changeset
   325
    if( mCtx->baseObj.bin && (GST_STATE(mCtx->baseObj.bin) != mCtx->baseObj.binWantedState) )
hgs
parents:
diff changeset
   326
    {
hgs
parents:
diff changeset
   327
        gst_element_set_state( GST_ELEMENT(mCtx->baseObj.bin), mCtx->baseObj.binWantedState );
hgs
parents:
diff changeset
   328
    }
hgs
parents:
diff changeset
   329
hgs
parents:
diff changeset
   330
    if ( cameraCtx && (GST_STATE(cameraCtx->baseObj.bin) != cameraCtx->baseObj.binWantedState) )
hgs
parents:
diff changeset
   331
	{
hgs
parents:
diff changeset
   332
    	cameraCtx->snapshotting = XA_BOOLEAN_FALSE;
hgs
parents:
diff changeset
   333
		DEBUG_INFO_A2("Camerabin state %d, restored to %d", GST_STATE(cameraCtx->baseObj.bin), cameraCtx->baseObj.binWantedState );
hgs
parents:
diff changeset
   334
		gst_element_set_state( GST_ELEMENT(cameraCtx->baseObj.bin), cameraCtx->baseObj.binWantedState );
hgs
parents:
diff changeset
   335
		gst_element_get_state( GST_ELEMENT(cameraCtx->baseObj.bin), NULL,NULL, XA_ADAPT_ASYNC_TIMEOUT_SHORT_NSEC);
hgs
parents:
diff changeset
   336
	}
hgs
parents:
diff changeset
   337
    DEBUG_API("<-XASnapshotItfAdaptation_StopSnapshotting");
hgs
parents:
diff changeset
   338
}
hgs
parents:
diff changeset
   339
hgs
parents:
diff changeset
   340
/*
hgs
parents:
diff changeset
   341
 * XAresult XASnapshotItfAdaptation_FreeSnapshot(XAAdaptationGstCtx* bCtx)
hgs
parents:
diff changeset
   342
 */
hgs
parents:
diff changeset
   343
XAresult XASnapshotItfAdaptation_FreeSnapshot(XAAdaptationGstCtx* bCtx)
hgs
parents:
diff changeset
   344
{
hgs
parents:
diff changeset
   345
    XAMediaRecorderAdaptationCtx* mCtx = NULL;
hgs
parents:
diff changeset
   346
    DEBUG_API("->XASnapshotItfAdaptation_FreeSnapshot");
hgs
parents:
diff changeset
   347
    if(!bCtx || bCtx->baseObj.ctxId != XAMediaRecorderAdaptation)
hgs
parents:
diff changeset
   348
    {
hgs
parents:
diff changeset
   349
        DEBUG_ERR("XA_RESULT_PARAMETER_INVALID");
hgs
parents:
diff changeset
   350
        DEBUG_API("<-XASnapshotItfAdaptation_FreeSnapshot");
hgs
parents:
diff changeset
   351
        return XA_RESULT_PARAMETER_INVALID;
hgs
parents:
diff changeset
   352
    }
hgs
parents:
diff changeset
   353
    mCtx = (XAMediaRecorderAdaptationCtx*) bCtx;
hgs
parents:
diff changeset
   354
    XASnapshotItfAdaptation_StopSnapshotting(bCtx);
hgs
parents:
diff changeset
   355
    /* Clean up pipeline and set current pipeline state to null*/
hgs
parents:
diff changeset
   356
    if( mCtx->snapshotVars.sspipeline )
hgs
parents:
diff changeset
   357
    {
hgs
parents:
diff changeset
   358
        gst_element_set_state( GST_ELEMENT(mCtx->snapshotVars.sspipeline), GST_STATE_NULL );
hgs
parents:
diff changeset
   359
        gst_object_unref( GST_OBJECT(mCtx->snapshotVars.sspipeline) );
hgs
parents:
diff changeset
   360
        mCtx->snapshotVars.sspipeline = NULL;
hgs
parents:
diff changeset
   361
    }
hgs
parents:
diff changeset
   362
    if( mCtx->snapshotVars.ssbus )
hgs
parents:
diff changeset
   363
    {
hgs
parents:
diff changeset
   364
        gst_object_unref( GST_OBJECT(mCtx->snapshotVars.ssbus) );
hgs
parents:
diff changeset
   365
        mCtx->snapshotVars.ssbus = NULL;
hgs
parents:
diff changeset
   366
    }
hgs
parents:
diff changeset
   367
    if( mCtx->snapshotVars.fnametemplate )
hgs
parents:
diff changeset
   368
    {
hgs
parents:
diff changeset
   369
        free(mCtx->snapshotVars.fnametemplate);
hgs
parents:
diff changeset
   370
        mCtx->snapshotVars.fnametemplate=NULL;
hgs
parents:
diff changeset
   371
    }
hgs
parents:
diff changeset
   372
    DEBUG_API("<-XASnapshotItfAdaptation_FreeSnapshot");
hgs
parents:
diff changeset
   373
    return XA_RESULT_SUCCESS;
hgs
parents:
diff changeset
   374
}
hgs
parents:
diff changeset
   375
hgs
parents:
diff changeset
   376
/*
hgs
parents:
diff changeset
   377
 * XAresult XASnapshotItfAdaptation_CreateSnapshotPipeline(XAAdaptationGstCtx* bCtx)
hgs
parents:
diff changeset
   378
 */
hgs
parents:
diff changeset
   379
XAresult XASnapshotItfAdaptation_CreateSnapshotPipeline(XAAdaptationGstCtx* bCtx)
hgs
parents:
diff changeset
   380
{
hgs
parents:
diff changeset
   381
    XAMediaRecorderAdaptationCtx* mCtx = NULL;
hgs
parents:
diff changeset
   382
hgs
parents:
diff changeset
   383
    XACapabilities temp;
hgs
parents:
diff changeset
   384
    GstCaps *imageCaps=NULL;
hgs
parents:
diff changeset
   385
hgs
parents:
diff changeset
   386
    DEBUG_API("->XASnapshotItfAdaptation_CreateSnapshotPipeline");
hgs
parents:
diff changeset
   387
    if(!bCtx || bCtx->baseObj.ctxId != XAMediaRecorderAdaptation)
hgs
parents:
diff changeset
   388
    {
hgs
parents:
diff changeset
   389
        DEBUG_ERR("XA_RESULT_PARAMETER_INVALID");
hgs
parents:
diff changeset
   390
        return XA_RESULT_PARAMETER_INVALID;
hgs
parents:
diff changeset
   391
    }
hgs
parents:
diff changeset
   392
    mCtx = (XAMediaRecorderAdaptationCtx*) bCtx;
hgs
parents:
diff changeset
   393
hgs
parents:
diff changeset
   394
    /*Create snapshotpipeline*/
hgs
parents:
diff changeset
   395
    mCtx->snapshotVars.sspipeline = gst_pipeline_new ("sspipeline");
hgs
parents:
diff changeset
   396
    if( mCtx->snapshotVars.sspipeline  )
hgs
parents:
diff changeset
   397
    {
hgs
parents:
diff changeset
   398
        /*add listener*/
hgs
parents:
diff changeset
   399
        mCtx->snapshotVars.ssbus = gst_pipeline_get_bus(GST_PIPELINE( mCtx->snapshotVars.sspipeline ) );
hgs
parents:
diff changeset
   400
        if( ! mCtx->snapshotVars.ssbus )
hgs
parents:
diff changeset
   401
        {
hgs
parents:
diff changeset
   402
            DEBUG_API("Cannot create snapshotbus");
hgs
parents:
diff changeset
   403
            DEBUG_API("<-XASnapshotItfAdaptation_CreateSnapshotPipeline - XA_RESULT_INTERNAL_ERROR");
hgs
parents:
diff changeset
   404
            return XA_RESULT_INTERNAL_ERROR;
hgs
parents:
diff changeset
   405
        }
hgs
parents:
diff changeset
   406
        gst_bus_add_signal_watch( mCtx->snapshotVars.ssbus );
hgs
parents:
diff changeset
   407
        g_signal_connect(mCtx->snapshotVars.ssbus, "message::eos",
hgs
parents:
diff changeset
   408
                G_CALLBACK(XASnapshotItfAdaptation_SnapshotBusCb), bCtx );
hgs
parents:
diff changeset
   409
        g_signal_connect(mCtx->snapshotVars.ssbus, "message::state-changed",
hgs
parents:
diff changeset
   410
                G_CALLBACK(XASnapshotItfAdaptation_SnapshotBusCb), bCtx );
hgs
parents:
diff changeset
   411
        g_signal_connect(mCtx->snapshotVars.ssbus, "message::async-done",
hgs
parents:
diff changeset
   412
                G_CALLBACK(XASnapshotItfAdaptation_SnapshotBusCb), bCtx );
hgs
parents:
diff changeset
   413
hgs
parents:
diff changeset
   414
        /*Create snapshotsource element*/
hgs
parents:
diff changeset
   415
        mCtx->snapshotVars.ssbuffersrc = gst_element_factory_make("appsrc", "ssbuffersrc");
hgs
parents:
diff changeset
   416
        if( !mCtx->snapshotVars.ssbuffersrc )
hgs
parents:
diff changeset
   417
        {
hgs
parents:
diff changeset
   418
            DEBUG_ERR("Cannot create ssbuffersrc!");
hgs
parents:
diff changeset
   419
            DEBUG_API("<-XASnapshotItfAdaptation_CreateSnapshotPipeline - XA_RESULT_INTERNAL_ERROR");
hgs
parents:
diff changeset
   420
            return XA_RESULT_INTERNAL_ERROR;
hgs
parents:
diff changeset
   421
        }
hgs
parents:
diff changeset
   422
        /*Frame parser*/
hgs
parents:
diff changeset
   423
        mCtx->snapshotVars.ssparser =
hgs
parents:
diff changeset
   424
            gst_element_factory_make("videoparse","ssparser");
hgs
parents:
diff changeset
   425
        if( !mCtx->snapshotVars.ssparser )
hgs
parents:
diff changeset
   426
        {
hgs
parents:
diff changeset
   427
            DEBUG_ERR("Could not create snapshotparse");
hgs
parents:
diff changeset
   428
            DEBUG_API("<-XASnapshotItfAdaptation_CreateSnapshotPipeline - XA_RESULT_INTERNAL_ERROR");
hgs
parents:
diff changeset
   429
            return XA_RESULT_INTERNAL_ERROR;
hgs
parents:
diff changeset
   430
        }
hgs
parents:
diff changeset
   431
hgs
parents:
diff changeset
   432
        /*Scaler and filter for XAImageSettings width&height*/
hgs
parents:
diff changeset
   433
        mCtx->snapshotVars.ssscaler =
hgs
parents:
diff changeset
   434
            gst_element_factory_make("videoscale","ssscaler");
hgs
parents:
diff changeset
   435
        if( !mCtx->snapshotVars.ssscaler )
hgs
parents:
diff changeset
   436
        {
hgs
parents:
diff changeset
   437
            DEBUG_ERR("Could not create ssscaler");
hgs
parents:
diff changeset
   438
            DEBUG_API("<-XASnapshotItfAdaptation_CreateSnapshotPipeline - XA_RESULT_INTERNAL_ERROR");
hgs
parents:
diff changeset
   439
            return XA_RESULT_INTERNAL_ERROR;
hgs
parents:
diff changeset
   440
        }
hgs
parents:
diff changeset
   441
        mCtx->snapshotVars.ssfilter =
hgs
parents:
diff changeset
   442
            gst_element_factory_make("capsfilter","ssfilter");
hgs
parents:
diff changeset
   443
        if( !mCtx->snapshotVars.ssfilter )
hgs
parents:
diff changeset
   444
        {
hgs
parents:
diff changeset
   445
            DEBUG_ERR("Could not create ssfilter");
hgs
parents:
diff changeset
   446
            DEBUG_API("<-XASnapshotItfAdaptation_CreateSnapshotPipeline - XA_RESULT_INTERNAL_ERROR");
hgs
parents:
diff changeset
   447
            return XA_RESULT_INTERNAL_ERROR;
hgs
parents:
diff changeset
   448
        }
hgs
parents:
diff changeset
   449
hgs
parents:
diff changeset
   450
        /*Create imageencoder */
hgs
parents:
diff changeset
   451
        if(XACapabilitiesMgr_GetCapsById(NULL, (XACapsType)(XACAP_ENCODER|XACAP_IMAGE), mCtx->imageEncSettings.encoderId, &temp) == XA_RESULT_SUCCESS)
hgs
parents:
diff changeset
   452
        {
hgs
parents:
diff changeset
   453
            if(temp.adaptId != NULL)
hgs
parents:
diff changeset
   454
            {
hgs
parents:
diff changeset
   455
                mCtx->snapshotVars.ssencoder = gst_element_factory_make((char*)temp.adaptId, "ssencoder");
hgs
parents:
diff changeset
   456
            }
hgs
parents:
diff changeset
   457
            else if(mCtx->imageEncSettings.encoderId == XA_IMAGECODEC_RAW)
hgs
parents:
diff changeset
   458
            {
hgs
parents:
diff changeset
   459
                /* raw frames are internal format, so no codec needed. just insert identity for linking*/
hgs
parents:
diff changeset
   460
               mCtx->snapshotVars.ssencoder = gst_element_factory_make("identity", "ssencoder");
hgs
parents:
diff changeset
   461
            }
hgs
parents:
diff changeset
   462
        }
hgs
parents:
diff changeset
   463
        if( !mCtx->snapshotVars.ssencoder )
hgs
parents:
diff changeset
   464
        {
hgs
parents:
diff changeset
   465
            DEBUG_API("Cannot create image encoder");
hgs
parents:
diff changeset
   466
            DEBUG_API("<-XASnapshotItfAdaptation_CreateSnapshotPipeline - XA_RESULT_INTERNAL_ERROR");
hgs
parents:
diff changeset
   467
            return XA_RESULT_INTERNAL_ERROR;
hgs
parents:
diff changeset
   468
        }
hgs
parents:
diff changeset
   469
hgs
parents:
diff changeset
   470
        /* Create also tag setter for JPG */
hgs
parents:
diff changeset
   471
        if(mCtx->imageEncSettings.encoderId == XA_IMAGECODEC_JPEG)
hgs
parents:
diff changeset
   472
        {
hgs
parents:
diff changeset
   473
            mCtx->snapshotVars.sstagger = gst_element_factory_make("metadatamux", "sstagger");
hgs
parents:
diff changeset
   474
            if( !mCtx->snapshotVars.sstagger || !gst_bin_add(GST_BIN(mCtx->snapshotVars.sspipeline),mCtx->snapshotVars.sstagger))
hgs
parents:
diff changeset
   475
            {
hgs
parents:
diff changeset
   476
                DEBUG_API("Cannot create metadatamux");
hgs
parents:
diff changeset
   477
                DEBUG_API("<-XASnapshotItfAdaptation_CreateSnapshotPipeline - XA_RESULT_INTERNAL_ERROR");
hgs
parents:
diff changeset
   478
            }
hgs
parents:
diff changeset
   479
            g_object_set( G_OBJECT(mCtx->snapshotVars.sstagger), "xmp", TRUE, "exif", TRUE, "iptc", TRUE, NULL );
hgs
parents:
diff changeset
   480
        }
hgs
parents:
diff changeset
   481
hgs
parents:
diff changeset
   482
        /*Create sink*/
hgs
parents:
diff changeset
   483
        if(mCtx->snapshotVars.fnametemplate)
hgs
parents:
diff changeset
   484
        {
hgs
parents:
diff changeset
   485
            DEBUG_INFO("RECORD SNAPSHOT TO FILE");
hgs
parents:
diff changeset
   486
            mCtx->snapshotVars.sssink = gst_element_factory_make("filesink","ssfilesink");
hgs
parents:
diff changeset
   487
            g_object_set( G_OBJECT(mCtx->snapshotVars.sssink), "location", "temp",
hgs
parents:
diff changeset
   488
                                                                "async", FALSE,
hgs
parents:
diff changeset
   489
                                                                "qos", FALSE,
hgs
parents:
diff changeset
   490
                                                                "max-lateness", (gint64)(-1),
hgs
parents:
diff changeset
   491
                                                                "buffer-mode", 2,
hgs
parents:
diff changeset
   492
                                                                NULL );
hgs
parents:
diff changeset
   493
        }
hgs
parents:
diff changeset
   494
        else
hgs
parents:
diff changeset
   495
        {
hgs
parents:
diff changeset
   496
            DEBUG_INFO("RECORD SNAPSHOT TO MEMORY");
hgs
parents:
diff changeset
   497
            mCtx->snapshotVars.sssink = gst_element_factory_make("appsink","ssbuffersink");
hgs
parents:
diff changeset
   498
        }
hgs
parents:
diff changeset
   499
        if( !mCtx->snapshotVars.sssink )
hgs
parents:
diff changeset
   500
        {
hgs
parents:
diff changeset
   501
            DEBUG_ERR("Could not create sssink!!");
hgs
parents:
diff changeset
   502
            DEBUG_API("<-XASnapshotItfAdaptation_CreateSnapshotPipeline - XA_RESULT_INTERNAL_ERROR");
hgs
parents:
diff changeset
   503
            return XA_RESULT_INTERNAL_ERROR;
hgs
parents:
diff changeset
   504
        }
hgs
parents:
diff changeset
   505
        g_object_set( G_OBJECT(mCtx->snapshotVars.sssink), "async", FALSE, NULL );
hgs
parents:
diff changeset
   506
hgs
parents:
diff changeset
   507
        /*Add elements to bin*/
hgs
parents:
diff changeset
   508
        gst_bin_add_many (GST_BIN (mCtx->snapshotVars.sspipeline),
hgs
parents:
diff changeset
   509
                mCtx->snapshotVars.ssbuffersrc,
hgs
parents:
diff changeset
   510
                mCtx->snapshotVars.ssparser,
hgs
parents:
diff changeset
   511
                mCtx->snapshotVars.ssscaler,
hgs
parents:
diff changeset
   512
                mCtx->snapshotVars.ssfilter,
hgs
parents:
diff changeset
   513
                mCtx->snapshotVars.ssencoder,
hgs
parents:
diff changeset
   514
                mCtx->snapshotVars.sssink,
hgs
parents:
diff changeset
   515
                NULL);
hgs
parents:
diff changeset
   516
hgs
parents:
diff changeset
   517
        /* set needed XAImageSettings properties*/
hgs
parents:
diff changeset
   518
        /* set caps from imagesettings */
hgs
parents:
diff changeset
   519
        imageCaps = gst_caps_new_simple("video/x-raw-yuv",
hgs
parents:
diff changeset
   520
                                        "width", G_TYPE_INT, mCtx->imageEncSettings.width,
hgs
parents:
diff changeset
   521
                                        "height", G_TYPE_INT, mCtx->imageEncSettings.height, NULL);
hgs
parents:
diff changeset
   522
        g_object_set( G_OBJECT(mCtx->snapshotVars.ssfilter), "caps", imageCaps, NULL );
hgs
parents:
diff changeset
   523
        DEBUG_INFO_A1("new caps: %s",gst_caps_to_string(imageCaps));
hgs
parents:
diff changeset
   524
        gst_caps_unref(imageCaps);
hgs
parents:
diff changeset
   525
hgs
parents:
diff changeset
   526
        /* set compression level */
hgs
parents:
diff changeset
   527
        if(mCtx->imageEncSettings.encoderId == XA_IMAGECODEC_JPEG)
hgs
parents:
diff changeset
   528
        {
hgs
parents:
diff changeset
   529
            g_object_set( G_OBJECT(mCtx->snapshotVars.ssencoder), "quality", (gint)(1000 - mCtx->imageEncSettings.compressionLevel)/10, NULL );
hgs
parents:
diff changeset
   530
        }
hgs
parents:
diff changeset
   531
hgs
parents:
diff changeset
   532
        /*Chain elements together*/
hgs
parents:
diff changeset
   533
        if(mCtx->snapshotVars.sstagger)
hgs
parents:
diff changeset
   534
        {
hgs
parents:
diff changeset
   535
            if( !gst_element_link_many(
hgs
parents:
diff changeset
   536
                    mCtx->snapshotVars.ssbuffersrc,
hgs
parents:
diff changeset
   537
                    mCtx->snapshotVars.ssparser,
hgs
parents:
diff changeset
   538
                    mCtx->snapshotVars.ssscaler,
hgs
parents:
diff changeset
   539
                    mCtx->snapshotVars.ssfilter,
hgs
parents:
diff changeset
   540
                    mCtx->snapshotVars.ssencoder,
hgs
parents:
diff changeset
   541
                    mCtx->snapshotVars.sstagger,
hgs
parents:
diff changeset
   542
                    mCtx->snapshotVars.sssink,
hgs
parents:
diff changeset
   543
                    NULL) )
hgs
parents:
diff changeset
   544
            {
hgs
parents:
diff changeset
   545
                DEBUG_ERR("Could not link pipeline")
hgs
parents:
diff changeset
   546
                return XA_RESULT_INTERNAL_ERROR;
hgs
parents:
diff changeset
   547
            }
hgs
parents:
diff changeset
   548
        }
hgs
parents:
diff changeset
   549
        else
hgs
parents:
diff changeset
   550
        {
hgs
parents:
diff changeset
   551
            if( !gst_element_link_many(
hgs
parents:
diff changeset
   552
                    mCtx->snapshotVars.ssbuffersrc,
hgs
parents:
diff changeset
   553
                    mCtx->snapshotVars.ssparser,
hgs
parents:
diff changeset
   554
                    mCtx->snapshotVars.ssscaler,
hgs
parents:
diff changeset
   555
                    mCtx->snapshotVars.ssfilter,
hgs
parents:
diff changeset
   556
                    mCtx->snapshotVars.ssencoder,
hgs
parents:
diff changeset
   557
                    mCtx->snapshotVars.sssink,
hgs
parents:
diff changeset
   558
                    NULL) )
hgs
parents:
diff changeset
   559
            {
hgs
parents:
diff changeset
   560
                DEBUG_ERR("Could not link pipeline")
hgs
parents:
diff changeset
   561
                return XA_RESULT_INTERNAL_ERROR;
hgs
parents:
diff changeset
   562
            }
hgs
parents:
diff changeset
   563
        }
hgs
parents:
diff changeset
   564
        gst_element_set_state(GST_ELEMENT(mCtx->snapshotVars.sspipeline), GST_STATE_READY);
hgs
parents:
diff changeset
   565
        DEBUG_API("<-XASnapshotItfAdaptation_CreateSnapshotPipeline");
hgs
parents:
diff changeset
   566
        return XA_RESULT_SUCCESS;
hgs
parents:
diff changeset
   567
hgs
parents:
diff changeset
   568
    }
hgs
parents:
diff changeset
   569
    else
hgs
parents:
diff changeset
   570
    {
hgs
parents:
diff changeset
   571
        DEBUG_ERR("XA_RESULT_PRECONDITIONS_VIOLATED");
hgs
parents:
diff changeset
   572
        DEBUG_API("<-XASnapshotItfAdaptation_CreateSnapshotPipeline");
hgs
parents:
diff changeset
   573
        return  XA_RESULT_PRECONDITIONS_VIOLATED;
hgs
parents:
diff changeset
   574
    }
hgs
parents:
diff changeset
   575
}
hgs
parents:
diff changeset
   576
hgs
parents:
diff changeset
   577
/*
hgs
parents:
diff changeset
   578
 * gboolean XASnapshotItfAdaptation_SnapshotBusCb( GstBus *bus, GstMessage *message, gpointer data )
hgs
parents:
diff changeset
   579
 */
hgs
parents:
diff changeset
   580
gboolean XASnapshotItfAdaptation_SnapshotBusCb( GstBus *bus, GstMessage *message, gpointer data )
hgs
parents:
diff changeset
   581
{
hgs
parents:
diff changeset
   582
    XAMediaRecorderAdaptationCtx* mCtx = (XAMediaRecorderAdaptationCtx*)data;
hgs
parents:
diff changeset
   583
hgs
parents:
diff changeset
   584
    GstState oldstate = GST_STATE_NULL , newstate = GST_STATE_NULL , pendingstate = GST_STATE_NULL;
hgs
parents:
diff changeset
   585
hgs
parents:
diff changeset
   586
    /* only interested in messages from snapshot pipeline */
hgs
parents:
diff changeset
   587
    if( GST_MESSAGE_SRC(message) == GST_OBJECT(mCtx->snapshotVars.sspipeline) )
hgs
parents:
diff changeset
   588
    {
hgs
parents:
diff changeset
   589
        DEBUG_API_A2("->XASnapshotItfAdaptation_SnapshotBusCb:\"%s\" from object \"%s\"",
hgs
parents:
diff changeset
   590
                GST_MESSAGE_TYPE_NAME(message), GST_OBJECT_NAME(GST_MESSAGE_SRC(message)));
hgs
parents:
diff changeset
   591
hgs
parents:
diff changeset
   592
        switch( GST_MESSAGE_TYPE(message))
hgs
parents:
diff changeset
   593
        {
hgs
parents:
diff changeset
   594
            case GST_MESSAGE_EOS:
hgs
parents:
diff changeset
   595
            {
hgs
parents:
diff changeset
   596
                if( gst_element_set_state(GST_ELEMENT(mCtx->snapshotVars.sspipeline), GST_STATE_READY)
hgs
parents:
diff changeset
   597
                        == GST_STATE_CHANGE_FAILURE )
hgs
parents:
diff changeset
   598
                {
hgs
parents:
diff changeset
   599
                    DEBUG_ERR("Error stopping snapshot pipeline!!!");
hgs
parents:
diff changeset
   600
                }
hgs
parents:
diff changeset
   601
                gst_element_get_state(mCtx->snapshotVars.sspipeline, NULL, NULL, XA_ADAPT_ASYNC_TIMEOUT_SHORT_NSEC);
hgs
parents:
diff changeset
   602
hgs
parents:
diff changeset
   603
                DEBUG_INFO_A2("Requested %lu snapshots, taked %lu",mCtx->snapshotVars.numpics,mCtx->snapshotVars.numpicstaken+1);
hgs
parents:
diff changeset
   604
                if( ++mCtx->snapshotVars.numpicstaken >= mCtx->snapshotVars.numpics )
hgs
parents:
diff changeset
   605
                {
hgs
parents:
diff changeset
   606
                    XAAdaptEvent takenevent = {XA_SNAPSHOTITFEVENTS, XA_ADAPT_SNAPSHOT_TAKEN, 0, NULL };
hgs
parents:
diff changeset
   607
                    DEBUG_INFO("Snapshot burst finished");
hgs
parents:
diff changeset
   608
                    XASnapshotItfAdaptation_StopSnapshotting(&(mCtx->baseObj));
hgs
parents:
diff changeset
   609
                    if( mCtx->snapshotVars.fnametemplate == NULL )
hgs
parents:
diff changeset
   610
                    {   /* non-datasink snapshot, return buffer */
hgs
parents:
diff changeset
   611
                        GstBuffer* pullBuffer = NULL;
hgs
parents:
diff changeset
   612
                        XADataSink* pullSink = NULL;
hgs
parents:
diff changeset
   613
                        XADataLocator_Address* pullSinkLoc = NULL;
hgs
parents:
diff changeset
   614
                        DEBUG_INFO("Get buffer from appsink");
hgs
parents:
diff changeset
   615
                        pullBuffer = gst_app_sink_pull_preroll( GST_APP_SINK(mCtx->snapshotVars.sssink) );
hgs
parents:
diff changeset
   616
                        /* allocate XADataSink, client should release this later*/
hgs
parents:
diff changeset
   617
                        pullSink = (XADataSink*)calloc(1, sizeof(XADataSink));
hgs
parents:
diff changeset
   618
                        pullSinkLoc = (XADataLocator_Address*)calloc(1, sizeof(XADataLocator_Address));
hgs
parents:
diff changeset
   619
                        pullSinkLoc->length = pullBuffer->size;
hgs
parents:
diff changeset
   620
                        pullSinkLoc->pAddress = (XADataLocator_Address*)calloc(1, pullBuffer->size);
hgs
parents:
diff changeset
   621
                        memcpy(pullSinkLoc->pAddress, pullBuffer->data, pullBuffer->size);
hgs
parents:
diff changeset
   622
                        pullSinkLoc->locatorType = XA_DATALOCATOR_ADDRESS;
hgs
parents:
diff changeset
   623
                        pullSink->pLocator = pullSinkLoc;
hgs
parents:
diff changeset
   624
                        pullSink->pFormat = NULL;
hgs
parents:
diff changeset
   625
                        takenevent.data = pullSink;
hgs
parents:
diff changeset
   626
                    }
hgs
parents:
diff changeset
   627
                    /* send needed events */
hgs
parents:
diff changeset
   628
                    takenevent.datasize = mCtx->snapshotVars.numpicstaken;
hgs
parents:
diff changeset
   629
                    XAAdaptationBase_SendAdaptEvents(&(mCtx->baseObj.baseObj), &takenevent );
hgs
parents:
diff changeset
   630
                }
hgs
parents:
diff changeset
   631
                else
hgs
parents:
diff changeset
   632
                {
hgs
parents:
diff changeset
   633
                    /* videoparse element can not handle renegotiation of stream for new buffer
hgs
parents:
diff changeset
   634
                     * after EOS, so recreate it */
hgs
parents:
diff changeset
   635
                    gst_element_unlink_many(
hgs
parents:
diff changeset
   636
                            mCtx->snapshotVars.ssbuffersrc,
hgs
parents:
diff changeset
   637
                            mCtx->snapshotVars.ssparser,
hgs
parents:
diff changeset
   638
                            mCtx->snapshotVars.ssscaler,
hgs
parents:
diff changeset
   639
                            NULL);
hgs
parents:
diff changeset
   640
                    gst_element_set_state(GST_ELEMENT(mCtx->snapshotVars.ssparser), GST_STATE_NULL);
hgs
parents:
diff changeset
   641
                    gst_bin_remove(GST_BIN (mCtx->snapshotVars.sspipeline),mCtx->snapshotVars.ssparser);
hgs
parents:
diff changeset
   642
                    mCtx->snapshotVars.ssparser = gst_element_factory_make("videoparse", "ssparser");
hgs
parents:
diff changeset
   643
                    if( !mCtx->snapshotVars.ssparser )
hgs
parents:
diff changeset
   644
                    {
hgs
parents:
diff changeset
   645
                        DEBUG_ERR("Cannot create ssparser!");
hgs
parents:
diff changeset
   646
                        DEBUG_API("<-XASnapshotItfAdaptation_CreateSnapshotPipeline - XA_RESULT_INTERNAL_ERROR");
hgs
parents:
diff changeset
   647
                        return XA_RESULT_INTERNAL_ERROR;
hgs
parents:
diff changeset
   648
                    }
hgs
parents:
diff changeset
   649
                    gst_bin_add(GST_BIN (mCtx->snapshotVars.sspipeline),mCtx->snapshotVars.ssparser);
hgs
parents:
diff changeset
   650
                    if( !gst_element_link_many(
hgs
parents:
diff changeset
   651
                            mCtx->snapshotVars.ssbuffersrc,
hgs
parents:
diff changeset
   652
                            mCtx->snapshotVars.ssparser,
hgs
parents:
diff changeset
   653
                            mCtx->snapshotVars.ssscaler,
hgs
parents:
diff changeset
   654
                            NULL) )
hgs
parents:
diff changeset
   655
                    {
hgs
parents:
diff changeset
   656
                        DEBUG_ERR("Could not link pipeline")
hgs
parents:
diff changeset
   657
                        return XA_RESULT_INTERNAL_ERROR;
hgs
parents:
diff changeset
   658
                    }
hgs
parents:
diff changeset
   659
                    mCtx->snapshotVars.parsenegotiated = FALSE;
hgs
parents:
diff changeset
   660
hgs
parents:
diff changeset
   661
                    /*now, wait for new buffer to arrive*/
hgs
parents:
diff changeset
   662
                    DEBUG_INFO("Wait for more pictures");
hgs
parents:
diff changeset
   663
                    mCtx->snapshotVars.waitforbuffer = TRUE;
hgs
parents:
diff changeset
   664
                    mCtx->snapshotVars.sighandler = g_signal_connect(mCtx->videoextract, "handoff",
hgs
parents:
diff changeset
   665
                                            G_CALLBACK (XASnapshotItfAdaptation_BufferHandoffCb),mCtx);
hgs
parents:
diff changeset
   666
                }
hgs
parents:
diff changeset
   667
                break;
hgs
parents:
diff changeset
   668
            }
hgs
parents:
diff changeset
   669
            case GST_MESSAGE_STATE_CHANGED:
hgs
parents:
diff changeset
   670
            {
hgs
parents:
diff changeset
   671
                gst_message_parse_state_changed(message, &oldstate, &newstate, &pendingstate);
hgs
parents:
diff changeset
   672
                DEBUG_INFO_A4("old %s -> new %s ( pending %s, gsttarget %s )",
hgs
parents:
diff changeset
   673
                        gst_element_state_get_name(oldstate),
hgs
parents:
diff changeset
   674
                        gst_element_state_get_name(newstate),
hgs
parents:
diff changeset
   675
                        gst_element_state_get_name(pendingstate),
hgs
parents:
diff changeset
   676
                        gst_element_state_get_name(GST_STATE_TARGET(mCtx->snapshotVars.sspipeline)) );
hgs
parents:
diff changeset
   677
                if( newstate==GST_STATE_READY && oldstate==GST_STATE_NULL )
hgs
parents:
diff changeset
   678
                {
hgs
parents:
diff changeset
   679
                    XAAdaptEvent initevent = {XA_SNAPSHOTITFEVENTS, XA_ADAPT_SNAPSHOT_INITIATED,0, NULL };
hgs
parents:
diff changeset
   680
                    DEBUG_INFO("Init complete");
hgs
parents:
diff changeset
   681
                    /* send needed events */
hgs
parents:
diff changeset
   682
                    XAAdaptationBase_SendAdaptEvents( &(mCtx->baseObj.baseObj), &initevent);
hgs
parents:
diff changeset
   683
                }
hgs
parents:
diff changeset
   684
                else if( newstate==GST_STATE_PLAYING && oldstate==GST_STATE_PAUSED && mCtx->snapshotVars.snapshotbuffer )
hgs
parents:
diff changeset
   685
                {
hgs
parents:
diff changeset
   686
                    DEBUG_INFO("Pushing buffer");
hgs
parents:
diff changeset
   687
                    gst_app_src_push_buffer( GST_APP_SRC(mCtx->snapshotVars.ssbuffersrc),
hgs
parents:
diff changeset
   688
                                             mCtx->snapshotVars.snapshotbuffer );
hgs
parents:
diff changeset
   689
                    DEBUG_INFO_A1("Sent buffer at 0x%x to  ssbuffersrc", (int)mCtx->snapshotVars.snapshotbuffer );
hgs
parents:
diff changeset
   690
                    gst_app_src_end_of_stream( GST_APP_SRC(mCtx->snapshotVars.ssbuffersrc) );
hgs
parents:
diff changeset
   691
                    mCtx->snapshotVars.snapshotbuffer = NULL;
hgs
parents:
diff changeset
   692
                    DEBUG_INFO("Sent EOS ssbuffersrc");
hgs
parents:
diff changeset
   693
                }
hgs
parents:
diff changeset
   694
hgs
parents:
diff changeset
   695
                break;
hgs
parents:
diff changeset
   696
            }
hgs
parents:
diff changeset
   697
            default:
hgs
parents:
diff changeset
   698
                break;
hgs
parents:
diff changeset
   699
        }
hgs
parents:
diff changeset
   700
        DEBUG_API("<-XASnapshotItfAdaptation_SnapshotBusCb");
hgs
parents:
diff changeset
   701
    }
hgs
parents:
diff changeset
   702
    return TRUE;
hgs
parents:
diff changeset
   703
}
hgs
parents:
diff changeset
   704
hgs
parents:
diff changeset
   705
/*
hgs
parents:
diff changeset
   706
 * void XASnapshotItfAdaptation_BufferHandoffCb( GstElement *extract, GstBuffer  *buffer, gpointer data )
hgs
parents:
diff changeset
   707
 */
hgs
parents:
diff changeset
   708
void XASnapshotItfAdaptation_BufferHandoffCb( GstElement *extract, GstBuffer  *buffer, gpointer data )
hgs
parents:
diff changeset
   709
{
hgs
parents:
diff changeset
   710
    XAMediaRecorderAdaptationCtx* mCtx = (XAMediaRecorderAdaptationCtx*)data;
hgs
parents:
diff changeset
   711
    gint32 width=0, height=0;
hgs
parents:
diff changeset
   712
    guint32  fourcc=0, formatnum=0;
hgs
parents:
diff changeset
   713
    GstPad* srcPad=NULL;
hgs
parents:
diff changeset
   714
    GstCaps* srcPadCaps=NULL;
hgs
parents:
diff changeset
   715
    GstStructure* capS=NULL;
hgs
parents:
diff changeset
   716
    XAAdaptEvent event = {XA_SNAPSHOTITFEVENTS, XA_ADAPT_SNAPSHOT_TAKEN, 0, NULL };
hgs
parents:
diff changeset
   717
    char* fname=NULL;
hgs
parents:
diff changeset
   718
hgs
parents:
diff changeset
   719
    DEBUG_API("->XASnapshotItfAdaptation_BufferHandoffCb");
hgs
parents:
diff changeset
   720
    if( !mCtx->snapshotVars.waitforbuffer ||
hgs
parents:
diff changeset
   721
        !GST_IS_BUFFER(buffer) )
hgs
parents:
diff changeset
   722
    {   /* pass on... */
hgs
parents:
diff changeset
   723
        DEBUG_API("<-XASnapshotItfAdaptation_BufferHandoffCb");
hgs
parents:
diff changeset
   724
        return;
hgs
parents:
diff changeset
   725
    }
hgs
parents:
diff changeset
   726
hgs
parents:
diff changeset
   727
    if(mCtx->snapshotVars.snapshotbuffer)
hgs
parents:
diff changeset
   728
    {
hgs
parents:
diff changeset
   729
        DEBUG_INFO("WARNING: snapshotbuffer already exists!!");
hgs
parents:
diff changeset
   730
        gst_buffer_unref(GST_BUFFER(mCtx->snapshotVars.snapshotbuffer));
hgs
parents:
diff changeset
   731
    }
hgs
parents:
diff changeset
   732
    DEBUG_INFO("Receiced snapshotbuffer");
hgs
parents:
diff changeset
   733
    mCtx->snapshotVars.snapshotbuffer = gst_buffer_copy(buffer);
hgs
parents:
diff changeset
   734
    mCtx->snapshotVars.waitforbuffer = FALSE;
hgs
parents:
diff changeset
   735
    g_signal_handler_disconnect(mCtx->videoextract,mCtx->snapshotVars.sighandler);
hgs
parents:
diff changeset
   736
    mCtx->snapshotVars.sighandler = 0;
hgs
parents:
diff changeset
   737
hgs
parents:
diff changeset
   738
    if( GST_STATE(mCtx->snapshotVars.sspipeline)==GST_STATE_READY )
hgs
parents:
diff changeset
   739
    {
hgs
parents:
diff changeset
   740
        if( !(mCtx->snapshotVars.parsenegotiated) )
hgs
parents:
diff changeset
   741
        {
hgs
parents:
diff changeset
   742
            /*read relevant caps of extraction source and set them to videoparse*/
hgs
parents:
diff changeset
   743
            srcPad = gst_element_get_pad( GST_ELEMENT(extract), "src");
hgs
parents:
diff changeset
   744
            srcPadCaps = gst_pad_get_negotiated_caps( GST_PAD(srcPad) );
hgs
parents:
diff changeset
   745
            capS = gst_caps_get_structure(srcPadCaps,0);
hgs
parents:
diff changeset
   746
            DEBUG_INFO_A1("buffer caps from extraction source: %s",gst_caps_to_string(srcPadCaps));
hgs
parents:
diff changeset
   747
            if( !gst_structure_get_int(capS,"width",&width) ||
hgs
parents:
diff changeset
   748
                !gst_structure_get_int(capS,"height",&height) ||
hgs
parents:
diff changeset
   749
                !gst_structure_get_fourcc(capS,"format",&fourcc) )
hgs
parents:
diff changeset
   750
            {
hgs
parents:
diff changeset
   751
                DEBUG_ERR("ERROR! Missing crucial capabilities for buffer!!");
hgs
parents:
diff changeset
   752
                DEBUG_API("<-XASnapshotItfAdaptation_BufferHandoffCb");
hgs
parents:
diff changeset
   753
                return;
hgs
parents:
diff changeset
   754
            }
hgs
parents:
diff changeset
   755
            /* convert fourcc to videoparse enumeration */
hgs
parents:
diff changeset
   756
            switch(fourcc)
hgs
parents:
diff changeset
   757
            {
hgs
parents:
diff changeset
   758
                case GST_MAKE_FOURCC('I','4','2','0'):
hgs
parents:
diff changeset
   759
                    formatnum = 0;
hgs
parents:
diff changeset
   760
                    break;
hgs
parents:
diff changeset
   761
                case GST_MAKE_FOURCC('Y','V','1','2'):
hgs
parents:
diff changeset
   762
                    formatnum = 1;
hgs
parents:
diff changeset
   763
                    break;
hgs
parents:
diff changeset
   764
                case GST_MAKE_FOURCC('Y','U','Y','2'):
hgs
parents:
diff changeset
   765
                    formatnum = 2;
hgs
parents:
diff changeset
   766
                    break;
hgs
parents:
diff changeset
   767
                case GST_MAKE_FOURCC('U','Y','V','Y'):
hgs
parents:
diff changeset
   768
                    formatnum = 3;
hgs
parents:
diff changeset
   769
                    break;
hgs
parents:
diff changeset
   770
                case GST_MAKE_FOURCC('R','G','B',' '):
hgs
parents:
diff changeset
   771
                    formatnum = 10;
hgs
parents:
diff changeset
   772
                    break;
hgs
parents:
diff changeset
   773
                case GST_MAKE_FOURCC('G','R','A','Y'):
hgs
parents:
diff changeset
   774
                    formatnum = 11;
hgs
parents:
diff changeset
   775
                    break;
hgs
parents:
diff changeset
   776
                default:
hgs
parents:
diff changeset
   777
                    formatnum = 0;
hgs
parents:
diff changeset
   778
                    break;
hgs
parents:
diff changeset
   779
            }
hgs
parents:
diff changeset
   780
            /* set source width and height for parser */
hgs
parents:
diff changeset
   781
            g_object_set(mCtx->snapshotVars.ssparser,"width",width,"height",height,"format",formatnum,NULL);
hgs
parents:
diff changeset
   782
            mCtx->snapshotVars.parsenegotiated = TRUE;
hgs
parents:
diff changeset
   783
        }
hgs
parents:
diff changeset
   784
        if(mCtx->snapshotVars.fnametemplate)
hgs
parents:
diff changeset
   785
        {   /* get actual filename from template */
hgs
parents:
diff changeset
   786
            XASnapshotItfAdaptation_AllocNextFilename(&fname, mCtx->snapshotVars.fnametemplate);
hgs
parents:
diff changeset
   787
            DEBUG_INFO_A1("start taking snapshot (%s)", fname);
hgs
parents:
diff changeset
   788
            gst_element_set_state(GST_ELEMENT(mCtx->snapshotVars.sssink), GST_STATE_NULL);
hgs
parents:
diff changeset
   789
            g_object_set( G_OBJECT(mCtx->snapshotVars.sssink), "location", fname,
hgs
parents:
diff changeset
   790
                                                                "async", FALSE,
hgs
parents:
diff changeset
   791
                                                                "qos", FALSE,
hgs
parents:
diff changeset
   792
                                                                "max-lateness", (gint64)(-1),
hgs
parents:
diff changeset
   793
                                                                NULL );
hgs
parents:
diff changeset
   794
            gst_element_sync_state_with_parent(mCtx->snapshotVars.sssink);
hgs
parents:
diff changeset
   795
            gst_element_get_state(mCtx->snapshotVars.sssink, NULL, NULL, XA_ADAPT_ASYNC_TIMEOUT_SHORT_NSEC);
hgs
parents:
diff changeset
   796
            free(fname);
hgs
parents:
diff changeset
   797
        }
hgs
parents:
diff changeset
   798
        else
hgs
parents:
diff changeset
   799
        {   /* take snapshot to buffer */
hgs
parents:
diff changeset
   800
            DEBUG_INFO("start taking snapshot (memory buffer used)");
hgs
parents:
diff changeset
   801
        }
hgs
parents:
diff changeset
   802
        /* write metadata, if any */
hgs
parents:
diff changeset
   803
        XAMetadataAdapt_TryWriteTags(&(mCtx->baseObj), GST_BIN(mCtx->snapshotVars.sspipeline));
hgs
parents:
diff changeset
   804
        /* start buffering */
hgs
parents:
diff changeset
   805
        if( gst_element_set_state(GST_ELEMENT(mCtx->snapshotVars.sspipeline), GST_STATE_PLAYING )
hgs
parents:
diff changeset
   806
                == GST_STATE_CHANGE_FAILURE )
hgs
parents:
diff changeset
   807
        {
hgs
parents:
diff changeset
   808
            DEBUG_ERR("Error taking picture!!!");
hgs
parents:
diff changeset
   809
            /* NOTE: no event for errors in snapshotitf!!! */
hgs
parents:
diff changeset
   810
            event.datasize = mCtx->snapshotVars.numpicstaken;
hgs
parents:
diff changeset
   811
            XAAdaptationBase_SendAdaptEvents(&(mCtx->baseObj.baseObj), &event );
hgs
parents:
diff changeset
   812
        }
hgs
parents:
diff changeset
   813
    }
hgs
parents:
diff changeset
   814
    else
hgs
parents:
diff changeset
   815
    {
hgs
parents:
diff changeset
   816
        DEBUG_INFO_A1("warning: sspipeline in wrong state (%d)",
hgs
parents:
diff changeset
   817
                        GST_STATE(mCtx->snapshotVars.sspipeline));
hgs
parents:
diff changeset
   818
    }
hgs
parents:
diff changeset
   819
    DEBUG_API("<-XASnapshotItfAdaptation_BufferHandoffCb");
hgs
parents:
diff changeset
   820
}
hgs
parents:
diff changeset
   821
hgs
parents:
diff changeset
   822
/*
hgs
parents:
diff changeset
   823
 * const char* XASnapshotItfAdaptation_GetFileSuffix(XADataFormat_MIME* format)
hgs
parents:
diff changeset
   824
 */
hgs
parents:
diff changeset
   825
const char* XASnapshotItfAdaptation_GetFileSuffix(XADataFormat_MIME* format)
hgs
parents:
diff changeset
   826
{
hgs
parents:
diff changeset
   827
    const char* ret=NULL;
hgs
parents:
diff changeset
   828
    if( format )
hgs
parents:
diff changeset
   829
    {
hgs
parents:
diff changeset
   830
        if( *(XAuint32*)format == XA_DATAFORMAT_MIME )
hgs
parents:
diff changeset
   831
        {
hgs
parents:
diff changeset
   832
            switch (format->containerType)
hgs
parents:
diff changeset
   833
            {
hgs
parents:
diff changeset
   834
                case XA_CONTAINERTYPE_JPG:
hgs
parents:
diff changeset
   835
                    ret = "jpg";
hgs
parents:
diff changeset
   836
                    break;
hgs
parents:
diff changeset
   837
                case XA_CONTAINERTYPE_RAW:
hgs
parents:
diff changeset
   838
                    ret = "raw";
hgs
parents:
diff changeset
   839
                    break;
hgs
parents:
diff changeset
   840
                case XA_CONTAINERTYPE_BMP:
hgs
parents:
diff changeset
   841
                    ret = "bmp";
hgs
parents:
diff changeset
   842
                    break;
hgs
parents:
diff changeset
   843
                default:
hgs
parents:
diff changeset
   844
                    break;
hgs
parents:
diff changeset
   845
            }
hgs
parents:
diff changeset
   846
            if(!ret)
hgs
parents:
diff changeset
   847
            { /*parse from mimetype*/
hgs
parents:
diff changeset
   848
                if(format->mimeType)
hgs
parents:
diff changeset
   849
                {
hgs
parents:
diff changeset
   850
                    ret = strrchr((char*)format->mimeType,'/');
hgs
parents:
diff changeset
   851
                    if (ret)
hgs
parents:
diff changeset
   852
                    {
hgs
parents:
diff changeset
   853
                        ret++;
hgs
parents:
diff changeset
   854
                    }
hgs
parents:
diff changeset
   855
                }
hgs
parents:
diff changeset
   856
            }
hgs
parents:
diff changeset
   857
        }
hgs
parents:
diff changeset
   858
        else if( *(XAuint32*)format == XA_DATAFORMAT_RAWIMAGE )
hgs
parents:
diff changeset
   859
        {
hgs
parents:
diff changeset
   860
            ret = "raw";
hgs
parents:
diff changeset
   861
        }
hgs
parents:
diff changeset
   862
    }
hgs
parents:
diff changeset
   863
    if(!ret)
hgs
parents:
diff changeset
   864
    {
hgs
parents:
diff changeset
   865
        ret="jpg"; /*default*/
hgs
parents:
diff changeset
   866
    }
hgs
parents:
diff changeset
   867
    return ret;
hgs
parents:
diff changeset
   868
}
hgs
parents:
diff changeset
   869
hgs
parents:
diff changeset
   870
/*
hgs
parents:
diff changeset
   871
 * void XASnapshotItfAdaptation_AllocNextFilename(char** fname, const char* template)
hgs
parents:
diff changeset
   872
 */
hgs
parents:
diff changeset
   873
void XASnapshotItfAdaptation_AllocNextFilename(char** fname, const char* template)
hgs
parents:
diff changeset
   874
{
hgs
parents:
diff changeset
   875
    XAuint32 idx=0;
hgs
parents:
diff changeset
   876
    XAboolean found=XA_BOOLEAN_FALSE;
hgs
parents:
diff changeset
   877
    FILE* file=NULL;
hgs
parents:
diff changeset
   878
    *fname = (char*)calloc(1,strlen(template)+10);
hgs
parents:
diff changeset
   879
    while(!found)
hgs
parents:
diff changeset
   880
    {
hgs
parents:
diff changeset
   881
        sprintf(*fname, template, idx++ );
hgs
parents:
diff changeset
   882
        strcat(*fname, "\0");
hgs
parents:
diff changeset
   883
        file = fopen(*fname, "r");
hgs
parents:
diff changeset
   884
        if(file==NULL)
hgs
parents:
diff changeset
   885
        {
hgs
parents:
diff changeset
   886
            found = XA_BOOLEAN_TRUE;
hgs
parents:
diff changeset
   887
            break;
hgs
parents:
diff changeset
   888
        }
hgs
parents:
diff changeset
   889
        fclose(file);
hgs
parents:
diff changeset
   890
    }
hgs
parents:
diff changeset
   891
}