mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-18 20:25:25 +00:00
Ported to 0.9 (faad, amrnb, mpeg2dec)
Original commit message from CVS: Ported to 0.9 (faad, amrnb, mpeg2dec)
This commit is contained in:
parent
a29a07acfb
commit
a853a4b182
3 changed files with 186 additions and 62 deletions
56
configure.ac
56
configure.ac
|
@ -378,6 +378,50 @@ GST_CHECK_FEATURE(AALIB, [aasink plug-in], aasink, [
|
||||||
AS_SCRUB_INCLUDE(AALIB_CFLAGS)
|
AS_SCRUB_INCLUDE(AALIB_CFLAGS)
|
||||||
])
|
])
|
||||||
|
|
||||||
|
dnl *** AMR-NB ***
|
||||||
|
translit(dnm, m, l) AM_CONDITIONAL(USE_AMRNB, true)
|
||||||
|
GST_CHECK_FEATURE(AMRNB, [AMR-NB], amrnbdec amrnbenc, [
|
||||||
|
GST_CHECK_LIBHEADER(AMRNB, amrnb,
|
||||||
|
Decoder_Interface_init, -lm,
|
||||||
|
amrnb/interf_dec.h,
|
||||||
|
AMRNB_LIBS="-lamrnb -lm"
|
||||||
|
AC_SUBST(AMRNB_LIBS))
|
||||||
|
])
|
||||||
|
|
||||||
|
dnl **** Free AAC Decoder (FAAD) ****
|
||||||
|
translit(dnm, m, l) AM_CONDITIONAL(USE_FAAD, true)
|
||||||
|
GST_CHECK_FEATURE(FAAD, [AAC decoder plug-in], faad, [
|
||||||
|
HAVE_FAAD="yes"
|
||||||
|
GST_CHECK_LIBHEADER(FAAD, faad, faacDecOpen, -lm, faad.h, FAAD_LIBS="-lfaad -lm", HAVE_FAAD="no")
|
||||||
|
if test $HAVE_FAAD = "yes"; then
|
||||||
|
AC_MSG_CHECKING([Checking for FAAD >= 2])
|
||||||
|
AC_TRY_RUN([
|
||||||
|
|
||||||
|
#include <faad.h>
|
||||||
|
#if !defined(FAAD2_VERSION) || !defined(FAAD_FMT_DOUBLE)
|
||||||
|
#error Not faad2
|
||||||
|
#else
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
char version[9] = FAAD2_VERSION;
|
||||||
|
// a release candidate of 2.0 is not enought for us
|
||||||
|
if ( strstr( version, "2.0 RC" ) ) { return 1; }
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
],
|
||||||
|
[ HAVE_FAAD="yes" && AC_MSG_RESULT(yes)],
|
||||||
|
[ HAVE_FAAD="no" && AC_MSG_RESULT(no)])
|
||||||
|
fi;
|
||||||
|
AS_SCRUB_INCLUDE(FAAD_CFLAGS)
|
||||||
|
AC_SUBST(FAAD_LIBS)
|
||||||
|
])
|
||||||
|
|
||||||
|
|
||||||
dnl *** libcaca ***
|
dnl *** libcaca ***
|
||||||
translit(dnm, m, l) AM_CONDITIONAL(USE_LIBCACA, true)
|
translit(dnm, m, l) AM_CONDITIONAL(USE_LIBCACA, true)
|
||||||
GST_CHECK_FEATURE(LIBCACA, [libcaca], libcaca, [
|
GST_CHECK_FEATURE(LIBCACA, [libcaca], libcaca, [
|
||||||
|
@ -434,6 +478,15 @@ GST_CHECK_FEATURE(MAD, [mad mp3 decoder], mad, [
|
||||||
])
|
])
|
||||||
AC_SUBST(MAD_LIBS)
|
AC_SUBST(MAD_LIBS)
|
||||||
|
|
||||||
|
dnl *** mpeg2dec ***
|
||||||
|
translit(dnm, m, l) AM_CONDITIONAL(USE_MPEG2DEC, true)
|
||||||
|
GST_CHECK_FEATURE(MPEG2DEC, [mpeg2dec], mpeg2dec, [
|
||||||
|
PKG_CHECK_MODULES(MPEG2DEC, libmpeg2 >= 0.4.0,
|
||||||
|
HAVE_MPEG2DEC="yes", HAVE_MPEG2DEC="no")
|
||||||
|
AC_SUBST(MPEG2DEC_CFLAGS)
|
||||||
|
AC_SUBST(MPEG2DEC_LIBS)
|
||||||
|
])
|
||||||
|
|
||||||
dnl *** dv1394 ***
|
dnl *** dv1394 ***
|
||||||
translit(dnm, m, l) AM_CONDITIONAL(USE_DV1394, true)
|
translit(dnm, m, l) AM_CONDITIONAL(USE_DV1394, true)
|
||||||
GST_CHECK_FEATURE(DV1394, [raw1394 and avc1394 library], dv1394src, [
|
GST_CHECK_FEATURE(DV1394, [raw1394 and avc1394 library], dv1394src, [
|
||||||
|
@ -555,6 +608,9 @@ ext/raw1394/Makefile
|
||||||
ext/shout2/Makefile
|
ext/shout2/Makefile
|
||||||
ext/sidplay/Makefile
|
ext/sidplay/Makefile
|
||||||
ext/esd/Makefile
|
ext/esd/Makefile
|
||||||
|
ext/mpeg2dec/Makefile
|
||||||
|
ext/faad/Makefile
|
||||||
|
ext/amrnb/Makefile
|
||||||
po/Makefile.in
|
po/Makefile.in
|
||||||
common/Makefile
|
common/Makefile
|
||||||
common/m4/Makefile
|
common/m4/Makefile
|
||||||
|
|
|
@ -10,11 +10,11 @@ else
|
||||||
AALIB_DIR=
|
AALIB_DIR=
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# if USE_AMRNB
|
if USE_AMRNB
|
||||||
# AMRNB_DIR=amrnb
|
AMRNB_DIR=amrnb
|
||||||
# else
|
else
|
||||||
AMRNB_DIR=
|
AMRNB_DIR=
|
||||||
# endif
|
endif
|
||||||
|
|
||||||
# if USE_ARTS
|
# if USE_ARTS
|
||||||
# ARTS_DIR=arts
|
# ARTS_DIR=arts
|
||||||
|
@ -106,11 +106,11 @@ endif
|
||||||
FAAC_DIR=
|
FAAC_DIR=
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
# if USE_FAAD
|
if USE_FAAD
|
||||||
# FAAD_DIR=faad
|
FAAD_DIR=faad
|
||||||
# else
|
else
|
||||||
FAAD_DIR=
|
FAAD_DIR=
|
||||||
# endif
|
endif
|
||||||
|
|
||||||
## if USE_FESTIVAL
|
## if USE_FESTIVAL
|
||||||
## FESTIVAL_DIR=festival
|
## FESTIVAL_DIR=festival
|
||||||
|
@ -238,11 +238,11 @@ endif
|
||||||
MIKMOD_DIR=
|
MIKMOD_DIR=
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
# if USE_MPEG2DEC
|
if USE_MPEG2DEC
|
||||||
# MPEG2DEC_DIR=mpeg2dec
|
MPEG2DEC_DIR=mpeg2dec
|
||||||
# else
|
else
|
||||||
MPEG2DEC_DIR=
|
MPEG2DEC_DIR=
|
||||||
#endif
|
endif
|
||||||
|
|
||||||
# if USE_MPEG2ENC
|
# if USE_MPEG2ENC
|
||||||
# MPEG2ENC_DIR=mpeg2enc
|
# MPEG2ENC_DIR=mpeg2enc
|
||||||
|
@ -440,4 +440,7 @@ DIST_SUBDIRS=\
|
||||||
libcaca \
|
libcaca \
|
||||||
esd \
|
esd \
|
||||||
raw1394 \
|
raw1394 \
|
||||||
dv
|
dv \
|
||||||
|
amrnb \
|
||||||
|
faad \
|
||||||
|
mpeg2dec
|
||||||
|
|
|
@ -79,12 +79,15 @@ static void gst_faad_base_init (GstFaadClass * klass);
|
||||||
static void gst_faad_class_init (GstFaadClass * klass);
|
static void gst_faad_class_init (GstFaadClass * klass);
|
||||||
static void gst_faad_init (GstFaad * faad);
|
static void gst_faad_init (GstFaad * faad);
|
||||||
|
|
||||||
|
/*
|
||||||
static GstPadLinkReturn
|
static GstPadLinkReturn
|
||||||
gst_faad_sinkconnect (GstPad * pad, const GstCaps * caps);
|
gst_faad_sinkconnect (GstPad * pad, const GstCaps * caps);
|
||||||
static GstPadLinkReturn
|
static GstPadLinkReturn
|
||||||
gst_faad_srcconnect (GstPad * pad, const GstCaps * caps);
|
gst_faad_srcconnect (GstPad * pad, const GstCaps * caps);*/
|
||||||
|
static gboolean gst_faad_setcaps (GstPad * pad, GstCaps * caps);
|
||||||
static GstCaps *gst_faad_srcgetcaps (GstPad * pad);
|
static GstCaps *gst_faad_srcgetcaps (GstPad * pad);
|
||||||
static void gst_faad_chain (GstPad * pad, GstData * data);
|
static gboolean gst_faad_event (GstPad * pad, GstEvent * event);
|
||||||
|
static GstFlowReturn gst_faad_chain (GstPad * pad, GstBuffer * buffer);
|
||||||
static GstElementStateReturn gst_faad_change_state (GstElement * element);
|
static GstElementStateReturn gst_faad_change_state (GstElement * element);
|
||||||
|
|
||||||
static GstElementClass *parent_class = NULL;
|
static GstElementClass *parent_class = NULL;
|
||||||
|
@ -155,28 +158,59 @@ gst_faad_init (GstFaad * faad)
|
||||||
faad->channel_positions = NULL;
|
faad->channel_positions = NULL;
|
||||||
faad->init = FALSE;
|
faad->init = FALSE;
|
||||||
|
|
||||||
GST_FLAG_SET (faad, GST_ELEMENT_EVENT_AWARE);
|
/* GST_FLAG_SET (faad, GST_ELEMENT_EVENT_AWARE); */
|
||||||
|
|
||||||
faad->sinkpad =
|
faad->sinkpad =
|
||||||
gst_pad_new_from_template (gst_static_pad_template_get (&sink_template),
|
gst_pad_new_from_template (gst_static_pad_template_get (&sink_template),
|
||||||
"sink");
|
"sink");
|
||||||
gst_element_add_pad (GST_ELEMENT (faad), faad->sinkpad);
|
gst_element_add_pad (GST_ELEMENT (faad), faad->sinkpad);
|
||||||
|
gst_pad_set_event_function (faad->sinkpad, gst_faad_event);
|
||||||
|
gst_pad_set_setcaps_function (faad->sinkpad, gst_faad_setcaps);
|
||||||
gst_pad_set_chain_function (faad->sinkpad, gst_faad_chain);
|
gst_pad_set_chain_function (faad->sinkpad, gst_faad_chain);
|
||||||
gst_pad_set_link_function (faad->sinkpad, gst_faad_sinkconnect);
|
/*gst_pad_set_link_function (faad->sinkpad, gst_faad_sinkconnect); */
|
||||||
|
|
||||||
faad->srcpad =
|
faad->srcpad =
|
||||||
gst_pad_new_from_template (gst_static_pad_template_get (&src_template),
|
gst_pad_new_from_template (gst_static_pad_template_get (&src_template),
|
||||||
"src");
|
"src");
|
||||||
gst_element_add_pad (GST_ELEMENT (faad), faad->srcpad);
|
gst_element_add_pad (GST_ELEMENT (faad), faad->srcpad);
|
||||||
gst_pad_set_link_function (faad->srcpad, gst_faad_srcconnect);
|
gst_pad_use_fixed_caps (faad->srcpad);
|
||||||
|
/*gst_pad_set_link_function (faad->srcpad, gst_faad_srcconnect); */
|
||||||
gst_pad_set_getcaps_function (faad->srcpad, gst_faad_srcgetcaps);
|
gst_pad_set_getcaps_function (faad->srcpad, gst_faad_srcgetcaps);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
gst_faad_setcaps (GstPad * pad, GstCaps * caps)
|
||||||
|
{
|
||||||
|
GstStructure *structure;
|
||||||
|
GstFaad *faad;
|
||||||
|
GstCaps *copy;
|
||||||
|
|
||||||
|
faad = GST_FAAD (GST_PAD_PARENT (pad));
|
||||||
|
|
||||||
|
structure = gst_caps_get_structure (caps, 0);
|
||||||
|
|
||||||
|
/* get channel count */
|
||||||
|
gst_structure_get_int (structure, "channels", &faad->channels);
|
||||||
|
gst_structure_get_int (structure, "rate", &faad->samplerate);
|
||||||
|
|
||||||
|
/* create reverse caps */
|
||||||
|
copy = gst_caps_new_simple ("audio/x-raw-float",
|
||||||
|
"channels", G_TYPE_INT, faad->channels,
|
||||||
|
"depth", G_TYPE_INT, G_STRINGIFY (bpp),
|
||||||
|
"endianness", G_TYPE_INT, G_BYTE_ORDER,
|
||||||
|
"rate", G_TYPE_INT, faad->samplerate);
|
||||||
|
|
||||||
|
gst_pad_set_caps (faad->srcpad, copy);
|
||||||
|
gst_caps_unref (copy);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Channel identifier conversion - caller g_free()s result!
|
* Channel identifier conversion - caller g_free()s result!
|
||||||
*/
|
*/
|
||||||
|
/*
|
||||||
static guchar *
|
static guchar *
|
||||||
gst_faad_chanpos_from_gst (GstAudioChannelPosition * pos, guint num)
|
gst_faad_chanpos_from_gst (GstAudioChannelPosition * pos, guint num)
|
||||||
{
|
{
|
||||||
|
@ -223,7 +257,7 @@ gst_faad_chanpos_from_gst (GstAudioChannelPosition * pos, guint num)
|
||||||
|
|
||||||
return fpos;
|
return fpos;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
static GstAudioChannelPosition *
|
static GstAudioChannelPosition *
|
||||||
gst_faad_chanpos_to_gst (guchar * fpos, guint num)
|
gst_faad_chanpos_to_gst (guchar * fpos, guint num)
|
||||||
{
|
{
|
||||||
|
@ -274,6 +308,7 @@ gst_faad_chanpos_to_gst (guchar * fpos, guint num)
|
||||||
return pos;
|
return pos;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
static GstPadLinkReturn
|
static GstPadLinkReturn
|
||||||
gst_faad_sinkconnect (GstPad * pad, const GstCaps * caps)
|
gst_faad_sinkconnect (GstPad * pad, const GstCaps * caps)
|
||||||
{
|
{
|
||||||
|
@ -282,18 +317,18 @@ gst_faad_sinkconnect (GstPad * pad, const GstCaps * caps)
|
||||||
const GValue *value;
|
const GValue *value;
|
||||||
GstBuffer *buf;
|
GstBuffer *buf;
|
||||||
|
|
||||||
/* Assume raw stream */
|
// Assume raw stream
|
||||||
faad->packetised = FALSE;
|
faad->packetised = FALSE;
|
||||||
|
|
||||||
if ((value = gst_structure_get_value (str, "codec_data"))) {
|
if ((value = gst_structure_get_value (str, "codec_data"))) {
|
||||||
gulong samplerate;
|
gulong samplerate;
|
||||||
guchar channels;
|
guchar channels;
|
||||||
|
|
||||||
/* We have codec data, means packetised stream */
|
// We have codec data, means packetised stream
|
||||||
faad->packetised = TRUE;
|
faad->packetised = TRUE;
|
||||||
buf = g_value_get_boxed (value);
|
buf = g_value_get_boxed (value);
|
||||||
|
|
||||||
/* someone forgot that char can be unsigned when writing the API */
|
// someone forgot that char can be unsigned when writing the API
|
||||||
if ((gint8) faacDecInit2 (faad->handle, GST_BUFFER_DATA (buf),
|
if ((gint8) faacDecInit2 (faad->handle, GST_BUFFER_DATA (buf),
|
||||||
GST_BUFFER_SIZE (buf), &samplerate, &channels) < 0)
|
GST_BUFFER_SIZE (buf), &samplerate, &channels) < 0)
|
||||||
return GST_PAD_LINK_REFUSED;
|
return GST_PAD_LINK_REFUSED;
|
||||||
|
@ -312,11 +347,11 @@ gst_faad_sinkconnect (GstPad * pad, const GstCaps * caps)
|
||||||
|
|
||||||
faad->need_channel_setup = TRUE;
|
faad->need_channel_setup = TRUE;
|
||||||
|
|
||||||
/* if there's no decoderspecificdata, it's all fine. We cannot know
|
// if there's no decoderspecificdata, it's all fine. We cannot know
|
||||||
* much more at this point... */
|
// * much more at this point...
|
||||||
return GST_PAD_LINK_OK;
|
return GST_PAD_LINK_OK;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
static GstCaps *
|
static GstCaps *
|
||||||
gst_faad_srcgetcaps (GstPad * pad)
|
gst_faad_srcgetcaps (GstPad * pad)
|
||||||
{
|
{
|
||||||
|
@ -395,7 +430,7 @@ gst_faad_srcgetcaps (GstPad * pad)
|
||||||
if (faad->channels != -1) {
|
if (faad->channels != -1) {
|
||||||
gst_structure_set (str, "channels", G_TYPE_INT, faad->channels, NULL);
|
gst_structure_set (str, "channels", G_TYPE_INT, faad->channels, NULL);
|
||||||
|
|
||||||
/* put channel information here */
|
// put channel information here */
|
||||||
if (faad->channel_positions) {
|
if (faad->channel_positions) {
|
||||||
GstAudioChannelPosition *pos;
|
GstAudioChannelPosition *pos;
|
||||||
|
|
||||||
|
@ -437,6 +472,7 @@ gst_faad_srcgetcaps (GstPad * pad)
|
||||||
return templ;
|
return templ;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
static GstPadLinkReturn
|
static GstPadLinkReturn
|
||||||
gst_faad_srcconnect (GstPad * pad, const GstCaps * caps)
|
gst_faad_srcconnect (GstPad * pad, const GstCaps * caps)
|
||||||
{
|
{
|
||||||
|
@ -455,15 +491,15 @@ gst_faad_srcconnect (GstPad * pad, const GstCaps * caps)
|
||||||
|
|
||||||
mimetype = gst_structure_get_name (structure);
|
mimetype = gst_structure_get_name (structure);
|
||||||
|
|
||||||
/* Samplerate and channels are normally provided through
|
// Samplerate and channels are normally provided through
|
||||||
* the getcaps function */
|
// * the getcaps function
|
||||||
if (!gst_structure_get_int (structure, "channels", &channels) ||
|
if (!gst_structure_get_int (structure, "channels", &channels) ||
|
||||||
!gst_structure_get_int (structure, "rate", &rate) ||
|
!gst_structure_get_int (structure, "rate", &rate) ||
|
||||||
rate != faad->samplerate || channels != faad->channels) {
|
rate != faad->samplerate || channels != faad->channels) {
|
||||||
return GST_PAD_LINK_REFUSED;
|
return GST_PAD_LINK_REFUSED;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Another internal checkup. */
|
// Another internal checkup.
|
||||||
if (faad->need_channel_setup) {
|
if (faad->need_channel_setup) {
|
||||||
GstAudioChannelPosition *pos;
|
GstAudioChannelPosition *pos;
|
||||||
guchar *fpos;
|
guchar *fpos;
|
||||||
|
@ -533,28 +569,55 @@ gst_faad_srcconnect (GstPad * pad, const GstCaps * caps)
|
||||||
if (faacDecSetConfiguration (faad->handle, conf) == 0)
|
if (faacDecSetConfiguration (faad->handle, conf) == 0)
|
||||||
return GST_PAD_LINK_REFUSED;
|
return GST_PAD_LINK_REFUSED;
|
||||||
|
|
||||||
/* FIXME: handle return value, how? */
|
// FIXME: handle return value, how?
|
||||||
faad->bps = depth / 8;
|
faad->bps = depth / 8;
|
||||||
|
|
||||||
return GST_PAD_LINK_OK;
|
return GST_PAD_LINK_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
return GST_PAD_LINK_REFUSED;
|
return GST_PAD_LINK_REFUSED;
|
||||||
|
}*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Data reading.
|
||||||
|
*/
|
||||||
|
static gboolean
|
||||||
|
gst_faad_event (GstPad * pad, GstEvent * event)
|
||||||
|
{
|
||||||
|
GstFaad *faad;
|
||||||
|
gboolean res;
|
||||||
|
|
||||||
|
faad = GST_FAAD (gst_pad_get_parent (pad));
|
||||||
|
|
||||||
|
GST_LOG ("handling event %d", GST_EVENT_TYPE (event));
|
||||||
|
|
||||||
|
switch (GST_EVENT_TYPE (event)) {
|
||||||
|
case GST_EVENT_EOS:
|
||||||
|
case GST_EVENT_DISCONTINUOUS:
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
res = gst_pad_event_default (faad->sinkpad, event);
|
||||||
|
|
||||||
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static GstFlowReturn
|
||||||
gst_faad_chain (GstPad * pad, GstData * data)
|
gst_faad_chain (GstPad * pad, GstBuffer * buffer)
|
||||||
{
|
{
|
||||||
|
GstFlowReturn ret = GST_FLOW_OK;
|
||||||
guint input_size;
|
guint input_size;
|
||||||
guint skip_bytes = 0;
|
guint skip_bytes = 0;
|
||||||
guchar *input_data;
|
guchar *input_data;
|
||||||
GstFaad *faad = GST_FAAD (gst_pad_get_parent (pad));
|
GstFaad *faad = GST_FAAD (gst_pad_get_parent (pad));
|
||||||
GstBuffer *buf, *outbuf;
|
GstBuffer *outbuf;
|
||||||
faacDecFrameInfo *info;
|
faacDecFrameInfo *info;
|
||||||
guint64 next_ts;
|
guint64 next_ts;
|
||||||
void *out;
|
void *out;
|
||||||
gboolean run_loop = TRUE;
|
gboolean run_loop = TRUE;
|
||||||
|
|
||||||
|
/*
|
||||||
if (GST_IS_EVENT (data)) {
|
if (GST_IS_EVENT (data)) {
|
||||||
GstEvent *event = GST_EVENT (data);
|
GstEvent *event = GST_EVENT (data);
|
||||||
|
|
||||||
|
@ -572,14 +635,14 @@ gst_faad_chain (GstPad * pad, GstData * data)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
info = g_new0 (faacDecFrameInfo, 1);
|
info = g_new0 (faacDecFrameInfo, 1);
|
||||||
|
|
||||||
/* buffer + remaining data */
|
/* buffer + remaining data */
|
||||||
buf = GST_BUFFER (data);
|
/* buf = GST_BUFFER (data); */
|
||||||
next_ts = GST_BUFFER_TIMESTAMP (buf);
|
next_ts = GST_BUFFER_TIMESTAMP (buffer);
|
||||||
if (faad->tempbuf) {
|
if (faad->tempbuf) {
|
||||||
buf = gst_buffer_join (faad->tempbuf, buf);
|
buffer = gst_buffer_join (faad->tempbuf, buffer);
|
||||||
faad->tempbuf = NULL;
|
faad->tempbuf = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -590,11 +653,12 @@ gst_faad_chain (GstPad * pad, GstData * data)
|
||||||
glong init_res;
|
glong init_res;
|
||||||
|
|
||||||
init_res = faacDecInit (faad->handle,
|
init_res = faacDecInit (faad->handle,
|
||||||
GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf), &samplerate, &channels);
|
GST_BUFFER_DATA (buffer), GST_BUFFER_SIZE (buffer), &samplerate,
|
||||||
|
&channels);
|
||||||
if (init_res < 0) {
|
if (init_res < 0) {
|
||||||
GST_ELEMENT_ERROR (faad, STREAM, DECODE, (NULL),
|
GST_ELEMENT_ERROR (faad, STREAM, DECODE, (NULL),
|
||||||
("Failed to init decoder from stream"));
|
("Failed to init decoder from stream"));
|
||||||
return;
|
return GST_FLOW_UNEXPECTED;
|
||||||
}
|
}
|
||||||
skip_bytes = init_res;
|
skip_bytes = init_res;
|
||||||
faad->init = TRUE;
|
faad->init = TRUE;
|
||||||
|
@ -609,8 +673,8 @@ gst_faad_chain (GstPad * pad, GstData * data)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* decode cycle */
|
/* decode cycle */
|
||||||
input_data = GST_BUFFER_DATA (buf);
|
input_data = GST_BUFFER_DATA (buffer);
|
||||||
input_size = GST_BUFFER_SIZE (buf);
|
input_size = GST_BUFFER_SIZE (buffer);
|
||||||
info->bytesconsumed = input_size - skip_bytes;
|
info->bytesconsumed = input_size - skip_bytes;
|
||||||
|
|
||||||
if (!faad->packetised) {
|
if (!faad->packetised) {
|
||||||
|
@ -660,7 +724,7 @@ gst_faad_chain (GstPad * pad, GstData * data)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fmt_change) {
|
if (fmt_change) {
|
||||||
GstPadLinkReturn ret;
|
/*GstPadLinkReturn ret; */
|
||||||
|
|
||||||
/* store new negotiation information */
|
/* store new negotiation information */
|
||||||
faad->samplerate = info->samplerate;
|
faad->samplerate = info->samplerate;
|
||||||
|
@ -671,12 +735,12 @@ gst_faad_chain (GstPad * pad, GstData * data)
|
||||||
memcpy (faad->channel_positions, info->channel_position,
|
memcpy (faad->channel_positions, info->channel_position,
|
||||||
faad->channels);
|
faad->channels);
|
||||||
|
|
||||||
/* and negotiate */
|
/* and negotiate
|
||||||
ret = gst_pad_renegotiate (faad->srcpad);
|
ret = gst_pad_renegotiate (faad->srcpad);
|
||||||
if (GST_PAD_LINK_FAILED (ret)) {
|
if (GST_PAD_LINK_FAILED (ret)) {
|
||||||
GST_ELEMENT_ERROR (faad, CORE, NEGOTIATION, (NULL), (NULL));
|
GST_ELEMENT_ERROR (faad, CORE, NEGOTIATION, (NULL), (NULL));
|
||||||
break;
|
break;
|
||||||
}
|
} */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* play decoded data */
|
/* play decoded data */
|
||||||
|
@ -690,25 +754,27 @@ gst_faad_chain (GstPad * pad, GstData * data)
|
||||||
if (GST_CLOCK_TIME_IS_VALID (next_ts)) {
|
if (GST_CLOCK_TIME_IS_VALID (next_ts)) {
|
||||||
next_ts += GST_BUFFER_DURATION (outbuf);
|
next_ts += GST_BUFFER_DURATION (outbuf);
|
||||||
}
|
}
|
||||||
gst_pad_push (faad->srcpad, GST_DATA (outbuf));
|
gst_pad_push (faad->srcpad, outbuf);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Keep the leftovers in raw stream */
|
/* Keep the leftovers in raw stream */
|
||||||
if (input_size > 0 && !faad->packetised) {
|
if (input_size > 0 && !faad->packetised) {
|
||||||
if (input_size < GST_BUFFER_SIZE (buf)) {
|
if (input_size < GST_BUFFER_SIZE (buffer)) {
|
||||||
faad->tempbuf = gst_buffer_create_sub (buf,
|
faad->tempbuf = gst_buffer_create_sub (buffer,
|
||||||
GST_BUFFER_SIZE (buf) - input_size, input_size);
|
GST_BUFFER_SIZE (buffer) - input_size, input_size);
|
||||||
} else {
|
} else {
|
||||||
faad->tempbuf = buf;
|
faad->tempbuf = buffer;
|
||||||
gst_buffer_ref (buf);
|
gst_buffer_ref (buffer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
gst_buffer_unref (buf);
|
gst_buffer_unref (buffer);
|
||||||
|
|
||||||
g_free (info);
|
g_free (info);
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static GstElementStateReturn
|
static GstElementStateReturn
|
||||||
|
@ -758,8 +824,7 @@ gst_faad_change_state (GstElement * element)
|
||||||
static gboolean
|
static gboolean
|
||||||
plugin_init (GstPlugin * plugin)
|
plugin_init (GstPlugin * plugin)
|
||||||
{
|
{
|
||||||
return gst_library_load ("gstaudio") &&
|
return gst_element_register (plugin, "faad", GST_RANK_PRIMARY, GST_TYPE_FAAD);
|
||||||
gst_element_register (plugin, "faad", GST_RANK_PRIMARY, GST_TYPE_FAAD);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
|
GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
|
||||||
|
|
Loading…
Reference in a new issue