summaryrefslogtreecommitdiffstats
path: root/ext/musepack/gstmusepackdec.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/musepack/gstmusepackdec.c')
-rw-r--r--ext/musepack/gstmusepackdec.c159
1 files changed, 79 insertions, 80 deletions
diff --git a/ext/musepack/gstmusepackdec.c b/ext/musepack/gstmusepackdec.c
index 7917a346..656360a6 100644
--- a/ext/musepack/gstmusepackdec.c
+++ b/ext/musepack/gstmusepackdec.c
@@ -48,13 +48,13 @@ static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src",
GST_PAD_ALWAYS,
GST_STATIC_CAPS (BASE_CAPS ", "
"endianness = (int) BYTE_ORDER, "
- "rate = (int) [ 8000, 96000 ], "
- "channels = (int) [ 1, 2 ]")
+ "rate = (int) [ 8000, 96000 ], " "channels = (int) [ 1, 2 ]")
);
static void gst_musepackdec_base_init (GstMusepackDecClass * klass);
static void gst_musepackdec_class_init (GstMusepackDecClass * klass);
static void gst_musepackdec_init (GstMusepackDec * musepackdec);
+static void gst_musepackdec_dispose (GObject * obj);
static gboolean gst_musepackdec_src_event (GstPad * pad, GstEvent * event);
static const GstFormat *gst_musepackdec_get_formats (GstPad * pad);
@@ -68,7 +68,7 @@ static gboolean gst_musepackdec_src_convert (GstPad * pad,
static void gst_musepackdec_loop (GstElement * element);
static GstElementStateReturn
- gst_musepackdec_change_state (GstElement * element);
+gst_musepackdec_change_state (GstElement * element);
static GstElementClass *parent_class = NULL;
@@ -102,12 +102,11 @@ gst_musepackdec_get_type (void)
static void
gst_musepackdec_base_init (GstMusepackDecClass * klass)
{
- static GstElementDetails gst_musepackdec_details = GST_ELEMENT_DETAILS (
- "Musepack decoder",
- "Codec/Decoder/Audio",
- "Musepack decoder",
- "Ronald Bultje <rbultje@ronald.bitfreak.net>"
- );
+ static GstElementDetails gst_musepackdec_details =
+ GST_ELEMENT_DETAILS ("Musepack decoder",
+ "Codec/Decoder/Audio",
+ "Musepack decoder",
+ "Ronald Bultje <rbultje@ronald.bitfreak.net>");
GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
gst_element_class_add_pad_template (element_class,
@@ -121,11 +120,10 @@ gst_musepackdec_base_init (GstMusepackDecClass * klass)
static void
gst_musepackdec_class_init (GstMusepackDecClass * klass)
{
- GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass);
-
parent_class = GST_ELEMENT_CLASS (g_type_class_ref (GST_TYPE_ELEMENT));
- gstelement_class->change_state = gst_musepackdec_change_state;
+ GST_ELEMENT_CLASS (klass)->change_state = gst_musepackdec_change_state;
+ G_OBJECT_CLASS (klass)->dispose = gst_musepackdec_dispose;
}
static void
@@ -133,7 +131,9 @@ gst_musepackdec_init (GstMusepackDec * musepackdec)
{
GST_FLAG_SET (musepackdec, GST_ELEMENT_EVENT_AWARE);
- musepackdec->dec = NULL;
+ musepackdec->r = g_new (mpc_reader, 1);
+ musepackdec->d = g_new (mpc_decoder, 1);
+ musepackdec->init = FALSE;
musepackdec->seek_pending = FALSE;
musepackdec->sinkpad =
@@ -163,6 +163,19 @@ gst_musepackdec_init (GstMusepackDec * musepackdec)
gst_musepackdec_loop);
}
+static void
+gst_musepackdec_dispose (GObject * obj)
+{
+ GstMusepackDec *musepackdec = GST_MUSEPACK_DEC (obj);
+
+ g_free (musepackdec->r);
+ musepackdec->r = NULL;
+ g_free (musepackdec->d);
+ musepackdec->d = NULL;
+
+ G_OBJECT_CLASS (parent_class)->dispose (obj);
+}
+
static gboolean
gst_musepackdec_src_event (GstPad * pad, GstEvent * event)
{
@@ -170,21 +183,20 @@ gst_musepackdec_src_event (GstPad * pad, GstEvent * event)
gboolean res;
switch (GST_EVENT_TYPE (event)) {
- case GST_EVENT_SEEK: {
+ case GST_EVENT_SEEK:{
gint64 offset, len, pos;
GstFormat fmt = GST_FORMAT_TIME;
/* in time */
if (!gst_pad_convert (pad,
- (GstFormat) GST_EVENT_SEEK_FORMAT (event),
- GST_EVENT_SEEK_OFFSET (event),
- &fmt, &offset) ||
+ (GstFormat) GST_EVENT_SEEK_FORMAT (event),
+ GST_EVENT_SEEK_OFFSET (event),
+ &fmt, &offset) ||
!gst_pad_convert (pad,
- GST_FORMAT_DEFAULT, musepackdec->len,
- &fmt, &len) ||
+ GST_FORMAT_DEFAULT, musepackdec->len,
+ &fmt, &len) ||
!gst_pad_convert (pad,
- GST_FORMAT_DEFAULT, musepackdec->pos,
- &fmt, &pos)) {
+ GST_FORMAT_DEFAULT, musepackdec->pos, &fmt, &pos)) {
res = FALSE;
break;
}
@@ -246,9 +258,9 @@ static const GstEventMask *
gst_musepackdec_get_event_masks (GstPad * pad)
{
static const GstEventMask event_masks[] = {
- { GST_EVENT_SEEK,
- (GstEventFlag) (GST_SEEK_METHOD_SET | GST_SEEK_FLAG_FLUSH) },
- { (GstEventType) 0, (GstEventFlag) 0 }
+ {GST_EVENT_SEEK,
+ (GstEventFlag) (GST_SEEK_METHOD_SET | GST_SEEK_FLAG_FLUSH)},
+ {(GstEventType) 0, (GstEventFlag) 0}
};
return event_masks;
@@ -273,19 +285,17 @@ gst_musepackdec_src_query (GstPad * pad, GstQueryType type,
GstMusepackDec *musepackdec = GST_MUSEPACK_DEC (gst_pad_get_parent (pad));
gboolean res;
- if (!musepackdec->dec)
+ if (!musepackdec->init)
return FALSE;
switch (type) {
case GST_QUERY_TOTAL:
res = gst_pad_convert (pad,
- GST_FORMAT_DEFAULT, musepackdec->len,
- format, value);
+ GST_FORMAT_DEFAULT, musepackdec->len, format, value);
break;
case GST_QUERY_POSITION:
res = gst_pad_convert (pad,
- GST_FORMAT_DEFAULT, musepackdec->pos,
- format, value);
+ GST_FORMAT_DEFAULT, musepackdec->pos, format, value);
break;
default:
res = FALSE;
@@ -302,7 +312,7 @@ gst_musepackdec_src_convert (GstPad * pad, GstFormat src_format,
GstMusepackDec *musepackdec = GST_MUSEPACK_DEC (gst_pad_get_parent (pad));
gboolean res = TRUE;
- if (!musepackdec->dec)
+ if (!musepackdec->init)
return FALSE;
switch (src_format) {
@@ -361,51 +371,43 @@ gst_musepackdec_src_convert (GstPad * pad, GstFormat src_format,
static gboolean
gst_musepack_stream_init (GstMusepackDec * musepackdec)
{
- StreamInfo si = StreamInfo ();
+ mpc_streaminfo i;
GstCaps *caps;
- if (musepackdec->dec)
- delete musepackdec->dec;
+ /* set up reading */
+ gst_musepack_init_reader (musepackdec->r, musepackdec->bs);
- musepackdec->reader = new GstMusepackReader (musepackdec->bs);
- if (si.ReadStreamInfo (musepackdec->reader) != ERROR_CODE_OK) {
+ /* streaminfo */
+ mpc_streaminfo_init (&i);
+ if (mpc_streaminfo_read (&i, musepackdec->r) < 0) {
GST_ELEMENT_ERROR (musepackdec, STREAM, WRONG_TYPE, (NULL), (NULL));
- delete musepackdec->reader;
return FALSE;
}
- musepackdec->dec = new MPC_decoder (musepackdec->reader);
- if (!musepackdec->dec) {
- GST_ELEMENT_ERROR (musepackdec, LIBRARY, INIT, (NULL),
- ("Creating decoder object failed"));
- delete musepackdec->reader;
- return FALSE;
- }
-
- if (!musepackdec->dec->Initialize (&si)) {
- GST_ELEMENT_ERROR (musepackdec, LIBRARY, INIT, (NULL),
- ("Initializating stream failed"));
- delete musepackdec->dec;
- musepackdec->dec = NULL;
+ /* decoding */
+ mpc_decoder_setup (musepackdec->d, musepackdec->r);
+ mpc_decoder_scale_output (musepackdec->d, 1.0);
+ if (!mpc_decoder_initialize (musepackdec->d, &i)) {
+ GST_ELEMENT_ERROR (musepackdec, STREAM, WRONG_TYPE, (NULL), (NULL));
return FALSE;
}
+ /* capsnego */
caps = gst_caps_from_string (BASE_CAPS);
gst_caps_set_simple (caps,
"endianness", G_TYPE_INT, G_BYTE_ORDER,
- "channels", G_TYPE_INT, si.simple.Channels,
- "rate", G_TYPE_INT, si.simple.SampleFreq, NULL);
+ "channels", G_TYPE_INT, i.channels,
+ "rate", G_TYPE_INT, i.sample_freq, NULL);
if (!gst_pad_set_explicit_caps (musepackdec->srcpad, caps)) {
GST_ELEMENT_ERROR (musepackdec, CORE, NEGOTIATION, (NULL), (NULL));
- delete musepackdec->dec;
- musepackdec->dec = NULL;
return FALSE;
}
- musepackdec->bps = 4 * si.simple.Channels;
- musepackdec->rate = si.simple.SampleFreq;
+ musepackdec->bps = 4 * i.channels;;
+ musepackdec->rate = i.sample_freq;
musepackdec->pos = 0;
- musepackdec->len = si.simple.PCMSamples;
+ musepackdec->len = mpc_streaminfo_get_length_samples (&i);
+ musepackdec->init = TRUE;
return TRUE;
}
@@ -417,8 +419,9 @@ gst_musepackdec_loop (GstElement * element)
GstBuffer *out;
GstFormat fmt;
gint ret;
+ guint32 update_acc, update_bits;
- if (!musepackdec->dec) {
+ if (!musepackdec->init) {
if (!gst_musepack_stream_init (musepackdec))
return;
}
@@ -427,7 +430,7 @@ gst_musepackdec_loop (GstElement * element)
gdouble seek_time = (gdouble) musepackdec->seek_time / GST_SECOND;
musepackdec->seek_pending = FALSE;
- if (musepackdec->dec->SeekSeconds (seek_time)) {
+ if (mpc_decoder_seek_seconds (musepackdec->d, seek_time)) {
if (musepackdec->flush_pending) {
musepackdec->flush_pending = FALSE;
gst_pad_push (musepackdec->srcpad,
@@ -435,37 +438,38 @@ gst_musepackdec_loop (GstElement * element)
}
gst_pad_push (musepackdec->srcpad,
GST_DATA (gst_event_new_discontinuous (FALSE,
- GST_FORMAT_TIME, musepackdec->seek_time,
- GST_FORMAT_UNDEFINED)));
+ GST_FORMAT_TIME, musepackdec->seek_time,
+ GST_FORMAT_UNDEFINED)));
fmt = GST_FORMAT_DEFAULT;
gst_pad_convert (musepackdec->srcpad,
GST_FORMAT_TIME, musepackdec->seek_time,
- &fmt, (gint64 *) &musepackdec->pos);
+ &fmt, (gint64 *) & musepackdec->pos);
}
}
- out = gst_buffer_new_and_alloc (MPC_decoder::DecodeBufferLength * 4);
- ret = musepackdec->dec->Decode ((MPC_SAMPLE_FORMAT *) GST_BUFFER_DATA (out));
+ out = gst_buffer_new_and_alloc (MPC_DECODER_BUFFER_LENGTH * 4);
+ ret = mpc_decoder_decode (musepackdec->d,
+ (MPC_SAMPLE_FORMAT *) GST_BUFFER_DATA (out), &update_acc, &update_bits);
if (ret <= 0) {
- if (musepackdec->reader->eos == true) {
+ if (ret == 0) {
gst_element_set_eos (element);
gst_pad_push (musepackdec->srcpad,
GST_DATA (gst_event_new (GST_EVENT_EOS)));
+ } else {
+ GST_ERROR_OBJECT (musepackdec, "Failed to decode sample");
}
gst_buffer_unref (out);
return;
}
- GST_BUFFER_SIZE (out) = ret;
- /* note that the size is still in samples */
+
+ GST_BUFFER_SIZE (out) = ret * musepackdec->bps;
fmt = GST_FORMAT_TIME;
gst_pad_query (musepackdec->srcpad,
- GST_QUERY_POSITION, &fmt, (gint64 *) &GST_BUFFER_TIMESTAMP (out));
+ GST_QUERY_POSITION, &fmt, (gint64 *) & GST_BUFFER_TIMESTAMP (out));
gst_pad_convert (musepackdec->srcpad,
- GST_FORMAT_DEFAULT, GST_BUFFER_SIZE (out),
- &fmt, (gint64 *) &GST_BUFFER_DURATION (out));
- musepackdec->pos += GST_BUFFER_SIZE (out);
- /* convert to bytes */
- GST_BUFFER_SIZE (out) *= musepackdec->bps;
+ GST_FORMAT_BYTES, GST_BUFFER_SIZE (out),
+ &fmt, (gint64 *) & GST_BUFFER_DURATION (out));
+ musepackdec->pos += GST_BUFFER_SIZE (out) / musepackdec->bps;
gst_pad_push (musepackdec->srcpad, GST_DATA (out));
}
@@ -480,11 +484,7 @@ gst_musepackdec_change_state (GstElement * element)
break;
case GST_STATE_PAUSED_TO_READY:
musepackdec->seek_pending = FALSE;
- if (musepackdec->dec != NULL) {
- delete musepackdec->reader;
- delete musepackdec->dec;
- musepackdec->dec = NULL;
- }
+ musepackdec->init = FALSE;
break;
case GST_STATE_READY_TO_NULL:
gst_bytestream_destroy (musepackdec->bs);
@@ -504,11 +504,10 @@ plugin_init (GstPlugin * plugin)
{
return gst_library_load ("gstbytestream") &&
gst_element_register (plugin, "musepackdec",
- GST_RANK_PRIMARY, GST_TYPE_MUSEPACK_DEC);
+ GST_RANK_PRIMARY, GST_TYPE_MUSEPACK_DEC);
}
GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
GST_VERSION_MINOR,
"musepack",
- "Musepack decoder",
- plugin_init, VERSION, "LGPL", GST_PACKAGE, GST_ORIGIN)
+ "Musepack decoder", plugin_init, VERSION, "LGPL", GST_PACKAGE, GST_ORIGIN)