On Thu, Jun 19, 2014 at 03:30:06PM +0200, Miroslav Lichvar wrote:
> But, as we have seen with unusual data the residual signal can be
> wider than bps. The FLAC format specification doesn't seem to mention
> this. Should it be treated as a valid FLAC stream?

I think it would be interesting to know how common are such streams. I
patched flac to print a warning on decoding or testing when this is
detected, but didn't find any files with this problem in my (small)
music collection.

If someone has a large collection and some cycles to spare, can you please 
consider compiling flac from git with the attached patch and see if
you have any files that fail with "flac -t" ?

With the known problem file (snippet6.wav) encoded by 1.3.0 it prints
this:

WARNING: residual -11025151 wider than bps 24
WARNING: residual 41873263 wider than bps 24
WARNING: residual -67175215 wider than bps 24
WARNING: residual 69950995 wider than bps 24
WARNING: residual -67108864 wider than bps 24                                   
                                                   
...
WARNING: residual 11227392 wider than bps 24
WARNING: residual -8754288 wider than bps 24
snippet6.flac: ERROR, MD5 signature mismatch

Thanks,

-- 
Miroslav Lichvar
diff --git a/src/libFLAC/stream_decoder.c b/src/libFLAC/stream_decoder.c
index ddd8979..82318ae 100644
--- a/src/libFLAC/stream_decoder.c
+++ b/src/libFLAC/stream_decoder.c
@@ -99,7 +99,7 @@ static FLAC__bool read_subframe_constant_(FLAC__StreamDecoder 
*decoder, unsigned
 static FLAC__bool read_subframe_fixed_(FLAC__StreamDecoder *decoder, unsigned 
channel, unsigned bps, const unsigned order, FLAC__bool do_full_decode);
 static FLAC__bool read_subframe_lpc_(FLAC__StreamDecoder *decoder, unsigned 
channel, unsigned bps, const unsigned order, FLAC__bool do_full_decode);
 static FLAC__bool read_subframe_verbatim_(FLAC__StreamDecoder *decoder, 
unsigned channel, unsigned bps, FLAC__bool do_full_decode);
-static FLAC__bool read_residual_partitioned_rice_(FLAC__StreamDecoder 
*decoder, unsigned predictor_order, unsigned partition_order, 
FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents, 
FLAC__int32 *residual, FLAC__bool is_extended);
+static FLAC__bool read_residual_partitioned_rice_(FLAC__StreamDecoder 
*decoder, unsigned predictor_order, unsigned partition_order, 
FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents, 
FLAC__int32 *residual, FLAC__bool is_extended, int bps);
 static FLAC__bool read_zero_padding_(FLAC__StreamDecoder *decoder);
 static FLAC__bool read_callback_(FLAC__byte buffer[], size_t *bytes, void 
*client_data);
 #if FLAC__HAS_OGG
@@ -2572,7 +2572,7 @@ FLAC__bool read_subframe_fixed_(FLAC__StreamDecoder 
*decoder, unsigned channel,
        switch(subframe->entropy_coding_method.type) {
                case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE:
                case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2:
-                       if(!read_residual_partitioned_rice_(decoder, order, 
subframe->entropy_coding_method.data.partitioned_rice.order, 
&decoder->private_->partitioned_rice_contents[channel], 
decoder->private_->residual[channel], 
/*is_extended=*/subframe->entropy_coding_method.type == 
FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2))
+                       if(!read_residual_partitioned_rice_(decoder, order, 
subframe->entropy_coding_method.data.partitioned_rice.order, 
&decoder->private_->partitioned_rice_contents[channel], 
decoder->private_->residual[channel], 
/*is_extended=*/subframe->entropy_coding_method.type == 
FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2, bps))
                                return false;
                        break;
                default:
@@ -2651,7 +2651,7 @@ FLAC__bool read_subframe_lpc_(FLAC__StreamDecoder 
*decoder, unsigned channel, un
        switch(subframe->entropy_coding_method.type) {
                case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE:
                case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2:
-                       if(!read_residual_partitioned_rice_(decoder, order, 
subframe->entropy_coding_method.data.partitioned_rice.order, 
&decoder->private_->partitioned_rice_contents[channel], 
decoder->private_->residual[channel], 
/*is_extended=*/subframe->entropy_coding_method.type == 
FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2))
+                       if(!read_residual_partitioned_rice_(decoder, order, 
subframe->entropy_coding_method.data.partitioned_rice.order, 
&decoder->private_->partitioned_rice_contents[channel], 
decoder->private_->residual[channel], 
/*is_extended=*/subframe->entropy_coding_method.type == 
FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2, bps))
                                return false;
                        break;
                default:
@@ -2703,7 +2703,7 @@ FLAC__bool read_subframe_verbatim_(FLAC__StreamDecoder 
*decoder, unsigned channe
        return true;
 }
 
-FLAC__bool read_residual_partitioned_rice_(FLAC__StreamDecoder *decoder, 
unsigned predictor_order, unsigned partition_order, 
FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents, 
FLAC__int32 *residual, FLAC__bool is_extended)
+FLAC__bool read_residual_partitioned_rice_(FLAC__StreamDecoder *decoder, 
unsigned predictor_order, unsigned partition_order, 
FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents, 
FLAC__int32 *residual, FLAC__bool is_extended, int bps)
 {
        FLAC__uint32 rice_parameter;
        int i;
@@ -2744,6 +2744,15 @@ FLAC__bool 
read_residual_partitioned_rice_(FLAC__StreamDecoder *decoder, unsigne
                        u = (partition_order == 0 || partition > 0)? 
partition_samples : partition_samples - predictor_order;
                        
if(!decoder->private_->local_bitreader_read_rice_signed_block(decoder->private_->input,
 residual + sample, u, rice_parameter))
                                return false; /* read_callback_ sets the state 
for us */
+#if 1
+                       for (i = sample; (unsigned)i < sample + u; i++)  {
+                               if (abs(residual[i]) > (1 << (bps - 1))) {
+                                       fprintf(stderr, "WARNING: residual %d 
wider than bps %d\n",
+                                                       residual[i], bps);
+                                       residual[i]--; /* corrupt the value to 
fail decoding test */
+                               }
+                       }
+#endif
                        sample += u;
                }
                else {
_______________________________________________
flac-dev mailing list
flac-dev@xiph.org
http://lists.xiph.org/mailman/listinfo/flac-dev

Reply via email to