diff options
Diffstat (limited to 'multimedia/xine-lib/patches/patch-da')
-rw-r--r-- | multimedia/xine-lib/patches/patch-da | 848 |
1 files changed, 0 insertions, 848 deletions
diff --git a/multimedia/xine-lib/patches/patch-da b/multimedia/xine-lib/patches/patch-da deleted file mode 100644 index b73ce23ac91..00000000000 --- a/multimedia/xine-lib/patches/patch-da +++ /dev/null @@ -1,848 +0,0 @@ -$NetBSD: patch-da,v 1.3 2007/02/07 20:04:00 drochner 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/h263.c.orig 2007-01-28 19:38:33.000000000 +0100 -+++ src/libffmpeg/libavcodec/h263.c -@@ -3459,6 +3459,53 @@ static inline int get_amv(MpegEncContext - } - - /** -+ * decodes the dc value. -+ * @param n block index (0-3 are luma, 4-5 are chroma) -+ * @param dir_ptr the prediction direction will be stored here -+ * @return the quantized dc -+ */ -+static inline int mpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr) -+{ -+ int level, code; -+ -+ if (n < 4) -+ code = get_vlc2(&s->gb, dc_lum.table, DC_VLC_BITS, 1); -+ else -+ code = get_vlc2(&s->gb, dc_chrom.table, DC_VLC_BITS, 1); -+ if (code < 0 || code > 9 /* && s->nbit<9 */){ -+ av_log(s->avctx, AV_LOG_ERROR, "illegal dc vlc\n"); -+ return -1; -+ } -+ if (code == 0) { -+ level = 0; -+ } else { -+ if(IS_3IV1){ -+ if(code==1) -+ level= 2*get_bits1(&s->gb)-1; -+ else{ -+ if(get_bits1(&s->gb)) -+ level = get_bits(&s->gb, code-1) + (1<<(code-1)); -+ else -+ level = -get_bits(&s->gb, code-1) - (1<<(code-1)); -+ } -+ }else{ -+ level = get_xbits(&s->gb, code); -+ } -+ -+ if (code > 8){ -+ if(get_bits1(&s->gb)==0){ /* marker */ -+ if(s->error_resilience>=2){ -+ av_log(s->avctx, AV_LOG_ERROR, "dc marker bit missing\n"); -+ return -1; -+ } -+ } -+ } -+ } -+ -+ return ff_mpeg4_pred_dc(s, n, level, dir_ptr, 0); -+} -+ -+/** - * decodes first partition. - * @return number of MBs decoded or <0 if an error occured - */ -@@ -3764,124 +3811,380 @@ int ff_mpeg4_decode_partitions(MpegEncCo - } - - /** -- * decode partition C of one MB. -+ * decodes a block. - * @return <0 if an error occured - */ --static int mpeg4_decode_partitioned_mb(MpegEncContext *s, DCTELEM block[6][64]) -+static inline int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block, -+ int n, int coded, int intra, int rvlc) - { -- int cbp, mb_type; -- const int xy= s->mb_x + s->mb_y*s->mb_stride; -- -- mb_type= s->current_picture.mb_type[xy]; -- cbp = s->cbp_table[xy]; -+ int level, i, last, run; -+ int dc_pred_dir; -+ RLTable * rl; -+ RL_VLC_ELEM * rl_vlc; -+ const uint8_t * scan_table; -+ int qmul, qadd; - -- s->use_intra_dc_vlc= s->qscale < s->intra_dc_threshold; -+ //Note intra & rvlc should be optimized away if this is inlined - -- if(s->current_picture.qscale_table[xy] != s->qscale){ -- ff_set_qscale(s, s->current_picture.qscale_table[xy] ); -- } -+ if(intra) { -+ if(s->use_intra_dc_vlc){ -+ /* DC coef */ -+ if(s->partitioned_frame){ -+ level = s->dc_val[0][ s->block_index[n] ]; -+ if(n<4) level= FASTDIV((level + (s->y_dc_scale>>1)), s->y_dc_scale); -+ else level= FASTDIV((level + (s->c_dc_scale>>1)), s->c_dc_scale); -+ dc_pred_dir= (s->pred_dir_table[s->mb_x + s->mb_y*s->mb_stride]<<n)&32; -+ }else{ -+ level = mpeg4_decode_dc(s, n, &dc_pred_dir); -+ if (level < 0) -+ return -1; -+ } -+ block[0] = level; -+ i = 0; -+ }else{ -+ i = -1; -+ ff_mpeg4_pred_dc(s, n, 0, &dc_pred_dir, 0); -+ } -+ if (!coded) -+ goto not_coded; - -- if (s->pict_type == P_TYPE || s->pict_type==S_TYPE) { -- int i; -- for(i=0; i<4; i++){ -- s->mv[0][i][0] = s->current_picture.motion_val[0][ s->block_index[i] ][0]; -- s->mv[0][i][1] = s->current_picture.motion_val[0][ s->block_index[i] ][1]; -+ if(rvlc){ -+ rl = &rvlc_rl_intra; -+ rl_vlc = rvlc_rl_intra.rl_vlc[0]; -+ }else{ -+ rl = &rl_intra; -+ rl_vlc = rl_intra.rl_vlc[0]; - } -- s->mb_intra = IS_INTRA(mb_type); -+ if (s->ac_pred) { -+ if (dc_pred_dir == 0) -+ scan_table = s->intra_v_scantable.permutated; /* left */ -+ else -+ scan_table = s->intra_h_scantable.permutated; /* top */ -+ } else { -+ scan_table = s->intra_scantable.permutated; -+ } -+ qmul=1; -+ qadd=0; -+ } else { -+ i = -1; -+ if (!coded) { -+ s->block_last_index[n] = i; -+ return 0; -+ } -+ if(rvlc) rl = &rvlc_rl_inter; -+ else rl = &rl_inter; - -- if (IS_SKIP(mb_type)) { -- /* skip mb */ -- for(i=0;i<6;i++) -- s->block_last_index[i] = -1; -- s->mv_dir = MV_DIR_FORWARD; -- s->mv_type = MV_TYPE_16X16; -- if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE){ -- s->mcsel=1; -- s->mb_skipped = 0; -+ scan_table = s->intra_scantable.permutated; -+ -+ if(s->mpeg_quant){ -+ qmul=1; -+ qadd=0; -+ if(rvlc){ -+ rl_vlc = rvlc_rl_inter.rl_vlc[0]; - }else{ -- s->mcsel=0; -- s->mb_skipped = 1; -+ rl_vlc = rl_inter.rl_vlc[0]; - } -- }else if(s->mb_intra){ -- s->ac_pred = IS_ACPRED(s->current_picture.mb_type[xy]); -- }else if(!s->mb_intra){ --// s->mcsel= 0; //FIXME do we need to init that -- -- s->mv_dir = MV_DIR_FORWARD; -- if (IS_8X8(mb_type)) { -- s->mv_type = MV_TYPE_8X8; -- } else { -- s->mv_type = MV_TYPE_16X16; -+ }else{ -+ qmul = s->qscale << 1; -+ qadd = (s->qscale - 1) | 1; -+ if(rvlc){ -+ rl_vlc = rvlc_rl_inter.rl_vlc[s->qscale]; -+ }else{ -+ rl_vlc = rl_inter.rl_vlc[s->qscale]; - } - } -- } else { /* I-Frame */ -- s->mb_intra = 1; -- s->ac_pred = IS_ACPRED(s->current_picture.mb_type[xy]); - } -+ { -+ OPEN_READER(re, &s->gb); -+ for(;;) { -+ UPDATE_CACHE(re, &s->gb); -+ GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 0); -+ if (level==0) { -+ /* escape */ -+ if(rvlc){ -+ if(SHOW_UBITS(re, &s->gb, 1)==0){ -+ av_log(s->avctx, AV_LOG_ERROR, "1. marker bit missing in rvlc esc\n"); -+ return -1; -+ }; SKIP_CACHE(re, &s->gb, 1); - -- if (!IS_SKIP(mb_type)) { -- int i; -- s->dsp.clear_blocks(s->block[0]); -- /* decode each block */ -- for (i = 0; i < 6; i++) { -- if(mpeg4_decode_block(s, block[i], i, cbp&32, s->mb_intra, s->rvlc) < 0){ -- av_log(s->avctx, AV_LOG_ERROR, "texture corrupted at %d %d %d\n", s->mb_x, s->mb_y, s->mb_intra); -- return -1; -- } -- cbp+=cbp; -- } -- } -+ last= SHOW_UBITS(re, &s->gb, 1); SKIP_CACHE(re, &s->gb, 1); -+ run= SHOW_UBITS(re, &s->gb, 6); LAST_SKIP_CACHE(re, &s->gb, 6); -+ SKIP_COUNTER(re, &s->gb, 1+1+6); -+ UPDATE_CACHE(re, &s->gb); - -- /* per-MB end of slice check */ -+ if(SHOW_UBITS(re, &s->gb, 1)==0){ -+ av_log(s->avctx, AV_LOG_ERROR, "2. marker bit missing in rvlc esc\n"); -+ return -1; -+ }; SKIP_CACHE(re, &s->gb, 1); - -- if(--s->mb_num_left <= 0){ --//printf("%06X %d\n", show_bits(&s->gb, 24), s->gb.size_in_bits - get_bits_count(&s->gb)); -- if(mpeg4_is_resync(s)) -- return SLICE_END; -- else -- return SLICE_NOEND; -- }else{ -- if(mpeg4_is_resync(s)){ -- const int delta= s->mb_x + 1 == s->mb_width ? 2 : 1; -- if(s->cbp_table[xy+delta]) -- return SLICE_END; -- } -- return SLICE_OK; -- } --} -+ level= SHOW_UBITS(re, &s->gb, 11); SKIP_CACHE(re, &s->gb, 11); - --/** -- * read the next MVs for OBMC. yes this is a ugly hack, feel free to send a patch :) -- */ --static void preview_obmc(MpegEncContext *s){ -- GetBitContext gb= s->gb; -+ if(SHOW_UBITS(re, &s->gb, 5)!=0x10){ -+ av_log(s->avctx, AV_LOG_ERROR, "reverse esc missing\n"); -+ return -1; -+ }; SKIP_CACHE(re, &s->gb, 5); - -- int cbpc, i, pred_x, pred_y, mx, my; -- int16_t *mot_val; -- const int xy= s->mb_x + 1 + s->mb_y * s->mb_stride; -- const int stride= s->b8_stride*2; -+ level= level * qmul + qadd; -+ level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); LAST_SKIP_CACHE(re, &s->gb, 1); -+ SKIP_COUNTER(re, &s->gb, 1+11+5+1); - -- for(i=0; i<4; i++) -- s->block_index[i]+= 2; -- for(i=4; i<6; i++) -- s->block_index[i]+= 1; -- s->mb_x++; -+ i+= run + 1; -+ if(last) i+=192; -+ }else{ -+ int cache; -+ cache= GET_CACHE(re, &s->gb); - -- assert(s->pict_type == P_TYPE); -+ if(IS_3IV1) -+ cache ^= 0xC0000000; - -- do{ -- if (get_bits1(&s->gb)) { -- /* skip mb */ -- mot_val = s->current_picture.motion_val[0][ s->block_index[0] ]; -- mot_val[0 ]= mot_val[2 ]= -- mot_val[0+stride]= mot_val[2+stride]= 0; -- mot_val[1 ]= mot_val[3 ]= -- mot_val[1+stride]= mot_val[3+stride]= 0; -+ if (cache&0x80000000) { -+ if (cache&0x40000000) { -+ /* third escape */ -+ SKIP_CACHE(re, &s->gb, 2); -+ last= SHOW_UBITS(re, &s->gb, 1); SKIP_CACHE(re, &s->gb, 1); -+ run= SHOW_UBITS(re, &s->gb, 6); LAST_SKIP_CACHE(re, &s->gb, 6); -+ SKIP_COUNTER(re, &s->gb, 2+1+6); -+ UPDATE_CACHE(re, &s->gb); - -- s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0; -- goto end; -- } -- cbpc = get_vlc2(&s->gb, inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2); -+ if(IS_3IV1){ -+ level= SHOW_SBITS(re, &s->gb, 12); LAST_SKIP_BITS(re, &s->gb, 12); -+ }else{ -+ if(SHOW_UBITS(re, &s->gb, 1)==0){ -+ av_log(s->avctx, AV_LOG_ERROR, "1. marker bit missing in 3. esc\n"); -+ return -1; -+ }; SKIP_CACHE(re, &s->gb, 1); -+ -+ level= SHOW_SBITS(re, &s->gb, 12); SKIP_CACHE(re, &s->gb, 12); -+ -+ if(SHOW_UBITS(re, &s->gb, 1)==0){ -+ av_log(s->avctx, AV_LOG_ERROR, "2. marker bit missing in 3. esc\n"); -+ return -1; -+ }; LAST_SKIP_CACHE(re, &s->gb, 1); -+ -+ SKIP_COUNTER(re, &s->gb, 1+12+1); -+ } -+ -+#if 0 -+ if(s->error_resilience >= FF_ER_COMPLIANT){ -+ const int abs_level= FFABS(level); -+ if(abs_level<=MAX_LEVEL && run<=MAX_RUN){ -+ const int run1= run - rl->max_run[last][abs_level] - 1; -+ if(abs_level <= rl->max_level[last][run]){ -+ av_log(s->avctx, AV_LOG_ERROR, "illegal 3. esc, vlc encoding possible\n"); -+ return -1; -+ } -+ if(s->error_resilience > FF_ER_COMPLIANT){ -+ if(abs_level <= rl->max_level[last][run]*2){ -+ av_log(s->avctx, AV_LOG_ERROR, "illegal 3. esc, esc 1 encoding possible\n"); -+ return -1; -+ } -+ if(run1 >= 0 && abs_level <= rl->max_level[last][run1]){ -+ av_log(s->avctx, AV_LOG_ERROR, "illegal 3. esc, esc 2 encoding possible\n"); -+ return -1; -+ } -+ } -+ } -+ } -+#endif -+ if (level>0) level= level * qmul + qadd; -+ else level= level * qmul - qadd; -+ -+ if((unsigned)(level + 2048) > 4095){ -+ if(s->error_resilience > FF_ER_COMPLIANT){ -+ if(level > 2560 || level<-2560){ -+ av_log(s->avctx, AV_LOG_ERROR, "|level| overflow in 3. esc, qp=%d\n", s->qscale); -+ return -1; -+ } -+ } -+ level= level<0 ? -2048 : 2047; -+ } -+ -+ i+= run + 1; -+ if(last) i+=192; -+ } else { -+ /* second escape */ -+#if MIN_CACHE_BITS < 20 -+ LAST_SKIP_BITS(re, &s->gb, 2); -+ UPDATE_CACHE(re, &s->gb); -+#else -+ SKIP_BITS(re, &s->gb, 2); -+#endif -+ GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 1); -+ i+= run + rl->max_run[run>>7][level/qmul] +1; //FIXME opt indexing -+ level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); -+ LAST_SKIP_BITS(re, &s->gb, 1); -+ } -+ } else { -+ /* first escape */ -+#if MIN_CACHE_BITS < 19 -+ LAST_SKIP_BITS(re, &s->gb, 1); -+ UPDATE_CACHE(re, &s->gb); -+#else -+ SKIP_BITS(re, &s->gb, 1); -+#endif -+ GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 1); -+ i+= run; -+ level = level + rl->max_level[run>>7][(run-1)&63] * qmul;//FIXME opt indexing -+ level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); -+ LAST_SKIP_BITS(re, &s->gb, 1); -+ } -+ } -+ } else { -+ i+= run; -+ level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); -+ LAST_SKIP_BITS(re, &s->gb, 1); -+ } -+ if (i > 62){ -+ i-= 192; -+ 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; -+ } -+ -+ block[scan_table[i]] = level; -+ break; -+ } -+ -+ block[scan_table[i]] = level; -+ } -+ CLOSE_READER(re, &s->gb); -+ } -+ not_coded: -+ if (intra) { -+ if(!s->use_intra_dc_vlc){ -+ block[0] = ff_mpeg4_pred_dc(s, n, block[0], &dc_pred_dir, 0); -+ -+ i -= i>>31; //if(i == -1) i=0; -+ } -+ -+ mpeg4_pred_ac(s, block, n, dc_pred_dir); -+ if (s->ac_pred) { -+ i = 63; /* XXX: not optimal */ -+ } -+ } -+ s->block_last_index[n] = i; -+ return 0; -+} -+ -+/** -+ * decode partition C of one MB. -+ * @return <0 if an error occured -+ */ -+static int mpeg4_decode_partitioned_mb(MpegEncContext *s, DCTELEM block[6][64]) -+{ -+ int cbp, mb_type; -+ const int xy= s->mb_x + s->mb_y*s->mb_stride; -+ -+ mb_type= s->current_picture.mb_type[xy]; -+ cbp = s->cbp_table[xy]; -+ -+ s->use_intra_dc_vlc= s->qscale < s->intra_dc_threshold; -+ -+ if(s->current_picture.qscale_table[xy] != s->qscale){ -+ ff_set_qscale(s, s->current_picture.qscale_table[xy] ); -+ } -+ -+ if (s->pict_type == P_TYPE || s->pict_type==S_TYPE) { -+ int i; -+ for(i=0; i<4; i++){ -+ s->mv[0][i][0] = s->current_picture.motion_val[0][ s->block_index[i] ][0]; -+ s->mv[0][i][1] = s->current_picture.motion_val[0][ s->block_index[i] ][1]; -+ } -+ s->mb_intra = IS_INTRA(mb_type); -+ -+ if (IS_SKIP(mb_type)) { -+ /* skip mb */ -+ for(i=0;i<6;i++) -+ s->block_last_index[i] = -1; -+ s->mv_dir = MV_DIR_FORWARD; -+ s->mv_type = MV_TYPE_16X16; -+ if(s->pict_type==S_TYPE && s->vol_sprite_usage==GMC_SPRITE){ -+ s->mcsel=1; -+ s->mb_skipped = 0; -+ }else{ -+ s->mcsel=0; -+ s->mb_skipped = 1; -+ } -+ }else if(s->mb_intra){ -+ s->ac_pred = IS_ACPRED(s->current_picture.mb_type[xy]); -+ }else if(!s->mb_intra){ -+// s->mcsel= 0; //FIXME do we need to init that -+ -+ s->mv_dir = MV_DIR_FORWARD; -+ if (IS_8X8(mb_type)) { -+ s->mv_type = MV_TYPE_8X8; -+ } else { -+ s->mv_type = MV_TYPE_16X16; -+ } -+ } -+ } else { /* I-Frame */ -+ s->mb_intra = 1; -+ s->ac_pred = IS_ACPRED(s->current_picture.mb_type[xy]); -+ } -+ -+ if (!IS_SKIP(mb_type)) { -+ int i; -+ s->dsp.clear_blocks(s->block[0]); -+ /* decode each block */ -+ for (i = 0; i < 6; i++) { -+ if(mpeg4_decode_block(s, block[i], i, cbp&32, s->mb_intra, s->rvlc) < 0){ -+ av_log(s->avctx, AV_LOG_ERROR, "texture corrupted at %d %d %d\n", s->mb_x, s->mb_y, s->mb_intra); -+ return -1; -+ } -+ cbp+=cbp; -+ } -+ } -+ -+ /* per-MB end of slice check */ -+ -+ if(--s->mb_num_left <= 0){ -+//printf("%06X %d\n", show_bits(&s->gb, 24), s->gb.size_in_bits - get_bits_count(&s->gb)); -+ if(mpeg4_is_resync(s)) -+ return SLICE_END; -+ else -+ return SLICE_NOEND; -+ }else{ -+ if(mpeg4_is_resync(s)){ -+ const int delta= s->mb_x + 1 == s->mb_width ? 2 : 1; -+ if(s->cbp_table[xy+delta]) -+ return SLICE_END; -+ } -+ return SLICE_OK; -+ } -+} -+ -+/** -+ * read the next MVs for OBMC. yes this is a ugly hack, feel free to send a patch :) -+ */ -+static void preview_obmc(MpegEncContext *s){ -+ GetBitContext gb= s->gb; -+ -+ int cbpc, i, pred_x, pred_y, mx, my; -+ int16_t *mot_val; -+ const int xy= s->mb_x + 1 + s->mb_y * s->mb_stride; -+ const int stride= s->b8_stride*2; -+ -+ for(i=0; i<4; i++) -+ s->block_index[i]+= 2; -+ for(i=4; i<6; i++) -+ s->block_index[i]+= 1; -+ s->mb_x++; -+ -+ assert(s->pict_type == P_TYPE); -+ -+ do{ -+ if (get_bits1(&s->gb)) { -+ /* skip mb */ -+ mot_val = s->current_picture.motion_val[0][ s->block_index[0] ]; -+ mot_val[0 ]= mot_val[2 ]= -+ mot_val[0+stride]= mot_val[2+stride]= 0; -+ mot_val[1 ]= mot_val[3 ]= -+ mot_val[1+stride]= mot_val[3+stride]= 0; -+ -+ s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0; -+ goto end; -+ } -+ cbpc = get_vlc2(&s->gb, inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2); - }while(cbpc == 20); - - if(cbpc & 4){ -@@ -4747,309 +5050,6 @@ not_coded: - return 0; - } - --/** -- * decodes the dc value. -- * @param n block index (0-3 are luma, 4-5 are chroma) -- * @param dir_ptr the prediction direction will be stored here -- * @return the quantized dc -- */ --static inline int mpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr) --{ -- int level, code; -- -- if (n < 4) -- code = get_vlc2(&s->gb, dc_lum.table, DC_VLC_BITS, 1); -- else -- code = get_vlc2(&s->gb, dc_chrom.table, DC_VLC_BITS, 1); -- if (code < 0 || code > 9 /* && s->nbit<9 */){ -- av_log(s->avctx, AV_LOG_ERROR, "illegal dc vlc\n"); -- return -1; -- } -- if (code == 0) { -- level = 0; -- } else { -- if(IS_3IV1){ -- if(code==1) -- level= 2*get_bits1(&s->gb)-1; -- else{ -- if(get_bits1(&s->gb)) -- level = get_bits(&s->gb, code-1) + (1<<(code-1)); -- else -- level = -get_bits(&s->gb, code-1) - (1<<(code-1)); -- } -- }else{ -- level = get_xbits(&s->gb, code); -- } -- -- if (code > 8){ -- if(get_bits1(&s->gb)==0){ /* marker */ -- if(s->error_resilience>=2){ -- av_log(s->avctx, AV_LOG_ERROR, "dc marker bit missing\n"); -- return -1; -- } -- } -- } -- } -- -- return ff_mpeg4_pred_dc(s, n, level, dir_ptr, 0); --} -- --/** -- * decodes a block. -- * @return <0 if an error occured -- */ --static inline int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block, -- int n, int coded, int intra, int rvlc) --{ -- int level, i, last, run; -- int dc_pred_dir; -- RLTable * rl; -- RL_VLC_ELEM * rl_vlc; -- const uint8_t * scan_table; -- int qmul, qadd; -- -- //Note intra & rvlc should be optimized away if this is inlined -- -- if(intra) { -- if(s->use_intra_dc_vlc){ -- /* DC coef */ -- if(s->partitioned_frame){ -- level = s->dc_val[0][ s->block_index[n] ]; -- if(n<4) level= FASTDIV((level + (s->y_dc_scale>>1)), s->y_dc_scale); -- else level= FASTDIV((level + (s->c_dc_scale>>1)), s->c_dc_scale); -- dc_pred_dir= (s->pred_dir_table[s->mb_x + s->mb_y*s->mb_stride]<<n)&32; -- }else{ -- level = mpeg4_decode_dc(s, n, &dc_pred_dir); -- if (level < 0) -- return -1; -- } -- block[0] = level; -- i = 0; -- }else{ -- i = -1; -- ff_mpeg4_pred_dc(s, n, 0, &dc_pred_dir, 0); -- } -- if (!coded) -- goto not_coded; -- -- if(rvlc){ -- rl = &rvlc_rl_intra; -- rl_vlc = rvlc_rl_intra.rl_vlc[0]; -- }else{ -- rl = &rl_intra; -- rl_vlc = rl_intra.rl_vlc[0]; -- } -- if (s->ac_pred) { -- if (dc_pred_dir == 0) -- scan_table = s->intra_v_scantable.permutated; /* left */ -- else -- scan_table = s->intra_h_scantable.permutated; /* top */ -- } else { -- scan_table = s->intra_scantable.permutated; -- } -- qmul=1; -- qadd=0; -- } else { -- i = -1; -- if (!coded) { -- s->block_last_index[n] = i; -- return 0; -- } -- if(rvlc) rl = &rvlc_rl_inter; -- else rl = &rl_inter; -- -- scan_table = s->intra_scantable.permutated; -- -- if(s->mpeg_quant){ -- qmul=1; -- qadd=0; -- if(rvlc){ -- rl_vlc = rvlc_rl_inter.rl_vlc[0]; -- }else{ -- rl_vlc = rl_inter.rl_vlc[0]; -- } -- }else{ -- qmul = s->qscale << 1; -- qadd = (s->qscale - 1) | 1; -- if(rvlc){ -- rl_vlc = rvlc_rl_inter.rl_vlc[s->qscale]; -- }else{ -- rl_vlc = rl_inter.rl_vlc[s->qscale]; -- } -- } -- } -- { -- OPEN_READER(re, &s->gb); -- for(;;) { -- UPDATE_CACHE(re, &s->gb); -- GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 0); -- if (level==0) { -- /* escape */ -- if(rvlc){ -- if(SHOW_UBITS(re, &s->gb, 1)==0){ -- av_log(s->avctx, AV_LOG_ERROR, "1. marker bit missing in rvlc esc\n"); -- return -1; -- }; SKIP_CACHE(re, &s->gb, 1); -- -- last= SHOW_UBITS(re, &s->gb, 1); SKIP_CACHE(re, &s->gb, 1); -- run= SHOW_UBITS(re, &s->gb, 6); LAST_SKIP_CACHE(re, &s->gb, 6); -- SKIP_COUNTER(re, &s->gb, 1+1+6); -- UPDATE_CACHE(re, &s->gb); -- -- if(SHOW_UBITS(re, &s->gb, 1)==0){ -- av_log(s->avctx, AV_LOG_ERROR, "2. marker bit missing in rvlc esc\n"); -- return -1; -- }; SKIP_CACHE(re, &s->gb, 1); -- -- level= SHOW_UBITS(re, &s->gb, 11); SKIP_CACHE(re, &s->gb, 11); -- -- if(SHOW_UBITS(re, &s->gb, 5)!=0x10){ -- av_log(s->avctx, AV_LOG_ERROR, "reverse esc missing\n"); -- return -1; -- }; SKIP_CACHE(re, &s->gb, 5); -- -- level= level * qmul + qadd; -- level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); LAST_SKIP_CACHE(re, &s->gb, 1); -- SKIP_COUNTER(re, &s->gb, 1+11+5+1); -- -- i+= run + 1; -- if(last) i+=192; -- }else{ -- int cache; -- cache= GET_CACHE(re, &s->gb); -- -- if(IS_3IV1) -- cache ^= 0xC0000000; -- -- if (cache&0x80000000) { -- if (cache&0x40000000) { -- /* third escape */ -- SKIP_CACHE(re, &s->gb, 2); -- last= SHOW_UBITS(re, &s->gb, 1); SKIP_CACHE(re, &s->gb, 1); -- run= SHOW_UBITS(re, &s->gb, 6); LAST_SKIP_CACHE(re, &s->gb, 6); -- SKIP_COUNTER(re, &s->gb, 2+1+6); -- UPDATE_CACHE(re, &s->gb); -- -- if(IS_3IV1){ -- level= SHOW_SBITS(re, &s->gb, 12); LAST_SKIP_BITS(re, &s->gb, 12); -- }else{ -- if(SHOW_UBITS(re, &s->gb, 1)==0){ -- av_log(s->avctx, AV_LOG_ERROR, "1. marker bit missing in 3. esc\n"); -- return -1; -- }; SKIP_CACHE(re, &s->gb, 1); -- -- level= SHOW_SBITS(re, &s->gb, 12); SKIP_CACHE(re, &s->gb, 12); -- -- if(SHOW_UBITS(re, &s->gb, 1)==0){ -- av_log(s->avctx, AV_LOG_ERROR, "2. marker bit missing in 3. esc\n"); -- return -1; -- }; LAST_SKIP_CACHE(re, &s->gb, 1); -- -- SKIP_COUNTER(re, &s->gb, 1+12+1); -- } -- --#if 0 -- if(s->error_resilience >= FF_ER_COMPLIANT){ -- const int abs_level= FFABS(level); -- if(abs_level<=MAX_LEVEL && run<=MAX_RUN){ -- const int run1= run - rl->max_run[last][abs_level] - 1; -- if(abs_level <= rl->max_level[last][run]){ -- av_log(s->avctx, AV_LOG_ERROR, "illegal 3. esc, vlc encoding possible\n"); -- return -1; -- } -- if(s->error_resilience > FF_ER_COMPLIANT){ -- if(abs_level <= rl->max_level[last][run]*2){ -- av_log(s->avctx, AV_LOG_ERROR, "illegal 3. esc, esc 1 encoding possible\n"); -- return -1; -- } -- if(run1 >= 0 && abs_level <= rl->max_level[last][run1]){ -- av_log(s->avctx, AV_LOG_ERROR, "illegal 3. esc, esc 2 encoding possible\n"); -- return -1; -- } -- } -- } -- } --#endif -- if (level>0) level= level * qmul + qadd; -- else level= level * qmul - qadd; -- -- if((unsigned)(level + 2048) > 4095){ -- if(s->error_resilience > FF_ER_COMPLIANT){ -- if(level > 2560 || level<-2560){ -- av_log(s->avctx, AV_LOG_ERROR, "|level| overflow in 3. esc, qp=%d\n", s->qscale); -- return -1; -- } -- } -- level= level<0 ? -2048 : 2047; -- } -- -- i+= run + 1; -- if(last) i+=192; -- } else { -- /* second escape */ --#if MIN_CACHE_BITS < 20 -- LAST_SKIP_BITS(re, &s->gb, 2); -- UPDATE_CACHE(re, &s->gb); --#else -- SKIP_BITS(re, &s->gb, 2); --#endif -- GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 1); -- i+= run + rl->max_run[run>>7][level/qmul] +1; //FIXME opt indexing -- level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); -- LAST_SKIP_BITS(re, &s->gb, 1); -- } -- } else { -- /* first escape */ --#if MIN_CACHE_BITS < 19 -- LAST_SKIP_BITS(re, &s->gb, 1); -- UPDATE_CACHE(re, &s->gb); --#else -- SKIP_BITS(re, &s->gb, 1); --#endif -- GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 1); -- i+= run; -- level = level + rl->max_level[run>>7][(run-1)&63] * qmul;//FIXME opt indexing -- level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); -- LAST_SKIP_BITS(re, &s->gb, 1); -- } -- } -- } else { -- i+= run; -- level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); -- LAST_SKIP_BITS(re, &s->gb, 1); -- } -- if (i > 62){ -- i-= 192; -- 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; -- } -- -- block[scan_table[i]] = level; -- break; -- } -- -- block[scan_table[i]] = level; -- } -- CLOSE_READER(re, &s->gb); -- } -- not_coded: -- if (intra) { -- if(!s->use_intra_dc_vlc){ -- block[0] = ff_mpeg4_pred_dc(s, n, block[0], &dc_pred_dir, 0); -- -- i -= i>>31; //if(i == -1) i=0; -- } -- -- mpeg4_pred_ac(s, block, n, dc_pred_dir); -- if (s->ac_pred) { -- i = 63; /* XXX: not optimal */ -- } -- } -- s->block_last_index[n] = i; -- return 0; --} -- - /* most is hardcoded. should extend to handle all h263 streams */ - int h263_decode_picture_header(MpegEncContext *s) - { |