Verified with profiling that this doesn't have a measurable effect upon overall performance. Signed-off-by: Martin Storsjö <martin@martin.st>tags/n2.3
| @@ -978,7 +978,7 @@ static void fill_noise_buffer(MLPDecodeContext *m, unsigned int substr) | |||||
| static void rematrix_channels(MLPDecodeContext *m, unsigned int substr) | static void rematrix_channels(MLPDecodeContext *m, unsigned int substr) | ||||
| { | { | ||||
| SubStream *s = &m->substream[substr]; | SubStream *s = &m->substream[substr]; | ||||
| unsigned int mat, src_ch, i; | |||||
| unsigned int mat; | |||||
| unsigned int maxchan; | unsigned int maxchan; | ||||
| maxchan = s->max_matrix_channel; | maxchan = s->max_matrix_channel; | ||||
| @@ -990,31 +990,18 @@ static void rematrix_channels(MLPDecodeContext *m, unsigned int substr) | |||||
| } | } | ||||
| for (mat = 0; mat < s->num_primitive_matrices; mat++) { | for (mat = 0; mat < s->num_primitive_matrices; mat++) { | ||||
| int matrix_noise_shift = s->matrix_noise_shift[mat]; | |||||
| unsigned int dest_ch = s->matrix_out_ch[mat]; | unsigned int dest_ch = s->matrix_out_ch[mat]; | ||||
| int32_t mask = MSB_MASK(s->quant_step_size[dest_ch]); | |||||
| int32_t *coeffs = s->matrix_coeff[mat]; | |||||
| int index = s->num_primitive_matrices - mat; | |||||
| int index2 = 2 * index + 1; | |||||
| /* TODO: DSPContext? */ | |||||
| for (i = 0; i < s->blockpos; i++) { | |||||
| int32_t bypassed_lsb = m->bypassed_lsbs[i][mat]; | |||||
| int32_t *samples = m->sample_buffer[i]; | |||||
| int64_t accum = 0; | |||||
| for (src_ch = 0; src_ch <= maxchan; src_ch++) | |||||
| accum += (int64_t) samples[src_ch] * coeffs[src_ch]; | |||||
| if (matrix_noise_shift) { | |||||
| index &= m->access_unit_size_pow2 - 1; | |||||
| accum += m->noise_buffer[index] << (matrix_noise_shift + 7); | |||||
| index += index2; | |||||
| } | |||||
| samples[dest_ch] = ((accum >> 14) & mask) + bypassed_lsb; | |||||
| } | |||||
| m->dsp.mlp_rematrix_channel(&m->sample_buffer[0][0], | |||||
| s->matrix_coeff[mat], | |||||
| &m->bypassed_lsbs[0][mat], | |||||
| m->noise_buffer, | |||||
| s->num_primitive_matrices - mat, | |||||
| dest_ch, | |||||
| s->blockpos, | |||||
| maxchan, | |||||
| s->matrix_noise_shift[mat], | |||||
| m->access_unit_size_pow2, | |||||
| MSB_MASK(s->quant_step_size[dest_ch])); | |||||
| } | } | ||||
| } | } | ||||
| @@ -57,9 +57,42 @@ static void mlp_filter_channel(int32_t *state, const int32_t *coeff, | |||||
| } | } | ||||
| } | } | ||||
| void ff_mlp_rematrix_channel(int32_t *samples, | |||||
| const int32_t *coeffs, | |||||
| const uint8_t *bypassed_lsbs, | |||||
| const int8_t *noise_buffer, | |||||
| int index, | |||||
| unsigned int dest_ch, | |||||
| uint16_t blockpos, | |||||
| unsigned int maxchan, | |||||
| int matrix_noise_shift, | |||||
| int access_unit_size_pow2, | |||||
| int32_t mask) | |||||
| { | |||||
| unsigned int src_ch, i; | |||||
| int index2 = 2 * index + 1; | |||||
| for (i = 0; i < blockpos; i++) { | |||||
| int64_t accum = 0; | |||||
| for (src_ch = 0; src_ch <= maxchan; src_ch++) | |||||
| accum += (int64_t) samples[src_ch] * coeffs[src_ch]; | |||||
| if (matrix_noise_shift) { | |||||
| index &= access_unit_size_pow2 - 1; | |||||
| accum += noise_buffer[index] << (matrix_noise_shift + 7); | |||||
| index += index2; | |||||
| } | |||||
| samples[dest_ch] = ((accum >> 14) & mask) + *bypassed_lsbs; | |||||
| bypassed_lsbs += MAX_CHANNELS; | |||||
| samples += MAX_CHANNELS; | |||||
| } | |||||
| } | |||||
| av_cold void ff_mlpdsp_init(MLPDSPContext *c) | av_cold void ff_mlpdsp_init(MLPDSPContext *c) | ||||
| { | { | ||||
| c->mlp_filter_channel = mlp_filter_channel; | c->mlp_filter_channel = mlp_filter_channel; | ||||
| c->mlp_rematrix_channel = ff_mlp_rematrix_channel; | |||||
| if (ARCH_ARM) | if (ARCH_ARM) | ||||
| ff_mlpdsp_init_arm(c); | ff_mlpdsp_init_arm(c); | ||||
| if (ARCH_X86) | if (ARCH_X86) | ||||
| @@ -24,11 +24,34 @@ | |||||
| #include <stdint.h> | #include <stdint.h> | ||||
| void ff_mlp_rematrix_channel(int32_t *samples, | |||||
| const int32_t *coeffs, | |||||
| const uint8_t *bypassed_lsbs, | |||||
| const int8_t *noise_buffer, | |||||
| int index, | |||||
| unsigned int dest_ch, | |||||
| uint16_t blockpos, | |||||
| unsigned int maxchan, | |||||
| int matrix_noise_shift, | |||||
| int access_unit_size_pow2, | |||||
| int32_t mask); | |||||
| typedef struct MLPDSPContext { | typedef struct MLPDSPContext { | ||||
| void (*mlp_filter_channel)(int32_t *state, const int32_t *coeff, | void (*mlp_filter_channel)(int32_t *state, const int32_t *coeff, | ||||
| int firorder, int iirorder, | int firorder, int iirorder, | ||||
| unsigned int filter_shift, int32_t mask, | unsigned int filter_shift, int32_t mask, | ||||
| int blocksize, int32_t *sample_buffer); | int blocksize, int32_t *sample_buffer); | ||||
| void (*mlp_rematrix_channel)(int32_t *samples, | |||||
| const int32_t *coeffs, | |||||
| const uint8_t *bypassed_lsbs, | |||||
| const int8_t *noise_buffer, | |||||
| int index, | |||||
| unsigned int dest_ch, | |||||
| uint16_t blockpos, | |||||
| unsigned int maxchan, | |||||
| int matrix_noise_shift, | |||||
| int access_unit_size_pow2, | |||||
| int32_t mask); | |||||
| } MLPDSPContext; | } MLPDSPContext; | ||||
| void ff_mlpdsp_init(MLPDSPContext *c); | void ff_mlpdsp_init(MLPDSPContext *c); | ||||