Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Tree: f169978844
Fetching contributors…

Cannot retrieve contributors at this time

executable file 150 lines (116 sloc) 4.716 kB
/*
* Copyright (C) 2007-2009 Nokia Corporation.
*
* Modified by: David Soto <david.soto@ridgerun.com>
* Copyright (C) 2011 RidgeRun
* Author: Felipe Contreras <felipe.contreras@nokia.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation
* version 2.1 of the License.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
*/
#include "gstomx_h264dec.h"
#include "gstomx.h"
GSTOMX_BOILERPLATE (GstOmxH264Dec, gst_omx_h264dec, GstOmxBaseVideoDec, GST_OMX_BASE_VIDEODEC_TYPE);
static GstCaps *
generate_sink_template (void)
{
GstCaps *caps;
GstStructure *struc;
caps = gst_caps_new_empty ();
struc = gst_structure_new ("video/x-h264",
"width", GST_TYPE_INT_RANGE, 16, 4096,
"height", GST_TYPE_INT_RANGE, 16, 4096,
"framerate", GST_TYPE_FRACTION_RANGE, 0, 1, G_MAXINT, 1,
NULL);
gst_caps_append_structure (caps, struc);
return caps;
}
static void
type_base_init (gpointer g_class)
{
GstElementClass *element_class;
element_class = GST_ELEMENT_CLASS (g_class);
{
GstElementDetails details;
details.longname = "OpenMAX IL H.264/AVC video decoder";
details.klass = "Codec/Decoder/Video";
details.description = "Decodes video in H.264/AVC format with OpenMAX IL";
details.author = "Felipe Contreras";
gst_element_class_set_details (element_class, &details);
}
{
GstPadTemplate *template;
template = gst_pad_template_new ("sink", GST_PAD_SINK,
GST_PAD_ALWAYS,
generate_sink_template ());
gst_element_class_add_pad_template (element_class, template);
}
}
static void
type_class_init (gpointer g_class,
gpointer class_data)
{
}
static void
initialize_port (GstOmxBaseFilter *omx_base)
{
GstOmxBaseVideoDec *self;
GOmxCore *gomx;
OMX_PARAM_PORTDEFINITIONTYPE paramPort;
gint width, height;
GOmxPort *port;
self = GST_OMX_BASE_VIDEODEC (omx_base);
gomx = (GOmxCore *) omx_base->gomx;
GST_INFO_OBJECT (omx_base, "begin");
GST_DEBUG_OBJECT (self, "G_OMX_PORT_GET_DEFINITION (output)");
G_OMX_PORT_GET_DEFINITION (omx_base->out_port, &paramPort);
width = self->extendedParams.width;
height = self->extendedParams.height;
paramPort.nPortIndex = 1;
paramPort.nBufferCountActual = 20;//15;//output_buffer_count
paramPort.format.video.nFrameWidth = width;
paramPort.format.video.nFrameHeight = height;
paramPort.format.video.eCompressionFormat = OMX_VIDEO_CodingUnused;
paramPort.format.video.eColorFormat = OMX_COLOR_FormatYUV420SemiPlanar;
GST_DEBUG_OBJECT (self, "nFrameWidth = %ld, nFrameHeight = %ld, nBufferCountActual = %ld",
paramPort.format.video.nFrameWidth, paramPort.format.video.nFrameHeight,
paramPort.nBufferCountActual);
if(self->framerate_denom)
paramPort.format.video.xFramerate = (self->framerate_num/self->framerate_denom) << 16;
GST_DEBUG_OBJECT (self, "G_OMX_PORT_SET_DEFINITION (output)");
G_OMX_PORT_SET_DEFINITION (omx_base->out_port, &paramPort);
#if 0
port = g_omx_core_get_port (gomx, "input", 0);
GST_DEBUG_OBJECT(self, "SendCommand(PortEnable, %d)", port->port_index);
OMX_SendCommand (g_omx_core_get_handle (port->core),
OMX_CommandPortEnable, port->port_index, NULL);
g_sem_down (port->core->port_sem);
port = g_omx_core_get_port (gomx, "output", 1);
GST_DEBUG_OBJECT(self, "SendCommand(PortEnable, %d)", port->port_index);
OMX_SendCommand (g_omx_core_get_handle (port->core),
OMX_CommandPortEnable, port->port_index, NULL);
g_sem_down (port->core->port_sem);
#endif
GST_INFO_OBJECT (omx_base, "end");
}
static void
type_instance_init (GTypeInstance *instance,
gpointer g_class)
{
GstOmxBaseVideoDec *omx_base;
omx_base = GST_OMX_BASE_VIDEODEC (instance);
omx_base->compression_format = OMX_VIDEO_CodingAVC;
omx_base->initialize_port = initialize_port;
}
Jump to Line
Something went wrong with that request. Please try again.