truehd: break out part of rematrix_channels into platform-specific callback.
Verified with profiling that this doesn't have a measurable effect upon overall performance. Signed-off-by: Martin Storsjö <martin@martin.st>
This commit is contained in:
		
				
					committed by
					
						
						Martin Storsjö
					
				
			
			
				
	
			
			
			
						parent
						
							15a29c39d9
						
					
				
				
					commit
					4e5aa080bb
				
			@@ -978,7 +978,7 @@ static void fill_noise_buffer(MLPDecodeContext *m, unsigned int substr)
 | 
			
		||||
static void rematrix_channels(MLPDecodeContext *m, unsigned int substr)
 | 
			
		||||
{
 | 
			
		||||
    SubStream *s = &m->substream[substr];
 | 
			
		||||
    unsigned int mat, src_ch, i;
 | 
			
		||||
    unsigned int mat;
 | 
			
		||||
    unsigned int maxchan;
 | 
			
		||||
 | 
			
		||||
    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++) {
 | 
			
		||||
        int matrix_noise_shift = s->matrix_noise_shift[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)
 | 
			
		||||
{
 | 
			
		||||
    c->mlp_filter_channel = mlp_filter_channel;
 | 
			
		||||
    c->mlp_rematrix_channel = ff_mlp_rematrix_channel;
 | 
			
		||||
    if (ARCH_ARM)
 | 
			
		||||
        ff_mlpdsp_init_arm(c);
 | 
			
		||||
    if (ARCH_X86)
 | 
			
		||||
 
 | 
			
		||||
@@ -24,11 +24,34 @@
 | 
			
		||||
 | 
			
		||||
#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 {
 | 
			
		||||
    void (*mlp_filter_channel)(int32_t *state, const int32_t *coeff,
 | 
			
		||||
                               int firorder, int iirorder,
 | 
			
		||||
                               unsigned int filter_shift, int32_t mask,
 | 
			
		||||
                               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;
 | 
			
		||||
 | 
			
		||||
void ff_mlpdsp_init(MLPDSPContext *c);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user