fix identifier to fix compilation
[libav.git] / libavcodec / svq3.c
CommitLineData
8b82a956
MN
1/*
2 * Copyright (c) 2003 The FFmpeg Project.
3 *
4 * This library 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 of the License, or (at your option) any later version.
8 *
9 * This library 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 this library; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 *
18 *
19 * How to use this decoder:
20 * SVQ3 data is transported within Apple Quicktime files. Quicktime files
89a79364
MM
21 * have stsd atoms to describe media trak properties. A stsd atom for a
22 * video trak contains 1 or more ImageDescription atoms. These atoms begin
23 * with the 4-byte length of the atom followed by the codec fourcc. Some
24 * decoders need information in this atom to operate correctly. Such
25 * is the case with SVQ3. In order to get the best use out of this decoder,
26 * the calling app must make the SVQ3 ImageDescription atom available
8b82a956
MN
27 * via the AVCodecContext's extradata[_size] field:
28 *
89a79364
MM
29 * AVCodecContext.extradata = pointer to ImageDescription, first characters
30 * are expected to be 'S', 'V', 'Q', and '3', NOT the 4-byte atom length
31 * AVCodecContext.extradata_size = size of ImageDescription atom memory
32 * buffer (which will be the same as the ImageDescription atom size field
33 * from the QT file, minus 4 bytes since the length is missing)
34 *
35 * You will know you have these parameters passed correctly when the decoder
36 * correctly decodes this file:
37 * ftp://ftp.mplayerhq.hu/MPlayer/samples/V-codecs/SVQ3/Vertical400kbit.sorenson3.mov
8b82a956
MN
38 *
39 */
40
41/**
42 * @file svq3.c
43 * svq3 decoder.
44 */
45
94d44f45
MN
46#define FULLPEL_MODE 1
47#define HALFPEL_MODE 2
48#define THIRDPEL_MODE 3
49
f7a8c179
MN
50/* dual scan (from some older h264 draft)
51 o-->o-->o o
52 | /|
53 o o o / o
54 | / | |/ |
55 o o o o
56 /
57 o-->o-->o-->o
58*/
8b82a956
MN
59static const uint8_t svq3_scan[16]={
60 0+0*4, 1+0*4, 2+0*4, 2+1*4,
61 2+2*4, 3+0*4, 3+1*4, 3+2*4,
62 0+1*4, 0+2*4, 1+1*4, 1+2*4,
63 0+3*4, 1+3*4, 2+3*4, 3+3*4,
64};
65
66static const uint8_t svq3_pred_0[25][2] = {
67 { 0, 0 },
68 { 1, 0 }, { 0, 1 },
69 { 0, 2 }, { 1, 1 }, { 2, 0 },
70 { 3, 0 }, { 2, 1 }, { 1, 2 }, { 0, 3 },
71 { 0, 4 }, { 1, 3 }, { 2, 2 }, { 3, 1 }, { 4, 0 },
72 { 4, 1 }, { 3, 2 }, { 2, 3 }, { 1, 4 },
73 { 2, 4 }, { 3, 3 }, { 4, 2 },
74 { 4, 3 }, { 3, 4 },
75 { 4, 4 }
76};
77
78static const int8_t svq3_pred_1[6][6][5] = {
79 { { 2,-1,-1,-1,-1 }, { 2, 1,-1,-1,-1 }, { 1, 2,-1,-1,-1 },
80 { 2, 1,-1,-1,-1 }, { 1, 2,-1,-1,-1 }, { 1, 2,-1,-1,-1 } },
81 { { 0, 2,-1,-1,-1 }, { 0, 2, 1, 4, 3 }, { 0, 1, 2, 4, 3 },
82 { 0, 2, 1, 4, 3 }, { 2, 0, 1, 3, 4 }, { 0, 4, 2, 1, 3 } },
83 { { 2, 0,-1,-1,-1 }, { 2, 1, 0, 4, 3 }, { 1, 2, 4, 0, 3 },
84 { 2, 1, 0, 4, 3 }, { 2, 1, 4, 3, 0 }, { 1, 2, 4, 0, 3 } },
85 { { 2, 0,-1,-1,-1 }, { 2, 0, 1, 4, 3 }, { 1, 2, 0, 4, 3 },
86 { 2, 1, 0, 4, 3 }, { 2, 1, 3, 4, 0 }, { 2, 4, 1, 0, 3 } },
87 { { 0, 2,-1,-1,-1 }, { 0, 2, 1, 3, 4 }, { 1, 2, 3, 0, 4 },
88 { 2, 0, 1, 3, 4 }, { 2, 1, 3, 0, 4 }, { 2, 0, 4, 3, 1 } },
89 { { 0, 2,-1,-1,-1 }, { 0, 2, 4, 1, 3 }, { 1, 4, 2, 0, 3 },
90 { 4, 2, 0, 1, 3 }, { 2, 0, 1, 4, 3 }, { 4, 2, 1, 0, 3 } },
91};
92
93static const struct { uint8_t run; uint8_t level; } svq3_dct_tables[2][16] = {
94 { { 0, 0 }, { 0, 1 }, { 1, 1 }, { 2, 1 }, { 0, 2 }, { 3, 1 }, { 4, 1 }, { 5, 1 },
95 { 0, 3 }, { 1, 2 }, { 2, 2 }, { 6, 1 }, { 7, 1 }, { 8, 1 }, { 9, 1 }, { 0, 4 } },
96 { { 0, 0 }, { 0, 1 }, { 1, 1 }, { 0, 2 }, { 2, 1 }, { 0, 3 }, { 0, 4 }, { 0, 5 },
97 { 3, 1 }, { 4, 1 }, { 1, 2 }, { 1, 3 }, { 0, 6 }, { 0, 7 }, { 0, 8 }, { 0, 9 } }
98};
99
100static const uint32_t svq3_dequant_coeff[32] = {
101 3881, 4351, 4890, 5481, 6154, 6914, 7761, 8718,
102 9781, 10987, 12339, 13828, 15523, 17435, 19561, 21873,
103 24552, 27656, 30847, 34870, 38807, 43747, 49103, 54683,
104 61694, 68745, 77615, 89113,100253,109366,126635,141533
105};
106
107
108static void svq3_luma_dc_dequant_idct_c(DCTELEM *block, int qp){
109 const int qmul= svq3_dequant_coeff[qp];
110#define stride 16
111 int i;
112 int temp[16];
113 static const int x_offset[4]={0, 1*stride, 4* stride, 5*stride};
114 static const int y_offset[4]={0, 2*stride, 8* stride, 10*stride};
115
116 for(i=0; i<4; i++){
117 const int offset= y_offset[i];
118 const int z0= 13*(block[offset+stride*0] + block[offset+stride*4]);
119 const int z1= 13*(block[offset+stride*0] - block[offset+stride*4]);
120 const int z2= 7* block[offset+stride*1] - 17*block[offset+stride*5];
121 const int z3= 17* block[offset+stride*1] + 7*block[offset+stride*5];
122
123 temp[4*i+0]= z0+z3;
124 temp[4*i+1]= z1+z2;
125 temp[4*i+2]= z1-z2;
126 temp[4*i+3]= z0-z3;
127 }
128
129 for(i=0; i<4; i++){
130 const int offset= x_offset[i];
131 const int z0= 13*(temp[4*0+i] + temp[4*2+i]);
132 const int z1= 13*(temp[4*0+i] - temp[4*2+i]);
133 const int z2= 7* temp[4*1+i] - 17*temp[4*3+i];
134 const int z3= 17* temp[4*1+i] + 7*temp[4*3+i];
135
136 block[stride*0 +offset]= ((z0 + z3)*qmul + 0x80000)>>20;
137 block[stride*2 +offset]= ((z1 + z2)*qmul + 0x80000)>>20;
138 block[stride*8 +offset]= ((z1 - z2)*qmul + 0x80000)>>20;
139 block[stride*10+offset]= ((z0 - z3)*qmul + 0x80000)>>20;
140 }
141}
142#undef stride
143
144static void svq3_add_idct_c (uint8_t *dst, DCTELEM *block, int stride, int qp, int dc){
145 const int qmul= svq3_dequant_coeff[qp];
146 int i;
147 uint8_t *cm = cropTbl + MAX_NEG_CROP;
148
149 if (dc) {
150 dc = 13*13*((dc == 1) ? 1538*block[0] : ((qmul*(block[0] >> 3)) / 2));
151 block[0] = 0;
152 }
153
154 for (i=0; i < 4; i++) {
155 const int z0= 13*(block[0 + 4*i] + block[2 + 4*i]);
156 const int z1= 13*(block[0 + 4*i] - block[2 + 4*i]);
157 const int z2= 7* block[1 + 4*i] - 17*block[3 + 4*i];
158 const int z3= 17* block[1 + 4*i] + 7*block[3 + 4*i];
159
160 block[0 + 4*i]= z0 + z3;
161 block[1 + 4*i]= z1 + z2;
162 block[2 + 4*i]= z1 - z2;
163 block[3 + 4*i]= z0 - z3;
164 }
165
166 for (i=0; i < 4; i++) {
167 const int z0= 13*(block[i + 4*0] + block[i + 4*2]);
168 const int z1= 13*(block[i + 4*0] - block[i + 4*2]);
169 const int z2= 7* block[i + 4*1] - 17*block[i + 4*3];
170 const int z3= 17* block[i + 4*1] + 7*block[i + 4*3];
171 const int rr= (dc + 0x80000);
172
173 dst[i + stride*0]= cm[ dst[i + stride*0] + (((z0 + z3)*qmul + rr) >> 20) ];
174 dst[i + stride*1]= cm[ dst[i + stride*1] + (((z1 + z2)*qmul + rr) >> 20) ];
175 dst[i + stride*2]= cm[ dst[i + stride*2] + (((z1 - z2)*qmul + rr) >> 20) ];
176 dst[i + stride*3]= cm[ dst[i + stride*3] + (((z0 - z3)*qmul + rr) >> 20) ];
177 }
178}
179
180static void pred4x4_down_left_svq3_c(uint8_t *src, uint8_t *topright, int stride){
181 LOAD_TOP_EDGE
182 LOAD_LEFT_EDGE
183 const __attribute__((unused)) int unu0= t0;
184 const __attribute__((unused)) int unu1= l0;
185
186 src[0+0*stride]=(l1 + t1)>>1;
187 src[1+0*stride]=
188 src[0+1*stride]=(l2 + t2)>>1;
189 src[2+0*stride]=
190 src[1+1*stride]=
191 src[0+2*stride]=
192 src[3+0*stride]=
193 src[2+1*stride]=
194 src[1+2*stride]=
195 src[0+3*stride]=
196 src[3+1*stride]=
197 src[2+2*stride]=
198 src[1+3*stride]=
199 src[3+2*stride]=
200 src[2+3*stride]=
201 src[3+3*stride]=(l3 + t3)>>1;
4cfbf61b 202}
8b82a956
MN
203
204static void pred16x16_plane_svq3_c(uint8_t *src, int stride){
205 pred16x16_plane_compat_c(src, stride, 1);
206}
207
208static inline int svq3_decode_block (GetBitContext *gb, DCTELEM *block,
209 int index, const int type) {
210
211 static const uint8_t *const scan_patterns[4] =
212 { luma_dc_zigzag_scan, zigzag_scan, svq3_scan, chroma_dc_scan };
213
214 int run, level, sign, vlc, limit;
215 const int intra = (3 * type) >> 2;
216 const uint8_t *const scan = scan_patterns[type];
217
218 for (limit=(16 >> intra); index < 16; index=limit, limit+=8) {
219 for (; (vlc = svq3_get_ue_golomb (gb)) != 0; index++) {
220
221 if (vlc == INVALID_VLC)
222 return -1;
223
224 sign = (vlc & 0x1) - 1;
225 vlc = (vlc + 1) >> 1;
226
227 if (type == 3) {
228 if (vlc < 3) {
229 run = 0;
230 level = vlc;
231 } else if (vlc < 4) {
232 run = 1;
233 level = 1;
234 } else {
235 run = (vlc & 0x3);
236 level = ((vlc + 9) >> 2) - run;
237 }
238 } else {
239 if (vlc < 16) {
240 run = svq3_dct_tables[intra][vlc].run;
241 level = svq3_dct_tables[intra][vlc].level;
242 } else if (intra) {
243 run = (vlc & 0x7);
244 level = (vlc >> 3) + ((run == 0) ? 8 : ((run < 2) ? 2 : ((run < 5) ? 0 : -1)));
245 } else {
246 run = (vlc & 0xF);
247 level = (vlc >> 4) + ((run == 0) ? 4 : ((run < 3) ? 2 : ((run < 10) ? 1 : 0)));
248 }
249 }
250
251 if ((index += run) >= limit)
252 return -1;
253
254 block[scan[index]] = (level ^ sign) - sign;
255 }
256
257 if (type != 2) {
258 break;
259 }
260 }
261
262 return 0;
263}
264
8b82a956 265static inline void svq3_mc_dir_part (MpegEncContext *s, int x, int y,
669ac79c 266 int width, int height, int mx, int my, int dxy, int thirdpel) {
8b82a956
MN
267 uint8_t *src, *dest;
268 int i, emu = 0;
669ac79c 269 int blocksize= 2 - (width>>3); //16->0, 8->1, 4->2
8b82a956 270
94d44f45
MN
271 mx += x;
272 my += y;
273
4c701ac8
MN
274 if (mx < 0 || mx >= (s->h_edge_pos - width - 1) ||
275 my < 0 || my >= (s->v_edge_pos - height - 1)) {
8b82a956
MN
276
277 if ((s->flags & CODEC_FLAG_EMU_EDGE)) {
278 emu = 1;
279 }
280
4c701ac8
MN
281 mx = clip (mx, -16, (s->h_edge_pos - width + 15));
282 my = clip (my, -16, (s->v_edge_pos - height + 15));
8b82a956
MN
283 }
284
285 /* form component predictions */
286 dest = s->current_picture.data[0] + x + y*s->linesize;
287 src = s->last_picture.data[0] + mx + my*s->linesize;
288
289 if (emu) {
c009df3f 290 ff_emulated_edge_mc(s->edge_emu_buffer, src, s->linesize, (width + 1), (height + 1),
4c701ac8 291 mx, my, s->h_edge_pos, s->v_edge_pos);
8b82a956
MN
292 src = s->edge_emu_buffer;
293 }
669ac79c
MN
294 if(thirdpel)
295 s->dsp.put_tpel_pixels_tab[dxy](dest, src, s->linesize, width, height);
296 else
297 s->dsp.put_pixels_tab[blocksize][dxy](dest, src, s->linesize, height);
8b82a956
MN
298
299 if (!(s->flags & CODEC_FLAG_GRAY)) {
300 mx = (mx + (mx < (int) x)) >> 1;
301 my = (my + (my < (int) y)) >> 1;
302 width = (width >> 1);
303 height = (height >> 1);
669ac79c 304 blocksize++;
8b82a956
MN
305
306 for (i=1; i < 3; i++) {
307 dest = s->current_picture.data[i] + (x >> 1) + (y >> 1)*s->uvlinesize;
308 src = s->last_picture.data[i] + mx + my*s->uvlinesize;
309
310 if (emu) {
c009df3f 311 ff_emulated_edge_mc(s->edge_emu_buffer, src, s->uvlinesize, (width + 1), (height + 1),
4c701ac8 312 mx, my, (s->h_edge_pos >> 1), (s->v_edge_pos >> 1));
8b82a956
MN
313 src = s->edge_emu_buffer;
314 }
669ac79c
MN
315 if(thirdpel)
316 s->dsp.put_tpel_pixels_tab[dxy](dest, src, s->uvlinesize, width, height);
317 else
318 s->dsp.put_pixels_tab[blocksize][dxy](dest, src, s->uvlinesize, height);
8b82a956
MN
319 }
320 }
321}
322
323static int svq3_decode_mb (H264Context *h, unsigned int mb_type) {
324 int cbp, dir, mode, mx, my, dx, dy, x, y, part_width, part_height;
325 int i, j, k, l, m;
326 uint32_t vlc;
327 int8_t *top, *left;
328 MpegEncContext *const s = (MpegEncContext *) h;
329 const int mb_xy = s->mb_x + s->mb_y*s->mb_stride;
330 const int b_xy = 4*s->mb_x + 4*s->mb_y*h->b_stride;
331
332 h->top_samples_available = (s->mb_y == 0) ? 0x33FF : 0xFFFF;
333 h->left_samples_available = (s->mb_x == 0) ? 0x5F5F : 0xFFFF;
334 h->topright_samples_available = 0xFFFF;
335
336 if (mb_type == 0) { /* SKIP */
669ac79c 337 svq3_mc_dir_part (s, 16*s->mb_x, 16*s->mb_y, 16, 16, 0, 0, 0, 0);
8b82a956
MN
338
339 cbp = 0;
340 mb_type = MB_TYPE_SKIP;
341 } else if (mb_type < 8) { /* INTER */
342 if (h->thirdpel_flag && h->halfpel_flag == !get_bits (&s->gb, 1)) {
94d44f45 343 mode = THIRDPEL_MODE;
8b82a956 344 } else if (h->halfpel_flag && h->thirdpel_flag == !get_bits (&s->gb, 1)) {
94d44f45 345 mode = HALFPEL_MODE;
8b82a956 346 } else {
94d44f45 347 mode = FULLPEL_MODE;
8b82a956
MN
348 }
349
350 /* fill caches */
f7a8c179
MN
351 /* note ref_cache[0] should contain here:
352 ????????
353 ???11111
354 N??11111
355 N??11111
356 N??11111
357 N
358 */
359
8b82a956
MN
360 if (s->mb_x > 0) {
361 for (i=0; i < 4; i++) {
362 *(uint32_t *) h->mv_cache[0][scan8[0] - 1 + i*8] = *(uint32_t *) s->current_picture.motion_val[0][b_xy - 1 + i*h->b_stride];
8b82a956
MN
363 }
364 } else {
365 for (i=0; i < 4; i++) {
366 *(uint32_t *) h->mv_cache[0][scan8[0] - 1 + i*8] = 0;
8b82a956
MN
367 }
368 }
369 if (s->mb_y > 0) {
370 memcpy (h->mv_cache[0][scan8[0] - 1*8], s->current_picture.motion_val[0][b_xy - h->b_stride], 4*2*sizeof(int16_t));
371 memset (&h->ref_cache[0][scan8[0] - 1*8], 1, 4);
372
373 if (s->mb_x < (s->mb_width - 1)) {
374 *(uint32_t *) h->mv_cache[0][scan8[0] + 4 - 1*8] = *(uint32_t *) s->current_picture.motion_val[0][b_xy - h->b_stride + 4];
375 h->ref_cache[0][scan8[0] + 4 - 1*8] = 1;
f7a8c179
MN
376 }else
377 h->ref_cache[0][scan8[0] + 4 - 1*8] = PART_NOT_AVAILABLE;
8b82a956
MN
378 if (s->mb_x > 0) {
379 *(uint32_t *) h->mv_cache[0][scan8[0] - 1 - 1*8] = *(uint32_t *) s->current_picture.motion_val[0][b_xy - h->b_stride - 1];
380 h->ref_cache[0][scan8[0] - 1 - 1*8] = 1;
f7a8c179
MN
381 }else
382 h->ref_cache[0][scan8[0] - 1 - 1*8] = PART_NOT_AVAILABLE;
383 }else
384 memset (&h->ref_cache[0][scan8[0] - 1*8 - 1], PART_NOT_AVAILABLE, 8);
8b82a956
MN
385
386 /* decode motion vector(s) and form prediction(s) */
387 part_width = ((mb_type & 5) == 5) ? 4 : 8 << (mb_type & 1);
388 part_height = 16 >> ((unsigned) mb_type / 3);
389
390 for (i=0; i < 16; i+=part_height) {
391 for (j=0; j < 16; j+=part_width) {
94d44f45 392 int dxy;
8b82a956
MN
393 x = 16*s->mb_x + j;
394 y = 16*s->mb_y + i;
395 k = ((j>>2)&1) + ((i>>1)&2) + ((j>>1)&4) + (i&8);
396
397 pred_motion (h, k, (part_width >> 2), 0, 1, &mx, &my);
398
399 /* clip motion vector prediction to frame border */
4c701ac8
MN
400 mx = clip (mx, -6*x, 6*(s->h_edge_pos - part_width - x));
401 my = clip (my, -6*y, 6*(s->v_edge_pos - part_height - y));
8b82a956
MN
402
403 /* get motion vector differential */
404 dy = svq3_get_se_golomb (&s->gb);
405 dx = svq3_get_se_golomb (&s->gb);
406
407 if (dx == INVALID_VLC || dy == INVALID_VLC) {
408 return -1;
409 }
8b82a956 410 /* compute motion vector */
94d44f45
MN
411 if (mode == THIRDPEL_MODE) {
412 int fx, fy;
413 mx = ((mx + 1)>>1) + dx;
414 my = ((my + 1)>>1) + dy;
415 fx= ((unsigned)(mx + 0x3000))/3 - 0x1000;
416 fy= ((unsigned)(my + 0x3000))/3 - 0x1000;
669ac79c 417 dxy= (mx - 3*fx) + 4*(my - 3*fy);
94d44f45 418
669ac79c 419 svq3_mc_dir_part (s, x, y, part_width, part_height, fx, fy, dxy, 1);
94d44f45
MN
420 mx += mx;
421 my += my;
422 } else if (mode == HALFPEL_MODE) {
423 mx = ((unsigned)(mx + 1 + 0x3000))/3 + dx - 0x1000;
424 my = ((unsigned)(my + 1 + 0x3000))/3 + dy - 0x1000;
669ac79c 425 dxy= (mx&1) + 2*(my&1);
94d44f45 426
669ac79c 427 svq3_mc_dir_part (s, x, y, part_width, part_height, mx>>1, my>>1, dxy, 0);
94d44f45
MN
428 mx *= 3;
429 my *= 3;
430 } else {
431 assert(mode == FULLPEL_MODE);
432 mx = ((unsigned)(mx + 3 + 0x6000))/6 + dx - 0x1000;
433 my = ((unsigned)(my + 3 + 0x6000))/6 + dy - 0x1000;
434
669ac79c 435 svq3_mc_dir_part (s, x, y, part_width, part_height, mx, my, 0, 0);
94d44f45
MN
436 mx *= 6;
437 my *= 6;
8b82a956
MN
438 }
439
94d44f45 440 /* update mv_cache */
377ec888 441 fill_rectangle(h->mv_cache[0][scan8[k]], part_width>>2, part_height>>2, 8, pack16to32(mx,my), 4);
8b82a956
MN
442 }
443 }
444
445 for (i=0; i < 4; i++) {
446 memcpy (s->current_picture.motion_val[0][b_xy + i*h->b_stride], h->mv_cache[0][scan8[0] + 8*i], 4*2*sizeof(int16_t));
447 }
448
449 if ((vlc = svq3_get_ue_golomb (&s->gb)) >= 48)
450 return -1;
451
452 cbp = golomb_to_inter_cbp[vlc];
453 mb_type = MB_TYPE_16x16;
454 } else if (mb_type == 8) { /* INTRA4x4 */
455 memset (h->intra4x4_pred_mode_cache, -1, 8*5*sizeof(int8_t));
456
457 if (s->mb_x > 0) {
458 for (i=0; i < 4; i++) {
459 h->intra4x4_pred_mode_cache[scan8[0] - 1 + i*8] = h->intra4x4_pred_mode[mb_xy - 1][i];
460 }
461 }
462 if (s->mb_y > 0) {
463 h->intra4x4_pred_mode_cache[4+8*0] = h->intra4x4_pred_mode[mb_xy - s->mb_stride][4];
464 h->intra4x4_pred_mode_cache[5+8*0] = h->intra4x4_pred_mode[mb_xy - s->mb_stride][5];
465 h->intra4x4_pred_mode_cache[6+8*0] = h->intra4x4_pred_mode[mb_xy - s->mb_stride][6];
466 h->intra4x4_pred_mode_cache[7+8*0] = h->intra4x4_pred_mode[mb_xy - s->mb_stride][3];
467 }
468
469 /* decode prediction codes for luma blocks */
470 for (i=0; i < 16; i+=2) {
471 vlc = svq3_get_ue_golomb (&s->gb);
472
473 if (vlc >= 25)
474 return -1;
475
476 left = &h->intra4x4_pred_mode_cache[scan8[i] - 1];
477 top = &h->intra4x4_pred_mode_cache[scan8[i] - 8];
478
479 left[1] = svq3_pred_1[top[0] + 1][left[0] + 1][svq3_pred_0[vlc][0]];
480 left[2] = svq3_pred_1[top[1] + 1][left[1] + 1][svq3_pred_0[vlc][1]];
481
482 if (left[1] == -1 || left[2] == -1)
483 return -1;
484 }
485
486 write_back_intra_pred_mode (h);
487 check_intra4x4_pred_mode (h);
488
489 if ((vlc = svq3_get_ue_golomb (&s->gb)) >= 48)
490 return -1;
491
492 cbp = golomb_to_intra4x4_cbp[vlc];
493 mb_type = MB_TYPE_INTRA4x4;
494 } else { /* INTRA16x16 */
495 dir = i_mb_type_info[mb_type - 8].pred_mode;
496 dir = (dir >> 1) ^ 3*(dir & 1) ^ 1;
497
498 if ((h->intra16x16_pred_mode = check_intra_pred_mode (h, dir)) == -1)
499 return -1;
500
501 cbp = i_mb_type_info[mb_type - 8].cbp;
502 mb_type = MB_TYPE_INTRA16x16;
503 }
504
505 if (!IS_INTER(mb_type) && s->pict_type != I_TYPE) {
506 for (i=0; i < 4; i++) {
507 memset (s->current_picture.motion_val[0][b_xy + i*h->b_stride], 0, 4*2*sizeof(int16_t));
508 }
509 }
510 if (!IS_INTRA4x4(mb_type)) {
511 memset (h->intra4x4_pred_mode[mb_xy], DC_PRED, 8);
512 }
513 if (!IS_SKIP(mb_type)) {
f7a8c179
MN
514 memset (h->non_zero_count_cache + 8, 0, 4*9*sizeof(uint8_t));
515 s->dsp.clear_blocks(h->mb);
8b82a956
MN
516 }
517
518 if (IS_INTRA16x16(mb_type) || (s->pict_type != I_TYPE && s->adaptive_quant && cbp)) {
519 s->qscale += svq3_get_se_golomb (&s->gb);
520
521 if (s->qscale > 31)
522 return -1;
523 }
524 if (IS_INTRA16x16(mb_type)) {
525 if (svq3_decode_block (&s->gb, h->mb, 0, 0))
526 return -1;
527 }
528
529 if (!IS_SKIP(mb_type) && cbp) {
530 l = IS_INTRA16x16(mb_type) ? 1 : 0;
531 m = ((s->qscale < 24 && IS_INTRA4x4(mb_type)) ? 2 : 1);
532
533 for (i=0; i < 4; i++) {
534 if ((cbp & (1 << i))) {
535 for (j=0; j < 4; j++) {
536 k = l ? ((j&1) + 2*(i&1) + 2*(j&2) + 4*(i&2)) : (4*i + j);
537 h->non_zero_count_cache[ scan8[k] ] = 1;
538
539 if (svq3_decode_block (&s->gb, &h->mb[16*k], l, m))
540 return -1;
541 }
542 }
543 }
544
545 if ((cbp & 0x30)) {
546 for (i=0; i < 2; ++i) {
547 if (svq3_decode_block (&s->gb, &h->mb[16*(16 + 4*i)], 0, 3))
548 return -1;
549 }
550
551 if ((cbp & 0x20)) {
552 for (i=0; i < 8; i++) {
553 h->non_zero_count_cache[ scan8[16+i] ] = 1;
554
555 if (svq3_decode_block (&s->gb, &h->mb[16*(16 + i)], 1, 1))
556 return -1;
557 }
558 }
559 }
560 }
561
562 s->current_picture.mb_type[mb_xy] = mb_type;
563
564 if (IS_INTRA(mb_type)) {
565 h->chroma_pred_mode = check_intra_pred_mode (h, DC_PRED8x8);
566 }
567
568 return 0;
569}
570
571static int svq3_decode_frame (AVCodecContext *avctx,
572 void *data, int *data_size,
573 uint8_t *buf, int buf_size) {
574 MpegEncContext *const s = avctx->priv_data;
575 H264Context *const h = avctx->priv_data;
576 int i;
577
578 s->flags = avctx->flags;
4c701ac8 579
8b82a956 580 if (!s->context_initialized) {
4c701ac8
MN
581 s->width = avctx->width;
582 s->height = avctx->height;
8b82a956
MN
583 h->pred4x4[DIAG_DOWN_LEFT_PRED] = pred4x4_down_left_svq3_c;
584 h->pred16x16[PLANE_PRED8x8] = pred16x16_plane_svq3_c;
585 h->halfpel_flag = 1;
586 h->thirdpel_flag = 1;
587 h->chroma_qp = 4;
588
589 if (MPV_common_init (s) < 0)
590 return -1;
591
4c701ac8
MN
592 h->b_stride = 4*s->mb_width;
593
8b82a956
MN
594 alloc_tables (h);
595 }
4c701ac8
MN
596
597 s->low_delay= 1;
598
89a79364
MM
599 if (avctx->extradata && avctx->extradata_size >= 0x63
600 && !memcmp (avctx->extradata, "SVQ3", 4)) {
8b82a956 601
89a79364 602 uint8_t *stsd = (uint8_t *) avctx->extradata + 0x62;
8b82a956 603
89a79364 604 if ((*stsd >> 5) != 7 || avctx->extradata_size >= 0x66) {
8b82a956
MN
605
606 if ((*stsd >> 5) == 7) {
607 stsd += 3; /* skip width, height (12 bits each) */
608 }
609
610 h->halfpel_flag = (*stsd >> 4) & 1;
611 h->thirdpel_flag = (*stsd >> 3) & 1;
612 }
613 }
614
615 if ((buf[0] & 0x9F) != 1) {
616 /* TODO: what? */
617 fprintf (stderr, "unsupported header (%02X)\n", buf[0]);
618 return -1;
619 } else {
620 int length = (buf[0] >> 5) & 3;
621 int offset = 0;
622
623 for (i=0; i < length; i++) {
624 offset = (offset << 8) | buf[i + 1];
625 }
626
627 if (buf_size < (offset + length + 1) || length == 0)
628 return -1;
629
630 memcpy (&buf[2], &buf[offset + 2], (length - 1));
631 }
632
633 init_get_bits (&s->gb, &buf[2], 8*(buf_size - 2));
634
635 if ((i = svq3_get_ue_golomb (&s->gb)) == INVALID_VLC || i >= 3)
636 return -1;
637
638 s->pict_type = golomb_to_pict_type[i];
639
640 /* unknown fields */
641 get_bits (&s->gb, 1);
642 get_bits (&s->gb, 8);
643
644 s->qscale = get_bits (&s->gb, 5);
645 s->adaptive_quant = get_bits (&s->gb, 1);
646
647 /* unknown fields */
648 get_bits (&s->gb, 1);
649 get_bits (&s->gb, 1);
650 get_bits (&s->gb, 2);
651
652 while (get_bits (&s->gb, 1)) {
653 get_bits (&s->gb, 8);
654 }
4704097a
MN
655
656 if(avctx->debug&FF_DEBUG_PICT_INFO){
657 printf("%c hpel:%d, tpel:%d aqp:%d qp:%d\n",
d8085ea7 658 av_get_pict_type_char(s->pict_type), h->halfpel_flag, h->thirdpel_flag,
4704097a
MN
659 s->adaptive_quant, s->qscale
660 );
661 }
8b82a956
MN
662
663 /* B-frames are not supported */
664 if (s->pict_type == B_TYPE/* && avctx->hurry_up*/)
665 return buf_size;
666
667 frame_start (h);
668
f7a8c179
MN
669 for(i=0; i<4; i++){
670 int j;
671 for(j=-1; j<4; j++)
672 h->ref_cache[0][scan8[0] + 8*i + j]= 1;
673 h->ref_cache[0][scan8[0] + 8*i + j]= PART_NOT_AVAILABLE;
674 }
675
8b82a956
MN
676 for (s->mb_y=0; s->mb_y < s->mb_height; s->mb_y++) {
677 for (s->mb_x=0; s->mb_x < s->mb_width; s->mb_x++) {
678 int mb_type = svq3_get_ue_golomb (&s->gb);
679
680 if (s->pict_type == I_TYPE) {
681 mb_type += 8;
682 }
683 if (mb_type > 32 || svq3_decode_mb (h, mb_type)) {
684 fprintf (stderr, "error while decoding MB %d %d\n", s->mb_x, s->mb_y);
685 return -1;
686 }
687
688 if (mb_type != 0) {
689 hl_decode_mb (h);
690 }
691 }
4c701ac8
MN
692
693 ff_draw_horiz_band(s, 16*s->mb_y, 16);
8b82a956
MN
694 }
695
696 *(AVFrame *) data = *(AVFrame *) &s->current_picture;
697 *data_size = sizeof(AVFrame);
698
699 MPV_frame_end(s);
700
701 return buf_size;
702}
703
704
705AVCodec svq3_decoder = {
706 "svq3",
707 CODEC_TYPE_VIDEO,
708 CODEC_ID_SVQ3,
709 sizeof(H264Context),
710 decode_init,
711 NULL,
712 decode_end,
713 svq3_decode_frame,
4c701ac8 714 CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1,
8b82a956 715};