FFmpeg
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
Examples
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
libavcodec
cabac.c
Go to the documentation of this file.
1
/*
2
* H.26L/H.264/AVC/JVT/14496-10/... encoder/decoder
3
* Copyright (c) 2003 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
* Context Adaptive Binary Arithmetic Coder.
25
*/
26
27
#include <string.h>
28
29
#include "
libavutil/common.h
"
30
#include "
libavutil/timer.h
"
31
#include "
get_bits.h
"
32
#include "
cabac.h
"
33
#include "
cabac_functions.h
"
34
35
#include "
cabac_tablegen.h
"
36
37
/**
38
*
39
* @param buf_size size of buf in bits
40
*/
41
void
ff_init_cabac_encoder
(
CABACContext
*
c
,
uint8_t
*
buf
,
int
buf_size){
42
init_put_bits
(&c->
pb
, buf, buf_size);
43
44
c->
low
= 0;
45
c->
range
= 0x1FE;
46
c->
outstanding_count
= 0;
47
c->
pb
.
bit_left
++;
//avoids firstBitFlag
48
}
49
50
/**
51
*
52
* @param buf_size size of buf in bits
53
*/
54
void
ff_init_cabac_decoder
(
CABACContext
*
c
,
const
uint8_t
*
buf
,
int
buf_size){
55
c->
bytestream_start
=
56
c->
bytestream
=
buf
;
57
c->
bytestream_end
= buf + buf_size;
58
59
#if CABAC_BITS == 16
60
c->
low
= (*c->
bytestream
++)<<18;
61
c->
low
+= (*c->
bytestream
++)<<10;
62
#else
63
c->
low
= (*c->
bytestream
++)<<10;
64
#endif
65
c->
low
+= ((*c->
bytestream
++)<<2) + 2;
66
c->
range
= 0x1FE;
67
}
68
69
void
ff_init_cabac_states
(
void
)
70
{
71
static
int
initialized = 0;
72
73
if
(initialized)
74
return
;
75
76
cabac_tableinit
();
77
78
initialized = 1;
79
}
80
81
#ifdef TEST
82
#define SIZE 10240
83
84
#include "
libavutil/lfg.h
"
85
#include "avcodec.h"
86
87
static
inline
void
put_cabac_bit(
CABACContext
*
c
,
int
b
){
88
put_bits
(&c->
pb
, 1, b);
89
for
(;c->
outstanding_count
; c->
outstanding_count
--){
90
put_bits
(&c->
pb
, 1, 1-b);
91
}
92
}
93
94
static
inline
void
renorm_cabac_encoder(
CABACContext
*c){
95
while
(c->
range
< 0x100){
96
//FIXME optimize
97
if
(c->
low
<0x100){
98
put_cabac_bit(c, 0);
99
}
else
if
(c->
low
<0x200){
100
c->
outstanding_count
++;
101
c->
low
-= 0x100;
102
}
else
{
103
put_cabac_bit(c, 1);
104
c->
low
-= 0x200;
105
}
106
107
c->
range
+= c->
range
;
108
c->
low
+= c->
low
;
109
}
110
}
111
112
static
void
put_cabac(
CABACContext
*c,
uint8_t
*
const
state
,
int
bit){
113
int
RangeLPS=
ff_h264_lps_range
[2*(c->
range
&0xC0) + *state];
114
115
if
(bit == ((*state)&1)){
116
c->
range
-= RangeLPS;
117
*state =
ff_h264_mlps_state
[128 + *
state
];
118
}
else
{
119
c->
low
+= c->
range
- RangeLPS;
120
c->
range
= RangeLPS;
121
*state=
ff_h264_mlps_state
[127 - *
state
];
122
}
123
124
renorm_cabac_encoder(c);
125
}
126
127
/**
128
* @param bit 0 -> write zero bit, !=0 write one bit
129
*/
130
static
void
put_cabac_bypass(
CABACContext
*c,
int
bit){
131
c->
low
+= c->
low
;
132
133
if
(bit){
134
c->
low
+= c->
range
;
135
}
136
//FIXME optimize
137
if
(c->
low
<0x200){
138
put_cabac_bit(c, 0);
139
}
else
if
(c->
low
<0x400){
140
c->
outstanding_count
++;
141
c->
low
-= 0x200;
142
}
else
{
143
put_cabac_bit(c, 1);
144
c->
low
-= 0x400;
145
}
146
}
147
148
/**
149
*
150
* @return the number of bytes written
151
*/
152
static
int
put_cabac_terminate(
CABACContext
*c,
int
bit){
153
c->
range
-= 2;
154
155
if
(!bit){
156
renorm_cabac_encoder(c);
157
}
else
{
158
c->
low
+= c->
range
;
159
c->
range
= 2;
160
161
renorm_cabac_encoder(c);
162
163
av_assert0
(c->
low
<= 0x1FF);
164
put_cabac_bit(c, c->
low
>>9);
165
put_bits
(&c->
pb
, 2, ((c->
low
>>7)&3)|1);
166
167
flush_put_bits
(&c->
pb
);
//FIXME FIXME FIXME XXX wrong
168
}
169
170
return
(
put_bits_count
(&c->
pb
)+7)>>3;
171
}
172
173
int
main
(
void
){
174
CABACContext
c
;
175
uint8_t
b[9*
SIZE
];
176
uint8_t
r
[9*
SIZE
];
177
int
i;
178
uint8_t
state[10]= {0};
179
AVLFG
prng;
180
181
av_lfg_init
(&prng, 1);
182
ff_init_cabac_encoder
(&c, b,
SIZE
);
183
ff_init_cabac_states
();
184
185
for
(i=0; i<
SIZE
; i++){
186
if
(2*i<SIZE) r[i] =
av_lfg_get
(&prng) % 7;
187
else
r[i] = (i>>8)&1;
188
}
189
190
for
(i=0; i<
SIZE
; i++){
191
START_TIMER
192
put_cabac_bypass(&c, r[i]&1);
193
STOP_TIMER
(
"put_cabac_bypass"
)
194
}
195
196
for
(i=0; i<
SIZE
; i++){
197
START_TIMER
198
put_cabac(&c, state, r[i]&1);
199
STOP_TIMER
(
"put_cabac"
)
200
}
201
202
put_cabac_terminate(&c, 1);
203
204
ff_init_cabac_decoder
(&c, b, SIZE);
205
206
memset(state, 0,
sizeof
(state));
207
208
for
(i=0; i<
SIZE
; i++){
209
START_TIMER
210
if
( (r[i]&1) !=
get_cabac_bypass
(&c) )
211
av_log
(NULL,
AV_LOG_ERROR
,
"CABAC bypass failure at %d\n"
, i);
212
STOP_TIMER
(
"get_cabac_bypass"
)
213
}
214
215
for
(i=0; i<
SIZE
; i++){
216
START_TIMER
217
if
( (r[i]&1) !=
get_cabac_noinline
(&c, state) )
218
av_log
(NULL,
AV_LOG_ERROR
,
"CABAC failure at %d\n"
, i);
219
STOP_TIMER
(
"get_cabac"
)
220
}
221
if
(!
get_cabac_terminate
(&c))
222
av_log
(NULL,
AV_LOG_ERROR
,
"where's the Terminator?\n"
);
223
224
return
0;
225
}
226
227
#endif
/* TEST */
Generated on Sun Sep 14 2014 18:55:53 for FFmpeg by
1.8.2