khronosfws/openmax_al/src/gst_adaptation/xaadaptationgst.c
author hgs
Fri, 28 May 2010 19:26:28 -0500
changeset 21 2ed61feeead6
parent 19 4a629bc82c5e
child 25 6f7ceef7b1d1
permissions -rw-r--r--
201021
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 <assert.h>
hgs
parents:
diff changeset
    19
#include <string.h>
hgs
parents:
diff changeset
    20
#include "gst/gst.h"
hgs
parents:
diff changeset
    21
#include "gst/gstbuffer.h"
hgs
parents:
diff changeset
    22
#include "gst/app/gstappsrc.h"
hgs
parents:
diff changeset
    23
#include "xaobjectitf.h"
hgs
parents:
diff changeset
    24
#include "xacameradevice.h"
hgs
parents:
diff changeset
    25
#include "xaradiodevice.h"
hgs
parents:
diff changeset
    26
#include "xaoutputmix.h"
hgs
parents:
diff changeset
    27
#include "xamediaplayeradaptctx.h"
hgs
parents:
diff changeset
    28
#include "xacameraadaptctx.h"
hgs
parents:
diff changeset
    29
#include <stdlib.h>
21
hgs
parents: 19
diff changeset
    30
hgs
parents: 19
diff changeset
    31
#ifdef OMAX_CAMERABIN
19
hgs
parents:
diff changeset
    32
extern XAboolean cameraRealized;
21
hgs
parents: 19
diff changeset
    33
19
hgs
parents:
diff changeset
    34
extern XACameraAdaptationCtx_* cameraCtx;
21
hgs
parents: 19
diff changeset
    35
#else
hgs
parents: 19
diff changeset
    36
XAboolean cameraRealized = XA_BOOLEAN_FALSE;
hgs
parents: 19
diff changeset
    37
XACameraAdaptationCtx_* cameraCtx = NULL;
hgs
parents: 19
diff changeset
    38
#endif
19
hgs
parents:
diff changeset
    39
/*
hgs
parents:
diff changeset
    40
 * XAAdaptationGstCtx* XAAdaptationGst_Create()
hgs
parents:
diff changeset
    41
 * 1st phase initialization function for Adaptation Base context structure.
hgs
parents:
diff changeset
    42
 * Reserves memory for base context and initializes GStreamer FW.
hgs
parents:
diff changeset
    43
 */
hgs
parents:
diff changeset
    44
XAresult XAAdaptationGst_Init( XAAdaptationGstCtx* pSelf, XAuint32 ctxId )
hgs
parents:
diff changeset
    45
{
hgs
parents:
diff changeset
    46
    DEBUG_API("->XAAdaptationGst_Init");
hgs
parents:
diff changeset
    47
hgs
parents:
diff changeset
    48
    if ( pSelf )
hgs
parents:
diff changeset
    49
    {
hgs
parents:
diff changeset
    50
        if(XAAdaptationBase_Init(&(pSelf->baseObj), ctxId) != XA_RESULT_SUCCESS)
hgs
parents:
diff changeset
    51
            {
hgs
parents:
diff changeset
    52
            DEBUG_ERR("Failed to init base context!!!");
hgs
parents:
diff changeset
    53
            free(pSelf);
hgs
parents:
diff changeset
    54
            pSelf = NULL;
hgs
parents:
diff changeset
    55
            }
hgs
parents:
diff changeset
    56
        else
hgs
parents:
diff changeset
    57
            {
hgs
parents:
diff changeset
    58
            GError* gerror = 0;
hgs
parents:
diff changeset
    59
    
hgs
parents:
diff changeset
    60
    /*         Add default handler for Gst-bus messages */
hgs
parents:
diff changeset
    61
            pSelf->busCb = XAAdaptationGst_GstBusCb;
hgs
parents:
diff changeset
    62
    
hgs
parents:
diff changeset
    63
            // VASU MOD BEGINS
hgs
parents:
diff changeset
    64
            pSelf->cond_mutx_inited = XA_BOOLEAN_FALSE;
hgs
parents:
diff changeset
    65
            // VASU MOD ENDS
hgs
parents:
diff changeset
    66
    
hgs
parents:
diff changeset
    67
            sem_init(&(pSelf->semAsyncWait),0,0);
hgs
parents:
diff changeset
    68
    
hgs
parents:
diff changeset
    69
    
hgs
parents:
diff changeset
    70
            if ( !gst_init_check( NULL, NULL, &gerror ) )
hgs
parents:
diff changeset
    71
                {
hgs
parents:
diff changeset
    72
                    DEBUG_ERR("Gst Initalization failure.");
hgs
parents:
diff changeset
    73
                    return XA_RESULT_INTERNAL_ERROR;
hgs
parents:
diff changeset
    74
                }
hgs
parents:
diff changeset
    75
        
hgs
parents:
diff changeset
    76
            }
hgs
parents:
diff changeset
    77
    }
hgs
parents:
diff changeset
    78
    else
hgs
parents:
diff changeset
    79
    {
hgs
parents:
diff changeset
    80
        DEBUG_ERR("Invalid Gst Base Context.")
hgs
parents:
diff changeset
    81
        return XA_RESULT_PARAMETER_INVALID;
hgs
parents:
diff changeset
    82
    }
hgs
parents:
diff changeset
    83
hgs
parents:
diff changeset
    84
    DEBUG_API("<-XAAdaptationGst_Init");
hgs
parents:
diff changeset
    85
    return XA_RESULT_SUCCESS;
hgs
parents:
diff changeset
    86
}
hgs
parents:
diff changeset
    87
hgs
parents:
diff changeset
    88
/*
hgs
parents:
diff changeset
    89
 * XAresult XAAdaptationGst_PostInit()
hgs
parents:
diff changeset
    90
 * 2nd phase initialization for Adaptation Base.
hgs
parents:
diff changeset
    91
 */
hgs
parents:
diff changeset
    92
XAresult XAAdaptationGst_PostInit( XAAdaptationGstCtx* ctx )
hgs
parents:
diff changeset
    93
{
hgs
parents:
diff changeset
    94
    XAresult ret = XA_RESULT_SUCCESS;
hgs
parents:
diff changeset
    95
    DEBUG_API("->XAAdaptationGst_PostInit");
hgs
parents:
diff changeset
    96
    // VASU MOD BEGINS
hgs
parents:
diff changeset
    97
    XAAdaptationBase_PostInit(&ctx->baseObj);
hgs
parents:
diff changeset
    98
    
hgs
parents:
diff changeset
    99
    ctx->thread_launched = XA_BOOLEAN_FALSE;
hgs
parents:
diff changeset
   100
    pthread_mutex_init(&(ctx->ds_mutex), NULL);
hgs
parents:
diff changeset
   101
    pthread_cond_init(&(ctx->ds_condition), NULL);
hgs
parents:
diff changeset
   102
    ctx->cond_mutx_inited = XA_BOOLEAN_TRUE;
hgs
parents:
diff changeset
   103
    
hgs
parents:
diff changeset
   104
    
hgs
parents:
diff changeset
   105
    // VASU MOD ENDS
hgs
parents:
diff changeset
   106
    DEBUG_API("<-XAAdaptationGst_PostInit");
hgs
parents:
diff changeset
   107
    return ret;
hgs
parents:
diff changeset
   108
}
hgs
parents:
diff changeset
   109
hgs
parents:
diff changeset
   110
/*
hgs
parents:
diff changeset
   111
 * void XAAdaptationGst_Free( XAAdaptationGstCtx* ctx )
hgs
parents:
diff changeset
   112
 * Frees all Base context variables .
hgs
parents:
diff changeset
   113
 */
hgs
parents:
diff changeset
   114
void XAAdaptationGst_Free( XAAdaptationGstCtx* ctx )
hgs
parents:
diff changeset
   115
{
hgs
parents:
diff changeset
   116
	GstElement* fakesink = NULL;
hgs
parents:
diff changeset
   117
    DEBUG_API("->XAAdaptationGst_Free");
hgs
parents:
diff changeset
   118
hgs
parents:
diff changeset
   119
    if ( ctx->bin )
hgs
parents:
diff changeset
   120
    {
hgs
parents:
diff changeset
   121
    	fakesink = gst_bin_get_by_name(GST_BIN(ctx->bin), "fakesink");
hgs
parents:
diff changeset
   122
		if ( fakesink )
hgs
parents:
diff changeset
   123
		{
hgs
parents:
diff changeset
   124
			gst_element_set_state( GST_ELEMENT(fakesink), GST_STATE_NULL);
hgs
parents:
diff changeset
   125
			gst_object_unref(fakesink);
hgs
parents:
diff changeset
   126
		}
hgs
parents:
diff changeset
   127
hgs
parents:
diff changeset
   128
        if ( gst_element_set_state(GST_ELEMENT(ctx->bin), GST_STATE_NULL )!=GST_STATE_CHANGE_SUCCESS )
hgs
parents:
diff changeset
   129
        {   /*not much we can do*/
hgs
parents:
diff changeset
   130
            DEBUG_ERR("WARNING: Failed to change to NULL state before deletion!!")
hgs
parents:
diff changeset
   131
        }
hgs
parents:
diff changeset
   132
    }
hgs
parents:
diff changeset
   133
hgs
parents:
diff changeset
   134
    if(ctx->asynctimer)
hgs
parents:
diff changeset
   135
    {   /*cancel timer*/
hgs
parents:
diff changeset
   136
        g_source_remove(ctx->asynctimer);
hgs
parents:
diff changeset
   137
    }
hgs
parents:
diff changeset
   138
    sem_post(&(ctx->semAsyncWait));
hgs
parents:
diff changeset
   139
    sem_destroy(&(ctx->semAsyncWait));
hgs
parents:
diff changeset
   140
hgs
parents:
diff changeset
   141
    XAAdaptationGst_StopGstListener(ctx);
hgs
parents:
diff changeset
   142
hgs
parents:
diff changeset
   143
    if ( ctx->bin )
hgs
parents:
diff changeset
   144
    {
hgs
parents:
diff changeset
   145
        gst_object_unref(ctx->bin);
hgs
parents:
diff changeset
   146
    }
hgs
parents:
diff changeset
   147
hgs
parents:
diff changeset
   148
    //g_array_free(ctx->evtHdlrs, TRUE);
hgs
parents:
diff changeset
   149
    // VASU MOD BEGINS
hgs
parents:
diff changeset
   150
    if (ctx->cond_mutx_inited == XA_BOOLEAN_TRUE)
hgs
parents:
diff changeset
   151
        {
hgs
parents:
diff changeset
   152
        ctx->thread_launched = XA_BOOLEAN_FALSE;
hgs
parents:
diff changeset
   153
        pthread_mutex_destroy(&(ctx->ds_mutex));
hgs
parents:
diff changeset
   154
        pthread_cond_destroy(&(ctx->ds_condition));
hgs
parents:
diff changeset
   155
        ctx->cond_mutx_inited = XA_BOOLEAN_FALSE;
hgs
parents:
diff changeset
   156
        }
hgs
parents:
diff changeset
   157
    // VASU MOD ENDS
hgs
parents:
diff changeset
   158
    XAAdaptationBase_Free(&ctx->baseObj);
hgs
parents:
diff changeset
   159
    
hgs
parents:
diff changeset
   160
    DEBUG_API("<-XAAdaptationGst_Free");
hgs
parents:
diff changeset
   161
}
hgs
parents:
diff changeset
   162
hgs
parents:
diff changeset
   163
hgs
parents:
diff changeset
   164
/*
hgs
parents:
diff changeset
   165
 * gboolean XAAdaptationBase_GstBusCb( GstBus *bus, GstMessage *message, gpointer data )
hgs
parents:
diff changeset
   166
 * Default Gst-bus message handler (Callback)
hgs
parents:
diff changeset
   167
 */
hgs
parents:
diff changeset
   168
