annotate vc1dsp.c @ 7352:c2318e551ff5 libavcodec

When picking a "high utility centroid" do not pick one that has no corresponding points. Not only it is the worst possible pick, but also the code was written without this case in mind.
author vitor
date Wed, 23 Jul 2008 03:55:37 +0000
parents 2f43560f5dba
children 674acd1e7e18
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3526
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
1 /*
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
2 * VC-1 and WMV3 decoder - DSP functions
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
3 * Copyright (c) 2006 Konstantin Shishkov
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
4 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3665
diff changeset
5 * This file is part of FFmpeg.
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3665
diff changeset
6 *
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3665
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
3526
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
9 * License as published by the Free Software Foundation; either
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3665
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
3526
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
11 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3665
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
3526
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
15 * Lesser General Public License for more details.
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
16 *
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3665
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
3526
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
20 */
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
21
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
22 /**
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
23 * @file vc1dsp.c
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
24 * VC-1 and WMV3 decoder
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
25 *
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
26 */
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
27
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
28 #include "dsputil.h"
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
29
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
30
4210
6f6fe05712e4 Fix comments
kostya
parents: 3947
diff changeset
31 /** Apply overlap transform to horizontal edge
3526
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
32 */
4239
30b14d0f2324 Correct rounding values in overlap filtering
kostya
parents: 4211
diff changeset
33 static void vc1_v_overlap_c(uint8_t* src, int stride)
3526
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
34 {
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
35 int i;
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
36 int a, b, c, d;
4211
ff9a94fce879 Optimize overlapping
kostya
parents: 4210
diff changeset
37 int d1, d2;
4239
30b14d0f2324 Correct rounding values in overlap filtering
kostya
parents: 4211
diff changeset
38 int rnd = 1;
3526
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
39 for(i = 0; i < 8; i++) {
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
40 a = src[-2*stride];
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
41 b = src[-stride];
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
42 c = src[0];
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
43 d = src[stride];
4211
ff9a94fce879 Optimize overlapping
kostya
parents: 4210
diff changeset
44 d1 = (a - d + 3 + rnd) >> 3;
ff9a94fce879 Optimize overlapping
kostya
parents: 4210
diff changeset
45 d2 = (a - d + b - c + 4 - rnd) >> 3;
3526
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
46
4211
ff9a94fce879 Optimize overlapping
kostya
parents: 4210
diff changeset
47 src[-2*stride] = a - d1;
ff9a94fce879 Optimize overlapping
kostya
parents: 4210
diff changeset
48 src[-stride] = b - d2;
ff9a94fce879 Optimize overlapping
kostya
parents: 4210
diff changeset
49 src[0] = c + d2;
ff9a94fce879 Optimize overlapping
kostya
parents: 4210
diff changeset
50 src[stride] = d + d1;
3526
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
51 src++;
4239
30b14d0f2324 Correct rounding values in overlap filtering
kostya
parents: 4211
diff changeset
52 rnd = !rnd;
3526
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
53 }
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
54 }
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
55
4210
6f6fe05712e4 Fix comments
kostya
parents: 3947
diff changeset
56 /** Apply overlap transform to vertical edge
3526
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
57 */
4239
30b14d0f2324 Correct rounding values in overlap filtering
kostya
parents: 4211
diff changeset
58 static void vc1_h_overlap_c(uint8_t* src, int stride)
3526
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
59 {
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
60 int i;
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
61 int a, b, c, d;
4211
ff9a94fce879 Optimize overlapping
kostya
parents: 4210
diff changeset
62 int d1, d2;
4239
30b14d0f2324 Correct rounding values in overlap filtering
kostya
parents: 4211
diff changeset
63 int rnd = 1;
3526
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
64 for(i = 0; i < 8; i++) {
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
65 a = src[-2];
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
66 b = src[-1];
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
67 c = src[0];
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
68 d = src[1];
4211
ff9a94fce879 Optimize overlapping
kostya
parents: 4210
diff changeset
69 d1 = (a - d + 3 + rnd) >> 3;
ff9a94fce879 Optimize overlapping
kostya
parents: 4210
diff changeset
70 d2 = (a - d + b - c + 4 - rnd) >> 3;
3526
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
71
4211
ff9a94fce879 Optimize overlapping
kostya
parents: 4210
diff changeset
72 src[-2] = a - d1;
ff9a94fce879 Optimize overlapping
kostya
parents: 4210
diff changeset
73 src[-1] = b - d2;
ff9a94fce879 Optimize overlapping
kostya
parents: 4210
diff changeset
74 src[0] = c + d2;
ff9a94fce879 Optimize overlapping
kostya
parents: 4210
diff changeset
75 src[1] = d + d1;
3526
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
76 src += stride;
4239
30b14d0f2324 Correct rounding values in overlap filtering
kostya
parents: 4211
diff changeset
77 rnd = !rnd;
3526
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
78 }
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
79 }
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
80
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
81
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
82 /** Do inverse transform on 8x8 block
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
83 */
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
84 static void vc1_inv_trans_8x8_c(DCTELEM block[64])
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
85 {
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
86 int i;
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
87 register int t1,t2,t3,t4,t5,t6,t7,t8;
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
88 DCTELEM *src, *dst;
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
89
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
90 src = block;
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
91 dst = block;
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
92 for(i = 0; i < 8; i++){
6157
953c8efd5298 Factor out constant addition
kostya
parents: 5997
diff changeset
93 t1 = 12 * (src[0] + src[4]) + 4;
953c8efd5298 Factor out constant addition
kostya
parents: 5997
diff changeset
94 t2 = 12 * (src[0] - src[4]) + 4;
3526
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
95 t3 = 16 * src[2] + 6 * src[6];
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
96 t4 = 6 * src[2] - 16 * src[6];
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
97
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
98 t5 = t1 + t3;
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
99 t6 = t2 + t4;
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
100 t7 = t2 - t4;
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
101 t8 = t1 - t3;
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
102
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
103 t1 = 16 * src[1] + 15 * src[3] + 9 * src[5] + 4 * src[7];
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
104 t2 = 15 * src[1] - 4 * src[3] - 16 * src[5] - 9 * src[7];
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
105 t3 = 9 * src[1] - 16 * src[3] + 4 * src[5] + 15 * src[7];
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
106 t4 = 4 * src[1] - 9 * src[3] + 15 * src[5] - 16 * src[7];
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
107
6157
953c8efd5298 Factor out constant addition
kostya
parents: 5997
diff changeset
108 dst[0] = (t5 + t1) >> 3;
953c8efd5298 Factor out constant addition
kostya
parents: 5997
diff changeset
109 dst[1] = (t6 + t2) >> 3;
953c8efd5298 Factor out constant addition
kostya
parents: 5997
diff changeset
110 dst[2] = (t7 + t3) >> 3;
953c8efd5298 Factor out constant addition
kostya
parents: 5997
diff changeset
111 dst[3] = (t8 + t4) >> 3;
953c8efd5298 Factor out constant addition
kostya
parents: 5997
diff changeset
112 dst[4] = (t8 - t4) >> 3;
953c8efd5298 Factor out constant addition
kostya
parents: 5997
diff changeset
113 dst[5] = (t7 - t3) >> 3;
953c8efd5298 Factor out constant addition
kostya
parents: 5997
diff changeset
114 dst[6] = (t6 - t2) >> 3;
953c8efd5298 Factor out constant addition
kostya
parents: 5997
diff changeset
115 dst[7] = (t5 - t1) >> 3;
3526
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
116
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
117 src += 8;
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
118 dst += 8;
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
119 }
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
120
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
121 src = block;
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
122 dst = block;
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
123 for(i = 0; i < 8; i++){
6157
953c8efd5298 Factor out constant addition
kostya
parents: 5997
diff changeset
124 t1 = 12 * (src[ 0] + src[32]) + 64;
953c8efd5298 Factor out constant addition
kostya
parents: 5997
diff changeset
125 t2 = 12 * (src[ 0] - src[32]) + 64;
3526
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
126 t3 = 16 * src[16] + 6 * src[48];
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
127 t4 = 6 * src[16] - 16 * src[48];
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
128
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
129 t5 = t1 + t3;
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
130 t6 = t2 + t4;
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
131 t7 = t2 - t4;
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
132 t8 = t1 - t3;
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
133
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
134 t1 = 16 * src[ 8] + 15 * src[24] + 9 * src[40] + 4 * src[56];
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
135 t2 = 15 * src[ 8] - 4 * src[24] - 16 * src[40] - 9 * src[56];
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
136 t3 = 9 * src[ 8] - 16 * src[24] + 4 * src[40] + 15 * src[56];
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
137 t4 = 4 * src[ 8] - 9 * src[24] + 15 * src[40] - 16 * src[56];
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
138
6157
953c8efd5298 Factor out constant addition
kostya
parents: 5997
diff changeset
139 dst[ 0] = (t5 + t1) >> 7;
953c8efd5298 Factor out constant addition
kostya
parents: 5997
diff changeset
140 dst[ 8] = (t6 + t2) >> 7;
953c8efd5298 Factor out constant addition
kostya
parents: 5997
diff changeset
141 dst[16] = (t7 + t3) >> 7;
953c8efd5298 Factor out constant addition
kostya
parents: 5997
diff changeset
142 dst[24] = (t8 + t4) >> 7;
953c8efd5298 Factor out constant addition
kostya
parents: 5997
diff changeset
143 dst[32] = (t8 - t4 + 1) >> 7;
953c8efd5298 Factor out constant addition
kostya
parents: 5997
diff changeset
144 dst[40] = (t7 - t3 + 1) >> 7;
953c8efd5298 Factor out constant addition
kostya
parents: 5997
diff changeset
145 dst[48] = (t6 - t2 + 1) >> 7;
953c8efd5298 Factor out constant addition
kostya
parents: 5997
diff changeset
146 dst[56] = (t5 - t1 + 1) >> 7;
3526
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
147
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
148 src++;
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
149 dst++;
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
150 }
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
151 }
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
152
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
153 /** Do inverse transform on 8x4 part of block
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
154 */
5997
90de28dfd8d6 Switch VC-1 decoder to output decoded residual immediately.
kostya
parents: 5416
diff changeset
155 static void vc1_inv_trans_8x4_c(uint8_t *dest, int linesize, DCTELEM *block)
3526
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
156 {
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
157 int i;
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
158 register int t1,t2,t3,t4,t5,t6,t7,t8;
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
159 DCTELEM *src, *dst;
5997
90de28dfd8d6 Switch VC-1 decoder to output decoded residual immediately.
kostya
parents: 5416
diff changeset
160 const uint8_t *cm = ff_cropTbl + MAX_NEG_CROP;
3526
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
161
5997
90de28dfd8d6 Switch VC-1 decoder to output decoded residual immediately.
kostya
parents: 5416
diff changeset
162 src = block;
90de28dfd8d6 Switch VC-1 decoder to output decoded residual immediately.
kostya
parents: 5416
diff changeset
163 dst = block;
3526
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
164 for(i = 0; i < 4; i++){
6157
953c8efd5298 Factor out constant addition
kostya
parents: 5997
diff changeset
165 t1 = 12 * (src[0] + src[4]) + 4;
953c8efd5298 Factor out constant addition
kostya
parents: 5997
diff changeset
166 t2 = 12 * (src[0] - src[4]) + 4;
3526
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
167 t3 = 16 * src[2] + 6 * src[6];
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
168 t4 = 6 * src[2] - 16 * src[6];
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
169
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
170 t5 = t1 + t3;
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
171 t6 = t2 + t4;
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
172 t7 = t2 - t4;
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
173 t8 = t1 - t3;
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
174
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
175 t1 = 16 * src[1] + 15 * src[3] + 9 * src[5] + 4 * src[7];
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
176 t2 = 15 * src[1] - 4 * src[3] - 16 * src[5] - 9 * src[7];
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
177 t3 = 9 * src[1] - 16 * src[3] + 4 * src[5] + 15 * src[7];
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
178 t4 = 4 * src[1] - 9 * src[3] + 15 * src[5] - 16 * src[7];
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
179
6157
953c8efd5298 Factor out constant addition
kostya
parents: 5997
diff changeset
180 dst[0] = (t5 + t1) >> 3;
953c8efd5298 Factor out constant addition
kostya
parents: 5997
diff changeset
181 dst[1] = (t6 + t2) >> 3;
953c8efd5298 Factor out constant addition
kostya
parents: 5997
diff changeset
182 dst[2] = (t7 + t3) >> 3;
953c8efd5298 Factor out constant addition
kostya
parents: 5997
diff changeset
183 dst[3] = (t8 + t4) >> 3;
953c8efd5298 Factor out constant addition
kostya
parents: 5997
diff changeset
184 dst[4] = (t8 - t4) >> 3;
953c8efd5298 Factor out constant addition
kostya
parents: 5997
diff changeset
185 dst[5] = (t7 - t3) >> 3;
953c8efd5298 Factor out constant addition
kostya
parents: 5997
diff changeset
186 dst[6] = (t6 - t2) >> 3;
953c8efd5298 Factor out constant addition
kostya
parents: 5997
diff changeset
187 dst[7] = (t5 - t1) >> 3;
3526
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
188
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
189 src += 8;
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
190 dst += 8;
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
191 }
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
192
5997
90de28dfd8d6 Switch VC-1 decoder to output decoded residual immediately.
kostya
parents: 5416
diff changeset
193 src = block;
3526
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
194 for(i = 0; i < 8; i++){
6157
953c8efd5298 Factor out constant addition
kostya
parents: 5997
diff changeset
195 t1 = 17 * (src[ 0] + src[16]) + 64;
953c8efd5298 Factor out constant addition
kostya
parents: 5997
diff changeset
196 t2 = 17 * (src[ 0] - src[16]) + 64;
6158
2f43560f5dba simplify 4-point transform part a bit
kostya
parents: 6157
diff changeset
197 t3 = 22 * src[ 8] + 10 * src[24];
2f43560f5dba simplify 4-point transform part a bit
kostya
parents: 6157
diff changeset
198 t4 = 22 * src[24] - 10 * src[ 8];
3526
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
199
6158
2f43560f5dba simplify 4-point transform part a bit
kostya
parents: 6157
diff changeset
200 dest[0*linesize] = cm[dest[0*linesize] + ((t1 + t3) >> 7)];
2f43560f5dba simplify 4-point transform part a bit
kostya
parents: 6157
diff changeset
201 dest[1*linesize] = cm[dest[1*linesize] + ((t2 - t4) >> 7)];
2f43560f5dba simplify 4-point transform part a bit
kostya
parents: 6157
diff changeset
202 dest[2*linesize] = cm[dest[2*linesize] + ((t2 + t4) >> 7)];
2f43560f5dba simplify 4-point transform part a bit
kostya
parents: 6157
diff changeset
203 dest[3*linesize] = cm[dest[3*linesize] + ((t1 - t3) >> 7)];
3526
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
204
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
205 src ++;
5997
90de28dfd8d6 Switch VC-1 decoder to output decoded residual immediately.
kostya
parents: 5416
diff changeset
206 dest++;
3526
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
207 }
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
208 }
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
209
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
210 /** Do inverse transform on 4x8 parts of block
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
211 */
5997
90de28dfd8d6 Switch VC-1 decoder to output decoded residual immediately.
kostya
parents: 5416
diff changeset
212 static void vc1_inv_trans_4x8_c(uint8_t *dest, int linesize, DCTELEM *block)
3526
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
213 {
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
214 int i;
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
215 register int t1,t2,t3,t4,t5,t6,t7,t8;
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
216 DCTELEM *src, *dst;
5997
90de28dfd8d6 Switch VC-1 decoder to output decoded residual immediately.
kostya
parents: 5416
diff changeset
217 const uint8_t *cm = ff_cropTbl + MAX_NEG_CROP;
3526
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
218
5997
90de28dfd8d6 Switch VC-1 decoder to output decoded residual immediately.
kostya
parents: 5416
diff changeset
219 src = block;
90de28dfd8d6 Switch VC-1 decoder to output decoded residual immediately.
kostya
parents: 5416
diff changeset
220 dst = block;
3526
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
221 for(i = 0; i < 8; i++){
6157
953c8efd5298 Factor out constant addition
kostya
parents: 5997
diff changeset
222 t1 = 17 * (src[0] + src[2]) + 4;
953c8efd5298 Factor out constant addition
kostya
parents: 5997
diff changeset
223 t2 = 17 * (src[0] - src[2]) + 4;
6158
2f43560f5dba simplify 4-point transform part a bit
kostya
parents: 6157
diff changeset
224 t3 = 22 * src[1] + 10 * src[3];
2f43560f5dba simplify 4-point transform part a bit
kostya
parents: 6157
diff changeset
225 t4 = 22 * src[3] - 10 * src[1];
3526
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
226
6158
2f43560f5dba simplify 4-point transform part a bit
kostya
parents: 6157
diff changeset
227 dst[0] = (t1 + t3) >> 3;
2f43560f5dba simplify 4-point transform part a bit
kostya
parents: 6157
diff changeset
228 dst[1] = (t2 - t4) >> 3;
2f43560f5dba simplify 4-point transform part a bit
kostya
parents: 6157
diff changeset
229 dst[2] = (t2 + t4) >> 3;
2f43560f5dba simplify 4-point transform part a bit
kostya
parents: 6157
diff changeset
230 dst[3] = (t1 - t3) >> 3;
3526
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
231
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
232 src += 8;
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
233 dst += 8;
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
234 }
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
235
5997
90de28dfd8d6 Switch VC-1 decoder to output decoded residual immediately.
kostya
parents: 5416
diff changeset
236 src = block;
3526
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
237 for(i = 0; i < 4; i++){
6157
953c8efd5298 Factor out constant addition
kostya
parents: 5997
diff changeset
238 t1 = 12 * (src[ 0] + src[32]) + 64;
953c8efd5298 Factor out constant addition
kostya
parents: 5997
diff changeset
239 t2 = 12 * (src[ 0] - src[32]) + 64;
3526
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
240 t3 = 16 * src[16] + 6 * src[48];
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
241 t4 = 6 * src[16] - 16 * src[48];
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
242
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
243 t5 = t1 + t3;
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
244 t6 = t2 + t4;
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
245 t7 = t2 - t4;
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
246 t8 = t1 - t3;
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
247
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
248 t1 = 16 * src[ 8] + 15 * src[24] + 9 * src[40] + 4 * src[56];
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
249 t2 = 15 * src[ 8] - 4 * src[24] - 16 * src[40] - 9 * src[56];
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
250 t3 = 9 * src[ 8] - 16 * src[24] + 4 * src[40] + 15 * src[56];
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
251 t4 = 4 * src[ 8] - 9 * src[24] + 15 * src[40] - 16 * src[56];
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
252
6157
953c8efd5298 Factor out constant addition
kostya
parents: 5997
diff changeset
253 dest[0*linesize] = cm[dest[0*linesize] + ((t5 + t1) >> 7)];
953c8efd5298 Factor out constant addition
kostya
parents: 5997
diff changeset
254 dest[1*linesize] = cm[dest[1*linesize] + ((t6 + t2) >> 7)];
953c8efd5298 Factor out constant addition
kostya
parents: 5997
diff changeset
255 dest[2*linesize] = cm[dest[2*linesize] + ((t7 + t3) >> 7)];
953c8efd5298 Factor out constant addition
kostya
parents: 5997
diff changeset
256 dest[3*linesize] = cm[dest[3*linesize] + ((t8 + t4) >> 7)];
953c8efd5298 Factor out constant addition
kostya
parents: 5997
diff changeset
257 dest[4*linesize] = cm[dest[4*linesize] + ((t8 - t4 + 1) >> 7)];
953c8efd5298 Factor out constant addition
kostya
parents: 5997
diff changeset
258 dest[5*linesize] = cm[dest[5*linesize] + ((t7 - t3 + 1) >> 7)];
953c8efd5298 Factor out constant addition
kostya
parents: 5997
diff changeset
259 dest[6*linesize] = cm[dest[6*linesize] + ((t6 - t2 + 1) >> 7)];
953c8efd5298 Factor out constant addition
kostya
parents: 5997
diff changeset
260 dest[7*linesize] = cm[dest[7*linesize] + ((t5 - t1 + 1) >> 7)];
3526
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
261
5997
90de28dfd8d6 Switch VC-1 decoder to output decoded residual immediately.
kostya
parents: 5416
diff changeset
262 src ++;
90de28dfd8d6 Switch VC-1 decoder to output decoded residual immediately.
kostya
parents: 5416
diff changeset
263 dest++;
3526
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
264 }
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
265 }
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
266
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
267 /** Do inverse transform on 4x4 part of block
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
268 */
5997
90de28dfd8d6 Switch VC-1 decoder to output decoded residual immediately.
kostya
parents: 5416
diff changeset
269 static void vc1_inv_trans_4x4_c(uint8_t *dest, int linesize, DCTELEM *block)
3526
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
270 {
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
271 int i;
6158
2f43560f5dba simplify 4-point transform part a bit
kostya
parents: 6157
diff changeset
272 register int t1,t2,t3,t4;
3526
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
273 DCTELEM *src, *dst;
5997
90de28dfd8d6 Switch VC-1 decoder to output decoded residual immediately.
kostya
parents: 5416
diff changeset
274 const uint8_t *cm = ff_cropTbl + MAX_NEG_CROP;
3526
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
275
5997
90de28dfd8d6 Switch VC-1 decoder to output decoded residual immediately.
kostya
parents: 5416
diff changeset
276 src = block;
90de28dfd8d6 Switch VC-1 decoder to output decoded residual immediately.
kostya
parents: 5416
diff changeset
277 dst = block;
3526
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
278 for(i = 0; i < 4; i++){
6157
953c8efd5298 Factor out constant addition
kostya
parents: 5997
diff changeset
279 t1 = 17 * (src[0] + src[2]) + 4;
953c8efd5298 Factor out constant addition
kostya
parents: 5997
diff changeset
280 t2 = 17 * (src[0] - src[2]) + 4;
6158
2f43560f5dba simplify 4-point transform part a bit
kostya
parents: 6157
diff changeset
281 t3 = 22 * src[1] + 10 * src[3];
2f43560f5dba simplify 4-point transform part a bit
kostya
parents: 6157
diff changeset
282 t4 = 22 * src[3] - 10 * src[1];
3526
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
283
6158
2f43560f5dba simplify 4-point transform part a bit
kostya
parents: 6157
diff changeset
284 dst[0] = (t1 + t3) >> 3;
2f43560f5dba simplify 4-point transform part a bit
kostya
parents: 6157
diff changeset
285 dst[1] = (t2 - t4) >> 3;
2f43560f5dba simplify 4-point transform part a bit
kostya
parents: 6157
diff changeset
286 dst[2] = (t2 + t4) >> 3;
2f43560f5dba simplify 4-point transform part a bit
kostya
parents: 6157
diff changeset
287 dst[3] = (t1 - t3) >> 3;
3526
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
288
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
289 src += 8;
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
290 dst += 8;
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
291 }
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
292
5997
90de28dfd8d6 Switch VC-1 decoder to output decoded residual immediately.
kostya
parents: 5416
diff changeset
293 src = block;
3526
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
294 for(i = 0; i < 4; i++){
6157
953c8efd5298 Factor out constant addition
kostya
parents: 5997
diff changeset
295 t1 = 17 * (src[ 0] + src[16]) + 64;
953c8efd5298 Factor out constant addition
kostya
parents: 5997
diff changeset
296 t2 = 17 * (src[ 0] - src[16]) + 64;
6158
2f43560f5dba simplify 4-point transform part a bit
kostya
parents: 6157
diff changeset
297 t3 = 22 * src[ 8] + 10 * src[24];
2f43560f5dba simplify 4-point transform part a bit
kostya
parents: 6157
diff changeset
298 t4 = 22 * src[24] - 10 * src[ 8];
3526
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
299
6158
2f43560f5dba simplify 4-point transform part a bit
kostya
parents: 6157
diff changeset
300 dest[0*linesize] = cm[dest[0*linesize] + ((t1 + t3) >> 7)];
2f43560f5dba simplify 4-point transform part a bit
kostya
parents: 6157
diff changeset
301 dest[1*linesize] = cm[dest[1*linesize] + ((t2 - t4) >> 7)];
2f43560f5dba simplify 4-point transform part a bit
kostya
parents: 6157
diff changeset
302 dest[2*linesize] = cm[dest[2*linesize] + ((t2 + t4) >> 7)];
2f43560f5dba simplify 4-point transform part a bit
kostya
parents: 6157
diff changeset
303 dest[3*linesize] = cm[dest[3*linesize] + ((t1 - t3) >> 7)];
3526
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
304
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
305 src ++;
5997
90de28dfd8d6 Switch VC-1 decoder to output decoded residual immediately.
kostya
parents: 5416
diff changeset
306 dest++;
3526
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
307 }
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
308 }
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
309
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
310 /* motion compensation functions */
5416
90d90aecc83c Make bicubic interpolation standard compliant
kostya
parents: 5253
diff changeset
311 /** Filter in case of 2 filters */
90d90aecc83c Make bicubic interpolation standard compliant
kostya
parents: 5253
diff changeset
312 #define VC1_MSPEL_FILTER_16B(DIR, TYPE) \
90d90aecc83c Make bicubic interpolation standard compliant
kostya
parents: 5253
diff changeset
313 static av_always_inline int vc1_mspel_ ## DIR ## _filter_16bits(const TYPE *src, int stride, int mode) \
90d90aecc83c Make bicubic interpolation standard compliant
kostya
parents: 5253
diff changeset
314 { \
90d90aecc83c Make bicubic interpolation standard compliant
kostya
parents: 5253
diff changeset
315 switch(mode){ \
90d90aecc83c Make bicubic interpolation standard compliant
kostya
parents: 5253
diff changeset
316 case 0: /* no shift - should not occur */ \
90d90aecc83c Make bicubic interpolation standard compliant
kostya
parents: 5253
diff changeset
317 return 0; \
90d90aecc83c Make bicubic interpolation standard compliant
kostya
parents: 5253
diff changeset
318 case 1: /* 1/4 shift */ \
90d90aecc83c Make bicubic interpolation standard compliant
kostya
parents: 5253
diff changeset
319 return -4*src[-stride] + 53*src[0] + 18*src[stride] - 3*src[stride*2]; \
90d90aecc83c Make bicubic interpolation standard compliant
kostya
parents: 5253
diff changeset
320 case 2: /* 1/2 shift */ \
90d90aecc83c Make bicubic interpolation standard compliant
kostya
parents: 5253
diff changeset
321 return -src[-stride] + 9*src[0] + 9*src[stride] - src[stride*2]; \
90d90aecc83c Make bicubic interpolation standard compliant
kostya
parents: 5253
diff changeset
322 case 3: /* 3/4 shift */ \
90d90aecc83c Make bicubic interpolation standard compliant
kostya
parents: 5253
diff changeset
323 return -3*src[-stride] + 18*src[0] + 53*src[stride] - 4*src[stride*2]; \
90d90aecc83c Make bicubic interpolation standard compliant
kostya
parents: 5253
diff changeset
324 } \
90d90aecc83c Make bicubic interpolation standard compliant
kostya
parents: 5253
diff changeset
325 return 0; /* should not occur */ \
90d90aecc83c Make bicubic interpolation standard compliant
kostya
parents: 5253
diff changeset
326 }
90d90aecc83c Make bicubic interpolation standard compliant
kostya
parents: 5253
diff changeset
327
90d90aecc83c Make bicubic interpolation standard compliant
kostya
parents: 5253
diff changeset
328 VC1_MSPEL_FILTER_16B(ver, uint8_t);
90d90aecc83c Make bicubic interpolation standard compliant
kostya
parents: 5253
diff changeset
329 VC1_MSPEL_FILTER_16B(hor, int16_t);
90d90aecc83c Make bicubic interpolation standard compliant
kostya
parents: 5253
diff changeset
330
3526
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
331
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
332 /** Filter used to interpolate fractional pel values
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
333 */
4283
d6f83e2f8804 rename always_inline to av_always_inline and move to common.h
mru
parents: 4239
diff changeset
334 static av_always_inline int vc1_mspel_filter(const uint8_t *src, int stride, int mode, int r)
3526
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
335 {
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
336 switch(mode){
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
337 case 0: //no shift
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
338 return src[0];
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
339 case 1: // 1/4 shift
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
340 return (-4*src[-stride] + 53*src[0] + 18*src[stride] - 3*src[stride*2] + 32 - r) >> 6;
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
341 case 2: // 1/2 shift
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
342 return (-src[-stride] + 9*src[0] + 9*src[stride] - src[stride*2] + 8 - r) >> 4;
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
343 case 3: // 3/4 shift
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
344 return (-3*src[-stride] + 18*src[0] + 53*src[stride] - 4*src[stride*2] + 32 - r) >> 6;
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
345 }
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
346 return 0; //should not occur
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
347 }
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
348
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
349 /** Function used to do motion compensation with bicubic interpolation
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
350 */
5253
a69976bf878c Pass modes as parameters instead of calculating them inplace.
kostya
parents: 5252
diff changeset
351 static void vc1_mspel_mc(uint8_t *dst, const uint8_t *src, int stride, int hmode, int vmode, int rnd)
3526
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
352 {
5416
90d90aecc83c Make bicubic interpolation standard compliant
kostya
parents: 5253
diff changeset
353 int i, j;
90d90aecc83c Make bicubic interpolation standard compliant
kostya
parents: 5253
diff changeset
354
90d90aecc83c Make bicubic interpolation standard compliant
kostya
parents: 5253
diff changeset
355 if (vmode) { /* Horizontal filter to apply */
90d90aecc83c Make bicubic interpolation standard compliant
kostya
parents: 5253
diff changeset
356 int r;
90d90aecc83c Make bicubic interpolation standard compliant
kostya
parents: 5253
diff changeset
357
90d90aecc83c Make bicubic interpolation standard compliant
kostya
parents: 5253
diff changeset
358 if (hmode) { /* Vertical filter to apply, output to tmp */
90d90aecc83c Make bicubic interpolation standard compliant
kostya
parents: 5253
diff changeset
359 static const int shift_value[] = { 0, 5, 1, 5 };
90d90aecc83c Make bicubic interpolation standard compliant
kostya
parents: 5253
diff changeset
360 int shift = (shift_value[hmode]+shift_value[vmode])>>1;
90d90aecc83c Make bicubic interpolation standard compliant
kostya
parents: 5253
diff changeset
361 int16_t tmp[11*8], *tptr = tmp;
90d90aecc83c Make bicubic interpolation standard compliant
kostya
parents: 5253
diff changeset
362
90d90aecc83c Make bicubic interpolation standard compliant
kostya
parents: 5253
diff changeset
363 r = (1<<(shift-1)) + rnd-1;
90d90aecc83c Make bicubic interpolation standard compliant
kostya
parents: 5253
diff changeset
364
90d90aecc83c Make bicubic interpolation standard compliant
kostya
parents: 5253
diff changeset
365 src -= 1;
90d90aecc83c Make bicubic interpolation standard compliant
kostya
parents: 5253
diff changeset
366 for(j = 0; j < 8; j++) {
90d90aecc83c Make bicubic interpolation standard compliant
kostya
parents: 5253
diff changeset
367 for(i = 0; i < 11; i++)
90d90aecc83c Make bicubic interpolation standard compliant
kostya
parents: 5253
diff changeset
368 tptr[i] = (vc1_mspel_ver_filter_16bits(src + i, stride, vmode)+r)>>shift;
90d90aecc83c Make bicubic interpolation standard compliant
kostya
parents: 5253
diff changeset
369 src += stride;
90d90aecc83c Make bicubic interpolation standard compliant
kostya
parents: 5253
diff changeset
370 tptr += 11;
90d90aecc83c Make bicubic interpolation standard compliant
kostya
parents: 5253
diff changeset
371 }
3526
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
372
5416
90d90aecc83c Make bicubic interpolation standard compliant
kostya
parents: 5253
diff changeset
373 r = 64-rnd;
90d90aecc83c Make bicubic interpolation standard compliant
kostya
parents: 5253
diff changeset
374 tptr = tmp+1;
90d90aecc83c Make bicubic interpolation standard compliant
kostya
parents: 5253
diff changeset
375 for(j = 0; j < 8; j++) {
90d90aecc83c Make bicubic interpolation standard compliant
kostya
parents: 5253
diff changeset
376 for(i = 0; i < 8; i++)
90d90aecc83c Make bicubic interpolation standard compliant
kostya
parents: 5253
diff changeset
377 dst[i] = av_clip_uint8((vc1_mspel_hor_filter_16bits(tptr + i, 1, hmode)+r)>>7);
90d90aecc83c Make bicubic interpolation standard compliant
kostya
parents: 5253
diff changeset
378 dst += stride;
90d90aecc83c Make bicubic interpolation standard compliant
kostya
parents: 5253
diff changeset
379 tptr += 11;
90d90aecc83c Make bicubic interpolation standard compliant
kostya
parents: 5253
diff changeset
380 }
90d90aecc83c Make bicubic interpolation standard compliant
kostya
parents: 5253
diff changeset
381
90d90aecc83c Make bicubic interpolation standard compliant
kostya
parents: 5253
diff changeset
382 return;
90d90aecc83c Make bicubic interpolation standard compliant
kostya
parents: 5253
diff changeset
383 }
90d90aecc83c Make bicubic interpolation standard compliant
kostya
parents: 5253
diff changeset
384 else { /* No horizontal filter, output 8 lines to dst */
90d90aecc83c Make bicubic interpolation standard compliant
kostya
parents: 5253
diff changeset
385 r = 1-rnd;
90d90aecc83c Make bicubic interpolation standard compliant
kostya
parents: 5253
diff changeset
386
90d90aecc83c Make bicubic interpolation standard compliant
kostya
parents: 5253
diff changeset
387 for(j = 0; j < 8; j++) {
90d90aecc83c Make bicubic interpolation standard compliant
kostya
parents: 5253
diff changeset
388 for(i = 0; i < 8; i++)
90d90aecc83c Make bicubic interpolation standard compliant
kostya
parents: 5253
diff changeset
389 dst[i] = av_clip_uint8(vc1_mspel_filter(src + i, stride, vmode, r));
90d90aecc83c Make bicubic interpolation standard compliant
kostya
parents: 5253
diff changeset
390 src += stride;
90d90aecc83c Make bicubic interpolation standard compliant
kostya
parents: 5253
diff changeset
391 dst += stride;
90d90aecc83c Make bicubic interpolation standard compliant
kostya
parents: 5253
diff changeset
392 }
90d90aecc83c Make bicubic interpolation standard compliant
kostya
parents: 5253
diff changeset
393 return;
90d90aecc83c Make bicubic interpolation standard compliant
kostya
parents: 5253
diff changeset
394 }
3526
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
395 }
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
396
5416
90d90aecc83c Make bicubic interpolation standard compliant
kostya
parents: 5253
diff changeset
397 /* Horizontal mode with no vertical mode */
3526
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
398 for(j = 0; j < 8; j++) {
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
399 for(i = 0; i < 8; i++)
5416
90d90aecc83c Make bicubic interpolation standard compliant
kostya
parents: 5253
diff changeset
400 dst[i] = av_clip_uint8(vc1_mspel_filter(src + i, 1, hmode, rnd));
3526
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
401 dst += stride;
5416
90d90aecc83c Make bicubic interpolation standard compliant
kostya
parents: 5253
diff changeset
402 src += stride;
3526
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
403 }
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
404 }
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
405
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
406 /* pixel functions - really are entry points to vc1_mspel_mc */
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
407
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
408 /* this one is defined in dsputil.c */
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
409 void ff_put_vc1_mspel_mc00_c(uint8_t *dst, const uint8_t *src, int stride, int rnd);
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
410
5252
e4b9ca118ab1 Replace function declarations with macro
kostya
parents: 5251
diff changeset
411 #define PUT_VC1_MSPEL(a, b)\
e4b9ca118ab1 Replace function declarations with macro
kostya
parents: 5251
diff changeset
412 static void put_vc1_mspel_mc ## a ## b ##_c(uint8_t *dst, const uint8_t *src, int stride, int rnd) { \
5253
a69976bf878c Pass modes as parameters instead of calculating them inplace.
kostya
parents: 5252
diff changeset
413 vc1_mspel_mc(dst, src, stride, a, b, rnd); \
3526
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
414 }
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
415
5252
e4b9ca118ab1 Replace function declarations with macro
kostya
parents: 5251
diff changeset
416 PUT_VC1_MSPEL(1, 0)
e4b9ca118ab1 Replace function declarations with macro
kostya
parents: 5251
diff changeset
417 PUT_VC1_MSPEL(2, 0)
e4b9ca118ab1 Replace function declarations with macro
kostya
parents: 5251
diff changeset
418 PUT_VC1_MSPEL(3, 0)
3526
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
419
5252
e4b9ca118ab1 Replace function declarations with macro
kostya
parents: 5251
diff changeset
420 PUT_VC1_MSPEL(0, 1)
e4b9ca118ab1 Replace function declarations with macro
kostya
parents: 5251
diff changeset
421 PUT_VC1_MSPEL(1, 1)
e4b9ca118ab1 Replace function declarations with macro
kostya
parents: 5251
diff changeset
422 PUT_VC1_MSPEL(2, 1)
e4b9ca118ab1 Replace function declarations with macro
kostya
parents: 5251
diff changeset
423 PUT_VC1_MSPEL(3, 1)
3526
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
424
5252
e4b9ca118ab1 Replace function declarations with macro
kostya
parents: 5251
diff changeset
425 PUT_VC1_MSPEL(0, 2)
e4b9ca118ab1 Replace function declarations with macro
kostya
parents: 5251
diff changeset
426 PUT_VC1_MSPEL(1, 2)
e4b9ca118ab1 Replace function declarations with macro
kostya
parents: 5251
diff changeset
427 PUT_VC1_MSPEL(2, 2)
e4b9ca118ab1 Replace function declarations with macro
kostya
parents: 5251
diff changeset
428 PUT_VC1_MSPEL(3, 2)
3526
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
429
5252
e4b9ca118ab1 Replace function declarations with macro
kostya
parents: 5251
diff changeset
430 PUT_VC1_MSPEL(0, 3)
e4b9ca118ab1 Replace function declarations with macro
kostya
parents: 5251
diff changeset
431 PUT_VC1_MSPEL(1, 3)
e4b9ca118ab1 Replace function declarations with macro
kostya
parents: 5251
diff changeset
432 PUT_VC1_MSPEL(2, 3)
e4b9ca118ab1 Replace function declarations with macro
kostya
parents: 5251
diff changeset
433 PUT_VC1_MSPEL(3, 3)
3526
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
434
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
435 void ff_vc1dsp_init(DSPContext* dsp, AVCodecContext *avctx) {
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
436 dsp->vc1_inv_trans_8x8 = vc1_inv_trans_8x8_c;
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
437 dsp->vc1_inv_trans_4x8 = vc1_inv_trans_4x8_c;
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
438 dsp->vc1_inv_trans_8x4 = vc1_inv_trans_8x4_c;
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
439 dsp->vc1_inv_trans_4x4 = vc1_inv_trans_4x4_c;
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
440 dsp->vc1_h_overlap = vc1_h_overlap_c;
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
441 dsp->vc1_v_overlap = vc1_v_overlap_c;
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
442
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
443 dsp->put_vc1_mspel_pixels_tab[ 0] = ff_put_vc1_mspel_mc00_c;
5251
f2a1fa269c12 Drop ff_ prefix for static functions
kostya
parents: 5215
diff changeset
444 dsp->put_vc1_mspel_pixels_tab[ 1] = put_vc1_mspel_mc10_c;
f2a1fa269c12 Drop ff_ prefix for static functions
kostya
parents: 5215
diff changeset
445 dsp->put_vc1_mspel_pixels_tab[ 2] = put_vc1_mspel_mc20_c;
f2a1fa269c12 Drop ff_ prefix for static functions
kostya
parents: 5215
diff changeset
446 dsp->put_vc1_mspel_pixels_tab[ 3] = put_vc1_mspel_mc30_c;
f2a1fa269c12 Drop ff_ prefix for static functions
kostya
parents: 5215
diff changeset
447 dsp->put_vc1_mspel_pixels_tab[ 4] = put_vc1_mspel_mc01_c;
f2a1fa269c12 Drop ff_ prefix for static functions
kostya
parents: 5215
diff changeset
448 dsp->put_vc1_mspel_pixels_tab[ 5] = put_vc1_mspel_mc11_c;
f2a1fa269c12 Drop ff_ prefix for static functions
kostya
parents: 5215
diff changeset
449 dsp->put_vc1_mspel_pixels_tab[ 6] = put_vc1_mspel_mc21_c;
f2a1fa269c12 Drop ff_ prefix for static functions
kostya
parents: 5215
diff changeset
450 dsp->put_vc1_mspel_pixels_tab[ 7] = put_vc1_mspel_mc31_c;
f2a1fa269c12 Drop ff_ prefix for static functions
kostya
parents: 5215
diff changeset
451 dsp->put_vc1_mspel_pixels_tab[ 8] = put_vc1_mspel_mc02_c;
f2a1fa269c12 Drop ff_ prefix for static functions
kostya
parents: 5215
diff changeset
452 dsp->put_vc1_mspel_pixels_tab[ 9] = put_vc1_mspel_mc12_c;
f2a1fa269c12 Drop ff_ prefix for static functions
kostya
parents: 5215
diff changeset
453 dsp->put_vc1_mspel_pixels_tab[10] = put_vc1_mspel_mc22_c;
f2a1fa269c12 Drop ff_ prefix for static functions
kostya
parents: 5215
diff changeset
454 dsp->put_vc1_mspel_pixels_tab[11] = put_vc1_mspel_mc32_c;
f2a1fa269c12 Drop ff_ prefix for static functions
kostya
parents: 5215
diff changeset
455 dsp->put_vc1_mspel_pixels_tab[12] = put_vc1_mspel_mc03_c;
f2a1fa269c12 Drop ff_ prefix for static functions
kostya
parents: 5215
diff changeset
456 dsp->put_vc1_mspel_pixels_tab[13] = put_vc1_mspel_mc13_c;
f2a1fa269c12 Drop ff_ prefix for static functions
kostya
parents: 5215
diff changeset
457 dsp->put_vc1_mspel_pixels_tab[14] = put_vc1_mspel_mc23_c;
f2a1fa269c12 Drop ff_ prefix for static functions
kostya
parents: 5215
diff changeset
458 dsp->put_vc1_mspel_pixels_tab[15] = put_vc1_mspel_mc33_c;
3526
7dc8e4a12105 New functions in DSPContext for VC-1 decoding
kostya
parents:
diff changeset
459 }