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