gboolean XAAdaptationGst_GstBusCb( GstBus *bus, GstMessage *message, gpointer data )
hgs
parents:
diff changeset
   169
{
hgs
parents:
diff changeset
   170
    GError *error;
hgs
parents:
diff changeset
   171
    gchar *debug;
hgs
parents:
diff changeset
   172
    DEBUG_API("->XAAdaptationGst_GstBusCb");
hgs
parents:
diff changeset
   173
    DEBUG_INFO_A2("Received Gst callback \"%s\" from \"%s\"",
hgs
parents:
diff changeset
   174
                    GST_MESSAGE_TYPE_NAME(message),
hgs
parents:
diff changeset
   175
                    GST_OBJECT_NAME(GST_MESSAGE_SRC(message)));
hgs
parents:
diff changeset
   176
hgs
parents:
diff changeset
   177
    switch( GST_MESSAGE_TYPE(message))
hgs
parents:
diff changeset
   178
    {
hgs
parents:
diff changeset
   179
        case GST_MESSAGE_ERROR:
hgs
parents:
diff changeset
   180
            gst_message_parse_error( message, &error, &debug );
hgs
parents:
diff changeset
   181
            DEBUG_INFO_A1("%s", debug);
hgs
parents:
diff changeset
   182
            break;
hgs
parents:
diff changeset
   183
        case GST_MESSAGE_EOS:
hgs
parents:
diff changeset
   184
            break;
hgs
parents:
diff changeset
   185
        case GST_MESSAGE_UNKNOWN:
hgs
parents:
diff changeset
   186
            break;
hgs
parents:
diff changeset
   187
        case GST_MESSAGE_WARNING:
hgs
parents:
diff changeset
   188
            break;
hgs
parents:
diff changeset
   189
        case GST_MESSAGE_INFO:
hgs
parents:
diff changeset
   190
            break;
hgs
parents:
diff changeset
   191
        case GST_MESSAGE_TAG:
hgs
parents:
diff changeset
   192
            break;
hgs
parents:
diff changeset
   193
        case GST_MESSAGE_BUFFERING:
hgs
parents:
diff changeset
   194
            break;
hgs
parents:
diff changeset
   195
        case GST_MESSAGE_STATE_CHANGED:
hgs
parents:
diff changeset
   196
            break;
hgs
parents:
diff changeset
   197
        case GST_MESSAGE_STATE_DIRTY:
hgs
parents:
diff changeset
   198
            break;
hgs
parents:
diff changeset
   199
        case GST_MESSAGE_STEP_DONE:
hgs
parents:
diff changeset
   200
            break;
hgs
parents:
diff changeset
   201
        case GST_MESSAGE_CLOCK_PROVIDE:
hgs
parents:
diff changeset
   202
            break;
hgs
parents:
diff changeset
   203
        case GST_MESSAGE_CLOCK_LOST:
hgs
parents:
diff changeset
   204
            break;
hgs
parents:
diff changeset
   205
        case GST_MESSAGE_NEW_CLOCK:
hgs
parents:
diff changeset
   206
            break;
hgs
parents:
diff changeset
   207
        case GST_MESSAGE_STRUCTURE_CHANGE:
hgs
parents:
diff changeset
   208
            break;
hgs
parents:
diff changeset
   209
        case GST_MESSAGE_STREAM_STATUS:
hgs
parents:
diff changeset
   210
            break;
hgs
parents:
diff changeset
   211
        case GST_MESSAGE_APPLICATION:
hgs
parents:
diff changeset
   212
            break;
hgs
parents:
diff changeset
   213
        case GST_MESSAGE_ELEMENT:
hgs
parents:
diff changeset
   214
            break;
hgs
parents:
diff changeset
   215
        case GST_MESSAGE_SEGMENT_START:
hgs
parents:
diff changeset
   216
            break;
hgs
parents:
diff changeset
   217
        case GST_MESSAGE_SEGMENT_DONE:
hgs
parents:
diff changeset
   218
            break;
hgs
parents:
diff changeset
   219
        case GST_MESSAGE_DURATION:
hgs
parents:
diff changeset
   220
            break;
hgs
parents:
diff changeset
   221
        case GST_MESSAGE_LATENCY:
hgs
parents:
diff changeset
   222
            break;
hgs
parents:
diff changeset
   223
        case GST_MESSAGE_ASYNC_START:
hgs
parents:
diff changeset
   224
            break;
hgs
parents:
diff changeset
   225
        case GST_MESSAGE_ASYNC_DONE:
hgs
parents:
diff changeset
   226
            break;
hgs
parents:
diff changeset
   227
        case GST_MESSAGE_ANY:
hgs
parents:
diff changeset
   228
            break;
hgs
parents:
diff changeset
   229
        default:
hgs
parents:
diff changeset
   230
            DEBUG_INFO("Unhandled Gst-Bus message");
hgs
parents:
diff changeset
   231
            break;
hgs
parents:
diff changeset
   232
    }
hgs
parents:
diff changeset
   233
    DEBUG_API("<-XAAdaptationGst_GstBusCb");
hgs
parents:
diff changeset
   234
    return TRUE;
hgs
parents:
diff changeset
   235
}
hgs
parents:
diff changeset
   236
hgs
parents:
diff changeset
   237
XAresult XAAdaptationGst_InitGstListener(XAAdaptationGstCtx* ctx)
hgs
parents:
diff changeset
   238
{
hgs
parents:
diff changeset
   239
    int ret;
hgs
parents:
diff changeset
   240
    DEBUG_API("->XAAdaptationGst_InitGstListener");
hgs
parents:
diff changeset
   241
    if ( ctx->bin )
hgs
parents:
diff changeset
   242
    {
hgs
parents:
diff changeset
   243
        ctx->bus = gst_pipeline_get_bus( GST_PIPELINE( ctx->bin ));
hgs
parents:
diff changeset
   244
    }
hgs
parents:
diff changeset
   245
    if( !ctx->bus )
hgs
parents:
diff changeset
   246
    {
hgs
parents:
diff changeset
   247
        DEBUG_ERR("could not get gst bus!")
hgs
parents:
diff changeset
   248
        return XA_RESULT_INTERNAL_ERROR;
hgs
parents:
diff changeset
   249
    }
hgs
parents:
diff changeset
   250
    ret = pthread_create(&(ctx->busloopThr), NULL, (XAAdaptationGst_LaunchGstListener),(void*)ctx);
hgs
parents:
diff changeset
   251
    // VASU MOD BEGINS
hgs
parents:
diff changeset
   252
    if ( ctx->thread_launched == XA_BOOLEAN_FALSE )
hgs
parents:
diff changeset
   253
    {
hgs
parents:
diff changeset
   254
        // Wait until the thread is created
hgs
parents:
diff changeset
   255
        pthread_mutex_lock(&(ctx->ds_mutex));
hgs
parents:
diff changeset
   256
        pthread_cond_wait(&(ctx->ds_condition), &(ctx->ds_mutex));
hgs
parents:
diff changeset
   257
        pthread_mutex_unlock(&(ctx->ds_mutex));
hgs
parents:
diff changeset
   258
        // VASU MOD ENDS
hgs
parents:
diff changeset
   259
    }
hgs
parents:
diff changeset
   260
    if(ret)
hgs
parents:
diff changeset
   261
    {
hgs
parents:
diff changeset
   262
        DEBUG_ERR_A1("could not create thread!! (%d)",ret)
hgs
parents:
diff changeset
   263
        return XA_RESULT_INTERNAL_ERROR;
hgs
parents:
diff changeset
   264
    }
hgs
parents:
diff changeset
   265
    DEBUG_API("<-XAAdaptationGst_InitGstListener");
hgs
parents:
diff changeset
   266
    return XA_RESULT_SUCCESS;
hgs
parents:
diff changeset
   267
}
hgs
parents:
diff changeset
   268
hgs
parents:
diff changeset
   269
void * XAAdaptationGst_LaunchGstListener(void* args)
hgs
parents:
diff changeset
   270
{
hgs
parents:
diff changeset
   271
    XAAdaptationGstCtx* ctx = (XAAdaptationGstCtx*)args;
hgs
parents:
diff changeset
   272
    DEBUG_API("->XAAdaptationGst_LaunchGstListener");
hgs
parents:
diff changeset
   273
    // VASU MOD BEGINS
hgs
parents:
diff changeset
   274
    // Signal calling thread that this thread creation is completed
hgs
parents:
diff changeset
   275
    ctx->thread_launched = XA_BOOLEAN_TRUE;
hgs
parents:
diff changeset
   276
    pthread_mutex_lock(&(ctx->ds_mutex));
hgs
parents:
diff changeset
   277
    pthread_cond_signal(&(ctx->ds_condition));
hgs
parents:
diff changeset
   278
    pthread_mutex_unlock(&(ctx->ds_mutex));
hgs
parents:
diff changeset
   279
    // VASU MOD ENDS
hgs
parents:
diff changeset
   280
hgs
parents:
diff changeset
   281
    ctx->busloop = g_main_loop_new( NULL, FALSE );
hgs
parents:
diff changeset
   282
    if ( !ctx->busloop )
hgs
parents:
diff changeset
   283
    {
hgs
parents:
diff changeset
   284
        DEBUG_ERR("Glib main loop failure.")
hgs
parents:
diff changeset
   285
        DEBUG_API("<-XAAdaptationGst_LaunchGstListener");
hgs
parents:
diff changeset
   286
        assert(0);
hgs
parents:
diff changeset
   287
    }
hgs
parents:
diff changeset
   288
    else
hgs
parents:
diff changeset
   289
    {
hgs
parents:
diff changeset
   290
        DEBUG_INFO("Start Glib main loop")
hgs
parents:
diff changeset
   291
        g_main_loop_run(ctx->busloop);
hgs
parents:
diff changeset
   292
        DEBUG_INFO("Glib main loop stopped - exiting thread")
hgs
parents:
diff changeset
   293
        DEBUG_API("<-XAAdaptationGst_LaunchGstListener");
hgs
parents:
diff changeset
   294
        pthread_exit(NULL);
hgs
parents:
diff changeset
   295
    }
hgs
parents:
diff changeset
   296
   return NULL;
hgs
parents:
diff changeset
   297
}
hgs
parents:
diff changeset
   298
hgs
parents:
diff changeset
   299
void XAAdaptationGst_StopGstListener(XAAdaptationGstCtx* ctx)
hgs
parents:
diff changeset
   300
{
hgs
parents:
diff changeset
   301
    DEBUG_API("->XAAdaptationGst_StopGstListener");
hgs
parents:
diff changeset
   302
    if(ctx->busloop)
hgs
parents:
diff changeset
   303
    {
hgs
parents:
diff changeset
   304
        g_main_loop_quit (ctx->busloop);
hgs
parents:
diff changeset
   305
        g_main_loop_unref(ctx->busloop);
hgs
parents:
diff changeset
   306
    }
hgs
parents:
diff changeset
   307
    if(ctx->bus)
hgs
parents:
diff changeset
   308
    {
hgs
parents:
diff changeset
   309
        gst_object_unref(ctx->bus);
hgs
parents:
diff changeset
   310
        ctx->bus = NULL;
hgs
parents:
diff changeset
   311
    }
hgs
parents:
diff changeset
   312
    DEBUG_API("<-XAAdaptationGst_StopGstListener");
hgs
parents:
diff changeset
   313
}
hgs
parents:
diff changeset
   314
hgs
parents:
diff changeset
   315
/*
hgs
parents:
diff changeset
   316
 * ASynchronous operation managing
hgs
parents:
diff changeset
   317
 **/
hgs
parents:
diff changeset
   318
hgs
parents:
diff changeset
   319
/* NOTE: This should NOT be called from gst callbacks - danger of deadlock!!
hgs
parents:
diff changeset
   320
 */
hgs
parents:
diff changeset
   321
void XAAdaptationGst_PrepareAsyncWait(XAAdaptationGstCtx* ctx)
hgs
parents:
diff changeset
   322
{
hgs
parents:
diff changeset
   323
    DEBUG_API("->XAAdaptationGst_PrepareAsyncWait");
hgs
parents:
diff changeset
   324
hgs
parents:
diff changeset
   325
    if( ctx->waitingasyncop )
hgs
parents:
diff changeset
   326
    {   /*wait previous async op*/
hgs
parents:
diff changeset
   327
        DEBUG_INFO("::WARNING:: previous asynch still ongoing!!!");
hgs
parents:
diff changeset
   328
        DEBUG_INFO(">>>>  WAIT PREVIOUS");
hgs
parents:
diff changeset
   329
        sem_wait(&(ctx->semAsyncWait));
hgs
parents:
diff changeset
   330
        DEBUG_INFO("<<<<  PREVIOUS COMPLETED");
hgs
parents:
diff changeset
   331
    }
hgs
parents:
diff changeset
   332
    sem_init(&(ctx->semAsyncWait),0,0);
hgs
parents:
diff changeset
   333
hgs
parents:
diff changeset
   334
    ctx->waitingasyncop = XA_BOOLEAN_TRUE;
hgs
parents:
diff changeset
   335
    DEBUG_API("<-XAAdaptationGst_PrepareAsyncWait");
hgs
parents:
diff changeset
   336
}
hgs
parents:
diff changeset
   337
hgs
parents:
diff changeset
   338
void XAAdaptationGst_StartAsyncWait(XAAdaptationGstCtx* ctx)
hgs
parents:
diff changeset
   339
{
hgs
parents:
diff changeset
   340
    DEBUG_API("->XAAdaptationGst_StartAsyncWait");
hgs
parents:
diff changeset
   341
hgs
parents:
diff changeset
   342
    /* timeout to try to avoid gst freeze in rollup */
hgs
parents:
diff changeset
   343
    ctx->asynctimer = g_timeout_add(XA_ADAPT_ASYNC_TIMEOUT,
hgs
parents:
diff changeset
   344
                                    XAAdaptationGst_CancelAsyncWait, ctx);
hgs
parents:
diff changeset
   345
    /* check flag once again if callback already happened before wait */
hgs
parents:
diff changeset
   346
    if(ctx->waitingasyncop)
hgs
parents:
diff changeset
   347
    {
hgs
parents:
diff changeset
   348
        DEBUG_INFO(">>>>  ASYNC STARTS");
hgs
parents:
diff changeset
   349
        sem_wait(&(ctx->semAsyncWait));
hgs
parents:
diff changeset
   350
        DEBUG_INFO("<<<<  ASYNC COMPLETED");
hgs
parents:
diff changeset
   351
    }
hgs
parents:
diff changeset
   352
    else
hgs
parents:
diff changeset
   353
    {
hgs
parents:
diff changeset
   354
        DEBUG_INFO("<> async completed already");
hgs
parents:
diff changeset
   355
    }
hgs
parents:
diff changeset
   356
    /*cancel timer*/
hgs
parents:
diff changeset
   357
    if(ctx->asynctimer)
hgs
parents:
diff changeset
   358
    {
hgs
parents:
diff changeset
   359
        g_source_remove(ctx->asynctimer);
hgs
parents:
diff changeset
   360
    }
hgs
parents:
diff changeset
   361
    ctx->waitingasyncop = XA_BOOLEAN_FALSE;
hgs
parents:
diff changeset
   362
hgs
parents:
diff changeset
   363
    DEBUG_API("<-XAAdaptationGst_StartAsyncWait");
hgs
parents:
diff changeset
   364
}
hgs
parents:
diff changeset
   365
hgs
parents:
diff changeset
   366
/* async operation timeout callback*/
hgs
parents:
diff changeset
   367
gboolean XAAdaptationGst_CancelAsyncWait(gpointer ctx)
hgs
parents:
diff changeset
   368
{
hgs
parents:
diff changeset
   369
    XAAdaptationGstCtx* bCtx = (XAAdaptationGstCtx*)ctx;
hgs
parents:
diff changeset
   370
    DEBUG_API("->XAAdaptationGst_CancelAsyncWait");
hgs
parents:
diff changeset
   371
    if( bCtx->waitingasyncop )
hgs
parents:
diff changeset
   372
    {
hgs
parents:
diff changeset
   373
        DEBUG_ERR_A3("ASYNC TIMED OUT : current %d, gsttarget %d, wanted %d",
hgs
parents:
diff changeset
   374
                      GST_STATE(bCtx->bin), GST_STATE_TARGET(bCtx->bin), bCtx->binWantedState);
hgs
parents:
diff changeset
   375
        bCtx->waitingasyncop = XA_BOOLEAN_FALSE;
hgs
parents:
diff changeset
   376
        sem_post(&(bCtx->semAsyncWait));
hgs
parents:
diff changeset
   377
    }
hgs
parents:
diff changeset
   378
    DEBUG_API("<-XAAdaptationGst_CancelAsyncWait");
hgs
parents:
diff changeset
   379
    /* return false to remove timer */
hgs
parents:
diff changeset
   380
    return FALSE;
hgs
parents:
diff changeset
   381
}
hgs
parents:
diff changeset
   382
