r1009: Move the dependencies to newer package names
[cinelerra_cv/mob.git] / quicktime / ffmpeg / libavcodec / svq3.c
blobf0f995acfa924466257d18dd973de31f63ea6033
1 /*
2 * Copyright (c) 2003 The FFmpeg Project.
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.
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.
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
19 * How to use this decoder:
20 * SVQ3 data is transported within Apple Quicktime files. Quicktime files
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
27 * via the AVCodecContext's extradata[_size] field:
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)
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
41 /**
42 * @file svq3.c
43 * svq3 decoder.
46 #define FULLPEL_MODE 1
47 #define HALFPEL_MODE 2
48 #define THIRDPEL_MODE 3
49 #define PREDICT_MODE 4
51 /* dual scan (from some older h264 draft)
52 o-->o-->o o
53 | /|
54 o o o / o
55 | / | |/ |
56 o o o o
58 o-->o-->o-->o
60 static const uint8_t svq3_scan[16]={
61 0+0*4, 1+0*4, 2+0*4, 2+1*4,
62 2+2*4, 3+0*4, 3+1*4, 3+2*4,
63 0+1*4, 0+2*4, 1+1*4, 1+2*4,
64 0+3*4, 1+3*4, 2+3*4, 3+3*4,
67 static const uint8_t svq3_pred_0[25][2] = {
68 { 0, 0 },
69 { 1, 0 }, { 0, 1 },
70 { 0, 2 }, { 1, 1 }, { 2, 0 },
71 { 3, 0 }, { 2, 1 }, { 1, 2 }, { 0, 3 },
72 { 0, 4 }, { 1, 3 }, { 2, 2 }, { 3, 1 }, { 4, 0 },
73 { 4, 1 }, { 3, 2 }, { 2, 3 }, { 1, 4 },
74 { 2, 4 }, { 3, 3 }, { 4, 2 },
75 { 4, 3 }, { 3, 4 },
76 { 4, 4 }
79 static const int8_t svq3_pred_1[6][6][5] = {
80 { { 2,-1,-1,-1,-1 }, { 2, 1,-1,-1,-1 }, { 1, 2,-1,-1,-1 },
81 { 2, 1,-1,-1,-1 }, { 1, 2,-1,-1,-1 }, { 1, 2,-1,-1,-1 } },
82 { { 0, 2,-1,-1,-1 }, { 0, 2, 1, 4, 3 }, { 0, 1, 2, 4, 3 },
83 { 0, 2, 1, 4, 3 }, { 2, 0, 1, 3, 4 }, { 0, 4, 2, 1, 3 } },
84 { { 2, 0,-1,-1,-1 }, { 2, 1, 0, 4, 3 }, { 1, 2, 4, 0, 3 },
85 { 2, 1, 0, 4, 3 }, { 2, 1, 4, 3, 0 }, { 1, 2, 4, 0, 3 } },
86 { { 2, 0,-1,-1,-1 }, { 2, 0, 1, 4, 3 }, { 1, 2, 0, 4, 3 },
87 { 2, 1, 0, 4, 3 }, { 2, 1, 3, 4, 0 }, { 2, 4, 1, 0, 3 } },
88 { { 0, 2,-1,-1,-1 }, { 0, 2, 1, 3, 4 }, { 1, 2, 3, 0, 4 },
89 { 2, 0, 1, 3, 4 }, { 2, 1, 3, 0, 4 }, { 2, 0, 4, 3, 1 } },
90 { { 0, 2,-1,-1,-1 }, { 0, 2, 4, 1, 3 }, { 1, 4, 2, 0, 3 },
91 { 4, 2, 0, 1, 3 }, { 2, 0, 1, 4, 3 }, { 4, 2, 1, 0, 3 } },
94 static const struct { uint8_t run; uint8_t level; } svq3_dct_tables[2][16] = {
95 { { 0, 0 }, { 0, 1 }, { 1, 1 }, { 2, 1 }, { 0, 2 }, { 3, 1 }, { 4, 1 }, { 5, 1 },
96 { 0, 3 }, { 1, 2 }, { 2, 2 }, { 6, 1 }, { 7, 1 }, { 8, 1 }, { 9, 1 }, { 0, 4 } },
97 { { 0, 0 }, { 0, 1 }, { 1, 1 }, { 0, 2 }, { 2, 1 }, { 0, 3 }, { 0, 4 }, { 0, 5 },
98 { 3, 1 }, { 4, 1 }, { 1, 2 }, { 1, 3 }, { 0, 6 }, { 0, 7 }, { 0, 8 }, { 0, 9 } }
101 static const uint32_t svq3_dequant_coeff[32] = {
102 3881, 4351, 4890, 5481, 6154, 6914, 7761, 8718,
103 9781, 10987, 12339, 13828, 15523, 17435, 19561, 21873,
104 24552, 27656, 30847, 34870, 38807, 43747, 49103, 54683,
105 61694, 68745, 77615, 89113,100253,109366,126635,141533
109 static void svq3_luma_dc_dequant_idct_c(DCTELEM *block, int qp){
110 const int qmul= svq3_dequant_coeff[qp];
111 #define stride 16
112 int i;
113 int temp[16];
114 static const int x_offset[4]={0, 1*stride, 4* stride, 5*stride};
115 static const int y_offset[4]={0, 2*stride, 8* stride, 10*stride};
117 for(i=0; i<4; i++){
118 const int offset= y_offset[i];
119 const int z0= 13*(block[offset+stride*0] + block[offset+stride*4]);
120 const int z1= 13*(block[offset+stride*0] - block[offset+stride*4]);
121 const int z2= 7* block[offset+stride*1] - 17*block[offset+stride*5];
122 const int z3= 17* block[offset+stride*1] + 7*block[offset+stride*5];
124 temp[4*i+0]= z0+z3;
125 temp[4*i+1]= z1+z2;
126 temp[4*i+2]= z1-z2;
127 temp[4*i+3]= z0-z3;
130 for(i=0; i<4; i++){
131 const int offset= x_offset[i];
132 const int z0= 13*(temp[4*0+i] + temp[4*2+i]);
133 const int z1= 13*(temp[4*0+i] - temp[4*2+i]);
134 const int z2= 7* temp[4*1+i] - 17*temp[4*3+i];
135 const int z3= 17* temp[4*1+i] + 7*temp[4*3+i];
137 block[stride*0 +offset]= ((z0 + z3)*qmul + 0x80000)>>20;
138 block[stride*2 +offset]= ((z1 + z2)*qmul + 0x80000)>>20;
139 block[stride*8 +offset]= ((z1 - z2)*qmul + 0x80000)>>20;
140 block[stride*10+offset]= ((z0 - z3)*qmul + 0x80000)>>20;
143 #undef stride
145 static void svq3_add_idct_c (uint8_t *dst, DCTELEM *block, int stride, int qp, int dc){
146 const int qmul= svq3_dequant_coeff[qp];
147 int i;
148 uint8_t *cm = cropTbl + MAX_NEG_CROP;
150 if (dc) {
151 dc = 13*13*((dc == 1) ? 1538*block[0] : ((qmul*(block[0] >> 3)) / 2));
152 block[0] = 0;
155 for (i=0; i < 4; i++) {
156 const int z0= 13*(block[0 + 4*i] + block[2 + 4*i]);
157 const int z1= 13*(block[0 + 4*i] - block[2 + 4*i]);
158 const int z2= 7* block[1 + 4*i] - 17*block[3 + 4*i];
159 const int z3= 17* block[1 + 4*i] + 7*block[3 + 4*i];
161 block[0 + 4*i]= z0 + z3;
162 block[1 + 4*i]= z1 + z2;
163 block[2 + 4*i]= z1 - z2;
164 block[3 + 4*i]= z0 - z3;
167 for (i=0; i < 4; i++) {
168 const int z0= 13*(block[i + 4*0] + block[i + 4*2]);
169 const int z1= 13*(block[i + 4*0] - block[i + 4*2]);
170 const int z2= 7* block[i + 4*1] - 17*block[i + 4*3];
171 const int z3= 17* block[i + 4*1] + 7*block[i + 4*3];
172 const int rr= (dc + 0x80000);
174 dst[i + stride*0]= cm[ dst[i + stride*0] + (((z0 + z3)*qmul + rr) >> 20) ];
175 dst[i + stride*1]= cm[ dst[i + stride*1] + (((z1 + z2)*qmul + rr) >> 20) ];
176 dst[i + stride*2]= cm[ dst[i + stride*2] + (((z1 - z2)*qmul + rr) >> 20) ];
177 dst[i + stride*3]= cm[ dst[i + stride*3] + (((z0 - z3)*qmul + rr) >> 20) ];
181 static void pred4x4_down_left_svq3_c(uint8_t *src, uint8_t *topright, int stride){
182 LOAD_TOP_EDGE
183 LOAD_LEFT_EDGE
184 const __attribute__((unused)) int unu0= t0;
185 const __attribute__((unused)) int unu1= l0;
187 src[0+0*stride]=(l1 + t1)>>1;
188 src[1+0*stride]=
189 src[0+1*stride]=(l2 + t2)>>1;
190 src[2+0*stride]=
191 src[1+1*stride]=
192 src[0+2*stride]=
193 src[3+0*stride]=
194 src[2+1*stride]=
195 src[1+2*stride]=
196 src[0+3*stride]=
197 src[3+1*stride]=
198 src[2+2*stride]=
199 src[1+3*stride]=
200 src[3+2*stride]=
201 src[2+3*stride]=
202 src[3+3*stride]=(l3 + t3)>>1;
205 static void pred16x16_plane_svq3_c(uint8_t *src, int stride){
206 pred16x16_plane_compat_c(src, stride, 1);
209 static inline int svq3_decode_block (GetBitContext *gb, DCTELEM *block,
210 int index, const int type) {
212 static const uint8_t *const scan_patterns[4] =
213 { luma_dc_zigzag_scan, zigzag_scan, svq3_scan, chroma_dc_scan };
215 int run, level, sign, vlc, limit;
216 const int intra = (3 * type) >> 2;
217 const uint8_t *const scan = scan_patterns[type];
219 for (limit=(16 >> intra); index < 16; index=limit, limit+=8) {
220 for (; (vlc = svq3_get_ue_golomb (gb)) != 0; index++) {
222 if (vlc == INVALID_VLC)
223 return -1;
225 sign = (vlc & 0x1) - 1;
226 vlc = (vlc + 1) >> 1;
228 if (type == 3) {
229 if (vlc < 3) {
230 run = 0;
231 level = vlc;
232 } else if (vlc < 4) {
233 run = 1;
234 level = 1;
235 } else {
236 run = (vlc & 0x3);
237 level = ((vlc + 9) >> 2) - run;
239 } else {
240 if (vlc < 16) {
241 run = svq3_dct_tables[intra][vlc].run;
242 level = svq3_dct_tables[intra][vlc].level;
243 } else if (intra) {
244 run = (vlc & 0x7);
245 level = (vlc >> 3) + ((run == 0) ? 8 : ((run < 2) ? 2 : ((run < 5) ? 0 : -1)));
246 } else {
247 run = (vlc & 0xF);
248 level = (vlc >> 4) + ((run == 0) ? 4 : ((run < 3) ? 2 : ((run < 10) ? 1 : 0)));
252 if ((index += run) >= limit)
253 return -1;
255 block[scan[index]] = (level ^ sign) - sign;
258 if (type != 2) {
259 break;
263 return 0;
266 static inline void svq3_mc_dir_part (MpegEncContext *s,
267 int x, int y, int width, int height,
268 int mx, int my, int dxy,
269 int thirdpel, int dir, int avg) {
271 const Picture *pic = (dir == 0) ? &s->last_picture : &s->next_picture;
272 uint8_t *src, *dest;
273 int i, emu = 0;
274 int blocksize= 2 - (width>>3); //16->0, 8->1, 4->2
276 mx += x;
277 my += y;
279 if (mx < 0 || mx >= (s->h_edge_pos - width - 1) ||
280 my < 0 || my >= (s->v_edge_pos - height - 1)) {
282 if ((s->flags & CODEC_FLAG_EMU_EDGE)) {
283 emu = 1;
286 mx = clip (mx, -16, (s->h_edge_pos - width + 15));
287 my = clip (my, -16, (s->v_edge_pos - height + 15));
290 /* form component predictions */
291 dest = s->current_picture.data[0] + x + y*s->linesize;
292 src = pic->data[0] + mx + my*s->linesize;
294 if (emu) {
295 ff_emulated_edge_mc (s->edge_emu_buffer, src, s->linesize, (width + 1), (height + 1),
296 mx, my, s->h_edge_pos, s->v_edge_pos);
297 src = s->edge_emu_buffer;
299 if(thirdpel)
300 (avg ? s->dsp.avg_tpel_pixels_tab : s->dsp.put_tpel_pixels_tab)[dxy](dest, src, s->linesize, width, height);
301 else
302 (avg ? s->dsp.avg_pixels_tab : s->dsp.put_pixels_tab)[blocksize][dxy](dest, src, s->linesize, height);
304 if (!(s->flags & CODEC_FLAG_GRAY)) {
305 mx = (mx + (mx < (int) x)) >> 1;
306 my = (my + (my < (int) y)) >> 1;
307 width = (width >> 1);
308 height = (height >> 1);
309 blocksize++;
311 for (i=1; i < 3; i++) {
312 dest = s->current_picture.data[i] + (x >> 1) + (y >> 1)*s->uvlinesize;
313 src = pic->data[i] + mx + my*s->uvlinesize;
315 if (emu) {
316 ff_emulated_edge_mc (s->edge_emu_buffer, src, s->uvlinesize, (width + 1), (height + 1),
317 mx, my, (s->h_edge_pos >> 1), (s->v_edge_pos >> 1));
318 src = s->edge_emu_buffer;
320 if(thirdpel)
321 (avg ? s->dsp.avg_tpel_pixels_tab : s->dsp.put_tpel_pixels_tab)[dxy](dest, src, s->uvlinesize, width, height);
322 else
323 (avg ? s->dsp.avg_pixels_tab : s->dsp.put_pixels_tab)[blocksize][dxy](dest, src, s->uvlinesize, height);
328 static inline int svq3_mc_dir (H264Context *h, int size, int mode, int dir, int avg) {
330 int i, j, k, mx, my, dx, dy, x, y;
331 MpegEncContext *const s = (MpegEncContext *) h;
332 const int part_width = ((size & 5) == 4) ? 4 : 16 >> (size & 1);
333 const int part_height = 16 >> ((unsigned) (size + 1) / 3);
334 const int extra_width = (mode == PREDICT_MODE) ? -16*6 : 0;
335 const int h_edge_pos = 6*(s->h_edge_pos - part_width ) - extra_width;
336 const int v_edge_pos = 6*(s->v_edge_pos - part_height) - extra_width;
338 for (i=0; i < 16; i+=part_height) {
339 for (j=0; j < 16; j+=part_width) {
340 const int b_xy = (4*s->mb_x+(j>>2)) + (4*s->mb_y+(i>>2))*h->b_stride;
341 int dxy;
342 x = 16*s->mb_x + j;
343 y = 16*s->mb_y + i;
344 k = ((j>>2)&1) + ((i>>1)&2) + ((j>>1)&4) + (i&8);
346 if (mode != PREDICT_MODE) {
347 pred_motion (h, k, (part_width >> 2), dir, 1, &mx, &my);
348 } else {
349 mx = s->next_picture.motion_val[0][b_xy][0]<<1;
350 my = s->next_picture.motion_val[0][b_xy][1]<<1;
352 if (dir == 0) {
353 mx = ((mx * h->frame_num_offset) / h->prev_frame_num_offset + 1)>>1;
354 my = ((my * h->frame_num_offset) / h->prev_frame_num_offset + 1)>>1;
355 } else {
356 mx = ((mx * (h->frame_num_offset - h->prev_frame_num_offset)) / h->prev_frame_num_offset + 1)>>1;
357 my = ((my * (h->frame_num_offset - h->prev_frame_num_offset)) / h->prev_frame_num_offset + 1)>>1;
361 /* clip motion vector prediction to frame border */
362 mx = clip (mx, extra_width - 6*x, h_edge_pos - 6*x);
363 my = clip (my, extra_width - 6*y, v_edge_pos - 6*y);
365 /* get (optional) motion vector differential */
366 if (mode == PREDICT_MODE) {
367 dx = dy = 0;
368 } else {
369 dy = svq3_get_se_golomb (&s->gb);
370 dx = svq3_get_se_golomb (&s->gb);
372 if (dx == INVALID_VLC || dy == INVALID_VLC) {
373 av_log(h->s.avctx, AV_LOG_ERROR, "invalid MV vlc\n");
374 return -1;
378 /* compute motion vector */
379 if (mode == THIRDPEL_MODE) {
380 int fx, fy;
381 mx = ((mx + 1)>>1) + dx;
382 my = ((my + 1)>>1) + dy;
383 fx= ((unsigned)(mx + 0x3000))/3 - 0x1000;
384 fy= ((unsigned)(my + 0x3000))/3 - 0x1000;
385 dxy= (mx - 3*fx) + 4*(my - 3*fy);
387 svq3_mc_dir_part (s, x, y, part_width, part_height, fx, fy, dxy, 1, dir, avg);
388 mx += mx;
389 my += my;
390 } else if (mode == HALFPEL_MODE || mode == PREDICT_MODE) {
391 mx = ((unsigned)(mx + 1 + 0x3000))/3 + dx - 0x1000;
392 my = ((unsigned)(my + 1 + 0x3000))/3 + dy - 0x1000;
393 dxy= (mx&1) + 2*(my&1);
395 svq3_mc_dir_part (s, x, y, part_width, part_height, mx>>1, my>>1, dxy, 0, dir, avg);
396 mx *= 3;
397 my *= 3;
398 } else {
399 mx = ((unsigned)(mx + 3 + 0x6000))/6 + dx - 0x1000;
400 my = ((unsigned)(my + 3 + 0x6000))/6 + dy - 0x1000;
402 svq3_mc_dir_part (s, x, y, part_width, part_height, mx, my, 0, 0, dir, avg);
403 mx *= 6;
404 my *= 6;
407 /* update mv_cache */
408 if (mode != PREDICT_MODE) {
409 int32_t mv = pack16to32(mx,my);
411 if (part_height == 8 && i < 8) {
412 *(int32_t *) h->mv_cache[dir][scan8[k] + 1*8] = mv;
414 if (part_width == 8 && j < 8) {
415 *(int32_t *) h->mv_cache[dir][scan8[k] + 1 + 1*8] = mv;
418 if (part_width == 8 && j < 8) {
419 *(int32_t *) h->mv_cache[dir][scan8[k] + 1] = mv;
421 if (part_width == 4 || part_height == 4) {
422 *(int32_t *) h->mv_cache[dir][scan8[k]] = mv;
426 /* write back motion vectors */
427 fill_rectangle(s->current_picture.motion_val[dir][b_xy], part_width>>2, part_height>>2, h->b_stride, pack16to32(mx,my), 4);
431 return 0;
434 static int svq3_decode_mb (H264Context *h, unsigned int mb_type) {
435 int i, j, k, m, dir, mode;
436 int cbp = 0;
437 uint32_t vlc;
438 int8_t *top, *left;
439 MpegEncContext *const s = (MpegEncContext *) h;
440 const int mb_xy = s->mb_x + s->mb_y*s->mb_stride;
441 const int b_xy = 4*s->mb_x + 4*s->mb_y*h->b_stride;
443 h->top_samples_available = (s->mb_y == 0) ? 0x33FF : 0xFFFF;
444 h->left_samples_available = (s->mb_x == 0) ? 0x5F5F : 0xFFFF;
445 h->topright_samples_available = 0xFFFF;
447 if (mb_type == 0) { /* SKIP */
448 if (s->pict_type == P_TYPE || s->next_picture.mb_type[mb_xy] == -1) {
449 svq3_mc_dir_part (s, 16*s->mb_x, 16*s->mb_y, 16, 16, 0, 0, 0, 0, 0, 0);
451 if (s->pict_type == B_TYPE) {
452 svq3_mc_dir_part (s, 16*s->mb_x, 16*s->mb_y, 16, 16, 0, 0, 0, 0, 1, 1);
455 mb_type = MB_TYPE_SKIP;
456 } else {
457 mb_type= FFMIN(s->next_picture.mb_type[mb_xy], 6);
458 if(svq3_mc_dir (h, mb_type, PREDICT_MODE, 0, 0) < 0)
459 return -1;
460 if(svq3_mc_dir (h, mb_type, PREDICT_MODE, 1, 1) < 0)
461 return -1;
463 mb_type = MB_TYPE_16x16;
465 } else if (mb_type < 8) { /* INTER */
466 if (h->thirdpel_flag && h->halfpel_flag == !get_bits (&s->gb, 1)) {
467 mode = THIRDPEL_MODE;
468 } else if (h->halfpel_flag && h->thirdpel_flag == !get_bits (&s->gb, 1)) {
469 mode = HALFPEL_MODE;
470 } else {
471 mode = FULLPEL_MODE;
474 /* fill caches */
475 /* note ref_cache should contain here:
476 ????????
477 ???11111
478 N??11111
479 N??11111
480 N??11111
484 for (m=0; m < 2; m++) {
485 if (s->mb_x > 0 && h->intra4x4_pred_mode[mb_xy - 1][0] != -1) {
486 for (i=0; i < 4; i++) {
487 *(uint32_t *) h->mv_cache[m][scan8[0] - 1 + i*8] = *(uint32_t *) s->current_picture.motion_val[m][b_xy - 1 + i*h->b_stride];
489 } else {
490 for (i=0; i < 4; i++) {
491 *(uint32_t *) h->mv_cache[m][scan8[0] - 1 + i*8] = 0;
494 if (s->mb_y > 0) {
495 memcpy (h->mv_cache[m][scan8[0] - 1*8], s->current_picture.motion_val[m][b_xy - h->b_stride], 4*2*sizeof(int16_t));
496 memset (&h->ref_cache[m][scan8[0] - 1*8], (h->intra4x4_pred_mode[mb_xy - s->mb_stride][4] == -1) ? PART_NOT_AVAILABLE : 1, 4);
498 if (s->mb_x < (s->mb_width - 1)) {
499 *(uint32_t *) h->mv_cache[m][scan8[0] + 4 - 1*8] = *(uint32_t *) s->current_picture.motion_val[m][b_xy - h->b_stride + 4];
500 h->ref_cache[m][scan8[0] + 4 - 1*8] =
501 (h->intra4x4_pred_mode[mb_xy - s->mb_stride + 1][0] == -1 ||
502 h->intra4x4_pred_mode[mb_xy - s->mb_stride][4] == -1) ? PART_NOT_AVAILABLE : 1;
503 }else
504 h->ref_cache[m][scan8[0] + 4 - 1*8] = PART_NOT_AVAILABLE;
505 if (s->mb_x > 0) {
506 *(uint32_t *) h->mv_cache[m][scan8[0] - 1 - 1*8] = *(uint32_t *) s->current_picture.motion_val[m][b_xy - h->b_stride - 1];
507 h->ref_cache[m][scan8[0] - 1 - 1*8] = (h->intra4x4_pred_mode[mb_xy - s->mb_stride - 1][3] == -1) ? PART_NOT_AVAILABLE : 1;
508 }else
509 h->ref_cache[m][scan8[0] - 1 - 1*8] = PART_NOT_AVAILABLE;
510 }else
511 memset (&h->ref_cache[m][scan8[0] - 1*8 - 1], PART_NOT_AVAILABLE, 8);
513 if (s->pict_type != B_TYPE)
514 break;
517 /* decode motion vector(s) and form prediction(s) */
518 if (s->pict_type == P_TYPE) {
519 if(svq3_mc_dir (h, (mb_type - 1), mode, 0, 0) < 0)
520 return -1;
521 } else { /* B_TYPE */
522 if (mb_type != 2) {
523 if(svq3_mc_dir (h, 0, mode, 0, 0) < 0)
524 return -1;
525 } else {
526 for (i=0; i < 4; i++) {
527 memset (s->current_picture.motion_val[0][b_xy + i*h->b_stride], 0, 4*2*sizeof(int16_t));
530 if (mb_type != 1) {
531 if(svq3_mc_dir (h, 0, mode, 1, (mb_type == 3)) < 0)
532 return -1;
533 } else {
534 for (i=0; i < 4; i++) {
535 memset (s->current_picture.motion_val[1][b_xy + i*h->b_stride], 0, 4*2*sizeof(int16_t));
540 mb_type = MB_TYPE_16x16;
541 } else if (mb_type == 8 || mb_type == 33) { /* INTRA4x4 */
542 memset (h->intra4x4_pred_mode_cache, -1, 8*5*sizeof(int8_t));
544 if (mb_type == 8) {
545 if (s->mb_x > 0) {
546 for (i=0; i < 4; i++) {
547 h->intra4x4_pred_mode_cache[scan8[0] - 1 + i*8] = h->intra4x4_pred_mode[mb_xy - 1][i];
549 if (h->intra4x4_pred_mode_cache[scan8[0] - 1] == -1) {
550 h->left_samples_available = 0x5F5F;
553 if (s->mb_y > 0) {
554 h->intra4x4_pred_mode_cache[4+8*0] = h->intra4x4_pred_mode[mb_xy - s->mb_stride][4];
555 h->intra4x4_pred_mode_cache[5+8*0] = h->intra4x4_pred_mode[mb_xy - s->mb_stride][5];
556 h->intra4x4_pred_mode_cache[6+8*0] = h->intra4x4_pred_mode[mb_xy - s->mb_stride][6];
557 h->intra4x4_pred_mode_cache[7+8*0] = h->intra4x4_pred_mode[mb_xy - s->mb_stride][3];
559 if (h->intra4x4_pred_mode_cache[4+8*0] == -1) {
560 h->top_samples_available = 0x33FF;
564 /* decode prediction codes for luma blocks */
565 for (i=0; i < 16; i+=2) {
566 vlc = svq3_get_ue_golomb (&s->gb);
568 if (vlc >= 25){
569 av_log(h->s.avctx, AV_LOG_ERROR, "luma prediction:%d\n", vlc);
570 return -1;
573 left = &h->intra4x4_pred_mode_cache[scan8[i] - 1];
574 top = &h->intra4x4_pred_mode_cache[scan8[i] - 8];
576 left[1] = svq3_pred_1[top[0] + 1][left[0] + 1][svq3_pred_0[vlc][0]];
577 left[2] = svq3_pred_1[top[1] + 1][left[1] + 1][svq3_pred_0[vlc][1]];
579 if (left[1] == -1 || left[2] == -1){
580 av_log(h->s.avctx, AV_LOG_ERROR, "weird prediction\n");
581 return -1;
584 } else { /* mb_type == 33, DC_128_PRED block type */
585 for (i=0; i < 4; i++) {
586 memset (&h->intra4x4_pred_mode_cache[scan8[0] + 8*i], DC_PRED, 4);
590 write_back_intra_pred_mode (h);
592 if (mb_type == 8) {
593 check_intra4x4_pred_mode (h);
595 h->top_samples_available = (s->mb_y == 0) ? 0x33FF : 0xFFFF;
596 h->left_samples_available = (s->mb_x == 0) ? 0x5F5F : 0xFFFF;
597 } else {
598 for (i=0; i < 4; i++) {
599 memset (&h->intra4x4_pred_mode_cache[scan8[0] + 8*i], DC_128_PRED, 4);
602 h->top_samples_available = 0x33FF;
603 h->left_samples_available = 0x5F5F;
606 mb_type = MB_TYPE_INTRA4x4;
607 } else { /* INTRA16x16 */
608 dir = i_mb_type_info[mb_type - 8].pred_mode;
609 dir = (dir >> 1) ^ 3*(dir & 1) ^ 1;
611 if ((h->intra16x16_pred_mode = check_intra_pred_mode (h, dir)) == -1){
612 av_log(h->s.avctx, AV_LOG_ERROR, "check_intra_pred_mode = -1\n");
613 return -1;
616 cbp = i_mb_type_info[mb_type - 8].cbp;
617 mb_type = MB_TYPE_INTRA16x16;
620 if (!IS_INTER(mb_type) && s->pict_type != I_TYPE) {
621 for (i=0; i < 4; i++) {
622 memset (s->current_picture.motion_val[0][b_xy + i*h->b_stride], 0, 4*2*sizeof(int16_t));
624 if (s->pict_type == B_TYPE) {
625 for (i=0; i < 4; i++) {
626 memset (s->current_picture.motion_val[1][b_xy + i*h->b_stride], 0, 4*2*sizeof(int16_t));
630 if (!IS_INTRA4x4(mb_type)) {
631 memset (h->intra4x4_pred_mode[mb_xy], DC_PRED, 8);
633 if (!IS_SKIP(mb_type) || s->pict_type == B_TYPE) {
634 memset (h->non_zero_count_cache + 8, 0, 4*9*sizeof(uint8_t));
635 s->dsp.clear_blocks(h->mb);
638 if (!IS_INTRA16x16(mb_type) && (!IS_SKIP(mb_type) || s->pict_type == B_TYPE)) {
639 if ((vlc = svq3_get_ue_golomb (&s->gb)) >= 48){
640 av_log(h->s.avctx, AV_LOG_ERROR, "cbp_vlc=%d\n", vlc);
641 return -1;
644 cbp = IS_INTRA(mb_type) ? golomb_to_intra4x4_cbp[vlc] : golomb_to_inter_cbp[vlc];
646 if (IS_INTRA16x16(mb_type) || (s->pict_type != I_TYPE && s->adaptive_quant && cbp)) {
647 s->qscale += svq3_get_se_golomb (&s->gb);
649 if (s->qscale > 31){
650 av_log(h->s.avctx, AV_LOG_ERROR, "qscale:%d\n", s->qscale);
651 return -1;
654 if (IS_INTRA16x16(mb_type)) {
655 if (svq3_decode_block (&s->gb, h->mb, 0, 0)){
656 av_log(h->s.avctx, AV_LOG_ERROR, "error while decoding intra luma dc\n");
657 return -1;
661 if (cbp) {
662 const int index = IS_INTRA16x16(mb_type) ? 1 : 0;
663 const int type = ((s->qscale < 24 && IS_INTRA4x4(mb_type)) ? 2 : 1);
665 for (i=0; i < 4; i++) {
666 if ((cbp & (1 << i))) {
667 for (j=0; j < 4; j++) {
668 k = index ? ((j&1) + 2*(i&1) + 2*(j&2) + 4*(i&2)) : (4*i + j);
669 h->non_zero_count_cache[ scan8[k] ] = 1;
671 if (svq3_decode_block (&s->gb, &h->mb[16*k], index, type)){
672 av_log(h->s.avctx, AV_LOG_ERROR, "error while decoding block\n");
673 return -1;
679 if ((cbp & 0x30)) {
680 for (i=0; i < 2; ++i) {
681 if (svq3_decode_block (&s->gb, &h->mb[16*(16 + 4*i)], 0, 3)){
682 av_log(h->s.avctx, AV_LOG_ERROR, "error while decoding chroma dc block\n");
683 return -1;
687 if ((cbp & 0x20)) {
688 for (i=0; i < 8; i++) {
689 h->non_zero_count_cache[ scan8[16+i] ] = 1;
691 if (svq3_decode_block (&s->gb, &h->mb[16*(16 + i)], 1, 1)){
692 av_log(h->s.avctx, AV_LOG_ERROR, "error while decoding chroma ac block\n");
693 return -1;
700 s->current_picture.mb_type[mb_xy] = mb_type;
702 if (IS_INTRA(mb_type)) {
703 h->chroma_pred_mode = check_intra_pred_mode (h, DC_PRED8x8);
706 return 0;
709 static int svq3_decode_slice_header (H264Context *h) {
710 MpegEncContext *const s = (MpegEncContext *) h;
711 const int mb_xy = s->mb_x + s->mb_y*s->mb_stride;
712 int i, header;
714 header = get_bits (&s->gb, 8);
716 if (((header & 0x9F) != 1 && (header & 0x9F) != 2) || (header & 0x60) == 0) {
717 /* TODO: what? */
718 av_log(h->s.avctx, AV_LOG_ERROR, "unsupported slice header (%02X)\n", header);
719 return -1;
720 } else {
721 int length = (header >> 5) & 3;
723 h->next_slice_index = get_bits_count(&s->gb) + 8*show_bits (&s->gb, 8*length) + 8*length;
725 if (h->next_slice_index > s->gb.size_in_bits){
726 av_log(h->s.avctx, AV_LOG_ERROR, "slice after bitstream end\n");
727 return -1;
730 s->gb.size_in_bits = h->next_slice_index - 8*(length - 1);
731 skip_bits(&s->gb, 8);
733 if (length > 0) {
734 memcpy ((uint8_t *) &s->gb.buffer[get_bits_count(&s->gb) >> 3],
735 &s->gb.buffer[s->gb.size_in_bits >> 3], (length - 1));
739 if ((i = svq3_get_ue_golomb (&s->gb)) == INVALID_VLC || i >= 3){
740 av_log(h->s.avctx, AV_LOG_ERROR, "illegal slice type %d \n", i);
741 return -1;
744 h->slice_type = golomb_to_pict_type[i];
746 if ((header & 0x9F) == 2) {
747 i = (s->mb_num < 64) ? 6 : (1 + av_log2 (s->mb_num - 1));
748 s->mb_skip_run = get_bits (&s->gb, i) - (s->mb_x + (s->mb_y * s->mb_width));
749 } else {
750 get_bits1 (&s->gb);
751 s->mb_skip_run = 0;
754 h->slice_num = get_bits (&s->gb, 8);
755 s->qscale = get_bits (&s->gb, 5);
756 s->adaptive_quant = get_bits1 (&s->gb);
758 /* unknown fields */
759 get_bits1 (&s->gb);
761 if (h->unknown_svq3_flag) {
762 get_bits1 (&s->gb);
765 get_bits1 (&s->gb);
766 get_bits (&s->gb, 2);
768 while (get_bits1 (&s->gb)) {
769 get_bits (&s->gb, 8);
772 /* reset intra predictors and invalidate motion vector references */
773 if (s->mb_x > 0) {
774 memset (h->intra4x4_pred_mode[mb_xy - 1], -1, 4*sizeof(int8_t));
775 memset (h->intra4x4_pred_mode[mb_xy - s->mb_x], -1, 8*sizeof(int8_t)*s->mb_x);
777 if (s->mb_y > 0) {
778 memset (h->intra4x4_pred_mode[mb_xy - s->mb_stride], -1, 8*sizeof(int8_t)*(s->mb_width - s->mb_x));
780 if (s->mb_x > 0) {
781 h->intra4x4_pred_mode[mb_xy - s->mb_stride - 1][3] = -1;
785 return 0;
788 static int svq3_decode_frame (AVCodecContext *avctx,
789 void *data, int *data_size,
790 uint8_t *buf, int buf_size) {
791 MpegEncContext *const s = avctx->priv_data;
792 H264Context *const h = avctx->priv_data;
793 int m, mb_type;
794 unsigned char *extradata;
795 unsigned int size;
797 s->flags = avctx->flags;
798 s->flags2 = avctx->flags2;
799 s->unrestricted_mv = 1;
801 if (!s->context_initialized) {
802 s->width = avctx->width;
803 s->height = avctx->height;
804 h->pred4x4[DIAG_DOWN_LEFT_PRED] = pred4x4_down_left_svq3_c;
805 h->pred16x16[PLANE_PRED8x8] = pred16x16_plane_svq3_c;
806 h->halfpel_flag = 1;
807 h->thirdpel_flag = 1;
808 h->unknown_svq3_flag = 0;
809 h->chroma_qp = 4;
811 if (MPV_common_init (s) < 0)
812 return -1;
814 h->b_stride = 4*s->mb_width;
816 alloc_tables (h);
818 /* prowl for the "SEQH" marker in the extradata */
819 extradata = (unsigned char *)avctx->extradata;
820 for (m = 0; m < avctx->extradata_size; m++) {
821 if (!memcmp (extradata, "SEQH", 4))
822 break;
823 extradata++;
826 /* if a match was found, parse the extra data */
827 if (!memcmp (extradata, "SEQH", 4)) {
829 GetBitContext gb;
831 size = BE_32(&extradata[4]);
832 init_get_bits (&gb, extradata + 8, size);
834 /* 'frame size code' and optional 'width, height' */
835 if (get_bits (&gb, 3) == 7) {
836 get_bits (&gb, 12);
837 get_bits (&gb, 12);
840 h->halfpel_flag = get_bits1 (&gb);
841 h->thirdpel_flag = get_bits1 (&gb);
843 /* unknown fields */
844 get_bits1 (&gb);
845 get_bits1 (&gb);
846 get_bits1 (&gb);
847 get_bits1 (&gb);
849 s->low_delay = get_bits1 (&gb);
851 /* unknown field */
852 get_bits1 (&gb);
854 while (get_bits1 (&gb)) {
855 get_bits (&gb, 8);
858 h->unknown_svq3_flag = get_bits1 (&gb);
859 avctx->has_b_frames = !s->low_delay;
863 /* special case for last picture */
864 if (buf_size == 0) {
865 if (s->next_picture_ptr && !s->low_delay) {
866 *(AVFrame *) data = *(AVFrame *) &s->next_picture;
867 *data_size = sizeof(AVFrame);
869 return 0;
872 init_get_bits (&s->gb, buf, 8*buf_size);
874 s->mb_x = s->mb_y = 0;
876 if (svq3_decode_slice_header (h))
877 return -1;
879 s->pict_type = h->slice_type;
880 s->picture_number = h->slice_num;
882 if(avctx->debug&FF_DEBUG_PICT_INFO){
883 av_log(h->s.avctx, AV_LOG_DEBUG, "%c hpel:%d, tpel:%d aqp:%d qp:%d\n",
884 av_get_pict_type_char(s->pict_type), h->halfpel_flag, h->thirdpel_flag,
885 s->adaptive_quant, s->qscale
889 /* for hurry_up==5 */
890 s->current_picture.pict_type = s->pict_type;
891 s->current_picture.key_frame = (s->pict_type == I_TYPE);
893 /* skip b frames if we dont have reference frames */
894 if (s->last_picture_ptr == NULL && s->pict_type == B_TYPE) return 0;
895 /* skip b frames if we are in a hurry */
896 if (avctx->hurry_up && s->pict_type == B_TYPE) return 0;
897 /* skip everything if we are in a hurry >= 5 */
898 if (avctx->hurry_up >= 5) return 0;
899 if( (avctx->skip_frame >= AVDISCARD_NONREF && s->pict_type==B_TYPE)
900 ||(avctx->skip_frame >= AVDISCARD_NONKEY && s->pict_type!=I_TYPE)
901 || avctx->skip_frame >= AVDISCARD_ALL)
902 return 0;
904 if (s->next_p_frame_damaged) {
905 if (s->pict_type == B_TYPE)
906 return 0;
907 else
908 s->next_p_frame_damaged = 0;
911 frame_start (h);
913 if (s->pict_type == B_TYPE) {
914 h->frame_num_offset = (h->slice_num - h->prev_frame_num);
916 if (h->frame_num_offset < 0) {
917 h->frame_num_offset += 256;
919 if (h->frame_num_offset == 0 || h->frame_num_offset >= h->prev_frame_num_offset) {
920 av_log(h->s.avctx, AV_LOG_ERROR, "error in B-frame picture id\n");
921 return -1;
923 } else {
924 h->prev_frame_num = h->frame_num;
925 h->frame_num = h->slice_num;
926 h->prev_frame_num_offset = (h->frame_num - h->prev_frame_num);
928 if (h->prev_frame_num_offset < 0) {
929 h->prev_frame_num_offset += 256;
933 for(m=0; m<2; m++){
934 int i;
935 for(i=0; i<4; i++){
936 int j;
937 for(j=-1; j<4; j++)
938 h->ref_cache[m][scan8[0] + 8*i + j]= 1;
939 h->ref_cache[m][scan8[0] + 8*i + j]= PART_NOT_AVAILABLE;
943 for (s->mb_y=0; s->mb_y < s->mb_height; s->mb_y++) {
944 for (s->mb_x=0; s->mb_x < s->mb_width; s->mb_x++) {
946 if ( (get_bits_count(&s->gb) + 7) >= s->gb.size_in_bits &&
947 ((get_bits_count(&s->gb) & 7) == 0 || show_bits (&s->gb, (-get_bits_count(&s->gb) & 7)) == 0)) {
949 skip_bits(&s->gb, h->next_slice_index - get_bits_count(&s->gb));
950 s->gb.size_in_bits = 8*buf_size;
952 if (svq3_decode_slice_header (h))
953 return -1;
955 /* TODO: support s->mb_skip_run */
958 mb_type = svq3_get_ue_golomb (&s->gb);
960 if (s->pict_type == I_TYPE) {
961 mb_type += 8;
962 } else if (s->pict_type == B_TYPE && mb_type >= 4) {
963 mb_type += 4;
965 if (mb_type > 33 || svq3_decode_mb (h, mb_type)) {
966 av_log(h->s.avctx, AV_LOG_ERROR, "error while decoding MB %d %d\n", s->mb_x, s->mb_y);
967 return -1;
970 if (mb_type != 0) {
971 hl_decode_mb (h);
974 if (s->pict_type != B_TYPE && !s->low_delay) {
975 s->current_picture.mb_type[s->mb_x + s->mb_y*s->mb_stride] =
976 (s->pict_type == P_TYPE && mb_type < 8) ? (mb_type - 1) : -1;
980 ff_draw_horiz_band(s, 16*s->mb_y, 16);
983 MPV_frame_end(s);
985 if (s->pict_type == B_TYPE || s->low_delay) {
986 *(AVFrame *) data = *(AVFrame *) &s->current_picture;
987 } else {
988 *(AVFrame *) data = *(AVFrame *) &s->last_picture;
991 avctx->frame_number = s->picture_number - 1;
993 /* dont output the last pic after seeking */
994 if (s->last_picture_ptr || s->low_delay) {
995 *data_size = sizeof(AVFrame);
998 return buf_size;
1002 AVCodec svq3_decoder = {
1003 "svq3",
1004 CODEC_TYPE_VIDEO,
1005 CODEC_ID_SVQ3,
1006 sizeof(H264Context),
1007 decode_init,
1008 NULL,
1009 decode_end,
1010 svq3_decode_frame,
1011 CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 | CODEC_CAP_DELAY,