Mercurial > libavcodec.hg
changeset 2609:0f74a379a890 libavcodec
store the number of runs to avoid storing the last run value
about 10% lower bitrate for -qscale 32 (forman & some music video)
worst case bitrate increase <0.1% (lossless or low qscale)
and now the bad news, even though this just adds a single subtraction and an if() into the medium sized unpack_coeffs() loop and the if() will only be false once per unpac_coeff() call, gcc produces 50% slower code, i didnt look at the generated asm yet, not sure if i want to ...
author | michael |
---|---|
date | Fri, 15 Apr 2005 13:24:30 +0000 |
parents | 4fb7fa34050b |
children | f794026f4551 |
files | snow.c |
diffstat | 1 files changed, 14 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- a/snow.c Fri Apr 15 05:54:47 2005 +0000 +++ b/snow.c Fri Apr 15 13:24:30 2005 +0000 @@ -1657,6 +1657,7 @@ int run=0; int runs[w*h]; int run_index=0; + int max_index; for(y=0; y<h; y++){ for(x=0; x<w; x++){ @@ -1696,11 +1697,14 @@ } } } + max_index= run_index; runs[run_index++]= run; run_index=0; run= runs[run_index++]; - put_symbol2(&s->c, b->state[1], run, 3); + put_symbol2(&s->c, b->state[30], max_index, 0); + if(run_index <= max_index) + put_symbol2(&s->c, b->state[1], run, 3); for(y=0; y<h; y++){ if(s->c.bytestream_end - s->c.bytestream < w*40){ @@ -1742,7 +1746,8 @@ if(!run){ run= runs[run_index++]; - put_symbol2(&s->c, b->state[1], run, 3); + if(run_index <= max_index) + put_symbol2(&s->c, b->state[1], run, 3); assert(v); }else{ run--; @@ -1776,14 +1781,17 @@ int x,y; if(1){ - int run; + int run, runs; x_and_coeff *xc= b->x_coeff; x_and_coeff *prev_xc= NULL; x_and_coeff *prev2_xc= xc; x_and_coeff *parent_xc= parent ? parent->x_coeff : NULL; x_and_coeff *prev_parent_xc= parent_xc; - run= get_symbol2(&s->c, b->state[1], 3); + runs= get_symbol2(&s->c, b->state[30], 0); + if(runs-- > 0) run= get_symbol2(&s->c, b->state[1], 3); + else run= INT_MAX; + for(y=0; y<h; y++){ int v=0; int lt=0, t=0, rt=0; @@ -1826,7 +1834,8 @@ } }else{ if(!run){ - run= get_symbol2(&s->c, b->state[1], 3); + if(runs-- > 0) run= get_symbol2(&s->c, b->state[1], 3); + else run= INT_MAX; v= 2*(get_symbol2(&s->c, b->state[0 + 2], 0-4) + 1); v+=get_rac(&s->c, &b->state[0][16 + 1 + 3]);