hgs
parents:
diff changeset
   383
void XAAdaptationGst_CompleteAsyncWait(XAAdaptationGstCtx* ctx)
hgs
parents:
diff changeset
   384
{
hgs
parents:
diff changeset
   385
    DEBUG_API("->XAAdaptationGst_CompleteAsyncWait");
hgs
parents:
diff changeset
   386
    if( ctx->waitingasyncop )
hgs
parents:
diff changeset
   387
    {
hgs
parents:
diff changeset
   388
        int i;
hgs
parents:
diff changeset
   389
        ctx->waitingasyncop = XA_BOOLEAN_FALSE;
hgs
parents:
diff changeset
   390
        sem_getvalue(&(ctx->semAsyncWait),&i);
hgs
parents:
diff changeset
   391
        DEBUG_INFO_A1("Asynch operation succeeded, sem value %d",i);
hgs
parents:
diff changeset
   392
        if(i<=0)
hgs
parents:
diff changeset
   393
        {   /* only post if locked */
hgs
parents:
diff changeset
   394
            sem_post(&(ctx->semAsyncWait));
hgs
parents:
diff changeset
   395
        }
hgs
parents:
diff changeset
   396
        else if(i>0)
hgs
parents:
diff changeset
   397
        {   /* should not be, reset semaphore */
hgs
parents:
diff changeset
   398
            sem_init(&(ctx->semAsyncWait),0,0);
hgs
parents:
diff changeset
   399
        }
hgs
parents:
diff changeset
   400
    }
hgs
parents:
diff changeset
   401
    DEBUG_API("<-XAAdaptationGst_CompleteAsyncWait");
hgs
parents:
diff changeset
   402
}
hgs
parents:
diff changeset
   403
hgs
parents:
diff changeset
   404
/**
hgs
parents:
diff changeset
   405
 * GstElement* XAAdaptationGst_CreateGstSource( XADataSource* xaSrc, const XAchar *name )
hgs
parents:
diff changeset
   406
 * @param XADataSource* xaSnk - XADataSource defining gst source to create
hgs
parents:
diff changeset
   407
 * @param const XAchar *name - string for naming the gst element
hgs
parents:
diff changeset
   408
 * @param XAboolean *isobj - (out param) is source another XA object?
hgs
parents:
diff changeset
   409
 * @return GstElement* - return newly created gst source element
hgs
parents:
diff changeset
   410
 * Description: Create gst source element corresponding to XA source structure
hgs
parents:
diff changeset
   411
 */
hgs
parents:
diff changeset
   412
GstElement* XAAdaptationGst_CreateGstSource( XADataSource* xaSrc, const char *name, XAboolean *isobj, XAboolean *isPCM, XAboolean *isRawImage  )
hgs
parents:
diff changeset
   413
{
hgs
parents:
diff changeset
   414
    XAuint32 locType = 0;
hgs
parents:
diff changeset
   415
    GstElement* gstSrc = NULL;
hgs
parents:
diff changeset
   416
    char* fname=NULL;
hgs
parents:
diff changeset
   417
    XADataLocator_URI* uri = NULL;
hgs
parents:
diff changeset
   418
    XADataLocator_IODevice* ioDevice = NULL;
21
hgs
parents: 19
diff changeset
   419
#ifdef OMAX_CAMERABIN
19
hgs
parents:
diff changeset
   420
    XACameraDeviceImpl* cameraDevice = NULL;
21
hgs
parents: 19
diff changeset
   421
    XAObjectItfImpl* pObj = NULL;
hgs
parents: 19
diff changeset
   422
#endif
19
hgs
parents:
diff changeset
   423
    XARadioDeviceImpl* radioDevice = NULL;
hgs
parents:
diff changeset
   424
hgs
parents:
diff changeset
   425
    DEBUG_API("->XAAdaptationGst_CreateGstSource");
hgs
parents:
diff changeset
   426
    if( !xaSrc || !xaSrc->pLocator || !isobj )
hgs
parents:
diff changeset
   427
    {
hgs
parents:
diff changeset
   428
        return NULL;
hgs
parents:
diff changeset
   429
    }
hgs
parents:
diff changeset
   430
    *isobj = XA_BOOLEAN_FALSE;
hgs
parents:
diff changeset
   431
    if( xaSrc && xaSrc->pFormat && *((XAuint32*)(xaSrc->pFormat))==XA_DATAFORMAT_PCM && isPCM )
hgs
parents:
diff changeset
   432
    {
hgs
parents:
diff changeset
   433
        *isPCM = XA_BOOLEAN_TRUE;
hgs
parents:
diff changeset
   434
    }
hgs
parents:
diff changeset
   435
    if( xaSrc && xaSrc->pFormat && *((XAuint32*)(xaSrc->pFormat))==XA_DATAFORMAT_RAWIMAGE && isRawImage )
hgs
parents:
diff changeset
   436
    {
hgs
parents:
diff changeset
   437
        *isRawImage = XA_BOOLEAN_TRUE;
hgs
parents:
diff changeset
   438
    }
hgs
parents:
diff changeset
   439
    locType = *((XAuint32*)(xaSrc->pLocator));
hgs
parents:
diff changeset
   440
    switch ( locType )
hgs
parents:
diff changeset
   441
    {
hgs
parents:
diff changeset
   442
        case XA_DATALOCATOR_URI:
hgs
parents:
diff changeset
   443
            DEBUG_INFO("XA_DATALOCATOR_URI");
hgs
parents:
diff changeset
   444
            uri = (XADataLocator_URI*)xaSrc->pLocator;
hgs
parents:
diff changeset
   445
            gstSrc = gst_element_factory_make("filesrc",name);
hgs
parents:
diff changeset
   446
            if ( uri->URI != NULL )
hgs
parents:
diff changeset
   447
            {
hgs
parents:
diff changeset
   448
                DEBUG_INFO_A1("URI: %s", uri->URI);
hgs
parents:
diff changeset
   449
                if(strncmp((char *)uri->URI, "file:///", 8) == 0)
hgs
parents:
diff changeset
   450
                    {
hgs
parents:
diff changeset
   451
                    fname = (char *)&((uri->URI)[8]);
hgs
parents:
diff changeset
   452
                    }
hgs
parents:
diff changeset
   453
                else
hgs
parents:
diff changeset
   454
                    {
hgs
parents:
diff changeset
   455
                    fname = (char *)uri->URI;
hgs
parents:
diff changeset
   456
                    }
hgs
parents:
diff changeset
   457
                DEBUG_INFO_A1("->filesystem path %s", fname);
hgs
parents:
diff changeset
   458
                g_object_set( G_OBJECT(gstSrc), "location", fname, NULL );
hgs
parents:
diff changeset
   459
                /*check for pcm - decodebin does not know how to handle raw PCM files */
hgs
parents:
diff changeset
   460
                if( isPCM && strstr(fname, ".pcm") )
hgs
parents:
diff changeset
   461
                {
hgs
parents:
diff changeset
   462
                    DEBUG_INFO("PCM file detected");
hgs
parents:
diff changeset
   463
                    *isPCM=XA_BOOLEAN_TRUE;
hgs
parents:
diff changeset
   464
                }
hgs
parents:
diff changeset
   465
            }
hgs
parents:
diff changeset
   466
            else
hgs
parents:
diff changeset
   467
            {
hgs
parents:
diff changeset
   468
                DEBUG_ERR("No uri specified.");
hgs
parents:
diff changeset
   469
                return NULL;
hgs
parents:
diff changeset
   470
            }
hgs
parents:
diff changeset
   471
            break; /* XA_DATALOCATOR_URI */
hgs
parents:
diff changeset
   472
hgs
parents:
diff changeset
   473
hgs
parents:
diff changeset
   474
        case XA_DATALOCATOR_IODEVICE:
hgs
parents:
diff changeset
   475
            DEBUG_INFO("XA_DATALOCATOR_IODEVICE");
hgs
parents:
diff changeset
   476
            ioDevice = (XADataLocator_IODevice*)(xaSrc->pLocator);
hgs
parents:
diff changeset
   477
            switch ( ioDevice->deviceType )
hgs
parents:
diff changeset
   478
            {
hgs
parents:
diff changeset
   479
                case XA_IODEVICE_AUDIOINPUT:
hgs
parents:
diff changeset
   480
                {
hgs
parents:
diff changeset
   481
                    DEBUG_INFO("XA_IODEVICE_AUDIOINPUT");
hgs
parents:
diff changeset
   482
                    DEBUG_INFO_A1("ioDevice->deviceID: %x", ioDevice->deviceID);
hgs
parents:
diff changeset
   483
                    switch (ioDevice->deviceID )
hgs
parents:
diff changeset
   484
                    {
hgs
parents:
diff changeset
   485
                    //case XA_ADAPTID_ALSASRC: //Krishna
hgs
parents:
diff changeset
   486
                    case XA_ADAPTID_DEVSOUNDSRC:
hgs
parents:
diff changeset
   487
                        //DEBUG_INFO("alsasrc"); //Krishna
hgs
parents:
diff changeset
   488
                        DEBUG_INFO("devsoundsrc");
hgs
parents:
diff changeset
   489
                        gstSrc = gst_element_factory_make("devsoundsrc",name); //Krishna - changed to devsoundsrc
hgs
parents:
diff changeset
   490
                        g_object_set (G_OBJECT (gstSrc), "num-buffers", 80, NULL);
hgs
parents:
diff changeset
   491
                        break;
hgs
parents:
diff changeset
   492
                    case XA_ADAPTID_AUDIOTESTSRC:
hgs
parents:
diff changeset
   493
                        /*fall through*/
hgs
parents:
diff changeset
   494
                    default:
hgs
parents:
diff changeset
   495
                        DEBUG_INFO("audiotestsrc");
hgs
parents:
diff changeset
   496
                        gstSrc = gst_element_factory_make("audiotestsrc",name);
hgs
parents:
diff changeset
   497
                        break;
hgs
parents:
diff changeset
   498
                    }
hgs
parents:
diff changeset
   499
                    break;
hgs
parents:
diff changeset
   500
                }
21
hgs
parents: 19
diff changeset
   501
#ifdef OMAX_CAMERABIN
hgs
parents: 19
diff changeset
   502
             
19
hgs
parents:
diff changeset
   503
                case XA_IODEVICE_CAMERA:
hgs
parents:
diff changeset
   504
                {
hgs
parents:
diff changeset
   505
                    DEBUG_INFO("XA_IODEVICE_CAMERA");
hgs
parents:
diff changeset
   506
                    if ( ioDevice->device )
hgs
parents:
diff changeset
   507
                    {   /*source is camera object*/
hgs
parents:
diff changeset
   508
                        DEBUG_INFO("Use camerabin as source.");
hgs
parents:
diff changeset
   509
                        /* Get camerabin from source object */
hgs
parents:
diff changeset
   510
                        pObj = (XAObjectItfImpl*)(*ioDevice->device);
hgs
parents:
diff changeset
   511
                        cameraDevice = (XACameraDeviceImpl*)(pObj);
hgs
parents:
diff changeset
   512
                        /*TODO we had to remove this line below since adaptationCtx
hgs
parents:
diff changeset
   513
                         * was  not a member of structure*/
hgs
parents:
diff changeset
   514
hgs
parents:
diff changeset
   515
                        gstSrc = GST_ELEMENT(((XAAdaptationGstCtx*)(cameraDevice->adaptationCtx))->bin);
hgs
parents:
diff changeset
   516
                        /* refcount increase is needed to keep this not being deleted after use */
hgs
parents:
diff changeset
   517
                        gst_object_ref(GST_OBJECT(gstSrc));
hgs
parents:
diff changeset
   518
                        *isobj = XA_BOOLEAN_TRUE;
hgs
parents:
diff changeset
   519
                    }
hgs
parents:
diff changeset
   520
                    else
hgs
parents:
diff changeset
   521
                    {
hgs
parents:
diff changeset
   522
                        DEBUG_INFO_A1("ioDevice->deviceID: %x", ioDevice->deviceID);
hgs
parents:
diff changeset
   523
                        switch (ioDevice->deviceID )
hgs
parents:
diff changeset
   524
                        {
hgs
parents:
diff changeset
   525
                        case XA_ADAPTID_V4L2SRC:
hgs
parents:
diff changeset
   526
                            DEBUG_INFO("Camera deviceID: v4l2src ");
hgs
parents:
diff changeset
   527
 
hgs
parents:
diff changeset
   528
                            break;
hgs
parents:
diff changeset
   529
                        case XA_ADAPTID_VIDEOTESTSRC:
hgs
parents:
diff changeset
   530
                            DEBUG_INFO("Camera deviceID: videotestsrc");
hgs
parents:
diff changeset
   531
 
hgs
parents:
diff changeset
   532
                            break;
hgs
parents:
diff changeset
   533
                        default:
hgs
parents:
diff changeset
   534
                        case XA_DEFAULTDEVICEID_CAMERA:
hgs
parents:
diff changeset
   535
                            DEBUG_INFO("Camera deviceID:Default");
hgs
parents:
diff changeset
   536
                           
hgs
parents:
diff changeset
   537
                            break;
hgs
parents:
diff changeset
   538
                        }
hgs
parents:
diff changeset
   539
                        if ( cameraCtx )
hgs
parents:
diff changeset
   540
						{
hgs
parents:
diff changeset
   541
							gstSrc = GST_ELEMENT(cameraCtx->baseObj.bin);
hgs
parents:
diff changeset
   542
							gst_object_ref(GST_OBJECT(gstSrc));
hgs
parents:
diff changeset
   543
							*isobj = XA_BOOLEAN_TRUE;
hgs
parents:
diff changeset
   544
						}
hgs
parents:
diff changeset
   545
						else
hgs
parents:
diff changeset
   546
						{
hgs
parents:
diff changeset
   547
							DEBUG_ERR("No camera object created!");
hgs
parents:
diff changeset
   548
							return NULL;
hgs
parents:
diff changeset
   549
						}
hgs
parents:
diff changeset
   550
                    }
hgs
parents:
diff changeset
   551
                    break;
hgs
parents:
diff changeset
   552
                }
21
hgs
parents: 19
diff changeset
   553
#endif                
19
hgs
parents:
diff changeset
   554
                case XA_IODEVICE_RADIO:
hgs
parents:
diff changeset
   555
                    DEBUG_INFO("XA_IODEVICE_RADIO");
hgs
parents:
diff changeset
   556
                    if ( ioDevice->device )
hgs
parents:
diff changeset
   557
                    {
hgs
parents:
diff changeset
   558
                        DEBUG_INFO("Use radio pipeline as source.");
hgs
parents:
diff changeset
   559
                        /* Get radio_pipeline and set it to base context */
hgs
parents:
diff changeset
   560
                        radioDevice = (XARadioDeviceImpl*)(*ioDevice->device);
hgs
parents:
diff changeset
   561
                        /* radio does not have actual bin, only source element*/
hgs
parents:
diff changeset
   562
                        gstSrc = GST_ELEMENT(((XAAdaptationGstCtx*)radioDevice->adaptationCtx)->bin);
hgs
parents:
diff changeset
   563
                        /* refcount increase is needed to keep this not being deleted after use */
hgs
parents:
diff changeset
   564
                        gst_object_ref(GST_OBJECT(gstSrc));
hgs
parents:
diff changeset
   565
                        /**isobj = XA_BOOLEAN_TRUE;*/
hgs
parents:
diff changeset
   566
                    }
hgs
parents:
diff changeset
   567
                    break;
hgs
parents:
diff changeset
   568
                default:
hgs
parents:
diff changeset
   569
                {
hgs
parents:
diff changeset
   570
                    DEBUG_ERR("Unsupported IODevice.");
hgs
parents:
diff changeset
   571
                    break;
hgs
parents:
diff changeset
   572
                }
hgs
parents:
diff changeset
   573
            }
hgs
parents:
diff changeset
   574
            break; /* XA_DATALOCATOR_IODEVICE */
hgs
parents:
diff changeset
   575
hgs
parents:
diff changeset
   576
/*        case XA_DATALOCATOR_CONTENTPIPE:
hgs
parents:
diff changeset
   577
        {
hgs
parents:
diff changeset
   578
        	DEBUG_INFO("XA_DATALOCATOR_CONTENTPIPE");
hgs
parents:
diff changeset
   579
        	gstSrc = gst_element_factory_make("appsrc",name);
hgs
parents:
diff changeset
   580
            break;
hgs
parents:
diff changeset
   581
        }*/
hgs
parents:
diff changeset
   582
        case XA_DATALOCATOR_ADDRESS:
hgs
parents:
diff changeset
   583
            {
hgs
parents:
diff changeset
   584
                XADataLocator_Address* address = (XADataLocator_Address*)(xaSrc->pLocator);
hgs
parents:
diff changeset
   585
                gstSrc = gst_element_factory_make("appsrc", name);
hgs
parents:
diff changeset
   586
                /* init gst buffer from datalocator */
hgs
parents:
diff changeset
   587
                if( gstSrc )
hgs
parents:
diff changeset
   588
                {
hgs
parents:
diff changeset
   589
                    /* init GST buffer from XADataLocator*/
hgs
parents:
diff changeset
   590
                    GstBuffer* userBuf = gst_buffer_new();
hgs
parents:
diff changeset
   591
                    if( userBuf )
hgs
parents:
diff changeset
   592
                    {
hgs
parents:
diff changeset
   593
                        userBuf->size = address->length;
hgs
parents:
diff changeset
   594
                        userBuf->data = address->pAddress;
hgs
parents:
diff changeset
   595
                        /* push the whole buffer to appsrc so it is ready for preroll */
hgs
parents:
diff changeset
   596
                        DEBUG_INFO("Pushing buffer");
hgs
parents:
diff changeset
   597
                        gst_app_src_push_buffer( GST_APP_SRC(gstSrc), userBuf );
hgs
parents:
diff changeset
   598
                        DEBUG_INFO_A1("Sent buffer at 0x%x to appsrc", userBuf );
hgs
parents:
diff changeset
   599
                        gst_app_src_end_of_stream( GST_APP_SRC(gstSrc) );
hgs
parents:
diff changeset
   600
                    }
hgs
parents:
diff changeset
   601
                    else
hgs
parents:
diff changeset
   602
                    {
hgs
parents:
diff changeset
   603
                        DEBUG_ERR("Failure allocating buffer!");
hgs
parents:
diff changeset
   604
                    }
hgs
parents:
diff changeset
   605
                }
hgs
parents:
diff changeset
   606
                else
hgs
parents:
diff changeset
   607
                {
hgs
parents:
diff changeset
   608
                    DEBUG_ERR("Failure creating appsrc!");
hgs
parents:
diff changeset
   609
                }
hgs
parents:
diff changeset
   610
            }
hgs
parents:
diff changeset
   611
            break;
hgs
parents:
diff changeset
   612
hgs
parents:
diff changeset
   613
        default:
hgs
parents:
diff changeset
   614
            DEBUG_ERR("Incorrect data locator for source.")
hgs
parents:
diff changeset
   615
            break;
hgs
parents:
diff changeset
   616
    }
hgs
parents:
diff changeset
   617
hgs
parents:
diff changeset
   618
    if ( gstSrc )
hgs
parents:
diff changeset
   619
    {
hgs
parents:
diff changeset
   620
        DEBUG_INFO_A1("Created gstreamer source element at %x", gstSrc);
hgs
parents:
diff changeset
   621
    }
hgs
parents:
diff changeset
   622
hgs
parents:
diff changeset
   623
    DEBUG_API("<-XAAdaptationGst_CreateGstSource");
hgs
parents:
diff changeset
   624
    return gstSrc;
hgs
parents:
diff changeset
   625
}
hgs
parents:
diff changeset
   626
