Mercurial > libavcodec.hg
changeset 3140:d6e057513aa8 libavcodec
fixing dv_guess_qnos()
roman, dont hesitate to reverse this and solve it differntly if you want ...
author | michael |
---|---|
date | Thu, 23 Feb 2006 08:56:53 +0000 |
parents | e58fb7ffbb4f |
children | 25493c849d70 |
files | dv.c |
diffstat | 1 files changed, 28 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/dv.c Thu Feb 23 00:16:45 2006 +0000 +++ b/dv.c Thu Feb 23 08:56:53 2006 +0000 @@ -728,7 +728,7 @@ static inline void dv_guess_qnos(EncBlockInfo* blks, int* qnos) { int size[5]; - int i, j, k, a, prev; + int i, j, k, a, prev, a2; EncBlockInfo* b; do { @@ -751,6 +751,13 @@ b->bit_size[a] += dv_rl2vlc_size(k - prev - 1, b->mb[k]); prev= k; } else { + if(b->next[k] >= mb_area_start[a+1] && b->next[k]<64){ + for(a2=a+1; b->next[k] >= mb_area_start[a2+1]; a2++); + assert(a2<4); + assert(b->mb[b->next[k]]); + b->bit_size[a2] += dv_rl2vlc_size(b->next[k] - prev - 1, b->mb[b->next[k]]) + -dv_rl2vlc_size(b->next[k] - k - 1, b->mb[b->next[k]]); + } b->next[prev] = b->next[k]; } } @@ -760,8 +767,26 @@ } } } - } while ((vs_total_ac_bits < size[0] + size[1] + size[2] + size[3] + size[4]) && - (qnos[0]|qnos[1]|qnos[2]|qnos[3]|qnos[4])); + if(vs_total_ac_bits >= size[0] + size[1] + size[2] + size[3] + size[4]) + return; + } while (qnos[0]|qnos[1]|qnos[2]|qnos[3]|qnos[4]); + + + for(a=2; a==2 || vs_total_ac_bits < size[0]; a+=a){ + b = blks; + size[0] = 0; + for (j=0; j<6*5; j++, b++) { + prev= b->prev[0]; + for (k= b->next[prev]; k<64; k= b->next[k]) { + if(b->mb[k] < a && b->mb[k] > -a){ + b->next[prev] = b->next[k]; + }else{ + size[0] += dv_rl2vlc_size(k - prev - 1, b->mb[k]); + prev= k; + } + } + } + } } /*