FFmpeg
wmv2dsp.c
Go to the documentation of this file.
1 /*
2  * This file is part of FFmpeg.
3  *
4  * FFmpeg is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * FFmpeg is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with FFmpeg; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17  */
18 
19 #include "config.h"
20 #include "libavutil/attributes.h"
21 #include "libavutil/common.h"
22 #include "idctdsp.h"
23 #include "mathops.h"
24 #include "wmv2dsp.h"
25 
26 #define W0 2048
27 #define W1 2841 /* 2048*sqrt (2)*cos (1*pi/16) */
28 #define W2 2676 /* 2048*sqrt (2)*cos (2*pi/16) */
29 #define W3 2408 /* 2048*sqrt (2)*cos (3*pi/16) */
30 #define W4 2048 /* 2048*sqrt (2)*cos (4*pi/16) */
31 #define W5 1609 /* 2048*sqrt (2)*cos (5*pi/16) */
32 #define W6 1108 /* 2048*sqrt (2)*cos (6*pi/16) */
33 #define W7 565 /* 2048*sqrt (2)*cos (7*pi/16) */
34 
35 static void wmv2_idct_row(short * b)
36 {
37  int s1, s2;
38  int a0, a1, a2, a3, a4, a5, a6, a7;
39 
40  /* step 1 */
41  a1 = W1 * b[1] + W7 * b[7];
42  a7 = W7 * b[1] - W1 * b[7];
43  a5 = W5 * b[5] + W3 * b[3];
44  a3 = W3 * b[5] - W5 * b[3];
45  a2 = W2 * b[2] + W6 * b[6];
46  a6 = W6 * b[2] - W2 * b[6];
47  a0 = W0 * b[0] + W0 * b[4];
48  a4 = W0 * b[0] - W0 * b[4];
49 
50  /* step 2 */
51  s1 = (int)(181U * (a1 - a5 + a7 - a3) + 128) >> 8; // 1, 3, 5, 7
52  s2 = (int)(181U * (a1 - a5 - a7 + a3) + 128) >> 8;
53 
54  /* step 3 */
55  b[0] = (a0 + a2 + a1 + a5 + (1 << 7)) >> 8;
56  b[1] = (a4 + a6 + s1 + (1 << 7)) >> 8;
57  b[2] = (a4 - a6 + s2 + (1 << 7)) >> 8;
58  b[3] = (a0 - a2 + a7 + a3 + (1 << 7)) >> 8;
59  b[4] = (a0 - a2 - a7 - a3 + (1 << 7)) >> 8;
60  b[5] = (a4 - a6 - s2 + (1 << 7)) >> 8;
61  b[6] = (a4 + a6 - s1 + (1 << 7)) >> 8;
62  b[7] = (a0 + a2 - a1 - a5 + (1 << 7)) >> 8;
63 }
64 
65 static void wmv2_idct_col(short * b)
66 {
67  int s1, s2;
68  int a0, a1, a2, a3, a4, a5, a6, a7;
69 
70  /* step 1, with extended precision */
71  a1 = (W1 * b[8 * 1] + W7 * b[8 * 7] + 4) >> 3;
72  a7 = (W7 * b[8 * 1] - W1 * b[8 * 7] + 4) >> 3;
73  a5 = (W5 * b[8 * 5] + W3 * b[8 * 3] + 4) >> 3;
74  a3 = (W3 * b[8 * 5] - W5 * b[8 * 3] + 4) >> 3;
75  a2 = (W2 * b[8 * 2] + W6 * b[8 * 6] + 4) >> 3;
76  a6 = (W6 * b[8 * 2] - W2 * b[8 * 6] + 4) >> 3;
77  a0 = (W0 * b[8 * 0] + W0 * b[8 * 4] ) >> 3;
78  a4 = (W0 * b[8 * 0] - W0 * b[8 * 4] ) >> 3;
79 
80  /* step 2 */
81  s1 = (int)(181U * (a1 - a5 + a7 - a3) + 128) >> 8;
82  s2 = (int)(181U * (a1 - a5 - a7 + a3) + 128) >> 8;
83 
84  /* step 3 */
85  b[8 * 0] = (a0 + a2 + a1 + a5 + (1 << 13)) >> 14;
86  b[8 * 1] = (a4 + a6 + s1 + (1 << 13)) >> 14;
87  b[8 * 2] = (a4 - a6 + s2 + (1 << 13)) >> 14;
88  b[8 * 3] = (a0 - a2 + a7 + a3 + (1 << 13)) >> 14;
89 
90  b[8 * 4] = (a0 - a2 - a7 - a3 + (1 << 13)) >> 14;
91  b[8 * 5] = (a4 - a6 - s2 + (1 << 13)) >> 14;
92  b[8 * 6] = (a4 + a6 - s1 + (1 << 13)) >> 14;
93  b[8 * 7] = (a0 + a2 - a1 - a5 + (1 << 13)) >> 14;
94 }
95 
96 static void wmv2_idct_add_c(uint8_t *dest, ptrdiff_t line_size, int16_t *block)
97 {
98  int i;
99 
100  for (i = 0; i < 64; i += 8)
101  wmv2_idct_row(block + i);
102  for (i = 0; i < 8; i++)
103  wmv2_idct_col(block + i);
104 
105  for (i = 0; i < 8; i++) {
106  dest[0] = av_clip_uint8(dest[0] + block[0]);
107  dest[1] = av_clip_uint8(dest[1] + block[1]);
108  dest[2] = av_clip_uint8(dest[2] + block[2]);
109  dest[3] = av_clip_uint8(dest[3] + block[3]);
110  dest[4] = av_clip_uint8(dest[4] + block[4]);
111  dest[5] = av_clip_uint8(dest[5] + block[5]);
112  dest[6] = av_clip_uint8(dest[6] + block[6]);
113  dest[7] = av_clip_uint8(dest[7] + block[7]);
114  dest += line_size;
115  block += 8;
116  }
117 }
118 
119 static void wmv2_idct_put_c(uint8_t *dest, ptrdiff_t line_size, int16_t *block)
120 {
121  int i;
122 
123  for (i = 0; i < 64; i += 8)
124  wmv2_idct_row(block + i);
125  for (i = 0; i < 8; i++)
126  wmv2_idct_col(block + i);
127 
128  for (i = 0; i < 8; i++) {
129  dest[0] = av_clip_uint8(block[0]);
130  dest[1] = av_clip_uint8(block[1]);
131  dest[2] = av_clip_uint8(block[2]);
132  dest[3] = av_clip_uint8(block[3]);
133  dest[4] = av_clip_uint8(block[4]);
134  dest[5] = av_clip_uint8(block[5]);
135  dest[6] = av_clip_uint8(block[6]);
136  dest[7] = av_clip_uint8(block[7]);
137  dest += line_size;
138  block += 8;
139  }
140 }
141 
143 {
144  c->idct_add = wmv2_idct_add_c;
145  c->idct_put = wmv2_idct_put_c;
146  c->idct = NULL;
147  c->perm_type = FF_IDCT_PERM_NONE;
148 
149 #if ARCH_MIPS
151 #endif
152  ff_init_scantable_permutation(c->idct_permutation,
153  c->perm_type);
154 }
wmv2_idct_col
static void wmv2_idct_col(short *b)
Definition: wmv2dsp.c:65
wmv2_idct_add_c
static void wmv2_idct_add_c(uint8_t *dest, ptrdiff_t line_size, int16_t *block)
Definition: wmv2dsp.c:96
b
#define b
Definition: input.c:42
W6
#define W6
Definition: wmv2dsp.c:32
a2
static double a2(void *priv, double x, double y)
Definition: vf_xfade.c:2030
W0
#define W0
Definition: wmv2dsp.c:26
av_cold
#define av_cold
Definition: attributes.h:106
wmv2_idct_put_c
static void wmv2_idct_put_c(uint8_t *dest, ptrdiff_t line_size, int16_t *block)
Definition: wmv2dsp.c:119
W5
#define W5
Definition: wmv2dsp.c:31
wmv2dsp.h
NULL
#define NULL
Definition: coverity.c:32
ff_wmv2dsp_init_mips
av_cold void ff_wmv2dsp_init_mips(IDCTDSPContext *c)
Definition: wmv2dsp_init_mips.c:28
a3
static double a3(void *priv, double x, double y)
Definition: vf_xfade.c:2031
mathops.h
c
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
Definition: undefined.txt:32
ff_wmv2dsp_init
av_cold void ff_wmv2dsp_init(IDCTDSPContext *c)
Definition: wmv2dsp.c:142
FF_IDCT_PERM_NONE
@ FF_IDCT_PERM_NONE
Definition: idctdsp.h:28
W1
#define W1
Definition: wmv2dsp.c:27
W7
#define W7
Definition: wmv2dsp.c:33
a0
static double a0(void *priv, double x, double y)
Definition: vf_xfade.c:2028
attributes.h
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:256
common.h
idctdsp.h
wmv2_idct_row
static void wmv2_idct_row(short *b)
Definition: wmv2dsp.c:35
IDCTDSPContext
Definition: idctdsp.h:43
U
#define U(x)
Definition: vpx_arith.h:37
W3
#define W3
Definition: wmv2dsp.c:29
av_clip_uint8
#define av_clip_uint8
Definition: common.h:106
ff_init_scantable_permutation
av_cold void ff_init_scantable_permutation(uint8_t *idct_permutation, enum idct_permutation_type perm_type)
Definition: idctdsp.c:39
block
The exact code depends on how similar the blocks are and how related they are to the block
Definition: filter_design.txt:207
W2
#define W2
Definition: wmv2dsp.c:28
a1
static double a1(void *priv, double x, double y)
Definition: vf_xfade.c:2029