khronosfws/openmax_al/src/gst_adaptation/xaadaptationgst.c
changeset 53 eabc8c503852
parent 33 5e8b14bae8c3
--- a/khronosfws/openmax_al/src/gst_adaptation/xaadaptationgst.c	Fri Sep 03 19:34:12 2010 -0500
+++ b/khronosfws/openmax_al/src/gst_adaptation/xaadaptationgst.c	Tue Sep 21 11:38:43 2010 -0500
@@ -15,13 +15,14 @@
  *
  */
 
-#include <assert.h>
 #include <string.h>
 #include <gst/gst.h>
 #include <gst/gstbuffer.h>
+#include <stdlib.h>
+#ifdef INPUTSRCSELECTION_FEATURE
+#include <gst/interfaces/gstaudioinputinterface.h>
+#endif
 #include "xaobjectitf.h"
-#include "xaradiodevice.h"
-#include <stdlib.h>
 #include "xaadaptationgst.h"
 /*
  * XAAdaptationGstCtx* XAAdaptationGst_Create()
@@ -45,24 +46,25 @@
             {
             GError* gerror = 0;
             /*         Add default handler for Gst-bus messages */
-            pSelf->busCb = XAAdaptationGst_GstBusCb;
-
-            // VASU MOD BEGINS
+            //pSelf->busCb = XAAdaptationGst_GstBusCb;
             pSelf->cond_mutx_inited = XA_BOOLEAN_FALSE;
-            // VASU MOD ENDS
-
+#ifdef PROFILE_HEAP_USAGE
+            xa_heap_total_alloc_print("Before GST Init");
+#endif
             sem_init(&(pSelf->semAsyncWait), 0, 0);
-//cross check
             if ( !gst_init_check( NULL, NULL, &gerror ) )
                 {
                     DEBUG_ERR("Gst Initalization failure.");
                     return XA_RESULT_INTERNAL_ERROR;
                 }
+#ifdef PROFILE_HEAP_USAGE
+            xa_heap_total_alloc_print("After GST Init");
+#endif            
             }
         }
     else
         {
-        DEBUG_ERR("Invalid Gst Base Context.")
+        DEBUG_ERR("Invalid Gst Base Context.");
         return XA_RESULT_PARAMETER_INVALID;
         }
 
@@ -78,7 +80,6 @@
     {
     XAresult ret = XA_RESULT_SUCCESS;
     DEBUG_API("->XAAdaptationGst_PostInit");
-    // VASU MOD BEGINS
     XAAdaptationBase_PostInit(&ctx->baseObj);
 
     ctx->thread_launched = XA_BOOLEAN_FALSE;
@@ -86,7 +87,6 @@
     pthread_cond_init(&(ctx->ds_condition), NULL);
     ctx->cond_mutx_inited = XA_BOOLEAN_TRUE;
 
-    // VASU MOD ENDS
     DEBUG_API("<-XAAdaptationGst_PostInit");
     return ret;
     }
@@ -112,7 +112,7 @@
         if (gst_element_set_state(GST_ELEMENT(ctx->bin), GST_STATE_NULL)
                 != GST_STATE_CHANGE_SUCCESS)
             { /*not much we can do*/
-            DEBUG_ERR("WARNING: Failed to change to NULL state before deletion!!")
+            DEBUG_ERR("WARNING: Failed to change to NULL state before deletion!!");
             }
         }
 
@@ -130,8 +130,6 @@
         gst_object_unref(ctx->bin);
         }
 
-    //g_array_free(ctx->evtHdlrs, TRUE);
-    // VASU MOD BEGINS
     if (ctx->cond_mutx_inited == XA_BOOLEAN_TRUE)
         {
         ctx->thread_launched = XA_BOOLEAN_FALSE;
@@ -139,87 +137,11 @@
         pthread_cond_destroy(&(ctx->ds_condition));
         ctx->cond_mutx_inited = XA_BOOLEAN_FALSE;
         }
-    // VASU MOD ENDS
     XAAdaptationBase_Free(&ctx->baseObj);
 
     DEBUG_API("<-XAAdaptationGst_Free");
     }
 
-/*
- * gboolean XAAdaptationBase_GstBusCb( GstBus *bus, GstMessage *message, gpointer data )
- * Default Gst-bus message handler (Callback)
- */
-gboolean XAAdaptationGst_GstBusCb(GstBus *bus, GstMessage *message,
-        gpointer data)
-    {
-    GError *error;
-    gchar *debug;
-    DEBUG_API("->XAAdaptationGst_GstBusCb");DEBUG_INFO_A2("Received Gst callback \"%s\" from \"%s\"",
-            GST_MESSAGE_TYPE_NAME(message),
-            GST_OBJECT_NAME(GST_MESSAGE_SRC(message)));
-
-    switch (GST_MESSAGE_TYPE(message))
-        {
-        case GST_MESSAGE_ERROR:
-            gst_message_parse_error(message, &error, &debug);
-            DEBUG_INFO_A1("%s", debug)
-            ;
-            break;
-        case GST_MESSAGE_EOS:
-            break;
-        case GST_MESSAGE_UNKNOWN:
-            break;
-        case GST_MESSAGE_WARNING:
-            break;
-        case GST_MESSAGE_INFO:
-            break;
-        case GST_MESSAGE_TAG:
-            break;
-        case GST_MESSAGE_BUFFERING:
-            break;
-        case GST_MESSAGE_STATE_CHANGED:
-            break;
-        case GST_MESSAGE_STATE_DIRTY:
-            break;
-        case GST_MESSAGE_STEP_DONE:
-            break;
-        case GST_MESSAGE_CLOCK_PROVIDE:
-            break;
-        case GST_MESSAGE_CLOCK_LOST:
-            break;
-        case GST_MESSAGE_NEW_CLOCK:
-            break;
-        case GST_MESSAGE_STRUCTURE_CHANGE:
-            break;
-        case GST_MESSAGE_STREAM_STATUS:
-            break;
-        case GST_MESSAGE_APPLICATION:
-            break;
-        case GST_MESSAGE_ELEMENT:
-            break;
-        case GST_MESSAGE_SEGMENT_START:
-            break;
-        case GST_MESSAGE_SEGMENT_DONE:
-            break;
-        case GST_MESSAGE_DURATION:
-            break;
-        case GST_MESSAGE_LATENCY:
-            break;
-        case GST_MESSAGE_ASYNC_START:
-            break;
-        case GST_MESSAGE_ASYNC_DONE:
-            break;
-        case GST_MESSAGE_ANY:
-            break;
-        default:
-            DEBUG_INFO("Unhandled Gst-Bus message")
-            ;
-            break;
-        }
-    DEBUG_API("<-XAAdaptationGst_GstBusCb");
-    return TRUE;
-    }
-
 XAresult XAAdaptationGst_InitGstListener(XAAdaptationGstCtx* ctx)
     {
     int ret;
@@ -230,23 +152,21 @@
         }
     if (!ctx->bus)
         {
-        DEBUG_ERR("could not get gst bus!")
+        DEBUG_ERR("could not get gst bus!");
         return XA_RESULT_INTERNAL_ERROR;
         }
     ret = pthread_create(&(ctx->busloopThr), NULL,
             (XAAdaptationGst_LaunchGstListener), (void*) ctx);