hgs
parents:
diff changeset
   627
hgs
parents:
diff changeset
   628
/**
hgs
parents:
diff changeset
   629
 * GstElement* XAAdaptationGst_CreateGstSink( XADataSink* xaSnk, const XAchar *name )
hgs
parents:
diff changeset
   630
 * @param XADataSink* xaSnk - XADataSink defining gst sink to create
hgs
parents:
diff changeset
   631
 * @param const XAchar *name - string for naming the gst element
hgs
parents:
diff changeset
   632
 * @return GstElement* - return newly created gst sink element
hgs
parents:
diff changeset
   633
 * Description: Create gst sink element corresponding to XA sink structure
hgs
parents:
diff changeset
   634
 */
hgs
parents:
diff changeset
   635
GstElement* XAAdaptationGst_CreateGstSink( XADataSink* xaSnk, const char *name, XAboolean *isobj )
hgs
parents:
diff changeset
   636
{
hgs
parents:
diff changeset
   637
    XAuint32 locType = 0;
hgs
parents:
diff changeset
   638
    GstElement* gstSnk = NULL;
hgs
parents:
diff changeset
   639
    XADataLocator_URI* uri = NULL;
hgs
parents:
diff changeset
   640
    DEBUG_API("->XAAdaptationGst_CreateGstSink");
hgs
parents:
diff changeset
   641
    if(!xaSnk || !xaSnk->pLocator)
hgs
parents:
diff changeset
   642
    {
hgs
parents:
diff changeset
   643
        DEBUG_INFO("Warning! No sink specified, use fakesink");
hgs
parents:
diff changeset
   644
        gstSnk = gst_element_factory_make("fakesink",name);
hgs
parents:
diff changeset
   645
        if(!gstSnk)
hgs
parents:
diff changeset
   646
        {
hgs
parents:
diff changeset
   647
            DEBUG_ERR("Cannot create sink!");
hgs
parents:
diff changeset
   648
            return NULL;
hgs
parents:
diff changeset
   649
        }
hgs
parents:
diff changeset
   650
        g_object_set( G_OBJECT(gstSnk),"async", FALSE, NULL);
hgs
parents:
diff changeset
   651
    }
hgs
parents:
diff changeset
   652
    else
hgs
parents:
diff changeset
   653
    {
hgs
parents:
diff changeset
   654
        locType = *((XAuint32*)(xaSnk->pLocator));
hgs
parents:
diff changeset
   655
        switch ( locType )
hgs
parents:
diff changeset
   656
        {
hgs
parents:
diff changeset
   657
            case XA_DATALOCATOR_URI:
hgs
parents:
diff changeset
   658
                DEBUG_INFO("XA_DATALOCATOR_URI");
hgs
parents:
diff changeset
   659
                uri = (XADataLocator_URI*)xaSnk->pLocator;
hgs
parents:
diff changeset
   660
                gstSnk = gst_element_factory_make("filesink",name);
hgs
parents:
diff changeset
   661
                if(!gstSnk)
hgs
parents:
diff changeset
   662
                {
hgs
parents:
diff changeset
   663
                    DEBUG_ERR("Cannot create sink!");
hgs
parents:
diff changeset
   664
                    return NULL;
hgs
parents:
diff changeset
   665
                }
hgs
parents:
diff changeset
   666
                if ( uri->URI != NULL )
hgs
parents:
diff changeset
   667
                {
hgs
parents:
diff changeset
   668
                    XAchar *fname;
hgs
parents:
diff changeset
   669
                    DEBUG_INFO_A1("URI: %s", uri->URI);
hgs
parents:
diff changeset
   670
                    if(strncmp((char *)uri->URI, "file:///", 8) == 0)
hgs
parents:
diff changeset
   671
                    {
hgs
parents:
diff changeset
   672
                        fname = &((uri->URI)[8]);
hgs
parents:
diff changeset
   673
                    }
hgs
parents:
diff changeset
   674
                    else
hgs
parents:
diff changeset
   675
                    {
hgs
parents:
diff changeset
   676
                        fname = uri->URI;
hgs
parents:
diff changeset
   677
                    }
hgs
parents:
diff changeset
   678
                    DEBUG_INFO_A1("->filesystem path %s", fname);
hgs
parents:
diff changeset
   679
                    g_object_set( G_OBJECT(gstSnk),"location", fname,
hgs
parents:
diff changeset
   680
                                                   "async", FALSE,
hgs
parents:
diff changeset
   681
                                                   "qos", FALSE,
hgs
parents:
diff changeset
   682
                                                   "max-lateness", (gint64)(-1),
hgs
parents:
diff changeset
   683
                                                   NULL);
hgs
parents:
diff changeset
   684
                }
hgs
parents:
diff changeset
   685
                else
hgs
parents:
diff changeset
   686
                {
hgs
parents:
diff changeset
   687
                    DEBUG_ERR("No recording output uri specified.");
hgs
parents:
diff changeset
   688
                    return NULL;
hgs
parents:
diff changeset
   689
                }
hgs
parents:
diff changeset
   690
                break;
hgs
parents:
diff changeset
   691
            case XA_DATALOCATOR_NATIVEDISPLAY:
hgs
parents:
diff changeset
   692
                DEBUG_INFO("Sink locator type - XA_DATALOCATOR_NATIVEDISPLAY");
hgs
parents:
diff changeset
   693
#ifdef USE_NGA_SURFACES
hgs
parents:
diff changeset
   694
                gstSnk = gst_element_factory_make("devvideosink","devvideosink");
hgs
parents:
diff changeset
   695
#else
hgs
parents:
diff changeset
   696
                gstSnk = gst_element_factory_make("ximagesink",name);
hgs
parents:
diff changeset
   697
#endif /*USE_NGA_SURFACES*/
hgs
parents:
diff changeset
   698
                if(!gstSnk)
hgs
parents:
diff changeset
   699
                {
hgs
parents:
diff changeset
   700
                    DEBUG_ERR("Cannot create sink!");
hgs
parents:
diff changeset
   701
                    return NULL;
hgs
parents:
diff changeset
   702
                }
hgs
parents:
diff changeset
   703
                g_object_set( G_OBJECT(gstSnk), "force-aspect-ratio", TRUE,
hgs
parents:
diff changeset
   704
												"async", FALSE,
hgs
parents:
diff changeset
   705
                                               "qos", FALSE,
hgs
parents:
diff changeset
   706
												"handle-events", TRUE,
hgs
parents:
diff changeset
   707
												"handle-expose", TRUE,
hgs
parents:
diff changeset
   708
                                               "max-lateness", (gint64)(-1),
hgs
parents:
diff changeset
   709
                                               NULL);
hgs
parents:
diff changeset
   710
                break;
hgs
parents:
diff changeset
   711
            case XA_DATALOCATOR_OUTPUTMIX:
hgs
parents:
diff changeset
   712
                DEBUG_INFO("Sink locator type - XA_DATALOCATOR_OUTPUTMIX");
hgs
parents:
diff changeset
   713
                {
hgs
parents:
diff changeset
   714
                    /* Get OutputMix adaptation from data locator */
hgs
parents:
diff changeset
   715
                    XADataLocator_OutputMix* omix = (XADataLocator_OutputMix*)(xaSnk->pLocator);
hgs
parents:
diff changeset
   716
                    if ( omix->outputMix )
hgs
parents:
diff changeset
   717
                    {
hgs
parents:
diff changeset
   718
                        XAOMixImpl* omixDevice = (XAOMixImpl*)(*omix->outputMix);
hgs
parents:
diff changeset
   719
hgs
parents:
diff changeset
   720
                        if(omixDevice)
hgs
parents:
diff changeset
   721
                        {
hgs
parents:
diff changeset
   722
                            /*TODO we had to remove this line below since adaptationCtx
hgs
parents:
diff changeset
   723
                             * was  not a member of structure*/
hgs
parents:
diff changeset
   724
                        
hgs
parents:
diff changeset
   725
                            /*gstSnk = XAOutputMixAdapt_GetSink(omixDevice->adaptationCtx);*/
hgs
parents:
diff changeset
   726
                            if(!gstSnk)
hgs
parents:
diff changeset
   727
                            {
hgs
parents:
diff changeset
   728
                                DEBUG_ERR("Cannot create sink!");
hgs
parents:
diff changeset
   729
                                return NULL;
hgs
parents:
diff changeset
   730
                            }
hgs
parents:
diff changeset
   731
                            *isobj = XA_BOOLEAN_TRUE;
hgs
parents:
diff changeset
   732
                        }
hgs
parents:
diff changeset
   733
                        else
hgs
parents:
diff changeset
   734
                        {
hgs
parents:
diff changeset
   735
                            DEBUG_ERR("Warning - NULL outputmix object - default audio output used");
hgs
parents:
diff changeset
   736
                            gstSnk = gst_element_factory_make("alsasink",name);
hgs
parents:
diff changeset
   737
                        }
hgs
parents:
diff changeset
   738
                    }
hgs
parents:
diff changeset
   739
                    else
hgs
parents:
diff changeset
   740
                    {
hgs
parents:
diff changeset
   741
                        DEBUG_ERR("Warning - NULL outputmix object - default audio output used");
hgs
parents:
diff changeset
   742
                        gstSnk = gst_element_factory_make("alsasink",name);
hgs
parents:
diff changeset
   743
                    }
hgs
parents:
diff changeset
   744
hgs
parents:
diff changeset
   745
                }
hgs
parents:
diff changeset
   746
                break;
hgs
parents:
diff changeset
   747
/*		 	case XA_DATALOCATOR_CONTENTPIPE:
hgs
parents:
diff changeset
   748
				DEBUG_INFO("XA_DATALOCATOR_CONTENTPIPE");
hgs
parents:
diff changeset
   749
				gstSnk = gst_element_factory_make("appsink",name);
hgs
parents:
diff changeset
   750
				break;*/
hgs
parents:
diff changeset
   751
            case XA_DATALOCATOR_ADDRESS:
hgs
parents:
diff changeset
   752
                {
hgs
parents:
diff changeset
   753
                    gstSnk = gst_element_factory_make("appsink", name);
hgs
parents:
diff changeset
   754
                    /* Not actually object sink, but attribute used to notify recorder
hgs
parents:
diff changeset
   755
                     * about appsink (no object sinks applicable in this use case)
hgs
parents:
diff changeset
   756
                     **/
hgs
parents:
diff changeset
   757
                    *isobj=TRUE;
hgs
parents:
diff changeset
   758
                }
hgs
parents:
diff changeset
   759
                break;
hgs
parents:
diff changeset
   760
            case XA_DATALOCATOR_IODEVICE:
hgs
parents:
diff changeset
   761
                /* when only valid IOdevice sinks vibra and LED sinks implemented
hgs
parents:
diff changeset
   762
                 * at adaptation level, add handling here (in this implementation,
hgs
parents:
diff changeset
   763
                 * no handling needed as only dummy implementations for those)
hgs
parents:
diff changeset
   764
                 **/
hgs
parents:
diff changeset
   765
            default:
hgs
parents:
diff changeset
   766
                DEBUG_ERR("Incorrect data locator for sink.")
hgs
parents:
diff changeset
   767
                break;
hgs
parents:
diff changeset
   768
        }
hgs
parents:
diff changeset
   769
    }
hgs
parents:
diff changeset
   770
    if (gstSnk )
hgs
parents:
diff changeset
   771
    {
hgs
parents:
diff changeset
   772
        DEBUG_INFO_A1("Created gstreamer sink element at %x", gstSnk);
hgs
parents:
diff changeset
   773
    }
hgs
parents:
diff changeset
   774
    DEBUG_API("<-XAAdaptationGst_CreateGstSink");
hgs
parents:
diff changeset
   775
    return gstSnk;
hgs
parents:
diff changeset
   776
}
hgs
parents:
diff changeset
   777
