summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog2
-rw-r--r--src/libflac/decoder_flac.c24
-rw-r--r--src/libflac/demux_flac.c51
3 files changed, 74 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog
index 20082e2f5..c03f37501 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -28,6 +28,8 @@ xine-lib (1.1.4)
module files, using the magic numbers from GNU file. This allows to open
module files based on content rather than on their extension only.
[bug #1445746]
+ * Make the libFLAC-based decoder and demuxer for FLAC files work with recent
+ FLAC release 1.1.3.
xine-lib (1.1.3)
* Security fixes:
diff --git a/src/libflac/decoder_flac.c b/src/libflac/decoder_flac.c
index b62286eaa..095555e1d 100644
--- a/src/libflac/decoder_flac.c
+++ b/src/libflac/decoder_flac.c
@@ -30,6 +30,13 @@
#include <FLAC/stream_decoder.h>
+#if !defined FLAC_API_VERSION_CURRENT || FLAC_API_VERSION_CURRENT < 8
+#include <FLAC/seekable_stream_decoder.h>
+#define LEGACY_FLAC
+#else
+#undef LEGACY_FLAC
+#endif
+
#define LOG_MODULE "flac_decoder"
#define LOG_VERBOSE
@@ -344,6 +351,7 @@ open_plugin (audio_decoder_class_t *class_gen, xine_stream_t *stream) {
this->flac_decoder = FLAC__stream_decoder_new();
+#ifdef LEGACY_FLAC
FLAC__stream_decoder_set_read_callback (this->flac_decoder,
flac_read_callback);
FLAC__stream_decoder_set_write_callback (this->flac_decoder,
@@ -359,6 +367,22 @@ open_plugin (audio_decoder_class_t *class_gen, xine_stream_t *stream) {
free (this);
return NULL;
}
+#else
+ if ( FLAC__stream_decoder_init_stream (this->flac_decoder,
+ flac_read_callback,
+ NULL, /* seek */
+ NULL, /* tell */
+ NULL, /* length */
+ NULL, /* eof */
+ flac_write_callback,
+ NULL, /* metadata */
+ flac_error_callback,
+ this
+ ) != FLAC__STREAM_DECODER_INIT_STATUS_OK ) {
+ free (this);
+ return NULL;
+ }
+#endif
return (audio_decoder_t *) this;
}
diff --git a/src/libflac/demux_flac.c b/src/libflac/demux_flac.c
index efee0b179..43ee17d5c 100644
--- a/src/libflac/demux_flac.c
+++ b/src/libflac/demux_flac.c
@@ -441,7 +441,11 @@ demux_flac_dispose (demux_plugin_t *this_gen) {
lprintf("demux_flac_dispose\n");
if (this->flac_decoder)
+#ifdef LEGACY_FLAC
FLAC__seekable_stream_decoder_delete (this->flac_decoder);
+#else
+ FLAC__stream_decoder_delete (this->flac_decoder);
+#endif
free(this);
return;
@@ -494,8 +498,13 @@ demux_flac_seek (demux_plugin_t *this_gen, off_t start_pos, int start_time, int
}
target_sample = (uint64_t)(distance * this->total_samples);
+#ifdef LEGACY_FLAC
s = FLAC__seekable_stream_decoder_seek_absolute (this->flac_decoder,
target_sample);
+#else
+ s = FLAC__stream_decoder_seek_absolute (this->flac_decoder,
+ target_sample);
+#endif
if (s) {
lprintf ("Seek to: %d successfull!\n", start_time);
@@ -618,9 +627,6 @@ open_plugin (demux_class_t *class_gen,
/* Get a new FLAC decoder and hook up callbacks */
#ifdef LEGACY_FLAC
this->flac_decoder = FLAC__seekable_stream_decoder_new();
-#else
- this->flac_decoder = FLAC__stream_decoder_new();
-#endif
lprintf("this->flac_decoder: %p\n", this->flac_decoder);
FLAC__seekable_stream_decoder_set_md5_checking (this->flac_decoder, false);
@@ -644,6 +650,37 @@ open_plugin (demux_class_t *class_gen,
this);
FLAC__seekable_stream_decoder_init (this->flac_decoder);
+#else
+ this->flac_decoder = FLAC__stream_decoder_new();
+ lprintf("this->flac_decoder: %p\n", this->flac_decoder);
+
+ if ( ! this->flac_decoder ) {
+ free(this);
+ return NULL;
+ }
+
+ FLAC__stream_decoder_set_md5_checking (this->flac_decoder, false);
+
+ if ( FLAC__stream_decoder_init_stream(this->flac_decoder,
+ flac_read_callback,
+ flac_seek_callback,
+ flac_tell_callback,
+ flac_length_callback,
+ flac_eof_callback,
+ flac_write_callback,
+ flac_metadata_callback,
+ flac_error_callback,
+ this
+ ) != FLAC__STREAM_DECODER_INIT_STATUS_OK ) {
+#ifdef LEGACY_FLAC
+ FLAC__seekable_stream_decoder_delete (this->flac_decoder);
+#else
+ FLAC__stream_decoder_delete (this->flac_decoder);
+#endif
+ free(this);
+ return NULL;
+ }
+#endif
/* Get some stream info */
this->data_size = this->input->get_length (this->input);
@@ -653,13 +690,21 @@ open_plugin (demux_class_t *class_gen,
* this flac stream
*/
this->status = DEMUX_OK;
+#ifdef LEGACY_FLAC
FLAC__seekable_stream_decoder_process_until_end_of_metadata (this->flac_decoder);
+#else
+ FLAC__stream_decoder_process_until_end_of_metadata (this->flac_decoder);
+#endif
lprintf("Processed file until end of metadata: %s\n",
this->status == DEMUX_OK ? "success" : "failure");
if (this->status != DEMUX_OK) {
+#ifdef LEGACY_FLAC
FLAC__seekable_stream_decoder_delete (this->flac_decoder);
+#else
+ FLAC__stream_decoder_delete (this->flac_decoder);
+#endif
free (this);
return NULL;
}