static gboolean
pad_event (GstPad *pad,
           GstEvent *event)
{
    GstOmxBaseFilter *self;
    GOmxCore *gomx;
    GOmxPort *in_port;
    gboolean ret = TRUE;

    self = GST_OMX_BASE_FILTER (GST_OBJECT_PARENT (pad));
    gomx = self->gomx;
    in_port = self->in_port;

    GST_LOG_OBJECT (self, "begin");

    GST_INFO_OBJECT (self, "event: %s", GST_EVENT_TYPE_NAME (event));

    switch (GST_EVENT_TYPE (event))
    {
        case GST_EVENT_EOS:
            /* if we are init'ed, and there is a running loop; then
             * if we get a buffer to inform it of EOS, let it handle the rest
             * in any other case, we send EOS */
            if (self->ready && self->last_pad_push_return == GST_FLOW_OK)
            {
                /* send buffer with eos flag */
                /** @todo move to util */
                {
                    OMX_BUFFERHEADERTYPE *omx_buffer;

                    GST_LOG_OBJECT (self, "request buffer");
                    omx_buffer = g_omx_port_request_buffer (in_port);

                    if (G_LIKELY (omx_buffer))
                    {
                        omx_buffer->nFlags |= OMX_BUFFERFLAG_EOS;

                        GST_LOG_OBJECT (self, "release_buffer");
                        /* foo_buffer_untaint (omx_buffer); */
                        g_omx_port_release_buffer (in_port, omx_buffer);
                        /* loop handles EOS, eat it here */
                        gst_event_unref (event);
                        break;
                    }
                }
            }

            /* we tried, but it's up to us here */
            ret = gst_pad_push_event (self->srcpad, event);
            break;

        case GST_EVENT_FLUSH_START:
            gst_pad_push_event (self->srcpad, event);
            self->last_pad_push_return = GST_FLOW_WRONG_STATE;

            g_omx_core_flush_start (gomx);

            gst_pad_pause_task (self->srcpad);

            ret = TRUE;
            break;

        case GST_EVENT_FLUSH_STOP:
            gst_pad_push_event (self->srcpad, event);
            self->last_pad_push_return = GST_FLOW_OK;

            g_omx_core_flush_stop (gomx);

            if (self->ready)
                gst_pad_start_task (self->srcpad, output_loop, self->srcpad);

            ret = TRUE;
            break;

        case GST_EVENT_NEWSEGMENT:
            ret = gst_pad_push_event (self->srcpad, event);
            break;

        default:
            ret = gst_pad_push_event (self->srcpad, event);
            break;
    }

    GST_LOG_OBJECT (self, "end");

    return ret;
}
static gboolean
pad_event (GstPad *pad,
           GstEvent *event)
{
    GstOmxBaseFilter2 *self;
    GOmxCore *gomx;
    gboolean ret = TRUE;
	int i;

    self = GST_OMX_BASE_FILTER2 (GST_OBJECT_PARENT (pad));
    gomx = self->gomx;

    GST_INFO_OBJECT (self, "begin: event=%s", GST_EVENT_TYPE_NAME (event));

    switch (GST_EVENT_TYPE (event))
    {
        case GST_EVENT_EOS:
            printf ("Recieved EOS event, press <CTRL+C> to terminate pipeline.\n");
            /* if we are init'ed, and there is a running loop; then
             * if we get a buffer to inform it of EOS, let it handle the rest
             * in any other case, we send EOS */
            if (self->ready && self->last_pad_push_return == GST_FLOW_OK)
            {
                /***** FIXME: EZSDK OMX componet does not execute FBD callback for an 
                 ETB call when nFlags is set to OMX_BUFFERFLAG_EOS. Because of this 
                 we are not able to trigger EOS on srcpad task. For now disable sending this event
                 until we get OMX component fixed. */
                #if 0
                if (g_omx_port_send (self->in_port, event) >= 0)
                {
                    gst_event_unref (event);
                    break;
                }
                #endif
            }

            /* we tried, but it's up to us here */
			for (i = 0; i < NUM_OUTPUTS-1; i++) {
				gst_event_ref(event);
				ret &= gst_pad_push_event (self->srcpad[i], event);
			}
			ret &= gst_pad_push_event (self->srcpad[i], event);
            break;

        case GST_EVENT_FLUSH_START:
			for (i = 0; i < NUM_OUTPUTS-1; i++) {
				gst_event_ref(event);
				ret &= gst_pad_push_event (self->srcpad[i], event);
			}
			ret &= gst_pad_push_event (self->srcpad[i], event);
            self->last_pad_push_return = GST_FLOW_WRONG_STATE;

            g_omx_core_flush_start (gomx);

			for (i = 0; i < NUM_OUTPUTS; i++)
	            gst_pad_pause_task (self->srcpad[i]);

            ret = TRUE;
            break;

        case GST_EVENT_FLUSH_STOP:
			for (i = 0; i < NUM_OUTPUTS-1; i++) {
				gst_event_ref(event);
				ret &= gst_pad_push_event (self->srcpad[i], event);
			}
			ret &= gst_pad_push_event (self->srcpad[i], event);
            self->last_pad_push_return = GST_FLOW_OK;

            g_omx_core_flush_stop (gomx);

            if (self->ready)
				for (i = 0; i < NUM_OUTPUTS; i++)
                	gst_pad_start_task (self->srcpad[i], output_loop, self->srcpad[i]);

            ret = TRUE;
            break;

        case GST_EVENT_NEWSEGMENT:
			for (i = 0; i < NUM_OUTPUTS-1; i++) {
				self->last_buf_timestamp[i] = GST_CLOCK_TIME_NONE;
				gst_event_ref(event);
				ret &= gst_pad_push_event (self->srcpad[i], event);
			}
			self->last_buf_timestamp[i] = GST_CLOCK_TIME_NONE;
			ret &= gst_pad_push_event (self->srcpad[i], event);
            break;

        default:
			for (i = 0; i < NUM_OUTPUTS-1; i++) {
				gst_event_ref(event);
				ret &= gst_pad_push_event (self->srcpad[i], event);
			}
			ret &= gst_pad_push_event (self->srcpad[i], event);
            break;
    }

    GST_LOG_OBJECT (self, "end");

    return ret;
}
Beispiel #3
0
static gboolean
pad_event (GstPad *pad,
           GstEvent *event)
{
    GstOmxBaseFilter *self;
    GOmxCore *gomx;
    GOmxPort *in_port;
    GOmxPort *out_port;
    gboolean ret;

    self = GST_OMX_BASE_FILTER (GST_OBJECT_PARENT (pad));
    gomx = self->gomx;
    in_port = self->in_port;
    out_port = self->out_port;

    GST_LOG_OBJECT (self, "begin");

    GST_INFO_OBJECT (self, "event: %s", GST_EVENT_TYPE_NAME (event));

    switch (GST_EVENT_TYPE (event))
    {
        case GST_EVENT_EOS:
            if (self->initialized)
            {
                /* send buffer with eos flag */
                /** @todo move to util */
                {
                    OMX_BUFFERHEADERTYPE *omx_buffer;

                    GST_LOG_OBJECT (self, "request buffer");
                    omx_buffer = g_omx_port_request_buffer (in_port);

                    if (G_LIKELY (omx_buffer))
                    {
                        omx_buffer->nFlags |= OMX_BUFFERFLAG_EOS;

                        GST_LOG_OBJECT (self, "release_buffer");
                        /* foo_buffer_untaint (omx_buffer); */
                        g_omx_port_release_buffer (in_port, omx_buffer);
                    }
                    else
                    {
                        g_omx_core_set_done (gomx);
                    }
                }

                /* Wait for the output port to get the EOS. */
                g_omx_core_wait_for_done (gomx);
            }

            ret = gst_pad_push_event (self->srcpad, event);
            break;

        case GST_EVENT_FLUSH_START:
            gst_pad_push_event (self->srcpad, event);
            self->last_pad_push_return = GST_FLOW_WRONG_STATE;

            g_omx_core_flush_start (gomx);

            gst_pad_pause_task (self->srcpad);

            ret = TRUE;
            break;

        case GST_EVENT_FLUSH_STOP:
            gst_pad_push_event (self->srcpad, event);
            self->last_pad_push_return = GST_FLOW_OK;

            g_omx_core_flush_stop (gomx);

            gst_pad_start_task (self->srcpad, output_loop, self->srcpad);

            ret = TRUE;
            break;

        case GST_EVENT_NEWSEGMENT:
            ret = gst_pad_push_event (self->srcpad, event);
            break;

        default:
            ret = gst_pad_push_event (self->srcpad, event);
            break;
    }

    GST_LOG_OBJECT (self, "end");

    return ret;
}
static gboolean
pad_event (GstPad *pad,
           GstEvent *event)
{
    GstOmxBaseFilter21 *self;
    GOmxCore *gomx;
    gboolean ret = TRUE;
	int i;
    self = GST_OMX_BASE_FILTER21 (GST_OBJECT_PARENT (pad));
    gomx = self->gomx;

    GST_INFO_OBJECT (self, "begin: event=%s", GST_EVENT_TYPE_NAME (event));

    switch (GST_EVENT_TYPE (event))
    {
        case GST_EVENT_EOS:
            /* printf ("Recieved EOS event, press <CTRL+C> to terminate pipeline.\n"); */
	    g_mutex_lock (self->ready_lock);
            self->number_eos--;
            printf("EOS : %d\n",self->number_eos);
			g_mutex_unlock (self->ready_lock);
            if(self->number_eos == 0){
              ret = gst_pad_push_event (self->srcpad, event);
            } 
            else{
              gst_event_unref (event);
            }
            break;

        case GST_EVENT_FLUSH_START:
			gst_event_ref(event);
			ret &= gst_pad_push_event (self->srcpad, event);
            self->last_pad_push_return = GST_FLOW_WRONG_STATE;
            g_omx_core_flush_start (gomx);
	        gst_pad_pause_task (self->srcpad);
            ret = TRUE;
            break;

        case GST_EVENT_FLUSH_STOP:
			gst_event_ref(event);
			ret &= gst_pad_push_event (self->srcpad, event);
            self->last_pad_push_return = GST_FLOW_OK;

            g_omx_core_flush_stop (gomx);

            /*if (self->ready)
               	gst_pad_start_task (self->srcpad, output_loop, self->srcpad);*/

            ret = TRUE;
            break;

        case GST_EVENT_NEWSEGMENT:
			self->last_buf_timestamp = GST_CLOCK_TIME_NONE;
			gst_event_ref(event);
			ret &= gst_pad_push_event (self->srcpad, event);
            break;

        default:
			gst_event_ref(event);
			ret &= gst_pad_push_event (self->srcpad, event);
            break;
    }

    GST_LOG_OBJECT (self, "end");

    return ret;
}