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/avutil.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 51static 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) = in[i][j] << shift; 60} 61 62static 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 int a = in[0][i]; 70 int b = in[1][i]; 71 S(samples, 0, i) = a << shift; 72 S(samples, 1, i) = (a - b) << shift; 73 } 74} 75 76static 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 int a = in[0][i]; 84 int b = in[1][i]; 85 S(samples, 0, i) = (a + b) << shift; 86 S(samples, 1, i) = b << shift; 87 } 88} 89 90static 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 int 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} 104