diff mbox

crystalhd gst: Port to GStreamer 1.0 API

Message ID 20130311084022.GA11408@bogon.sigxcpu.org (mailing list archive)
State New, archived
Headers show

Commit Message

Guido Günther March 11, 2013, 8:40 a.m. UTC
---
Tested with totem as well as gst-launch. Any chance this can be applied
to http://git.linuxtv.org/jarod/crystalhd.git?
Cheers,
 -- Guido

 filters/gst/gst-plugin/configure.ac    |    8 +-
 filters/gst/gst-plugin/src/gstbcmdec.c |  431 ++++++++++++++++----------------
 filters/gst/gst-plugin/src/gstbcmdec.h |   68 ++---
 3 files changed, 248 insertions(+), 259 deletions(-)

Comments

Guido Günther April 1, 2013, 11:26 a.m. UTC | #1
Hi,
On Mon, Mar 11, 2013 at 09:40:22AM +0100, Guido Günther wrote:
> ---
> Tested with totem as well as gst-launch. Any chance this can be applied
> to http://git.linuxtv.org/jarod/crystalhd.git?

Any chance this gets applied.

> Cheers,
>  -- Guido
> 
>  filters/gst/gst-plugin/configure.ac    |    8 +-
>  filters/gst/gst-plugin/src/gstbcmdec.c |  431 ++++++++++++++++----------------
>  filters/gst/gst-plugin/src/gstbcmdec.h |   68 ++---
>  3 files changed, 248 insertions(+), 259 deletions(-)
> 
> diff --git a/filters/gst/gst-plugin/configure.ac b/filters/gst/gst-plugin/configure.ac
> index 99b3713..a3c6467 100644
> --- a/filters/gst/gst-plugin/configure.ac
> +++ b/filters/gst/gst-plugin/configure.ac
> @@ -1,9 +1,9 @@
>  AC_INIT
>  
>  dnl versions of gstreamer and plugins-base
> -GST_MAJORMINOR=0.10
> -GST_REQUIRED=0.10.0
> -GSTPB_REQUIRED=0.10.0
> +GST_MAJORMINOR=1.0
> +GST_REQUIRED=1.0
> +GSTPB_REQUIRED=1.0
>  
>  dnl fill in your package name and version here
>  dnl the fourth (nano) number should be 0 for a release, 1 for CVS,
> @@ -56,7 +56,7 @@ dnl And we can also ask for the right version of gstreamer
>  
>  PKG_CHECK_MODULES(GST, \
>    gstreamer-$GST_MAJORMINOR >= $GST_REQUIRED
> -  gstreamer-video-0.10,
> +  gstreamer-video-1.0,
>    HAVE_GST=yes,HAVE_GST=no)
>  
>  dnl Give error and exit if we don't have gstreamer
> diff --git a/filters/gst/gst-plugin/src/gstbcmdec.c b/filters/gst/gst-plugin/src/gstbcmdec.c
> index ed01c14..a51bd59 100644
> --- a/filters/gst/gst-plugin/src/gstbcmdec.c
> +++ b/filters/gst/gst-plugin/src/gstbcmdec.c
> @@ -8,6 +8,7 @@
>   *  AU
>   *
>   *  HISTORY:
> + *     Updated for 1.0 by Guido Guenther <agx@sigxcpu.org>
>   *
>   *******************************************************************
>   *
> @@ -40,6 +41,7 @@
>  #include <glib.h>
>  #include <gst/base/gstadapter.h>
>  #include <gst/video/video.h>
> +#include <gst/video/gstvideopool.h>
>  
>  #ifdef HAVE_CONFIG_H
>  #include <config.h>
> @@ -51,8 +53,8 @@
>  #include "parse.h"
>  #include "gstbcmdec.h"
>  
> -GST_DEBUG_CATEGORY_STATIC (gst_bcmdec_debug);
> -#define GST_CAT_DEFAULT gst_bcmdec_debug
> +GST_DEBUG_CATEGORY_STATIC (gst_bcm_dec_debug);
> +#define GST_CAT_DEFAULT gst_bcm_dec_debug
>  
>  //#define YV12__
>  
> @@ -64,16 +66,18 @@ static GstFlowReturn bcmdec_send_buff_detect_error(GstBcmDec *bcmdec, GstBuffer
>  						   guint8 flags)
>  {
>  	BC_STATUS sts = BC_STS_SUCCESS;
> +	GstMapInfo info;
>  
>  	GST_DEBUG_OBJECT(bcmdec, "Attempting to Send Buffer");
>  
>  	sts = decif_send_buffer(&bcmdec->decif, pbuffer, size, tCurrent, flags);
>  
>  	if (sts != BC_STS_SUCCESS) {
> +	        gst_buffer_map(buf, &info, GST_MAP_READ);
>  		GST_ERROR_OBJECT(bcmdec, "proc input failed sts = %d", sts);
>  		GST_ERROR_OBJECT(bcmdec, "Chain: timeStamp = %llu size = %d data = %p",
> -				 GST_BUFFER_TIMESTAMP(buf), GST_BUFFER_SIZE(buf),
> -				 GST_BUFFER_DATA (buf));
> +				 GST_BUFFER_DTS(buf), info.size, info.data);
> +		gst_buffer_unmap(buf, &info);
>  		return GST_FLOW_ERROR;
>  	}
>  
> @@ -92,7 +96,7 @@ enum {
>  };
>  
>  
> -GLB_INST_STS *g_inst_sts = NULL;
> +static GLB_INST_STS *g_inst_sts = NULL;
>  
>  /*
>   * the capabilities of the inputs and outputs.
> @@ -111,35 +115,29 @@ GstStaticPadTemplate sink_factory_bcm70012 = GST_STATIC_PAD_TEMPLATE("sink", GST
>  
>  #ifdef YV12__
>  static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE("src", GST_PAD_SRC, GST_PAD_ALWAYS,
> -		GST_STATIC_CAPS("video/x-raw-yuv, " "format = (fourcc) { YV12 }, " "width = (int) [ 1, MAX ], "
> +		GST_STATIC_CAPS("video/x-raw, " "format = (string) { YV12 }, " "width = (int) [ 1, MAX ], "
>  				"height = (int) [ 1, MAX ], " "framerate = (fraction) [ 0/1, 2147483647/1 ]"));
>  #define BUF_MULT (12 / 8)
>  #define BUF_MODE MODE420
>  #else
>  static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE("src", GST_PAD_SRC, GST_PAD_ALWAYS,
> -		GST_STATIC_CAPS("video/x-raw-yuv, " "format = (fourcc) { YUY2 } , " "framerate = (fraction) [0,MAX], "
> -				"width = (int) [1,MAX], " "height = (int) [1,MAX]; " "video/x-raw-yuv, "
> -				"format = (fourcc) { UYVY } , " "framerate = (fraction) [0,MAX], " "width = (int) [1,MAX], "
> +		GST_STATIC_CAPS("video/x-raw, " "format = (string) { YUY2 } , " "framerate = (fraction) [0,MAX], "
> +				"width = (int) [1,MAX], " "height = (int) [1,MAX]; " "video/x-raw, "
> +				"format = (string) { UYVY } , " "framerate = (fraction) [0,MAX], " "width = (int) [1,MAX], "
>  				"height = (int) [1,MAX]; "));
>  #define BUF_MULT (16 / 8)
>  #define BUF_MODE MODE422_YUY2
>  #endif
>  
> -GST_BOILERPLATE(GstBcmDec, gst_bcmdec, GstElement, GST_TYPE_ELEMENT);
> +G_DEFINE_TYPE(GstBcmDec, gst_bcm_dec, GST_TYPE_ELEMENT);
>  
>  /* GObject vmethod implementations */
>  
> -static void gst_bcmdec_base_init(gpointer gclass)
> +static void gst_bcm_dec_base_init(gpointer gclass)
>  {
> -	static GstElementDetails element_details;
>  	BC_HW_CAPS hwCaps;
>  
> -	GST_DEBUG_OBJECT(gclass, "gst_bcmdec_base_init");
> -
> -	element_details.klass = (gchar *)"Codec/Decoder/Video";
> -	element_details.longname = (gchar *)"Generic Video Decoder";
> -	element_details.description = (gchar *)"Decodes various Video Formats using CrystalHD Decoders";
> -	element_details.author = (gchar *)"Broadcom Corp.";
> +	GST_DEBUG_OBJECT(gclass, "gst_bcm_dec_base_init");
>  
>  	GstElementClass *element_class = GST_ELEMENT_CLASS(gclass);
>  
> @@ -153,11 +151,15 @@ static void gst_bcmdec_base_init(gpointer gclass)
>  	}
>  	else
>  		gst_element_class_add_pad_template(element_class, gst_static_pad_template_get (&sink_factory_bcm70012));
> -	gst_element_class_set_details(element_class, &element_details);
> +	gst_element_class_set_metadata(element_class,
> +				      "Codec/Decoder/Video",
> +				      "Generic Video Decoder",
> +				      "Decodes various Video Formats using CrystalHD Decoders",
> +				      "Broadcom Corp.");
>  }
>  
>  /* initialize the bcmdec's class */
> -static void gst_bcmdec_class_init(GstBcmDecClass *klass)
> +static void gst_bcm_dec_class_init(GstBcmDecClass *klass)
>  {
>  	GObjectClass *gobject_class;
>  	GstElementClass *gstelement_class;
> @@ -165,13 +167,15 @@ static void gst_bcmdec_class_init(GstBcmDecClass *klass)
>  	gobject_class = (GObjectClass *)klass;
>  	gstelement_class = (GstElementClass *)klass;
>  
> -	GST_DEBUG_OBJECT(klass, "gst_bcmdec_class_init");
> +	GST_DEBUG_OBJECT(klass, "gst_bcm_dec_class_init");
> +
> +	gst_bcm_dec_base_init(klass);
>  
> -	gstelement_class->change_state = gst_bcmdec_change_state;
> +	gstelement_class->change_state = gst_bcm_dec_change_state;
>  
> -	gobject_class->set_property = gst_bcmdec_set_property;
> -	gobject_class->get_property = gst_bcmdec_get_property;
> -	gobject_class->finalize     = gst_bcmdec_finalize;
> +	gobject_class->set_property = gst_bcm_dec_set_property;
> +	gobject_class->get_property = gst_bcm_dec_get_property;
> +	gobject_class->finalize     = gst_bcm_dec_finalize;
>  
>  	g_object_class_install_property(gobject_class, PROP_SILENT,
>  					g_param_spec_boolean("silent", "Silent",
> @@ -185,14 +189,14 @@ static void gst_bcmdec_class_init(GstBcmDecClass *klass)
>   * set pad calback functions
>   * initialize instance structure
>   */
> -static void gst_bcmdec_init(GstBcmDec *bcmdec, GstBcmDecClass *gclass)
> +static void gst_bcm_dec_init(GstBcmDec *bcmdec)
>  {
>  	pid_t pid;
>  	BC_STATUS sts = BC_STS_SUCCESS;
>  	int shmid = 0;
>  	BC_HW_CAPS hwCaps;
>  
> -	GST_DEBUG_OBJECT(bcmdec, "gst_bcmdec_init");
> +	GST_DEBUG_OBJECT(bcmdec, "gst_bcm_dec_init");
>  
>  	bcmdec_reset(bcmdec);
>  
> @@ -204,17 +208,16 @@ static void gst_bcmdec_init(GstBcmDec *bcmdec, GstBcmDecClass *gclass)
>  	else
>  		bcmdec->sinkpad = gst_pad_new_from_static_template(&sink_factory_bcm70012, "sink");
>  
> -	gst_pad_set_event_function(bcmdec->sinkpad, GST_DEBUG_FUNCPTR(gst_bcmdec_sink_event));
> +	gst_pad_set_event_function(bcmdec->sinkpad,
> +				   GST_DEBUG_FUNCPTR(gst_bcm_dec_sink_event));
>  
> -	gst_pad_set_setcaps_function(bcmdec->sinkpad, GST_DEBUG_FUNCPTR(gst_bcmdec_sink_set_caps));
> -	gst_pad_set_getcaps_function(bcmdec->sinkpad, GST_DEBUG_FUNCPTR(gst_bcmdec_getcaps));
> -	gst_pad_set_chain_function(bcmdec->sinkpad, GST_DEBUG_FUNCPTR(gst_bcmdec_chain));
> +	gst_pad_set_chain_function(bcmdec->sinkpad,
> +				   GST_DEBUG_FUNCPTR(gst_bcm_dec_chain));
>  
>  	bcmdec->srcpad = gst_pad_new_from_static_template (&src_factory, "src");
>  
> -	gst_pad_set_getcaps_function(bcmdec->srcpad, GST_DEBUG_FUNCPTR(gst_bcmdec_getcaps));
> -
> -	gst_pad_set_event_function(bcmdec->srcpad, GST_DEBUG_FUNCPTR(gst_bcmdec_src_event));
> +	gst_pad_set_event_function(bcmdec->srcpad,
> +				   GST_DEBUG_FUNCPTR(gst_bcm_dec_src_event));
>  
>  	gst_pad_use_fixed_caps(bcmdec->srcpad);
>  	bcmdec_negotiate_format(bcmdec);
> @@ -223,7 +226,7 @@ static void gst_bcmdec_init(GstBcmDec *bcmdec, GstBcmDecClass *gclass)
>  	gst_element_add_pad(GST_ELEMENT(bcmdec), bcmdec->srcpad);
>  	bcmdec->silent = FALSE;
>  	pid = getpid();
> -	GST_DEBUG_OBJECT(bcmdec, "gst_bcmdec_init _-- PID = %x",pid);
> +	GST_DEBUG_OBJECT(bcmdec, "gst_bcm_dec_init _-- PID = %x",pid);
>  
>  	sts = bcmdec_create_shmem(bcmdec, &shmid);
>  
> @@ -231,25 +234,25 @@ static void gst_bcmdec_init(GstBcmDec *bcmdec, GstBcmDecClass *gclass)
>  }
>  
>  /* plugin close function*/
> -static void gst_bcmdec_finalize(GObject *object)
> +static void gst_bcm_dec_finalize(GObject *object)
>  {
> -	GstBcmDec *bcmdec = GST_BCMDEC(object);
> +	GstBcmDec *bcmdec = GST_BCM_DEC(object);
>  
>  	bcmdec_del_shmem(bcmdec);
> -	/*gst_bcmdec_cleanup(bcmdec);*/
> -	GST_DEBUG_OBJECT(bcmdec, "gst_bcmdec_finalize");
> -	G_OBJECT_CLASS(parent_class)->finalize(object);
> +	/*gst_bcm_dec_cleanup(bcmdec);*/
> +	GST_DEBUG_OBJECT(bcmdec, "gst_bcm_dec_finalize");
> +	G_OBJECT_CLASS(gst_bcm_dec_parent_class)->finalize(object);
>  }
>  
> -static void gst_bcmdec_set_property(GObject *object, guint prop_id,
> +static void gst_bcm_dec_set_property(GObject *object, guint prop_id,
>  				    const GValue *value, GParamSpec *pspec)
>  {
> -	GstBcmDec *bcmdec = GST_BCMDEC(object);
> +	GstBcmDec *bcmdec = GST_BCM_DEC(object);
>  
>  	switch (prop_id) {
>  	case PROP_SILENT:
>  		bcmdec->silent = g_value_get_boolean (value);
> -		GST_DEBUG_OBJECT(bcmdec, "gst_bcmdec_set_property PROP_SILENT");
> +		GST_DEBUG_OBJECT(bcmdec, "gst_bcm_dec_set_property PROP_SILENT");
>  		break;
>  	default:
>  		G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
> @@ -257,18 +260,18 @@ static void gst_bcmdec_set_property(GObject *object, guint prop_id,
>  	}
>  
>  	if (!bcmdec->silent)
> -		GST_DEBUG_OBJECT(bcmdec, "gst_bcmdec_set_property");
> +		GST_DEBUG_OBJECT(bcmdec, "gst_bcm_dec_set_property");
>  }
>  
> -static void gst_bcmdec_get_property(GObject *object, guint prop_id,
> +static void gst_bcm_dec_get_property(GObject *object, guint prop_id,
>  				    GValue *value, GParamSpec *pspec)
>  {
> -	GstBcmDec *bcmdec = GST_BCMDEC(object);
> +	GstBcmDec *bcmdec = GST_BCM_DEC(object);
>  
>  	switch (prop_id) {
>  	case PROP_SILENT:
>  		g_value_set_boolean (value, bcmdec->silent);
> -		GST_DEBUG_OBJECT(bcmdec, "gst_bcmdec_get_property PROP_SILENT");
> +		GST_DEBUG_OBJECT(bcmdec, "gst_bcm_dec_get_property PROP_SILENT");
>  		break;
>  	default:
>  		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
> @@ -276,27 +279,33 @@ static void gst_bcmdec_get_property(GObject *object, guint prop_id,
>  	}
>  
>  	if (!bcmdec->silent)
> -		GST_DEBUG_OBJECT(bcmdec, "gst_bcmdec_get_property");
> +		GST_DEBUG_OBJECT(bcmdec, "gst_bcm_dec_get_property");
>  }
>  
>  /* GstElement vmethod implementations */
> -static gboolean gst_bcmdec_sink_event(GstPad* pad, GstEvent* event)
> +static gboolean gst_bcm_dec_sink_event(GstPad* pad,
> +				      GstObject* parent,
> +				      GstEvent* event)
>  {
>  	GstBcmDec *bcmdec;
>  	BC_STATUS sts = BC_STS_SUCCESS;
> -	bcmdec = GST_BCMDEC(gst_pad_get_parent(pad));
> +	bcmdec = GST_BCM_DEC(gst_pad_get_parent(pad));
>  
>  	gboolean result = TRUE;
>  
>  	switch (GST_EVENT_TYPE(event)) {
> -	case GST_EVENT_NEWSEGMENT:
> -		GstFormat newsegment_format;
> -		gint64 newsegment_start;
> +	case GST_EVENT_CAPS:
> +                 GstCaps *caps;
> +		 gst_event_parse_caps (event, &caps);
> +		 result = gst_bcm_dec_sink_set_caps (pad, caps);
> +		 break;
> +
> +	case GST_EVENT_SEGMENT:
> +	        const GstSegment *newsegment;
>  
> -		gst_event_parse_new_segment(event, NULL, NULL, &newsegment_format,
> -					    &newsegment_start, NULL, NULL);
> +		gst_event_parse_segment(event, &newsegment);
>  
> -		bcmdec->base_clock_time = newsegment_start;
> +		bcmdec->base_clock_time = newsegment->start;
>  		bcmdec->cur_stream_time = 0;
>  
>  		if (!bcmdec->silent)
> @@ -356,30 +365,24 @@ static gboolean gst_bcmdec_sink_event(GstPad* pad, GstEvent* event)
>  
>  	gst_object_unref(bcmdec);
>  	if (!bcmdec->silent)
> -		GST_DEBUG_OBJECT(bcmdec, "gst_bcmdec_sink_event %u", GST_EVENT_TYPE(event));
> +		GST_DEBUG_OBJECT(bcmdec, "gst_bcm_dec_sink_event %u", GST_EVENT_TYPE(event));
>  	return result;
>  }
>  
> -static GstCaps *gst_bcmdec_getcaps (GstPad * pad)
> -{
> -	return gst_caps_copy (gst_pad_get_pad_template_caps (pad));
> -}
> -
>  /* this function handles the link with other elements */
> -static gboolean gst_bcmdec_sink_set_caps(GstPad *pad, GstCaps *caps)
> +static gboolean gst_bcm_dec_sink_set_caps(GstPad *pad, GstCaps *caps)
>  {
>  	GstBcmDec *bcmdec;
> -	bcmdec = GST_BCMDEC(gst_pad_get_parent(pad));
> +	bcmdec = GST_BCM_DEC(gst_pad_get_parent(pad));
>  	GstStructure *structure;
> +	GstMapInfo info;
>  	GstCaps *intersection;
>  	const gchar *mime;
>  	guint num = 0;
>  	guint den = 0;
>  	const GValue *g_value;
>  	int version = 0;
> -	GstBuffer *buffer;
> -	guint8 *data;
> -	guint size;
> +	GstBuffer *buffer = NULL;
>  	guint index;
>  
>  	GST_DEBUG_OBJECT (pad, "setcaps called");
> @@ -484,53 +487,66 @@ static gboolean gst_bcmdec_sink_set_caps(GstPad *pad, GstCaps *caps)
>  				GST_DEBUG_OBJECT(bcmdec, "InFmt H.264 (AVC1)");
>  
>  				buffer = gst_value_get_buffer(g_value);
> -				data = GST_BUFFER_DATA(buffer);
> -				size = GST_BUFFER_SIZE(buffer);
> -
> -				GST_DEBUG_OBJECT(bcmdec, "codec_data size = %d", size);
> +				if(!gst_buffer_map(buffer,
> +						   &info,
> +						   GST_MAP_READ))
> +				   goto map_error;
> +				GST_DEBUG_OBJECT(bcmdec,
> +						 "codec_data size = %d",
> +						 info.size);
>  
>  				/* parse the avcC data */
> -				if (size < 7) {
> -					GST_ERROR_OBJECT(bcmdec, "avcC size %u < 7", size);
> -					goto avcc_error;
> +				if (info.size < 7) {
> +					GST_ERROR_OBJECT(bcmdec,
> +							 "avcC size %u < 7",
> +							 info.size);
> +					goto out;
>  				}
>  				/* parse the version, this must be 1 */
> -				if (data[0] != 1)
> -					goto wrong_version;
> +				if (info.data[0] != 1) {
> +				  GST_ERROR_OBJECT(bcmdec, "wrong avcC version");
> +				  goto out;
> +				}
>  
>  				if (bcmdec->codec_params.sps_pps_buf == NULL)
> -					bcmdec->codec_params.sps_pps_buf = (guint8 *)malloc(size * 2);
> -				if (bcmdec_insert_sps_pps(bcmdec, buffer) != BC_STS_SUCCESS) {
> +					bcmdec->codec_params.sps_pps_buf = (guint8 *)malloc(info.size * 2);
> +				if (bcmdec_insert_sps_pps(bcmdec, &info) != BC_STS_SUCCESS) {
>  					bcmdec->codec_params.pps_size = 0;
>  				}
>  			} else if (!strcmp("video/x-wmv", mime)) {
> -				buffer = gst_value_get_buffer(g_value);
> -				data = GST_BUFFER_DATA(buffer);
> -				size = GST_BUFFER_SIZE(buffer);
> -
> -				GST_DEBUG_OBJECT(bcmdec, "codec_data size = %d", size);
> -				if (size == 4) {
> +			        buffer = gst_value_get_buffer(g_value);
> +				if(!gst_buffer_map(buffer,
> +						   &info,
> +						   GST_MAP_READ))
> +				  goto map_error;
> +
> +				GST_DEBUG_OBJECT(bcmdec,
> +						 "codec_data size = %d",
> +						 info.size);
> +				if (info.size == 4) {
>  					// Simple or Main Profile
>  					bcmdec->input_format = BC_MSUBTYPE_WMV3;
>  					GST_DEBUG_OBJECT(bcmdec, "InFmt VC-1 (SP/MP)");
>  					if (bcmdec->codec_params.sps_pps_buf == NULL)
>  						bcmdec->codec_params.sps_pps_buf = (guint8 *)malloc(4);
> -					memcpy(bcmdec->codec_params.sps_pps_buf, data, 4);
> +					memcpy(bcmdec->codec_params.sps_pps_buf,
> +					       info.data, 4);
>  					bcmdec->codec_params.pps_size = 4;
>  				} else {
>  					bcmdec->input_format = BC_MSUBTYPE_VC1;
>  					GST_DEBUG_OBJECT(bcmdec, "InFmt VC-1 (AP)");
> -					for (index = 0; index < size; index++) {
> -						data += index;
> -						if (((size - index) >= 4) && (*data == 0x00) && (*(data + 1) == 0x00) &&
> -							(*(data + 2) == 0x01) && (*(data + 3) == 0x0f)) {
> +					for (index = 0; index < info.size;
> +					     index++) {
> +						info.data += index;
> +						if (((info.size - index) >= 4) && (*info.data == 0x00) && (*(info.data + 1) == 0x00) &&
> +							(*(info.data + 2) == 0x01) && (*(info.data + 3) == 0x0f)) {
>  							GST_DEBUG_OBJECT(bcmdec, "VC1 Sequence Header Found for Adv Profile");
>  
> -							if ((size - index + 1) > MAX_ADV_PROF_SEQ_HDR_SZ)
> +							if ((info.size - index + 1) > MAX_ADV_PROF_SEQ_HDR_SZ)
>  								bcmdec->codec_params.pps_size = MAX_ADV_PROF_SEQ_HDR_SZ;
>  							else
> -								bcmdec->codec_params.pps_size = size - index + 1;
> -							memcpy(bcmdec->codec_params.sps_pps_buf, data, bcmdec->codec_params.pps_size);
> +								bcmdec->codec_params.pps_size = info.size - index + 1;
> +							memcpy(bcmdec->codec_params.sps_pps_buf, info.data, bcmdec->codec_params.pps_size);
>  							break;
>  						}
>  					}
> @@ -546,16 +562,16 @@ static gboolean gst_bcmdec_sink_set_caps(GstPad *pad, GstCaps *caps)
>  		} else {
>  			// No Codec data. So try with FourCC for VC1/WMV9
>  			if (!strcmp("video/x-wmv", mime)) {
> -				guint32 fourcc;
> -				if (gst_structure_get_fourcc (structure, "format", &fourcc)) {
> -					if ((fourcc == GST_MAKE_FOURCC ('W', 'V', 'C', '1')) ||
> -						(fourcc == GST_MAKE_FOURCC ('W', 'M', 'V', 'A'))) {
> +				if (gst_structure_has_field (structure, "format")) {
> +				  const char* fourcc = gst_structure_get_string(structure, "format");
> +
> +				  if (!g_strcmp0(fourcc, "WVC1") ||
> +				      !g_strcmp0(fourcc, "WMVA")) {
>  						bcmdec->input_format = BC_MSUBTYPE_VC1;
>  						GST_DEBUG_OBJECT(bcmdec, "InFmt VC-1 (AP)");
>  					} else {
>  						GST_DEBUG_OBJECT(bcmdec, "no codec_data. Don't know how to handle");
> -						gst_object_unref(bcmdec);
> -						return FALSE;
> +						goto out;
>  					}
>  				}
>  			}
> @@ -570,8 +586,7 @@ static gboolean gst_bcmdec_sink_set_caps(GstPad *pad, GstCaps *caps)
>  			}
>  			else {
>  				GST_DEBUG_OBJECT(bcmdec, "no codec_data. Don't know how to handle");
> -				gst_object_unref(bcmdec);
> -				return FALSE;
> +				goto out;
>  			}
>  		}
>  	}
> @@ -581,54 +596,40 @@ static gboolean gst_bcmdec_sink_set_caps(GstPad *pad, GstCaps *caps)
>  		bcmdec_process_play(bcmdec);
>  	}
>  
> +        gst_buffer_unmap(buffer, &info);
>  	gst_object_unref(bcmdec);
>  
>  	return TRUE;
>  
>  	/* ERRORS */
> -avcc_error:
> -	{
> -		gst_object_unref(bcmdec);
> -		return FALSE;
> -	}
> -
> -wrong_version:
> -	{
> -		GST_ERROR_OBJECT(bcmdec, "wrong avcC version");
> -		gst_object_unref(bcmdec);
> -		return FALSE;
> -	}
> -}
> -
> -void bcmdec_msleep(gint msec)
> -{
> -	gint cnt = msec;
> -
> -	while (cnt) {
> -		usleep(1000);
> -		cnt--;
> -	}
> +out:
> +	if (buffer)
> +	  gst_buffer_unmap(buffer, &info);
> +map_error:
> +	gst_object_unref(bcmdec);
> +	return FALSE;
>  }
>  
>  /*
>   * chain function
>   * this function does the actual processing
>   */
> -static GstFlowReturn gst_bcmdec_chain(GstPad *pad, GstBuffer *buf)
> +static GstFlowReturn gst_bcm_dec_chain(GstPad *pad,
> +				      GstObject *parent,
> +				      GstBuffer *buf)
>  {
>  	GstBcmDec *bcmdec;
> -//	BC_STATUS sts = BC_STS_SUCCESS;
> +	GstMapInfo info;
>  	guint32 offset = 0;
>  	GstClockTime tCurrent = 0;
>  	guint8 *pbuffer;
>  	guint32 size = 0;
> -//	guint32 vc1_buff_sz = 0;
> -
> +	GstFlowReturn ret;
>  
>  #ifdef FILE_DUMP__
>  	guint32 bytes_written =0;
>  #endif
> -	bcmdec = GST_BCMDEC (GST_OBJECT_PARENT (pad));
> +	bcmdec = GST_BCM_DEC (GST_OBJECT_PARENT (pad));
>  
>  #ifdef FILE_DUMP__
>  	if (bcmdec->fhnd == NULL)
> @@ -637,8 +638,8 @@ static GstFlowReturn gst_bcmdec_chain(GstPad *pad, GstBuffer *buf)
>  
>  	if (bcmdec->flushing) {
>  		GST_DEBUG_OBJECT(bcmdec, "input while flushing");
> -		gst_buffer_unref(buf);
> -		return GST_FLOW_OK;
> +		ret = GST_FLOW_OK;
> +		goto out;
>  	}
>  
>  	if (GST_CLOCK_TIME_NONE != GST_BUFFER_TIMESTAMP(buf)) {
> @@ -654,32 +655,44 @@ static GstFlowReturn gst_bcmdec_chain(GstPad *pad, GstBuffer *buf)
>  		bcmdec_process_play(bcmdec);
>  	} else if (!bcmdec->streaming) {
>  		GST_DEBUG_OBJECT(bcmdec, "input while streaming is false");
> -		gst_buffer_unref(buf);
> -		return GST_FLOW_WRONG_STATE;
> +		ret = GST_FLOW_FLUSHING;
> +		goto out;
>  	}
>  
> -	pbuffer = GST_BUFFER_DATA (buf);
> -	size = GST_BUFFER_SIZE(buf);
> +	if (!gst_buffer_map(buf, &info, GST_MAP_READ)) {
> +	  ret = GST_FLOW_ERROR;
> +	  goto out;
> +	}
> +	pbuffer = info.data;
> +	size = info.size;
>  
> +	/* FIXME: better send mapinfo? */
>  	if (GST_FLOW_OK != bcmdec_send_buff_detect_error(bcmdec, buf, pbuffer, size, offset, tCurrent, bcmdec->proc_in_flags)) {
> -		gst_buffer_unref(buf);
> -		return GST_FLOW_ERROR;
> +		ret = GST_FLOW_ERROR;
> +		goto unmapout;
>  	}
>  
>  #ifdef FILE_DUMP__
>  	bytes_written = fwrite(GST_BUFFER_DATA(buf), sizeof(unsigned char), GST_BUFFER_SIZE(buf), bcmdec->fhnd);
>  #endif
>  
> +	ret = GST_FLOW_OK;
> +
> +unmapout:
> +	gst_buffer_unmap(buf, &info);
> +out:
>  	gst_buffer_unref(buf);
> -	return GST_FLOW_OK;
> +	return ret;
>  }
>  
> -static gboolean gst_bcmdec_src_event(GstPad *pad, GstEvent *event)
> +static gboolean gst_bcm_dec_src_event(GstPad *pad,
> +				     GstObject *parent,
> +				     GstEvent *event)
>  {
>  	gboolean result;
>  	GstBcmDec *bcmdec;
>  
> -	bcmdec = GST_BCMDEC(GST_OBJECT_PARENT(pad));
> +	bcmdec = GST_BCM_DEC(GST_OBJECT_PARENT(pad));
>  
>  	result = gst_pad_push_event(bcmdec->sinkpad, event);
>  
> @@ -695,6 +708,7 @@ static gboolean bcmdec_negotiate_format(GstBcmDec *bcmdec)
>  	GstStructure *s1;
>  	const GValue *framerate_value;
>  	GstVideoFormat vidFmt;
> +	GstVideoInfo info;
>  
>  #ifdef YV12__
>  	vidFmt = GST_VIDEO_FORMAT_YV12;
> @@ -703,21 +717,21 @@ static gboolean bcmdec_negotiate_format(GstBcmDec *bcmdec)
>  #endif
>  	GST_DEBUG_OBJECT(bcmdec, "framerate = %f", bcmdec->output_params.framerate);
>  
> -	if(bcmdec->interlace) {
> -		caps = gst_video_format_new_caps_interlaced(vidFmt, bcmdec->output_params.width,
> -													bcmdec->output_params.height, num, den,
> -													bcmdec->output_params.aspectratio_x,
> -													bcmdec->output_params.aspectratio_y,
> -													TRUE);
> -	} else {
> -		caps = gst_video_format_new_caps(vidFmt, bcmdec->output_params.width,
> -													bcmdec->output_params.height, num, den,
> -													bcmdec->output_params.aspectratio_x,
> -													bcmdec->output_params.aspectratio_y);
> -	}
> -
> +	gst_video_info_init (&info);
> +	gst_video_info_set_format (&info,
> +				   vidFmt,
> +				   bcmdec->output_params.width,
> +				   bcmdec->output_params.height);
> +	info.fps_n = num;
> +	info.fps_d = den;
> +	info.par_n = bcmdec->output_params.aspectratio_x;
> +	info.par_d = bcmdec->output_params.aspectratio_y;
> +	info.interlace_mode = bcmdec->interlace ?
> +	  GST_VIDEO_INTERLACE_MODE_INTERLEAVED :
> +	  GST_VIDEO_INTERLACE_MODE_PROGRESSIVE;
> +	  caps = gst_video_info_to_caps (&info);
>  	result = gst_pad_set_caps(bcmdec->srcpad, caps);
> -	GST_DEBUG_OBJECT(bcmdec, "gst_bcmdec_negotiate_format %d", result);
> +	GST_DEBUG_OBJECT(bcmdec, "gst_bcm_dec_negotiate_format %d", result);
>  
>  	if (bcmdec->output_params.clr_space == MODE422_YUY2) {
>  		bcmdec->output_params.y_size = bcmdec->output_params.width * bcmdec->output_params.height * BUF_MULT;
> @@ -842,10 +856,10 @@ static gboolean bcmdec_process_play(GstBcmDec *bcmdec)
>  	return TRUE;
>  }
>  
> -static GstStateChangeReturn gst_bcmdec_change_state(GstElement *element, GstStateChange transition)
> +static GstStateChangeReturn gst_bcm_dec_change_state(GstElement *element, GstStateChange transition)
>  {
>  	GstStateChangeReturn result = GST_STATE_CHANGE_SUCCESS;
> -	GstBcmDec *bcmdec = GST_BCMDEC(element);
> +	GstBcmDec *bcmdec = GST_BCM_DEC(element);
>  	BC_STATUS sts = BC_STS_SUCCESS;
>  	int ret = 0;
>  
> @@ -960,7 +974,7 @@ static GstStateChangeReturn gst_bcmdec_change_state(GstElement *element, GstStat
>  		GST_DEBUG_OBJECT(bcmdec, "default %d", transition);
>  		break;
>  	}
> -	result = GST_ELEMENT_CLASS(parent_class)->change_state(element, transition);
> +	result = GST_ELEMENT_CLASS(gst_bcm_dec_parent_class)->change_state(element, transition);
>  	if (result == GST_STATE_CHANGE_FAILURE) {
>  		GST_ERROR_OBJECT(bcmdec, "parent class state change failed");
>  		return result;
> @@ -968,7 +982,7 @@ static GstStateChangeReturn gst_bcmdec_change_state(GstElement *element, GstStat
>  
>  	if(transition == GST_STATE_CHANGE_READY_TO_NULL) {
>  		GST_DEBUG_OBJECT(bcmdec, "GST_STATE_CHANGE_READY_TO_NULL");
> -		sts = gst_bcmdec_cleanup(bcmdec);
> +		sts = gst_bcm_dec_cleanup(bcmdec);
>  		if (sts == BC_STS_SUCCESS)
>  			GST_DEBUG_OBJECT(bcmdec, "dev close success");
>  		else
> @@ -978,38 +992,26 @@ static GstStateChangeReturn gst_bcmdec_change_state(GstElement *element, GstStat
>  	return result;
>  }
>  
> -
> -GstClockTime gst_get_current_timex (void)
> -{
> -	GTimeVal tv;
> -
> -	g_get_current_time(&tv);
> -	return GST_TIMEVAL_TO_TIME(tv);
> -}
> -
> -clock_t bcm_get_tick_count()
> -{
> -	tms tm;
> -	return times(&tm);
> -}
> -
> -static gboolean bcmdec_get_buffer(GstBcmDec *bcmdec, GstBuffer **obuf)
> +static gboolean bcmdec_get_buffer(GstBcmDec *bcmdec,
> +				  gint size,
> +				  GstBuffer **obuf)
>  {
>  	GstFlowReturn ret;
> -	GST_DEBUG_OBJECT(bcmdec, "gst_pad_alloc_buffer_and_set_caps ");
> +	GST_DEBUG_OBJECT(bcmdec, "%s", __func__);
>  
> -	ret = gst_pad_alloc_buffer_and_set_caps(bcmdec->srcpad,
> -						GST_BUFFER_OFFSET_NONE,
> -						bcmdec->output_params.width * bcmdec->output_params.height * BUF_MULT,
> -						GST_PAD_CAPS (bcmdec->srcpad), obuf);
> -	if (ret != GST_FLOW_OK) {
> +	*obuf = gst_buffer_new_allocate (NULL,
> +					size,
> +					NULL);
> +
> +	if (obuf == NULL) {
>  		GST_ERROR_OBJECT(bcmdec, "gst_pad_alloc_buffer_and_set_caps failed %d ",ret);
>  		return FALSE;
>  	}
>  
> +#if 0
>  	if (((uintptr_t)GST_BUFFER_DATA(*obuf)) % 4)
>  		GST_DEBUG_OBJECT(bcmdec, "buf is not aligned");
> -
> +#endif
>  	return TRUE;
>  }
>  
> @@ -1382,6 +1384,7 @@ static void * bcmdec_process_output(void *ctx)
>  	GstClockTime cur_stream_time_diff = 0;
>  	int wait_cnt = 0;
>  	guint32 nextPicNumFlags = 0;
> +	GstMapInfo info;
>  
>  	gboolean is_paused = FALSE;
>  
> @@ -1427,7 +1430,8 @@ static void * bcmdec_process_output(void *ctx)
>  			guint8* data_ptr;
>  			if (gstbuf == NULL) {
>  				if (!bcmdec->rbuf_thread_running) {
> -					if (!bcmdec_get_buffer(bcmdec, &gstbuf)) {
> +				        gint size = bcmdec->output_params.width * bcmdec->output_params.height * BUF_MULT;
> +					if (!bcmdec_get_buffer(bcmdec, size, &gstbuf)) {
>  						usleep(30 * 1000);
>  						continue;
>  					}
> @@ -1460,9 +1464,16 @@ static void * bcmdec_process_output(void *ctx)
>  			else
>  				GST_DEBUG_OBJECT(bcmdec, "re-using rbuf, going to proc output");
>  
> -			data_ptr = GST_BUFFER_DATA(gstbuf);
> -
> +			if(!gst_buffer_map(gstbuf,
> +					   &info,
> +					   GST_MAP_WRITE)) {
> +			  GST_ERROR_OBJECT(bcmdec, "Failed to map buffer");
> +			  continue;
> +			}
> +			data_ptr = info.data;
>  			bcmdec_init_procout(bcmdec, &pout, data_ptr);
> +			gst_buffer_unmap(gstbuf, &info);
> +
>  			rx_flush = TRUE;
>  			pout.PicInfo.picture_number = 0;
>  			// For interlaced content, if I am holding a buffer but the next buffer is not from the same picture
> @@ -1473,7 +1484,7 @@ static void * bcmdec_process_output(void *ctx)
>  					if(pic_number == 0)
>  						gst_buffer_unref(gstbuf);
>  					else if (gst_queue_element) {
> -						GST_BUFFER_FLAG_SET(gstbuf, GST_VIDEO_BUFFER_ONEFIELD);
> +						GST_BUFFER_FLAG_SET(gstbuf, GST_VIDEO_BUFFER_FLAG_ONEFIELD);
>  						gst_queue_element->gstbuf = gstbuf;
>  						bcmdec_ins_buf(bcmdec, gst_queue_element);
>  						bcmdec->prev_pic = pic_number;
> @@ -1489,7 +1500,7 @@ static void * bcmdec_process_output(void *ctx)
>  			}
>  			if (bEOS) {
>  				if (gstbuf) {
> -					gst_buffer_unref(gstbuf);
> +				        gst_buffer_unref(gstbuf);
>  					gstbuf = NULL;
>  				}
>  				if (gst_queue_element) {
> @@ -1561,14 +1572,6 @@ static void * bcmdec_process_output(void *ctx)
>  						GST_DEBUG_OBJECT(bcmdec, "LOST PICTURE pic_no = %d, prev = %d", pic_number, bcmdec->prev_pic);
>  				}
>  
> -/*				if ((bcmdec->prev_pic == pic_number) && (bcmdec->ses_nbr  == pout.PicInfo.sess_num) && !bcmdec->interlace) {
> -					if (!bcmdec->silent)
> -						GST_DEBUG_OBJECT(bcmdec, "rp");
> -
> -					if (!(pout.PicInfo.flags &  VDEC_FLAG_LAST_PICTURE))
> -						continue;
> -				}*/
> -
>  				if (!bcmdec->interlace || bcmdec->sec_field) {
>  					GST_DEBUG_OBJECT(bcmdec, "Progressive or Second Field");
>  					GST_BUFFER_OFFSET(gstbuf) = 0;
> @@ -1597,13 +1600,11 @@ static void * bcmdec_process_output(void *ctx)
>  					}
>  				}
>  
> -				GST_BUFFER_SIZE(gstbuf) = bcmdec->output_params.width * bcmdec->output_params.height * BUF_MULT;
> -
>  				if (!bcmdec->interlace || bcmdec->sec_field) {
>  					if (gst_queue_element) {
>  						// If interlaced, set the GST_VIDEO_BUFFER_TFF flags
>  						if(bcmdec->sec_field)
> -							GST_BUFFER_FLAG_SET(gstbuf, GST_VIDEO_BUFFER_TFF);
> +							GST_BUFFER_FLAG_SET(gstbuf, GST_VIDEO_BUFFER_FLAG_TFF);
>  						gst_queue_element->gstbuf = gstbuf;
>  						bcmdec_ins_buf(bcmdec, gst_queue_element);
>  						bcmdec->prev_pic = pic_number;
> @@ -1674,7 +1675,7 @@ static void * bcmdec_process_output(void *ctx)
>  		}
>  		if (rx_flush) {
>  			if (!bcmdec->flushing) {
> -// 				GST_DEBUG_OBJECT(bcmdec, "DtsFlushRxCapture called");
> + 				GST_DEBUG_OBJECT(bcmdec, "DtsFlushRxCapture called");
>  // 				sts = decif_flush_rxbuf(&bcmdec->decif, FALSE);
>  // 				if (sts != BC_STS_SUCCESS)
>  // 					GST_DEBUG_OBJECT(bcmdec, "DtsFlushRxCapture failed");
> @@ -1880,11 +1881,11 @@ static void bcmdec_process_flush_start(GstBcmDec *bcmdec)
>  		GST_ERROR_OBJECT(bcmdec, "flush_dec failed sts %d", sts);
>  }
>  
> -static BC_STATUS gst_bcmdec_cleanup(GstBcmDec *bcmdec)
> +static BC_STATUS gst_bcm_dec_cleanup(GstBcmDec *bcmdec)
>  {
>  	BC_STATUS sts = BC_STS_SUCCESS;
>  
> -	GST_DEBUG_OBJECT(bcmdec, "gst_bcmdec_cleanup - enter");
> +	GST_DEBUG_OBJECT(bcmdec, "gst_bcm_dec_cleanup - enter");
>  	bcmdec->streaming = FALSE;
>  
>  	bcmdec_release_mem_buf_que_pool(bcmdec);
> @@ -2117,11 +2118,11 @@ static GSTBUF_LIST * bcmdec_rem_buf(GstBcmDec *bcmdec)
>  	return temp;
>  }
>  
> -static BC_STATUS bcmdec_insert_sps_pps(GstBcmDec *bcmdec, GstBuffer* gstbuf)
> +static BC_STATUS bcmdec_insert_sps_pps(GstBcmDec *bcmdec, GstMapInfo* info)
>  {
>  	BC_STATUS sts = BC_STS_SUCCESS;
> -	guint8 *data = GST_BUFFER_DATA(gstbuf);
> -	guint32 data_size = GST_BUFFER_SIZE(gstbuf);
> +	guint8 *data = info->data;
> +	guint32 data_size = info->size;
>  	gint profile;
>  	guint nal_size;
>  	guint num_sps, num_pps, i;
> @@ -2436,7 +2437,6 @@ static void * bcmdec_process_get_rbuf(void *ctx)
>  
>  		while (bcmdec->streaming && get_buf_start)
>  		{
> -			//GST_DEBUG_OBJECT(bcmdec, "process get rbuf start....");
>  			gstbuf = NULL;
>  
>  			if (!bcmdec->recv_thread && !bcmdec->streaming) {
> @@ -2446,9 +2446,8 @@ static void * bcmdec_process_get_rbuf(void *ctx)
>  				break;
>  			}
>  
> -			// If we have enough buffers from the renderer then don't get any more
>  			if(bcmdec->gst_padbuf_que_cnt >= GST_RENDERER_BUF_POOL_SZ) {
> -				usleep(100 * 1000);
> +			  usleep(100 * 1000); /* we have enought buffers from the renderer */
>  				GST_DEBUG_OBJECT(bcmdec, "SLEEPING because we have enough buffers");
>  				continue;
>  			}
> @@ -2467,13 +2466,10 @@ static void * bcmdec_process_get_rbuf(void *ctx)
>  			bufSz = bcmdec->output_params.width * bcmdec->output_params.height * BUF_MULT;
>  
>  			GST_DEBUG_OBJECT(bcmdec, "process get rbuf gst_pad_alloc_buffer_and_set_caps ....");
> -			ret = gst_pad_alloc_buffer_and_set_caps(bcmdec->srcpad, GST_BUFFER_OFFSET_NONE,
> -								bufSz, GST_PAD_CAPS(bcmdec->srcpad), &gstbuf);
> -			if (ret != GST_FLOW_OK) {
> -				if (!bcmdec->silent)
> -					GST_ERROR_OBJECT(bcmdec, "gst_pad_alloc_buffer_and_set_caps failed %d ",ret);
> -				usleep(30 * 1000);
> -				continue;
> +			if (!bcmdec_get_buffer(bcmdec, bufSz, &gstbuf)) {
> +			  GST_ERROR_OBJECT(bcmdec, "gst_pad_alloc_buffer_and_set_caps failed %d ",ret);
> +			  usleep(30 * 1000);
> +			  continue;
>  			}
>  
>  			GST_DEBUG_OBJECT(bcmdec, "Got GST Buf RCnt:%d", bcmdec->gst_padbuf_que_cnt);
> @@ -2501,9 +2497,6 @@ static gboolean bcmdec_start_get_rbuf_thread(GstBcmDec *bcmdec)
>  	gint ret = 0;
>  	pthread_attr_t thread_attr;
>  
> -// 	if (!bcmdec_alloc_mem_rbuf_que_pool(bcmdec))
> -// 		GST_ERROR_OBJECT(bcmdec, "rend pool alloc failed/n");
> -
>  	bcmdec->gst_padbuf_que_hd = bcmdec->gst_padbuf_que_tl = NULL;
>  
>  	ret = sem_init(&bcmdec->rbuf_ins_event, 0, 0);
> @@ -2658,18 +2651,14 @@ static GSTBUF_LIST *bcmdec_rem_padbuf(GstBcmDec *bcmdec)
>   */
>  static gboolean plugin_init(GstPlugin *bcmdec)
>  {
> -	//printf("BcmDec_init");
> -
>  	/*
>  	 * debug category for fltering log messages
> -	 *
> -	 * exchange the string 'Template bcmdec' with your description
>  	 */
> -	GST_DEBUG_CATEGORY_INIT(gst_bcmdec_debug, "bcmdec", 0, "Broadcom video decoder");
> +	GST_DEBUG_CATEGORY_INIT(gst_bcm_dec_debug, "bcmdec", 0, "Broadcom video decoder");
>  
> -	return gst_element_register(bcmdec, "bcmdec", GST_BCMDEC_RANK, GST_TYPE_BCMDEC);
> +	return gst_element_register(bcmdec, "bcmdec", GST_BCM_DEC_RANK, GST_TYPE_BCM_DEC);
>  }
>  
>  /* gstreamer looks for this structure to register bcmdec */
> -GST_PLUGIN_DEFINE(GST_VERSION_MAJOR, GST_VERSION_MINOR, "bcmdec", "Video decoder", plugin_init, VERSION, "LGPL", "bcmdec", "http://broadcom.com/")
> +GST_PLUGIN_DEFINE(GST_VERSION_MAJOR, GST_VERSION_MINOR, bcmdec, "Video decoder", plugin_init, VERSION, "LGPL", "bcmdec", "http://broadcom.com/")
>  
> diff --git a/filters/gst/gst-plugin/src/gstbcmdec.h b/filters/gst/gst-plugin/src/gstbcmdec.h
> index 6e5b100..5c02c8a 100644
> --- a/filters/gst/gst-plugin/src/gstbcmdec.h
> +++ b/filters/gst/gst-plugin/src/gstbcmdec.h
> @@ -23,11 +23,11 @@
>   * along with this library.  If not, see <http://www.gnu.org/licenses/>.
>   *
>   *******************************************************************/
> -#ifndef __GST_BCMDEC_H__
> -#define __GST_BCMDEC_H__
> +#ifndef __GST_BCM_DEC_H__
> +#define __GST_BCM_DEC_H__
>  
>  
> -#define	GST_BCMDEC_RANK	0xffff
> +#define	GST_BCM_DEC_RANK	0xffff
>  
>  #define CLOCK_BASE 9LL
>  #define CLOC_FREQ_CLOC_BASE * 10000
> @@ -127,16 +127,16 @@ typedef struct {
>  
>  G_BEGIN_DECLS
>  
> -#define GST_TYPE_BCMDEC \
> -  (gst_bcmdec_get_type())
> -#define GST_BCMDEC(obj) \
> -  (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_BCMDEC,GstBcmDec))
> -#define GST_BCMDEC_CLASS(klass) \
> -  (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_BCMDEC,GstBcmDecClass))
> -#define GST_IS_BCMDEC(obj) \
> -  (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_BCMDEC))
> -#define GST_IS_BCMDEC_CLASS(klass) \
> -  (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_BCMDEC))
> +#define GST_TYPE_BCM_DEC \
> +  (gst_bcm_dec_get_type())
> +#define GST_BCM_DEC(obj) \
> +  (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_BCM_DEC,GstBcmDec))
> +#define GST_BCM_DEC_CLASS(klass) \
> +  (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_BCM_DEC,GstBcmDecClass))
> +#define GST_IS_BCM_DEC(obj) \
> +  (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_BCM_DEC))
> +#define GST_IS_BCM_DEC_CLASS(klass) \
> +  (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_BCM_DEC))
>  
>  typedef struct _GstBcmDec      GstBcmDec;
>  typedef struct _GstBcmDecClass GstBcmDecClass;
> @@ -188,7 +188,7 @@ struct _GstBcmDec
>  
>  	gboolean flushing;
>  	sem_t push_stop_event;
> -    sem_t push_start_event;
> +  sem_t push_start_event;
>  	sem_t recv_stop_event;
>  	guint ses_nbr;
>  	gboolean insert_pps;
> @@ -233,49 +233,50 @@ struct _GstBcmDecClass
>    GstElementClass parent_class;
>  };
>  
> -GType gst_bcmdec_get_type (void);
> +GType gst_bcm_dec_get_type (void);
>  
>  static void
> -gst_bcmdec_base_init (gpointer gclass);
> +gst_bcm_dec_base_init (gpointer gclass);
>  
>  static void
> -gst_bcmdec_class_init(GstBcmDecClass * klass);
> +gst_bcm_dec_class_init(GstBcmDecClass * klass);
>  
>  static void
> -gst_bcmdec_init(GstBcmDec * bcmdec,
> -				GstBcmDecClass * gclass);
> +gst_bcm_dec_init(GstBcmDec * bcmdec);
> +
>  
>  static void
> -gst_bcmdec_finalize(GObject * object);
> +gst_bcm_dec_finalize(GObject * object);
>  
>  static GstFlowReturn
> -gst_bcmdec_chain(GstPad * pad,
> +gst_bcm_dec_chain(GstPad * pad,
> +		 GstObject * parent,
>  				 GstBuffer * buffer);
>  
>  static GstStateChangeReturn
> -gst_bcmdec_change_state(GstElement * element,
> +gst_bcm_dec_change_state(GstElement * element,
>  						GstStateChange transition);
>  
>  static gboolean
> -gst_bcmdec_sink_set_caps(GstPad * pad,
> +gst_bcm_dec_sink_set_caps(GstPad * pad,
>  						 GstCaps * caps);
>  
> -static GstCaps *gst_bcmdec_getcaps (GstPad * pad);
> -
>  static gboolean
> -gst_bcmdec_src_event(GstPad * pad,
> +gst_bcm_dec_src_event(GstPad * pad,
> +		     GstObject * parent,
>  					 GstEvent * event);
>  
>  static gboolean
> -gst_bcmdec_sink_event(GstPad * pad,
> +gst_bcm_dec_sink_event(GstPad * pad,
> +		      GstObject * parent,
>  					  GstEvent * event);
>  
>  static void
> -gst_bcmdec_set_property (GObject * object, guint prop_id,
> +gst_bcm_dec_set_property (GObject * object, guint prop_id,
>  						const GValue * value, GParamSpec * pspec);
>  
>  static void
> -gst_bcmdec_get_property (GObject * object, guint prop_id,
> +gst_bcm_dec_get_property (GObject * object, guint prop_id,
>  						GValue * value, GParamSpec * pspec);
>  
>  static gboolean
> @@ -285,7 +286,7 @@ static void
>  bcmdec_reset(GstBcmDec * bcmdec);
>  
>  static gboolean
> -bcmdec_get_buffer(GstBcmDec * bcmdec, GstBuffer ** obuf);
> +bcmdec_get_buffer(GstBcmDec * bcmdec, gint size, GstBuffer ** obuf);
>  
>  static void*
>  bcmdec_process_output(void * ctx);
> @@ -300,7 +301,7 @@ static gboolean
>  bcmdec_format_change(GstBcmDec * filter,BC_PIC_INFO_BLOCK* pic_info);
>  
>  static BC_STATUS
> -gst_bcmdec_cleanup(GstBcmDec *filter);
> +gst_bcm_dec_cleanup(GstBcmDec *filter);
>  
>  static gboolean
>  bcmdec_start_recv_thread(GstBcmDec * bcmdec);
> @@ -339,7 +340,7 @@ bcmdec_start_push_thread(GstBcmDec * bcmdec);
>  //bcmdec_insert_startcode(GstBcmDec* filter,GstBuffer* gstbuf, guint8* dest_buf,guint32* sz);
>  
>  static BC_STATUS
> -bcmdec_insert_sps_pps(GstBcmDec* filter,GstBuffer* gstbuf);
> +bcmdec_insert_sps_pps(GstBcmDec* filter, GstMapInfo* gstbuf);
>  
>  static void
>  bcmdec_set_aspect_ratio(GstBcmDec *filter,BC_PIC_INFO_BLOCK* pic_info);
> @@ -383,7 +384,6 @@ bcmdec_ins_padbuf(GstBcmDec *filter,GSTBUF_LIST	*gst_queue_element);
>  static GSTBUF_LIST*
>  bcmdec_rem_padbuf(GstBcmDec *filter);
>  
> -
>  G_END_DECLS
>  
> -#endif /* __GST_BCMDEC_H__ */
> +#endif /* __GST_BCM_DEC_H__ */
> -- 
> 1.7.10.4
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Guido Günther July 21, 2013, 5:34 p.m. UTC | #2
Hi,
On Mon, Apr 01, 2013 at 01:26:54PM +0200, Guido Günther wrote:
> Hi,
> On Mon, Mar 11, 2013 at 09:40:22AM +0100, Guido Günther wrote:
> > ---
> > Tested with totem as well as gst-launch. Any chance this can be applied
> > to http://git.linuxtv.org/jarod/crystalhd.git?
> 
> Any chance this gets applied.

Ping? It would really be nice to have a gstreamer 1.0 version.
Cheers,
 -- Guido

> 
> > Cheers,
> >  -- Guido
> > 
> >  filters/gst/gst-plugin/configure.ac    |    8 +-
> >  filters/gst/gst-plugin/src/gstbcmdec.c |  431 ++++++++++++++++----------------
> >  filters/gst/gst-plugin/src/gstbcmdec.h |   68 ++---
> >  3 files changed, 248 insertions(+), 259 deletions(-)
> > 
> > diff --git a/filters/gst/gst-plugin/configure.ac b/filters/gst/gst-plugin/configure.ac
> > index 99b3713..a3c6467 100644
> > --- a/filters/gst/gst-plugin/configure.ac
> > +++ b/filters/gst/gst-plugin/configure.ac
> > @@ -1,9 +1,9 @@
> >  AC_INIT
> >  
> >  dnl versions of gstreamer and plugins-base
> > -GST_MAJORMINOR=0.10
> > -GST_REQUIRED=0.10.0
> > -GSTPB_REQUIRED=0.10.0
> > +GST_MAJORMINOR=1.0
> > +GST_REQUIRED=1.0
> > +GSTPB_REQUIRED=1.0
> >  
> >  dnl fill in your package name and version here
> >  dnl the fourth (nano) number should be 0 for a release, 1 for CVS,
> > @@ -56,7 +56,7 @@ dnl And we can also ask for the right version of gstreamer
> >  
> >  PKG_CHECK_MODULES(GST, \
> >    gstreamer-$GST_MAJORMINOR >= $GST_REQUIRED
> > -  gstreamer-video-0.10,
> > +  gstreamer-video-1.0,
> >    HAVE_GST=yes,HAVE_GST=no)
> >  
> >  dnl Give error and exit if we don't have gstreamer
> > diff --git a/filters/gst/gst-plugin/src/gstbcmdec.c b/filters/gst/gst-plugin/src/gstbcmdec.c
> > index ed01c14..a51bd59 100644
> > --- a/filters/gst/gst-plugin/src/gstbcmdec.c
> > +++ b/filters/gst/gst-plugin/src/gstbcmdec.c
> > @@ -8,6 +8,7 @@
> >   *  AU
> >   *
> >   *  HISTORY:
> > + *     Updated for 1.0 by Guido Guenther <agx@sigxcpu.org>
> >   *
> >   *******************************************************************
> >   *
> > @@ -40,6 +41,7 @@
> >  #include <glib.h>
> >  #include <gst/base/gstadapter.h>
> >  #include <gst/video/video.h>
> > +#include <gst/video/gstvideopool.h>
> >  
> >  #ifdef HAVE_CONFIG_H
> >  #include <config.h>
> > @@ -51,8 +53,8 @@
> >  #include "parse.h"
> >  #include "gstbcmdec.h"
> >  
> > -GST_DEBUG_CATEGORY_STATIC (gst_bcmdec_debug);
> > -#define GST_CAT_DEFAULT gst_bcmdec_debug
> > +GST_DEBUG_CATEGORY_STATIC (gst_bcm_dec_debug);
> > +#define GST_CAT_DEFAULT gst_bcm_dec_debug
> >  
> >  //#define YV12__
> >  
> > @@ -64,16 +66,18 @@ static GstFlowReturn bcmdec_send_buff_detect_error(GstBcmDec *bcmdec, GstBuffer
> >  						   guint8 flags)
> >  {
> >  	BC_STATUS sts = BC_STS_SUCCESS;
> > +	GstMapInfo info;
> >  
> >  	GST_DEBUG_OBJECT(bcmdec, "Attempting to Send Buffer");
> >  
> >  	sts = decif_send_buffer(&bcmdec->decif, pbuffer, size, tCurrent, flags);
> >  
> >  	if (sts != BC_STS_SUCCESS) {
> > +	        gst_buffer_map(buf, &info, GST_MAP_READ);
> >  		GST_ERROR_OBJECT(bcmdec, "proc input failed sts = %d", sts);
> >  		GST_ERROR_OBJECT(bcmdec, "Chain: timeStamp = %llu size = %d data = %p",
> > -				 GST_BUFFER_TIMESTAMP(buf), GST_BUFFER_SIZE(buf),
> > -				 GST_BUFFER_DATA (buf));
> > +				 GST_BUFFER_DTS(buf), info.size, info.data);
> > +		gst_buffer_unmap(buf, &info);
> >  		return GST_FLOW_ERROR;
> >  	}
> >  
> > @@ -92,7 +96,7 @@ enum {
> >  };
> >  
> >  
> > -GLB_INST_STS *g_inst_sts = NULL;
> > +static GLB_INST_STS *g_inst_sts = NULL;
> >  
> >  /*
> >   * the capabilities of the inputs and outputs.
> > @@ -111,35 +115,29 @@ GstStaticPadTemplate sink_factory_bcm70012 = GST_STATIC_PAD_TEMPLATE("sink", GST
> >  
> >  #ifdef YV12__
> >  static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE("src", GST_PAD_SRC, GST_PAD_ALWAYS,
> > -		GST_STATIC_CAPS("video/x-raw-yuv, " "format = (fourcc) { YV12 }, " "width = (int) [ 1, MAX ], "
> > +		GST_STATIC_CAPS("video/x-raw, " "format = (string) { YV12 }, " "width = (int) [ 1, MAX ], "
> >  				"height = (int) [ 1, MAX ], " "framerate = (fraction) [ 0/1, 2147483647/1 ]"));
> >  #define BUF_MULT (12 / 8)
> >  #define BUF_MODE MODE420
> >  #else
> >  static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE("src", GST_PAD_SRC, GST_PAD_ALWAYS,
> > -		GST_STATIC_CAPS("video/x-raw-yuv, " "format = (fourcc) { YUY2 } , " "framerate = (fraction) [0,MAX], "
> > -				"width = (int) [1,MAX], " "height = (int) [1,MAX]; " "video/x-raw-yuv, "
> > -				"format = (fourcc) { UYVY } , " "framerate = (fraction) [0,MAX], " "width = (int) [1,MAX], "
> > +		GST_STATIC_CAPS("video/x-raw, " "format = (string) { YUY2 } , " "framerate = (fraction) [0,MAX], "
> > +				"width = (int) [1,MAX], " "height = (int) [1,MAX]; " "video/x-raw, "
> > +				"format = (string) { UYVY } , " "framerate = (fraction) [0,MAX], " "width = (int) [1,MAX], "
> >  				"height = (int) [1,MAX]; "));
> >  #define BUF_MULT (16 / 8)
> >  #define BUF_MODE MODE422_YUY2
> >  #endif
> >  
> > -GST_BOILERPLATE(GstBcmDec, gst_bcmdec, GstElement, GST_TYPE_ELEMENT);
> > +G_DEFINE_TYPE(GstBcmDec, gst_bcm_dec, GST_TYPE_ELEMENT);
> >  
> >  /* GObject vmethod implementations */
> >  
> > -static void gst_bcmdec_base_init(gpointer gclass)
> > +static void gst_bcm_dec_base_init(gpointer gclass)
> >  {
> > -	static GstElementDetails element_details;
> >  	BC_HW_CAPS hwCaps;
> >  
> > -	GST_DEBUG_OBJECT(gclass, "gst_bcmdec_base_init");
> > -
> > -	element_details.klass = (gchar *)"Codec/Decoder/Video";
> > -	element_details.longname = (gchar *)"Generic Video Decoder";
> > -	element_details.description = (gchar *)"Decodes various Video Formats using CrystalHD Decoders";
> > -	element_details.author = (gchar *)"Broadcom Corp.";
> > +	GST_DEBUG_OBJECT(gclass, "gst_bcm_dec_base_init");
> >  
> >  	GstElementClass *element_class = GST_ELEMENT_CLASS(gclass);
> >  
> > @@ -153,11 +151,15 @@ static void gst_bcmdec_base_init(gpointer gclass)
> >  	}
> >  	else
> >  		gst_element_class_add_pad_template(element_class, gst_static_pad_template_get (&sink_factory_bcm70012));
> > -	gst_element_class_set_details(element_class, &element_details);
> > +	gst_element_class_set_metadata(element_class,
> > +				      "Codec/Decoder/Video",
> > +				      "Generic Video Decoder",
> > +				      "Decodes various Video Formats using CrystalHD Decoders",
> > +				      "Broadcom Corp.");
> >  }
> >  
> >  /* initialize the bcmdec's class */
> > -static void gst_bcmdec_class_init(GstBcmDecClass *klass)
> > +static void gst_bcm_dec_class_init(GstBcmDecClass *klass)
> >  {
> >  	GObjectClass *gobject_class;
> >  	GstElementClass *gstelement_class;
> > @@ -165,13 +167,15 @@ static void gst_bcmdec_class_init(GstBcmDecClass *klass)
> >  	gobject_class = (GObjectClass *)klass;
> >  	gstelement_class = (GstElementClass *)klass;
> >  
> > -	GST_DEBUG_OBJECT(klass, "gst_bcmdec_class_init");
> > +	GST_DEBUG_OBJECT(klass, "gst_bcm_dec_class_init");
> > +
> > +	gst_bcm_dec_base_init(klass);
> >  
> > -	gstelement_class->change_state = gst_bcmdec_change_state;
> > +	gstelement_class->change_state = gst_bcm_dec_change_state;
> >  
> > -	gobject_class->set_property = gst_bcmdec_set_property;
> > -	gobject_class->get_property = gst_bcmdec_get_property;
> > -	gobject_class->finalize     = gst_bcmdec_finalize;
> > +	gobject_class->set_property = gst_bcm_dec_set_property;
> > +	gobject_class->get_property = gst_bcm_dec_get_property;
> > +	gobject_class->finalize     = gst_bcm_dec_finalize;
> >  
> >  	g_object_class_install_property(gobject_class, PROP_SILENT,
> >  					g_param_spec_boolean("silent", "Silent",
> > @@ -185,14 +189,14 @@ static void gst_bcmdec_class_init(GstBcmDecClass *klass)
> >   * set pad calback functions
> >   * initialize instance structure
> >   */
> > -static void gst_bcmdec_init(GstBcmDec *bcmdec, GstBcmDecClass *gclass)
> > +static void gst_bcm_dec_init(GstBcmDec *bcmdec)
> >  {
> >  	pid_t pid;
> >  	BC_STATUS sts = BC_STS_SUCCESS;
> >  	int shmid = 0;
> >  	BC_HW_CAPS hwCaps;
> >  
> > -	GST_DEBUG_OBJECT(bcmdec, "gst_bcmdec_init");
> > +	GST_DEBUG_OBJECT(bcmdec, "gst_bcm_dec_init");
> >  
> >  	bcmdec_reset(bcmdec);
> >  
> > @@ -204,17 +208,16 @@ static void gst_bcmdec_init(GstBcmDec *bcmdec, GstBcmDecClass *gclass)
> >  	else
> >  		bcmdec->sinkpad = gst_pad_new_from_static_template(&sink_factory_bcm70012, "sink");
> >  
> > -	gst_pad_set_event_function(bcmdec->sinkpad, GST_DEBUG_FUNCPTR(gst_bcmdec_sink_event));
> > +	gst_pad_set_event_function(bcmdec->sinkpad,
> > +				   GST_DEBUG_FUNCPTR(gst_bcm_dec_sink_event));
> >  
> > -	gst_pad_set_setcaps_function(bcmdec->sinkpad, GST_DEBUG_FUNCPTR(gst_bcmdec_sink_set_caps));
> > -	gst_pad_set_getcaps_function(bcmdec->sinkpad, GST_DEBUG_FUNCPTR(gst_bcmdec_getcaps));
> > -	gst_pad_set_chain_function(bcmdec->sinkpad, GST_DEBUG_FUNCPTR(gst_bcmdec_chain));
> > +	gst_pad_set_chain_function(bcmdec->sinkpad,
> > +				   GST_DEBUG_FUNCPTR(gst_bcm_dec_chain));
> >  
> >  	bcmdec->srcpad = gst_pad_new_from_static_template (&src_factory, "src");
> >  
> > -	gst_pad_set_getcaps_function(bcmdec->srcpad, GST_DEBUG_FUNCPTR(gst_bcmdec_getcaps));
> > -
> > -	gst_pad_set_event_function(bcmdec->srcpad, GST_DEBUG_FUNCPTR(gst_bcmdec_src_event));
> > +	gst_pad_set_event_function(bcmdec->srcpad,
> > +				   GST_DEBUG_FUNCPTR(gst_bcm_dec_src_event));
> >  
> >  	gst_pad_use_fixed_caps(bcmdec->srcpad);
> >  	bcmdec_negotiate_format(bcmdec);
> > @@ -223,7 +226,7 @@ static void gst_bcmdec_init(GstBcmDec *bcmdec, GstBcmDecClass *gclass)
> >  	gst_element_add_pad(GST_ELEMENT(bcmdec), bcmdec->srcpad);
> >  	bcmdec->silent = FALSE;
> >  	pid = getpid();
> > -	GST_DEBUG_OBJECT(bcmdec, "gst_bcmdec_init _-- PID = %x",pid);
> > +	GST_DEBUG_OBJECT(bcmdec, "gst_bcm_dec_init _-- PID = %x",pid);
> >  
> >  	sts = bcmdec_create_shmem(bcmdec, &shmid);
> >  
> > @@ -231,25 +234,25 @@ static void gst_bcmdec_init(GstBcmDec *bcmdec, GstBcmDecClass *gclass)
> >  }
> >  
> >  /* plugin close function*/
> > -static void gst_bcmdec_finalize(GObject *object)
> > +static void gst_bcm_dec_finalize(GObject *object)
> >  {
> > -	GstBcmDec *bcmdec = GST_BCMDEC(object);
> > +	GstBcmDec *bcmdec = GST_BCM_DEC(object);
> >  
> >  	bcmdec_del_shmem(bcmdec);
> > -	/*gst_bcmdec_cleanup(bcmdec);*/
> > -	GST_DEBUG_OBJECT(bcmdec, "gst_bcmdec_finalize");
> > -	G_OBJECT_CLASS(parent_class)->finalize(object);
> > +	/*gst_bcm_dec_cleanup(bcmdec);*/
> > +	GST_DEBUG_OBJECT(bcmdec, "gst_bcm_dec_finalize");
> > +	G_OBJECT_CLASS(gst_bcm_dec_parent_class)->finalize(object);
> >  }
> >  
> > -static void gst_bcmdec_set_property(GObject *object, guint prop_id,
> > +static void gst_bcm_dec_set_property(GObject *object, guint prop_id,
> >  				    const GValue *value, GParamSpec *pspec)
> >  {
> > -	GstBcmDec *bcmdec = GST_BCMDEC(object);
> > +	GstBcmDec *bcmdec = GST_BCM_DEC(object);
> >  
> >  	switch (prop_id) {
> >  	case PROP_SILENT:
> >  		bcmdec->silent = g_value_get_boolean (value);
> > -		GST_DEBUG_OBJECT(bcmdec, "gst_bcmdec_set_property PROP_SILENT");
> > +		GST_DEBUG_OBJECT(bcmdec, "gst_bcm_dec_set_property PROP_SILENT");
> >  		break;
> >  	default:
> >  		G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
> > @@ -257,18 +260,18 @@ static void gst_bcmdec_set_property(GObject *object, guint prop_id,
> >  	}
> >  
> >  	if (!bcmdec->silent)
> > -		GST_DEBUG_OBJECT(bcmdec, "gst_bcmdec_set_property");
> > +		GST_DEBUG_OBJECT(bcmdec, "gst_bcm_dec_set_property");
> >  }
> >  
> > -static void gst_bcmdec_get_property(GObject *object, guint prop_id,
> > +static void gst_bcm_dec_get_property(GObject *object, guint prop_id,
> >  				    GValue *value, GParamSpec *pspec)
> >  {
> > -	GstBcmDec *bcmdec = GST_BCMDEC(object);
> > +	GstBcmDec *bcmdec = GST_BCM_DEC(object);
> >  
> >  	switch (prop_id) {
> >  	case PROP_SILENT:
> >  		g_value_set_boolean (value, bcmdec->silent);
> > -		GST_DEBUG_OBJECT(bcmdec, "gst_bcmdec_get_property PROP_SILENT");
> > +		GST_DEBUG_OBJECT(bcmdec, "gst_bcm_dec_get_property PROP_SILENT");
> >  		break;
> >  	default:
> >  		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
> > @@ -276,27 +279,33 @@ static void gst_bcmdec_get_property(GObject *object, guint prop_id,
> >  	}
> >  
> >  	if (!bcmdec->silent)
> > -		GST_DEBUG_OBJECT(bcmdec, "gst_bcmdec_get_property");
> > +		GST_DEBUG_OBJECT(bcmdec, "gst_bcm_dec_get_property");
> >  }
> >  
> >  /* GstElement vmethod implementations */
> > -static gboolean gst_bcmdec_sink_event(GstPad* pad, GstEvent* event)
> > +static gboolean gst_bcm_dec_sink_event(GstPad* pad,
> > +				      GstObject* parent,
> > +				      GstEvent* event)
> >  {
> >  	GstBcmDec *bcmdec;
> >  	BC_STATUS sts = BC_STS_SUCCESS;
> > -	bcmdec = GST_BCMDEC(gst_pad_get_parent(pad));
> > +	bcmdec = GST_BCM_DEC(gst_pad_get_parent(pad));
> >  
> >  	gboolean result = TRUE;
> >  
> >  	switch (GST_EVENT_TYPE(event)) {
> > -	case GST_EVENT_NEWSEGMENT:
> > -		GstFormat newsegment_format;
> > -		gint64 newsegment_start;
> > +	case GST_EVENT_CAPS:
> > +                 GstCaps *caps;
> > +		 gst_event_parse_caps (event, &caps);
> > +		 result = gst_bcm_dec_sink_set_caps (pad, caps);
> > +		 break;
> > +
> > +	case GST_EVENT_SEGMENT:
> > +	        const GstSegment *newsegment;
> >  
> > -		gst_event_parse_new_segment(event, NULL, NULL, &newsegment_format,
> > -					    &newsegment_start, NULL, NULL);
> > +		gst_event_parse_segment(event, &newsegment);
> >  
> > -		bcmdec->base_clock_time = newsegment_start;
> > +		bcmdec->base_clock_time = newsegment->start;
> >  		bcmdec->cur_stream_time = 0;
> >  
> >  		if (!bcmdec->silent)
> > @@ -356,30 +365,24 @@ static gboolean gst_bcmdec_sink_event(GstPad* pad, GstEvent* event)
> >  
> >  	gst_object_unref(bcmdec);
> >  	if (!bcmdec->silent)
> > -		GST_DEBUG_OBJECT(bcmdec, "gst_bcmdec_sink_event %u", GST_EVENT_TYPE(event));
> > +		GST_DEBUG_OBJECT(bcmdec, "gst_bcm_dec_sink_event %u", GST_EVENT_TYPE(event));
> >  	return result;
> >  }
> >  
> > -static GstCaps *gst_bcmdec_getcaps (GstPad * pad)
> > -{
> > -	return gst_caps_copy (gst_pad_get_pad_template_caps (pad));
> > -}
> > -
> >  /* this function handles the link with other elements */
> > -static gboolean gst_bcmdec_sink_set_caps(GstPad *pad, GstCaps *caps)
> > +static gboolean gst_bcm_dec_sink_set_caps(GstPad *pad, GstCaps *caps)
> >  {
> >  	GstBcmDec *bcmdec;
> > -	bcmdec = GST_BCMDEC(gst_pad_get_parent(pad));
> > +	bcmdec = GST_BCM_DEC(gst_pad_get_parent(pad));
> >  	GstStructure *structure;
> > +	GstMapInfo info;
> >  	GstCaps *intersection;
> >  	const gchar *mime;
> >  	guint num = 0;
> >  	guint den = 0;
> >  	const GValue *g_value;
> >  	int version = 0;
> > -	GstBuffer *buffer;
> > -	guint8 *data;
> > -	guint size;
> > +	GstBuffer *buffer = NULL;
> >  	guint index;
> >  
> >  	GST_DEBUG_OBJECT (pad, "setcaps called");
> > @@ -484,53 +487,66 @@ static gboolean gst_bcmdec_sink_set_caps(GstPad *pad, GstCaps *caps)
> >  				GST_DEBUG_OBJECT(bcmdec, "InFmt H.264 (AVC1)");
> >  
> >  				buffer = gst_value_get_buffer(g_value);
> > -				data = GST_BUFFER_DATA(buffer);
> > -				size = GST_BUFFER_SIZE(buffer);
> > -
> > -				GST_DEBUG_OBJECT(bcmdec, "codec_data size = %d", size);
> > +				if(!gst_buffer_map(buffer,
> > +						   &info,
> > +						   GST_MAP_READ))
> > +				   goto map_error;
> > +				GST_DEBUG_OBJECT(bcmdec,
> > +						 "codec_data size = %d",
> > +						 info.size);
> >  
> >  				/* parse the avcC data */
> > -				if (size < 7) {
> > -					GST_ERROR_OBJECT(bcmdec, "avcC size %u < 7", size);
> > -					goto avcc_error;
> > +				if (info.size < 7) {
> > +					GST_ERROR_OBJECT(bcmdec,
> > +							 "avcC size %u < 7",
> > +							 info.size);
> > +					goto out;
> >  				}
> >  				/* parse the version, this must be 1 */
> > -				if (data[0] != 1)
> > -					goto wrong_version;
> > +				if (info.data[0] != 1) {
> > +				  GST_ERROR_OBJECT(bcmdec, "wrong avcC version");
> > +				  goto out;
> > +				}
> >  
> >  				if (bcmdec->codec_params.sps_pps_buf == NULL)
> > -					bcmdec->codec_params.sps_pps_buf = (guint8 *)malloc(size * 2);
> > -				if (bcmdec_insert_sps_pps(bcmdec, buffer) != BC_STS_SUCCESS) {
> > +					bcmdec->codec_params.sps_pps_buf = (guint8 *)malloc(info.size * 2);
> > +				if (bcmdec_insert_sps_pps(bcmdec, &info) != BC_STS_SUCCESS) {
> >  					bcmdec->codec_params.pps_size = 0;
> >  				}
> >  			} else if (!strcmp("video/x-wmv", mime)) {
> > -				buffer = gst_value_get_buffer(g_value);
> > -				data = GST_BUFFER_DATA(buffer);
> > -				size = GST_BUFFER_SIZE(buffer);
> > -
> > -				GST_DEBUG_OBJECT(bcmdec, "codec_data size = %d", size);
> > -				if (size == 4) {
> > +			        buffer = gst_value_get_buffer(g_value);
> > +				if(!gst_buffer_map(buffer,
> > +						   &info,
> > +						   GST_MAP_READ))
> > +				  goto map_error;
> > +
> > +				GST_DEBUG_OBJECT(bcmdec,
> > +						 "codec_data size = %d",
> > +						 info.size);
> > +				if (info.size == 4) {
> >  					// Simple or Main Profile
> >  					bcmdec->input_format = BC_MSUBTYPE_WMV3;
> >  					GST_DEBUG_OBJECT(bcmdec, "InFmt VC-1 (SP/MP)");
> >  					if (bcmdec->codec_params.sps_pps_buf == NULL)
> >  						bcmdec->codec_params.sps_pps_buf = (guint8 *)malloc(4);
> > -					memcpy(bcmdec->codec_params.sps_pps_buf, data, 4);
> > +					memcpy(bcmdec->codec_params.sps_pps_buf,
> > +					       info.data, 4);
> >  					bcmdec->codec_params.pps_size = 4;
> >  				} else {
> >  					bcmdec->input_format = BC_MSUBTYPE_VC1;
> >  					GST_DEBUG_OBJECT(bcmdec, "InFmt VC-1 (AP)");
> > -					for (index = 0; index < size; index++) {
> > -						data += index;
> > -						if (((size - index) >= 4) && (*data == 0x00) && (*(data + 1) == 0x00) &&
> > -							(*(data + 2) == 0x01) && (*(data + 3) == 0x0f)) {
> > +					for (index = 0; index < info.size;
> > +					     index++) {
> > +						info.data += index;
> > +						if (((info.size - index) >= 4) && (*info.data == 0x00) && (*(info.data + 1) == 0x00) &&
> > +							(*(info.data + 2) == 0x01) && (*(info.data + 3) == 0x0f)) {
> >  							GST_DEBUG_OBJECT(bcmdec, "VC1 Sequence Header Found for Adv Profile");
> >  
> > -							if ((size - index + 1) > MAX_ADV_PROF_SEQ_HDR_SZ)
> > +							if ((info.size - index + 1) > MAX_ADV_PROF_SEQ_HDR_SZ)
> >  								bcmdec->codec_params.pps_size = MAX_ADV_PROF_SEQ_HDR_SZ;
> >  							else
> > -								bcmdec->codec_params.pps_size = size - index + 1;
> > -							memcpy(bcmdec->codec_params.sps_pps_buf, data, bcmdec->codec_params.pps_size);
> > +								bcmdec->codec_params.pps_size = info.size - index + 1;
> > +							memcpy(bcmdec->codec_params.sps_pps_buf, info.data, bcmdec->codec_params.pps_size);
> >  							break;
> >  						}
> >  					}
> > @@ -546,16 +562,16 @@ static gboolean gst_bcmdec_sink_set_caps(GstPad *pad, GstCaps *caps)
> >  		} else {
> >  			// No Codec data. So try with FourCC for VC1/WMV9
> >  			if (!strcmp("video/x-wmv", mime)) {
> > -				guint32 fourcc;
> > -				if (gst_structure_get_fourcc (structure, "format", &fourcc)) {
> > -					if ((fourcc == GST_MAKE_FOURCC ('W', 'V', 'C', '1')) ||
> > -						(fourcc == GST_MAKE_FOURCC ('W', 'M', 'V', 'A'))) {
> > +				if (gst_structure_has_field (structure, "format")) {
> > +				  const char* fourcc = gst_structure_get_string(structure, "format");
> > +
> > +				  if (!g_strcmp0(fourcc, "WVC1") ||
> > +				      !g_strcmp0(fourcc, "WMVA")) {
> >  						bcmdec->input_format = BC_MSUBTYPE_VC1;
> >  						GST_DEBUG_OBJECT(bcmdec, "InFmt VC-1 (AP)");
> >  					} else {
> >  						GST_DEBUG_OBJECT(bcmdec, "no codec_data. Don't know how to handle");
> > -						gst_object_unref(bcmdec);
> > -						return FALSE;
> > +						goto out;
> >  					}
> >  				}
> >  			}
> > @@ -570,8 +586,7 @@ static gboolean gst_bcmdec_sink_set_caps(GstPad *pad, GstCaps *caps)
> >  			}
> >  			else {
> >  				GST_DEBUG_OBJECT(bcmdec, "no codec_data. Don't know how to handle");
> > -				gst_object_unref(bcmdec);
> > -				return FALSE;
> > +				goto out;
> >  			}
> >  		}
> >  	}
> > @@ -581,54 +596,40 @@ static gboolean gst_bcmdec_sink_set_caps(GstPad *pad, GstCaps *caps)
> >  		bcmdec_process_play(bcmdec);
> >  	}
> >  
> > +        gst_buffer_unmap(buffer, &info);
> >  	gst_object_unref(bcmdec);
> >  
> >  	return TRUE;
> >  
> >  	/* ERRORS */
> > -avcc_error:
> > -	{
> > -		gst_object_unref(bcmdec);
> > -		return FALSE;
> > -	}
> > -
> > -wrong_version:
> > -	{
> > -		GST_ERROR_OBJECT(bcmdec, "wrong avcC version");
> > -		gst_object_unref(bcmdec);
> > -		return FALSE;
> > -	}
> > -}
> > -
> > -void bcmdec_msleep(gint msec)
> > -{
> > -	gint cnt = msec;
> > -
> > -	while (cnt) {
> > -		usleep(1000);
> > -		cnt--;
> > -	}
> > +out:
> > +	if (buffer)
> > +	  gst_buffer_unmap(buffer, &info);
> > +map_error:
> > +	gst_object_unref(bcmdec);
> > +	return FALSE;
> >  }
> >  
> >  /*
> >   * chain function
> >   * this function does the actual processing
> >   */
> > -static GstFlowReturn gst_bcmdec_chain(GstPad *pad, GstBuffer *buf)
> > +static GstFlowReturn gst_bcm_dec_chain(GstPad *pad,
> > +				      GstObject *parent,
> > +				      GstBuffer *buf)
> >  {
> >  	GstBcmDec *bcmdec;
> > -//	BC_STATUS sts = BC_STS_SUCCESS;
> > +	GstMapInfo info;
> >  	guint32 offset = 0;
> >  	GstClockTime tCurrent = 0;
> >  	guint8 *pbuffer;
> >  	guint32 size = 0;
> > -//	guint32 vc1_buff_sz = 0;
> > -
> > +	GstFlowReturn ret;
> >  
> >  #ifdef FILE_DUMP__
> >  	guint32 bytes_written =0;
> >  #endif
> > -	bcmdec = GST_BCMDEC (GST_OBJECT_PARENT (pad));
> > +	bcmdec = GST_BCM_DEC (GST_OBJECT_PARENT (pad));
> >  
> >  #ifdef FILE_DUMP__
> >  	if (bcmdec->fhnd == NULL)
> > @@ -637,8 +638,8 @@ static GstFlowReturn gst_bcmdec_chain(GstPad *pad, GstBuffer *buf)
> >  
> >  	if (bcmdec->flushing) {
> >  		GST_DEBUG_OBJECT(bcmdec, "input while flushing");
> > -		gst_buffer_unref(buf);
> > -		return GST_FLOW_OK;
> > +		ret = GST_FLOW_OK;
> > +		goto out;
> >  	}
> >  
> >  	if (GST_CLOCK_TIME_NONE != GST_BUFFER_TIMESTAMP(buf)) {
> > @@ -654,32 +655,44 @@ static GstFlowReturn gst_bcmdec_chain(GstPad *pad, GstBuffer *buf)
> >  		bcmdec_process_play(bcmdec);
> >  	} else if (!bcmdec->streaming) {
> >  		GST_DEBUG_OBJECT(bcmdec, "input while streaming is false");
> > -		gst_buffer_unref(buf);
> > -		return GST_FLOW_WRONG_STATE;
> > +		ret = GST_FLOW_FLUSHING;
> > +		goto out;
> >  	}
> >  
> > -	pbuffer = GST_BUFFER_DATA (buf);
> > -	size = GST_BUFFER_SIZE(buf);
> > +	if (!gst_buffer_map(buf, &info, GST_MAP_READ)) {
> > +	  ret = GST_FLOW_ERROR;
> > +	  goto out;
> > +	}
> > +	pbuffer = info.data;
> > +	size = info.size;
> >  
> > +	/* FIXME: better send mapinfo? */
> >  	if (GST_FLOW_OK != bcmdec_send_buff_detect_error(bcmdec, buf, pbuffer, size, offset, tCurrent, bcmdec->proc_in_flags)) {
> > -		gst_buffer_unref(buf);
> > -		return GST_FLOW_ERROR;
> > +		ret = GST_FLOW_ERROR;
> > +		goto unmapout;
> >  	}
> >  
> >  #ifdef FILE_DUMP__
> >  	bytes_written = fwrite(GST_BUFFER_DATA(buf), sizeof(unsigned char), GST_BUFFER_SIZE(buf), bcmdec->fhnd);
> >  #endif
> >  
> > +	ret = GST_FLOW_OK;
> > +
> > +unmapout:
> > +	gst_buffer_unmap(buf, &info);
> > +out:
> >  	gst_buffer_unref(buf);
> > -	return GST_FLOW_OK;
> > +	return ret;
> >  }
> >  
> > -static gboolean gst_bcmdec_src_event(GstPad *pad, GstEvent *event)
> > +static gboolean gst_bcm_dec_src_event(GstPad *pad,
> > +				     GstObject *parent,
> > +				     GstEvent *event)
> >  {
> >  	gboolean result;
> >  	GstBcmDec *bcmdec;
> >  
> > -	bcmdec = GST_BCMDEC(GST_OBJECT_PARENT(pad));
> > +	bcmdec = GST_BCM_DEC(GST_OBJECT_PARENT(pad));
> >  
> >  	result = gst_pad_push_event(bcmdec->sinkpad, event);
> >  
> > @@ -695,6 +708,7 @@ static gboolean bcmdec_negotiate_format(GstBcmDec *bcmdec)
> >  	GstStructure *s1;
> >  	const GValue *framerate_value;
> >  	GstVideoFormat vidFmt;
> > +	GstVideoInfo info;
> >  
> >  #ifdef YV12__
> >  	vidFmt = GST_VIDEO_FORMAT_YV12;
> > @@ -703,21 +717,21 @@ static gboolean bcmdec_negotiate_format(GstBcmDec *bcmdec)
> >  #endif
> >  	GST_DEBUG_OBJECT(bcmdec, "framerate = %f", bcmdec->output_params.framerate);
> >  
> > -	if(bcmdec->interlace) {
> > -		caps = gst_video_format_new_caps_interlaced(vidFmt, bcmdec->output_params.width,
> > -													bcmdec->output_params.height, num, den,
> > -													bcmdec->output_params.aspectratio_x,
> > -													bcmdec->output_params.aspectratio_y,
> > -													TRUE);
> > -	} else {
> > -		caps = gst_video_format_new_caps(vidFmt, bcmdec->output_params.width,
> > -													bcmdec->output_params.height, num, den,
> > -													bcmdec->output_params.aspectratio_x,
> > -													bcmdec->output_params.aspectratio_y);
> > -	}
> > -
> > +	gst_video_info_init (&info);
> > +	gst_video_info_set_format (&info,
> > +				   vidFmt,
> > +				   bcmdec->output_params.width,
> > +				   bcmdec->output_params.height);
> > +	info.fps_n = num;
> > +	info.fps_d = den;
> > +	info.par_n = bcmdec->output_params.aspectratio_x;
> > +	info.par_d = bcmdec->output_params.aspectratio_y;
> > +	info.interlace_mode = bcmdec->interlace ?
> > +	  GST_VIDEO_INTERLACE_MODE_INTERLEAVED :
> > +	  GST_VIDEO_INTERLACE_MODE_PROGRESSIVE;
> > +	  caps = gst_video_info_to_caps (&info);
> >  	result = gst_pad_set_caps(bcmdec->srcpad, caps);
> > -	GST_DEBUG_OBJECT(bcmdec, "gst_bcmdec_negotiate_format %d", result);
> > +	GST_DEBUG_OBJECT(bcmdec, "gst_bcm_dec_negotiate_format %d", result);
> >  
> >  	if (bcmdec->output_params.clr_space == MODE422_YUY2) {
> >  		bcmdec->output_params.y_size = bcmdec->output_params.width * bcmdec->output_params.height * BUF_MULT;
> > @@ -842,10 +856,10 @@ static gboolean bcmdec_process_play(GstBcmDec *bcmdec)
> >  	return TRUE;
> >  }
> >  
> > -static GstStateChangeReturn gst_bcmdec_change_state(GstElement *element, GstStateChange transition)
> > +static GstStateChangeReturn gst_bcm_dec_change_state(GstElement *element, GstStateChange transition)
> >  {
> >  	GstStateChangeReturn result = GST_STATE_CHANGE_SUCCESS;
> > -	GstBcmDec *bcmdec = GST_BCMDEC(element);
> > +	GstBcmDec *bcmdec = GST_BCM_DEC(element);
> >  	BC_STATUS sts = BC_STS_SUCCESS;
> >  	int ret = 0;
> >  
> > @@ -960,7 +974,7 @@ static GstStateChangeReturn gst_bcmdec_change_state(GstElement *element, GstStat
> >  		GST_DEBUG_OBJECT(bcmdec, "default %d", transition);
> >  		break;
> >  	}
> > -	result = GST_ELEMENT_CLASS(parent_class)->change_state(element, transition);
> > +	result = GST_ELEMENT_CLASS(gst_bcm_dec_parent_class)->change_state(element, transition);
> >  	if (result == GST_STATE_CHANGE_FAILURE) {
> >  		GST_ERROR_OBJECT(bcmdec, "parent class state change failed");
> >  		return result;
> > @@ -968,7 +982,7 @@ static GstStateChangeReturn gst_bcmdec_change_state(GstElement *element, GstStat
> >  
> >  	if(transition == GST_STATE_CHANGE_READY_TO_NULL) {
> >  		GST_DEBUG_OBJECT(bcmdec, "GST_STATE_CHANGE_READY_TO_NULL");
> > -		sts = gst_bcmdec_cleanup(bcmdec);
> > +		sts = gst_bcm_dec_cleanup(bcmdec);
> >  		if (sts == BC_STS_SUCCESS)
> >  			GST_DEBUG_OBJECT(bcmdec, "dev close success");
> >  		else
> > @@ -978,38 +992,26 @@ static GstStateChangeReturn gst_bcmdec_change_state(GstElement *element, GstStat
> >  	return result;
> >  }
> >  
> > -
> > -GstClockTime gst_get_current_timex (void)
> > -{
> > -	GTimeVal tv;
> > -
> > -	g_get_current_time(&tv);
> > -	return GST_TIMEVAL_TO_TIME(tv);
> > -}
> > -
> > -clock_t bcm_get_tick_count()
> > -{
> > -	tms tm;
> > -	return times(&tm);
> > -}
> > -
> > -static gboolean bcmdec_get_buffer(GstBcmDec *bcmdec, GstBuffer **obuf)
> > +static gboolean bcmdec_get_buffer(GstBcmDec *bcmdec,
> > +				  gint size,
> > +				  GstBuffer **obuf)
> >  {
> >  	GstFlowReturn ret;
> > -	GST_DEBUG_OBJECT(bcmdec, "gst_pad_alloc_buffer_and_set_caps ");
> > +	GST_DEBUG_OBJECT(bcmdec, "%s", __func__);
> >  
> > -	ret = gst_pad_alloc_buffer_and_set_caps(bcmdec->srcpad,
> > -						GST_BUFFER_OFFSET_NONE,
> > -						bcmdec->output_params.width * bcmdec->output_params.height * BUF_MULT,
> > -						GST_PAD_CAPS (bcmdec->srcpad), obuf);
> > -	if (ret != GST_FLOW_OK) {
> > +	*obuf = gst_buffer_new_allocate (NULL,
> > +					size,
> > +					NULL);
> > +
> > +	if (obuf == NULL) {
> >  		GST_ERROR_OBJECT(bcmdec, "gst_pad_alloc_buffer_and_set_caps failed %d ",ret);
> >  		return FALSE;
> >  	}
> >  
> > +#if 0
> >  	if (((uintptr_t)GST_BUFFER_DATA(*obuf)) % 4)
> >  		GST_DEBUG_OBJECT(bcmdec, "buf is not aligned");
> > -
> > +#endif
> >  	return TRUE;
> >  }
> >  
> > @@ -1382,6 +1384,7 @@ static void * bcmdec_process_output(void *ctx)
> >  	GstClockTime cur_stream_time_diff = 0;
> >  	int wait_cnt = 0;
> >  	guint32 nextPicNumFlags = 0;
> > +	GstMapInfo info;
> >  
> >  	gboolean is_paused = FALSE;
> >  
> > @@ -1427,7 +1430,8 @@ static void * bcmdec_process_output(void *ctx)
> >  			guint8* data_ptr;
> >  			if (gstbuf == NULL) {
> >  				if (!bcmdec->rbuf_thread_running) {
> > -					if (!bcmdec_get_buffer(bcmdec, &gstbuf)) {
> > +				        gint size = bcmdec->output_params.width * bcmdec->output_params.height * BUF_MULT;
> > +					if (!bcmdec_get_buffer(bcmdec, size, &gstbuf)) {
> >  						usleep(30 * 1000);
> >  						continue;
> >  					}
> > @@ -1460,9 +1464,16 @@ static void * bcmdec_process_output(void *ctx)
> >  			else
> >  				GST_DEBUG_OBJECT(bcmdec, "re-using rbuf, going to proc output");
> >  
> > -			data_ptr = GST_BUFFER_DATA(gstbuf);
> > -
> > +			if(!gst_buffer_map(gstbuf,
> > +					   &info,
> > +					   GST_MAP_WRITE)) {
> > +			  GST_ERROR_OBJECT(bcmdec, "Failed to map buffer");
> > +			  continue;
> > +			}
> > +			data_ptr = info.data;
> >  			bcmdec_init_procout(bcmdec, &pout, data_ptr);
> > +			gst_buffer_unmap(gstbuf, &info);
> > +
> >  			rx_flush = TRUE;
> >  			pout.PicInfo.picture_number = 0;
> >  			// For interlaced content, if I am holding a buffer but the next buffer is not from the same picture
> > @@ -1473,7 +1484,7 @@ static void * bcmdec_process_output(void *ctx)
> >  					if(pic_number == 0)
> >  						gst_buffer_unref(gstbuf);
> >  					else if (gst_queue_element) {
> > -						GST_BUFFER_FLAG_SET(gstbuf, GST_VIDEO_BUFFER_ONEFIELD);
> > +						GST_BUFFER_FLAG_SET(gstbuf, GST_VIDEO_BUFFER_FLAG_ONEFIELD);
> >  						gst_queue_element->gstbuf = gstbuf;
> >  						bcmdec_ins_buf(bcmdec, gst_queue_element);
> >  						bcmdec->prev_pic = pic_number;
> > @@ -1489,7 +1500,7 @@ static void * bcmdec_process_output(void *ctx)
> >  			}
> >  			if (bEOS) {
> >  				if (gstbuf) {
> > -					gst_buffer_unref(gstbuf);
> > +				        gst_buffer_unref(gstbuf);
> >  					gstbuf = NULL;
> >  				}
> >  				if (gst_queue_element) {
> > @@ -1561,14 +1572,6 @@ static void * bcmdec_process_output(void *ctx)
> >  						GST_DEBUG_OBJECT(bcmdec, "LOST PICTURE pic_no = %d, prev = %d", pic_number, bcmdec->prev_pic);
> >  				}
> >  
> > -/*				if ((bcmdec->prev_pic == pic_number) && (bcmdec->ses_nbr  == pout.PicInfo.sess_num) && !bcmdec->interlace) {
> > -					if (!bcmdec->silent)
> > -						GST_DEBUG_OBJECT(bcmdec, "rp");
> > -
> > -					if (!(pout.PicInfo.flags &  VDEC_FLAG_LAST_PICTURE))
> > -						continue;
> > -				}*/
> > -
> >  				if (!bcmdec->interlace || bcmdec->sec_field) {
> >  					GST_DEBUG_OBJECT(bcmdec, "Progressive or Second Field");
> >  					GST_BUFFER_OFFSET(gstbuf) = 0;
> > @@ -1597,13 +1600,11 @@ static void * bcmdec_process_output(void *ctx)
> >  					}
> >  				}
> >  
> > -				GST_BUFFER_SIZE(gstbuf) = bcmdec->output_params.width * bcmdec->output_params.height * BUF_MULT;
> > -
> >  				if (!bcmdec->interlace || bcmdec->sec_field) {
> >  					if (gst_queue_element) {
> >  						// If interlaced, set the GST_VIDEO_BUFFER_TFF flags
> >  						if(bcmdec->sec_field)
> > -							GST_BUFFER_FLAG_SET(gstbuf, GST_VIDEO_BUFFER_TFF);
> > +							GST_BUFFER_FLAG_SET(gstbuf, GST_VIDEO_BUFFER_FLAG_TFF);
> >  						gst_queue_element->gstbuf = gstbuf;
> >  						bcmdec_ins_buf(bcmdec, gst_queue_element);
> >  						bcmdec->prev_pic = pic_number;
> > @@ -1674,7 +1675,7 @@ static void * bcmdec_process_output(void *ctx)
> >  		}
> >  		if (rx_flush) {
> >  			if (!bcmdec->flushing) {
> > -// 				GST_DEBUG_OBJECT(bcmdec, "DtsFlushRxCapture called");
> > + 				GST_DEBUG_OBJECT(bcmdec, "DtsFlushRxCapture called");
> >  // 				sts = decif_flush_rxbuf(&bcmdec->decif, FALSE);
> >  // 				if (sts != BC_STS_SUCCESS)
> >  // 					GST_DEBUG_OBJECT(bcmdec, "DtsFlushRxCapture failed");
> > @@ -1880,11 +1881,11 @@ static void bcmdec_process_flush_start(GstBcmDec *bcmdec)
> >  		GST_ERROR_OBJECT(bcmdec, "flush_dec failed sts %d", sts);
> >  }
> >  
> > -static BC_STATUS gst_bcmdec_cleanup(GstBcmDec *bcmdec)
> > +static BC_STATUS gst_bcm_dec_cleanup(GstBcmDec *bcmdec)
> >  {
> >  	BC_STATUS sts = BC_STS_SUCCESS;
> >  
> > -	GST_DEBUG_OBJECT(bcmdec, "gst_bcmdec_cleanup - enter");
> > +	GST_DEBUG_OBJECT(bcmdec, "gst_bcm_dec_cleanup - enter");
> >  	bcmdec->streaming = FALSE;
> >  
> >  	bcmdec_release_mem_buf_que_pool(bcmdec);
> > @@ -2117,11 +2118,11 @@ static GSTBUF_LIST * bcmdec_rem_buf(GstBcmDec *bcmdec)
> >  	return temp;
> >  }
> >  
> > -static BC_STATUS bcmdec_insert_sps_pps(GstBcmDec *bcmdec, GstBuffer* gstbuf)
> > +static BC_STATUS bcmdec_insert_sps_pps(GstBcmDec *bcmdec, GstMapInfo* info)
> >  {
> >  	BC_STATUS sts = BC_STS_SUCCESS;
> > -	guint8 *data = GST_BUFFER_DATA(gstbuf);
> > -	guint32 data_size = GST_BUFFER_SIZE(gstbuf);
> > +	guint8 *data = info->data;
> > +	guint32 data_size = info->size;
> >  	gint profile;
> >  	guint nal_size;
> >  	guint num_sps, num_pps, i;
> > @@ -2436,7 +2437,6 @@ static void * bcmdec_process_get_rbuf(void *ctx)
> >  
> >  		while (bcmdec->streaming && get_buf_start)
> >  		{
> > -			//GST_DEBUG_OBJECT(bcmdec, "process get rbuf start....");
> >  			gstbuf = NULL;
> >  
> >  			if (!bcmdec->recv_thread && !bcmdec->streaming) {
> > @@ -2446,9 +2446,8 @@ static void * bcmdec_process_get_rbuf(void *ctx)
> >  				break;
> >  			}
> >  
> > -			// If we have enough buffers from the renderer then don't get any more
> >  			if(bcmdec->gst_padbuf_que_cnt >= GST_RENDERER_BUF_POOL_SZ) {
> > -				usleep(100 * 1000);
> > +			  usleep(100 * 1000); /* we have enought buffers from the renderer */
> >  				GST_DEBUG_OBJECT(bcmdec, "SLEEPING because we have enough buffers");
> >  				continue;
> >  			}
> > @@ -2467,13 +2466,10 @@ static void * bcmdec_process_get_rbuf(void *ctx)
> >  			bufSz = bcmdec->output_params.width * bcmdec->output_params.height * BUF_MULT;
> >  
> >  			GST_DEBUG_OBJECT(bcmdec, "process get rbuf gst_pad_alloc_buffer_and_set_caps ....");
> > -			ret = gst_pad_alloc_buffer_and_set_caps(bcmdec->srcpad, GST_BUFFER_OFFSET_NONE,
> > -								bufSz, GST_PAD_CAPS(bcmdec->srcpad), &gstbuf);
> > -			if (ret != GST_FLOW_OK) {
> > -				if (!bcmdec->silent)
> > -					GST_ERROR_OBJECT(bcmdec, "gst_pad_alloc_buffer_and_set_caps failed %d ",ret);
> > -				usleep(30 * 1000);
> > -				continue;
> > +			if (!bcmdec_get_buffer(bcmdec, bufSz, &gstbuf)) {
> > +			  GST_ERROR_OBJECT(bcmdec, "gst_pad_alloc_buffer_and_set_caps failed %d ",ret);
> > +			  usleep(30 * 1000);
> > +			  continue;
> >  			}
> >  
> >  			GST_DEBUG_OBJECT(bcmdec, "Got GST Buf RCnt:%d", bcmdec->gst_padbuf_que_cnt);
> > @@ -2501,9 +2497,6 @@ static gboolean bcmdec_start_get_rbuf_thread(GstBcmDec *bcmdec)
> >  	gint ret = 0;
> >  	pthread_attr_t thread_attr;
> >  
> > -// 	if (!bcmdec_alloc_mem_rbuf_que_pool(bcmdec))
> > -// 		GST_ERROR_OBJECT(bcmdec, "rend pool alloc failed/n");
> > -
> >  	bcmdec->gst_padbuf_que_hd = bcmdec->gst_padbuf_que_tl = NULL;
> >  
> >  	ret = sem_init(&bcmdec->rbuf_ins_event, 0, 0);
> > @@ -2658,18 +2651,14 @@ static GSTBUF_LIST *bcmdec_rem_padbuf(GstBcmDec *bcmdec)
> >   */
> >  static gboolean plugin_init(GstPlugin *bcmdec)
> >  {
> > -	//printf("BcmDec_init");
> > -
> >  	/*
> >  	 * debug category for fltering log messages
> > -	 *
> > -	 * exchange the string 'Template bcmdec' with your description
> >  	 */
> > -	GST_DEBUG_CATEGORY_INIT(gst_bcmdec_debug, "bcmdec", 0, "Broadcom video decoder");
> > +	GST_DEBUG_CATEGORY_INIT(gst_bcm_dec_debug, "bcmdec", 0, "Broadcom video decoder");
> >  
> > -	return gst_element_register(bcmdec, "bcmdec", GST_BCMDEC_RANK, GST_TYPE_BCMDEC);
> > +	return gst_element_register(bcmdec, "bcmdec", GST_BCM_DEC_RANK, GST_TYPE_BCM_DEC);
> >  }
> >  
> >  /* gstreamer looks for this structure to register bcmdec */
> > -GST_PLUGIN_DEFINE(GST_VERSION_MAJOR, GST_VERSION_MINOR, "bcmdec", "Video decoder", plugin_init, VERSION, "LGPL", "bcmdec", "http://broadcom.com/")
> > +GST_PLUGIN_DEFINE(GST_VERSION_MAJOR, GST_VERSION_MINOR, bcmdec, "Video decoder", plugin_init, VERSION, "LGPL", "bcmdec", "http://broadcom.com/")
> >  
> > diff --git a/filters/gst/gst-plugin/src/gstbcmdec.h b/filters/gst/gst-plugin/src/gstbcmdec.h
> > index 6e5b100..5c02c8a 100644
> > --- a/filters/gst/gst-plugin/src/gstbcmdec.h
> > +++ b/filters/gst/gst-plugin/src/gstbcmdec.h
> > @@ -23,11 +23,11 @@
> >   * along with this library.  If not, see <http://www.gnu.org/licenses/>.
> >   *
> >   *******************************************************************/
> > -#ifndef __GST_BCMDEC_H__
> > -#define __GST_BCMDEC_H__
> > +#ifndef __GST_BCM_DEC_H__
> > +#define __GST_BCM_DEC_H__
> >  
> >  
> > -#define	GST_BCMDEC_RANK	0xffff
> > +#define	GST_BCM_DEC_RANK	0xffff
> >  
> >  #define CLOCK_BASE 9LL
> >  #define CLOC_FREQ_CLOC_BASE * 10000
> > @@ -127,16 +127,16 @@ typedef struct {
> >  
> >  G_BEGIN_DECLS
> >  
> > -#define GST_TYPE_BCMDEC \
> > -  (gst_bcmdec_get_type())
> > -#define GST_BCMDEC(obj) \
> > -  (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_BCMDEC,GstBcmDec))
> > -#define GST_BCMDEC_CLASS(klass) \
> > -  (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_BCMDEC,GstBcmDecClass))
> > -#define GST_IS_BCMDEC(obj) \
> > -  (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_BCMDEC))
> > -#define GST_IS_BCMDEC_CLASS(klass) \
> > -  (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_BCMDEC))
> > +#define GST_TYPE_BCM_DEC \
> > +  (gst_bcm_dec_get_type())
> > +#define GST_BCM_DEC(obj) \
> > +  (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_BCM_DEC,GstBcmDec))
> > +#define GST_BCM_DEC_CLASS(klass) \
> > +  (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_BCM_DEC,GstBcmDecClass))
> > +#define GST_IS_BCM_DEC(obj) \
> > +  (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_BCM_DEC))
> > +#define GST_IS_BCM_DEC_CLASS(klass) \
> > +  (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_BCM_DEC))
> >  
> >  typedef struct _GstBcmDec      GstBcmDec;
> >  typedef struct _GstBcmDecClass GstBcmDecClass;
> > @@ -188,7 +188,7 @@ struct _GstBcmDec
> >  
> >  	gboolean flushing;
> >  	sem_t push_stop_event;
> > -    sem_t push_start_event;
> > +  sem_t push_start_event;
> >  	sem_t recv_stop_event;
> >  	guint ses_nbr;
> >  	gboolean insert_pps;
> > @@ -233,49 +233,50 @@ struct _GstBcmDecClass
> >    GstElementClass parent_class;
> >  };
> >  
> > -GType gst_bcmdec_get_type (void);
> > +GType gst_bcm_dec_get_type (void);
> >  
> >  static void
> > -gst_bcmdec_base_init (gpointer gclass);
> > +gst_bcm_dec_base_init (gpointer gclass);
> >  
> >  static void
> > -gst_bcmdec_class_init(GstBcmDecClass * klass);
> > +gst_bcm_dec_class_init(GstBcmDecClass * klass);
> >  
> >  static void
> > -gst_bcmdec_init(GstBcmDec * bcmdec,
> > -				GstBcmDecClass * gclass);
> > +gst_bcm_dec_init(GstBcmDec * bcmdec);
> > +
> >  
> >  static void
> > -gst_bcmdec_finalize(GObject * object);
> > +gst_bcm_dec_finalize(GObject * object);
> >  
> >  static GstFlowReturn
> > -gst_bcmdec_chain(GstPad * pad,
> > +gst_bcm_dec_chain(GstPad * pad,
> > +		 GstObject * parent,
> >  				 GstBuffer * buffer);
> >  
> >  static GstStateChangeReturn
> > -gst_bcmdec_change_state(GstElement * element,
> > +gst_bcm_dec_change_state(GstElement * element,
> >  						GstStateChange transition);
> >  
> >  static gboolean
> > -gst_bcmdec_sink_set_caps(GstPad * pad,
> > +gst_bcm_dec_sink_set_caps(GstPad * pad,
> >  						 GstCaps * caps);
> >  
> > -static GstCaps *gst_bcmdec_getcaps (GstPad * pad);
> > -
> >  static gboolean
> > -gst_bcmdec_src_event(GstPad * pad,
> > +gst_bcm_dec_src_event(GstPad * pad,
> > +		     GstObject * parent,
> >  					 GstEvent * event);
> >  
> >  static gboolean
> > -gst_bcmdec_sink_event(GstPad * pad,
> > +gst_bcm_dec_sink_event(GstPad * pad,
> > +		      GstObject * parent,
> >  					  GstEvent * event);
> >  
> >  static void
> > -gst_bcmdec_set_property (GObject * object, guint prop_id,
> > +gst_bcm_dec_set_property (GObject * object, guint prop_id,
> >  						const GValue * value, GParamSpec * pspec);
> >  
> >  static void
> > -gst_bcmdec_get_property (GObject * object, guint prop_id,
> > +gst_bcm_dec_get_property (GObject * object, guint prop_id,
> >  						GValue * value, GParamSpec * pspec);
> >  
> >  static gboolean
> > @@ -285,7 +286,7 @@ static void
> >  bcmdec_reset(GstBcmDec * bcmdec);
> >  
> >  static gboolean
> > -bcmdec_get_buffer(GstBcmDec * bcmdec, GstBuffer ** obuf);
> > +bcmdec_get_buffer(GstBcmDec * bcmdec, gint size, GstBuffer ** obuf);
> >  
> >  static void*
> >  bcmdec_process_output(void * ctx);
> > @@ -300,7 +301,7 @@ static gboolean
> >  bcmdec_format_change(GstBcmDec * filter,BC_PIC_INFO_BLOCK* pic_info);
> >  
> >  static BC_STATUS
> > -gst_bcmdec_cleanup(GstBcmDec *filter);
> > +gst_bcm_dec_cleanup(GstBcmDec *filter);
> >  
> >  static gboolean
> >  bcmdec_start_recv_thread(GstBcmDec * bcmdec);
> > @@ -339,7 +340,7 @@ bcmdec_start_push_thread(GstBcmDec * bcmdec);
> >  //bcmdec_insert_startcode(GstBcmDec* filter,GstBuffer* gstbuf, guint8* dest_buf,guint32* sz);
> >  
> >  static BC_STATUS
> > -bcmdec_insert_sps_pps(GstBcmDec* filter,GstBuffer* gstbuf);
> > +bcmdec_insert_sps_pps(GstBcmDec* filter, GstMapInfo* gstbuf);
> >  
> >  static void
> >  bcmdec_set_aspect_ratio(GstBcmDec *filter,BC_PIC_INFO_BLOCK* pic_info);
> > @@ -383,7 +384,6 @@ bcmdec_ins_padbuf(GstBcmDec *filter,GSTBUF_LIST	*gst_queue_element);
> >  static GSTBUF_LIST*
> >  bcmdec_rem_padbuf(GstBcmDec *filter);
> >  
> > -
> >  G_END_DECLS
> >  
> > -#endif /* __GST_BCMDEC_H__ */
> > +#endif /* __GST_BCM_DEC_H__ */
> > -- 
> > 1.7.10.4
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/filters/gst/gst-plugin/configure.ac b/filters/gst/gst-plugin/configure.ac
index 99b3713..a3c6467 100644
--- a/filters/gst/gst-plugin/configure.ac
+++ b/filters/gst/gst-plugin/configure.ac
@@ -1,9 +1,9 @@ 
 AC_INIT
 
 dnl versions of gstreamer and plugins-base
-GST_MAJORMINOR=0.10
-GST_REQUIRED=0.10.0
-GSTPB_REQUIRED=0.10.0
+GST_MAJORMINOR=1.0
+GST_REQUIRED=1.0
+GSTPB_REQUIRED=1.0
 
 dnl fill in your package name and version here
 dnl the fourth (nano) number should be 0 for a release, 1 for CVS,
@@ -56,7 +56,7 @@  dnl And we can also ask for the right version of gstreamer
 
 PKG_CHECK_MODULES(GST, \
   gstreamer-$GST_MAJORMINOR >= $GST_REQUIRED
-  gstreamer-video-0.10,
+  gstreamer-video-1.0,
   HAVE_GST=yes,HAVE_GST=no)
 
 dnl Give error and exit if we don't have gstreamer
diff --git a/filters/gst/gst-plugin/src/gstbcmdec.c b/filters/gst/gst-plugin/src/gstbcmdec.c
index ed01c14..a51bd59 100644
--- a/filters/gst/gst-plugin/src/gstbcmdec.c
+++ b/filters/gst/gst-plugin/src/gstbcmdec.c
@@ -8,6 +8,7 @@ 
  *  AU
  *
  *  HISTORY:
+ *     Updated for 1.0 by Guido Guenther <agx@sigxcpu.org>
  *
  *******************************************************************
  *
@@ -40,6 +41,7 @@ 
 #include <glib.h>
 #include <gst/base/gstadapter.h>
 #include <gst/video/video.h>
+#include <gst/video/gstvideopool.h>
 
 #ifdef HAVE_CONFIG_H
 #include <config.h>
@@ -51,8 +53,8 @@ 
 #include "parse.h"
 #include "gstbcmdec.h"
 
-GST_DEBUG_CATEGORY_STATIC (gst_bcmdec_debug);
-#define GST_CAT_DEFAULT gst_bcmdec_debug
+GST_DEBUG_CATEGORY_STATIC (gst_bcm_dec_debug);
+#define GST_CAT_DEFAULT gst_bcm_dec_debug
 
 //#define YV12__
 
@@ -64,16 +66,18 @@  static GstFlowReturn bcmdec_send_buff_detect_error(GstBcmDec *bcmdec, GstBuffer
 						   guint8 flags)
 {
 	BC_STATUS sts = BC_STS_SUCCESS;
+	GstMapInfo info;
 
 	GST_DEBUG_OBJECT(bcmdec, "Attempting to Send Buffer");
 
 	sts = decif_send_buffer(&bcmdec->decif, pbuffer, size, tCurrent, flags);
 
 	if (sts != BC_STS_SUCCESS) {
+	        gst_buffer_map(buf, &info, GST_MAP_READ);
 		GST_ERROR_OBJECT(bcmdec, "proc input failed sts = %d", sts);
 		GST_ERROR_OBJECT(bcmdec, "Chain: timeStamp = %llu size = %d data = %p",
-				 GST_BUFFER_TIMESTAMP(buf), GST_BUFFER_SIZE(buf),
-				 GST_BUFFER_DATA (buf));
+				 GST_BUFFER_DTS(buf), info.size, info.data);
+		gst_buffer_unmap(buf, &info);
 		return GST_FLOW_ERROR;
 	}
 
@@ -92,7 +96,7 @@  enum {
 };
 
 
-GLB_INST_STS *g_inst_sts = NULL;
+static GLB_INST_STS *g_inst_sts = NULL;
 
 /*
  * the capabilities of the inputs and outputs.
@@ -111,35 +115,29 @@  GstStaticPadTemplate sink_factory_bcm70012 = GST_STATIC_PAD_TEMPLATE("sink", GST
 
 #ifdef YV12__
 static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE("src", GST_PAD_SRC, GST_PAD_ALWAYS,
-		GST_STATIC_CAPS("video/x-raw-yuv, " "format = (fourcc) { YV12 }, " "width = (int) [ 1, MAX ], "
+		GST_STATIC_CAPS("video/x-raw, " "format = (string) { YV12 }, " "width = (int) [ 1, MAX ], "
 				"height = (int) [ 1, MAX ], " "framerate = (fraction) [ 0/1, 2147483647/1 ]"));
 #define BUF_MULT (12 / 8)
 #define BUF_MODE MODE420
 #else
 static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE("src", GST_PAD_SRC, GST_PAD_ALWAYS,
-		GST_STATIC_CAPS("video/x-raw-yuv, " "format = (fourcc) { YUY2 } , " "framerate = (fraction) [0,MAX], "
-				"width = (int) [1,MAX], " "height = (int) [1,MAX]; " "video/x-raw-yuv, "
-				"format = (fourcc) { UYVY } , " "framerate = (fraction) [0,MAX], " "width = (int) [1,MAX], "
+		GST_STATIC_CAPS("video/x-raw, " "format = (string) { YUY2 } , " "framerate = (fraction) [0,MAX], "
+				"width = (int) [1,MAX], " "height = (int) [1,MAX]; " "video/x-raw, "
+				"format = (string) { UYVY } , " "framerate = (fraction) [0,MAX], " "width = (int) [1,MAX], "
 				"height = (int) [1,MAX]; "));
 #define BUF_MULT (16 / 8)
 #define BUF_MODE MODE422_YUY2
 #endif
 
-GST_BOILERPLATE(GstBcmDec, gst_bcmdec, GstElement, GST_TYPE_ELEMENT);
+G_DEFINE_TYPE(GstBcmDec, gst_bcm_dec, GST_TYPE_ELEMENT);
 
 /* GObject vmethod implementations */
 
-static void gst_bcmdec_base_init(gpointer gclass)
+static void gst_bcm_dec_base_init(gpointer gclass)
 {
-	static GstElementDetails element_details;
 	BC_HW_CAPS hwCaps;
 
-	GST_DEBUG_OBJECT(gclass, "gst_bcmdec_base_init");
-
-	element_details.klass = (gchar *)"Codec/Decoder/Video";
-	element_details.longname = (gchar *)"Generic Video Decoder";
-	element_details.description = (gchar *)"Decodes various Video Formats using CrystalHD Decoders";
-	element_details.author = (gchar *)"Broadcom Corp.";
+	GST_DEBUG_OBJECT(gclass, "gst_bcm_dec_base_init");
 
 	GstElementClass *element_class = GST_ELEMENT_CLASS(gclass);
 
@@ -153,11 +151,15 @@  static void gst_bcmdec_base_init(gpointer gclass)
 	}
 	else
 		gst_element_class_add_pad_template(element_class, gst_static_pad_template_get (&sink_factory_bcm70012));
-	gst_element_class_set_details(element_class, &element_details);
+	gst_element_class_set_metadata(element_class,
+				      "Codec/Decoder/Video",
+				      "Generic Video Decoder",
+				      "Decodes various Video Formats using CrystalHD Decoders",
+				      "Broadcom Corp.");
 }
 
 /* initialize the bcmdec's class */
-static void gst_bcmdec_class_init(GstBcmDecClass *klass)
+static void gst_bcm_dec_class_init(GstBcmDecClass *klass)
 {
 	GObjectClass *gobject_class;
 	GstElementClass *gstelement_class;
@@ -165,13 +167,15 @@  static void gst_bcmdec_class_init(GstBcmDecClass *klass)
 	gobject_class = (GObjectClass *)klass;
 	gstelement_class = (GstElementClass *)klass;
 
-	GST_DEBUG_OBJECT(klass, "gst_bcmdec_class_init");
+	GST_DEBUG_OBJECT(klass, "gst_bcm_dec_class_init");
+
+	gst_bcm_dec_base_init(klass);
 
-	gstelement_class->change_state = gst_bcmdec_change_state;
+	gstelement_class->change_state = gst_bcm_dec_change_state;
 
-	gobject_class->set_property = gst_bcmdec_set_property;
-	gobject_class->get_property = gst_bcmdec_get_property;
-	gobject_class->finalize     = gst_bcmdec_finalize;
+	gobject_class->set_property = gst_bcm_dec_set_property;
+	gobject_class->get_property = gst_bcm_dec_get_property;
+	gobject_class->finalize     = gst_bcm_dec_finalize;
 
 	g_object_class_install_property(gobject_class, PROP_SILENT,
 					g_param_spec_boolean("silent", "Silent",
@@ -185,14 +189,14 @@  static void gst_bcmdec_class_init(GstBcmDecClass *klass)
  * set pad calback functions
  * initialize instance structure
  */
-static void gst_bcmdec_init(GstBcmDec *bcmdec, GstBcmDecClass *gclass)
+static void gst_bcm_dec_init(GstBcmDec *bcmdec)
 {
 	pid_t pid;
 	BC_STATUS sts = BC_STS_SUCCESS;
 	int shmid = 0;
 	BC_HW_CAPS hwCaps;
 
-	GST_DEBUG_OBJECT(bcmdec, "gst_bcmdec_init");
+	GST_DEBUG_OBJECT(bcmdec, "gst_bcm_dec_init");
 
 	bcmdec_reset(bcmdec);
 
@@ -204,17 +208,16 @@  static void gst_bcmdec_init(GstBcmDec *bcmdec, GstBcmDecClass *gclass)
 	else
 		bcmdec->sinkpad = gst_pad_new_from_static_template(&sink_factory_bcm70012, "sink");
 
-	gst_pad_set_event_function(bcmdec->sinkpad, GST_DEBUG_FUNCPTR(gst_bcmdec_sink_event));
+	gst_pad_set_event_function(bcmdec->sinkpad,
+				   GST_DEBUG_FUNCPTR(gst_bcm_dec_sink_event));
 
-	gst_pad_set_setcaps_function(bcmdec->sinkpad, GST_DEBUG_FUNCPTR(gst_bcmdec_sink_set_caps));
-	gst_pad_set_getcaps_function(bcmdec->sinkpad, GST_DEBUG_FUNCPTR(gst_bcmdec_getcaps));
-	gst_pad_set_chain_function(bcmdec->sinkpad, GST_DEBUG_FUNCPTR(gst_bcmdec_chain));
+	gst_pad_set_chain_function(bcmdec->sinkpad,
+				   GST_DEBUG_FUNCPTR(gst_bcm_dec_chain));
 
 	bcmdec->srcpad = gst_pad_new_from_static_template (&src_factory, "src");
 
-	gst_pad_set_getcaps_function(bcmdec->srcpad, GST_DEBUG_FUNCPTR(gst_bcmdec_getcaps));
-
-	gst_pad_set_event_function(bcmdec->srcpad, GST_DEBUG_FUNCPTR(gst_bcmdec_src_event));
+	gst_pad_set_event_function(bcmdec->srcpad,
+				   GST_DEBUG_FUNCPTR(gst_bcm_dec_src_event));
 
 	gst_pad_use_fixed_caps(bcmdec->srcpad);
 	bcmdec_negotiate_format(bcmdec);
@@ -223,7 +226,7 @@  static void gst_bcmdec_init(GstBcmDec *bcmdec, GstBcmDecClass *gclass)
 	gst_element_add_pad(GST_ELEMENT(bcmdec), bcmdec->srcpad);
 	bcmdec->silent = FALSE;
 	pid = getpid();
-	GST_DEBUG_OBJECT(bcmdec, "gst_bcmdec_init _-- PID = %x",pid);
+	GST_DEBUG_OBJECT(bcmdec, "gst_bcm_dec_init _-- PID = %x",pid);
 
 	sts = bcmdec_create_shmem(bcmdec, &shmid);
 
@@ -231,25 +234,25 @@  static void gst_bcmdec_init(GstBcmDec *bcmdec, GstBcmDecClass *gclass)
 }
 
 /* plugin close function*/
-static void gst_bcmdec_finalize(GObject *object)
+static void gst_bcm_dec_finalize(GObject *object)
 {
-	GstBcmDec *bcmdec = GST_BCMDEC(object);
+	GstBcmDec *bcmdec = GST_BCM_DEC(object);
 
 	bcmdec_del_shmem(bcmdec);
-	/*gst_bcmdec_cleanup(bcmdec);*/
-	GST_DEBUG_OBJECT(bcmdec, "gst_bcmdec_finalize");
-	G_OBJECT_CLASS(parent_class)->finalize(object);
+	/*gst_bcm_dec_cleanup(bcmdec);*/
+	GST_DEBUG_OBJECT(bcmdec, "gst_bcm_dec_finalize");
+	G_OBJECT_CLASS(gst_bcm_dec_parent_class)->finalize(object);
 }
 
-static void gst_bcmdec_set_property(GObject *object, guint prop_id,
+static void gst_bcm_dec_set_property(GObject *object, guint prop_id,
 				    const GValue *value, GParamSpec *pspec)
 {
-	GstBcmDec *bcmdec = GST_BCMDEC(object);
+	GstBcmDec *bcmdec = GST_BCM_DEC(object);
 
 	switch (prop_id) {
 	case PROP_SILENT:
 		bcmdec->silent = g_value_get_boolean (value);
-		GST_DEBUG_OBJECT(bcmdec, "gst_bcmdec_set_property PROP_SILENT");
+		GST_DEBUG_OBJECT(bcmdec, "gst_bcm_dec_set_property PROP_SILENT");
 		break;
 	default:
 		G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
@@ -257,18 +260,18 @@  static void gst_bcmdec_set_property(GObject *object, guint prop_id,
 	}
 
 	if (!bcmdec->silent)
-		GST_DEBUG_OBJECT(bcmdec, "gst_bcmdec_set_property");
+		GST_DEBUG_OBJECT(bcmdec, "gst_bcm_dec_set_property");
 }
 
-static void gst_bcmdec_get_property(GObject *object, guint prop_id,
+static void gst_bcm_dec_get_property(GObject *object, guint prop_id,
 				    GValue *value, GParamSpec *pspec)
 {
-	GstBcmDec *bcmdec = GST_BCMDEC(object);
+	GstBcmDec *bcmdec = GST_BCM_DEC(object);
 
 	switch (prop_id) {
 	case PROP_SILENT:
 		g_value_set_boolean (value, bcmdec->silent);
-		GST_DEBUG_OBJECT(bcmdec, "gst_bcmdec_get_property PROP_SILENT");
+		GST_DEBUG_OBJECT(bcmdec, "gst_bcm_dec_get_property PROP_SILENT");
 		break;
 	default:
 		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -276,27 +279,33 @@  static void gst_bcmdec_get_property(GObject *object, guint prop_id,
 	}
 
 	if (!bcmdec->silent)
-		GST_DEBUG_OBJECT(bcmdec, "gst_bcmdec_get_property");
+		GST_DEBUG_OBJECT(bcmdec, "gst_bcm_dec_get_property");
 }
 
 /* GstElement vmethod implementations */
-static gboolean gst_bcmdec_sink_event(GstPad* pad, GstEvent* event)
+static gboolean gst_bcm_dec_sink_event(GstPad* pad,
+				      GstObject* parent,
+				      GstEvent* event)
 {
 	GstBcmDec *bcmdec;
 	BC_STATUS sts = BC_STS_SUCCESS;
-	bcmdec = GST_BCMDEC(gst_pad_get_parent(pad));
+	bcmdec = GST_BCM_DEC(gst_pad_get_parent(pad));
 
 	gboolean result = TRUE;
 
 	switch (GST_EVENT_TYPE(event)) {
-	case GST_EVENT_NEWSEGMENT:
-		GstFormat newsegment_format;
-		gint64 newsegment_start;
+	case GST_EVENT_CAPS:
+                 GstCaps *caps;
+		 gst_event_parse_caps (event, &caps);
+		 result = gst_bcm_dec_sink_set_caps (pad, caps);
+		 break;
+
+	case GST_EVENT_SEGMENT:
+	        const GstSegment *newsegment;
 
-		gst_event_parse_new_segment(event, NULL, NULL, &newsegment_format,
-					    &newsegment_start, NULL, NULL);
+		gst_event_parse_segment(event, &newsegment);
 
-		bcmdec->base_clock_time = newsegment_start;
+		bcmdec->base_clock_time = newsegment->start;
 		bcmdec->cur_stream_time = 0;
 
 		if (!bcmdec->silent)
@@ -356,30 +365,24 @@  static gboolean gst_bcmdec_sink_event(GstPad* pad, GstEvent* event)
 
 	gst_object_unref(bcmdec);
 	if (!bcmdec->silent)
-		GST_DEBUG_OBJECT(bcmdec, "gst_bcmdec_sink_event %u", GST_EVENT_TYPE(event));
+		GST_DEBUG_OBJECT(bcmdec, "gst_bcm_dec_sink_event %u", GST_EVENT_TYPE(event));
 	return result;
 }
 
-static GstCaps *gst_bcmdec_getcaps (GstPad * pad)
-{
-	return gst_caps_copy (gst_pad_get_pad_template_caps (pad));
-}
-
 /* this function handles the link with other elements */
-static gboolean gst_bcmdec_sink_set_caps(GstPad *pad, GstCaps *caps)
+static gboolean gst_bcm_dec_sink_set_caps(GstPad *pad, GstCaps *caps)
 {
 	GstBcmDec *bcmdec;
-	bcmdec = GST_BCMDEC(gst_pad_get_parent(pad));
+	bcmdec = GST_BCM_DEC(gst_pad_get_parent(pad));
 	GstStructure *structure;
+	GstMapInfo info;
 	GstCaps *intersection;
 	const gchar *mime;
 	guint num = 0;
 	guint den = 0;
 	const GValue *g_value;
 	int version = 0;
-	GstBuffer *buffer;
-	guint8 *data;
-	guint size;
+	GstBuffer *buffer = NULL;
 	guint index;
 
 	GST_DEBUG_OBJECT (pad, "setcaps called");
@@ -484,53 +487,66 @@  static gboolean gst_bcmdec_sink_set_caps(GstPad *pad, GstCaps *caps)
 				GST_DEBUG_OBJECT(bcmdec, "InFmt H.264 (AVC1)");
 
 				buffer = gst_value_get_buffer(g_value);
-				data = GST_BUFFER_DATA(buffer);
-				size = GST_BUFFER_SIZE(buffer);
-
-				GST_DEBUG_OBJECT(bcmdec, "codec_data size = %d", size);
+				if(!gst_buffer_map(buffer,
+						   &info,
+						   GST_MAP_READ))
+				   goto map_error;
+				GST_DEBUG_OBJECT(bcmdec,
+						 "codec_data size = %d",
+						 info.size);
 
 				/* parse the avcC data */
-				if (size < 7) {
-					GST_ERROR_OBJECT(bcmdec, "avcC size %u < 7", size);
-					goto avcc_error;
+				if (info.size < 7) {
+					GST_ERROR_OBJECT(bcmdec,
+							 "avcC size %u < 7",
+							 info.size);
+					goto out;
 				}
 				/* parse the version, this must be 1 */
-				if (data[0] != 1)
-					goto wrong_version;
+				if (info.data[0] != 1) {
+				  GST_ERROR_OBJECT(bcmdec, "wrong avcC version");
+				  goto out;
+				}
 
 				if (bcmdec->codec_params.sps_pps_buf == NULL)
-					bcmdec->codec_params.sps_pps_buf = (guint8 *)malloc(size * 2);
-				if (bcmdec_insert_sps_pps(bcmdec, buffer) != BC_STS_SUCCESS) {
+					bcmdec->codec_params.sps_pps_buf = (guint8 *)malloc(info.size * 2);
+				if (bcmdec_insert_sps_pps(bcmdec, &info) != BC_STS_SUCCESS) {
 					bcmdec->codec_params.pps_size = 0;
 				}
 			} else if (!strcmp("video/x-wmv", mime)) {
-				buffer = gst_value_get_buffer(g_value);
-				data = GST_BUFFER_DATA(buffer);
-				size = GST_BUFFER_SIZE(buffer);
-
-				GST_DEBUG_OBJECT(bcmdec, "codec_data size = %d", size);
-				if (size == 4) {
+			        buffer = gst_value_get_buffer(g_value);
+				if(!gst_buffer_map(buffer,
+						   &info,
+						   GST_MAP_READ))
+				  goto map_error;
+
+				GST_DEBUG_OBJECT(bcmdec,
+						 "codec_data size = %d",
+						 info.size);
+				if (info.size == 4) {
 					// Simple or Main Profile
 					bcmdec->input_format = BC_MSUBTYPE_WMV3;
 					GST_DEBUG_OBJECT(bcmdec, "InFmt VC-1 (SP/MP)");
 					if (bcmdec->codec_params.sps_pps_buf == NULL)
 						bcmdec->codec_params.sps_pps_buf = (guint8 *)malloc(4);
-					memcpy(bcmdec->codec_params.sps_pps_buf, data, 4);
+					memcpy(bcmdec->codec_params.sps_pps_buf,
+					       info.data, 4);
 					bcmdec->codec_params.pps_size = 4;
 				} else {
 					bcmdec->input_format = BC_MSUBTYPE_VC1;
 					GST_DEBUG_OBJECT(bcmdec, "InFmt VC-1 (AP)");
-					for (index = 0; index < size; index++) {
-						data += index;
-						if (((size - index) >= 4) && (*data == 0x00) && (*(data + 1) == 0x00) &&
-							(*(data + 2) == 0x01) && (*(data + 3) == 0x0f)) {
+					for (index = 0; index < info.size;
+					     index++) {
+						info.data += index;
+						if (((info.size - index) >= 4) && (*info.data == 0x00) && (*(info.data + 1) == 0x00) &&
+							(*(info.data + 2) == 0x01) && (*(info.data + 3) == 0x0f)) {
 							GST_DEBUG_OBJECT(bcmdec, "VC1 Sequence Header Found for Adv Profile");
 
-							if ((size - index + 1) > MAX_ADV_PROF_SEQ_HDR_SZ)
+							if ((info.size - index + 1) > MAX_ADV_PROF_SEQ_HDR_SZ)
 								bcmdec->codec_params.pps_size = MAX_ADV_PROF_SEQ_HDR_SZ;
 							else
-								bcmdec->codec_params.pps_size = size - index + 1;
-							memcpy(bcmdec->codec_params.sps_pps_buf, data, bcmdec->codec_params.pps_size);
+								bcmdec->codec_params.pps_size = info.size - index + 1;
+							memcpy(bcmdec->codec_params.sps_pps_buf, info.data, bcmdec->codec_params.pps_size);
 							break;
 						}
 					}
@@ -546,16 +562,16 @@  static gboolean gst_bcmdec_sink_set_caps(GstPad *pad, GstCaps *caps)
 		} else {
 			// No Codec data. So try with FourCC for VC1/WMV9
 			if (!strcmp("video/x-wmv", mime)) {
-				guint32 fourcc;
-				if (gst_structure_get_fourcc (structure, "format", &fourcc)) {
-					if ((fourcc == GST_MAKE_FOURCC ('W', 'V', 'C', '1')) ||
-						(fourcc == GST_MAKE_FOURCC ('W', 'M', 'V', 'A'))) {
+				if (gst_structure_has_field (structure, "format")) {
+				  const char* fourcc = gst_structure_get_string(structure, "format");
+
+				  if (!g_strcmp0(fourcc, "WVC1") ||
+				      !g_strcmp0(fourcc, "WMVA")) {
 						bcmdec->input_format = BC_MSUBTYPE_VC1;
 						GST_DEBUG_OBJECT(bcmdec, "InFmt VC-1 (AP)");
 					} else {
 						GST_DEBUG_OBJECT(bcmdec, "no codec_data. Don't know how to handle");
-						gst_object_unref(bcmdec);
-						return FALSE;
+						goto out;
 					}
 				}
 			}
@@ -570,8 +586,7 @@  static gboolean gst_bcmdec_sink_set_caps(GstPad *pad, GstCaps *caps)
 			}
 			else {
 				GST_DEBUG_OBJECT(bcmdec, "no codec_data. Don't know how to handle");
-				gst_object_unref(bcmdec);
-				return FALSE;
+				goto out;
 			}
 		}
 	}
@@ -581,54 +596,40 @@  static gboolean gst_bcmdec_sink_set_caps(GstPad *pad, GstCaps *caps)
 		bcmdec_process_play(bcmdec);
 	}
 
+        gst_buffer_unmap(buffer, &info);
 	gst_object_unref(bcmdec);
 
 	return TRUE;
 
 	/* ERRORS */
-avcc_error:
-	{
-		gst_object_unref(bcmdec);
-		return FALSE;
-	}
-
-wrong_version:
-	{
-		GST_ERROR_OBJECT(bcmdec, "wrong avcC version");
-		gst_object_unref(bcmdec);
-		return FALSE;
-	}
-}
-
-void bcmdec_msleep(gint msec)
-{
-	gint cnt = msec;
-
-	while (cnt) {
-		usleep(1000);
-		cnt--;
-	}
+out:
+	if (buffer)
+	  gst_buffer_unmap(buffer, &info);
+map_error:
+	gst_object_unref(bcmdec);
+	return FALSE;
 }
 
 /*
  * chain function
  * this function does the actual processing
  */
-static GstFlowReturn gst_bcmdec_chain(GstPad *pad, GstBuffer *buf)
+static GstFlowReturn gst_bcm_dec_chain(GstPad *pad,
+				      GstObject *parent,
+				      GstBuffer *buf)
 {
 	GstBcmDec *bcmdec;
-//	BC_STATUS sts = BC_STS_SUCCESS;
+	GstMapInfo info;
 	guint32 offset = 0;
 	GstClockTime tCurrent = 0;
 	guint8 *pbuffer;
 	guint32 size = 0;
-//	guint32 vc1_buff_sz = 0;
-
+	GstFlowReturn ret;
 
 #ifdef FILE_DUMP__
 	guint32 bytes_written =0;
 #endif
-	bcmdec = GST_BCMDEC (GST_OBJECT_PARENT (pad));
+	bcmdec = GST_BCM_DEC (GST_OBJECT_PARENT (pad));
 
 #ifdef FILE_DUMP__
 	if (bcmdec->fhnd == NULL)
@@ -637,8 +638,8 @@  static GstFlowReturn gst_bcmdec_chain(GstPad *pad, GstBuffer *buf)
 
 	if (bcmdec->flushing) {
 		GST_DEBUG_OBJECT(bcmdec, "input while flushing");
-		gst_buffer_unref(buf);
-		return GST_FLOW_OK;
+		ret = GST_FLOW_OK;
+		goto out;
 	}
 
 	if (GST_CLOCK_TIME_NONE != GST_BUFFER_TIMESTAMP(buf)) {
@@ -654,32 +655,44 @@  static GstFlowReturn gst_bcmdec_chain(GstPad *pad, GstBuffer *buf)
 		bcmdec_process_play(bcmdec);
 	} else if (!bcmdec->streaming) {
 		GST_DEBUG_OBJECT(bcmdec, "input while streaming is false");
-		gst_buffer_unref(buf);
-		return GST_FLOW_WRONG_STATE;
+		ret = GST_FLOW_FLUSHING;
+		goto out;
 	}
 
-	pbuffer = GST_BUFFER_DATA (buf);
-	size = GST_BUFFER_SIZE(buf);
+	if (!gst_buffer_map(buf, &info, GST_MAP_READ)) {
+	  ret = GST_FLOW_ERROR;
+	  goto out;
+	}
+	pbuffer = info.data;
+	size = info.size;
 
+	/* FIXME: better send mapinfo? */
 	if (GST_FLOW_OK != bcmdec_send_buff_detect_error(bcmdec, buf, pbuffer, size, offset, tCurrent, bcmdec->proc_in_flags)) {
-		gst_buffer_unref(buf);
-		return GST_FLOW_ERROR;
+		ret = GST_FLOW_ERROR;
+		goto unmapout;
 	}
 
 #ifdef FILE_DUMP__
 	bytes_written = fwrite(GST_BUFFER_DATA(buf), sizeof(unsigned char), GST_BUFFER_SIZE(buf), bcmdec->fhnd);
 #endif
 
+	ret = GST_FLOW_OK;
+
+unmapout:
+	gst_buffer_unmap(buf, &info);
+out:
 	gst_buffer_unref(buf);
-	return GST_FLOW_OK;
+	return ret;
 }
 
-static gboolean gst_bcmdec_src_event(GstPad *pad, GstEvent *event)
+static gboolean gst_bcm_dec_src_event(GstPad *pad,
+				     GstObject *parent,
+				     GstEvent *event)
 {
 	gboolean result;
 	GstBcmDec *bcmdec;
 
-	bcmdec = GST_BCMDEC(GST_OBJECT_PARENT(pad));
+	bcmdec = GST_BCM_DEC(GST_OBJECT_PARENT(pad));
 
 	result = gst_pad_push_event(bcmdec->sinkpad, event);
 
@@ -695,6 +708,7 @@  static gboolean bcmdec_negotiate_format(GstBcmDec *bcmdec)
 	GstStructure *s1;
 	const GValue *framerate_value;
 	GstVideoFormat vidFmt;
+	GstVideoInfo info;
 
 #ifdef YV12__
 	vidFmt = GST_VIDEO_FORMAT_YV12;
@@ -703,21 +717,21 @@  static gboolean bcmdec_negotiate_format(GstBcmDec *bcmdec)
 #endif
 	GST_DEBUG_OBJECT(bcmdec, "framerate = %f", bcmdec->output_params.framerate);
 
-	if(bcmdec->interlace) {
-		caps = gst_video_format_new_caps_interlaced(vidFmt, bcmdec->output_params.width,
-													bcmdec->output_params.height, num, den,
-													bcmdec->output_params.aspectratio_x,
-													bcmdec->output_params.aspectratio_y,
-													TRUE);
-	} else {
-		caps = gst_video_format_new_caps(vidFmt, bcmdec->output_params.width,
-													bcmdec->output_params.height, num, den,
-													bcmdec->output_params.aspectratio_x,
-													bcmdec->output_params.aspectratio_y);
-	}
-
+	gst_video_info_init (&info);
+	gst_video_info_set_format (&info,
+				   vidFmt,
+				   bcmdec->output_params.width,
+				   bcmdec->output_params.height);
+	info.fps_n = num;
+	info.fps_d = den;
+	info.par_n = bcmdec->output_params.aspectratio_x;
+	info.par_d = bcmdec->output_params.aspectratio_y;
+	info.interlace_mode = bcmdec->interlace ?
+	  GST_VIDEO_INTERLACE_MODE_INTERLEAVED :
+	  GST_VIDEO_INTERLACE_MODE_PROGRESSIVE;
+	  caps = gst_video_info_to_caps (&info);
 	result = gst_pad_set_caps(bcmdec->srcpad, caps);
-	GST_DEBUG_OBJECT(bcmdec, "gst_bcmdec_negotiate_format %d", result);
+	GST_DEBUG_OBJECT(bcmdec, "gst_bcm_dec_negotiate_format %d", result);
 
 	if (bcmdec->output_params.clr_space == MODE422_YUY2) {
 		bcmdec->output_params.y_size = bcmdec->output_params.width * bcmdec->output_params.height * BUF_MULT;
@@ -842,10 +856,10 @@  static gboolean bcmdec_process_play(GstBcmDec *bcmdec)
 	return TRUE;
 }
 
-static GstStateChangeReturn gst_bcmdec_change_state(GstElement *element, GstStateChange transition)
+static GstStateChangeReturn gst_bcm_dec_change_state(GstElement *element, GstStateChange transition)
 {
 	GstStateChangeReturn result = GST_STATE_CHANGE_SUCCESS;
-	GstBcmDec *bcmdec = GST_BCMDEC(element);
+	GstBcmDec *bcmdec = GST_BCM_DEC(element);
 	BC_STATUS sts = BC_STS_SUCCESS;
 	int ret = 0;
 
@@ -960,7 +974,7 @@  static GstStateChangeReturn gst_bcmdec_change_state(GstElement *element, GstStat
 		GST_DEBUG_OBJECT(bcmdec, "default %d", transition);
 		break;
 	}
-	result = GST_ELEMENT_CLASS(parent_class)->change_state(element, transition);
+	result = GST_ELEMENT_CLASS(gst_bcm_dec_parent_class)->change_state(element, transition);
 	if (result == GST_STATE_CHANGE_FAILURE) {
 		GST_ERROR_OBJECT(bcmdec, "parent class state change failed");
 		return result;
@@ -968,7 +982,7 @@  static GstStateChangeReturn gst_bcmdec_change_state(GstElement *element, GstStat
 
 	if(transition == GST_STATE_CHANGE_READY_TO_NULL) {
 		GST_DEBUG_OBJECT(bcmdec, "GST_STATE_CHANGE_READY_TO_NULL");
-		sts = gst_bcmdec_cleanup(bcmdec);
+		sts = gst_bcm_dec_cleanup(bcmdec);
 		if (sts == BC_STS_SUCCESS)
 			GST_DEBUG_OBJECT(bcmdec, "dev close success");
 		else
@@ -978,38 +992,26 @@  static GstStateChangeReturn gst_bcmdec_change_state(GstElement *element, GstStat
 	return result;
 }
 
-
-GstClockTime gst_get_current_timex (void)
-{
-	GTimeVal tv;
-
-	g_get_current_time(&tv);
-	return GST_TIMEVAL_TO_TIME(tv);
-}
-
-clock_t bcm_get_tick_count()
-{
-	tms tm;
-	return times(&tm);
-}
-
-static gboolean bcmdec_get_buffer(GstBcmDec *bcmdec, GstBuffer **obuf)
+static gboolean bcmdec_get_buffer(GstBcmDec *bcmdec,
+				  gint size,
+				  GstBuffer **obuf)
 {
 	GstFlowReturn ret;
-	GST_DEBUG_OBJECT(bcmdec, "gst_pad_alloc_buffer_and_set_caps ");
+	GST_DEBUG_OBJECT(bcmdec, "%s", __func__);
 
-	ret = gst_pad_alloc_buffer_and_set_caps(bcmdec->srcpad,
-						GST_BUFFER_OFFSET_NONE,
-						bcmdec->output_params.width * bcmdec->output_params.height * BUF_MULT,
-						GST_PAD_CAPS (bcmdec->srcpad), obuf);
-	if (ret != GST_FLOW_OK) {
+	*obuf = gst_buffer_new_allocate (NULL,
+					size,
+					NULL);
+
+	if (obuf == NULL) {
 		GST_ERROR_OBJECT(bcmdec, "gst_pad_alloc_buffer_and_set_caps failed %d ",ret);
 		return FALSE;
 	}
 
+#if 0
 	if (((uintptr_t)GST_BUFFER_DATA(*obuf)) % 4)
 		GST_DEBUG_OBJECT(bcmdec, "buf is not aligned");
-
+#endif
 	return TRUE;
 }
 
@@ -1382,6 +1384,7 @@  static void * bcmdec_process_output(void *ctx)
 	GstClockTime cur_stream_time_diff = 0;
 	int wait_cnt = 0;
 	guint32 nextPicNumFlags = 0;
+	GstMapInfo info;
 
 	gboolean is_paused = FALSE;
 
@@ -1427,7 +1430,8 @@  static void * bcmdec_process_output(void *ctx)
 			guint8* data_ptr;
 			if (gstbuf == NULL) {
 				if (!bcmdec->rbuf_thread_running) {
-					if (!bcmdec_get_buffer(bcmdec, &gstbuf)) {
+				        gint size = bcmdec->output_params.width * bcmdec->output_params.height * BUF_MULT;
+					if (!bcmdec_get_buffer(bcmdec, size, &gstbuf)) {
 						usleep(30 * 1000);
 						continue;
 					}
@@ -1460,9 +1464,16 @@  static void * bcmdec_process_output(void *ctx)
 			else
 				GST_DEBUG_OBJECT(bcmdec, "re-using rbuf, going to proc output");
 
-			data_ptr = GST_BUFFER_DATA(gstbuf);
-
+			if(!gst_buffer_map(gstbuf,
+					   &info,
+					   GST_MAP_WRITE)) {
+			  GST_ERROR_OBJECT(bcmdec, "Failed to map buffer");
+			  continue;
+			}
+			data_ptr = info.data;
 			bcmdec_init_procout(bcmdec, &pout, data_ptr);
+			gst_buffer_unmap(gstbuf, &info);
+
 			rx_flush = TRUE;
 			pout.PicInfo.picture_number = 0;
 			// For interlaced content, if I am holding a buffer but the next buffer is not from the same picture
@@ -1473,7 +1484,7 @@  static void * bcmdec_process_output(void *ctx)
 					if(pic_number == 0)
 						gst_buffer_unref(gstbuf);
 					else if (gst_queue_element) {
-						GST_BUFFER_FLAG_SET(gstbuf, GST_VIDEO_BUFFER_ONEFIELD);
+						GST_BUFFER_FLAG_SET(gstbuf, GST_VIDEO_BUFFER_FLAG_ONEFIELD);
 						gst_queue_element->gstbuf = gstbuf;
 						bcmdec_ins_buf(bcmdec, gst_queue_element);
 						bcmdec->prev_pic = pic_number;
@@ -1489,7 +1500,7 @@  static void * bcmdec_process_output(void *ctx)
 			}
 			if (bEOS) {
 				if (gstbuf) {
-					gst_buffer_unref(gstbuf);
+				        gst_buffer_unref(gstbuf);
 					gstbuf = NULL;
 				}
 				if (gst_queue_element) {
@@ -1561,14 +1572,6 @@  static void * bcmdec_process_output(void *ctx)
 						GST_DEBUG_OBJECT(bcmdec, "LOST PICTURE pic_no = %d, prev = %d", pic_number, bcmdec->prev_pic);
 				}
 
-/*				if ((bcmdec->prev_pic == pic_number) && (bcmdec->ses_nbr  == pout.PicInfo.sess_num) && !bcmdec->interlace) {
-					if (!bcmdec->silent)
-						GST_DEBUG_OBJECT(bcmdec, "rp");
-
-					if (!(pout.PicInfo.flags &  VDEC_FLAG_LAST_PICTURE))
-						continue;
-				}*/
-
 				if (!bcmdec->interlace || bcmdec->sec_field) {
 					GST_DEBUG_OBJECT(bcmdec, "Progressive or Second Field");
 					GST_BUFFER_OFFSET(gstbuf) = 0;
@@ -1597,13 +1600,11 @@  static void * bcmdec_process_output(void *ctx)
 					}
 				}
 
-				GST_BUFFER_SIZE(gstbuf) = bcmdec->output_params.width * bcmdec->output_params.height * BUF_MULT;
-
 				if (!bcmdec->interlace || bcmdec->sec_field) {
 					if (gst_queue_element) {
 						// If interlaced, set the GST_VIDEO_BUFFER_TFF flags
 						if(bcmdec->sec_field)
-							GST_BUFFER_FLAG_SET(gstbuf, GST_VIDEO_BUFFER_TFF);
+							GST_BUFFER_FLAG_SET(gstbuf, GST_VIDEO_BUFFER_FLAG_TFF);
 						gst_queue_element->gstbuf = gstbuf;
 						bcmdec_ins_buf(bcmdec, gst_queue_element);
 						bcmdec->prev_pic = pic_number;
@@ -1674,7 +1675,7 @@  static void * bcmdec_process_output(void *ctx)
 		}
 		if (rx_flush) {
 			if (!bcmdec->flushing) {
-// 				GST_DEBUG_OBJECT(bcmdec, "DtsFlushRxCapture called");
+ 				GST_DEBUG_OBJECT(bcmdec, "DtsFlushRxCapture called");
 // 				sts = decif_flush_rxbuf(&bcmdec->decif, FALSE);
 // 				if (sts != BC_STS_SUCCESS)
 // 					GST_DEBUG_OBJECT(bcmdec, "DtsFlushRxCapture failed");
@@ -1880,11 +1881,11 @@  static void bcmdec_process_flush_start(GstBcmDec *bcmdec)
 		GST_ERROR_OBJECT(bcmdec, "flush_dec failed sts %d", sts);
 }
 
-static BC_STATUS gst_bcmdec_cleanup(GstBcmDec *bcmdec)
+static BC_STATUS gst_bcm_dec_cleanup(GstBcmDec *bcmdec)
 {
 	BC_STATUS sts = BC_STS_SUCCESS;
 
-	GST_DEBUG_OBJECT(bcmdec, "gst_bcmdec_cleanup - enter");
+	GST_DEBUG_OBJECT(bcmdec, "gst_bcm_dec_cleanup - enter");
 	bcmdec->streaming = FALSE;
 
 	bcmdec_release_mem_buf_que_pool(bcmdec);
@@ -2117,11 +2118,11 @@  static GSTBUF_LIST * bcmdec_rem_buf(GstBcmDec *bcmdec)
 	return temp;
 }
 
-static BC_STATUS bcmdec_insert_sps_pps(GstBcmDec *bcmdec, GstBuffer* gstbuf)
+static BC_STATUS bcmdec_insert_sps_pps(GstBcmDec *bcmdec, GstMapInfo* info)
 {
 	BC_STATUS sts = BC_STS_SUCCESS;
-	guint8 *data = GST_BUFFER_DATA(gstbuf);
-	guint32 data_size = GST_BUFFER_SIZE(gstbuf);
+	guint8 *data = info->data;
+	guint32 data_size = info->size;
 	gint profile;
 	guint nal_size;
 	guint num_sps, num_pps, i;
@@ -2436,7 +2437,6 @@  static void * bcmdec_process_get_rbuf(void *ctx)
 
 		while (bcmdec->streaming && get_buf_start)
 		{
-			//GST_DEBUG_OBJECT(bcmdec, "process get rbuf start....");
 			gstbuf = NULL;
 
 			if (!bcmdec->recv_thread && !bcmdec->streaming) {
@@ -2446,9 +2446,8 @@  static void * bcmdec_process_get_rbuf(void *ctx)
 				break;
 			}
 
-			// If we have enough buffers from the renderer then don't get any more
 			if(bcmdec->gst_padbuf_que_cnt >= GST_RENDERER_BUF_POOL_SZ) {
-				usleep(100 * 1000);
+			  usleep(100 * 1000); /* we have enought buffers from the renderer */
 				GST_DEBUG_OBJECT(bcmdec, "SLEEPING because we have enough buffers");
 				continue;
 			}
@@ -2467,13 +2466,10 @@  static void * bcmdec_process_get_rbuf(void *ctx)
 			bufSz = bcmdec->output_params.width * bcmdec->output_params.height * BUF_MULT;
 
 			GST_DEBUG_OBJECT(bcmdec, "process get rbuf gst_pad_alloc_buffer_and_set_caps ....");
-			ret = gst_pad_alloc_buffer_and_set_caps(bcmdec->srcpad, GST_BUFFER_OFFSET_NONE,
-								bufSz, GST_PAD_CAPS(bcmdec->srcpad), &gstbuf);
-			if (ret != GST_FLOW_OK) {
-				if (!bcmdec->silent)
-					GST_ERROR_OBJECT(bcmdec, "gst_pad_alloc_buffer_and_set_caps failed %d ",ret);
-				usleep(30 * 1000);
-				continue;
+			if (!bcmdec_get_buffer(bcmdec, bufSz, &gstbuf)) {
+			  GST_ERROR_OBJECT(bcmdec, "gst_pad_alloc_buffer_and_set_caps failed %d ",ret);
+			  usleep(30 * 1000);
+			  continue;
 			}
 
 			GST_DEBUG_OBJECT(bcmdec, "Got GST Buf RCnt:%d", bcmdec->gst_padbuf_que_cnt);
@@ -2501,9 +2497,6 @@  static gboolean bcmdec_start_get_rbuf_thread(GstBcmDec *bcmdec)
 	gint ret = 0;
 	pthread_attr_t thread_attr;
 
-// 	if (!bcmdec_alloc_mem_rbuf_que_pool(bcmdec))
-// 		GST_ERROR_OBJECT(bcmdec, "rend pool alloc failed/n");
-
 	bcmdec->gst_padbuf_que_hd = bcmdec->gst_padbuf_que_tl = NULL;
 
 	ret = sem_init(&bcmdec->rbuf_ins_event, 0, 0);
@@ -2658,18 +2651,14 @@  static GSTBUF_LIST *bcmdec_rem_padbuf(GstBcmDec *bcmdec)
  */
 static gboolean plugin_init(GstPlugin *bcmdec)
 {
-	//printf("BcmDec_init");
-
 	/*
 	 * debug category for fltering log messages
-	 *
-	 * exchange the string 'Template bcmdec' with your description
 	 */
-	GST_DEBUG_CATEGORY_INIT(gst_bcmdec_debug, "bcmdec", 0, "Broadcom video decoder");
+	GST_DEBUG_CATEGORY_INIT(gst_bcm_dec_debug, "bcmdec", 0, "Broadcom video decoder");
 
-	return gst_element_register(bcmdec, "bcmdec", GST_BCMDEC_RANK, GST_TYPE_BCMDEC);
+	return gst_element_register(bcmdec, "bcmdec", GST_BCM_DEC_RANK, GST_TYPE_BCM_DEC);
 }
 
 /* gstreamer looks for this structure to register bcmdec */
-GST_PLUGIN_DEFINE(GST_VERSION_MAJOR, GST_VERSION_MINOR, "bcmdec", "Video decoder", plugin_init, VERSION, "LGPL", "bcmdec", "http://broadcom.com/")
+GST_PLUGIN_DEFINE(GST_VERSION_MAJOR, GST_VERSION_MINOR, bcmdec, "Video decoder", plugin_init, VERSION, "LGPL", "bcmdec", "http://broadcom.com/")
 
diff --git a/filters/gst/gst-plugin/src/gstbcmdec.h b/filters/gst/gst-plugin/src/gstbcmdec.h
index 6e5b100..5c02c8a 100644
--- a/filters/gst/gst-plugin/src/gstbcmdec.h
+++ b/filters/gst/gst-plugin/src/gstbcmdec.h
@@ -23,11 +23,11 @@ 
  * along with this library.  If not, see <http://www.gnu.org/licenses/>.
  *
  *******************************************************************/
-#ifndef __GST_BCMDEC_H__
-#define __GST_BCMDEC_H__
+#ifndef __GST_BCM_DEC_H__
+#define __GST_BCM_DEC_H__
 
 
-#define	GST_BCMDEC_RANK	0xffff
+#define	GST_BCM_DEC_RANK	0xffff
 
 #define CLOCK_BASE 9LL
 #define CLOC_FREQ_CLOC_BASE * 10000
@@ -127,16 +127,16 @@  typedef struct {
 
 G_BEGIN_DECLS
 
-#define GST_TYPE_BCMDEC \
-  (gst_bcmdec_get_type())
-#define GST_BCMDEC(obj) \
-  (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_BCMDEC,GstBcmDec))
-#define GST_BCMDEC_CLASS(klass) \
-  (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_BCMDEC,GstBcmDecClass))
-#define GST_IS_BCMDEC(obj) \
-  (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_BCMDEC))
-#define GST_IS_BCMDEC_CLASS(klass) \
-  (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_BCMDEC))
+#define GST_TYPE_BCM_DEC \
+  (gst_bcm_dec_get_type())
+#define GST_BCM_DEC(obj) \
+  (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_BCM_DEC,GstBcmDec))
+#define GST_BCM_DEC_CLASS(klass) \
+  (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_BCM_DEC,GstBcmDecClass))
+#define GST_IS_BCM_DEC(obj) \
+  (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_BCM_DEC))
+#define GST_IS_BCM_DEC_CLASS(klass) \
+  (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_BCM_DEC))
 
 typedef struct _GstBcmDec      GstBcmDec;
 typedef struct _GstBcmDecClass GstBcmDecClass;
@@ -188,7 +188,7 @@  struct _GstBcmDec
 
 	gboolean flushing;
 	sem_t push_stop_event;
-    sem_t push_start_event;
+  sem_t push_start_event;
 	sem_t recv_stop_event;
 	guint ses_nbr;
 	gboolean insert_pps;
@@ -233,49 +233,50 @@  struct _GstBcmDecClass
   GstElementClass parent_class;
 };
 
-GType gst_bcmdec_get_type (void);
+GType gst_bcm_dec_get_type (void);
 
 static void
-gst_bcmdec_base_init (gpointer gclass);
+gst_bcm_dec_base_init (gpointer gclass);
 
 static void
-gst_bcmdec_class_init(GstBcmDecClass * klass);
+gst_bcm_dec_class_init(GstBcmDecClass * klass);
 
 static void
-gst_bcmdec_init(GstBcmDec * bcmdec,
-				GstBcmDecClass * gclass);
+gst_bcm_dec_init(GstBcmDec * bcmdec);
+
 
 static void
-gst_bcmdec_finalize(GObject * object);
+gst_bcm_dec_finalize(GObject * object);
 
 static GstFlowReturn
-gst_bcmdec_chain(GstPad * pad,
+gst_bcm_dec_chain(GstPad * pad,
+		 GstObject * parent,
 				 GstBuffer * buffer);
 
 static GstStateChangeReturn
-gst_bcmdec_change_state(GstElement * element,
+gst_bcm_dec_change_state(GstElement * element,
 						GstStateChange transition);
 
 static gboolean
-gst_bcmdec_sink_set_caps(GstPad * pad,
+gst_bcm_dec_sink_set_caps(GstPad * pad,
 						 GstCaps * caps);
 
-static GstCaps *gst_bcmdec_getcaps (GstPad * pad);
-
 static gboolean
-gst_bcmdec_src_event(GstPad * pad,
+gst_bcm_dec_src_event(GstPad * pad,
+		     GstObject * parent,
 					 GstEvent * event);
 
 static gboolean
-gst_bcmdec_sink_event(GstPad * pad,
+gst_bcm_dec_sink_event(GstPad * pad,
+		      GstObject * parent,
 					  GstEvent * event);
 
 static void
-gst_bcmdec_set_property (GObject * object, guint prop_id,
+gst_bcm_dec_set_property (GObject * object, guint prop_id,
 						const GValue * value, GParamSpec * pspec);
 
 static void
-gst_bcmdec_get_property (GObject * object, guint prop_id,
+gst_bcm_dec_get_property (GObject * object, guint prop_id,
 						GValue * value, GParamSpec * pspec);
 
 static gboolean
@@ -285,7 +286,7 @@  static void
 bcmdec_reset(GstBcmDec * bcmdec);
 
 static gboolean
-bcmdec_get_buffer(GstBcmDec * bcmdec, GstBuffer ** obuf);
+bcmdec_get_buffer(GstBcmDec * bcmdec, gint size, GstBuffer ** obuf);
 
 static void*
 bcmdec_process_output(void * ctx);
@@ -300,7 +301,7 @@  static gboolean
 bcmdec_format_change(GstBcmDec * filter,BC_PIC_INFO_BLOCK* pic_info);
 
 static BC_STATUS
-gst_bcmdec_cleanup(GstBcmDec *filter);
+gst_bcm_dec_cleanup(GstBcmDec *filter);
 
 static gboolean
 bcmdec_start_recv_thread(GstBcmDec * bcmdec);
@@ -339,7 +340,7 @@  bcmdec_start_push_thread(GstBcmDec * bcmdec);
 //bcmdec_insert_startcode(GstBcmDec* filter,GstBuffer* gstbuf, guint8* dest_buf,guint32* sz);
 
 static BC_STATUS
-bcmdec_insert_sps_pps(GstBcmDec* filter,GstBuffer* gstbuf);
+bcmdec_insert_sps_pps(GstBcmDec* filter, GstMapInfo* gstbuf);
 
 static void
 bcmdec_set_aspect_ratio(GstBcmDec *filter,BC_PIC_INFO_BLOCK* pic_info);
@@ -383,7 +384,6 @@  bcmdec_ins_padbuf(GstBcmDec *filter,GSTBUF_LIST	*gst_queue_element);
 static GSTBUF_LIST*
 bcmdec_rem_padbuf(GstBcmDec *filter);
 
-
 G_END_DECLS
 
-#endif /* __GST_BCMDEC_H__ */
+#endif /* __GST_BCM_DEC_H__ */