hgs
parents:
diff changeset
   778
/**
hgs
parents:
diff changeset
   779
 * GstElement* XAAdaptationGst_CreateVideoPP( )
hgs
parents:
diff changeset
   780
 * @return GstElement* - return newly created gst pipeline element
hgs
parents:
diff changeset
   781
 * Description: Create video processing pipeline
hgs
parents:
diff changeset
   782
 */
hgs
parents:
diff changeset
   783
GstElement* XAAdaptationGst_CreateVideoPP( )
hgs
parents:
diff changeset
   784
{
hgs
parents:
diff changeset
   785
    GstElement *vpp;
hgs
parents:
diff changeset
   786
    DEBUG_API("->XAAdaptationGst_CreateVideoPP");
hgs
parents:
diff changeset
   787
    vpp = gst_pipeline_new("videopp");
hgs
parents:
diff changeset
   788
    if( vpp )
hgs
parents:
diff changeset
   789
    {
hgs
parents:
diff changeset
   790
        GstPad *ghostsink, *ghostsrc;
hgs
parents:
diff changeset
   791
        GstElement 	*col1,
hgs
parents:
diff changeset
   792
					*col2,
hgs
parents:
diff changeset
   793
					*rotate,
hgs
parents:
diff changeset
   794
					*mirror,
hgs
parents:
diff changeset
   795
					*box,
hgs
parents:
diff changeset
   796
					*crop,
hgs
parents:
diff changeset
   797
					*gamma,
hgs
parents:
diff changeset
   798
					*balance,
hgs
parents:
diff changeset
   799
					*scale,
hgs
parents:
diff changeset
   800
					*scale2,
hgs
parents:
diff changeset
   801
#ifdef USE_NGA_SURFACES
hgs
parents:
diff changeset
   802
					*identity,
hgs
parents:
diff changeset
   803
#endif /*USE_NGA_SURFACES*/
hgs
parents:
diff changeset
   804
					*queue;
hgs
parents:
diff changeset
   805
hgs
parents:
diff changeset
   806
hgs
parents:
diff changeset
   807
        /* Crete ffmpegcolorspace to convert stream to correct format */
hgs
parents:
diff changeset
   808
        col1 = gst_element_factory_make( "ffmpegcolorspace", "pp_colsp1");
hgs
parents:
diff changeset
   809
        if(col1)
hgs
parents:
diff changeset
   810
        {
hgs
parents:
diff changeset
   811
            DEBUG_INFO("Created ffmpegcolorspace element");
hgs
parents:
diff changeset
   812
            gst_bin_add(GST_BIN(vpp), col1);
hgs
parents:
diff changeset
   813
           /* make this bin link point*/
hgs
parents:
diff changeset
   814
            ghostsink = gst_element_get_static_pad(col1,"sink");
hgs
parents:
diff changeset
   815
            if(ghostsink)
hgs
parents:
diff changeset
   816
            {
hgs
parents:
diff changeset
   817
                gst_element_add_pad(vpp, gst_ghost_pad_new("videopp_sink",ghostsink));
hgs
parents:
diff changeset
   818
                gst_object_unref(GST_OBJECT(ghostsink));
hgs
parents:
diff changeset
   819
            }
hgs
parents:
diff changeset
   820
        }
hgs
parents:
diff changeset
   821
hgs
parents:
diff changeset
   822
        /* create video crop, this will be sink for videoPP pipeline */
hgs
parents:
diff changeset
   823
        crop = gst_element_factory_make( "videocrop", "pp_crop");
hgs
parents:
diff changeset
   824
        if(crop)
hgs
parents:
diff changeset
   825
        {
hgs
parents:
diff changeset
   826
            DEBUG_INFO("Created crop element");
hgs
parents:
diff changeset
   827
            gst_bin_add(GST_BIN(vpp), crop);
hgs
parents:
diff changeset
   828
        }
hgs
parents:
diff changeset
   829
hgs
parents:
diff changeset
   830
        /* create video rotate */
hgs
parents:
diff changeset
   831
        rotate = gst_element_factory_make( "videoflip", "pp_rotate");
hgs
parents:
diff changeset
   832
        if(rotate)
hgs
parents:
diff changeset
   833
        {
hgs
parents:
diff changeset
   834
            DEBUG_INFO("Created rotate element");
hgs
parents:
diff changeset
   835
            g_object_set(G_OBJECT(rotate), "method", FLIP_NONE, NULL);
hgs
parents:
diff changeset
   836
            gst_bin_add(GST_BIN(vpp), rotate);
hgs
parents:
diff changeset
   837
        }
hgs
parents:
diff changeset
   838
hgs
parents:
diff changeset
   839
        /* create video mirror */
hgs
parents:
diff changeset
   840
        mirror = gst_element_factory_make( "videoflip", "pp_mirror");
hgs
parents:
diff changeset
   841
        if(mirror)
hgs
parents:
diff changeset
   842
        {
hgs
parents:
diff changeset
   843
            DEBUG_INFO("Created mirror element");
hgs
parents:
diff changeset
   844
            g_object_set(G_OBJECT(mirror), "method", FLIP_NONE, NULL);
hgs
parents:
diff changeset
   845
            gst_bin_add(GST_BIN(vpp), mirror);
hgs
parents:
diff changeset
   846
        }
hgs
parents:
diff changeset
   847
hgs
parents:
diff changeset
   848
        /* create video box */
hgs
parents:
diff changeset
   849
        box = gst_element_factory_make( "videobox", "pp_box");
hgs
parents:
diff changeset
   850
        if(box)
hgs
parents:
diff changeset
   851
        {
hgs
parents:
diff changeset
   852
            DEBUG_INFO("Created videobox element");
hgs
parents:
diff changeset
   853
            gst_bin_add(GST_BIN(vpp), box);
hgs
parents:
diff changeset
   854
        }
hgs
parents:
diff changeset
   855
hgs
parents:
diff changeset
   856
        /* create video balance */
hgs
parents:
diff changeset
   857
        balance = gst_element_factory_make( "videobalance", "pp_balance");
hgs
parents:
diff changeset
   858
        if(balance)
hgs
parents:
diff changeset
   859
        {
hgs
parents:
diff changeset
   860
            DEBUG_INFO("Created balance element");
hgs
parents:
diff changeset
   861
            gst_bin_add(GST_BIN(vpp), balance);
hgs
parents:
diff changeset
   862
        }
hgs
parents:
diff changeset
   863
hgs
parents:
diff changeset
   864
        /* create video gamma */
hgs
parents:
diff changeset
   865
        gamma = gst_element_factory_make( "gamma", "pp_gamma");
hgs
parents:
diff changeset
   866
        if(gamma)
hgs
parents:
diff changeset
   867
        {
hgs
parents:
diff changeset
   868
            DEBUG_INFO("Created gamma element");
hgs
parents:
diff changeset
   869
            gst_bin_add(GST_BIN(vpp), gamma);
hgs
parents:
diff changeset
   870
        }
hgs
parents:
diff changeset
   871
hgs
parents:
diff changeset
   872
        /* Create videoscale element to scale postprocessed output to correct size */
hgs
parents:
diff changeset
   873
        scale = gst_element_factory_make("videoscale", "pp_scale");
hgs
parents:
diff changeset
   874
        if ( scale )
hgs
parents:
diff changeset
   875
        {
hgs
parents:
diff changeset
   876
            DEBUG_INFO("Created videoscale element");
hgs
parents:
diff changeset
   877
            gst_bin_add(GST_BIN(vpp), scale);
hgs
parents:
diff changeset
   878
        }
hgs
parents:
diff changeset
   879
        scale2 = gst_element_factory_make("videoscale", "pp_scale2");
hgs
parents:
diff changeset
   880
		if ( scale2 )
hgs
parents:
diff changeset
   881
		{
hgs
parents:
diff changeset
   882
			GstPad *pad = NULL;
hgs
parents:
diff changeset
   883
			GstCaps *caps = NULL;
hgs
parents:
diff changeset
   884
			DEBUG_INFO("Created videoscale element");
hgs
parents:
diff changeset
   885
			pad = gst_element_get_static_pad(scale2,"src");
hgs
parents:
diff changeset
   886
			caps = gst_caps_new_simple("video/x-raw-yuv",
hgs
parents:
diff changeset
   887
					 "width", G_TYPE_INT,0,
hgs
parents:
diff changeset
   888
					 "height", G_TYPE_INT,0,
hgs
parents:
diff changeset
   889
					 NULL);
hgs
parents:
diff changeset
   890
			gst_pad_set_caps(pad, caps);
hgs
parents:
diff changeset
   891
			gst_bin_add(GST_BIN(vpp), scale2);
hgs
parents:
diff changeset
   892
		}
hgs
parents:
diff changeset
   893
hgs
parents:
diff changeset
   894
        /* create video queue */
hgs
parents:
diff changeset
   895
        queue = gst_element_factory_make( "queue", "vpp_queue");
hgs
parents:
diff changeset
   896
        if(queue)
hgs
parents:
diff changeset
   897
        {
hgs
parents:
diff changeset
   898
            DEBUG_INFO("Created queue element");
hgs
parents:
diff changeset
   899
            gst_bin_add(GST_BIN(vpp), queue);
hgs
parents:
diff changeset
   900
#ifdef USE_NGA_SURFACES
hgs
parents:
diff changeset
   901
            /* make this bin link point*/
hgs
parents:
diff changeset
   902
            ghostsink = gst_element_get_static_pad(queue,"sink");
hgs
parents:
diff changeset
   903
            if(ghostsink)
hgs
parents:
diff changeset
   904
            {
hgs
parents:
diff changeset
   905
                gst_element_add_pad(vpp, gst_ghost_pad_new("videopp_src",ghostsink));
hgs
parents:
diff changeset
   906
                gst_object_unref(GST_OBJECT(ghostsink));
hgs
parents:
diff changeset
   907
            }            
hgs
parents:
diff changeset
   908
#endif /*USE_NGA_SURFACES*/
hgs
parents:
diff changeset
   909
        }
hgs
parents:
diff changeset
   910
hgs
parents:
diff changeset
   911
hgs
parents:
diff changeset
   912
        /* Crete ffmpegcolorspace to convert stream to correct format */
hgs
parents:
diff changeset
   913
        col2 = gst_element_factory_make( "ffmpegcolorspace", "pp_colsp2");
hgs
parents:
diff changeset
   914
        if(col2)
hgs
parents:
diff changeset
   915
        {
hgs
parents:
diff changeset
   916
            DEBUG_INFO("Created ffmpegcolorspace element");
hgs
parents:
diff changeset
   917
            gst_bin_add(GST_BIN(vpp), col2);
hgs
parents:
diff changeset
   918
            /* make this bin link point*/
hgs
parents:
diff changeset
   919
            ghostsrc = gst_element_get_static_pad(col2,"src");
hgs
parents:
diff changeset
   920
            if(ghostsrc)
hgs
parents:
diff changeset
   921
            {
hgs
parents:
diff changeset
   922
                gst_element_add_pad(vpp, gst_ghost_pad_new("videopp_src",ghostsrc));
hgs
parents:
diff changeset
   923
                gst_object_unref(GST_OBJECT(ghostsrc));
hgs
parents:
diff changeset
   924
            }
hgs
parents:
diff changeset
   925
        }
hgs
parents:
diff changeset
   926
hgs
parents:
diff changeset
   927
#ifdef USE_NGA_SURFACES
hgs
parents:
diff changeset
   928
        //shyward
hgs
parents:
diff changeset
   929
        /* create identity element */
hgs
parents:
diff changeset
   930
        identity  = gst_element_factory_make( "identity", "identity" );
hgs
parents:
diff changeset
   931
        if(identity)
hgs
parents:
diff changeset
   932
        {
hgs
parents:
diff changeset
   933
           DEBUG_INFO("Created identity element");
hgs
parents:
diff changeset
   934
           gst_bin_add(GST_BIN(vpp), identity);   
hgs
parents:
diff changeset
   935
           /* make this bin link point*/
hgs
parents:
diff changeset
   936
           ghostsrc = gst_element_get_static_pad(identity,"src");
hgs
parents:
diff changeset
   937
           if(ghostsrc)
hgs
parents:
diff changeset
   938
           {
hgs
parents:
diff changeset
   939
               gst_element_add_pad(vpp, gst_ghost_pad_new("videopp_sink",ghostsrc));
hgs
parents:
diff changeset
   940
               gst_object_unref(GST_OBJECT(ghostsrc));
hgs
parents:
diff changeset
   941
           }                
hgs
parents:
diff changeset
   942
        }        
hgs
parents:
diff changeset
   943
        if( !(gst_element_link_many(queue,identity,NULL)) )
hgs
parents:
diff changeset
   944
#else
hgs
parents:
diff changeset
   945
        //shyward - thins code assumes all the elements will have been created, which is not true
hgs
parents:
diff changeset
   946
        if( !(gst_element_link_many(col1,
hgs
parents:
diff changeset
   947
									scale,
hgs
parents:
diff changeset
   948
									crop,
hgs
parents:
diff changeset
   949
									rotate,
hgs
parents:
diff changeset
   950
									mirror,
hgs
parents:
diff changeset
   951
									box,
hgs
parents:
diff changeset
   952
									balance,
hgs
parents:
diff changeset
   953
									gamma,
hgs
parents:
diff changeset
   954
									queue,
hgs
parents:
diff changeset
   955
									scale2,
hgs
parents:
diff changeset
   956
#ifdef USE_NGA_SURFACES
hgs
parents:
diff changeset
   957
                					identity,
hgs
parents:
diff changeset
   958
#endif /*USE_NGA_SURFACES*/
hgs
parents:
diff changeset
   959
									col2,
hgs
parents:
diff changeset
   960
									NULL)
hgs
parents:
diff changeset
   961
									) )
hgs
parents:
diff changeset
   962
#endif /*USE_NGA_SURFACES*/
hgs
parents:
diff changeset
   963
        {
hgs
parents:
diff changeset
   964
            DEBUG_ERR("Could not link videopp elements!!");
hgs
parents:
diff changeset
   965
            gst_object_unref(vpp);
hgs
parents:
diff changeset
   966
            vpp = NULL;
hgs
parents:
diff changeset
   967
        }
hgs
parents:
diff changeset
   968
    }
hgs
parents:
diff changeset
   969
    DEBUG_API("<-XAAdaptationGst_CreateVideoPP");
hgs
parents:
diff changeset
   970
    return vpp;
hgs
parents:
diff changeset
   971
}
hgs
parents:
diff changeset
   972
