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
49 #define PREDICT_MODE 4
51 /* dual scan (from some older h264 draft)
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] = {
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 },
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];
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};
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];
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;
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];
148 uint8_t *cm = cropTbl + MAX_NEG_CROP;
151 dc = 13*13*((dc == 1) ? 1538*block[0] : ((qmul*(block[0] >> 3)) / 2));
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){
184 const __attribute__((unused)) int unu0= t0;
185 const __attribute__((unused)) int unu1= l0;
187 src[0+0*stride]=(l1 + t1)>>1;
189 src[0+1*stride]=(l2 + t2)>>1;
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)
225 sign = (vlc & 0x1) - 1;
226 vlc = (vlc + 1) >> 1;
232 } else if (vlc < 4) {
237 level = ((vlc + 9) >> 2) - run;
241 run = svq3_dct_tables[intra][vlc].run;
242 level = svq3_dct_tables[intra][vlc].level;
245 level = (vlc >> 3) + ((run == 0) ? 8 : ((run < 2) ? 2 : ((run < 5) ? 0 : -1)));
248 level = (vlc >> 4) + ((run == 0) ? 4 : ((run < 3) ? 2 : ((run < 10) ? 1 : 0)));
252 if ((index += run) >= limit)
255 block[scan[index]] = (level ^ sign) - sign;
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;
274 int blocksize= 2 - (width>>3); //16->0, 8->1, 4->2
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)) {
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;
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;
300 (avg ? s->dsp.avg_tpel_pixels_tab : s->dsp.put_tpel_pixels_tab)[dxy](dest, src, s->linesize, width, height);
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);
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;
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;
321 (avg ? s->dsp.avg_tpel_pixels_tab : s->dsp.put_tpel_pixels_tab)[dxy](dest, src, s->uvlinesize, width, height);
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;
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);
349 mx = s->next_picture.motion_val[0][b_xy][0]<<1;
350 my = s->next_picture.motion_val[0][b_xy][1]<<1;
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;
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) {
369 dy = svq3_get_se_golomb (&s->gb);
370 dx = svq3_get_se_golomb (&s->gb);
372 if (dx == INVALID_VLC || dy == INVALID_VLC) {
377 /* compute motion vector */
378 if (mode == THIRDPEL_MODE) {
380 mx = ((mx + 1)>>1) + dx;
381 my = ((my + 1)>>1) + dy;
382 fx= ((unsigned)(mx + 0x3000))/3 - 0x1000;
383 fy= ((unsigned)(my + 0x3000))/3 - 0x1000;
384 dxy= (mx - 3*fx) + 4*(my - 3*fy);
386 svq3_mc_dir_part (s, x, y, part_width, part_height, fx, fy, dxy, 1, dir, avg);
389 } else if (mode == HALFPEL_MODE || mode == PREDICT_MODE) {
390 mx = ((unsigned)(mx + 1 + 0x3000))/3 + dx - 0x1000;
391 my = ((unsigned)(my + 1 + 0x3000))/3 + dy - 0x1000;
392 dxy= (mx&1) + 2*(my&1);
394 svq3_mc_dir_part (s, x, y, part_width, part_height, mx>>1, my>>1, dxy, 0, dir, avg);
398 mx = ((unsigned)(mx + 3 + 0x6000))/6 + dx - 0x1000;
399 my = ((unsigned)(my + 3 + 0x6000))/6 + dy - 0x1000;
401 svq3_mc_dir_part (s, x, y, part_width, part_height, mx, my, 0, 0, dir, avg);
406 /* update mv_cache */
407 if (mode != PREDICT_MODE) {
408 int32_t mv = pack16to32(mx,my);
410 if (part_height == 8 && i < 8) {
411 *(int32_t *) h->mv_cache[dir][scan8[k] + 1*8] = mv;
413 if (part_width == 8 && j < 8) {
414 *(int32_t *) h->mv_cache[dir][scan8[k] + 1 + 1*8] = mv;
417 if (part_width == 8 && j < 8) {
418 *(int32_t *) h->mv_cache[dir][scan8[k] + 1] = mv;
420 if (part_width == 4 || part_height == 4) {
421 *(int32_t *) h->mv_cache[dir][scan8[k]] = mv;
425 /* write back motion vectors */
426 fill_rectangle(s->current_picture.motion_val[dir][b_xy], part_width>>2, part_height>>2, h->b_stride, pack16to32(mx,my), 4);
433 static int svq3_decode_mb (H264Context *h, unsigned int mb_type) {
434 int i, j, k, m, dir, mode;
438 MpegEncContext *const s = (MpegEncContext *) h;
439 const int mb_xy = s->mb_x + s->mb_y*s->mb_stride;
440 const int b_xy = 4*s->mb_x + 4*s->mb_y*h->b_stride;
442 h->top_samples_available = (s->mb_y == 0) ? 0x33FF : 0xFFFF;
443 h->left_samples_available = (s->mb_x == 0) ? 0x5F5F : 0xFFFF;
444 h->topright_samples_available = 0xFFFF;
446 if (mb_type == 0) { /* SKIP */
447 if (s->pict_type == P_TYPE || s->next_picture.mb_type[mb_xy] == -1) {
448 svq3_mc_dir_part (s, 16*s->mb_x, 16*s->mb_y, 16, 16, 0, 0, 0, 0, 0, 0);
450 if (s->pict_type == B_TYPE) {
451 svq3_mc_dir_part (s, 16*s->mb_x, 16*s->mb_y, 16, 16, 0, 0, 0, 0, 1, 1);
454 mb_type = MB_TYPE_SKIP;
456 mb_type= FFMIN(s->next_picture.mb_type[mb_xy], 6);
457 if(svq3_mc_dir (h, mb_type, PREDICT_MODE, 0, 0) < 0)
459 if(svq3_mc_dir (h, mb_type, PREDICT_MODE, 1, 1) < 0)
462 mb_type = MB_TYPE_16x16;
464 } else if (mb_type < 8) { /* INTER */
465 if (h->thirdpel_flag && h->halfpel_flag == !get_bits (&s->gb, 1)) {
466 mode = THIRDPEL_MODE;
467 } else if (h->halfpel_flag && h->thirdpel_flag == !get_bits (&s->gb, 1)) {
474 /* note ref_cache should contain here:
483 for (m=0; m < 2; m++) {
484 if (s->mb_x > 0 && h->intra4x4_pred_mode[mb_xy - 1][0] != -1) {
485 for (i=0; i < 4; i++) {
486 *(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 for (i=0; i < 4; i++) {
490 *(uint32_t *) h->mv_cache[m][scan8[0] - 1 + i*8] = 0;
494 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));
495 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);
497 if (s->mb_x < (s->mb_width - 1)) {
498 *(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];
499 h->ref_cache[m][scan8[0] + 4 - 1*8] =
500 (h->intra4x4_pred_mode[mb_xy - s->mb_stride + 1][0] == -1 ||
501 h->intra4x4_pred_mode[mb_xy - s->mb_stride][4] == -1) ? PART_NOT_AVAILABLE : 1;
503 h->ref_cache[m][scan8[0] + 4 - 1*8] = PART_NOT_AVAILABLE;
505 *(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];
506 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 h->ref_cache[m][scan8[0] - 1 - 1*8] = PART_NOT_AVAILABLE;
510 memset (&h->ref_cache[m][scan8[0] - 1*8 - 1], PART_NOT_AVAILABLE, 8);
512 if (s->pict_type != B_TYPE)
516 /* decode motion vector(s) and form prediction(s) */
517 if (s->pict_type == P_TYPE) {
518 if(svq3_mc_dir (h, (mb_type - 1), mode, 0, 0) < 0)
520 } else { /* B_TYPE */
522 if(svq3_mc_dir (h, 0, mode, 0, 0) < 0)
525 for (i=0; i < 4; i++) {
526 memset (s->current_picture.motion_val[0][b_xy + i*h->b_stride], 0, 4*2*sizeof(int16_t));
530 if(svq3_mc_dir (h, 0, mode, 1, (mb_type == 3)) < 0)
533 for (i=0; i < 4; i++) {
534 memset (s->current_picture.motion_val[1][b_xy + i*h->b_stride], 0, 4*2*sizeof(int16_t));
539 mb_type = MB_TYPE_16x16;
540 } else if (mb_type == 8 || mb_type == 33) { /* INTRA4x4 */
541 memset (h->intra4x4_pred_mode_cache, -1, 8*5*sizeof(int8_t));
545 for (i=0; i < 4; i++) {
546 h->intra4x4_pred_mode_cache[scan8[0] - 1 + i*8] = h->intra4x4_pred_mode[mb_xy - 1][i];
548 if (h->intra4x4_pred_mode_cache[scan8[0] - 1] == -1) {
549 h->left_samples_available = 0x5F5F;
553 h->intra4x4_pred_mode_cache[4+8*0] = h->intra4x4_pred_mode[mb_xy - s->mb_stride][4];
554 h->intra4x4_pred_mode_cache[5+8*0] = h->intra4x4_pred_mode[mb_xy - s->mb_stride][5];
555 h->intra4x4_pred_mode_cache[6+8*0] = h->intra4x4_pred_mode[mb_xy - s->mb_stride][6];
556 h->intra4x4_pred_mode_cache[7+8*0] = h->intra4x4_pred_mode[mb_xy - s->mb_stride][3];
558 if (h->intra4x4_pred_mode_cache[4+8*0] == -1) {
559 h->top_samples_available = 0x33FF;
563 /* decode prediction codes for luma blocks */
564 for (i=0; i < 16; i+=2) {
565 vlc = svq3_get_ue_golomb (&s->gb);
570 left = &h->intra4x4_pred_mode_cache[scan8[i] - 1];
571 top = &h->intra4x4_pred_mode_cache[scan8[i] - 8];
573 left[1] = svq3_pred_1[top[0] + 1][left[0] + 1][svq3_pred_0[vlc][0]];
574 left[2] = svq3_pred_1[top[1] + 1][left[1] + 1][svq3_pred_0[vlc][1]];
576 if (left[1] == -1 || left[2] == -1)
579 } else { /* mb_type == 33, DC_128_PRED block type */
580 for (i=0; i < 4; i++) {
581 memset (&h->intra4x4_pred_mode_cache[scan8[0] + 8*i], DC_PRED, 4);
585 write_back_intra_pred_mode (h);
588 check_intra4x4_pred_mode (h);
590 h->top_samples_available = (s->mb_y == 0) ? 0x33FF : 0xFFFF;
591 h->left_samples_available = (s->mb_x == 0) ? 0x5F5F : 0xFFFF;
593 for (i=0; i < 4; i++) {
594 memset (&h->intra4x4_pred_mode_cache[scan8[0] + 8*i], DC_128_PRED, 4);
597 h->top_samples_available = 0x33FF;
598 h->left_samples_available = 0x5F5F;
601 mb_type = MB_TYPE_INTRA4x4;
602 } else { /* INTRA16x16 */
603 dir = i_mb_type_info[mb_type - 8].pred_mode;
604 dir = (dir >> 1) ^ 3*(dir & 1) ^ 1;
606 if ((h->intra16x16_pred_mode = check_intra_pred_mode (h, dir)) == -1)
609 cbp = i_mb_type_info[mb_type - 8].cbp;
610 mb_type = MB_TYPE_INTRA16x16;
613 if (!IS_INTER(mb_type) && s->pict_type != I_TYPE) {
614 for (i=0; i < 4; i++) {
615 memset (s->current_picture.motion_val[0][b_xy + i*h->b_stride], 0, 4*2*sizeof(int16_t));
617 if (s->pict_type == B_TYPE) {
618 for (i=0; i < 4; i++) {
619 memset (s->current_picture.motion_val[1][b_xy + i*h->b_stride], 0, 4*2*sizeof(int16_t));
623 if (!IS_INTRA4x4(mb_type)) {
624 memset (h->intra4x4_pred_mode[mb_xy], DC_PRED, 8);
626 if (!IS_SKIP(mb_type) || s->pict_type == B_TYPE) {
627 memset (h->non_zero_count_cache + 8, 0, 4*9*sizeof(uint8_t));
628 s->dsp.clear_blocks(h->mb);
631 if (!IS_INTRA16x16(mb_type) && (!IS_SKIP(mb_type) || s->pict_type == B_TYPE)) {
632 if ((vlc = svq3_get_ue_golomb (&s->gb)) >= 48)
635 cbp = IS_INTRA(mb_type) ? golomb_to_intra4x4_cbp[vlc] : golomb_to_inter_cbp[vlc];
637 if (IS_INTRA16x16(mb_type) || (s->pict_type != I_TYPE && s->adaptive_quant && cbp)) {
638 s->qscale += svq3_get_se_golomb (&s->gb);
643 if (IS_INTRA16x16(mb_type)) {
644 if (svq3_decode_block (&s->gb, h->mb, 0, 0))
649 const int index = IS_INTRA16x16(mb_type) ? 1 : 0;
650 const int type = ((s->qscale < 24 && IS_INTRA4x4(mb_type)) ? 2 : 1);
652 for (i=0; i < 4; i++) {
653 if ((cbp & (1 << i))) {
654 for (j=0; j < 4; j++) {
655 k = index ? ((j&1) + 2*(i&1) + 2*(j&2) + 4*(i&2)) : (4*i + j);
656 h->non_zero_count_cache[ scan8[k] ] = 1;
658 if (svq3_decode_block (&s->gb, &h->mb[16*k], index, type))
665 for (i=0; i < 2; ++i) {
666 if (svq3_decode_block (&s->gb, &h->mb[16*(16 + 4*i)], 0, 3))
671 for (i=0; i < 8; i++) {
672 h->non_zero_count_cache[ scan8[16+i] ] = 1;
674 if (svq3_decode_block (&s->gb, &h->mb[16*(16 + i)], 1, 1))
681 s->current_picture.mb_type[mb_xy] = mb_type;
683 if (IS_INTRA(mb_type)) {
684 h->chroma_pred_mode = check_intra_pred_mode (h, DC_PRED8x8);
690 static int svq3_decode_slice_header (H264Context *h) {
691 MpegEncContext *const s = (MpegEncContext *) h;
692 const int mb_xy = s->mb_x + s->mb_y*s->mb_stride;
695 header = get_bits (&s->gb, 8);
697 if (((header & 0x9F) != 1 && (header & 0x9F) != 2) || (header & 0x60) == 0) {
699 av_log(h->s.avctx, AV_LOG_ERROR, "unsupported slice header (%02X)\n", header);
702 int length = (header >> 5) & 3;
704 h->next_slice_index = s->gb.index + 8*show_bits (&s->gb, 8*length) + 8*length;
706 if (h->next_slice_index > s->gb.size_in_bits){
707 av_log(h->s.avctx, AV_LOG_ERROR, "slice after bitstream end\n");
711 s->gb.size_in_bits = h->next_slice_index - 8*(length - 1);
715 memcpy ((uint8_t *) &s->gb.buffer[s->gb.index >> 3],
716 &s->gb.buffer[s->gb.size_in_bits >> 3], (length - 1));
720 if ((i = svq3_get_ue_golomb (&s->gb)) == INVALID_VLC || i >= 3){
721 av_log(h->s.avctx, AV_LOG_ERROR, "illegal slice type %d \n", i);
725 h->slice_type = golomb_to_pict_type[i];
727 if ((header & 0x9F) == 2) {
728 i = (s->mb_num < 64) ? 6 : (1 + av_log2 (s->mb_num - 1));
729 s->mb_skip_run = get_bits (&s->gb, i) - (s->mb_x + (s->mb_y * s->mb_width));
735 h->slice_num = get_bits (&s->gb, 8);
736 s->qscale = get_bits (&s->gb, 5);
737 s->adaptive_quant = get_bits1 (&s->gb);
742 if (h->unknown_svq3_flag) {
747 get_bits (&s->gb, 2);
749 while (get_bits1 (&s->gb)) {
750 get_bits (&s->gb, 8);
753 /* reset intra predictors and invalidate motion vector references */
755 memset (h->intra4x4_pred_mode[mb_xy - 1], -1, 4*sizeof(int8_t));
756 memset (h->intra4x4_pred_mode[mb_xy - s->mb_x], -1, 8*sizeof(int8_t)*s->mb_x);
759 memset (h->intra4x4_pred_mode[mb_xy - s->mb_stride], -1, 8*sizeof(int8_t)*(s->mb_width - s->mb_x));
762 h->intra4x4_pred_mode[mb_xy - s->mb_stride - 1][3] = -1;
769 static int svq3_decode_frame (AVCodecContext *avctx,
770 void *data, int *data_size,
771 uint8_t *buf, int buf_size) {
772 MpegEncContext *const s = avctx->priv_data;
773 H264Context *const h = avctx->priv_data;
775 unsigned char *extradata;
778 s->flags = avctx->flags;
779 s->flags2 = avctx->flags2;
780 s->unrestricted_mv = 1;
782 if (!s->context_initialized) {
783 s->width = avctx->width;
784 s->height = avctx->height;
785 h->pred4x4[DIAG_DOWN_LEFT_PRED] = pred4x4_down_left_svq3_c;
786 h->pred16x16[PLANE_PRED8x8] = pred16x16_plane_svq3_c;
788 h->thirdpel_flag = 1;
789 h->unknown_svq3_flag = 0;
792 if (MPV_common_init (s) < 0)
795 h->b_stride = 4*s->mb_width;
799 /* prowl for the "SEQH" marker in the extradata */
800 extradata = (unsigned char *)avctx->extradata;
801 for (m = 0; m < avctx->extradata_size; m++) {
802 if (!memcmp (extradata, "SEQH", 4))
807 /* if a match was found, parse the extra data */
808 if (!memcmp (extradata, "SEQH", 4)) {
812 size = BE_32(&extradata[4]);
813 init_get_bits (&gb, extradata + 8, size);
815 /* 'frame size code' and optional 'width, height' */
816 if (get_bits (&gb, 3) == 7) {
821 h->halfpel_flag = get_bits1 (&gb);
822 h->thirdpel_flag = get_bits1 (&gb);
830 s->low_delay = get_bits1 (&gb);
835 while (get_bits1 (&gb)) {
839 h->unknown_svq3_flag = get_bits1 (&gb);
840 avctx->has_b_frames = !s->low_delay;
844 /* special case for last picture */
846 if (s->next_picture_ptr && !s->low_delay) {
847 *(AVFrame *) data = *(AVFrame *) &s->next_picture;
848 *data_size = sizeof(AVFrame);
853 init_get_bits (&s->gb, buf, 8*buf_size);
855 s->mb_x = s->mb_y = 0;
857 if (svq3_decode_slice_header (h))
860 s->pict_type = h->slice_type;
861 s->picture_number = h->slice_num;
863 if(avctx->debug&FF_DEBUG_PICT_INFO){
864 av_log(h->s.avctx, AV_LOG_DEBUG, "%c hpel:%d, tpel:%d aqp:%d qp:%d\n",
865 av_get_pict_type_char(s->pict_type), h->halfpel_flag, h->thirdpel_flag,
866 s->adaptive_quant, s->qscale
870 /* for hurry_up==5 */
871 s->current_picture.pict_type = s->pict_type;
872 s->current_picture.key_frame = (s->pict_type == I_TYPE);
874 /* skip b frames if we dont have reference frames */
875 if (s->last_picture_ptr == NULL && s->pict_type == B_TYPE) return 0;
876 /* skip b frames if we are in a hurry */
877 if (avctx->hurry_up && s->pict_type == B_TYPE) return 0;
878 /* skip everything if we are in a hurry >= 5 */
879 if (avctx->hurry_up >= 5) return 0;
881 if (s->next_p_frame_damaged) {
882 if (s->pict_type == B_TYPE)
885 s->next_p_frame_damaged = 0;
890 if (s->pict_type == B_TYPE) {
891 h->frame_num_offset = (h->slice_num - h->prev_frame_num);
893 if (h->frame_num_offset < 0) {
894 h->frame_num_offset += 256;
896 if (h->frame_num_offset == 0 || h->frame_num_offset >= h->prev_frame_num_offset) {
897 av_log(h->s.avctx, AV_LOG_ERROR, "error in B-frame picture id\n");
901 h->prev_frame_num = h->frame_num;
902 h->frame_num = h->slice_num;
903 h->prev_frame_num_offset = (h->frame_num - h->prev_frame_num);
905 if (h->prev_frame_num_offset < 0) {
906 h->prev_frame_num_offset += 256;
915 h->ref_cache[m][scan8[0] + 8*i + j]= 1;
916 h->ref_cache[m][scan8[0] + 8*i + j]= PART_NOT_AVAILABLE;
920 for (s->mb_y=0; s->mb_y < s->mb_height; s->mb_y++) {
921 for (s->mb_x=0; s->mb_x < s->mb_width; s->mb_x++) {
923 if ( (s->gb.index + 7) >= s->gb.size_in_bits &&
924 ((s->gb.index & 7) == 0 || show_bits (&s->gb, (-s->gb.index & 7)) == 0)) {
926 s->gb.index = h->next_slice_index;
927 s->gb.size_in_bits = 8*buf_size;
929 if (svq3_decode_slice_header (h))
932 /* TODO: support s->mb_skip_run */
935 mb_type = svq3_get_ue_golomb (&s->gb);
937 if (s->pict_type == I_TYPE) {
939 } else if (s->pict_type == B_TYPE && mb_type >= 4) {
942 if (mb_type > 33 || svq3_decode_mb (h, mb_type)) {
943 av_log(h->s.avctx, AV_LOG_ERROR, "error while decoding MB %d %d\n", s->mb_x, s->mb_y);
951 if (s->pict_type != B_TYPE && !s->low_delay) {
952 s->current_picture.mb_type[s->mb_x + s->mb_y*s->mb_stride] =
953 (s->pict_type == P_TYPE && mb_type < 8) ? (mb_type - 1) : -1;
957 ff_draw_horiz_band(s, 16*s->mb_y, 16);
962 if (s->pict_type == B_TYPE || s->low_delay) {
963 *(AVFrame *) data = *(AVFrame *) &s->current_picture;
965 *(AVFrame *) data = *(AVFrame *) &s->last_picture;
968 avctx->frame_number = s->picture_number - 1;
970 /* dont output the last pic after seeking */
971 if (s->last_picture_ptr || s->low_delay) {
972 *data_size = sizeof(AVFrame);
979 AVCodec svq3_decoder = {
988 CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1,