khronosfws/openmax_al/src/gst_adaptation/xamediarecorderadaptctx.c
author hgs
Tue, 21 Sep 2010 11:38:43 -0500
changeset 53 eabc8c503852
parent 43 9894ed580e4a
permissions -rw-r--r--
201037
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
*
25
hgs
parents: 20
diff changeset
    14
* Description: Media Recorder Adaptation for GST
19
hgs
parents:
diff changeset
    15
*
hgs
parents:
diff changeset
    16
*/
hgs
parents:
diff changeset
    17
hgs
parents:
diff changeset
    18
#include <string.h>
20
hgs
parents: 19
diff changeset
    19
#include <gst/gst.h>
19
hgs
parents:
diff changeset
    20
#include "xacapabilitiesmgr.h"
hgs
parents:
diff changeset
    21
#include "xamediarecorderadaptctx.h"
53
hgs
parents: 43
diff changeset
    22
#include "xaobjectitf.h"
19
hgs
parents:
diff changeset
    23
/*forward declarations*/
hgs
parents:
diff changeset
    24
GstElement* XAMediaRecorderAdapt_CreateEncodeBin(
hgs
parents:
diff changeset
    25
        XAMediaRecorderAdaptationCtx* ctx);
hgs
parents:
diff changeset
    26
XAresult XAMediaRecorderAdapt_CreatePipeline(
hgs
parents:
diff changeset
    27
        XAMediaRecorderAdaptationCtx* ctx);
28
hgs
parents: 25
diff changeset
    28
19
hgs
parents:
diff changeset
    29
hgs
parents:
diff changeset
    30
/*
hgs
parents:
diff changeset
    31
 * gboolean XAMediaRecorderAdapt_GstBusCb( GstBus *bus, GstMessage *message, gpointer data )
hgs
parents:
diff changeset
    32
 * MediaPlayer Gst-bus message handler (Callback)
hgs
parents:
diff changeset
    33
 */
hgs
parents:
diff changeset
    34
gboolean XAMediaRecorderAdapt_GstBusCb(GstBus *bus, GstMessage *message,
hgs
parents:
diff changeset
    35
        gpointer data)
53
hgs
parents: 43
diff changeset
    36
    {
19
hgs
parents:
diff changeset
    37
    XAAdaptationGstCtx* bCtx = (XAAdaptationGstCtx*) data;
53
hgs
parents: 43
diff changeset
    38
    XAMediaRecorderAdaptationCtx* mCtx = (XAMediaRecorderAdaptationCtx*)data;
hgs
parents: 43
diff changeset
    39
19
hgs
parents:
diff changeset
    40
    /* only listen to pipeline messages */
53
hgs
parents: 43
diff changeset
    41
    DEBUG_API_A2_STR("->XAMediaRecorderAdapt_GstBusCb:\"%s\" from object \"%s\"",
hgs
parents: 43
diff changeset
    42
                    GST_MESSAGE_TYPE_NAME(message), GST_OBJECT_NAME(GST_MESSAGE_SRC(message)));
19
hgs
parents:
diff changeset
    43
53
hgs
parents: 43
diff changeset
    44
    switch( GST_MESSAGE_TYPE(message))
19
hgs
parents:
diff changeset
    45
        {
53
hgs
parents: 43
diff changeset
    46
        case GST_MESSAGE_EOS:
19
hgs
parents:
diff changeset
    47
            {
53
hgs
parents: 43
diff changeset
    48
            if (GST_MESSAGE_SRC(message)==GST_OBJECT(bCtx->bin))
hgs
parents: 43
diff changeset
    49
                {
19
hgs
parents:
diff changeset
    50
                /* stop position tracking */
hgs
parents:
diff changeset
    51
                if(mCtx->runpositiontimer > 0)
53
hgs
parents: 43
diff changeset
    52
                    {
19
hgs
parents:
diff changeset
    53
                    g_source_remove(mCtx->runpositiontimer);
53
hgs
parents: 43
diff changeset
    54
                    mCtx->runpositiontimer=0;
hgs
parents: 43
diff changeset
    55
                    }
19
hgs
parents:
diff changeset
    56
hgs
parents:
diff changeset
    57
                /* complete any ongoing client async operations */
hgs
parents:
diff changeset
    58
                XAAdaptationGst_CompleteAsyncWait(bCtx);
hgs
parents:
diff changeset
    59
hgs
parents:
diff changeset
    60
                if(mCtx->positionCb)
53
hgs
parents: 43
diff changeset
    61
                    {
19
hgs
parents:
diff changeset
    62
                    mCtx->positionCb(bCtx);
53
hgs
parents: 43
diff changeset
    63
                    }
19
hgs
parents:
diff changeset
    64
                bCtx->binWantedState = GST_STATE_PAUSED;
53
hgs
parents: 43
diff changeset
    65
                
hgs
parents: 43
diff changeset
    66
                if(bCtx->busError)
19
hgs
parents:
diff changeset
    67
                    {
53
hgs
parents: 43
diff changeset
    68
                    XAObjItfCBData objdata = {XA_OBJECT_EVENT_RESOURCES_LOST, XA_RESULT_RESOURCE_ERROR, XA_OBJECT_STATE_UNREALIZED, NULL};
hgs
parents: 43
diff changeset
    69
                    XAAdaptEvent event = {XA_OBJECTITFEVENTS, 0, sizeof(objdata), NULL };
hgs
parents: 43
diff changeset
    70
                    event.data = &objdata;
hgs
parents: 43
diff changeset
    71
                    /* send needed events */
hgs
parents: 43
diff changeset
    72
                    
hgs
parents: 43
diff changeset
    73
                    XAAdaptationBase_SendAdaptEvents(&bCtx->baseObj, &event );
19
hgs
parents:
diff changeset
    74
                    }
hgs
parents:
diff changeset
    75
                }
53
hgs
parents: 43
diff changeset
    76
            break;
hgs
parents: 43
diff changeset
    77
            }
hgs
parents: 43
diff changeset
    78
        case GST_MESSAGE_STATE_CHANGED:
hgs
parents: 43
diff changeset
    79
            {
hgs
parents: 43
diff changeset
    80
            if (GST_MESSAGE_SRC(message)==GST_OBJECT(bCtx->bin))
19
hgs
parents:
diff changeset
    81
                {
53
hgs
parents: 43
diff changeset
    82
                    GstState oldstate, newstate, pendingstate, gsttargetstate;
hgs
parents: 43
diff changeset
    83
                    gst_message_parse_state_changed(message, &oldstate, &newstate, &pendingstate);
hgs
parents: 43
diff changeset
    84
                    gsttargetstate = GST_STATE_TARGET(bCtx->bin);
hgs
parents: 43
diff changeset
    85
                    DEBUG_INFO_A4("old %d -> new %d (-> pending %d -> gsttarget %d)",
hgs
parents: 43
diff changeset
    86
                                   oldstate, newstate, pendingstate, gsttargetstate);
hgs
parents: 43
diff changeset
    87
                    if(gsttargetstate!=bCtx->binWantedState)
hgs
parents: 43
diff changeset
    88
                    {
hgs
parents: 43
diff changeset
    89
                        DEBUG_ERR_A1("WARNING: Gst target is not wanted target [%d]!!!", bCtx->binWantedState);
hgs
parents: 43
diff changeset
    90
                    }
hgs
parents: 43
diff changeset
    91
                    /* print out some more info */
hgs
parents: 43
diff changeset
    92
                    if( pendingstate == GST_STATE_VOID_PENDING )
19
hgs
parents:
diff changeset
    93
                    {
53
hgs
parents: 43
diff changeset
    94
                        if( newstate != bCtx->binWantedState )
hgs
parents: 43
diff changeset
    95
                        {
hgs
parents: 43
diff changeset
    96
                            DEBUG_INFO_A2("Gst in intermediate state transition (curr %d, target %d)",
hgs
parents: 43
diff changeset
    97
                                        newstate,bCtx->binWantedState);
hgs
parents: 43
diff changeset
    98
                        }
hgs
parents: 43
diff changeset
    99
                        else
hgs
parents: 43
diff changeset
   100
                        {
hgs
parents: 43
diff changeset
   101
                            DEBUG_INFO_A1("Gst in wanted target state (%d)",newstate);
hgs
parents: 43
diff changeset
   102
                        }
hgs
parents: 43
diff changeset
   103
                    }
hgs
parents: 43
diff changeset
   104
                    if( oldstate!=GST_STATE_PLAYING && newstate==GST_STATE_PLAYING )
hgs
parents: 43
diff changeset
   105
                    {
hgs
parents: 43
diff changeset
   106
                        XAAdaptEvent event = {XA_RECORDITFEVENTS, XA_RECORDEVENT_HEADMOVING, 0, NULL };
hgs
parents: 43
diff changeset
   107
                        /* send needed events */
hgs
parents: 43
diff changeset
   108
                        XAAdaptationBase_SendAdaptEvents(&bCtx->baseObj, &event );
hgs
parents: 43
diff changeset
   109
                        /* enable position tracking if needed */
hgs
parents: 43
diff changeset
   110
                        if( mCtx->runpositiontimer==0 && mCtx->trackpositionenabled && mCtx->positionCb )
hgs
parents: 43
diff changeset
   111
                        {
hgs
parents: 43
diff changeset
   112
                            mCtx->runpositiontimer = g_timeout_add(XA_ADAPT_PU_INTERVAL, mCtx->positionCb, mCtx);
hgs
parents: 43
diff changeset
   113
                        }
19
hgs
parents:
diff changeset
   114
                    }
hgs
parents:
diff changeset
   115
                }
hgs
parents:
diff changeset
   116
                break;
hgs
parents:
diff changeset
   117
            }
hgs
parents:
diff changeset
   118
53
hgs
parents: 43
diff changeset
   119
        case GST_MESSAGE_ASYNC_DONE:
19
hgs
parents:
diff changeset
   120
            {
hgs
parents:
diff changeset
   121
                /* some async sequence ended */
hgs
parents:
diff changeset
   122
                XAAdaptationGst_CompleteAsyncWait(bCtx);
hgs
parents:
diff changeset
   123
                break;
hgs
parents:
diff changeset
   124
            }
hgs
parents:
diff changeset
   125
53
hgs
parents: 43
diff changeset
   126
        case GST_MESSAGE_ERROR:
19
hgs
parents:
diff changeset
   127
            {
hgs
parents:
diff changeset
   128
                gchar* debug;
53
hgs
parents: 43
diff changeset
   129
                gst_message_parse_error(message, &(bCtx->busError), &debug);
hgs
parents: 43
diff changeset
   130
                DEBUG_ERR_A1_STR("Gst reports error \"%s\"", debug);
hgs
parents: 43
diff changeset
   131
                
19
hgs
parents:
diff changeset
   132
                /* stop waiting any ongoing async operations */
hgs
parents:
diff changeset
   133
                XAAdaptationGst_CompleteAsyncWait(bCtx);
hgs
parents:
diff changeset
   134
                break;
hgs
parents:
diff changeset
   135
            }
53
hgs
parents: 43
diff changeset
   136
        case GST_MESSAGE_WARNING:
19
hgs
parents:
diff changeset
   137
            {
hgs
parents:
diff changeset
   138
                GError* error;
hgs
parents:
diff changeset
   139
                gchar* debug;
hgs
parents:
diff changeset
   140
                gst_message_parse_warning(message, &error, &debug);
53
hgs
parents: 43
diff changeset
   141
                DEBUG_ERR_A1_STR("Gst reports warning \"%s\"", debug);
19
hgs
parents:
diff changeset
   142
                /* stop waiting any ongoing async operations */
hgs
parents:
diff changeset
   143
                XAAdaptationGst_CompleteAsyncWait(bCtx);
hgs
parents:
diff changeset
   144
                break;
hgs
parents:
diff changeset
   145
            }
53
hgs
parents: 43
diff changeset
   146
        default:
hgs
parents: 43
diff changeset
   147
            break;
19
hgs
parents:
diff changeset
   148
        }
hgs
parents:
diff changeset
   149
    DEBUG_API("<-XAMediaRecorderAdapt_GstBusCb");
hgs
parents:
diff changeset
   150
    return TRUE;
hgs
parents:
diff changeset
   151
    }
