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