hgs
parents:
diff changeset
   973
/**
hgs
parents:
diff changeset
   974
 * GstElement* XAAdaptationGst_CreateFixedSizeRecordVideoPP( )
hgs
parents:
diff changeset
   975
 * @return GstElement* - return newly created gst pipeline element
hgs
parents:
diff changeset
   976
 * Description: Create video processing pipeline with fixed output size to TEST_VIDEO_WIDTH x TEST_VIDEO_HEIGHT
hgs
parents:
diff changeset
   977
 *              experimental implementation for changing recorder output size
hgs
parents:
diff changeset
   978
 */
hgs
parents:
diff changeset
   979
GstElement* XAAdaptationGst_CreateFixedSizeVideoPP( )
hgs
parents:
diff changeset
   980
{
hgs
parents:
diff changeset
   981
    GstElement *vpp;
hgs
parents:
diff changeset
   982
    DEBUG_API("->XAAdaptationGst_CreateFixedSizeVideoPP");
hgs
parents:
diff changeset
   983
    vpp = gst_pipeline_new("videopp");
hgs
parents:
diff changeset
   984
    if( vpp )
hgs
parents:
diff changeset
   985
    {
hgs
parents:
diff changeset
   986
        GstPad *ghostsink, *ghostsrc;
hgs
parents:
diff changeset
   987
        GstElement  *col1,
hgs
parents:
diff changeset
   988
                    *col2,
hgs
parents:
diff changeset
   989
                    *rotate,
hgs
parents:
diff changeset
   990
                    *mirror,
hgs
parents:
diff changeset
   991
                    *box,
hgs
parents:
diff changeset
   992
                    *crop,
hgs
parents:
diff changeset
   993
                    *gamma,
hgs
parents:
diff changeset
   994
                    *balance,
hgs
parents:
diff changeset
   995
                    *scale,
hgs
parents:
diff changeset
   996
                    *scale2,
hgs
parents:
diff changeset
   997
                    *filter,
hgs
parents:
diff changeset
   998
                    *queue;
hgs
parents:
diff changeset
   999
hgs
parents:
diff changeset
  1000
hgs
parents:
diff changeset
  1001
        /* Crete ffmpegcolorspace to convert stream to correct format */
hgs
parents:
diff changeset
  1002
        col1 = gst_element_factory_make( "ffmpegcolorspace", "pp_colsp1");
hgs
parents:
diff changeset
  1003
        if(col1)
hgs
parents:
diff changeset
  1004
        {
hgs
parents:
diff changeset
  1005
            DEBUG_INFO("Created ffmpegcolorspace element");
hgs
parents:
diff changeset
  1006
            gst_bin_add(GST_BIN(vpp), col1);
hgs
parents:
diff changeset
  1007
           /* make this bin link point*/
hgs
parents:
diff changeset
  1008
            ghostsink = gst_element_get_static_pad(col1,"sink");
hgs
parents:
diff changeset
  1009
            if(ghostsink)
hgs
parents:
diff changeset
  1010
            {
hgs
parents:
diff changeset
  1011
                gst_element_add_pad(vpp, gst_ghost_pad_new("videopp_sink",ghostsink));
hgs
parents:
diff changeset
  1012
                gst_object_unref(GST_OBJECT(ghostsink));
hgs
parents:
diff changeset
  1013
            }
hgs
parents:
diff changeset
  1014
        }
hgs
parents:
diff changeset
  1015
hgs
parents:
diff changeset
  1016
        /* create video crop, this will be sink for videoPP pipeline */
hgs
parents:
diff changeset
  1017
        crop = gst_element_factory_make( "videocrop", "pp_crop");
hgs
parents:
diff changeset
  1018
        if(crop)
hgs
parents:
diff changeset
  1019
        {
hgs
parents:
diff changeset
  1020
            DEBUG_INFO("Created crop element");
hgs
parents:
diff changeset
  1021
            gst_bin_add(GST_BIN(vpp), crop);
hgs
parents:
diff changeset
  1022
        }
hgs
parents:
diff changeset
  1023
hgs
parents:
diff changeset
  1024
        /* create video rotate */
hgs
parents:
diff changeset
  1025
        rotate = gst_element_factory_make( "videoflip", "pp_rotate");
hgs
parents:
diff changeset
  1026
        if(rotate)
hgs
parents:
diff changeset
  1027
        {
hgs
parents:
diff changeset
  1028
            DEBUG_INFO("Created rotate element");
hgs
parents:
diff changeset
  1029
            g_object_set(G_OBJECT(rotate), "method", FLIP_NONE, NULL);
hgs
parents:
diff changeset
  1030
            gst_bin_add(GST_BIN(vpp), rotate);
hgs
parents:
diff changeset
  1031
        }
hgs
parents:
diff changeset
  1032
hgs
parents:
diff changeset
  1033
        /* create video mirror */
hgs
parents:
diff changeset
  1034
        mirror = gst_element_factory_make( "videoflip", "pp_mirror");
hgs
parents:
diff changeset
  1035
        if(mirror)
hgs
parents:
diff changeset
  1036
        {
hgs
parents:
diff changeset
  1037
            DEBUG_INFO("Created mirror element");
hgs
parents:
diff changeset
  1038
            g_object_set(G_OBJECT(mirror), "method", FLIP_NONE, NULL);
hgs
parents:
diff changeset
  1039
            gst_bin_add(GST_BIN(vpp), mirror);
hgs
parents:
diff changeset
  1040
        }
hgs
parents:
diff changeset
  1041
hgs
parents:
diff changeset
  1042
        /* create video box */
hgs
parents:
diff changeset
  1043
        box = gst_element_factory_make( "videobox", "pp_box");
hgs
parents:
diff changeset
  1044
        if(box)
hgs
parents:
diff changeset
  1045
        {
hgs
parents:
diff changeset
  1046
            DEBUG_INFO("Created videobox element");
hgs
parents:
diff changeset
  1047
            gst_bin_add(GST_BIN(vpp), box);
hgs
parents:
diff changeset
  1048
        }
hgs
parents:
diff changeset
  1049
hgs
parents:
diff changeset
  1050
        /* create video balance */
hgs
parents:
diff changeset
  1051
        balance = gst_element_factory_make( "videobalance", "pp_balance");
hgs
parents:
diff changeset
  1052
        if(balance)
hgs
parents:
diff changeset
  1053
        {
hgs
parents:
diff changeset
  1054
            DEBUG_INFO("Created balance element");
hgs
parents:
diff changeset
  1055
            gst_bin_add(GST_BIN(vpp), balance);
hgs
parents:
diff changeset
  1056
        }
hgs
parents:
diff changeset
  1057
hgs
parents:
diff changeset
  1058
        /* create video gamma */
hgs
parents:
diff changeset
  1059
        gamma = gst_element_factory_make( "gamma", "pp_gamma");
hgs
parents:
diff changeset
  1060
        if(gamma)
hgs
parents:
diff changeset
  1061
        {
hgs
parents:
diff changeset
  1062
            DEBUG_INFO("Created gamma element");
hgs
parents:
diff changeset
  1063
            gst_bin_add(GST_BIN(vpp), gamma);
hgs
parents:
diff changeset
  1064
        }
hgs
parents:
diff changeset
  1065
hgs
parents:
diff changeset
  1066
        /* Create videoscale element to scale postprocessed output to correct size */
hgs
parents:
diff changeset
  1067
        scale = gst_element_factory_make("videoscale", "pp_scale");
hgs
parents:
diff changeset
  1068
        if ( scale )
hgs
parents:
diff changeset
  1069
        {
hgs
parents:
diff changeset
  1070
            DEBUG_INFO("Created videoscale element");
hgs
parents:
diff changeset
  1071
            gst_bin_add(GST_BIN(vpp), scale);
hgs
parents:
diff changeset
  1072
        }
hgs
parents:
diff changeset
  1073
        scale2 = gst_element_factory_make("videoscale", "pp_scale2");
hgs
parents:
diff changeset
  1074
        if ( scale2 )
hgs
parents:
diff changeset
  1075
        {
hgs
parents:
diff changeset
  1076
            GstPad *pad = NULL;
hgs
parents:
diff changeset
  1077
            GstCaps *caps = NULL;
hgs
parents:
diff changeset
  1078
            DEBUG_INFO("Created videoscale element");
hgs
parents:
diff changeset
  1079
            pad = gst_element_get_static_pad(scale2,"src");
hgs
parents:
diff changeset
  1080
            caps = gst_caps_new_simple("video/x-raw-yuv",
hgs
parents:
diff changeset
  1081
                     "width", G_TYPE_INT,0,
hgs
parents:
diff changeset
  1082
                     "height", G_TYPE_INT,0,
hgs
parents:
diff changeset
  1083
                     NULL);
hgs
parents:
diff changeset
  1084
            gst_pad_set_caps(pad, caps);
hgs
parents:
diff changeset
  1085
            gst_bin_add(GST_BIN(vpp), scale2);
hgs
parents:
diff changeset
  1086
        }
hgs
parents:
diff changeset
  1087
hgs
parents:
diff changeset
  1088
        /* create capsfilter for fixed video size */
hgs
parents:
diff changeset
  1089
        filter = gst_element_factory_make("capsfilter", "pp_filter");
hgs
parents:
diff changeset
  1090
        if ( filter )
hgs
parents:
diff changeset
  1091
        {
hgs
parents:
diff changeset
  1092
hgs
parents:
diff changeset
  1093
            g_object_set( G_OBJECT(filter), "caps",
hgs
parents:
diff changeset
  1094
                            gst_caps_new_simple("video/x-raw-yuv",
hgs
parents:
diff changeset
  1095
                                                "width", G_TYPE_INT, TEST_VIDEO_WIDTH,
hgs
parents:
diff changeset
  1096
                                                "height", G_TYPE_INT, TEST_VIDEO_HEIGHT, NULL)
hgs
parents:
diff changeset
  1097
                                                ,NULL );
hgs
parents:
diff changeset
  1098
            gst_bin_add(GST_BIN(vpp), filter);
hgs
parents:
diff changeset
  1099
        }
hgs
parents:
diff changeset
  1100
hgs
parents:
diff changeset
  1101
        /* create video queue */
hgs
parents:
diff changeset
  1102
        queue = gst_element_factory_make( "queue", "vpp_queue");
hgs
parents:
diff changeset
  1103
        if(queue)
hgs
parents:
diff changeset
  1104
        {
hgs
parents:
diff changeset
  1105
            gst_bin_add(GST_BIN(vpp), queue);
hgs
parents:
diff changeset
  1106
        }
hgs
parents:
diff changeset
  1107
hgs
parents:
diff changeset
  1108
hgs
parents:
diff changeset
  1109
        /* Crete ffmpegcolorspace to convert stream to correct format */
hgs
parents:
diff changeset
  1110
        col2 = gst_element_factory_make( "ffmpegcolorspace", "pp_colsp2");
hgs
parents:
diff changeset
  1111
        if(col2)
hgs
parents:
diff changeset
  1112
        {
hgs
parents:
diff changeset
  1113
            DEBUG_INFO("Created ffmpegcolorspace element");
hgs
parents:
diff changeset
  1114
            gst_bin_add(GST_BIN(vpp), col2);
hgs
parents:
diff changeset
  1115
            /* make this bin link point*/
hgs
parents:
diff changeset
  1116
            ghostsrc = gst_element_get_static_pad(col2,"src");
hgs
parents:
diff changeset
  1117
            if(ghostsrc)
hgs
parents:
diff changeset
  1118
            {
hgs
parents:
diff changeset
  1119
                gst_element_add_pad(vpp, gst_ghost_pad_new("videopp_src",ghostsrc));
hgs
parents:
diff changeset
  1120
                gst_object_unref(GST_OBJECT(ghostsrc));
hgs
parents:
diff changeset
  1121
            }
hgs
parents:
diff changeset
  1122
        }
hgs
parents:
diff changeset
  1123
        if( !(gst_element_link_many(col1,
hgs
parents:
diff changeset
  1124
                                    scale,
hgs
parents:
diff changeset
  1125
                                    crop,
hgs
parents:
diff changeset
  1126
                                    rotate,
hgs
parents:
diff changeset
  1127
                                    mirror,
hgs
parents:
diff changeset
  1128
                                    box,
hgs
parents:
diff changeset
  1129
                                    balance,
hgs
parents:
diff changeset
  1130
                                    gamma,
hgs
parents:
diff changeset
  1131
                                    queue,
hgs
parents:
diff changeset
  1132
                                    scale2,
hgs
parents:
diff changeset
  1133
                                    filter,
hgs
parents:
diff changeset
  1134
                                    col2,
hgs
parents:
diff changeset
  1135
                                    NULL)
hgs
parents:
diff changeset
  1136
                                    ) )
hgs
parents:
diff changeset
  1137
        {
hgs
parents:
diff changeset
  1138
            DEBUG_ERR("Could not link videopp elements!!");
hgs
parents:
diff changeset
  1139
            gst_object_unref(vpp);
hgs
parents:
diff changeset
  1140
            vpp = NULL;
hgs
parents:
diff changeset
  1141
        }
hgs
parents:
diff changeset
  1142
    }
hgs
parents:
diff changeset
  1143
    DEBUG_API("<-XAAdaptationGst_CreateFixedSizeVideoPP");
hgs
parents:
diff changeset
  1144
    return vpp;
hgs
parents:
diff changeset
  1145
}
hgs
parents:
diff changeset
  1146
