1 /*
2 * RV30 decoder
3 * Copyright (c) 2007 Konstantin Shishkov
4 *
5 * This file is part of FFmpeg.
6 *
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21
22 /**
23 * @file
24 * RV30 decoder
25 */
26
31
34
35
37 {
39 int mb_bits;
41 int mb_size;
42 int rpr;
43
46 return -1;
50 return -1;
55 if(rpr){
59 }
60
63 "Insufficient extradata - need at least %d bytes, got %d\n",
66 }
67
70 }
73 mb_size = ((w + 15) >> 4) * ((h + 15) >> 4);
77 return 0;
78 }
79
80 /**
81 * Decode 4x4 intra types array.
82 */
84 {
85 int i, j, k;
86
88 for(j = 0; j < 4; j+= 2){
92 return -1;
93 }
94 for(k = 0; k < 2; k++){
98 if(dst[-1] == 9){
100 return -1;
101 }
102 }
103 }
104 }
105 return 0;
106 }
107
108 /**
109 * Decode macroblock information.
110 */
112 {
118
119 if (code > 11) {
121 return -1;
122 }
123 if(code > 5){
125 code -= 6;
126 }
128 return rv30_p_types[code];
129 else
130 return rv30_b_types[code];
131 }
132
134 const int stride,
const int lim)
135 {
137 int i, diff;
138
139 for(i = 0; i < 4; i++){
140 diff = ((src[-2*step] - src[1*step]) - (src[-1*step] - src[0*step])*4) >> 3;
141 diff = av_clip(diff, -lim, lim);
142 src[-1*step] = cm[src[-1*step] + diff];
143 src[ 0*step] = cm[src[ 0*step] - diff];
144 src += stride;
145 }
146 }
147
149 {
151 int mb_pos, mb_x;
152 int i, j, k;
154 int loc_lim, cur_lim, left_lim = 0, top_lim = 0;
155
157 for(mb_x = 0; mb_x < s->
mb_width; mb_x++, mb_pos++){
163 }
164
165 /* all vertical edges are filtered first
166 * and horizontal edges are filtered on the next iteration
167 */
169 for(mb_x = 0; mb_x < s->
mb_width; mb_x++, mb_pos++){
171 if(mb_x)
173 for(j = 0; j < 16; j += 4){
175 for(i = !mb_x; i < 4; i++, Y += 4){
176 int ij = i + j;
177 loc_lim = 0;
179 loc_lim = cur_lim;
180 else if(!i && r->
deblock_coefs[mb_pos - 1] & (1 << (ij + 3)))
181 loc_lim = left_lim;
183 loc_lim = cur_lim;
184 if(loc_lim)
186 }
187 }
188 for(k = 0; k < 2; k++){
189 int cur_cbp, left_cbp = 0;
190 cur_cbp = (r->
cbp_chroma[mb_pos] >> (k*4)) & 0xF;
191 if(mb_x)
192 left_cbp = (r->
cbp_chroma[mb_pos - 1] >> (k*4)) & 0xF;
193 for(j = 0; j < 8; j += 4){
195 for(i = !mb_x; i < 2; i++, C += 4){
196 int ij = i + (j >> 1);
197 loc_lim = 0;
198 if (cur_cbp & (1 << ij))
199 loc_lim = cur_lim;
200 else if(!i && left_cbp & (1 << (ij + 1)))
201 loc_lim = left_lim;
202 else if( i && cur_cbp & (1 << (ij - 1)))
203 loc_lim = cur_lim;
204 if(loc_lim)
206 }
207 }
208 }
209 }
211 for(mb_x = 0; mb_x < s->
mb_width; mb_x++, mb_pos++){
213 if(row)
215 for(j = 4*!row; j < 16; j += 4){
217 for(i = 0; i < 4; i++, Y += 4){
218 int ij = i + j;
219 loc_lim = 0;
221 loc_lim = cur_lim;
223 loc_lim = top_lim;
225 loc_lim = cur_lim;
226 if(loc_lim)
228 }
229 }
230 for(k = 0; k < 2; k++){
231 int cur_cbp, top_cbp = 0;
232 cur_cbp = (r->
cbp_chroma[mb_pos] >> (k*4)) & 0xF;
233 if(row)
235 for(j = 4*!row; j < 8; j += 4){
237 for(i = 0; i < 2; i++, C += 4){
238 int ij = i + (j >> 1);
239 loc_lim = 0;
241 loc_lim = cur_lim;
242 else if(!j && top_cbp & (1 << (ij + 2)))
243 loc_lim = top_lim;
244 else if( j && cur_cbp & (1 << (ij - 2)))
245 loc_lim = cur_lim;
246 if(loc_lim)
248 }
249 }
250 }
251 }
252 }
253
254 /**
255 * Initialize decoder.
256 */
258 {
261
267 return -1;
268 }
269
274 }
275
282 return 0;
283 }
284
300 },
303 };