Go to:
Gentoo Home
Documentation
Forums
Lists
Bugs
Planet
Store
Wiki
Get Gentoo!
Gentoo's Bugzilla – Attachment 83898 Details for
Bug 119014
xine-lib-1.1.1-r3 fails with compiler error in h263.cc : mpeg4_decode_partition_a
Home
|
New
–
[Ex]
|
Browse
|
Search
|
Privacy Policy
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
patch to move functions up in source code body.
h263.c.patch (text/plain), 40.52 KB, created by
Aakash
on 2006-04-04 09:54:51 UTC
(
hide
)
Description:
patch to move functions up in source code body.
Filename:
MIME Type:
Creator:
Aakash
Created:
2006-04-04 09:54:51 UTC
Size:
40.52 KB
patch
obsolete
>--- h263.c 2006-04-04 19:12:26.000000000 +0530 >+++ h263.fixed 2006-04-04 19:11:30.000000000 +0530 >@@ -2862,212 +2862,514 @@ > static VLC h263_mbtype_b_vlc; > static VLC cbpc_b_vlc; > >-void init_vlc_rl(RLTable *rl, int use_static) >+/** >+ * 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 i, q; >- >- /* Return if static table is already initialized */ >- if(use_static && rl->rl_vlc[0]) >- return; >- >- init_vlc(&rl->vlc, 9, rl->n + 1, >- &rl->table_vlc[0][1], 4, 2, >- &rl->table_vlc[0][0], 4, 2, use_static); >+ int level, code; > >- >- for(q=0; q<32; q++){ >- int qmul= q*2; >- int qadd= (q-1)|1; >- >- if(q==0){ >- qmul=1; >- qadd=0; >+ 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(use_static) >- rl->rl_vlc[q]= av_mallocz_static(rl->vlc.table_size*sizeof(RL_VLC_ELEM)); >- else >- rl->rl_vlc[q]= av_malloc(rl->vlc.table_size*sizeof(RL_VLC_ELEM)); >- for(i=0; i<rl->vlc.table_size; i++){ >- int code= rl->vlc.table[i][0]; >- int len = rl->vlc.table[i][1]; >- int level, run; >- >- if(len==0){ // illegal code >- run= 66; >- level= MAX_LEVEL; >- }else if(len<0){ //more bits needed >- run= 0; >- level= code; >- }else{ >- if(code==rl->n){ //esc >- run= 66; >- level= 0; >- }else{ >- run= rl->table_run [code] + 1; >- level= rl->table_level[code] * qmul + qadd; >- if(code >= rl->last) run+=192; >+ >+ 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; > } > } >- rl->rl_vlc[q][i].len= len; >- rl->rl_vlc[q][i].level= level; >- rl->rl_vlc[q][i].run= run; > } > } >-} >- >-/* init vlcs */ >- >-/* XXX: find a better solution to handle static init */ >-void h263_decode_init_vlc(MpegEncContext *s) >-{ >- static int done = 0; >- >- if (!done) { >- done = 1; >- >- init_vlc(&intra_MCBPC_vlc, INTRA_MCBPC_VLC_BITS, 9, >- intra_MCBPC_bits, 1, 1, >- intra_MCBPC_code, 1, 1, 1); >- init_vlc(&inter_MCBPC_vlc, INTER_MCBPC_VLC_BITS, 28, >- inter_MCBPC_bits, 1, 1, >- inter_MCBPC_code, 1, 1, 1); >- init_vlc(&cbpy_vlc, CBPY_VLC_BITS, 16, >- &cbpy_tab[0][1], 2, 1, >- &cbpy_tab[0][0], 2, 1, 1); >- init_vlc(&mv_vlc, MV_VLC_BITS, 33, >- &mvtab[0][1], 2, 1, >- &mvtab[0][0], 2, 1, 1); >- init_rl(&rl_inter, 1); >- init_rl(&rl_intra, 1); >- init_rl(&rvlc_rl_inter, 1); >- init_rl(&rvlc_rl_intra, 1); >- init_rl(&rl_intra_aic, 1); >- init_vlc_rl(&rl_inter, 1); >- init_vlc_rl(&rl_intra, 1); >- init_vlc_rl(&rvlc_rl_inter, 1); >- init_vlc_rl(&rvlc_rl_intra, 1); >- init_vlc_rl(&rl_intra_aic, 1); >- init_vlc(&dc_lum, DC_VLC_BITS, 10 /* 13 */, >- &DCtab_lum[0][1], 2, 1, >- &DCtab_lum[0][0], 2, 1, 1); >- init_vlc(&dc_chrom, DC_VLC_BITS, 10 /* 13 */, >- &DCtab_chrom[0][1], 2, 1, >- &DCtab_chrom[0][0], 2, 1, 1); >- init_vlc(&sprite_trajectory, SPRITE_TRAJ_VLC_BITS, 15, >- &sprite_trajectory_tab[0][1], 4, 2, >- &sprite_trajectory_tab[0][0], 4, 2, 1); >- init_vlc(&mb_type_b_vlc, MB_TYPE_B_VLC_BITS, 4, >- &mb_type_b_tab[0][1], 2, 1, >- &mb_type_b_tab[0][0], 2, 1, 1); >- init_vlc(&h263_mbtype_b_vlc, H263_MBTYPE_B_VLC_BITS, 15, >- &h263_mbtype_b_tab[0][1], 2, 1, >- &h263_mbtype_b_tab[0][0], 2, 1, 1); >- init_vlc(&cbpc_b_vlc, CBPC_B_VLC_BITS, 4, >- &cbpc_b_tab[0][1], 2, 1, >- &cbpc_b_tab[0][0], 2, 1, 1); >- } >-} >- >-/** >- * Get the GOB height based on picture height. >- */ >-int ff_h263_get_gob_height(MpegEncContext *s){ >- if (s->height <= 400) >- return 1; >- else if (s->height <= 800) >- return 2; >- else >- return 4; >-} >- >-int ff_h263_decode_mba(MpegEncContext *s) >-{ >- int i, mb_pos; >- >- for(i=0; i<6; i++){ >- if(s->mb_num-1 <= ff_mba_max[i]) break; >- } >- mb_pos= get_bits(&s->gb, ff_mba_length[i]); >- s->mb_x= mb_pos % s->mb_width; >- s->mb_y= mb_pos / s->mb_width; >- >- return mb_pos; >-} > >-void ff_h263_encode_mba(MpegEncContext *s) >-{ >- int i, mb_pos; >- >- for(i=0; i<6; i++){ >- if(s->mb_num-1 <= ff_mba_max[i]) break; >- } >- mb_pos= s->mb_x + s->mb_width*s->mb_y; >- put_bits(&s->pb, ff_mba_length[i], mb_pos); >+ return ff_mpeg4_pred_dc(s, n, level, dir_ptr, 0); > } > > /** >- * decodes the group of blocks header or slice header. >+ * decodes a block. > * @return <0 if an error occured > */ >-static int h263_decode_gob_header(MpegEncContext *s) >+static inline int mpeg4_decode_block(MpegEncContext * s, DCTELEM * block, >+ int n, int coded, int intra, int rvlc) > { >- unsigned int val, gfid, gob_number; >- int left; >- >- /* Check for GOB Start Code */ >- val = show_bits(&s->gb, 16); >- if(val) >- return -1; >- >- /* We have a GBSC probably with GSTUFF */ >- skip_bits(&s->gb, 16); /* Drop the zeros */ >- left= s->gb.size_in_bits - get_bits_count(&s->gb); >- //MN: we must check the bits left or we might end in a infinite loop (or segfault) >- for(;left>13; left--){ >- if(get_bits1(&s->gb)) break; /* Seek the '1' bit */ >- } >- if(left<=13) >- return -1; >- >- if(s->h263_slice_structured){ >- if(get_bits1(&s->gb)==0) >- return -1; >- >- ff_h263_decode_mba(s); >+ int level, i, last, run; >+ int dc_pred_dir; >+ RLTable * rl; >+ RL_VLC_ELEM * rl_vlc; >+ const uint8_t * scan_table; >+ int qmul, qadd; > >- if(s->mb_num > 1583) >- if(get_bits1(&s->gb)==0) >+ //Note intra & rvlc should be optimized away if this is inlined >+ >+ if(intra) { >+ if(s->qscale < s->intra_dc_threshold){ >+ /* 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; >+ } >+ if (!coded) >+ goto not_coded; > >- s->qscale = get_bits(&s->gb, 5); /* SQUANT */ >- if(get_bits1(&s->gb)==0) >- return -1; >- gfid = get_bits(&s->gb, 2); /* GFID */ >- }else{ >- gob_number = get_bits(&s->gb, 5); /* GN */ >- s->mb_x= 0; >- s->mb_y= s->gob_index* gob_number; >- gfid = get_bits(&s->gb, 2); /* GFID */ >- s->qscale = get_bits(&s->gb, 5); /* GQUANT */ >- } >- >- if(s->mb_y >= s->mb_height) >- return -1; >- >- if(s->qscale==0) >- return -1; >- >- return 0; >-} >- >-static inline void memsetw(short *tab, int val, int n) >-{ >- int i; >- for(i=0;i<n;i++) >- tab[i] = val; >-} >- >-#ifdef CONFIG_ENCODERS >+ 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= ABS(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->qscale >= s->intra_dc_threshold){ >+ block[0] = ff_mpeg4_pred_dc(s, n, block[0], &dc_pred_dir, 0); >+ >+ 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; >+} >+ >+void init_vlc_rl(RLTable *rl, int use_static) >+{ >+ int i, q; >+ >+ /* Return if static table is already initialized */ >+ if(use_static && rl->rl_vlc[0]) >+ return; >+ >+ init_vlc(&rl->vlc, 9, rl->n + 1, >+ &rl->table_vlc[0][1], 4, 2, >+ &rl->table_vlc[0][0], 4, 2, use_static); >+ >+ >+ for(q=0; q<32; q++){ >+ int qmul= q*2; >+ int qadd= (q-1)|1; >+ >+ if(q==0){ >+ qmul=1; >+ qadd=0; >+ } >+ if(use_static) >+ rl->rl_vlc[q]= av_mallocz_static(rl->vlc.table_size*sizeof(RL_VLC_ELEM)); >+ else >+ rl->rl_vlc[q]= av_malloc(rl->vlc.table_size*sizeof(RL_VLC_ELEM)); >+ for(i=0; i<rl->vlc.table_size; i++){ >+ int code= rl->vlc.table[i][0]; >+ int len = rl->vlc.table[i][1]; >+ int level, run; >+ >+ if(len==0){ // illegal code >+ run= 66; >+ level= MAX_LEVEL; >+ }else if(len<0){ //more bits needed >+ run= 0; >+ level= code; >+ }else{ >+ if(code==rl->n){ //esc >+ run= 66; >+ level= 0; >+ }else{ >+ run= rl->table_run [code] + 1; >+ level= rl->table_level[code] * qmul + qadd; >+ if(code >= rl->last) run+=192; >+ } >+ } >+ rl->rl_vlc[q][i].len= len; >+ rl->rl_vlc[q][i].level= level; >+ rl->rl_vlc[q][i].run= run; >+ } >+ } >+} >+ >+/* init vlcs */ >+ >+/* XXX: find a better solution to handle static init */ >+void h263_decode_init_vlc(MpegEncContext *s) >+{ >+ static int done = 0; >+ >+ if (!done) { >+ done = 1; >+ >+ init_vlc(&intra_MCBPC_vlc, INTRA_MCBPC_VLC_BITS, 9, >+ intra_MCBPC_bits, 1, 1, >+ intra_MCBPC_code, 1, 1, 1); >+ init_vlc(&inter_MCBPC_vlc, INTER_MCBPC_VLC_BITS, 28, >+ inter_MCBPC_bits, 1, 1, >+ inter_MCBPC_code, 1, 1, 1); >+ init_vlc(&cbpy_vlc, CBPY_VLC_BITS, 16, >+ &cbpy_tab[0][1], 2, 1, >+ &cbpy_tab[0][0], 2, 1, 1); >+ init_vlc(&mv_vlc, MV_VLC_BITS, 33, >+ &mvtab[0][1], 2, 1, >+ &mvtab[0][0], 2, 1, 1); >+ init_rl(&rl_inter, 1); >+ init_rl(&rl_intra, 1); >+ init_rl(&rvlc_rl_inter, 1); >+ init_rl(&rvlc_rl_intra, 1); >+ init_rl(&rl_intra_aic, 1); >+ init_vlc_rl(&rl_inter, 1); >+ init_vlc_rl(&rl_intra, 1); >+ init_vlc_rl(&rvlc_rl_inter, 1); >+ init_vlc_rl(&rvlc_rl_intra, 1); >+ init_vlc_rl(&rl_intra_aic, 1); >+ init_vlc(&dc_lum, DC_VLC_BITS, 10 /* 13 */, >+ &DCtab_lum[0][1], 2, 1, >+ &DCtab_lum[0][0], 2, 1, 1); >+ init_vlc(&dc_chrom, DC_VLC_BITS, 10 /* 13 */, >+ &DCtab_chrom[0][1], 2, 1, >+ &DCtab_chrom[0][0], 2, 1, 1); >+ init_vlc(&sprite_trajectory, SPRITE_TRAJ_VLC_BITS, 15, >+ &sprite_trajectory_tab[0][1], 4, 2, >+ &sprite_trajectory_tab[0][0], 4, 2, 1); >+ init_vlc(&mb_type_b_vlc, MB_TYPE_B_VLC_BITS, 4, >+ &mb_type_b_tab[0][1], 2, 1, >+ &mb_type_b_tab[0][0], 2, 1, 1); >+ init_vlc(&h263_mbtype_b_vlc, H263_MBTYPE_B_VLC_BITS, 15, >+ &h263_mbtype_b_tab[0][1], 2, 1, >+ &h263_mbtype_b_tab[0][0], 2, 1, 1); >+ init_vlc(&cbpc_b_vlc, CBPC_B_VLC_BITS, 4, >+ &cbpc_b_tab[0][1], 2, 1, >+ &cbpc_b_tab[0][0], 2, 1, 1); >+ } >+} >+ >+/** >+ * Get the GOB height based on picture height. >+ */ >+int ff_h263_get_gob_height(MpegEncContext *s){ >+ if (s->height <= 400) >+ return 1; >+ else if (s->height <= 800) >+ return 2; >+ else >+ return 4; >+} >+ >+int ff_h263_decode_mba(MpegEncContext *s) >+{ >+ int i, mb_pos; >+ >+ for(i=0; i<6; i++){ >+ if(s->mb_num-1 <= ff_mba_max[i]) break; >+ } >+ mb_pos= get_bits(&s->gb, ff_mba_length[i]); >+ s->mb_x= mb_pos % s->mb_width; >+ s->mb_y= mb_pos / s->mb_width; >+ >+ return mb_pos; >+} >+ >+void ff_h263_encode_mba(MpegEncContext *s) >+{ >+ int i, mb_pos; >+ >+ for(i=0; i<6; i++){ >+ if(s->mb_num-1 <= ff_mba_max[i]) break; >+ } >+ mb_pos= s->mb_x + s->mb_width*s->mb_y; >+ put_bits(&s->pb, ff_mba_length[i], mb_pos); >+} >+ >+/** >+ * decodes the group of blocks header or slice header. >+ * @return <0 if an error occured >+ */ >+static int h263_decode_gob_header(MpegEncContext *s) >+{ >+ unsigned int val, gfid, gob_number; >+ int left; >+ >+ /* Check for GOB Start Code */ >+ val = show_bits(&s->gb, 16); >+ if(val) >+ return -1; >+ >+ /* We have a GBSC probably with GSTUFF */ >+ skip_bits(&s->gb, 16); /* Drop the zeros */ >+ left= s->gb.size_in_bits - get_bits_count(&s->gb); >+ //MN: we must check the bits left or we might end in a infinite loop (or segfault) >+ for(;left>13; left--){ >+ if(get_bits1(&s->gb)) break; /* Seek the '1' bit */ >+ } >+ if(left<=13) >+ return -1; >+ >+ if(s->h263_slice_structured){ >+ if(get_bits1(&s->gb)==0) >+ return -1; >+ >+ ff_h263_decode_mba(s); >+ >+ if(s->mb_num > 1583) >+ if(get_bits1(&s->gb)==0) >+ return -1; >+ >+ s->qscale = get_bits(&s->gb, 5); /* SQUANT */ >+ if(get_bits1(&s->gb)==0) >+ return -1; >+ gfid = get_bits(&s->gb, 2); /* GFID */ >+ }else{ >+ gob_number = get_bits(&s->gb, 5); /* GN */ >+ s->mb_x= 0; >+ s->mb_y= s->gob_index* gob_number; >+ gfid = get_bits(&s->gb, 2); /* GFID */ >+ s->qscale = get_bits(&s->gb, 5); /* GQUANT */ >+ } >+ >+ if(s->mb_y >= s->mb_height) >+ return -1; >+ >+ if(s->qscale==0) >+ return -1; >+ >+ return 0; >+} >+ >+static inline void memsetw(short *tab, int val, int n) >+{ >+ int i; >+ for(i=0;i<n;i++) >+ tab[i] = val; >+} >+ >+#ifdef CONFIG_ENCODERS > > void ff_mpeg4_init_partitions(MpegEncContext *s) > { >@@ -4563,416 +4865,114 @@ > scan_table = s->intra_v_scantable.permutated; /* left */ > else > scan_table = s->intra_h_scantable.permutated; /* top */ >- } >- } else if (s->mb_intra) { >- /* DC coef */ >- if(s->codec_id == CODEC_ID_RV10){ >-#ifdef CONFIG_RV10_DECODER >- if (s->rv10_version == 3 && s->pict_type == I_TYPE) { >- int component, diff; >- component = (n <= 3 ? 0 : n - 4 + 1); >- level = s->last_dc[component]; >- if (s->rv10_first_dc_coded[component]) { >- diff = rv_decode_dc(s, n); >- if (diff == 0xffff) >- return -1; >- level += diff; >- level = level & 0xff; /* handle wrap round */ >- s->last_dc[component] = level; >- } else { >- s->rv10_first_dc_coded[component] = 1; >- } >- } else { >- level = get_bits(&s->gb, 8); >- if (level == 255) >- level = 128; >- } >-#endif >- }else{ >- level = get_bits(&s->gb, 8); >- if((level&0x7F) == 0){ >- av_log(s->avctx, AV_LOG_ERROR, "illegal dc %d at %d %d\n", level, s->mb_x, s->mb_y); >- if(s->error_resilience >= FF_ER_COMPLIANT) >- return -1; >- } >- if (level == 255) >- level = 128; >- } >- block[0] = level; >- i = 1; >- } else { >- i = 0; >- } >- if (!coded) { >- if (s->mb_intra && s->h263_aic) >- goto not_coded; >- s->block_last_index[n] = i - 1; >- return 0; >- } >-retry: >- for(;;) { >- code = get_vlc2(&s->gb, rl->vlc.table, TEX_VLC_BITS, 2); >- if (code < 0){ >- av_log(s->avctx, AV_LOG_ERROR, "illegal ac vlc code at %dx%d\n", s->mb_x, s->mb_y); >- return -1; >- } >- if (code == rl->n) { >- /* escape */ >- if (s->h263_flv > 1) { >- int is11 = get_bits1(&s->gb); >- last = get_bits1(&s->gb); >- run = get_bits(&s->gb, 6); >- if(is11){ >- level = get_sbits(&s->gb, 11); >- } else { >- level = get_sbits(&s->gb, 7); >- } >- } else { >- last = get_bits1(&s->gb); >- run = get_bits(&s->gb, 6); >- level = (int8_t)get_bits(&s->gb, 8); >- if(level == -128){ >- if (s->codec_id == CODEC_ID_RV10) { >- /* XXX: should patch encoder too */ >- level = get_sbits(&s->gb, 12); >- }else{ >- level = get_bits(&s->gb, 5); >- level |= get_sbits(&s->gb, 6)<<5; >- } >- } >- } >- } else { >- run = rl->table_run[code]; >- level = rl->table_level[code]; >- last = code >= rl->last; >- if (get_bits1(&s->gb)) >- level = -level; >- } >- i += run; >- if (i >= 64){ >- if(s->alt_inter_vlc && rl == &rl_inter && !s->mb_intra){ >- //looks like a hack but no, it's the way its supposed to work ... >- rl = &rl_intra_aic; >- i = 0; >- s->gb= gb; >- memset(block, 0, sizeof(DCTELEM)*64); >- goto retry; >- } >- av_log(s->avctx, AV_LOG_ERROR, "run overflow at %dx%d i:%d\n", s->mb_x, s->mb_y, s->mb_intra); >- return -1; >- } >- j = scan_table[i]; >- block[j] = level; >- if (last) >- break; >- i++; >- } >-not_coded: >- if (s->mb_intra && s->h263_aic) { >- h263_pred_acdc(s, block, n); >- i = 63; >- } >- s->block_last_index[n] = i; >- 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->qscale < s->intra_dc_threshold){ >- /* 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; >- } >- 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 if (s->mb_intra) { >+ /* DC coef */ >+ if(s->codec_id == CODEC_ID_RV10){ >+#ifdef CONFIG_RV10_DECODER >+ if (s->rv10_version == 3 && s->pict_type == I_TYPE) { >+ int component, diff; >+ component = (n <= 3 ? 0 : n - 4 + 1); >+ level = s->last_dc[component]; >+ if (s->rv10_first_dc_coded[component]) { >+ diff = rv_decode_dc(s, n); >+ if (diff == 0xffff) >+ return -1; >+ level += diff; >+ level = level & 0xff; /* handle wrap round */ >+ s->last_dc[component] = level; >+ } else { >+ s->rv10_first_dc_coded[component] = 1; > } >+ } else { >+ level = get_bits(&s->gb, 8); >+ if (level == 255) >+ level = 128; >+ } >+#endif > }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]; >+ level = get_bits(&s->gb, 8); >+ if((level&0x7F) == 0){ >+ av_log(s->avctx, AV_LOG_ERROR, "illegal dc %d at %d %d\n", level, s->mb_x, s->mb_y); >+ if(s->error_resilience >= FF_ER_COMPLIANT) >+ return -1; > } >+ if (level == 255) >+ level = 128; > } >+ block[0] = level; >+ i = 1; >+ } else { >+ i = 0; > } >- { >- OPEN_READER(re, &s->gb); >+ if (!coded) { >+ if (s->mb_intra && s->h263_aic) >+ goto not_coded; >+ s->block_last_index[n] = i - 1; >+ return 0; >+ } >+retry: > 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= ABS(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; >+ code = get_vlc2(&s->gb, rl->vlc.table, TEX_VLC_BITS, 2); >+ if (code < 0){ >+ av_log(s->avctx, AV_LOG_ERROR, "illegal ac vlc code at %dx%d\n", s->mb_x, s->mb_y); >+ return -1; >+ } >+ if (code == rl->n) { >+ /* escape */ >+ if (s->h263_flv > 1) { >+ int is11 = get_bits1(&s->gb); >+ last = get_bits1(&s->gb); >+ run = get_bits(&s->gb, 6); >+ if(is11){ >+ level = get_sbits(&s->gb, 11); > } 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); >+ level = get_sbits(&s->gb, 7); > } > } 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); >+ last = get_bits1(&s->gb); >+ run = get_bits(&s->gb, 6); >+ level = (int8_t)get_bits(&s->gb, 8); >+ if(level == -128){ >+ if (s->codec_id == CODEC_ID_RV10) { >+ /* XXX: should patch encoder too */ >+ level = get_sbits(&s->gb, 12); >+ }else{ >+ level = get_bits(&s->gb, 5); >+ level |= get_sbits(&s->gb, 6)<<5; >+ } >+ } > } >- } > } else { >- i+= run; >- level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); >- LAST_SKIP_BITS(re, &s->gb, 1); >+ run = rl->table_run[code]; >+ level = rl->table_level[code]; >+ last = code >= rl->last; >+ if (get_bits1(&s->gb)) >+ level = -level; > } >- 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; >+ i += run; >+ if (i >= 64){ >+ if(s->alt_inter_vlc && rl == &rl_inter && !s->mb_intra){ >+ //looks like a hack but no, it's the way its supposed to work ... >+ rl = &rl_intra_aic; >+ i = 0; >+ s->gb= gb; >+ memset(block, 0, sizeof(DCTELEM)*64); >+ goto retry; > } >- >- block[scan_table[i]] = level; >- break; >+ av_log(s->avctx, AV_LOG_ERROR, "run overflow at %dx%d i:%d\n", s->mb_x, s->mb_y, s->mb_intra); >+ return -1; > } >- >- block[scan_table[i]] = level; >+ j = scan_table[i]; >+ block[j] = level; >+ if (last) >+ break; >+ i++; > } >- CLOSE_READER(re, &s->gb); >- } >- not_coded: >- if (intra) { >- if(s->qscale >= s->intra_dc_threshold){ >- block[0] = ff_mpeg4_pred_dc(s, n, block[0], &dc_pred_dir, 0); >- >- if(i == -1) i=0; >- } >- >- mpeg4_pred_ac(s, block, n, dc_pred_dir); >- if (s->ac_pred) { >- i = 63; /* XXX: not optimal */ >- } >+not_coded: >+ if (s->mb_intra && s->h263_aic) { >+ h263_pred_acdc(s, block, n); >+ i = 63; > } > s->block_last_index[n] = i; > return 0;
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 119014
: 83898 |
83901
|
83902