hgs
parents:
diff changeset
   152
hgs
parents:
diff changeset
   153
/*
hgs
parents:
diff changeset
   154
 * XAAdaptationGstCtx* XAMediaRecorderAdapt_Create()
hgs
parents:
diff changeset
   155
 * Allocates memory for Media Recorder Adaptation Context and makes 1st phase initialization
hgs
parents:
diff changeset
   156
 * @param XADataSource *pAudioSrc - pointer to OMX-AL audio source
hgs
parents:
diff changeset
   157
 * @param XADataSource *pImageVideoSrc - pointer image/video source
hgs
parents:
diff changeset
   158
 * @param XADataSink *pDataSnk - pointer to OMX-AL sink
hgs
parents:
diff changeset
   159
 * @returns XAMediaRecorderAdaptationCtx* - Pointer to created context, NULL if error occurs.
hgs
parents:
diff changeset
   160
 */
hgs
parents:
diff changeset
   161
XAAdaptationBaseCtx* XAMediaRecorderAdapt_Create(XADataSource* pAudioSrc,
hgs
parents:
diff changeset
   162
        XADataSource* pImageVideoSrc, XADataSink* pDataSnk, XAuint8 recModes)
53
hgs
parents: 43
diff changeset
   163
    {
19
hgs
parents:
diff changeset
   164
    XAMediaRecorderAdaptationCtx *pSelf = NULL;
hgs
parents:
diff changeset
   165
    DEBUG_API("->XAMediaRecorderAdapt_Create");
hgs
parents:
diff changeset
   166
hgs
parents:
diff changeset
   167
    pSelf = (XAMediaRecorderAdaptationCtx*)calloc(1, sizeof(XAMediaRecorderAdaptationCtx));
hgs
parents:
diff changeset
   168
    if (pSelf)
53
hgs
parents: 43
diff changeset
   169
        {
19
hgs
parents:
diff changeset
   170
        if (XAAdaptationGst_Init(&(pSelf->baseObj),
hgs
parents:
diff changeset
   171
                XAMediaRecorderAdaptation) != XA_RESULT_SUCCESS)
53
hgs
parents: 43
diff changeset
   172
            {
19
hgs
parents:
diff changeset
   173
            DEBUG_ERR("Failed to init base context!!!");
hgs
parents:
diff changeset
   174
            free(pSelf);
hgs
parents:
diff changeset
   175
            pSelf = NULL;
hgs
parents:
diff changeset
   176
            DEBUG_API("<-XAMediaRecorderAdapt_Create");
hgs
parents:
diff changeset
   177
            return NULL;
53
hgs
parents: 43
diff changeset
   178
            }
19
hgs
parents:
diff changeset
   179
        else
53
hgs
parents: 43
diff changeset
   180
            {
19
hgs
parents:
diff changeset
   181
            pSelf->baseObj.baseObj.fwtype = FWMgrFWGST;
hgs
parents:
diff changeset
   182
            pSelf->xaAudioSource = pAudioSrc;
hgs
parents:
diff changeset
   183
            pSelf->xaVideoSource = pImageVideoSrc;
hgs
parents:
diff changeset
   184
            pSelf->xaSink = pDataSnk;
hgs
parents:
diff changeset
   185
            pSelf->xaRecordState = XA_RECORDSTATE_STOPPED;
hgs
parents:
diff changeset
   186
            pSelf->recModes = recModes;
hgs
parents:
diff changeset
   187
            pSelf->isRecord = XA_BOOLEAN_FALSE;
hgs
parents:
diff changeset
   188
hgs
parents:
diff changeset
   189
            /* defaults from API spec */
hgs
parents:
diff changeset
   190
            /* no specified defaults for rest, determined later from container type */
hgs
parents:
diff changeset
   191
            pSelf->audioEncSettings.encoderId = XA_ADAPTID_UNINITED;
28
hgs
parents: 25
diff changeset
   192
            pSelf->audioEncSettings.channelsIn = 0;
hgs
parents: 25
diff changeset
   193
            pSelf->audioEncSettings.channelsOut = 0;
hgs
parents: 25
diff changeset
   194
            pSelf->audioEncSettings.bitsPerSample = 0;
hgs
parents: 25
diff changeset
   195
            pSelf->audioEncSettings.bitRate = 0;
hgs
parents: 25
diff changeset
   196
            pSelf->audioEncSettings.sampleRate = 0;
hgs
parents: 25
diff changeset
   197
            pSelf->audioEncSettings.rateControl = 0;
hgs
parents: 25
diff changeset
   198
            pSelf->audioEncSettings.profileSetting = 0;
hgs
parents: 25
diff changeset
   199
            pSelf->audioEncSettings.levelSetting = 0;
hgs
parents: 25
diff changeset
   200
            pSelf->audioEncSettings.channelMode = 0;
hgs
parents: 25
diff changeset
   201
            pSelf->audioEncSettings.streamFormat = 0;
hgs
parents: 25
diff changeset
   202
            pSelf->audioEncSettings.encodeOptions = 0;
hgs
parents: 25
diff changeset
   203
            pSelf->audioEncSettings.blockAlignment = 0;
53
hgs
parents: 43
diff changeset
   204
            }
19
hgs
parents:
diff changeset
   205
        }
hgs
parents:
diff changeset
   206
hgs
parents:
diff changeset
   207
    DEBUG_API("<-XAMediaRecorderAdapt_Create");
hgs
parents:
diff changeset
   208
    return (XAAdaptationBaseCtx*) &pSelf->baseObj;
53
hgs
parents: 43
diff changeset
   209
    }
19
hgs
parents:
diff changeset
   210
hgs
parents:
diff changeset
   211
/*
hgs
parents:
diff changeset
   212
 * XAresult XAMediaRecorderAdapt_PostInit()
hgs
parents:
diff changeset
   213
 * 2nd phase initialization of Media Recorder Adaptation Context
hgs
parents:
diff changeset
   214
 * @param XAAdaptationGstCtx* ctx - pointer to Media Recorder adaptation context
hgs
parents:
diff changeset
   215
 * @return XAresult - Success value
hgs
parents:
diff changeset
   216
 */
hgs
parents:
diff changeset
   217
XAresult XAMediaRecorderAdapt_PostInit(XAAdaptationGstCtx* bCtx)
53
hgs
parents: 43
diff changeset
   218
    {
19
hgs
parents:
diff changeset
   219
    GstStateChangeReturn gret;
hgs
parents:
diff changeset
   220
hgs
parents:
diff changeset
   221
    XAresult ret = XA_RESULT_SUCCESS;
hgs
parents:
diff changeset
   222
    XAMediaRecorderAdaptationCtx* ctx = NULL;
hgs
parents:
diff changeset
   223
    DEBUG_API("->XAMediaRecorderAdapt_PostInit");
hgs
parents:
diff changeset
   224
    if (bCtx == NULL || bCtx->baseObj.ctxId != XAMediaRecorderAdaptation)
53
hgs
parents: 43
diff changeset
   225
        {
33
hgs
parents: 28
diff changeset
   226
        DEBUG_ERR("Invalid parameter!!");
hgs
parents: 28
diff changeset
   227
        DEBUG_API("<-XAMediaRecorderAdapt_PostInit");
19
hgs
parents:
diff changeset
   228
        return XA_RESULT_PARAMETER_INVALID;
53
hgs
parents: 43
diff changeset
   229
        }
19
hgs
parents:
diff changeset
   230
    ctx = (XAMediaRecorderAdaptationCtx*) bCtx;
hgs
parents:
diff changeset
   231
hgs
parents:
diff changeset
   232
    ret = XAAdaptationGst_PostInit(bCtx);
hgs
parents:
diff changeset
   233
    if (ret != XA_RESULT_SUCCESS)
53
hgs
parents: 43
diff changeset
   234
        {
19
hgs
parents:
diff changeset
   235
        DEBUG_ERR("Gst context postinit failed!!");
hgs
parents:
diff changeset
   236
        return ret;
53
hgs
parents: 43
diff changeset
   237
        }
19
hgs
parents:
diff changeset
   238
hgs
parents:
diff changeset
   239
    /* top level bin for media recorder */
hgs
parents:
diff changeset
   240
    bCtx->bin = gst_pipeline_new("media_recorder");
hgs
parents:
diff changeset
   241
hgs
parents:
diff changeset
   242
    /* Create Gst bus listener. */
hgs
parents:
diff changeset
   243
    ret = XAAdaptationGst_InitGstListener(bCtx);
hgs
parents:
diff changeset
   244
    if (ret != XA_RESULT_SUCCESS)
53
hgs
parents: 43
diff changeset
   245
        {
19
hgs
parents:
diff changeset
   246
        DEBUG_ERR("Bus listener creation failed!!");
hgs
parents:
diff changeset
   247
        return ret;
53
hgs
parents: 43
diff changeset
   248
        }
19
hgs
parents:
diff changeset
   249
    /* Add Media Recorder specific handler */
hgs
parents:
diff changeset
   250
    if (bCtx->bus)
53
hgs
parents: 43
diff changeset
   251
        {
19
hgs
parents:
diff changeset
   252
        bCtx->busCb = XAMediaRecorderAdapt_GstBusCb;
hgs
parents:
diff changeset
   253
        gst_bus_add_signal_watch(bCtx->bus);
hgs
parents:
diff changeset
   254
        g_signal_connect(bCtx->bus, "message::eos", G_CALLBACK(bCtx->busCb), ctx );
hgs
parents:
diff changeset
   255
        g_signal_connect(bCtx->bus, "message::error", G_CALLBACK(bCtx->busCb), ctx );
hgs
parents:
diff changeset
   256
        g_signal_connect(bCtx->bus, "message::warning", G_CALLBACK(bCtx->busCb), ctx );
hgs
parents:
diff changeset
   257
        g_signal_connect(bCtx->bus, "message::state-changed", G_CALLBACK(bCtx->busCb), ctx );
hgs
parents:
diff changeset
   258
        g_signal_connect(bCtx->bus, "message::segment-done", G_CALLBACK(bCtx->busCb), ctx );
hgs
parents:
diff changeset
   259
        g_signal_connect(bCtx->bus, "message::async-done", G_CALLBACK(bCtx->busCb), ctx );
53
hgs
parents: 43
diff changeset
   260
        }
19
hgs
parents:
diff changeset
   261
    else
53
hgs
parents: 43
diff changeset
   262
        {
19
hgs
parents:
diff changeset
   263
        DEBUG_ERR("Failed to create message bus");
hgs
parents:
diff changeset
   264
        return XA_RESULT_INTERNAL_ERROR;
53
hgs
parents: 43
diff changeset
   265
        }
19
hgs
parents:
diff changeset
   266
hgs
parents:
diff changeset
   267
    /* create pipeline */
hgs
parents:
diff changeset
   268
    ret = XAMediaRecorderAdapt_CreatePipeline(ctx);
hgs
parents:
diff changeset
   269
    if (ret != XA_RESULT_SUCCESS)
53
hgs
parents: 43
diff changeset
   270
        {
19
hgs
parents:
diff changeset
   271
        DEBUG_ERR("Failed to create recorder pipeline");
hgs
parents:
diff changeset
   272
        return XA_RESULT_INTERNAL_ERROR;
53
hgs
parents: 43
diff changeset
   273
        }
19
hgs
parents:
diff changeset
   274
hgs
parents:
diff changeset
   275
#ifdef XA_IMPL_MEASURE_GST_DELAY
hgs
parents:
diff changeset
   276
    bCtx->startTime = clock();
hgs
parents:
diff changeset
   277
#endif /* XA_IMPL_MEASURE_GST_DELAY */
53
hgs
parents: 43
diff changeset
   278
    
19
hgs
parents:
diff changeset
   279
    /* roll up bin */
53
hgs
parents: 43
diff changeset
   280
    bCtx->binWantedState = GST_STATE_READY;
19
hgs
parents:
diff changeset
   281
    XAAdaptationGst_PrepareAsyncWait(bCtx);
hgs
parents:
diff changeset
   282
    gret = gst_element_set_state(GST_ELEMENT(bCtx->bin), bCtx->binWantedState);
hgs
parents:
diff changeset
   283
    if (gret == GST_STATE_CHANGE_ASYNC)
53
hgs
parents: 43
diff changeset
   284
        {
19
hgs
parents:
diff changeset
   285
        DEBUG_INFO("Wait for preroll");
hgs
parents:
diff changeset
   286
        XAAdaptationGst_StartAsyncWait(bCtx);DEBUG_INFO("Preroll ready");
53
hgs
parents: 43
diff changeset
   287
        }
19
hgs
parents:
diff changeset
   288
    else if (gret == GST_STATE_CHANGE_FAILURE)
53
hgs
parents: 43
diff changeset
   289
        {
19
hgs
parents:
diff changeset
   290
        DEBUG_ERR("Preroll FAILED");
hgs
parents:
diff changeset
   291
        /*ret = XA_RESULT_INTERNAL_ERROR;*/
53
hgs
parents: 43
diff changeset
   292
        }
19
hgs
parents:
diff changeset
   293
#ifdef XA_IMPL_MEASURE_GST_DELAY
hgs
parents:
diff changeset
   294
    bCtx->endTime = clock();
hgs
parents:
diff changeset
   295
    double diff = bCtx->endTime - bCtx->startTime;
hgs
parents:
diff changeset
   296
    diff = diff / CLOCKS_PER_SEC;
hgs
parents:
diff changeset
   297
    DEBUG_API_A1( "Starting up bin took %.4lf secs",diff);
hgs
parents:
diff changeset
   298
#endif /* XA_IMPL_MEASURE_GST_DELAY */
53
hgs
parents: 43
diff changeset
   299
19
hgs
parents:
diff changeset
   300
hgs
parents:
diff changeset
   301
    bCtx->waitingasyncop = XA_BOOLEAN_FALSE;
hgs
parents:
diff changeset
   302
hgs
parents:
diff changeset
   303
    DEBUG_API("<-XAMediaRecorderAdapt_PostInit");
hgs
parents:
diff changeset
   304
    return ret;
53
hgs
parents: 43
diff changeset
   305
    }
