diff options
author | Josh Coalson <xflac@yahoo.com> | 2007-06-10 10:53:26 +0000 |
---|---|---|
committer | Sebastian Dröge <slomo@circular-chaos.org> | 2007-06-10 10:53:26 +0000 |
commit | 68fd0eca8bb1ac5e2cb5dd2a3a7ece71b8c92fea (patch) | |
tree | 8164e2dd0d36027bcde49223ffe9d5456e776a38 /ext/flac/gstflacdec.c | |
parent | f2fa0a91a6f96f5d0da3a7e78faa37cd9144c987 (diff) |
Add support for flac >= 1.1.3 which changed the API. Fixes bug #385887.
Original commit message from CVS:
Patch by: Josh Coalson <xflac at yahoo dot com>,
updated by Alexis Ballier <aballier at gentoo dot org>:
* configure.ac:
* ext/flac/gstflacdec.c: (gst_flac_dec_reset_decoders),
(gst_flac_dec_setup_seekable_decoder),
(gst_flac_dec_setup_stream_decoder), (gst_flac_dec_seek),
(gst_flac_dec_tell), (gst_flac_dec_length), (gst_flac_dec_eof),
(gst_flac_dec_read_seekable), (gst_flac_dec_read_stream):
* ext/flac/gstflacdec.h:
* ext/flac/gstflacenc.c: (gst_flac_enc_init),
(gst_flac_enc_finalize), (gst_flac_enc_set_metadata),
(gst_flac_enc_sink_setcaps), (gst_flac_enc_update_quality),
(gst_flac_enc_seek_callback), (gst_flac_enc_write_callback),
(gst_flac_enc_tell_callback), (gst_flac_enc_sink_event),
(gst_flac_enc_chain), (gst_flac_enc_set_property),
(gst_flac_enc_get_property), (gst_flac_enc_change_state):
* ext/flac/gstflacenc.h:
Add support for flac >= 1.1.3 which changed the API. Fixes bug #385887.
Diffstat (limited to 'ext/flac/gstflacdec.c')
-rw-r--r-- | ext/flac/gstflacdec.c | 190 |
1 files changed, 188 insertions, 2 deletions
diff --git a/ext/flac/gstflacdec.c b/ext/flac/gstflacdec.c index 4da09eff..06aecc1e 100644 --- a/ext/flac/gstflacdec.c +++ b/ext/flac/gstflacdec.c @@ -94,6 +94,7 @@ static void gst_flac_dec_reset_decoders (GstFlacDec * flacdec); static void gst_flac_dec_setup_seekable_decoder (GstFlacDec * flacdec); static void gst_flac_dec_setup_stream_decoder (GstFlacDec * flacdec); +#ifdef LEGACY_FLAC static FLAC__SeekableStreamDecoderReadStatus gst_flac_dec_read_seekable (const FLAC__SeekableStreamDecoder * decoder, FLAC__byte buffer[], unsigned *bytes, void *client_data); @@ -131,6 +132,33 @@ static void gst_flac_dec_error_callback_seekable (const FLAC__StreamDecoderErrorStatus status, void *client_data); static void gst_flac_dec_error_callback_stream (const FLAC__StreamDecoder * decoder, FLAC__StreamDecoderErrorStatus status, void *client_data); +#else +static FLAC__StreamDecoderReadStatus +gst_flac_dec_read_seekable (const FLAC__StreamDecoder * decoder, + FLAC__byte buffer[], size_t * bytes, void *client_data); +static FLAC__StreamDecoderReadStatus +gst_flac_dec_read_stream (const FLAC__StreamDecoder * decoder, + FLAC__byte buffer[], size_t * bytes, void *client_data); +static FLAC__StreamDecoderSeekStatus +gst_flac_dec_seek (const FLAC__StreamDecoder * decoder, + FLAC__uint64 position, void *client_data); +static FLAC__StreamDecoderTellStatus +gst_flac_dec_tell (const FLAC__StreamDecoder * decoder, + FLAC__uint64 * position, void *client_data); +static FLAC__StreamDecoderLengthStatus +gst_flac_dec_length (const FLAC__StreamDecoder * decoder, + FLAC__uint64 * length, void *client_data); +static FLAC__bool gst_flac_dec_eof (const FLAC__StreamDecoder * decoder, + void *client_data); +static FLAC__StreamDecoderWriteStatus +gst_flac_dec_write_stream (const FLAC__StreamDecoder * decoder, + const FLAC__Frame * frame, + const FLAC__int32 * const buffer[], void *client_data); +static void gst_flac_dec_metadata_callback_stream (const FLAC__StreamDecoder * + decoder, const FLAC__StreamMetadata * metadata, void *client_data); +static void gst_flac_dec_error_callback_stream (const FLAC__StreamDecoder * + decoder, FLAC__StreamDecoderErrorStatus status, void *client_data); +#endif GST_BOILERPLATE (GstFlacDec, gst_flac_dec, GstElement, GST_TYPE_ELEMENT); #define GST_FLAC_DEC_SRC_CAPS \ @@ -213,7 +241,11 @@ static void gst_flac_dec_reset_decoders (GstFlacDec * flacdec) { if (flacdec->seekable_decoder) { +#ifdef LEGACY_FLAC FLAC__seekable_stream_decoder_delete (flacdec->seekable_decoder); +#else + FLAC__stream_decoder_delete (flacdec->seekable_decoder); +#endif flacdec->seekable_decoder = NULL; } @@ -239,6 +271,7 @@ gst_flac_dec_setup_seekable_decoder (GstFlacDec * dec) { gst_flac_dec_reset_decoders (dec); +#ifdef LEGACY_FLAC dec->seekable_decoder = FLAC__seekable_stream_decoder_new (); FLAC__seekable_stream_decoder_set_read_callback (dec->seekable_decoder, @@ -260,6 +293,12 @@ gst_flac_dec_setup_seekable_decoder (GstFlacDec * dec) FLAC__seekable_stream_decoder_set_error_callback (dec->seekable_decoder, gst_flac_dec_error_callback_seekable); FLAC__seekable_stream_decoder_set_client_data (dec->seekable_decoder, dec); +#else + dec->seekable_decoder = FLAC__stream_decoder_new (); + FLAC__stream_decoder_set_metadata_respond (dec->seekable_decoder, + FLAC__METADATA_TYPE_VORBIS_COMMENT); + FLAC__stream_decoder_set_md5_checking (dec->seekable_decoder, false); /* no point calculating since it's never checked here */ +#endif } static void @@ -271,6 +310,7 @@ gst_flac_dec_setup_stream_decoder (GstFlacDec * dec) dec->stream_decoder = FLAC__stream_decoder_new (); +#ifdef LEGACY_FLAC FLAC__stream_decoder_set_read_callback (dec->stream_decoder, gst_flac_dec_read_stream); FLAC__stream_decoder_set_write_callback (dec->stream_decoder, @@ -282,6 +322,11 @@ gst_flac_dec_setup_stream_decoder (GstFlacDec * dec) FLAC__stream_decoder_set_error_callback (dec->stream_decoder, gst_flac_dec_error_callback_stream); FLAC__stream_decoder_set_client_data (dec->stream_decoder, dec); +#else + FLAC__stream_decoder_set_md5_checking (dec->stream_decoder, false); /* no point calculating since it's never checked here */ + FLAC__stream_decoder_set_metadata_respond (dec->stream_decoder, + FLAC__METADATA_TYPE_VORBIS_COMMENT); +#endif } static void @@ -545,6 +590,7 @@ gst_flac_dec_metadata_callback (GstFlacDec * flacdec, } } +#ifdef LEGACY_FLAC static void gst_flac_dec_metadata_callback_seekable (const FLAC__SeekableStreamDecoder * d, const FLAC__StreamMetadata * metadata, void *client_data) @@ -553,6 +599,7 @@ gst_flac_dec_metadata_callback_seekable (const FLAC__SeekableStreamDecoder * d, gst_flac_dec_metadata_callback (dec, metadata); } +#endif static void gst_flac_dec_metadata_callback_stream (const FLAC__StreamDecoder * decoder, @@ -588,12 +635,14 @@ gst_flac_dec_error_callback (GstFlacDec * dec, dec->last_flow = GST_FLOW_ERROR; } +#ifdef LEGACY_FLAC static void gst_flac_dec_error_callback_seekable (const FLAC__SeekableStreamDecoder * d, FLAC__StreamDecoderErrorStatus status, void *client_data) { gst_flac_dec_error_callback (GST_FLAC_DEC (client_data), status); } +#endif static void gst_flac_dec_error_callback_stream (const FLAC__StreamDecoder * d, @@ -602,9 +651,15 @@ gst_flac_dec_error_callback_stream (const FLAC__StreamDecoder * d, gst_flac_dec_error_callback (GST_FLAC_DEC (client_data), status); } +#ifdef LEGACY_FLAC static FLAC__SeekableStreamDecoderSeekStatus gst_flac_dec_seek (const FLAC__SeekableStreamDecoder * decoder, FLAC__uint64 position, void *client_data) +#else +static FLAC__StreamDecoderSeekStatus +gst_flac_dec_seek (const FLAC__StreamDecoder * decoder, + FLAC__uint64 position, void *client_data) +#endif { GstFlacDec *flacdec; @@ -613,12 +668,22 @@ gst_flac_dec_seek (const FLAC__SeekableStreamDecoder * decoder, GST_DEBUG ("seek %" G_GINT64_FORMAT, position); flacdec->offset = position; +#ifdef LEGACY_FLAC return FLAC__SEEKABLE_STREAM_DECODER_SEEK_STATUS_OK; +#else + return FLAC__STREAM_DECODER_SEEK_STATUS_OK; +#endif } +#ifdef LEGACY_FLAC static FLAC__SeekableStreamDecoderTellStatus gst_flac_dec_tell (const FLAC__SeekableStreamDecoder * decoder, FLAC__uint64 * position, void *client_data) +#else +static FLAC__StreamDecoderTellStatus +gst_flac_dec_tell (const FLAC__StreamDecoder * decoder, + FLAC__uint64 * position, void *client_data) +#endif { GstFlacDec *flacdec; @@ -628,12 +693,22 @@ gst_flac_dec_tell (const FLAC__SeekableStreamDecoder * decoder, GST_DEBUG ("tell %" G_GINT64_FORMAT, *position); +#ifdef LEGACY_FLAC return FLAC__SEEKABLE_STREAM_DECODER_TELL_STATUS_OK; +#else + return FLAC__STREAM_DECODER_TELL_STATUS_OK; +#endif } +#ifdef LEGACY_FLAC static FLAC__SeekableStreamDecoderLengthStatus gst_flac_dec_length (const FLAC__SeekableStreamDecoder * decoder, FLAC__uint64 * length, void *client_data) +#else +static FLAC__StreamDecoderLengthStatus +gst_flac_dec_length (const FLAC__StreamDecoder * decoder, + FLAC__uint64 * length, void *client_data) +#endif { GstFlacDec *flacdec; GstFormat fmt = GST_FORMAT_BYTES; @@ -643,22 +718,39 @@ gst_flac_dec_length (const FLAC__SeekableStreamDecoder * decoder, flacdec = GST_FLAC_DEC (client_data); if (!(peer = gst_pad_get_peer (flacdec->sinkpad))) +#ifdef LEGACY_FLAC return FLAC__SEEKABLE_STREAM_DECODER_LENGTH_STATUS_ERROR; +#else + return FLAC__STREAM_DECODER_LENGTH_STATUS_ERROR; +#endif gst_pad_query_duration (peer, &fmt, &len); gst_object_unref (peer); if (fmt != GST_FORMAT_BYTES || len == -1) +#ifdef LEGACY_FLAC return FLAC__SEEKABLE_STREAM_DECODER_LENGTH_STATUS_ERROR; +#else + return FLAC__STREAM_DECODER_LENGTH_STATUS_ERROR; +#endif *length = len; GST_DEBUG ("length %" G_GINT64_FORMAT, *length); +#ifdef LEGACY_FLAC return FLAC__SEEKABLE_STREAM_DECODER_LENGTH_STATUS_OK; +#else + return FLAC__STREAM_DECODER_LENGTH_STATUS_OK; +#endif } +#ifdef LEGACY_FLAC static FLAC__bool gst_flac_dec_eof (const FLAC__SeekableStreamDecoder * decoder, void *client_data) +#else +static FLAC__bool +gst_flac_dec_eof (const FLAC__StreamDecoder * decoder, void *client_data) +#endif { GstFlacDec *flacdec; GstFormat fmt; @@ -686,9 +778,15 @@ gst_flac_dec_eof (const FLAC__SeekableStreamDecoder * decoder, return ret; } +#ifdef LEGACY_FLAC static FLAC__SeekableStreamDecoderReadStatus gst_flac_dec_read_seekable (const FLAC__SeekableStreamDecoder * decoder, FLAC__byte buffer[], unsigned *bytes, void *client_data) +#else +static FLAC__StreamDecoderReadStatus +gst_flac_dec_read_seekable (const FLAC__StreamDecoder * decoder, + FLAC__byte buffer[], size_t * bytes, void *client_data) +#endif { GstFlacDec *flacdec; GstBuffer *buf; @@ -697,7 +795,11 @@ gst_flac_dec_read_seekable (const FLAC__SeekableStreamDecoder * decoder, if (gst_pad_pull_range (flacdec->sinkpad, flacdec->offset, *bytes, &buf) != GST_FLOW_OK) +#ifdef LEGACY_FLAC return FLAC__SEEKABLE_STREAM_DECODER_READ_STATUS_ERROR; +#else + return FLAC__STREAM_DECODER_READ_STATUS_ABORT; +#endif GST_DEBUG ("Read %d bytes at %" G_GUINT64_FORMAT, GST_BUFFER_SIZE (buf), flacdec->offset); @@ -706,12 +808,22 @@ gst_flac_dec_read_seekable (const FLAC__SeekableStreamDecoder * decoder, gst_buffer_unref (buf); flacdec->offset += *bytes; +#ifdef LEGACY_FLAC return FLAC__SEEKABLE_STREAM_DECODER_READ_STATUS_OK; +#else + return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE; +#endif } +#ifdef LEGACY_FLAC static FLAC__StreamDecoderReadStatus gst_flac_dec_read_stream (const FLAC__StreamDecoder * decoder, FLAC__byte buffer[], unsigned *bytes, void *client_data) +#else +static FLAC__StreamDecoderReadStatus +gst_flac_dec_read_stream (const FLAC__StreamDecoder * decoder, + FLAC__byte buffer[], size_t * bytes, void *client_data) +#endif { GstFlacDec *dec = GST_FLAC_DEC (client_data); guint len; @@ -881,6 +993,7 @@ done: return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE; } +#ifdef LEGACY_FLAC static FLAC__StreamDecoderWriteStatus gst_flac_dec_write_seekable (const FLAC__SeekableStreamDecoder * decoder, const FLAC__Frame * frame, @@ -888,6 +1001,7 @@ gst_flac_dec_write_seekable (const FLAC__SeekableStreamDecoder * decoder, { return gst_flac_dec_write (GST_FLAC_DEC (client_data), frame, buffer); } +#endif static FLAC__StreamDecoderWriteStatus gst_flac_dec_write_stream (const FLAC__StreamDecoder * decoder, @@ -901,7 +1015,13 @@ static void gst_flac_dec_loop (GstPad * sinkpad) { GstFlacDec *flacdec; + +#ifdef LEGACY_FLAC FLAC__SeekableStreamDecoderState s; +#else + FLAC__StreamDecoderState s; + FLAC__StreamDecoderInitStatus is; +#endif flacdec = GST_FLAC_DEC (GST_OBJECT_PARENT (sinkpad)); @@ -909,9 +1029,19 @@ gst_flac_dec_loop (GstPad * sinkpad) if (flacdec->init) { GST_DEBUG_OBJECT (flacdec, "initializing decoder"); +#ifdef LEGACY_FLAC s = FLAC__seekable_stream_decoder_init (flacdec->seekable_decoder); if (s != FLAC__SEEKABLE_STREAM_DECODER_OK) goto analyze_state; +#else + is = FLAC__stream_decoder_init_stream (flacdec->seekable_decoder, + gst_flac_dec_read_seekable, gst_flac_dec_seek, gst_flac_dec_tell, + gst_flac_dec_length, gst_flac_dec_eof, gst_flac_dec_write_stream, + gst_flac_dec_metadata_callback_stream, + gst_flac_dec_error_callback_stream, flacdec); + if (is != FLAC__STREAM_DECODER_INIT_STATUS_OK) + goto analyze_state; +#endif /* FLAC__seekable_stream_decoder_process_metadata (flacdec->seekable_decoder); */ flacdec->init = FALSE; } @@ -921,15 +1051,30 @@ gst_flac_dec_loop (GstPad * sinkpad) flacdec->last_flow = GST_FLOW_OK; GST_LOG_OBJECT (flacdec, "processing single"); +#ifdef LEGACY_FLAC FLAC__seekable_stream_decoder_process_single (flacdec->seekable_decoder); - +#else + FLAC__stream_decoder_process_single (flacdec->seekable_decoder); +#endif analyze_state: GST_LOG_OBJECT (flacdec, "done processing, checking encoder state"); +#ifdef LEGACY_FLAC s = FLAC__seekable_stream_decoder_get_state (flacdec->seekable_decoder); +#else + s = FLAC__stream_decoder_get_state (flacdec->seekable_decoder); +#endif switch (s) { +#ifdef LEGACY_FLAC case FLAC__SEEKABLE_STREAM_DECODER_OK: - case FLAC__SEEKABLE_STREAM_DECODER_SEEKING:{ + case FLAC__SEEKABLE_STREAM_DECODER_SEEKING: +#else + case FLAC__STREAM_DECODER_SEARCH_FOR_METADATA: + case FLAC__STREAM_DECODER_READ_METADATA: + case FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC: + case FLAC__STREAM_DECODER_READ_FRAME: +#endif + { GST_DEBUG_OBJECT (flacdec, "everything ok"); if (GST_FLOW_IS_FATAL (flacdec->last_flow) || @@ -961,9 +1106,17 @@ analyze_state: return; } +#ifdef LEGACY_FLAC case FLAC__SEEKABLE_STREAM_DECODER_END_OF_STREAM:{ +#else + case FLAC__STREAM_DECODER_END_OF_STREAM:{ +#endif GST_DEBUG_OBJECT (flacdec, "EOS"); +#ifdef LEGACY_FLAC FLAC__seekable_stream_decoder_reset (flacdec->seekable_decoder); +#else + FLAC__stream_decoder_reset (flacdec->seekable_decoder); +#endif if ((flacdec->segment.flags & GST_SEEK_FLAG_SEGMENT) != 0) { if (flacdec->segment.duration > 0) { @@ -977,6 +1130,7 @@ analyze_state: goto eos_and_pause; } +#ifdef LEGACY_FLAC case FLAC__SEEKABLE_STREAM_DECODER_MEMORY_ALLOCATION_ERROR: case FLAC__SEEKABLE_STREAM_DECODER_STREAM_DECODER_ERROR: case FLAC__SEEKABLE_STREAM_DECODER_READ_ERROR: @@ -984,11 +1138,23 @@ analyze_state: case FLAC__SEEKABLE_STREAM_DECODER_ALREADY_INITIALIZED: case FLAC__SEEKABLE_STREAM_DECODER_INVALID_CALLBACK: case FLAC__SEEKABLE_STREAM_DECODER_UNINITIALIZED: +#else + case FLAC__STREAM_DECODER_OGG_ERROR: + case FLAC__STREAM_DECODER_SEEK_ERROR: + case FLAC__STREAM_DECODER_ABORTED: + case FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR: + case FLAC__STREAM_DECODER_UNINITIALIZED: +#endif default:{ /* fixme: this error sucks -- should try to figure out when/if an more specific error was already sent via the callback */ +#ifdef LEGACY_FLAC GST_ELEMENT_ERROR (flacdec, STREAM, DECODE, (NULL), ("%s", FLAC__SeekableStreamDecoderStateString[s])); +#else + GST_ELEMENT_ERROR (flacdec, STREAM, DECODE, (NULL), + ("%s", FLAC__StreamDecoderStateString[s])); +#endif goto eos_and_pause; } } @@ -1106,7 +1272,11 @@ gst_flac_dec_sink_event (GstPad * pad, GstEvent * event) static GstFlowReturn gst_flac_dec_chain (GstPad * pad, GstBuffer * buf) { +#ifdef LEGACY_FLAC FLAC__StreamDecoderState s; +#else + FLAC__StreamDecoderInitStatus s; +#endif GstFlacDec *dec; gboolean got_audio_frame; @@ -1118,11 +1288,22 @@ gst_flac_dec_chain (GstPad * pad, GstBuffer * buf) if (dec->init) { GST_DEBUG_OBJECT (dec, "initializing decoder"); +#ifdef LEGACY_FLAC s = FLAC__stream_decoder_init (dec->stream_decoder); if (s != FLAC__STREAM_DECODER_SEARCH_FOR_METADATA) { GST_ELEMENT_ERROR (GST_ELEMENT (dec), LIBRARY, INIT, (NULL), (NULL)); return GST_FLOW_ERROR; } +#else + s = FLAC__stream_decoder_init_stream (dec->stream_decoder, + gst_flac_dec_read_stream, NULL, NULL, NULL, NULL, + gst_flac_dec_write_stream, gst_flac_dec_metadata_callback_stream, + gst_flac_dec_error_callback_stream, dec); + if (s != FLAC__STREAM_DECODER_INIT_STATUS_OK) { + GST_ELEMENT_ERROR (GST_ELEMENT (dec), LIBRARY, INIT, (NULL), (NULL)); + return GST_FLOW_ERROR; + } +#endif GST_DEBUG_OBJECT (dec, "initialized (framed=%d)", dec->framed); dec->init = FALSE; } @@ -1603,8 +1784,13 @@ gst_flac_dec_handle_seek_event (GstFlacDec * flacdec, GstEvent * event) flacdec->seeking = TRUE; seek_ok = +#ifdef LEGACY_FLAC FLAC__seekable_stream_decoder_seek_absolute (flacdec->seekable_decoder, segment.start); +#else + FLAC__stream_decoder_seek_absolute (flacdec->seekable_decoder, + segment.start); +#endif flacdec->seeking = FALSE; |