1
0
mirror of https://git.yoctoproject.org/meta-ti synced 2026-04-20 19:53:43 +00:00

gstreamer-ti: remove outdated component

gstreamer-ti hasn't been updated in years. All the modern gstreamer plugins
and bindings for TI platforms now reside in meta-arago-extras layer.

Signed-off-by: Denys Dmytriyenko <denys@ti.com>
This commit is contained in:
Denys Dmytriyenko
2017-06-24 00:14:16 +00:00
parent 317a01988c
commit 8dad379b25
21 changed files with 0 additions and 2811 deletions

View File

@@ -1,165 +0,0 @@
DESCRIPTION = "GSTREAMER Plugin (gstreamer-ti) for TI ARM/DSP processors"
HOMEPAGE = "https://gforge.ti.com/gf/project/gstreamer_ti/"
SECTION = "multimedia"
LICENSE = "LGPL"
# TODO :: Replace omapl137 with official support in GST (currently linking to omapl138)
# TODO :: Codec Server Environment Variables shouldn't be required
# TODO :: Add (and check) rc scripts for all targets (just copied for now) (365,6467,omapl137)
# TODO :: Check if CPPFLAGS_append is still required
# TODO :: Remove ENCODE/DECODE combo exports - these are not used anymore (check?)
inherit autotools-brokensep
inherit update-rc.d
require recipes-ti/includes/ti-paths.inc
require recipes-ti/includes/ti-staging.inc
# Rebuild on kernel change since it links statically to ti-dmai, ti-codec-engine, etc
PR = "r85+${MACHINE_KERNEL_PR}"
DEPENDS = "ti-dmai gstreamer gst-plugins-base"
# enable c6accel elements on omapl138 and omap3
#DEPENDS_append_omapl138 = " ti-c6accel "
#EXTRA_OECONF_omapl138 = "--enable-c6accel"
#DEPENDS_append_omap3 = " ti-c6accel "
#EXTRA_OECONF_omap3 = "--enable-c6accel"
export C6ACCEL_INSTALL_DIR
# gstreamer_ti picks up some config variables from the environment
# - variables are used in the gstreamer makefile
# - PLATFORM, XDC_PLATFORM, XDC_TARGET, MVTOOL_DIR
# - others used by config.bld (which it gets from the dmai config.bld)
# - CROSS_COMPILE, PLATFORM_XDC
PLATFORM_dm6446 = "dm6446"
PLATFORM_dm6467 = "dm6467"
PLATFORM_dm6467t = "dm6467t"
PLATFORM_omap3 = "omap3530"
PLATFORM_dm355 = "dm355"
PLATFORM_dm365 = "dm365"
PLATFORM_omapl137 = "omapl137"
PLATFORM_omapl138 = "omapl138"
PLATFORM ?= "UNDEFINED_PLATFORM"
GST_TI_PLATFORM = "${PLATFORM}"
XDC_PLATFORM_dm6446 = "ti.platforms.evmDM6446"
XDC_PLATFORM_dm6467 = "ti.platforms.evmDM6467"
XDC_PLATFORM_omap3 = "ti.platforms.evm3530"
XDC_PLATFORM_dm355 = "ti.platforms.evmDM355"
XDC_PLATFORM_dm365 = "ti.platforms.evmDM365"
XDC_PLATFORM_omapl137 = "ti.platforms.evmOMAPL137"
XDC_PLATFORM_omapl138 = "ti.platforms.evmOMAPL138"
XDC_PLATFORM ?= "UNDEFINED_XDC_PLATFORM"
MEMARGS_omap3 = "99M@0x80000000"
MEMARGS ?= "UNDEFINED_MEM_ARGS"
export MEMARGS
export PLATFORM
export GST_TI_PLATFORM
export XDC_PLATFORM
export XDC_TARGET = "gnu.targets.arm.GCArmv5T"
export PLATFORM_XDC = "${XDC_PLATFORM}"
export CSTOOL_DIR = "${TOOLCHAIN_PATH}"
export MVTOOL_DIR = "${TOOLCHAIN_PATH}"
export MVTOOL_PREFIX = "${TARGET_PREFIX}"
export CROSS_COMPILE = "${TOOLCHAIN_PATH}/${TARGET_PREFIX}"
export LINK_XDC_ROOT = "${LINK_INSTALL_DIR}"
# export codec combo (or server) locations
# Why do we need to do this?? - These will get picked up from CODEC_INSTALL_DIR?
# Sould only need this if we change from default server
export CODEC_SERVER = "${installdir}/ti-codecs-server/cs.x64P"
CPPFLAGS_append = " -DPlatform_${PLATFORM}"
# We are still using encode/decode combo for DM6446
export ENCODE_COMBO = "${installdir}/ti-codecs-server/encodeCombo.x64P"
export DECODE_COMBO = "${installdir}/ti-codecs-server/decodeCombo.x64P"
# Makefile also expects to be able to find the kernel headers from the envirionment
export LINUXKERNEL_INSTALL_DIR = "${STAGING_KERNEL_DIR}"
do_configure_prepend() {
# PSP kernel is based on older DSS. we need to replace linux/omapfb.h with mach/omapfb.h
if ! [ -e ${STAGING_KERNEL_DIR}/include/linux/omapfb.h ] ; then
sed -i -e s:linux/omapfb:mach/omapfb:g ${S}/src/omapfb.h || true
fi
# Angstrom 2008 breaks with -Wl,-T, while angstrom 2010 needs it
if [ $(${TARGET_PREFIX}gcc -dumpversion | awk -F. '{print $2}') -gt 3 ] ; then
# Fix up linkerscripts, recent toolchains need -T to prepend the default script to the custom one
for makefile in $(find ${S} -name "Makefile.am") ; do
sed -i -e 's:-Wl,$(XDC_CONFIG_BASENAME)/linker.cmd:-Wl,-T,$(XDC_CONFIG_BASENAME)/linker.cmd:g' $makefile
done
fi
}
do_compile() {
# Recent kernel headers warn against inclusion from userspace
for makefile in $(find ${S} -name "Makefile") ; do
sed -i -e s:-Werror::g $makefile
done
oe_runmake
}
do_install_prepend () {
install -d ${D}/${installdir}/gst/${PLATFORM}
# copy gstreamer demo scripts
cp -R ${WORKDIR}/gstreamer_ti/gstreamer_demo/shared ${D}/${installdir}/gst
# If we have loadmodules.sh in WORKDIR then give preference to this over
# the default gst-ti loadmdules.sh
if [ -f ${WORKDIR}/loadmodules.sh ]; then
cp ${WORKDIR}/loadmodules.sh ${D}/${installdir}/gst/${PLATFORM}
else
cp -R ${WORKDIR}/gstreamer_ti/gstreamer_demo/${PLATFORM} ${D}/${installdir}/gst
fi
# delete .svn files
find ${D}/${installdir}/gst -name .svn -type d | xargs rm -rf
chmod 0755 ${D}/${installdir}/gst -R
install -d ${D}${sysconfdir}/init.d/
install -m 0755 ${WORKDIR}/gstreamer-ti-rc.sh ${D}${sysconfdir}/init.d/gstti-init
sed -i -e 's|<platform>|${PLATFORM}|g' ${D}${sysconfdir}/init.d/gstti-init
install -d ${D}${base_libdir}/systemd/system
install -m 0644 ${WORKDIR}/gstti-init.service ${D}${base_libdir}/systemd/system/
sed -i -e 's|<platform>|${PLATFORM}|g' -e 's|MEMARGS|${MEMARGS}|' ${D}${base_libdir}/systemd/system/gstti-init.service
}
RRECOMMENDS_${PN}_append_dm6446 += "ti-codecs-dm6446-server ti-cmem-module ti-dsplink-module"
RRECOMMENDS_${PN}_append_dm6467 += "ti-codecs-dm6467 ti-cmem-module ti-dsplink-module"
RRECOMMENDS_${PN}_append_omap3 += "ti-codecs-omap3530-server ti-cmem-module ti-dsplink-module ti-lpm-module ti-sdma-module"
RRECOMMENDS_${PN}_append_dm355 += "ti-codecs-dm355 ti-cmem-module ti-dm355mm-module"
RRECOMMENDS_${PN}_append_dm365 += "ti-codecs-dm365 ti-cmem-module ti-dm365mm-module ti-edma-module ti-irq-module"
RRECOMMENDS_${PN}_append_omapl137 += "ti-codecs-omapl137-server ti-cmem-module ti-dsplink-module"
RRECOMMENDS_${PN}_append_omapl138 += "ti-codecs-omapl138-server ti-cmem-module ti-dsplink-module"
FILES_${PN} += "${libdir}/gstreamer-0.10/*.so ${sysconfdir} ${installdir} ${base_libdir}/systemd"
FILES_${PN}-dev += "${libdir}/gstreamer-0.10/*.la"
FILES_${PN}-staticdev += "${libdir}/gstreamer-0.10/*.a"
FILES_${PN}-dbg += "${libdir}/gstreamer-0.10/.debug"
pkg_postinst_${PN} () {
if test "x$D" != "x"; then
echo "Can't run gstreamer-ti postinst offline"
exit 1
fi
if [ -e ${base_bindir}/systemctl ] ; then
systemctl enable gstti-init.service
fi
if [ -d ${installdir}/ti-codecs-server/ ]; then
ln -sf ${installdir}/ti-codecs-server/* ${installdir}/gst/${PLATFORM}/
fi
}
PACKAGE_ARCH = "${MACHINE_ARCH}"
INITSCRIPT_NAME = "gstti-init"
INITSCRIPT_PARAMS = "start 30 5 2 . stop 40 0 1 6 ."

View File

@@ -1,86 +0,0 @@
From fb4dabcac144fcf1a7e9b1eba0114b2eed594d05 Mon Sep 17 00:00:00 2001
From: Don Darling <don.osc2@gmail.com>
Date: Thu, 26 Aug 2010 11:12:39 -0500
Subject: [PATCH 3/8] Support setting the display framerate directly when possible.
If can_set_display_framerate is set to true, TIDmaiVideoSink will attempt to
set the display framerate directly in DMAI, instead of trying to simulate the
desired framerate by occasionally repeating frames.
Platforms that support this will need to enable it explicitly.
---
.../ticodecplugin/src/gsttidmaivideosink.c | 24 ++++++++++++++++++++
.../ticodecplugin/src/gsttidmaivideosink.h | 1 +
2 files changed, 25 insertions(+), 0 deletions(-)
diff --git a/gstreamer_ti/ti_build/ticodecplugin/src/gsttidmaivideosink.c b/gstreamer_ti/ti_build/ticodecplugin/src/gsttidmaivideosink.c
index c87b89c..4e327ae 100644
--- a/gstreamer_ti/ti_build/ticodecplugin/src/gsttidmaivideosink.c
+++ b/gstreamer_ti/ti_build/ticodecplugin/src/gsttidmaivideosink.c
@@ -442,6 +442,7 @@ static void gst_tidmaivideosink_init(GstTIDmaiVideoSink * dmaisink,
dmaisink->numBufs = -1;
dmaisink->framerepeat = 0;
dmaisink->repeat_with_refresh = FALSE;
+ dmaisink->can_set_display_framerate = FALSE;
dmaisink->rotation = -1;
dmaisink->tempDmaiBuf = NULL;
dmaisink->accelFrameCopy = TRUE;
@@ -952,6 +953,9 @@ static void gst_tidmaivideosink_check_set_framerate(GstTIDmaiVideoSink * sink)
* then 1 is returned to indicate that there will be no frame
* repeating.
*
+ * If the driver supports explicit configuration of the framerate, we
+ * don't ever need to repeat frames, and 1 is returned.
+ *
******************************************************************************/
static int gst_tidmaivideosink_get_framerepeat(GstTIDmaiVideoSink * sink)
{
@@ -959,6 +963,13 @@ static int gst_tidmaivideosink_get_framerepeat(GstTIDmaiVideoSink * sink)
GST_DEBUG("Begin\n");
+ /* If the display allows you to configure the frame rate, we never need
+ * to repeat a frame.
+ */
+ if (sink->can_set_display_framerate) {
+ return 1;
+ }
+
/* Divide the native framerate by the desired framerate. If the result
* is a whole number, return it. Otherwise return 1 -- we don't support
* fractional repeat rates. */
@@ -1151,6 +1162,19 @@ static gboolean gst_tidmaivideosink_set_display_attrs(GstTIDmaiVideoSink *sink,
sink->dAttrs.displayDevice = sink->displayDevice == NULL ?
sink->dAttrs.displayDevice : sink->displayDevice;
+ /* Specify framerate if supported by DMAI and the display driver */
+ if (sink->can_set_display_framerate) {
+ #if defined (Platform_dm365)
+ sink->dAttrs.forceFrameRateNum =
+ gst_value_get_fraction_numerator(&sink->iattrs.framerate);
+ sink->dAttrs.forceFrameRateDen =
+ gst_value_get_fraction_denominator(&sink->iattrs.framerate);
+ #else
+ GST_ERROR("setting driver framerate is not supported\n");
+ return FALSE;
+ #endif
+ }
+
/* Set rotation on OMAP35xx */
if (sink->cpu_dev == Cpu_Device_OMAP3530) {
sink->dAttrs.rotation = sink->rotation == -1 ?
diff --git a/gstreamer_ti/ti_build/ticodecplugin/src/gsttidmaivideosink.h b/gstreamer_ti/ti_build/ticodecplugin/src/gsttidmaivideosink.h
index 5d13e08..4800fcd 100644
--- a/gstreamer_ti/ti_build/ticodecplugin/src/gsttidmaivideosink.h
+++ b/gstreamer_ti/ti_build/ticodecplugin/src/gsttidmaivideosink.h
@@ -124,6 +124,7 @@ struct _GstTIDmaiVideoSink {
*/
int framerepeat;
gboolean repeat_with_refresh;
+ gboolean can_set_display_framerate;
gboolean signal_handoffs;
/* Hardware accelerated copy */
--
1.7.0.4

View File

@@ -1,73 +0,0 @@
From 03ab3ad3f790dde2dbddfeb62001e8610dbb919a Mon Sep 17 00:00:00 2001
From: Don Darling <don.osc2@gmail.com>
Date: Thu, 26 Aug 2010 18:25:56 -0500
Subject: [PATCH 4/8] Cosmetic cleanup / clarify some comments.
---
.../ticodecplugin/src/gsttidmaivideosink.c | 42 ++++++++-----------
1 files changed, 18 insertions(+), 24 deletions(-)
diff --git a/gstreamer_ti/ti_build/ticodecplugin/src/gsttidmaivideosink.c b/gstreamer_ti/ti_build/ticodecplugin/src/gsttidmaivideosink.c
index 4e327ae..1d04e1c 100644
--- a/gstreamer_ti/ti_build/ticodecplugin/src/gsttidmaivideosink.c
+++ b/gstreamer_ti/ti_build/ticodecplugin/src/gsttidmaivideosink.c
@@ -434,23 +434,23 @@ static void gst_tidmaivideosink_init(GstTIDmaiVideoSink * dmaisink,
* Anything that has a NULL value will be initialized with DMAI defaults
* in the gst_tidmaivideosink_init_display function.
*/
- dmaisink->displayStd = NULL;
- dmaisink->displayDevice = NULL;
- dmaisink->dGfxAttrs = defaultGfxAttrs;
- dmaisink->videoStd = NULL;
- dmaisink->videoOutput = NULL;
- dmaisink->numBufs = -1;
- dmaisink->framerepeat = 0;
- dmaisink->repeat_with_refresh = FALSE;
+ dmaisink->displayStd = NULL;
+ dmaisink->displayDevice = NULL;
+ dmaisink->dGfxAttrs = defaultGfxAttrs;
+ dmaisink->videoStd = NULL;
+ dmaisink->videoOutput = NULL;
+ dmaisink->numBufs = -1;
+ dmaisink->framerepeat = 0;
+ dmaisink->repeat_with_refresh = FALSE;
dmaisink->can_set_display_framerate = FALSE;
- dmaisink->rotation = -1;
- dmaisink->tempDmaiBuf = NULL;
- dmaisink->accelFrameCopy = TRUE;
- dmaisink->autoselect = FALSE;
- dmaisink->prevVideoStd = 0;
- dmaisink->useUserptrBufs = FALSE;
- dmaisink->hideOSD = FALSE;
- dmaisink->hDispBufTab = NULL;
+ dmaisink->rotation = -1;
+ dmaisink->tempDmaiBuf = NULL;
+ dmaisink->accelFrameCopy = TRUE;
+ dmaisink->autoselect = FALSE;
+ dmaisink->prevVideoStd = 0;
+ dmaisink->useUserptrBufs = FALSE;
+ dmaisink->hideOSD = FALSE;
+ dmaisink->hDispBufTab = NULL;
dmaisink->signal_handoffs = DEFAULT_SIGNAL_HANDOFFS;
@@ -947,14 +947,8 @@ static void gst_tidmaivideosink_check_set_framerate(GstTIDmaiVideoSink * sink)
/******************************************************************************
* gst_tidmaivideosink_get_framerepeat
*
- * This function will look at the output display frame rate and the
- * input frame rate and determine how many times a frame should be
- * repeated. If the output is not an integer multiple of the input
- * then 1 is returned to indicate that there will be no frame
- * repeating.
- *
- * If the driver supports explicit configuration of the framerate, we
- * don't ever need to repeat frames, and 1 is returned.
+ * Return how many times a frame should be repeated to support a
+ * framerate lower than the display's native speed.
*
******************************************************************************/
static int gst_tidmaivideosink_get_framerepeat(GstTIDmaiVideoSink * sink)
--
1.7.0.4

View File

@@ -1,33 +0,0 @@
From 1cffa12c9ceb07558d2e4b35cc674070c7a3b8ee Mon Sep 17 00:00:00 2001
From: Don Darling <don.osc2@gmail.com>
Date: Thu, 26 Aug 2010 18:27:50 -0500
Subject: [PATCH 5/8] Enable setting the framerate directly on DM365.
This is supported by recent changes to the display driver. DM365 will no
longer use the "repeat_with_refresh" method to display frames more than once.
---
.../ticodecplugin/src/gsttidmaivideosink.c | 7 ++-----
1 files changed, 2 insertions(+), 5 deletions(-)
diff --git a/gstreamer_ti/ti_build/ticodecplugin/src/gsttidmaivideosink.c b/gstreamer_ti/ti_build/ticodecplugin/src/gsttidmaivideosink.c
index 1d04e1c..3615bfd 100644
--- a/gstreamer_ti/ti_build/ticodecplugin/src/gsttidmaivideosink.c
+++ b/gstreamer_ti/ti_build/ticodecplugin/src/gsttidmaivideosink.c
@@ -475,12 +475,9 @@ static void gst_tidmaivideosink_init(GstTIDmaiVideoSink * dmaisink,
g_assert(GST_VALUE_HOLDS_FRACTION(&dmaisink->oattrs.framerate));
gst_value_set_fraction(&dmaisink->oattrs.framerate, 0, 1);
- /* On DM365, we don't have the bandwidth to copy a frame multiple times to
- * display them more than once. We must put a frame to the display once
- * and let it be refreshed multiple times.
- */
+ /* DM365 supports setting the display framerate */
#if defined(Platform_dm365)
- dmaisink->repeat_with_refresh = TRUE;
+ dmaisink->can_set_display_framerate = TRUE;
#endif
gst_tidmaivideosink_init_env(dmaisink);
--
1.7.0.4

View File

@@ -1,132 +0,0 @@
From c1205a792fd519cdebc32c00a5f604ccd78d3eac Mon Sep 17 00:00:00 2001
From: Don Darling <don.osc2@gmail.com>
Date: Thu, 26 Aug 2010 18:30:13 -0500
Subject: [PATCH 6/8] Remove the "repeat_with_refresh" feature.
No platforms are using it any longer.
---
.../ticodecplugin/src/gsttidmaivideosink.c | 67 +-------------------
.../ticodecplugin/src/gsttidmaivideosink.h | 1 -
2 files changed, 1 insertions(+), 67 deletions(-)
diff --git a/gstreamer_ti/ti_build/ticodecplugin/src/gsttidmaivideosink.c b/gstreamer_ti/ti_build/ticodecplugin/src/gsttidmaivideosink.c
index 3615bfd..0125ed2 100644
--- a/gstreamer_ti/ti_build/ticodecplugin/src/gsttidmaivideosink.c
+++ b/gstreamer_ti/ti_build/ticodecplugin/src/gsttidmaivideosink.c
@@ -170,8 +170,6 @@ static gboolean
gst_tidmaivideosink_event(GstBaseSink * bsink, GstEvent * event);
static void
gst_tidmaivideosink_init_env(GstTIDmaiVideoSink *sink);
-static int
- gst_tidmaivideosink_videostd_get_refresh_latency(VideoStd_Type videoStd);
static gboolean
gst_tidmaivideosink_alloc_display_buffers(GstTIDmaiVideoSink * sink,
Int32 bufSize);
@@ -441,7 +439,6 @@ static void gst_tidmaivideosink_init(GstTIDmaiVideoSink * dmaisink,
dmaisink->videoOutput = NULL;
dmaisink->numBufs = -1;
dmaisink->framerepeat = 0;
- dmaisink->repeat_with_refresh = FALSE;
dmaisink->can_set_display_framerate = FALSE;
dmaisink->rotation = -1;
dmaisink->tempDmaiBuf = NULL;
@@ -755,55 +752,6 @@ static int gst_tidmaivideosink_videostd_get_attrs(VideoStd_Type videoStd,
/*******************************************************************************
- * gst_tidmaivideosink_videostd_get_refresh_latency
- *
- * Return the refresh latency in us for the given display standard.
-*******************************************************************************/
-static int gst_tidmaivideosink_videostd_get_refresh_latency(
- VideoStd_Type videoStd)
-{
- switch (videoStd) {
- case VideoStd_1080P_24:
- return 41667;
-
- case VideoStd_SIF_PAL:
- case VideoStd_D1_PAL:
- case VideoStd_1080P_25:
- case VideoStd_1080I_25:
- return 40000;
-
- case VideoStd_CIF:
- case VideoStd_SIF_NTSC:
- case VideoStd_D1_NTSC:
- return 33367;
-
- case VideoStd_1080I_30:
- case VideoStd_1080P_30:
- return 33333;
-
- case VideoStd_576P:
- case VideoStd_720P_50:
- return 20000;
-
- case VideoStd_480P:
- case VideoStd_720P_60:
- #if defined(Platform_dm6467t)
- case VideoStd_1080P_60:
- #endif
- return 16667;
-
- case VideoStd_VGA:
- return 16667;
-
- default:
- break;
- }
- GST_ERROR("Unknown videoStd entered (VideoStd = %d)\n", videoStd);
- return 0;
-}
-
-
-/*******************************************************************************
* gst_tidmaivideosink_find_videostd
*
* This function will take in a VideoStd_Attrs structure and find the
@@ -1580,10 +1528,7 @@ static GstFlowReturn gst_tidmaivideosink_render(GstBaseSink * bsink,
/* Display the frame as many times as specified by framerepeat. By
* default, the input buffer is copied to a display buffer for each time
- * it is to be repeated. However, if repeat_with_refresh is TRUE, then
- * the platform doesn't have the bandwidth for multiple copies. In this
- * case we copy and display the input buffer only once, but let it refresh
- * multiple times.
+ * it is to be repeated.
*/
for (i = 0; i < sink->framerepeat; i++) {
@@ -1594,16 +1539,6 @@ static GstFlowReturn gst_tidmaivideosink_render(GstBaseSink * bsink,
goto cleanup;
}
- /* If repeat_with_refresh was specified, wait for the display to
- * refresh framerepeat-1 times to make sure it has finished displaying
- * this buffer before we write new data into it.
- */
- while (sink->repeat_with_refresh && i < (sink->framerepeat-1)) {
- usleep(gst_tidmaivideosink_videostd_get_refresh_latency(
- sink->dAttrs.videoStd) + 1);
- i++;
- }
-
/* Retrieve the dimensions of the display buffer */
BufferGfx_getDimensions(hDispBuf, &dim);
GST_LOG("Display size %dx%d pitch %d\n",
diff --git a/gstreamer_ti/ti_build/ticodecplugin/src/gsttidmaivideosink.h b/gstreamer_ti/ti_build/ticodecplugin/src/gsttidmaivideosink.h
index 4800fcd..2a28e4f 100644
--- a/gstreamer_ti/ti_build/ticodecplugin/src/gsttidmaivideosink.h
+++ b/gstreamer_ti/ti_build/ticodecplugin/src/gsttidmaivideosink.h
@@ -123,7 +123,6 @@ struct _GstTIDmaiVideoSink {
* should be repeated to match the display output frame rate.
*/
int framerepeat;
- gboolean repeat_with_refresh;
gboolean can_set_display_framerate;
gboolean signal_handoffs;
--
1.7.0.4

View File

@@ -1,313 +0,0 @@
From 108fa0bb550f9b7355bfd5ae5340220fd1a4c9b5 Mon Sep 17 00:00:00 2001
From: Don Darling <don.osc2@gmail.com>
Date: Thu, 5 Aug 2010 15:09:54 -0500
Subject: [PATCH 7/8] Add support for pad-allocated buffers in TIDmaiVideoSink.
This feature is currently only tested and enabled for DM365.
---
.../ticodecplugin/src/gsttidmaibuffertransport.c | 4 +-
.../ticodecplugin/src/gsttidmaibuffertransport.h | 6 +-
.../ticodecplugin/src/gsttidmaivideosink.c | 197 ++++++++++++++++++--
3 files changed, 191 insertions(+), 16 deletions(-)
diff --git a/gstreamer_ti/ti_build/ticodecplugin/src/gsttidmaibuffertransport.c b/gstreamer_ti/ti_build/ticodecplugin/src/gsttidmaibuffertransport.c
index 5fad371..9c69285 100644
--- a/gstreamer_ti/ti_build/ticodecplugin/src/gsttidmaibuffertransport.c
+++ b/gstreamer_ti/ti_build/ticodecplugin/src/gsttidmaibuffertransport.c
@@ -136,8 +136,8 @@ static void gst_tidmaibuffertransport_finalize(GstBuffer *gstbuffer)
*/
if (Buffer_getBufTab(self->dmaiBuffer) != NULL) {
GST_LOG("clearing GStreamer useMask bit\n");
- Buffer_freeUseMask(self->dmaiBuffer,
- gst_tidmaibuffer_GST_FREE);
+ Buffer_freeUseMask(self->dmaiBuffer, gst_tidmaibuffer_GST_FREE);
+ Buffer_freeUseMask(self->dmaiBuffer, gst_tidmaibuffer_VIDEOSINK_FREE);
} else {
GST_LOG("calling Buffer_delete()\n");
Buffer_delete(self->dmaiBuffer);
diff --git a/gstreamer_ti/ti_build/ticodecplugin/src/gsttidmaibuffertransport.h b/gstreamer_ti/ti_build/ticodecplugin/src/gsttidmaibuffertransport.h
index 0265e70..20945f3 100644
--- a/gstreamer_ti/ti_build/ticodecplugin/src/gsttidmaibuffertransport.h
+++ b/gstreamer_ti/ti_build/ticodecplugin/src/gsttidmaibuffertransport.h
@@ -52,8 +52,10 @@ G_BEGIN_DECLS
GstTIDmaiBufferTransportClass))
/* Use mask flags that keep track of where buffer is in use */
-#define gst_tidmaibuffer_GST_FREE 0x1
-#define gst_tidmaibuffer_CODEC_FREE 0x2
+#define gst_tidmaibuffer_GST_FREE 0x1
+#define gst_tidmaibuffer_CODEC_FREE 0x2
+#define gst_tidmaibuffer_VIDEOSINK_FREE 0x4
+#define gst_tidmaibuffer_DISPLAY_FREE 0x8
typedef struct _GstTIDmaiBufferTransport GstTIDmaiBufferTransport;
typedef struct _GstTIDmaiBufferTransportClass GstTIDmaiBufferTransportClass;
diff --git a/gstreamer_ti/ti_build/ticodecplugin/src/gsttidmaivideosink.c b/gstreamer_ti/ti_build/ticodecplugin/src/gsttidmaivideosink.c
index 0125ed2..7b84a8e 100644
--- a/gstreamer_ti/ti_build/ticodecplugin/src/gsttidmaivideosink.c
+++ b/gstreamer_ti/ti_build/ticodecplugin/src/gsttidmaivideosink.c
@@ -151,6 +151,9 @@ static GstStateChangeReturn
gst_tidmaivideosink_change_state(GstElement * element,
GstStateChange transition);
static GstFlowReturn
+ gst_tidmaivideosink_buffer_alloc(GstBaseSink * bsink, guint64 offset,
+ guint size, GstCaps * caps, GstBuffer ** buf);
+static GstFlowReturn
gst_tidmaivideosink_preroll(GstBaseSink * bsink, GstBuffer * buffer);
static int
gst_tidmaivideosink_videostd_get_attrs(VideoStd_Type videoStd,
@@ -353,6 +356,13 @@ static void gst_tidmaivideosink_class_init(GstTIDmaiVideoSinkClass * klass)
GST_DEBUG_FUNCPTR(gst_tidmaivideosink_preroll);
gstbase_sink_class->render =
GST_DEBUG_FUNCPTR(gst_tidmaivideosink_render);
+ gstbase_sink_class->buffer_alloc =
+ GST_DEBUG_FUNCPTR(gst_tidmaivideosink_buffer_alloc);
+
+ /* Pad-buffer allocation is currently only supported for DM365 */
+ #if !defined(Platform_dm365)
+ gstbase_sink_class->buffer_alloc = NULL;
+ #endif
}
@@ -663,6 +673,132 @@ static gboolean gst_tidmaivideosink_event(GstBaseSink * bsink,
/******************************************************************************
+ * gst_tidmaivideosink_buffer_alloc
+ ******************************************************************************/
+static GstFlowReturn gst_tidmaivideosink_buffer_alloc(GstBaseSink * bsink,
+ guint64 offset, guint size, GstCaps * caps,
+ GstBuffer ** buf)
+{
+ GstTIDmaiVideoSink *dmaisink = GST_TIDMAIVIDEOSINK(bsink);
+ BufferGfx_Attrs gfxAttrs = BufferGfx_Attrs_DEFAULT;
+ gboolean alloc_unref = FALSE;
+ Buffer_Handle hDispBuf = NULL;
+ GstCaps *alloc_caps;
+
+ *buf = NULL;
+
+ GST_LOG_OBJECT(dmaisink,
+ "a buffer of %d bytes was requested with caps %" GST_PTR_FORMAT
+ " and offset %" G_GUINT64_FORMAT, size, caps, offset);
+
+ /* assume we're going to alloc what was requested, keep track of wheter we
+ * need to unref or not. When we suggest a new format upstream we will
+ * create a new caps that we need to unref. */
+ alloc_caps = caps;
+
+ /* Process the buffer caps */
+ if (!gst_tidmaivideosink_process_caps(bsink, alloc_caps)) {
+ return GST_FLOW_UNEXPECTED;
+ }
+
+ /* Pad buffer allocation requires that we use user-allocated display
+ * buffers.
+ */
+ if (!dmaisink->useUserptrBufs && dmaisink->hDisplay) {
+ GST_ELEMENT_ERROR(dmaisink, RESOURCE, FAILED,
+ ("Cannot use pad buffer allocation after mmap buffers already "
+ "in use\n"), (NULL));
+ return GST_FLOW_UNEXPECTED;
+ }
+ else {
+ dmaisink->useUserptrBufs = TRUE;
+ }
+
+ /* Allocate the display buffers */
+ if (!dmaisink->hDispBufTab && dmaisink->useUserptrBufs) {
+
+ /* Set the display attributes now so we can allocate display buffers */
+ if (!gst_tidmaivideosink_set_display_attrs(dmaisink,
+ dmaisink->dGfxAttrs.colorSpace)) {
+ GST_ERROR("Error while trying to set the display attributes\n");
+ return GST_FLOW_UNEXPECTED;
+ }
+
+ if (!gst_tidmaivideosink_alloc_display_buffers(dmaisink, size)) {
+ GST_ERROR("Failed to allocate display buffers");
+ return GST_FLOW_UNEXPECTED;
+ }
+ }
+
+ /* Get a buffer from the BufTab or display driver */
+ if (!(hDispBuf = gst_tidmaibuftab_get_buf(dmaisink->hDispBufTab))) {
+ if (dmaisink->hDisplay &&
+ Display_get(dmaisink->hDisplay, &hDispBuf) < 0) {
+ GST_ELEMENT_ERROR(dmaisink, RESOURCE, FAILED,
+ ("Failed to get display buffer\n"), (NULL));
+ return GST_FLOW_UNEXPECTED;
+ }
+ }
+
+ /* If the geometry doesn't match, generate a new caps for it */
+ Buffer_getAttrs(hDispBuf, BufferGfx_getBufferAttrs(&gfxAttrs));
+
+ if (gfxAttrs.dim.width != dmaisink->dGfxAttrs.dim.width ||
+ gfxAttrs.dim.height != dmaisink->dGfxAttrs.dim.height ||
+ gfxAttrs.colorSpace != dmaisink->dGfxAttrs.colorSpace) {
+
+ GstCaps *desired_caps;
+ GstStructure *desired_struct;
+
+ /* make a copy of the incomming caps to create the new suggestion. We
+ * can't use make_writable because we might then destroy the original
+ * caps which we still need when the peer does not accept the
+ * suggestion.
+ */
+ desired_caps = gst_caps_copy (caps);
+ desired_struct = gst_caps_get_structure (desired_caps, 0);
+
+ GST_DEBUG ("we prefer to receive a %ldx%ld video; %ldx%ld was requested",
+ gfxAttrs.dim.width, gfxAttrs.dim.height,
+ dmaisink->dGfxAttrs.dim.width, dmaisink->dGfxAttrs.dim.height);
+ gst_structure_set (desired_struct, "width", G_TYPE_INT,
+ gfxAttrs.dim.width, NULL);
+ gst_structure_set (desired_struct, "height", G_TYPE_INT,
+ gfxAttrs.dim.height, NULL);
+
+ if (gst_pad_peer_accept_caps (GST_VIDEO_SINK_PAD (dmaisink),
+ desired_caps)) {
+ alloc_caps = desired_caps;
+ alloc_unref = TRUE;
+
+ if (!gst_tidmaivideosink_process_caps(bsink, alloc_caps)) {
+ return GST_FLOW_UNEXPECTED;
+ }
+ GST_DEBUG ("peer pad accepts our desired caps %" GST_PTR_FORMAT,
+ desired_caps);
+ }
+ else {
+ GST_DEBUG ("peer pad does not accept our desired caps %"
+ GST_PTR_FORMAT, desired_caps);
+ }
+ }
+
+ /* Return the display buffer */
+ BufferGfx_resetDimensions(hDispBuf);
+ Buffer_freeUseMask(hDispBuf, gst_tidmaibuffer_DISPLAY_FREE);
+ *buf = gst_tidmaibuffertransport_new(hDispBuf, NULL);
+ gst_buffer_set_caps(*buf, alloc_caps);
+
+ /* If we allocated new caps, unref them now */
+ if (alloc_unref) {
+ gst_caps_unref (alloc_caps);
+ }
+
+ return GST_FLOW_OK;
+}
+
+
+/******************************************************************************
* gst_tidmaivideosink_preroll
******************************************************************************/
static GstFlowReturn gst_tidmaivideosink_preroll(GstBaseSink * bsink,
@@ -1282,6 +1418,18 @@ static gboolean gst_tidmaivideosink_init_display(GstTIDmaiVideoSink * sink)
return FALSE;
}
+ /* If we own the display buffers, tell DMAI to delay starting the
+ * display until we call Display_put for the first time.
+ */
+ if (sink->hDispBufTab) {
+ #if defined(Platform_dm365)
+ sink->dAttrs.delayStreamon = TRUE;
+ #else
+ GST_ERROR("delayed V4L2 streamon not supported\n");
+ return FALSE;
+ #endif
+ }
+
/* Allocate user-allocated display buffers, if requested */
if (!sink->hDispBufTab && sink->useUserptrBufs) {
if (!gst_tidmaivideosink_alloc_display_buffers(sink, 0)) {
@@ -1416,9 +1564,6 @@ static gboolean gst_tidmaivideosink_process_caps(GstBaseSink * bsink,
gst_structure_get_fraction(structure, "framerate", &framerateNum,
&framerateDen);
- /* Error check new values against existing ones */
- /* TBD */
-
/* Populate the display graphics attributes */
dmaisink->dGfxAttrs.bAttrs.reference = dmaisink->contiguousInputFrame;
dmaisink->dGfxAttrs.dim.width = width;
@@ -1445,9 +1590,10 @@ static gboolean gst_tidmaivideosink_process_caps(GstBaseSink * bsink,
static GstFlowReturn gst_tidmaivideosink_render(GstBaseSink * bsink,
GstBuffer * buf)
{
- Buffer_Handle hDispBuf = NULL;
- Buffer_Handle inBuf = NULL;
- GstTIDmaiVideoSink *sink = GST_TIDMAIVIDEOSINK(bsink);
+ Buffer_Handle hDispBuf = NULL;
+ Buffer_Handle inBuf = NULL;
+ gboolean inBufIsOurs = FALSE;
+ GstTIDmaiVideoSink *sink = GST_TIDMAIVIDEOSINK(bsink);
BufferGfx_Dimensions dim;
gchar dur_str[64];
gchar ts_str[64];
@@ -1470,7 +1616,10 @@ static GstFlowReturn gst_tidmaivideosink_render(GstBaseSink * bsink,
* generated via videotestsrc plugin.
*/
if (GST_IS_TIDMAIBUFFERTRANSPORT(buf)) {
- inBuf = GST_TIDMAIBUFFERTRANSPORT_DMAIBUF(buf);
+ inBuf = GST_TIDMAIBUFFERTRANSPORT_DMAIBUF(buf);
+ inBufIsOurs = (sink->hDispBufTab &&
+ GST_TIDMAIBUFTAB_BUFTAB(sink->hDispBufTab) ==
+ Buffer_getBufTab(inBuf));
} else {
/* allocate DMAI buffer */
if (sink->tempDmaiBuf == NULL) {
@@ -1532,11 +1681,33 @@ static GstFlowReturn gst_tidmaivideosink_render(GstBaseSink * bsink,
*/
for (i = 0; i < sink->framerepeat; i++) {
- /* Get a buffer from the display driver */
- if (Display_get(sink->hDisplay, &hDispBuf) < 0) {
- GST_ELEMENT_ERROR(sink, RESOURCE, FAILED,
- ("Failed to get display buffer\n"), (NULL));
- goto cleanup;
+ /* If the input buffer originated from this element via pad allocation,
+ * simply give it back to the display and continue.
+ */
+ if (inBufIsOurs) {
+
+ /* Mark buffer as in-use by the display so it can't be re-used
+ * until it comes back from Display_get */
+ Buffer_setUseMask(inBuf, Buffer_getUseMask(inBuf) |
+ gst_tidmaibuffer_DISPLAY_FREE);
+
+ if (Display_put(sink->hDisplay, inBuf) < 0) {
+ GST_ELEMENT_ERROR(sink, RESOURCE, FAILED,
+ ("Failed to put display buffer\n"), (NULL));
+ goto cleanup;
+ }
+ continue;
+ }
+
+ /* Otherwise, our input buffer originated from up-stream. Retrieve a
+ * display buffer to copy the contents into.
+ */
+ else {
+ if (Display_get(sink->hDisplay, &hDispBuf) < 0) {
+ GST_ELEMENT_ERROR(sink, RESOURCE, FAILED,
+ ("Failed to get display buffer\n"), (NULL));
+ goto cleanup;
+ }
}
/* Retrieve the dimensions of the display buffer */
@@ -1844,8 +2015,10 @@ static gboolean gst_tidmaivideosink_alloc_display_buffers(
gfxAttrs.dim.height, gfxAttrs.dim.lineLength, gfxAttrs.colorSpace);
}
+ gfxAttrs.bAttrs.useMask = gst_tidmaibuffer_VIDEOSINK_FREE;
sink->hDispBufTab = gst_tidmaibuftab_new(sink->dAttrs.numBufs, bufSize,
BufferGfx_getBufferAttrs(&gfxAttrs));
+ gst_tidmaibuftab_set_blocking(sink->hDispBufTab, FALSE);
return TRUE;
}
--
1.7.0.4

View File

@@ -1,302 +0,0 @@
From e5a264465c1c77d5fc18eeb51b99c79fc3f28a3e Mon Sep 17 00:00:00 2001
From: Don Darling <don.osc2@gmail.com>
Date: Tue, 8 Jun 2010 13:48:51 -0500
Subject: [PATCH 8/8] Add support for pad-allocated buffers in TIViddec2.
When padAllocOutbufs=TRUE is specified to the TIViddec2 element, it will
attempt to allocate buffers from downstream instead of allocating its own.
Downstream buffers will only be used if it can be determined that they are
all members of a DMAI BufTab, which means they are CMEM-based, and will work
with the codecs. Currently, the only known downstream element that can provide
these buffers is TIDmaiVideoSink, and it is only supported for DM365.
There is currently no support for centering small clips in the middle of the
display screen -- this would require additional support in the display driver.
As a result, pad-allocation can currently only be used with clips that are at
least as large as the display, and this feature not enabled by default because
of these strict clip-size requirements.
On DM365, there are known issues with the MPEG-2 decoder's output buffer size
calculation that cause it not to work with D1 resolutions unless you hard-code
the size. H.264 and MPEG-4 decoders work as expected, and MPEG-2 works as
expected for 720p.
---
.../ti_build/ticodecplugin/src/gsttividdec2.c | 159 ++++++++++++++++----
.../ti_build/ticodecplugin/src/gsttividdec2.h | 1 +
2 files changed, 127 insertions(+), 33 deletions(-)
diff --git a/gstreamer_ti/ti_build/ticodecplugin/src/gsttividdec2.c b/gstreamer_ti/ti_build/ticodecplugin/src/gsttividdec2.c
index c39208f..ec3cb05 100644
--- a/gstreamer_ti/ti_build/ticodecplugin/src/gsttividdec2.c
+++ b/gstreamer_ti/ti_build/ticodecplugin/src/gsttividdec2.c
@@ -73,7 +73,8 @@ enum
PROP_FRAMERATE, /* framerate (GstFraction) */
PROP_DISPLAY_BUFFER, /* displayBuffer (boolean) */
PROP_GEN_TIMESTAMPS, /* genTimeStamps (boolean) */
- PROP_RTCODECTHREAD /* rtCodecThread (boolean) */
+ PROP_RTCODECTHREAD, /* rtCodecThread (boolean) */
+ PROP_PAD_ALLOC_OUTBUFS /* padAllocOutbufs (boolean) */
};
/* Define sink (input) pad capabilities. Currently, MPEG and H264 are
@@ -170,8 +171,8 @@ static GstClockTime
gst_tividdec2_frame_duration(GstTIViddec2 *viddec2);
static gboolean
gst_tividdec2_resizeBufTab(GstTIViddec2 *viddec2);
-static gboolean
- gst_tividdec2_codec_start (GstTIViddec2 *viddec2);
+static gboolean
+ gst_tividdec2_codec_start (GstTIViddec2 *viddec2, GstBuffer **padBuffer);
static gboolean
gst_tividdec2_codec_stop (GstTIViddec2 *viddec2);
static void
@@ -324,6 +325,11 @@ static void gst_tividdec2_class_init(GstTIViddec2Class *klass)
g_param_spec_boolean("genTimeStamps", "Generate Time Stamps",
"Set timestamps on output buffers",
TRUE, G_PARAM_WRITABLE));
+
+ g_object_class_install_property(gobject_class, PROP_PAD_ALLOC_OUTBUFS,
+ g_param_spec_boolean("padAllocOutbufs", "Use pad allocation",
+ "Try to allocate buffers with pad allocation",
+ FALSE, G_PARAM_WRITABLE));
}
/******************************************************************************
@@ -448,6 +454,7 @@ static void gst_tividdec2_init(GstTIViddec2 *viddec2, GstTIViddec2Class *gclass)
viddec2->numOutputBufs = 0UL;
viddec2->hOutBufTab = NULL;
+ viddec2->padAllocOutbufs = FALSE;
viddec2->circBuf = NULL;
viddec2->sps_pps_data = NULL;
@@ -548,6 +555,10 @@ static void gst_tividdec2_set_property(GObject *object, guint prop_id,
viddec2->rtCodecThread = g_value_get_boolean(value);
GST_LOG("setting \"RTCodecThread\" to \"%s\"\n",
viddec2->rtCodecThread ? "TRUE" : "FALSE");
+ case PROP_PAD_ALLOC_OUTBUFS:
+ viddec2->padAllocOutbufs = g_value_get_boolean(value);
+ GST_LOG("setting \"padAllocOutbufs\" to \"%s\"\n",
+ viddec2->padAllocOutbufs ? "TRUE" : "FALSE");
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
@@ -1079,9 +1090,9 @@ static gboolean gst_tividdec2_init_video(GstTIViddec2 *viddec2)
*/
Rendezvous_meet(viddec2->waitOnDecodeThread);
- if (viddec2->circBuf == NULL || viddec2->hOutBufTab == NULL) {
+ if (viddec2->circBuf == NULL) {
GST_ELEMENT_ERROR(viddec2, RESOURCE, FAILED,
- ("decode thread failed to create circbuf or display buffer handles\n"),
+ ("decode thread failed to create circbuf handles\n"),
(NULL));
return FALSE;
}
@@ -1260,11 +1271,13 @@ static gboolean gst_tividdec2_codec_stop (GstTIViddec2 *viddec2)
* gst_tividdec2_codec_start
* Initialize codec engine
*****************************************************************************/
-static gboolean gst_tividdec2_codec_start (GstTIViddec2 *viddec2)
+static gboolean gst_tividdec2_codec_start (GstTIViddec2 *viddec2,
+ GstBuffer **padBuffer)
{
- VIDDEC2_Params params = Vdec2_Params_DEFAULT;
- VIDDEC2_DynamicParams dynParams = Vdec2_DynamicParams_DEFAULT;
- BufferGfx_Attrs gfxAttrs = BufferGfx_Attrs_DEFAULT;
+ VIDDEC2_Params params = Vdec2_Params_DEFAULT;
+ VIDDEC2_DynamicParams dynParams = Vdec2_DynamicParams_DEFAULT;
+ BufferGfx_Attrs gfxAttrs = BufferGfx_Attrs_DEFAULT;
+ BufTab_Handle codecBufTab = NULL;
Cpu_Device device;
ColorSpace_Type colorSpace;
Int defaultNumBufs;
@@ -1364,30 +1377,77 @@ static gboolean gst_tividdec2_codec_start (GstTIViddec2 *viddec2)
viddec2->numOutputBufs = defaultNumBufs;
}
- /* Create codec output buffers */
- GST_LOG("creating output buffer table\n");
- gfxAttrs.colorSpace = colorSpace;
- gfxAttrs.dim.width = params.maxWidth;
- gfxAttrs.dim.height = params.maxHeight;
- gfxAttrs.dim.lineLength = BufferGfx_calcLineLength(
- gfxAttrs.dim.width, gfxAttrs.colorSpace);
+ /* Try to allocate a buffer from downstream. To do this, we must first
+ * set the framerate to a reasonable default if one hasn't been specified,
+ * and we need to set the source pad caps with the stream information we
+ * have so far.
+ */
+ gst_tividdec2_frame_duration(viddec2);
+ gst_tividdec2_set_source_caps_base(viddec2, params.maxWidth,
+ params.maxHeight, colorSpace);
+
+ *padBuffer = NULL;
+ if (viddec2->padAllocOutbufs) {
+ if (gst_pad_alloc_buffer(viddec2->srcpad, 0,
+ Vdec2_getOutBufSize(viddec2->hVd), GST_PAD_CAPS(viddec2->srcpad),
+ padBuffer) != GST_FLOW_OK) {
+ GST_LOG("failed to allocate a downstream buffer\n");
+ *padBuffer = NULL;
+ }
+
+ if (*padBuffer && !GST_IS_TIDMAIBUFFERTRANSPORT(*padBuffer)) {
+ GST_LOG("downstream buffer is not a DMAI buffer; disabling use of "
+ "pad-allocated buffers\n");
+ gst_buffer_unref(*padBuffer);
+ *padBuffer = NULL;
+ }
+
+ if (*padBuffer) {
+ codecBufTab = Buffer_getBufTab(
+ GST_TIDMAIBUFFERTRANSPORT_DMAIBUF(*padBuffer));
+
+ if (!codecBufTab) {
+ GST_LOG("downstream buffer is not a BufTab member; disabling "
+ "use of pad-allocated buffers\n");
+ gst_buffer_unref(*padBuffer);
+ *padBuffer = NULL;
+ }
+ }
+ }
+
+ /* If we can't use pad-allocated buffers, allocate our own BufTab for
+ * output buffers to push downstream.
+ */
+ if (!(*padBuffer)) {
+
+ GST_LOG("creating output buffer table\n");
+ gfxAttrs.colorSpace = colorSpace;
+ gfxAttrs.dim.width = params.maxWidth;
+ gfxAttrs.dim.height = params.maxHeight;
+ gfxAttrs.dim.lineLength = BufferGfx_calcLineLength(
+ gfxAttrs.dim.width, gfxAttrs.colorSpace);
- /* By default, new buffers are marked as in-use by the codec */
- gfxAttrs.bAttrs.useMask = gst_tidmaibuffer_CODEC_FREE;
+ /* By default, new buffers are marked as in-use by the codec */
+ gfxAttrs.bAttrs.useMask = gst_tidmaibuffer_CODEC_FREE;
- viddec2->hOutBufTab = gst_tidmaibuftab_new(
- viddec2->numOutputBufs, Vdec2_getOutBufSize(viddec2->hVd),
- BufferGfx_getBufferAttrs(&gfxAttrs));
+ viddec2->hOutBufTab = gst_tidmaibuftab_new(
+ viddec2->numOutputBufs, Vdec2_getOutBufSize(viddec2->hVd),
+ BufferGfx_getBufferAttrs(&gfxAttrs));
+
+ codecBufTab = GST_TIDMAIBUFTAB_BUFTAB(viddec2->hOutBufTab);
+ }
- if (viddec2->hOutBufTab == NULL) {
+ /* The value of codecBufTab should now either point to a downstream
+ * BufTab or our own BufTab.
+ */
+ if (codecBufTab == NULL) {
GST_ELEMENT_ERROR(viddec2, RESOURCE, NO_SPACE_LEFT,
- ("failed to create output buffers\n"), (NULL));
+ ("no BufTab available for codec output\n"), (NULL));
return FALSE;
}
- /* Tell the Vdec module that hOutBufTab will be used for display buffers */
- Vdec2_setBufTab(viddec2->hVd,
- GST_TIDMAIBUFTAB_BUFTAB(viddec2->hOutBufTab));
+ /* Tell the Vdec module what BufTab it will be using for its output */
+ Vdec2_setBufTab(viddec2->hVd, codecBufTab);
return TRUE;
}
@@ -1403,8 +1463,10 @@ static void* gst_tividdec2_decode_thread(void *arg)
{
GstTIViddec2 *viddec2 = GST_TIVIDDEC2(gst_object_ref(arg));
GstBuffer *encDataWindow = NULL;
+ GstBuffer *padBuffer = NULL;
Buffer_Attrs bAttrs = Buffer_Attrs_DEFAULT;
gboolean codecFlushed = FALSE;
+ gboolean usePadBufs = FALSE;
void *threadRet = GstTIThreadSuccess;
Buffer_Handle hDummyInputBuf = NULL;
Buffer_Handle hDstBuf;
@@ -1420,7 +1482,8 @@ static void* gst_tividdec2_decode_thread(void *arg)
GST_LOG("init video decode_thread \n");
/* Initialize codec engine */
- ret = gst_tividdec2_codec_start(viddec2);
+ ret = gst_tividdec2_codec_start(viddec2, &padBuffer);
+ usePadBufs = (padBuffer != NULL);
/* Notify main thread that is ok to continue initialization */
Rendezvous_meet(viddec2->waitOnDecodeThread);
@@ -1476,7 +1539,34 @@ static void* gst_tividdec2_decode_thread(void *arg)
}
/* Obtain a free output buffer for the decoded data */
- if (!(hDstBuf = gst_tidmaibuftab_get_buf(viddec2->hOutBufTab))) {
+ if (usePadBufs) {
+
+ /* First time through this loop, padBuffer will already be set
+ * to the buffer we got in codec_start. It will be NULL for every
+ * frame after that.
+ */
+ if (G_LIKELY(!padBuffer)) {
+ if (gst_pad_alloc_buffer(viddec2->srcpad, 0, 0,
+ GST_PAD_CAPS(viddec2->srcpad), &padBuffer)
+ != GST_FLOW_OK) {
+ GST_ELEMENT_ERROR(viddec2, RESOURCE, READ,
+ ("failed to allocate a downstream buffer\n"), (NULL));
+ padBuffer = NULL;
+ goto thread_exit;
+ }
+ }
+ hDstBuf = GST_TIDMAIBUFFERTRANSPORT_DMAIBUF(padBuffer);
+ gst_buffer_unref(padBuffer);
+ padBuffer = NULL;
+
+ /* Set the CODEC_FREE flag -- this isn't done automatically when
+ * allocating buffers from downstream.
+ */
+ Buffer_setUseMask(hDstBuf, Buffer_getUseMask(hDstBuf) |
+ gst_tidmaibuffer_CODEC_FREE);
+
+ }
+ else if (!(hDstBuf = gst_tidmaibuftab_get_buf(viddec2->hOutBufTab))) {
GST_ELEMENT_ERROR(viddec2, RESOURCE, READ,
("failed to get a free contiguous buffer from BufTab\n"),
(NULL));
@@ -1623,12 +1713,15 @@ thread_failure:
thread_exit:
/* Re-claim any buffers owned by the codec */
- bufIdx = BufTab_getNumBufs(GST_TIDMAIBUFTAB_BUFTAB(viddec2->hOutBufTab));
+ if (viddec2->hOutBufTab) {
+ bufIdx =
+ BufTab_getNumBufs(GST_TIDMAIBUFTAB_BUFTAB(viddec2->hOutBufTab));
- while (bufIdx-- > 0) {
- Buffer_Handle hBuf = BufTab_getBuf(
- GST_TIDMAIBUFTAB_BUFTAB(viddec2->hOutBufTab), bufIdx);
- Buffer_freeUseMask(hBuf, gst_tidmaibuffer_CODEC_FREE);
+ while (bufIdx-- > 0) {
+ Buffer_Handle hBuf = BufTab_getBuf(
+ GST_TIDMAIBUFTAB_BUFTAB(viddec2->hOutBufTab), bufIdx);
+ Buffer_freeUseMask(hBuf, gst_tidmaibuffer_CODEC_FREE);
+ }
}
/* Release the last buffer we retrieved from the circular buffer */
diff --git a/gstreamer_ti/ti_build/ticodecplugin/src/gsttividdec2.h b/gstreamer_ti/ti_build/ticodecplugin/src/gsttividdec2.h
index b16e9c5..6b09d2a 100644
--- a/gstreamer_ti/ti_build/ticodecplugin/src/gsttividdec2.h
+++ b/gstreamer_ti/ti_build/ticodecplugin/src/gsttividdec2.h
@@ -91,6 +91,7 @@ struct _GstTIViddec2
UInt32 numOutputBufs;
GstTIDmaiBufTab *hOutBufTab;
GstTICircBuffer *circBuf;
+ gboolean padAllocOutbufs;
/* Quicktime h264 header */
GstBuffer *sps_pps_data;
--
1.7.0.4

View File

@@ -1,26 +0,0 @@
From 721970f80e6bff0f231625f00301fa37473a2bb3 Mon Sep 17 00:00:00 2001
From: Brijesh Singh <bksingh@ti.com>
Date: Wed, 7 Jul 2010 19:21:01 -0500
Subject: [PATCH 9/9] dmaisink compilation fix
temporary fix - should go in svn trunk
---
src/gsttidmaivideosink.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/src/gsttidmaivideosink.c b/src/gsttidmaivideosink.c
index 99ca25d..2fb5aad 100644
--- a/src/gsttidmaivideosink.c
+++ b/src/gsttidmaivideosink.c
@@ -1817,7 +1817,7 @@ static gboolean gst_tidmaivideosink_alloc_display_buffers(
return FALSE;
}
- GST_INFO("Allocating %ld display buffers", sink->dAttrs.numBufs);
+ GST_INFO("Allocating %d display buffers", sink->dAttrs.numBufs);
/* Set the dimensions for the display */
if (VideoStd_getResolution(sink->dAttrs.videoStd, &gfxAttrs.dim.width,
--
1.7.0.4

View File

@@ -1,26 +0,0 @@
From d5601a8beec6144fb39ebdc93778c081028a7fdd Mon Sep 17 00:00:00 2001
From: Brijesh Singh <bksingh@ti.com>
Date: Tue, 28 Sep 2010 19:35:14 -0500
Subject: [PATCH] update dm365 cfg to work with platinum codecs
---
src/gstticodecplugin_dm365.cfg | 3 +++
1 files changed, 3 insertions(+), 0 deletions(-)
diff --git a/src/gstticodecplugin_dm365.cfg b/src/gstticodecplugin_dm365.cfg
index d682643..43174b1 100644
--- a/src/gstticodecplugin_dm365.cfg
+++ b/src/gstticodecplugin_dm365.cfg
@@ -86,6 +86,9 @@ var ADDRSPACE = xdc.useModule('ti.sdo.fc.ires.addrspace.ADDRSPACE');
var CMEM = xdc.useModule('ti.sdo.linuxutils.cmem.CMEM');
+var MEMTCM = xdc.useModule('ti.sdo.fc.ires.memtcm.MEMTCM');
+MEMTCM.cmemBlockId = 1; //Since we use _1 in our insmod command.
+
/* Uncomment these lines if you wish to debug FC and enable FC trace */
/*
/*
--
1.7.0.4

View File

@@ -1,119 +0,0 @@
From 0f2ef84ad320ec141a7ba6727cf18817ac42e413 Mon Sep 17 00:00:00 2001
From: Brijesh Singh <bksingh@ti.com>
Date: Mon, 4 Oct 2010 14:11:39 -0500
Subject: [PATCH] replace omap3530_dv400 platform support with omap3530
---
Makefile.external | 19 +++----------
src/gstticodecplugin_omap3530_dv400.cfg | 44 -------------------------------
2 files changed, 5 insertions(+), 58 deletions(-)
delete mode 100644 src/gstticodecplugin_omap3530_dv400.cfg
diff --git a/Makefile.external b/Makefile.external
index 6d118d8..2a85108 100644
--- a/Makefile.external
+++ b/Makefile.external
@@ -8,7 +8,7 @@
# Copyright (C) 2009 Ridgerun
#
-.PHONY: default configure dm6446 omap3530 dm355 dm6467 dm365 omapl138 omap3530_dv400
+.PHONY: default configure dm6446 omap3530 dm355 dm6467 dm365 omapl138
DVSDK_PATH=undefined
DMAI_INSTALL_DIR=undefined
@@ -23,7 +23,7 @@ $(error You need to define the environment variable DMAI_INSTALL_DIR)
endif
default:
- @echo "Please specify the target: dm6446, omap3530, dm355, dm6467, dm6467t, dm365 omapl138 omap3530_dv400"
+ @echo "Please specify the target: dm6446, omap3530, dm355, dm6467, dm6467t, dm365 omapl138"
export GST_TI_PLATFORM=$(MAKECMDGOALS)
export BIOS_INSTALL_DIR
@@ -87,6 +87,9 @@ ifeq ($(GST_TI_PLATFORM), omap3530)
export MVTOOL_DIR = $(CSTOOL_DIR)
export PLATFORM_XDC = ${XDC_PLATFORM}
export CROSS_COMPILE = ${CSTOOL_PREFIX}
+ export LINK_XDC_ROOT = $(LINK_INSTALL_DIR)
+ export C6ACCEL_INSTALL_DIR
+ export ENABLE_C6ACCEL ="--enable-c6accel"
endif
ifeq ($(GST_TI_PLATFORM), omapl138)
@@ -101,16 +104,6 @@ ifeq ($(GST_TI_PLATFORM), omapl138)
export ENABLE_C6ACCEL ="--enable-c6accel"
endif
-ifeq ($(GST_TI_PLATFORM), omap3530_dv400)
- export XDC_TARGET = gnu.targets.arm.GCArmv5T
- export XDC_PLATFORM = ti.platforms.evm3530
- export MVTOOL_PREFIX = $(CSTOOL_PREFIX)
- export MVTOOL_DIR = $(CSTOOL_DIR)
- export PLATFORM_XDC = ${XDC_PLATFORM}
- export CROSS_COMPILE = ${CSTOOL_PREFIX}
- export LINK_XDC_ROOT = $(LINK_INSTALL_DIR)
-endif
-
CPPFLAGS=-DPlatform_$(GST_TI_PLATFORM)
HOST=arm-none-linux-gnueabi
@@ -141,5 +134,3 @@ dm365: Makefile
omapl138: Makefile
$(MAKE) -f Makefile
-omap3530_dv400: Makefile
- $(MAKE) -f Makefile
diff --git a/src/gstticodecplugin_omap3530_dv400.cfg b/src/gstticodecplugin_omap3530_dv400.cfg
deleted file mode 100644
index 90f4edf..0000000
--- a/src/gstticodecplugin_omap3530_dv400.cfg
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright (C) 2008-2010 Texas Instruments Incorporated - http://www.ti.com/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation version 2.1 of the License.
- *
- * This program is distributed #as is# WITHOUT ANY WARRANTY of any kind,
- * whether express or implied; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- */
-
-/* Load the Codec Engine 'Operating System Abstraction Layer' */
-var osalGlobal = xdc.useModule('ti.sdo.ce.osal.Global');
-
-var os = xdc.useModule('ti.sdo.ce.osal.linux.Settings');
-osalGlobal.os = os;
-
-/* Configure CE to use it's DSP Link Linux version */
-var ipc = xdc.useModule('ti.sdo.ce.ipc.Settings');
-ipc.commType = ipc.COMM_DSPLINK;
-
-/*
- * ======== Engine Configuration ========
- */
-var Engine = xdc.useModule('ti.sdo.ce.Engine');
-var demoEngine = Engine.createFromServer(
- "codecServer",
- "./bin/cs.x64P",
- "ti.sdo.server.cs"
- );
-
-var combopath = "" + java.lang.System.getenv("CODEC_SERVER");
-if (combopath != "" && combopath != "null") {
- demoEngine.server = java.lang.System.getenv("CODEC_SERVER");
-}
-
-/* Load support for the DMAI module */
-var DMAI = xdc.loadPackage('ti.sdo.dmai');
-
-var SCPY = xdc.useModule('ti.sdo.fc.scpy.SCPY');
-var SDMA = xdc.useModule('ti.sdo.linuxutils.sdma.SDMA');
--
1.7.0.4

View File

@@ -1,12 +0,0 @@
#!/bin/sh
# Disable XDM 0.9 elements
export GST_TI_TIViddec_DISABLE=1
export GST_TI_TIAuddec_DISABLE=1
export GST_TI_TIVidenc_DISABLE=1
export GST_TI_TIImgdec_DISABLE=1
export GST_TI_TIImgenc_DISABLE=1
# Disable XDM 1.x audio decoder
export GST_TI_TIAuddec1_DISABLE=1

View File

@@ -1,37 +0,0 @@
#!/bin/sh
#
# Default DM365 Memory Map 128 MB
#
# Start Addr Size Description
# ----------------------------------------------------------------
# 0x00001000 32K ARM926 TCM memory used by platinum codec
# 0x80000000 48 MB Linux
# 0x83000000 12 MB Video driver memory (Linux)
# 0x83C00000 68 MB CMEM
# 0x88000000 BOTTOM ADDRESS
#
rmmod cmemk 2>/dev/null
# Pools configuration
modprobe cmemk phys_start=0x83C00000 phys_end=0x88000000 pools=1x16539648,1x4841472,4x1843200,14x1646592,1x282624,1x176128,1x147456,1x69632,1x61440,1x32768,2x20480,1x16384,1x12288,4x8192,69x4096 allowOverlap=1 phys_start_1=0x00001000 phys_end_1=0x00008000 pools_1=1x28672
# Decode + Display
#modprobe cmemk phys_start=0x83c00000 phys_end=0x88000000 pools=1x16539648,1x4841472,14x1646592,1x282624,1x176128,1x147456,1x69632,1x61440,1x32768,2x20480,1x12288,1x8192,64x4096
# Capture + Encode
#modprobe cmemk phys_start=0x83c00000 phys_end=0x88000000 pools=1x3112960,1x2764800,3x1536000,1x65536,1x61440,1x49152,1x20480,1x16384,2x8192,87x4096
# Resizer
#modprobe cmemk phys_start=0x83c00000 phys_end=0x88000000 pools=3x1843200
# Non-accel display
#modprobe cmemk phys_start=0x83c00000 phys_end=0x88000000 pools=1x1843200
modprobe irqk
modprobe edmak
modprobe dm365mmap
rm -f /dev/dm365mmap
mknod /dev/dm365mmap c `awk "\\$2==\"dm365mmap\" {print \\$1}" /proc/devices` 0

View File

@@ -1,28 +0,0 @@
#!/bin/sh
#
# configure kernel modules to run gst-ti plugins elements
#
load_module() {
echo
echo -n "Running /usr/share/ti/gst/<platform>/loadmodules.sh"
/usr/share/ti/gst/<platform>/loadmodules.sh
}
case "$1" in
start)
echo -n "Loading kernel modules for gstreamer-ti... "
load_module
echo " done"
;;
stop)
echo "Nothing to do"
;;
restart)
echo "Nothing to do"
;;
*)
echo "$0 <start/stop/restart>"
;;
esac

View File

@@ -1,10 +0,0 @@
[Unit]
Description=TI Gstreamer plugins init
ConditionKernelCommandLine=mem=MEMARGS
[Service]
ExecStart=/usr/share/ti/gst/<platform>/loadmodules.sh
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target

View File

@@ -1,22 +0,0 @@
#!/bin/sh
#
# CMEM Allocation
# 1x5250000 Circular buffer
# 6x829440,1x691200 Video buffers (max D1 PAL)
# 1x345600 Underlying software components (codecs, etc.)
# 1x1 Dummy buffer used during final flush
rmmod cmemk 2>/dev/null
modprobe cmemk allowOverlap=1 phys_start=0x86300000 phys_end=0x87300000 \
pools=1x5250000,6x829440,1x345600,1x691200,1x1
# insert DSP/BIOS Link driver
modprobe dsplinkk
# insert Local Power Manager driver
modprobe lpm_omap3530
# insert SDMA driver
modprobe sdmak

View File

@@ -1,12 +0,0 @@
#!/bin/sh
#
# configure kernel modules for TI DSP based gstreamer plugin
#
# insert cmemk, tell it to occupy physical 34MB-64MB.
#
modprobe cmemk phys_start=0xC2200000 phys_end=0xC3200000 \
pools=1x5250000,3x1048576,3x829440,1x256000,4x131072
modprobe dsplinkk

View File

@@ -1,16 +0,0 @@
#!/bin/sh
#
# configure kernel modules for TI DSP based gstreamer plugin
#
rmmod cmemk 2>/dev/null
rmmod dsplink 2>/dev/null
modprobe cmemk phys_start=0xC2200000 phys_end=0xC3200000 \
pools=1x5250000,3x1048576,3x829440,1x256000,4x131072 \
allowOverlap=1
modprobe dsplinkk
rm -f /dev/dsplink
mknod /dev/dsplink c `awk "\\$2==\"dsplink\" {print \\$1}" /proc/devices` 0

View File

@@ -1,15 +0,0 @@
#!/bin/sh
#
# configure kernel modules for TI DSP based gstreamer plugin
#
rmmod cmemk 2>/dev/null
modprobe cmemk phys_start=0xC2200000 phys_end=0xC3200000 \
pools=1x5250000,3x1048576,3x829440,1x256000,4x131072
modprobe dsplinkk
rm -f /dev/dsplink
mknod /dev/dsplink c `awk "\\$2==\"dsplink\" {print \\$1}" /proc/devices` 0

View File

@@ -1,22 +0,0 @@
diff -ur ticodecplugin_orig/src/gstticapturesrc.c ticodecplugin/src/gstticapturesrc.c
--- ticodecplugin_orig/src/gstticapturesrc.c 2011-08-09 17:03:39.201308305 +0200
+++ ticodecplugin/src/gstticapturesrc.c 2011-08-09 17:02:35.177308274 +0200
@@ -25,7 +25,6 @@
#include <gst/gst.h>
#include <string.h>
#include <gst/gstmarshal.h>
-#include <linux/videodev.h>
#include <linux/videodev2.h>
#include <sys/ioctl.h>
diff -ur ticodecplugin_orig/src/gsttidisplaysink2.c ticodecplugin/src/gsttidisplaysink2.c
--- ticodecplugin_orig/src/gsttidisplaysink2.c 2011-08-09 17:03:53.329308312 +0200
+++ ticodecplugin/src/gsttidisplaysink2.c 2011-08-09 17:03:11.337308292 +0200
@@ -28,7 +28,6 @@
#include <gst/video/video.h>
#include <string.h>
#include <gst/gstmarshal.h>
-#include <linux/videodev.h>
#include <linux/videodev2.h>
#include <sys/ioctl.h>

View File

@@ -1,26 +0,0 @@
require gstreamer-ti.inc
LIC_FILES_CHKSUM = "file://COPYING;md5=c8a292be1d17ba07ecbf7b49049cbf22"
PV = "svnr${SRCREV}"
S = "${WORKDIR}/gstreamer_ti/ti_build/ticodecplugin"
SRCREV = "962"
# apply patches from tracker 1208 to get zero copy support.
# https://gstreamer.ti.com/gf/project/gstreamer_ti/tracker/?action=TrackerItemEdit&tracker_item_id=1208&start=175
SRC_URI = "svn://gforge.ti.com/svn/gstreamer_ti/trunk;module=gstreamer_ti;protocol=https;user=anonymous;pswd='' \
file://gstreamer-ti-rc.sh \
file://r962-remove-include-videodev.diff \
file://gstti-init.service \
"
# use local loadmodules.sh for these platform
# TODO: must be removed onces these loadmodules goes in gstreamer.ti.com
SRC_URI_append_dm365 = " file://loadmodules.sh"
SRC_URI_append_omapl137 = " file://loadmodules.sh"
SRC_URI_append_omapl138 = " file://loadmodules.sh "
SRC_URI_append_omap3 = " file://loadmodules.sh "