add more things reported in analyze mode
authorJosh Coalson <jcoalson@users.sourceforce.net>
Sat, 16 Jun 2007 00:40:19 +0000 (00:40 +0000)
committerJosh Coalson <jcoalson@users.sourceforce.net>
Sat, 16 Jun 2007 00:40:19 +0000 (00:40 +0000)
src/flac/analyze.c
src/flac/analyze.h
src/flac/decode.c

index 2697e6e..47a5e76 100644 (file)
@@ -58,56 +58,62 @@ void flac__analyze_init(analysis_options aopts)
        }
 }
 
-void flac__analyze_frame(const FLAC__Frame *frame, unsigned frame_number, unsigned frame_bytes, analysis_options aopts, FILE *fout)
+void flac__analyze_frame(const FLAC__Frame *frame, unsigned frame_number, FLAC__uint64 frame_offset, unsigned frame_bytes, analysis_options aopts, FILE *fout)
 {
        const unsigned channels = frame->header.channels;
        char outfilename[1024];
        subframe_stats_t stats;
-       unsigned i, channel;
+       unsigned i, channel, partitions;
 
        /* do the human-readable part first */
-       fprintf(fout, "frame=%u\tbits=%u\tblocksize=%u\tsample_rate=%u\tchannels=%u\tchannel_assignment=%s\n", frame_number, frame_bytes*8, frame->header.blocksize, frame->header.sample_rate, channels, FLAC__ChannelAssignmentString[frame->header.channel_assignment]);
+#ifdef _MSC_VER
+       fprintf(fout, "frame=%u\toffset=%I64u\tbits=%u\tblocksize=%u\tsample_rate=%u\tchannels=%u\tchannel_assignment=%s\n", frame_number, frame_offset, frame_bytes*8, frame->header.blocksize, frame->header.sample_rate, channels, FLAC__ChannelAssignmentString[frame->header.channel_assignment]);
+#else
+       fprintf(fout, "frame=%u\toffset=%llu\tbits=%u\tblocksize=%u\tsample_rate=%u\tchannels=%u\tchannel_assignment=%s\n", frame_number, (unsigned long long)frame_offset, frame_bytes*8, frame->header.blocksize, frame->header.sample_rate, channels, FLAC__ChannelAssignmentString[frame->header.channel_assignment]);
+#endif
        for(channel = 0; channel < channels; channel++) {
                const FLAC__Subframe *subframe = frame->subframes+channel;
+               const FLAC__bool is_rice2 = subframe->data.fixed.entropy_coding_method.type == FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2;
+               const unsigned pesc = is_rice2? FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2_ESCAPE_PARAMETER : FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER;
                fprintf(fout, "\tsubframe=%u\twasted_bits=%u\ttype=%s", channel, subframe->wasted_bits, FLAC__SubframeTypeString[subframe->type]);
                switch(subframe->type) {
                        case FLAC__SUBFRAME_TYPE_CONSTANT:
                                fprintf(fout, "\tvalue=%d\n", subframe->data.constant.value);
                                break;
                        case FLAC__SUBFRAME_TYPE_FIXED:
-                               FLAC__ASSERT(subframe->data.fixed.entropy_coding_method.type == FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE);
-                               fprintf(fout, "\torder=%u\tpartition_order=%u\n", subframe->data.fixed.order, subframe->data.fixed.entropy_coding_method.data.partitioned_rice.order);
+                               FLAC__ASSERT(subframe->data.fixed.entropy_coding_method.type <= FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2);
+                               fprintf(fout, "\torder=%u\tresidual_type=%s\tpartition_order=%u\n", subframe->data.fixed.order, is_rice2? "RICE2":"RICE", subframe->data.fixed.entropy_coding_method.data.partitioned_rice.order);
                                for(i = 0; i < subframe->data.fixed.order; i++)
                                        fprintf(fout, "\t\twarmup[%u]=%d\n", i, subframe->data.fixed.warmup[i]);
+                               partitions = (1u << subframe->data.fixed.entropy_coding_method.data.partitioned_rice.order);
+                               for(i = 0; i < partitions; i++) {
+                                       unsigned parameter = subframe->data.fixed.entropy_coding_method.data.partitioned_rice.contents->parameters[i];
+                                       if(parameter == pesc)
+                                               fprintf(fout, "\t\tparameter[%u]=ESCAPE, raw_bits=%u\n", i, subframe->data.fixed.entropy_coding_method.data.partitioned_rice.contents->raw_bits[i]);
+                                       else
+                                               fprintf(fout, "\t\tparameter[%u]=%u\n", i, parameter);
+                               }
                                if(aopts.do_residual_text) {
-                                       const unsigned partitions = (1u << subframe->data.fixed.entropy_coding_method.data.partitioned_rice.order);
-                                       for(i = 0; i < partitions; i++) {
-                                               unsigned parameter = subframe->data.fixed.entropy_coding_method.data.partitioned_rice.contents->parameters[i];
-                                               if(parameter == FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER)
-                                                       fprintf(fout, "\t\tparameter[%u]=ESCAPE, raw_bits=%u\n", i, subframe->data.fixed.entropy_coding_method.data.partitioned_rice.contents->raw_bits[i]);
-                                               else
-                                                       fprintf(fout, "\t\tparameter[%u]=%u\n", i, parameter);
-                                       }
                                        for(i = 0; i < frame->header.blocksize-subframe->data.fixed.order; i++)
                                                fprintf(fout, "\t\tresidual[%u]=%d\n", i, subframe->data.fixed.residual[i]);
                                }
                                break;
                        case FLAC__SUBFRAME_TYPE_LPC:
-                               FLAC__ASSERT(subframe->data.lpc.entropy_coding_method.type == FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE);
-                               fprintf(fout, "\torder=%u\tpartition_order=%u\tqlp_coeff_precision=%u\tquantization_level=%d\n", subframe->data.lpc.order, subframe->data.lpc.entropy_coding_method.data.partitioned_rice.order, subframe->data.lpc.qlp_coeff_precision, subframe->data.lpc.quantization_level);
+                               FLAC__ASSERT(subframe->data.lpc.entropy_coding_method.type <= FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2);
+                               fprintf(fout, "\torder=%u\tqlp_coeff_precision=%u\tquantization_level=%d\tresidual_type=%s\tpartition_order=%u\n", subframe->data.lpc.order, subframe->data.lpc.qlp_coeff_precision, subframe->data.lpc.quantization_level, is_rice2? "RICE2":"RICE", subframe->data.lpc.entropy_coding_method.data.partitioned_rice.order);
                                for(i = 0; i < subframe->data.lpc.order; i++)
                                        fprintf(fout, "\t\tqlp_coeff[%u]=%d\n", i, subframe->data.lpc.qlp_coeff[i]);
                                for(i = 0; i < subframe->data.lpc.order; i++)
                                        fprintf(fout, "\t\twarmup[%u]=%d\n", i, subframe->data.lpc.warmup[i]);
+                               partitions = (1u << subframe->data.lpc.entropy_coding_method.data.partitioned_rice.order);
+                               for(i = 0; i < partitions; i++) {
+                                       unsigned parameter = subframe->data.lpc.entropy_coding_method.data.partitioned_rice.contents->parameters[i];
+                                       if(parameter == pesc)
+                                               fprintf(fout, "\t\tparameter[%u]=ESCAPE, raw_bits=%u\n", i, subframe->data.lpc.entropy_coding_method.data.partitioned_rice.contents->raw_bits[i]);
+                                       else
+                                               fprintf(fout, "\t\tparameter[%u]=%u\n", i, parameter);
+                               }
                                if(aopts.do_residual_text) {
-                                       const unsigned partitions = (1u << subframe->data.lpc.entropy_coding_method.data.partitioned_rice.order);
-                                       for(i = 0; i < partitions; i++) {
-                                               unsigned parameter = subframe->data.lpc.entropy_coding_method.data.partitioned_rice.contents->parameters[i];
-                                               if(parameter == FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER)
-                                                       fprintf(fout, "\t\tparameter[%u]=ESCAPE, raw_bits=%u\n", i, subframe->data.lpc.entropy_coding_method.data.partitioned_rice.contents->raw_bits[i]);
-                                               else
-                                                       fprintf(fout, "\t\tparameter[%u]=%u\n", i, parameter);
-                                       }
                                        for(i = 0; i < frame->header.blocksize-subframe->data.lpc.order; i++)
                                                fprintf(fout, "\t\tresidual[%u]=%d\n", i, subframe->data.lpc.residual[i]);
                                }
index fdbc682..b58b6b8 100644 (file)
@@ -25,7 +25,7 @@ typedef struct {
 } analysis_options;
 
 void flac__analyze_init(analysis_options aopts);
-void flac__analyze_frame(const FLAC__Frame *frame, unsigned frame_number, unsigned frame_bytes, analysis_options aopts, FILE *fout);
+void flac__analyze_frame(const FLAC__Frame *frame, unsigned frame_number, FLAC__uint64 frame_offset, unsigned frame_bytes, analysis_options aopts, FILE *fout);
 void flac__analyze_finish(analysis_options aopts);
 
 #endif
index d0f4585..30a4b17 100644 (file)
@@ -880,7 +880,7 @@ FLAC__StreamDecoderWriteStatus write_callback(const FLAC__StreamDecoder *decoder
                        print_stats(decoder_session);
 
                if(decoder_session->analysis_mode) {
-                       flac__analyze_frame(frame, decoder_session->frame_counter-1, frame_bytes, decoder_session->aopts, fout);
+                       flac__analyze_frame(frame, decoder_session->frame_counter-1, decoder_session->decode_position-frame_bytes, frame_bytes, decoder_session->aopts, fout);
                }
                else if(!decoder_session->test_only) {
                        if(shift && !decoder_session->replaygain.apply) {