-    // VASU MOD BEGINS
     if (ctx->thread_launched == XA_BOOLEAN_FALSE)
         {
         // Wait until the thread is created
         pthread_mutex_lock(&(ctx->ds_mutex));
         pthread_cond_wait(&(ctx->ds_condition), &(ctx->ds_mutex));
         pthread_mutex_unlock(&(ctx->ds_mutex));
-        // VASU MOD ENDS
         }
     if (ret)
         {
-        DEBUG_ERR_A1("could not create thread!! (%d)",ret)
+        DEBUG_ERR_A1("could not create thread!! (%d)",ret);
         return XA_RESULT_INTERNAL_ERROR;
         }
     DEBUG_API("<-XAAdaptationGst_InitGstListener");
@@ -257,24 +177,21 @@
     {
     XAAdaptationGstCtx* ctx = (XAAdaptationGstCtx*) args;
     DEBUG_API("->XAAdaptationGst_LaunchGstListener");
-    // VASU MOD BEGINS
     // Signal calling thread that this thread creation is completed
     ctx->thread_launched = XA_BOOLEAN_TRUE;
     pthread_mutex_lock(&(ctx->ds_mutex));
     pthread_cond_signal(&(ctx->ds_condition));
     pthread_mutex_unlock(&(ctx->ds_mutex));
-    // VASU MOD ENDS
 
     ctx->busloop = g_main_loop_new(NULL, FALSE);
     if (!ctx->busloop)
         {
         DEBUG_ERR("Glib main loop failure.");
         DEBUG_API("<-XAAdaptationGst_LaunchGstListener");
-        assert(0);
         }
     else
         {
-        DEBUG_INFO("Start Glib main loop")
+        DEBUG_INFO("Start Glib main loop");
         g_main_loop_run(ctx->busloop);
         DEBUG_INFO("Glib main loop stopped - exiting thread");
         DEBUG_API("<-XAAdaptationGst_LaunchGstListener");
@@ -397,47 +314,40 @@
  * Description: Create gst source element corresponding to XA source structure
  */
 GstElement* XAAdaptationGst_CreateGstSource(XADataSource* xaSrc,
-        const char *name, XAboolean *isobj, XAboolean *isPCM,
-        XAboolean *isRawImage)
+        const char *name, XAboolean *isPCM )
     {
     XAuint32 locType = 0;
     GstElement* gstSrc = NULL;
+#ifdef INPUTSRCSELECTION_FEATURE    
+    GstAudioInputConfigIntfc *audioInputIntfc = NULL;
+#endif
     char* fname = NULL;
     XADataLocator_URI* uri = NULL;
     XADataLocator_IODevice* ioDevice = NULL;
-#ifdef OMAX_CAMERABIN
-    XACameraDeviceImpl* cameraDevice = NULL;
-    XAObjectItfImpl* pObj = NULL;
-#endif
-    XARadioDeviceImpl* radioDevice = NULL;
 
     DEBUG_API("->XAAdaptationGst_CreateGstSource");
-    if (!xaSrc || !xaSrc->pLocator || !isobj)
+    if (!xaSrc || !xaSrc->pLocator )
         {
         return NULL;
         }
-    *isobj = XA_BOOLEAN_FALSE;
+
     if (xaSrc && xaSrc->pFormat && *((XAuint32*) (xaSrc->pFormat))
             ==XA_DATAFORMAT_PCM && isPCM)
         {
         *isPCM = XA_BOOLEAN_TRUE;
         }
-    if (xaSrc && xaSrc->pFormat && *((XAuint32*) (xaSrc->pFormat))
-            ==XA_DATAFORMAT_RAWIMAGE && isRawImage)
-        {
-        *isRawImage = XA_BOOLEAN_TRUE;
-        }
+
     locType = *((XAuint32*) (xaSrc->pLocator));
     switch (locType)
         {
         case XA_DATALOCATOR_URI:
-            DEBUG_INFO("XA_DATALOCATOR_URI")
-            ;
+            {
+            DEBUG_INFO("XA_DATALOCATOR_URI");
             uri = (XADataLocator_URI*) xaSrc->pLocator;
             gstSrc = gst_element_factory_make("filesrc", name);
             if (uri->URI != NULL)
                 {
-                DEBUG_INFO_A1("URI: %s", uri->URI);
+                DEBUG_INFO_A1_STR("URI: %s", (char *)uri->URI);
                 if (strncmp((char *) uri->URI, "file:///", 8) == 0)
                     {
                     fname = (char *) &((uri->URI)[8]);
@@ -445,7 +355,8 @@
                 else
                     {
                     fname = (char *) uri->URI;
-                    }DEBUG_INFO_A1("->filesystem path %s", fname);
+                    }
+                DEBUG_INFO_A1_STR("->filesystem path %s", (char *)fname);
                 g_object_set(G_OBJECT(gstSrc), "location", fname, NULL);
                 /*check for pcm - decodebin does not know how to handle raw PCM files */
                 if (isPCM && strstr(fname, ".pcm"))
@@ -460,10 +371,10 @@
                 return NULL;
                 }
             break; /* XA_DATALOCATOR_URI */
-
+            }
         case XA_DATALOCATOR_IODEVICE:
-            DEBUG_INFO("XA_DATALOCATOR_IODEVICE")
-            ;
+            {
+            DEBUG_INFO("XA_DATALOCATOR_IODEVICE");
             ioDevice = (XADataLocator_IODevice*) (xaSrc->pLocator);
             switch (ioDevice->deviceType)
                 {
@@ -473,96 +384,63 @@
                     DEBUG_INFO_A1("ioDevice->deviceID: %x", ioDevice->deviceID);
                     switch (ioDevice->deviceID)
                         {
-                        //case XA_ADAPTID_ALSASRC: //Krishna
-                        case XA_ADAPTID_DEVSOUNDSRC:
-                            //DEBUG_INFO("alsasrc"); //Krishna
-                            DEBUG_INFO("devsoundsrc")
-                            ;
+                        case XA_ADAPTID_DEVSOUNDSRC_MIC:
+                            DEBUG_INFO("devsoundsrc");
+                            gstSrc = gst_element_factory_make("devsoundsrc",
+                                    name);
+#ifdef INPUTSRCSELECTION_FEATURE
+                            if(gstSrc)
+                                {
+                                audioInputIntfc = GST_AUDIO_INPUT_CONFIG_GET_IFACE(gstSrc);
+                                if(audioInputIntfc)
+                                    {
+                                    audioInputIntfc->SetAudioInputs(EDefaultMicrophone);
+                                    }
+                                }
+#endif
+                            break;
+                        case XA_ADAPTID_DEVSOUNDSRC_FMRX:
+                            DEBUG_INFO("devsoundsrc");
                             gstSrc = gst_element_factory_make("devsoundsrc",
-                                    name); //Krishna - changed to devsoundsrc
-							// no need to set num-buffers		
-                            /*g_object_set(G_OBJECT (gstSrc), "num-buffers",
-                                    80, NULL);*/
+                                    name);
+#ifdef INPUTSRCSELECTION_FEATURE
+                            if(gstSrc)
+                                {
+                                audioInputIntfc = GST_AUDIO_INPUT_CONFIG_GET_IFACE(gstSrc);
+                                if(audioInputIntfc)
+                                    {
+                                    audioInputIntfc->SetAudioInputs(EFmRadio);
+                                    }
+                                }
+#endif
                             break;
+                        case XA_ADAPTID_DEVSOUNDSRC_CALL:
+                            DEBUG_INFO("devsoundsrc");
+                            gstSrc = gst_element_factory_make("devsoundsrc",
+                                    name);
+#ifdef INPUTSRCSELECTION_FEATURE
+                            if(gstSrc)
+                                {
+                                audioInputIntfc = GST_AUDIO_INPUT_CONFIG_GET_IFACE(gstSrc);
+                                if(audioInputIntfc)
+                                    {
+                                    audioInputIntfc->SetAudioInputs(EVoiceCall);
+                                    }
+                                }
+#endif
+                            break;
+
                         case XA_ADAPTID_AUDIOTESTSRC:
                             /*fall through*/
                         default:
-                            DEBUG_INFO("audiotestsrc")
-                            ;
+                            DEBUG_INFO("audiotestsrc");
                             gstSrc = gst_element_factory_make("audiotestsrc",
                                     name);
                             break;
                         }
                     break;
                     }
-#ifdef OMAX_CAMERABIN
 
-                    case XA_IODEVICE_CAMERA:
-                        {
-                        DEBUG_INFO("XA_IODEVICE_CAMERA");
-                        if ( ioDevice->device )
-                            { /*source is camera object*/
-                            DEBUG_INFO("Use camerabin as source.");
-                            /* Get camerabin from source object */
-                            pObj = (XAObjectItfImpl*)(*ioDevice->device);
-                            cameraDevice = (XACameraDeviceImpl*)(pObj);
-                            /*TODO we had to remove this line below since adaptationCtx
-                             * was  not a member of structure*/
-
-                            gstSrc = GST_ELEMENT(((XAAdaptationGstCtx*)(cameraDevice->adaptationCtx))->bin);
-                            /* refcount increase is needed to keep this not being deleted after use */
-                            gst_object_ref(GST_OBJECT(gstSrc));
-                            *isobj = XA_BOOLEAN_TRUE;
-                            }
-                        else
-                            {
-                            DEBUG_INFO_A1("ioDevice->deviceID: %x", ioDevice->deviceID);
-                            switch (ioDevice->deviceID )
-                                {
-                                case XA_ADAPTID_V4L2SRC:
-                                DEBUG_INFO("Camera deviceID: v4l2src ");
-
-                                break;
-                                case XA_ADAPTID_VIDEOTESTSRC:
-                                DEBUG_INFO("Camera deviceID: videotestsrc");
-
-                                break;
-                                default:
-                                case XA_DEFAULTDEVICEID_CAMERA:
-                                DEBUG_INFO("Camera deviceID:Default");
-
-                                break;
-                                }
-                            if ( cameraCtx )
-                                {
-                                gstSrc = GST_ELEMENT(cameraCtx->baseObj.bin);
-                                gst_object_ref(GST_OBJECT(gstSrc));
-                                *isobj = XA_BOOLEAN_TRUE;
-                                }
-                            else
-                                {
-                                DEBUG_ERR("No camera object created!");
-                                return NULL;
-                                }
-                            }
-                        break;
-                        }
-#endif                
-                case XA_IODEVICE_RADIO:
-                    DEBUG_INFO("XA_IODEVICE_RADIO")
-                    ;
-                    if (ioDevice->device)
-                        {
-                        DEBUG_INFO("Use radio pipeline as source.");
-                        /* Get radio_pipeline and set it to base context */
-                        radioDevice = (XARadioDeviceImpl*) (*ioDevice->device);
-                        /* radio does not have actual bin, only source element*/
-                        gstSrc = GST_ELEMENT(((XAAdaptationGstCtx*)radioDevice->adaptationCtx)->bin);
-                        /* refcount increase is needed to keep this not being deleted after use */
-                        gst_object_ref(GST_OBJECT(gstSrc));
-                        /**isobj = XA_BOOLEAN_TRUE;*/
-                        }
-                    break;
                 default:
                     {
                     DEBUG_ERR("Unsupported IODevice.");
@@ -570,47 +448,16 @@
                     }
                 }
             break; /* XA_DATALOCATOR_IODEVICE */
-
+            }
         case XA_DATALOCATOR_ADDRESS:
-            {
-            XADataLocator_Address* address =
-                    (XADataLocator_Address*) (xaSrc->pLocator);
-            gstSrc = gst_element_factory_make("appsrc", name);
-            /* init gst buffer from datalocator */
-            if (gstSrc)
-                {
-                /* init GST buffer from XADataLocator*/
-                GstBuffer* userBuf = gst_buffer_new();
-                if (userBuf)
-                    {
-                    userBuf->size = address->length;
-                    userBuf->data = address->pAddress;
-                    /* push the whole buffer to appsrc so it is ready for preroll */
-                    DEBUG_INFO("Pushing buffer");
-                    gst_app_src_push_buffer(GST_APP_SRC(gstSrc), userBuf);
-                    DEBUG_INFO_A1("Sent buffer at 0x%x to appsrc", userBuf );
-                    gst_app_src_end_of_stream(GST_APP_SRC(gstSrc));
-                    }
-                else
-                    {
-                    DEBUG_ERR("Failure allocating buffer!");
-                    }
-                }
-            else
-                {
-                DEBUG_ERR("Failure creating appsrc!");
-                }
-            }
-            break;
-
         default:
-            DEBUG_ERR("Incorrect data locator for source.")
+            DEBUG_ERR("Incorrect data locator for source.");
             break;
         }
 
     if (gstSrc)
         {
-        DEBUG_INFO_A1("Created gstreamer source element at %x", gstSrc);
+        DEBUG_INFO_A1("Created gstreamer source element at %x", (int)gstSrc);
         }
 
     DEBUG_API("<-XAAdaptationGst_CreateGstSource");