hgs
parents:
diff changeset
  1147
hgs
parents:
diff changeset
  1148
hgs
parents:
diff changeset
  1149
/**
hgs
parents:
diff changeset
  1150
 * GstElement* XAAdaptationGst_CreateVideoPPBlackScr( )
hgs
parents:
diff changeset
  1151
 * @return GstElement* - return newly created gst pipeline element
hgs
parents:
diff changeset
  1152
 * Description: Create video processing pipeline for black screen
hgs
parents:
diff changeset
  1153
 */
hgs
parents:
diff changeset
  1154
GstElement* XAAdaptationGst_CreateVideoPPBlackScr( )
hgs
parents:
diff changeset
  1155
{
hgs
parents:
diff changeset
  1156
    GstElement *vppBScr;
hgs
parents:
diff changeset
  1157
    DEBUG_API("->XAAdaptationGst_CreateVideoPPBlackScr");
hgs
parents:
diff changeset
  1158
    vppBScr = gst_pipeline_new("videoppBScr");
hgs
parents:
diff changeset
  1159
    if( vppBScr )
hgs
parents:
diff changeset
  1160
    {
hgs
parents:
diff changeset
  1161
        GstPad *ghostsrc=NULL;
hgs
parents:
diff changeset
  1162
        GstElement *testVideo=NULL, *scale=NULL;
hgs
parents:
diff changeset
  1163
        GstElement *ffmpegcolorspace=NULL;
hgs
parents:
diff changeset
  1164
hgs
parents:
diff changeset
  1165
        testVideo = gst_element_factory_make( "videotestsrc", "videotest");
hgs
parents:
diff changeset
  1166
        if(testVideo)
hgs
parents:
diff changeset
  1167
        {
hgs
parents:
diff changeset
  1168
            DEBUG_INFO("Created videotestsrc element");
hgs
parents:
diff changeset
  1169
hgs
parents:
diff changeset
  1170
            g_object_set(G_OBJECT(testVideo), "pattern", (gint)2, "num-buffers", (gint)1, NULL);
hgs
parents:
diff changeset
  1171
            gst_bin_add(GST_BIN(vppBScr), testVideo);
hgs
parents:
diff changeset
  1172
        }
hgs
parents:
diff changeset
  1173
hgs
parents:
diff changeset
  1174
        scale = gst_element_factory_make("videoscale", "BSrc_scale");
hgs
parents:
diff changeset
  1175
        if(scale)
hgs
parents:
diff changeset
  1176
        {
hgs
parents:
diff changeset
  1177
            DEBUG_INFO("Created videoscale element");
hgs
parents:
diff changeset
  1178
            gst_bin_add(GST_BIN(vppBScr), scale);
hgs
parents:
diff changeset
  1179
            /* make this bin link point*/
hgs
parents:
diff changeset
  1180
            ghostsrc = gst_element_get_static_pad(scale,"src");
hgs
parents:
diff changeset
  1181
            if(ghostsrc)
hgs
parents:
diff changeset
  1182
            {
hgs
parents:
diff changeset
  1183
                gst_element_add_pad(vppBScr, gst_ghost_pad_new("videoppBSrc_src",ghostsrc));
hgs
parents:
diff changeset
  1184
                gst_object_unref(GST_OBJECT(ghostsrc));
hgs
parents:
diff changeset
  1185
            }
hgs
parents:
diff changeset
  1186
        }
hgs
parents:
diff changeset
  1187
        ffmpegcolorspace = gst_element_factory_make("ffmpegcolorspace", "BlackScrFfmpeg");
hgs
parents:
diff changeset
  1188
        gst_bin_add(GST_BIN(vppBScr), ffmpegcolorspace);
hgs
parents:
diff changeset
  1189
        if( !(gst_element_link_many(testVideo, ffmpegcolorspace, scale, NULL)) )
hgs
parents:
diff changeset
  1190
        {
hgs
parents:
diff changeset
  1191
            DEBUG_ERR("Could not link videoppBSrc elements!!");
hgs
parents:
diff changeset
  1192
            gst_object_unref(vppBScr);
hgs
parents:
diff changeset
  1193
            vppBScr = NULL;
hgs
parents:
diff changeset
  1194
        }
hgs
parents:
diff changeset
  1195
    }
hgs
parents:
diff changeset
  1196
    DEBUG_API("<-XAAdaptationGst_CreateVideoPPBlackScr");
hgs
parents:
diff changeset
  1197
    return vppBScr;
hgs
parents:
diff changeset
  1198
}
hgs
parents:
diff changeset
  1199
hgs
parents:
diff changeset
  1200
/**
hgs
parents:
diff changeset
  1201
 * GstElement* XAAdaptationGst_CreateInputSelector( )
hgs
parents:
diff changeset
  1202
 * @return GstElement* - return newly created input selector
hgs
parents:
diff changeset
  1203
 * Description: Create input selector to processing between black screen and video screen
hgs
parents:
diff changeset
  1204
 */
hgs
parents:
diff changeset
  1205
GstElement* XAAdaptationGst_CreateInputSelector( )
hgs
parents:
diff changeset
  1206
{
hgs
parents:
diff changeset
  1207
    GstElement *inputSelector;
hgs
parents:
diff changeset
  1208
    DEBUG_API("->XAAdaptationGst_CreateInputSelector");
hgs
parents:
diff changeset
  1209
    inputSelector = gst_element_factory_make("input-selector", "input-selector");
hgs
parents:
diff changeset
  1210
    if( inputSelector )
hgs
parents:
diff changeset
  1211
    {
hgs
parents:
diff changeset
  1212
        g_object_set(G_OBJECT(inputSelector), "select-all", TRUE, NULL);
hgs
parents:
diff changeset
  1213
    }
hgs
parents:
diff changeset
  1214
    DEBUG_API("<-XAAdaptationGst_CreateInputSelector");
hgs
parents:
diff changeset
  1215
    return inputSelector;
hgs
parents:
diff changeset
  1216
}
hgs
parents:
diff changeset
  1217
hgs
parents:
diff changeset
  1218
/**
hgs
parents:
diff changeset
  1219
 * GstElement* XAAdaptationGst_CreateAudioPP( )
hgs
parents:
diff changeset
  1220
 * @return GstElement* - return newly created gst pipeline element
hgs
parents:
diff changeset
  1221
 * Description: Create video processing pipeline
hgs
parents:
diff changeset
  1222
 */
hgs
parents:
diff changeset
  1223
