FFmpeg
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
rangecoder.h
Go to the documentation of this file.
1 /*
2  * Range coder
3  * Copyright (c) 2004 Michael Niedermayer <michaelni@gmx.at>
4  *
5  * This file is part of FFmpeg.
6  *
7  * FFmpeg is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * FFmpeg is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with FFmpeg; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21 
22 /**
23  * @file
24  * Range coder.
25  */
26 
27 #ifndef AVCODEC_RANGECODER_H
28 #define AVCODEC_RANGECODER_H
29 
30 #include <stdint.h>
31 
32 #include "libavutil/common.h"
33 #include "libavutil/avassert.h"
34 
35 typedef struct RangeCoder {
36  int low;
37  int range;
45  int overread;
46 #define MAX_OVERREAD 2
47 } RangeCoder;
48 
49 void ff_init_range_encoder(RangeCoder *c, uint8_t *buf, int buf_size);
50 void ff_init_range_decoder(RangeCoder *c, const uint8_t *buf, int buf_size);
52 void ff_build_rac_states(RangeCoder *c, int factor, int max_p);
53 
54 static inline void renorm_encoder(RangeCoder *c)
55 {
56  // FIXME: optimize
57  while (c->range < 0x100) {
58  if (c->outstanding_byte < 0) {
59  c->outstanding_byte = c->low >> 8;
60  } else if (c->low <= 0xFF00) {
61  *c->bytestream++ = c->outstanding_byte;
62  for (; c->outstanding_count; c->outstanding_count--)
63  *c->bytestream++ = 0xFF;
64  c->outstanding_byte = c->low >> 8;
65  } else if (c->low >= 0x10000) {
66  *c->bytestream++ = c->outstanding_byte + 1;
67  for (; c->outstanding_count; c->outstanding_count--)
68  *c->bytestream++ = 0x00;
69  c->outstanding_byte = (c->low >> 8) & 0xFF;
70  } else {
71  c->outstanding_count++;
72  }
73 
74  c->low = (c->low & 0xFF) << 8;
75  c->range <<= 8;
76  }
77 }
78 
79 static inline int get_rac_count(RangeCoder *c)
80 {
81  int x = c->bytestream - c->bytestream_start + c->outstanding_count;
82  if (c->outstanding_byte >= 0)
83  x++;
84  return 8 * x - av_log2(c->range);
85 }
86 
87 static inline void put_rac(RangeCoder *c, uint8_t *const state, int bit)
88 {
89  int range1 = (c->range * (*state)) >> 8;
90 
91  av_assert2(*state);
92  av_assert2(range1 < c->range);
93  av_assert2(range1 > 0);
94  if (!bit) {
95  c->range -= range1;
96  *state = c->zero_state[*state];
97  } else {
98  c->low += c->range - range1;
99  c->range = range1;
100  *state = c->one_state[*state];
101  }
102 
103  renorm_encoder(c);
104 }
105 
106 static inline void refill(RangeCoder *c)
107 {
108  if (c->range < 0x100) {
109  c->range <<= 8;
110  c->low <<= 8;
111  if (c->bytestream < c->bytestream_end) {
112  c->low += c->bytestream[0];
113  c->bytestream++;
114  } else
115  c->overread ++;
116  }
117 }
118 
119 static inline int get_rac(RangeCoder *c, uint8_t *const state)
120 {
121  int range1 = (c->range * (*state)) >> 8;
122 
123  c->range -= range1;
124  if (c->low < c->range) {
125  *state = c->zero_state[*state];
126  refill(c);
127  return 0;
128  } else {
129  c->low -= c->range;
130  *state = c->one_state[*state];
131  c->range = range1;
132  refill(c);
133  return 1;
134  }
135 }
136 
137 #endif /* AVCODEC_RANGECODER_H */
uint32_t low
Definition: mss3.c:64
uint8_t zero_state[256]
Definition: rangecoder.h:40
uint8_t * bytestream_end
Definition: rangecoder.h:44
int av_log2(unsigned v)
Definition: intmath.c:26
uint32_t range
Definition: mss3.c:64
uint8_t one_state[256]
Definition: rangecoder.h:41
uint8_t
static int get_rac(RangeCoder *c, uint8_t *const state)
Definition: rangecoder.h:119
#define av_assert2(cond)
assert() equivalent, that does lie in speed critical code.
Definition: avassert.h:64
void ff_init_range_encoder(RangeCoder *c, uint8_t *buf, int buf_size)
Definition: rangecoder.c:42
void ff_build_rac_states(RangeCoder *c, int factor, int max_p)
Definition: rangecoder.c:68
static void put_rac(RangeCoder *c, uint8_t *const state, int bit)
Definition: rangecoder.h:87
static void renorm_encoder(RangeCoder *c)
Definition: rangecoder.h:54
simple assert() macros that are a bit more flexible than ISO C assert().
uint8_t * bytestream
Definition: rangecoder.h:43
static struct @303 state
static void refill(RangeCoder *c)
Definition: rangecoder.h:106
void ff_init_range_decoder(RangeCoder *c, const uint8_t *buf, int buf_size)
Definition: rangecoder.c:53
int ff_rac_terminate(RangeCoder *c)
Definition: rangecoder.c:109
int outstanding_byte
Definition: rangecoder.h:39
void * buf
Definition: avisynth_c.h:690
static int get_rac_count(RangeCoder *c)
Definition: rangecoder.h:79
static const int factor[16]
Definition: vf_pp7.c:75
common internal and external API header
int overread
Definition: rangecoder.h:45
static double c[64]
int outstanding_count
Definition: rangecoder.h:38
uint8_t * bytestream_start
Definition: rangecoder.h:42