xref: /third_party/ffmpeg/libavcodec/elsdec.c (revision cabdff1a)
1cabdff1aSopenharmony_ci/*
2cabdff1aSopenharmony_ci * ELS (Entropy Logarithmic-Scale) decoder
3cabdff1aSopenharmony_ci *
4cabdff1aSopenharmony_ci * Copyright (c) 2013 Maxim Poliakovski
5cabdff1aSopenharmony_ci *
6cabdff1aSopenharmony_ci * This file is part of FFmpeg.
7cabdff1aSopenharmony_ci *
8cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or
9cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public
10cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either
11cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version.
12cabdff1aSopenharmony_ci *
13cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful,
14cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of
15cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16cabdff1aSopenharmony_ci * Lesser General Public License for more details.
17cabdff1aSopenharmony_ci *
18cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public
19cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software
20cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21cabdff1aSopenharmony_ci */
22cabdff1aSopenharmony_ci
23cabdff1aSopenharmony_ci/**
24cabdff1aSopenharmony_ci * @file
25cabdff1aSopenharmony_ci * Entropy Logarithmic-Scale binary arithmetic decoder
26cabdff1aSopenharmony_ci */
27cabdff1aSopenharmony_ci
28cabdff1aSopenharmony_ci#include <stddef.h>
29cabdff1aSopenharmony_ci#include <stdint.h>
30cabdff1aSopenharmony_ci#include <string.h>
31cabdff1aSopenharmony_ci
32cabdff1aSopenharmony_ci#include "libavutil/error.h"
33cabdff1aSopenharmony_ci#include "libavutil/intreadwrite.h"
34cabdff1aSopenharmony_ci#include "libavutil/macros.h"
35cabdff1aSopenharmony_ci#include "libavutil/mem.h"
36cabdff1aSopenharmony_ci
37cabdff1aSopenharmony_ci#include "elsdec.h"
38cabdff1aSopenharmony_ci
39cabdff1aSopenharmony_ci/* ELS coder constants and structures. */
40cabdff1aSopenharmony_ci#define ELS_JOTS_PER_BYTE   36
41cabdff1aSopenharmony_ci#define ELS_MAX             (1 << 24)
42cabdff1aSopenharmony_ci#define RUNG_SPACE          (64 * sizeof(ElsRungNode))
43cabdff1aSopenharmony_ci
44cabdff1aSopenharmony_ci/* ELS coder tables. */
45cabdff1aSopenharmony_cistatic const struct Ladder {
46cabdff1aSopenharmony_ci    int8_t  AMps;
47cabdff1aSopenharmony_ci    int8_t  ALps;
48cabdff1aSopenharmony_ci    uint8_t next0;
49cabdff1aSopenharmony_ci    uint8_t next1;
50cabdff1aSopenharmony_ci} Ladder[174] = {
51cabdff1aSopenharmony_ci    { -6,   -5,   2,   1 },
52cabdff1aSopenharmony_ci    { -2,  -12,   3,   6 },
53cabdff1aSopenharmony_ci    { -2,  -12,   4,   6 },
54cabdff1aSopenharmony_ci    { -1,  -16,   7,   5 },
55cabdff1aSopenharmony_ci    { -1,  -16,   8,  10 },
56cabdff1aSopenharmony_ci    { -5,   -6,  11,   9 },
57cabdff1aSopenharmony_ci    { -6,   -5,  10,   5 },
58cabdff1aSopenharmony_ci    { -1,  -18,  13,  11 },
59cabdff1aSopenharmony_ci    { -1,  -18,  12,  14 },
60cabdff1aSopenharmony_ci    { -6,   -5,  15,  18 },
61cabdff1aSopenharmony_ci    { -5,   -6,  14,   9 },
62cabdff1aSopenharmony_ci    { -3,   -8,  17,  15 },
63cabdff1aSopenharmony_ci    { -1,  -20,  20,  16 },
64cabdff1aSopenharmony_ci    { -1,  -20,  23,  17 },
65cabdff1aSopenharmony_ci    { -3,   -8,  16,  18 },
66cabdff1aSopenharmony_ci    { -5,   -6,  19,  26 },
67cabdff1aSopenharmony_ci    { -3,   -9,  22,  24 },
68cabdff1aSopenharmony_ci    { -3,   -9,  21,  19 },
69cabdff1aSopenharmony_ci    { -5,   -6,  24,  26 },
70cabdff1aSopenharmony_ci    { -4,   -7,  27,  25 },
71cabdff1aSopenharmony_ci    { -1,  -22,  34,  28 },
72cabdff1aSopenharmony_ci    { -2,  -11,  29,  27 },
73cabdff1aSopenharmony_ci    { -2,  -11,  28,  30 },
74cabdff1aSopenharmony_ci    { -1,  -22,  39,  29 },
75cabdff1aSopenharmony_ci    { -4,   -7,  30,  32 },
76cabdff1aSopenharmony_ci    { -6,   -5,  33,  31 },
77cabdff1aSopenharmony_ci    { -6,   -5,  32,  25 },
78cabdff1aSopenharmony_ci    { -3,   -8,  35,  33 },
79cabdff1aSopenharmony_ci    { -2,  -12,  36,  38 },
80cabdff1aSopenharmony_ci    { -2,  -12,  37,  35 },
81cabdff1aSopenharmony_ci    { -3,   -8,  38,  40 },
82cabdff1aSopenharmony_ci    { -6,   -5,  41,  48 },
83cabdff1aSopenharmony_ci    { -6,   -5,  40,  31 },
84cabdff1aSopenharmony_ci    { -5,   -6,  43,  41 },
85cabdff1aSopenharmony_ci    { -1,  -24,  94,  42 },
86cabdff1aSopenharmony_ci    { -3,   -8,  45,  43 },
87cabdff1aSopenharmony_ci    { -2,  -12,  42,  44 },
88cabdff1aSopenharmony_ci    { -2,  -12,  47,  45 },
89cabdff1aSopenharmony_ci    { -3,   -8,  44,  46 },
90cabdff1aSopenharmony_ci    { -1,  -24, 125,  47 },
91cabdff1aSopenharmony_ci    { -5,   -6,  46,  48 },
92cabdff1aSopenharmony_ci    { -6,   -5,  49,  49 },
93cabdff1aSopenharmony_ci    { -2,  -13, 152, 164 },
94cabdff1aSopenharmony_ci    { -4,   -7,  51,  49 },
95cabdff1aSopenharmony_ci    { -3,   -9, 164, 168 },
96cabdff1aSopenharmony_ci    { -3,   -9,  55,  51 },
97cabdff1aSopenharmony_ci    { -4,   -7, 168, 170 },
98cabdff1aSopenharmony_ci    { -2,  -13,  67,  55 },
99cabdff1aSopenharmony_ci    { -6,   -5, 170,  49 },
100cabdff1aSopenharmony_ci    { -6,   -5,  51, 170 },
101cabdff1aSopenharmony_ci    { -1,  -72,  50,  74 },
102cabdff1aSopenharmony_ci    { -4,   -7,  53,  49 },
103cabdff1aSopenharmony_ci    { -1,  -61,  50,  74 },
104cabdff1aSopenharmony_ci    { -3,   -8,  55,  49 },
105cabdff1aSopenharmony_ci    { -1,  -51,  52,  76 },
106cabdff1aSopenharmony_ci    { -3,   -9,  57,  51 },
107cabdff1aSopenharmony_ci    { -1,  -46,  54,  76 },
108cabdff1aSopenharmony_ci    { -2,  -10,  59,  53 },
109cabdff1aSopenharmony_ci    { -1,  -43,  56,  78 },
110cabdff1aSopenharmony_ci    { -2,  -11,  61,  53 },
111cabdff1aSopenharmony_ci    { -1,  -41,  58,  80 },
112cabdff1aSopenharmony_ci    { -2,  -12,  63,  55 },
113cabdff1aSopenharmony_ci    { -1,  -39,  60,  82 },
114cabdff1aSopenharmony_ci    { -2,  -12,  65,  55 },
115cabdff1aSopenharmony_ci    { -1,  -37,  62,  84 },
116cabdff1aSopenharmony_ci    { -2,  -13,  67,  57 },
117cabdff1aSopenharmony_ci    { -1,  -36,  64,  86 },
118cabdff1aSopenharmony_ci    { -1,  -14,  69,  59 },
119cabdff1aSopenharmony_ci    { -1,  -35,  66,  88 },
120cabdff1aSopenharmony_ci    { -1,  -14,  71,  59 },
121cabdff1aSopenharmony_ci    { -1,  -34,  68,  90 },
122cabdff1aSopenharmony_ci    { -1,  -15,  73,  61 },
123cabdff1aSopenharmony_ci    { -1,  -33,  70,  92 },
124cabdff1aSopenharmony_ci    { -1,  -15,  75,  61 },
125cabdff1aSopenharmony_ci    { -1,  -32,  72,  94 },
126cabdff1aSopenharmony_ci    { -1,  -15,  77,  63 },
127cabdff1aSopenharmony_ci    { -1,  -31,  74,  96 },
128cabdff1aSopenharmony_ci    { -1,  -16,  79,  65 },
129cabdff1aSopenharmony_ci    { -1,  -31,  76,  98 },
130cabdff1aSopenharmony_ci    { -1,  -16,  81,  67 },
131cabdff1aSopenharmony_ci    { -1,  -30,  78, 100 },
132cabdff1aSopenharmony_ci    { -1,  -17,  83,  67 },
133cabdff1aSopenharmony_ci    { -1,  -29,  80, 102 },
134cabdff1aSopenharmony_ci    { -1,  -17,  85,  69 },
135cabdff1aSopenharmony_ci    { -1,  -29,  82, 104 },
136cabdff1aSopenharmony_ci    { -1,  -18,  87,  71 },
137cabdff1aSopenharmony_ci    { -1,  -28,  84, 104 },
138cabdff1aSopenharmony_ci    { -1,  -18,  89,  73 },
139cabdff1aSopenharmony_ci    { -1,  -28,  86, 108 },
140cabdff1aSopenharmony_ci    { -1,  -18,  91,  73 },
141cabdff1aSopenharmony_ci    { -1,  -27,  88, 108 },
142cabdff1aSopenharmony_ci    { -1,  -19,  93,  75 },
143cabdff1aSopenharmony_ci    { -1,  -27,  90, 112 },
144cabdff1aSopenharmony_ci    { -1,  -19,  95,  77 },
145cabdff1aSopenharmony_ci    { -1,  -26,  92, 112 },
146cabdff1aSopenharmony_ci    { -1,  -20,  97,  79 },
147cabdff1aSopenharmony_ci    { -1,  -26,  94, 114 },
148cabdff1aSopenharmony_ci    { -1,  -20,  99,  81 },
149cabdff1aSopenharmony_ci    { -1,  -25,  96, 116 },
150cabdff1aSopenharmony_ci    { -1,  -20, 101,  83 },
151cabdff1aSopenharmony_ci    { -1,  -25,  98, 118 },
152cabdff1aSopenharmony_ci    { -1,  -21, 103,  83 },
153cabdff1aSopenharmony_ci    { -1,  -24, 100, 120 },
154cabdff1aSopenharmony_ci    { -1,  -21, 105,  85 },
155cabdff1aSopenharmony_ci    { -1,  -24, 102, 122 },
156cabdff1aSopenharmony_ci    { -1,  -22, 107,  87 },
157cabdff1aSopenharmony_ci    { -1,  -23, 104, 124 },
158cabdff1aSopenharmony_ci    { -1,  -22, 109,  89 },
159cabdff1aSopenharmony_ci    { -1,  -23, 106, 126 },
160cabdff1aSopenharmony_ci    { -1,  -22, 111,  91 },
161cabdff1aSopenharmony_ci    { -1,  -22, 108, 128 },
162cabdff1aSopenharmony_ci    { -1,  -23, 113,  93 },
163cabdff1aSopenharmony_ci    { -1,  -22, 110, 130 },
164cabdff1aSopenharmony_ci    { -1,  -23, 115,  95 },
165cabdff1aSopenharmony_ci    { -1,  -22, 112, 132 },
166cabdff1aSopenharmony_ci    { -1,  -24, 117,  97 },
167cabdff1aSopenharmony_ci    { -1,  -21, 114, 134 },
168cabdff1aSopenharmony_ci    { -1,  -24, 119,  99 },
169cabdff1aSopenharmony_ci    { -1,  -21, 116, 136 },
170cabdff1aSopenharmony_ci    { -1,  -25, 121, 101 },
171cabdff1aSopenharmony_ci    { -1,  -20, 118, 136 },
172cabdff1aSopenharmony_ci    { -1,  -25, 123, 103 },
173cabdff1aSopenharmony_ci    { -1,  -20, 120, 138 },
174cabdff1aSopenharmony_ci    { -1,  -26, 125, 105 },
175cabdff1aSopenharmony_ci    { -1,  -20, 122, 140 },
176cabdff1aSopenharmony_ci    { -1,  -26, 127, 107 },
177cabdff1aSopenharmony_ci    { -1,  -19, 124, 142 },
178cabdff1aSopenharmony_ci    { -1,  -27, 129, 107 },
179cabdff1aSopenharmony_ci    { -1,  -19, 126, 144 },
180cabdff1aSopenharmony_ci    { -1,  -27, 131, 111 },
181cabdff1aSopenharmony_ci    { -1,  -18, 128, 146 },
182cabdff1aSopenharmony_ci    { -1,  -28, 133, 111 },
183cabdff1aSopenharmony_ci    { -1,  -18, 130, 146 },
184cabdff1aSopenharmony_ci    { -1,  -28, 135, 115 },
185cabdff1aSopenharmony_ci    { -1,  -18, 132, 148 },
186cabdff1aSopenharmony_ci    { -1,  -29, 137, 115 },
187cabdff1aSopenharmony_ci    { -1,  -17, 134, 150 },
188cabdff1aSopenharmony_ci    { -1,  -29, 139, 117 },
189cabdff1aSopenharmony_ci    { -1,  -17, 136, 152 },
190cabdff1aSopenharmony_ci    { -1,  -30, 141, 119 },
191cabdff1aSopenharmony_ci    { -1,  -16, 138, 152 },
192cabdff1aSopenharmony_ci    { -1,  -31, 143, 121 },
193cabdff1aSopenharmony_ci    { -1,  -16, 140, 154 },
194cabdff1aSopenharmony_ci    { -1,  -31, 145, 123 },
195cabdff1aSopenharmony_ci    { -1,  -15, 142, 156 },
196cabdff1aSopenharmony_ci    { -1,  -32, 147, 125 },
197cabdff1aSopenharmony_ci    { -1,  -15, 144, 158 },
198cabdff1aSopenharmony_ci    { -1,  -33, 149, 127 },
199cabdff1aSopenharmony_ci    { -1,  -15, 146, 158 },
200cabdff1aSopenharmony_ci    { -1,  -34, 151, 129 },
201cabdff1aSopenharmony_ci    { -1,  -14, 148, 160 },
202cabdff1aSopenharmony_ci    { -1,  -35, 153, 131 },
203cabdff1aSopenharmony_ci    { -1,  -14, 150, 160 },
204cabdff1aSopenharmony_ci    { -1,  -36, 155, 133 },
205cabdff1aSopenharmony_ci    { -2,  -13, 152, 162 },
206cabdff1aSopenharmony_ci    { -1,  -37, 157, 135 },
207cabdff1aSopenharmony_ci    { -2,  -12, 154, 164 },
208cabdff1aSopenharmony_ci    { -1,  -39, 159, 137 },
209cabdff1aSopenharmony_ci    { -2,  -12, 156, 164 },
210cabdff1aSopenharmony_ci    { -1,  -41, 161, 139 },
211cabdff1aSopenharmony_ci    { -2,  -11, 158, 166 },
212cabdff1aSopenharmony_ci    { -1,  -43, 163, 141 },
213cabdff1aSopenharmony_ci    { -2,  -10, 160, 166 },
214cabdff1aSopenharmony_ci    { -1,  -46, 165, 143 },
215cabdff1aSopenharmony_ci    { -3,   -9, 162, 168 },
216cabdff1aSopenharmony_ci    { -1,  -51, 167, 143 },
217cabdff1aSopenharmony_ci    { -3,   -8, 164, 170 },
218cabdff1aSopenharmony_ci    { -1,  -61, 169, 145 },
219cabdff1aSopenharmony_ci    { -4,   -7, 166, 170 },
220cabdff1aSopenharmony_ci    { -1,  -72, 169, 145 },
221cabdff1aSopenharmony_ci    { -6,   -5, 168,  49 },
222cabdff1aSopenharmony_ci    {  0, -108, 171, 171 },
223cabdff1aSopenharmony_ci    {  0, -108, 172, 172 },
224cabdff1aSopenharmony_ci    { -6,   -5, 173, 173 },
225cabdff1aSopenharmony_ci};
226cabdff1aSopenharmony_ci
227cabdff1aSopenharmony_cistatic const uint32_t els_exp_tab[ELS_JOTS_PER_BYTE * 4 + 1] = {
228cabdff1aSopenharmony_ci           0,        0,       0,       0,       0,       0,         0,        0,
229cabdff1aSopenharmony_ci           0,        0,       0,       0,       0,       0,         0,        0,
230cabdff1aSopenharmony_ci           0,        0,       0,       0,       0,       0,         0,        0,
231cabdff1aSopenharmony_ci           0,        0,       0,       0,       0,       0,         0,        0,
232cabdff1aSopenharmony_ci           0,        0,       0,       0,       1,       1,         1,        1,
233cabdff1aSopenharmony_ci           1,        2,       2,       2,       3,       4,         4,        5,
234cabdff1aSopenharmony_ci           6,        7,       8,      10,      11,      13,        16,       18,
235cabdff1aSopenharmony_ci          21,       25,      29,      34,      40,      47,        54,       64,
236cabdff1aSopenharmony_ci          74,       87,     101,     118,     138,      161,      188,      219,
237cabdff1aSopenharmony_ci         256,      298,     348,     406,     474,      552,      645,      752,
238cabdff1aSopenharmony_ci         877,     1024,    1194,    1393,    1625,     1896,     2211,     2580,
239cabdff1aSopenharmony_ci        3010,     3511,    4096,    4778,    5573,     6501,     7584,     8847,
240cabdff1aSopenharmony_ci       10321,    12040,   14045,   16384,   19112,    22295,    26007,    30339,
241cabdff1aSopenharmony_ci       35391,    41285,   48160,   56180,   65536,    76288,    89088,   103936,
242cabdff1aSopenharmony_ci      121344,   141312,  165120,  192512,  224512,   262144,   305664,   356608,
243cabdff1aSopenharmony_ci      416000,   485376,  566016,  660480,  770560,   898816,  1048576,  1223168,
244cabdff1aSopenharmony_ci     1426688,  1664256, 1941504, 2264832, 2642176,  3082240,  3595520,  4194304,
245cabdff1aSopenharmony_ci     4892672,  5707520, 6657792, 7766784, 9060096, 10568960, 12328960, 14382080,
246cabdff1aSopenharmony_ci    16777216,
247cabdff1aSopenharmony_ci};
248cabdff1aSopenharmony_ci
249cabdff1aSopenharmony_civoid ff_els_decoder_init(ElsDecCtx *ctx, const uint8_t *in, size_t data_size)
250cabdff1aSopenharmony_ci{
251cabdff1aSopenharmony_ci    int nbytes;
252cabdff1aSopenharmony_ci
253cabdff1aSopenharmony_ci    /* consume up to 3 bytes from the input data */
254cabdff1aSopenharmony_ci    if (data_size >= 3) {
255cabdff1aSopenharmony_ci        ctx->x = AV_RB24(in);
256cabdff1aSopenharmony_ci        nbytes = 3;
257cabdff1aSopenharmony_ci    } else if (data_size == 2) {
258cabdff1aSopenharmony_ci        ctx->x = AV_RB16(in);
259cabdff1aSopenharmony_ci        nbytes = 2;
260cabdff1aSopenharmony_ci    } else {
261cabdff1aSopenharmony_ci        ctx->x = *in;
262cabdff1aSopenharmony_ci        nbytes = 1;
263cabdff1aSopenharmony_ci    }
264cabdff1aSopenharmony_ci
265cabdff1aSopenharmony_ci    ctx->in_buf    = in + nbytes;
266cabdff1aSopenharmony_ci    ctx->data_size = data_size - nbytes;
267cabdff1aSopenharmony_ci    ctx->err       = 0;
268cabdff1aSopenharmony_ci    ctx->j         = ELS_JOTS_PER_BYTE;
269cabdff1aSopenharmony_ci    ctx->t         = ELS_MAX;
270cabdff1aSopenharmony_ci    ctx->diff      = FFMIN(ELS_MAX - ctx->x,
271cabdff1aSopenharmony_ci                           ELS_MAX - els_exp_tab[ELS_JOTS_PER_BYTE * 4 - 1]);
272cabdff1aSopenharmony_ci}
273cabdff1aSopenharmony_ci
274cabdff1aSopenharmony_civoid ff_els_decoder_uninit(ElsUnsignedRung *rung)
275cabdff1aSopenharmony_ci{
276cabdff1aSopenharmony_ci    av_freep(&rung->rem_rung_list);
277cabdff1aSopenharmony_ci}
278cabdff1aSopenharmony_ci
279cabdff1aSopenharmony_cistatic int els_import_byte(ElsDecCtx *ctx)
280cabdff1aSopenharmony_ci{
281cabdff1aSopenharmony_ci    if (!ctx->data_size) {
282cabdff1aSopenharmony_ci        ctx->err = AVERROR_EOF;
283cabdff1aSopenharmony_ci        return AVERROR_EOF;
284cabdff1aSopenharmony_ci    }
285cabdff1aSopenharmony_ci    ctx->x   = (ctx->x << 8) | *ctx->in_buf++;
286cabdff1aSopenharmony_ci    ctx->data_size--;
287cabdff1aSopenharmony_ci    ctx->j  += ELS_JOTS_PER_BYTE;
288cabdff1aSopenharmony_ci    ctx->t <<= 8;
289cabdff1aSopenharmony_ci
290cabdff1aSopenharmony_ci    return 0;
291cabdff1aSopenharmony_ci}
292cabdff1aSopenharmony_ci
293cabdff1aSopenharmony_ciint ff_els_decode_bit(ElsDecCtx *ctx, uint8_t *rung)
294cabdff1aSopenharmony_ci{
295cabdff1aSopenharmony_ci    int z, bit, ret;
296cabdff1aSopenharmony_ci    const uint32_t *pAllowable = &els_exp_tab[ELS_JOTS_PER_BYTE * 3];
297cabdff1aSopenharmony_ci
298cabdff1aSopenharmony_ci    if (ctx->err)
299cabdff1aSopenharmony_ci        return 0;
300cabdff1aSopenharmony_ci
301cabdff1aSopenharmony_ci    z          = pAllowable[ctx->j + Ladder[*rung].ALps];
302cabdff1aSopenharmony_ci    ctx->t    -= z;
303cabdff1aSopenharmony_ci    ctx->diff -= z;
304cabdff1aSopenharmony_ci    if (ctx->diff > 0)
305cabdff1aSopenharmony_ci        return *rung & 1;   /* shortcut for x < t > pAllowable[j - 1] */
306cabdff1aSopenharmony_ci
307cabdff1aSopenharmony_ci    if (ctx->t > ctx->x) {  /* decode most probable symbol (MPS) */
308cabdff1aSopenharmony_ci        ctx->j += Ladder[*rung].AMps;
309cabdff1aSopenharmony_ci        while (ctx->t > pAllowable[ctx->j])
310cabdff1aSopenharmony_ci            ctx->j++;
311cabdff1aSopenharmony_ci
312cabdff1aSopenharmony_ci        if (ctx->j <= 0) { /* MPS: import one byte from bytestream. */
313cabdff1aSopenharmony_ci            ret = els_import_byte(ctx);
314cabdff1aSopenharmony_ci            if (ret < 0)
315cabdff1aSopenharmony_ci                return ret;
316cabdff1aSopenharmony_ci        }
317cabdff1aSopenharmony_ci
318cabdff1aSopenharmony_ci        z     = ctx->t;
319cabdff1aSopenharmony_ci        bit   = *rung & 1;
320cabdff1aSopenharmony_ci        *rung = Ladder[*rung].next0;
321cabdff1aSopenharmony_ci    } else { /* decode less probable symbol (LPS) */
322cabdff1aSopenharmony_ci        ctx->x -= ctx->t;
323cabdff1aSopenharmony_ci        ctx->t  = z;
324cabdff1aSopenharmony_ci
325cabdff1aSopenharmony_ci        ctx->j += Ladder[*rung].ALps;
326cabdff1aSopenharmony_ci        if (ctx->j <= 0) {
327cabdff1aSopenharmony_ci            /* LPS: import one byte from bytestream. */
328cabdff1aSopenharmony_ci            z <<= 8;
329cabdff1aSopenharmony_ci            ret = els_import_byte(ctx);
330cabdff1aSopenharmony_ci            if (ret < 0)
331cabdff1aSopenharmony_ci                return ret;
332cabdff1aSopenharmony_ci            if (ctx->j <= 0) {
333cabdff1aSopenharmony_ci                /* LPS: import second byte from bytestream. */
334cabdff1aSopenharmony_ci                z <<= 8;
335cabdff1aSopenharmony_ci                ret = els_import_byte(ctx);
336cabdff1aSopenharmony_ci                if (ret < 0)
337cabdff1aSopenharmony_ci                    return ret;
338cabdff1aSopenharmony_ci                while (pAllowable[ctx->j - 1] >= z)
339cabdff1aSopenharmony_ci                    ctx->j--;
340cabdff1aSopenharmony_ci            }
341cabdff1aSopenharmony_ci        }
342cabdff1aSopenharmony_ci
343cabdff1aSopenharmony_ci        bit   = !(*rung & 1);
344cabdff1aSopenharmony_ci        *rung = Ladder[*rung].next1;
345cabdff1aSopenharmony_ci    }
346cabdff1aSopenharmony_ci
347cabdff1aSopenharmony_ci    ctx->diff = FFMIN(z - ctx->x, z - pAllowable[ctx->j - 1]);
348cabdff1aSopenharmony_ci
349cabdff1aSopenharmony_ci    return bit;
350cabdff1aSopenharmony_ci}
351cabdff1aSopenharmony_ci
352cabdff1aSopenharmony_ciunsigned ff_els_decode_unsigned(ElsDecCtx *ctx, ElsUnsignedRung *ur)
353cabdff1aSopenharmony_ci{
354cabdff1aSopenharmony_ci    int i, n, r, bit;
355cabdff1aSopenharmony_ci    ElsRungNode *rung_node;
356cabdff1aSopenharmony_ci
357cabdff1aSopenharmony_ci    if (ctx->err)
358cabdff1aSopenharmony_ci        return 0;
359cabdff1aSopenharmony_ci
360cabdff1aSopenharmony_ci    /* decode unary prefix */
361cabdff1aSopenharmony_ci    for (n = 0; n < ELS_EXPGOLOMB_LEN + 1; n++)
362cabdff1aSopenharmony_ci        if (ff_els_decode_bit(ctx, &ur->prefix_rung[n]))
363cabdff1aSopenharmony_ci            break;
364cabdff1aSopenharmony_ci
365cabdff1aSopenharmony_ci    /* handle the error/overflow case */
366cabdff1aSopenharmony_ci    if (ctx->err || n >= ELS_EXPGOLOMB_LEN) {
367cabdff1aSopenharmony_ci        ctx->err = AVERROR_INVALIDDATA;
368cabdff1aSopenharmony_ci        return 0;
369cabdff1aSopenharmony_ci    }
370cabdff1aSopenharmony_ci
371cabdff1aSopenharmony_ci    /* handle the zero case */
372cabdff1aSopenharmony_ci    if (!n)
373cabdff1aSopenharmony_ci        return 0;
374cabdff1aSopenharmony_ci
375cabdff1aSopenharmony_ci    /* initialize probability tree */
376cabdff1aSopenharmony_ci    if (!ur->rem_rung_list) {
377cabdff1aSopenharmony_ci        ur->rem_rung_list = av_realloc(NULL, RUNG_SPACE);
378cabdff1aSopenharmony_ci        if (!ur->rem_rung_list) {
379cabdff1aSopenharmony_ci            ctx->err = AVERROR(ENOMEM);
380cabdff1aSopenharmony_ci            return 0;
381cabdff1aSopenharmony_ci        }
382cabdff1aSopenharmony_ci        memset(ur->rem_rung_list, 0, RUNG_SPACE);
383cabdff1aSopenharmony_ci        ur->rung_list_size = RUNG_SPACE;
384cabdff1aSopenharmony_ci        ur->avail_index    = ELS_EXPGOLOMB_LEN;
385cabdff1aSopenharmony_ci    }
386cabdff1aSopenharmony_ci
387cabdff1aSopenharmony_ci    /* decode the remainder */
388cabdff1aSopenharmony_ci    for (i = 0, r = 0, bit = 0; i < n; i++) {
389cabdff1aSopenharmony_ci        if (!i)
390cabdff1aSopenharmony_ci            rung_node = &ur->rem_rung_list[n];
391cabdff1aSopenharmony_ci        else {
392cabdff1aSopenharmony_ci            if (!rung_node->next_index) {
393cabdff1aSopenharmony_ci                if (ur->rung_list_size <= (ur->avail_index + 2) * sizeof(ElsRungNode)) {
394cabdff1aSopenharmony_ci                    // remember rung_node position
395cabdff1aSopenharmony_ci                    ptrdiff_t pos     = rung_node - ur->rem_rung_list;
396cabdff1aSopenharmony_ci                    ctx->err = av_reallocp(&ur->rem_rung_list,
397cabdff1aSopenharmony_ci                                                   ur->rung_list_size +
398cabdff1aSopenharmony_ci                                                   RUNG_SPACE);
399cabdff1aSopenharmony_ci                    if (ctx->err < 0) {
400cabdff1aSopenharmony_ci                        return 0;
401cabdff1aSopenharmony_ci                    }
402cabdff1aSopenharmony_ci                    memset((uint8_t *) ur->rem_rung_list + ur->rung_list_size, 0,
403cabdff1aSopenharmony_ci                           RUNG_SPACE);
404cabdff1aSopenharmony_ci                    ur->rung_list_size += RUNG_SPACE;
405cabdff1aSopenharmony_ci                    // restore rung_node position in the new list
406cabdff1aSopenharmony_ci                    rung_node = &ur->rem_rung_list[pos];
407cabdff1aSopenharmony_ci                }
408cabdff1aSopenharmony_ci                rung_node->next_index = ur->avail_index;
409cabdff1aSopenharmony_ci                ur->avail_index      += 2;
410cabdff1aSopenharmony_ci            }
411cabdff1aSopenharmony_ci            rung_node = &ur->rem_rung_list[rung_node->next_index + bit];
412cabdff1aSopenharmony_ci        }
413cabdff1aSopenharmony_ci
414cabdff1aSopenharmony_ci        bit = ff_els_decode_bit(ctx, &rung_node->rung);
415cabdff1aSopenharmony_ci        if (ctx->err)
416cabdff1aSopenharmony_ci            return bit;
417cabdff1aSopenharmony_ci
418cabdff1aSopenharmony_ci        r = (r << 1) + bit;
419cabdff1aSopenharmony_ci    }
420cabdff1aSopenharmony_ci
421cabdff1aSopenharmony_ci    return (1 << n) - 1 + r; /* make value from exp golomb code */
422cabdff1aSopenharmony_ci}
423