summaryrefslogtreecommitdiffstats
path: root/ext
diff options
context:
space:
mode:
Diffstat (limited to 'ext')
-rw-r--r--ext/Makefile.am35
-rw-r--r--ext/faad/gstfaad.c157
2 files changed, 130 insertions, 62 deletions
diff --git a/ext/Makefile.am b/ext/Makefile.am
index 7aac9970..13e48435 100644
--- a/ext/Makefile.am
+++ b/ext/Makefile.am
@@ -10,11 +10,11 @@ else
AALIB_DIR=
endif
-# if USE_AMRNB
-# AMRNB_DIR=amrnb
-# else
-AMRNB_DIR=
-# endif
+if USE_AMRNB
+ AMRNB_DIR=amrnb
+else
+ AMRNB_DIR=
+endif
# if USE_ARTS
# ARTS_DIR=arts
@@ -106,11 +106,11 @@ endif
FAAC_DIR=
# endif
-# if USE_FAAD
-# FAAD_DIR=faad
-# else
-FAAD_DIR=
-# endif
+if USE_FAAD
+ FAAD_DIR=faad
+else
+ FAAD_DIR=
+endif
## if USE_FESTIVAL
## FESTIVAL_DIR=festival
@@ -238,11 +238,11 @@ endif
MIKMOD_DIR=
# endif
-# if USE_MPEG2DEC
-# MPEG2DEC_DIR=mpeg2dec
-# else
-MPEG2DEC_DIR=
-#endif
+if USE_MPEG2DEC
+ MPEG2DEC_DIR=mpeg2dec
+else
+ MPEG2DEC_DIR=
+endif
# if USE_MPEG2ENC
# MPEG2ENC_DIR=mpeg2enc
@@ -440,4 +440,7 @@ DIST_SUBDIRS=\
libcaca \
esd \
raw1394 \
- dv
+ dv \
+ amrnb \
+ faad \
+ mpeg2dec
diff --git a/ext/faad/gstfaad.c b/ext/faad/gstfaad.c
index 14fda859..85a15bec 100644
--- a/ext/faad/gstfaad.c
+++ b/ext/faad/gstfaad.c
@@ -79,12 +79,15 @@ static void gst_faad_base_init (GstFaadClass * klass);
static void gst_faad_class_init (GstFaadClass * klass);
static void gst_faad_init (GstFaad * faad);
+/*
static GstPadLinkReturn
gst_faad_sinkconnect (GstPad * pad, const GstCaps * caps);
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 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 GstElementClass *parent_class = NULL;
@@ -155,28 +158,59 @@ gst_faad_init (GstFaad * faad)
faad->channel_positions = NULL;
faad->init = FALSE;
- GST_FLAG_SET (faad, GST_ELEMENT_EVENT_AWARE);
+ /* GST_FLAG_SET (faad, GST_ELEMENT_EVENT_AWARE); */
faad->sinkpad =
gst_pad_new_from_template (gst_static_pad_template_get (&sink_template),
"sink");
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_link_function (faad->sinkpad, gst_faad_sinkconnect);
+ /*gst_pad_set_link_function (faad->sinkpad, gst_faad_sinkconnect); */
faad->srcpad =
gst_pad_new_from_template (gst_static_pad_template_get (&src_template),
"src");
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);
}
+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!
*/
-
+/*
static guchar *
gst_faad_chanpos_from_gst (GstAudioChannelPosition * pos, guint num)
{
@@ -223,7 +257,7 @@ gst_faad_chanpos_from_gst (GstAudioChannelPosition * pos, guint num)
return fpos;
}
-
+*/
static GstAudioChannelPosition *
gst_faad_chanpos_to_gst (guchar * fpos, guint num)
{
@@ -274,6 +308,7 @@ gst_faad_chanpos_to_gst (guchar * fpos, guint num)
return pos;
}
+/*
static GstPadLinkReturn
gst_faad_sinkconnect (GstPad * pad, const GstCaps * caps)
{
@@ -282,18 +317,18 @@ gst_faad_sinkconnect (GstPad * pad, const GstCaps * caps)
const GValue *value;
GstBuffer *buf;
- /* Assume raw stream */
+ // Assume raw stream
faad->packetised = FALSE;
if ((value = gst_structure_get_value (str, "codec_data"))) {
gulong samplerate;
guchar channels;
- /* We have codec data, means packetised stream */
+ // We have codec data, means packetised stream
faad->packetised = TRUE;
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),
GST_BUFFER_SIZE (buf), &samplerate, &channels) < 0)
return GST_PAD_LINK_REFUSED;
@@ -312,11 +347,11 @@ gst_faad_sinkconnect (GstPad * pad, const GstCaps * caps)
faad->need_channel_setup = TRUE;
- /* if there's no decoderspecificdata, it's all fine. We cannot know
- * much more at this point... */
+ // if there's no decoderspecificdata, it's all fine. We cannot know
+ // * much more at this point...
return GST_PAD_LINK_OK;
}
-
+*/
static GstCaps *
gst_faad_srcgetcaps (GstPad * pad)
{
@@ -395,7 +430,7 @@ gst_faad_srcgetcaps (GstPad * pad)
if (faad->channels != -1) {
gst_structure_set (str, "channels", G_TYPE_INT, faad->channels, NULL);
- /* put channel information here */
+ // put channel information here */
if (faad->channel_positions) {
GstAudioChannelPosition *pos;
@@ -437,6 +472,7 @@ gst_faad_srcgetcaps (GstPad * pad)
return templ;
}
+/**
static GstPadLinkReturn
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);
- /* Samplerate and channels are normally provided through
- * the getcaps function */
+ // Samplerate and channels are normally provided through
+ // * the getcaps function
if (!gst_structure_get_int (structure, "channels", &channels) ||
!gst_structure_get_int (structure, "rate", &rate) ||
rate != faad->samplerate || channels != faad->channels) {
return GST_PAD_LINK_REFUSED;
}
- /* Another internal checkup. */
+ // Another internal checkup.
if (faad->need_channel_setup) {
GstAudioChannelPosition *pos;
guchar *fpos;
@@ -533,28 +569,55 @@ gst_faad_srcconnect (GstPad * pad, const GstCaps * caps)
if (faacDecSetConfiguration (faad->handle, conf) == 0)
return GST_PAD_LINK_REFUSED;
- /* FIXME: handle return value, how? */
+ // FIXME: handle return value, how?
faad->bps = depth / 8;
return GST_PAD_LINK_OK;
}
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
-gst_faad_chain (GstPad * pad, GstData * data)
+static GstFlowReturn
+gst_faad_chain (GstPad * pad, GstBuffer * buffer)
{
+ GstFlowReturn ret = GST_FLOW_OK;
guint input_size;
guint skip_bytes = 0;
guchar *input_data;
GstFaad *faad = GST_FAAD (gst_pad_get_parent (pad));
- GstBuffer *buf, *outbuf;
+ GstBuffer *outbuf;
faacDecFrameInfo *info;
guint64 next_ts;
void *out;
gboolean run_loop = TRUE;
+/*
if (GST_IS_EVENT (data)) {
GstEvent *event = GST_EVENT (data);
@@ -572,14 +635,14 @@ gst_faad_chain (GstPad * pad, GstData * data)
return;
}
}
-
+*/
info = g_new0 (faacDecFrameInfo, 1);
/* buffer + remaining data */
- buf = GST_BUFFER (data);
- next_ts = GST_BUFFER_TIMESTAMP (buf);
+ /* buf = GST_BUFFER (data); */
+ next_ts = GST_BUFFER_TIMESTAMP (buffer);
if (faad->tempbuf) {
- buf = gst_buffer_join (faad->tempbuf, buf);
+ buffer = gst_buffer_join (faad->tempbuf, buffer);
faad->tempbuf = NULL;
}
@@ -590,11 +653,12 @@ gst_faad_chain (GstPad * pad, GstData * data)
glong init_res;
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) {
GST_ELEMENT_ERROR (faad, STREAM, DECODE, (NULL),
("Failed to init decoder from stream"));
- return;
+ return GST_FLOW_UNEXPECTED;
}
skip_bytes = init_res;
faad->init = TRUE;
@@ -609,8 +673,8 @@ gst_faad_chain (GstPad * pad, GstData * data)
}
/* decode cycle */
- input_data = GST_BUFFER_DATA (buf);
- input_size = GST_BUFFER_SIZE (buf);
+ input_data = GST_BUFFER_DATA (buffer);
+ input_size = GST_BUFFER_SIZE (buffer);
info->bytesconsumed = input_size - skip_bytes;
if (!faad->packetised) {
@@ -660,7 +724,7 @@ gst_faad_chain (GstPad * pad, GstData * data)
}
if (fmt_change) {
- GstPadLinkReturn ret;
+ /*GstPadLinkReturn ret; */
/* store new negotiation information */
faad->samplerate = info->samplerate;
@@ -671,12 +735,12 @@ gst_faad_chain (GstPad * pad, GstData * data)
memcpy (faad->channel_positions, info->channel_position,
faad->channels);
- /* and negotiate */
- ret = gst_pad_renegotiate (faad->srcpad);
- if (GST_PAD_LINK_FAILED (ret)) {
- GST_ELEMENT_ERROR (faad, CORE, NEGOTIATION, (NULL), (NULL));
- break;
- }
+ /* and negotiate
+ ret = gst_pad_renegotiate (faad->srcpad);
+ if (GST_PAD_LINK_FAILED (ret)) {
+ GST_ELEMENT_ERROR (faad, CORE, NEGOTIATION, (NULL), (NULL));
+ break;
+ } */
}
/* play decoded data */
@@ -690,25 +754,27 @@ gst_faad_chain (GstPad * pad, GstData * data)
if (GST_CLOCK_TIME_IS_VALID (next_ts)) {
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 */
if (input_size > 0 && !faad->packetised) {
- if (input_size < GST_BUFFER_SIZE (buf)) {
- faad->tempbuf = gst_buffer_create_sub (buf,
- GST_BUFFER_SIZE (buf) - input_size, input_size);
+ if (input_size < GST_BUFFER_SIZE (buffer)) {
+ faad->tempbuf = gst_buffer_create_sub (buffer,
+ GST_BUFFER_SIZE (buffer) - input_size, input_size);
} else {
- faad->tempbuf = buf;
- gst_buffer_ref (buf);
+ faad->tempbuf = buffer;
+ gst_buffer_ref (buffer);
}
}
- gst_buffer_unref (buf);
+ gst_buffer_unref (buffer);
g_free (info);
+
+ return ret;
}
static GstElementStateReturn
@@ -758,8 +824,7 @@ gst_faad_change_state (GstElement * element)
static gboolean
plugin_init (GstPlugin * plugin)
{
- return gst_library_load ("gstaudio") &&
- gst_element_register (plugin, "faad", GST_RANK_PRIMARY, GST_TYPE_FAAD);
+ return gst_element_register (plugin, "faad", GST_RANK_PRIMARY, GST_TYPE_FAAD);
}
GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,