@@ -625,7 +472,7 @@
  * Description: Create gst sink element corresponding to XA sink structure
  */
 GstElement* XAAdaptationGst_CreateGstSink(XADataSink* xaSnk,
-        const char *name, XAboolean *isobj)
+        const char *name)
     {
     XAuint32 locType = 0;
     GstElement* gstSnk = NULL;
@@ -648,8 +495,8 @@
         switch (locType)
             {
             case XA_DATALOCATOR_URI:
-                DEBUG_INFO("XA_DATALOCATOR_URI")
-                ;
+                {
+                DEBUG_INFO("XA_DATALOCATOR_URI");
                 uri = (XADataLocator_URI*) xaSnk->pLocator;
                 gstSnk = gst_element_factory_make("filesink", name);
                 if (!gstSnk)
@@ -660,7 +507,7 @@
                 if (uri->URI != NULL)
                     {
                     XAchar *fname;
-                    DEBUG_INFO_A1("URI: %s", uri->URI);
+                    DEBUG_INFO_A1_STR("URI: %s", (char *)uri->URI);
                     if (strncmp((char *) uri->URI, "file:///", 8) == 0)
                         {
                         fname = &((uri->URI)[8]);
@@ -668,7 +515,8 @@
                     else
                         {
                         fname = uri->URI;
-                        }DEBUG_INFO_A1("->filesystem path %s", fname);
+                        }
+                    DEBUG_INFO_A1_STR("->filesystem path %s", (char *)fname);
                     g_object_set(G_OBJECT(gstSnk), "location", fname,
                             "async", FALSE, "qos", FALSE, "max-lateness",
                             (gint64) (-1), NULL);
@@ -679,737 +527,35 @@
                     return NULL;
                     }
                 break;
+                }
+/*            case XA_DATALOCATOR_ADDRESS:
             case XA_DATALOCATOR_NATIVEDISPLAY:
-                DEBUG_INFO("Sink locator type - XA_DATALOCATOR_NATIVEDISPLAY")
-                ;
-#ifdef USE_NGA_SURFACES
-                gstSnk = gst_element_factory_make("devvideosink",
-                        "devvideosink");
-#else
-                gstSnk = gst_element_factory_make("ximagesink",name);
-#endif /*USE_NGA_SURFACES*/
-                if (!gstSnk)
-                    {
-                    DEBUG_ERR("Cannot create sink!");
-                    return NULL;
-                    }
-                g_object_set(G_OBJECT(gstSnk), "force-aspect-ratio", TRUE,
-                        "async", FALSE, "qos", FALSE, "handle-events", TRUE,
-                        "handle-expose", TRUE, "max-lateness", (gint64) (-1),
-                        NULL);
-                break;
             case XA_DATALOCATOR_OUTPUTMIX:
-                DEBUG_INFO("Sink locator type - XA_DATALOCATOR_OUTPUTMIX");
-                    {
-                    }
-                break;
-
-            case XA_DATALOCATOR_ADDRESS:
-                {
-                gstSnk = gst_element_factory_make("appsink", name);
-                /* Not actually object sink, but attribute used to notify recorder
-                 * about appsink (no object sinks applicable in this use case)
-                 **/
-                *isobj = TRUE;
-                }
-                break;
-            case XA_DATALOCATOR_IODEVICE:
+            case XA_DATALOCATOR_IODEVICE:*/
                 /* when only valid IOdevice sinks vibra and LED sinks implemented
                  * at adaptation level, add handling here (in this implementation,
                  * no handling needed as only dummy implementations for those)
                  **/
             default:
-                DEBUG_ERR("Incorrect data locator for sink.")
+                DEBUG_ERR("Incorrect data locator for sink.");
                 break;
             }
         }
     if (gstSnk)
         {
-        DEBUG_INFO_A1("Created gstreamer sink element at %x", gstSnk);
+        DEBUG_INFO_A1("Created gstreamer sink element at %x", (int)gstSnk);
         }
     DEBUG_API("<-XAAdaptationGst_CreateGstSink");
     return gstSnk;
     }
 