19
hgs
parents:
diff changeset
   306
hgs
parents:
diff changeset
   307
/*
hgs
parents:
diff changeset
   308
 * void XAMediaRecorderAdapt_Destroy( XAAdaptationGstCtx* bCtx )
hgs
parents:
diff changeset
   309
 * Destroys Media Recorder Adaptation Context
hgs
parents:
diff changeset
   310
 * @param ctx - Media Recorder Adaptation context to be destroyed
hgs
parents:
diff changeset
   311
 */
hgs
parents:
diff changeset
   312
void XAMediaRecorderAdapt_Destroy(XAAdaptationGstCtx* bCtx)
53
hgs
parents: 43
diff changeset
   313
    {
19
hgs
parents:
diff changeset
   314
    XAMediaRecorderAdaptationCtx* ctx = NULL;
hgs
parents:
diff changeset
   315
    char* fname = NULL;
hgs
parents:
diff changeset
   316
    DEBUG_API("->XAMediaRecorderAdapt_Destroy");
hgs
parents:
diff changeset
   317
hgs
parents:
diff changeset
   318
    if (bCtx == NULL || bCtx->baseObj.ctxId != XAMediaRecorderAdaptation)
53
hgs
parents: 43
diff changeset
   319
        {
33
hgs
parents: 28
diff changeset
   320
        DEBUG_ERR("Invalid parameter!!");
hgs
parents: 28
diff changeset
   321
        DEBUG_API("<-XAMediaRecorderAdapt_Destroy");
19
hgs
parents:
diff changeset
   322
        return;
53
hgs
parents: 43
diff changeset
   323
        }
19
hgs
parents:
diff changeset
   324
    ctx = (XAMediaRecorderAdaptationCtx*) bCtx;
hgs
parents:
diff changeset
   325
hgs
parents:
diff changeset
   326
    if (ctx->isRecord == XA_BOOLEAN_FALSE)
53
hgs
parents: 43
diff changeset
   327
        {
19
hgs
parents:
diff changeset
   328
        DEBUG_INFO("Removing unnecessary file.");
53
hgs
parents: 43
diff changeset
   329
hgs
parents: 43
diff changeset
   330
        if (ctx->xaSink && *((XAuint32*) (ctx->xaSink->pLocator))
hgs
parents: 43
diff changeset
   331
                == XA_DATALOCATOR_URI)
19
hgs
parents:
diff changeset
   332
            {
53
hgs
parents: 43
diff changeset
   333
            if (strncmp(
hgs
parents: 43
diff changeset
   334
                    (char *) ((XADataLocator_URI*) (ctx->xaSink->pLocator))->URI,
hgs
parents: 43
diff changeset
   335
                    "file:///", 8) == 0)
hgs
parents: 43
diff changeset
   336
                {
hgs
parents: 43
diff changeset
   337
                fname
hgs
parents: 43
diff changeset
   338
                        = (char *) &(((XADataLocator_URI*) (ctx->xaSink->pLocator))->URI[8]);
hgs
parents: 43
diff changeset
   339
                }
19
hgs
parents:
diff changeset
   340
            else
53
hgs
parents: 43
diff changeset
   341
                {
hgs
parents: 43
diff changeset
   342
                fname
hgs
parents: 43
diff changeset
   343
                        = (char *) ((XADataLocator_URI*) (ctx->xaSink->pLocator))->URI;
hgs
parents: 43
diff changeset
   344
                }
hgs
parents: 43
diff changeset
   345
19
hgs
parents:
diff changeset
   346
            if (remove(fname) != 0)
53
hgs
parents: 43
diff changeset
   347
                {
hgs
parents: 43
diff changeset
   348
                DEBUG_ERR_A1_STR("Cannot remove file %s", (char *)fname);
hgs
parents: 43
diff changeset
   349
                }
19
hgs
parents:
diff changeset
   350
            }
hgs
parents:
diff changeset
   351
        }
hgs
parents:
diff changeset
   352
hgs
parents:
diff changeset
   353
    if (bCtx->bus)
53
hgs
parents: 43
diff changeset
   354
        {
19
hgs
parents:
diff changeset
   355
        gst_bus_remove_signal_watch(bCtx->bus);
53
hgs
parents: 43
diff changeset
   356
        }
19
hgs
parents:
diff changeset
   357
    XAAdaptationGst_CancelAsyncWait(bCtx);
hgs
parents:
diff changeset
   358
hgs
parents:
diff changeset
   359
    if (ctx->runpositiontimer)
53
hgs
parents: 43
diff changeset
   360
        {
19
hgs
parents:
diff changeset
   361
        g_source_remove(ctx->runpositiontimer);
53
hgs
parents: 43
diff changeset
   362
        }
hgs
parents: 43
diff changeset
   363
    
19
hgs
parents:
diff changeset
   364
    XAAdaptationGst_Free(bCtx);
hgs
parents:
diff changeset
   365
hgs
parents:
diff changeset
   366
    free(ctx);
hgs
parents:
diff changeset
   367
    ctx = NULL;
hgs
parents:
diff changeset
   368
hgs
parents:
diff changeset
   369
    DEBUG_API("<-XAMediaRecorderAdapt_Destroy");
53
hgs
parents: 43
diff changeset
   370
    }
19
hgs
parents:
diff changeset
   371
hgs
parents:
diff changeset
   372
/***************** INTERNAL FUNCTIONS *******************************/
hgs
parents:
diff changeset
   373
53
hgs
parents: 43
diff changeset
   374
    /*
hgs
parents: 43
diff changeset
   375
     * void XAMediaRecorderAdapt_CreatePipeline( XAMediaRecorderAdaptationCtx* ctx );
hgs
parents: 43
diff changeset
   376
     */
19
hgs
parents:
diff changeset
   377
XAresult XAMediaRecorderAdapt_CreatePipeline(
hgs
parents:
diff changeset
   378
        XAMediaRecorderAdaptationCtx* ctx)
