@@ -68,9 +68,9 @@ typedef struct
68
68
unsigned bufferpos ;
69
69
70
70
const FLAC__Frame * frame ;
71
- FLAC__bool bufferbackup ;
72
71
73
72
unsigned compression ;
73
+
74
74
} FLAC_PRIVATE ;
75
75
76
76
typedef struct
@@ -187,10 +187,9 @@ flac_buffer_copy (SF_PRIVATE *psf)
187
187
188
188
if (pflac -> ptr == NULL )
189
189
{ /*
190
- ** Not sure why this code is here and not elsewhere.
191
- ** Removing it causes valgrind errors .
190
+ ** This pointer is reset to NULL each time the current frame has been
191
+ ** decoded. Somehow its used during encoding and decoding .
192
192
*/
193
- pflac -> bufferbackup = SF_TRUE ;
194
193
for (i = 0 ; i < channels ; i ++ )
195
194
{
196
195
if (pflac -> rbuffer [i ] == NULL )
@@ -206,6 +205,11 @@ flac_buffer_copy (SF_PRIVATE *psf)
206
205
207
206
len = SF_MIN (pflac -> len , frame -> header .blocksize ) ;
208
207
208
+ if (pflac -> remain % channels != 0 )
209
+ { psf_log_printf (psf , "Error: pflac->remain %u channels %u\n" , pflac -> remain , channels ) ;
210
+ return 0 ;
211
+ } ;
212
+
209
213
switch (pflac -> pcmtype )
210
214
{ case PFLAC_PCM_SHORT :
211
215
{ short * retpcm = (short * ) pflac -> ptr ;
@@ -381,7 +385,6 @@ sf_flac_write_callback (const FLAC__StreamDecoder * UNUSED (decoder), const FLAC
381
385
pflac -> frame = frame ;
382
386
pflac -> bufferpos = 0 ;
383
387
384
- pflac -> bufferbackup = SF_FALSE ;
385
388
pflac -> wbuffer = buffer ;
386
389
387
390
flac_buffer_copy (psf ) ;
@@ -907,11 +910,19 @@ flac_init (SF_PRIVATE *psf)
907
910
static unsigned
908
911
flac_read_loop (SF_PRIVATE * psf , unsigned len )
909
912
{ FLAC_PRIVATE * pflac = (FLAC_PRIVATE * ) psf -> codec_data ;
913
+ FLAC__StreamDecoderState state ;
910
914
911
915
pflac -> pos = 0 ;
912
916
pflac -> len = len ;
913
917
pflac -> remain = len ;
914
918
919
+ state = FLAC__stream_decoder_get_state (pflac -> fsd ) ;
920
+ if (state > FLAC__STREAM_DECODER_END_OF_STREAM )
921
+ { psf_log_printf (psf , "FLAC__stream_decoder_get_state returned %s\n" , FLAC__StreamDecoderStateString [state ]) ;
922
+ /* Current frame is busted, so NULL the pointer. */
923
+ pflac -> frame = NULL ;
924
+ } ;
925
+
915
926
/* First copy data that has already been decoded and buffered. */
916
927
if (pflac -> frame != NULL && pflac -> bufferpos < pflac -> frame -> header .blocksize )
917
928
flac_buffer_copy (psf ) ;
@@ -920,8 +931,13 @@ flac_read_loop (SF_PRIVATE *psf, unsigned len)
920
931
while (pflac -> pos < pflac -> len )
921
932
{ if (FLAC__stream_decoder_process_single (pflac -> fsd ) == 0 )
922
933
break ;
923
- if (FLAC__stream_decoder_get_state (pflac -> fsd ) >= FLAC__STREAM_DECODER_END_OF_STREAM )
934
+ state = FLAC__stream_decoder_get_state (pflac -> fsd ) ;
935
+ if (state >= FLAC__STREAM_DECODER_END_OF_STREAM )
936
+ { psf_log_printf (psf , "FLAC__stream_decoder_get_state returned %s\n" , FLAC__StreamDecoderStateString [state ]) ;
937
+ /* Current frame is busted, so NULL the pointer. */
938
+ pflac -> frame = NULL ;
924
939
break ;
940
+ } ;
925
941
} ;
926
942
927
943
pflac -> ptr = NULL ;
0 commit comments