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