53
hgs
parents: 43
diff changeset
   379
    {
19
hgs
parents:
diff changeset
   380
    XAresult ret = XA_RESULT_SUCCESS;
hgs
parents:
diff changeset
   381
    DEBUG_API("->XAMediaRecorderAdapt_CreatePipeline");
hgs
parents:
diff changeset
   382
hgs
parents:
diff changeset
   383
    /* Create the audio src */
hgs
parents:
diff changeset
   384
    if ( ctx->xaAudioSource )
53
hgs
parents: 43
diff changeset
   385
        {
19
hgs
parents:
diff changeset
   386
        /* create audio pipe source */
hgs
parents:
diff changeset
   387
        ctx->audiosource = XAAdaptationGst_CreateGstSource( ctx->xaAudioSource, "audiosource",
53
hgs
parents: 43
diff changeset
   388
                NULL );
hgs
parents: 43
diff changeset
   389
    
19
hgs
parents:
diff changeset
   390
        if( ctx->audiosource )
53
hgs
parents: 43
diff changeset
   391
            {
19
hgs
parents:
diff changeset
   392
            if (gst_bin_add(GST_BIN(ctx->baseObj.bin), ctx->audiosource))
53
hgs
parents: 43
diff changeset
   393
                {
19
hgs
parents:
diff changeset
   394
                DEBUG_API("Added audiosource to bin");
53
hgs
parents: 43
diff changeset
   395
                }
19
hgs
parents:
diff changeset
   396
            else
53
hgs
parents: 43
diff changeset
   397
                {
19
hgs
parents:
diff changeset
   398
                DEBUG_API("Could not add audiosource to bin");
hgs
parents:
diff changeset
   399
                return XA_RESULT_INTERNAL_ERROR;
53
hgs
parents: 43
diff changeset
   400
                }
hgs
parents: 43
diff changeset
   401
            }
hgs
parents: 43
diff changeset
   402
        else
hgs
parents: 43
diff changeset
   403
            {
hgs
parents: 43
diff changeset
   404
            DEBUG_ERR("Could not create audio source!!!!");
hgs
parents: 43
diff changeset
   405
            return XA_RESULT_INTERNAL_ERROR;
19
hgs
parents:
diff changeset
   406
            }
43
hgs
parents: 33
diff changeset
   407
        }
19
hgs
parents:
diff changeset
   408
hgs
parents:
diff changeset
   409
    /* create and add video pipeline */
hgs
parents:
diff changeset
   410
    ctx->codecbin = XAMediaRecorderAdapt_CreateEncodeBin(ctx);
hgs
parents:
diff changeset
   411
    if (ctx->codecbin)
53
hgs
parents: 43
diff changeset
   412
        {
19
hgs
parents:
diff changeset
   413
        if (gst_bin_add(GST_BIN(ctx->baseObj.bin), ctx->codecbin))
53
hgs
parents: 43
diff changeset
   414
            {
19
hgs
parents:
diff changeset
   415
            DEBUG_API("->XAMediaRecorderAdapt_CreatePipeline: gst_bin_add success");
53
hgs
parents: 43
diff changeset
   416
            }
19
hgs
parents:
diff changeset
   417
        else
53
hgs
parents: 43
diff changeset
   418
            {
19
hgs
parents:
diff changeset
   419
            DEBUG_ERR("Could not add codec bin");
hgs
parents:
diff changeset
   420
            return XA_RESULT_INTERNAL_ERROR;
53
hgs
parents: 43
diff changeset
   421
            }
19
hgs
parents:
diff changeset
   422
        }
hgs
parents:
diff changeset
   423
    else
53
hgs
parents: 43
diff changeset
   424
        {
19
hgs
parents:
diff changeset
   425
        DEBUG_ERR("Could not create encoding bin!!!");
hgs
parents:
diff changeset
   426
        return XA_RESULT_INTERNAL_ERROR;
43
hgs
parents: 33
diff changeset
   427
        }
19
hgs
parents:
diff changeset
   428
hgs
parents:
diff changeset
   429
    /* create and add audio pipeline */
hgs
parents:
diff changeset
   430
    if ( ctx->audiosource )
53
hgs
parents: 43
diff changeset
   431
        {    
hgs
parents: 43
diff changeset
   432
        //if(!gst_element_link(ctx->audiofilter, ctx->codecbin ))
hgs
parents: 43
diff changeset
   433
        if(!gst_element_link(ctx->audiosource, ctx->codecbin ))
43
hgs
parents: 33
diff changeset
   434
            {
53
hgs
parents: 43
diff changeset
   435
            DEBUG_ERR("Could not link audiosource to codecbin!!");
19
hgs
parents:
diff changeset
   436
            return XA_RESULT_INTERNAL_ERROR;
hgs
parents:
diff changeset
   437
            }
53
hgs
parents: 43
diff changeset
   438
        else
43
hgs
parents: 33
diff changeset
   439
            {
53
hgs
parents: 43
diff changeset
   440
            DEBUG_INFO("Warning: link audiosource to codecbin is successfull with muxcaps!!");
43
hgs
parents: 33
diff changeset
   441
            }
hgs
parents: 33
diff changeset
   442
        }
53
hgs
parents: 43
diff changeset
   443
    else
43
hgs
parents: 33
diff changeset
   444
        {
53
hgs
parents: 43
diff changeset
   445
        DEBUG_INFO("No audio input");
43
hgs
parents: 33
diff changeset
   446
        }
19
hgs
parents:
diff changeset
   447
hgs
parents:
diff changeset
   448
    /* create and add data sink */
53
hgs
parents: 43
diff changeset
   449
    ctx->datasink = XAAdaptationGst_CreateGstSink( ctx->xaSink, "datasink" );
19
hgs
parents:
diff changeset
   450
    if( ctx->datasink )
43
hgs
parents: 33
diff changeset
   451
        {
19
hgs
parents:
diff changeset
   452
        if (gst_bin_add(GST_BIN(ctx->baseObj.bin), ctx->datasink))
53
hgs
parents: 43
diff changeset
   453
            {
19
hgs
parents:
diff changeset
   454
            DEBUG_INFO("Added datasink to bin");
53
hgs
parents: 43
diff changeset
   455
            }
19
hgs
parents:
diff changeset
   456
        else
53
hgs
parents: 43
diff changeset
   457
            {
19
hgs
parents:
diff changeset
   458
            DEBUG_ERR("Could not add datasink to bin");
hgs
parents:
diff changeset
   459
            return XA_RESULT_INTERNAL_ERROR;
53
hgs
parents: 43
diff changeset
   460
            }
19
hgs
parents:
diff changeset
   461
        if(!gst_element_link(ctx->codecbin, ctx->datasink))
53
hgs
parents: 43
diff changeset
   462
            {
19
hgs
parents:
diff changeset
   463
            DEBUG_ERR("Could not link codec to sink!!");
hgs
parents:
diff changeset
   464
            return XA_RESULT_INTERNAL_ERROR;
53
hgs
parents: 43
diff changeset
   465
            }
43
hgs
parents: 33
diff changeset
   466
        }
53
hgs
parents: 43
diff changeset
   467
    else
43
hgs
parents: 33
diff changeset
   468
        {
19
hgs
parents:
diff changeset
   469
        DEBUG_ERR("Could not create data sink!!!");
hgs
parents:
diff changeset
   470
        return XA_RESULT_INTERNAL_ERROR;
53
hgs
parents: 43
diff changeset
   471
        }
19
hgs
parents:
diff changeset
   472
    DEBUG_API("<-XAMediaRecorderAdapt_CreatePipeline");
hgs
parents:
diff changeset
   473
    return ret;
53
hgs
parents: 43
diff changeset
   474
    }
19
hgs
parents:
diff changeset
   475
43
hgs
parents: 33
diff changeset
   476
/*
hgs
parents: 33
diff changeset
   477
 * XAresult XAMediaRecorderAdapt_CheckCodec( XAMediaRecorderAdaptationCtx_* mCtx );
hgs
parents: 33
diff changeset
   478
 * Check codec compatibility and support with initiated datasink content
hgs
parents: 33
diff changeset
   479
 */
hgs
parents: 33
diff changeset
   480
