From f6b6f72c1c30de3334306e73000ebeb4a054a2b2 Mon Sep 17 00:00:00 2001 From: "Ronald S. Bultje" Date: Sat, 29 Jan 2005 01:28:34 +0000 Subject: Update to 1.1 API (#165446). Original commit message from CVS: * configure.ac: * ext/musepack/Makefile.am: * ext/musepack/gstmusepackdec.c: (gst_musepackdec_class_init), (gst_musepackdec_init), (gst_musepackdec_dispose), (gst_musepackdec_src_query), (gst_musepackdec_src_convert), (gst_musepack_stream_init), (gst_musepackdec_loop), (gst_musepackdec_change_state): * ext/musepack/gstmusepackdec.cpp: * ext/musepack/gstmusepackdec.h: * ext/musepack/gstmusepackreader.c: (gst_musepack_reader_peek), (gst_musepack_reader_read), (gst_musepack_reader_seek), (gst_musepack_reader_tell), (gst_musepack_reader_get_size), (gst_musepack_reader_canseek), (gst_musepack_init_reader): * ext/musepack/gstmusepackreader.cpp: * ext/musepack/gstmusepackreader.h: Update to 1.1 API (#165446). --- ext/musepack/gstmusepackdec.c | 159 +++++++++++++++++++++--------------------- 1 file changed, 79 insertions(+), 80 deletions(-) (limited to 'ext/musepack/gstmusepackdec.c') 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 " - ); + static GstElementDetails gst_musepackdec_details = + GST_ELEMENT_DETAILS ("Musepack decoder", + "Codec/Decoder/Audio", + "Musepack decoder", + "Ronald Bultje "); 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) -- cgit v1.2.1