| /* { dg-do compile } */ |
| /* { dg-options "-ftree-vrp" } */ |
| |
| typedef int FLAC__int32; |
| typedef int FLAC__bool; |
| typedef struct { } FLAC__Subframe; |
| typedef enum { FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT = 0, FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE = 1, FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE = 2, FLAC__CHANNEL_ASSIGNMENT_MID_SIDE = 3 } FLAC__ChannelAssignment; |
| typedef struct { |
| struct FLAC__StreamEncoderProtected *protected_; |
| struct FLAC__StreamEncoderPrivate *private_; |
| } FLAC__StreamEncoder; |
| typedef struct FLAC__StreamEncoderProtected { |
| FLAC__bool loose_mid_side_stereo; |
| unsigned channels; |
| unsigned blocksize; |
| } FLAC__StreamEncoderProtected; |
| typedef struct FLAC__StreamEncoderPrivate { |
| FLAC__int32 *integer_signal[(8u)]; |
| FLAC__Subframe subframe_workspace_mid_side[2][2]; |
| unsigned best_subframe_mid_side[2]; |
| unsigned loose_mid_side_stereo_frame_count; |
| } FLAC__StreamEncoderPrivate; |
| static void get_wasted_bits_(FLAC__int32 signal[], unsigned samples) |
| { |
| unsigned i; |
| FLAC__int32 x = 0; |
| for(i = 0; i < samples && !(x&1); i++) |
| x |= signal[i]; |
| } |
| FLAC__Subframe * process_subframes_(FLAC__StreamEncoder *encoder, unsigned *bits) |
| { |
| unsigned channel; |
| FLAC__Subframe *left_subframe = 0; |
| FLAC__ChannelAssignment channel_assignment; |
| for(channel = 0; channel < encoder->protected_->channels; channel++) |
| get_wasted_bits_(encoder->private_->integer_signal[channel], encoder->protected_->blocksize); |
| if(encoder->protected_->loose_mid_side_stereo && encoder->private_->loose_mid_side_stereo_frame_count > 0) |
| channel_assignment = FLAC__CHANNEL_ASSIGNMENT_MID_SIDE; |
| else { |
| FLAC__ChannelAssignment ca = (FLAC__ChannelAssignment)1; |
| unsigned min_bits = bits[0]; |
| for(channel_assignment = (FLAC__ChannelAssignment)0; (int)ca <= 3; ca = (FLAC__ChannelAssignment)((int)ca + 1)) |
| if(bits[ca] < min_bits) |
| channel_assignment = ca; |
| } |
| switch(channel_assignment) { |
| case FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT: |
| case FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE: |
| case FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE: |
| case FLAC__CHANNEL_ASSIGNMENT_MID_SIDE: |
| left_subframe = &encoder->private_->subframe_workspace_mid_side[0][encoder->private_->best_subframe_mid_side[0]]; |
| } |
| return left_subframe; |
| } |