blob: 547806a95319b1055ce2ced3fb186aad2c915c02 [file] [log] [blame]
/* { 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;
}