diff options
Diffstat (limited to 'ext/flac/gstflacdec.c')
-rw-r--r-- | ext/flac/gstflacdec.c | 513 |
1 files changed, 252 insertions, 261 deletions
diff --git a/ext/flac/gstflacdec.c b/ext/flac/gstflacdec.c index 25769bcf..3882df1a 100644 --- a/ext/flac/gstflacdec.c +++ b/ext/flac/gstflacdec.c @@ -41,104 +41,101 @@ GstElementDetails flacdec_details = { }; /* FlacDec signals and args */ -enum { +enum +{ /* FILL ME */ LAST_SIGNAL }; -enum { +enum +{ ARG_0, ARG_METADATA }; -static void gst_flacdec_base_init (gpointer g_class); -static void gst_flacdec_class_init (FlacDecClass *klass); -static void gst_flacdec_init (FlacDec *flacdec); +static void gst_flacdec_base_init (gpointer g_class); +static void gst_flacdec_class_init (FlacDecClass * klass); +static void gst_flacdec_init (FlacDec * flacdec); + +static void gst_flacdec_loop (GstElement * element); +static GstElementStateReturn gst_flacdec_change_state (GstElement * element); +static const GstFormat *gst_flacdec_get_src_formats (GstPad * pad); +static gboolean gst_flacdec_convert_src (GstPad * pad, GstFormat src_format, + gint64 src_value, GstFormat * dest_format, gint64 * dest_value); +static const GstQueryType *gst_flacdec_get_src_query_types (GstPad * pad); +static gboolean gst_flacdec_src_query (GstPad * pad, GstQueryType type, + GstFormat * format, gint64 * value); +static const GstEventMask *gst_flacdec_get_src_event_masks (GstPad * pad); +static gboolean gst_flacdec_src_event (GstPad * pad, GstEvent * event); -static void gst_flacdec_loop (GstElement *element); -static GstElementStateReturn - gst_flacdec_change_state (GstElement *element); -static const GstFormat* gst_flacdec_get_src_formats (GstPad *pad); -static gboolean gst_flacdec_convert_src (GstPad *pad, GstFormat src_format, gint64 src_value, - GstFormat *dest_format, gint64 *dest_value); -static const GstQueryType* - gst_flacdec_get_src_query_types (GstPad *pad); -static gboolean gst_flacdec_src_query (GstPad *pad, GstQueryType type, - GstFormat *format, gint64 *value); -static const GstEventMask* - gst_flacdec_get_src_event_masks (GstPad *pad); -static gboolean gst_flacdec_src_event (GstPad *pad, GstEvent *event); - -static FLAC__SeekableStreamDecoderReadStatus - gst_flacdec_read (const FLAC__SeekableStreamDecoder *decoder, - FLAC__byte buffer[], unsigned *bytes, - void *client_data); -static FLAC__SeekableStreamDecoderSeekStatus - gst_flacdec_seek (const FLAC__SeekableStreamDecoder *decoder, - FLAC__uint64 position, void *client_data); -static FLAC__SeekableStreamDecoderTellStatus - gst_flacdec_tell (const FLAC__SeekableStreamDecoder *decoder, - FLAC__uint64 *position, void *client_data); -static FLAC__SeekableStreamDecoderLengthStatus - gst_flacdec_length (const FLAC__SeekableStreamDecoder *decoder, - FLAC__uint64 *length, void *client_data); -static FLAC__bool gst_flacdec_eof (const FLAC__SeekableStreamDecoder *decoder, - void *client_data); -static FLAC__StreamDecoderWriteStatus - gst_flacdec_write (const FLAC__SeekableStreamDecoder *decoder, - const FLAC__Frame *frame, - const FLAC__int32 * const buffer[], - void *client_data); -static void gst_flacdec_metadata_callback (const FLAC__SeekableStreamDecoder *decoder, - const FLAC__StreamMetadata *metadata, - void *client_data); -static void gst_flacdec_error_callback (const FLAC__SeekableStreamDecoder *decoder, - FLAC__StreamDecoderErrorStatus status, - void *client_data); +static FLAC__SeekableStreamDecoderReadStatus +gst_flacdec_read (const FLAC__SeekableStreamDecoder * decoder, + FLAC__byte buffer[], unsigned *bytes, void *client_data); +static FLAC__SeekableStreamDecoderSeekStatus +gst_flacdec_seek (const FLAC__SeekableStreamDecoder * decoder, + FLAC__uint64 position, void *client_data); +static FLAC__SeekableStreamDecoderTellStatus +gst_flacdec_tell (const FLAC__SeekableStreamDecoder * decoder, + FLAC__uint64 * position, void *client_data); +static FLAC__SeekableStreamDecoderLengthStatus +gst_flacdec_length (const FLAC__SeekableStreamDecoder * decoder, + FLAC__uint64 * length, void *client_data); +static FLAC__bool gst_flacdec_eof (const FLAC__SeekableStreamDecoder * decoder, + void *client_data); +static FLAC__StreamDecoderWriteStatus +gst_flacdec_write (const FLAC__SeekableStreamDecoder * decoder, + const FLAC__Frame * frame, + const FLAC__int32 * const buffer[], void *client_data); +static void gst_flacdec_metadata_callback (const FLAC__SeekableStreamDecoder * + decoder, const FLAC__StreamMetadata * metadata, void *client_data); +static void gst_flacdec_error_callback (const FLAC__SeekableStreamDecoder * + decoder, FLAC__StreamDecoderErrorStatus status, void *client_data); static GstElementClass *parent_class = NULL; + /*static guint gst_flacdec_signals[LAST_SIGNAL] = { 0 }; */ GType -flacdec_get_type(void) { +flacdec_get_type (void) +{ static GType flacdec_type = 0; if (!flacdec_type) { static const GTypeInfo flacdec_info = { - sizeof(FlacDecClass), + sizeof (FlacDecClass), gst_flacdec_base_init, NULL, - (GClassInitFunc)gst_flacdec_class_init, + (GClassInitFunc) gst_flacdec_class_init, NULL, NULL, - sizeof(FlacDec), + sizeof (FlacDec), 0, - (GInstanceInitFunc)gst_flacdec_init, + (GInstanceInitFunc) gst_flacdec_init, }; - flacdec_type = g_type_register_static (GST_TYPE_ELEMENT, "FlacDec", &flacdec_info, 0); + flacdec_type = + g_type_register_static (GST_TYPE_ELEMENT, "FlacDec", &flacdec_info, 0); } return flacdec_type; } -static GstCaps* +static GstCaps * flac_caps_factory (void) { return gst_caps_new_simple ("audio/x-flac", NULL); - /* "rate", GST_PROPS_INT_RANGE (11025, 48000), - * "channels", GST_PROPS_INT_RANGE (1, 2), */ + /* "rate", GST_PROPS_INT_RANGE (11025, 48000), + * "channels", GST_PROPS_INT_RANGE (1, 2), */ } -static GstCaps* +static GstCaps * raw_caps_factory (void) { return gst_caps_new_simple ("audio/x-raw-int", - "endianness", G_TYPE_INT, G_BYTE_ORDER, - "signed", G_TYPE_BOOLEAN, TRUE, - "width", G_TYPE_INT, 16, - "depth", G_TYPE_INT, 16, - "rate", GST_TYPE_INT_RANGE, 11025, 48000, - "channels", GST_TYPE_INT_RANGE, 1, 2, - NULL); + "endianness", G_TYPE_INT, G_BYTE_ORDER, + "signed", G_TYPE_BOOLEAN, TRUE, + "width", G_TYPE_INT, 16, + "depth", G_TYPE_INT, 16, + "rate", GST_TYPE_INT_RANGE, 11025, 48000, + "channels", GST_TYPE_INT_RANGE, 1, 2, NULL); } static void @@ -152,7 +149,7 @@ gst_flacdec_base_init (gpointer g_class) sink_template = gst_pad_template_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, flac_caps); - src_template = gst_pad_template_new ("src", GST_PAD_SRC, + src_template = gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS, raw_caps); gst_element_class_add_pad_template (element_class, sink_template); gst_element_class_add_pad_template (element_class, src_template); @@ -160,21 +157,21 @@ gst_flacdec_base_init (gpointer g_class) } static void -gst_flacdec_class_init (FlacDecClass *klass) +gst_flacdec_class_init (FlacDecClass * klass) { GstElementClass *gstelement_class; GObjectClass *gobject_class; - gstelement_class = (GstElementClass*)klass; - gobject_class = (GObjectClass*) klass; + gstelement_class = (GstElementClass *) klass; + gobject_class = (GObjectClass *) klass; - parent_class = g_type_class_ref(GST_TYPE_ELEMENT); + parent_class = g_type_class_ref (GST_TYPE_ELEMENT); gstelement_class->change_state = gst_flacdec_change_state; } -static void -gst_flacdec_init (FlacDec *flacdec) +static void +gst_flacdec_init (FlacDec * flacdec) { flacdec->sinkpad = gst_pad_new_from_template (sink_template, "sink"); gst_element_add_pad (GST_ELEMENT (flacdec), flacdec->sinkpad); @@ -185,9 +182,11 @@ gst_flacdec_init (FlacDec *flacdec) gst_element_add_pad (GST_ELEMENT (flacdec), flacdec->srcpad); gst_pad_set_formats_function (flacdec->srcpad, gst_flacdec_get_src_formats); gst_pad_set_convert_function (flacdec->srcpad, gst_flacdec_convert_src); - gst_pad_set_query_type_function (flacdec->srcpad, gst_flacdec_get_src_query_types); + gst_pad_set_query_type_function (flacdec->srcpad, + gst_flacdec_get_src_query_types); gst_pad_set_query_function (flacdec->srcpad, gst_flacdec_src_query); - gst_pad_set_event_mask_function (flacdec->srcpad, gst_flacdec_get_src_event_masks); + gst_pad_set_event_mask_function (flacdec->srcpad, + gst_flacdec_get_src_event_masks); gst_pad_set_event_function (flacdec->srcpad, gst_flacdec_src_event); gst_pad_use_explicit_caps (flacdec->srcpad); @@ -197,30 +196,39 @@ gst_flacdec_init (FlacDec *flacdec) flacdec->eos = FALSE; flacdec->seek_pending = FALSE; - FLAC__seekable_stream_decoder_set_read_callback (flacdec->decoder, gst_flacdec_read); - FLAC__seekable_stream_decoder_set_seek_callback (flacdec->decoder, gst_flacdec_seek); - FLAC__seekable_stream_decoder_set_tell_callback (flacdec->decoder, gst_flacdec_tell); - FLAC__seekable_stream_decoder_set_length_callback (flacdec->decoder, gst_flacdec_length); - FLAC__seekable_stream_decoder_set_eof_callback (flacdec->decoder, gst_flacdec_eof); + FLAC__seekable_stream_decoder_set_read_callback (flacdec->decoder, + gst_flacdec_read); + FLAC__seekable_stream_decoder_set_seek_callback (flacdec->decoder, + gst_flacdec_seek); + FLAC__seekable_stream_decoder_set_tell_callback (flacdec->decoder, + gst_flacdec_tell); + FLAC__seekable_stream_decoder_set_length_callback (flacdec->decoder, + gst_flacdec_length); + FLAC__seekable_stream_decoder_set_eof_callback (flacdec->decoder, + gst_flacdec_eof); #if FLAC_VERSION >= 0x010003 - FLAC__seekable_stream_decoder_set_write_callback (flacdec->decoder, gst_flacdec_write); + FLAC__seekable_stream_decoder_set_write_callback (flacdec->decoder, + gst_flacdec_write); #else FLAC__seekable_stream_decoder_set_write_callback (flacdec->decoder, - (FLAC__StreamDecoderWriteStatus (*) - (const FLAC__SeekableStreamDecoder *decoder, - const FLAC__Frame *frame, - const FLAC__int32 *buffer[], - void *client_data)) - (gst_flacdec_write)); + (FLAC__StreamDecoderWriteStatus (*) + (const FLAC__SeekableStreamDecoder * decoder, + const FLAC__Frame * frame, + const FLAC__int32 * buffer[], void *client_data)) + (gst_flacdec_write)); #endif - FLAC__seekable_stream_decoder_set_metadata_respond (flacdec->decoder, FLAC__METADATA_TYPE_VORBIS_COMMENT); - FLAC__seekable_stream_decoder_set_metadata_callback (flacdec->decoder, gst_flacdec_metadata_callback); - FLAC__seekable_stream_decoder_set_error_callback (flacdec->decoder, gst_flacdec_error_callback); + FLAC__seekable_stream_decoder_set_metadata_respond (flacdec->decoder, + FLAC__METADATA_TYPE_VORBIS_COMMENT); + FLAC__seekable_stream_decoder_set_metadata_callback (flacdec->decoder, + gst_flacdec_metadata_callback); + FLAC__seekable_stream_decoder_set_error_callback (flacdec->decoder, + gst_flacdec_error_callback); FLAC__seekable_stream_decoder_set_client_data (flacdec->decoder, flacdec); } static gboolean -gst_flacdec_update_metadata (FlacDec *flacdec, const FLAC__StreamMetadata *metadata) +gst_flacdec_update_metadata (FlacDec * flacdec, + const FLAC__StreamMetadata * metadata) { GstTagList *list; guint32 number_of_comments, cursor, str_len; @@ -233,17 +241,15 @@ gst_flacdec_update_metadata (FlacDec *flacdec, const FLAC__StreamMetadata *metad number_of_comments = metadata->data.vorbis_comment.num_comments; value = NULL; - GST_DEBUG ("%d tag(s) found", number_of_comments); - for (cursor = 0; cursor < number_of_comments; cursor++) - { + GST_DEBUG ("%d tag(s) found", number_of_comments); + for (cursor = 0; cursor < number_of_comments; cursor++) { str_ptr = metadata->data.vorbis_comment.comments[cursor].entry; str_len = metadata->data.vorbis_comment.comments[cursor].length; - p_value = g_strstr_len ( str_ptr, str_len , "=" ); - if (p_value) - { + p_value = g_strstr_len (str_ptr, str_len, "="); + if (p_value) { name = g_strndup (str_ptr, p_value - str_ptr); value = g_strndup (p_value + 1, str_ptr + str_len - p_value - 1); - + GST_DEBUG ("%s : %s", name, value); gst_vorbis_tag_add (list, name, value); g_free (name); @@ -260,30 +266,29 @@ gst_flacdec_update_metadata (FlacDec *flacdec, const FLAC__StreamMetadata *metad } -static void -gst_flacdec_metadata_callback (const FLAC__SeekableStreamDecoder *decoder, - const FLAC__StreamMetadata *metadata, void *client_data) +static void +gst_flacdec_metadata_callback (const FLAC__SeekableStreamDecoder * decoder, + const FLAC__StreamMetadata * metadata, void *client_data) { FlacDec *flacdec; - + flacdec = GST_FLACDEC (client_data); - switch (metadata->type) - { + switch (metadata->type) { case FLAC__METADATA_TYPE_STREAMINFO: - flacdec->stream_samples = metadata->data.stream_info.total_samples; - break; + flacdec->stream_samples = metadata->data.stream_info.total_samples; + break; case FLAC__METADATA_TYPE_VORBIS_COMMENT: - gst_flacdec_update_metadata (flacdec, metadata); - break; + gst_flacdec_update_metadata (flacdec, metadata); + break; default: - break; + break; } } -static void -gst_flacdec_error_callback (const FLAC__SeekableStreamDecoder *decoder, - FLAC__StreamDecoderErrorStatus status, void *client_data) +static void +gst_flacdec_error_callback (const FLAC__SeekableStreamDecoder * decoder, + FLAC__StreamDecoderErrorStatus status, void *client_data) { FlacDec *flacdec; gchar *error; @@ -308,9 +313,9 @@ gst_flacdec_error_callback (const FLAC__SeekableStreamDecoder *decoder, GST_ELEMENT_ERROR (flacdec, STREAM, DECODE, (NULL), (error)); } -static FLAC__SeekableStreamDecoderSeekStatus -gst_flacdec_seek (const FLAC__SeekableStreamDecoder *decoder, - FLAC__uint64 position, void *client_data) +static FLAC__SeekableStreamDecoderSeekStatus +gst_flacdec_seek (const FLAC__SeekableStreamDecoder * decoder, + FLAC__uint64 position, void *client_data) { FlacDec *flacdec; @@ -323,9 +328,9 @@ gst_flacdec_seek (const FLAC__SeekableStreamDecoder *decoder, return FLAC__SEEKABLE_STREAM_DECODER_SEEK_STATUS_OK; } -static FLAC__SeekableStreamDecoderTellStatus -gst_flacdec_tell (const FLAC__SeekableStreamDecoder *decoder, - FLAC__uint64 *position, void *client_data) +static FLAC__SeekableStreamDecoderTellStatus +gst_flacdec_tell (const FLAC__SeekableStreamDecoder * decoder, + FLAC__uint64 * position, void *client_data) { FlacDec *flacdec; @@ -340,9 +345,9 @@ gst_flacdec_tell (const FLAC__SeekableStreamDecoder *decoder, return FLAC__SEEKABLE_STREAM_DECODER_TELL_STATUS_OK; } -static FLAC__SeekableStreamDecoderLengthStatus -gst_flacdec_length (const FLAC__SeekableStreamDecoder *decoder, - FLAC__uint64 *length, void *client_data) +static FLAC__SeekableStreamDecoderLengthStatus +gst_flacdec_length (const FLAC__SeekableStreamDecoder * decoder, + FLAC__uint64 * length, void *client_data) { FlacDec *flacdec; @@ -358,8 +363,7 @@ gst_flacdec_length (const FLAC__SeekableStreamDecoder *decoder, } static FLAC__bool -gst_flacdec_eof (const FLAC__SeekableStreamDecoder *decoder, - void *client_data) +gst_flacdec_eof (const FLAC__SeekableStreamDecoder * decoder, void *client_data) { FlacDec *flacdec; @@ -370,9 +374,8 @@ gst_flacdec_eof (const FLAC__SeekableStreamDecoder *decoder, } static FLAC__SeekableStreamDecoderReadStatus -gst_flacdec_read (const FLAC__SeekableStreamDecoder *decoder, - FLAC__byte buffer[], unsigned *bytes, - void *client_data) +gst_flacdec_read (const FLAC__SeekableStreamDecoder * decoder, + FLAC__byte buffer[], unsigned *bytes, void *client_data) { FlacDec *flacdec; gint insize = 0; @@ -381,39 +384,39 @@ gst_flacdec_read (const FLAC__SeekableStreamDecoder *decoder, flacdec = GST_FLACDEC (client_data); //g_print ("read %u\n", *bytes); - + while (insize == 0) { insize = gst_bytestream_peek_bytes (flacdec->bs, &indata, *bytes); if (insize < *bytes) { GstEvent *event; guint32 avail; - + gst_bytestream_get_status (flacdec->bs, &avail, &event); switch (GST_EVENT_TYPE (event)) { - case GST_EVENT_EOS: - GST_DEBUG ("eos"); - flacdec->eos = TRUE; + case GST_EVENT_EOS: + GST_DEBUG ("eos"); + flacdec->eos = TRUE; gst_event_unref (event); - if (avail == 0) { - return 0; - } - break; - case GST_EVENT_DISCONTINUOUS: - GST_DEBUG ("discont"); + if (avail == 0) { + return 0; + } + break; + case GST_EVENT_DISCONTINUOUS: + GST_DEBUG ("discont"); /* we are not yet sending the discont, we'll do that in the next write operation */ flacdec->need_discont = TRUE; gst_event_unref (event); break; - default: + default: gst_pad_event_default (flacdec->sinkpad, event); - break; + break; } if (avail > 0) - insize = gst_bytestream_peek_bytes (flacdec->bs, &indata, avail); + insize = gst_bytestream_peek_bytes (flacdec->bs, &indata, avail); else - insize = 0; + insize = 0; } } @@ -425,10 +428,9 @@ gst_flacdec_read (const FLAC__SeekableStreamDecoder *decoder, } static FLAC__StreamDecoderWriteStatus -gst_flacdec_write (const FLAC__SeekableStreamDecoder *decoder, - const FLAC__Frame *frame, - const FLAC__int32 * const buffer[], - void *client_data) +gst_flacdec_write (const FLAC__SeekableStreamDecoder * decoder, + const FLAC__Frame * frame, + const FLAC__int32 * const buffer[], void *client_data) { FlacDec *flacdec; GstBuffer *outbuf; @@ -445,41 +447,39 @@ gst_flacdec_write (const FLAC__SeekableStreamDecoder *decoder, GstEvent *discont; flacdec->need_discont = FALSE; - + if (!GST_PAD_CAPS (flacdec->srcpad)) { if (flacdec->seek_pending) { - flacdec->total_samples = flacdec->seek_value; + flacdec->total_samples = flacdec->seek_value; } if (GST_PAD_IS_USABLE (flacdec->srcpad)) { - GST_DEBUG ("send discont"); - - format = GST_FORMAT_TIME; - gst_pad_convert (flacdec->srcpad, GST_FORMAT_DEFAULT, - flacdec->total_samples, &format, &time); - format = GST_FORMAT_BYTES; - gst_pad_convert (flacdec->srcpad, GST_FORMAT_DEFAULT, - flacdec->total_samples, &format, &bytes); - discont = gst_event_new_discontinuous (FALSE, GST_FORMAT_TIME, time, - GST_FORMAT_BYTES, bytes, - GST_FORMAT_DEFAULT, flacdec->total_samples, - NULL); - - gst_pad_push (flacdec->srcpad, GST_DATA (discont)); + GST_DEBUG ("send discont"); + + format = GST_FORMAT_TIME; + gst_pad_convert (flacdec->srcpad, GST_FORMAT_DEFAULT, + flacdec->total_samples, &format, &time); + format = GST_FORMAT_BYTES; + gst_pad_convert (flacdec->srcpad, GST_FORMAT_DEFAULT, + flacdec->total_samples, &format, &bytes); + discont = gst_event_new_discontinuous (FALSE, GST_FORMAT_TIME, time, + GST_FORMAT_BYTES, bytes, + GST_FORMAT_DEFAULT, flacdec->total_samples, NULL); + + gst_pad_push (flacdec->srcpad, GST_DATA (discont)); } } } - + if (!GST_PAD_CAPS (flacdec->srcpad)) { gst_pad_set_explicit_caps (flacdec->srcpad, - gst_caps_new_simple ("audio/x-raw-int", - "endianness", G_TYPE_INT, G_BYTE_ORDER, - "signed", G_TYPE_BOOLEAN, TRUE, - "width", G_TYPE_INT, depth, - "depth", G_TYPE_INT, depth, - "rate", G_TYPE_INT, frame->header.sample_rate, - "channels", G_TYPE_INT, channels, - NULL)); + gst_caps_new_simple ("audio/x-raw-int", + "endianness", G_TYPE_INT, G_BYTE_ORDER, + "signed", G_TYPE_BOOLEAN, TRUE, + "width", G_TYPE_INT, depth, + "depth", G_TYPE_INT, depth, + "rate", G_TYPE_INT, frame->header.sample_rate, + "channels", G_TYPE_INT, channels, NULL)); flacdec->depth = depth; flacdec->channels = channels; @@ -488,29 +488,28 @@ gst_flacdec_write (const FLAC__SeekableStreamDecoder *decoder, if (GST_PAD_IS_USABLE (flacdec->srcpad)) { outbuf = gst_buffer_new (); - GST_BUFFER_SIZE (outbuf) = samples * channels * ((depth+7)>>3); + GST_BUFFER_SIZE (outbuf) = samples * channels * ((depth + 7) >> 3); GST_BUFFER_DATA (outbuf) = g_malloc (GST_BUFFER_SIZE (outbuf)); - GST_BUFFER_TIMESTAMP (outbuf) = flacdec->total_samples * GST_SECOND / frame->header.sample_rate; - + GST_BUFFER_TIMESTAMP (outbuf) = + flacdec->total_samples * GST_SECOND / frame->header.sample_rate; + if (depth == 8) { - guint8 *outbuffer = (guint8 *)GST_BUFFER_DATA (outbuf); - - for (i=0; i<samples; i++) { - for (j=0; j < channels; j++) { - *outbuffer++ = (guint8) buffer[j][i]; - } + guint8 *outbuffer = (guint8 *) GST_BUFFER_DATA (outbuf); + + for (i = 0; i < samples; i++) { + for (j = 0; j < channels; j++) { + *outbuffer++ = (guint8) buffer[j][i]; + } } - } - else if (depth == 16) { - guint16 *outbuffer = (guint16 *)GST_BUFFER_DATA (outbuf); - - for (i=0; i<samples; i++) { - for (j=0; j < channels; j++) { - *outbuffer++ = (guint16) buffer[j][i]; - } + } else if (depth == 16) { + guint16 *outbuffer = (guint16 *) GST_BUFFER_DATA (outbuf); + + for (i = 0; i < samples; i++) { + for (j = 0; j < channels; j++) { + *outbuffer++ = (guint16) buffer[j][i]; + } } - } - else { + } else { g_warning ("flacdec: invalid depth %d found\n", depth); return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT; } @@ -521,8 +520,8 @@ gst_flacdec_write (const FLAC__SeekableStreamDecoder *decoder, return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE; } -static void -gst_flacdec_loop (GstElement *element) +static void +gst_flacdec_loop (GstElement * element) { FlacDec *flacdec; gboolean res; @@ -530,30 +529,28 @@ gst_flacdec_loop (GstElement *element) flacdec = GST_FLACDEC (element); GST_DEBUG ("flacdec: entering loop"); - if (flacdec->init) { + if (flacdec->init) { FLAC__StreamDecoderState res; - GST_DEBUG ("flacdec: initializing decoder"); + + GST_DEBUG ("flacdec: initializing decoder"); res = FLAC__seekable_stream_decoder_init (flacdec->decoder); if (res != FLAC__SEEKABLE_STREAM_DECODER_OK) { GST_ELEMENT_ERROR (flacdec, LIBRARY, INIT, (NULL), - (FLAC__SeekableStreamDecoderStateString[res])); + (FLAC__SeekableStreamDecoderStateString[res])); return; } - /* FLAC__seekable_stream_decoder_process_metadata (flacdec->decoder);*/ + /* FLAC__seekable_stream_decoder_process_metadata (flacdec->decoder); */ flacdec->init = FALSE; } if (flacdec->seek_pending) { - GST_DEBUG ("perform seek to sample %" G_GINT64_FORMAT, - flacdec->seek_value); + GST_DEBUG ("perform seek to sample %" G_GINT64_FORMAT, flacdec->seek_value); - if (FLAC__seekable_stream_decoder_seek_absolute (flacdec->decoder, - flacdec->seek_value)) - { + if (FLAC__seekable_stream_decoder_seek_absolute (flacdec->decoder, + flacdec->seek_value)) { flacdec->total_samples = flacdec->seek_value; GST_DEBUG ("seek done"); - } - else { + } else { GST_DEBUG ("seek failed"); } flacdec->seek_pending = FALSE; @@ -562,13 +559,12 @@ gst_flacdec_loop (GstElement *element) GST_DEBUG ("flacdec: processing single"); res = FLAC__seekable_stream_decoder_process_single (flacdec->decoder); GST_DEBUG ("flacdec: checking for EOS"); - if (FLAC__seekable_stream_decoder_get_state (flacdec->decoder) == - FLAC__SEEKABLE_STREAM_DECODER_END_OF_STREAM) - { + if (FLAC__seekable_stream_decoder_get_state (flacdec->decoder) == + FLAC__SEEKABLE_STREAM_DECODER_END_OF_STREAM) { GstEvent *event; GST_DEBUG ("flacdec: sending EOS event"); - FLAC__seekable_stream_decoder_reset(flacdec->decoder); + FLAC__seekable_stream_decoder_reset (flacdec->decoder); if (GST_PAD_IS_USABLE (flacdec->srcpad)) { event = gst_event_new (GST_EVENT_EOS); @@ -581,8 +577,8 @@ gst_flacdec_loop (GstElement *element) static const GstFormat * -gst_flacdec_get_src_formats (GstPad *pad) -{ +gst_flacdec_get_src_formats (GstPad * pad) +{ static const GstFormat formats[] = { GST_FORMAT_DEFAULT, GST_FORMAT_BYTES, @@ -590,63 +586,63 @@ gst_flacdec_get_src_formats (GstPad *pad) 0, }; return formats; -} +} static gboolean -gst_flacdec_convert_src (GstPad *pad, GstFormat src_format, gint64 src_value, - GstFormat *dest_format, gint64 *dest_value) +gst_flacdec_convert_src (GstPad * pad, GstFormat src_format, gint64 src_value, + GstFormat * dest_format, gint64 * dest_value) { gboolean res = TRUE; FlacDec *flacdec = GST_FLACDEC (gst_pad_get_parent (pad)); guint scale = 1; gint bytes_per_sample; - bytes_per_sample = flacdec->channels * ((flacdec->depth+7)>>3); + bytes_per_sample = flacdec->channels * ((flacdec->depth + 7) >> 3); switch (src_format) { case GST_FORMAT_BYTES: switch (*dest_format) { - case GST_FORMAT_DEFAULT: - if (bytes_per_sample == 0) - return FALSE; - *dest_value = src_value / bytes_per_sample; - break; - case GST_FORMAT_TIME: + case GST_FORMAT_DEFAULT: + if (bytes_per_sample == 0) + return FALSE; + *dest_value = src_value / bytes_per_sample; + break; + case GST_FORMAT_TIME: { - gint byterate = bytes_per_sample * flacdec->frequency; + gint byterate = bytes_per_sample * flacdec->frequency; - if (byterate == 0) - return FALSE; - *dest_value = src_value * GST_SECOND / byterate; - break; + if (byterate == 0) + return FALSE; + *dest_value = src_value * GST_SECOND / byterate; + break; } - default: - res = FALSE; + default: + res = FALSE; } break; case GST_FORMAT_DEFAULT: switch (*dest_format) { - case GST_FORMAT_BYTES: + case GST_FORMAT_BYTES: *dest_value = src_value * bytes_per_sample; - break; - case GST_FORMAT_TIME: + break; + case GST_FORMAT_TIME: if (flacdec->frequency == 0) return FALSE; - *dest_value = src_value * GST_SECOND / flacdec->frequency; - break; - default: - res = FALSE; + *dest_value = src_value * GST_SECOND / flacdec->frequency; + break; + default: + res = FALSE; } break; case GST_FORMAT_TIME: switch (*dest_format) { - case GST_FORMAT_BYTES: - scale = bytes_per_sample; - case GST_FORMAT_DEFAULT: + case GST_FORMAT_BYTES: + scale = bytes_per_sample; + case GST_FORMAT_DEFAULT: *dest_value = src_value * scale * flacdec->frequency / GST_SECOND; - break; - default: - res = FALSE; + break; + default: + res = FALSE; } break; default: @@ -656,19 +652,19 @@ gst_flacdec_convert_src (GstPad *pad, GstFormat src_format, gint64 src_value, } static const GstQueryType * -gst_flacdec_get_src_query_types (GstPad *pad) -{ +gst_flacdec_get_src_query_types (GstPad * pad) +{ static const GstQueryType types[] = { GST_QUERY_TOTAL, GST_QUERY_POSITION, 0, }; return types; -} +} static gboolean -gst_flacdec_src_query (GstPad *pad, GstQueryType type, - GstFormat *format, gint64 *value) +gst_flacdec_src_query (GstPad * pad, GstQueryType type, + GstFormat * format, gint64 * value) { gboolean res = TRUE; FlacDec *flacdec = GST_FLACDEC (gst_pad_get_parent (pad)); @@ -679,21 +675,17 @@ gst_flacdec_src_query (GstPad *pad, GstQueryType type, guint64 samples; if (flacdec->stream_samples == 0) - samples = flacdec->total_samples; + samples = flacdec->total_samples; else - samples = flacdec->stream_samples; + samples = flacdec->stream_samples; - gst_pad_convert (flacdec->srcpad, - GST_FORMAT_DEFAULT, - samples, - format, value); + gst_pad_convert (flacdec->srcpad, + GST_FORMAT_DEFAULT, samples, format, value); break; } case GST_QUERY_POSITION: - gst_pad_convert (flacdec->srcpad, - GST_FORMAT_DEFAULT, - flacdec->total_samples, - format, value); + gst_pad_convert (flacdec->srcpad, + GST_FORMAT_DEFAULT, flacdec->total_samples, format, value); break; default: res = FALSE; @@ -702,20 +694,20 @@ gst_flacdec_src_query (GstPad *pad, GstQueryType type, return res; } - + static const GstEventMask * -gst_flacdec_get_src_event_masks (GstPad *pad) +gst_flacdec_get_src_event_masks (GstPad * pad) { static const GstEventMask masks[] = { - { GST_EVENT_SEEK, GST_SEEK_FLAG_ACCURATE }, - { 0, 0 }, + {GST_EVENT_SEEK, GST_SEEK_FLAG_ACCURATE}, + {0, 0}, }; return masks; } static gboolean -gst_flacdec_src_event (GstPad *pad, GstEvent *event) -{ +gst_flacdec_src_event (GstPad * pad, GstEvent * event) +{ gboolean res = TRUE; FlacDec *flacdec = GST_FLACDEC (gst_pad_get_parent (pad)); GstFormat format; @@ -724,11 +716,10 @@ gst_flacdec_src_event (GstPad *pad, GstEvent *event) case GST_EVENT_SEEK: format = GST_FORMAT_DEFAULT; - if (gst_pad_convert (flacdec->srcpad, - GST_EVENT_SEEK_FORMAT (event), - GST_EVENT_SEEK_OFFSET (event), - &format, &flacdec->seek_value)) - flacdec->seek_pending = TRUE; + if (gst_pad_convert (flacdec->srcpad, + GST_EVENT_SEEK_FORMAT (event), + GST_EVENT_SEEK_OFFSET (event), &format, &flacdec->seek_value)) + flacdec->seek_pending = TRUE; else res = FALSE; break; @@ -741,7 +732,7 @@ gst_flacdec_src_event (GstPad *pad, GstEvent *event) } static GstElementStateReturn -gst_flacdec_change_state (GstElement *element) +gst_flacdec_change_state (GstElement * element) { FlacDec *flacdec = GST_FLACDEC (element); |