00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00046 #define FULLPEL_MODE 1
00047 #define HALFPEL_MODE 2
00048 #define THIRDPEL_MODE 3
00049 #define PREDICT_MODE 4
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060 static const uint8_t svq3_scan[16]={
00061 0+0*4, 1+0*4, 2+0*4, 2+1*4,
00062 2+2*4, 3+0*4, 3+1*4, 3+2*4,
00063 0+1*4, 0+2*4, 1+1*4, 1+2*4,
00064 0+3*4, 1+3*4, 2+3*4, 3+3*4,
00065 };
00066
00067 static const uint8_t svq3_pred_0[25][2] = {
00068 { 0, 0 },
00069 { 1, 0 }, { 0, 1 },
00070 { 0, 2 }, { 1, 1 }, { 2, 0 },
00071 { 3, 0 }, { 2, 1 }, { 1, 2 }, { 0, 3 },
00072 { 0, 4 }, { 1, 3 }, { 2, 2 }, { 3, 1 }, { 4, 0 },
00073 { 4, 1 }, { 3, 2 }, { 2, 3 }, { 1, 4 },
00074 { 2, 4 }, { 3, 3 }, { 4, 2 },
00075 { 4, 3 }, { 3, 4 },
00076 { 4, 4 }
00077 };
00078
00079 static const int8_t svq3_pred_1[6][6][5] = {
00080 { { 2,-1,-1,-1,-1 }, { 2, 1,-1,-1,-1 }, { 1, 2,-1,-1,-1 },
00081 { 2, 1,-1,-1,-1 }, { 1, 2,-1,-1,-1 }, { 1, 2,-1,-1,-1 } },
00082 { { 0, 2,-1,-1,-1 }, { 0, 2, 1, 4, 3 }, { 0, 1, 2, 4, 3 },
00083 { 0, 2, 1, 4, 3 }, { 2, 0, 1, 3, 4 }, { 0, 4, 2, 1, 3 } },
00084 { { 2, 0,-1,-1,-1 }, { 2, 1, 0, 4, 3 }, { 1, 2, 4, 0, 3 },
00085 { 2, 1, 0, 4, 3 }, { 2, 1, 4, 3, 0 }, { 1, 2, 4, 0, 3 } },
00086 { { 2, 0,-1,-1,-1 }, { 2, 0, 1, 4, 3 }, { 1, 2, 0, 4, 3 },
00087 { 2, 1, 0, 4, 3 }, { 2, 1, 3, 4, 0 }, { 2, 4, 1, 0, 3 } },
00088 { { 0, 2,-1,-1,-1 }, { 0, 2, 1, 3, 4 }, { 1, 2, 3, 0, 4 },
00089 { 2, 0, 1, 3, 4 }, { 2, 1, 3, 0, 4 }, { 2, 0, 4, 3, 1 } },
00090 { { 0, 2,-1,-1,-1 }, { 0, 2, 4, 1, 3 }, { 1, 4, 2, 0, 3 },
00091 { 4, 2, 0, 1, 3 }, { 2, 0, 1, 4, 3 }, { 4, 2, 1, 0, 3 } },
00092 };
00093
00094 static const struct { uint8_t run; uint8_t level; } svq3_dct_tables[2][16] = {
00095 { { 0, 0 }, { 0, 1 }, { 1, 1 }, { 2, 1 }, { 0, 2 }, { 3, 1 }, { 4, 1 }, { 5, 1 },
00096 { 0, 3 }, { 1, 2 }, { 2, 2 }, { 6, 1 }, { 7, 1 }, { 8, 1 }, { 9, 1 }, { 0, 4 } },
00097 { { 0, 0 }, { 0, 1 }, { 1, 1 }, { 0, 2 }, { 2, 1 }, { 0, 3 }, { 0, 4 }, { 0, 5 },
00098 { 3, 1 }, { 4, 1 }, { 1, 2 }, { 1, 3 }, { 0, 6 }, { 0, 7 }, { 0, 8 }, { 0, 9 } }
00099 };
00100
00101 static const uint32_t svq3_dequant_coeff[32] = {
00102 3881, 4351, 4890, 5481, 6154, 6914, 7761, 8718,
00103 9781, 10987, 12339, 13828, 15523, 17435, 19561, 21873,
00104 24552, 27656, 30847, 34870, 38807, 43747, 49103, 54683,
00105 61694, 68745, 77615, 89113,100253,109366,126635,141533
00106 };
00107
00108
00109 static void svq3_luma_dc_dequant_idct_c(DCTELEM *block, int qp){
00110 const int qmul= svq3_dequant_coeff[qp];
00111 #define stride 16
00112 int i;
00113 int temp[16];
00114 static const int x_offset[4]={0, 1*stride, 4* stride, 5*stride};
00115 static const int y_offset[4]={0, 2*stride, 8* stride, 10*stride};
00116
00117 for(i=0; i<4; i++){
00118 const int offset= y_offset[i];
00119 const int z0= 13*(block[offset+stride*0] + block[offset+stride*4]);
00120 const int z1= 13*(block[offset+stride*0] - block[offset+stride*4]);
00121 const int z2= 7* block[offset+stride*1] - 17*block[offset+stride*5];
00122 const int z3= 17* block[offset+stride*1] + 7*block[offset+stride*5];
00123
00124 temp[4*i+0]= z0+z3;
00125 temp[4*i+1]= z1+z2;
00126 temp[4*i+2]= z1-z2;
00127 temp[4*i+3]= z0-z3;
00128 }
00129
00130 for(i=0; i<4; i++){
00131 const int offset= x_offset[i];
00132 const int z0= 13*(temp[4*0+i] + temp[4*2+i]);
00133 const int z1= 13*(temp[4*0+i] - temp[4*2+i]);
00134 const int z2= 7* temp[4*1+i] - 17*temp[4*3+i];
00135 const int z3= 17* temp[4*1+i] + 7*temp[4*3+i];
00136
00137 block[stride*0 +offset]= ((z0 + z3)*qmul + 0x80000)>>20;
00138 block[stride*2 +offset]= ((z1 + z2)*qmul + 0x80000)>>20;
00139 block[stride*8 +offset]= ((z1 - z2)*qmul + 0x80000)>>20;
00140 block[stride*10+offset]= ((z0 - z3)*qmul + 0x80000)>>20;
00141 }
00142 }
00143 #undef stride
00144
00145 static void svq3_add_idct_c (uint8_t *dst, DCTELEM *block, int stride, int qp, int dc){
00146 const int qmul= svq3_dequant_coeff[qp];
00147 int i;
00148 uint8_t *cm = cropTbl + MAX_NEG_CROP;
00149
00150 if (dc) {
00151 dc = 13*13*((dc == 1) ? 1538*block[0] : ((qmul*(block[0] >> 3)) / 2));
00152 block[0] = 0;
00153 }
00154
00155 for (i=0; i < 4; i++) {
00156 const int z0= 13*(block[0 + 4*i] + block[2 + 4*i]);
00157 const int z1= 13*(block[0 + 4*i] - block[2 + 4*i]);
00158 const int z2= 7* block[1 + 4*i] - 17*block[3 + 4*i];
00159 const int z3= 17* block[1 + 4*i] + 7*block[3 + 4*i];
00160
00161 block[0 + 4*i]= z0 + z3;
00162 block[1 + 4*i]= z1 + z2;
00163 block[2 + 4*i]= z1 - z2;
00164 block[3 + 4*i]= z0 - z3;
00165 }
00166
00167 for (i=0; i < 4; i++) {
00168 const int z0= 13*(block[i + 4*0] + block[i + 4*2]);
00169 const int z1= 13*(block[i + 4*0] - block[i + 4*2]);
00170 const int z2= 7* block[i + 4*1] - 17*block[i + 4*3];
00171 const int z3= 17* block[i + 4*1] + 7*block[i + 4*3];
00172 const int rr= (dc + 0x80000);
00173
00174 dst[i + stride*0]= cm[ dst[i + stride*0] + (((z0 + z3)*qmul + rr) >> 20) ];
00175 dst[i + stride*1]= cm[ dst[i + stride*1] + (((z1 + z2)*qmul + rr) >> 20) ];
00176 dst[i + stride*2]= cm[ dst[i + stride*2] + (((z1 - z2)*qmul + rr) >> 20) ];
00177 dst[i + stride*3]= cm[ dst[i + stride*3] + (((z0 - z3)*qmul + rr) >> 20) ];
00178 }
00179 }
00180
00181 static void pred4x4_down_left_svq3_c(uint8_t *src, uint8_t *topright, int stride){
00182 LOAD_TOP_EDGE
00183 LOAD_LEFT_EDGE
00184 const __attribute__((unused)) int unu0= t0;
00185 const __attribute__((unused)) int unu1= l0;
00186
00187 src[0+0*stride]=(l1 + t1)>>1;
00188 src[1+0*stride]=
00189 src[0+1*stride]=(l2 + t2)>>1;
00190 src[2+0*stride]=
00191 src[1+1*stride]=
00192 src[0+2*stride]=
00193 src[3+0*stride]=
00194 src[2+1*stride]=
00195 src[1+2*stride]=
00196 src[0+3*stride]=
00197 src[3+1*stride]=
00198 src[2+2*stride]=
00199 src[1+3*stride]=
00200 src[3+2*stride]=
00201 src[2+3*stride]=
00202 src[3+3*stride]=(l3 + t3)>>1;
00203 }
00204
00205 static void pred16x16_plane_svq3_c(uint8_t *src, int stride){
00206 pred16x16_plane_compat_c(src, stride, 1);
00207 }
00208
00209 static inline int svq3_decode_block (GetBitContext *gb, DCTELEM *block,
00210 int index, const int type) {
00211
00212 static const uint8_t *const scan_patterns[4] =
00213 { luma_dc_zigzag_scan, zigzag_scan, svq3_scan, chroma_dc_scan };
00214
00215 int run, level, sign, vlc, limit;
00216 const int intra = (3 * type) >> 2;
00217 const uint8_t *const scan = scan_patterns[type];
00218
00219 for (limit=(16 >> intra); index < 16; index=limit, limit+=8) {
00220 for (; (vlc = svq3_get_ue_golomb (gb)) != 0; index++) {
00221
00222 if (vlc == INVALID_VLC)
00223 return -1;
00224
00225 sign = (vlc & 0x1) - 1;
00226 vlc = (vlc + 1) >> 1;
00227
00228 if (type == 3) {
00229 if (vlc < 3) {
00230 run = 0;
00231 level = vlc;
00232 } else if (vlc < 4) {
00233 run = 1;
00234 level = 1;
00235 } else {
00236 run = (vlc & 0x3);
00237 level = ((vlc + 9) >> 2) - run;
00238 }
00239 } else {
00240 if (vlc < 16) {
00241 run = svq3_dct_tables[intra][vlc].run;
00242 level = svq3_dct_tables[intra][vlc].level;
00243 } else if (intra) {
00244 run = (vlc & 0x7);
00245 level = (vlc >> 3) + ((run == 0) ? 8 : ((run < 2) ? 2 : ((run < 5) ? 0 : -1)));
00246 } else {
00247 run = (vlc & 0xF);
00248 level = (vlc >> 4) + ((run == 0) ? 4 : ((run < 3) ? 2 : ((run < 10) ? 1 : 0)));
00249 }
00250 }
00251
00252 if ((index += run) >= limit)
00253 return -1;
00254
00255 block[scan[index]] = (level ^ sign) - sign;
00256 }
00257
00258 if (type != 2) {
00259 break;
00260 }
00261 }
00262
00263 return 0;
00264 }
00265
00266 static inline void svq3_mc_dir_part (MpegEncContext *s,
00267 int x, int y, int width, int height,
00268 int mx, int my, int dxy,
00269 int thirdpel, int dir, int avg) {
00270
00271 const Picture *pic = (dir == 0) ? &s->last_picture : &s->next_picture;
00272 uint8_t *src, *dest;
00273 int i, emu = 0;
00274 int blocksize= 2 - (width>>3);
00275
00276 mx += x;
00277 my += y;
00278
00279 if (mx < 0 || mx >= (s->h_edge_pos - width - 1) ||
00280 my < 0 || my >= (s->v_edge_pos - height - 1)) {
00281
00282 if ((s->flags & CODEC_FLAG_EMU_EDGE)) {
00283 emu = 1;
00284 }
00285
00286 mx = clip (mx, -16, (s->h_edge_pos - width + 15));
00287 my = clip (my, -16, (s->v_edge_pos - height + 15));
00288 }
00289
00290
00291 dest = s->current_picture.data[0] + x + y*s->linesize;
00292 src = pic->data[0] + mx + my*s->linesize;
00293
00294 if (emu) {
00295 ff_emulated_edge_mc (s->edge_emu_buffer, src, s->linesize, (width + 1), (height + 1),
00296 mx, my, s->h_edge_pos, s->v_edge_pos);
00297 src = s->edge_emu_buffer;
00298 }
00299 if(thirdpel)
00300 (avg ? s->dsp.avg_tpel_pixels_tab : s->dsp.put_tpel_pixels_tab)[dxy](dest, src, s->linesize, width, height);
00301 else
00302 (avg ? s->dsp.avg_pixels_tab : s->dsp.put_pixels_tab)[blocksize][dxy](dest, src, s->linesize, height);
00303
00304 if (!(s->flags & CODEC_FLAG_GRAY)) {
00305 mx = (mx + (mx < (int) x)) >> 1;
00306 my = (my + (my < (int) y)) >> 1;
00307 width = (width >> 1);
00308 height = (height >> 1);
00309 blocksize++;
00310
00311 for (i=1; i < 3; i++) {
00312 dest = s->current_picture.data[i] + (x >> 1) + (y >> 1)*s->uvlinesize;
00313 src = pic->data[i] + mx + my*s->uvlinesize;
00314
00315 if (emu) {
00316 ff_emulated_edge_mc (s->edge_emu_buffer, src, s->uvlinesize, (width + 1), (height + 1),
00317 mx, my, (s->h_edge_pos >> 1), (s->v_edge_pos >> 1));
00318 src = s->edge_emu_buffer;
00319 }
00320 if(thirdpel)
00321 (avg ? s->dsp.avg_tpel_pixels_tab : s->dsp.put_tpel_pixels_tab)[dxy](dest, src, s->uvlinesize, width, height);
00322 else
00323 (avg ? s->dsp.avg_pixels_tab : s->dsp.put_pixels_tab)[blocksize][dxy](dest, src, s->uvlinesize, height);
00324 }
00325 }
00326 }
00327
00328 static inline int svq3_mc_dir (H264Context *h, int size, int mode, int dir, int avg) {
00329
00330 int i, j, k, mx, my, dx, dy, x, y;
00331 MpegEncContext *const s = (MpegEncContext *) h;
00332 const int part_width = ((size & 5) == 4) ? 4 : 16 >> (size & 1);
00333 const int part_height = 16 >> ((unsigned) (size + 1) / 3);
00334 const int extra_width = (mode == PREDICT_MODE) ? -16*6 : 0;
00335 const int h_edge_pos = 6*(s->h_edge_pos - part_width ) - extra_width;
00336 const int v_edge_pos = 6*(s->v_edge_pos - part_height) - extra_width;
00337
00338 for (i=0; i < 16; i+=part_height) {
00339 for (j=0; j < 16; j+=part_width) {
00340 const int b_xy = (4*s->mb_x+(j>>2)) + (4*s->mb_y+(i>>2))*h->b_stride;
00341 int dxy;
00342 x = 16*s->mb_x + j;
00343 y = 16*s->mb_y + i;
00344 k = ((j>>2)&1) + ((i>>1)&2) + ((j>>1)&4) + (i&8);
00345
00346 if (mode != PREDICT_MODE) {
00347 pred_motion (h, k, (part_width >> 2), dir, 1, &mx, &my);
00348 } else {
00349 mx = s->next_picture.motion_val[0][b_xy][0]<<1;
00350 my = s->next_picture.motion_val[0][b_xy][1]<<1;
00351
00352 if (dir == 0) {
00353 mx = ((mx * h->frame_num_offset) / h->prev_frame_num_offset + 1)>>1;
00354 my = ((my * h->frame_num_offset) / h->prev_frame_num_offset + 1)>>1;
00355 } else {
00356 mx = ((mx * (h->frame_num_offset - h->prev_frame_num_offset)) / h->prev_frame_num_offset + 1)>>1;
00357 my = ((my * (h->frame_num_offset - h->prev_frame_num_offset)) / h->prev_frame_num_offset + 1)>>1;
00358 }
00359 }
00360
00361
00362 mx = clip (mx, extra_width - 6*x, h_edge_pos - 6*x);
00363 my = clip (my, extra_width - 6*y, v_edge_pos - 6*y);
00364
00365
00366 if (mode == PREDICT_MODE) {
00367 dx = dy = 0;
00368 } else {
00369 dy = svq3_get_se_golomb (&s->gb);
00370 dx = svq3_get_se_golomb (&s->gb);
00371
00372 if (dx == INVALID_VLC || dy == INVALID_VLC) {
00373 av_log(h->s.avctx, AV_LOG_ERROR, "invalid MV vlc\n");
00374 return -1;
00375 }
00376 }
00377
00378
00379 if (mode == THIRDPEL_MODE) {
00380 int fx, fy;
00381 mx = ((mx + 1)>>1) + dx;
00382 my = ((my + 1)>>1) + dy;
00383 fx= ((unsigned)(mx + 0x3000))/3 - 0x1000;
00384 fy= ((unsigned)(my + 0x3000))/3 - 0x1000;
00385 dxy= (mx - 3*fx) + 4*(my - 3*fy);
00386
00387 svq3_mc_dir_part (s, x, y, part_width, part_height, fx, fy, dxy, 1, dir, avg);
00388 mx += mx;
00389 my += my;
00390 } else if (mode == HALFPEL_MODE || mode == PREDICT_MODE) {
00391 mx = ((unsigned)(mx + 1 + 0x3000))/3 + dx - 0x1000;
00392 my = ((unsigned)(my + 1 + 0x3000))/3 + dy - 0x1000;
00393 dxy= (mx&1) + 2*(my&1);
00394
00395 svq3_mc_dir_part (s, x, y, part_width, part_height, mx>>1, my>>1, dxy, 0, dir, avg);
00396 mx *= 3;
00397 my *= 3;
00398 } else {
00399 mx = ((unsigned)(mx + 3 + 0x6000))/6 + dx - 0x1000;
00400 my = ((unsigned)(my + 3 + 0x6000))/6 + dy - 0x1000;
00401
00402 svq3_mc_dir_part (s, x, y, part_width, part_height, mx, my, 0, 0, dir, avg);
00403 mx *= 6;
00404 my *= 6;
00405 }
00406
00407
00408 if (mode != PREDICT_MODE) {
00409 int32_t mv = pack16to32(mx,my);
00410
00411 if (part_height == 8 && i < 8) {
00412 *(int32_t *) h->mv_cache[dir][scan8[k] + 1*8] = mv;
00413
00414 if (part_width == 8 && j < 8) {
00415 *(int32_t *) h->mv_cache[dir][scan8[k] + 1 + 1*8] = mv;
00416 }
00417 }
00418 if (part_width == 8 && j < 8) {
00419 *(int32_t *) h->mv_cache[dir][scan8[k] + 1] = mv;
00420 }
00421 if (part_width == 4 || part_height == 4) {
00422 *(int32_t *) h->mv_cache[dir][scan8[k]] = mv;
00423 }
00424 }
00425
00426
00427 fill_rectangle(s->current_picture.motion_val[dir][b_xy], part_width>>2, part_height>>2, h->b_stride, pack16to32(mx,my), 4);
00428 }
00429 }
00430
00431 return 0;
00432 }
00433
00434 static int svq3_decode_mb (H264Context *h, unsigned int mb_type) {
00435 int i, j, k, m, dir, mode;
00436 int cbp = 0;
00437 uint32_t vlc;
00438 int8_t *top, *left;
00439 MpegEncContext *const s = (MpegEncContext *) h;
00440 const int mb_xy = s->mb_x + s->mb_y*s->mb_stride;
00441 const int b_xy = 4*s->mb_x + 4*s->mb_y*h->b_stride;
00442
00443 h->top_samples_available = (s->mb_y == 0) ? 0x33FF : 0xFFFF;
00444 h->left_samples_available = (s->mb_x == 0) ? 0x5F5F : 0xFFFF;
00445 h->topright_samples_available = 0xFFFF;
00446
00447 if (mb_type == 0) {
00448 if (s->pict_type == P_TYPE || s->next_picture.mb_type[mb_xy] == -1) {
00449 svq3_mc_dir_part (s, 16*s->mb_x, 16*s->mb_y, 16, 16, 0, 0, 0, 0, 0, 0);
00450
00451 if (s->pict_type == B_TYPE) {
00452 svq3_mc_dir_part (s, 16*s->mb_x, 16*s->mb_y, 16, 16, 0, 0, 0, 0, 1, 1);
00453 }
00454
00455 mb_type = MB_TYPE_SKIP;
00456 } else {
00457 mb_type= FFMIN(s->next_picture.mb_type[mb_xy], 6);
00458 if(svq3_mc_dir (h, mb_type, PREDICT_MODE, 0, 0) < 0)
00459 return -1;
00460 if(svq3_mc_dir (h, mb_type, PREDICT_MODE, 1, 1) < 0)
00461 return -1;
00462
00463 mb_type = MB_TYPE_16x16;
00464 }
00465 } else if (mb_type < 8) {
00466 if (h->thirdpel_flag && h->halfpel_flag == !get_bits (&s->gb, 1)) {
00467 mode = THIRDPEL_MODE;
00468 } else if (h->halfpel_flag && h->thirdpel_flag == !get_bits (&s->gb, 1)) {
00469 mode = HALFPEL_MODE;
00470 } else {
00471 mode = FULLPEL_MODE;
00472 }
00473
00474
00475
00476
00477
00478
00479
00480
00481
00482
00483
00484 for (m=0; m < 2; m++) {
00485 if (s->mb_x > 0 && h->intra4x4_pred_mode[mb_xy - 1][0] != -1) {
00486 for (i=0; i < 4; i++) {
00487 *(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];
00488 }
00489 } else {
00490 for (i=0; i < 4; i++) {
00491 *(uint32_t *) h->mv_cache[m][scan8[0] - 1 + i*8] = 0;
00492 }
00493 }
00494 if (s->mb_y > 0) {
00495 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));
00496 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);
00497
00498 if (s->mb_x < (s->mb_width - 1)) {
00499 *(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];
00500 h->ref_cache[m][scan8[0] + 4 - 1*8] =
00501 (h->intra4x4_pred_mode[mb_xy - s->mb_stride + 1][0] == -1 ||
00502 h->intra4x4_pred_mode[mb_xy - s->mb_stride][4] == -1) ? PART_NOT_AVAILABLE : 1;
00503 }else
00504 h->ref_cache[m][scan8[0] + 4 - 1*8] = PART_NOT_AVAILABLE;
00505 if (s->mb_x > 0) {
00506 *(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];
00507 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;
00508 }else
00509 h->ref_cache[m][scan8[0] - 1 - 1*8] = PART_NOT_AVAILABLE;
00510 }else
00511 memset (&h->ref_cache[m][scan8[0] - 1*8 - 1], PART_NOT_AVAILABLE, 8);
00512
00513 if (s->pict_type != B_TYPE)
00514 break;
00515 }
00516
00517
00518 if (s->pict_type == P_TYPE) {
00519 if(svq3_mc_dir (h, (mb_type - 1), mode, 0, 0) < 0)
00520 return -1;
00521 } else {
00522 if (mb_type != 2) {
00523 if(svq3_mc_dir (h, 0, mode, 0, 0) < 0)
00524 return -1;
00525 } else {
00526 for (i=0; i < 4; i++) {
00527 memset (s->current_picture.motion_val[0][b_xy + i*h->b_stride], 0, 4*2*sizeof(int16_t));
00528 }
00529 }
00530 if (mb_type != 1) {
00531 if(svq3_mc_dir (h, 0, mode, 1, (mb_type == 3)) < 0)
00532 return -1;
00533 } else {
00534 for (i=0; i < 4; i++) {
00535 memset (s->current_picture.motion_val[1][b_xy + i*h->b_stride], 0, 4*2*sizeof(int16_t));
00536 }
00537 }
00538 }
00539
00540 mb_type = MB_TYPE_16x16;
00541 } else if (mb_type == 8 || mb_type == 33) {
00542 memset (h->intra4x4_pred_mode_cache, -1, 8*5*sizeof(int8_t));
00543
00544 if (mb_type == 8) {
00545 if (s->mb_x > 0) {
00546 for (i=0; i < 4; i++) {
00547 h->intra4x4_pred_mode_cache[scan8[0] - 1 + i*8] = h->intra4x4_pred_mode[mb_xy - 1][i];
00548 }
00549 if (h->intra4x4_pred_mode_cache[scan8[0] - 1] == -1) {
00550 h->left_samples_available = 0x5F5F;
00551 }
00552 }
00553 if (s->mb_y > 0) {
00554 h->intra4x4_pred_mode_cache[4+8*0] = h->intra4x4_pred_mode[mb_xy - s->mb_stride][4];
00555 h->intra4x4_pred_mode_cache[5+8*0] = h->intra4x4_pred_mode[mb_xy - s->mb_stride][5];
00556 h->intra4x4_pred_mode_cache[6+8*0] = h->intra4x4_pred_mode[mb_xy - s->mb_stride][6];
00557 h->intra4x4_pred_mode_cache[7+8*0] = h->intra4x4_pred_mode[mb_xy - s->mb_stride][3];
00558
00559 if (h->intra4x4_pred_mode_cache[4+8*0] == -1) {
00560 h->top_samples_available = 0x33FF;
00561 }
00562 }
00563
00564
00565 for (i=0; i < 16; i+=2) {
00566 vlc = svq3_get_ue_golomb (&s->gb);
00567
00568 if (vlc >= 25){
00569 av_log(h->s.avctx, AV_LOG_ERROR, "luma prediction:%d\n", vlc);
00570 return -1;
00571 }
00572
00573 left = &h->intra4x4_pred_mode_cache[scan8[i] - 1];
00574 top = &h->intra4x4_pred_mode_cache[scan8[i] - 8];
00575
00576 left[1] = svq3_pred_1[top[0] + 1][left[0] + 1][svq3_pred_0[vlc][0]];
00577 left[2] = svq3_pred_1[top[1] + 1][left[1] + 1][svq3_pred_0[vlc][1]];
00578
00579 if (left[1] == -1 || left[2] == -1){
00580 av_log(h->s.avctx, AV_LOG_ERROR, "weird prediction\n");
00581 return -1;
00582 }
00583 }
00584 } else {
00585 for (i=0; i < 4; i++) {
00586 memset (&h->intra4x4_pred_mode_cache[scan8[0] + 8*i], DC_PRED, 4);
00587 }
00588 }
00589
00590 write_back_intra_pred_mode (h);
00591
00592 if (mb_type == 8) {
00593 check_intra4x4_pred_mode (h);
00594
00595 h->top_samples_available = (s->mb_y == 0) ? 0x33FF : 0xFFFF;
00596 h->left_samples_available = (s->mb_x == 0) ? 0x5F5F : 0xFFFF;
00597 } else {
00598 for (i=0; i < 4; i++) {
00599 memset (&h->intra4x4_pred_mode_cache[scan8[0] + 8*i], DC_128_PRED, 4);
00600 }
00601
00602 h->top_samples_available = 0x33FF;
00603 h->left_samples_available = 0x5F5F;
00604 }
00605
00606 mb_type = MB_TYPE_INTRA4x4;
00607 } else {
00608 dir = i_mb_type_info[mb_type - 8].pred_mode;
00609 dir = (dir >> 1) ^ 3*(dir & 1) ^ 1;
00610
00611 if ((h->intra16x16_pred_mode = check_intra_pred_mode (h, dir)) == -1){
00612 av_log(h->s.avctx, AV_LOG_ERROR, "check_intra_pred_mode = -1\n");
00613 return -1;
00614 }
00615
00616 cbp = i_mb_type_info[mb_type - 8].cbp;
00617 mb_type = MB_TYPE_INTRA16x16;
00618 }
00619
00620 if (!IS_INTER(mb_type) && s->pict_type != I_TYPE) {
00621 for (i=0; i < 4; i++) {
00622 memset (s->current_picture.motion_val[0][b_xy + i*h->b_stride], 0, 4*2*sizeof(int16_t));
00623 }
00624 if (s->pict_type == B_TYPE) {
00625 for (i=0; i < 4; i++) {
00626 memset (s->current_picture.motion_val[1][b_xy + i*h->b_stride], 0, 4*2*sizeof(int16_t));
00627 }
00628 }
00629 }
00630 if (!IS_INTRA4x4(mb_type)) {
00631 memset (h->intra4x4_pred_mode[mb_xy], DC_PRED, 8);
00632 }
00633 if (!IS_SKIP(mb_type) || s->pict_type == B_TYPE) {
00634 memset (h->non_zero_count_cache + 8, 0, 4*9*sizeof(uint8_t));
00635 s->dsp.clear_blocks(h->mb);
00636 }
00637
00638 if (!IS_INTRA16x16(mb_type) && (!IS_SKIP(mb_type) || s->pict_type == B_TYPE)) {
00639 if ((vlc = svq3_get_ue_golomb (&s->gb)) >= 48){
00640 av_log(h->s.avctx, AV_LOG_ERROR, "cbp_vlc=%d\n", vlc);
00641 return -1;
00642 }
00643
00644 cbp = IS_INTRA(mb_type) ? golomb_to_intra4x4_cbp[vlc] : golomb_to_inter_cbp[vlc];
00645 }
00646 if (IS_INTRA16x16(mb_type) || (s->pict_type != I_TYPE && s->adaptive_quant && cbp)) {
00647 s->qscale += svq3_get_se_golomb (&s->gb);
00648
00649 if (s->qscale > 31){
00650 av_log(h->s.avctx, AV_LOG_ERROR, "qscale:%d\n", s->qscale);
00651 return -1;
00652 }
00653 }
00654 if (IS_INTRA16x16(mb_type)) {
00655 if (svq3_decode_block (&s->gb, h->mb, 0, 0)){
00656 av_log(h->s.avctx, AV_LOG_ERROR, "error while decoding intra luma dc\n");
00657 return -1;
00658 }
00659 }
00660
00661 if (cbp) {
00662 const int index = IS_INTRA16x16(mb_type) ? 1 : 0;
00663 const int type = ((s->qscale < 24 && IS_INTRA4x4(mb_type)) ? 2 : 1);
00664
00665 for (i=0; i < 4; i++) {
00666 if ((cbp & (1 << i))) {
00667 for (j=0; j < 4; j++) {
00668 k = index ? ((j&1) + 2*(i&1) + 2*(j&2) + 4*(i&2)) : (4*i + j);
00669 h->non_zero_count_cache[ scan8[k] ] = 1;
00670
00671 if (svq3_decode_block (&s->gb, &h->mb[16*k], index, type)){
00672 av_log(h->s.avctx, AV_LOG_ERROR, "error while decoding block\n");
00673 return -1;
00674 }
00675 }
00676 }
00677 }
00678
00679 if ((cbp & 0x30)) {
00680 for (i=0; i < 2; ++i) {
00681 if (svq3_decode_block (&s->gb, &h->mb[16*(16 + 4*i)], 0, 3)){
00682 av_log(h->s.avctx, AV_LOG_ERROR, "error while decoding chroma dc block\n");
00683 return -1;
00684 }
00685 }
00686
00687 if ((cbp & 0x20)) {
00688 for (i=0; i < 8; i++) {
00689 h->non_zero_count_cache[ scan8[16+i] ] = 1;
00690
00691 if (svq3_decode_block (&s->gb, &h->mb[16*(16 + i)], 1, 1)){
00692 av_log(h->s.avctx, AV_LOG_ERROR, "error while decoding chroma ac block\n");
00693 return -1;
00694 }
00695 }
00696 }
00697 }
00698 }
00699
00700 s->current_picture.mb_type[mb_xy] = mb_type;
00701
00702 if (IS_INTRA(mb_type)) {
00703 h->chroma_pred_mode = check_intra_pred_mode (h, DC_PRED8x8);
00704 }
00705
00706 return 0;
00707 }
00708
00709 static int svq3_decode_slice_header (H264Context *h) {
00710 MpegEncContext *const s = (MpegEncContext *) h;
00711 const int mb_xy = s->mb_x + s->mb_y*s->mb_stride;
00712 int i, header;
00713
00714 header = get_bits (&s->gb, 8);
00715
00716 if (((header & 0x9F) != 1 && (header & 0x9F) != 2) || (header & 0x60) == 0) {
00717
00718 av_log(h->s.avctx, AV_LOG_ERROR, "unsupported slice header (%02X)\n", header);
00719 return -1;
00720 } else {
00721 int length = (header >> 5) & 3;
00722
00723 h->next_slice_index = get_bits_count(&s->gb) + 8*show_bits (&s->gb, 8*length) + 8*length;
00724
00725 if (h->next_slice_index > s->gb.size_in_bits){
00726 av_log(h->s.avctx, AV_LOG_ERROR, "slice after bitstream end\n");
00727 return -1;
00728 }
00729
00730 s->gb.size_in_bits = h->next_slice_index - 8*(length - 1);
00731 skip_bits(&s->gb, 8);
00732
00733 if (length > 0) {
00734 memcpy ((uint8_t *) &s->gb.buffer[get_bits_count(&s->gb) >> 3],
00735 &s->gb.buffer[s->gb.size_in_bits >> 3], (length - 1));
00736 }
00737 }
00738
00739 if ((i = svq3_get_ue_golomb (&s->gb)) == INVALID_VLC || i >= 3){
00740 av_log(h->s.avctx, AV_LOG_ERROR, "illegal slice type %d \n", i);
00741 return -1;
00742 }
00743
00744 h->slice_type = golomb_to_pict_type[i];
00745
00746 if ((header & 0x9F) == 2) {
00747 i = (s->mb_num < 64) ? 6 : (1 + av_log2 (s->mb_num - 1));
00748 s->mb_skip_run = get_bits (&s->gb, i) - (s->mb_x + (s->mb_y * s->mb_width));
00749 } else {
00750 get_bits1 (&s->gb);
00751 s->mb_skip_run = 0;
00752 }
00753
00754 h->slice_num = get_bits (&s->gb, 8);
00755 s->qscale = get_bits (&s->gb, 5);
00756 s->adaptive_quant = get_bits1 (&s->gb);
00757
00758
00759 get_bits1 (&s->gb);
00760
00761 if (h->unknown_svq3_flag) {
00762 get_bits1 (&s->gb);
00763 }
00764
00765 get_bits1 (&s->gb);
00766 get_bits (&s->gb, 2);
00767
00768 while (get_bits1 (&s->gb)) {
00769 get_bits (&s->gb, 8);
00770 }
00771
00772
00773 if (s->mb_x > 0) {
00774 memset (h->intra4x4_pred_mode[mb_xy - 1], -1, 4*sizeof(int8_t));
00775 memset (h->intra4x4_pred_mode[mb_xy - s->mb_x], -1, 8*sizeof(int8_t)*s->mb_x);
00776 }
00777 if (s->mb_y > 0) {
00778 memset (h->intra4x4_pred_mode[mb_xy - s->mb_stride], -1, 8*sizeof(int8_t)*(s->mb_width - s->mb_x));
00779
00780 if (s->mb_x > 0) {
00781 h->intra4x4_pred_mode[mb_xy - s->mb_stride - 1][3] = -1;
00782 }
00783 }
00784
00785 return 0;
00786 }
00787
00788 static int svq3_decode_frame (AVCodecContext *avctx,
00789 void *data, int *data_size,
00790 uint8_t *buf, int buf_size) {
00791 MpegEncContext *const s = avctx->priv_data;
00792 H264Context *const h = avctx->priv_data;
00793 int m, mb_type;
00794 unsigned char *extradata;
00795 unsigned int size;
00796
00797 s->flags = avctx->flags;
00798 s->flags2 = avctx->flags2;
00799 s->unrestricted_mv = 1;
00800
00801 if (!s->context_initialized) {
00802 s->width = avctx->width;
00803 s->height = avctx->height;
00804 h->pred4x4[DIAG_DOWN_LEFT_PRED] = pred4x4_down_left_svq3_c;
00805 h->pred16x16[PLANE_PRED8x8] = pred16x16_plane_svq3_c;
00806 h->halfpel_flag = 1;
00807 h->thirdpel_flag = 1;
00808 h->unknown_svq3_flag = 0;
00809 h->chroma_qp = 4;
00810
00811 if (MPV_common_init (s) < 0)
00812 return -1;
00813
00814 h->b_stride = 4*s->mb_width;
00815
00816 alloc_tables (h);
00817
00818
00819 extradata = (unsigned char *)avctx->extradata;
00820 for (m = 0; m < avctx->extradata_size; m++) {
00821 if (!memcmp (extradata, "SEQH", 4))
00822 break;
00823 extradata++;
00824 }
00825
00826
00827 if (!memcmp (extradata, "SEQH", 4)) {
00828
00829 GetBitContext gb;
00830
00831 size = BE_32(&extradata[4]);
00832 init_get_bits (&gb, extradata + 8, size);
00833
00834
00835 if (get_bits (&gb, 3) == 7) {
00836 get_bits (&gb, 12);
00837 get_bits (&gb, 12);
00838 }
00839
00840 h->halfpel_flag = get_bits1 (&gb);
00841 h->thirdpel_flag = get_bits1 (&gb);
00842
00843
00844 get_bits1 (&gb);
00845 get_bits1 (&gb);
00846 get_bits1 (&gb);
00847 get_bits1 (&gb);
00848
00849 s->low_delay = get_bits1 (&gb);
00850
00851
00852 get_bits1 (&gb);
00853
00854 while (get_bits1 (&gb)) {
00855 get_bits (&gb, 8);
00856 }
00857
00858 h->unknown_svq3_flag = get_bits1 (&gb);
00859 avctx->has_b_frames = !s->low_delay;
00860 }
00861 }
00862
00863
00864 if (buf_size == 0) {
00865 if (s->next_picture_ptr && !s->low_delay) {
00866 *(AVFrame *) data = *(AVFrame *) &s->next_picture;
00867 *data_size = sizeof(AVFrame);
00868 }
00869 return 0;
00870 }
00871
00872 init_get_bits (&s->gb, buf, 8*buf_size);
00873
00874 s->mb_x = s->mb_y = 0;
00875
00876 if (svq3_decode_slice_header (h))
00877 return -1;
00878
00879 s->pict_type = h->slice_type;
00880 s->picture_number = h->slice_num;
00881
00882 if(avctx->debug&FF_DEBUG_PICT_INFO){
00883 av_log(h->s.avctx, AV_LOG_DEBUG, "%c hpel:%d, tpel:%d aqp:%d qp:%d\n",
00884 av_get_pict_type_char(s->pict_type), h->halfpel_flag, h->thirdpel_flag,
00885 s->adaptive_quant, s->qscale
00886 );
00887 }
00888
00889
00890 s->current_picture.pict_type = s->pict_type;
00891 s->current_picture.key_frame = (s->pict_type == I_TYPE);
00892
00893
00894 if (s->last_picture_ptr == NULL && s->pict_type == B_TYPE) return 0;
00895
00896 if (avctx->hurry_up && s->pict_type == B_TYPE) return 0;
00897
00898 if (avctx->hurry_up >= 5) return 0;
00899 if( (avctx->skip_frame >= AVDISCARD_NONREF && s->pict_type==B_TYPE)
00900 ||(avctx->skip_frame >= AVDISCARD_NONKEY && s->pict_type!=I_TYPE)
00901 || avctx->skip_frame >= AVDISCARD_ALL)
00902 return 0;
00903
00904 if (s->next_p_frame_damaged) {
00905 if (s->pict_type == B_TYPE)
00906 return 0;
00907 else
00908 s->next_p_frame_damaged = 0;
00909 }
00910
00911 frame_start (h);
00912
00913 if (s->pict_type == B_TYPE) {
00914 h->frame_num_offset = (h->slice_num - h->prev_frame_num);
00915
00916 if (h->frame_num_offset < 0) {
00917 h->frame_num_offset += 256;
00918 }
00919 if (h->frame_num_offset == 0 || h->frame_num_offset >= h->prev_frame_num_offset) {
00920 av_log(h->s.avctx, AV_LOG_ERROR, "error in B-frame picture id\n");
00921 return -1;
00922 }
00923 } else {
00924 h->prev_frame_num = h->frame_num;
00925 h->frame_num = h->slice_num;
00926 h->prev_frame_num_offset = (h->frame_num - h->prev_frame_num);
00927
00928 if (h->prev_frame_num_offset < 0) {
00929 h->prev_frame_num_offset += 256;
00930 }
00931 }
00932
00933 for(m=0; m<2; m++){
00934 int i;
00935 for(i=0; i<4; i++){
00936 int j;
00937 for(j=-1; j<4; j++)
00938 h->ref_cache[m][scan8[0] + 8*i + j]= 1;
00939 h->ref_cache[m][scan8[0] + 8*i + j]= PART_NOT_AVAILABLE;
00940 }
00941 }
00942
00943 for (s->mb_y=0; s->mb_y < s->mb_height; s->mb_y++) {
00944 for (s->mb_x=0; s->mb_x < s->mb_width; s->mb_x++) {
00945
00946 if ( (get_bits_count(&s->gb) + 7) >= s->gb.size_in_bits &&
00947 ((get_bits_count(&s->gb) & 7) == 0 || show_bits (&s->gb, (-get_bits_count(&s->gb) & 7)) == 0)) {
00948
00949 skip_bits(&s->gb, h->next_slice_index - get_bits_count(&s->gb));
00950 s->gb.size_in_bits = 8*buf_size;
00951
00952 if (svq3_decode_slice_header (h))
00953 return -1;
00954
00955
00956 }
00957
00958 mb_type = svq3_get_ue_golomb (&s->gb);
00959
00960 if (s->pict_type == I_TYPE) {
00961 mb_type += 8;
00962 } else if (s->pict_type == B_TYPE && mb_type >= 4) {
00963 mb_type += 4;
00964 }
00965 if (mb_type > 33 || svq3_decode_mb (h, mb_type)) {
00966 av_log(h->s.avctx, AV_LOG_ERROR, "error while decoding MB %d %d\n", s->mb_x, s->mb_y);
00967 return -1;
00968 }
00969
00970 if (mb_type != 0) {
00971 hl_decode_mb (h);
00972 }
00973
00974 if (s->pict_type != B_TYPE && !s->low_delay) {
00975 s->current_picture.mb_type[s->mb_x + s->mb_y*s->mb_stride] =
00976 (s->pict_type == P_TYPE && mb_type < 8) ? (mb_type - 1) : -1;
00977 }
00978 }
00979
00980 ff_draw_horiz_band(s, 16*s->mb_y, 16);
00981 }
00982
00983 MPV_frame_end(s);
00984
00985 if (s->pict_type == B_TYPE || s->low_delay) {
00986 *(AVFrame *) data = *(AVFrame *) &s->current_picture;
00987 } else {
00988 *(AVFrame *) data = *(AVFrame *) &s->last_picture;
00989 }
00990
00991 avctx->frame_number = s->picture_number - 1;
00992
00993
00994 if (s->last_picture_ptr || s->low_delay) {
00995 *data_size = sizeof(AVFrame);
00996 }
00997
00998 return buf_size;
00999 }
01000
01001
01002 AVCodec svq3_decoder = {
01003 "svq3",
01004 CODEC_TYPE_VIDEO,
01005 CODEC_ID_SVQ3,
01006 sizeof(H264Context),
01007 decode_init,
01008 NULL,
01009 decode_end,
01010 svq3_decode_frame,
01011 CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 | CODEC_CAP_DELAY,
01012 };