static double measure_error_subband (SchroEncoderFrame *frame, int component, int index, int quant_index) { int i; int j; int16_t *data; int16_t *line; int stride; int width; int height; int skip = 1; double error = 0; int q; int quant_factor; int quant_offset; int value; int position; position = schro_subband_get_position (index); schro_subband_get (frame->iwt_frame, component, position, &frame->params, &data, &stride, &width, &height); quant_factor = schro_table_quant[quant_index]; if (frame->params.num_refs > 0) { quant_offset = schro_table_offset_3_8[quant_index]; } else { quant_offset = schro_table_offset_1_2[quant_index]; } error = 0; if (index == 0) { for(j=0;j<height;j+=skip){ line = OFFSET(data, j*stride); for(i=1;i<width;i+=skip){ q = schro_quantise(abs(line[i] - line[i-1]), quant_factor, quant_offset); value = schro_dequantise(q, quant_factor, quant_offset); error += pow2(value - abs(line[i] - line[i-1])); } } } else { for(j=0;j<height;j+=skip){ line = OFFSET(data, j*stride); for(i=0;i<width;i+=skip){ q = schro_quantise(line[i], quant_factor, quant_offset); value = schro_dequantise(q, quant_factor, quant_offset); error += pow2(value - line[i]); } } } error *= skip*skip; return error; }
static void quantise_dc_block (SchroFrameData *block, int16_t *quant_data, int quant_index, int slice_x, int slice_y) { int quant_factor; int quant_offset; int x,y; int n = 0; int pred_value; int16_t *line; quant_factor = schro_table_quant[quant_index]; quant_offset = schro_table_offset_1_2[quant_index]; for(y=0;y<block->height;y++){ line = OFFSET(block->data, block->stride * y); for (x=0; x<block->width; x++){ pred_value = schro_dc_predict (line + x, block->stride, slice_x + x, slice_y + y); quant_data[n] = schro_quantise (line[x] - pred_value, quant_factor, quant_offset); line[x] = pred_value + schro_dequantise (quant_data[n], quant_factor, quant_offset); n++; } } }
static double error_pow(int x, void *priv) { ErrorFuncInfo *efi = priv; int q; int value; int y; q = schro_quantise (x, efi->quant_factor, efi->quant_offset); value = schro_dequantise (q, efi->quant_factor, efi->quant_offset); y = abs (value - x); return pow (y, efi->power); }
static void dequantise_block (SchroFrameData *block, int16_t *quant_data, int quant_index) { int quant_factor; int quant_offset; int x,y; int n = 0; int16_t *line; quant_factor = schro_table_quant[quant_index]; quant_offset = schro_table_offset_1_2[quant_index]; for(y=0;y<block->height;y++){ line = OFFSET(block->data, block->stride * y); for (x=0; x<block->width; x++){ line[x] = schro_dequantise (quant_data[n], quant_factor, quant_offset); n++; } } }
static void schro_decoder_decode_slice (SchroPicture *picture, SchroLowDelay *lowdelay, int slice_x, int slice_y, int offset, int slice_bytes) { SchroParams *params = &picture->params; SchroUnpack y_unpack; SchroUnpack uv_unpack; int quant_index; int base_index; int length_bits; int slice_y_length; int i; int j; int x,y; int value; schro_unpack_init_with_data (&y_unpack, OFFSET(picture->lowdelay_buffer->data, offset), slice_bytes, 1); base_index = schro_unpack_decode_bits (&y_unpack, 7); length_bits = ilog2up(8*slice_bytes); slice_y_length = schro_unpack_decode_bits (&y_unpack, length_bits); schro_unpack_copy (&uv_unpack, &y_unpack); schro_unpack_limit_bits_remaining (&y_unpack, slice_y_length); schro_unpack_skip_bits (&uv_unpack, slice_y_length); j = 0; for(i=0;i<1+3*params->transform_depth;i++) { int quant_factor; int quant_offset; int16_t *line; SchroFrameData block; schro_frame_data_get_codeblock (&block, lowdelay->luma_subbands + i, slice_x, slice_y, lowdelay->n_horiz_slices, lowdelay->n_vert_slices); quant_index = CLAMP(base_index - params->quant_matrix[i], 0, 60); quant_factor = schro_table_quant[quant_index]; quant_offset = schro_table_offset_1_2[quant_index]; for(y=0;y<block.height;y++){ line = OFFSET(block.data, block.stride * y); for (x=0; x<block.width; x++){ value = schro_unpack_decode_sint (&y_unpack); line[x] = schro_dequantise (value, quant_factor, quant_offset); } } } j = 0; for(i=0;i<1+3*params->transform_depth;i++) { int quant_factor; int quant_offset; int16_t *line1; int16_t *line2; SchroFrameData block1; SchroFrameData block2; schro_frame_data_get_codeblock (&block1, lowdelay->chroma1_subbands + i, slice_x, slice_y, lowdelay->n_horiz_slices, lowdelay->n_vert_slices); schro_frame_data_get_codeblock (&block2, lowdelay->chroma2_subbands + i, slice_x, slice_y, lowdelay->n_horiz_slices, lowdelay->n_vert_slices); quant_index = CLAMP(base_index - params->quant_matrix[i], 0, 60); quant_factor = schro_table_quant[quant_index]; quant_offset = schro_table_offset_1_2[quant_index]; for(y=0;y<block1.height;y++){ line1 = OFFSET(block1.data, block1.stride * y); line2 = OFFSET(block2.data, block2.stride * y); for (x=0; x<block1.width; x++){ value = schro_unpack_decode_sint (&uv_unpack); line1[x] = schro_dequantise (value, quant_factor, quant_offset); value = schro_unpack_decode_sint (&uv_unpack); line2[x] = schro_dequantise (value, quant_factor, quant_offset); } } } }