rangecoder.c
上传用户:wstnjxml
上传日期:2014-04-03
资源大小:7248k
文件大小:4k
源码类别:

Windows CE

开发平台:

C/C++

  1. /*
  2.  * Range coder
  3.  * Copyright (c) 2004 Michael Niedermayer <michaelni@gmx.at>
  4.  *
  5.  * This library is free software; you can redistribute it and/or
  6.  * modify it under the terms of the GNU Lesser General Public
  7.  * License as published by the Free Software Foundation; either
  8.  * version 2 of the License, or (at your option) any later version.
  9.  *
  10.  * This library is distributed in the hope that it will be useful,
  11.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  13.  * Lesser General Public License for more details.
  14.  *
  15.  * You should have received a copy of the GNU Lesser General Public
  16.  * License along with this library; if not, write to the Free Software
  17.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  18.  *
  19.  */
  20.  
  21. /**
  22.  * @file rangecoder.c
  23.  * Range coder.
  24.  * based upon
  25.  *    "Range encoding: an algorithm for removing redundancy from a digitised
  26.  *                     message.
  27.  *     G. N. N. Martin                  Presented in March 1979 to the Video &
  28.  *                                      Data Recording Conference,
  29.  *     IBM UK Scientific Center         held in Southampton July 24-27 1979."
  30.  *
  31.  */
  32. #include <string.h>
  33. #include "avcodec.h"
  34. #include "common.h"
  35. #include "rangecoder.h"
  36. void ff_init_range_encoder(RangeCoder *c, uint8_t *buf, int buf_size){
  37.     c->bytestream_start= 
  38.     c->bytestream= buf;
  39.     c->bytestream_end= buf + buf_size;
  40.     c->low= 0;
  41.     c->range= 0xFF00;
  42.     c->outstanding_count= 0;
  43.     c->outstanding_byte= -1;
  44. }
  45. void ff_init_range_decoder(RangeCoder *c, const uint8_t *buf, int buf_size){
  46.     /* cast to avoid compiler warning */
  47.     ff_init_range_encoder(c, (uint8_t *) buf, buf_size);
  48.     c->low =(*c->bytestream++)<<8;
  49.     c->low+= *c->bytestream++;
  50. }
  51. void ff_build_rac_states(RangeCoder *c, int factor, int max_p){
  52.     const int64_t one= 1LL<<32;
  53.     int64_t p;
  54.     int last_p8, p8, i;
  55.     memset(c->zero_state, 0, sizeof(c->zero_state));
  56.     memset(c-> one_state, 0, sizeof(c-> one_state));
  57. #if 0
  58.     for(i=1; i<256; i++){
  59.         if(c->one_state[i]) 
  60.             continue;
  61.         
  62.         p= (i*one + 128) >> 8;
  63.         last_p8= i;
  64.         for(;;){
  65.             p+= ((one-p)*factor + one/2) >> 32;
  66.             p8= (256*p + one/2) >> 32; //FIXME try without the one
  67.             if(p8 <= last_p8) p8= last_p8+1;
  68.             if(p8 > max_p) p8= max_p;
  69.             if(p8 < last_p8)
  70.                 break;
  71.             c->one_state[last_p8]=     p8;
  72.             if(p8 == last_p8)
  73.                 break;
  74.             last_p8= p8;
  75.         }
  76.     }
  77. #endif
  78. #if 1
  79.     last_p8= 0;
  80.     p= one/2;
  81.     for(i=0; i<128; i++){
  82.         p8= (256*p + one/2) >> 32; //FIXME try without the one
  83.         if(p8 <= last_p8) p8= last_p8+1;
  84.         if(last_p8 && last_p8<256 && p8<=max_p)
  85.             c->one_state[last_p8]= p8;
  86.         
  87.         p+= ((one-p)*factor + one/2) >> 32;
  88.         last_p8= p8;
  89.     }
  90. #endif
  91.     for(i=256-max_p; i<=max_p; i++){
  92.         if(c->one_state[i]) 
  93.             continue;
  94.         p= (i*one + 128) >> 8;
  95.         p+= ((one-p)*factor + one/2) >> 32;
  96.         p8= (256*p + one/2) >> 32; //FIXME try without the one
  97.         if(p8 <= i) p8= i+1;
  98.         if(p8 > max_p) p8= max_p;
  99.         c->one_state[    i]=     p8;
  100.     }
  101.     
  102.     for(i=0; i<256; i++)
  103.         c->zero_state[i]= 256-c->one_state[256-i];
  104. #if 0
  105.     for(i=0; i<256; i++)
  106.         av_log(NULL, AV_LOG_DEBUG, "%3d %3dn", i, c->one_state[i]);
  107. #endif
  108. }
  109. /**
  110.  *
  111.  * @return the number of bytes written
  112.  */
  113. int ff_rac_terminate(RangeCoder *c){
  114.     c->range=0xFF;
  115.     c->low +=0xFF;
  116.     renorm_encoder(c);
  117.     c->range=0xFF;
  118.     renorm_encoder(c);
  119.     assert(c->low   == 0);
  120.     assert(c->range >= 0x100);
  121.     return c->bytestream - c->bytestream_start;
  122. }
  123. #if 0 //selftest
  124. #define SIZE 10240
  125. int main(){
  126.     RangeCoder c;
  127.     uint8_t b[9*SIZE];
  128.     uint8_t r[9*SIZE];
  129.     int i;
  130.     uint8_t state[10]= {0};
  131.     
  132.     ff_init_range_encoder(&c, b, SIZE);
  133.     ff_build_rac_states(&c, 0.05*(1LL<<32), 128+64+32+16);
  134.     
  135.     memset(state, 128, sizeof(state));
  136.     for(i=0; i<SIZE; i++){
  137.         r[i]= random()%7;
  138.     }
  139.     
  140.   
  141.     for(i=0; i<SIZE; i++){
  142. START_TIMER
  143.         put_rac(&c, state, r[i]&1);
  144. STOP_TIMER("put_rac")
  145.     }
  146.     ff_put_rac_terminate(&c);
  147.     
  148.     ff_init_range_decoder(&c, b, SIZE);
  149.     
  150.     memset(state, 128, sizeof(state));
  151.     
  152.     for(i=0; i<SIZE; i++){
  153. START_TIMER
  154.         if( (r[i]&1) != get_rac(&c, state) )
  155.             av_log(NULL, AV_LOG_DEBUG, "rac failure at %dn", i);
  156. STOP_TIMER("get_rac")
  157.     }
  158.     
  159.     return 0;
  160. }
  161. #endif