static GstFlowReturn gst_goo_encjpeg_buffer_alloc (GstPad *pad, guint64 offset, guint size, GstCaps *caps, GstBuffer **buf) { GstGooEncJpeg* self = GST_GOO_ENCJPEG (gst_pad_get_parent (pad)); GstFlowReturn ret = GST_FLOW_OK; GST_DEBUG ("a buffer of %d bytes was requested with caps %" GST_PTR_FORMAT " and offset %llu", size, caps, offset); if (self->component->cur_state == OMX_StateLoaded) { gst_goo_encjpeg_setcaps (pad, caps); } OMX_BUFFERHEADERTYPE* omx_buffer; omx_buffer = goo_port_grab_buffer (self->inport); GstBuffer* gst_buffer = GST_BUFFER (gst_goo_buffer_new ()); gst_goo_buffer_set_data (gst_buffer, self->component, omx_buffer); gst_buffer_set_caps (gst_buffer, caps); *buf = gst_buffer; gst_object_unref (self); return ret; }
/** * gst_goo_filter_outport_buffer: * @port: A #GooPort instance * @buffer: An #OMX_BUFFERHEADERTYPE pointer * @data: A pointer to extra data * * This function is a generic callback for a libgoo's output port and push * a new GStreamer's buffer. * * This method can be reused in derived classes. **/ void gst_goo_filter_outport_buffer (GooPort* port, OMX_BUFFERHEADERTYPE* buffer, gpointer data) { g_return_if_fail (buffer->nFlags != OMX_BUFFERFLAG_DATACORRUPT); GST_DEBUG ("Enter"); g_assert (GOO_IS_PORT (port)); g_assert (buffer != NULL); g_assert (GOO_IS_COMPONENT (data)); GooComponent* component = GOO_COMPONENT (data); GstGooFilter* self = GST_GOO_FILTER (g_object_get_data (G_OBJECT (data), "gst")); g_assert (self != NULL); GstGooFilterPrivate* priv = GST_GOO_FILTER_GET_PRIVATE (self); GstBuffer* gst_buffer = gst_goo_buffer_new (); gst_goo_buffer_set_data (gst_buffer, component, buffer); priv->outcount++; #if 0 if (goo_port_is_tunneled (self->inport)) { GST_DEBUG_OBJECT (self, "sem up"); gst_goo_sem_up (self->dasfsrc_sem); } #endif /** FIXME GStreamer should not insert the header. OMX component should take * care of it. Remove this function upon resolution of DR OMAPS00140835 and * OMAPS00140836 **/ gst_buffer = gst_goo_filter_insert_header (self, gst_buffer, priv->outcount); gst_goo_filter_timestamp_buffer (self, gst_buffer, buffer); GST_BUFFER_OFFSET (gst_buffer) = priv->outcount; gst_buffer_set_caps (gst_buffer, GST_PAD_CAPS (self->srcpad)); gst_pad_push (self->srcpad, gst_buffer); if (buffer->nFlags == OMX_BUFFERFLAG_EOS || goo_port_is_eos (port) || gst_goo_filter_is_last_dasf_buffer (self, priv->outcount)) { GST_INFO ("EOS flag found in output buffer (%d)", buffer->nFilledLen); goo_component_set_done (self->component); } return; }
static GstFlowReturn process_output_buffer (GstGooEncArmAac* self, OMX_BUFFERHEADERTYPE* buffer) { GstBuffer* out = NULL; GstFlowReturn ret = GST_FLOW_ERROR; GST_DEBUG_OBJECT (self, "outcount = %d", self->outcount); #if 0 out = gst_goo_buffer_new (); gst_goo_buffer_set_data (out, self->component, buffer); #else out = gst_buffer_new_and_alloc (buffer->nFilledLen); memmove (GST_BUFFER_DATA (out), buffer->pBuffer, buffer->nFilledLen); goo_component_release_buffer (self->component, buffer); #endif if (out != NULL) { GST_BUFFER_DURATION (out) = self->duration; GST_BUFFER_OFFSET (out) = self->outcount++; GST_BUFFER_TIMESTAMP (out) = self->ts; if (self->ts != -1) { self->ts += self->duration; } gst_buffer_set_caps (out, GST_PAD_CAPS (self->srcpad)); GST_DEBUG_OBJECT (self, "pushing gst buffer"); ret = gst_pad_push (self->srcpad, out); } GST_DEBUG_OBJECT (self, ""); return ret; }
static GstFlowReturn gst_dasf_src_create (GstAudioSrc *audiosrc, guint64 offset, guint length, GstBuffer **buffer) { GstDasfSrc* self = GST_DASF_SRC (audiosrc); GstBaseAudioSrc *baseaudiosrc = GST_BASE_AUDIO_SRC (self); GstBuffer* gst_buffer = NULL; OMX_BUFFERHEADERTYPE* omx_buffer = NULL; GstDasfSrcPrivate* priv = GST_DASF_SRC_GET_PRIVATE (self); GstGooAudioFilter* me = self->peer_element; GST_DEBUG (""); if (me->component->cur_state != OMX_StateExecuting) { return GST_FLOW_UNEXPECTED; } GST_DEBUG ("goo stuff"); { omx_buffer = goo_port_grab_buffer (me->outport); if (gst_pad_alloc_buffer (GST_BASE_SRC_PAD (self), priv->outcount, omx_buffer->nFilledLen, GST_PAD_CAPS (GST_BASE_SRC_PAD (self)), &gst_buffer) == GST_FLOW_OK) { if (GST_IS_GOO_BUFFER (gst_buffer)) { memcpy (GST_BUFFER_DATA (gst_buffer), omx_buffer->pBuffer, omx_buffer->nFilledLen); goo_component_release_buffer (me->component, omx_buffer); } else { gst_buffer_unref (gst_buffer); gst_buffer = (GstBuffer*) gst_goo_buffer_new (); gst_goo_buffer_set_data (gst_buffer, me->component, omx_buffer); } } else { goto fail; } } GST_DEBUG ("gst stuff"); { GstClock* clock = NULL; GstClockTime timestamp, duration; clock = gst_element_get_clock (GST_ELEMENT (self)); timestamp = gst_clock_get_time (clock); timestamp -= gst_element_get_base_time (GST_ELEMENT (self)); gst_object_unref (clock); GST_BUFFER_TIMESTAMP (gst_buffer) = gst_util_uint64_scale_int (GST_SECOND, priv->outcount, 50); /* Set 20 millisecond duration */ duration = gst_util_uint64_scale_int (GST_SECOND, 1, 50); GST_BUFFER_DURATION (gst_buffer) = duration; GST_BUFFER_OFFSET (gst_buffer) = priv->outcount++; GST_BUFFER_OFFSET_END (gst_buffer) = priv->outcount; gst_buffer_set_caps (gst_buffer, GST_PAD_CAPS (GST_BASE_SRC_PAD (self))); } beach: *buffer = gst_buffer; return GST_FLOW_OK; fail: if (G_LIKELY (*buffer)) { gst_buffer_unref (*buffer); } return GST_FLOW_ERROR; }