GstElement* XAAdaptationGst_CreateAudioPP( )
hgs
parents:
diff changeset
  1224
{
hgs
parents:
diff changeset
  1225
    GstElement *app;
hgs
parents:
diff changeset
  1226
    gboolean ok = TRUE;
hgs
parents:
diff changeset
  1227
    DEBUG_API("->XAAdaptationGst_CreateAudioPP");
hgs
parents:
diff changeset
  1228
    app = gst_pipeline_new("audiopp");
hgs
parents:
diff changeset
  1229
    if( app )
hgs
parents:
diff changeset
  1230
    {
hgs
parents:
diff changeset
  1231
        GstPad *ghostsink, *ghostsrc;
hgs
parents:
diff changeset
  1232
        GstElement *ac,*vol,*eq,*queue,*pan, *ac2;
hgs
parents:
diff changeset
  1233
hgs
parents:
diff changeset
  1234
        /* first and last elements should be audioconverts to match sink and encoder formats */
hgs
parents:
diff changeset
  1235
        ac = gst_element_factory_make( "audioconvert", "pp_ac");
hgs
parents:
diff changeset
  1236
        if (ac)
hgs
parents:
diff changeset
  1237
        {
hgs
parents:
diff changeset
  1238
            ok = gst_bin_add(GST_BIN(app), ac);
hgs
parents:
diff changeset
  1239
            /* make this bin link point*/
hgs
parents:
diff changeset
  1240
            if (ok)
hgs
parents:
diff changeset
  1241
            {
hgs
parents:
diff changeset
  1242
                ghostsink = gst_element_get_static_pad(ac,"sink");
hgs
parents:
diff changeset
  1243
                ok = gst_element_add_pad(app, gst_ghost_pad_new("sink",ghostsink));
hgs
parents:
diff changeset
  1244
                gst_object_unref(GST_OBJECT(ghostsink));
hgs
parents:
diff changeset
  1245
            }
hgs
parents:
diff changeset
  1246
        }
hgs
parents:
diff changeset
  1247
        ac2 = gst_element_factory_make( "audioconvert", "pp_ac2");
hgs
parents:
diff changeset
  1248
        if (ac2 && ok)
hgs
parents:
diff changeset
  1249
        {
hgs
parents:
diff changeset
  1250
            ok = gst_bin_add(GST_BIN(app), ac2);
hgs
parents:
diff changeset
  1251
            /* make this bin link point*/
hgs
parents:
diff changeset
  1252
            if (ok)
hgs
parents:
diff changeset
  1253
            {
hgs
parents:
diff changeset
  1254
                ghostsrc = gst_element_get_static_pad(ac2,"src");
hgs
parents:
diff changeset
  1255
                ok = gst_element_add_pad(app, gst_ghost_pad_new("src",ghostsrc));
hgs
parents:
diff changeset
  1256
                gst_object_unref(GST_OBJECT(ghostsrc));
hgs
parents:
diff changeset
  1257
            }
hgs
parents:
diff changeset
  1258
        }
hgs
parents:
diff changeset
  1259
hgs
parents:
diff changeset
  1260
        vol = gst_element_factory_make( "volume", "pp_vol");
hgs
parents:
diff changeset
  1261
        /* create volume controller */
hgs
parents:
diff changeset
  1262
        if (vol && ok)
hgs
parents:
diff changeset
  1263
        {
hgs
parents:
diff changeset
  1264
            ok = gst_bin_add(GST_BIN(app), vol);
hgs
parents:
diff changeset
  1265
            g_object_set( G_OBJECT(vol), "volume", (gdouble)1, NULL );
hgs
parents:
diff changeset
  1266
        }
hgs
parents:
diff changeset
  1267
        /* create 10-band equalizer */
hgs
parents:
diff changeset
  1268
        eq = gst_element_factory_make( "equalizer-10bands", "pp_equ");
hgs
parents:
diff changeset
  1269
        if (eq && ok)
hgs
parents:
diff changeset
  1270
        {
hgs
parents:
diff changeset
  1271
            ok = gst_bin_add(GST_BIN(app), eq);
hgs
parents:
diff changeset
  1272
        }
hgs
parents:
diff changeset
  1273
        /* create audio queue */
hgs
parents:
diff changeset
  1274
        queue = gst_element_factory_make( "queue", "app_queue");
hgs
parents:
diff changeset
  1275
        if(queue && ok)
hgs
parents:
diff changeset
  1276
        {
hgs
parents:
diff changeset
  1277
            ok = gst_bin_add(GST_BIN(app), queue);
hgs
parents:
diff changeset
  1278
            g_object_set (G_OBJECT (queue), "max-size-buffers", 2, NULL);
hgs
parents:
diff changeset
  1279
        }
hgs
parents:
diff changeset
  1280
        /* create audio pan effect */
hgs
parents:
diff changeset
  1281
        pan = gst_element_factory_make( "audiopanorama", "pp_pan");
hgs
parents:
diff changeset
  1282
        if (pan && ok)
hgs
parents:
diff changeset
  1283
        {
hgs
parents:
diff changeset
  1284
            ok = gst_bin_add(GST_BIN(app), pan);
hgs
parents:
diff changeset
  1285
        }
hgs
parents:
diff changeset
  1286
hgs
parents:
diff changeset
  1287
        if (ac && ok)
hgs
parents:
diff changeset
  1288
        {
hgs
parents:
diff changeset
  1289
            if (queue)
hgs
parents:
diff changeset
  1290
            {
hgs
parents:
diff changeset
  1291
                ok = gst_element_link(ac, queue);
hgs
parents:
diff changeset
  1292
            }
hgs
parents:
diff changeset
  1293
            else if (vol)
hgs
parents:
diff changeset
  1294
            {
hgs
parents:
diff changeset
  1295
                ok = gst_element_link(ac, vol);
hgs
parents:
diff changeset
  1296
            }
hgs
parents:
diff changeset
  1297
            else if (pan)
hgs
parents:
diff changeset
  1298
            {
hgs
parents:
diff changeset
  1299
                ok = gst_element_link(ac, pan);
hgs
parents:
diff changeset
  1300
            }
hgs
parents:
diff changeset
  1301
            else if (eq)
hgs
parents:
diff changeset
  1302
            {
hgs
parents:
diff changeset
  1303
                ok = gst_element_link(ac, eq);
hgs
parents:
diff changeset
  1304
            }
hgs
parents:
diff changeset
  1305
            else if (ac2)
hgs
parents:
diff changeset
  1306
            {
hgs
parents:
diff changeset
  1307
                ok = gst_element_link(ac, ac2);
hgs
parents:
diff changeset
  1308
            }
hgs
parents:
diff changeset
  1309
        }
hgs
parents:
diff changeset
  1310
        if (queue && ok)
hgs
parents:
diff changeset
  1311
        {
hgs
parents:
diff changeset
  1312
            if (vol)
hgs
parents:
diff changeset
  1313
            {
hgs
parents:
diff changeset
  1314
                ok = gst_element_link(queue, vol);
hgs
parents:
diff changeset
  1315
            }
hgs
parents:
diff changeset
  1316
            else if (pan)
hgs
parents:
diff changeset
  1317
            {
hgs
parents:
diff changeset
  1318
                ok = gst_element_link(queue, pan);
hgs
parents:
diff changeset
  1319
            }
hgs
parents:
diff changeset
  1320
            else if (eq)
hgs
parents:
diff changeset
  1321
            {
hgs
parents:
diff changeset
  1322
                ok = gst_element_link(queue, eq);
hgs
parents:
diff changeset
  1323
            }
hgs
parents:
diff changeset
  1324
            else if (ac2)
hgs
parents:
diff changeset
  1325
            {
hgs
parents:
diff changeset
  1326
                ok = gst_element_link(queue, ac2);
hgs
parents:
diff changeset
  1327
            }
hgs
parents:
diff changeset
  1328
        }
hgs
parents:
diff changeset
  1329
        if (vol && ok)
hgs
parents:
diff changeset
  1330
        {
hgs
parents:
diff changeset
  1331
            if (pan)
hgs
parents:
diff changeset
  1332
            {
hgs
parents:
diff changeset
  1333
                ok = gst_element_link(vol, pan);
hgs
parents:
diff changeset
  1334
            }
hgs
parents:
diff changeset
  1335
            else if (eq)
hgs
parents:
diff changeset
  1336
            {
hgs
parents:
diff changeset
  1337
                ok = gst_element_link(vol, eq);
hgs
parents:
diff changeset
  1338
            }
hgs
parents:
diff changeset
  1339
            else if (ac2)
hgs
parents:
diff changeset
  1340
            {
hgs
parents:
diff changeset
  1341
                ok = gst_element_link(vol, ac2);
hgs
parents:
diff changeset
  1342
            }
hgs
parents:
diff changeset
  1343
        }
hgs
parents:
diff changeset
  1344
        if (pan && ok)
hgs
parents:
diff changeset
  1345
        {
hgs
parents:
diff changeset
  1346
            if (eq)
hgs
parents:
diff changeset
  1347
            {
hgs
parents:
diff changeset
  1348
                ok = gst_element_link(pan, eq);
hgs
parents:
diff changeset
  1349
            }
hgs
parents:
diff changeset
  1350
            else if (ac2)
hgs
parents:
diff changeset
  1351
            {
hgs
parents:
diff changeset
  1352
                ok = gst_element_link(pan, ac2);
hgs
parents:
diff changeset
  1353
            }
hgs
parents:
diff changeset
  1354
        }
hgs
parents:
diff changeset
  1355
        if (eq && ok)
hgs
parents:
diff changeset
  1356
        {
hgs
parents:
diff changeset
  1357
            if (ac2)
hgs
parents:
diff changeset
  1358
            {
hgs
parents:
diff changeset
  1359
                ok = gst_element_link(eq, ac2);
hgs
parents:
diff changeset
  1360
            }
hgs
parents:
diff changeset
  1361
        }
hgs
parents:
diff changeset
  1362
        
hgs
parents:
diff changeset
  1363
        if (ac)
hgs
parents:
diff changeset
  1364
        {
hgs
parents:
diff changeset
  1365
            // ghost sink above
hgs
parents:
diff changeset
  1366
        }
hgs
parents:
diff changeset
  1367
        else if (queue && ok)
hgs
parents:
diff changeset
  1368
        {
hgs
parents:
diff changeset
  1369
            /* make this bin link point*/
hgs
parents:
diff changeset
  1370
            ghostsink = gst_element_get_static_pad(queue,"sink");
hgs
parents:
diff changeset
  1371
            ok = gst_element_add_pad(app, gst_ghost_pad_new("sink",ghostsink));
hgs
parents:
diff changeset
  1372
            gst_object_unref(GST_OBJECT(ghostsink));
hgs
parents:
diff changeset
  1373
        }
hgs
parents:
diff changeset
  1374
        else if (vol && ok)
hgs
parents:
diff changeset
  1375
        {
hgs
parents:
diff changeset
  1376
            /* make this bin link point*/
hgs
parents:
diff changeset
  1377
            ghostsink = gst_element_get_static_pad(vol,"sink");
hgs
parents:
diff changeset
  1378
            ok = gst_element_add_pad(app, gst_ghost_pad_new("sink",ghostsink));
hgs
parents:
diff changeset
  1379
            gst_object_unref(GST_OBJECT(ghostsink));
hgs
parents:
diff changeset
  1380
        }
hgs
parents:
diff changeset
  1381
        else if (pan && ok)
hgs
parents:
diff changeset
  1382
        {
hgs
parents:
diff changeset
  1383
            /* make this bin link point*/
hgs
parents:
diff changeset
  1384
            ghostsink = gst_element_get_static_pad(pan,"sink");
hgs
parents:
diff changeset
  1385
            ok = gst_element_add_pad(app, gst_ghost_pad_new("sink",ghostsink));
hgs
parents:
diff changeset
  1386
            gst_object_unref(GST_OBJECT(ghostsink));
hgs
parents:
diff changeset
  1387
        }
hgs
parents:
diff changeset
  1388
        else if (eq && ok)
hgs
parents:
diff changeset
  1389
        {
hgs
parents:
diff changeset
  1390
            /* make this bin link point*/
hgs
parents:
diff changeset
  1391
            ghostsink = gst_element_get_static_pad(eq,"sink");
hgs
parents:
diff changeset
  1392
            ok = gst_element_add_pad(app, gst_ghost_pad_new("sink",ghostsink));
hgs
parents:
diff changeset
  1393
            gst_object_unref(GST_OBJECT(ghostsink));
hgs
parents:
diff changeset
  1394
        }
hgs
parents:
diff changeset
  1395
        else if (ac2 && ok)
hgs
parents:
diff changeset
  1396
        {
hgs
parents:
diff changeset
  1397
            /* make this bin link point*/
hgs
parents:
diff changeset
  1398
            ghostsink = gst_element_get_static_pad(ac2,"sink");
hgs
parents:
diff changeset
  1399
            ok = gst_element_add_pad(app, gst_ghost_pad_new("sink",ghostsink));
hgs
parents:
diff changeset
  1400
            gst_object_unref(GST_OBJECT(ghostsink));
hgs
parents:
diff changeset
  1401
        }
hgs
parents:
diff changeset
  1402
        
hgs
parents:
diff changeset
  1403
        if (ac2)
hgs
parents:
diff changeset
  1404
        {
hgs
parents:
diff changeset
  1405
            // ghost src above
hgs
parents:
diff changeset
  1406
        }
hgs
parents:
diff changeset
  1407
        else if (eq && ok)
hgs
parents:
diff changeset
  1408
        {
hgs
parents:
diff changeset
  1409
            /* make this bin link point*/
hgs
parents:
diff changeset
  1410
            ghostsrc = gst_element_get_static_pad(eq,"src");
hgs
parents:
diff changeset
  1411
            ok = gst_element_add_pad(app, gst_ghost_pad_new("src",ghostsrc));
hgs
parents:
diff changeset
  1412
            gst_object_unref(GST_OBJECT(ghostsrc));
hgs
parents:
diff changeset
  1413
        }
hgs
parents:
diff changeset
  1414
        else if (pan && ok)
hgs
parents:
diff changeset
  1415
        {
hgs
parents:
diff changeset
  1416
            /* make this bin link point*/
hgs
parents:
diff changeset
  1417
            ghostsrc = gst_element_get_static_pad(pan,"src");
hgs
parents:
diff changeset
  1418
            ok = gst_element_add_pad(app, gst_ghost_pad_new("src",ghostsrc));
hgs
parents:
diff changeset
  1419
            gst_object_unref(GST_OBJECT(ghostsrc));
hgs
parents:
diff changeset
  1420
        }
hgs
parents:
diff changeset
  1421
        else if (vol && ok)
hgs
parents:
diff changeset
  1422
        {
hgs
parents:
diff changeset
  1423
            /* make this bin link point*/
hgs
parents:
diff changeset
  1424
            ghostsrc = gst_element_get_static_pad(vol,"src");
hgs
parents:
diff changeset
  1425
            ok = gst_element_add_pad(app, gst_ghost_pad_new("src",ghostsrc));
hgs
parents:
diff changeset
  1426
            gst_object_unref(GST_OBJECT(ghostsrc));
hgs
parents:
diff changeset
  1427
        }
hgs
parents:
diff changeset
  1428
        else if (queue && ok)
hgs
parents:
diff changeset
  1429
        {
hgs
parents:
diff changeset
  1430
            /* make this bin link point*/
hgs
parents:
diff changeset
  1431
            ghostsrc = gst_element_get_static_pad(queue,"src");
hgs
parents:
diff changeset
  1432
            ok = gst_element_add_pad(app, gst_ghost_pad_new("src",ghostsrc));
hgs
parents:
diff changeset
  1433
            gst_object_unref(GST_OBJECT(ghostsrc));
hgs
parents:
diff changeset
  1434
        }
hgs
parents:
diff changeset
  1435
        else if (ac && ok)
hgs
parents:
diff changeset
  1436
        {
hgs
parents:
diff changeset
  1437
            /* make this bin link point*/
hgs
parents:
diff changeset
  1438
            ghostsrc = gst_element_get_static_pad(ac,"src");
hgs
parents:
diff changeset
  1439
            ok = gst_element_add_pad(app, gst_ghost_pad_new("src",ghostsrc));
hgs
parents:
diff changeset
  1440
            gst_object_unref(GST_OBJECT(ghostsrc));
hgs
parents:
diff changeset
  1441
        }
hgs
parents:
diff changeset
  1442
            
hgs
parents:
diff changeset
  1443
//        if( !(gst_element_link_many(ac, queue, vol, ac2, NULL)) )
hgs
parents:
diff changeset
  1444
//        if( !(gst_element_link_many(ac, queue, vol, pan, eq, ac2, NULL)) )
hgs
parents:
diff changeset
  1445
        if (!ok)
hgs
parents:
diff changeset
  1446
        {
hgs
parents:
diff changeset
  1447
            DEBUG_ERR("Could not link audiopp elements!!");
hgs
parents:
diff changeset
  1448
            gst_object_unref(app);
hgs
parents:
diff changeset
  1449
            app = NULL;
hgs
parents:
diff changeset
  1450
        }
hgs
parents:
diff changeset
  1451
    }
hgs
parents:
diff changeset
  1452
hgs
parents:
diff changeset
  1453
    DEBUG_API("<-XAAdaptationGst_CreateAudioPP");
hgs
parents:
diff changeset
  1454
    return app;
hgs
parents:
diff changeset
  1455
}
hgs
parents:
diff changeset
  1456
hgs
parents:
diff changeset
  1457
/* called when pad is actually blocking/ gets unblocked*/
hgs
parents:
diff changeset
  1458
void XAAdaptationGst_PadBlockCb(GstPad *pad, gboolean blocked, gpointer user_data)
hgs
parents:
diff changeset
  1459
{
hgs
parents:
diff changeset
  1460
    DEBUG_API_A2("->XAAdaptationGst_PadBlockCb   pad \"%s\" of \"%s\" ",
hgs
parents:
diff changeset
  1461
                        GST_OBJECT_NAME(pad),
hgs
parents:
diff changeset
  1462
                        GST_OBJECT_NAME(gst_pad_get_parent_element(pad)) );
hgs
parents:
diff changeset
  1463
    DEBUG_API_A1("<-XAAdaptationGst_PadBlockCb   blocked:%d",blocked);
hgs
parents:
diff changeset
  1464
}
hgs
parents:
diff changeset
  1465
hgs
parents:
diff changeset
  1466
/* utility to set same fields for all media types in caps */
hgs
parents:
diff changeset
  1467
void XAAdaptationGst_SetAllCaps (GstCaps * caps, char *field, ...)
hgs
parents:
diff changeset
  1468
{
hgs
parents:
diff changeset
  1469
    GstStructure *structure;
hgs
parents:
diff changeset
  1470
    va_list var_args;
hgs
parents:
diff changeset
  1471
    int i;
hgs
parents:
diff changeset
  1472
hgs
parents:
diff changeset
  1473
    for (i = 0; i < gst_caps_get_size (caps); i++)
hgs
parents:
diff changeset
  1474
    {
hgs
parents:
diff changeset
  1475
        structure = gst_caps_get_structure (caps, i);
hgs
parents:
diff changeset
  1476
        va_start (var_args, field);
hgs
parents:
diff changeset
  1477
        gst_structure_set_valist (structure, field, var_args);
hgs
parents:
diff changeset
  1478
        va_end (var_args);
hgs
parents:
diff changeset
  1479
    }
hgs
parents:
diff changeset
  1480
}
hgs
parents:
diff changeset
  1481
hgs
parents:
diff changeset
  1482