2 * ELS (Entropy Logarithmic-Scale) decoder
4 * Copyright (c) 2013 Maxim Poliakovski
6 * This file is part of FFmpeg.
8 * FFmpeg is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
13 * FFmpeg is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with FFmpeg; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
25 * Entropy Logarithmic-Scale binary arithmetic decoder
32 #include "libavutil/error.h"
33 #include "libavutil/intreadwrite.h"
34 #include "libavutil/macros.h"
35 #include "libavutil/mem.h"
39 /* ELS coder constants and structures. */
40 #define ELS_JOTS_PER_BYTE 36
41 #define ELS_MAX (1 << 24)
42 #define RUNG_SPACE (64 * sizeof(ElsRungNode))
44 /* ELS coder tables. */
45 static const struct Ladder
{
93 { -2, -13, 152, 164 },
131 { -1, -30, 78, 100 },
133 { -1, -29, 80, 102 },
135 { -1, -29, 82, 104 },
137 { -1, -28, 84, 104 },
139 { -1, -28, 86, 108 },
141 { -1, -27, 88, 108 },
143 { -1, -27, 90, 112 },
145 { -1, -26, 92, 112 },
147 { -1, -26, 94, 114 },
149 { -1, -25, 96, 116 },
150 { -1, -20, 101, 83 },
151 { -1, -25, 98, 118 },
152 { -1, -21, 103, 83 },
153 { -1, -24, 100, 120 },
154 { -1, -21, 105, 85 },
155 { -1, -24, 102, 122 },
156 { -1, -22, 107, 87 },
157 { -1, -23, 104, 124 },
158 { -1, -22, 109, 89 },
159 { -1, -23, 106, 126 },
160 { -1, -22, 111, 91 },
161 { -1, -22, 108, 128 },
162 { -1, -23, 113, 93 },
163 { -1, -22, 110, 130 },
164 { -1, -23, 115, 95 },
165 { -1, -22, 112, 132 },
166 { -1, -24, 117, 97 },
167 { -1, -21, 114, 134 },
168 { -1, -24, 119, 99 },
169 { -1, -21, 116, 136 },
170 { -1, -25, 121, 101 },
171 { -1, -20, 118, 136 },
172 { -1, -25, 123, 103 },
173 { -1, -20, 120, 138 },
174 { -1, -26, 125, 105 },
175 { -1, -20, 122, 140 },
176 { -1, -26, 127, 107 },
177 { -1, -19, 124, 142 },
178 { -1, -27, 129, 107 },
179 { -1, -19, 126, 144 },
180 { -1, -27, 131, 111 },
181 { -1, -18, 128, 146 },
182 { -1, -28, 133, 111 },
183 { -1, -18, 130, 146 },
184 { -1, -28, 135, 115 },
185 { -1, -18, 132, 148 },
186 { -1, -29, 137, 115 },
187 { -1, -17, 134, 150 },
188 { -1, -29, 139, 117 },
189 { -1, -17, 136, 152 },
190 { -1, -30, 141, 119 },
191 { -1, -16, 138, 152 },
192 { -1, -31, 143, 121 },
193 { -1, -16, 140, 154 },
194 { -1, -31, 145, 123 },
195 { -1, -15, 142, 156 },
196 { -1, -32, 147, 125 },
197 { -1, -15, 144, 158 },
198 { -1, -33, 149, 127 },
199 { -1, -15, 146, 158 },
200 { -1, -34, 151, 129 },
201 { -1, -14, 148, 160 },
202 { -1, -35, 153, 131 },
203 { -1, -14, 150, 160 },
204 { -1, -36, 155, 133 },
205 { -2, -13, 152, 162 },
206 { -1, -37, 157, 135 },
207 { -2, -12, 154, 164 },
208 { -1, -39, 159, 137 },
209 { -2, -12, 156, 164 },
210 { -1, -41, 161, 139 },
211 { -2, -11, 158, 166 },
212 { -1, -43, 163, 141 },
213 { -2, -10, 160, 166 },
214 { -1, -46, 165, 143 },
215 { -3, -9, 162, 168 },
216 { -1, -51, 167, 143 },
217 { -3, -8, 164, 170 },
218 { -1, -61, 169, 145 },
219 { -4, -7, 166, 170 },
220 { -1, -72, 169, 145 },
222 { 0, -108, 171, 171 },
223 { 0, -108, 172, 172 },
224 { -6, -5, 173, 173 },
227 static const uint32_t els_exp_tab
[ELS_JOTS_PER_BYTE
* 4 + 1] = {
228 0, 0, 0, 0, 0, 0, 0, 0,
229 0, 0, 0, 0, 0, 0, 0, 0,
230 0, 0, 0, 0, 0, 0, 0, 0,
231 0, 0, 0, 0, 0, 0, 0, 0,
232 0, 0, 0, 0, 1, 1, 1, 1,
233 1, 2, 2, 2, 3, 4, 4, 5,
234 6, 7, 8, 10, 11, 13, 16, 18,
235 21, 25, 29, 34, 40, 47, 54, 64,
236 74, 87, 101, 118, 138, 161, 188, 219,
237 256, 298, 348, 406, 474, 552, 645, 752,
238 877, 1024, 1194, 1393, 1625, 1896, 2211, 2580,
239 3010, 3511, 4096, 4778, 5573, 6501, 7584, 8847,
240 10321, 12040, 14045, 16384, 19112, 22295, 26007, 30339,
241 35391, 41285, 48160, 56180, 65536, 76288, 89088, 103936,
242 121344, 141312, 165120, 192512, 224512, 262144, 305664, 356608,
243 416000, 485376, 566016, 660480, 770560, 898816, 1048576, 1223168,
244 1426688, 1664256, 1941504, 2264832, 2642176, 3082240, 3595520, 4194304,
245 4892672, 5707520, 6657792, 7766784, 9060096, 10568960, 12328960, 14382080,
249 void ff_els_decoder_init(ElsDecCtx
*ctx
, const uint8_t *in
, size_t data_size
)
253 /* consume up to 3 bytes from the input data */
254 if (data_size
>= 3) {
255 ctx
->x
= AV_RB24(in
);
257 } else if (data_size
== 2) {
258 ctx
->x
= AV_RB16(in
);
265 ctx
->in_buf
= in
+ nbytes
;
266 ctx
->data_size
= data_size
- nbytes
;
268 ctx
->j
= ELS_JOTS_PER_BYTE
;
270 ctx
->diff
= FFMIN(ELS_MAX
- ctx
->x
,
271 ELS_MAX
- els_exp_tab
[ELS_JOTS_PER_BYTE
* 4 - 1]);
274 void ff_els_decoder_uninit(ElsUnsignedRung
*rung
)
276 av_freep(&rung
->rem_rung_list
);
279 static int els_import_byte(ElsDecCtx
*ctx
)
281 if (!ctx
->data_size
) {
282 ctx
->err
= AVERROR_EOF
;
285 ctx
->x
= (ctx
->x
<< 8) | *ctx
->in_buf
++;
287 ctx
->j
+= ELS_JOTS_PER_BYTE
;
293 int ff_els_decode_bit(ElsDecCtx
*ctx
, uint8_t *rung
)
296 const uint32_t *pAllowable
= &els_exp_tab
[ELS_JOTS_PER_BYTE
* 3];
301 z
= pAllowable
[ctx
->j
+ Ladder
[*rung
].ALps
];
305 return *rung
& 1; /* shortcut for x < t > pAllowable[j - 1] */
307 if (ctx
->t
> ctx
->x
) { /* decode most probable symbol (MPS) */
308 ctx
->j
+= Ladder
[*rung
].AMps
;
309 while (ctx
->t
> pAllowable
[ctx
->j
])
312 if (ctx
->j
<= 0) { /* MPS: import one byte from bytestream. */
313 ret
= els_import_byte(ctx
);
320 *rung
= Ladder
[*rung
].next0
;
321 } else { /* decode less probable symbol (LPS) */
325 ctx
->j
+= Ladder
[*rung
].ALps
;
327 /* LPS: import one byte from bytestream. */
329 ret
= els_import_byte(ctx
);
333 /* LPS: import second byte from bytestream. */
335 ret
= els_import_byte(ctx
);
338 while (pAllowable
[ctx
->j
- 1] >= z
)
344 *rung
= Ladder
[*rung
].next1
;
347 ctx
->diff
= FFMIN(z
- ctx
->x
, z
- pAllowable
[ctx
->j
- 1]);
352 unsigned ff_els_decode_unsigned(ElsDecCtx
*ctx
, ElsUnsignedRung
*ur
)
355 ElsRungNode
*rung_node
;
360 /* decode unary prefix */
361 for (n
= 0; n
< ELS_EXPGOLOMB_LEN
+ 1; n
++)
362 if (ff_els_decode_bit(ctx
, &ur
->prefix_rung
[n
]))
365 /* handle the error/overflow case */
366 if (ctx
->err
|| n
>= ELS_EXPGOLOMB_LEN
) {
367 ctx
->err
= AVERROR_INVALIDDATA
;
371 /* handle the zero case */
375 /* initialize probability tree */
376 if (!ur
->rem_rung_list
) {
377 ur
->rem_rung_list
= av_realloc(NULL
, RUNG_SPACE
);
378 if (!ur
->rem_rung_list
) {
379 ctx
->err
= AVERROR(ENOMEM
);
382 memset(ur
->rem_rung_list
, 0, RUNG_SPACE
);
383 ur
->rung_list_size
= RUNG_SPACE
;
384 ur
->avail_index
= ELS_EXPGOLOMB_LEN
;
387 /* decode the remainder */
388 for (i
= 0, r
= 0, bit
= 0; i
< n
; i
++) {
390 rung_node
= &ur
->rem_rung_list
[n
];
392 if (!rung_node
->next_index
) {
393 if (ur
->rung_list_size
<= (ur
->avail_index
+ 2) * sizeof(ElsRungNode
)) {
394 // remember rung_node position
395 ptrdiff_t pos
= rung_node
- ur
->rem_rung_list
;
396 ctx
->err
= av_reallocp(&ur
->rem_rung_list
,
402 memset((uint8_t *) ur
->rem_rung_list
+ ur
->rung_list_size
, 0,
404 ur
->rung_list_size
+= RUNG_SPACE
;
405 // restore rung_node position in the new list
406 rung_node
= &ur
->rem_rung_list
[pos
];
408 rung_node
->next_index
= ur
->avail_index
;
409 ur
->avail_index
+= 2;
411 rung_node
= &ur
->rem_rung_list
[rung_node
->next_index
+ bit
];
414 bit
= ff_els_decode_bit(ctx
, &rung_node
->rung
);
421 return (1 << n
) - 1 + r
; /* make value from exp golomb code */