00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00028
00029 #include "avcodec.h"
00030 #include "dsputil.h"
00031 #include "mpegvideo.h"
00032
00033 #include "mpeg12.h"
00034 #include "mpeg12data.h"
00035 #include "mpeg12decdata.h"
00036 #include "bytestream.h"
00037
00038
00039
00040
00041 #ifdef HAVE_DVDV
00042 #include "dvdv.h"
00043 #endif
00044
00045 #define DC_VLC_BITS 9
00046 #define MV_VLC_BITS 9
00047 #define MBINCR_VLC_BITS 9
00048 #define MB_PAT_VLC_BITS 9
00049 #define MB_PTYPE_VLC_BITS 6
00050 #define MB_BTYPE_VLC_BITS 6
00051 #define TEX_VLC_BITS 9
00052
00053 static inline int mpeg1_decode_block_inter(MpegEncContext *s,
00054 DCTELEM *block,
00055 int n);
00056 static inline int mpeg1_decode_block_intra(MpegEncContext *s,
00057 DCTELEM *block,
00058 int n);
00059 static inline int mpeg1_fast_decode_block_inter(MpegEncContext *s, DCTELEM *block, int n);
00060 static inline int mpeg2_decode_block_non_intra(MpegEncContext *s,
00061 DCTELEM *block,
00062 int n);
00063 static inline int mpeg2_decode_block_intra(MpegEncContext *s,
00064 DCTELEM *block,
00065 int n);
00066 static inline int mpeg2_fast_decode_block_non_intra(MpegEncContext *s, DCTELEM *block, int n);
00067 static inline int mpeg2_fast_decode_block_intra(MpegEncContext *s, DCTELEM *block, int n);
00068 static int mpeg_decode_motion(MpegEncContext *s, int fcode, int pred);
00069 static void exchange_uv(MpegEncContext *s);
00070
00071 extern int XVMC_field_start(MpegEncContext *s, AVCodecContext *avctx);
00072 extern int XVMC_field_end(MpegEncContext *s);
00073 extern void XVMC_pack_pblocks(MpegEncContext *s,int cbp);
00074 extern void XVMC_init_block(MpegEncContext *s);
00075
00076 #ifdef HAVE_XVMC_VLD
00077 extern int XVMC_VLD_field_start(MpegEncContext *s, AVCodecContext *avctx);
00078 extern int XVMC_VLD_field_end(MpegEncContext *s);
00079 extern int XVMC_VLD_decode_slice(MpegEncContext *s, int start_code,
00080 uint8_t *buffer, int buf_size);
00081 #endif
00082
00083 #ifdef HAVE_DVDV
00084 extern void DVDV_init_block(MpegEncContext *s);
00085 extern void DVDV_decode_mb(MpegEncContext *s);
00086 #endif
00087
00088 static const enum PixelFormat pixfmt_yuv_420[]= {PIX_FMT_YUV420P,-1};
00089 static const enum PixelFormat pixfmt_yuv_422[]= {PIX_FMT_YUV422P,-1};
00090 static const enum PixelFormat pixfmt_yuv_444[]= {PIX_FMT_YUV444P,-1};
00091 static const enum PixelFormat pixfmt_xvmc_mpg2_420[] = {
00092 PIX_FMT_XVMC_MPEG2_IDCT,
00093 PIX_FMT_XVMC_MPEG2_MC,
00094 -1};
00095
00096 uint8_t ff_mpeg12_static_rl_table_store[2][2][2*MAX_RUN + MAX_LEVEL + 3];
00097
00098 static void init_2d_vlc_rl(RLTable *rl, int use_static)
00099 {
00100 int i;
00101
00102 init_vlc(&rl->vlc, TEX_VLC_BITS, rl->n + 2,
00103 &rl->table_vlc[0][1], 4, 2,
00104 &rl->table_vlc[0][0], 4, 2, use_static);
00105
00106 if(use_static)
00107 rl->rl_vlc[0]= av_mallocz_static(rl->vlc.table_size*sizeof(RL_VLC_ELEM));
00108 else
00109 rl->rl_vlc[0]= av_malloc(rl->vlc.table_size*sizeof(RL_VLC_ELEM));
00110
00111 for(i=0; i<rl->vlc.table_size; i++){
00112 int code= rl->vlc.table[i][0];
00113 int len = rl->vlc.table[i][1];
00114 int level, run;
00115
00116 if(len==0){
00117 run= 65;
00118 level= MAX_LEVEL;
00119 }else if(len<0){
00120 run= 0;
00121 level= code;
00122 }else{
00123 if(code==rl->n){
00124 run= 65;
00125 level= 0;
00126 }else if(code==rl->n+1){
00127 run= 0;
00128 level= 127;
00129 }else{
00130 run= rl->table_run [code] + 1;
00131 level= rl->table_level[code];
00132 }
00133 }
00134 rl->rl_vlc[0][i].len= len;
00135 rl->rl_vlc[0][i].level= level;
00136 rl->rl_vlc[0][i].run= run;
00137 }
00138 }
00139
00140 void ff_mpeg12_common_init(MpegEncContext *s)
00141 {
00142
00143 s->y_dc_scale_table=
00144 s->c_dc_scale_table= mpeg2_dc_scale_table[s->intra_dc_precision];
00145
00146 }
00147
00148 void ff_mpeg1_clean_buffers(MpegEncContext *s){
00149 s->last_dc[0] = 1 << (7 + s->intra_dc_precision);
00150 s->last_dc[1] = s->last_dc[0];
00151 s->last_dc[2] = s->last_dc[0];
00152 memset(s->last_mv, 0, sizeof(s->last_mv));
00153 }
00154
00155
00156
00157
00158
00159 static VLC dc_lum_vlc;
00160 static VLC dc_chroma_vlc;
00161 static VLC mv_vlc;
00162 static VLC mbincr_vlc;
00163 static VLC mb_ptype_vlc;
00164 static VLC mb_btype_vlc;
00165 static VLC mb_pat_vlc;
00166
00167 static void init_vlcs(void)
00168 {
00169 static int done = 0;
00170
00171 if (!done) {
00172 done = 1;
00173
00174 init_vlc(&dc_lum_vlc, DC_VLC_BITS, 12,
00175 ff_mpeg12_vlc_dc_lum_bits, 1, 1,
00176 ff_mpeg12_vlc_dc_lum_code, 2, 2, 1);
00177 init_vlc(&dc_chroma_vlc, DC_VLC_BITS, 12,
00178 ff_mpeg12_vlc_dc_chroma_bits, 1, 1,
00179 ff_mpeg12_vlc_dc_chroma_code, 2, 2, 1);
00180 init_vlc(&mv_vlc, MV_VLC_BITS, 17,
00181 &ff_mpeg12_mbMotionVectorTable[0][1], 2, 1,
00182 &ff_mpeg12_mbMotionVectorTable[0][0], 2, 1, 1);
00183 init_vlc(&mbincr_vlc, MBINCR_VLC_BITS, 36,
00184 &ff_mpeg12_mbAddrIncrTable[0][1], 2, 1,
00185 &ff_mpeg12_mbAddrIncrTable[0][0], 2, 1, 1);
00186 init_vlc(&mb_pat_vlc, MB_PAT_VLC_BITS, 64,
00187 &ff_mpeg12_mbPatTable[0][1], 2, 1,
00188 &ff_mpeg12_mbPatTable[0][0], 2, 1, 1);
00189
00190 init_vlc(&mb_ptype_vlc, MB_PTYPE_VLC_BITS, 7,
00191 &table_mb_ptype[0][1], 2, 1,
00192 &table_mb_ptype[0][0], 2, 1, 1);
00193 init_vlc(&mb_btype_vlc, MB_BTYPE_VLC_BITS, 11,
00194 &table_mb_btype[0][1], 2, 1,
00195 &table_mb_btype[0][0], 2, 1, 1);
00196 init_rl(&ff_rl_mpeg1, ff_mpeg12_static_rl_table_store[0]);
00197 init_rl(&ff_rl_mpeg2, ff_mpeg12_static_rl_table_store[1]);
00198
00199 init_2d_vlc_rl(&ff_rl_mpeg1, 1);
00200 init_2d_vlc_rl(&ff_rl_mpeg2, 1);
00201 }
00202 }
00203
00204 static inline int get_dmv(MpegEncContext *s)
00205 {
00206 if(get_bits1(&s->gb))
00207 return 1 - (get_bits1(&s->gb) << 1);
00208 else
00209 return 0;
00210 }
00211
00212 static inline int get_qscale(MpegEncContext *s)
00213 {
00214 int qscale = get_bits(&s->gb, 5);
00215 if (s->q_scale_type) {
00216 return non_linear_qscale[qscale];
00217 } else {
00218 return qscale << 1;
00219 }
00220 }
00221
00222
00223 #define MT_FIELD 1
00224 #define MT_FRAME 2
00225 #define MT_16X8 2
00226 #define MT_DMV 3
00227
00228 static int mpeg_decode_mb(MpegEncContext *s,
00229 DCTELEM block[12][64])
00230 {
00231 int i, j, k, cbp, val, mb_type, motion_type;
00232 const int mb_block_count = 4 + (1<< s->chroma_format);
00233
00234 dprintf(s->avctx, "decode_mb: x=%d y=%d\n", s->mb_x, s->mb_y);
00235
00236 assert(s->mb_skipped==0);
00237
00238 if (s->mb_skip_run-- != 0) {
00239 if (s->pict_type == P_TYPE) {
00240 s->mb_skipped = 1;
00241 s->current_picture.mb_type[ s->mb_x + s->mb_y*s->mb_stride ]= MB_TYPE_SKIP | MB_TYPE_L0 | MB_TYPE_16x16;
00242 } else {
00243 int mb_type;
00244
00245 if(s->mb_x)
00246 mb_type= s->current_picture.mb_type[ s->mb_x + s->mb_y*s->mb_stride - 1];
00247 else
00248 mb_type= s->current_picture.mb_type[ s->mb_width + (s->mb_y-1)*s->mb_stride - 1];
00249 if(IS_INTRA(mb_type))
00250 return -1;
00251
00252 s->current_picture.mb_type[ s->mb_x + s->mb_y*s->mb_stride ]=
00253 mb_type | MB_TYPE_SKIP;
00254
00255
00256 if((s->mv[0][0][0]|s->mv[0][0][1]|s->mv[1][0][0]|s->mv[1][0][1])==0)
00257 s->mb_skipped = 1;
00258 }
00259
00260 #ifdef HAVE_DVDV
00261 if (s->avctx->dvdv)
00262 *DVDV_CBP(s)++ = 0;
00263 #endif
00264
00265 return 0;
00266 }
00267
00268 switch(s->pict_type) {
00269 default:
00270 case I_TYPE:
00271 if (get_bits1(&s->gb) == 0) {
00272 if (get_bits1(&s->gb) == 0){
00273 av_log(s->avctx, AV_LOG_ERROR, "invalid mb type in I Frame at %d %d\n", s->mb_x, s->mb_y);
00274 return -1;
00275 }
00276 mb_type = MB_TYPE_QUANT | MB_TYPE_INTRA;
00277 } else {
00278 mb_type = MB_TYPE_INTRA;
00279 }
00280 break;
00281 case P_TYPE:
00282 mb_type = get_vlc2(&s->gb, mb_ptype_vlc.table, MB_PTYPE_VLC_BITS, 1);
00283 if (mb_type < 0){
00284 av_log(s->avctx, AV_LOG_ERROR, "invalid mb type in P Frame at %d %d\n", s->mb_x, s->mb_y);
00285 return -1;
00286 }
00287 mb_type = ptype2mb_type[ mb_type ];
00288 break;
00289 case B_TYPE:
00290 mb_type = get_vlc2(&s->gb, mb_btype_vlc.table, MB_BTYPE_VLC_BITS, 1);
00291 if (mb_type < 0){
00292 av_log(s->avctx, AV_LOG_ERROR, "invalid mb type in B Frame at %d %d\n", s->mb_x, s->mb_y);
00293 return -1;
00294 }
00295 mb_type = btype2mb_type[ mb_type ];
00296 break;
00297 }
00298 dprintf(s->avctx, "mb_type=%x\n", mb_type);
00299
00300 if (IS_INTRA(mb_type)) {
00301 s->dsp.clear_blocks(s->block[0]);
00302
00303 if(!s->chroma_y_shift){
00304 s->dsp.clear_blocks(s->block[6]);
00305 }
00306
00307
00308 if (s->picture_structure == PICT_FRAME &&
00309 !s->frame_pred_frame_dct) {
00310 s->interlaced_dct = get_bits1(&s->gb);
00311 }
00312
00313 if (IS_QUANT(mb_type))
00314 s->qscale = get_qscale(s);
00315
00316 if (s->concealment_motion_vectors) {
00317
00318 if (s->picture_structure != PICT_FRAME)
00319 skip_bits1(&s->gb);
00320
00321 s->mv[0][0][0]= s->last_mv[0][0][0]= s->last_mv[0][1][0] =
00322 mpeg_decode_motion(s, s->mpeg_f_code[0][0], s->last_mv[0][0][0]);
00323 s->mv[0][0][1]= s->last_mv[0][0][1]= s->last_mv[0][1][1] =
00324 mpeg_decode_motion(s, s->mpeg_f_code[0][1], s->last_mv[0][0][1]);
00325
00326 skip_bits1(&s->gb);
00327 }else
00328 memset(s->last_mv, 0, sizeof(s->last_mv));
00329 s->mb_intra = 1;
00330 #ifdef HAVE_XVMC
00331
00332 if(s->avctx->xvmc_acceleration > 1){
00333 XVMC_pack_pblocks(s,-1);
00334 if(s->swap_uv){
00335 exchange_uv(s);
00336 }
00337 }
00338 #endif
00339 #ifdef HAVE_DVDV
00340 if (s->avctx->dvdv)
00341 *DVDV_CBP(s)++ = 0x3F;
00342 #endif
00343
00344 if (s->codec_id == CODEC_ID_MPEG2VIDEO) {
00345 if(s->flags2 & CODEC_FLAG2_FAST){
00346 for(i=0;i<6;i++) {
00347 mpeg2_fast_decode_block_intra(s, s->pblocks[i], i);
00348 }
00349 }else{
00350 for(i=0;i<mb_block_count;i++) {
00351 if (mpeg2_decode_block_intra(s, s->pblocks[i], i) < 0)
00352 return -1;
00353 }
00354 }
00355 } else {
00356 for(i=0;i<6;i++) {
00357 if (mpeg1_decode_block_intra(s, s->pblocks[i], i) < 0)
00358 return -1;
00359 }
00360 }
00361 } else {
00362 if (mb_type & MB_TYPE_ZERO_MV){
00363 assert(mb_type & MB_TYPE_CBP);
00364
00365 s->mv_dir = MV_DIR_FORWARD;
00366 if(s->picture_structure == PICT_FRAME){
00367 if(!s->frame_pred_frame_dct)
00368 s->interlaced_dct = get_bits1(&s->gb);
00369 s->mv_type = MV_TYPE_16X16;
00370 }else{
00371 s->mv_type = MV_TYPE_FIELD;
00372 mb_type |= MB_TYPE_INTERLACED;
00373 s->field_select[0][0]= s->picture_structure - 1;
00374 }
00375
00376 if (IS_QUANT(mb_type))
00377 s->qscale = get_qscale(s);
00378
00379 s->last_mv[0][0][0] = 0;
00380 s->last_mv[0][0][1] = 0;
00381 s->last_mv[0][1][0] = 0;
00382 s->last_mv[0][1][1] = 0;
00383 s->mv[0][0][0] = 0;
00384 s->mv[0][0][1] = 0;
00385 }else{
00386 assert(mb_type & MB_TYPE_L0L1);
00387
00388
00389 if (s->frame_pred_frame_dct)
00390 motion_type = MT_FRAME;
00391 else{
00392 motion_type = get_bits(&s->gb, 2);
00393 if (s->picture_structure == PICT_FRAME && HAS_CBP(mb_type))
00394 s->interlaced_dct = get_bits1(&s->gb);
00395 }
00396
00397 if (IS_QUANT(mb_type))
00398 s->qscale = get_qscale(s);
00399
00400
00401 s->mv_dir= (mb_type>>13)&3;
00402 dprintf(s->avctx, "motion_type=%d\n", motion_type);
00403 switch(motion_type) {
00404 case MT_FRAME:
00405 if (s->picture_structure == PICT_FRAME) {
00406 mb_type |= MB_TYPE_16x16;
00407 s->mv_type = MV_TYPE_16X16;
00408 for(i=0;i<2;i++) {
00409 if (USES_LIST(mb_type, i)) {
00410
00411 s->mv[i][0][0]= s->last_mv[i][0][0]= s->last_mv[i][1][0] =
00412 mpeg_decode_motion(s, s->mpeg_f_code[i][0], s->last_mv[i][0][0]);
00413 s->mv[i][0][1]= s->last_mv[i][0][1]= s->last_mv[i][1][1] =
00414 mpeg_decode_motion(s, s->mpeg_f_code[i][1], s->last_mv[i][0][1]);
00415
00416 if (s->full_pel[i]){
00417 s->mv[i][0][0] <<= 1;
00418 s->mv[i][0][1] <<= 1;
00419 }
00420 }
00421 }
00422 } else {
00423 mb_type |= MB_TYPE_16x8 | MB_TYPE_INTERLACED;
00424 s->mv_type = MV_TYPE_16X8;
00425 for(i=0;i<2;i++) {
00426 if (USES_LIST(mb_type, i)) {
00427
00428 for(j=0;j<2;j++) {
00429 s->field_select[i][j] = get_bits1(&s->gb);
00430 for(k=0;k<2;k++) {
00431 val = mpeg_decode_motion(s, s->mpeg_f_code[i][k],
00432 s->last_mv[i][j][k]);
00433 s->last_mv[i][j][k] = val;
00434 s->mv[i][j][k] = val;
00435 }
00436 }
00437 }
00438 }
00439 }
00440 break;
00441 case MT_FIELD:
00442 s->mv_type = MV_TYPE_FIELD;
00443 if (s->picture_structure == PICT_FRAME) {
00444 mb_type |= MB_TYPE_16x8 | MB_TYPE_INTERLACED;
00445 for(i=0;i<2;i++) {
00446 if (USES_LIST(mb_type, i)) {
00447 for(j=0;j<2;j++) {
00448 s->field_select[i][j] = get_bits1(&s->gb);
00449 val = mpeg_decode_motion(s, s->mpeg_f_code[i][0],
00450 s->last_mv[i][j][0]);
00451 s->last_mv[i][j][0] = val;
00452 s->mv[i][j][0] = val;
00453 dprintf(s->avctx, "fmx=%d\n", val);
00454 val = mpeg_decode_motion(s, s->mpeg_f_code[i][1],
00455 s->last_mv[i][j][1] >> 1);
00456 s->last_mv[i][j][1] = val << 1;
00457 s->mv[i][j][1] = val;
00458 dprintf(s->avctx, "fmy=%d\n", val);
00459 }
00460 }
00461 }
00462 } else {
00463 mb_type |= MB_TYPE_16x16 | MB_TYPE_INTERLACED;
00464 for(i=0;i<2;i++) {
00465 if (USES_LIST(mb_type, i)) {
00466 s->field_select[i][0] = get_bits1(&s->gb);
00467 for(k=0;k<2;k++) {
00468 val = mpeg_decode_motion(s, s->mpeg_f_code[i][k],
00469 s->last_mv[i][0][k]);
00470 s->last_mv[i][0][k] = val;
00471 s->last_mv[i][1][k] = val;
00472 s->mv[i][0][k] = val;
00473 }
00474 }
00475 }
00476 }
00477 break;
00478 case MT_DMV:
00479 s->mv_type = MV_TYPE_DMV;
00480 for(i=0;i<2;i++) {
00481 if (USES_LIST(mb_type, i)) {
00482 int dmx, dmy, mx, my, m;
00483 mx = mpeg_decode_motion(s, s->mpeg_f_code[i][0],
00484 s->last_mv[i][0][0]);
00485 s->last_mv[i][0][0] = mx;
00486 s->last_mv[i][1][0] = mx;
00487 dmx = get_dmv(s);
00488 my = mpeg_decode_motion(s, s->mpeg_f_code[i][1],
00489 s->last_mv[i][0][1] >> 1);
00490 dmy = get_dmv(s);
00491
00492
00493 s->last_mv[i][0][1] = my<<1;
00494 s->last_mv[i][1][1] = my<<1;
00495
00496 s->mv[i][0][0] = mx;
00497 s->mv[i][0][1] = my;
00498 s->mv[i][1][0] = mx;
00499 s->mv[i][1][1] = my;
00500
00501 if (s->picture_structure == PICT_FRAME) {
00502 mb_type |= MB_TYPE_16x16 | MB_TYPE_INTERLACED;
00503
00504
00505 m = s->top_field_first ? 1 : 3;
00506
00507
00508 s->mv[i][2][0] = ((mx * m + (mx > 0)) >> 1) + dmx;
00509 s->mv[i][2][1] = ((my * m + (my > 0)) >> 1) + dmy - 1;
00510 m = 4 - m;
00511 s->mv[i][3][0] = ((mx * m + (mx > 0)) >> 1) + dmx;
00512 s->mv[i][3][1] = ((my * m + (my > 0)) >> 1) + dmy + 1;
00513 } else {
00514 mb_type |= MB_TYPE_16x16;
00515
00516 s->mv[i][2][0] = ((mx + (mx > 0)) >> 1) + dmx;
00517 s->mv[i][2][1] = ((my + (my > 0)) >> 1) + dmy;
00518 if(s->picture_structure == PICT_TOP_FIELD)
00519 s->mv[i][2][1]--;
00520 else
00521 s->mv[i][2][1]++;
00522 }
00523 }
00524 }
00525 break;
00526 default:
00527 av_log(s->avctx, AV_LOG_ERROR, "00 motion_type at %d %d\n", s->mb_x, s->mb_y);
00528 return -1;
00529 }
00530 }
00531
00532 s->mb_intra = 0;
00533 if (HAS_CBP(mb_type)) {
00534 s->dsp.clear_blocks(s->block[0]);
00535
00536 cbp = get_vlc2(&s->gb, mb_pat_vlc.table, MB_PAT_VLC_BITS, 1);
00537 if(mb_block_count > 6){
00538 cbp<<= mb_block_count-6;
00539 cbp |= get_bits(&s->gb, mb_block_count-6);
00540 s->dsp.clear_blocks(s->block[6]);
00541 }
00542 if (cbp <= 0){
00543 av_log(s->avctx, AV_LOG_ERROR, "invalid cbp at %d %d\n", s->mb_x, s->mb_y);
00544 return -1;
00545 }
00546
00547 #ifdef HAVE_XVMC
00548
00549 if(s->avctx->xvmc_acceleration > 1){
00550 XVMC_pack_pblocks(s,cbp);
00551 if(s->swap_uv){
00552 exchange_uv(s);
00553 }
00554 }
00555 #endif
00556 #ifdef HAVE_DVDV
00557 if (s->avctx->dvdv)
00558 *DVDV_CBP(s)++ = cbp;
00559 #endif
00560
00561 if (s->codec_id == CODEC_ID_MPEG2VIDEO) {
00562 if(s->flags2 & CODEC_FLAG2_FAST){
00563 for(i=0;i<6;i++) {
00564 if(cbp & 32) {
00565 mpeg2_fast_decode_block_non_intra(s, s->pblocks[i], i);
00566 } else {
00567 s->block_last_index[i] = -1;
00568 }
00569 cbp+=cbp;
00570 }
00571 }else{
00572 cbp<<= 12-mb_block_count;
00573
00574 for(i=0;i<mb_block_count;i++) {
00575 if ( cbp & (1<<11) ) {
00576 if (mpeg2_decode_block_non_intra(s, s->pblocks[i], i) < 0)
00577 return -1;
00578 } else {
00579 s->block_last_index[i] = -1;
00580 }
00581 cbp+=cbp;
00582 }
00583 }
00584 } else {
00585 if(s->flags2 & CODEC_FLAG2_FAST){
00586 for(i=0;i<6;i++) {
00587 if (cbp & 32) {
00588 mpeg1_fast_decode_block_inter(s, s->pblocks[i], i);
00589 } else {
00590 s->block_last_index[i] = -1;
00591 }
00592 cbp+=cbp;
00593 }
00594 }else{
00595 for(i=0;i<6;i++) {
00596 if (cbp & 32) {
00597 if (mpeg1_decode_block_inter(s, s->pblocks[i], i) < 0)
00598 return -1;
00599 } else {
00600 s->block_last_index[i] = -1;
00601 }
00602 cbp+=cbp;
00603 }
00604 }
00605 }
00606 }else{
00607 #ifdef HAVE_DVDV
00608 if (s->avctx->dvdv)
00609 *DVDV_CBP(s)++ = 0;
00610 #endif
00611 for(i=0;i<12;i++)
00612 s->block_last_index[i] = -1;
00613 }
00614 }
00615
00616 s->current_picture.mb_type[ s->mb_x + s->mb_y*s->mb_stride ]= mb_type;
00617
00618 return 0;
00619 }
00620
00621
00622 static int mpeg_decode_motion(MpegEncContext *s, int fcode, int pred)
00623 {
00624 int code, sign, val, l, shift;
00625
00626 code = get_vlc2(&s->gb, mv_vlc.table, MV_VLC_BITS, 2);
00627 if (code == 0) {
00628 return pred;
00629 }
00630 if (code < 0) {
00631 return 0xffff;
00632 }
00633
00634 sign = get_bits1(&s->gb);
00635 shift = fcode - 1;
00636 val = code;
00637 if (shift) {
00638 val = (val - 1) << shift;
00639 val |= get_bits(&s->gb, shift);
00640 val++;
00641 }
00642 if (sign)
00643 val = -val;
00644 val += pred;
00645
00646
00647 l= INT_BIT - 5 - shift;
00648 val = (val<<l)>>l;
00649 return val;
00650 }
00651
00652 static inline int decode_dc(GetBitContext *gb, int component)
00653 {
00654 int code, diff;
00655
00656 if (component == 0) {
00657 code = get_vlc2(gb, dc_lum_vlc.table, DC_VLC_BITS, 2);
00658 } else {
00659 code = get_vlc2(gb, dc_chroma_vlc.table, DC_VLC_BITS, 2);
00660 }
00661 if (code < 0){
00662 av_log(NULL, AV_LOG_ERROR, "invalid dc code at\n");
00663 return 0xffff;
00664 }
00665 if (code == 0) {
00666 diff = 0;
00667 } else {
00668 diff = get_xbits(gb, code);
00669 }
00670 return diff;
00671 }
00672
00673 static inline int mpeg1_decode_block_intra(MpegEncContext *s,
00674 DCTELEM *block,
00675 int n)
00676 {
00677 int level, dc, diff, i, j, run;
00678 int component;
00679 RLTable *rl = &ff_rl_mpeg1;
00680 uint8_t * const scantable= s->intra_scantable.permutated;
00681 const uint16_t *quant_matrix= s->intra_matrix;
00682 const int qscale= s->qscale;
00683
00684
00685 component = (n <= 3 ? 0 : n - 4 + 1);
00686 diff = decode_dc(&s->gb, component);
00687 if (diff >= 0xffff)
00688 return -1;
00689 dc = s->last_dc[component];
00690 dc += diff;
00691 s->last_dc[component] = dc;
00692 block[0] = dc<<3;
00693 dprintf(s->avctx, "dc=%d diff=%d\n", dc, diff);
00694 i = 0;
00695 {
00696 OPEN_READER(re, &s->gb);
00697
00698 for(;;) {
00699 UPDATE_CACHE(re, &s->gb);
00700 GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0], TEX_VLC_BITS, 2, 0);
00701
00702 if(level == 127){
00703 break;
00704 } else if(level != 0) {
00705 i += run;
00706 j = scantable[i];
00707 level= (level*qscale*quant_matrix[j])>>4;
00708 level= (level-1)|1;
00709 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
00710 LAST_SKIP_BITS(re, &s->gb, 1);
00711 } else {
00712
00713 run = SHOW_UBITS(re, &s->gb, 6)+1; LAST_SKIP_BITS(re, &s->gb, 6);
00714 UPDATE_CACHE(re, &s->gb);
00715 level = SHOW_SBITS(re, &s->gb, 8); SKIP_BITS(re, &s->gb, 8);
00716 if (level == -128) {
00717 level = SHOW_UBITS(re, &s->gb, 8) - 256; LAST_SKIP_BITS(re, &s->gb, 8);
00718 } else if (level == 0) {
00719 level = SHOW_UBITS(re, &s->gb, 8) ; LAST_SKIP_BITS(re, &s->gb, 8);
00720 }
00721 i += run;
00722 j = scantable[i];
00723 if(level<0){
00724 level= -level;
00725 level= (level*qscale*quant_matrix[j])>>4;
00726 level= (level-1)|1;
00727 level= -level;
00728 }else{
00729 level= (level*qscale*quant_matrix[j])>>4;
00730 level= (level-1)|1;
00731 }
00732 }
00733 if (i > 63){
00734 av_log(s->avctx, AV_LOG_ERROR, "ac-tex damaged at %d %d\n", s->mb_x, s->mb_y);
00735 return -1;
00736 }
00737
00738 block[j] = level;
00739 }
00740 CLOSE_READER(re, &s->gb);
00741 }
00742 s->block_last_index[n] = i;
00743 return 0;
00744 }
00745
00746 static inline int mpeg1_decode_block_inter(MpegEncContext *s,
00747 DCTELEM *block,
00748 int n)
00749 {
00750 int level, i, j, run;
00751 RLTable *rl = &ff_rl_mpeg1;
00752 uint8_t * const scantable= s->intra_scantable.permutated;
00753 const uint16_t *quant_matrix= s->inter_matrix;
00754 const int qscale= s->qscale;
00755
00756 {
00757 OPEN_READER(re, &s->gb);
00758 i = -1;
00759
00760 UPDATE_CACHE(re, &s->gb);
00761 if (((int32_t)GET_CACHE(re, &s->gb)) < 0) {
00762 level= (3*qscale*quant_matrix[0])>>5;
00763 level= (level-1)|1;
00764 if(GET_CACHE(re, &s->gb)&0x40000000)
00765 level= -level;
00766 block[0] = level;
00767 i++;
00768 SKIP_BITS(re, &s->gb, 2);
00769 if(((int32_t)GET_CACHE(re, &s->gb)) <= (int32_t)0xBFFFFFFF)
00770 goto end;
00771 }
00772 #if MIN_CACHE_BITS < 19
00773 UPDATE_CACHE(re, &s->gb);
00774 #endif
00775
00776 for(;;) {
00777 GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0], TEX_VLC_BITS, 2, 0);
00778
00779 if(level != 0) {
00780 i += run;
00781 j = scantable[i];
00782 level= ((level*2+1)*qscale*quant_matrix[j])>>5;
00783 level= (level-1)|1;
00784 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
00785 SKIP_BITS(re, &s->gb, 1);
00786 } else {
00787
00788 run = SHOW_UBITS(re, &s->gb, 6)+1; LAST_SKIP_BITS(re, &s->gb, 6);
00789 UPDATE_CACHE(re, &s->gb);
00790 level = SHOW_SBITS(re, &s->gb, 8); SKIP_BITS(re, &s->gb, 8);
00791 if (level == -128) {
00792 level = SHOW_UBITS(re, &s->gb, 8) - 256; SKIP_BITS(re, &s->gb, 8);
00793 } else if (level == 0) {
00794 level = SHOW_UBITS(re, &s->gb, 8) ; SKIP_BITS(re, &s->gb, 8);
00795 }
00796 i += run;
00797 j = scantable[i];
00798 if(level<0){
00799 level= -level;
00800 level= ((level*2+1)*qscale*quant_matrix[j])>>5;
00801 level= (level-1)|1;
00802 level= -level;
00803 }else{
00804 level= ((level*2+1)*qscale*quant_matrix[j])>>5;
00805 level= (level-1)|1;
00806 }
00807 }
00808 if (i > 63){
00809 av_log(s->avctx, AV_LOG_ERROR, "ac-tex damaged at %d %d\n", s->mb_x, s->mb_y);
00810 return -1;
00811 }
00812
00813 block[j] = level;
00814 #if MIN_CACHE_BITS < 19
00815 UPDATE_CACHE(re, &s->gb);
00816 #endif
00817 if(((int32_t)GET_CACHE(re, &s->gb)) <= (int32_t)0xBFFFFFFF)
00818 break;
00819 #if MIN_CACHE_BITS >= 19
00820 UPDATE_CACHE(re, &s->gb);
00821 #endif
00822 }
00823 end:
00824 LAST_SKIP_BITS(re, &s->gb, 2);
00825 CLOSE_READER(re, &s->gb);
00826 }
00827 s->block_last_index[n] = i;
00828 return 0;
00829 }
00830
00831 static inline int mpeg1_fast_decode_block_inter(MpegEncContext *s, DCTELEM *block, int n)
00832 {
00833 int level, i, j, run;
00834 RLTable *rl = &ff_rl_mpeg1;
00835 uint8_t * const scantable= s->intra_scantable.permutated;
00836 const int qscale= s->qscale;
00837
00838 {
00839 OPEN_READER(re, &s->gb);
00840 i = -1;
00841
00842 UPDATE_CACHE(re, &s->gb);
00843 if (((int32_t)GET_CACHE(re, &s->gb)) < 0) {
00844 level= (3*qscale)>>1;
00845 level= (level-1)|1;
00846 if(GET_CACHE(re, &s->gb)&0x40000000)
00847 level= -level;
00848 block[0] = level;
00849 i++;
00850 SKIP_BITS(re, &s->gb, 2);
00851 if(((int32_t)GET_CACHE(re, &s->gb)) <= (int32_t)0xBFFFFFFF)
00852 goto end;
00853 }
00854 #if MIN_CACHE_BITS < 19
00855 UPDATE_CACHE(re, &s->gb);
00856 #endif
00857
00858
00859 for(;;) {
00860 GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0], TEX_VLC_BITS, 2, 0);
00861
00862 if(level != 0) {
00863 i += run;
00864 j = scantable[i];
00865 level= ((level*2+1)*qscale)>>1;
00866 level= (level-1)|1;
00867 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
00868 SKIP_BITS(re, &s->gb, 1);
00869 } else {
00870
00871 run = SHOW_UBITS(re, &s->gb, 6)+1; LAST_SKIP_BITS(re, &s->gb, 6);
00872 UPDATE_CACHE(re, &s->gb);
00873 level = SHOW_SBITS(re, &s->gb, 8); SKIP_BITS(re, &s->gb, 8);
00874 if (level == -128) {
00875 level = SHOW_UBITS(re, &s->gb, 8) - 256; SKIP_BITS(re, &s->gb, 8);
00876 } else if (level == 0) {
00877 level = SHOW_UBITS(re, &s->gb, 8) ; SKIP_BITS(re, &s->gb, 8);
00878 }
00879 i += run;
00880 j = scantable[i];
00881 if(level<0){
00882 level= -level;
00883 level= ((level*2+1)*qscale)>>1;
00884 level= (level-1)|1;
00885 level= -level;
00886 }else{
00887 level= ((level*2+1)*qscale)>>1;
00888 level= (level-1)|1;
00889 }
00890 }
00891
00892 block[j] = level;
00893 #if MIN_CACHE_BITS < 19
00894 UPDATE_CACHE(re, &s->gb);
00895 #endif
00896 if(((int32_t)GET_CACHE(re, &s->gb)) <= (int32_t)0xBFFFFFFF)
00897 break;
00898 #if MIN_CACHE_BITS >= 19
00899 UPDATE_CACHE(re, &s->gb);
00900 #endif
00901 }
00902 end:
00903 LAST_SKIP_BITS(re, &s->gb, 2);
00904 CLOSE_READER(re, &s->gb);
00905 }
00906 s->block_last_index[n] = i;
00907 return 0;
00908 }
00909
00910
00911 static inline int mpeg2_decode_block_non_intra(MpegEncContext *s,
00912 DCTELEM *block,
00913 int n)
00914 {
00915 int level, i, j, run;
00916 RLTable *rl = &ff_rl_mpeg1;
00917 uint8_t * const scantable= s->intra_scantable.permutated;
00918 const uint16_t *quant_matrix;
00919 const int qscale= s->qscale;
00920 int mismatch;
00921 #ifdef HAVE_DVDV
00922 int dct_count = 0;
00923 #endif
00924
00925 mismatch = 1;
00926
00927 {
00928 OPEN_READER(re, &s->gb);
00929 i = -1;
00930 if (n < 4)
00931 quant_matrix = s->inter_matrix;
00932 else
00933 quant_matrix = s->chroma_inter_matrix;
00934
00935
00936 UPDATE_CACHE(re, &s->gb);
00937 if (((int32_t)GET_CACHE(re, &s->gb)) < 0) {
00938 level= (3*qscale*quant_matrix[0])>>5;
00939 if(GET_CACHE(re, &s->gb)&0x40000000)
00940 level= -level;
00941 block[0] = level;
00942 mismatch ^= level;
00943 #ifdef HAVE_DVDV
00944 if (s->avctx->dvdv)
00945 {
00946 DVDV_DCT(s)->run_sub_one = 0;
00947 DVDV_DCT(s)->elt = level;
00948 DVDV_DCT(s)++;
00949 dct_count++;
00950 }
00951 #endif
00952 i++;
00953 SKIP_BITS(re, &s->gb, 2);
00954 if(((int32_t)GET_CACHE(re, &s->gb)) <= (int32_t)0xBFFFFFFF)
00955 goto end;
00956 }
00957 #if MIN_CACHE_BITS < 19
00958 UPDATE_CACHE(re, &s->gb);
00959 #endif
00960
00961
00962 for(;;) {
00963 GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0], TEX_VLC_BITS, 2, 0);
00964
00965 if(level != 0) {
00966 i += run;
00967 j = scantable[i];
00968 level= ((level*2+1)*qscale*quant_matrix[j])>>5;
00969 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
00970 SKIP_BITS(re, &s->gb, 1);
00971 } else {
00972
00973 run = SHOW_UBITS(re, &s->gb, 6)+1; LAST_SKIP_BITS(re, &s->gb, 6);
00974 UPDATE_CACHE(re, &s->gb);
00975 level = SHOW_SBITS(re, &s->gb, 12); SKIP_BITS(re, &s->gb, 12);
00976
00977 i += run;
00978 j = scantable[i];
00979 if(level<0){
00980 level= ((-level*2+1)*qscale*quant_matrix[j])>>5;
00981 level= -level;
00982 }else{
00983 level= ((level*2+1)*qscale*quant_matrix[j])>>5;
00984 }
00985 }
00986 if (i > 63){
00987 av_log(s->avctx, AV_LOG_ERROR, "ac-tex damaged at %d %d\n", s->mb_x, s->mb_y);
00988 return -1;
00989 }
00990
00991 mismatch ^= level;
00992 block[j] = level;
00993 #ifdef HAVE_DVDV
00994 if (s->avctx->dvdv)
00995 {
00996
00997 DVDV_DCT(s)->run_sub_one = run-1;
00998 DVDV_DCT(s)->elt = level;
00999 DVDV_DCT(s)++;
01000 dct_count++;
01001 }
01002 #endif
01003 #if MIN_CACHE_BITS < 19
01004 UPDATE_CACHE(re, &s->gb);
01005 #endif
01006 if(((int32_t)GET_CACHE(re, &s->gb)) <= (int32_t)0xBFFFFFFF)
01007 break;
01008 #if MIN_CACHE_BITS >= 19
01009 UPDATE_CACHE(re, &s->gb);
01010 #endif
01011 }
01012 end:
01013 LAST_SKIP_BITS(re, &s->gb, 2);
01014 CLOSE_READER(re, &s->gb);
01015 }
01016 block[63] ^= (mismatch & 1);
01017
01018 s->block_last_index[n] = i;
01019 #ifdef HAVE_DVDV
01020 if (s->avctx->dvdv)
01021 DVDV_MB(s)->num_coded_elts[n] = dct_count;
01022 #endif
01023 return 0;
01024 }
01025
01026 static inline int mpeg2_fast_decode_block_non_intra(MpegEncContext *s,
01027 DCTELEM *block,
01028 int n)
01029 {
01030 int level, i, j, run;
01031 RLTable *rl = &ff_rl_mpeg1;
01032 uint8_t * const scantable= s->intra_scantable.permutated;
01033 const int qscale= s->qscale;
01034 #ifdef HAVE_DVDV
01035 int dct_count = 0;
01036 #endif
01037 OPEN_READER(re, &s->gb);
01038 i = -1;
01039
01040
01041 UPDATE_CACHE(re, &s->gb);
01042 if (((int32_t)GET_CACHE(re, &s->gb)) < 0) {
01043 level= (3*qscale)>>1;
01044 if(GET_CACHE(re, &s->gb)&0x40000000)
01045 level= -level;
01046 block[0] = level;
01047 #ifdef HAVE_DVDV
01048 if (s->avctx->dvdv)
01049 {
01050 DVDV_DCT(s)->run_sub_one = 0;
01051 DVDV_DCT(s)->elt = level;
01052 DVDV_DCT(s)++;
01053 dct_count++;
01054 }
01055 #endif
01056 i++;
01057 SKIP_BITS(re, &s->gb, 2);
01058 if(((int32_t)GET_CACHE(re, &s->gb)) <= (int32_t)0xBFFFFFFF)
01059 goto end;
01060 }
01061 #if MIN_CACHE_BITS < 19
01062 UPDATE_CACHE(re, &s->gb);
01063 #endif
01064
01065
01066 for(;;) {
01067 GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0], TEX_VLC_BITS, 2, 0);
01068
01069 if(level != 0) {
01070 i += run;
01071 j = scantable[i];
01072 level= ((level*2+1)*qscale)>>1;
01073 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
01074 SKIP_BITS(re, &s->gb, 1);
01075 } else {
01076
01077 run = SHOW_UBITS(re, &s->gb, 6)+1; LAST_SKIP_BITS(re, &s->gb, 6);
01078 UPDATE_CACHE(re, &s->gb);
01079 level = SHOW_SBITS(re, &s->gb, 12); SKIP_BITS(re, &s->gb, 12);
01080
01081 i += run;
01082 j = scantable[i];
01083 if(level<0){
01084 level= ((-level*2+1)*qscale)>>1;
01085 level= -level;
01086 }else{
01087 level= ((level*2+1)*qscale)>>1;
01088 }
01089 }
01090
01091 block[j] = level;
01092 #ifdef HAVE_DVDV
01093 if (s->avctx->dvdv)
01094 {
01095
01096 DVDV_DCT(s)->run_sub_one = run-1;
01097 DVDV_DCT(s)->elt = level;
01098 DVDV_DCT(s)++;
01099 dct_count++;
01100 }
01101 #endif
01102 #if MIN_CACHE_BITS < 19
01103 UPDATE_CACHE(re, &s->gb);
01104 #endif
01105 if(((int32_t)GET_CACHE(re, &s->gb)) <= (int32_t)0xBFFFFFFF)
01106 break;
01107 #if MIN_CACHE_BITS >=19
01108 UPDATE_CACHE(re, &s->gb);
01109 #endif
01110 }
01111 end:
01112 LAST_SKIP_BITS(re, &s->gb, 2);
01113 CLOSE_READER(re, &s->gb);
01114 s->block_last_index[n] = i;
01115 #ifdef HAVE_DVDV
01116 if (s->avctx->dvdv)
01117 DVDV_MB(s)->num_coded_elts[n] = dct_count;
01118 #endif
01119 return 0;
01120 }
01121
01122
01123 static inline int mpeg2_decode_block_intra(MpegEncContext *s,
01124 DCTELEM *block,
01125 int n)
01126 {
01127 int level, dc, diff, i, j, run;
01128 int component;
01129 RLTable *rl;
01130 uint8_t * const scantable= s->intra_scantable.permutated;
01131 const uint16_t *quant_matrix;
01132 const int qscale= s->qscale;
01133 int mismatch;
01134 #ifdef HAVE_DVDV
01135 int dct_count = 0;
01136 #endif
01137
01138
01139 if (n < 4){
01140 quant_matrix = s->intra_matrix;
01141 component = 0;
01142 }else{
01143 quant_matrix = s->chroma_intra_matrix;
01144 component = (n&1) + 1;
01145 }
01146 diff = decode_dc(&s->gb, component);
01147 if (diff >= 0xffff)
01148 return -1;
01149 dc = s->last_dc[component];
01150 dc += diff;
01151 s->last_dc[component] = dc;
01152 block[0] = dc << (3 - s->intra_dc_precision);
01153 dprintf(s->avctx, "dc=%d\n", block[0]);
01154 mismatch = block[0] ^ 1;
01155 #ifdef HAVE_DVDV
01156 if (s->avctx->dvdv)
01157 {
01158 DVDV_DCT(s)->run_sub_one = 0;
01159 DVDV_DCT(s)->elt = block[0] - 0x0400;
01160 DVDV_DCT(s)++;
01161 dct_count++;
01162 }
01163 #endif
01164 i = 0;
01165 if (s->intra_vlc_format)
01166 rl = &ff_rl_mpeg2;
01167 else
01168 rl = &ff_rl_mpeg1;
01169
01170 {
01171 OPEN_READER(re, &s->gb);
01172
01173 for(;;) {
01174 UPDATE_CACHE(re, &s->gb);
01175 GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0], TEX_VLC_BITS, 2, 0);
01176
01177 if(level == 127){
01178 break;
01179 } else if(level != 0) {
01180 i += run;
01181 j = scantable[i];
01182 level= (level*qscale*quant_matrix[j])>>4;
01183 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
01184 LAST_SKIP_BITS(re, &s->gb, 1);
01185 } else {
01186
01187 run = SHOW_UBITS(re, &s->gb, 6)+1; LAST_SKIP_BITS(re, &s->gb, 6);
01188 UPDATE_CACHE(re, &s->gb);
01189 level = SHOW_SBITS(re, &s->gb, 12); SKIP_BITS(re, &s->gb, 12);
01190 i += run;
01191 j = scantable[i];
01192 if(level<0){
01193 level= (-level*qscale*quant_matrix[j])>>4;
01194 level= -level;
01195 }else{
01196 level= (level*qscale*quant_matrix[j])>>4;
01197 }
01198 }
01199 if (i > 63){
01200 av_log(s->avctx, AV_LOG_ERROR, "ac-tex damaged at %d %d\n", s->mb_x, s->mb_y);
01201 #ifdef HAVE_DVDV
01202 if (s->avctx->dvdv)
01203 DVDV_MB(s)->num_coded_elts[n] = dct_count;
01204 #endif
01205 return -1;
01206 }
01207
01208 mismatch^= level;
01209 block[j] = level;
01210 #ifdef HAVE_DVDV
01211 if (s->avctx->dvdv)
01212 {
01213
01214 DVDV_DCT(s)->run_sub_one = run-1;
01215 DVDV_DCT(s)->elt = level;
01216 DVDV_DCT(s)++;
01217 dct_count++;
01218 }
01219 #endif
01220 }
01221 CLOSE_READER(re, &s->gb);
01222 }
01223 block[63]^= mismatch&1;
01224
01225 s->block_last_index[n] = i;
01226 #ifdef HAVE_DVDV
01227 if (s->avctx->dvdv)
01228 DVDV_MB(s)->num_coded_elts[n] = dct_count;
01229 #endif
01230 return 0;
01231 }
01232
01233 static inline int mpeg2_fast_decode_block_intra(MpegEncContext *s,
01234 DCTELEM *block,
01235 int n)
01236 {
01237 int level, dc, diff, j, run;
01238 int component;
01239 RLTable *rl;
01240 uint8_t * scantable= s->intra_scantable.permutated;
01241 const uint16_t *quant_matrix;
01242 const int qscale= s->qscale;
01243 #ifdef HAVE_DVDV
01244 int dct_count = 0;
01245 #endif
01246
01247
01248 if (n < 4){
01249 quant_matrix = s->intra_matrix;
01250 component = 0;
01251 }else{
01252 quant_matrix = s->chroma_intra_matrix;
01253 component = (n&1) + 1;
01254 }
01255 diff = decode_dc(&s->gb, component);
01256 if (diff >= 0xffff)
01257 return -1;
01258 dc = s->last_dc[component];
01259 dc += diff;
01260 s->last_dc[component] = dc;
01261 block[0] = dc << (3 - s->intra_dc_precision);
01262 #ifdef HAVE_DVDV
01263 if (s->avctx->dvdv)
01264 {
01265 DVDV_DCT(s)->run_sub_one = 0;
01266 DVDV_DCT(s)->elt = block[0] - 0x0400;
01267 DVDV_DCT(s)++;
01268 dct_count++;
01269 }
01270 #endif
01271 if (s->intra_vlc_format)
01272 rl = &ff_rl_mpeg2;
01273 else
01274 rl = &ff_rl_mpeg1;
01275
01276 {
01277 OPEN_READER(re, &s->gb);
01278
01279 for(;;) {
01280 UPDATE_CACHE(re, &s->gb);
01281 GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0], TEX_VLC_BITS, 2, 0);
01282
01283 if(level == 127){
01284 break;
01285 } else if(level != 0) {
01286 scantable += run;
01287 j = *scantable;
01288 level= (level*qscale*quant_matrix[j])>>4;
01289 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
01290 LAST_SKIP_BITS(re, &s->gb, 1);
01291 } else {
01292
01293 run = SHOW_UBITS(re, &s->gb, 6)+1; LAST_SKIP_BITS(re, &s->gb, 6);
01294 UPDATE_CACHE(re, &s->gb);
01295 level = SHOW_SBITS(re, &s->gb, 12); SKIP_BITS(re, &s->gb, 12);
01296 scantable += run;
01297 j = *scantable;
01298 if(level<0){
01299 level= (-level*qscale*quant_matrix[j])>>4;
01300 level= -level;
01301 }else{
01302 level= (level*qscale*quant_matrix[j])>>4;
01303 }
01304 }
01305
01306 block[j] = level;
01307 #ifdef HAVE_DVDV
01308 if (s->avctx->dvdv)
01309 {
01310
01311 DVDV_DCT(s)->run_sub_one = run-1;
01312 DVDV_DCT(s)->elt = level;
01313 DVDV_DCT(s)++;
01314 dct_count++;
01315 }
01316 #endif
01317 }
01318 CLOSE_READER(re, &s->gb);
01319 }
01320
01321 s->block_last_index[n] = scantable - s->intra_scantable.permutated;
01322 #ifdef HAVE_DVDV
01323 if (s->avctx->dvdv)
01324 DVDV_MB(s)->num_coded_elts[n] = dct_count;
01325 #endif
01326 return 0;
01327 }
01328
01329 typedef struct Mpeg1Context {
01330 MpegEncContext mpeg_enc_ctx;
01331 int mpeg_enc_ctx_allocated;
01332 int repeat_field;
01333 AVPanScan pan_scan;
01334 int slice_count;
01335 int swap_uv;
01336 int save_aspect_info;
01337 int save_width, save_height;
01338 AVRational frame_rate_ext;
01339
01340 } Mpeg1Context;
01341
01342 static int mpeg_decode_init(AVCodecContext *avctx)
01343 {
01344 Mpeg1Context *s = avctx->priv_data;
01345 MpegEncContext *s2 = &s->mpeg_enc_ctx;
01346 int i;
01347
01348
01349
01350
01351 for(i=0;i<64;i++)
01352 s2->dsp.idct_permutation[i]=i;
01353
01354 MPV_decode_defaults(s2);
01355
01356 s->mpeg_enc_ctx.avctx= avctx;
01357 s->mpeg_enc_ctx.flags= avctx->flags;
01358 s->mpeg_enc_ctx.flags2= avctx->flags2;
01359 ff_mpeg12_common_init(&s->mpeg_enc_ctx);
01360 init_vlcs();
01361
01362 s->mpeg_enc_ctx_allocated = 0;
01363 s->mpeg_enc_ctx.picture_number = 0;
01364 s->repeat_field = 0;
01365 s->mpeg_enc_ctx.codec_id= avctx->codec->id;
01366 avctx->xvmc_acceleration = 0;
01367 avctx->xvmc_vld_hwslice = 0;
01368 return 0;
01369 }
01370
01371 static void quant_matrix_rebuild(uint16_t *matrix, const uint8_t *old_perm,
01372 const uint8_t *new_perm){
01373 uint16_t temp_matrix[64];
01374 int i;
01375
01376 memcpy(temp_matrix,matrix,64*sizeof(uint16_t));
01377
01378 for(i=0;i<64;i++){
01379 matrix[new_perm[i]] = temp_matrix[old_perm[i]];
01380 }
01381 }
01382
01383
01384
01385 static int mpeg_decode_postinit(AVCodecContext *avctx){
01386 Mpeg1Context *s1 = avctx->priv_data;
01387 MpegEncContext *s = &s1->mpeg_enc_ctx;
01388 uint8_t old_permutation[64];
01389
01390 if (
01391 (s1->mpeg_enc_ctx_allocated == 0)||
01392 avctx->coded_width != s->width ||
01393 avctx->coded_height != s->height||
01394 s1->save_width != s->width ||
01395 s1->save_height != s->height ||
01396 s1->save_aspect_info != s->aspect_ratio_info||
01397 0)
01398 {
01399
01400 if (s1->mpeg_enc_ctx_allocated) {
01401 ParseContext pc= s->parse_context;
01402 s->parse_context.buffer=0;
01403 MPV_common_end(s);
01404 s->parse_context= pc;
01405 }
01406
01407 if( (s->width == 0 )||(s->height == 0))
01408 return -2;
01409
01410 avcodec_set_dimensions(avctx, s->width, s->height);
01411 avctx->bit_rate = s->bit_rate;
01412 s1->save_aspect_info = s->aspect_ratio_info;
01413 s1->save_width = s->width;
01414 s1->save_height = s->height;
01415
01416
01417
01418 avctx->has_b_frames = !(s->low_delay);
01419
01420 if(avctx->sub_id==1){
01421
01422 avctx->time_base.den= ff_frame_rate_tab[s->frame_rate_index].num;
01423 avctx->time_base.num= ff_frame_rate_tab[s->frame_rate_index].den;
01424
01425 avctx->sample_aspect_ratio= av_d2q(
01426 1.0/ff_mpeg1_aspect[s->aspect_ratio_info], 255);
01427
01428 }else{
01429
01430 av_reduce(
01431 &s->avctx->time_base.den,
01432 &s->avctx->time_base.num,
01433 ff_frame_rate_tab[s->frame_rate_index].num * s1->frame_rate_ext.num,
01434 ff_frame_rate_tab[s->frame_rate_index].den * s1->frame_rate_ext.den,
01435 1<<30);
01436
01437 if(s->aspect_ratio_info > 1){
01438 if( (s1->pan_scan.width == 0 )||(s1->pan_scan.height == 0) ){
01439 s->avctx->sample_aspect_ratio=
01440 av_div_q(
01441 ff_mpeg2_aspect[s->aspect_ratio_info],
01442 (AVRational){s->width, s->height}
01443 );
01444 }else{
01445 s->avctx->sample_aspect_ratio=
01446 av_div_q(
01447 ff_mpeg2_aspect[s->aspect_ratio_info],
01448 (AVRational){s1->pan_scan.width, s1->pan_scan.height}
01449 );
01450 }
01451 }else{
01452 s->avctx->sample_aspect_ratio=
01453 ff_mpeg2_aspect[s->aspect_ratio_info];
01454 }
01455 }
01456
01457 if(avctx->xvmc_acceleration){
01458 avctx->pix_fmt = avctx->get_format(avctx,pixfmt_xvmc_mpg2_420);
01459 }else{
01460 if(s->chroma_format < 2){
01461 avctx->pix_fmt = avctx->get_format(avctx,pixfmt_yuv_420);
01462 }else
01463 if(s->chroma_format == 2){
01464 avctx->pix_fmt = avctx->get_format(avctx,pixfmt_yuv_422);
01465 }else
01466 if(s->chroma_format > 2){
01467 avctx->pix_fmt = avctx->get_format(avctx,pixfmt_yuv_444);
01468 }
01469 }
01470
01471 if( avctx->pix_fmt == PIX_FMT_XVMC_MPEG2_IDCT )
01472 if( avctx->idct_algo == FF_IDCT_AUTO )
01473 avctx->idct_algo = FF_IDCT_SIMPLE;
01474
01475 if( avctx->xvmc_vld_hwslice == 1)
01476 avctx->idct_algo = FF_IDCT_LIBMPEG2MMX;
01477
01478
01479
01480 memcpy(old_permutation,s->dsp.idct_permutation,64*sizeof(uint8_t));
01481
01482 if (MPV_common_init(s) < 0)
01483 return -2;
01484
01485 quant_matrix_rebuild(s->intra_matrix, old_permutation,s->dsp.idct_permutation);
01486 quant_matrix_rebuild(s->inter_matrix, old_permutation,s->dsp.idct_permutation);
01487 quant_matrix_rebuild(s->chroma_intra_matrix,old_permutation,s->dsp.idct_permutation);
01488 quant_matrix_rebuild(s->chroma_inter_matrix,old_permutation,s->dsp.idct_permutation);
01489
01490 s1->mpeg_enc_ctx_allocated = 1;
01491 }
01492 return 0;
01493 }
01494
01495 static int mpeg1_decode_picture(AVCodecContext *avctx,
01496 const uint8_t *buf, int buf_size)
01497 {
01498 Mpeg1Context *s1 = avctx->priv_data;
01499 MpegEncContext *s = &s1->mpeg_enc_ctx;
01500 int ref, f_code, vbv_delay;
01501
01502 if(mpeg_decode_postinit(s->avctx) < 0)
01503 return -2;
01504
01505 init_get_bits(&s->gb, buf, buf_size*8);
01506
01507 ref = get_bits(&s->gb, 10);
01508 s->pict_type = get_bits(&s->gb, 3);
01509 if(s->pict_type == 0 || s->pict_type > 3)
01510 return -1;
01511
01512 vbv_delay= get_bits(&s->gb, 16);
01513 if (s->pict_type == P_TYPE || s->pict_type == B_TYPE) {
01514 s->full_pel[0] = get_bits1(&s->gb);
01515 f_code = get_bits(&s->gb, 3);
01516 if (f_code == 0 && avctx->error_resilience >= FF_ER_COMPLIANT)
01517 return -1;
01518 s->mpeg_f_code[0][0] = f_code;
01519 s->mpeg_f_code[0][1] = f_code;
01520 }
01521 if (s->pict_type == B_TYPE) {
01522 s->full_pel[1] = get_bits1(&s->gb);
01523 f_code = get_bits(&s->gb, 3);
01524 if (f_code == 0 && avctx->error_resilience >= FF_ER_COMPLIANT)
01525 return -1;
01526 s->mpeg_f_code[1][0] = f_code;
01527 s->mpeg_f_code[1][1] = f_code;
01528 }
01529 s->current_picture.pict_type= s->pict_type;
01530 s->current_picture.key_frame= s->pict_type == I_TYPE;
01531
01532 if(avctx->debug & FF_DEBUG_PICT_INFO)
01533 av_log(avctx, AV_LOG_DEBUG, "vbv_delay %d, ref %d type:%d\n", vbv_delay, ref, s->pict_type);
01534
01535 s->y_dc_scale = 8;
01536 s->c_dc_scale = 8;
01537 s->first_slice = 1;
01538 return 0;
01539 }
01540
01541 static void mpeg_decode_sequence_extension(Mpeg1Context *s1)
01542 {
01543 MpegEncContext *s= &s1->mpeg_enc_ctx;
01544 int horiz_size_ext, vert_size_ext;
01545 int bit_rate_ext;
01546
01547 skip_bits(&s->gb, 1);
01548 s->avctx->profile= get_bits(&s->gb, 3);
01549 s->avctx->level= get_bits(&s->gb, 4);
01550 s->progressive_sequence = get_bits1(&s->gb);
01551 s->chroma_format = get_bits(&s->gb, 2);
01552 horiz_size_ext = get_bits(&s->gb, 2);
01553 vert_size_ext = get_bits(&s->gb, 2);
01554 s->width |= (horiz_size_ext << 12);
01555 s->height |= (vert_size_ext << 12);
01556 bit_rate_ext = get_bits(&s->gb, 12);
01557 s->bit_rate += (bit_rate_ext << 18) * 400;
01558 skip_bits1(&s->gb);
01559 s->avctx->rc_buffer_size += get_bits(&s->gb, 8)*1024*16<<10;
01560
01561 s->low_delay = get_bits1(&s->gb);
01562 if(s->flags & CODEC_FLAG_LOW_DELAY) s->low_delay=1;
01563
01564 s1->frame_rate_ext.num = get_bits(&s->gb, 2)+1;
01565 s1->frame_rate_ext.den = get_bits(&s->gb, 5)+1;
01566
01567 dprintf(s->avctx, "sequence extension\n");
01568 s->codec_id= s->avctx->codec_id= CODEC_ID_MPEG2VIDEO;
01569 s->avctx->sub_id = 2;
01570
01571 if(s->avctx->debug & FF_DEBUG_PICT_INFO)
01572 av_log(s->avctx, AV_LOG_DEBUG, "profile: %d, level: %d vbv buffer: %d, bitrate:%d\n",
01573 s->avctx->profile, s->avctx->level, s->avctx->rc_buffer_size, s->bit_rate);
01574
01575 }
01576
01577 static void mpeg_decode_sequence_display_extension(Mpeg1Context *s1)
01578 {
01579 MpegEncContext *s= &s1->mpeg_enc_ctx;
01580 int color_description, w, h;
01581
01582 skip_bits(&s->gb, 3);
01583 color_description= get_bits1(&s->gb);
01584 if(color_description){
01585 skip_bits(&s->gb, 8);
01586 skip_bits(&s->gb, 8);
01587 skip_bits(&s->gb, 8);
01588 }
01589 w= get_bits(&s->gb, 14);
01590 skip_bits(&s->gb, 1);
01591 h= get_bits(&s->gb, 14);
01592 skip_bits(&s->gb, 1);
01593
01594 s1->pan_scan.width= 16*w;
01595 s1->pan_scan.height=16*h;
01596
01597 if(s->avctx->debug & FF_DEBUG_PICT_INFO)
01598 av_log(s->avctx, AV_LOG_DEBUG, "sde w:%d, h:%d\n", w, h);
01599 }
01600
01601 static void mpeg_decode_picture_display_extension(Mpeg1Context *s1)
01602 {
01603 MpegEncContext *s= &s1->mpeg_enc_ctx;
01604 int i,nofco;
01605
01606 nofco = 1;
01607 if(s->progressive_sequence){
01608 if(s->repeat_first_field){
01609 nofco++;
01610 if(s->top_field_first)
01611 nofco++;
01612 }
01613 }else{
01614 if(s->picture_structure == PICT_FRAME){
01615 nofco++;
01616 if(s->repeat_first_field)
01617 nofco++;
01618 }
01619 }
01620 for(i=0; i<nofco; i++){
01621 s1->pan_scan.position[i][0]= get_sbits(&s->gb, 16);
01622 skip_bits(&s->gb, 1);
01623 s1->pan_scan.position[i][1]= get_sbits(&s->gb, 16);
01624 skip_bits(&s->gb, 1);
01625 }
01626
01627 if(s->avctx->debug & FF_DEBUG_PICT_INFO)
01628 av_log(s->avctx, AV_LOG_DEBUG, "pde (%d,%d) (%d,%d) (%d,%d)\n",
01629 s1->pan_scan.position[0][0], s1->pan_scan.position[0][1],
01630 s1->pan_scan.position[1][0], s1->pan_scan.position[1][1],
01631 s1->pan_scan.position[2][0], s1->pan_scan.position[2][1]
01632 );
01633 }
01634
01635 static void mpeg_decode_quant_matrix_extension(MpegEncContext *s)
01636 {
01637 int i, v, j;
01638
01639 dprintf(s->avctx, "matrix extension\n");
01640
01641 if (get_bits1(&s->gb)) {
01642 for(i=0;i<64;i++) {
01643 v = get_bits(&s->gb, 8);
01644 j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ];
01645 s->intra_matrix[j] = v;
01646 s->chroma_intra_matrix[j] = v;
01647 }
01648 }
01649 if (get_bits1(&s->gb)) {
01650 for(i=0;i<64;i++) {
01651 v = get_bits(&s->gb, 8);
01652 j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ];
01653 s->inter_matrix[j] = v;
01654 s->chroma_inter_matrix[j] = v;
01655 }
01656 }
01657 if (get_bits1(&s->gb)) {
01658 for(i=0;i<64;i++) {
01659 v = get_bits(&s->gb, 8);
01660 j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ];
01661 s->chroma_intra_matrix[j] = v;
01662 }
01663 }
01664 if (get_bits1(&s->gb)) {
01665 for(i=0;i<64;i++) {
01666 v = get_bits(&s->gb, 8);
01667 j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ];
01668 s->chroma_inter_matrix[j] = v;
01669 }
01670 }
01671 }
01672
01673 static void mpeg_decode_picture_coding_extension(MpegEncContext *s)
01674 {
01675 s->full_pel[0] = s->full_pel[1] = 0;
01676 s->mpeg_f_code[0][0] = get_bits(&s->gb, 4);
01677 s->mpeg_f_code[0][1] = get_bits(&s->gb, 4);
01678 s->mpeg_f_code[1][0] = get_bits(&s->gb, 4);
01679 s->mpeg_f_code[1][1] = get_bits(&s->gb, 4);
01680 s->intra_dc_precision = get_bits(&s->gb, 2);
01681 s->picture_structure = get_bits(&s->gb, 2);
01682 s->top_field_first = get_bits1(&s->gb);
01683 s->frame_pred_frame_dct = get_bits1(&s->gb);
01684 s->concealment_motion_vectors = get_bits1(&s->gb);
01685 s->q_scale_type = get_bits1(&s->gb);
01686 s->intra_vlc_format = get_bits1(&s->gb);
01687 s->alternate_scan = get_bits1(&s->gb);
01688 s->repeat_first_field = get_bits1(&s->gb);
01689 s->chroma_420_type = get_bits1(&s->gb);
01690 s->progressive_frame = get_bits1(&s->gb);
01691
01692 if(s->picture_structure == PICT_FRAME){
01693 s->first_field=0;
01694 s->v_edge_pos= 16*s->mb_height;
01695 }else{
01696 s->first_field ^= 1;
01697 s->v_edge_pos= 8*s->mb_height;
01698 memset(s->mbskip_table, 0, s->mb_stride*s->mb_height);
01699 }
01700
01701 if(s->alternate_scan){
01702 ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , ff_alternate_vertical_scan);
01703 ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , ff_alternate_vertical_scan);
01704 }else{
01705 ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , ff_zigzag_direct);
01706 ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , ff_zigzag_direct);
01707 }
01708
01709
01710 dprintf(s->avctx, "intra_dc_precision=%d\n", s->intra_dc_precision);
01711 dprintf(s->avctx, "picture_structure=%d\n", s->picture_structure);
01712 dprintf(s->avctx, "top field first=%d\n", s->top_field_first);
01713 dprintf(s->avctx, "repeat first field=%d\n", s->repeat_first_field);
01714 dprintf(s->avctx, "conceal=%d\n", s->concealment_motion_vectors);
01715 dprintf(s->avctx, "intra_vlc_format=%d\n", s->intra_vlc_format);
01716 dprintf(s->avctx, "alternate_scan=%d\n", s->alternate_scan);
01717 dprintf(s->avctx, "frame_pred_frame_dct=%d\n", s->frame_pred_frame_dct);
01718 dprintf(s->avctx, "progressive_frame=%d\n", s->progressive_frame);
01719 #ifdef HAVE_DVDV
01720 if (s->avctx->dvdv)
01721 {
01722 DVDV_FRAME(s)->intra_vlc_format = s->intra_vlc_format;
01723 DVDV_FRAME(s)->alternate_scan = s->alternate_scan;
01724 }
01725 #endif
01726 }
01727
01728 static void mpeg_decode_extension(AVCodecContext *avctx,
01729 const uint8_t *buf, int buf_size)
01730 {
01731 Mpeg1Context *s1 = avctx->priv_data;
01732 MpegEncContext *s = &s1->mpeg_enc_ctx;
01733 int ext_type;
01734
01735 init_get_bits(&s->gb, buf, buf_size*8);
01736
01737 ext_type = get_bits(&s->gb, 4);
01738 switch(ext_type) {
01739 case 0x1:
01740 mpeg_decode_sequence_extension(s1);
01741 break;
01742 case 0x2:
01743 mpeg_decode_sequence_display_extension(s1);
01744 break;
01745 case 0x3:
01746 mpeg_decode_quant_matrix_extension(s);
01747 break;
01748 case 0x7:
01749 mpeg_decode_picture_display_extension(s1);
01750 break;
01751 case 0x8:
01752 mpeg_decode_picture_coding_extension(s);
01753 break;
01754 }
01755 }
01756
01757 static void exchange_uv(MpegEncContext *s){
01758 short * tmp = s->pblocks[4];
01759 s->pblocks[4] = s->pblocks[5];
01760 s->pblocks[5] = tmp;
01761 }
01762
01763 static int mpeg_field_start(MpegEncContext *s){
01764 AVCodecContext *avctx= s->avctx;
01765 Mpeg1Context *s1 = (Mpeg1Context*)s;
01766
01767
01768 if(s->first_field || s->picture_structure==PICT_FRAME){
01769 if(MPV_frame_start(s, avctx) < 0)
01770 return -1;
01771
01772 ff_er_frame_start(s);
01773
01774
01775 s->current_picture_ptr->repeat_pict = 0;
01776 if (s->repeat_first_field) {
01777 if (s->progressive_sequence) {
01778 if (s->top_field_first)
01779 s->current_picture_ptr->repeat_pict = 4;
01780 else
01781 s->current_picture_ptr->repeat_pict = 2;
01782 } else if (s->progressive_frame) {
01783 s->current_picture_ptr->repeat_pict = 1;
01784 }
01785 }
01786
01787 *s->current_picture_ptr->pan_scan= s1->pan_scan;
01788 }else{
01789 int i;
01790
01791 if(!s->current_picture_ptr){
01792 av_log(s->avctx, AV_LOG_ERROR, "first field missing\n");
01793 return -1;
01794 }
01795
01796 for(i=0; i<4; i++){
01797 s->current_picture.data[i] = s->current_picture_ptr->data[i];
01798 if(s->picture_structure == PICT_BOTTOM_FIELD){
01799 s->current_picture.data[i] += s->current_picture_ptr->linesize[i];
01800 }
01801 }
01802 }
01803 #ifdef HAVE_XVMC
01804
01805
01806 if(s->avctx->xvmc_acceleration)
01807 XVMC_field_start(s,avctx);
01808 #endif
01809 #ifdef HAVE_XVMC_VLD
01810 if(s->avctx->xvmc_vld_hwslice)
01811 XVMC_VLD_field_start(s, avctx);
01812 #endif
01813
01814 return 0;
01815 }
01816
01817 #define DECODE_SLICE_ERROR -1
01818 #define DECODE_SLICE_OK 0
01819
01825 static int mpeg_decode_slice(Mpeg1Context *s1, int mb_y,
01826 const uint8_t **buf, int buf_size)
01827 {
01828 MpegEncContext *s = &s1->mpeg_enc_ctx;
01829 AVCodecContext *avctx= s->avctx;
01830 const int field_pic= s->picture_structure != PICT_FRAME;
01831 const int lowres= s->avctx->lowres;
01832
01833 s->resync_mb_x=
01834 s->resync_mb_y= -1;
01835
01836 if (mb_y<<field_pic >= s->mb_height){
01837 av_log(s->avctx, AV_LOG_ERROR, "slice below image (%d >= %d)\n", mb_y, s->mb_height);
01838 return -1;
01839 }
01840
01841 #ifdef HAVE_XVMC_VLD
01842 if (s->avctx->xvmc_vld_hwslice){
01843 int used = XVMC_VLD_decode_slice(s, mb_y, *buf, buf_size);
01844 if (used < 0)
01845 return DECODE_SLICE_ERROR;
01846 *buf += used - 1;
01847 return DECODE_SLICE_OK;
01848 }
01849 #endif
01850
01851 init_get_bits(&s->gb, *buf, buf_size*8);
01852
01853 ff_mpeg1_clean_buffers(s);
01854 s->interlaced_dct = 0;
01855
01856 s->qscale = get_qscale(s);
01857
01858 if(s->qscale == 0){
01859 av_log(s->avctx, AV_LOG_ERROR, "qscale == 0\n");
01860 return -1;
01861 }
01862
01863
01864 while (get_bits1(&s->gb) != 0) {
01865 skip_bits(&s->gb, 8);
01866 }
01867
01868 s->mb_x=0;
01869
01870 for(;;) {
01871 int code = get_vlc2(&s->gb, mbincr_vlc.table, MBINCR_VLC_BITS, 2);
01872 if (code < 0){
01873 av_log(s->avctx, AV_LOG_ERROR, "first mb_incr damaged\n");
01874 return -1;
01875 }
01876 if (code >= 33) {
01877 if (code == 33) {
01878 s->mb_x += 33;
01879 }
01880
01881 } else {
01882 s->mb_x += code;
01883 break;
01884 }
01885 }
01886 if(s->mb_x >= (unsigned)s->mb_width){
01887 av_log(s->avctx, AV_LOG_ERROR, "initial skip overflow\n");
01888 return -1;
01889 }
01890
01891 s->resync_mb_x= s->mb_x;
01892 s->resync_mb_y= s->mb_y= mb_y;
01893 s->mb_skip_run= 0;
01894 ff_init_block_index(s);
01895
01896 if (s->mb_y==0 && s->mb_x==0 && (s->first_field || s->picture_structure==PICT_FRAME)) {
01897 if(s->avctx->debug&FF_DEBUG_PICT_INFO){
01898 av_log(s->avctx, AV_LOG_DEBUG, "qp:%d fc:%2d%2d%2d%2d %s %s %s %s %s dc:%d pstruct:%d fdct:%d cmv:%d qtype:%d ivlc:%d rff:%d %s\n",
01899 s->qscale, s->mpeg_f_code[0][0],s->mpeg_f_code[0][1],s->mpeg_f_code[1][0],s->mpeg_f_code[1][1],
01900 s->pict_type == I_TYPE ? "I" : (s->pict_type == P_TYPE ? "P" : (s->pict_type == B_TYPE ? "B" : "S")),
01901 s->progressive_sequence ? "ps" :"", s->progressive_frame ? "pf" : "", s->alternate_scan ? "alt" :"", s->top_field_first ? "top" :"",
01902 s->intra_dc_precision, s->picture_structure, s->frame_pred_frame_dct, s->concealment_motion_vectors,
01903 s->q_scale_type, s->intra_vlc_format, s->repeat_first_field, s->chroma_420_type ? "420" :"");
01904 }
01905 }
01906
01907 for(;;) {
01908 #ifdef HAVE_XVMC
01909
01910 if(s->avctx->xvmc_acceleration > 1)
01911 XVMC_init_block(s);
01912 #endif
01913 #ifdef HAVE_DVDV
01914 if (s->avctx->dvdv)
01915 DVDV_init_block(s);
01916 #endif
01917
01918 if(mpeg_decode_mb(s, s->block) < 0)
01919 return -1;
01920
01921 if(s->current_picture.motion_val[0] && !s->encoding){
01922 const int wrap = field_pic ? 2*s->b8_stride : s->b8_stride;
01923 int xy = s->mb_x*2 + s->mb_y*2*wrap;
01924 int motion_x, motion_y, dir, i;
01925 if(field_pic && !s->first_field)
01926 xy += wrap/2;
01927
01928 for(i=0; i<2; i++){
01929 for(dir=0; dir<2; dir++){
01930 if (s->mb_intra || (dir==1 && s->pict_type != B_TYPE)) {
01931 motion_x = motion_y = 0;
01932 }else if (s->mv_type == MV_TYPE_16X16 || (s->mv_type == MV_TYPE_FIELD && field_pic)){
01933 motion_x = s->mv[dir][0][0];
01934 motion_y = s->mv[dir][0][1];
01935 } else {
01936 motion_x = s->mv[dir][i][0];
01937 motion_y = s->mv[dir][i][1];
01938 }
01939
01940 s->current_picture.motion_val[dir][xy ][0] = motion_x;
01941 s->current_picture.motion_val[dir][xy ][1] = motion_y;
01942 s->current_picture.motion_val[dir][xy + 1][0] = motion_x;
01943 s->current_picture.motion_val[dir][xy + 1][1] = motion_y;
01944 s->current_picture.ref_index [dir][xy ]=
01945 s->current_picture.ref_index [dir][xy + 1]= s->field_select[dir][i];
01946 assert(s->field_select[dir][i]==0 || s->field_select[dir][i]==1);
01947 }
01948 xy += wrap;
01949 }
01950 }
01951
01952 s->dest[0] += 16 >> lowres;
01953 s->dest[1] +=(16 >> lowres) >> s->chroma_x_shift;
01954 s->dest[2] +=(16 >> lowres) >> s->chroma_x_shift;
01955
01956 #ifdef HAVE_DVDV
01957 if (s->avctx->dvdv)
01958 DVDV_decode_mb(s);
01959 else
01960 MPV_decode_mb(s, s->block);
01961 #else
01962 MPV_decode_mb(s, s->block);
01963 #endif
01964
01965 if (++s->mb_x >= s->mb_width) {
01966 const int mb_size= 16>>s->avctx->lowres;
01967
01968 ff_draw_horiz_band(s, mb_size*s->mb_y, mb_size);
01969
01970 s->mb_x = 0;
01971 s->mb_y++;
01972
01973 if(s->mb_y<<field_pic >= s->mb_height){
01974 int left= s->gb.size_in_bits - get_bits_count(&s->gb);
01975 int is_d10= s->chroma_format==2 && s->pict_type==I_TYPE && avctx->profile==0 && avctx->level==5
01976 && s->intra_dc_precision == 2 && s->q_scale_type == 1 && s->alternate_scan == 0
01977 && s->progressive_frame == 0 ;
01978
01979 if(left < 0 || (left && show_bits(&s->gb, FFMIN(left, 23)) && !is_d10)
01980 || (avctx->error_resilience >= FF_ER_AGGRESSIVE && left>8)){
01981 av_log(avctx, AV_LOG_ERROR, "end mismatch left=%d %0X\n", left, show_bits(&s->gb, FFMIN(left, 23)));
01982 return -1;
01983 }else
01984 goto eos;
01985 }
01986
01987 ff_init_block_index(s);
01988 }
01989
01990
01991 if (s->mb_skip_run == -1) {
01992
01993 s->mb_skip_run = 0;
01994 for(;;) {
01995 int code = get_vlc2(&s->gb, mbincr_vlc.table, MBINCR_VLC_BITS, 2);
01996 if (code < 0){
01997 av_log(s->avctx, AV_LOG_ERROR, "mb incr damaged\n");
01998 return -1;
01999 }
02000 if (code >= 33) {
02001 if (code == 33) {
02002 s->mb_skip_run += 33;
02003 }else if(code == 35){
02004 if(s->mb_skip_run != 0 || show_bits(&s->gb, 15) != 0){
02005 av_log(s->avctx, AV_LOG_ERROR, "slice mismatch\n");
02006 return -1;
02007 }
02008 goto eos;
02009 }
02010
02011 } else {
02012 s->mb_skip_run += code;
02013 break;
02014 }
02015 }
02016 if(s->mb_skip_run){
02017 int i;
02018 if(s->pict_type == I_TYPE){
02019 av_log(s->avctx, AV_LOG_ERROR, "skipped MB in I frame at %d %d\n", s->mb_x, s->mb_y);
02020 return -1;
02021 }
02022
02023
02024 s->mb_intra = 0;
02025 for(i=0;i<12;i++)
02026 s->block_last_index[i] = -1;
02027 if(s->picture_structure == PICT_FRAME)
02028 s->mv_type = MV_TYPE_16X16;
02029 else
02030 s->mv_type = MV_TYPE_FIELD;
02031 if (s->pict_type == P_TYPE) {
02032
02033 s->mv_dir = MV_DIR_FORWARD;
02034 s->mv[0][0][0] = s->mv[0][0][1] = 0;
02035 s->last_mv[0][0][0] = s->last_mv[0][0][1] = 0;
02036 s->last_mv[0][1][0] = s->last_mv[0][1][1] = 0;
02037 s->field_select[0][0]= s->picture_structure - 1;
02038 } else {
02039
02040 s->mv[0][0][0] = s->last_mv[0][0][0];
02041 s->mv[0][0][1] = s->last_mv[0][0][1];
02042 s->mv[1][0][0] = s->last_mv[1][0][0];
02043 s->mv[1][0][1] = s->last_mv[1][0][1];
02044 }
02045 }
02046 }
02047 }
02048 eos:
02049 *buf += get_bits_count(&s->gb)/8 - 1;
02050
02051 return 0;
02052 }
02053
02054 static int slice_decode_thread(AVCodecContext *c, void *arg){
02055 MpegEncContext *s= arg;
02056 const uint8_t *buf= s->gb.buffer;
02057 int mb_y= s->start_mb_y;
02058
02059 s->error_count= 3*(s->end_mb_y - s->start_mb_y)*s->mb_width;
02060
02061 for(;;){
02062 uint32_t start_code;
02063 int ret;
02064
02065 ret= mpeg_decode_slice((Mpeg1Context*)s, mb_y, &buf, s->gb.buffer_end - buf);
02066 emms_c();
02067
02068
02069 if(ret < 0){
02070 if(s->resync_mb_x>=0 && s->resync_mb_y>=0)
02071 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, AC_ERROR|DC_ERROR|MV_ERROR);
02072 }else{
02073 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, AC_END|DC_END|MV_END);
02074 }
02075
02076 if(s->mb_y == s->end_mb_y)
02077 return 0;
02078
02079 start_code= -1;
02080 buf = ff_find_start_code(buf, s->gb.buffer_end, &start_code);
02081 mb_y= start_code - SLICE_MIN_START_CODE;
02082 if(mb_y < 0 || mb_y >= s->end_mb_y)
02083 return -1;
02084 }
02085
02086 return 0;
02087 }
02088
02093 static int slice_end(AVCodecContext *avctx, AVFrame *pict)
02094 {
02095 Mpeg1Context *s1 = avctx->priv_data;
02096 MpegEncContext *s = &s1->mpeg_enc_ctx;
02097
02098 if (!s1->mpeg_enc_ctx_allocated || !s->current_picture_ptr)
02099 return 0;
02100
02101 #ifdef HAVE_XVMC
02102 if(s->avctx->xvmc_acceleration)
02103 XVMC_field_end(s);
02104 #endif
02105 #ifdef HAVE_XVMC_VLD
02106 if(s->avctx->xvmc_vld_hwslice)
02107 XVMC_VLD_field_end(s);
02108 #endif
02109
02110
02111 if ( !s->first_field) {
02112
02113
02114 s->current_picture_ptr->qscale_type= FF_QSCALE_TYPE_MPEG2;
02115
02116 ff_er_frame_end(s);
02117
02118 MPV_frame_end(s);
02119
02120 if (s->pict_type == B_TYPE || s->low_delay) {
02121 *pict= *(AVFrame*)s->current_picture_ptr;
02122 ff_print_debug_info(s, pict);
02123 } else {
02124 s->picture_number++;
02125
02126
02127 if (s->last_picture_ptr != NULL) {
02128 *pict= *(AVFrame*)s->last_picture_ptr;
02129 ff_print_debug_info(s, pict);
02130 }
02131 }
02132
02133 return 1;
02134 } else {
02135 return 0;
02136 }
02137 }
02138
02139 static int mpeg1_decode_sequence(AVCodecContext *avctx,
02140 const uint8_t *buf, int buf_size)
02141 {
02142 Mpeg1Context *s1 = avctx->priv_data;
02143 MpegEncContext *s = &s1->mpeg_enc_ctx;
02144 int width,height;
02145 int i, v, j;
02146
02147 init_get_bits(&s->gb, buf, buf_size*8);
02148
02149 width = get_bits(&s->gb, 12);
02150 height = get_bits(&s->gb, 12);
02151 if (width <= 0 || height <= 0 ||
02152 (width % 2) != 0 || (height % 2) != 0)
02153 return -1;
02154 s->aspect_ratio_info= get_bits(&s->gb, 4);
02155 if (s->aspect_ratio_info == 0)
02156 return -1;
02157 s->frame_rate_index = get_bits(&s->gb, 4);
02158 if (s->frame_rate_index == 0 || s->frame_rate_index > 13)
02159 return -1;
02160 s->bit_rate = get_bits(&s->gb, 18) * 400;
02161 if (get_bits1(&s->gb) == 0)
02162 return -1;
02163 s->width = width;
02164 s->height = height;
02165
02166 s->avctx->rc_buffer_size= get_bits(&s->gb, 10) * 1024*16;
02167 skip_bits(&s->gb, 1);
02168
02169
02170 if (get_bits1(&s->gb)) {
02171 for(i=0;i<64;i++) {
02172 v = get_bits(&s->gb, 8);
02173 if(v==0){
02174 av_log(s->avctx, AV_LOG_ERROR, "intra matrix damaged\n");
02175 return -1;
02176 }
02177 j = s->dsp.idct_permutation[ ff_zigzag_direct[i] ];
02178 s->intra_matrix[j] = v;
02179 s->chroma_intra_matrix[j] = v;
02180 }
02181 #ifdef DEBUG
02182 dprintf(s->avctx, "intra matrix present\n");
02183 for(i=0;i<64;i++)
02184 dprintf(s->avctx, " %d", s->intra_matrix[s->dsp.idct_permutation[i]]);
02185 dprintf(s->avctx, "\n");
02186 #endif
02187 } else {
02188 for(i=0;i<64;i++) {
02189 j = s->dsp.idct_permutation[i];
02190 v = ff_mpeg1_default_intra_matrix[i];
02191 s->intra_matrix[j] = v;
02192 s->chroma_intra_matrix[j] = v;
02193 }
02194 }
02195 if (get_bits1(&s->gb)) {
02196 for(i=0;i<64;i++) {
02197 v = get_bits(&s->gb, 8);
02198 if(v==0){
02199 av_log(s->avctx, AV_LOG_ERROR, "inter matrix damaged\n");
02200 return -1;
02201 }
02202 j = s->dsp.idct_permutation[ ff_zigzag_direct[i] ];
02203 s->inter_matrix[j] = v;
02204 s->chroma_inter_matrix[j] = v;
02205 }
02206 #ifdef DEBUG
02207 dprintf(s->avctx, "non intra matrix present\n");
02208 for(i=0;i<64;i++)
02209 dprintf(s->avctx, " %d", s->inter_matrix[s->dsp.idct_permutation[i]]);
02210 dprintf(s->avctx, "\n");
02211 #endif
02212 } else {
02213 for(i=0;i<64;i++) {
02214 int j= s->dsp.idct_permutation[i];
02215 v = ff_mpeg1_default_non_intra_matrix[i];
02216 s->inter_matrix[j] = v;
02217 s->chroma_inter_matrix[j] = v;
02218 }
02219 }
02220
02221 if(show_bits(&s->gb, 23) != 0){
02222 av_log(s->avctx, AV_LOG_ERROR, "sequence header damaged\n");
02223 return -1;
02224 }
02225
02226
02227 s->progressive_sequence = 1;
02228 s->progressive_frame = 1;
02229 s->picture_structure = PICT_FRAME;
02230 s->frame_pred_frame_dct = 1;
02231 s->chroma_format = 1;
02232 s->codec_id= s->avctx->codec_id= CODEC_ID_MPEG1VIDEO;
02233 avctx->sub_id = 1;
02234 s->out_format = FMT_MPEG1;
02235 s->swap_uv = 0;
02236 if(s->flags & CODEC_FLAG_LOW_DELAY) s->low_delay=1;
02237
02238 if(s->avctx->debug & FF_DEBUG_PICT_INFO)
02239 av_log(s->avctx, AV_LOG_DEBUG, "vbv buffer: %d, bitrate:%d\n",
02240 s->avctx->rc_buffer_size, s->bit_rate);
02241
02242 return 0;
02243 }
02244
02245 static int vcr2_init_sequence(AVCodecContext *avctx)
02246 {
02247 Mpeg1Context *s1 = avctx->priv_data;
02248 MpegEncContext *s = &s1->mpeg_enc_ctx;
02249 int i, v;
02250
02251
02252 s->out_format = FMT_MPEG1;
02253 if (s1->mpeg_enc_ctx_allocated) {
02254 MPV_common_end(s);
02255 }
02256 s->width = avctx->coded_width;
02257 s->height = avctx->coded_height;
02258 avctx->has_b_frames= 0;
02259 s->low_delay= 1;
02260
02261 if(avctx->xvmc_acceleration){
02262 avctx->pix_fmt = avctx->get_format(avctx,pixfmt_xvmc_mpg2_420);
02263 }else{
02264 avctx->pix_fmt = avctx->get_format(avctx,pixfmt_yuv_420);
02265 }
02266
02267 if( avctx->pix_fmt == PIX_FMT_XVMC_MPEG2_IDCT )
02268 if( avctx->idct_algo == FF_IDCT_AUTO )
02269 avctx->idct_algo = FF_IDCT_SIMPLE;
02270
02271 if( avctx->xvmc_vld_hwslice == 1)
02272 avctx->idct_algo = FF_IDCT_LIBMPEG2MMX;
02273
02274 if (MPV_common_init(s) < 0)
02275 return -1;
02276 exchange_uv(s);
02277 s->swap_uv = 1;
02278 s1->mpeg_enc_ctx_allocated = 1;
02279
02280 for(i=0;i<64;i++) {
02281 int j= s->dsp.idct_permutation[i];
02282 v = ff_mpeg1_default_intra_matrix[i];
02283 s->intra_matrix[j] = v;
02284 s->chroma_intra_matrix[j] = v;
02285
02286 v = ff_mpeg1_default_non_intra_matrix[i];
02287 s->inter_matrix[j] = v;
02288 s->chroma_inter_matrix[j] = v;
02289 }
02290
02291 s->progressive_sequence = 1;
02292 s->progressive_frame = 1;
02293 s->picture_structure = PICT_FRAME;
02294 s->frame_pred_frame_dct = 1;
02295 s->chroma_format = 1;
02296 s->codec_id= s->avctx->codec_id= CODEC_ID_MPEG2VIDEO;
02297 avctx->sub_id = 2;
02298 return 0;
02299 }
02300
02301
02302 static void mpeg_decode_user_data(AVCodecContext *avctx,
02303 const uint8_t *buf, int buf_size)
02304 {
02305 const uint8_t *p;
02306 int len, flags;
02307 p = buf;
02308 len = buf_size;
02309
02310
02311 if (len >= 5 &&
02312 p[0] == 'D' && p[1] == 'T' && p[2] == 'G' && p[3] == '1') {
02313 flags = p[4];
02314 p += 5;
02315 len -= 5;
02316 if (flags & 0x80) {
02317
02318 if (len < 2)
02319 return;
02320 p += 2;
02321 len -= 2;
02322 }
02323 if (flags & 0x40) {
02324 if (len < 1)
02325 return;
02326 avctx->dtg_active_format = p[0] & 0x0f;
02327 }
02328 } else if (len >= 3 &&
02329 p[0] == 'C' && p[1] == 'C') {
02330
02331 p += 2;
02332 len -= 2;
02333 avctx->decode_cc_dvd(avctx, p, len);
02334 } else if (len >= 6 &&
02335 p[0] == 'G' && p[1] == 'A' && p[2] == '9' && p[3] == '4') {
02336
02337 int user_data_type_code = p[4];
02338 if (user_data_type_code == 0x03) {
02339 p += 5;
02340 len -= 5;
02341
02342 Mpeg1Context *s1 = avctx->priv_data;
02343 MpegEncContext *s = &s1->mpeg_enc_ctx;
02344 int cccnt = p[0] & 0x1f;
02345 int cclen = 3 * cccnt + 2;
02346 int proc = (p[0] >> 6) & 1;
02347 int blen = s->tmp_atsc_cc_len;
02348
02349 if ((cclen <= len) && ((cclen + blen) < ATSC_CC_BUF_SIZE)) {
02350 uint8_t *dst = s->tmp_atsc_cc_buf + s->tmp_atsc_cc_len;
02351 memcpy(dst, p, cclen);
02352 s->tmp_atsc_cc_len += cclen;
02353 }
02354 }
02355 else if (user_data_type_code == 0x06) {
02356
02357 }
02358 } else if (len >= 11 &&
02359 p[0] == 0x05 && p[1] == 0x02) {
02360
02361 p += 2;
02362 len -= 2;
02363
02364 Mpeg1Context *s1 = avctx->priv_data;
02365 MpegEncContext *s = &s1->mpeg_enc_ctx;
02366
02367 uint8_t dvb_cc_type = p[5];
02368 p += 6;
02369 len -= 6;
02370
02371
02372
02373
02374 if (dvb_cc_type == 0x05) {
02375 dvb_cc_type = p[6];
02376 p += 7;
02377 len -= 7;
02378 }
02379
02380 if (dvb_cc_type == 0x02) {
02381 uint8_t hi = p[1] & 0xFF;
02382 uint8_t lo = p[2] & 0xFF;
02383
02384 dvb_cc_type = p[3];
02385
02386 if ((2 <= len) && ((2 + s->tmp_dvb_cc_len) < DVB_CC_BUF_SIZE)) {
02387 s->tmp_dvb_cc_buf[s->tmp_dvb_cc_len++] = hi;
02388 s->tmp_dvb_cc_buf[s->tmp_dvb_cc_len++] = lo;
02389
02390
02391
02392
02393
02394 if (dvb_cc_type == 0x04 && (hi & 0x7f) < 32) {
02395 if ((4 <= len) &&
02396 ((4 + s->tmp_dvb_cc_len) < DVB_CC_BUF_SIZE)) {
02397 s->tmp_dvb_cc_buf[s->tmp_dvb_cc_len++] = hi;
02398 s->tmp_dvb_cc_buf[s->tmp_dvb_cc_len++] = lo;
02399 }
02400 }
02401 }
02402
02403 p += 6;
02404 len -= 6;
02405 } else if (dvb_cc_type == 0x04) {
02406 if ((4 <= len) && ((4 + s->tmp_dvb_cc_len) < DVB_CC_BUF_SIZE)) {
02407 s->tmp_dvb_cc_buf[s->tmp_dvb_cc_len++] = p[1] & 0xFF;
02408 s->tmp_dvb_cc_buf[s->tmp_dvb_cc_len++] = p[2] & 0xFF;
02409 s->tmp_dvb_cc_buf[s->tmp_dvb_cc_len++] = p[3] & 0xFF;
02410 s->tmp_dvb_cc_buf[s->tmp_dvb_cc_len++] = p[4] & 0xFF;
02411 }
02412
02413 p += 9;
02414 len -= 9;
02415 }
02416 }
02417 }
02418
02419 static void mpeg_decode_gop(AVCodecContext *avctx,
02420 const uint8_t *buf, int buf_size){
02421 Mpeg1Context *s1 = avctx->priv_data;
02422 MpegEncContext *s = &s1->mpeg_enc_ctx;
02423
02424 int drop_frame_flag;
02425 int time_code_hours, time_code_minutes;
02426 int time_code_seconds, time_code_pictures;
02427 int broken_link;
02428
02429 init_get_bits(&s->gb, buf, buf_size*8);
02430
02431 drop_frame_flag = get_bits1(&s->gb);
02432
02433 time_code_hours=get_bits(&s->gb,5);
02434 time_code_minutes = get_bits(&s->gb,6);
02435 skip_bits1(&s->gb);
02436 time_code_seconds = get_bits(&s->gb,6);
02437 time_code_pictures = get_bits(&s->gb,6);
02438
02439
02440
02441
02442 broken_link = get_bits1(&s->gb);
02443
02444 if(s->avctx->debug & FF_DEBUG_PICT_INFO)
02445 av_log(s->avctx, AV_LOG_DEBUG, "GOP (%2d:%02d:%02d.[%02d]) broken_link=%d\n",
02446 time_code_hours, time_code_minutes, time_code_seconds,
02447 time_code_pictures, broken_link);
02448 }
02453 int ff_mpeg1_find_frame_end(ParseContext *pc, const uint8_t *buf, int buf_size)
02454 {
02455 int i;
02456 uint32_t state= pc->state;
02457
02458 i=0;
02459 if(!pc->frame_start_found){
02460 for(i=0; i<buf_size; i++){
02461 i= ff_find_start_code(buf+i, buf+buf_size, &state) - buf - 1;
02462 if(state >= SLICE_MIN_START_CODE && state <= SLICE_MAX_START_CODE){
02463 i++;
02464 pc->frame_start_found=1;
02465 break;
02466 }
02467 if(state == SEQ_END_CODE){
02468 pc->state=-1;
02469 return i+1;
02470 }
02471 }
02472 }
02473
02474 if(pc->frame_start_found){
02475
02476 if (buf_size == 0)
02477 return 0;
02478 for(; i<buf_size; i++){
02479 i= ff_find_start_code(buf+i, buf+buf_size, &state) - buf - 1;
02480 if((state&0xFFFFFF00) == 0x100){
02481 if(state < SLICE_MIN_START_CODE || state > SLICE_MAX_START_CODE){
02482 pc->frame_start_found=0;
02483 pc->state=-1;
02484 return i-3;
02485 }
02486 }
02487 }
02488 }
02489 pc->state= state;
02490 return END_NOT_FOUND;
02491 }
02492
02493
02494 static int mpeg_decode_frame(AVCodecContext *avctx,
02495 void *data, int *data_size,
02496 uint8_t *buf, int buf_size)
02497 {
02498 Mpeg1Context *s = avctx->priv_data;
02499 const uint8_t *buf_end;
02500 const uint8_t *buf_ptr;
02501 uint32_t start_code;
02502 int ret, input_size;
02503 AVFrame *picture = data;
02504 MpegEncContext *s2 = &s->mpeg_enc_ctx;
02505 dprintf(avctx, "fill_buffer\n");
02506
02507 if (buf_size == 0 || (buf_size == 4 && AV_RB32(buf) == SEQ_END_CODE)) {
02508
02509 if (s2->low_delay==0 && s2->next_picture_ptr) {
02510 *picture= *(AVFrame*)s2->next_picture_ptr;
02511 s2->next_picture_ptr= NULL;
02512
02513 *data_size = sizeof(AVFrame);
02514 }
02515 return buf_size;
02516 }
02517
02518 if(s2->flags&CODEC_FLAG_TRUNCATED){
02519 int next= ff_mpeg1_find_frame_end(&s2->parse_context, buf, buf_size);
02520
02521 if( ff_combine_frame(&s2->parse_context, next, (const uint8_t **)&buf, &buf_size) < 0 )
02522 return buf_size;
02523 }
02524
02525 buf_ptr = buf;
02526 buf_end = buf + buf_size;
02527
02528 #if 0
02529 if (s->repeat_field % 2 == 1) {
02530 s->repeat_field++;
02531
02532
02533 if (avctx->flags & CODEC_FLAG_REPEAT_FIELD) {
02534 *data_size = sizeof(AVPicture);
02535 goto the_end;
02536 }
02537 }
02538 #endif
02539
02540 if(s->mpeg_enc_ctx_allocated==0 && avctx->codec_tag == ff_get_fourcc("VCR2"))
02541 vcr2_init_sequence(avctx);
02542
02543 s->slice_count= 0;
02544
02545 for(;;) {
02546
02547 start_code = -1;
02548 buf_ptr = ff_find_start_code(buf_ptr,buf_end, &start_code);
02549 if (start_code > 0x1ff){
02550 if(s2->pict_type != B_TYPE || avctx->skip_frame <= AVDISCARD_DEFAULT){
02551 if(avctx->thread_count > 1){
02552 int i;
02553
02554 avctx->execute(avctx, slice_decode_thread, (void**)&(s2->thread_context[0]), NULL, s->slice_count);
02555 for(i=0; i<s->slice_count; i++)
02556 s2->error_count += s2->thread_context[i]->error_count;
02557 }
02558 if (slice_end(avctx, picture)) {
02559 if(s2->last_picture_ptr || s2->low_delay)
02560 *data_size = sizeof(AVPicture);
02561 }
02562 }
02563 return FFMAX(0, buf_ptr - buf - s2->parse_context.last_index);
02564 }
02565
02566 input_size = buf_end - buf_ptr;
02567
02568 if(avctx->debug & FF_DEBUG_STARTCODE){
02569 av_log(avctx, AV_LOG_DEBUG, "%3X at %zd left %d\n", start_code, buf_ptr-buf, input_size);
02570 }
02571
02572
02573 switch(start_code) {
02574 case SEQ_START_CODE:
02575 mpeg1_decode_sequence(avctx, buf_ptr,
02576 input_size);
02577 break;
02578
02579 case PICTURE_START_CODE:
02580
02581 mpeg1_decode_picture(avctx,
02582 buf_ptr, input_size);
02583 break;
02584 case EXT_START_CODE:
02585 mpeg_decode_extension(avctx,
02586 buf_ptr, input_size);
02587 break;
02588 case USER_START_CODE:
02589 mpeg_decode_user_data(avctx,
02590 buf_ptr, input_size);
02591 break;
02592 case GOP_START_CODE:
02593 s2->first_field=0;
02594 mpeg_decode_gop(avctx,
02595 buf_ptr, input_size);
02596 break;
02597 default:
02598 if (start_code >= SLICE_MIN_START_CODE &&
02599 start_code <= SLICE_MAX_START_CODE) {
02600 int mb_y= start_code - SLICE_MIN_START_CODE;
02601
02602 if(s2->last_picture_ptr==NULL){
02603
02604 if(s2->pict_type==B_TYPE) break;
02605
02606
02607 }
02608
02609 if(avctx->hurry_up && s2->pict_type==B_TYPE) break;
02610 if( (avctx->skip_frame >= AVDISCARD_NONREF && s2->pict_type==B_TYPE)
02611 ||(avctx->skip_frame >= AVDISCARD_NONKEY && s2->pict_type!=I_TYPE)
02612 || avctx->skip_frame >= AVDISCARD_ALL)
02613 break;
02614
02615 if(avctx->hurry_up>=5) break;
02616
02617 if (!s->mpeg_enc_ctx_allocated) break;
02618
02619 if(s2->codec_id == CODEC_ID_MPEG2VIDEO){
02620 if(mb_y < avctx->skip_top || mb_y >= s2->mb_height - avctx->skip_bottom)
02621 break;
02622 }
02623
02624 if(s2->first_slice){
02625 s2->first_slice=0;
02626 if(mpeg_field_start(s2) < 0)
02627 return -1;
02628 }
02629 if(!s2->current_picture_ptr){
02630 av_log(avctx, AV_LOG_ERROR, "current_picture not initialized\n");
02631 return -1;
02632 }
02633
02634 if(avctx->thread_count > 1){
02635 int threshold= (s2->mb_height*s->slice_count + avctx->thread_count/2) / avctx->thread_count;
02636 if(threshold <= mb_y){
02637 MpegEncContext *thread_context= s2->thread_context[s->slice_count];
02638
02639 thread_context->start_mb_y= mb_y;
02640 thread_context->end_mb_y = s2->mb_height;
02641 if(s->slice_count){
02642 s2->thread_context[s->slice_count-1]->end_mb_y= mb_y;
02643 ff_update_duplicate_context(thread_context, s2);
02644 }
02645 init_get_bits(&thread_context->gb, buf_ptr, input_size*8);
02646 s->slice_count++;
02647 }
02648 buf_ptr += 2;
02649 }else{
02650 ret = mpeg_decode_slice(s, mb_y, &buf_ptr, input_size);
02651 emms_c();
02652
02653 if(ret < 0){
02654 if(s2->resync_mb_x>=0 && s2->resync_mb_y>=0)
02655 ff_er_add_slice(s2, s2->resync_mb_x, s2->resync_mb_y, s2->mb_x, s2->mb_y, AC_ERROR|DC_ERROR|MV_ERROR);
02656 }else{
02657 ff_er_add_slice(s2, s2->resync_mb_x, s2->resync_mb_y, s2->mb_x-1, s2->mb_y, AC_END|DC_END|MV_END);
02658 }
02659 }
02660 }
02661 break;
02662 }
02663 }
02664 }
02665
02666 static int mpeg_decode_end(AVCodecContext *avctx)
02667 {
02668 Mpeg1Context *s = avctx->priv_data;
02669
02670 if (s->mpeg_enc_ctx_allocated)
02671 MPV_common_end(&s->mpeg_enc_ctx);
02672 return 0;
02673 }
02674
02675 AVCodec mpeg1video_decoder = {
02676 "mpeg1video",
02677 CODEC_TYPE_VIDEO,
02678 CODEC_ID_MPEG1VIDEO,
02679 sizeof(Mpeg1Context),
02680 mpeg_decode_init,
02681 NULL,
02682 mpeg_decode_end,
02683 mpeg_decode_frame,
02684 CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 | CODEC_CAP_TRUNCATED | CODEC_CAP_DELAY,
02685 .flush= ff_mpeg_flush,
02686 };
02687
02688 AVCodec mpeg2video_decoder = {
02689 "mpeg2video",
02690 CODEC_TYPE_VIDEO,
02691 CODEC_ID_MPEG2VIDEO,
02692 sizeof(Mpeg1Context),
02693 mpeg_decode_init,
02694 NULL,
02695 mpeg_decode_end,
02696 mpeg_decode_frame,
02697 CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 | CODEC_CAP_TRUNCATED | CODEC_CAP_DELAY,
02698 .flush= ff_mpeg_flush,
02699 };
02700
02701
02702 AVCodec mpegvideo_decoder = {
02703 "mpegvideo",
02704 CODEC_TYPE_VIDEO,
02705 CODEC_ID_MPEG2VIDEO,
02706 sizeof(Mpeg1Context),
02707 mpeg_decode_init,
02708 NULL,
02709 mpeg_decode_end,
02710 mpeg_decode_frame,
02711 CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 | CODEC_CAP_TRUNCATED | CODEC_CAP_DELAY,
02712 .flush= ff_mpeg_flush,
02713 };
02714
02715 #ifdef HAVE_XVMC
02716 static int mpeg_mc_decode_init(AVCodecContext *avctx){
02717 Mpeg1Context *s;
02718
02719 if( avctx->thread_count > 1)
02720 return -1;
02721 if( !(avctx->slice_flags & SLICE_FLAG_CODED_ORDER) )
02722 return -1;
02723 if( !(avctx->slice_flags & SLICE_FLAG_ALLOW_FIELD) ){
02724 dprintf(avctx, "mpeg12.c: XvMC decoder will work better if SLICE_FLAG_ALLOW_FIELD is set\n");
02725 }
02726 mpeg_decode_init(avctx);
02727 s = avctx->priv_data;
02728
02729 avctx->pix_fmt = PIX_FMT_XVMC_MPEG2_IDCT;
02730 avctx->xvmc_acceleration = 2;
02731
02732 return 0;
02733 }
02734
02735 AVCodec mpeg_xvmc_decoder = {
02736 "mpegvideo_xvmc",
02737 CODEC_TYPE_VIDEO,
02738 CODEC_ID_MPEG2VIDEO_XVMC,
02739 sizeof(Mpeg1Context),
02740 mpeg_mc_decode_init,
02741 NULL,
02742 mpeg_decode_end,
02743 mpeg_decode_frame,
02744 CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 | CODEC_CAP_TRUNCATED| CODEC_CAP_HWACCEL | CODEC_CAP_DELAY,
02745 .flush= ff_mpeg_flush,
02746 };
02747
02748 #endif
02749
02750 #ifdef HAVE_XVMC_VLD
02751 static int mpeg_xvmc_vld_decode_init(AVCodecContext *avctx){
02752 Mpeg1Context *s;
02753
02754 if( avctx->thread_count > 1)
02755 return -1;
02756 if( !(avctx->slice_flags & SLICE_FLAG_CODED_ORDER) )
02757 return -1;
02758 if( !(avctx->slice_flags & SLICE_FLAG_ALLOW_FIELD) )
02759 dprintf(avctx, "mpeg12.c: XVMC_VLD decoder will work better if SLICE_FLAG_ALLOW_FIELD is set\n");
02760
02761 mpeg_decode_init(avctx);
02762 s = avctx->priv_data;
02763
02764 avctx->xvmc_vld_hwslice = 1;
02765
02766 return 0;
02767 }
02768
02769 AVCodec mpeg_xvmc_vld_decoder = {
02770 "mpegvideo_xvmc_vld",
02771 CODEC_TYPE_VIDEO,
02772 CODEC_ID_MPEG2VIDEO_XVMC_VLD,
02773 sizeof(Mpeg1Context),
02774 mpeg_xvmc_vld_decode_init,
02775 NULL,
02776 mpeg_decode_end,
02777 mpeg_decode_frame,
02778 CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 | CODEC_CAP_TRUNCATED| CODEC_CAP_HWACCEL | CODEC_CAP_DELAY,
02779 .flush= ff_mpeg_flush,
02780 };
02781
02782 #endif
02783
02784 #ifdef HAVE_DVDV
02785 static int mpeg_dvdv_decode_init(AVCodecContext *avctx){
02786
02787 if (avctx->thread_count > 1)
02788 {
02789 av_log(avctx, AV_LOG_ERROR, " DVDV context being used twice?");
02790 return -1;
02791 }
02792
02793 mpeg_decode_init(avctx);
02794
02795
02796
02797 avctx->dvdv = avctx->priv_data + sizeof(Mpeg1Context);
02798
02799 av_log(avctx, AV_LOG_INFO,
02800 " mpeg_dvdv_decode_init() - DVDV context @0x%lx\n", avctx->dvdv);
02801
02802 return 0;
02803 }
02804
02805 AVCodec mpeg_dvdv_decoder = {
02806 "mpegvideo_dvdv",
02807 CODEC_TYPE_VIDEO,
02808 CODEC_ID_MPEG2VIDEO_DVDV,
02809 sizeof(Mpeg1Context) + sizeof(DVDV_CurPtrs),
02810 mpeg_dvdv_decode_init,
02811 NULL,
02812 mpeg_decode_end,
02813 mpeg_decode_frame,
02814 CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 | CODEC_CAP_TRUNCATED | CODEC_CAP_HWACCEL | CODEC_CAP_DELAY,
02815 .flush= ff_mpeg_flush,
02816 };
02817
02818 #endif
02819
02820
02821
02822
02823
02824 #include "mdec.c"