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; }
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; }