* [PATCH] crystalhd gst: Port to GStreamer 1.0 API
@ 2013-03-11 8:40 Guido Günther
2013-04-01 11:26 ` Guido Günther
0 siblings, 1 reply; 3+ messages in thread
From: Guido Günther @ 2013-03-11 8:40 UTC (permalink / raw)
To: linux-media
---
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(-)
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
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH] crystalhd gst: Port to GStreamer 1.0 API
2013-03-11 8:40 [PATCH] crystalhd gst: Port to GStreamer 1.0 API Guido Günther
@ 2013-04-01 11:26 ` Guido Günther
2013-07-21 17:34 ` Guido Günther
0 siblings, 1 reply; 3+ messages in thread
From: Guido Günther @ 2013-04-01 11:26 UTC (permalink / raw)
To: linux-media; +Cc: Jarod Wilson
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
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH] crystalhd gst: Port to GStreamer 1.0 API
2013-04-01 11:26 ` Guido Günther
@ 2013-07-21 17:34 ` Guido Günther
0 siblings, 0 replies; 3+ messages in thread
From: Guido Günther @ 2013-07-21 17:34 UTC (permalink / raw)
To: linux-media; +Cc: Jarod Wilson
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
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2013-07-21 17:40 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-03-11 8:40 [PATCH] crystalhd gst: Port to GStreamer 1.0 API Guido Günther
2013-04-01 11:26 ` Guido Günther
2013-07-21 17:34 ` Guido Günther
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).