X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Frangecoder.c;h=af0a8c009eee9dc613b53c81c9c8a68d24a90075;hb=0652e024c680420d298cdf3719d0a0c030173fe3;hp=ba3022c45c315ecd0fd8d82b1925107702c34986;hpb=88730be65153f4a59916d971842fdaed3e0fd72b;p=ffmpeg diff --git a/libavcodec/rangecoder.c b/libavcodec/rangecoder.c index ba3022c45c3..af0a8c009ee 100644 --- a/libavcodec/rangecoder.c +++ b/libavcodec/rangecoder.c @@ -2,24 +2,25 @@ * Range coder * Copyright (c) 2004 Michael Niedermayer * - * This library is free software; you can redistribute it and/or + * This file is part of Libav. + * + * Libav is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. + * version 2.1 of the License, or (at your option) any later version. * - * This library is distributed in the hope that it will be useful, + * Libav is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * + * License along with Libav; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ - + /** - * @file rangecoder.c + * @file * Range coder. * based upon * "Range encoding: an algorithm for removing redundancy from a digitised @@ -32,147 +33,126 @@ #include +#include "libavutil/attributes.h" #include "avcodec.h" -#include "common.h" #include "rangecoder.h" - - -void ff_init_range_encoder(RangeCoder *c, uint8_t *buf, int buf_size){ - c->bytestream_start= - c->bytestream= buf; - c->bytestream_end= buf + buf_size; - - c->low= 0; - c->range= 0xFF00; - c->outstanding_count= 0; - c->outstanding_byte= -1; +#include "bytestream.h" + +av_cold void ff_init_range_encoder(RangeCoder *c, uint8_t *buf, int buf_size) +{ + c->bytestream_start = + c->bytestream = buf; + c->bytestream_end = buf + buf_size; + c->low = 0; + c->range = 0xFF00; + c->outstanding_count = 0; + c->outstanding_byte = -1; } -void ff_init_range_decoder(RangeCoder *c, const uint8_t *buf, int buf_size){ - ff_init_range_encoder(c, buf, buf_size); +av_cold void ff_init_range_decoder(RangeCoder *c, const uint8_t *buf, + int buf_size) +{ + /* cast to avoid compiler warning */ + ff_init_range_encoder(c, (uint8_t *)buf, buf_size); - c->low =(*c->bytestream++)<<8; - c->low+= *c->bytestream++; + c->low = bytestream_get_be16(&c->bytestream); } -void ff_build_rac_states(RangeCoder *c, int factor, int max_p){ - const int64_t one= 1LL<<32; +void ff_build_rac_states(RangeCoder *c, int factor, int max_p) +{ + const int64_t one = 1LL << 32; int64_t p; int last_p8, p8, i; memset(c->zero_state, 0, sizeof(c->zero_state)); - memset(c-> one_state, 0, sizeof(c-> one_state)); - -#if 0 - for(i=1; i<256; i++){ - if(c->one_state[i]) - continue; - - p= (i*one + 128) >> 8; - last_p8= i; - for(;;){ - p+= ((one-p)*factor + one/2) >> 32; - p8= (256*p + one/2) >> 32; //FIXME try without the one - if(p8 <= last_p8) p8= last_p8+1; - if(p8 > max_p) p8= max_p; - if(p8 < last_p8) - break; - c->one_state[last_p8]= p8; - if(p8 == last_p8) - break; - last_p8= p8; - } - } -#endif -#if 1 - last_p8= 0; - p= one/2; - for(i=0; i<128; i++){ - p8= (256*p + one/2) >> 32; //FIXME try without the one - if(p8 <= last_p8) p8= last_p8+1; - if(last_p8 && last_p8<256 && p8<=max_p) - c->one_state[last_p8]= p8; - - p+= ((one-p)*factor + one/2) >> 32; - last_p8= p8; + memset(c->one_state, 0, sizeof(c->one_state)); + + last_p8 = 0; + p = one / 2; + for (i = 0; i < 128; i++) { + p8 = (256 * p + one / 2) >> 32; // FIXME: try without the one + if (p8 <= last_p8) + p8 = last_p8 + 1; + if (last_p8 && last_p8 < 256 && p8 <= max_p) + c->one_state[last_p8] = p8; + + p += ((one - p) * factor + one / 2) >> 32; + last_p8 = p8; } -#endif - for(i=256-max_p; i<=max_p; i++){ - if(c->one_state[i]) + + for (i = 256 - max_p; i <= max_p; i++) { + if (c->one_state[i]) continue; - p= (i*one + 128) >> 8; - p+= ((one-p)*factor + one/2) >> 32; - p8= (256*p + one/2) >> 32; //FIXME try without the one - if(p8 <= i) p8= i+1; - if(p8 > max_p) p8= max_p; - c->one_state[ i]= p8; + p = (i * one + 128) >> 8; + p += ((one - p) * factor + one / 2) >> 32; + p8 = (256 * p + one / 2) >> 32; // FIXME: try without the one + if (p8 <= i) + p8 = i + 1; + if (p8 > max_p) + p8 = max_p; + c->one_state[i] = p8; } - - for(i=0; i<256; i++) - c->zero_state[i]= 256-c->one_state[256-i]; -#if 0 - for(i=0; i<256; i++) - av_log(NULL, AV_LOG_DEBUG, "%3d %3d\n", i, c->one_state[i]); -#endif + + for (i = 1; i < 255; i++) + c->zero_state[i] = 256 - c->one_state[256 - i]; } -/** - * - * @return the number of bytes written - */ -int ff_rac_terminate(RangeCoder *c){ - c->range=0xFF; - c->low +=0xFF; +/* Return the number of bytes written. */ +int ff_rac_terminate(RangeCoder *c) +{ + c->range = 0xFF; + c->low += 0xFF; renorm_encoder(c); - c->range=0xFF; + c->range = 0xFF; renorm_encoder(c); - assert(c->low == 0); + assert(c->low == 0); assert(c->range >= 0x100); return c->bytestream - c->bytestream_start; } -#if 0 //selftest +#ifdef TEST #define SIZE 10240 -int main(){ + +#include "libavutil/lfg.h" +#include "libavutil/log.h" + +int main(void) +{ RangeCoder c; - uint8_t b[9*SIZE]; - uint8_t r[9*SIZE]; + uint8_t b[9 * SIZE]; + uint8_t r[9 * SIZE]; int i; - uint8_t state[10]= {0}; - + uint8_t state[10]; + AVLFG prng; + + av_lfg_init(&prng, 1); + ff_init_range_encoder(&c, b, SIZE); - ff_build_rac_states(&c, 0.05*(1LL<<32), 128+64+32+16); - + ff_build_rac_states(&c, 0.05 * (1LL << 32), 128 + 64 + 32 + 16); + memset(state, 128, sizeof(state)); - for(i=0; i