diff options
Diffstat (limited to 'multimedia/xine-lib/patches/patch-db')
-rw-r--r-- | multimedia/xine-lib/patches/patch-db | 1566 |
1 files changed, 0 insertions, 1566 deletions
diff --git a/multimedia/xine-lib/patches/patch-db b/multimedia/xine-lib/patches/patch-db deleted file mode 100644 index 9322590c26e..00000000000 --- a/multimedia/xine-lib/patches/patch-db +++ /dev/null @@ -1,1566 +0,0 @@ -$NetBSD: patch-db,v 1.2 2006/12/08 09:24:26 abs Exp $ - -Move some inlined functions to a place before they are used, -otherwise GCC barfs when -fno-unit-a-time is active. - ---- src/libffmpeg/libavcodec/mpeg12.c.orig 2006-08-02 08:02:39.000000000 +0100 -+++ src/libffmpeg/libavcodec/mpeg12.c -@@ -1074,515 +1074,370 @@ static inline int get_qscale(MpegEncCont - #define MT_16X8 2 - #define MT_DMV 3 - --static int mpeg_decode_mb(MpegEncContext *s, -- DCTELEM block[12][64]) -+static inline int decode_dc(GetBitContext *gb, int component) - { -- int i, j, k, cbp, val, mb_type, motion_type; -- const int mb_block_count = 4 + (1<< s->chroma_format); -+ int code, diff; - -- dprintf("decode_mb: x=%d y=%d\n", s->mb_x, s->mb_y); -+ if (component == 0) { -+ code = get_vlc2(gb, dc_lum_vlc.table, DC_VLC_BITS, 2); -+ } else { -+ code = get_vlc2(gb, dc_chroma_vlc.table, DC_VLC_BITS, 2); -+ } -+ if (code < 0){ -+ av_log(NULL, AV_LOG_ERROR, "invalid dc code at\n"); -+ return 0xffff; -+ } -+ if (code == 0) { -+ diff = 0; -+ } else { -+ diff = get_xbits(gb, code); -+ } -+ return diff; -+} - -- assert(s->mb_skipped==0); -+static inline int mpeg2_fast_decode_block_intra(MpegEncContext *s, -+ DCTELEM *block, -+ int n) -+{ -+ int level, dc, diff, j, run; -+ int component; -+ RLTable *rl; -+ uint8_t * scantable= s->intra_scantable.permutated; -+ const uint16_t *quant_matrix; -+ const int qscale= s->qscale; - -- if (s->mb_skip_run-- != 0) { -- if(s->pict_type == I_TYPE){ -- av_log(s->avctx, AV_LOG_ERROR, "skipped MB in I frame at %d %d\n", s->mb_x, s->mb_y); -- return -1; -- } -+ /* DC coef */ -+ if (n < 4){ -+ quant_matrix = s->intra_matrix; -+ component = 0; -+ }else{ -+ quant_matrix = s->chroma_intra_matrix; -+ component = (n&1) + 1; -+ } -+ diff = decode_dc(&s->gb, component); -+ if (diff >= 0xffff) -+ return -1; -+ dc = s->last_dc[component]; -+ dc += diff; -+ s->last_dc[component] = dc; -+ block[0] = dc << (3 - s->intra_dc_precision); -+ if (s->intra_vlc_format) -+ rl = &rl_mpeg2; -+ else -+ rl = &rl_mpeg1; - -- /* skip mb */ -- s->mb_intra = 0; -- for(i=0;i<12;i++) -- s->block_last_index[i] = -1; -- if(s->picture_structure == PICT_FRAME) -- s->mv_type = MV_TYPE_16X16; -- else -- s->mv_type = MV_TYPE_FIELD; -- if (s->pict_type == P_TYPE) { -- /* if P type, zero motion vector is implied */ -- s->mv_dir = MV_DIR_FORWARD; -- s->mv[0][0][0] = s->mv[0][0][1] = 0; -- s->last_mv[0][0][0] = s->last_mv[0][0][1] = 0; -- s->last_mv[0][1][0] = s->last_mv[0][1][1] = 0; -- s->field_select[0][0]= s->picture_structure - 1; -- s->mb_skipped = 1; -- s->current_picture.mb_type[ s->mb_x + s->mb_y*s->mb_stride ]= MB_TYPE_SKIP | MB_TYPE_L0 | MB_TYPE_16x16; -- } else { -- int mb_type; -+ { -+ OPEN_READER(re, &s->gb); -+ /* now quantify & encode AC coefs */ -+ for(;;) { -+ UPDATE_CACHE(re, &s->gb); -+ GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0], TEX_VLC_BITS, 2, 0); - -- if(s->mb_x) -- mb_type= s->current_picture.mb_type[ s->mb_x + s->mb_y*s->mb_stride - 1]; -- else -- mb_type= s->current_picture.mb_type[ s->mb_width + (s->mb_y-1)*s->mb_stride - 1]; // FIXME not sure if this is allowed in mpeg at all, -- if(IS_INTRA(mb_type)) -- return -1; -+ if(level == 127){ -+ break; -+ } else if(level != 0) { -+ scantable += run; -+ j = *scantable; -+ level= (level*qscale*quant_matrix[j])>>4; -+ level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); -+ LAST_SKIP_BITS(re, &s->gb, 1); -+ } else { -+ /* escape */ -+ run = SHOW_UBITS(re, &s->gb, 6)+1; LAST_SKIP_BITS(re, &s->gb, 6); -+ UPDATE_CACHE(re, &s->gb); -+ level = SHOW_SBITS(re, &s->gb, 12); SKIP_BITS(re, &s->gb, 12); -+ scantable += run; -+ j = *scantable; -+ if(level<0){ -+ level= (-level*qscale*quant_matrix[j])>>4; -+ level= -level; -+ }else{ -+ level= (level*qscale*quant_matrix[j])>>4; -+ } -+ } - -- /* if B type, reuse previous vectors and directions */ -- s->mv[0][0][0] = s->last_mv[0][0][0]; -- s->mv[0][0][1] = s->last_mv[0][0][1]; -- s->mv[1][0][0] = s->last_mv[1][0][0]; -- s->mv[1][0][1] = s->last_mv[1][0][1]; -+ block[j] = level; -+ } -+ CLOSE_READER(re, &s->gb); -+ } - -- s->current_picture.mb_type[ s->mb_x + s->mb_y*s->mb_stride ]= -- mb_type | MB_TYPE_SKIP; --// assert(s->current_picture.mb_type[ s->mb_x + s->mb_y*s->mb_stride - 1]&(MB_TYPE_16x16|MB_TYPE_16x8)); -+ s->block_last_index[n] = scantable - s->intra_scantable.permutated; -+ return 0; -+} - -- if((s->mv[0][0][0]|s->mv[0][0][1]|s->mv[1][0][0]|s->mv[1][0][1])==0) -- s->mb_skipped = 1; -- } -+static inline int mpeg2_decode_block_intra(MpegEncContext *s, -+ DCTELEM *block, -+ int n) -+{ -+ int level, dc, diff, i, j, run; -+ int component; -+ RLTable *rl; -+ uint8_t * const scantable= s->intra_scantable.permutated; -+ const uint16_t *quant_matrix; -+ const int qscale= s->qscale; -+ int mismatch; - -- return 0; -+ /* DC coef */ -+ if (n < 4){ -+ quant_matrix = s->intra_matrix; -+ component = 0; -+ }else{ -+ quant_matrix = s->chroma_intra_matrix; -+ component = (n&1) + 1; - } -+ diff = decode_dc(&s->gb, component); -+ if (diff >= 0xffff) -+ return -1; -+ dc = s->last_dc[component]; -+ dc += diff; -+ s->last_dc[component] = dc; -+ block[0] = dc << (3 - s->intra_dc_precision); -+ dprintf("dc=%d\n", block[0]); -+ mismatch = block[0] ^ 1; -+ i = 0; -+ if (s->intra_vlc_format) -+ rl = &rl_mpeg2; -+ else -+ rl = &rl_mpeg1; - -- switch(s->pict_type) { -- default: -- case I_TYPE: -- if (get_bits1(&s->gb) == 0) { -- if (get_bits1(&s->gb) == 0){ -- av_log(s->avctx, AV_LOG_ERROR, "invalid mb type in I Frame at %d %d\n", s->mb_x, s->mb_y); -+ { -+ OPEN_READER(re, &s->gb); -+ /* now quantify & encode AC coefs */ -+ for(;;) { -+ UPDATE_CACHE(re, &s->gb); -+ GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0], TEX_VLC_BITS, 2, 0); -+ -+ if(level == 127){ -+ break; -+ } else if(level != 0) { -+ i += run; -+ j = scantable[i]; -+ level= (level*qscale*quant_matrix[j])>>4; -+ level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); -+ LAST_SKIP_BITS(re, &s->gb, 1); -+ } else { -+ /* escape */ -+ run = SHOW_UBITS(re, &s->gb, 6)+1; LAST_SKIP_BITS(re, &s->gb, 6); -+ UPDATE_CACHE(re, &s->gb); -+ level = SHOW_SBITS(re, &s->gb, 12); SKIP_BITS(re, &s->gb, 12); -+ i += run; -+ j = scantable[i]; -+ if(level<0){ -+ level= (-level*qscale*quant_matrix[j])>>4; -+ level= -level; -+ }else{ -+ level= (level*qscale*quant_matrix[j])>>4; -+ } -+ } -+ if (i > 63){ -+ av_log(s->avctx, AV_LOG_ERROR, "ac-tex damaged at %d %d\n", s->mb_x, s->mb_y); - return -1; - } -- mb_type = MB_TYPE_QUANT | MB_TYPE_INTRA; -- } else { -- mb_type = MB_TYPE_INTRA; -- } -- break; -- case P_TYPE: -- mb_type = get_vlc2(&s->gb, mb_ptype_vlc.table, MB_PTYPE_VLC_BITS, 1); -- if (mb_type < 0){ -- av_log(s->avctx, AV_LOG_ERROR, "invalid mb type in P Frame at %d %d\n", s->mb_x, s->mb_y); -- return -1; -- } -- mb_type = ptype2mb_type[ mb_type ]; -- break; -- case B_TYPE: -- mb_type = get_vlc2(&s->gb, mb_btype_vlc.table, MB_BTYPE_VLC_BITS, 1); -- if (mb_type < 0){ -- av_log(s->avctx, AV_LOG_ERROR, "invalid mb type in B Frame at %d %d\n", s->mb_x, s->mb_y); -- return -1; -- } -- mb_type = btype2mb_type[ mb_type ]; -- break; -- } -- dprintf("mb_type=%x\n", mb_type); --// motion_type = 0; /* avoid warning */ -- if (IS_INTRA(mb_type)) { -- s->dsp.clear_blocks(s->block[0]); - -- if(!s->chroma_y_shift){ -- s->dsp.clear_blocks(s->block[6]); -+ mismatch^= level; -+ block[j] = level; - } -+ CLOSE_READER(re, &s->gb); -+ } -+ block[63]^= mismatch&1; - -- /* compute dct type */ -- if (s->picture_structure == PICT_FRAME && //FIXME add a interlaced_dct coded var? -- !s->frame_pred_frame_dct) { -- s->interlaced_dct = get_bits1(&s->gb); -- } -+ s->block_last_index[n] = i; -+ return 0; -+} - -- if (IS_QUANT(mb_type)) -- s->qscale = get_qscale(s); -+static inline int mpeg1_decode_block_intra(MpegEncContext *s, -+ DCTELEM *block, -+ int n) -+{ -+ int level, dc, diff, i, j, run; -+ int component; -+ RLTable *rl = &rl_mpeg1; -+ uint8_t * const scantable= s->intra_scantable.permutated; -+ const uint16_t *quant_matrix= s->intra_matrix; -+ const int qscale= s->qscale; - -- if (s->concealment_motion_vectors) { -- /* just parse them */ -- if (s->picture_structure != PICT_FRAME) -- skip_bits1(&s->gb); /* field select */ -- -- s->mv[0][0][0]= s->last_mv[0][0][0]= s->last_mv[0][1][0] = -- mpeg_decode_motion(s, s->mpeg_f_code[0][0], s->last_mv[0][0][0]); -- s->mv[0][0][1]= s->last_mv[0][0][1]= s->last_mv[0][1][1] = -- mpeg_decode_motion(s, s->mpeg_f_code[0][1], s->last_mv[0][0][1]); -- -- skip_bits1(&s->gb); /* marker */ -- }else -- memset(s->last_mv, 0, sizeof(s->last_mv)); /* reset mv prediction */ -- s->mb_intra = 1; --#ifdef HAVE_XVMC -- //one 1 we memcpy blocks in xvmcvideo -- if(s->avctx->xvmc_acceleration > 1){ -- XVMC_pack_pblocks(s,-1);//inter are always full blocks -- if(s->swap_uv){ -- exchange_uv(s); -- } -- } --#endif -+ /* DC coef */ -+ component = (n <= 3 ? 0 : n - 4 + 1); -+ diff = decode_dc(&s->gb, component); -+ if (diff >= 0xffff) -+ return -1; -+ dc = s->last_dc[component]; -+ dc += diff; -+ s->last_dc[component] = dc; -+ block[0] = dc<<3; -+ dprintf("dc=%d diff=%d\n", dc, diff); -+ i = 0; -+ { -+ OPEN_READER(re, &s->gb); -+ /* now quantify & encode AC coefs */ -+ for(;;) { -+ UPDATE_CACHE(re, &s->gb); -+ GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0], TEX_VLC_BITS, 2, 0); - -- if (s->codec_id == CODEC_ID_MPEG2VIDEO) { -- if(s->flags2 & CODEC_FLAG2_FAST){ -- for(i=0;i<6;i++) { -- mpeg2_fast_decode_block_intra(s, s->pblocks[i], i); -- } -- }else{ -- for(i=0;i<mb_block_count;i++) { -- if (mpeg2_decode_block_intra(s, s->pblocks[i], i) < 0) -- return -1; -+ if(level == 127){ -+ break; -+ } else if(level != 0) { -+ i += run; -+ j = scantable[i]; -+ level= (level*qscale*quant_matrix[j])>>4; -+ level= (level-1)|1; -+ level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); -+ LAST_SKIP_BITS(re, &s->gb, 1); -+ } else { -+ /* escape */ -+ run = SHOW_UBITS(re, &s->gb, 6)+1; LAST_SKIP_BITS(re, &s->gb, 6); -+ UPDATE_CACHE(re, &s->gb); -+ level = SHOW_SBITS(re, &s->gb, 8); SKIP_BITS(re, &s->gb, 8); -+ if (level == -128) { -+ level = SHOW_UBITS(re, &s->gb, 8) - 256; LAST_SKIP_BITS(re, &s->gb, 8); -+ } else if (level == 0) { -+ level = SHOW_UBITS(re, &s->gb, 8) ; LAST_SKIP_BITS(re, &s->gb, 8); - } -- } -- } else { -- for(i=0;i<6;i++) { -- if (mpeg1_decode_block_intra(s, s->pblocks[i], i) < 0) -- return -1; -- } -- } -- } else { -- if (mb_type & MB_TYPE_ZERO_MV){ -- assert(mb_type & MB_TYPE_CBP); -- -- /* compute dct type */ -- if (s->picture_structure == PICT_FRAME && //FIXME add a interlaced_dct coded var? -- !s->frame_pred_frame_dct) { -- s->interlaced_dct = get_bits1(&s->gb); -- } -- -- if (IS_QUANT(mb_type)) -- s->qscale = get_qscale(s); -- -- s->mv_dir = MV_DIR_FORWARD; -- if(s->picture_structure == PICT_FRAME) -- s->mv_type = MV_TYPE_16X16; -- else{ -- s->mv_type = MV_TYPE_FIELD; -- mb_type |= MB_TYPE_INTERLACED; -- s->field_select[0][0]= s->picture_structure - 1; -- } -- s->last_mv[0][0][0] = 0; -- s->last_mv[0][0][1] = 0; -- s->last_mv[0][1][0] = 0; -- s->last_mv[0][1][1] = 0; -- s->mv[0][0][0] = 0; -- s->mv[0][0][1] = 0; -- }else{ -- assert(mb_type & MB_TYPE_L0L1); --//FIXME decide if MBs in field pictures are MB_TYPE_INTERLACED -- /* get additionnal motion vector type */ -- if (s->frame_pred_frame_dct) -- motion_type = MT_FRAME; -- else{ -- motion_type = get_bits(&s->gb, 2); -- } -- -- /* compute dct type */ -- if (s->picture_structure == PICT_FRAME && //FIXME add a interlaced_dct coded var? -- !s->frame_pred_frame_dct && HAS_CBP(mb_type)) { -- s->interlaced_dct = get_bits1(&s->gb); -- } -- -- if (IS_QUANT(mb_type)) -- s->qscale = get_qscale(s); -- -- /* motion vectors */ -- s->mv_dir = 0; -- for(i=0;i<2;i++) { -- if (USES_LIST(mb_type, i)) { -- s->mv_dir |= (MV_DIR_FORWARD >> i); -- dprintf("motion_type=%d\n", motion_type); -- switch(motion_type) { -- case MT_FRAME: /* or MT_16X8 */ -- if (s->picture_structure == PICT_FRAME) { -- /* MT_FRAME */ -- mb_type |= MB_TYPE_16x16; -- s->mv_type = MV_TYPE_16X16; -- s->mv[i][0][0]= s->last_mv[i][0][0]= s->last_mv[i][1][0] = -- mpeg_decode_motion(s, s->mpeg_f_code[i][0], s->last_mv[i][0][0]); -- s->mv[i][0][1]= s->last_mv[i][0][1]= s->last_mv[i][1][1] = -- mpeg_decode_motion(s, s->mpeg_f_code[i][1], s->last_mv[i][0][1]); -- /* full_pel: only for mpeg1 */ -- if (s->full_pel[i]){ -- s->mv[i][0][0] <<= 1; -- s->mv[i][0][1] <<= 1; -- } -- } else { -- /* MT_16X8 */ -- mb_type |= MB_TYPE_16x8 | MB_TYPE_INTERLACED; -- s->mv_type = MV_TYPE_16X8; -- for(j=0;j<2;j++) { -- s->field_select[i][j] = get_bits1(&s->gb); -- for(k=0;k<2;k++) { -- val = mpeg_decode_motion(s, s->mpeg_f_code[i][k], -- s->last_mv[i][j][k]); -- s->last_mv[i][j][k] = val; -- s->mv[i][j][k] = val; -- } -- } -- } -- break; -- case MT_FIELD: -- s->mv_type = MV_TYPE_FIELD; -- if (s->picture_structure == PICT_FRAME) { -- mb_type |= MB_TYPE_16x8 | MB_TYPE_INTERLACED; -- for(j=0;j<2;j++) { -- s->field_select[i][j] = get_bits1(&s->gb); -- val = mpeg_decode_motion(s, s->mpeg_f_code[i][0], -- s->last_mv[i][j][0]); -- s->last_mv[i][j][0] = val; -- s->mv[i][j][0] = val; -- dprintf("fmx=%d\n", val); -- val = mpeg_decode_motion(s, s->mpeg_f_code[i][1], -- s->last_mv[i][j][1] >> 1); -- s->last_mv[i][j][1] = val << 1; -- s->mv[i][j][1] = val; -- dprintf("fmy=%d\n", val); -- } -- } else { -- mb_type |= MB_TYPE_16x16 | MB_TYPE_INTERLACED; -- s->field_select[i][0] = get_bits1(&s->gb); -- for(k=0;k<2;k++) { -- val = mpeg_decode_motion(s, s->mpeg_f_code[i][k], -- s->last_mv[i][0][k]); -- s->last_mv[i][0][k] = val; -- s->last_mv[i][1][k] = val; -- s->mv[i][0][k] = val; -- } -- } -- break; -- case MT_DMV: -- { -- int dmx, dmy, mx, my, m; -- -- mx = mpeg_decode_motion(s, s->mpeg_f_code[i][0], -- s->last_mv[i][0][0]); -- s->last_mv[i][0][0] = mx; -- s->last_mv[i][1][0] = mx; -- dmx = get_dmv(s); -- my = mpeg_decode_motion(s, s->mpeg_f_code[i][1], -- s->last_mv[i][0][1] >> 1); -- dmy = get_dmv(s); -- s->mv_type = MV_TYPE_DMV; -- -- -- s->last_mv[i][0][1] = my<<1; -- s->last_mv[i][1][1] = my<<1; -- -- s->mv[i][0][0] = mx; -- s->mv[i][0][1] = my; -- s->mv[i][1][0] = mx;//not used -- s->mv[i][1][1] = my;//not used -- -- if (s->picture_structure == PICT_FRAME) { -- mb_type |= MB_TYPE_16x16 | MB_TYPE_INTERLACED; -- -- //m = 1 + 2 * s->top_field_first; -- m = s->top_field_first ? 1 : 3; -- -- /* top -> top pred */ -- s->mv[i][2][0] = ((mx * m + (mx > 0)) >> 1) + dmx; -- s->mv[i][2][1] = ((my * m + (my > 0)) >> 1) + dmy - 1; -- m = 4 - m; -- s->mv[i][3][0] = ((mx * m + (mx > 0)) >> 1) + dmx; -- s->mv[i][3][1] = ((my * m + (my > 0)) >> 1) + dmy + 1; -- } else { -- mb_type |= MB_TYPE_16x16; -- -- s->mv[i][2][0] = ((mx + (mx > 0)) >> 1) + dmx; -- s->mv[i][2][1] = ((my + (my > 0)) >> 1) + dmy; -- if(s->picture_structure == PICT_TOP_FIELD) -- s->mv[i][2][1]--; -- else -- s->mv[i][2][1]++; -- } -- } -- break; -- default: -- av_log(s->avctx, AV_LOG_ERROR, "00 motion_type at %d %d\n", s->mb_x, s->mb_y); -- return -1; -- } -+ i += run; -+ j = scantable[i]; -+ if(level<0){ -+ level= -level; -+ level= (level*qscale*quant_matrix[j])>>4; -+ level= (level-1)|1; -+ level= -level; -+ }else{ -+ level= (level*qscale*quant_matrix[j])>>4; -+ level= (level-1)|1; - } - } -- } -- -- s->mb_intra = 0; -- if (HAS_CBP(mb_type)) { -- s->dsp.clear_blocks(s->block[0]); -- -- if(!s->chroma_y_shift){ -- s->dsp.clear_blocks(s->block[6]); -- } -- -- cbp = get_vlc2(&s->gb, mb_pat_vlc.table, MB_PAT_VLC_BITS, 1); -- if (cbp < 0 || ((cbp == 0) && (s->chroma_format < 2)) ){ -- av_log(s->avctx, AV_LOG_ERROR, "invalid cbp at %d %d\n", s->mb_x, s->mb_y); -+ if (i > 63){ -+ av_log(s->avctx, AV_LOG_ERROR, "ac-tex damaged at %d %d\n", s->mb_x, s->mb_y); - return -1; - } -- if(mb_block_count > 6){ -- cbp<<= mb_block_count-6; -- cbp |= get_bits(&s->gb, mb_block_count-6); -- } -- --#ifdef HAVE_XVMC -- //on 1 we memcpy blocks in xvmcvideo -- if(s->avctx->xvmc_acceleration > 1){ -- XVMC_pack_pblocks(s,cbp); -- if(s->swap_uv){ -- exchange_uv(s); -- } -- } --#endif -- -- if (s->codec_id == CODEC_ID_MPEG2VIDEO) { -- if(s->flags2 & CODEC_FLAG2_FAST){ -- for(i=0;i<6;i++) { -- if(cbp & 32) { -- mpeg2_fast_decode_block_non_intra(s, s->pblocks[i], i); -- } else { -- s->block_last_index[i] = -1; -- } -- cbp+=cbp; -- } -- }else{ -- cbp<<= 12-mb_block_count; - -- for(i=0;i<mb_block_count;i++) { -- if ( cbp & (1<<11) ) { -- if (mpeg2_decode_block_non_intra(s, s->pblocks[i], i) < 0) -- return -1; -- } else { -- s->block_last_index[i] = -1; -- } -- cbp+=cbp; -- } -- } -- } else { -- if(s->flags2 & CODEC_FLAG2_FAST){ -- for(i=0;i<6;i++) { -- if (cbp & 32) { -- mpeg1_fast_decode_block_inter(s, s->pblocks[i], i); -- } else { -- s->block_last_index[i] = -1; -- } -- cbp+=cbp; -- } -- }else{ -- for(i=0;i<6;i++) { -- if (cbp & 32) { -- if (mpeg1_decode_block_inter(s, s->pblocks[i], i) < 0) -- return -1; -- } else { -- s->block_last_index[i] = -1; -- } -- cbp+=cbp; -- } -- } -- } -- }else{ -- for(i=0;i<12;i++) -- s->block_last_index[i] = -1; -+ block[j] = level; - } -+ CLOSE_READER(re, &s->gb); - } -- -- s->current_picture.mb_type[ s->mb_x + s->mb_y*s->mb_stride ]= mb_type; -- -- return 0; -+ s->block_last_index[n] = i; -+ return 0; - } - --/* as h263, but only 17 codes */ --static int mpeg_decode_motion(MpegEncContext *s, int fcode, int pred) -+static inline int mpeg2_fast_decode_block_non_intra(MpegEncContext *s, -+ DCTELEM *block, -+ int n) - { -- int code, sign, val, l, shift; -- -- code = get_vlc2(&s->gb, mv_vlc.table, MV_VLC_BITS, 2); -- if (code == 0) { -- return pred; -- } -- if (code < 0) { -- return 0xffff; -- } -+ int level, i, j, run; -+ RLTable *rl = &rl_mpeg1; -+ uint8_t * const scantable= s->intra_scantable.permutated; -+ const int qscale= s->qscale; -+ OPEN_READER(re, &s->gb); -+ i = -1; - -- sign = get_bits1(&s->gb); -- shift = fcode - 1; -- val = code; -- if (shift) { -- val = (val - 1) << shift; -- val |= get_bits(&s->gb, shift); -- val++; -+ /* special case for the first coef. no need to add a second vlc table */ -+ UPDATE_CACHE(re, &s->gb); -+ if (((int32_t)GET_CACHE(re, &s->gb)) < 0) { -+ level= (3*qscale)>>1; -+ if(GET_CACHE(re, &s->gb)&0x40000000) -+ level= -level; -+ block[0] = level; -+ i++; -+ SKIP_BITS(re, &s->gb, 2); -+ if(((int32_t)GET_CACHE(re, &s->gb)) <= (int32_t)0xBFFFFFFF) -+ goto end; - } -- if (sign) -- val = -val; -- val += pred; - -- /* modulo decoding */ -- l= INT_BIT - 5 - shift; -- val = (val<<l)>>l; -- return val; --} -+ /* now quantify & encode AC coefs */ -+ for(;;) { -+ GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0], TEX_VLC_BITS, 2, 0); - --static inline int decode_dc(GetBitContext *gb, int component) --{ -- int code, diff; -+ if(level != 0) { -+ i += run; -+ j = scantable[i]; -+ level= ((level*2+1)*qscale)>>1; -+ level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); -+ SKIP_BITS(re, &s->gb, 1); -+ } else { -+ /* escape */ -+ run = SHOW_UBITS(re, &s->gb, 6)+1; LAST_SKIP_BITS(re, &s->gb, 6); -+ UPDATE_CACHE(re, &s->gb); -+ level = SHOW_SBITS(re, &s->gb, 12); SKIP_BITS(re, &s->gb, 12); - -- if (component == 0) { -- code = get_vlc2(gb, dc_lum_vlc.table, DC_VLC_BITS, 2); -- } else { -- code = get_vlc2(gb, dc_chroma_vlc.table, DC_VLC_BITS, 2); -- } -- if (code < 0){ -- av_log(NULL, AV_LOG_ERROR, "invalid dc code at\n"); -- return 0xffff; -- } -- if (code == 0) { -- diff = 0; -- } else { -- diff = get_xbits(gb, code); -+ i += run; -+ j = scantable[i]; -+ if(level<0){ -+ level= ((-level*2+1)*qscale)>>1; -+ level= -level; -+ }else{ -+ level= ((level*2+1)*qscale)>>1; -+ } -+ } -+ -+ block[j] = level; -+ if(((int32_t)GET_CACHE(re, &s->gb)) <= (int32_t)0xBFFFFFFF) -+ break; -+ UPDATE_CACHE(re, &s->gb); - } -- return diff; -+end: -+ LAST_SKIP_BITS(re, &s->gb, 2); -+ CLOSE_READER(re, &s->gb); -+ s->block_last_index[n] = i; -+ return 0; - } - --static inline int mpeg1_decode_block_intra(MpegEncContext *s, -+static inline int mpeg2_decode_block_non_intra(MpegEncContext *s, - DCTELEM *block, - int n) - { -- int level, dc, diff, i, j, run; -- int component; -+ int level, i, j, run; - RLTable *rl = &rl_mpeg1; - uint8_t * const scantable= s->intra_scantable.permutated; -- const uint16_t *quant_matrix= s->intra_matrix; -+ const uint16_t *quant_matrix; - const int qscale= s->qscale; -+ int mismatch; -+ -+ mismatch = 1; - -- /* DC coef */ -- component = (n <= 3 ? 0 : n - 4 + 1); -- diff = decode_dc(&s->gb, component); -- if (diff >= 0xffff) -- return -1; -- dc = s->last_dc[component]; -- dc += diff; -- s->last_dc[component] = dc; -- block[0] = dc<<3; -- dprintf("dc=%d diff=%d\n", dc, diff); -- i = 0; - { - OPEN_READER(re, &s->gb); -+ i = -1; -+ if (n < 4) -+ quant_matrix = s->inter_matrix; -+ else -+ quant_matrix = s->chroma_inter_matrix; -+ -+ /* special case for the first coef. no need to add a second vlc table */ -+ UPDATE_CACHE(re, &s->gb); -+ if (((int32_t)GET_CACHE(re, &s->gb)) < 0) { -+ level= (3*qscale*quant_matrix[0])>>5; -+ if(GET_CACHE(re, &s->gb)&0x40000000) -+ level= -level; -+ block[0] = level; -+ mismatch ^= level; -+ i++; -+ SKIP_BITS(re, &s->gb, 2); -+ if(((int32_t)GET_CACHE(re, &s->gb)) <= (int32_t)0xBFFFFFFF) -+ goto end; -+ } -+ - /* now quantify & encode AC coefs */ - for(;;) { -- UPDATE_CACHE(re, &s->gb); - GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0], TEX_VLC_BITS, 2, 0); - -- if(level == 127){ -- break; -- } else if(level != 0) { -+ if(level != 0) { - i += run; - j = scantable[i]; -- level= (level*qscale*quant_matrix[j])>>4; -- level= (level-1)|1; -+ level= ((level*2+1)*qscale*quant_matrix[j])>>5; - level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); -- LAST_SKIP_BITS(re, &s->gb, 1); -+ SKIP_BITS(re, &s->gb, 1); - } else { - /* escape */ - run = SHOW_UBITS(re, &s->gb, 6)+1; LAST_SKIP_BITS(re, &s->gb, 6); - UPDATE_CACHE(re, &s->gb); -- level = SHOW_SBITS(re, &s->gb, 8); SKIP_BITS(re, &s->gb, 8); -- if (level == -128) { -- level = SHOW_UBITS(re, &s->gb, 8) - 256; LAST_SKIP_BITS(re, &s->gb, 8); -- } else if (level == 0) { -- level = SHOW_UBITS(re, &s->gb, 8) ; LAST_SKIP_BITS(re, &s->gb, 8); -- } -+ level = SHOW_SBITS(re, &s->gb, 12); SKIP_BITS(re, &s->gb, 12); -+ - i += run; - j = scantable[i]; - if(level<0){ -- level= -level; -- level= (level*qscale*quant_matrix[j])>>4; -- level= (level-1)|1; -+ level= ((-level*2+1)*qscale*quant_matrix[j])>>5; - level= -level; - }else{ -- level= (level*qscale*quant_matrix[j])>>4; -- level= (level-1)|1; -+ level= ((level*2+1)*qscale*quant_matrix[j])>>5; - } - } - if (i > 63){ -@@ -1590,12 +1445,20 @@ static inline int mpeg1_decode_block_int - return -1; - } - -+ mismatch ^= level; - block[j] = level; -+ if(((int32_t)GET_CACHE(re, &s->gb)) <= (int32_t)0xBFFFFFFF) -+ break; -+ UPDATE_CACHE(re, &s->gb); - } -+end: -+ LAST_SKIP_BITS(re, &s->gb, 2); - CLOSE_READER(re, &s->gb); - } -+ block[63] ^= (mismatch & 1); -+ - s->block_last_index[n] = i; -- return 0; -+ return 0; - } - - static inline int mpeg1_decode_block_inter(MpegEncContext *s, -@@ -1733,315 +1596,452 @@ static inline int mpeg1_fast_decode_bloc - level= (level-1)|1; - } - } -- -- block[j] = level; -- if(((int32_t)GET_CACHE(re, &s->gb)) <= (int32_t)0xBFFFFFFF) -- break; -- UPDATE_CACHE(re, &s->gb); -+ -+ block[j] = level; -+ if(((int32_t)GET_CACHE(re, &s->gb)) <= (int32_t)0xBFFFFFFF) -+ break; -+ UPDATE_CACHE(re, &s->gb); -+ } -+end: -+ LAST_SKIP_BITS(re, &s->gb, 2); -+ CLOSE_READER(re, &s->gb); -+ } -+ s->block_last_index[n] = i; -+ return 0; -+} -+ -+static int mpeg_decode_mb(MpegEncContext *s, -+ DCTELEM block[12][64]) -+{ -+ int i, j, k, cbp, val, mb_type, motion_type; -+ const int mb_block_count = 4 + (1<< s->chroma_format); -+ -+ dprintf("decode_mb: x=%d y=%d\n", s->mb_x, s->mb_y); -+ -+ assert(s->mb_skipped==0); -+ -+ if (s->mb_skip_run-- != 0) { -+ if(s->pict_type == I_TYPE){ -+ av_log(s->avctx, AV_LOG_ERROR, "skipped MB in I frame at %d %d\n", s->mb_x, s->mb_y); -+ return -1; -+ } -+ -+ /* skip mb */ -+ s->mb_intra = 0; -+ for(i=0;i<12;i++) -+ s->block_last_index[i] = -1; -+ if(s->picture_structure == PICT_FRAME) -+ s->mv_type = MV_TYPE_16X16; -+ else -+ s->mv_type = MV_TYPE_FIELD; -+ if (s->pict_type == P_TYPE) { -+ /* if P type, zero motion vector is implied */ -+ s->mv_dir = MV_DIR_FORWARD; -+ s->mv[0][0][0] = s->mv[0][0][1] = 0; -+ s->last_mv[0][0][0] = s->last_mv[0][0][1] = 0; -+ s->last_mv[0][1][0] = s->last_mv[0][1][1] = 0; -+ s->field_select[0][0]= s->picture_structure - 1; -+ s->mb_skipped = 1; -+ s->current_picture.mb_type[ s->mb_x + s->mb_y*s->mb_stride ]= MB_TYPE_SKIP | MB_TYPE_L0 | MB_TYPE_16x16; -+ } else { -+ int mb_type; -+ -+ if(s->mb_x) -+ mb_type= s->current_picture.mb_type[ s->mb_x + s->mb_y*s->mb_stride - 1]; -+ else -+ mb_type= s->current_picture.mb_type[ s->mb_width + (s->mb_y-1)*s->mb_stride - 1]; // FIXME not sure if this is allowed in mpeg at all, -+ if(IS_INTRA(mb_type)) -+ return -1; -+ -+ /* if B type, reuse previous vectors and directions */ -+ s->mv[0][0][0] = s->last_mv[0][0][0]; -+ s->mv[0][0][1] = s->last_mv[0][0][1]; -+ s->mv[1][0][0] = s->last_mv[1][0][0]; -+ s->mv[1][0][1] = s->last_mv[1][0][1]; -+ -+ s->current_picture.mb_type[ s->mb_x + s->mb_y*s->mb_stride ]= -+ mb_type | MB_TYPE_SKIP; -+// assert(s->current_picture.mb_type[ s->mb_x + s->mb_y*s->mb_stride - 1]&(MB_TYPE_16x16|MB_TYPE_16x8)); -+ -+ if((s->mv[0][0][0]|s->mv[0][0][1]|s->mv[1][0][0]|s->mv[1][0][1])==0) -+ s->mb_skipped = 1; -+ } -+ -+ return 0; -+ } -+ -+ switch(s->pict_type) { -+ default: -+ case I_TYPE: -+ if (get_bits1(&s->gb) == 0) { -+ if (get_bits1(&s->gb) == 0){ -+ av_log(s->avctx, AV_LOG_ERROR, "invalid mb type in I Frame at %d %d\n", s->mb_x, s->mb_y); -+ return -1; -+ } -+ mb_type = MB_TYPE_QUANT | MB_TYPE_INTRA; -+ } else { -+ mb_type = MB_TYPE_INTRA; -+ } -+ break; -+ case P_TYPE: -+ mb_type = get_vlc2(&s->gb, mb_ptype_vlc.table, MB_PTYPE_VLC_BITS, 1); -+ if (mb_type < 0){ -+ av_log(s->avctx, AV_LOG_ERROR, "invalid mb type in P Frame at %d %d\n", s->mb_x, s->mb_y); -+ return -1; -+ } -+ mb_type = ptype2mb_type[ mb_type ]; -+ break; -+ case B_TYPE: -+ mb_type = get_vlc2(&s->gb, mb_btype_vlc.table, MB_BTYPE_VLC_BITS, 1); -+ if (mb_type < 0){ -+ av_log(s->avctx, AV_LOG_ERROR, "invalid mb type in B Frame at %d %d\n", s->mb_x, s->mb_y); -+ return -1; -+ } -+ mb_type = btype2mb_type[ mb_type ]; -+ break; -+ } -+ dprintf("mb_type=%x\n", mb_type); -+// motion_type = 0; /* avoid warning */ -+ if (IS_INTRA(mb_type)) { -+ s->dsp.clear_blocks(s->block[0]); -+ -+ if(!s->chroma_y_shift){ -+ s->dsp.clear_blocks(s->block[6]); -+ } -+ -+ /* compute dct type */ -+ if (s->picture_structure == PICT_FRAME && //FIXME add a interlaced_dct coded var? -+ !s->frame_pred_frame_dct) { -+ s->interlaced_dct = get_bits1(&s->gb); -+ } -+ -+ if (IS_QUANT(mb_type)) -+ s->qscale = get_qscale(s); -+ -+ if (s->concealment_motion_vectors) { -+ /* just parse them */ -+ if (s->picture_structure != PICT_FRAME) -+ skip_bits1(&s->gb); /* field select */ -+ -+ s->mv[0][0][0]= s->last_mv[0][0][0]= s->last_mv[0][1][0] = -+ mpeg_decode_motion(s, s->mpeg_f_code[0][0], s->last_mv[0][0][0]); -+ s->mv[0][0][1]= s->last_mv[0][0][1]= s->last_mv[0][1][1] = -+ mpeg_decode_motion(s, s->mpeg_f_code[0][1], s->last_mv[0][0][1]); -+ -+ skip_bits1(&s->gb); /* marker */ -+ }else -+ memset(s->last_mv, 0, sizeof(s->last_mv)); /* reset mv prediction */ -+ s->mb_intra = 1; -+#ifdef HAVE_XVMC -+ //one 1 we memcpy blocks in xvmcvideo -+ if(s->avctx->xvmc_acceleration > 1){ -+ XVMC_pack_pblocks(s,-1);//inter are always full blocks -+ if(s->swap_uv){ -+ exchange_uv(s); -+ } -+ } -+#endif -+ -+ if (s->codec_id == CODEC_ID_MPEG2VIDEO) { -+ if(s->flags2 & CODEC_FLAG2_FAST){ -+ for(i=0;i<6;i++) { -+ mpeg2_fast_decode_block_intra(s, s->pblocks[i], i); -+ } -+ }else{ -+ for(i=0;i<mb_block_count;i++) { -+ if (mpeg2_decode_block_intra(s, s->pblocks[i], i) < 0) -+ return -1; -+ } -+ } -+ } else { -+ for(i=0;i<6;i++) { -+ if (mpeg1_decode_block_intra(s, s->pblocks[i], i) < 0) -+ return -1; -+ } - } --end: -- LAST_SKIP_BITS(re, &s->gb, 2); -- CLOSE_READER(re, &s->gb); -- } -- s->block_last_index[n] = i; -- return 0; --} -- -+ } else { -+ if (mb_type & MB_TYPE_ZERO_MV){ -+ assert(mb_type & MB_TYPE_CBP); - --static inline int mpeg2_decode_block_non_intra(MpegEncContext *s, -- DCTELEM *block, -- int n) --{ -- int level, i, j, run; -- RLTable *rl = &rl_mpeg1; -- uint8_t * const scantable= s->intra_scantable.permutated; -- const uint16_t *quant_matrix; -- const int qscale= s->qscale; -- int mismatch; -+ /* compute dct type */ -+ if (s->picture_structure == PICT_FRAME && //FIXME add a interlaced_dct coded var? -+ !s->frame_pred_frame_dct) { -+ s->interlaced_dct = get_bits1(&s->gb); -+ } - -- mismatch = 1; -+ if (IS_QUANT(mb_type)) -+ s->qscale = get_qscale(s); - -- { -- OPEN_READER(re, &s->gb); -- i = -1; -- if (n < 4) -- quant_matrix = s->inter_matrix; -- else -- quant_matrix = s->chroma_inter_matrix; -+ s->mv_dir = MV_DIR_FORWARD; -+ if(s->picture_structure == PICT_FRAME) -+ s->mv_type = MV_TYPE_16X16; -+ else{ -+ s->mv_type = MV_TYPE_FIELD; -+ mb_type |= MB_TYPE_INTERLACED; -+ s->field_select[0][0]= s->picture_structure - 1; -+ } -+ s->last_mv[0][0][0] = 0; -+ s->last_mv[0][0][1] = 0; -+ s->last_mv[0][1][0] = 0; -+ s->last_mv[0][1][1] = 0; -+ s->mv[0][0][0] = 0; -+ s->mv[0][0][1] = 0; -+ }else{ -+ assert(mb_type & MB_TYPE_L0L1); -+//FIXME decide if MBs in field pictures are MB_TYPE_INTERLACED -+ /* get additionnal motion vector type */ -+ if (s->frame_pred_frame_dct) -+ motion_type = MT_FRAME; -+ else{ -+ motion_type = get_bits(&s->gb, 2); -+ } - -- /* special case for the first coef. no need to add a second vlc table */ -- UPDATE_CACHE(re, &s->gb); -- if (((int32_t)GET_CACHE(re, &s->gb)) < 0) { -- level= (3*qscale*quant_matrix[0])>>5; -- if(GET_CACHE(re, &s->gb)&0x40000000) -- level= -level; -- block[0] = level; -- mismatch ^= level; -- i++; -- SKIP_BITS(re, &s->gb, 2); -- if(((int32_t)GET_CACHE(re, &s->gb)) <= (int32_t)0xBFFFFFFF) -- goto end; -- } -+ /* compute dct type */ -+ if (s->picture_structure == PICT_FRAME && //FIXME add a interlaced_dct coded var? -+ !s->frame_pred_frame_dct && HAS_CBP(mb_type)) { -+ s->interlaced_dct = get_bits1(&s->gb); -+ } - -- /* now quantify & encode AC coefs */ -- for(;;) { -- GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0], TEX_VLC_BITS, 2, 0); -+ if (IS_QUANT(mb_type)) -+ s->qscale = get_qscale(s); - -- if(level != 0) { -- i += run; -- j = scantable[i]; -- level= ((level*2+1)*qscale*quant_matrix[j])>>5; -- level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); -- SKIP_BITS(re, &s->gb, 1); -- } else { -- /* escape */ -- run = SHOW_UBITS(re, &s->gb, 6)+1; LAST_SKIP_BITS(re, &s->gb, 6); -- UPDATE_CACHE(re, &s->gb); -- level = SHOW_SBITS(re, &s->gb, 12); SKIP_BITS(re, &s->gb, 12); -+ /* motion vectors */ -+ s->mv_dir = 0; -+ for(i=0;i<2;i++) { -+ if (USES_LIST(mb_type, i)) { -+ s->mv_dir |= (MV_DIR_FORWARD >> i); -+ dprintf("motion_type=%d\n", motion_type); -+ switch(motion_type) { -+ case MT_FRAME: /* or MT_16X8 */ -+ if (s->picture_structure == PICT_FRAME) { -+ /* MT_FRAME */ -+ mb_type |= MB_TYPE_16x16; -+ s->mv_type = MV_TYPE_16X16; -+ s->mv[i][0][0]= s->last_mv[i][0][0]= s->last_mv[i][1][0] = -+ mpeg_decode_motion(s, s->mpeg_f_code[i][0], s->last_mv[i][0][0]); -+ s->mv[i][0][1]= s->last_mv[i][0][1]= s->last_mv[i][1][1] = -+ mpeg_decode_motion(s, s->mpeg_f_code[i][1], s->last_mv[i][0][1]); -+ /* full_pel: only for mpeg1 */ -+ if (s->full_pel[i]){ -+ s->mv[i][0][0] <<= 1; -+ s->mv[i][0][1] <<= 1; -+ } -+ } else { -+ /* MT_16X8 */ -+ mb_type |= MB_TYPE_16x8 | MB_TYPE_INTERLACED; -+ s->mv_type = MV_TYPE_16X8; -+ for(j=0;j<2;j++) { -+ s->field_select[i][j] = get_bits1(&s->gb); -+ for(k=0;k<2;k++) { -+ val = mpeg_decode_motion(s, s->mpeg_f_code[i][k], -+ s->last_mv[i][j][k]); -+ s->last_mv[i][j][k] = val; -+ s->mv[i][j][k] = val; -+ } -+ } -+ } -+ break; -+ case MT_FIELD: -+ s->mv_type = MV_TYPE_FIELD; -+ if (s->picture_structure == PICT_FRAME) { -+ mb_type |= MB_TYPE_16x8 | MB_TYPE_INTERLACED; -+ for(j=0;j<2;j++) { -+ s->field_select[i][j] = get_bits1(&s->gb); -+ val = mpeg_decode_motion(s, s->mpeg_f_code[i][0], -+ s->last_mv[i][j][0]); -+ s->last_mv[i][j][0] = val; -+ s->mv[i][j][0] = val; -+ dprintf("fmx=%d\n", val); -+ val = mpeg_decode_motion(s, s->mpeg_f_code[i][1], -+ s->last_mv[i][j][1] >> 1); -+ s->last_mv[i][j][1] = val << 1; -+ s->mv[i][j][1] = val; -+ dprintf("fmy=%d\n", val); -+ } -+ } else { -+ mb_type |= MB_TYPE_16x16 | MB_TYPE_INTERLACED; -+ s->field_select[i][0] = get_bits1(&s->gb); -+ for(k=0;k<2;k++) { -+ val = mpeg_decode_motion(s, s->mpeg_f_code[i][k], -+ s->last_mv[i][0][k]); -+ s->last_mv[i][0][k] = val; -+ s->last_mv[i][1][k] = val; -+ s->mv[i][0][k] = val; -+ } -+ } -+ break; -+ case MT_DMV: -+ { -+ int dmx, dmy, mx, my, m; - -- i += run; -- j = scantable[i]; -- if(level<0){ -- level= ((-level*2+1)*qscale*quant_matrix[j])>>5; -- level= -level; -- }else{ -- level= ((level*2+1)*qscale*quant_matrix[j])>>5; -- } -- } -- if (i > 63){ -- av_log(s->avctx, AV_LOG_ERROR, "ac-tex damaged at %d %d\n", s->mb_x, s->mb_y); -- return -1; -- } -+ mx = mpeg_decode_motion(s, s->mpeg_f_code[i][0], -+ s->last_mv[i][0][0]); -+ s->last_mv[i][0][0] = mx; -+ s->last_mv[i][1][0] = mx; -+ dmx = get_dmv(s); -+ my = mpeg_decode_motion(s, s->mpeg_f_code[i][1], -+ s->last_mv[i][0][1] >> 1); -+ dmy = get_dmv(s); -+ s->mv_type = MV_TYPE_DMV; - -- mismatch ^= level; -- block[j] = level; -- if(((int32_t)GET_CACHE(re, &s->gb)) <= (int32_t)0xBFFFFFFF) -- break; -- UPDATE_CACHE(re, &s->gb); -- } --end: -- LAST_SKIP_BITS(re, &s->gb, 2); -- CLOSE_READER(re, &s->gb); -- } -- block[63] ^= (mismatch & 1); - -- s->block_last_index[n] = i; -- return 0; --} -+ s->last_mv[i][0][1] = my<<1; -+ s->last_mv[i][1][1] = my<<1; - --static inline int mpeg2_fast_decode_block_non_intra(MpegEncContext *s, -- DCTELEM *block, -- int n) --{ -- int level, i, j, run; -- RLTable *rl = &rl_mpeg1; -- uint8_t * const scantable= s->intra_scantable.permutated; -- const int qscale= s->qscale; -- OPEN_READER(re, &s->gb); -- i = -1; -+ s->mv[i][0][0] = mx; -+ s->mv[i][0][1] = my; -+ s->mv[i][1][0] = mx;//not used -+ s->mv[i][1][1] = my;//not used - -- /* special case for the first coef. no need to add a second vlc table */ -- UPDATE_CACHE(re, &s->gb); -- if (((int32_t)GET_CACHE(re, &s->gb)) < 0) { -- level= (3*qscale)>>1; -- if(GET_CACHE(re, &s->gb)&0x40000000) -- level= -level; -- block[0] = level; -- i++; -- SKIP_BITS(re, &s->gb, 2); -- if(((int32_t)GET_CACHE(re, &s->gb)) <= (int32_t)0xBFFFFFFF) -- goto end; -- } -+ if (s->picture_structure == PICT_FRAME) { -+ mb_type |= MB_TYPE_16x16 | MB_TYPE_INTERLACED; - -- /* now quantify & encode AC coefs */ -- for(;;) { -- GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0], TEX_VLC_BITS, 2, 0); -+ //m = 1 + 2 * s->top_field_first; -+ m = s->top_field_first ? 1 : 3; - -- if(level != 0) { -- i += run; -- j = scantable[i]; -- level= ((level*2+1)*qscale)>>1; -- level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); -- SKIP_BITS(re, &s->gb, 1); -- } else { -- /* escape */ -- run = SHOW_UBITS(re, &s->gb, 6)+1; LAST_SKIP_BITS(re, &s->gb, 6); -- UPDATE_CACHE(re, &s->gb); -- level = SHOW_SBITS(re, &s->gb, 12); SKIP_BITS(re, &s->gb, 12); -+ /* top -> top pred */ -+ s->mv[i][2][0] = ((mx * m + (mx > 0)) >> 1) + dmx; -+ s->mv[i][2][1] = ((my * m + (my > 0)) >> 1) + dmy - 1; -+ m = 4 - m; -+ s->mv[i][3][0] = ((mx * m + (mx > 0)) >> 1) + dmx; -+ s->mv[i][3][1] = ((my * m + (my > 0)) >> 1) + dmy + 1; -+ } else { -+ mb_type |= MB_TYPE_16x16; - -- i += run; -- j = scantable[i]; -- if(level<0){ -- level= ((-level*2+1)*qscale)>>1; -- level= -level; -- }else{ -- level= ((level*2+1)*qscale)>>1; -+ s->mv[i][2][0] = ((mx + (mx > 0)) >> 1) + dmx; -+ s->mv[i][2][1] = ((my + (my > 0)) >> 1) + dmy; -+ if(s->picture_structure == PICT_TOP_FIELD) -+ s->mv[i][2][1]--; -+ else -+ s->mv[i][2][1]++; -+ } -+ } -+ break; -+ default: -+ av_log(s->avctx, AV_LOG_ERROR, "00 motion_type at %d %d\n", s->mb_x, s->mb_y); -+ return -1; -+ } -+ } - } - } - -- block[j] = level; -- if(((int32_t)GET_CACHE(re, &s->gb)) <= (int32_t)0xBFFFFFFF) -- break; -- UPDATE_CACHE(re, &s->gb); -- } --end: -- LAST_SKIP_BITS(re, &s->gb, 2); -- CLOSE_READER(re, &s->gb); -- s->block_last_index[n] = i; -- return 0; --} -+ s->mb_intra = 0; -+ if (HAS_CBP(mb_type)) { -+ s->dsp.clear_blocks(s->block[0]); - -+ if(!s->chroma_y_shift){ -+ s->dsp.clear_blocks(s->block[6]); -+ } - --static inline int mpeg2_decode_block_intra(MpegEncContext *s, -- DCTELEM *block, -- int n) --{ -- int level, dc, diff, i, j, run; -- int component; -- RLTable *rl; -- uint8_t * const scantable= s->intra_scantable.permutated; -- const uint16_t *quant_matrix; -- const int qscale= s->qscale; -- int mismatch; -+ cbp = get_vlc2(&s->gb, mb_pat_vlc.table, MB_PAT_VLC_BITS, 1); -+ if (cbp < 0 || ((cbp == 0) && (s->chroma_format < 2)) ){ -+ av_log(s->avctx, AV_LOG_ERROR, "invalid cbp at %d %d\n", s->mb_x, s->mb_y); -+ return -1; -+ } -+ if(mb_block_count > 6){ -+ cbp<<= mb_block_count-6; -+ cbp |= get_bits(&s->gb, mb_block_count-6); -+ } - -- /* DC coef */ -- if (n < 4){ -- quant_matrix = s->intra_matrix; -- component = 0; -- }else{ -- quant_matrix = s->chroma_intra_matrix; -- component = (n&1) + 1; -- } -- diff = decode_dc(&s->gb, component); -- if (diff >= 0xffff) -- return -1; -- dc = s->last_dc[component]; -- dc += diff; -- s->last_dc[component] = dc; -- block[0] = dc << (3 - s->intra_dc_precision); -- dprintf("dc=%d\n", block[0]); -- mismatch = block[0] ^ 1; -- i = 0; -- if (s->intra_vlc_format) -- rl = &rl_mpeg2; -- else -- rl = &rl_mpeg1; -+#ifdef HAVE_XVMC -+ //on 1 we memcpy blocks in xvmcvideo -+ if(s->avctx->xvmc_acceleration > 1){ -+ XVMC_pack_pblocks(s,cbp); -+ if(s->swap_uv){ -+ exchange_uv(s); -+ } -+ } -+#endif - -- { -- OPEN_READER(re, &s->gb); -- /* now quantify & encode AC coefs */ -- for(;;) { -- UPDATE_CACHE(re, &s->gb); -- GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0], TEX_VLC_BITS, 2, 0); -+ if (s->codec_id == CODEC_ID_MPEG2VIDEO) { -+ if(s->flags2 & CODEC_FLAG2_FAST){ -+ for(i=0;i<6;i++) { -+ if(cbp & 32) { -+ mpeg2_fast_decode_block_non_intra(s, s->pblocks[i], i); -+ } else { -+ s->block_last_index[i] = -1; -+ } -+ cbp+=cbp; -+ } -+ }else{ -+ cbp<<= 12-mb_block_count; - -- if(level == 127){ -- break; -- } else if(level != 0) { -- i += run; -- j = scantable[i]; -- level= (level*qscale*quant_matrix[j])>>4; -- level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); -- LAST_SKIP_BITS(re, &s->gb, 1); -+ for(i=0;i<mb_block_count;i++) { -+ if ( cbp & (1<<11) ) { -+ if (mpeg2_decode_block_non_intra(s, s->pblocks[i], i) < 0) -+ return -1; -+ } else { -+ s->block_last_index[i] = -1; -+ } -+ cbp+=cbp; -+ } -+ } - } else { -- /* escape */ -- run = SHOW_UBITS(re, &s->gb, 6)+1; LAST_SKIP_BITS(re, &s->gb, 6); -- UPDATE_CACHE(re, &s->gb); -- level = SHOW_SBITS(re, &s->gb, 12); SKIP_BITS(re, &s->gb, 12); -- i += run; -- j = scantable[i]; -- if(level<0){ -- level= (-level*qscale*quant_matrix[j])>>4; -- level= -level; -+ if(s->flags2 & CODEC_FLAG2_FAST){ -+ for(i=0;i<6;i++) { -+ if (cbp & 32) { -+ mpeg1_fast_decode_block_inter(s, s->pblocks[i], i); -+ } else { -+ s->block_last_index[i] = -1; -+ } -+ cbp+=cbp; -+ } - }else{ -- level= (level*qscale*quant_matrix[j])>>4; -+ for(i=0;i<6;i++) { -+ if (cbp & 32) { -+ if (mpeg1_decode_block_inter(s, s->pblocks[i], i) < 0) -+ return -1; -+ } else { -+ s->block_last_index[i] = -1; -+ } -+ cbp+=cbp; -+ } - } - } -- if (i > 63){ -- av_log(s->avctx, AV_LOG_ERROR, "ac-tex damaged at %d %d\n", s->mb_x, s->mb_y); -- return -1; -- } -- -- mismatch^= level; -- block[j] = level; -+ }else{ -+ for(i=0;i<12;i++) -+ s->block_last_index[i] = -1; - } -- CLOSE_READER(re, &s->gb); - } -- block[63]^= mismatch&1; - -- s->block_last_index[n] = i; -+ s->current_picture.mb_type[ s->mb_x + s->mb_y*s->mb_stride ]= mb_type; -+ - return 0; - } - --static inline int mpeg2_fast_decode_block_intra(MpegEncContext *s, -- DCTELEM *block, -- int n) -+/* as h263, but only 17 codes */ -+static int mpeg_decode_motion(MpegEncContext *s, int fcode, int pred) - { -- int level, dc, diff, j, run; -- int component; -- RLTable *rl; -- uint8_t * scantable= s->intra_scantable.permutated; -- const uint16_t *quant_matrix; -- const int qscale= s->qscale; -+ int code, sign, val, l, shift; - -- /* DC coef */ -- if (n < 4){ -- quant_matrix = s->intra_matrix; -- component = 0; -- }else{ -- quant_matrix = s->chroma_intra_matrix; -- component = (n&1) + 1; -+ code = get_vlc2(&s->gb, mv_vlc.table, MV_VLC_BITS, 2); -+ if (code == 0) { -+ return pred; -+ } -+ if (code < 0) { -+ return 0xffff; - } -- diff = decode_dc(&s->gb, component); -- if (diff >= 0xffff) -- return -1; -- dc = s->last_dc[component]; -- dc += diff; -- s->last_dc[component] = dc; -- block[0] = dc << (3 - s->intra_dc_precision); -- if (s->intra_vlc_format) -- rl = &rl_mpeg2; -- else -- rl = &rl_mpeg1; -- -- { -- OPEN_READER(re, &s->gb); -- /* now quantify & encode AC coefs */ -- for(;;) { -- UPDATE_CACHE(re, &s->gb); -- GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0], TEX_VLC_BITS, 2, 0); -- -- if(level == 127){ -- break; -- } else if(level != 0) { -- scantable += run; -- j = *scantable; -- level= (level*qscale*quant_matrix[j])>>4; -- level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); -- LAST_SKIP_BITS(re, &s->gb, 1); -- } else { -- /* escape */ -- run = SHOW_UBITS(re, &s->gb, 6)+1; LAST_SKIP_BITS(re, &s->gb, 6); -- UPDATE_CACHE(re, &s->gb); -- level = SHOW_SBITS(re, &s->gb, 12); SKIP_BITS(re, &s->gb, 12); -- scantable += run; -- j = *scantable; -- if(level<0){ -- level= (-level*qscale*quant_matrix[j])>>4; -- level= -level; -- }else{ -- level= (level*qscale*quant_matrix[j])>>4; -- } -- } - -- block[j] = level; -- } -- CLOSE_READER(re, &s->gb); -+ sign = get_bits1(&s->gb); -+ shift = fcode - 1; -+ val = code; -+ if (shift) { -+ val = (val - 1) << shift; -+ val |= get_bits(&s->gb, shift); -+ val++; - } -+ if (sign) -+ val = -val; -+ val += pred; - -- s->block_last_index[n] = scantable - s->intra_scantable.permutated; -- return 0; -+ /* modulo decoding */ -+ l= INT_BIT - 5 - shift; -+ val = (val<<l)>>l; -+ return val; - } - -+ -+ - typedef struct Mpeg1Context { - MpegEncContext mpeg_enc_ctx; - int mpeg_enc_ctx_allocated; /* true if decoding context allocated */ |