static void
type_instance_init (GTypeInstance *instance,
                    gpointer g_class)
{
    GstOmxBaseFilter2 *omx_base;
    GstOmxBaseVfpc2 *self;
	char srcname[10];
	int i;

    omx_base = GST_OMX_BASE_FILTER2 (instance);
    self = GST_OMX_BASE_VFPC2 (instance);

    omx_base->omx_setup = omx_setup;
    self->g_class = g_class;

    gst_pad_set_setcaps_function (omx_base->sinkpad,
            GST_DEBUG_FUNCPTR (sink_setcaps));
	for (i=0; i<NUM_OUTPUTS; i++) 
    	gst_pad_set_setcaps_function (omx_base->srcpad[i],
            GST_DEBUG_FUNCPTR (src_setcaps));
	
    /* free the existing core and ports */
    g_omx_core_free (omx_base->gomx);
    g_omx_port_free (omx_base->in_port);

    /* create new core and ports */
    omx_base->gomx = g_omx_core_new (omx_base, self->g_class);
    omx_base->in_port = g_omx_core_get_port (omx_base->gomx, "in", OMX_VFPC_INPUT_PORT_START_INDEX);

    omx_base->in_port->omx_allocate = TRUE;
    omx_base->in_port->share_buffer = FALSE;
    omx_base->in_port->always_copy  = FALSE;
	omx_base->in_port->port_index = OMX_VFPC_INPUT_PORT_START_INDEX;

	for (i=0; i<NUM_OUTPUTS; i++) {
    	g_omx_port_free (omx_base->out_port[i]);
		sprintf(srcname, "out_%02x", i);
    	omx_base->out_port[i] = g_omx_core_get_port (omx_base->gomx, srcname, 
		   OMX_VFPC_OUTPUT_PORT_START_INDEX + i);
		omx_base->out_port[i]->port_index = OMX_VFPC_OUTPUT_PORT_START_INDEX + i;
		omx_base->out_port[i]->omx_allocate = TRUE;
		omx_base->out_port[i]->share_buffer = FALSE;
		omx_base->out_port[i]->always_copy = FALSE;
	}
}
void
g_omx_core_finish (GOmxCore *core)
{
    change_state (core, OMX_StateIdle);

    wait_for_state (core, OMX_StateIdle);

    change_state (core, OMX_StateLoaded);

    {
        guint index;
        guint i;

        for (index = 0; index < core->ports->len; index++)
        {
            GOmxPort *port;

            port = g_omx_core_get_port (core, index);

            for (i = 0; i < port->num_buffers; i++)
            {
                OMX_BUFFERHEADERTYPE *omx_buffer;

                omx_buffer = port->buffers[i];

                g_free (omx_buffer->pBuffer);

                OMX_FreeBuffer (core->omx_handle, index, omx_buffer);
            }
        }
    }

    wait_for_state (core, OMX_StateLoaded);

    {
        gint index;
        for (index = 0; index < core->ports->len; index++)
        {
            GOmxPort *port;
            port = g_omx_core_get_port (core, index);
            g_omx_port_free (port);
        }
        g_ptr_array_clear (core->ports);
    }
}
static OMX_ERRORTYPE
FillBufferDone (OMX_HANDLETYPE omx_handle,
                OMX_PTR app_data,
                OMX_BUFFERHEADERTYPE *omx_buffer)
{
    GOmxCore *core;
    GOmxPort *port;

    core = (GOmxCore *) app_data;
    port = g_omx_core_get_port (core, omx_buffer->nOutputPortIndex);

    got_buffer (core, port, omx_buffer);

    return OMX_ErrorNone;
}
static void
type_instance_init (GTypeInstance *instance,
                    gpointer g_class)
{
    GstOmxBaseSrc *self;
    GstOmxBaseSrcClass *klass;

    self = GST_OMX_BASE_SRC (instance);
    klass = GST_OMX_BASE_SRC_CLASS (g_class);

    GST_LOG_OBJECT (self, "begin");

    /* GOmx */
    self->gomx = g_omx_core_new (self, g_class);
    self->gomx->use_timestamps = FALSE;
    self->out_port = g_omx_core_get_port (self->gomx, "out", klass->out_port_index);
    self->out_port->buffer_alloc = buffer_alloc;

    GST_LOG_OBJECT (self, "end");
}
GOmxPort *
g_omx_core_setup_port (GOmxCore *core,
                       OMX_PARAM_PORTDEFINITIONTYPE *omx_port)
{
    GOmxPort *port;
    guint index;

    index = omx_port->nPortIndex;
    port = g_omx_core_get_port (core, index);

    if (!port)
    {
        port = g_omx_port_new (core);
    }

    g_omx_port_setup (port, omx_port);

    g_ptr_array_insert (core->ports, index, port);

    return port;
}
void
g_omx_core_prepare (GOmxCore *core)
{
    change_state (core, OMX_StateIdle);

    /* Allocate buffers. */
    {
        gint index;
        gint i;

        for (index = 0; index < core->ports->len; index++)
        {
            GOmxPort *port;

            port = g_omx_core_get_port (core, index);

            if (port)
            {
                for (i = 0; i < port->num_buffers; i++)
                {
                    gpointer buffer_data;
                    guint size;

                    size = port->buffer_size;
                    buffer_data = g_malloc (size);

                    OMX_UseBuffer (core->omx_handle,
                                   &port->buffers[i],
                                   index,
                                   NULL,
                                   size,
                                   buffer_data);
                }
            }
        }
    }

    wait_for_state (core, OMX_StateIdle);
}