XAresult XAMediaRecorderAdapt_CheckCodec( XAMediaRecorderAdaptationCtx_* mCtx, XACapsType encType, XAuint32 encoderId )
hgs
parents: 33
diff changeset
   481
    {
hgs
parents: 33
diff changeset
   482
    XAresult ret = XA_RESULT_SUCCESS;
53
hgs
parents: 43
diff changeset
   483
    XAuint32 format = 0;
43
hgs
parents: 33
diff changeset
   484
    XACapabilities temp;
hgs
parents: 33
diff changeset
   485
hgs
parents: 33
diff changeset
   486
    DEBUG_API("->XAMediaRecorderAdapt_CheckCodec");
hgs
parents: 33
diff changeset
   487
hgs
parents: 33
diff changeset
   488
    /*first, check if codec supported at all*/
hgs
parents: 33
diff changeset
   489
    ret = XACapabilitiesMgr_GetCapsById(mCtx->baseObj.baseObj.capslist,(XACapsType)(XACAP_ENCODER|encType), encoderId, &temp);
hgs
parents: 33
diff changeset
   490
hgs
parents: 33
diff changeset
   491
    if( ret==XA_RESULT_SUCCESS )
53
hgs
parents: 43
diff changeset
   492
        {
43
hgs
parents: 33
diff changeset
   493
        if(encType & (XACAP_VIDEO|XACAP_AUDIO))
19
hgs
parents:
diff changeset
   494
            {
53
hgs
parents: 43
diff changeset
   495
            if(mCtx->xaSink && mCtx->xaSink->pFormat)
hgs
parents: 43
diff changeset
   496
                {
43
hgs
parents: 33
diff changeset
   497
                format = *(XAuint32*)(mCtx->xaSink->pFormat);
53
hgs
parents: 43
diff changeset
   498
                }
19
hgs
parents:
diff changeset
   499
            else
53
hgs
parents: 43
diff changeset
   500
                {
43
hgs
parents: 33
diff changeset
   501
                ret=XA_RESULT_FEATURE_UNSUPPORTED;
53
hgs
parents: 43
diff changeset
   502
                }
43
hgs
parents: 33
diff changeset
   503
            }
53
hgs
parents: 43
diff changeset
   504
        
43
hgs
parents: 33
diff changeset
   505
        if(ret==XA_RESULT_SUCCESS)
53
hgs
parents: 43
diff changeset
   506
            { 
hgs
parents: 43
diff changeset
   507
            switch ( format )
43
hgs
parents: 33
diff changeset
   508
                {
53
hgs
parents: 43
diff changeset
   509
                case XA_DATAFORMAT_PCM:
hgs
parents: 43
diff changeset
   510
                    if ( (encType == XACAP_AUDIO) && (encoderId == XA_AUDIOCODEC_PCM) )
hgs
parents: 43
diff changeset
   511
                        {
hgs
parents: 43
diff changeset
   512
                        ret=XA_RESULT_SUCCESS;
hgs
parents: 43
diff changeset
   513
                        }
hgs
parents: 43
diff changeset
   514
                    else
43
hgs
parents: 33
diff changeset
   515
                        {
53
hgs
parents: 43
diff changeset
   516
                        ret=XA_RESULT_FEATURE_UNSUPPORTED;
43
hgs
parents: 33
diff changeset
   517
                        }
53
hgs
parents: 43
diff changeset
   518
                    break;
hgs
parents: 43
diff changeset
   519
hgs
parents: 43
diff changeset
   520
                case XA_DATAFORMAT_MIME:
hgs
parents: 43
diff changeset
   521
                    DEBUG_INFO("XA_DATAFORMAT_MIME ");
43
hgs
parents: 33
diff changeset
   522
                        {
53
hgs
parents: 43
diff changeset
   523
                        XADataFormat_MIME* mime = ((XADataFormat_MIME*)mCtx->xaSink->pFormat);
hgs
parents: 43
diff changeset
   524
                        DEBUG_INFO_A1("mime->containerType:%u",(int)mime->containerType);
hgs
parents: 43
diff changeset
   525
                    DEBUG_INFO_A1_STR("mime->mimeType:%s", (char *)mime->mimeType);
hgs
parents: 43
diff changeset
   526
                        switch ( mime->containerType )
43
hgs
parents: 33
diff changeset
   527
                            {
53
hgs
parents: 43
diff changeset
   528
                            case XA_CONTAINERTYPE_RAW:
hgs
parents: 43
diff changeset
   529
                                if((encType == XACAP_AUDIO) && (encoderId == XA_AUDIOCODEC_PCM))
hgs
parents: 43
diff changeset
   530
                                    {
hgs
parents: 43
diff changeset
   531
                                    ret=XA_RESULT_SUCCESS;
hgs
parents: 43
diff changeset
   532
                                    }
hgs
parents: 43
diff changeset
   533
                                else
hgs
parents: 43
diff changeset
   534
                                    {
hgs
parents: 43
diff changeset
   535
                                    ret=XA_RESULT_FEATURE_UNSUPPORTED;
hgs
parents: 43
diff changeset
   536
                                    }
19
hgs
parents:
diff changeset
   537
                                break;
53
hgs
parents: 43
diff changeset
   538
hgs
parents: 43
diff changeset
   539
                            case XA_CONTAINERTYPE_WAV:
hgs
parents: 43
diff changeset
   540
                                if(encType == XACAP_AUDIO)
hgs
parents: 43
diff changeset
   541
                                    {
hgs
parents: 43
diff changeset
   542
                                    switch(encoderId)
hgs
parents: 43
diff changeset
   543
                                        {
hgs
parents: 43
diff changeset
   544
                                        case XA_AUDIOCODEC_PCM:
hgs
parents: 43
diff changeset
   545
                                            ret=XA_RESULT_SUCCESS;
hgs
parents: 43
diff changeset
   546
                                            break;
hgs
parents: 43
diff changeset
   547
                                        default:
hgs
parents: 43
diff changeset
   548
                                            ret=XA_RESULT_FEATURE_UNSUPPORTED;
hgs
parents: 43
diff changeset
   549
                                            break;
hgs
parents: 43
diff changeset
   550
                                        }
hgs
parents: 43
diff changeset
   551
                                    }
hgs
parents: 43
diff changeset
   552
                                else
hgs
parents: 43
diff changeset
   553
                                    {
hgs
parents: 43
diff changeset
   554
                                    ret=XA_RESULT_FEATURE_UNSUPPORTED;
hgs
parents: 43
diff changeset
   555
                                    }
19
hgs
parents:
diff changeset
   556
                                break;
53
hgs
parents: 43
diff changeset
   557
hgs
parents: 43
diff changeset
   558
                            case XA_CONTAINERTYPE_UNSPECIFIED:
hgs
parents: 43
diff changeset
   559
                                    {
hgs
parents: 43
diff changeset
   560
                                    ret=XA_RESULT_FEATURE_UNSUPPORTED;
hgs
parents: 43
diff changeset
   561
                                    }
19
hgs
parents:
diff changeset
   562
                                break;
53
hgs
parents: 43
diff changeset
   563
                            case XA_CONTAINERTYPE_AMR:
hgs
parents: 43
diff changeset
   564
                                if(encType == XACAP_AUDIO)
hgs
parents: 43
diff changeset
   565
                                    {
hgs
parents: 43
diff changeset
   566
                                    switch(encoderId)
hgs
parents: 43
diff changeset
   567
                                        {
hgs
parents: 43
diff changeset
   568
                                        case XA_AUDIOCODEC_AMR:
hgs
parents: 43
diff changeset
   569
                                            ret=XA_RESULT_SUCCESS;
hgs
parents: 43
diff changeset
   570
                                            break;
hgs
parents: 43
diff changeset
   571
                                        default:
hgs
parents: 43
diff changeset
   572
                                            ret=XA_RESULT_FEATURE_UNSUPPORTED;
hgs
parents: 43
diff changeset
   573
                                        break;
hgs
parents: 43
diff changeset
   574
                                        }
hgs
parents: 43
diff changeset
   575
                                    }
hgs
parents: 43
diff changeset
   576
                                else
hgs
parents: 43
diff changeset
   577
                                    {
hgs
parents: 43
diff changeset
   578
                                    ret=XA_RESULT_FEATURE_UNSUPPORTED;
hgs
parents: 43
diff changeset
   579
                                    }
19
hgs
parents:
diff changeset
   580
                                break;
53
hgs
parents: 43
diff changeset
   581
                            case XA_CONTAINERTYPE_MP4:
hgs
parents: 43
diff changeset
   582
                                if(encType == XACAP_AUDIO )
hgs
parents: 43
diff changeset
   583
                                    {
hgs
parents: 43
diff changeset
   584
                                    switch(encoderId)
hgs
parents: 43
diff changeset
   585
                                        {
hgs
parents: 43
diff changeset
   586
                                        case XA_AUDIOCODEC_AAC:
hgs
parents: 43
diff changeset
   587
                                            ret=XA_RESULT_SUCCESS;
hgs
parents: 43
diff changeset
   588
                                            break;
hgs
parents: 43
diff changeset
   589
                                        default:
hgs
parents: 43
diff changeset
   590
                                            ret=XA_RESULT_FEATURE_UNSUPPORTED;
hgs
parents: 43
diff changeset
   591
                                            break;
hgs
parents: 43
diff changeset
   592
                                        }
hgs
parents: 43
diff changeset
   593
                                    }
hgs
parents: 43
diff changeset
   594
                                else
hgs
parents: 43
diff changeset
   595
                                    {
hgs
parents: 43
diff changeset
   596
                                    ret=XA_RESULT_FEATURE_UNSUPPORTED;
hgs
parents: 43
diff changeset
   597
                                    }
hgs
parents: 43
diff changeset
   598
                                break;
hgs
parents: 43
diff changeset
   599
                            default: /*switch (containertype)*/
hgs
parents: 43
diff changeset
   600
                                ret = XA_RESULT_FEATURE_UNSUPPORTED;
19
hgs
parents:
diff changeset
   601
                                break;
hgs
parents:
diff changeset
   602
                            }
hgs
parents:
diff changeset
   603
                        break;
43
hgs
parents: 33
diff changeset
   604
                        }
53
hgs
parents: 43
diff changeset
   605
                default: /*switch (format)*/
hgs
parents: 43
diff changeset
   606
                    ret = XA_RESULT_FEATURE_UNSUPPORTED;
19
hgs
parents:
diff changeset
   607
                    break;
43
hgs
parents: 33
diff changeset
   608
                }
19
hgs
parents:
diff changeset
   609
            }
hgs
parents:
diff changeset
   610
        }
43
hgs
parents: 33
diff changeset
   611
    if( ret!=XA_RESULT_SUCCESS )
53
hgs
parents: 43
diff changeset
   612
        {
43
hgs
parents: 33
diff changeset
   613
        DEBUG_ERR("cannot accommodate given codec & datasink pair!!!");
53
hgs
parents: 43
diff changeset
   614
        }
43
hgs
parents: 33
diff changeset
   615
    DEBUG_API("<-XAMediaRecorderAdapt_CheckCodec");
hgs
parents: 33
diff changeset
   616
    return ret;
53
hgs
parents: 43
diff changeset
   617
    }
19
hgs
parents:
diff changeset
   618
/*
hgs
parents:
diff changeset
   619
 * XAresult XAMediaRecorderAdapt_ChangeEncoders( XAMediaRecorderAdaptationCtx* mCtx );
hgs
parents:
diff changeset
   620
 * re-create encodebin based on new encoder settings
hgs
parents:
diff changeset
   621
 */
hgs
parents:
diff changeset
   622
