void g_omx_core_wait_for_done (GOmxCore *core) { GST_DEBUG_OBJECT (core->object, "begin"); g_sem_down (core->done_sem); GST_DEBUG_OBJECT (core->object, "end"); }
void g_omx_port_disable (GOmxPort *port) { GOmxCore *core; core = port->core; OMX_SendCommand (core->omx_handle, OMX_CommandPortDisable, port->port_index, NULL); g_omx_port_pause (port); g_omx_port_flush (port); port_free_buffers (port); g_sem_down (core->port_sem); }
void g_omx_port_enable (GOmxPort *port) { GOmxCore *core; core = port->core; OMX_SendCommand (core->omx_handle, OMX_CommandPortEnable, port->port_index, NULL); port_allocate_buffers (port); if (core->omx_state != OMX_StateLoaded) port_start_buffers (port); g_omx_port_resume (port); g_sem_down (core->port_sem); }
static void omx_setup (GstOmxBaseFilter2 *omx_base) { GstOmxBaseVfpc2 *self; GOmxCore *gomx; GOmxPort *port; int i; self = GST_OMX_BASE_VFPC2 (omx_base); gomx = (GOmxCore *) omx_base->gomx; GST_INFO_OBJECT (omx_base, "begin"); if (self->omx_setup) { self->omx_setup (omx_base); } /* enable input port */ port = omx_base->in_port; OMX_SendCommand (g_omx_core_get_handle (port->core), OMX_CommandPortEnable, port->port_index, NULL); g_sem_down (port->core->port_sem); for (i=0; i<NUM_OUTPUTS; i++) { /* enable output port */ port = omx_base->out_port[i]; OMX_SendCommand (g_omx_core_get_handle (port->core), OMX_CommandPortEnable, port->port_index, NULL); g_sem_down (port->core->port_sem); } /* indicate that port is now configured */ self->port_configured = TRUE; GST_INFO_OBJECT (omx_base, "end"); }
static gboolean handle_event (GstBaseSink *gst_base, GstEvent *event) { GstOmxBaseSink *self; GOmxCore *gomx; GOmxPort *in_port; self = GST_OMX_BASE_SINK (gst_base); gomx = self->gomx; in_port = self->in_port; GST_LOG_OBJECT (self, "begin"); GST_DEBUG_OBJECT (self, "event: %s", GST_EVENT_TYPE_NAME (event)); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_EOS: /* Close the inpurt port. */ g_omx_core_set_done (gomx); break; case GST_EVENT_FLUSH_START: /* unlock loops */ g_omx_port_pause (in_port); /* flush all buffers */ OMX_SendCommand (gomx->omx_handle, OMX_CommandFlush, OMX_ALL, NULL); break; case GST_EVENT_FLUSH_STOP: g_sem_down (gomx->flush_sem); g_omx_port_resume (in_port); break; default: break; } GST_LOG_OBJECT (self, "end"); return TRUE; }
void g_omx_port_flush (GOmxPort *port) { if (port->type == GOMX_PORT_OUTPUT) { OMX_BUFFERHEADERTYPE *omx_buffer; while ((omx_buffer = async_queue_pop_forced (port->queue))) { omx_buffer->nFilledLen = 0; g_omx_port_release_buffer (port, omx_buffer); } } else { OMX_SendCommand (port->core->omx_handle, OMX_CommandFlush, port->port_index, NULL); g_sem_down (port->core->flush_sem); } }
void g_omx_core_wait_for_done (GOmxCore *core) { g_sem_down (core->done_sem); }
static GstFlowReturn pad_chain (GstPad *pad, GstBuffer *buf) { GOmxCore *gomx; GOmxPort *in_port; GstOmxBaseFilter21 *self; GstFlowReturn ret = GST_FLOW_OK; int i; static sink_init = 0; int sink_number; static gboolean init_done = FALSE; self = GST_OMX_BASE_FILTER21 (GST_OBJECT_PARENT (pad)); if(strcmp(GST_PAD_NAME(pad), "sink_00") == 0){ sink_number=0; self->sink_camera_timestamp = GST_BUFFER_TIMESTAMP(buf); } else if(strcmp(GST_PAD_NAME(pad), "sink_01") == 0){ sink_number=1; } PRINT_BUFFER (self, buf); gomx = self->gomx; GST_LOG_OBJECT (self, "begin: size=%u, state=%d, sink_number=%d", GST_BUFFER_SIZE (buf), gomx->omx_state, sink_number); /*if (G_LIKELY (gomx->omx_state != OMX_StateExecuting)) { GST_INFO_OBJECT (self, "Begin - Port %d", sink_number); //setup_input_buffer (self, buf, sink_number); //sink_init++; //g_mutex_lock (self->ready_lock); if(init_done == TRUE){ GST_INFO_OBJECT (self, "Init_done"); //g_mutex_unlock(self->ready_lock); } if(init_done == TRUE){ sink_init = 0; init_done = FALSE; } else{ while(sink_init != 2){ usleep(1000); } } }*/ if (G_UNLIKELY (gomx->omx_state == OMX_StateLoaded)) { GST_INFO_OBJECT (self, "omx: prepare"); /** @todo this should probably go after doing preparations. */ if (self->omx_setup) { self->omx_setup (self); } /* enable input port */ for(i=0;i<NUM_INPUTS;i++){ GST_INFO_OBJECT (self,"Enable Port %d",self->in_port[i]->port_index); OMX_SendCommand (gomx->omx_handle, OMX_CommandPortEnable, self->in_port[i]->port_index, NULL); g_sem_down (self->in_port[i]->core->port_sem); } GST_INFO_OBJECT (self,"Enable Port %d",self->out_port->port_index); /* enable output port */ OMX_SendCommand (gomx->omx_handle,OMX_CommandPortEnable, self->out_port->port_index, NULL); g_sem_down (self->out_port->core->port_sem); /* indicate that port is now configured */ setup_ports (self); g_omx_core_prepare (self->gomx); if (gomx->omx_state == OMX_StateIdle) { self->ready = TRUE; //gst_pad_start_task (self->srcpad, output_loop, self->srcpad); } if (gomx->omx_state != OMX_StateIdle) goto out_flushing; GST_INFO_OBJECT (self, "omx: end state Loaded"); } if (G_UNLIKELY (gomx->omx_state == OMX_StateIdle)) { g_omx_core_start (gomx); GST_INFO_OBJECT (self, "Release Port - %d", sink_number); init_done = TRUE; //g_mutex_unlock (self->ready_lock); if (gomx->omx_state != OMX_StateExecuting){ GST_INFO_OBJECT (self, "omx: executing FAILED !"); goto out_flushing; } } if (G_LIKELY (self->in_port[sink_number]->enabled)) { if (G_UNLIKELY (gomx->omx_state != OMX_StateExecuting)) { GST_ERROR_OBJECT (self, "Whoa! very wrong"); } while (TRUE) { gint sent; if (self->last_pad_push_return != GST_FLOW_OK || !(gomx->omx_state == OMX_StateExecuting || gomx->omx_state == OMX_StatePause)) { GST_INFO_OBJECT (self, "last_pad_push_return=%d", self->last_pad_push_return); goto out_flushing; } sent = g_omx_port_send (self->in_port[sink_number], buf); if (G_UNLIKELY (sent < 0)) { ret = GST_FLOW_WRONG_STATE; goto out_flushing; } else if (sent < GST_BUFFER_SIZE (buf)) { GstBuffer *subbuf = gst_buffer_create_sub (buf, sent, GST_BUFFER_SIZE (buf) - sent); gst_buffer_unref (buf); buf = subbuf; } else { gst_buffer_unref (buf); break; } } } else { GST_WARNING_OBJECT (self, "done"); ret = GST_FLOW_UNEXPECTED; } return ret; leave: GST_LOG_OBJECT (self, "end"); return ret; /* special conditions */ out_flushing: { const gchar *error_msg = NULL; if (gomx->omx_error) { error_msg = "Error from OpenMAX component"; } else if (gomx->omx_state != OMX_StateExecuting && gomx->omx_state != OMX_StatePause) { error_msg = "OpenMAX component in wrong state"; } if (error_msg) { GST_ELEMENT_ERROR (self, STREAM, FAILED, (NULL), (error_msg)); ret = GST_FLOW_ERROR; } gst_buffer_unref (buf); goto leave; } }
static void omx_setup (GstOmxBaseFilter *omx_base) { GstOmxBaseVideoEnc *self; GOmxCore *gomx; self = GST_OMX_BASE_VIDEOENC (omx_base); gomx = (GOmxCore *) omx_base->gomx; GST_INFO_OBJECT (omx_base, "begin"); { OMX_PARAM_PORTDEFINITIONTYPE param; /* Output port configuration. */ G_OMX_PORT_GET_DEFINITION (omx_base->out_port, ¶m); param.format.video.eCompressionFormat = self->compression_format; /** @todo this should be set with a property */ param.format.video.nBitrate = self->bitrate; G_OMX_PORT_SET_DEFINITION (omx_base->out_port, ¶m); /* some workarounds required for TI components. */ { guint32 fourcc; gint width, height; gulong framerate; /* the component should do this instead */ { G_OMX_PORT_GET_DEFINITION (omx_base->in_port, ¶m); width = param.format.video.nFrameWidth; height = param.format.video.nFrameHeight; framerate = param.format.video.xFramerate; /* this is against the standard; nBufferSize is read-only. */ fourcc = GST_MAKE_FOURCC ('N', 'V', '1', '2'); param.nBufferSize = gst_video_format_get_size_strided ( gst_video_format_from_fourcc (fourcc), width, height, param.format.video.nStride); G_OMX_PORT_SET_DEFINITION (omx_base->in_port, ¶m); } /* the component should do this instead */ { G_OMX_PORT_GET_DEFINITION (omx_base->out_port, ¶m); /* this is against the standard; nBufferSize is read-only. */ param.nBufferSize = width * height; param.format.video.nFrameWidth = width; param.format.video.nFrameHeight = height; param.format.video.xFramerate = framerate; G_OMX_PORT_SET_DEFINITION (omx_base->out_port, ¶m); } /* the component should do this instead */ { GOmxPort *port; /* enable input port */ port = omx_base->in_port; OMX_SendCommand (g_omx_core_get_handle (port->core), OMX_CommandPortEnable, port->port_index, NULL); g_sem_down (port->core->port_sem); /* enable output port */ port = omx_base->out_port; OMX_SendCommand (g_omx_core_get_handle (port->core), OMX_CommandPortEnable, port->port_index, NULL); g_sem_down (port->core->port_sem); } } } if (self->omx_setup) self->omx_setup (GST_OMX_BASE_FILTER (self)); GST_INFO_OBJECT (omx_base, "end"); }