-/**
- * GstElement* XAAdaptationGst_CreateVideoPP( )
- * @return GstElement* - return newly created gst pipeline element
- * Description: Create video processing pipeline
- */
-GstElement* XAAdaptationGst_CreateVideoPP()
-    {
-    GstElement *vpp;
-    DEBUG_API("->XAAdaptationGst_CreateVideoPP");
-    vpp = gst_pipeline_new("videopp");
-    if (vpp)
-        {
-        GstPad *ghostsink, *ghostsrc;
-        GstElement *col1, *col2, *rotate, *mirror, *box, *crop, *gamma,
-                *balance, *scale, *scale2,
-#ifdef USE_NGA_SURFACES
-                *identity,
-#endif /*USE_NGA_SURFACES*/
-                *queue;
-
-        /* Crete ffmpegcolorspace to convert stream to correct format */
-        col1 = gst_element_factory_make("ffmpegcolorspace", "pp_colsp1");
-        if (col1)
-            {
-            DEBUG_INFO("Created ffmpegcolorspace element");
-            gst_bin_add(GST_BIN(vpp), col1);
-            /* make this bin link point*/
-            ghostsink = gst_element_get_static_pad(col1, "sink");
-            if (ghostsink)
-                {
-                gst_element_add_pad(vpp, gst_ghost_pad_new("videopp_sink",
-                        ghostsink));
-                gst_object_unref(GST_OBJECT(ghostsink));
-                }
-            }
-
-        /* create video crop, this will be sink for videoPP pipeline */
-        crop = gst_element_factory_make("videocrop", "pp_crop");
-        if (crop)
-            {
-            DEBUG_INFO("Created crop element");
-            gst_bin_add(GST_BIN(vpp), crop);
-            }
-
-        /* create video rotate */
-        rotate = gst_element_factory_make("videoflip", "pp_rotate");
-        if (rotate)
-            {
-            DEBUG_INFO("Created rotate element");
-            g_object_set(G_OBJECT(rotate), "method", FLIP_NONE, NULL);
-            gst_bin_add(GST_BIN(vpp), rotate);
-            }
-
-        /* create video mirror */
-        mirror = gst_element_factory_make("videoflip", "pp_mirror");
-        if (mirror)
-            {
-            DEBUG_INFO("Created mirror element");
-            g_object_set(G_OBJECT(mirror), "method", FLIP_NONE, NULL);
-            gst_bin_add(GST_BIN(vpp), mirror);
-            }
-
-        /* create video box */
-        box = gst_element_factory_make("videobox", "pp_box");
-        if (box)
-            {
-            DEBUG_INFO("Created videobox element");
-            gst_bin_add(GST_BIN(vpp), box);
-            }
-
-        /* create video balance */
-        balance = gst_element_factory_make("videobalance", "pp_balance");
-        if (balance)
-            {
-            DEBUG_INFO("Created balance element");
-            gst_bin_add(GST_BIN(vpp), balance);
-            }
-
-        /* create video gamma */
-        gamma = gst_element_factory_make("gamma", "pp_gamma");
-        if (gamma)
-            {
-            DEBUG_INFO("Created gamma element");
-            gst_bin_add(GST_BIN(vpp), gamma);
-            }
-
-        /* Create videoscale element to scale postprocessed output to correct size */
-        scale = gst_element_factory_make("videoscale", "pp_scale");
-        if (scale)
-            {
-            DEBUG_INFO("Created videoscale element");
-            gst_bin_add(GST_BIN(vpp), scale);
-            }
-        scale2 = gst_element_factory_make("videoscale", "pp_scale2");
-        if (scale2)
-            {
-            GstPad *pad = NULL;
-            GstCaps *caps = NULL;
-            DEBUG_INFO("Created videoscale element");
-            pad = gst_element_get_static_pad(scale2, "src");
-            caps = gst_caps_new_simple("video/x-raw-yuv", "width",
-                    G_TYPE_INT, 0, "height", G_TYPE_INT, 0, NULL);
-            gst_pad_set_caps(pad, caps);
-            gst_bin_add(GST_BIN(vpp), scale2);
-            }
-
-        /* create video queue */
-        queue = gst_element_factory_make("queue", "vpp_queue");
-        if (queue)
-            {
-            DEBUG_INFO("Created queue element");
-            gst_bin_add(GST_BIN(vpp), queue);
-#ifdef USE_NGA_SURFACES
-            /* make this bin link point*/
-            ghostsink = gst_element_get_static_pad(queue, "sink");
-            if (ghostsink)
-                {
-                gst_element_add_pad(vpp, gst_ghost_pad_new("videopp_src",
-                        ghostsink));
-                gst_object_unref(GST_OBJECT(ghostsink));
-                }
-#endif /*USE_NGA_SURFACES*/
-            }
-
-        /* Crete ffmpegcolorspace to convert stream to correct format */
-        col2 = gst_element_factory_make("ffmpegcolorspace", "pp_colsp2");
-        if (col2)
-            {
-            DEBUG_INFO("Created ffmpegcolorspace element");
-            gst_bin_add(GST_BIN(vpp), col2);
-            /* make this bin link point*/
-            ghostsrc = gst_element_get_static_pad(col2, "src");
-            if (ghostsrc)
-                {
-                gst_element_add_pad(vpp, gst_ghost_pad_new("videopp_src",
-                        ghostsrc));
-                gst_object_unref(GST_OBJECT(ghostsrc));
-                }
-            }
-
-#ifdef USE_NGA_SURFACES
-        //shyward
-        /* create identity element */
-        identity = gst_element_factory_make("identity", "identity");
-        if (identity)
-            {
-            DEBUG_INFO("Created identity element");
-            gst_bin_add(GST_BIN(vpp), identity);
-            /* make this bin link point*/
-            ghostsrc = gst_element_get_static_pad(identity, "src");
-            if (ghostsrc)
-                {
-                gst_element_add_pad(vpp, gst_ghost_pad_new("videopp_sink",
-                        ghostsrc));
-                gst_object_unref(GST_OBJECT(ghostsrc));
-                }
-            }
-        if (!(gst_element_link_many(queue, identity, NULL)))
-#else
-        //shyward - thins code assumes all the elements will have been created, which is not true
-        if( !(gst_element_link_many(col1,
-                                scale,
-                                crop,
-                                rotate,
-                                mirror,
-                                box,
-                                balance,
-                                gamma,
-                                queue,
-                                scale2,
-#ifdef USE_NGA_SURFACES
-                                identity,
-#endif /*USE_NGA_SURFACES*/
-                                col2,
-                                NULL)
-                ) )
-#endif /*USE_NGA_SURFACES*/
-            {
-            DEBUG_ERR("Could not link videopp elements!!");
-            gst_object_unref(vpp);
-            vpp = NULL;
-            }
-        }
-    DEBUG_API("<-XAAdaptationGst_CreateVideoPP");
-    return vpp;
-    }
-
-/**
- * GstElement* XAAdaptationGst_CreateFixedSizeRecordVideoPP( )
- * @return GstElement* - return newly created gst pipeline element
- * Description: Create video processing pipeline with fixed output size
- *  to TEST_VIDEO_WIDTH x TEST_VIDEO_HEIGHT
- *              experimental implementation for changing recorder output size
- */
-GstElement* XAAdaptationGst_CreateFixedSizeVideoPP()
-    {
-    GstElement *vpp;
-    DEBUG_API("->XAAdaptationGst_CreateFixedSizeVideoPP");
-    vpp = gst_pipeline_new("videopp");
-    if (vpp)
-        {
-        GstPad *ghostsink, *ghostsrc;
-        GstElement *col1, *col2, *rotate, *mirror, *box, *crop, *gamma,
-                *balance, *scale, *scale2, *filter, *queue;
-
-        /* Crete ffmpegcolorspace to convert stream to correct format */
-        col1 = gst_element_factory_make("ffmpegcolorspace", "pp_colsp1");
-        if (col1)
-            {
-            DEBUG_INFO("Created ffmpegcolorspace element");
-            gst_bin_add(GST_BIN(vpp), col1);
-            /* make this bin link point*/
-            ghostsink = gst_element_get_static_pad(col1, "sink");
-            if (ghostsink)
-                {
-                gst_element_add_pad(vpp, gst_ghost_pad_new("videopp_sink",
-                        ghostsink));
-                gst_object_unref(GST_OBJECT(ghostsink));
-                }
-            }
-
-        /* create video crop, this will be sink for videoPP pipeline */
-        crop = gst_element_factory_make("videocrop", "pp_crop");
-        if (crop)
-            {
-            DEBUG_INFO("Created crop element");
-            gst_bin_add(GST_BIN(vpp), crop);
-            }
-
-        /* create video rotate */
-        rotate = gst_element_factory_make("videoflip", "pp_rotate");
-        if (rotate)
-            {
-            DEBUG_INFO("Created rotate element");
-            g_object_set(G_OBJECT(rotate), "method", FLIP_NONE, NULL);
-            gst_bin_add(GST_BIN(vpp), rotate);
-            }
-
-        /* create video mirror */
-        mirror = gst_element_factory_make("videoflip", "pp_mirror");
-        if (mirror)
-            {
-            DEBUG_INFO("Created mirror element");
-            g_object_set(G_OBJECT(mirror), "method", FLIP_NONE, NULL);
-            gst_bin_add(GST_BIN(vpp), mirror);
-            }
-
-        /* create video box */
-        box = gst_element_factory_make("videobox", "pp_box");
-        if (box)
-            {
-            DEBUG_INFO("Created videobox element");
-            gst_bin_add(GST_BIN(vpp), box);
-            }
-
-        /* create video balance */
-        balance = gst_element_factory_make("videobalance", "pp_balance");
-        if (balance)
-            {
-            DEBUG_INFO("Created balance element");
-            gst_bin_add(GST_BIN(vpp), balance);
-            }
-
-        /* create video gamma */
-        gamma = gst_element_factory_make("gamma", "pp_gamma");
-        if (gamma)
-            {
-            DEBUG_INFO("Created gamma element");
-            gst_bin_add(GST_BIN(vpp), gamma);
-            }
-
-        /* Create videoscale element to scale postprocessed output to correct size */
-        scale = gst_element_factory_make("videoscale", "pp_scale");
-        if (scale)
-            {
-            DEBUG_INFO("Created videoscale element");
-            gst_bin_add(GST_BIN(vpp), scale);
-            }
-        scale2 = gst_element_factory_make("videoscale", "pp_scale2");
-        if (scale2)
-            {
-            GstPad *pad = NULL;
-            GstCaps *caps = NULL;
-            DEBUG_INFO("Created videoscale element");
-            pad = gst_element_get_static_pad(scale2, "src");
-            caps = gst_caps_new_simple("video/x-raw-yuv", "width",
-                    G_TYPE_INT, 0, "height", G_TYPE_INT, 0, NULL);
-            gst_pad_set_caps(pad, caps);
-            gst_bin_add(GST_BIN(vpp), scale2);
-            }
-
-        /* create capsfilter for fixed video size */
-        filter = gst_element_factory_make("capsfilter", "pp_filter");
-        if (filter)
-            {
-
-            g_object_set(G_OBJECT(filter), "caps", gst_caps_new_simple(
-                    "video/x-raw-yuv", "width", G_TYPE_INT, TEST_VIDEO_WIDTH,
-                    "height", G_TYPE_INT, TEST_VIDEO_HEIGHT, NULL), NULL);
-            gst_bin_add(GST_BIN(vpp), filter);
-            }
-
-        /* create video queue */
-        queue = gst_element_factory_make("queue", "vpp_queue");
-        if (queue)
-            {
-            gst_bin_add(GST_BIN(vpp), queue);
-            }
-
-        /* Crete ffmpegcolorspace to convert stream to correct format */
-        col2 = gst_element_factory_make("ffmpegcolorspace", "pp_colsp2");
-        if (col2)
-            {
-            DEBUG_INFO("Created ffmpegcolorspace element");
-            gst_bin_add(GST_BIN(vpp), col2);
-            /* make this bin link point*/
-            ghostsrc = gst_element_get_static_pad(col2, "src");
-            if (ghostsrc)
-                {
-                gst_element_add_pad(vpp, gst_ghost_pad_new("videopp_src",
-                        ghostsrc));
-                gst_object_unref(GST_OBJECT(ghostsrc));
-                }
-            }
-        if (!(gst_element_link_many(col1, scale, crop, rotate, mirror, box,
-                balance, gamma, queue, scale2, filter, col2, NULL)))
-            {
-            DEBUG_ERR("Could not link videopp elements!!");
-            gst_object_unref(vpp);
-            vpp = NULL;
-            }
-        }
-    DEBUG_API("<-XAAdaptationGst_CreateFixedSizeVideoPP");
-    return vpp;
-    }
-
-/**
- * GstElement* XAAdaptationGst_CreateVideoPPBlackScr( )
- * @return GstElement* - return newly created gst pipeline element
- * Description: Create video processing pipeline for black screen
- */
-GstElement* XAAdaptationGst_CreateVideoPPBlackScr()
-    {
-    GstElement *vppBScr;
-    DEBUG_API("->XAAdaptationGst_CreateVideoPPBlackScr");
-    vppBScr = gst_pipeline_new("videoppBScr");
-    if (vppBScr)
-        {
-        GstPad *ghostsrc = NULL;
-        GstElement *testVideo = NULL, *scale = NULL;
-        GstElement *ffmpegcolorspace = NULL;
-
-        testVideo = gst_element_factory_make("videotestsrc", "videotest");
-        if (testVideo)
-            {
-            DEBUG_INFO("Created videotestsrc element");
-
-            g_object_set(G_OBJECT(testVideo), "pattern", (gint) 2,
-                    "num-buffers", (gint) 1, NULL);
-            gst_bin_add(GST_BIN(vppBScr), testVideo);
-            }
-
-        scale = gst_element_factory_make("videoscale", "BSrc_scale");
-        if (scale)
-            {
-            DEBUG_INFO("Created videoscale element");
-            gst_bin_add(GST_BIN(vppBScr), scale);
-            /* make this bin link point*/
-            ghostsrc = gst_element_get_static_pad(scale, "src");
-            if (ghostsrc)
-                {
-                gst_element_add_pad(vppBScr, gst_ghost_pad_new(
-                        "videoppBSrc_src", ghostsrc));
-                gst_object_unref(GST_OBJECT(ghostsrc));
-                }
-            }
-        ffmpegcolorspace = gst_element_factory_make("ffmpegcolorspace",
-                "BlackScrFfmpeg");
-        gst_bin_add(GST_BIN(vppBScr), ffmpegcolorspace);
-        if (!(gst_element_link_many(testVideo, ffmpegcolorspace, scale, NULL)))
-            {
-            DEBUG_ERR("Could not link videoppBSrc elements!!");
-            gst_object_unref(vppBScr);
-            vppBScr = NULL;
-            }
-        }
-    DEBUG_API("<-XAAdaptationGst_CreateVideoPPBlackScr");
-    return vppBScr;
-    }
-
-/**
- * GstElement* XAAdaptationGst_CreateInputSelector( )
- * @return GstElement* - return newly created input selector
- * Description: Create input selector to processing between black screen and video screen
- */
-GstElement* XAAdaptationGst_CreateInputSelector()
-    {
-    GstElement *inputSelector;
-    DEBUG_API("->XAAdaptationGst_CreateInputSelector");
-    inputSelector = gst_element_factory_make("input-selector",
-            "input-selector");
-    if (inputSelector)
-        {
-        g_object_set(G_OBJECT(inputSelector), "select-all", TRUE, NULL);
-        }
-    DEBUG_API("<-XAAdaptationGst_CreateInputSelector");
-    return inputSelector;
-    }
-
-/**
- * GstElement* XAAdaptationGst_CreateAudioPP( )
- * @return GstElement* - return newly created gst pipeline element
- * Description: Create video processing pipeline
- */
-GstElement* XAAdaptationGst_CreateAudioPP()
-    {
-    GstElement *app;
-    gboolean ok = TRUE;
-    DEBUG_API("->XAAdaptationGst_CreateAudioPP");
-    app = gst_pipeline_new("audiopp");
-    if (app)
-        {
-        GstPad *ghostsink, *ghostsrc;
-        GstElement *ac, *vol, *eq, *queue, *pan, *ac2;
-
-        /* first and last elements should be audioconverts to
-         *  match sink and encoder formats */
-        ac = gst_element_factory_make("audioconvert", "pp_ac");
-        if (ac)
-            {
-            ok = gst_bin_add(GST_BIN(app), ac);
-            /* make this bin link point*/
-            if (ok)
-                {
-                ghostsink = gst_element_get_static_pad(ac, "sink");
-                ok = gst_element_add_pad(app, gst_ghost_pad_new("sink",
-                        ghostsink));
-                gst_object_unref(GST_OBJECT(ghostsink));
-                }
-            }
-        ac2 = gst_element_factory_make("audioconvert", "pp_ac2");
-        if (ac2 && ok)
-            {
-            ok = gst_bin_add(GST_BIN(app), ac2);
-            /* make this bin link point*/
-            if (ok)
-                {
-                ghostsrc = gst_element_get_static_pad(ac2, "src");
-                ok = gst_element_add_pad(app, gst_ghost_pad_new("src",
-                        ghostsrc));
-                gst_object_unref(GST_OBJECT(ghostsrc));
-                }
-            }
-
-        vol = gst_element_factory_make("volume", "pp_vol");
-        /* create volume controller */
-        if (vol && ok)
-            {
-            ok = gst_bin_add(GST_BIN(app), vol);
-            g_object_set(G_OBJECT(vol), "volume", (gdouble) 1, NULL);
-            }
-        /* create 10-band equalizer */
-        eq = gst_element_factory_make("equalizer-10bands", "pp_equ");
-        if (eq && ok)
-            {
-            ok = gst_bin_add(GST_BIN(app), eq);
-            }
-        /* create audio queue */
-        queue = gst_element_factory_make("queue", "app_queue");
-        if (queue && ok)
-            {
-            ok = gst_bin_add(GST_BIN(app), queue);
-            g_object_set(G_OBJECT (queue), "max-size-buffers", 2, NULL);
-            }
-        /* create audio pan effect */
-        pan = gst_element_factory_make("audiopanorama", "pp_pan");
-        if (pan && ok)
-            {
-            ok = gst_bin_add(GST_BIN(app), pan);
-            }
-
-        if (ac && ok)
-            {
-            if (queue)
-                {
-                ok = gst_element_link(ac, queue);
-                }
-            else if (vol)
-                {
-                ok = gst_element_link(ac, vol);
-                }
-            else if (pan)
-                {
-                ok = gst_element_link(ac, pan);
-                }
-            else if (eq)
-                {
-                ok = gst_element_link(ac, eq);
-                }
-            else if (ac2)
-                {
-                ok = gst_element_link(ac, ac2);
-                }
-            }
-        if (queue && ok)
-            {
-            if (vol)
-                {
-                ok = gst_element_link(queue, vol);
-                }
-            else if (pan)
-                {
-                ok = gst_element_link(queue, pan);
-                }
-            else if (eq)
-                {
-                ok = gst_element_link(queue, eq);
-                }
-            else if (ac2)
-                {
-                ok = gst_element_link(queue, ac2);
-                }
-            }
-        if (vol && ok)
-            {
-            if (pan)
-                {
-                ok = gst_element_link(vol, pan);
-                }
-            else if (eq)
-                {
-                ok = gst_element_link(vol, eq);
-                }
-            else if (ac2)
-                {
-                ok = gst_element_link(vol, ac2);
-                }
-            }
-        if (pan && ok)
-            {
-            if (eq)
-                {
-                ok = gst_element_link(pan, eq);
-                }
-            else if (ac2)
-                {
-                ok = gst_element_link(pan, ac2);
-                }
-            }
-        if (eq && ok)
-            {
-            if (ac2)
-                {
-                ok = gst_element_link(eq, ac2);
-                }
-            }
-
-        if (ac)
-            {
-            // ghost sink above
-            }
-        else if (queue && ok)
-            {
-            /* make this bin link point*/
-            ghostsink = gst_element_get_static_pad(queue, "sink");
-            ok = gst_element_add_pad(app,
-                    gst_ghost_pad_new("sink", ghostsink));
-            gst_object_unref(GST_OBJECT(ghostsink));
-            }
-        else if (vol && ok)
-            {
-            /* make this bin link point*/
-            ghostsink = gst_element_get_static_pad(vol, "sink");
-            ok = gst_element_add_pad(app,
-                    gst_ghost_pad_new("sink", ghostsink));
-            gst_object_unref(GST_OBJECT(ghostsink));
-            }
-        else if (pan && ok)
-            {
-            /* make this bin link point*/
-            ghostsink = gst_element_get_static_pad(pan, "sink");
-            ok = gst_element_add_pad(app,
-                    gst_ghost_pad_new("sink", ghostsink));
-            gst_object_unref(GST_OBJECT(ghostsink));
-            }
-        else if (eq && ok)
-            {
-            /* make this bin link point*/
-            ghostsink = gst_element_get_static_pad(eq, "sink");
-            ok = gst_element_add_pad(app,
-                    gst_ghost_pad_new("sink", ghostsink));
-            gst_object_unref(GST_OBJECT(ghostsink));
-            }
-        else if (ac2 && ok)
-            {
-            /* make this bin link point*/
-            ghostsink = gst_element_get_static_pad(ac2, "sink");
-            ok = gst_element_add_pad(app,
-                    gst_ghost_pad_new("sink", ghostsink));
-            gst_object_unref(GST_OBJECT(ghostsink));
-            }
-
-        if (ac2)
-            {
-            // ghost src above
-            }
-        else if (eq && ok)
-            {
-            /* make this bin link point*/
-            ghostsrc = gst_element_get_static_pad(eq, "src");
-            ok = gst_element_add_pad(app, gst_ghost_pad_new("src", ghostsrc));
-            gst_object_unref(GST_OBJECT(ghostsrc));
-            }
-        else if (pan && ok)
-            {
-            /* make this bin link point*/
-            ghostsrc = gst_element_get_static_pad(pan, "src");
-            ok = gst_element_add_pad(app, gst_ghost_pad_new("src", ghostsrc));
-            gst_object_unref(GST_OBJECT(ghostsrc));
-            }
-        else if (vol && ok)
-            {
-            /* make this bin link point*/
-            ghostsrc = gst_element_get_static_pad(vol, "src");
-            ok = gst_element_add_pad(app, gst_ghost_pad_new("src", ghostsrc));
-            gst_object_unref(GST_OBJECT(ghostsrc));
-            }
-        else if (queue && ok)
-            {
-            /* make this bin link point*/
-            ghostsrc = gst_element_get_static_pad(queue, "src");
-            ok = gst_element_add_pad(app, gst_ghost_pad_new("src", ghostsrc));
-            gst_object_unref(GST_OBJECT(ghostsrc));
-            }
-        else if (ac && ok)
-            {
-            /* make this bin link point*/
-            ghostsrc = gst_element_get_static_pad(ac, "src");
-            ok = gst_element_add_pad(app, gst_ghost_pad_new("src", ghostsrc));
-            gst_object_unref(GST_OBJECT(ghostsrc));
-            }
-
-        //        if( !(gst_element_link_many(ac, queue, vol, ac2, NULL)) )
-        //        if( !(gst_element_link_many(ac, queue, vol, pan, eq, ac2, NULL)) )
-        if (!ok)
-            {
-            DEBUG_ERR("Could not link audiopp elements!!");
-            gst_object_unref(app);
-            app = NULL;
-            }
-        }
-
-    DEBUG_API("<-XAAdaptationGst_CreateAudioPP");
-    return app;
-    }
-
 /* called when pad is actually blocking/ gets unblocked*/
 void XAAdaptationGst_PadBlockCb(GstPad *pad, gboolean blocked,
         gpointer user_data)
     {
-    DEBUG_API_A2("->XAAdaptationGst_PadBlockCb   pad \"%s\" of \"%s\" ",
+    DEBUG_API_A2_STR("->XAAdaptationGst_PadBlockCb   pad \"%s\" of \"%s\" ",
             GST_OBJECT_NAME(pad),
             GST_OBJECT_NAME(gst_pad_get_parent_element(pad)) );
     DEBUG_API_A1("<-XAAdaptationGst_PadBlockCb   blocked:%d",blocked);
     }
 
-/* utility to set same fields for all media types in caps */
-void XAAdaptationGst_SetAllCaps(GstCaps * caps, char *field, ...)
-    {
-    GstStructure *structure;
-    va_list var_args;
-    int i;
-
-    for (i = 0; i < gst_caps_get_size(caps); i++)
-        {
-        structure = gst_caps_get_structure(caps, i);
-        va_start (var_args, field);
-        gst_structure_set_valist(structure, field, var_args);
-        va_end (var_args);
-        }
-    }
-