XAresult XAMediaRecorderAdapt_ChangeEncoders( XAMediaRecorderAdaptationCtx* mCtx )
53
hgs
parents: 43
diff changeset
   623
    {
19
hgs
parents:
diff changeset
   624
    XAresult ret = XA_RESULT_SUCCESS;
28
hgs
parents: 25
diff changeset
   625
    GstElement  *encoderelement = NULL;
19
hgs
parents:
diff changeset
   626
    XAAdaptationGstCtx* bCtx = &(mCtx->baseObj);
hgs
parents:
diff changeset
   627
hgs
parents:
diff changeset
   628
    DEBUG_API("->XAMediaRecorderAdapt_ChangeEncoders");
hgs
parents:
diff changeset
   629
    /* check state */
hgs
parents:
diff changeset
   630
    if(GST_STATE(mCtx->baseObj.bin)<GST_STATE_PLAYING)
53
hgs
parents: 43
diff changeset
   631
        {
19
hgs
parents:
diff changeset
   632
        GstElement* newBin = XAMediaRecorderAdapt_CreateEncodeBin(mCtx);
hgs
parents:
diff changeset
   633
        if(newBin)
53
hgs
parents: 43
diff changeset
   634
            { /* replace old bin with new */
19
hgs
parents:
diff changeset
   635
            GstStateChangeReturn gret;
hgs
parents:
diff changeset
   636
            GstPad *asink=NULL, *linkedasrc=NULL;
hgs
parents:
diff changeset
   637
            GstPad *src=NULL, *linkedsink=NULL;
hgs
parents:
diff changeset
   638
            GstCaps* encSrcCaps = NULL;
28
hgs
parents: 25
diff changeset
   639
            GstPad *afiltsrc=NULL, *afiltsink=NULL;
19
hgs
parents:
diff changeset
   640
hgs
parents:
diff changeset
   641
            /* pipeline must be unrolled for renegotiation */
hgs
parents:
diff changeset
   642
            DEBUG_INFO("Unroll pipeline");
hgs
parents:
diff changeset
   643
            bCtx->binWantedState = GST_STATE_READY;
hgs
parents:
diff changeset
   644
            gret = gst_element_set_state( GST_ELEMENT(bCtx->bin), bCtx->binWantedState);
53
hgs
parents: 43
diff changeset
   645
            if(gret == GST_STATE_CHANGE_FAILURE)
hgs
parents: 43
diff changeset
   646
                {
hgs
parents: 43
diff changeset
   647
                DEBUG_ERR("Failed to Unroll Pipeline!!");
hgs
parents: 43
diff changeset
   648
                return XA_RESULT_INTERNAL_ERROR;
hgs
parents: 43
diff changeset
   649
                }
hgs
parents: 43
diff changeset
   650
            
19
hgs
parents:
diff changeset
   651
            gret = gst_element_get_state( GST_ELEMENT(bCtx->bin), NULL, NULL, XA_ADAPT_ASYNC_TIMEOUT_SHORT_NSEC);
hgs
parents:
diff changeset
   652
43
hgs
parents: 33
diff changeset
   653
            if(!mCtx ->audiofilter)
53
hgs
parents: 43
diff changeset
   654
                {
hgs
parents: 43
diff changeset
   655
                   //creating caps filter 
hgs
parents: 43
diff changeset
   656
                   mCtx->audiofilter = gst_element_factory_make("capsfilter", "audiofilter");
hgs
parents: 43
diff changeset
   657
                   if ( mCtx->audiofilter )
hgs
parents: 43
diff changeset
   658
                    {
hgs
parents: 43
diff changeset
   659
                       gst_bin_add(GST_BIN(bCtx->bin), mCtx->audiofilter);
hgs
parents: 43
diff changeset
   660
                       encSrcCaps = gst_caps_new_full(
hgs
parents: 43
diff changeset
   661
                       gst_structure_new("audio/x-raw-int",
hgs
parents: 43
diff changeset
   662
                               "channels", G_TYPE_INT, mCtx->audioEncSettings.channelsOut,
hgs
parents: 43
diff changeset
   663
                               "rate", G_TYPE_INT, (mCtx->audioEncSettings.sampleRate / 1000),
hgs
parents: 43
diff changeset
   664
                               "depth", G_TYPE_INT, mCtx->audioEncSettings.bitsPerSample,
hgs
parents: 43
diff changeset
   665
                               "signed",G_TYPE_BOOLEAN, TRUE,
hgs
parents: 43
diff changeset
   666
                               "endianness",G_TYPE_INT, mCtx->audioEncSettings.blockAlignment,
hgs
parents: 43
diff changeset
   667
                               NULL),
hgs
parents: 43
diff changeset
   668
                       gst_structure_new("audio/amr",
hgs
parents: 43
diff changeset
   669
                              "signed",G_TYPE_BOOLEAN, TRUE,
hgs
parents: 43
diff changeset
   670
                              "endianness",G_TYPE_INT, mCtx->audioEncSettings.blockAlignment,
hgs
parents: 43
diff changeset
   671
                              "depth", G_TYPE_INT, mCtx->audioEncSettings.bitsPerSample,
hgs
parents: 43
diff changeset
   672
                              "rate", G_TYPE_INT, (mCtx->audioEncSettings.sampleRate / 1000),
hgs
parents: 43
diff changeset
   673
                              "channels", G_TYPE_INT, mCtx->audioEncSettings.channelsOut,
hgs
parents: 43
diff changeset
   674
                              NULL),
hgs
parents: 43
diff changeset
   675
                        gst_structure_new("audio/x-raw-float",
hgs
parents: 43
diff changeset
   676
                               "channels", G_TYPE_INT, mCtx->audioEncSettings.channelsOut,
hgs
parents: 43
diff changeset
   677
                               "width", G_TYPE_INT, mCtx->audioEncSettings.bitsPerSample,
hgs
parents: 43
diff changeset
   678
                               "rate", G_TYPE_INT , mCtx->audioEncSettings.sampleRate / 1000,
hgs
parents: 43
diff changeset
   679
                               NULL),
hgs
parents: 43
diff changeset
   680
                               NULL);
hgs
parents: 43
diff changeset
   681
                       DEBUG_INFO_A1_STR("new audio encoder config from settings: %s",gst_caps_to_string(encSrcCaps));
hgs
parents: 43
diff changeset
   682
                       g_object_set( G_OBJECT(mCtx->audiofilter), "caps",encSrcCaps,NULL);
hgs
parents: 43
diff changeset
   683
                                                             
hgs
parents: 43
diff changeset
   684
                       gst_caps_unref(encSrcCaps);
43
hgs
parents: 33
diff changeset
   685
53
hgs
parents: 43
diff changeset
   686
                    }else
hgs
parents: 43
diff changeset
   687
                        {
hgs
parents: 43
diff changeset
   688
                        DEBUG_ERR("cannot create caps filter");
hgs
parents: 43
diff changeset
   689
                        return XA_RESULT_INTERNAL_ERROR;
hgs
parents: 43
diff changeset
   690
                        }
hgs
parents: 43
diff changeset
   691
                    
19
hgs
parents:
diff changeset
   692
                }
hgs
parents:
diff changeset
   693
hgs
parents:
diff changeset
   694
            DEBUG_INFO("Unlink and remove old encodebin");
hgs
parents:
diff changeset
   695
            asink = gst_element_get_static_pad(mCtx->codecbin,"sink");
hgs
parents:
diff changeset
   696
            if(asink)
53
hgs
parents: 43
diff changeset
   697
                {
19
hgs
parents:
diff changeset
   698
                linkedasrc = gst_pad_get_peer(asink);
hgs
parents:
diff changeset
   699
                if(linkedasrc)
53
hgs
parents: 43
diff changeset
   700
                    {
19
hgs
parents:
diff changeset
   701
                    gst_pad_unlink(linkedasrc,asink);
53
hgs
parents: 43
diff changeset
   702
                    }
19
hgs
parents:
diff changeset
   703
                }
53
hgs
parents: 43
diff changeset
   704
19
hgs
parents:
diff changeset
   705
            src = gst_element_get_static_pad(mCtx->codecbin,"src");
hgs
parents:
diff changeset
   706
            if(src)
53
hgs
parents: 43
diff changeset
   707
                {
19
hgs
parents:
diff changeset
   708
                linkedsink = gst_pad_get_peer(src);
hgs
parents:
diff changeset
   709
                if(linkedsink)
53
hgs
parents: 43
diff changeset
   710
                    {
19
hgs
parents:
diff changeset
   711
                    gst_pad_unlink(src,linkedsink);
53
hgs
parents: 43
diff changeset
   712
                    }
19
hgs
parents:
diff changeset
   713
                }
hgs
parents:
diff changeset
   714
hgs
parents:
diff changeset
   715
            gst_element_set_state( GST_ELEMENT(mCtx->codecbin), GST_STATE_NULL );
hgs
parents:
diff changeset
   716
            gst_element_get_state( GST_ELEMENT(mCtx->codecbin),NULL,NULL,1000 );
hgs
parents:
diff changeset
   717
            gst_bin_remove( GST_BIN(bCtx->bin), mCtx->codecbin );
hgs
parents:
diff changeset
   718
            /*reset filesink too*/
hgs
parents:
diff changeset
   719
            gst_element_set_state(GST_ELEMENT(mCtx->datasink),GST_STATE_NULL);
hgs
parents:
diff changeset
   720
            gst_element_sync_state_with_parent(mCtx->datasink);
hgs
parents:
diff changeset
   721
            gst_element_get_state(mCtx->datasink,NULL,NULL,XA_ADAPT_ASYNC_TIMEOUT_SHORT_NSEC);
hgs
parents:
diff changeset
   722
hgs
parents:
diff changeset
   723
            DEBUG_INFO("Link new encodebin");
hgs
parents:
diff changeset
   724
            mCtx->codecbin = newBin;
hgs
parents:
diff changeset
   725
            gst_bin_add(GST_BIN(bCtx->bin), mCtx->codecbin);
hgs
parents:
diff changeset
   726
            asink = gst_element_get_static_pad(mCtx->codecbin,"sink");
28
hgs
parents: 25
diff changeset
   727
            afiltsink = gst_element_get_static_pad(mCtx->audiofilter,"sink");
hgs
parents: 25
diff changeset
   728
            afiltsrc = gst_element_get_static_pad(mCtx->audiofilter,"src");
hgs
parents: 25
diff changeset
   729
            if(linkedasrc && afiltsink)
hgs
parents: 25
diff changeset
   730
                {
53
hgs
parents: 43
diff changeset
   731
                    if(gst_pad_link(linkedasrc , afiltsink ) != GST_PAD_LINK_OK)
hgs
parents: 43
diff changeset
   732
                        {
hgs
parents: 43
diff changeset
   733
                        DEBUG_ERR("Could not link audiosource to audiofilter!!");
hgs
parents: 43
diff changeset
   734
                        return XA_RESULT_INTERNAL_ERROR;
hgs
parents: 43
diff changeset
   735
                        }
19
hgs
parents:
diff changeset
   736
                }
53
hgs
parents: 43
diff changeset
   737
            if(asink && afiltsrc)
hgs
parents: 43
diff changeset
   738
                {
hgs
parents: 43
diff changeset
   739
                    if(gst_pad_link(afiltsrc , asink) != GST_PAD_LINK_OK)
43
hgs
parents: 33
diff changeset
   740
                        {
53
hgs
parents: 43
diff changeset
   741
                        DEBUG_ERR("Could not link audiosource to audiofilter!!");
hgs
parents: 43
diff changeset
   742
                        return XA_RESULT_INTERNAL_ERROR;
43
hgs
parents: 33
diff changeset
   743
                        }
53
hgs
parents: 43
diff changeset
   744
                }
19
hgs
parents:
diff changeset
   745
            src = gst_element_get_static_pad(mCtx->codecbin,"src");
hgs
parents:
diff changeset
   746
            if(src && linkedsink)
hgs
parents:
diff changeset
   747
                {
53
hgs
parents: 43
diff changeset
   748
                        if(gst_pad_link(src,linkedsink) != GST_PAD_LINK_OK)
hgs
parents: 43
diff changeset
   749
                            {
hgs
parents: 43
diff changeset
   750
                            DEBUG_ERR("Could not link codecbin src pad  to linkedsink!!");
hgs
parents: 43
diff changeset
   751
                            return XA_RESULT_INTERNAL_ERROR;
hgs
parents: 43
diff changeset
   752
                            }
19
hgs
parents:
diff changeset
   753
                }
43
hgs
parents: 33
diff changeset
   754
28
hgs
parents: 25
diff changeset
   755
            //setting the Bitrate and other properties for elements
53
hgs
parents: 43
diff changeset
   756
                if(mCtx->audioEncSettings.encoderId == XA_AUDIOCODEC_AAC)
hgs
parents: 43
diff changeset
   757
                    {   
hgs
parents: 43
diff changeset
   758
                    encoderelement = gst_bin_get_by_name((GstBin*)mCtx->codecbin, "audioenc") ;
hgs
parents: 43
diff changeset
   759
                    if(encoderelement)
hgs
parents: 43
diff changeset
   760
                        {
hgs
parents: 43
diff changeset
   761
                        g_object_set(G_OBJECT(encoderelement),"bitrate" , mCtx->audioEncSettings.bitRate , NULL );
hgs
parents: 43
diff changeset
   762
                        g_object_set(G_OBJECT(encoderelement),"profile", mCtx->audioEncSettings.levelSetting , NULL );
hgs
parents: 43
diff changeset
   763
                        g_object_set(G_OBJECT(encoderelement),"output-format", mCtx->audioEncSettings.streamFormat , NULL );
hgs
parents: 43
diff changeset
   764
                        gst_object_unref (encoderelement);
hgs
parents: 43
diff changeset
   765
                        }
hgs
parents: 43
diff changeset
   766
                    else
hgs
parents: 43
diff changeset
   767
                        {
hgs
parents: 43
diff changeset
   768
                         DEBUG_ERR("Encoder Element not found for AAC");
hgs
parents: 43
diff changeset
   769
                        }
hgs
parents: 43
diff changeset
   770
                    }
hgs
parents: 43
diff changeset
   771
                else if(mCtx->audioEncSettings.encoderId == XA_AUDIOCODEC_AMR)
hgs
parents: 43
diff changeset
   772
                    {
hgs
parents: 43
diff changeset
   773
                    g_object_set(G_OBJECT(mCtx->audiosource),"speechbitrate", mCtx->audioEncSettings.bitRate , NULL );
hgs
parents: 43
diff changeset
   774
                    }
hgs
parents: 43
diff changeset
   775
                else
hgs
parents: 43
diff changeset
   776
                    {
hgs
parents: 43
diff changeset
   777
                    DEBUG_INFO("No properties for PCM or Wav");
hgs
parents: 43
diff changeset
   778
                    }       
hgs
parents: 43
diff changeset
   779
                
hgs
parents: 43
diff changeset
   780
            DEBUG_INFO_A1_STR("Pipeline in state %s",gst_element_state_get_name(GST_STATE(bCtx->bin)));
43
hgs
parents: 33
diff changeset
   781
            }
53
hgs
parents: 43
diff changeset
   782
        else
43
hgs
parents: 33
diff changeset
   783
            {
19
hgs
parents:
diff changeset
   784
            /* could not support wanted encoders */
hgs
parents:
diff changeset
   785
            DEBUG_ERR("Failed to create encodebin with new settings, using old one!");
hgs
parents:
diff changeset
   786
            ret = XA_RESULT_FEATURE_UNSUPPORTED;
53
hgs
parents: 43
diff changeset
   787
            }
19
hgs
parents:
diff changeset
   788
        }
hgs
parents:
diff changeset
   789
    else
53
hgs
parents: 43
diff changeset
   790
        { /* n/a while playing */
19
hgs
parents:
diff changeset
   791
        DEBUG_ERR("Cannot change encoder when recording ongoing!");
hgs
parents:
diff changeset
   792
        ret = XA_RESULT_PRECONDITIONS_VIOLATED;
53
hgs
parents: 43
diff changeset
   793
        }
19
hgs
parents:
diff changeset
   794
    DEBUG_API("<-XAMediaRecorderAdapt_ChangeEncoders");
hgs
parents:
diff changeset
   795
    return ret;
53
hgs
parents: 43
diff changeset
   796
    }
