FFmpeg
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
rematrix_template.c
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2011-2012 Michael Niedermayer (michaelni@gmx.at)
3  *
4  * This file is part of libswresample
5  *
6  * libswresample 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  * libswresample 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 libswresample; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19  */
20 
21 #if defined(TEMPLATE_REMATRIX_FLT)
22 # define R(x) x
23 # define SAMPLE float
24 # define COEFF float
25 # define INTER float
26 # define RENAME(x) x ## _float
27 #elif defined(TEMPLATE_REMATRIX_DBL)
28 # define R(x) x
29 # define SAMPLE double
30 # define COEFF double
31 # define INTER double
32 # define RENAME(x) x ## _double
33 #elif defined(TEMPLATE_REMATRIX_S16)
34 # define SAMPLE int16_t
35 # define COEFF int
36 # define INTER int
37 # ifdef TEMPLATE_CLIP
38 # define R(x) av_clip_int16(((x) + 16384)>>15)
39 # define RENAME(x) x ## _clip_s16
40 # else
41 # define R(x) (((x) + 16384)>>15)
42 # define RENAME(x) x ## _s16
43 # endif
44 #elif defined(TEMPLATE_REMATRIX_S32)
45 # define R(x) (((x) + 16384)>>15)
46 # define SAMPLE int32_t
47 # define COEFF int
48 # define INTER int64_t
49 # define RENAME(x) x ## _s32
50 #endif
51 
52 static void RENAME(sum2)(void *out_, const void *in1_, const void *in2_,
53  const void *coeffp_, integer index1, integer index2, integer len)
54 {
55  const SAMPLE *in1 = in1_, *in2 = in2_;
56  const COEFF *coeffp = coeffp_;
57  SAMPLE *out = out_;
58  int i;
59  INTER coeff1 = coeffp[index1];
60  INTER coeff2 = coeffp[index2];
61 
62  for(i=0; i<len; i++)
63  out[i] = R(coeff1*in1[i] + coeff2*in2[i]);
64 }
65 
66 static void RENAME(copy)(void *out_, const void *in_, const void *coeffp_,
68 {
69  const COEFF *coeffp = coeffp_;
70  const SAMPLE *in = in_;
71  SAMPLE *out = out_;
72  int i;
73  INTER coeff = coeffp[index];
74  for(i=0; i<len; i++)
75  out[i] = R(coeff*in[i]);
76 }
77 
78 static void RENAME(mix6to2)(uint8_t *const *out_, const uint8_t *const *in_,
79  const void *coeffp_, integer len)
80 {
81  const SAMPLE *const *const in = (const SAMPLE *const *)in_;
82  SAMPLE *const *const out = (SAMPLE *const*)out_;
83  const COEFF *coeffp = coeffp_;
84  int i;
85 
86  for(i=0; i<len; i++) {
87  INTER t = in[2][i]*(INTER)coeffp[0*6+2] + in[3][i]*(INTER)coeffp[0*6+3];
88  out[0][i] = R(t + in[0][i]*(INTER)coeffp[0*6+0] + in[4][i]*(INTER)coeffp[0*6+4]);
89  out[1][i] = R(t + in[1][i]*(INTER)coeffp[1*6+1] + in[5][i]*(INTER)coeffp[1*6+5]);
90  }
91 }
92 
93 static void RENAME(mix8to2)(uint8_t *const *out_, const uint8_t *const *in_,
94  const void *coeffp_, integer len)
95 {
96  const SAMPLE *const *const in = (const SAMPLE *const *)in_;
97  SAMPLE *const *const out = (SAMPLE *const*)out_;
98  const COEFF *coeffp = coeffp_;
99  int i;
100 
101  for(i=0; i<len; i++) {
102  INTER t = in[2][i]*(INTER)coeffp[0*8+2] + in[3][i]*(INTER)coeffp[0*8+3];
103  out[0][i] = R(t + in[0][i]*(INTER)coeffp[0*8+0] + in[4][i]*(INTER)coeffp[0*8+4] + in[6][i]*(INTER)coeffp[0*8+6]);
104  out[1][i] = R(t + in[1][i]*(INTER)coeffp[1*8+1] + in[5][i]*(INTER)coeffp[1*8+5] + in[7][i]*(INTER)coeffp[1*8+7]);
105  }
106 }
107 
108 static mix_any_func_type *RENAME(get_mix_any_func)(SwrContext *s)
109 {
113  && s->matrix[0][2] == s->matrix[1][2] && s->matrix[0][3] == s->matrix[1][3]
114  && !s->matrix[0][1] && !s->matrix[0][5] && !s->matrix[1][0] && !s->matrix[1][4]
115  )
116  return RENAME(mix6to2);
117 
120  && s->matrix[0][2] == s->matrix[1][2] && s->matrix[0][3] == s->matrix[1][3]
121  && !s->matrix[0][1] && !s->matrix[0][5] && !s->matrix[1][0] && !s->matrix[1][4]
122  && !s->matrix[0][7] && !s->matrix[1][6]
123  )
124  return RENAME(mix8to2);
125 
126  return NULL;
127 }
128 
129 #undef R
130 #undef SAMPLE
131 #undef COEFF
132 #undef INTER
133 #undef RENAME
out
FILE * out
Definition: movenc.c:55
AV_CHANNEL_LAYOUT_STEREO
#define AV_CHANNEL_LAYOUT_STEREO
Definition: channel_layout.h:395
R
#define R
Definition: huffyuv.h:44
integer
int integer
Definition: swresample_internal.h:37
mix_any_func_type
void() mix_any_func_type(uint8_t *const *out, const uint8_t *const *in1, const void *coeffp, integer len)
Definition: swresample_internal.h:43
AV_CHANNEL_LAYOUT_7POINT1
#define AV_CHANNEL_LAYOUT_7POINT1
Definition: channel_layout.h:417
s
#define s(width, name)
Definition: cbs_vp9.c:198
SwrContext
The libswresample context.
Definition: swresample_internal.h:95
NULL
#define NULL
Definition: coverity.c:32
index
int index
Definition: gxfenc.c:90
copy
static void copy(const float *p1, float *p2, const int length)
Definition: vf_vaguedenoiser.c:186
AVChannelLayout
An AVChannelLayout holds information about the channel layout of audio data.
Definition: channel_layout.h:319
av_channel_layout_compare
int av_channel_layout_compare(const AVChannelLayout *chl, const AVChannelLayout *chl1)
Check whether two channel layouts are semantically the same, i.e.
Definition: channel_layout.c:809
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:256
len
int len
Definition: vorbis_enc_data.h:426
SAMPLE
#define SAMPLE(tab, x, y)
Value of the luma sample at position (x, y) in the 2D array tab.
Definition: hevcdec.h:73
RENAME
#define RENAME(element)
Definition: ac3enc_template.c:44
AV_CHANNEL_LAYOUT_5POINT1_BACK
#define AV_CHANNEL_LAYOUT_5POINT1_BACK
Definition: channel_layout.h:407
coeff
static const double coeff[2][5]
Definition: vf_owdenoise.c:80
AV_CHANNEL_LAYOUT_5POINT1
#define AV_CHANNEL_LAYOUT_5POINT1
Definition: channel_layout.h:405