static void omx_setup (GstOmxBaseFilter * omx_base) { GstOmxBaseVideoDec *self; GOmxCore *gomx; self = GST_OMX_BASE_VIDEODEC (omx_base); gomx = (GOmxCore *) omx_base->gomx; GST_INFO_OBJECT (omx_base, "begin"); { OMX_PARAM_PORTDEFINITIONTYPE param; G_OMX_INIT_PARAM (param); /* Input port configuration. */ { param.nPortIndex = omx_base->in_port->port_index; OMX_GetParameter (gomx->omx_handle, OMX_IndexParamPortDefinition, ¶m); param.format.video.eCompressionFormat = self->compression_format; OMX_SetParameter (gomx->omx_handle, OMX_IndexParamPortDefinition, ¶m); } } GST_INFO_OBJECT (omx_base, "end"); }
void g_omx_port_setup (GOmxPort *port) { GOmxPortType type = -1; OMX_PARAM_PORTDEFINITIONTYPE param; G_OMX_INIT_PARAM (param); param.nPortIndex = port->port_index; OMX_GetParameter (port->core->omx_handle, OMX_IndexParamPortDefinition, ¶m); switch (param.eDir) { case OMX_DirInput: type = GOMX_PORT_INPUT; break; case OMX_DirOutput: type = GOMX_PORT_OUTPUT; break; default: break; } port->type = type; /** @todo should it be nBufferCountMin? */ port->num_buffers = param.nBufferCountActual; port->buffer_size = param.nBufferSize; GST_DEBUG_OBJECT (port->core->object, "type=%d, num_buffers=%d, buffer_size=%ld, port_index=%d", port->type, port->num_buffers, port->buffer_size, port->port_index); g_free (port->buffers); port->buffers = g_new0 (OMX_BUFFERHEADERTYPE *, port->num_buffers); }
static void get_property (GObject * obj, guint prop_id, GValue * value, GParamSpec * pspec) { GstOmxBaseSink *self; self = GST_OMX_BASE_SINK (obj); if (gstomx_get_property_helper (self->gomx, prop_id, value)) return; switch (prop_id) { case ARG_NUM_INPUT_BUFFERS: { OMX_PARAM_PORTDEFINITIONTYPE param; OMX_HANDLETYPE omx_handle = self->gomx->omx_handle; if (G_UNLIKELY (!omx_handle)) { GST_WARNING_OBJECT (self, "no component"); g_value_set_uint (value, 0); break; } G_OMX_INIT_PARAM (param); param.nPortIndex = self->in_port->port_index; OMX_GetParameter (omx_handle, OMX_IndexParamPortDefinition, ¶m); g_value_set_uint (value, param.nBufferCountActual); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); break; } }
static void settings_changed_cb (GOmxCore * core) { GstOmxBaseFilter *omx_base; guint channels; omx_base = core->object; GST_DEBUG_OBJECT (omx_base, "settings changed"); { OMX_AUDIO_PARAM_AMRTYPE param; G_OMX_INIT_PARAM (param); param.nPortIndex = omx_base->out_port->port_index; OMX_GetParameter (omx_base->gomx->omx_handle, OMX_IndexParamAudioAmr, ¶m); channels = param.nChannels; } { GstCaps *new_caps; new_caps = gst_caps_new_simple ("audio/AMR-WB", "channels", G_TYPE_INT, channels, "rate", G_TYPE_INT, 16000, NULL); GST_INFO_OBJECT (omx_base, "caps are: %" GST_PTR_FORMAT, new_caps); gst_pad_set_caps (omx_base->srcpad, new_caps); } }
static gboolean sink_setcaps (GstPad * pad, GstCaps * caps) { GstStructure *structure; GstOmxBaseFilter *omx_base; OMX_AUDIO_PARAM_AACPROFILETYPE param; gint channels = 0; gint sample_rate = 0; gint mpegversion = 0; const gchar *stream_format; G_OMX_INIT_PARAM (param); omx_base = GST_OMX_BASE_FILTER (GST_PAD_PARENT (pad)); GST_INFO_OBJECT (omx_base, "setcaps (sink): %" GST_PTR_FORMAT, caps); structure = gst_caps_get_structure (caps, 0); { const GValue *codec_data; GstBuffer *buffer; codec_data = gst_structure_get_value (structure, "codec_data"); if (codec_data) { buffer = gst_value_get_buffer (codec_data); omx_base->codec_data = buffer; gst_buffer_ref (buffer); } } gst_structure_get_int(structure, "mpegversion", &mpegversion); gst_structure_get_int(structure, "channels", &channels); gst_structure_get_int(structure, "rate", &sample_rate); stream_format = gst_structure_get_string(structure, "stream-format"); /* retrieve current in port params */ param.nPortIndex = omx_base->in_port->port_index; OMX_GetParameter (omx_base->gomx->omx_handle, OMX_IndexParamAudioAac, ¶m); if(channels > 0) param.nChannels = (OMX_U32)channels; if(sample_rate > 0) param.nSampleRate = (OMX_U32)sample_rate; if(!g_strcmp0(stream_format, "adif")) { param.eAACStreamFormat = OMX_AUDIO_AACStreamFormatADIF; } else if(!g_strcmp0(stream_format, "raw")) { param.eAACStreamFormat = OMX_AUDIO_AACStreamFormatRAW; } else if(!g_strcmp0(stream_format, "adts")) { if(mpegversion == 2) param.eAACStreamFormat = OMX_AUDIO_AACStreamFormatMP2ADTS; else if(mpegversion == 4) param.eAACStreamFormat = OMX_AUDIO_AACStreamFormatMP4ADTS; } OMX_SetParameter(omx_base->gomx->omx_handle, OMX_IndexParamAudioAac, ¶m); return gst_pad_set_caps (pad, caps); }
static void set_property (GObject *obj, guint prop_id, const GValue *value, GParamSpec *pspec) { GstOmxBaseFilter *self; self = GST_OMX_BASE_FILTER (obj); switch (prop_id) { case ARG_USE_TIMESTAMPS: self->use_timestamps = g_value_get_boolean (value); break; case ARG_NUM_INPUT_BUFFERS: case ARG_NUM_OUTPUT_BUFFERS: { OMX_PARAM_PORTDEFINITIONTYPE param; OMX_HANDLETYPE omx_handle = self->gomx->omx_handle; OMX_U32 nBufferCountActual; GOmxPort *port = (prop_id == ARG_NUM_INPUT_BUFFERS) ? self->in_port : self->out_port; if (G_UNLIKELY (!omx_handle)) { GST_WARNING_OBJECT (self, "no component"); break; } nBufferCountActual = g_value_get_uint (value); G_OMX_INIT_PARAM (param); param.nPortIndex = port->port_index; OMX_GetParameter (omx_handle, OMX_IndexParamPortDefinition, ¶m); if (nBufferCountActual < param.nBufferCountMin) { GST_ERROR_OBJECT (self, "buffer count %lu is less than minimum %lu", nBufferCountActual, param.nBufferCountMin); return; } param.nBufferCountActual = nBufferCountActual; OMX_SetParameter (omx_handle, OMX_IndexParamPortDefinition, ¶m); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); break; } }
static gboolean sink_setcaps (GstPad * pad, GstCaps * caps) { GstStructure *structure; GstOmxBaseFilter *omx_base; GOmxCore *gomx; gint rate = 0; omx_base = GST_OMX_BASE_FILTER (GST_PAD_PARENT (pad)); gomx = (GOmxCore *) omx_base->gomx; GST_INFO_OBJECT (omx_base, "setcaps (sink): %" GST_PTR_FORMAT, caps); structure = gst_caps_get_structure (caps, 0); gst_structure_get_int (structure, "rate", &rate); /* Input port configuration. */ { OMX_AUDIO_PARAM_PCMMODETYPE param; G_OMX_INIT_PARAM (param); param.nPortIndex = omx_base->out_port->port_index; OMX_GetParameter (gomx->omx_handle, OMX_IndexParamAudioPcm, ¶m); param.nSamplingRate = rate; OMX_SetParameter (gomx->omx_handle, OMX_IndexParamAudioPcm, ¶m); } /* set caps on the srcpad */ { GstCaps *tmp_caps; tmp_caps = gst_pad_get_allowed_caps (omx_base->srcpad); tmp_caps = gst_caps_make_writable (tmp_caps); gst_caps_truncate (tmp_caps); gst_pad_fixate_caps (omx_base->srcpad, tmp_caps); if (gst_caps_is_fixed (tmp_caps)) { GST_INFO_OBJECT (omx_base, "fixated to: %" GST_PTR_FORMAT, tmp_caps); gst_pad_set_caps (omx_base->srcpad, tmp_caps); } gst_caps_unref (tmp_caps); } return gst_pad_set_caps (pad, caps); }
void g_omx_core_init (GOmxCore *core) { GST_DEBUG_OBJECT (core->object, "loading: %s %s (%s)", core->component_name, core->component_role ? core->component_role : "", core->library_name); core->imp = request_imp (core->library_name); if (!core->imp) return; core->omx_error = core->imp->sym_table.get_handle (&core->omx_handle, (char *) core->component_name, core, &callbacks); GST_DEBUG_OBJECT (core->object, "OMX_GetHandle(&%p) -> %d", core->omx_handle, core->omx_error); if (!core->omx_error) { core->omx_state = OMX_StateLoaded; if (core->component_role) { OMX_PARAM_COMPONENTROLETYPE param; GST_DEBUG_OBJECT (core->object, "setting component role: %s", core->component_role); G_OMX_INIT_PARAM (param); strncpy ((char *) param.cRole, core->component_role, OMX_MAX_STRINGNAME_SIZE); OMX_SetParameter (core->omx_handle, OMX_IndexParamStandardComponentRole, ¶m); } } }
static gboolean sink_setcaps (GstPad * pad, GstCaps * caps) { GstStructure *structure; GstOmxBaseFilter *omx_base; GOmxCore *gomx; gint rate = 0; gint channels = 0; omx_base = GST_OMX_BASE_FILTER (GST_PAD_PARENT (pad)); gomx = (GOmxCore *) omx_base->gomx; GST_INFO_OBJECT (omx_base, "setcaps (sink): %" GST_PTR_FORMAT, caps); g_return_val_if_fail (gst_caps_get_size (caps) == 1, FALSE); structure = gst_caps_get_structure (caps, 0); gst_structure_get_int (structure, "rate", &rate); gst_structure_get_int (structure, "channels", &channels); /* Input port configuration. */ { OMX_AUDIO_PARAM_PCMMODETYPE param; G_OMX_INIT_PARAM (param); param.nPortIndex = omx_base->in_port->port_index; OMX_GetParameter (gomx->omx_handle, OMX_IndexParamAudioPcm, ¶m); param.nSamplingRate = rate; param.nChannels = channels; OMX_SetParameter (gomx->omx_handle, OMX_IndexParamAudioPcm, ¶m); } return gst_pad_set_caps (pad, caps); }
static gboolean sink_setcaps (GstPad * pad, GstCaps * caps) { GstStructure *structure; GstOmxBaseVideoDec *self; GstOmxBaseFilter *omx_base; GOmxCore *gomx; OMX_PARAM_PORTDEFINITIONTYPE param; gint width = 0; gint height = 0; self = GST_OMX_BASE_VIDEODEC (GST_PAD_PARENT (pad)); omx_base = GST_OMX_BASE_FILTER (self); gomx = (GOmxCore *) omx_base->gomx; GST_INFO_OBJECT (self, "setcaps (sink): %" GST_PTR_FORMAT, caps); g_return_val_if_fail (gst_caps_get_size (caps) == 1, FALSE); structure = gst_caps_get_structure (caps, 0); gst_structure_get_int (structure, "width", &width); gst_structure_get_int (structure, "height", &height); { const GValue *framerate = NULL; framerate = gst_structure_get_value (structure, "framerate"); if (framerate) { self->framerate_num = gst_value_get_fraction_numerator (framerate); self->framerate_denom = gst_value_get_fraction_denominator (framerate); } } G_OMX_INIT_PARAM (param); { const GValue *codec_data; GstBuffer *buffer; codec_data = gst_structure_get_value (structure, "codec_data"); if (codec_data) { buffer = gst_value_get_buffer (codec_data); omx_base->codec_data = buffer; gst_buffer_ref (buffer); } } /* Input port configuration. */ { param.nPortIndex = omx_base->in_port->port_index; OMX_GetParameter (gomx->omx_handle, OMX_IndexParamPortDefinition, ¶m); param.format.video.nFrameWidth = width; param.format.video.nFrameHeight = height; OMX_SetParameter (gomx->omx_handle, OMX_IndexParamPortDefinition, ¶m); } return gst_pad_set_caps (pad, caps); }
static void settings_changed_cb (GOmxCore * core) { GstOmxBaseFilter *omx_base; GstOmxBaseVideoDec *self; guint width; guint height; guint32 format = 0; omx_base = core->object; self = GST_OMX_BASE_VIDEODEC (omx_base); GST_DEBUG_OBJECT (omx_base, "settings changed"); { OMX_PARAM_PORTDEFINITIONTYPE param; G_OMX_INIT_PARAM (param); param.nPortIndex = omx_base->out_port->port_index; OMX_GetParameter (omx_base->gomx->omx_handle, OMX_IndexParamPortDefinition, ¶m); width = param.format.video.nFrameWidth; height = param.format.video.nFrameHeight; switch ((guint)param.format.video.eColorFormat) { case OMX_COLOR_FormatYUV420Planar: case OMX_COLOR_FormatYUV420PackedPlanar: format = GST_MAKE_FOURCC ('I', '4', '2', '0'); break; case OMX_COLOR_FormatYCbYCr: format = GST_MAKE_FOURCC ('Y', 'U', 'Y', '2'); break; case OMX_COLOR_FormatCbYCrY: format = GST_MAKE_FOURCC ('U', 'Y', 'V', 'Y'); break; /* MODIFICATION: Add extended_color_format */ case OMX_EXT_COLOR_FormatNV12TPhysicalAddress: format = GST_MAKE_FOURCC ('S', 'T', '1', '2'); break; case OMX_EXT_COLOR_FormatNV12LPhysicalAddress: format = GST_MAKE_FOURCC ('S', 'N', '1', '2'); break; case OMX_COLOR_FormatYUV420SemiPlanar: format = GST_MAKE_FOURCC ('N', 'V', '1', '2'); break; default: break; } } { GstCaps *new_caps; GstStructure *struc; new_caps = gst_caps_new_empty (); struc = gst_structure_new ("video/x-raw-yuv", "width", G_TYPE_INT, width, "height", G_TYPE_INT, height, "format", GST_TYPE_FOURCC, format, NULL); if (self->framerate_denom != 0) gst_structure_set (struc, "framerate", GST_TYPE_FRACTION, self->framerate_num, self->framerate_denom, NULL); else /* FIXME this is a workaround for xvimagesink */ gst_structure_set (struc, "framerate", GST_TYPE_FRACTION, 0, 1, NULL); gst_caps_append_structure (new_caps, struc); GST_INFO_OBJECT (omx_base, "caps are: %" GST_PTR_FORMAT, new_caps); gst_pad_set_caps (omx_base->srcpad, new_caps); gst_caps_unref (new_caps); /* Modification: unref caps */ } }
/* h264 dec has its own sink_setcaps for supporting nalu convert codec data */ static gboolean sink_setcaps (GstPad * pad, GstCaps * caps) { GstStructure *structure; GstOmxBaseVideoDec *self; GstOmxH264Dec *h264_self; GstOmxBaseFilter *omx_base; GOmxCore *gomx; OMX_PARAM_PORTDEFINITIONTYPE param; gint width = 0; gint height = 0; self = GST_OMX_BASE_VIDEODEC (GST_PAD_PARENT (pad)); h264_self = GST_OMX_H264DEC (GST_PAD_PARENT (pad)); omx_base = GST_OMX_BASE_FILTER (self); gomx = (GOmxCore *) omx_base->gomx; GST_INFO_OBJECT (self, "setcaps (sink)(h264): %" GST_PTR_FORMAT, caps); g_return_val_if_fail (gst_caps_get_size (caps) == 1, FALSE); structure = gst_caps_get_structure (caps, 0); gst_structure_get_int (structure, "width", &width); gst_structure_get_int (structure, "height", &height); { const GValue *framerate = NULL; framerate = gst_structure_get_value (structure, "framerate"); if (framerate) { self->framerate_num = gst_value_get_fraction_numerator (framerate); self->framerate_denom = gst_value_get_fraction_denominator (framerate); } } G_OMX_INIT_PARAM (param); { const GValue *codec_data; GstBuffer *buffer; gboolean ret = FALSE; guint8 *buf_data = NULL; codec_data = gst_structure_get_value (structure, "codec_data"); if (codec_data) { buffer = gst_value_get_buffer (codec_data); buf_data = GST_BUFFER_DATA(buffer); if (GST_BUFFER_SIZE(buffer) < 4) GST_ERROR("codec data size is less than 4!!"); //check this. if ((buf_data[0] == 0x00)&&(buf_data[1] == 0x00)&& ((buf_data[2] == 0x01)||((buf_data[2] == 0x00)&&(buf_data[3] == 0x01)))) { h264_self->h264Format = GSTOMX_H264_FORMAT_NALU; GST_INFO_OBJECT(self, "H264 format is NALU"); } else { h264_self->h264Format = GSTOMX_H264_FORMAT_3GPP; GST_INFO_OBJECT(self, "H264 format is 3GPP"); } /* if codec data is 3gpp format, convert nalu format */ if(h264_self->h264Format == GSTOMX_H264_FORMAT_3GPP) { GstBuffer *nalu_dci = NULL; ret = convert_dci(h264_self, buffer, &nalu_dci); if (ret) { omx_base->codec_data = nalu_dci; } else { if (nalu_dci) { gst_buffer_unref (nalu_dci); } GST_ERROR_OBJECT(h264_self, "converting dci error."); omx_base->codec_data = buffer; gst_buffer_ref (buffer); } } else { /* not 3GPP format */ omx_base->codec_data = buffer; gst_buffer_ref (buffer); } h264_self->h264Format = GSTOMX_H264_FORMAT_UNKNOWN; } } /* Input port configuration. */ { param.nPortIndex = omx_base->in_port->port_index; OMX_GetParameter (gomx->omx_handle, OMX_IndexParamPortDefinition, ¶m); param.format.video.nFrameWidth = width; param.format.video.nFrameHeight = height; OMX_SetParameter (gomx->omx_handle, OMX_IndexParamPortDefinition, ¶m); } return gst_pad_set_caps (pad, caps); }