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
46 #define FULLPEL_MODE 1
47 #define HALFPEL_MODE 2
48 #define THIRDPEL_MODE 3
50 /* dual scan (from some older h264 draft)
59 static 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,
66 static const uint8_t svq3_pred_0[25][2] = {
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 },
78 static 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 } },
93 static 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 } }
100 static 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
108 static void svq3_luma_dc_dequant_idct_c(DCTELEM *block, int qp){
109 const int qmul= svq3_dequant_coeff[qp];
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};
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];
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];
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;
144 static void svq3_add_idct_c (uint8_t *dst, DCTELEM *block, int stride, int qp, int dc){
145 const int qmul= svq3_dequant_coeff[qp];
147 uint8_t *cm = cropTbl + MAX_NEG_CROP;
150 dc = 13*13*((dc == 1) ? 1538*block[0] : ((qmul*(block[0] >> 3)) / 2));
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];
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;
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);
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) ];
180 static void pred4x4_down_left_svq3_c(uint8_t *src, uint8_t *topright, int stride){
183 const __attribute__((unused)) int unu0= t0;
184 const __attribute__((unused)) int unu1= l0;
186 src[0+0*stride]=(l1 + t1)>>1;
188 src[0+1*stride]=(l2 + t2)>>1;
201 src[3+3*stride]=(l3 + t3)>>1;
204 static void pred16x16_plane_svq3_c(uint8_t *src, int stride){
205 pred16x16_plane_compat_c(src, stride, 1);
208 static inline int svq3_decode_block (GetBitContext *gb, DCTELEM *block,
209 int index, const int type) {
211 static const uint8_t *const scan_patterns[4] =
212 { luma_dc_zigzag_scan, zigzag_scan, svq3_scan, chroma_dc_scan };
214 int run, level, sign, vlc, limit;
215 const int intra = (3 * type) >> 2;
216 const uint8_t *const scan = scan_patterns[type];
218 for (limit=(16 >> intra); index < 16; index=limit, limit+=8) {
219 for (; (vlc = svq3_get_ue_golomb (gb)) != 0; index++) {
221 if (vlc == INVALID_VLC)
224 sign = (vlc & 0x1) - 1;
225 vlc = (vlc + 1) >> 1;
231 } else if (vlc < 4) {
236 level = ((vlc + 9) >> 2) - run;
240 run = svq3_dct_tables[intra][vlc].run;
241 level = svq3_dct_tables[intra][vlc].level;
244 level = (vlc >> 3) + ((run == 0) ? 8 : ((run < 2) ? 2 : ((run < 5) ? 0 : -1)));
247 level = (vlc >> 4) + ((run == 0) ? 4 : ((run < 3) ? 2 : ((run < 10) ? 1 : 0)));
251 if ((index += run) >= limit)
254 block[scan[index]] = (level ^ sign) - sign;
265 static inline void svq3_mc_dir_part (MpegEncContext *s, int x, int y,
266 int width, int height, int mx, int my, int dxy, int thirdpel) {
269 int blocksize= 2 - (width>>3); //16->0, 8->1, 4->2
274 if (mx < 0 || mx >= (s->h_edge_pos - width - 1) ||
275 my < 0 || my >= (s->v_edge_pos - height - 1)) {
277 if ((s->flags & CODEC_FLAG_EMU_EDGE)) {
281 mx = clip (mx, -16, (s->h_edge_pos - width + 15));
282 my = clip (my, -16, (s->v_edge_pos - height + 15));
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;
290 ff_emulated_edge_mc (s, src, s->linesize, (width + 1), (height + 1),
291 mx, my, s->h_edge_pos, s->v_edge_pos);
292 src = s->edge_emu_buffer;
295 s->dsp.put_tpel_pixels_tab[dxy](dest, src, s->linesize, width, height);
297 s->dsp.put_pixels_tab[blocksize][dxy](dest, src, s->linesize, height);
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);
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;
311 ff_emulated_edge_mc (s, src, s->uvlinesize, (width + 1), (height + 1),
312 mx, my, (s->h_edge_pos >> 1), (s->v_edge_pos >> 1));
313 src = s->edge_emu_buffer;
316 s->dsp.put_tpel_pixels_tab[dxy](dest, src, s->uvlinesize, width, height);
318 s->dsp.put_pixels_tab[blocksize][dxy](dest, src, s->uvlinesize, height);
323 static 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;
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;
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;
336 if (mb_type == 0) { /* SKIP */
337 svq3_mc_dir_part (s, 16*s->mb_x, 16*s->mb_y, 16, 16, 0, 0, 0, 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)) {
343 mode = THIRDPEL_MODE;
344 } else if (h->halfpel_flag && h->thirdpel_flag == !get_bits (&s->gb, 1)) {
351 /* note ref_cache[0] should contain here:
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];
365 for (i=0; i < 4; i++) {
366 *(uint32_t *) h->mv_cache[0][scan8[0] - 1 + i*8] = 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);
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;
377 h->ref_cache[0][scan8[0] + 4 - 1*8] = PART_NOT_AVAILABLE;
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;
382 h->ref_cache[0][scan8[0] - 1 - 1*8] = PART_NOT_AVAILABLE;
384 memset (&h->ref_cache[0][scan8[0] - 1*8 - 1], PART_NOT_AVAILABLE, 8);
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);
390 for (i=0; i < 16; i+=part_height) {
391 for (j=0; j < 16; j+=part_width) {
395 k = ((j>>2)&1) + ((i>>1)&2) + ((j>>1)&4) + (i&8);
397 pred_motion (h, k, (part_width >> 2), 0, 1, &mx, &my);
399 /* clip motion vector prediction to frame border */
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));
403 /* get motion vector differential */
404 dy = svq3_get_se_golomb (&s->gb);
405 dx = svq3_get_se_golomb (&s->gb);
407 if (dx == INVALID_VLC || dy == INVALID_VLC) {
410 /* compute motion vector */
411 if (mode == THIRDPEL_MODE) {
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;
417 dxy= (mx - 3*fx) + 4*(my - 3*fy);
419 svq3_mc_dir_part (s, x, y, part_width, part_height, fx, fy, dxy, 1);
422 } else if (mode == HALFPEL_MODE) {
423 mx = ((unsigned)(mx + 1 + 0x3000))/3 + dx - 0x1000;
424 my = ((unsigned)(my + 1 + 0x3000))/3 + dy - 0x1000;
425 dxy= (mx&1) + 2*(my&1);
427 svq3_mc_dir_part (s, x, y, part_width, part_height, mx>>1, my>>1, dxy, 0);
431 assert(mode == FULLPEL_MODE);
432 mx = ((unsigned)(mx + 3 + 0x6000))/6 + dx - 0x1000;
433 my = ((unsigned)(my + 3 + 0x6000))/6 + dy - 0x1000;
435 svq3_mc_dir_part (s, x, y, part_width, part_height, mx, my, 0, 0);
440 /* update mv_cache */
441 fill_rectangle(h->mv_cache[0][scan8[k]], part_width>>2, part_height>>2, 8, pack16to32(mx,my), 4);
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));
449 if ((vlc = svq3_get_ue_golomb (&s->gb)) >= 48)
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));
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];
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];
469 /* decode prediction codes for luma blocks */
470 for (i=0; i < 16; i+=2) {
471 vlc = svq3_get_ue_golomb (&s->gb);
476 left = &h->intra4x4_pred_mode_cache[scan8[i] - 1];
477 top = &h->intra4x4_pred_mode_cache[scan8[i] - 8];
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]];
482 if (left[1] == -1 || left[2] == -1)
486 write_back_intra_pred_mode (h);
487 check_intra4x4_pred_mode (h);
489 if ((vlc = svq3_get_ue_golomb (&s->gb)) >= 48)
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;
498 if ((h->intra16x16_pred_mode = check_intra_pred_mode (h, dir)) == -1)
501 cbp = i_mb_type_info[mb_type - 8].cbp;
502 mb_type = MB_TYPE_INTRA16x16;
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));
510 if (!IS_INTRA4x4(mb_type)) {
511 memset (h->intra4x4_pred_mode[mb_xy], DC_PRED, 8);
513 if (!IS_SKIP(mb_type)) {
514 memset (h->non_zero_count_cache + 8, 0, 4*9*sizeof(uint8_t));
515 s->dsp.clear_blocks(h->mb);
518 if (IS_INTRA16x16(mb_type) || (s->pict_type != I_TYPE && s->adaptive_quant && cbp)) {
519 s->qscale += svq3_get_se_golomb (&s->gb);
524 if (IS_INTRA16x16(mb_type)) {
525 if (svq3_decode_block (&s->gb, h->mb, 0, 0))
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);
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;
539 if (svq3_decode_block (&s->gb, &h->mb[16*k], l, m))
546 for (i=0; i < 2; ++i) {
547 if (svq3_decode_block (&s->gb, &h->mb[16*(16 + 4*i)], 0, 3))
552 for (i=0; i < 8; i++) {
553 h->non_zero_count_cache[ scan8[16+i] ] = 1;
555 if (svq3_decode_block (&s->gb, &h->mb[16*(16 + i)], 1, 1))
562 s->current_picture.mb_type[mb_xy] = mb_type;
564 if (IS_INTRA(mb_type)) {
565 h->chroma_pred_mode = check_intra_pred_mode (h, DC_PRED8x8);
571 static 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;
578 s->flags = avctx->flags;
580 if (!s->context_initialized) {
581 s->width = avctx->width;
582 s->height = avctx->height;
583 h->pred4x4[DIAG_DOWN_LEFT_PRED] = pred4x4_down_left_svq3_c;
584 h->pred16x16[PLANE_PRED8x8] = pred16x16_plane_svq3_c;
586 h->thirdpel_flag = 1;
589 if (MPV_common_init (s) < 0)
592 h->b_stride = 4*s->mb_width;
599 if (avctx->extradata && avctx->extradata_size >= 0x63
600 && !memcmp (avctx->extradata, "SVQ3", 4)) {
602 uint8_t *stsd = (uint8_t *) avctx->extradata + 0x62;
604 if ((*stsd >> 5) != 7 || avctx->extradata_size >= 0x66) {
606 if ((*stsd >> 5) == 7) {
607 stsd += 3; /* skip width, height (12 bits each) */
610 h->halfpel_flag = (*stsd >> 4) & 1;
611 h->thirdpel_flag = (*stsd >> 3) & 1;
615 if ((buf[0] & 0x9F) != 1) {
617 fprintf (stderr, "unsupported header (%02X)\n", buf[0]);
620 int length = (buf[0] >> 5) & 3;
623 for (i=0; i < length; i++) {
624 offset = (offset << 8) | buf[i + 1];
627 if (buf_size < (offset + length + 1) || length == 0)
630 memcpy (&buf[2], &buf[offset + 2], (length - 1));
633 init_get_bits (&s->gb, &buf[2], 8*(buf_size - 2));
635 if ((i = svq3_get_ue_golomb (&s->gb)) == INVALID_VLC || i >= 3)
638 s->pict_type = golomb_to_pict_type[i];
641 get_bits (&s->gb, 1);
642 get_bits (&s->gb, 8);
644 s->qscale = get_bits (&s->gb, 5);
645 s->adaptive_quant = get_bits (&s->gb, 1);
648 get_bits (&s->gb, 1);
649 get_bits (&s->gb, 1);
650 get_bits (&s->gb, 2);
652 while (get_bits (&s->gb, 1)) {
653 get_bits (&s->gb, 8);
656 if(avctx->debug&FF_DEBUG_PICT_INFO){
657 printf("%c hpel:%d, tpel:%d aqp:%d qp:%d\n",
658 av_get_pict_type_char(s->pict_type), h->halfpel_flag, h->thirdpel_flag,
659 s->adaptive_quant, s->qscale
663 /* B-frames are not supported */
664 if (s->pict_type == B_TYPE/* && avctx->hurry_up*/)
672 h->ref_cache[0][scan8[0] + 8*i + j]= 1;
673 h->ref_cache[0][scan8[0] + 8*i + j]= PART_NOT_AVAILABLE;
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);
680 if (s->pict_type == I_TYPE) {
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);
693 ff_draw_horiz_band(s, 16*s->mb_y, 16);
696 *(AVFrame *) data = *(AVFrame *) &s->current_picture;
697 *data_size = sizeof(AVFrame);
705 AVCodec svq3_decoder = {
714 CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1,