[PATCH] gst: Port to GStreamer 1.0 API
Gbp-Pq: Name gst-Port-to-GStreamer-1.0-API.patch
This commit is contained in:
parent
a9517df902
commit
f6e8e1a52d
|
@ -2137,9 +2137,9 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
GST_MAJORMINOR=0.10
|
GST_MAJORMINOR=1.0
|
||||||
GST_REQUIRED=0.10.0
|
GST_REQUIRED=1.0
|
||||||
GSTPB_REQUIRED=0.10.0
|
GSTPB_REQUIRED=1.0
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -11514,16 +11514,16 @@ if test -n "$GST_CFLAGS"; then
|
||||||
if test -n "$PKG_CONFIG" && \
|
if test -n "$PKG_CONFIG" && \
|
||||||
{ { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\\
|
{ { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\\
|
||||||
gstreamer-\$GST_MAJORMINOR >= \$GST_REQUIRED
|
gstreamer-\$GST_MAJORMINOR >= \$GST_REQUIRED
|
||||||
gstreamer-video-0.10\""; } >&5
|
gstreamer-video-1.0\""; } >&5
|
||||||
($PKG_CONFIG --exists --print-errors "\
|
($PKG_CONFIG --exists --print-errors "\
|
||||||
gstreamer-$GST_MAJORMINOR >= $GST_REQUIRED
|
gstreamer-$GST_MAJORMINOR >= $GST_REQUIRED
|
||||||
gstreamer-video-0.10") 2>&5
|
gstreamer-video-1.0") 2>&5
|
||||||
ac_status=$?
|
ac_status=$?
|
||||||
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
|
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
|
||||||
test $ac_status = 0; }; then
|
test $ac_status = 0; }; then
|
||||||
pkg_cv_GST_CFLAGS=`$PKG_CONFIG --cflags "\
|
pkg_cv_GST_CFLAGS=`$PKG_CONFIG --cflags "\
|
||||||
gstreamer-$GST_MAJORMINOR >= $GST_REQUIRED
|
gstreamer-$GST_MAJORMINOR >= $GST_REQUIRED
|
||||||
gstreamer-video-0.10" 2>/dev/null`
|
gstreamer-video-1.0" 2>/dev/null`
|
||||||
test "x$?" != "x0" && pkg_failed=yes
|
test "x$?" != "x0" && pkg_failed=yes
|
||||||
else
|
else
|
||||||
pkg_failed=yes
|
pkg_failed=yes
|
||||||
|
@ -11537,16 +11537,16 @@ if test -n "$GST_LIBS"; then
|
||||||
if test -n "$PKG_CONFIG" && \
|
if test -n "$PKG_CONFIG" && \
|
||||||
{ { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\\
|
{ { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\\
|
||||||
gstreamer-\$GST_MAJORMINOR >= \$GST_REQUIRED
|
gstreamer-\$GST_MAJORMINOR >= \$GST_REQUIRED
|
||||||
gstreamer-video-0.10\""; } >&5
|
gstreamer-video-1.0\""; } >&5
|
||||||
($PKG_CONFIG --exists --print-errors "\
|
($PKG_CONFIG --exists --print-errors "\
|
||||||
gstreamer-$GST_MAJORMINOR >= $GST_REQUIRED
|
gstreamer-$GST_MAJORMINOR >= $GST_REQUIRED
|
||||||
gstreamer-video-0.10") 2>&5
|
gstreamer-video-1.0") 2>&5
|
||||||
ac_status=$?
|
ac_status=$?
|
||||||
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
|
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
|
||||||
test $ac_status = 0; }; then
|
test $ac_status = 0; }; then
|
||||||
pkg_cv_GST_LIBS=`$PKG_CONFIG --libs "\
|
pkg_cv_GST_LIBS=`$PKG_CONFIG --libs "\
|
||||||
gstreamer-$GST_MAJORMINOR >= $GST_REQUIRED
|
gstreamer-$GST_MAJORMINOR >= $GST_REQUIRED
|
||||||
gstreamer-video-0.10" 2>/dev/null`
|
gstreamer-video-1.0" 2>/dev/null`
|
||||||
test "x$?" != "x0" && pkg_failed=yes
|
test "x$?" != "x0" && pkg_failed=yes
|
||||||
else
|
else
|
||||||
pkg_failed=yes
|
pkg_failed=yes
|
||||||
|
@ -11569,11 +11569,11 @@ fi
|
||||||
if test $_pkg_short_errors_supported = yes; then
|
if test $_pkg_short_errors_supported = yes; then
|
||||||
GST_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "\
|
GST_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "\
|
||||||
gstreamer-$GST_MAJORMINOR >= $GST_REQUIRED
|
gstreamer-$GST_MAJORMINOR >= $GST_REQUIRED
|
||||||
gstreamer-video-0.10" 2>&1`
|
gstreamer-video-1.0" 2>&1`
|
||||||
else
|
else
|
||||||
GST_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "\
|
GST_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "\
|
||||||
gstreamer-$GST_MAJORMINOR >= $GST_REQUIRED
|
gstreamer-$GST_MAJORMINOR >= $GST_REQUIRED
|
||||||
gstreamer-video-0.10" 2>&1`
|
gstreamer-video-1.0" 2>&1`
|
||||||
fi
|
fi
|
||||||
# Put the nasty error message in config.log where it belongs
|
# Put the nasty error message in config.log where it belongs
|
||||||
echo "$GST_PKG_ERRORS" >&5
|
echo "$GST_PKG_ERRORS" >&5
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
AC_INIT
|
AC_INIT
|
||||||
|
|
||||||
dnl versions of gstreamer and plugins-base
|
dnl versions of gstreamer and plugins-base
|
||||||
GST_MAJORMINOR=0.10
|
GST_MAJORMINOR=1.0
|
||||||
GST_REQUIRED=0.10.0
|
GST_REQUIRED=1.0
|
||||||
GSTPB_REQUIRED=0.10.0
|
GSTPB_REQUIRED=1.0
|
||||||
|
|
||||||
dnl fill in your package name and version here
|
dnl fill in your package name and version here
|
||||||
dnl the fourth (nano) number should be 0 for a release, 1 for CVS,
|
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, \
|
PKG_CHECK_MODULES(GST, \
|
||||||
gstreamer-$GST_MAJORMINOR >= $GST_REQUIRED
|
gstreamer-$GST_MAJORMINOR >= $GST_REQUIRED
|
||||||
gstreamer-video-0.10,
|
gstreamer-video-1.0,
|
||||||
HAVE_GST=yes,HAVE_GST=no)
|
HAVE_GST=yes,HAVE_GST=no)
|
||||||
|
|
||||||
dnl Give error and exit if we don't have gstreamer
|
dnl Give error and exit if we don't have gstreamer
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
* AU
|
* AU
|
||||||
*
|
*
|
||||||
* HISTORY:
|
* HISTORY:
|
||||||
|
* Updated for 1.0 by Guido Guenther <agx@sigxcpu.org>
|
||||||
*
|
*
|
||||||
*******************************************************************
|
*******************************************************************
|
||||||
*
|
*
|
||||||
|
@ -40,6 +41,7 @@
|
||||||
#include <glib.h>
|
#include <glib.h>
|
||||||
#include <gst/base/gstadapter.h>
|
#include <gst/base/gstadapter.h>
|
||||||
#include <gst/video/video.h>
|
#include <gst/video/video.h>
|
||||||
|
#include <gst/video/gstvideopool.h>
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
#ifdef HAVE_CONFIG_H
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
@ -51,8 +53,8 @@
|
||||||
#include "parse.h"
|
#include "parse.h"
|
||||||
#include "gstbcmdec.h"
|
#include "gstbcmdec.h"
|
||||||
|
|
||||||
GST_DEBUG_CATEGORY_STATIC (gst_bcmdec_debug);
|
GST_DEBUG_CATEGORY_STATIC (gst_bcm_dec_debug);
|
||||||
#define GST_CAT_DEFAULT gst_bcmdec_debug
|
#define GST_CAT_DEFAULT gst_bcm_dec_debug
|
||||||
|
|
||||||
//#define YV12__
|
//#define YV12__
|
||||||
|
|
||||||
|
@ -64,16 +66,18 @@ static GstFlowReturn bcmdec_send_buff_detect_error(GstBcmDec *bcmdec, GstBuffer
|
||||||
guint8 flags)
|
guint8 flags)
|
||||||
{
|
{
|
||||||
BC_STATUS sts = BC_STS_SUCCESS;
|
BC_STATUS sts = BC_STS_SUCCESS;
|
||||||
|
GstMapInfo info;
|
||||||
|
|
||||||
GST_DEBUG_OBJECT(bcmdec, "Attempting to Send Buffer");
|
GST_DEBUG_OBJECT(bcmdec, "Attempting to Send Buffer");
|
||||||
|
|
||||||
sts = decif_send_buffer(&bcmdec->decif, pbuffer, size, tCurrent, flags);
|
sts = decif_send_buffer(&bcmdec->decif, pbuffer, size, tCurrent, flags);
|
||||||
|
|
||||||
if (sts != BC_STS_SUCCESS) {
|
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, "proc input failed sts = %d", sts);
|
||||||
GST_ERROR_OBJECT(bcmdec, "Chain: timeStamp = %llu size = %d data = %p",
|
GST_ERROR_OBJECT(bcmdec, "Chain: timeStamp = %llu size = %d data = %p",
|
||||||
GST_BUFFER_TIMESTAMP(buf), GST_BUFFER_SIZE(buf),
|
GST_BUFFER_DTS(buf), info.size, info.data);
|
||||||
GST_BUFFER_DATA (buf));
|
gst_buffer_unmap(buf, &info);
|
||||||
return GST_FLOW_ERROR;
|
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.
|
* the capabilities of the inputs and outputs.
|
||||||
|
@ -111,35 +115,29 @@ GstStaticPadTemplate sink_factory_bcm70012 = GST_STATIC_PAD_TEMPLATE("sink", GST
|
||||||
|
|
||||||
#ifdef YV12__
|
#ifdef YV12__
|
||||||
static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE("src", GST_PAD_SRC, GST_PAD_ALWAYS,
|
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 ]"));
|
"height = (int) [ 1, MAX ], " "framerate = (fraction) [ 0/1, 2147483647/1 ]"));
|
||||||
#define BUF_MULT (12 / 8)
|
#define BUF_MULT (12 / 8)
|
||||||
#define BUF_MODE MODE420
|
#define BUF_MODE MODE420
|
||||||
#else
|
#else
|
||||||
static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE("src", GST_PAD_SRC, GST_PAD_ALWAYS,
|
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], "
|
GST_STATIC_CAPS("video/x-raw, " "format = (string) { YUY2 } , " "framerate = (fraction) [0,MAX], "
|
||||||
"width = (int) [1,MAX], " "height = (int) [1,MAX]; " "video/x-raw-yuv, "
|
"width = (int) [1,MAX], " "height = (int) [1,MAX]; " "video/x-raw, "
|
||||||
"format = (fourcc) { UYVY } , " "framerate = (fraction) [0,MAX], " "width = (int) [1,MAX], "
|
"format = (string) { UYVY } , " "framerate = (fraction) [0,MAX], " "width = (int) [1,MAX], "
|
||||||
"height = (int) [1,MAX]; "));
|
"height = (int) [1,MAX]; "));
|
||||||
#define BUF_MULT (16 / 8)
|
#define BUF_MULT (16 / 8)
|
||||||
#define BUF_MODE MODE422_YUY2
|
#define BUF_MODE MODE422_YUY2
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
GST_BOILERPLATE(GstBcmDec, gst_bcmdec, GstElement, GST_TYPE_ELEMENT);
|
G_DEFINE_TYPE(GstBcmDec, gst_bcm_dec, GST_TYPE_ELEMENT);
|
||||||
|
|
||||||
/* GObject vmethod implementations */
|
/* 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;
|
BC_HW_CAPS hwCaps;
|
||||||
|
|
||||||
GST_DEBUG_OBJECT(gclass, "gst_bcmdec_base_init");
|
GST_DEBUG_OBJECT(gclass, "gst_bcm_dec_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.";
|
|
||||||
|
|
||||||
GstElementClass *element_class = GST_ELEMENT_CLASS(gclass);
|
GstElementClass *element_class = GST_ELEMENT_CLASS(gclass);
|
||||||
|
|
||||||
|
@ -153,11 +151,15 @@ static void gst_bcmdec_base_init(gpointer gclass)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
gst_element_class_add_pad_template(element_class, gst_static_pad_template_get (&sink_factory_bcm70012));
|
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 */
|
/* 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;
|
GObjectClass *gobject_class;
|
||||||
GstElementClass *gstelement_class;
|
GstElementClass *gstelement_class;
|
||||||
|
@ -165,13 +167,15 @@ static void gst_bcmdec_class_init(GstBcmDecClass *klass)
|
||||||
gobject_class = (GObjectClass *)klass;
|
gobject_class = (GObjectClass *)klass;
|
||||||
gstelement_class = (GstElementClass *)klass;
|
gstelement_class = (GstElementClass *)klass;
|
||||||
|
|
||||||
GST_DEBUG_OBJECT(klass, "gst_bcmdec_class_init");
|
GST_DEBUG_OBJECT(klass, "gst_bcm_dec_class_init");
|
||||||
|
|
||||||
gstelement_class->change_state = gst_bcmdec_change_state;
|
gst_bcm_dec_base_init(klass);
|
||||||
|
|
||||||
gobject_class->set_property = gst_bcmdec_set_property;
|
gstelement_class->change_state = gst_bcm_dec_change_state;
|
||||||
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_object_class_install_property(gobject_class, PROP_SILENT,
|
||||||
g_param_spec_boolean("silent", "Silent",
|
g_param_spec_boolean("silent", "Silent",
|
||||||
|
@ -185,14 +189,14 @@ static void gst_bcmdec_class_init(GstBcmDecClass *klass)
|
||||||
* set pad calback functions
|
* set pad calback functions
|
||||||
* initialize instance structure
|
* initialize instance structure
|
||||||
*/
|
*/
|
||||||
static void gst_bcmdec_init(GstBcmDec *bcmdec, GstBcmDecClass *gclass)
|
static void gst_bcm_dec_init(GstBcmDec *bcmdec)
|
||||||
{
|
{
|
||||||
pid_t pid;
|
pid_t pid;
|
||||||
BC_STATUS sts = BC_STS_SUCCESS;
|
BC_STATUS sts = BC_STS_SUCCESS;
|
||||||
int shmid = 0;
|
int shmid = 0;
|
||||||
BC_HW_CAPS hwCaps;
|
BC_HW_CAPS hwCaps;
|
||||||
|
|
||||||
GST_DEBUG_OBJECT(bcmdec, "gst_bcmdec_init");
|
GST_DEBUG_OBJECT(bcmdec, "gst_bcm_dec_init");
|
||||||
|
|
||||||
bcmdec_reset(bcmdec);
|
bcmdec_reset(bcmdec);
|
||||||
|
|
||||||
|
@ -204,17 +208,16 @@ static void gst_bcmdec_init(GstBcmDec *bcmdec, GstBcmDecClass *gclass)
|
||||||
else
|
else
|
||||||
bcmdec->sinkpad = gst_pad_new_from_static_template(&sink_factory_bcm70012, "sink");
|
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_chain_function(bcmdec->sinkpad,
|
||||||
gst_pad_set_getcaps_function(bcmdec->sinkpad, GST_DEBUG_FUNCPTR(gst_bcmdec_getcaps));
|
GST_DEBUG_FUNCPTR(gst_bcm_dec_chain));
|
||||||
gst_pad_set_chain_function(bcmdec->sinkpad, GST_DEBUG_FUNCPTR(gst_bcmdec_chain));
|
|
||||||
|
|
||||||
bcmdec->srcpad = gst_pad_new_from_static_template (&src_factory, "src");
|
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_bcm_dec_src_event));
|
||||||
gst_pad_set_event_function(bcmdec->srcpad, GST_DEBUG_FUNCPTR(gst_bcmdec_src_event));
|
|
||||||
|
|
||||||
gst_pad_use_fixed_caps(bcmdec->srcpad);
|
gst_pad_use_fixed_caps(bcmdec->srcpad);
|
||||||
bcmdec_negotiate_format(bcmdec);
|
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);
|
gst_element_add_pad(GST_ELEMENT(bcmdec), bcmdec->srcpad);
|
||||||
bcmdec->silent = FALSE;
|
bcmdec->silent = FALSE;
|
||||||
pid = getpid();
|
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);
|
sts = bcmdec_create_shmem(bcmdec, &shmid);
|
||||||
|
|
||||||
|
@ -231,25 +234,25 @@ static void gst_bcmdec_init(GstBcmDec *bcmdec, GstBcmDecClass *gclass)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* plugin close function*/
|
/* 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);
|
bcmdec_del_shmem(bcmdec);
|
||||||
/*gst_bcmdec_cleanup(bcmdec);*/
|
/*gst_bcm_dec_cleanup(bcmdec);*/
|
||||||
GST_DEBUG_OBJECT(bcmdec, "gst_bcmdec_finalize");
|
GST_DEBUG_OBJECT(bcmdec, "gst_bcm_dec_finalize");
|
||||||
G_OBJECT_CLASS(parent_class)->finalize(object);
|
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)
|
const GValue *value, GParamSpec *pspec)
|
||||||
{
|
{
|
||||||
GstBcmDec *bcmdec = GST_BCMDEC(object);
|
GstBcmDec *bcmdec = GST_BCM_DEC(object);
|
||||||
|
|
||||||
switch (prop_id) {
|
switch (prop_id) {
|
||||||
case PROP_SILENT:
|
case PROP_SILENT:
|
||||||
bcmdec->silent = g_value_get_boolean (value);
|
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;
|
break;
|
||||||
default:
|
default:
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
|
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)
|
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)
|
GValue *value, GParamSpec *pspec)
|
||||||
{
|
{
|
||||||
GstBcmDec *bcmdec = GST_BCMDEC(object);
|
GstBcmDec *bcmdec = GST_BCM_DEC(object);
|
||||||
|
|
||||||
switch (prop_id) {
|
switch (prop_id) {
|
||||||
case PROP_SILENT:
|
case PROP_SILENT:
|
||||||
g_value_set_boolean (value, bcmdec->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;
|
break;
|
||||||
default:
|
default:
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
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)
|
if (!bcmdec->silent)
|
||||||
GST_DEBUG_OBJECT(bcmdec, "gst_bcmdec_get_property");
|
GST_DEBUG_OBJECT(bcmdec, "gst_bcm_dec_get_property");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* GstElement vmethod implementations */
|
/* 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;
|
GstBcmDec *bcmdec;
|
||||||
BC_STATUS sts = BC_STS_SUCCESS;
|
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;
|
gboolean result = TRUE;
|
||||||
|
|
||||||
switch (GST_EVENT_TYPE(event)) {
|
switch (GST_EVENT_TYPE(event)) {
|
||||||
case GST_EVENT_NEWSEGMENT:
|
case GST_EVENT_CAPS:
|
||||||
GstFormat newsegment_format;
|
GstCaps *caps;
|
||||||
gint64 newsegment_start;
|
gst_event_parse_caps (event, &caps);
|
||||||
|
result = gst_bcm_dec_sink_set_caps (pad, caps);
|
||||||
|
break;
|
||||||
|
|
||||||
gst_event_parse_new_segment(event, NULL, NULL, &newsegment_format,
|
case GST_EVENT_SEGMENT:
|
||||||
&newsegment_start, NULL, NULL);
|
const GstSegment *newsegment;
|
||||||
|
|
||||||
bcmdec->base_clock_time = newsegment_start;
|
gst_event_parse_segment(event, &newsegment);
|
||||||
|
|
||||||
|
bcmdec->base_clock_time = newsegment->start;
|
||||||
bcmdec->cur_stream_time = 0;
|
bcmdec->cur_stream_time = 0;
|
||||||
|
|
||||||
if (!bcmdec->silent)
|
if (!bcmdec->silent)
|
||||||
|
@ -356,30 +365,24 @@ static gboolean gst_bcmdec_sink_event(GstPad* pad, GstEvent* event)
|
||||||
|
|
||||||
gst_object_unref(bcmdec);
|
gst_object_unref(bcmdec);
|
||||||
if (!bcmdec->silent)
|
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;
|
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 */
|
/* 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;
|
GstBcmDec *bcmdec;
|
||||||
bcmdec = GST_BCMDEC(gst_pad_get_parent(pad));
|
bcmdec = GST_BCM_DEC(gst_pad_get_parent(pad));
|
||||||
GstStructure *structure;
|
GstStructure *structure;
|
||||||
|
GstMapInfo info;
|
||||||
GstCaps *intersection;
|
GstCaps *intersection;
|
||||||
const gchar *mime;
|
const gchar *mime;
|
||||||
guint num = 0;
|
guint num = 0;
|
||||||
guint den = 0;
|
guint den = 0;
|
||||||
const GValue *g_value;
|
const GValue *g_value;
|
||||||
int version = 0;
|
int version = 0;
|
||||||
GstBuffer *buffer;
|
GstBuffer *buffer = NULL;
|
||||||
guint8 *data;
|
|
||||||
guint size;
|
|
||||||
guint index;
|
guint index;
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (pad, "setcaps called");
|
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)");
|
GST_DEBUG_OBJECT(bcmdec, "InFmt H.264 (AVC1)");
|
||||||
|
|
||||||
buffer = gst_value_get_buffer(g_value);
|
buffer = gst_value_get_buffer(g_value);
|
||||||
data = GST_BUFFER_DATA(buffer);
|
if(!gst_buffer_map(buffer,
|
||||||
size = GST_BUFFER_SIZE(buffer);
|
&info,
|
||||||
|
GST_MAP_READ))
|
||||||
GST_DEBUG_OBJECT(bcmdec, "codec_data size = %d", size);
|
goto map_error;
|
||||||
|
GST_DEBUG_OBJECT(bcmdec,
|
||||||
|
"codec_data size = %d",
|
||||||
|
info.size);
|
||||||
|
|
||||||
/* parse the avcC data */
|
/* parse the avcC data */
|
||||||
if (size < 7) {
|
if (info.size < 7) {
|
||||||
GST_ERROR_OBJECT(bcmdec, "avcC size %u < 7", size);
|
GST_ERROR_OBJECT(bcmdec,
|
||||||
goto avcc_error;
|
"avcC size %u < 7",
|
||||||
|
info.size);
|
||||||
|
goto out;
|
||||||
}
|
}
|
||||||
/* parse the version, this must be 1 */
|
/* parse the version, this must be 1 */
|
||||||
if (data[0] != 1)
|
if (info.data[0] != 1) {
|
||||||
goto wrong_version;
|
GST_ERROR_OBJECT(bcmdec, "wrong avcC version");
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
if (bcmdec->codec_params.sps_pps_buf == NULL)
|
if (bcmdec->codec_params.sps_pps_buf == NULL)
|
||||||
bcmdec->codec_params.sps_pps_buf = (guint8 *)malloc(size * 2);
|
bcmdec->codec_params.sps_pps_buf = (guint8 *)malloc(info.size * 2);
|
||||||
if (bcmdec_insert_sps_pps(bcmdec, buffer) != BC_STS_SUCCESS) {
|
if (bcmdec_insert_sps_pps(bcmdec, &info) != BC_STS_SUCCESS) {
|
||||||
bcmdec->codec_params.pps_size = 0;
|
bcmdec->codec_params.pps_size = 0;
|
||||||
}
|
}
|
||||||
} else if (!strcmp("video/x-wmv", mime)) {
|
} else if (!strcmp("video/x-wmv", mime)) {
|
||||||
buffer = gst_value_get_buffer(g_value);
|
buffer = gst_value_get_buffer(g_value);
|
||||||
data = GST_BUFFER_DATA(buffer);
|
if(!gst_buffer_map(buffer,
|
||||||
size = GST_BUFFER_SIZE(buffer);
|
&info,
|
||||||
|
GST_MAP_READ))
|
||||||
|
goto map_error;
|
||||||
|
|
||||||
GST_DEBUG_OBJECT(bcmdec, "codec_data size = %d", size);
|
GST_DEBUG_OBJECT(bcmdec,
|
||||||
if (size == 4) {
|
"codec_data size = %d",
|
||||||
|
info.size);
|
||||||
|
if (info.size == 4) {
|
||||||
// Simple or Main Profile
|
// Simple or Main Profile
|
||||||
bcmdec->input_format = BC_MSUBTYPE_WMV3;
|
bcmdec->input_format = BC_MSUBTYPE_WMV3;
|
||||||
GST_DEBUG_OBJECT(bcmdec, "InFmt VC-1 (SP/MP)");
|
GST_DEBUG_OBJECT(bcmdec, "InFmt VC-1 (SP/MP)");
|
||||||
if (bcmdec->codec_params.sps_pps_buf == NULL)
|
if (bcmdec->codec_params.sps_pps_buf == NULL)
|
||||||
bcmdec->codec_params.sps_pps_buf = (guint8 *)malloc(4);
|
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;
|
bcmdec->codec_params.pps_size = 4;
|
||||||
} else {
|
} else {
|
||||||
bcmdec->input_format = BC_MSUBTYPE_VC1;
|
bcmdec->input_format = BC_MSUBTYPE_VC1;
|
||||||
GST_DEBUG_OBJECT(bcmdec, "InFmt VC-1 (AP)");
|
GST_DEBUG_OBJECT(bcmdec, "InFmt VC-1 (AP)");
|
||||||
for (index = 0; index < size; index++) {
|
for (index = 0; index < info.size;
|
||||||
data += index;
|
index++) {
|
||||||
if (((size - index) >= 4) && (*data == 0x00) && (*(data + 1) == 0x00) &&
|
info.data += index;
|
||||||
(*(data + 2) == 0x01) && (*(data + 3) == 0x0f)) {
|
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");
|
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;
|
bcmdec->codec_params.pps_size = MAX_ADV_PROF_SEQ_HDR_SZ;
|
||||||
else
|
else
|
||||||
bcmdec->codec_params.pps_size = size - index + 1;
|
bcmdec->codec_params.pps_size = info.size - index + 1;
|
||||||
memcpy(bcmdec->codec_params.sps_pps_buf, data, bcmdec->codec_params.pps_size);
|
memcpy(bcmdec->codec_params.sps_pps_buf, info.data, bcmdec->codec_params.pps_size);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -546,16 +562,16 @@ static gboolean gst_bcmdec_sink_set_caps(GstPad *pad, GstCaps *caps)
|
||||||
} else {
|
} else {
|
||||||
// No Codec data. So try with FourCC for VC1/WMV9
|
// No Codec data. So try with FourCC for VC1/WMV9
|
||||||
if (!strcmp("video/x-wmv", mime)) {
|
if (!strcmp("video/x-wmv", mime)) {
|
||||||
guint32 fourcc;
|
if (gst_structure_has_field (structure, "format")) {
|
||||||
if (gst_structure_get_fourcc (structure, "format", &fourcc)) {
|
const char* fourcc = gst_structure_get_string(structure, "format");
|
||||||
if ((fourcc == GST_MAKE_FOURCC ('W', 'V', 'C', '1')) ||
|
|
||||||
(fourcc == GST_MAKE_FOURCC ('W', 'M', 'V', 'A'))) {
|
if (!g_strcmp0(fourcc, "WVC1") ||
|
||||||
|
!g_strcmp0(fourcc, "WMVA")) {
|
||||||
bcmdec->input_format = BC_MSUBTYPE_VC1;
|
bcmdec->input_format = BC_MSUBTYPE_VC1;
|
||||||
GST_DEBUG_OBJECT(bcmdec, "InFmt VC-1 (AP)");
|
GST_DEBUG_OBJECT(bcmdec, "InFmt VC-1 (AP)");
|
||||||
} else {
|
} else {
|
||||||
GST_DEBUG_OBJECT(bcmdec, "no codec_data. Don't know how to handle");
|
GST_DEBUG_OBJECT(bcmdec, "no codec_data. Don't know how to handle");
|
||||||
gst_object_unref(bcmdec);
|
goto out;
|
||||||
return FALSE;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -570,8 +586,7 @@ static gboolean gst_bcmdec_sink_set_caps(GstPad *pad, GstCaps *caps)
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
GST_DEBUG_OBJECT(bcmdec, "no codec_data. Don't know how to handle");
|
GST_DEBUG_OBJECT(bcmdec, "no codec_data. Don't know how to handle");
|
||||||
gst_object_unref(bcmdec);
|
goto out;
|
||||||
return FALSE;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -581,54 +596,40 @@ static gboolean gst_bcmdec_sink_set_caps(GstPad *pad, GstCaps *caps)
|
||||||
bcmdec_process_play(bcmdec);
|
bcmdec_process_play(bcmdec);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gst_buffer_unmap(buffer, &info);
|
||||||
gst_object_unref(bcmdec);
|
gst_object_unref(bcmdec);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
/* ERRORS */
|
/* ERRORS */
|
||||||
avcc_error:
|
out:
|
||||||
{
|
if (buffer)
|
||||||
gst_object_unref(bcmdec);
|
gst_buffer_unmap(buffer, &info);
|
||||||
return FALSE;
|
map_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--;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* chain function
|
* chain function
|
||||||
* this function does the actual processing
|
* 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;
|
GstBcmDec *bcmdec;
|
||||||
// BC_STATUS sts = BC_STS_SUCCESS;
|
GstMapInfo info;
|
||||||
guint32 offset = 0;
|
guint32 offset = 0;
|
||||||
GstClockTime tCurrent = 0;
|
GstClockTime tCurrent = 0;
|
||||||
guint8 *pbuffer;
|
guint8 *pbuffer;
|
||||||
guint32 size = 0;
|
guint32 size = 0;
|
||||||
// guint32 vc1_buff_sz = 0;
|
GstFlowReturn ret;
|
||||||
|
|
||||||
|
|
||||||
#ifdef FILE_DUMP__
|
#ifdef FILE_DUMP__
|
||||||
guint32 bytes_written =0;
|
guint32 bytes_written =0;
|
||||||
#endif
|
#endif
|
||||||
bcmdec = GST_BCMDEC (GST_OBJECT_PARENT (pad));
|
bcmdec = GST_BCM_DEC (GST_OBJECT_PARENT (pad));
|
||||||
|
|
||||||
#ifdef FILE_DUMP__
|
#ifdef FILE_DUMP__
|
||||||
if (bcmdec->fhnd == NULL)
|
if (bcmdec->fhnd == NULL)
|
||||||
|
@ -637,8 +638,8 @@ static GstFlowReturn gst_bcmdec_chain(GstPad *pad, GstBuffer *buf)
|
||||||
|
|
||||||
if (bcmdec->flushing) {
|
if (bcmdec->flushing) {
|
||||||
GST_DEBUG_OBJECT(bcmdec, "input while flushing");
|
GST_DEBUG_OBJECT(bcmdec, "input while flushing");
|
||||||
gst_buffer_unref(buf);
|
ret = GST_FLOW_OK;
|
||||||
return GST_FLOW_OK;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (GST_CLOCK_TIME_NONE != GST_BUFFER_TIMESTAMP(buf)) {
|
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);
|
bcmdec_process_play(bcmdec);
|
||||||
} else if (!bcmdec->streaming) {
|
} else if (!bcmdec->streaming) {
|
||||||
GST_DEBUG_OBJECT(bcmdec, "input while streaming is false");
|
GST_DEBUG_OBJECT(bcmdec, "input while streaming is false");
|
||||||
gst_buffer_unref(buf);
|
ret = GST_FLOW_FLUSHING;
|
||||||
return GST_FLOW_WRONG_STATE;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
pbuffer = GST_BUFFER_DATA (buf);
|
if (!gst_buffer_map(buf, &info, GST_MAP_READ)) {
|
||||||
size = GST_BUFFER_SIZE(buf);
|
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)) {
|
if (GST_FLOW_OK != bcmdec_send_buff_detect_error(bcmdec, buf, pbuffer, size, offset, tCurrent, bcmdec->proc_in_flags)) {
|
||||||
gst_buffer_unref(buf);
|
ret = GST_FLOW_ERROR;
|
||||||
return GST_FLOW_ERROR;
|
goto unmapout;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef FILE_DUMP__
|
#ifdef FILE_DUMP__
|
||||||
bytes_written = fwrite(GST_BUFFER_DATA(buf), sizeof(unsigned char), GST_BUFFER_SIZE(buf), bcmdec->fhnd);
|
bytes_written = fwrite(GST_BUFFER_DATA(buf), sizeof(unsigned char), GST_BUFFER_SIZE(buf), bcmdec->fhnd);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
ret = GST_FLOW_OK;
|
||||||
|
|
||||||
|
unmapout:
|
||||||
|
gst_buffer_unmap(buf, &info);
|
||||||
|
out:
|
||||||
gst_buffer_unref(buf);
|
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;
|
gboolean result;
|
||||||
GstBcmDec *bcmdec;
|
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);
|
result = gst_pad_push_event(bcmdec->sinkpad, event);
|
||||||
|
|
||||||
|
@ -695,6 +708,7 @@ static gboolean bcmdec_negotiate_format(GstBcmDec *bcmdec)
|
||||||
GstStructure *s1;
|
GstStructure *s1;
|
||||||
const GValue *framerate_value;
|
const GValue *framerate_value;
|
||||||
GstVideoFormat vidFmt;
|
GstVideoFormat vidFmt;
|
||||||
|
GstVideoInfo info;
|
||||||
|
|
||||||
#ifdef YV12__
|
#ifdef YV12__
|
||||||
vidFmt = GST_VIDEO_FORMAT_YV12;
|
vidFmt = GST_VIDEO_FORMAT_YV12;
|
||||||
|
@ -703,21 +717,21 @@ static gboolean bcmdec_negotiate_format(GstBcmDec *bcmdec)
|
||||||
#endif
|
#endif
|
||||||
GST_DEBUG_OBJECT(bcmdec, "framerate = %f", bcmdec->output_params.framerate);
|
GST_DEBUG_OBJECT(bcmdec, "framerate = %f", bcmdec->output_params.framerate);
|
||||||
|
|
||||||
if(bcmdec->interlace) {
|
gst_video_info_init (&info);
|
||||||
caps = gst_video_format_new_caps_interlaced(vidFmt, bcmdec->output_params.width,
|
gst_video_info_set_format (&info,
|
||||||
bcmdec->output_params.height, num, den,
|
vidFmt,
|
||||||
bcmdec->output_params.aspectratio_x,
|
bcmdec->output_params.width,
|
||||||
bcmdec->output_params.aspectratio_y,
|
bcmdec->output_params.height);
|
||||||
TRUE);
|
info.fps_n = num;
|
||||||
} else {
|
info.fps_d = den;
|
||||||
caps = gst_video_format_new_caps(vidFmt, bcmdec->output_params.width,
|
info.par_n = bcmdec->output_params.aspectratio_x;
|
||||||
bcmdec->output_params.height, num, den,
|
info.par_d = bcmdec->output_params.aspectratio_y;
|
||||||
bcmdec->output_params.aspectratio_x,
|
info.interlace_mode = bcmdec->interlace ?
|
||||||
bcmdec->output_params.aspectratio_y);
|
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);
|
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) {
|
if (bcmdec->output_params.clr_space == MODE422_YUY2) {
|
||||||
bcmdec->output_params.y_size = bcmdec->output_params.width * bcmdec->output_params.height * BUF_MULT;
|
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;
|
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;
|
GstStateChangeReturn result = GST_STATE_CHANGE_SUCCESS;
|
||||||
GstBcmDec *bcmdec = GST_BCMDEC(element);
|
GstBcmDec *bcmdec = GST_BCM_DEC(element);
|
||||||
BC_STATUS sts = BC_STS_SUCCESS;
|
BC_STATUS sts = BC_STS_SUCCESS;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
|
@ -960,7 +974,7 @@ static GstStateChangeReturn gst_bcmdec_change_state(GstElement *element, GstStat
|
||||||
GST_DEBUG_OBJECT(bcmdec, "default %d", transition);
|
GST_DEBUG_OBJECT(bcmdec, "default %d", transition);
|
||||||
break;
|
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) {
|
if (result == GST_STATE_CHANGE_FAILURE) {
|
||||||
GST_ERROR_OBJECT(bcmdec, "parent class state change failed");
|
GST_ERROR_OBJECT(bcmdec, "parent class state change failed");
|
||||||
return result;
|
return result;
|
||||||
|
@ -968,7 +982,7 @@ static GstStateChangeReturn gst_bcmdec_change_state(GstElement *element, GstStat
|
||||||
|
|
||||||
if(transition == GST_STATE_CHANGE_READY_TO_NULL) {
|
if(transition == GST_STATE_CHANGE_READY_TO_NULL) {
|
||||||
GST_DEBUG_OBJECT(bcmdec, "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)
|
if (sts == BC_STS_SUCCESS)
|
||||||
GST_DEBUG_OBJECT(bcmdec, "dev close success");
|
GST_DEBUG_OBJECT(bcmdec, "dev close success");
|
||||||
else
|
else
|
||||||
|
@ -978,38 +992,26 @@ static GstStateChangeReturn gst_bcmdec_change_state(GstElement *element, GstStat
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean bcmdec_get_buffer(GstBcmDec *bcmdec,
|
||||||
GstClockTime gst_get_current_timex (void)
|
gint size,
|
||||||
{
|
GstBuffer **obuf)
|
||||||
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)
|
|
||||||
{
|
{
|
||||||
GstFlowReturn ret;
|
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,
|
*obuf = gst_buffer_new_allocate (NULL,
|
||||||
GST_BUFFER_OFFSET_NONE,
|
size,
|
||||||
bcmdec->output_params.width * bcmdec->output_params.height * BUF_MULT,
|
NULL);
|
||||||
GST_PAD_CAPS (bcmdec->srcpad), obuf);
|
|
||||||
if (ret != GST_FLOW_OK) {
|
if (obuf == NULL) {
|
||||||
GST_ERROR_OBJECT(bcmdec, "gst_pad_alloc_buffer_and_set_caps failed %d ",ret);
|
GST_ERROR_OBJECT(bcmdec, "gst_pad_alloc_buffer_and_set_caps failed %d ",ret);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
if (((uintptr_t)GST_BUFFER_DATA(*obuf)) % 4)
|
if (((uintptr_t)GST_BUFFER_DATA(*obuf)) % 4)
|
||||||
GST_DEBUG_OBJECT(bcmdec, "buf is not aligned");
|
GST_DEBUG_OBJECT(bcmdec, "buf is not aligned");
|
||||||
|
#endif
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1382,6 +1384,7 @@ static void * bcmdec_process_output(void *ctx)
|
||||||
GstClockTime cur_stream_time_diff = 0;
|
GstClockTime cur_stream_time_diff = 0;
|
||||||
int wait_cnt = 0;
|
int wait_cnt = 0;
|
||||||
guint32 nextPicNumFlags = 0;
|
guint32 nextPicNumFlags = 0;
|
||||||
|
GstMapInfo info;
|
||||||
|
|
||||||
gboolean is_paused = FALSE;
|
gboolean is_paused = FALSE;
|
||||||
|
|
||||||
|
@ -1427,7 +1430,8 @@ static void * bcmdec_process_output(void *ctx)
|
||||||
guint8* data_ptr;
|
guint8* data_ptr;
|
||||||
if (gstbuf == NULL) {
|
if (gstbuf == NULL) {
|
||||||
if (!bcmdec->rbuf_thread_running) {
|
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);
|
usleep(30 * 1000);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -1460,9 +1464,16 @@ static void * bcmdec_process_output(void *ctx)
|
||||||
else
|
else
|
||||||
GST_DEBUG_OBJECT(bcmdec, "re-using rbuf, going to proc output");
|
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);
|
bcmdec_init_procout(bcmdec, &pout, data_ptr);
|
||||||
|
gst_buffer_unmap(gstbuf, &info);
|
||||||
|
|
||||||
rx_flush = TRUE;
|
rx_flush = TRUE;
|
||||||
pout.PicInfo.picture_number = 0;
|
pout.PicInfo.picture_number = 0;
|
||||||
// For interlaced content, if I am holding a buffer but the next buffer is not from the same picture
|
// 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)
|
if(pic_number == 0)
|
||||||
gst_buffer_unref(gstbuf);
|
gst_buffer_unref(gstbuf);
|
||||||
else if (gst_queue_element) {
|
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;
|
gst_queue_element->gstbuf = gstbuf;
|
||||||
bcmdec_ins_buf(bcmdec, gst_queue_element);
|
bcmdec_ins_buf(bcmdec, gst_queue_element);
|
||||||
bcmdec->prev_pic = pic_number;
|
bcmdec->prev_pic = pic_number;
|
||||||
|
@ -1489,7 +1500,7 @@ static void * bcmdec_process_output(void *ctx)
|
||||||
}
|
}
|
||||||
if (bEOS) {
|
if (bEOS) {
|
||||||
if (gstbuf) {
|
if (gstbuf) {
|
||||||
gst_buffer_unref(gstbuf);
|
gst_buffer_unref(gstbuf);
|
||||||
gstbuf = NULL;
|
gstbuf = NULL;
|
||||||
}
|
}
|
||||||
if (gst_queue_element) {
|
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);
|
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) {
|
if (!bcmdec->interlace || bcmdec->sec_field) {
|
||||||
GST_DEBUG_OBJECT(bcmdec, "Progressive or Second Field");
|
GST_DEBUG_OBJECT(bcmdec, "Progressive or Second Field");
|
||||||
GST_BUFFER_OFFSET(gstbuf) = 0;
|
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 (!bcmdec->interlace || bcmdec->sec_field) {
|
||||||
if (gst_queue_element) {
|
if (gst_queue_element) {
|
||||||
// If interlaced, set the GST_VIDEO_BUFFER_TFF flags
|
// If interlaced, set the GST_VIDEO_BUFFER_TFF flags
|
||||||
if(bcmdec->sec_field)
|
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;
|
gst_queue_element->gstbuf = gstbuf;
|
||||||
bcmdec_ins_buf(bcmdec, gst_queue_element);
|
bcmdec_ins_buf(bcmdec, gst_queue_element);
|
||||||
bcmdec->prev_pic = pic_number;
|
bcmdec->prev_pic = pic_number;
|
||||||
|
@ -1674,7 +1675,7 @@ static void * bcmdec_process_output(void *ctx)
|
||||||
}
|
}
|
||||||
if (rx_flush) {
|
if (rx_flush) {
|
||||||
if (!bcmdec->flushing) {
|
if (!bcmdec->flushing) {
|
||||||
// GST_DEBUG_OBJECT(bcmdec, "DtsFlushRxCapture called");
|
GST_DEBUG_OBJECT(bcmdec, "DtsFlushRxCapture called");
|
||||||
// sts = decif_flush_rxbuf(&bcmdec->decif, FALSE);
|
// sts = decif_flush_rxbuf(&bcmdec->decif, FALSE);
|
||||||
// if (sts != BC_STS_SUCCESS)
|
// if (sts != BC_STS_SUCCESS)
|
||||||
// GST_DEBUG_OBJECT(bcmdec, "DtsFlushRxCapture failed");
|
// 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);
|
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;
|
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->streaming = FALSE;
|
||||||
|
|
||||||
bcmdec_release_mem_buf_que_pool(bcmdec);
|
bcmdec_release_mem_buf_que_pool(bcmdec);
|
||||||
|
@ -2117,11 +2118,11 @@ static GSTBUF_LIST * bcmdec_rem_buf(GstBcmDec *bcmdec)
|
||||||
return temp;
|
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;
|
BC_STATUS sts = BC_STS_SUCCESS;
|
||||||
guint8 *data = GST_BUFFER_DATA(gstbuf);
|
guint8 *data = info->data;
|
||||||
guint32 data_size = GST_BUFFER_SIZE(gstbuf);
|
guint32 data_size = info->size;
|
||||||
gint profile;
|
gint profile;
|
||||||
guint nal_size;
|
guint nal_size;
|
||||||
guint num_sps, num_pps, i;
|
guint num_sps, num_pps, i;
|
||||||
|
@ -2436,7 +2437,6 @@ static void * bcmdec_process_get_rbuf(void *ctx)
|
||||||
|
|
||||||
while (bcmdec->streaming && get_buf_start)
|
while (bcmdec->streaming && get_buf_start)
|
||||||
{
|
{
|
||||||
//GST_DEBUG_OBJECT(bcmdec, "process get rbuf start....");
|
|
||||||
gstbuf = NULL;
|
gstbuf = NULL;
|
||||||
|
|
||||||
if (!bcmdec->recv_thread && !bcmdec->streaming) {
|
if (!bcmdec->recv_thread && !bcmdec->streaming) {
|
||||||
|
@ -2446,9 +2446,8 @@ static void * bcmdec_process_get_rbuf(void *ctx)
|
||||||
break;
|
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) {
|
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");
|
GST_DEBUG_OBJECT(bcmdec, "SLEEPING because we have enough buffers");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -2467,13 +2466,10 @@ static void * bcmdec_process_get_rbuf(void *ctx)
|
||||||
bufSz = bcmdec->output_params.width * bcmdec->output_params.height * BUF_MULT;
|
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 ....");
|
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,
|
if (!bcmdec_get_buffer(bcmdec, bufSz, &gstbuf)) {
|
||||||
bufSz, GST_PAD_CAPS(bcmdec->srcpad), &gstbuf);
|
GST_ERROR_OBJECT(bcmdec, "gst_pad_alloc_buffer_and_set_caps failed %d ",ret);
|
||||||
if (ret != GST_FLOW_OK) {
|
usleep(30 * 1000);
|
||||||
if (!bcmdec->silent)
|
continue;
|
||||||
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);
|
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;
|
gint ret = 0;
|
||||||
pthread_attr_t thread_attr;
|
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;
|
bcmdec->gst_padbuf_que_hd = bcmdec->gst_padbuf_que_tl = NULL;
|
||||||
|
|
||||||
ret = sem_init(&bcmdec->rbuf_ins_event, 0, 0);
|
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)
|
static gboolean plugin_init(GstPlugin *bcmdec)
|
||||||
{
|
{
|
||||||
//printf("BcmDec_init");
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* debug category for fltering log messages
|
* 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 */
|
/* 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/")
|
||||||
|
|
||||||
|
|
|
@ -23,11 +23,11 @@
|
||||||
* along with this library. If not, see <http://www.gnu.org/licenses/>.
|
* along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
*******************************************************************/
|
*******************************************************************/
|
||||||
#ifndef __GST_BCMDEC_H__
|
#ifndef __GST_BCM_DEC_H__
|
||||||
#define __GST_BCMDEC_H__
|
#define __GST_BCM_DEC_H__
|
||||||
|
|
||||||
|
|
||||||
#define GST_BCMDEC_RANK 0xffff
|
#define GST_BCM_DEC_RANK 0xffff
|
||||||
|
|
||||||
#define CLOCK_BASE 9LL
|
#define CLOCK_BASE 9LL
|
||||||
#define CLOC_FREQ_CLOC_BASE * 10000
|
#define CLOC_FREQ_CLOC_BASE * 10000
|
||||||
|
@ -127,16 +127,16 @@ typedef struct {
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
|
|
||||||
#define GST_TYPE_BCMDEC \
|
#define GST_TYPE_BCM_DEC \
|
||||||
(gst_bcmdec_get_type())
|
(gst_bcm_dec_get_type())
|
||||||
#define GST_BCMDEC(obj) \
|
#define GST_BCM_DEC(obj) \
|
||||||
(G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_BCMDEC,GstBcmDec))
|
(G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_BCM_DEC,GstBcmDec))
|
||||||
#define GST_BCMDEC_CLASS(klass) \
|
#define GST_BCM_DEC_CLASS(klass) \
|
||||||
(G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_BCMDEC,GstBcmDecClass))
|
(G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_BCM_DEC,GstBcmDecClass))
|
||||||
#define GST_IS_BCMDEC(obj) \
|
#define GST_IS_BCM_DEC(obj) \
|
||||||
(G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_BCMDEC))
|
(G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_BCM_DEC))
|
||||||
#define GST_IS_BCMDEC_CLASS(klass) \
|
#define GST_IS_BCM_DEC_CLASS(klass) \
|
||||||
(G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_BCMDEC))
|
(G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_BCM_DEC))
|
||||||
|
|
||||||
typedef struct _GstBcmDec GstBcmDec;
|
typedef struct _GstBcmDec GstBcmDec;
|
||||||
typedef struct _GstBcmDecClass GstBcmDecClass;
|
typedef struct _GstBcmDecClass GstBcmDecClass;
|
||||||
|
@ -188,7 +188,7 @@ struct _GstBcmDec
|
||||||
|
|
||||||
gboolean flushing;
|
gboolean flushing;
|
||||||
sem_t push_stop_event;
|
sem_t push_stop_event;
|
||||||
sem_t push_start_event;
|
sem_t push_start_event;
|
||||||
sem_t recv_stop_event;
|
sem_t recv_stop_event;
|
||||||
guint ses_nbr;
|
guint ses_nbr;
|
||||||
gboolean insert_pps;
|
gboolean insert_pps;
|
||||||
|
@ -233,49 +233,50 @@ struct _GstBcmDecClass
|
||||||
GstElementClass parent_class;
|
GstElementClass parent_class;
|
||||||
};
|
};
|
||||||
|
|
||||||
GType gst_bcmdec_get_type (void);
|
GType gst_bcm_dec_get_type (void);
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gst_bcmdec_base_init (gpointer gclass);
|
gst_bcm_dec_base_init (gpointer gclass);
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gst_bcmdec_class_init(GstBcmDecClass * klass);
|
gst_bcm_dec_class_init(GstBcmDecClass * klass);
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gst_bcmdec_init(GstBcmDec * bcmdec,
|
gst_bcm_dec_init(GstBcmDec * bcmdec);
|
||||||
GstBcmDecClass * gclass);
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gst_bcmdec_finalize(GObject * object);
|
gst_bcm_dec_finalize(GObject * object);
|
||||||
|
|
||||||
static GstFlowReturn
|
static GstFlowReturn
|
||||||
gst_bcmdec_chain(GstPad * pad,
|
gst_bcm_dec_chain(GstPad * pad,
|
||||||
|
GstObject * parent,
|
||||||
GstBuffer * buffer);
|
GstBuffer * buffer);
|
||||||
|
|
||||||
static GstStateChangeReturn
|
static GstStateChangeReturn
|
||||||
gst_bcmdec_change_state(GstElement * element,
|
gst_bcm_dec_change_state(GstElement * element,
|
||||||
GstStateChange transition);
|
GstStateChange transition);
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_bcmdec_sink_set_caps(GstPad * pad,
|
gst_bcm_dec_sink_set_caps(GstPad * pad,
|
||||||
GstCaps * caps);
|
GstCaps * caps);
|
||||||
|
|
||||||
static GstCaps *gst_bcmdec_getcaps (GstPad * pad);
|
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_bcmdec_src_event(GstPad * pad,
|
gst_bcm_dec_src_event(GstPad * pad,
|
||||||
|
GstObject * parent,
|
||||||
GstEvent * event);
|
GstEvent * event);
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_bcmdec_sink_event(GstPad * pad,
|
gst_bcm_dec_sink_event(GstPad * pad,
|
||||||
|
GstObject * parent,
|
||||||
GstEvent * event);
|
GstEvent * event);
|
||||||
|
|
||||||
static void
|
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);
|
const GValue * value, GParamSpec * pspec);
|
||||||
|
|
||||||
static void
|
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);
|
GValue * value, GParamSpec * pspec);
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
|
@ -285,7 +286,7 @@ static void
|
||||||
bcmdec_reset(GstBcmDec * bcmdec);
|
bcmdec_reset(GstBcmDec * bcmdec);
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
bcmdec_get_buffer(GstBcmDec * bcmdec, GstBuffer ** obuf);
|
bcmdec_get_buffer(GstBcmDec * bcmdec, gint size, GstBuffer ** obuf);
|
||||||
|
|
||||||
static void*
|
static void*
|
||||||
bcmdec_process_output(void * ctx);
|
bcmdec_process_output(void * ctx);
|
||||||
|
@ -300,7 +301,7 @@ static gboolean
|
||||||
bcmdec_format_change(GstBcmDec * filter,BC_PIC_INFO_BLOCK* pic_info);
|
bcmdec_format_change(GstBcmDec * filter,BC_PIC_INFO_BLOCK* pic_info);
|
||||||
|
|
||||||
static BC_STATUS
|
static BC_STATUS
|
||||||
gst_bcmdec_cleanup(GstBcmDec *filter);
|
gst_bcm_dec_cleanup(GstBcmDec *filter);
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
bcmdec_start_recv_thread(GstBcmDec * bcmdec);
|
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);
|
//bcmdec_insert_startcode(GstBcmDec* filter,GstBuffer* gstbuf, guint8* dest_buf,guint32* sz);
|
||||||
|
|
||||||
static BC_STATUS
|
static BC_STATUS
|
||||||
bcmdec_insert_sps_pps(GstBcmDec* filter,GstBuffer* gstbuf);
|
bcmdec_insert_sps_pps(GstBcmDec* filter, GstMapInfo* gstbuf);
|
||||||
|
|
||||||
static void
|
static void
|
||||||
bcmdec_set_aspect_ratio(GstBcmDec *filter,BC_PIC_INFO_BLOCK* pic_info);
|
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*
|
static GSTBUF_LIST*
|
||||||
bcmdec_rem_padbuf(GstBcmDec *filter);
|
bcmdec_rem_padbuf(GstBcmDec *filter);
|
||||||
|
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
||||||
#endif /* __GST_BCMDEC_H__ */
|
#endif /* __GST_BCM_DEC_H__ */
|
||||||
|
|
Loading…
Reference in New Issue