flacdsp_template.c (2893B)
1 /* 2 * Copyright (c) 2012 Mans Rullgard <mans@mansr.com> 3 * 4 * This file is part of FFmpeg. 5 * 6 * FFmpeg is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU Lesser General Public 8 * License as published by the Free Software Foundation; either 9 * version 2.1 of the License, or (at your option) any later version. 10 * 11 * FFmpeg is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 * Lesser General Public License for more details. 15 * 16 * You should have received a copy of the GNU Lesser General Public 17 * License along with FFmpeg; if not, write to the Free Software 18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 19 */ 20 21 #include <stdint.h> 22 #include "libavutil/macros.h" 23 24 #undef FUNC 25 #undef FSUF 26 #undef sample 27 #undef sample_type 28 #undef OUT 29 #undef S 30 31 #if SAMPLE_SIZE == 32 32 # define sample_type int32_t 33 #else 34 # define sample_type int16_t 35 #endif 36 37 #if PLANAR 38 # define FSUF AV_JOIN(SAMPLE_SIZE, p) 39 # define sample sample_type * 40 # define OUT(n) n 41 # define S(s, c, i) (s[c][i]) 42 #else 43 # define FSUF SAMPLE_SIZE 44 # define sample sample_type 45 # define OUT(n) n[0] 46 # define S(s, c, i) (*s++) 47 #endif 48 49 #define FUNC(n) AV_JOIN(n ## _, FSUF) 50 51 static void FUNC(flac_decorrelate_indep_c)(uint8_t **out, int32_t **in, 52 int channels, int len, int shift) 53 { 54 sample *samples = (sample *) OUT(out); 55 int i, j; 56 57 for (j = 0; j < len; j++) 58 for (i = 0; i < channels; i++) 59 S(samples, i, j) = (int)((unsigned)in[i][j] << shift); 60 } 61 62 static void FUNC(flac_decorrelate_ls_c)(uint8_t **out, int32_t **in, 63 int channels, int len, int shift) 64 { 65 sample *samples = (sample *) OUT(out); 66 int i; 67 68 for (i = 0; i < len; i++) { 69 unsigned a = in[0][i]; 70 unsigned b = in[1][i]; 71 S(samples, 0, i) = a << shift; 72 S(samples, 1, i) = (a - b) << shift; 73 } 74 } 75 76 static void FUNC(flac_decorrelate_rs_c)(uint8_t **out, int32_t **in, 77 int channels, int len, int shift) 78 { 79 sample *samples = (sample *) OUT(out); 80 int i; 81 82 for (i = 0; i < len; i++) { 83 unsigned a = in[0][i]; 84 unsigned b = in[1][i]; 85 S(samples, 0, i) = (a + b) << shift; 86 S(samples, 1, i) = b << shift; 87 } 88 } 89 90 static void FUNC(flac_decorrelate_ms_c)(uint8_t **out, int32_t **in, 91 int channels, int len, int shift) 92 { 93 sample *samples = (sample *) OUT(out); 94 int i; 95 96 for (i = 0; i < len; i++) { 97 unsigned a = in[0][i]; 98 int b = in[1][i]; 99 a -= b >> 1; 100 S(samples, 0, i) = (a + b) << shift; 101 S(samples, 1, i) = a << shift; 102 } 103 }