1cabdff1aSopenharmony_ci/*
2cabdff1aSopenharmony_ci * exp golomb vlc stuff
3cabdff1aSopenharmony_ci * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>
4cabdff1aSopenharmony_ci * Copyright (c) 2004 Alex Beregszaszi
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 * @brief
26cabdff1aSopenharmony_ci *     exp golomb vlc stuff
27cabdff1aSopenharmony_ci * @author Michael Niedermayer <michaelni@gmx.at> and Alex Beregszaszi
28cabdff1aSopenharmony_ci */
29cabdff1aSopenharmony_ci
30cabdff1aSopenharmony_ci#ifndef AVCODEC_GOLOMB_H
31cabdff1aSopenharmony_ci#define AVCODEC_GOLOMB_H
32cabdff1aSopenharmony_ci
33cabdff1aSopenharmony_ci#include <stdint.h>
34cabdff1aSopenharmony_ci
35cabdff1aSopenharmony_ci#include "get_bits.h"
36cabdff1aSopenharmony_ci
37cabdff1aSopenharmony_ci#define INVALID_VLC           0x80000000
38cabdff1aSopenharmony_ci
39cabdff1aSopenharmony_ciextern const uint8_t ff_golomb_vlc_len[512];
40cabdff1aSopenharmony_ciextern const uint8_t ff_ue_golomb_vlc_code[512];
41cabdff1aSopenharmony_ciextern const  int8_t ff_se_golomb_vlc_code[512];
42cabdff1aSopenharmony_ci
43cabdff1aSopenharmony_ciextern const uint8_t ff_interleaved_golomb_vlc_len[256];
44cabdff1aSopenharmony_ciextern const uint8_t ff_interleaved_ue_golomb_vlc_code[256];
45cabdff1aSopenharmony_ciextern const  int8_t ff_interleaved_se_golomb_vlc_code[256];
46cabdff1aSopenharmony_ciextern const uint8_t ff_interleaved_dirac_golomb_vlc_code[256];
47cabdff1aSopenharmony_ci
48cabdff1aSopenharmony_ci/**
49cabdff1aSopenharmony_ci * Read an unsigned Exp-Golomb code in the range 0 to 8190.
50cabdff1aSopenharmony_ci *
51cabdff1aSopenharmony_ci * @returns the read value or a negative error code.
52cabdff1aSopenharmony_ci */
53cabdff1aSopenharmony_cistatic inline int get_ue_golomb(GetBitContext *gb)
54cabdff1aSopenharmony_ci{
55cabdff1aSopenharmony_ci    unsigned int buf;
56cabdff1aSopenharmony_ci
57cabdff1aSopenharmony_ci#if CACHED_BITSTREAM_READER
58cabdff1aSopenharmony_ci    buf = show_bits_long(gb, 32);
59cabdff1aSopenharmony_ci
60cabdff1aSopenharmony_ci    if (buf >= (1 << 27)) {
61cabdff1aSopenharmony_ci        buf >>= 32 - 9;
62cabdff1aSopenharmony_ci        skip_bits_long(gb, ff_golomb_vlc_len[buf]);
63cabdff1aSopenharmony_ci
64cabdff1aSopenharmony_ci        return ff_ue_golomb_vlc_code[buf];
65cabdff1aSopenharmony_ci    } else {
66cabdff1aSopenharmony_ci        int log = 2 * av_log2(buf) - 31;
67cabdff1aSopenharmony_ci
68cabdff1aSopenharmony_ci        skip_bits_long(gb, 32 - log);
69cabdff1aSopenharmony_ci        if (log < 7)
70cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
71cabdff1aSopenharmony_ci        buf >>= log;
72cabdff1aSopenharmony_ci        buf--;
73cabdff1aSopenharmony_ci
74cabdff1aSopenharmony_ci        return buf;
75cabdff1aSopenharmony_ci    }
76cabdff1aSopenharmony_ci#else
77cabdff1aSopenharmony_ci    OPEN_READER(re, gb);
78cabdff1aSopenharmony_ci    UPDATE_CACHE(re, gb);
79cabdff1aSopenharmony_ci    buf = GET_CACHE(re, gb);
80cabdff1aSopenharmony_ci
81cabdff1aSopenharmony_ci    if (buf >= (1 << 27)) {
82cabdff1aSopenharmony_ci        buf >>= 32 - 9;
83cabdff1aSopenharmony_ci        LAST_SKIP_BITS(re, gb, ff_golomb_vlc_len[buf]);
84cabdff1aSopenharmony_ci        CLOSE_READER(re, gb);
85cabdff1aSopenharmony_ci
86cabdff1aSopenharmony_ci        return ff_ue_golomb_vlc_code[buf];
87cabdff1aSopenharmony_ci    } else {
88cabdff1aSopenharmony_ci        int log = 2 * av_log2(buf) - 31;
89cabdff1aSopenharmony_ci        LAST_SKIP_BITS(re, gb, 32 - log);
90cabdff1aSopenharmony_ci        CLOSE_READER(re, gb);
91cabdff1aSopenharmony_ci        if (log < 7)
92cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
93cabdff1aSopenharmony_ci        buf >>= log;
94cabdff1aSopenharmony_ci        buf--;
95cabdff1aSopenharmony_ci
96cabdff1aSopenharmony_ci        return buf;
97cabdff1aSopenharmony_ci    }
98cabdff1aSopenharmony_ci#endif
99cabdff1aSopenharmony_ci}
100cabdff1aSopenharmony_ci
101cabdff1aSopenharmony_ci/**
102cabdff1aSopenharmony_ci * Read an unsigned Exp-Golomb code in the range 0 to UINT32_MAX-1.
103cabdff1aSopenharmony_ci */
104cabdff1aSopenharmony_cistatic inline unsigned get_ue_golomb_long(GetBitContext *gb)
105cabdff1aSopenharmony_ci{
106cabdff1aSopenharmony_ci    unsigned buf, log;
107cabdff1aSopenharmony_ci
108cabdff1aSopenharmony_ci    buf = show_bits_long(gb, 32);
109cabdff1aSopenharmony_ci    log = 31 - av_log2(buf);
110cabdff1aSopenharmony_ci    skip_bits_long(gb, log);
111cabdff1aSopenharmony_ci
112cabdff1aSopenharmony_ci    return get_bits_long(gb, log + 1) - 1;
113cabdff1aSopenharmony_ci}
114cabdff1aSopenharmony_ci
115cabdff1aSopenharmony_ci/**
116cabdff1aSopenharmony_ci * read unsigned exp golomb code, constraint to a max of 31.
117cabdff1aSopenharmony_ci * If the value encountered is not in 0..31, the return value
118cabdff1aSopenharmony_ci * is outside the range 0..30.
119cabdff1aSopenharmony_ci */
120cabdff1aSopenharmony_cistatic inline int get_ue_golomb_31(GetBitContext *gb)
121cabdff1aSopenharmony_ci{
122cabdff1aSopenharmony_ci    unsigned int buf;
123cabdff1aSopenharmony_ci
124cabdff1aSopenharmony_ci#if CACHED_BITSTREAM_READER
125cabdff1aSopenharmony_ci    buf = show_bits_long(gb, 32);
126cabdff1aSopenharmony_ci
127cabdff1aSopenharmony_ci    buf >>= 32 - 9;
128cabdff1aSopenharmony_ci    skip_bits_long(gb, ff_golomb_vlc_len[buf]);
129cabdff1aSopenharmony_ci#else
130cabdff1aSopenharmony_ci
131cabdff1aSopenharmony_ci    OPEN_READER(re, gb);
132cabdff1aSopenharmony_ci    UPDATE_CACHE(re, gb);
133cabdff1aSopenharmony_ci    buf = GET_CACHE(re, gb);
134cabdff1aSopenharmony_ci
135cabdff1aSopenharmony_ci    buf >>= 32 - 9;
136cabdff1aSopenharmony_ci    LAST_SKIP_BITS(re, gb, ff_golomb_vlc_len[buf]);
137cabdff1aSopenharmony_ci    CLOSE_READER(re, gb);
138cabdff1aSopenharmony_ci#endif
139cabdff1aSopenharmony_ci
140cabdff1aSopenharmony_ci    return ff_ue_golomb_vlc_code[buf];
141cabdff1aSopenharmony_ci}
142cabdff1aSopenharmony_ci
143cabdff1aSopenharmony_cistatic inline unsigned get_interleaved_ue_golomb(GetBitContext *gb)
144cabdff1aSopenharmony_ci{
145cabdff1aSopenharmony_ci    uint32_t buf;
146cabdff1aSopenharmony_ci
147cabdff1aSopenharmony_ci#if CACHED_BITSTREAM_READER
148cabdff1aSopenharmony_ci    buf = show_bits_long(gb, 32);
149cabdff1aSopenharmony_ci
150cabdff1aSopenharmony_ci    if (buf & 0xAA800000) {
151cabdff1aSopenharmony_ci        buf >>= 32 - 8;
152cabdff1aSopenharmony_ci        skip_bits_long(gb, ff_interleaved_golomb_vlc_len[buf]);
153cabdff1aSopenharmony_ci
154cabdff1aSopenharmony_ci        return ff_interleaved_ue_golomb_vlc_code[buf];
155cabdff1aSopenharmony_ci    } else {
156cabdff1aSopenharmony_ci        unsigned ret = 1;
157cabdff1aSopenharmony_ci
158cabdff1aSopenharmony_ci        do {
159cabdff1aSopenharmony_ci            buf >>= 32 - 8;
160cabdff1aSopenharmony_ci            skip_bits_long(gb, FFMIN(ff_interleaved_golomb_vlc_len[buf], 8));
161cabdff1aSopenharmony_ci
162cabdff1aSopenharmony_ci            if (ff_interleaved_golomb_vlc_len[buf] != 9) {
163cabdff1aSopenharmony_ci                ret <<= (ff_interleaved_golomb_vlc_len[buf] - 1) >> 1;
164cabdff1aSopenharmony_ci                ret  |= ff_interleaved_dirac_golomb_vlc_code[buf];
165cabdff1aSopenharmony_ci                break;
166cabdff1aSopenharmony_ci            }
167cabdff1aSopenharmony_ci            ret = (ret << 4) | ff_interleaved_dirac_golomb_vlc_code[buf];
168cabdff1aSopenharmony_ci            buf = show_bits_long(gb, 32);
169cabdff1aSopenharmony_ci        } while (get_bits_left(gb) > 0);
170cabdff1aSopenharmony_ci
171cabdff1aSopenharmony_ci        return ret - 1;
172cabdff1aSopenharmony_ci    }
173cabdff1aSopenharmony_ci#else
174cabdff1aSopenharmony_ci    OPEN_READER(re, gb);
175cabdff1aSopenharmony_ci    UPDATE_CACHE(re, gb);
176cabdff1aSopenharmony_ci    buf = GET_CACHE(re, gb);
177cabdff1aSopenharmony_ci
178cabdff1aSopenharmony_ci    if (buf & 0xAA800000) {
179cabdff1aSopenharmony_ci        buf >>= 32 - 8;
180cabdff1aSopenharmony_ci        LAST_SKIP_BITS(re, gb, ff_interleaved_golomb_vlc_len[buf]);
181cabdff1aSopenharmony_ci        CLOSE_READER(re, gb);
182cabdff1aSopenharmony_ci
183cabdff1aSopenharmony_ci        return ff_interleaved_ue_golomb_vlc_code[buf];
184cabdff1aSopenharmony_ci    } else {
185cabdff1aSopenharmony_ci        unsigned ret = 1;
186cabdff1aSopenharmony_ci
187cabdff1aSopenharmony_ci        do {
188cabdff1aSopenharmony_ci            buf >>= 32 - 8;
189cabdff1aSopenharmony_ci            LAST_SKIP_BITS(re, gb,
190cabdff1aSopenharmony_ci                           FFMIN(ff_interleaved_golomb_vlc_len[buf], 8));
191cabdff1aSopenharmony_ci
192cabdff1aSopenharmony_ci            if (ff_interleaved_golomb_vlc_len[buf] != 9) {
193cabdff1aSopenharmony_ci                ret <<= (ff_interleaved_golomb_vlc_len[buf] - 1) >> 1;
194cabdff1aSopenharmony_ci                ret  |= ff_interleaved_dirac_golomb_vlc_code[buf];
195cabdff1aSopenharmony_ci                break;
196cabdff1aSopenharmony_ci            }
197cabdff1aSopenharmony_ci            ret = (ret << 4) | ff_interleaved_dirac_golomb_vlc_code[buf];
198cabdff1aSopenharmony_ci            UPDATE_CACHE(re, gb);
199cabdff1aSopenharmony_ci            buf = GET_CACHE(re, gb);
200cabdff1aSopenharmony_ci        } while (ret<0x8000000U && BITS_AVAILABLE(re, gb));
201cabdff1aSopenharmony_ci
202cabdff1aSopenharmony_ci        CLOSE_READER(re, gb);
203cabdff1aSopenharmony_ci        return ret - 1;
204cabdff1aSopenharmony_ci    }
205cabdff1aSopenharmony_ci#endif
206cabdff1aSopenharmony_ci}
207cabdff1aSopenharmony_ci
208cabdff1aSopenharmony_ci/**
209cabdff1aSopenharmony_ci * read unsigned truncated exp golomb code.
210cabdff1aSopenharmony_ci */
211cabdff1aSopenharmony_cistatic inline int get_te0_golomb(GetBitContext *gb, int range)
212cabdff1aSopenharmony_ci{
213cabdff1aSopenharmony_ci    av_assert2(range >= 1);
214cabdff1aSopenharmony_ci
215cabdff1aSopenharmony_ci    if (range == 1)
216cabdff1aSopenharmony_ci        return 0;
217cabdff1aSopenharmony_ci    else if (range == 2)
218cabdff1aSopenharmony_ci        return get_bits1(gb) ^ 1;
219cabdff1aSopenharmony_ci    else
220cabdff1aSopenharmony_ci        return get_ue_golomb(gb);
221cabdff1aSopenharmony_ci}
222cabdff1aSopenharmony_ci
223cabdff1aSopenharmony_ci/**
224cabdff1aSopenharmony_ci * read unsigned truncated exp golomb code.
225cabdff1aSopenharmony_ci */
226cabdff1aSopenharmony_cistatic inline int get_te_golomb(GetBitContext *gb, int range)
227cabdff1aSopenharmony_ci{
228cabdff1aSopenharmony_ci    av_assert2(range >= 1);
229cabdff1aSopenharmony_ci
230cabdff1aSopenharmony_ci    if (range == 2)
231cabdff1aSopenharmony_ci        return get_bits1(gb) ^ 1;
232cabdff1aSopenharmony_ci    else
233cabdff1aSopenharmony_ci        return get_ue_golomb(gb);
234cabdff1aSopenharmony_ci}
235cabdff1aSopenharmony_ci
236cabdff1aSopenharmony_ci/**
237cabdff1aSopenharmony_ci * read signed exp golomb code.
238cabdff1aSopenharmony_ci */
239cabdff1aSopenharmony_cistatic inline int get_se_golomb(GetBitContext *gb)
240cabdff1aSopenharmony_ci{
241cabdff1aSopenharmony_ci    unsigned int buf;
242cabdff1aSopenharmony_ci
243cabdff1aSopenharmony_ci#if CACHED_BITSTREAM_READER
244cabdff1aSopenharmony_ci    buf = show_bits_long(gb, 32);
245cabdff1aSopenharmony_ci
246cabdff1aSopenharmony_ci    if (buf >= (1 << 27)) {
247cabdff1aSopenharmony_ci        buf >>= 32 - 9;
248cabdff1aSopenharmony_ci        skip_bits_long(gb, ff_golomb_vlc_len[buf]);
249cabdff1aSopenharmony_ci
250cabdff1aSopenharmony_ci        return ff_se_golomb_vlc_code[buf];
251cabdff1aSopenharmony_ci    } else {
252cabdff1aSopenharmony_ci        int log = 2 * av_log2(buf) - 31;
253cabdff1aSopenharmony_ci        buf >>= log;
254cabdff1aSopenharmony_ci
255cabdff1aSopenharmony_ci        skip_bits_long(gb, 32 - log);
256cabdff1aSopenharmony_ci
257cabdff1aSopenharmony_ci        if (buf & 1)
258cabdff1aSopenharmony_ci            buf = -(buf >> 1);
259cabdff1aSopenharmony_ci        else
260cabdff1aSopenharmony_ci            buf = (buf >> 1);
261cabdff1aSopenharmony_ci
262cabdff1aSopenharmony_ci        return buf;
263cabdff1aSopenharmony_ci    }
264cabdff1aSopenharmony_ci#else
265cabdff1aSopenharmony_ci    OPEN_READER(re, gb);
266cabdff1aSopenharmony_ci    UPDATE_CACHE(re, gb);
267cabdff1aSopenharmony_ci    buf = GET_CACHE(re, gb);
268cabdff1aSopenharmony_ci
269cabdff1aSopenharmony_ci    if (buf >= (1 << 27)) {
270cabdff1aSopenharmony_ci        buf >>= 32 - 9;
271cabdff1aSopenharmony_ci        LAST_SKIP_BITS(re, gb, ff_golomb_vlc_len[buf]);
272cabdff1aSopenharmony_ci        CLOSE_READER(re, gb);
273cabdff1aSopenharmony_ci
274cabdff1aSopenharmony_ci        return ff_se_golomb_vlc_code[buf];
275cabdff1aSopenharmony_ci    } else {
276cabdff1aSopenharmony_ci        int log = av_log2(buf), sign;
277cabdff1aSopenharmony_ci        LAST_SKIP_BITS(re, gb, 31 - log);
278cabdff1aSopenharmony_ci        UPDATE_CACHE(re, gb);
279cabdff1aSopenharmony_ci        buf = GET_CACHE(re, gb);
280cabdff1aSopenharmony_ci
281cabdff1aSopenharmony_ci        buf >>= log;
282cabdff1aSopenharmony_ci
283cabdff1aSopenharmony_ci        LAST_SKIP_BITS(re, gb, 32 - log);
284cabdff1aSopenharmony_ci        CLOSE_READER(re, gb);
285cabdff1aSopenharmony_ci
286cabdff1aSopenharmony_ci        sign = -(buf & 1);
287cabdff1aSopenharmony_ci        buf  = ((buf >> 1) ^ sign) - sign;
288cabdff1aSopenharmony_ci
289cabdff1aSopenharmony_ci        return buf;
290cabdff1aSopenharmony_ci    }
291cabdff1aSopenharmony_ci#endif
292cabdff1aSopenharmony_ci}
293cabdff1aSopenharmony_ci
294cabdff1aSopenharmony_cistatic inline int get_se_golomb_long(GetBitContext *gb)
295cabdff1aSopenharmony_ci{
296cabdff1aSopenharmony_ci    unsigned int buf = get_ue_golomb_long(gb);
297cabdff1aSopenharmony_ci    int sign = (buf & 1) - 1;
298cabdff1aSopenharmony_ci    return ((buf >> 1) ^ sign) + 1;
299cabdff1aSopenharmony_ci}
300cabdff1aSopenharmony_ci
301cabdff1aSopenharmony_cistatic inline int get_interleaved_se_golomb(GetBitContext *gb)
302cabdff1aSopenharmony_ci{
303cabdff1aSopenharmony_ci    unsigned int buf;
304cabdff1aSopenharmony_ci
305cabdff1aSopenharmony_ci#if CACHED_BITSTREAM_READER
306cabdff1aSopenharmony_ci    buf = show_bits_long(gb, 32);
307cabdff1aSopenharmony_ci
308cabdff1aSopenharmony_ci    if (buf & 0xAA800000) {
309cabdff1aSopenharmony_ci        buf >>= 32 - 8;
310cabdff1aSopenharmony_ci        skip_bits_long(gb, ff_interleaved_golomb_vlc_len[buf]);
311cabdff1aSopenharmony_ci
312cabdff1aSopenharmony_ci        return ff_interleaved_se_golomb_vlc_code[buf];
313cabdff1aSopenharmony_ci    } else {
314cabdff1aSopenharmony_ci        int log;
315cabdff1aSopenharmony_ci        skip_bits(gb, 8);
316cabdff1aSopenharmony_ci        buf |= 1 | show_bits(gb, 24);
317cabdff1aSopenharmony_ci
318cabdff1aSopenharmony_ci        if ((buf & 0xAAAAAAAA) == 0)
319cabdff1aSopenharmony_ci            return INVALID_VLC;
320cabdff1aSopenharmony_ci
321cabdff1aSopenharmony_ci        for (log = 31; (buf & 0x80000000) == 0; log--)
322cabdff1aSopenharmony_ci            buf = (buf << 2) - ((buf << log) >> (log - 1)) + (buf >> 30);
323cabdff1aSopenharmony_ci
324cabdff1aSopenharmony_ci        skip_bits_long(gb, 63 - 2 * log - 8);
325cabdff1aSopenharmony_ci
326cabdff1aSopenharmony_ci        return (signed) (((((buf << log) >> log) - 1) ^ -(buf & 0x1)) + 1) >> 1;
327cabdff1aSopenharmony_ci    }
328cabdff1aSopenharmony_ci#else
329cabdff1aSopenharmony_ci    OPEN_READER(re, gb);
330cabdff1aSopenharmony_ci    UPDATE_CACHE(re, gb);
331cabdff1aSopenharmony_ci    buf = GET_CACHE(re, gb);
332cabdff1aSopenharmony_ci
333cabdff1aSopenharmony_ci    if (buf & 0xAA800000) {
334cabdff1aSopenharmony_ci        buf >>= 32 - 8;
335cabdff1aSopenharmony_ci        LAST_SKIP_BITS(re, gb, ff_interleaved_golomb_vlc_len[buf]);
336cabdff1aSopenharmony_ci        CLOSE_READER(re, gb);
337cabdff1aSopenharmony_ci
338cabdff1aSopenharmony_ci        return ff_interleaved_se_golomb_vlc_code[buf];
339cabdff1aSopenharmony_ci    } else {
340cabdff1aSopenharmony_ci        int log;
341cabdff1aSopenharmony_ci        LAST_SKIP_BITS(re, gb, 8);
342cabdff1aSopenharmony_ci        UPDATE_CACHE(re, gb);
343cabdff1aSopenharmony_ci        buf |= 1 | (GET_CACHE(re, gb) >> 8);
344cabdff1aSopenharmony_ci
345cabdff1aSopenharmony_ci        if ((buf & 0xAAAAAAAA) == 0)
346cabdff1aSopenharmony_ci            return INVALID_VLC;
347cabdff1aSopenharmony_ci
348cabdff1aSopenharmony_ci        for (log = 31; (buf & 0x80000000) == 0; log--)
349cabdff1aSopenharmony_ci            buf = (buf << 2) - ((buf << log) >> (log - 1)) + (buf >> 30);
350cabdff1aSopenharmony_ci
351cabdff1aSopenharmony_ci        LAST_SKIP_BITS(re, gb, 63 - 2 * log - 8);
352cabdff1aSopenharmony_ci        CLOSE_READER(re, gb);
353cabdff1aSopenharmony_ci
354cabdff1aSopenharmony_ci        return (signed) (((((buf << log) >> log) - 1) ^ -(buf & 0x1)) + 1) >> 1;
355cabdff1aSopenharmony_ci    }
356cabdff1aSopenharmony_ci#endif
357cabdff1aSopenharmony_ci}
358cabdff1aSopenharmony_ci
359cabdff1aSopenharmony_cistatic inline int dirac_get_se_golomb(GetBitContext *gb)
360cabdff1aSopenharmony_ci{
361cabdff1aSopenharmony_ci    uint32_t ret = get_interleaved_ue_golomb(gb);
362cabdff1aSopenharmony_ci
363cabdff1aSopenharmony_ci    if (ret) {
364cabdff1aSopenharmony_ci        int sign = -get_bits1(gb);
365cabdff1aSopenharmony_ci        ret = (ret ^ sign) - sign;
366cabdff1aSopenharmony_ci    }
367cabdff1aSopenharmony_ci
368cabdff1aSopenharmony_ci    return ret;
369cabdff1aSopenharmony_ci}
370cabdff1aSopenharmony_ci
371cabdff1aSopenharmony_ci/**
372cabdff1aSopenharmony_ci * read unsigned golomb rice code (ffv1).
373cabdff1aSopenharmony_ci */
374cabdff1aSopenharmony_cistatic inline int get_ur_golomb(GetBitContext *gb, int k, int limit,
375cabdff1aSopenharmony_ci                                int esc_len)
376cabdff1aSopenharmony_ci{
377cabdff1aSopenharmony_ci    unsigned int buf;
378cabdff1aSopenharmony_ci    int log;
379cabdff1aSopenharmony_ci
380cabdff1aSopenharmony_ci#if CACHED_BITSTREAM_READER
381cabdff1aSopenharmony_ci    buf = show_bits_long(gb, 32);
382cabdff1aSopenharmony_ci
383cabdff1aSopenharmony_ci    log = av_log2(buf);
384cabdff1aSopenharmony_ci
385cabdff1aSopenharmony_ci    if (log > 31 - limit) {
386cabdff1aSopenharmony_ci        buf >>= log - k;
387cabdff1aSopenharmony_ci        buf  += (30 - log) << k;
388cabdff1aSopenharmony_ci        skip_bits_long(gb, 32 + k - log);
389cabdff1aSopenharmony_ci
390cabdff1aSopenharmony_ci        return buf;
391cabdff1aSopenharmony_ci    } else {
392cabdff1aSopenharmony_ci        skip_bits_long(gb, limit);
393cabdff1aSopenharmony_ci        buf = get_bits_long(gb, esc_len);
394cabdff1aSopenharmony_ci
395cabdff1aSopenharmony_ci        return buf + limit - 1;
396cabdff1aSopenharmony_ci    }
397cabdff1aSopenharmony_ci#else
398cabdff1aSopenharmony_ci    OPEN_READER(re, gb);
399cabdff1aSopenharmony_ci    UPDATE_CACHE(re, gb);
400cabdff1aSopenharmony_ci    buf = GET_CACHE(re, gb);
401cabdff1aSopenharmony_ci
402cabdff1aSopenharmony_ci    log = av_log2(buf);
403cabdff1aSopenharmony_ci
404cabdff1aSopenharmony_ci    if (log > 31 - limit) {
405cabdff1aSopenharmony_ci        buf >>= log - k;
406cabdff1aSopenharmony_ci        buf  += (30U - log) << k;
407cabdff1aSopenharmony_ci        LAST_SKIP_BITS(re, gb, 32 + k - log);
408cabdff1aSopenharmony_ci        CLOSE_READER(re, gb);
409cabdff1aSopenharmony_ci
410cabdff1aSopenharmony_ci        return buf;
411cabdff1aSopenharmony_ci    } else {
412cabdff1aSopenharmony_ci        LAST_SKIP_BITS(re, gb, limit);
413cabdff1aSopenharmony_ci        UPDATE_CACHE(re, gb);
414cabdff1aSopenharmony_ci
415cabdff1aSopenharmony_ci        buf = SHOW_UBITS(re, gb, esc_len);
416cabdff1aSopenharmony_ci
417cabdff1aSopenharmony_ci        LAST_SKIP_BITS(re, gb, esc_len);
418cabdff1aSopenharmony_ci        CLOSE_READER(re, gb);
419cabdff1aSopenharmony_ci
420cabdff1aSopenharmony_ci        return buf + limit - 1;
421cabdff1aSopenharmony_ci    }
422cabdff1aSopenharmony_ci#endif
423cabdff1aSopenharmony_ci}
424cabdff1aSopenharmony_ci
425cabdff1aSopenharmony_ci/**
426cabdff1aSopenharmony_ci * read unsigned golomb rice code (jpegls).
427cabdff1aSopenharmony_ci */
428cabdff1aSopenharmony_cistatic inline int get_ur_golomb_jpegls(GetBitContext *gb, int k, int limit,
429cabdff1aSopenharmony_ci                                       int esc_len)
430cabdff1aSopenharmony_ci{
431cabdff1aSopenharmony_ci    unsigned int buf;
432cabdff1aSopenharmony_ci    int log;
433cabdff1aSopenharmony_ci
434cabdff1aSopenharmony_ci#if CACHED_BITSTREAM_READER
435cabdff1aSopenharmony_ci    buf = show_bits_long(gb, 32);
436cabdff1aSopenharmony_ci
437cabdff1aSopenharmony_ci    log = av_log2(buf);
438cabdff1aSopenharmony_ci
439cabdff1aSopenharmony_ci    if (log - k >= 1 && 32 - log < limit) {
440cabdff1aSopenharmony_ci        buf >>= log - k;
441cabdff1aSopenharmony_ci        buf  += (30 - log) << k;
442cabdff1aSopenharmony_ci        skip_bits_long(gb, 32 + k - log);
443cabdff1aSopenharmony_ci
444cabdff1aSopenharmony_ci        return buf;
445cabdff1aSopenharmony_ci    } else {
446cabdff1aSopenharmony_ci        int i;
447cabdff1aSopenharmony_ci        for (i = 0;
448cabdff1aSopenharmony_ci             i < limit && get_bits1(gb) == 0 && get_bits_left(gb) > 0;
449cabdff1aSopenharmony_ci             i++);
450cabdff1aSopenharmony_ci
451cabdff1aSopenharmony_ci        if (i < limit - 1) {
452cabdff1aSopenharmony_ci            buf = get_bits_long(gb, k);
453cabdff1aSopenharmony_ci
454cabdff1aSopenharmony_ci            return buf + (i << k);
455cabdff1aSopenharmony_ci        } else if (i == limit - 1) {
456cabdff1aSopenharmony_ci            buf = get_bits_long(gb, esc_len);
457cabdff1aSopenharmony_ci
458cabdff1aSopenharmony_ci            return buf + 1;
459cabdff1aSopenharmony_ci        } else
460cabdff1aSopenharmony_ci            return -1;
461cabdff1aSopenharmony_ci    }
462cabdff1aSopenharmony_ci#else
463cabdff1aSopenharmony_ci    OPEN_READER(re, gb);
464cabdff1aSopenharmony_ci    UPDATE_CACHE(re, gb);
465cabdff1aSopenharmony_ci    buf = GET_CACHE(re, gb);
466cabdff1aSopenharmony_ci
467cabdff1aSopenharmony_ci    log = av_log2(buf);
468cabdff1aSopenharmony_ci
469cabdff1aSopenharmony_ci    av_assert2(k <= 31);
470cabdff1aSopenharmony_ci
471cabdff1aSopenharmony_ci    if (log - k >= 32 - MIN_CACHE_BITS + (MIN_CACHE_BITS == 32) &&
472cabdff1aSopenharmony_ci        32 - log < limit) {
473cabdff1aSopenharmony_ci        buf >>= log - k;
474cabdff1aSopenharmony_ci        buf  += (30U - log) << k;
475cabdff1aSopenharmony_ci        LAST_SKIP_BITS(re, gb, 32 + k - log);
476cabdff1aSopenharmony_ci        CLOSE_READER(re, gb);
477cabdff1aSopenharmony_ci
478cabdff1aSopenharmony_ci        return buf;
479cabdff1aSopenharmony_ci    } else {
480cabdff1aSopenharmony_ci        int i;
481cabdff1aSopenharmony_ci        for (i = 0; i + MIN_CACHE_BITS <= limit && SHOW_UBITS(re, gb, MIN_CACHE_BITS) == 0; i += MIN_CACHE_BITS) {
482cabdff1aSopenharmony_ci            if (gb->size_in_bits <= re_index) {
483cabdff1aSopenharmony_ci                CLOSE_READER(re, gb);
484cabdff1aSopenharmony_ci                return -1;
485cabdff1aSopenharmony_ci            }
486cabdff1aSopenharmony_ci            LAST_SKIP_BITS(re, gb, MIN_CACHE_BITS);
487cabdff1aSopenharmony_ci            UPDATE_CACHE(re, gb);
488cabdff1aSopenharmony_ci        }
489cabdff1aSopenharmony_ci        for (; i < limit && SHOW_UBITS(re, gb, 1) == 0; i++) {
490cabdff1aSopenharmony_ci            SKIP_BITS(re, gb, 1);
491cabdff1aSopenharmony_ci        }
492cabdff1aSopenharmony_ci        LAST_SKIP_BITS(re, gb, 1);
493cabdff1aSopenharmony_ci        UPDATE_CACHE(re, gb);
494cabdff1aSopenharmony_ci
495cabdff1aSopenharmony_ci        if (i < limit - 1) {
496cabdff1aSopenharmony_ci            if (k) {
497cabdff1aSopenharmony_ci                if (k > MIN_CACHE_BITS - 1) {
498cabdff1aSopenharmony_ci                    buf = SHOW_UBITS(re, gb, 16) << (k-16);
499cabdff1aSopenharmony_ci                    LAST_SKIP_BITS(re, gb, 16);
500cabdff1aSopenharmony_ci                    UPDATE_CACHE(re, gb);
501cabdff1aSopenharmony_ci                    buf |= SHOW_UBITS(re, gb, k-16);
502cabdff1aSopenharmony_ci                    LAST_SKIP_BITS(re, gb, k-16);
503cabdff1aSopenharmony_ci                } else {
504cabdff1aSopenharmony_ci                    buf = SHOW_UBITS(re, gb, k);
505cabdff1aSopenharmony_ci                    LAST_SKIP_BITS(re, gb, k);
506cabdff1aSopenharmony_ci                }
507cabdff1aSopenharmony_ci            } else {
508cabdff1aSopenharmony_ci                buf = 0;
509cabdff1aSopenharmony_ci            }
510cabdff1aSopenharmony_ci
511cabdff1aSopenharmony_ci            buf += ((SUINT)i << k);
512cabdff1aSopenharmony_ci        } else if (i == limit - 1) {
513cabdff1aSopenharmony_ci            buf = SHOW_UBITS(re, gb, esc_len);
514cabdff1aSopenharmony_ci            LAST_SKIP_BITS(re, gb, esc_len);
515cabdff1aSopenharmony_ci
516cabdff1aSopenharmony_ci            buf ++;
517cabdff1aSopenharmony_ci        } else {
518cabdff1aSopenharmony_ci            buf = -1;
519cabdff1aSopenharmony_ci        }
520cabdff1aSopenharmony_ci        CLOSE_READER(re, gb);
521cabdff1aSopenharmony_ci        return buf;
522cabdff1aSopenharmony_ci    }
523cabdff1aSopenharmony_ci#endif
524cabdff1aSopenharmony_ci}
525cabdff1aSopenharmony_ci
526cabdff1aSopenharmony_ci/**
527cabdff1aSopenharmony_ci * read signed golomb rice code (ffv1).
528cabdff1aSopenharmony_ci */
529cabdff1aSopenharmony_cistatic inline int get_sr_golomb(GetBitContext *gb, int k, int limit,
530cabdff1aSopenharmony_ci                                int esc_len)
531cabdff1aSopenharmony_ci{
532cabdff1aSopenharmony_ci    unsigned v = get_ur_golomb(gb, k, limit, esc_len);
533cabdff1aSopenharmony_ci    return (v >> 1) ^ -(v & 1);
534cabdff1aSopenharmony_ci}
535cabdff1aSopenharmony_ci
536cabdff1aSopenharmony_ci/**
537cabdff1aSopenharmony_ci * read signed golomb rice code (flac).
538cabdff1aSopenharmony_ci */
539cabdff1aSopenharmony_cistatic inline int get_sr_golomb_flac(GetBitContext *gb, int k, int limit,
540cabdff1aSopenharmony_ci                                     int esc_len)
541cabdff1aSopenharmony_ci{
542cabdff1aSopenharmony_ci    unsigned v = get_ur_golomb_jpegls(gb, k, limit, esc_len);
543cabdff1aSopenharmony_ci    return (v >> 1) ^ -(v & 1);
544cabdff1aSopenharmony_ci}
545cabdff1aSopenharmony_ci
546cabdff1aSopenharmony_ci/**
547cabdff1aSopenharmony_ci * read unsigned golomb rice code (shorten).
548cabdff1aSopenharmony_ci */
549cabdff1aSopenharmony_cistatic inline unsigned int get_ur_golomb_shorten(GetBitContext *gb, int k)
550cabdff1aSopenharmony_ci{
551cabdff1aSopenharmony_ci    return get_ur_golomb_jpegls(gb, k, INT_MAX, 0);
552cabdff1aSopenharmony_ci}
553cabdff1aSopenharmony_ci
554cabdff1aSopenharmony_ci/**
555cabdff1aSopenharmony_ci * read signed golomb rice code (shorten).
556cabdff1aSopenharmony_ci */
557cabdff1aSopenharmony_cistatic inline int get_sr_golomb_shorten(GetBitContext *gb, int k)
558cabdff1aSopenharmony_ci{
559cabdff1aSopenharmony_ci    int uvar = get_ur_golomb_jpegls(gb, k + 1, INT_MAX, 0);
560cabdff1aSopenharmony_ci    return (uvar >> 1) ^ -(uvar & 1);
561cabdff1aSopenharmony_ci}
562cabdff1aSopenharmony_ci
563cabdff1aSopenharmony_ci#ifdef TRACE
564cabdff1aSopenharmony_ci
565cabdff1aSopenharmony_cistatic inline int get_ue(GetBitContext *s, const char *file, const char *func,
566cabdff1aSopenharmony_ci                         int line)
567cabdff1aSopenharmony_ci{
568cabdff1aSopenharmony_ci    int show = show_bits(s, 24);
569cabdff1aSopenharmony_ci    int pos  = get_bits_count(s);
570cabdff1aSopenharmony_ci    int i    = get_ue_golomb(s);
571cabdff1aSopenharmony_ci    int len  = get_bits_count(s) - pos;
572cabdff1aSopenharmony_ci    int bits = show >> (24 - len);
573cabdff1aSopenharmony_ci
574cabdff1aSopenharmony_ci    av_log(NULL, AV_LOG_DEBUG, "%5d %2d %3d ue  @%5d in %s %s:%d\n",
575cabdff1aSopenharmony_ci           bits, len, i, pos, file, func, line);
576cabdff1aSopenharmony_ci
577cabdff1aSopenharmony_ci    return i;
578cabdff1aSopenharmony_ci}
579cabdff1aSopenharmony_ci
580cabdff1aSopenharmony_cistatic inline int get_se(GetBitContext *s, const char *file, const char *func,
581cabdff1aSopenharmony_ci                         int line)
582cabdff1aSopenharmony_ci{
583cabdff1aSopenharmony_ci    int show = show_bits(s, 24);
584cabdff1aSopenharmony_ci    int pos  = get_bits_count(s);
585cabdff1aSopenharmony_ci    int i    = get_se_golomb(s);
586cabdff1aSopenharmony_ci    int len  = get_bits_count(s) - pos;
587cabdff1aSopenharmony_ci    int bits = show >> (24 - len);
588cabdff1aSopenharmony_ci
589cabdff1aSopenharmony_ci    av_log(NULL, AV_LOG_DEBUG, "%5d %2d %3d se  @%5d in %s %s:%d\n",
590cabdff1aSopenharmony_ci           bits, len, i, pos, file, func, line);
591cabdff1aSopenharmony_ci
592cabdff1aSopenharmony_ci    return i;
593cabdff1aSopenharmony_ci}
594cabdff1aSopenharmony_ci
595cabdff1aSopenharmony_cistatic inline int get_te(GetBitContext *s, int r, char *file, const char *func,
596cabdff1aSopenharmony_ci                         int line)
597cabdff1aSopenharmony_ci{
598cabdff1aSopenharmony_ci    int show = show_bits(s, 24);
599cabdff1aSopenharmony_ci    int pos  = get_bits_count(s);
600cabdff1aSopenharmony_ci    int i    = get_te0_golomb(s, r);
601cabdff1aSopenharmony_ci    int len  = get_bits_count(s) - pos;
602cabdff1aSopenharmony_ci    int bits = show >> (24 - len);
603cabdff1aSopenharmony_ci
604cabdff1aSopenharmony_ci    av_log(NULL, AV_LOG_DEBUG, "%5d %2d %3d te  @%5d in %s %s:%d\n",
605cabdff1aSopenharmony_ci           bits, len, i, pos, file, func, line);
606cabdff1aSopenharmony_ci
607cabdff1aSopenharmony_ci    return i;
608cabdff1aSopenharmony_ci}
609cabdff1aSopenharmony_ci
610cabdff1aSopenharmony_ci#define get_ue_golomb(a) get_ue(a, __FILE__, __func__, __LINE__)
611cabdff1aSopenharmony_ci#define get_se_golomb(a) get_se(a, __FILE__, __func__, __LINE__)
612cabdff1aSopenharmony_ci#define get_te_golomb(a, r)  get_te(a, r, __FILE__, __func__, __LINE__)
613cabdff1aSopenharmony_ci#define get_te0_golomb(a, r) get_te(a, r, __FILE__, __func__, __LINE__)
614cabdff1aSopenharmony_ci
615cabdff1aSopenharmony_ci#endif /* TRACE */
616cabdff1aSopenharmony_ci#endif /* AVCODEC_GOLOMB_H */
617