19
hgs
parents:
diff changeset
   797
hgs
parents:
diff changeset
   798
/**
hgs
parents:
diff changeset
   799
 * GstElement* XAMediaRecorderAdapt_CreateEncodeBin( XAMediaRecorderAdaptationCtx* ctx )
hgs
parents:
diff changeset
   800
 * @return GstElement* - pointer to created bin element
hgs
parents:
diff changeset
   801
 * Decription: Create encoder/muxer element based on given format and encoder settings
hgs
parents:
diff changeset
   802
 */
hgs
parents:
diff changeset
   803
GstElement* XAMediaRecorderAdapt_CreateEncodeBin( XAMediaRecorderAdaptationCtx* ctx )
53
hgs
parents: 43
diff changeset
   804
    {
19
hgs
parents:
diff changeset
   805
    XAresult ret = XA_RESULT_SUCCESS;
53
hgs
parents: 43
diff changeset
   806
    GstElement *audioenc = NULL, *mux=NULL;
19
hgs
parents:
diff changeset
   807
    GstElement *codecbin = gst_bin_new( "mrcodecbin" );
53
hgs
parents: 43
diff changeset
   808
    GstPad *ghostsrc = NULL, *ghostaudiosink = NULL;
19
hgs
parents:
diff changeset
   809
    XAuint32 format;
hgs
parents:
diff changeset
   810
    XACapabilities temp;
hgs
parents:
diff changeset
   811
hgs
parents:
diff changeset
   812
    DEBUG_API("->XAMediaRecorderAdapt_CreateEncodeBin");
hgs
parents:
diff changeset
   813
    if(ctx->recModes & XA_RECMODE_STREAM)
53
hgs
parents: 43
diff changeset
   814
        {
19
hgs
parents:
diff changeset
   815
        if(ctx->xaSink && ctx->xaSink->pFormat)
53
hgs
parents: 43
diff changeset
   816
            {
19
hgs
parents:
diff changeset
   817
            format = *(XAuint32*)(ctx->xaSink->pFormat);
hgs
parents:
diff changeset
   818
            switch ( format )
53
hgs
parents: 43
diff changeset
   819
                {
19
hgs
parents:
diff changeset
   820
                case XA_DATAFORMAT_PCM:
53
hgs
parents: 43
diff changeset
   821
                    DEBUG_INFO("XA_DATAFORMAT_PCM");
hgs
parents: 43
diff changeset
   822
                        {
hgs
parents: 43
diff changeset
   823
                        XADataFormat_PCM* pcm = ((XADataFormat_PCM*)ctx->xaSink->pFormat);
hgs
parents: 43
diff changeset
   824
                        if(!ctx->xaAudioSource)
hgs
parents: 43
diff changeset
   825
                            {
hgs
parents: 43
diff changeset
   826
                            DEBUG_ERR("Unsupported dataformat for given data sources");
hgs
parents: 43
diff changeset
   827
                            return NULL;
hgs
parents: 43
diff changeset
   828
                            }
hgs
parents: 43
diff changeset
   829
                        /* no need for codec, just pass data on */
hgs
parents: 43
diff changeset
   830
                        mux = gst_element_factory_make("identity", "mux");
hgs
parents: 43
diff changeset
   831
                        gst_bin_add(GST_BIN(codecbin), mux);
hgs
parents: 43
diff changeset
   832
                        ghostsrc = gst_element_get_static_pad(mux,"src");
hgs
parents: 43
diff changeset
   833
                        ghostaudiosink = gst_element_get_static_pad(mux,"sink");
hgs
parents: 43
diff changeset
   834
                        /*set usable audio settings from the sink structure*/
hgs
parents: 43
diff changeset
   835
                        ctx->audioEncSettings.encoderId = XA_AUDIOCODEC_PCM;
hgs
parents: 43
diff changeset
   836
                        ctx->audioEncSettings.channelsOut = pcm->numChannels;
hgs
parents: 43
diff changeset
   837
                        ctx->audioEncSettings.bitsPerSample = pcm->bitsPerSample;
hgs
parents: 43
diff changeset
   838
                        }
hgs
parents: 43
diff changeset
   839
                    break;
19
hgs
parents:
diff changeset
   840
hgs
parents:
diff changeset
   841
                case XA_DATAFORMAT_MIME:
53
hgs
parents: 43
diff changeset
   842
                    DEBUG_INFO("XA_DATAFORMAT_MIME ");
hgs
parents: 43
diff changeset
   843
                    {
19
hgs
parents:
diff changeset
   844
                    XADataFormat_MIME* mime = ((XADataFormat_MIME*)ctx->xaSink->pFormat);
hgs
parents:
diff changeset
   845
                    DEBUG_INFO_A1("mime->containerType:%u",(int)mime->containerType);
53
hgs
parents: 43
diff changeset
   846
                    DEBUG_INFO_A1_STR("mime->mimeType:%s", (char *)mime->mimeType);
19
hgs
parents:
diff changeset
   847
                    switch ( mime->containerType )
43
hgs
parents: 33
diff changeset
   848
                        {
53
hgs
parents: 43
diff changeset
   849
                        case XA_CONTAINERTYPE_WAV:
43
hgs
parents: 33
diff changeset
   850
                            {
53
hgs
parents: 43
diff changeset
   851
                            DEBUG_INFO("XA_CONTAINERTYPE_WAV");
hgs
parents: 43
diff changeset
   852
                            audioenc = gst_element_factory_make("wavenc", "audioenc");
hgs
parents: 43
diff changeset
   853
                            if(audioenc)
43
hgs
parents: 33
diff changeset
   854
                                {
53
hgs
parents: 43
diff changeset
   855
                                if (gst_bin_add(GST_BIN(codecbin), audioenc))
hgs
parents: 43
diff changeset
   856
                                    {
hgs
parents: 43
diff changeset
   857
                                    DEBUG_INFO("added audioenc to codecbin");
hgs
parents: 43
diff changeset
   858
                                    }
hgs
parents: 43
diff changeset
   859
                                else
hgs
parents: 43
diff changeset
   860
                                    {
hgs
parents: 43
diff changeset
   861
                                    DEBUG_ERR("Could not add audioenc to codecbin");
19
hgs
parents:
diff changeset
   862
                                    return NULL;
53
hgs
parents: 43
diff changeset
   863
                                    }
hgs
parents: 43
diff changeset
   864
                                /*use this as linkpoint*/
hgs
parents: 43
diff changeset
   865
                                ghostsrc = gst_element_get_static_pad(audioenc,"src");
hgs
parents: 43
diff changeset
   866
                                ghostaudiosink = gst_element_get_static_pad(audioenc,"sink");
hgs
parents: 43
diff changeset
   867
                                if ( ghostsrc == NULL || ghostaudiosink == NULL)
hgs
parents: 43
diff changeset
   868
                                    {
hgs
parents: 43
diff changeset
   869
                                    DEBUG_ERR("Could not get src or sink ghoset element(s)");
hgs
parents: 43
diff changeset
   870
                                    return NULL;
hgs
parents: 43
diff changeset
   871
                                    }
43
hgs
parents: 33
diff changeset
   872
                                }
53
hgs
parents: 43
diff changeset
   873
                            /* no other codecs needed */
hgs
parents: 43
diff changeset
   874
                            break;
19
hgs
parents:
diff changeset
   875
                            }
hgs
parents:
diff changeset
   876
53
hgs
parents: 43
diff changeset
   877
                        case XA_CONTAINERTYPE_UNSPECIFIED:
43
hgs
parents: 33
diff changeset
   878
                            {
53
hgs
parents: 43
diff changeset
   879
                            DEBUG_INFO("No support for requested encoder...try to select encoder from mime string");
hgs
parents: 43
diff changeset
   880
                            DEBUG_INFO("No support for requested mime/container type.");
hgs
parents: 43
diff changeset
   881
                            ret = XA_RESULT_CONTENT_UNSUPPORTED;
hgs
parents: 43
diff changeset
   882
                            break;
19
hgs
parents:
diff changeset
   883
                            }
53
hgs
parents: 43
diff changeset
   884
                        case XA_CONTAINERTYPE_MP4:
hgs
parents: 43
diff changeset
   885
                            {
hgs
parents: 43
diff changeset
   886
                            DEBUG_INFO("XA_CONTAINERTYPE_MP4");
hgs
parents: 43
diff changeset
   887
                            mux = gst_element_factory_make("mp4mux", "mp4mux");
19
hgs
parents:
diff changeset
   888
                            if(mux)
53
hgs
parents: 43
diff changeset
   889
                                {
hgs
parents: 43
diff changeset
   890
                                if (gst_bin_add(GST_BIN(codecbin), mux))
hgs
parents: 43
diff changeset
   891
                                    {
hgs
parents: 43
diff changeset
   892
                                    DEBUG_INFO("Added mux to codecbin");
hgs
parents: 43
diff changeset
   893
                                    }
hgs
parents: 43
diff changeset
   894
                                else
hgs
parents: 43
diff changeset
   895
                                    {
hgs
parents: 43
diff changeset
   896
                                    DEBUG_ERR("Could not add mux to codecbin");
hgs
parents: 43
diff changeset
   897
                                    return NULL;
hgs
parents: 43
diff changeset
   898
                                    }
19
hgs
parents:
diff changeset
   899
                                /*use this as linkpoint*/
hgs
parents:
diff changeset
   900
                                ghostsrc = gst_element_get_static_pad(mux,"src");
43
hgs
parents: 33
diff changeset
   901
                                }
53
hgs
parents: 43
diff changeset
   902
                            /* Add and link audio/video codecs */
hgs
parents: 43
diff changeset
   903
    
hgs
parents: 43
diff changeset
   904
                            /*set audio defaults*/
hgs
parents: 43
diff changeset
   905
                            if(ctx->audioEncSettings.encoderId == XA_ADAPTID_UNINITED)
hgs
parents: 43
diff changeset
   906
                                ctx->audioEncSettings.encoderId = XA_AUDIOCODEC_AAC;
hgs
parents: 43
diff changeset
   907
                            if(ctx->xaAudioSource)
43
hgs
parents: 33
diff changeset
   908
                                {
53
hgs
parents: 43
diff changeset
   909
                                if(XACapabilitiesMgr_GetCapsById(ctx->baseObj.baseObj.capslist, (XACapsType)(XACAP_ENCODER|XACAP_AUDIO), ctx->audioEncSettings.encoderId, &temp) == XA_RESULT_SUCCESS)
19
hgs
parents:
diff changeset
   910
                                    {
53
hgs
parents: 43
diff changeset
   911
                                    if(temp.adaptId)
43
hgs
parents: 33
diff changeset
   912
                                        {
53
hgs
parents: 43
diff changeset
   913
                                        audioenc = gst_element_factory_make((char*)temp.adaptId, "audioenc");
43
hgs
parents: 33
diff changeset
   914
                                        }
19
hgs
parents:
diff changeset
   915
                                    }
53
hgs
parents: 43
diff changeset
   916
                                if(audioenc)
19
hgs
parents:
diff changeset
   917
                                    {
53
hgs
parents: 43
diff changeset
   918
                                    gst_bin_add(GST_BIN(codecbin), audioenc);
hgs
parents: 43
diff changeset
   919
                                    if(!gst_element_link(audioenc, mux))
hgs
parents: 43
diff changeset
   920
                                        {
hgs
parents: 43
diff changeset
   921
                                        DEBUG_ERR("Could not link audioenc to mux!!");
hgs
parents: 43
diff changeset
   922
                                        DEBUG_API("<-XAMediaRecorderAdapt_CreateEncodeBin");
hgs
parents: 43
diff changeset
   923
                                        return NULL;
hgs
parents: 43
diff changeset
   924
                                        }
hgs
parents: 43
diff changeset
   925
                                    ghostaudiosink = gst_element_get_static_pad(audioenc,"sink");
43
hgs
parents: 33
diff changeset
   926
                                    }
53
hgs
parents: 43
diff changeset
   927
                                else
43
hgs
parents: 33
diff changeset
   928
                                    {
53
hgs
parents: 43
diff changeset
   929
                                    /*no audio codec but audio source = PCM case, explicity request audio pad*/
hgs
parents: 43
diff changeset
   930
                                    ghostaudiosink = gst_element_get_request_pad(mux,"audio_%d");
19
hgs
parents:
diff changeset
   931
                                    }
hgs
parents:
diff changeset
   932
                                }
53
hgs
parents: 43
diff changeset
   933
                            break;	
hgs
parents: 43
diff changeset
   934
                            }						
hgs
parents: 43
diff changeset
   935
                        case XA_CONTAINERTYPE_AMR:
43
hgs
parents: 33
diff changeset
   936
                            {
19
hgs
parents:
diff changeset
   937
                            DEBUG_INFO("XA_CONTAINERTYPE_AMR");
hgs
parents:
diff changeset
   938
                            if(ctx->audioEncSettings.encoderId == XA_ADAPTID_UNINITED)
hgs
parents:
diff changeset
   939
                                ctx->audioEncSettings.encoderId = XA_AUDIOCODEC_AMR;
hgs
parents:
diff changeset
   940
                             mux = gst_element_factory_make("amrmux", "mux");
hgs
parents:
diff changeset
   941
                             if(mux)
53
hgs
parents: 43
diff changeset
   942
                                 {
19
hgs
parents:
diff changeset
   943
                                 if (gst_bin_add(GST_BIN(codecbin), mux))
53
hgs
parents: 43
diff changeset
   944
                                     {
19
hgs
parents:
diff changeset
   945
                                     DEBUG_INFO("Added mux to codecbin");
53
hgs
parents: 43
diff changeset
   946
                                     /*Setting the buffer size on src since amr generates 
19
hgs
parents:
diff changeset
   947
                                      * small amounts of data */
hgs
parents:
diff changeset
   948
                                     g_object_set (G_OBJECT (ctx->audiosource),
hgs
parents:
diff changeset
   949
                                               "blocksize", 1280,
53
hgs
parents: 43
diff changeset
   950
                                                NULL);                                         
hgs
parents: 43
diff changeset
   951
                                     }
19
hgs
parents:
diff changeset
   952
                                 else
53
hgs
parents: 43
diff changeset
   953
                                     {
19
hgs
parents:
diff changeset
   954
                                     DEBUG_ERR("Could not add mux to codecbin");
hgs
parents:
diff changeset
   955
                                     return NULL;
53
hgs
parents: 43
diff changeset
   956
                                     }
19
hgs
parents:
diff changeset
   957
                                 /*use this as linkpoint*/
hgs
parents:
diff changeset
   958
                                 ghostsrc = gst_element_get_static_pad(mux,"src");
53
hgs
parents: 43
diff changeset
   959
                                 }
19
hgs
parents:
diff changeset
   960
                             /*set audio defaults*/
hgs
parents:
diff changeset
   961
                             if(ctx->xaAudioSource)
53
hgs
parents: 43
diff changeset
   962
                                 {
19
hgs
parents:
diff changeset
   963
                                 /*no audio codec but audio source = PCM case, explicity request audio pad*/
hgs
parents:
diff changeset
   964
                                 ghostaudiosink = gst_element_get_static_pad(mux,"sink");
53
hgs
parents: 43
diff changeset
   965
                                 }
hgs
parents: 43
diff changeset
   966
                             break;     
hgs
parents: 43
diff changeset
   967
                            }                           
hgs
parents: 43
diff changeset
   968
                        
hgs
parents: 43
diff changeset
   969
/*                        case XA_CONTAINERTYPE_3GPP:
hgs
parents: 43
diff changeset
   970
                        case XA_CONTAINERTYPE_MOBILE_DLS:
19
hgs
parents:
diff changeset
   971
                        case XA_CONTAINERTYPE_BMP:
hgs
parents:
diff changeset
   972
                        case XA_CONTAINERTYPE_ASF:
hgs
parents:
diff changeset
   973
                        case XA_CONTAINERTYPE_M4A:
hgs
parents:
diff changeset
   974
                        case XA_CONTAINERTYPE_MP3:
hgs
parents:
diff changeset
   975
                        case XA_CONTAINERTYPE_JPG2000:
hgs
parents:
diff changeset
   976
                        case XA_CONTAINERTYPE_MPEG_ES:
hgs
parents:
diff changeset
   977
                        case XA_CONTAINERTYPE_MPEG_PS:
hgs
parents:
diff changeset
   978
                        case XA_CONTAINERTYPE_MPEG_TS:
hgs
parents:
diff changeset
   979
                        case XA_CONTAINERTYPE_QT:
hgs
parents:
diff changeset
   980
                        case XA_CONTAINERTYPE_XMF_0:
hgs
parents:
diff changeset
   981
                        case XA_CONTAINERTYPE_XMF_1:
hgs
parents:
diff changeset
   982
                        case XA_CONTAINERTYPE_XMF_2:
hgs
parents:
diff changeset
   983
                        case XA_CONTAINERTYPE_XMF_3:
hgs
parents:
diff changeset
   984
                        case XA_CONTAINERTYPE_XMF_GENERIC:
hgs
parents:
diff changeset
   985
                        case XA_CONTAINERTYPE_AAC:
hgs
parents:
diff changeset
   986
                        case XA_CONTAINERTYPE_3GA:
hgs
parents:
diff changeset
   987
                        case XA_CONTAINERTYPE_RM:
53
hgs
parents: 43
diff changeset
   988
                        case XA_CONTAINERTYPE_DMF:*/
hgs
parents: 43
diff changeset
   989
                            
19
hgs
parents:
diff changeset
   990
                        default:
53
hgs
parents: 43
diff changeset
   991
                            DEBUG_INFO("No support for requested container type.");
hgs
parents: 43
diff changeset
   992
                            ret = XA_RESULT_CONTENT_UNSUPPORTED;
hgs
parents: 43
diff changeset
   993
                            break;
hgs
parents: 43
diff changeset
   994
                        }
hgs
parents: 43
diff changeset
   995
                    break;
43
hgs
parents: 33
diff changeset
   996
                    }
53
hgs
parents: 43
diff changeset
   997
                default:
hgs
parents: 43
diff changeset
   998
                    DEBUG_ERR("Incorrect data format type.");
hgs
parents: 43
diff changeset
   999
                    ret = XA_RESULT_PARAMETER_INVALID;
hgs
parents: 43
diff changeset
  1000
                break;
43
hgs
parents: 33
diff changeset
  1001
                }
53
hgs
parents: 43
diff changeset
  1002
            }
hgs
parents: 43
diff changeset
  1003
        else
hgs
parents: 43
diff changeset
  1004
            {
hgs
parents: 43
diff changeset
  1005
            DEBUG_ERR("Invalid data sink for stream recording!!");
hgs
parents: 43
diff changeset
  1006
            ret = XA_RESULT_PARAMETER_INVALID;
19
hgs
parents:
diff changeset
  1007
            }
43
hgs
parents: 33
diff changeset
  1008
        }
19
hgs
parents:
diff changeset
  1009
    else
53
hgs
parents: 43
diff changeset
  1010
        {/* stream recording not requested, datasink ignored, use uncoded recordstream*/
19
hgs
parents:
diff changeset
  1011
        mux = gst_element_factory_make("identity", "mux");
hgs
parents:
diff changeset
  1012
        gst_bin_add(GST_BIN(codecbin), mux);
hgs
parents:
diff changeset
  1013
        ghostsrc = gst_element_get_static_pad(mux,"src");
53
hgs
parents: 43
diff changeset
  1014
        }
19
hgs
parents:
diff changeset
  1015
hgs
parents:
diff changeset
  1016
    /*set default codecs for unrecognized*/
hgs
parents:
diff changeset
  1017
    if(ctx->audioEncSettings.encoderId == XA_ADAPTID_UNINITED)
hgs
parents:
diff changeset
  1018
    ctx->audioEncSettings.encoderId = XA_AUDIOCODEC_PCM;
hgs
parents:
diff changeset
  1019
hgs
parents:
diff changeset
  1020
    if ( ret != XA_RESULT_SUCCESS )
53
hgs
parents: 43
diff changeset
  1021
        {
19
hgs
parents:
diff changeset
  1022
        gst_object_unref(codecbin);
hgs
parents:
diff changeset
  1023
        codecbin=NULL;
53
hgs
parents: 43
diff changeset
  1024
        }
19
hgs
parents:
diff changeset
  1025
    else
53
hgs
parents: 43
diff changeset
  1026
        {
19
hgs
parents:
diff changeset
  1027
        /*add ghost pad(s) to link to*/
hgs
parents:
diff changeset
  1028
        if(ghostsrc)
53
hgs
parents: 43
diff changeset
  1029
            {
19
hgs
parents:
diff changeset
  1030
            gst_element_add_pad(codecbin, gst_ghost_pad_new("src",ghostsrc));
hgs
parents:
diff changeset
  1031
            gst_object_unref(GST_OBJECT(ghostsrc));
53
hgs
parents: 43
diff changeset
  1032
            }
19
hgs
parents:
diff changeset
  1033
        if(ghostaudiosink)
53
hgs
parents: 43
diff changeset
  1034
            {
19
hgs
parents:
diff changeset
  1035
            gst_element_add_pad(codecbin, gst_ghost_pad_new("sink",ghostaudiosink));
hgs
parents:
diff changeset
  1036
            gst_object_unref(GST_OBJECT(ghostaudiosink));
53
hgs
parents: 43
diff changeset
  1037
            }
hgs
parents: 43
diff changeset
  1038
hgs
parents: 43
diff changeset
  1039
        DEBUG_INFO_A1("Created encoder bin at %x", (int)codecbin);
43
hgs
parents: 33
diff changeset
  1040
        }
19
hgs
parents:
diff changeset
  1041
hgs
parents:
diff changeset
  1042
    DEBUG_API("<-XAMediaRecorderAdapt_CreateEncodeBin");
hgs
parents:
diff changeset
  1043
    return codecbin;
hgs
parents:
diff changeset
  1044
43
hgs
parents: 33
diff changeset
  1045
    }
19
hgs
parents:
diff changeset
  1046
hgs
parents:
diff changeset
  1047