diff options
author | Ben Avison <bavison@riscosopen.org> | 2014-03-20 18:59:17 +0000 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2014-03-26 20:56:38 +0100 |
commit | b01a2562ae3ff50198ba189c878023ee4ac34c72 (patch) | |
tree | 1fbe39bb00cc22fe1bda2bbb56a3524cb03b5ef4 /libavcodec/mlpdsp.c | |
parent | 44dc373d4a7ef484387fa3646b4e7513d5595bd5 (diff) | |
download | ffmpeg-b01a2562ae3ff50198ba189c878023ee4ac34c72.tar.gz |
truehd: break out part of output_data into platform-specific callback.
Verified with profiling that this doesn't have a measurable effect upon
overall performance.
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavcodec/mlpdsp.c')
-rw-r--r-- | libavcodec/mlpdsp.c | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/libavcodec/mlpdsp.c b/libavcodec/mlpdsp.c index 7a359b0201..3ae8c37708 100644 --- a/libavcodec/mlpdsp.c +++ b/libavcodec/mlpdsp.c @@ -89,10 +89,48 @@ void ff_mlp_rematrix_channel(int32_t *samples, } } +static int32_t (*mlp_select_pack_output(uint8_t *ch_assign, + int8_t *output_shift, + uint8_t max_matrix_channel, + int is32))(int32_t, uint16_t, int32_t (*)[], void *, uint8_t*, int8_t *, uint8_t, int) +{ + return ff_mlp_pack_output; +} + +int32_t ff_mlp_pack_output(int32_t lossless_check_data, + uint16_t blockpos, + int32_t (*sample_buffer)[MAX_CHANNELS], + void *data, + uint8_t *ch_assign, + int8_t *output_shift, + uint8_t max_matrix_channel, + int is32) +{ + unsigned int i, out_ch = 0; + int32_t *data_32 = data; + int16_t *data_16 = data; + + for (i = 0; i < blockpos; i++) { + for (out_ch = 0; out_ch <= max_matrix_channel; out_ch++) { + int mat_ch = ch_assign[out_ch]; + int32_t sample = sample_buffer[i][mat_ch] + << output_shift[mat_ch]; + lossless_check_data ^= (sample & 0xffffff) << mat_ch; + if (is32) + *data_32++ = sample << 8; + else + *data_16++ = sample >> 8; + } + } + return lossless_check_data; +} + av_cold void ff_mlpdsp_init(MLPDSPContext *c) { c->mlp_filter_channel = mlp_filter_channel; c->mlp_rematrix_channel = ff_mlp_rematrix_channel; + c->mlp_select_pack_output = mlp_select_pack_output; + c->mlp_pack_output = ff_mlp_pack_output; if (ARCH_ARM) ff_mlpdsp_init_arm(c); if (ARCH_X86) |