X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Frangecoder.c;h=af0a8c009eee9dc613b53c81c9c8a68d24a90075;hb=cab63a8b594cdc365bb2581a12b3ac8e6dd480b2;hp=4e15ce3096140dc51c40e4468034ed289faf95a6;hpb=2029f312e8c13b25d322d69961b42db2e66f616a;p=ffmpeg diff --git a/libavcodec/rangecoder.c b/libavcodec/rangecoder.c index 4e15ce30961..af0a8c009ee 100644 --- a/libavcodec/rangecoder.c +++ b/libavcodec/rangecoder.c @@ -2,26 +2,25 @@ * Range coder * Copyright (c) 2004 Michael Niedermayer * - * This file is part of FFmpeg. + * This file is part of Libav. * - * FFmpeg is free software; you can redistribute it and/or + * 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.1 of the License, or (at your option) any later version. * - * FFmpeg 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 FFmpeg; if not, write to the Free Software + * 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 @@ -34,119 +33,126 @@ #include +#include "libavutil/attributes.h" #include "avcodec.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){ +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); + 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)); - - 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; } - 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=1; i<255; i++) - c->zero_state[i]= 256-c->one_state[256-i]; + 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