1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
|
$NetBSD: patch-ad,v 1.3 2007/01/13 07:32:36 wiz Exp $
--- modules/codec/flac.c.orig 2006-05-06 15:52:19.000000000 +0000
+++ modules/codec/flac.c
@@ -33,6 +33,12 @@
# include <FLAC/stream_decoder.h>
# include <FLAC/stream_encoder.h>
# define USE_LIBFLAC
+ /* by LEGACY_FLAC we mean before FLAC 1.1.3 when the decoder/encoder APIs were simplified */
+# if !defined(FLAC_API_VERSION_CURRENT) || FLAC_API_VERSION_CURRENT < 8
+# define LEGACY_FLAC
+# else
+# undef LEGACY_FLAC
+# endif
#endif
#include "vlc_block_helper.h"
@@ -133,7 +139,12 @@ static int SyncInfo( decoder_t *, uint8_
#ifdef USE_LIBFLAC
static FLAC__StreamDecoderReadStatus
DecoderReadCallback( const FLAC__StreamDecoder *decoder,
- FLAC__byte buffer[], unsigned *bytes, void *client_data );
+#ifdef LEGACY_FLAC
+ FLAC__byte buffer[], unsigned *bytes,
+#else
+ FLAC__byte buffer[], size_t *bytes,
+#endif
+ void *client_data );
static FLAC__StreamDecoderWriteStatus
DecoderWriteCallback( const FLAC__StreamDecoder *decoder,
@@ -223,6 +234,7 @@ static int OpenDecoder( vlc_object_t *p_
return VLC_EGENERIC;
}
+#ifdef LEGACY_FLAC
FLAC__stream_decoder_set_read_callback( p_sys->p_flac,
DecoderReadCallback );
FLAC__stream_decoder_set_write_callback( p_sys->p_flac,
@@ -233,7 +245,12 @@ static int OpenDecoder( vlc_object_t *p_
DecoderErrorCallback );
FLAC__stream_decoder_set_client_data( p_sys->p_flac, p_dec );
+ /* really should check the return value here */
FLAC__stream_decoder_init( p_sys->p_flac );
+#else
+ /* really should check the return value here */
+ FLAC__stream_decoder_init_stream( p_sys->p_flac, DecoderReadCallback, NULL, NULL, NULL, NULL, DecoderWriteCallback, DecoderMetadataCallback, DecoderErrorCallback, p_dec );
+#endif
#endif
/* Set output properties */
@@ -535,7 +552,12 @@ static aout_buffer_t *DecodeBlock( decod
*****************************************************************************/
static FLAC__StreamDecoderReadStatus
DecoderReadCallback( const FLAC__StreamDecoder *decoder, FLAC__byte buffer[],
- unsigned *bytes, void *client_data )
+#ifdef LEGACY_FLAC
+ unsigned *bytes,
+#else
+ size_t *bytes,
+#endif
+ void *client_data )
{
decoder_t *p_dec = (decoder_t *)client_data;
decoder_sys_t *p_sys = p_dec->p_sys;
@@ -660,6 +682,11 @@ static void DecoderErrorCallback( const
msg_Err( p_dec, "frame's data did not match the CRC in the "
"footer." );
break;
+#ifndef LEGACY_FLAC
+ case FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM:
+ msg_Err( p_dec, "the decoder encountered reserved fields in use in the stream." );
+ break;
+#endif
default:
msg_Err( p_dec, "got decoder error: %d", status );
}
@@ -722,16 +749,11 @@ static void decoder_state_error( decoder
case FLAC__STREAM_DECODER_END_OF_STREAM:
msg_Dbg( p_dec, "the decoder has reached the end of the stream." );
break;
- case FLAC__STREAM_DECODER_ABORTED:
- msg_Warn( p_dec, "the decoder was aborted by the read callback." );
- break;
+#ifdef LEGACY_FLAC
case FLAC__STREAM_DECODER_UNPARSEABLE_STREAM:
msg_Warn( p_dec, "the decoder encountered reserved fields in use "
"in the stream." );
break;
- case FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR:
- msg_Err( p_dec, "error when allocating memory." );
- break;
case FLAC__STREAM_DECODER_ALREADY_INITIALIZED:
msg_Err( p_dec, "FLAC__stream_decoder_init() was called when the "
"decoder was already initialized, usually because "
@@ -741,6 +763,20 @@ static void decoder_state_error( decoder
msg_Err( p_dec, "FLAC__stream_decoder_init() was called without "
"all callbacks being set." );
break;
+#else
+ case FLAC__STREAM_DECODER_OGG_ERROR:
+ msg_Warn( p_dec, "an error occurred in the underlying Ogg layer." );
+ break;
+ case FLAC__STREAM_DECODER_SEEK_ERROR:
+ msg_Warn( p_dec, "an error occurred while seeking." );
+ break;
+#endif
+ case FLAC__STREAM_DECODER_ABORTED:
+ msg_Warn( p_dec, "the decoder was aborted by the read callback." );
+ break;
+ case FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR:
+ msg_Err( p_dec, "error when allocating memory." );
+ break;
case FLAC__STREAM_DECODER_UNINITIALIZED:
msg_Err( p_dec, "decoder in uninitialized state." );
break;
@@ -1138,7 +1174,11 @@ static block_t *Encode( encoder_t *, aou
static FLAC__StreamEncoderWriteStatus
EncoderWriteCallback( const FLAC__StreamEncoder *encoder,
const FLAC__byte buffer[],
+#ifdef LEGACY_FLAC
unsigned bytes, unsigned samples,
+#else
+ size_t bytes, unsigned samples,
+#endif
unsigned current_frame, void *client_data );
static void EncoderMetadataCallback( const FLAC__StreamEncoder *encoder,
@@ -1185,15 +1225,23 @@ static int OpenEncoder( vlc_object_t *p_
FLAC__stream_encoder_set_bits_per_sample( p_sys->p_flac, 16 );
p_enc->fmt_in.i_codec = AOUT_FMT_S16_NE;
+#ifdef LEGACY_FLAC
FLAC__stream_encoder_set_write_callback( p_sys->p_flac,
EncoderWriteCallback );
FLAC__stream_encoder_set_metadata_callback( p_sys->p_flac,
EncoderMetadataCallback );
FLAC__stream_encoder_set_client_data( p_sys->p_flac, p_enc );
+#endif
/* Get and store the STREAMINFO metadata block as a p_extra */
p_sys->p_chain = 0;
+#ifdef LEGACY_FLAC
+ /* really should check the return value here */
FLAC__stream_encoder_init( p_sys->p_flac );
+#else
+ /* really should check the return value here */
+ FLAC__stream_encoder_init_stream( p_sys->p_flac, EncoderWriteCallback, NULL, NULL, EncoderMetadataCallback, p_enc );
+#endif
return VLC_SUCCESS;
}
@@ -1270,7 +1318,11 @@ static void EncoderMetadataCallback( con
static FLAC__StreamEncoderWriteStatus
EncoderWriteCallback( const FLAC__StreamEncoder *encoder,
const FLAC__byte buffer[],
+#ifdef LEGACY_FLAC
unsigned bytes, unsigned samples,
+#else
+ size_t bytes, unsigned samples,
+#endif
unsigned current_frame, void *client_data )
{
encoder_t *p_enc = (encoder_t *)client_data;
|