1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * Siren audio decoder 3cabdff1aSopenharmony_ci * Copyright (c) 2012 Youness Alaoui <kakaroto@kakaroto.homelinux.net> 4cabdff1aSopenharmony_ci * Copyright (c) 2018 Paul B Mahol 5cabdff1aSopenharmony_ci * Copyright (c) 2019 Lynne <dev@lynne.ee> 6cabdff1aSopenharmony_ci * 7cabdff1aSopenharmony_ci * This file is part of FFmpeg. 8cabdff1aSopenharmony_ci * 9cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 10cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 11cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 12cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 13cabdff1aSopenharmony_ci * 14cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 15cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 16cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 17cabdff1aSopenharmony_ci * Lesser General Public License for more details. 18cabdff1aSopenharmony_ci * 19cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 20cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 21cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 22cabdff1aSopenharmony_ci */ 23cabdff1aSopenharmony_ci 24cabdff1aSopenharmony_ci#include "libavutil/channel_layout.h" 25cabdff1aSopenharmony_ci#include "libavutil/tx.h" 26cabdff1aSopenharmony_ci#include "libavutil/float_dsp.h" 27cabdff1aSopenharmony_ci#include "libavutil/mem_internal.h" 28cabdff1aSopenharmony_ci 29cabdff1aSopenharmony_ci#include "avcodec.h" 30cabdff1aSopenharmony_ci#include "codec_internal.h" 31cabdff1aSopenharmony_ci#include "get_bits.h" 32cabdff1aSopenharmony_ci#include "internal.h" 33cabdff1aSopenharmony_ci#include "mathops.h" 34cabdff1aSopenharmony_ci 35cabdff1aSopenharmony_cistatic const uint8_t index_table[8] = {4, 4, 3, 3, 2, 2, 1, 0}; 36cabdff1aSopenharmony_cistatic const uint8_t vector_dimension[8] = { 2, 2, 2, 4, 4, 5, 5, 1 }; 37cabdff1aSopenharmony_cistatic const uint8_t number_of_vectors[8] = { 10, 10, 10, 5, 5, 4, 4, 20 }; 38cabdff1aSopenharmony_cistatic const uint8_t expected_bits_table[8] = { 52, 47, 43, 37, 29, 22, 16, 0 }; 39cabdff1aSopenharmony_cistatic const int8_t differential_decoder_tree[27][24][2] = { 40cabdff1aSopenharmony_ci { 41cabdff1aSopenharmony_ci {1, 2}, {3, 4}, {5, 6}, {7, 8}, {9, 10}, {11, -12}, {-11, -10}, {-8, -9}, {-7, -6}, {-13, 12}, 42cabdff1aSopenharmony_ci {-5, -4}, {0, 13}, {-3, -14}, {-2, 14}, {-1, 15}, {-15, 16}, {-16, 17}, {-17, 18}, {19, 20}, 43cabdff1aSopenharmony_ci {21, 22}, {-18, -19}, {-20, -21}, {-22, -23}, {-32, -32} 44cabdff1aSopenharmony_ci }, 45cabdff1aSopenharmony_ci { 46cabdff1aSopenharmony_ci {1, 2}, {3, 4}, {5, 6}, {7, 8}, {-10, -9}, {-8, -11}, {-7, -6}, {9, -5}, {10, -12}, {-4, 11}, 47cabdff1aSopenharmony_ci {-13, -3}, {12, -2}, {13, -14}, {-1, 14}, {15, -15}, {0, 16}, {-16, 17}, {-17, 18}, {-18, 19}, 48cabdff1aSopenharmony_ci {20, 21},{22, -19}, {-20, -21}, {-22, -23}, {-32, -32} 49cabdff1aSopenharmony_ci }, 50cabdff1aSopenharmony_ci { 51cabdff1aSopenharmony_ci {1, 2}, {3, 4}, {5, 6}, {7, 8}, {9, 10}, {-12, 11}, {-11, -13}, {-10, -9}, {12, -14}, {-8, -7}, 52cabdff1aSopenharmony_ci {-15, -6}, {13, -5}, {-16, -4}, {14, -17}, {15, -3}, {16, -18}, {-2, 17}, {18, -19}, {-1, 19}, 53cabdff1aSopenharmony_ci {-20, 20}, {0, 21}, {22, -21}, {-22, -23}, {-32, -32} 54cabdff1aSopenharmony_ci }, 55cabdff1aSopenharmony_ci { 56cabdff1aSopenharmony_ci {1, 2}, {3, 4}, {5, 6}, {-11, -10}, {7, -12}, {8, -9}, {9, -13}, {-14, 10}, {-8, -15}, {-16, 11}, 57cabdff1aSopenharmony_ci {-7, 12}, {-17, -6}, {13, 14}, {-18, 15}, {-5, -4}, {16, 17}, {-3, -2}, {-19, 18}, {-1, 19}, 58cabdff1aSopenharmony_ci {-20, 20}, {21, 22}, {0, -21}, {-22, -23}, {-32, -32} 59cabdff1aSopenharmony_ci }, 60cabdff1aSopenharmony_ci { 61cabdff1aSopenharmony_ci {1, 2}, {3, 4}, {5, 6}, {-12, -11}, {-13, 7}, {8, -14}, {-10, 9}, {10, -15}, {-9, 11}, {-8, 12}, 62cabdff1aSopenharmony_ci {-16, 13}, {-7, -6}, {-17, 14}, {-5, -18}, {15, -4}, {16, -19}, {17, -3}, {-20, 18}, {-2, 19}, 63cabdff1aSopenharmony_ci {-21, 20}, {0, 21}, {22, -1}, {-22, -23}, {-32, -32} 64cabdff1aSopenharmony_ci }, 65cabdff1aSopenharmony_ci { 66cabdff1aSopenharmony_ci {1, 2}, {3, 4}, {5, 6}, {-11, 7}, {-12, -10}, {-13, -9}, {8, 9}, {-14, -8}, {10, -15}, {-7, 11}, 67cabdff1aSopenharmony_ci {-16, 12}, {-6, -17}, {13, 14}, {-5, 15}, {-18, 16}, {-4, 17}, {-3, -19}, {18, -2}, {-20, 19}, 68cabdff1aSopenharmony_ci {-1, 20}, {0, 21}, {22, -21}, {-22, -23}, {-32, -32} 69cabdff1aSopenharmony_ci }, 70cabdff1aSopenharmony_ci { 71cabdff1aSopenharmony_ci {1, 2}, {3, 4}, {5, -12}, {6, -11}, {-10, -13}, {-9, 7}, {8, -14}, {9, -8}, {-15, 10}, {-7, -16}, 72cabdff1aSopenharmony_ci {11, -6}, {12, -17}, {13, -5}, {-18, 14}, {15, -4}, {-19, 16}, {17, -3}, {-20, 18}, {19, 20}, 73cabdff1aSopenharmony_ci {21, 22}, {0, -2}, {-1, -21}, {-22, -23}, {-32, -32} 74cabdff1aSopenharmony_ci }, 75cabdff1aSopenharmony_ci { 76cabdff1aSopenharmony_ci {1, 2}, {3, 4}, {5, -12}, {6, -13}, {-11, -10}, {7, -14}, {8, -9}, {9, -15}, {-8, 10}, {-7, -16}, 77cabdff1aSopenharmony_ci {11, 12}, {-6, -17}, {-5, 13}, {14, 15}, {-18, -4}, {-19, 16}, {-3, 17}, {18, -2}, {-20, 19}, 78cabdff1aSopenharmony_ci {20, 21}, {22, 0}, {-1, -21}, {-22, -23}, {-32, -32} 79cabdff1aSopenharmony_ci }, 80cabdff1aSopenharmony_ci { 81cabdff1aSopenharmony_ci {1, 2}, {3, 4}, {5, 6}, {-11, -10}, {-12, -9}, {7, 8}, {-13, -8}, {9, -14}, {-7, 10}, {-6, -15}, 82cabdff1aSopenharmony_ci {11, 12}, {-5, -16}, {13, 14}, {-17, 15}, {-4, 16}, {17, -18}, {18, -3}, {-2, 19}, {-1, 0}, 83cabdff1aSopenharmony_ci {-19, 20}, {-20, 21}, {22, -21}, {-22, -23}, {-32, -32} 84cabdff1aSopenharmony_ci }, 85cabdff1aSopenharmony_ci { 86cabdff1aSopenharmony_ci {1, 2}, {3, 4}, {5, 6}, {-11, 7}, {-10, -12}, {-9, 8}, {-8, -13}, {9, -7}, {10, -14}, {-6, 11}, 87cabdff1aSopenharmony_ci {-15, 12}, {-5, 13}, {-16, -4}, {14, 15}, {-17, -3}, {-18, 16}, {17, -19}, {-2, 18}, {-20, 19}, 88cabdff1aSopenharmony_ci {-1, 20}, {21, 22}, {0, -21}, {-22, -23}, {-32, -32} 89cabdff1aSopenharmony_ci }, 90cabdff1aSopenharmony_ci { 91cabdff1aSopenharmony_ci {1, 2}, {3, 4}, {5, -12}, {6, -11}, {7, 8}, {-10, -13}, {-9, 9}, {-8, -14}, {10, -7}, {11, -15}, 92cabdff1aSopenharmony_ci {-6, 12}, {-5, 13}, {-4, -16}, {14, 15}, {-3, -17}, {16, 17}, {-18, -2}, {18, -19}, {-1, 19}, 93cabdff1aSopenharmony_ci {-20, 20}, {-21, 21}, {22, 0}, {-22, -23}, {-32, -32} 94cabdff1aSopenharmony_ci }, 95cabdff1aSopenharmony_ci { 96cabdff1aSopenharmony_ci {1, 2}, {3, 4}, {5, -12}, {-13, 6}, {-11, 7}, {-14, 8}, {-10, 9}, {-15, -9}, {-8, 10}, {-7, -16}, 97cabdff1aSopenharmony_ci {11, -6}, {12, -5}, {-17, 13}, {14, -18}, {15, -4}, {16, -19}, {17, -3}, {18, -2}, {19, -1}, 98cabdff1aSopenharmony_ci {-20, 20}, {21, 22}, {0, -21}, {-22, -23}, {-32, -32} 99cabdff1aSopenharmony_ci }, 100cabdff1aSopenharmony_ci { 101cabdff1aSopenharmony_ci {1, 2}, {3, 4}, {-12, 5}, {-11, -13}, {6, -14}, {-10, 7}, {8, -15}, {-9, 9}, {-16, 10}, {-8, -17}, 102cabdff1aSopenharmony_ci {11, 12}, {-7, -18}, {-6, 13}, {14, -5}, {15, -19}, {-4, 16}, {-20, 17}, {18, 19}, {20, 21}, 103cabdff1aSopenharmony_ci {22, 0}, {-1, -3}, {-2, -21}, {-22, -23}, {-32, -32} 104cabdff1aSopenharmony_ci }, 105cabdff1aSopenharmony_ci { 106cabdff1aSopenharmony_ci {1, 2}, {3, 4}, {-12, 5}, {-11, -13}, {6, -14}, {-10, 7}, {8, -15}, {-9, 9}, {-16, 10}, {-8, -17}, 107cabdff1aSopenharmony_ci {11, 12}, {-7, -18}, {-6, 13}, {14, -5}, {15, -19}, {-4, 16}, {-20, 17}, {18, 19}, {20, 21}, 108cabdff1aSopenharmony_ci {22, 0}, {-1, -3}, {-2, -21}, {-22, -23}, {-32, -32} 109cabdff1aSopenharmony_ci }, 110cabdff1aSopenharmony_ci { 111cabdff1aSopenharmony_ci {1, 2}, {3, 4}, {-12, 5}, {-11, -13}, {6, -14}, {-10, 7}, {8, -15}, {-9, 9}, {-16, 10}, {-8, -17}, 112cabdff1aSopenharmony_ci {11, 12}, {-7, -18}, {-6, 13}, {14, -5}, {15, -19}, {-4, 16}, {-20, 17}, {18, 19}, {20, 21}, 113cabdff1aSopenharmony_ci {22, 0}, {-1, -3}, {-2, -21}, {-22, -23}, {-32, -32} 114cabdff1aSopenharmony_ci }, 115cabdff1aSopenharmony_ci { 116cabdff1aSopenharmony_ci {1, 2}, {3, 4}, {-12, 5}, {-11, -13}, {6, -14}, {-10, 7}, {8, -15}, {-9, 9}, {-16, 10}, {-8, -17}, 117cabdff1aSopenharmony_ci {11, 12}, {-7, -18}, {-6, 13}, {14, -5}, {15, -19}, {-4, 16}, {-20, 17}, {18, 19}, {20, 21}, 118cabdff1aSopenharmony_ci {22, 0}, {-1, -3}, {-2, -21}, {-22, -23}, {-32, -32} 119cabdff1aSopenharmony_ci }, 120cabdff1aSopenharmony_ci { 121cabdff1aSopenharmony_ci {1, 2}, {3, 4}, {-12, 5}, {-11, -13}, {6, -14}, {-10, 7}, {8, -15}, {-9, 9}, {-16, 10}, {-8, -17}, 122cabdff1aSopenharmony_ci {11, 12}, {-7, -18}, {-6, 13}, {14, -5}, {15, -19}, {-4, 16}, {-20, 17}, {18, 19}, {20, 21}, 123cabdff1aSopenharmony_ci {22, 0}, {-1, -3}, {-2, -21}, {-22, -23}, {-32, -32} 124cabdff1aSopenharmony_ci }, 125cabdff1aSopenharmony_ci { 126cabdff1aSopenharmony_ci {1, 2}, {3, 4}, {-12, 5}, {-11, -13}, {6, -14}, {-10, 7}, {8, -15}, {-9, 9}, {-16, 10}, {-8, -17}, 127cabdff1aSopenharmony_ci {11, 12}, {-7, -18}, {-6, 13}, {14, -5}, {15, -19}, {-4, 16}, {-20, 17}, {18, 19}, {20, 21}, 128cabdff1aSopenharmony_ci {22, 0}, {-1, -3}, {-2, -21}, {-22, -23}, {-32, -32} 129cabdff1aSopenharmony_ci }, 130cabdff1aSopenharmony_ci { 131cabdff1aSopenharmony_ci {1, 2}, {3, 4}, {-12, 5}, {-11, -13}, {6, -14}, {-10, 7}, {8, -15}, {-9, 9}, {-16, 10}, {-8, -17}, 132cabdff1aSopenharmony_ci {11, 12}, {-7, -18}, {-6, 13}, {14, -5}, {15, -19}, {-4, 16}, {-20, 17}, {18, 19}, {20, 21}, 133cabdff1aSopenharmony_ci {22, 0}, {-1, -3}, {-2, -21}, {-22, -23}, {-32, -32} 134cabdff1aSopenharmony_ci }, 135cabdff1aSopenharmony_ci { 136cabdff1aSopenharmony_ci {1, 2}, {3, 4}, {-12, 5}, {-11, -13}, {6, -14}, {-10, 7}, {8, -15}, {-9, 9}, {-16, 10}, {-8, -17}, 137cabdff1aSopenharmony_ci {11, 12}, {-7, -18}, {-6, 13}, {14, -5}, {15, -19}, {-4, 16}, {-20, 17}, {18, 19}, {20, 21}, 138cabdff1aSopenharmony_ci {22, 0}, {-1, -3}, {-2, -21}, {-22, -23}, {-32, -32} 139cabdff1aSopenharmony_ci }, 140cabdff1aSopenharmony_ci { 141cabdff1aSopenharmony_ci {1, 2}, {3, 4}, {-12, 5}, {-11, -13}, {6, -14}, {-10, 7}, {8, -15}, {-9, 9}, {-16, 10}, {-8, -17}, 142cabdff1aSopenharmony_ci {11, 12}, {-7, -18}, {-6, 13}, {14, -5}, {15, -19}, {-4, 16}, {-20, 17}, {18, 19}, {20, 21}, 143cabdff1aSopenharmony_ci {22, 0}, {-1, -3}, {-2, -21}, {-22, -23}, {-32, -32} 144cabdff1aSopenharmony_ci }, 145cabdff1aSopenharmony_ci { 146cabdff1aSopenharmony_ci {1, 2}, {3, 4}, {-12, 5}, {-11, -13}, {6, -14}, {-10, 7}, {8, -15}, {-9, 9}, {-16, 10}, {-8, -17}, 147cabdff1aSopenharmony_ci {11, 12}, {-7, -18}, {-6, 13}, {14, -5}, {15, -19}, {-4, 16}, {-20, 17}, {18, 19}, {20, 21}, 148cabdff1aSopenharmony_ci {22, 0}, {-1, -3}, {-2, -21}, {-22, -23}, {-32, -32} 149cabdff1aSopenharmony_ci }, 150cabdff1aSopenharmony_ci { 151cabdff1aSopenharmony_ci {1, 2}, {3, 4}, {-12, 5}, {-11, -13}, {6, -14}, {-10, 7}, {8, -15}, {-9, 9}, {-16, 10}, {-8, -17}, 152cabdff1aSopenharmony_ci {11, 12}, {-7, -18}, {-6, 13}, {14, -5}, {15, -19}, {-4, 16}, {-20, 17}, {18, 19}, {20, 21}, 153cabdff1aSopenharmony_ci {22, 0}, {-1, -3}, {-2, -21}, {-22, -23}, {-32, -32} 154cabdff1aSopenharmony_ci }, 155cabdff1aSopenharmony_ci { 156cabdff1aSopenharmony_ci {1, 2}, {3, 4}, {-12, 5}, {-11, -13}, {6, -14}, {-10, 7}, {8, -15}, {-9, 9}, {-16, 10}, {-8, -17}, 157cabdff1aSopenharmony_ci {11, 12}, {-7, -18}, {-6, 13}, {14, -5}, {15, -19}, {-4, 16}, {-20, 17}, {18, 19}, {20, 21}, 158cabdff1aSopenharmony_ci {22, 0}, {-1, -3}, {-2, -21}, {-22, -23}, {-32, -32} 159cabdff1aSopenharmony_ci }, 160cabdff1aSopenharmony_ci { 161cabdff1aSopenharmony_ci {1, 2}, {3, 4}, {-12, 5}, {-11, -13}, {6, -14}, {-10, 7}, {8, -15}, {-9, 9}, {-16, 10}, {-8, -17}, 162cabdff1aSopenharmony_ci {11, 12}, {-7, -18}, {-6, 13}, {14, -5}, {15, -19}, {-4, 16}, {-20, 17}, {18, 19}, {20, 21}, 163cabdff1aSopenharmony_ci {22, 0}, {-1, -3}, {-2, -21}, {-22, -23}, {-32, -32} 164cabdff1aSopenharmony_ci }, 165cabdff1aSopenharmony_ci { 166cabdff1aSopenharmony_ci {1, 2}, {3, 4}, {-12, 5}, {-11, -13}, {6, -14}, {-10, 7}, {8, -15}, {-9, 9}, {-16, 10}, {-8, -17}, 167cabdff1aSopenharmony_ci {11, 12}, {-7, -18}, {-6, 13}, {14, -5}, {15, -19}, {-4, 16}, {-20, 17}, {18, 19}, {20, 21}, 168cabdff1aSopenharmony_ci {22, 0}, {-1, -3}, {-2, -21}, {-22, -23}, {-32, -32} 169cabdff1aSopenharmony_ci }, 170cabdff1aSopenharmony_ci { 171cabdff1aSopenharmony_ci {1, 2}, {3, 4}, {-12, 5}, {-11, -13}, {6, -14}, {-10, 7}, {8, -15}, {-9, 9}, {-16, 10}, {-8, -17}, 172cabdff1aSopenharmony_ci {11, 12}, {-7, -18}, {-6, 13}, {14, -5}, {15, -19}, {-4, 16}, {-20, 17}, {18, 19}, {20, 21}, 173cabdff1aSopenharmony_ci {22, 0}, {-1, -3}, {-2, -21}, {-22, -23}, {-32, -32} 174cabdff1aSopenharmony_ci }, 175cabdff1aSopenharmony_ci}; 176cabdff1aSopenharmony_ci 177cabdff1aSopenharmony_cistatic const uint16_t decoder_tree0[360] = { 178cabdff1aSopenharmony_ci 2, 1, 4, 6, 8, 10, 12, 14, 16, 18, 33, 3, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 35, 40, 179cabdff1aSopenharmony_ci 42, 44, 46, 5, 48, 65, 50, 52, 54, 56, 58, 60, 62, 64, 37, 66, 67, 68, 97, 70, 72, 74, 7, 180cabdff1aSopenharmony_ci 76, 78, 80, 82, 84, 86, 88, 99, 90, 39, 92, 94, 96, 129, 98, 9, 100, 102, 104, 106, 108, 181cabdff1aSopenharmony_ci 110, 112, 41, 161, 69, 114, 116, 118, 131, 120, 122, 11, 124, 126, 128, 193, 130, 132, 71, 182cabdff1aSopenharmony_ci 134, 43, 136, 138, 140, 163, 101, 13, 142, 144, 146, 148, 150, 152, 154, 225, 156, 158, 195, 183cabdff1aSopenharmony_ci 160, 162, 45, 164, 15, 166, 73, 168, 170, 133, 47, 172, 257, 174, 176, 178, 75, 103, 180, 165, 184cabdff1aSopenharmony_ci 182, 17, 227, 184, 105, 49, 135, 186, 289, 188, 259, 190, 192, 194, 196, 198, 291, 77, 200, 185cabdff1aSopenharmony_ci 202, 197, 107, 204, 19, 51, 229, 206, 167, 208, 210, 212, 214, 21, 79, 81, 109, 216, 218, 220, 186cabdff1aSopenharmony_ci 222, 53, 137, 224, 199, 226, 323, 321, 169, 228, 111, 230, 232, 139, 261, 234, 83, 236, 201, 187cabdff1aSopenharmony_ci 238, 240, 293, 242, 353, 231, 141, 244, 246, 113, 23, 355, 85, 248, 55, 115, 250, 263, 252, 188cabdff1aSopenharmony_ci 254, 203, 171, 256, 258, 233, 235, 143, 357, 325, 260, 295, 262, 173, 145, 177, 87, 264, 327, 189cabdff1aSopenharmony_ci 267, 266, 268, 175, 270, 272, 117, 297, 274, 265, 147, 179, 205, 276, 207, 237, 269, 278, 57, 190cabdff1aSopenharmony_ci 59, 387, 209, 280, 282, 149, 329, 385, 284, 25, 286, 239, 119, 288, 27, 290, 292, 299, 294, 359, 191cabdff1aSopenharmony_ci 89, 296, 298, 419, 181, 300, 331, 271, 417, 211, 361, 151, 389, 241, 302, 304, 303, 306, 308, 192cabdff1aSopenharmony_ci 421, 91, 310, 312, 391, 314, 121, 316, 333, 318, 275, 213, 301, 243, 183, 335, 320, 363, 322, 193cabdff1aSopenharmony_ci 215, 324, 393, 273, 337, 153, 326, 423, 365, 328, 367, 247, 395, 185, 123, 330, 425, 245, 155, 194cabdff1aSopenharmony_ci 332, 334, 305, 397, 336, 277, 217, 338, 340, 339, 427, 342, 344, 346, 307, 399, 187, 348, 309, 195cabdff1aSopenharmony_ci 341, 350, 369, 279, 311, 429, 249, 219, 352, 354, 356, 358, 431, 373, 401, 371, 313, 281, 433, 196cabdff1aSopenharmony_ci 343, 403, 251, 283 197cabdff1aSopenharmony_ci}; 198cabdff1aSopenharmony_ci 199cabdff1aSopenharmony_cistatic const uint16_t decoder_tree1[188] = { 200cabdff1aSopenharmony_ci 2, 1, 4, 6, 8, 10, 12, 14, 16, 3, 33, 18, 20, 22, 24, 26, 35, 28, 30, 32, 34, 36, 5, 65, 38, 40, 201cabdff1aSopenharmony_ci 37, 42, 44, 46, 67, 48, 50, 52, 54, 56, 58, 60, 7, 62, 39, 97, 64, 69, 66, 99, 68, 70, 72, 74, 76, 202cabdff1aSopenharmony_ci 78, 80, 129, 41, 131, 82, 9, 71, 84, 86, 101, 88, 90, 92, 94, 96, 161, 43, 11, 73, 98, 103, 100, 203cabdff1aSopenharmony_ci 163, 102, 104, 106, 108, 133, 110, 105, 112, 75, 114, 45, 13, 116, 165, 118, 195, 135, 193, 120, 77, 204cabdff1aSopenharmony_ci 122, 47, 124, 167, 225, 126, 79, 107, 227, 128, 137, 197, 15, 130, 169, 199, 132, 109, 134, 17, 139, 205cabdff1aSopenharmony_ci 49, 136, 229, 138, 140, 81, 259, 142, 144, 171, 146, 141, 148, 111, 150, 201, 231, 152, 51, 257, 289, 206cabdff1aSopenharmony_ci 154, 19, 113, 156, 261, 158, 203, 173, 263, 143, 160, 291, 235, 83, 162, 233, 265, 164, 205, 166, 293, 207cabdff1aSopenharmony_ci 145, 168, 175, 177, 237, 115, 295, 170, 207, 172, 267, 174, 176, 297, 147, 178, 180, 269, 182, 271, 208cabdff1aSopenharmony_ci 209, 299, 239, 179, 184, 301, 241, 211, 0, 0 209cabdff1aSopenharmony_ci}; 210cabdff1aSopenharmony_ci 211cabdff1aSopenharmony_cistatic const uint16_t decoder_tree2[96] = { 212cabdff1aSopenharmony_ci 2, 1, 4, 6, 8, 10, 12, 3, 17, 14, 19, 16, 18, 20, 22, 24, 26, 5, 21, 35, 33, 28, 30, 32, 34, 36, 38, 37, 213cabdff1aSopenharmony_ci 40, 23, 51, 42, 7, 49, 44, 46, 48, 50, 39, 53, 52, 54, 56, 25, 67, 9, 58, 60, 65, 55, 41, 62, 64, 69, 66, 214cabdff1aSopenharmony_ci 11, 27, 68, 57, 83, 70, 71, 81, 43, 72, 74, 13, 76, 85, 29, 73, 78, 99, 59, 87, 101, 80, 97, 45, 82, 84, 215cabdff1aSopenharmony_ci 75, 89, 61, 86, 103, 88, 77, 90, 105, 91, 92, 107, 93, 0, 0 216cabdff1aSopenharmony_ci}; 217cabdff1aSopenharmony_ci 218cabdff1aSopenharmony_cistatic const uint16_t decoder_tree3[1040] = { 219cabdff1aSopenharmony_ci 2, 4, 6, 8, 10, 1, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 3, 36, 1025, 38, 40, 42, 44, 46, 48, 50, 220cabdff1aSopenharmony_ci 129, 17, 52, 54, 1153, 19, 56, 58, 60, 62, 64, 66, 68, 145, 70, 72, 74, 76, 78, 1169, 1027, 147, 80, 82, 1171, 221cabdff1aSopenharmony_ci 84, 86, 131, 88, 1155, 1043, 1041, 90, 92, 5, 94, 96, 98, 100, 102, 104, 21, 106, 108, 2049, 2177, 110, 112, 114, 222cabdff1aSopenharmony_ci 116, 118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 33, 144, 163, 146, 148, 150, 152, 154, 161, 223cabdff1aSopenharmony_ci 156, 35, 158, 1297, 160, 162, 273, 257, 164, 166, 149, 168, 1281, 170, 172, 2193, 174, 176, 178, 1299, 180, 1045, 224cabdff1aSopenharmony_ci 182, 184, 1173, 186, 3201, 188, 190, 192, 194, 2195, 1187, 23, 2179, 196, 7, 198, 275, 200, 2051, 202, 2065, 204, 225cabdff1aSopenharmony_ci 206, 1029, 1185, 208, 210, 1157, 37, 3073, 2067, 133, 212, 214, 2321, 216, 165, 218, 1059, 220, 1283, 222, 2305, 226cabdff1aSopenharmony_ci 224, 226, 228, 230, 259, 232, 234, 2323, 236, 1409, 1057, 1315, 238, 240, 242, 244, 246, 1425, 248, 1313, 250, 252, 227cabdff1aSopenharmony_ci 254, 256, 258, 260, 289, 262, 264, 1189, 266, 268, 179, 151, 270, 272, 274, 276, 278, 291, 280, 282, 9, 385, 284, 228cabdff1aSopenharmony_ci 286, 177, 49, 401, 1061, 288, 290, 292, 51, 294, 296, 298, 300, 302, 304, 25, 306, 2083, 39, 308, 310, 3329, 167, 229cabdff1aSopenharmony_ci 312, 314, 1175, 316, 318, 1203, 135, 320, 322, 324, 326, 328, 2211, 2307, 330, 1301, 332, 334, 1047, 336, 338, 2449, 230cabdff1aSopenharmony_ci 3217, 340, 1427, 2209, 53, 342, 2339, 3345, 344, 346, 348, 403, 181, 4097, 2197, 350, 2181, 1285, 1317, 1031, 352, 231cabdff1aSopenharmony_ci 354, 356, 3089, 358, 360, 4225, 277, 362, 364, 366, 368, 2069, 370, 3203, 293, 1201, 305, 372, 3219, 307, 2433, 374, 232cabdff1aSopenharmony_ci 376, 378, 380, 2081, 1411, 382, 384, 3075, 1443, 513, 386, 387, 388, 390, 1331, 261, 392, 394, 396, 398, 400, 1441, 233cabdff1aSopenharmony_ci 1075, 67, 1159, 402, 404, 406, 408, 410, 412, 414, 3347, 2325, 416, 65, 418, 420, 422, 424, 426, 2053, 193, 1073, 428, 234cabdff1aSopenharmony_ci 430, 432, 1537, 1329, 2337, 2213, 434, 417, 183, 41, 436, 438, 440, 442, 444, 446, 448, 450, 195, 2435, 452, 2085, 1063, 235cabdff1aSopenharmony_ci 1191, 454, 456, 458, 460, 419, 2071, 1553, 3091, 55, 137, 462, 464, 466, 468, 470, 472, 474, 476, 478, 2309, 4113, 480, 236cabdff1aSopenharmony_ci 482, 484, 486, 2451, 2465, 1205, 153, 488, 490, 492, 494, 496, 498, 500, 502, 504, 506, 508, 510, 512, 514, 516, 518, 237cabdff1aSopenharmony_ci 520, 522, 524, 1333, 526, 1555, 2467, 2227, 3205, 3331, 528, 530, 532, 534, 536, 538, 540, 542, 544, 546, 548, 529, 309, 238cabdff1aSopenharmony_ci 1303, 3473, 3457, 389, 1569, 1445, 1077, 69, 2199, 1539, 4353, 550, 552, 554, 556, 558, 560, 562, 1459, 4241, 3221, 1429, 239cabdff1aSopenharmony_ci 2341, 279, 3475, 169, 564, 545, 3105, 323, 2353, 2097, 3235, 421, 2229, 3107, 3233, 566, 568, 570, 572, 574, 576, 578, 240cabdff1aSopenharmony_ci 580, 582, 584, 586, 588, 590, 592, 594, 596, 2099, 1091, 531, 2437, 4227, 405, 197, 263, 1287, 2577, 1049, 1571, 598, 600, 241cabdff1aSopenharmony_ci 602, 604, 606, 608, 610, 612, 614, 616, 618, 620, 622, 624, 626, 628, 630, 632, 634, 636, 638, 640, 642, 644, 646, 648, 650, 242cabdff1aSopenharmony_ci 1345, 1219, 3077, 1457, 2225, 2579, 515, 2561, 2469, 433, 1221, 2183, 4243, 652, 654, 656, 658, 660, 662, 664, 666, 668, 243cabdff1aSopenharmony_ci 670, 1217, 3333, 3093, 435, 321, 4369, 1089, 2055, 4099, 3361, 1319, 547, 1161, 1177, 672, 2355, 4115, 1413, 4257, 3349, 244cabdff1aSopenharmony_ci 2453, 3109, 2357, 2215, 3363, 1079, 1207, 311, 1033, 1347, 1065, 674, 676, 678, 680, 682, 684, 686, 688, 690, 692, 694, 696, 245cabdff1aSopenharmony_ci 698, 700, 702, 704, 706, 708, 710, 712, 714, 716, 718, 720, 722, 724, 726, 728, 730, 732, 734, 736, 738, 740, 742, 744, 746, 246cabdff1aSopenharmony_ci 748, 750, 752, 754, 756, 758, 760, 762, 764, 766, 768, 770, 772, 774, 776, 778, 780, 782, 784, 786, 788, 790, 792, 794, 796, 247cabdff1aSopenharmony_ci 798, 800, 802, 804, 806, 808, 810, 812, 814, 2593, 2565, 4261, 3253, 437, 325, 3489, 2311, 4259, 1431, 2087, 2563, 295, 2343, 248cabdff1aSopenharmony_ci 449, 199, 265, 2201, 4371, 1193, 816, 533, 1557, 2581, 2241, 3365, 3491, 3603, 549, 2101, 1461, 1093, 2117, 3459, 3079, 4481, 249cabdff1aSopenharmony_ci 3095, 2327, 3461, 4129, 3249, 1447, 2471, 2231, 71, 4497, 2609, 1289, 393, 3251, 2073, 3097, 2371, 1305, 2089, 818, 820, 822, 250cabdff1aSopenharmony_ci 824, 826, 828, 830, 832, 834, 836, 838, 840, 842, 844, 846, 848, 850, 852, 854, 856, 858, 860, 862, 864, 866, 868, 870, 872, 251cabdff1aSopenharmony_ci 874, 876, 878, 880, 882, 884, 886, 888, 890, 892, 894, 896, 898, 900, 902, 904, 906, 908, 910, 912, 914, 916, 918, 920, 922, 252cabdff1aSopenharmony_ci 924, 926, 928, 930, 932, 934, 936, 938, 940, 942, 944, 946, 948, 950, 952, 954, 956, 958, 960, 962, 964, 966, 968, 970, 972, 253cabdff1aSopenharmony_ci 974, 976, 978, 980, 982, 984, 986, 988, 990, 992, 994, 996, 998, 1000, 1002, 1004, 1006, 1008, 1010, 1012, 1014, 1016, 1018, 254cabdff1aSopenharmony_ci 1020, 1022, 1024, 1026, 1028, 1030, 1032, 1034, 1036, 4161, 4273, 3507, 3493, 4517, 2497, 1573, 2597, 3621, 4531, 4627, 3523, 255cabdff1aSopenharmony_ci 3125, 4149, 4529, 3139, 4515, 451, 4277, 2113, 4163, 4499, 3381, 4405, 1473, 4373, 2485, 3509, 565, 1589, 2613, 3585, 3123, 256cabdff1aSopenharmony_ci 4403, 3141, 4147, 563, 2245, 3269, 4357, 1349, 2373, 3397, 453, 1477, 2501, 2481, 579, 1601, 3477, 4103, 3265, 2243, 1587, 257cabdff1aSopenharmony_ci 3207, 4231, 3267, 4501, 1475, 3335, 4359, 391, 1415, 2439, 3463, 4487, 519, 1543, 2567, 3591, 4609, 4289, 4611, 2499, 4119, 258cabdff1aSopenharmony_ci 4385, 4145, 4401, 3223, 4247, 3379, 577, 3393, 3351, 4375, 407, 1585, 2455, 3479, 4503, 535, 1559, 2583, 3607, 3605, 4513, 259cabdff1aSopenharmony_ci 4485, 3111, 4135, 3121, 517, 3377, 3239, 4263, 1541, 4291, 4229, 3367, 4391, 423, 2115, 4131, 3495, 551, 1575, 2599, 3635, 3395, 260cabdff1aSopenharmony_ci 2103, 3127, 4151, 3589, 4101, 1603, 3255, 4279, 3601, 1335, 2359, 3383, 439, 1463, 2487, 3511, 567, 1591, 4133, 1095, 2119, 3143, 261cabdff1aSopenharmony_ci 2369, 1223, 2247, 3271, 327, 1351, 2375, 455, 1479, 3137, 3521, 2057, 3081, 4105, 4387, 3505, 2185, 3209, 4233, 3587, 4355, 2313, 262cabdff1aSopenharmony_ci 3337, 3237, 1417, 2441, 3465, 521, 1545, 3617, 3633, 561, 4625, 4121, 2611, 2483, 2595, 3225, 4249, 281, 4245, 2329, 3353, 409, 263cabdff1aSopenharmony_ci 1433, 2457, 3481, 537, 1561, 4483, 3619, 4389, 3113, 4275, 4117, 2217, 3241, 297, 1321, 2345, 3369, 425, 1449, 2473, 57, 1081, 264cabdff1aSopenharmony_ci 2105, 3129, 185, 1209, 2233, 3257, 313, 1337, 2361, 441, 1465, 73, 1097, 201, 1225, 0, 0 265cabdff1aSopenharmony_ci}; 266cabdff1aSopenharmony_ci 267cabdff1aSopenharmony_cistatic const uint16_t decoder_tree4[416] = { 268cabdff1aSopenharmony_ci 2, 4, 6, 1, 8, 10, 12, 14, 16, 18, 20, 22, 24, 3, 129, 26, 28, 9, 33, 30, 32, 269cabdff1aSopenharmony_ci 34, 36, 11, 161, 38, 40, 42, 41, 44, 46, 131, 43, 169, 35, 48, 137, 50, 52, 54, 56, 139, 270cabdff1aSopenharmony_ci 163, 171, 58, 60, 62, 64, 5, 66, 68, 70, 257, 72, 74, 76, 13, 78, 80, 289, 82, 84, 17, 271cabdff1aSopenharmony_ci 86, 88, 65, 90, 201, 19, 92, 94, 51, 193, 96, 98, 49, 100, 73, 102, 104, 106, 45, 108, 110, 272cabdff1aSopenharmony_ci 297, 112, 114, 116, 37, 203, 118, 120, 179, 122, 177, 124, 265, 126, 75, 133, 259, 291, 147, 128, 67, 273cabdff1aSopenharmony_ci 195, 130, 141, 173, 299, 132, 145, 134, 165, 136, 138, 140, 142, 7, 144, 146, 21, 267, 148, 53, 150, 274cabdff1aSopenharmony_ci 321, 152, 154, 15, 156, 81, 158, 160, 385, 162, 417, 164, 166, 168, 83, 170, 172, 329, 174, 211, 176, 275cabdff1aSopenharmony_ci 27, 178, 180, 182, 209, 184, 186, 188, 190, 25, 192, 331, 194, 196, 105, 57, 198, 97, 200, 202, 323, 276cabdff1aSopenharmony_ci 225, 59, 149, 204, 206, 233, 307, 208, 77, 181, 210, 212, 214, 216, 218, 220, 222, 47, 224, 226, 69, 277cabdff1aSopenharmony_ci 228, 230, 197, 232, 425, 393, 205, 275, 293, 39, 234, 236, 238, 305, 135, 155, 301, 143, 240, 242, 235, 278cabdff1aSopenharmony_ci 395, 244, 246, 248, 250, 252, 254, 256, 258, 260, 262, 273, 269, 185, 264, 266, 268, 270, 272, 274, 276, 279cabdff1aSopenharmony_ci 261, 153, 278, 280, 282, 187, 337, 387, 107, 284, 427, 227, 167, 419, 286, 288, 290, 292, 294, 296, 298, 280cabdff1aSopenharmony_ci 300, 302, 304, 306, 308, 310, 312, 314, 316, 318, 320, 322, 324, 326, 328, 330, 332, 334, 336, 338, 115, 281cabdff1aSopenharmony_ci 99, 85, 213, 29, 113, 23, 89, 241, 61, 449, 339, 175, 340, 342, 344, 346, 348, 350, 352, 354, 356, 282cabdff1aSopenharmony_ci 358, 360, 362, 364, 366, 368, 370, 372, 374, 376, 378, 380, 382, 384, 386, 388, 390, 392, 394, 396, 398, 283cabdff1aSopenharmony_ci 400, 402, 404, 406, 408, 410, 412, 414, 389, 361, 457, 465, 429, 451, 333, 109, 277, 243, 263, 295, 199, 284cabdff1aSopenharmony_ci 283, 151, 55, 183, 229, 357, 363, 123, 491, 397, 411, 251, 313, 441, 467, 345, 433, 461, 219, 237, 365, 285cabdff1aSopenharmony_ci 435, 353, 347, 405, 409, 217, 309, 437, 369, 371, 341, 117, 245, 249, 157, 285, 403, 189, 317, 93, 221, 286cabdff1aSopenharmony_ci 315, 401, 481, 391, 489, 121, 421, 423, 71, 483, 327, 103, 231, 443, 459, 271, 399, 355, 91, 303, 431, 287cabdff1aSopenharmony_ci 79, 207, 335, 111, 239, 281, 325, 279, 453, 101, 311, 87, 215, 31, 159, 63, 191 288cabdff1aSopenharmony_ci}; 289cabdff1aSopenharmony_ci 290cabdff1aSopenharmony_cistatic const uint16_t decoder_tree5[384] = { 291cabdff1aSopenharmony_ci 2, 4, 1, 6, 8, 10, 12, 14, 16, 18, 20, 22, 3, 513, 24, 26, 28, 9, 129, 33, 30, 32, 34, 36, 38, 40, 11, 42, 641, 44, 46, 41, 292cabdff1aSopenharmony_ci 161, 48, 515, 50, 52, 131, 54, 35, 545, 137, 56, 58, 60, 521, 62, 43, 673, 64, 169, 66, 68, 523, 70, 163, 643, 139, 553, 72, 649, 74, 547, 293cabdff1aSopenharmony_ci 76, 78, 80, 681, 171, 82, 84, 555, 86, 675, 88, 651, 5, 90, 92, 1025, 94, 96, 98, 683, 13, 294cabdff1aSopenharmony_ci 100, 17, 102, 104, 106, 65, 108, 110, 257, 112, 114, 1153, 19, 116, 118, 120, 122, 124, 49, 126, 128, 295cabdff1aSopenharmony_ci 769, 289, 130, 132, 134, 73, 136, 138, 140, 142, 193, 144, 146, 148, 150, 152, 154, 517, 156, 158, 37, 296cabdff1aSopenharmony_ci 51, 160, 201, 162, 145, 164, 166, 168, 133, 170, 801, 45, 172, 174, 1057, 176, 178, 67, 180, 1027, 577, 297cabdff1aSopenharmony_ci 182, 184, 186, 188, 190, 192, 194, 196, 198, 259, 200, 202, 204, 525, 177, 265, 141, 206, 208, 210, 212, 298cabdff1aSopenharmony_ci 195, 297, 214, 75, 216, 1033, 203, 585, 1155, 1185, 267, 1161, 549, 218, 220, 657, 777, 147, 222, 224, 226, 299cabdff1aSopenharmony_ci 228, 230, 232, 234, 236, 238, 240, 587, 645, 165, 242, 244, 246, 248, 250, 771, 291, 252, 579, 1065, 1035, 300cabdff1aSopenharmony_ci 705, 531, 529, 659, 173, 254, 561, 653, 256, 713, 677, 557, 258, 260, 262, 264, 266, 268, 270, 272, 274, 301cabdff1aSopenharmony_ci 276, 278, 280, 282, 284, 286, 288, 290, 292, 294, 296, 298, 300, 707, 1059, 809, 715, 563, 179, 691, 1193, 302cabdff1aSopenharmony_ci 21, 779, 1067, 299, 1187, 302, 304, 306, 308, 310, 312, 314, 316, 318, 320, 322, 324, 326, 328, 330, 332, 303cabdff1aSopenharmony_ci 334, 336, 338, 340, 342, 344, 346, 348, 350, 352, 354, 356, 358, 360, 362, 364, 366, 368, 370, 372, 374, 304cabdff1aSopenharmony_ci 376, 378, 380, 83, 69, 1281, 803, 321, 1195, 1163, 811, 1323, 689, 1321, 1099, 305, 835, 1227, 331, 843, 785, 305cabdff1aSopenharmony_ci 593, 1043, 1291, 1283, 1171, 275, 787, 1217, 833, 1075, 1313, 1219, 1203, 307, 819, 841, 595, 211, 723, 721, 817, 306cabdff1aSopenharmony_ci 1029, 329, 81, 1157, 261, 773, 1097, 1089, 1061, 1169, 1091, 1189, 293, 805, 1201, 581, 197, 709, 1289, 273, 1037, 307cabdff1aSopenharmony_ci 1315, 1041, 1165, 269, 781, 209, 1073, 1069, 323, 685, 1197, 301, 813, 77, 589, 205, 717, 1225, 533, 149, 661, 308cabdff1aSopenharmony_ci 53, 565, 181, 693, 0, 0 309cabdff1aSopenharmony_ci}; 310cabdff1aSopenharmony_ci 311cabdff1aSopenharmony_cistatic const uint16_t decoder_tree6[62] = { 312cabdff1aSopenharmony_ci 2, 1, 4, 6, 8, 10, 12, 14, 16, 3, 33, 5, 17, 9, 18, 20, 22, 24, 26, 28, 30, 32, 34, 7, 49, 13, 25, 36, 38, 11, 313cabdff1aSopenharmony_ci 21, 41, 35, 37, 19, 40, 42, 44, 46, 48, 50, 15, 52, 57, 29, 27, 23, 53, 54, 51, 39, 45, 43, 56, 58, 31, 55, 60, 314cabdff1aSopenharmony_ci 61, 47, 59, 63 315cabdff1aSopenharmony_ci}; 316cabdff1aSopenharmony_ci 317cabdff1aSopenharmony_cistatic const uint16_t *const decoder_tables[7] = { 318cabdff1aSopenharmony_ci decoder_tree0, 319cabdff1aSopenharmony_ci decoder_tree1, 320cabdff1aSopenharmony_ci decoder_tree2, 321cabdff1aSopenharmony_ci decoder_tree3, 322cabdff1aSopenharmony_ci decoder_tree4, 323cabdff1aSopenharmony_ci decoder_tree5, 324cabdff1aSopenharmony_ci decoder_tree6, 325cabdff1aSopenharmony_ci}; 326cabdff1aSopenharmony_ci 327cabdff1aSopenharmony_cistatic const int decoder_tables_elements[7] = { 328cabdff1aSopenharmony_ci FF_ARRAY_ELEMS(decoder_tree0), 329cabdff1aSopenharmony_ci FF_ARRAY_ELEMS(decoder_tree1), 330cabdff1aSopenharmony_ci FF_ARRAY_ELEMS(decoder_tree2), 331cabdff1aSopenharmony_ci FF_ARRAY_ELEMS(decoder_tree3), 332cabdff1aSopenharmony_ci FF_ARRAY_ELEMS(decoder_tree4), 333cabdff1aSopenharmony_ci FF_ARRAY_ELEMS(decoder_tree5), 334cabdff1aSopenharmony_ci FF_ARRAY_ELEMS(decoder_tree6), 335cabdff1aSopenharmony_ci}; 336cabdff1aSopenharmony_ci 337cabdff1aSopenharmony_cistatic const float mlt_quant[7][14] = { 338cabdff1aSopenharmony_ci { 0.0f, 0.392f, 0.761f, 1.120f, 1.477f, 1.832f, 2.183f, 2.541f, 2.893f, 3.245f, 3.598f, 3.942f, 4.288f, 4.724f }, 339cabdff1aSopenharmony_ci { 0.0f, 0.544f, 1.060f, 1.563f, 2.068f, 2.571f, 3.072f, 3.562f, 4.070f, 4.620f, 0.0f, 0.0f, 0.0f, 0.0f }, 340cabdff1aSopenharmony_ci { 0.0f, 0.746f, 1.464f, 2.180f, 2.882f, 3.584f, 4.316f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f }, 341cabdff1aSopenharmony_ci { 0.0f, 1.006f, 2.000f, 2.993f, 3.985f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f }, 342cabdff1aSopenharmony_ci { 0.0f, 1.321f, 2.703f, 3.983f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f }, 343cabdff1aSopenharmony_ci { 0.0f, 1.657f, 3.491f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f }, 344cabdff1aSopenharmony_ci { 0.0f, 1.964f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f } 345cabdff1aSopenharmony_ci}; 346cabdff1aSopenharmony_ci 347cabdff1aSopenharmony_cistatic const float noise_category5[21] = { 348cabdff1aSopenharmony_ci 0.70711f, 0.6179f, 0.5005f, 0.3220f, 0.17678f, 0.17678f, 0.17678f, 0.17678f, 0.17678f, 0.17678f, 0.17678f, 349cabdff1aSopenharmony_ci 0.17678f, 0.17678f, 0.17678f, 0.17678f, 0.17678f, 0.17678f, 0.17678f, 0.17678f, 0.17678f 350cabdff1aSopenharmony_ci}; 351cabdff1aSopenharmony_ci 352cabdff1aSopenharmony_cistatic const float noise_category6[21] = { 353cabdff1aSopenharmony_ci 0.70711f, 0.5686f, 0.3563f, 0.25f, 0.25f, 0.25f, 0.25f, 0.25f, 0.25f, 0.25f, 0.25f, 0.25f, 354cabdff1aSopenharmony_ci 0.25f, 0.25f, 0.25f, 0.25f, 0.25f, 0.25f, 0.25f, 0.25f 355cabdff1aSopenharmony_ci}; 356cabdff1aSopenharmony_ci 357cabdff1aSopenharmony_ci#define FRAME_SIZE 320 358cabdff1aSopenharmony_ci#define REGION_SIZE 20 359cabdff1aSopenharmony_ci 360cabdff1aSopenharmony_citypedef struct SirenContext { 361cabdff1aSopenharmony_ci GetBitContext gb; 362cabdff1aSopenharmony_ci 363cabdff1aSopenharmony_ci int microsoft; 364cabdff1aSopenharmony_ci int rate_control_possibilities; 365cabdff1aSopenharmony_ci int esf_adjustment; 366cabdff1aSopenharmony_ci int number_of_regions; 367cabdff1aSopenharmony_ci int scale_factor; 368cabdff1aSopenharmony_ci int sample_rate_bits; 369cabdff1aSopenharmony_ci int checksum_bits; 370cabdff1aSopenharmony_ci 371cabdff1aSopenharmony_ci unsigned dw1, dw2, dw3, dw4; 372cabdff1aSopenharmony_ci 373cabdff1aSopenharmony_ci int absolute_region_power_index[32]; 374cabdff1aSopenharmony_ci float decoder_standard_deviation[32]; 375cabdff1aSopenharmony_ci int power_categories[32]; 376cabdff1aSopenharmony_ci int category_balance[32]; 377cabdff1aSopenharmony_ci float standard_deviation[64]; 378cabdff1aSopenharmony_ci float backup_frame[FRAME_SIZE]; 379cabdff1aSopenharmony_ci 380cabdff1aSopenharmony_ci AVFloatDSPContext *fdsp; 381cabdff1aSopenharmony_ci av_tx_fn tx_fn; 382cabdff1aSopenharmony_ci AVTXContext *tx_ctx; 383cabdff1aSopenharmony_ci 384cabdff1aSopenharmony_ci DECLARE_ALIGNED(32, float, imdct_buf)[4][FRAME_SIZE]; 385cabdff1aSopenharmony_ci float *window; 386cabdff1aSopenharmony_ci float *imdct_in; 387cabdff1aSopenharmony_ci float *imdct_out; 388cabdff1aSopenharmony_ci float *imdct_prev; 389cabdff1aSopenharmony_ci} SirenContext; 390cabdff1aSopenharmony_ci 391cabdff1aSopenharmony_cistatic av_cold int siren_init(AVCodecContext *avctx) 392cabdff1aSopenharmony_ci{ 393cabdff1aSopenharmony_ci const float scale = 1.0f / (22.f * 32768.f); 394cabdff1aSopenharmony_ci SirenContext *s = avctx->priv_data; 395cabdff1aSopenharmony_ci int i; 396cabdff1aSopenharmony_ci 397cabdff1aSopenharmony_ci s->imdct_in = s->imdct_buf[0]; 398cabdff1aSopenharmony_ci s->imdct_out = s->imdct_buf[1]; 399cabdff1aSopenharmony_ci s->imdct_prev = s->imdct_buf[2]; 400cabdff1aSopenharmony_ci s->window = s->imdct_buf[3]; 401cabdff1aSopenharmony_ci 402cabdff1aSopenharmony_ci av_channel_layout_uninit(&avctx->ch_layout); 403cabdff1aSopenharmony_ci avctx->ch_layout = (AVChannelLayout)AV_CHANNEL_LAYOUT_MONO; 404cabdff1aSopenharmony_ci avctx->sample_fmt = AV_SAMPLE_FMT_FLT; 405cabdff1aSopenharmony_ci 406cabdff1aSopenharmony_ci s->rate_control_possibilities = 16; 407cabdff1aSopenharmony_ci s->esf_adjustment = 7; 408cabdff1aSopenharmony_ci s->number_of_regions = 14; 409cabdff1aSopenharmony_ci s->scale_factor = 22; 410cabdff1aSopenharmony_ci s->dw1 = s->dw2 = s->dw3 = s->dw4 = 1; 411cabdff1aSopenharmony_ci 412cabdff1aSopenharmony_ci for (i = 0; i < 64; i++) { 413cabdff1aSopenharmony_ci float region_power = powf(10, (i - 24) * 0.3010299957); 414cabdff1aSopenharmony_ci 415cabdff1aSopenharmony_ci s->standard_deviation[i] = sqrtf(region_power); 416cabdff1aSopenharmony_ci } 417cabdff1aSopenharmony_ci 418cabdff1aSopenharmony_ci for (i = 0; i < FRAME_SIZE; i++) { 419cabdff1aSopenharmony_ci float angle = ((i + 0.5f) * M_PI_2) / 320.f; 420cabdff1aSopenharmony_ci s->window[i] = sinf(angle); 421cabdff1aSopenharmony_ci } 422cabdff1aSopenharmony_ci 423cabdff1aSopenharmony_ci s->fdsp = avpriv_float_dsp_alloc(avctx->flags & AV_CODEC_FLAG_BITEXACT); 424cabdff1aSopenharmony_ci if (!s->fdsp) 425cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 426cabdff1aSopenharmony_ci 427cabdff1aSopenharmony_ci s->microsoft = avctx->codec->id == AV_CODEC_ID_MSNSIREN; 428cabdff1aSopenharmony_ci if (s->microsoft) { 429cabdff1aSopenharmony_ci s->esf_adjustment = -2; 430cabdff1aSopenharmony_ci s->number_of_regions = 14; 431cabdff1aSopenharmony_ci s->scale_factor = 1; 432cabdff1aSopenharmony_ci s->sample_rate_bits = 2; 433cabdff1aSopenharmony_ci s->checksum_bits = 4; 434cabdff1aSopenharmony_ci } 435cabdff1aSopenharmony_ci 436cabdff1aSopenharmony_ci return av_tx_init(&s->tx_ctx, &s->tx_fn, AV_TX_FLOAT_MDCT, 1, FRAME_SIZE, &scale, 0); 437cabdff1aSopenharmony_ci} 438cabdff1aSopenharmony_ci 439cabdff1aSopenharmony_cistatic int decode_envelope(SirenContext *s, GetBitContext *gb, 440cabdff1aSopenharmony_ci int number_of_regions, float *decoder_standard_deviation, 441cabdff1aSopenharmony_ci int *absolute_region_power_index, int esf_adjustment) 442cabdff1aSopenharmony_ci{ 443cabdff1aSopenharmony_ci absolute_region_power_index[0] = (int)get_bits(gb, 5) - esf_adjustment; 444cabdff1aSopenharmony_ci absolute_region_power_index[0] = av_clip(absolute_region_power_index[0], -24, 39); 445cabdff1aSopenharmony_ci decoder_standard_deviation[0] = s->standard_deviation[absolute_region_power_index[0] + 24]; 446cabdff1aSopenharmony_ci 447cabdff1aSopenharmony_ci for (int i = 1; i < number_of_regions; i++) { 448cabdff1aSopenharmony_ci int index = 0; 449cabdff1aSopenharmony_ci 450cabdff1aSopenharmony_ci do { 451cabdff1aSopenharmony_ci if (get_bits_left(gb) < 4 + number_of_regions - i + s->checksum_bits) 452cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 453cabdff1aSopenharmony_ci index = differential_decoder_tree[i - 1][index][get_bits1(gb)]; 454cabdff1aSopenharmony_ci } while (index > 0); 455cabdff1aSopenharmony_ci 456cabdff1aSopenharmony_ci absolute_region_power_index[i] = av_clip(absolute_region_power_index[i - 1] - index - 12, -24, 39); 457cabdff1aSopenharmony_ci decoder_standard_deviation[i] = s->standard_deviation[absolute_region_power_index[i] + 24]; 458cabdff1aSopenharmony_ci } 459cabdff1aSopenharmony_ci 460cabdff1aSopenharmony_ci return get_bits_count(gb); 461cabdff1aSopenharmony_ci} 462cabdff1aSopenharmony_ci 463cabdff1aSopenharmony_cistatic int categorize_regions(int number_of_regions, int number_of_available_bits, 464cabdff1aSopenharmony_ci int *absolute_region_power_index, int *power_categories, 465cabdff1aSopenharmony_ci int *category_balance) 466cabdff1aSopenharmony_ci{ 467cabdff1aSopenharmony_ci int region, delta, i, temp; 468cabdff1aSopenharmony_ci int expected_number_of_code_bits; 469cabdff1aSopenharmony_ci int min, max; 470cabdff1aSopenharmony_ci int offset, num_rate_control_possibilities = 16, 471cabdff1aSopenharmony_ci raw_value, raw_max_idx = 0, raw_min_idx = 0; 472cabdff1aSopenharmony_ci int max_rate_categories[28]; 473cabdff1aSopenharmony_ci int min_rate_categories[28]; 474cabdff1aSopenharmony_ci int temp_category_balances[64]; 475cabdff1aSopenharmony_ci int *min_rate_ptr = NULL; 476cabdff1aSopenharmony_ci int *max_rate_ptr = NULL; 477cabdff1aSopenharmony_ci 478cabdff1aSopenharmony_ci offset = -32; 479cabdff1aSopenharmony_ci for (delta = 32; number_of_regions > 0 && delta > 0; delta /= 2) { 480cabdff1aSopenharmony_ci expected_number_of_code_bits = 0; 481cabdff1aSopenharmony_ci for (region = 0; region < number_of_regions; region++) { 482cabdff1aSopenharmony_ci i = (delta + offset - 483cabdff1aSopenharmony_ci absolute_region_power_index[region]) >> 1; 484cabdff1aSopenharmony_ci i = av_clip_uintp2(i, 3); 485cabdff1aSopenharmony_ci power_categories[region] = i; 486cabdff1aSopenharmony_ci expected_number_of_code_bits += expected_bits_table[i]; 487cabdff1aSopenharmony_ci 488cabdff1aSopenharmony_ci } 489cabdff1aSopenharmony_ci if (expected_number_of_code_bits >= number_of_available_bits - 32) 490cabdff1aSopenharmony_ci offset += delta; 491cabdff1aSopenharmony_ci } 492cabdff1aSopenharmony_ci 493cabdff1aSopenharmony_ci expected_number_of_code_bits = 0; 494cabdff1aSopenharmony_ci for (region = 0; region < number_of_regions; region++) { 495cabdff1aSopenharmony_ci i = (offset - absolute_region_power_index[region]) >> 1; 496cabdff1aSopenharmony_ci i = av_clip_uintp2(i, 3); 497cabdff1aSopenharmony_ci max_rate_categories[region] = min_rate_categories[region] = 498cabdff1aSopenharmony_ci power_categories[region] = i; 499cabdff1aSopenharmony_ci expected_number_of_code_bits += expected_bits_table[i]; 500cabdff1aSopenharmony_ci } 501cabdff1aSopenharmony_ci 502cabdff1aSopenharmony_ci min = max = expected_number_of_code_bits; 503cabdff1aSopenharmony_ci min_rate_ptr = max_rate_ptr = 504cabdff1aSopenharmony_ci temp_category_balances + num_rate_control_possibilities; 505cabdff1aSopenharmony_ci for (i = 0; i < num_rate_control_possibilities - 1; i++) { 506cabdff1aSopenharmony_ci if (min + max > number_of_available_bits * 2) { 507cabdff1aSopenharmony_ci raw_value = -99; 508cabdff1aSopenharmony_ci for (region = number_of_regions - 1; region >= 0; region--) { 509cabdff1aSopenharmony_ci if (min_rate_categories[region] < 7) { 510cabdff1aSopenharmony_ci temp = 511cabdff1aSopenharmony_ci offset - absolute_region_power_index[region] - 512cabdff1aSopenharmony_ci 2 * min_rate_categories[region]; 513cabdff1aSopenharmony_ci if (temp > raw_value) { 514cabdff1aSopenharmony_ci raw_value = temp; 515cabdff1aSopenharmony_ci raw_min_idx = region; 516cabdff1aSopenharmony_ci } 517cabdff1aSopenharmony_ci } 518cabdff1aSopenharmony_ci } 519cabdff1aSopenharmony_ci if (raw_value == -99) 520cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 521cabdff1aSopenharmony_ci *min_rate_ptr++ = raw_min_idx; 522cabdff1aSopenharmony_ci min += 523cabdff1aSopenharmony_ci expected_bits_table[min_rate_categories[raw_min_idx] + 1] - 524cabdff1aSopenharmony_ci expected_bits_table[min_rate_categories[raw_min_idx]]; 525cabdff1aSopenharmony_ci min_rate_categories[raw_min_idx]++; 526cabdff1aSopenharmony_ci } else { 527cabdff1aSopenharmony_ci raw_value = 99; 528cabdff1aSopenharmony_ci for (region = 0; region < number_of_regions; region++) { 529cabdff1aSopenharmony_ci if (max_rate_categories[region] > 0) { 530cabdff1aSopenharmony_ci temp = 531cabdff1aSopenharmony_ci offset - absolute_region_power_index[region] - 532cabdff1aSopenharmony_ci 2 * max_rate_categories[region]; 533cabdff1aSopenharmony_ci if (temp < raw_value) { 534cabdff1aSopenharmony_ci raw_value = temp; 535cabdff1aSopenharmony_ci raw_max_idx = region; 536cabdff1aSopenharmony_ci } 537cabdff1aSopenharmony_ci } 538cabdff1aSopenharmony_ci } 539cabdff1aSopenharmony_ci if (raw_value == 99) 540cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 541cabdff1aSopenharmony_ci 542cabdff1aSopenharmony_ci *--max_rate_ptr = raw_max_idx; 543cabdff1aSopenharmony_ci max += expected_bits_table[max_rate_categories[raw_max_idx] - 1] - 544cabdff1aSopenharmony_ci expected_bits_table[max_rate_categories[raw_max_idx]]; 545cabdff1aSopenharmony_ci max_rate_categories[raw_max_idx]--; 546cabdff1aSopenharmony_ci } 547cabdff1aSopenharmony_ci } 548cabdff1aSopenharmony_ci 549cabdff1aSopenharmony_ci for (region = 0; region < number_of_regions; region++) 550cabdff1aSopenharmony_ci power_categories[region] = max_rate_categories[region]; 551cabdff1aSopenharmony_ci 552cabdff1aSopenharmony_ci for (i = 0; i < num_rate_control_possibilities - 1; i++) 553cabdff1aSopenharmony_ci category_balance[i] = *max_rate_ptr++; 554cabdff1aSopenharmony_ci 555cabdff1aSopenharmony_ci return 0; 556cabdff1aSopenharmony_ci} 557cabdff1aSopenharmony_ci 558cabdff1aSopenharmony_cistatic int get_dw(SirenContext *s) 559cabdff1aSopenharmony_ci{ 560cabdff1aSopenharmony_ci int ret = s->dw1 + s->dw4; 561cabdff1aSopenharmony_ci 562cabdff1aSopenharmony_ci if ((ret & 0x8000) != 0) 563cabdff1aSopenharmony_ci ret++; 564cabdff1aSopenharmony_ci 565cabdff1aSopenharmony_ci s->dw1 = s->dw2; 566cabdff1aSopenharmony_ci s->dw2 = s->dw3; 567cabdff1aSopenharmony_ci s->dw3 = s->dw4; 568cabdff1aSopenharmony_ci s->dw4 = ret; 569cabdff1aSopenharmony_ci 570cabdff1aSopenharmony_ci return ret; 571cabdff1aSopenharmony_ci} 572cabdff1aSopenharmony_ci 573cabdff1aSopenharmony_cistatic int decode_vector(SirenContext *s, int number_of_regions, 574cabdff1aSopenharmony_ci float *decoder_standard_deviation, 575cabdff1aSopenharmony_ci int *power_categories, float *coefs, int scale_factor) 576cabdff1aSopenharmony_ci{ 577cabdff1aSopenharmony_ci GetBitContext *gb = &s->gb; 578cabdff1aSopenharmony_ci float *coefs_ptr; 579cabdff1aSopenharmony_ci float decoded_value; 580cabdff1aSopenharmony_ci float noise; 581cabdff1aSopenharmony_ci const uint16_t *decoder_tree; 582cabdff1aSopenharmony_ci int region; 583cabdff1aSopenharmony_ci int category; 584cabdff1aSopenharmony_ci int i, j; 585cabdff1aSopenharmony_ci int index; 586cabdff1aSopenharmony_ci int error = 0; 587cabdff1aSopenharmony_ci int dw1; 588cabdff1aSopenharmony_ci int dw2; 589cabdff1aSopenharmony_ci 590cabdff1aSopenharmony_ci for (region = 0; region < number_of_regions; region++) { 591cabdff1aSopenharmony_ci category = power_categories[region]; 592cabdff1aSopenharmony_ci coefs_ptr = coefs + (region * REGION_SIZE); 593cabdff1aSopenharmony_ci 594cabdff1aSopenharmony_ci if (category >= 0 && category < 7) { 595cabdff1aSopenharmony_ci decoder_tree = decoder_tables[category]; 596cabdff1aSopenharmony_ci 597cabdff1aSopenharmony_ci for (i = 0; i < number_of_vectors[category]; i++) { 598cabdff1aSopenharmony_ci index = 0; 599cabdff1aSopenharmony_ci do { 600cabdff1aSopenharmony_ci if (get_bits_left(gb) - s->checksum_bits <= 0) { 601cabdff1aSopenharmony_ci error = 1; 602cabdff1aSopenharmony_ci break; 603cabdff1aSopenharmony_ci } 604cabdff1aSopenharmony_ci 605cabdff1aSopenharmony_ci if (index + show_bits1(gb) >= decoder_tables_elements[category]) { 606cabdff1aSopenharmony_ci error = 1; 607cabdff1aSopenharmony_ci break; 608cabdff1aSopenharmony_ci } 609cabdff1aSopenharmony_ci index = decoder_tree[index + get_bits1(gb)]; 610cabdff1aSopenharmony_ci } while ((index & 1) == 0); 611cabdff1aSopenharmony_ci 612cabdff1aSopenharmony_ci index >>= 1; 613cabdff1aSopenharmony_ci 614cabdff1aSopenharmony_ci if (error == 0) { 615cabdff1aSopenharmony_ci for (j = 0; j < vector_dimension[category]; j++) { 616cabdff1aSopenharmony_ci decoded_value = mlt_quant[category][index & ((1 << index_table[category]) - 1)]; 617cabdff1aSopenharmony_ci index >>= index_table[category]; 618cabdff1aSopenharmony_ci 619cabdff1aSopenharmony_ci if (decoded_value) { 620cabdff1aSopenharmony_ci if (get_bits_left(gb) - s->checksum_bits <= 0) { 621cabdff1aSopenharmony_ci error = 1; 622cabdff1aSopenharmony_ci break; 623cabdff1aSopenharmony_ci } 624cabdff1aSopenharmony_ci if (!get_bits1(gb)) 625cabdff1aSopenharmony_ci decoded_value *= -decoder_standard_deviation[region]; 626cabdff1aSopenharmony_ci else 627cabdff1aSopenharmony_ci decoded_value *= decoder_standard_deviation[region]; 628cabdff1aSopenharmony_ci } 629cabdff1aSopenharmony_ci 630cabdff1aSopenharmony_ci *coefs_ptr++ = decoded_value * scale_factor; 631cabdff1aSopenharmony_ci } 632cabdff1aSopenharmony_ci } else { 633cabdff1aSopenharmony_ci error = 1; 634cabdff1aSopenharmony_ci break; 635cabdff1aSopenharmony_ci } 636cabdff1aSopenharmony_ci } 637cabdff1aSopenharmony_ci 638cabdff1aSopenharmony_ci if (error == 1) { 639cabdff1aSopenharmony_ci for (j = region + 1; j < number_of_regions; j++) 640cabdff1aSopenharmony_ci power_categories[j] = 7; 641cabdff1aSopenharmony_ci category = 7; 642cabdff1aSopenharmony_ci } 643cabdff1aSopenharmony_ci } 644cabdff1aSopenharmony_ci 645cabdff1aSopenharmony_ci coefs_ptr = coefs + (region * REGION_SIZE); 646cabdff1aSopenharmony_ci 647cabdff1aSopenharmony_ci if (category == 5 && s->microsoft) { 648cabdff1aSopenharmony_ci i = 0; 649cabdff1aSopenharmony_ci for (j = 0; j < REGION_SIZE; j++) { 650cabdff1aSopenharmony_ci if (*coefs_ptr != 0) { 651cabdff1aSopenharmony_ci i++; 652cabdff1aSopenharmony_ci if (fabs(*coefs_ptr) > 2.0 * decoder_standard_deviation[region]) { 653cabdff1aSopenharmony_ci i += 3; 654cabdff1aSopenharmony_ci } 655cabdff1aSopenharmony_ci } 656cabdff1aSopenharmony_ci coefs_ptr++; 657cabdff1aSopenharmony_ci } 658cabdff1aSopenharmony_ci if (i >= FF_ARRAY_ELEMS(noise_category5)) { 659cabdff1aSopenharmony_ci error = 1; 660cabdff1aSopenharmony_ci break; 661cabdff1aSopenharmony_ci } 662cabdff1aSopenharmony_ci 663cabdff1aSopenharmony_ci noise = decoder_standard_deviation[region] * noise_category5[i]; 664cabdff1aSopenharmony_ci } else 665cabdff1aSopenharmony_ci if (category == 5 || category == 6) { 666cabdff1aSopenharmony_ci i = 0; 667cabdff1aSopenharmony_ci for (j = 0; j < REGION_SIZE; j++) { 668cabdff1aSopenharmony_ci if (*coefs_ptr != 0) 669cabdff1aSopenharmony_ci i++; 670cabdff1aSopenharmony_ci coefs_ptr++; 671cabdff1aSopenharmony_ci } 672cabdff1aSopenharmony_ci 673cabdff1aSopenharmony_ci if (category == 5) { 674cabdff1aSopenharmony_ci noise = decoder_standard_deviation[region] * noise_category5[i]; 675cabdff1aSopenharmony_ci } else 676cabdff1aSopenharmony_ci noise = decoder_standard_deviation[region] * noise_category6[i]; 677cabdff1aSopenharmony_ci } else if (category == 7) { 678cabdff1aSopenharmony_ci noise = decoder_standard_deviation[region] * 0.70711f; 679cabdff1aSopenharmony_ci } else { 680cabdff1aSopenharmony_ci noise = 0; 681cabdff1aSopenharmony_ci } 682cabdff1aSopenharmony_ci 683cabdff1aSopenharmony_ci coefs_ptr = coefs + (region * REGION_SIZE); 684cabdff1aSopenharmony_ci 685cabdff1aSopenharmony_ci if (category == 5 || category == 6 || category == 7) { 686cabdff1aSopenharmony_ci dw1 = get_dw(s); 687cabdff1aSopenharmony_ci dw2 = get_dw(s); 688cabdff1aSopenharmony_ci 689cabdff1aSopenharmony_ci for (j = 0; j < 10; j++) { 690cabdff1aSopenharmony_ci if (category == 7 || *coefs_ptr == 0) 691cabdff1aSopenharmony_ci *coefs_ptr = dw1 & 1 ? noise : -noise; 692cabdff1aSopenharmony_ci coefs_ptr++; 693cabdff1aSopenharmony_ci dw1 >>= 1; 694cabdff1aSopenharmony_ci 695cabdff1aSopenharmony_ci if (category == 7 || *coefs_ptr == 0) 696cabdff1aSopenharmony_ci *coefs_ptr = dw2 & 1 ? noise : -noise; 697cabdff1aSopenharmony_ci coefs_ptr++; 698cabdff1aSopenharmony_ci dw2 >>= 1; 699cabdff1aSopenharmony_ci } 700cabdff1aSopenharmony_ci } 701cabdff1aSopenharmony_ci } 702cabdff1aSopenharmony_ci 703cabdff1aSopenharmony_ci return error == 1 ? AVERROR_INVALIDDATA : (get_bits_left(gb) - s->checksum_bits); 704cabdff1aSopenharmony_ci} 705cabdff1aSopenharmony_ci 706cabdff1aSopenharmony_cistatic int siren_decode(AVCodecContext *avctx, AVFrame *frame, 707cabdff1aSopenharmony_ci int *got_frame, AVPacket *avpkt) 708cabdff1aSopenharmony_ci{ 709cabdff1aSopenharmony_ci SirenContext *s = avctx->priv_data; 710cabdff1aSopenharmony_ci GetBitContext *gb = &s->gb; 711cabdff1aSopenharmony_ci int ret, number_of_valid_coefs = REGION_SIZE * s->number_of_regions; 712cabdff1aSopenharmony_ci int frame_error = 0, rate_control = 0; 713cabdff1aSopenharmony_ci int bits_per_frame; 714cabdff1aSopenharmony_ci 715cabdff1aSopenharmony_ci if (s->microsoft) { 716cabdff1aSopenharmony_ci bits_per_frame = avctx->sample_rate / 50; 717cabdff1aSopenharmony_ci 718cabdff1aSopenharmony_ci if (avpkt->size < bits_per_frame / 8) 719cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 720cabdff1aSopenharmony_ci 721cabdff1aSopenharmony_ci if ((ret = init_get_bits(gb, avpkt->data, bits_per_frame)) < 0) 722cabdff1aSopenharmony_ci return ret; 723cabdff1aSopenharmony_ci } else 724cabdff1aSopenharmony_ci if ((ret = init_get_bits8(gb, avpkt->data, avpkt->size)) < 0) 725cabdff1aSopenharmony_ci return ret; 726cabdff1aSopenharmony_ci 727cabdff1aSopenharmony_ci skip_bits(gb, s->sample_rate_bits); 728cabdff1aSopenharmony_ci 729cabdff1aSopenharmony_ci ret = decode_envelope(s, gb, s->number_of_regions, 730cabdff1aSopenharmony_ci s->decoder_standard_deviation, 731cabdff1aSopenharmony_ci s->absolute_region_power_index, s->esf_adjustment); 732cabdff1aSopenharmony_ci if (ret < 0) 733cabdff1aSopenharmony_ci return ret; 734cabdff1aSopenharmony_ci 735cabdff1aSopenharmony_ci rate_control = get_bits(gb, 4); 736cabdff1aSopenharmony_ci 737cabdff1aSopenharmony_ci ret = categorize_regions(s->number_of_regions, get_bits_left(gb) - s->checksum_bits, 738cabdff1aSopenharmony_ci s->absolute_region_power_index, s->power_categories, 739cabdff1aSopenharmony_ci s->category_balance); 740cabdff1aSopenharmony_ci if (ret < 0) 741cabdff1aSopenharmony_ci return ret; 742cabdff1aSopenharmony_ci 743cabdff1aSopenharmony_ci for (int i = 0; i < rate_control; i++) 744cabdff1aSopenharmony_ci s->power_categories[s->category_balance[i]]++; 745cabdff1aSopenharmony_ci 746cabdff1aSopenharmony_ci ret = decode_vector(s, s->number_of_regions, 747cabdff1aSopenharmony_ci s->decoder_standard_deviation, s->power_categories, 748cabdff1aSopenharmony_ci s->imdct_in, s->scale_factor); 749cabdff1aSopenharmony_ci if (ret < 0 && !s->microsoft) 750cabdff1aSopenharmony_ci return ret; 751cabdff1aSopenharmony_ci 752cabdff1aSopenharmony_ci if (get_bits_left(gb) - s->checksum_bits > 0) { 753cabdff1aSopenharmony_ci do { 754cabdff1aSopenharmony_ci frame_error |= !get_bits1(gb); 755cabdff1aSopenharmony_ci } while (get_bits_left(gb) - s->checksum_bits > 0); 756cabdff1aSopenharmony_ci } else if (get_bits_left(gb) - s->checksum_bits < 0 && 757cabdff1aSopenharmony_ci rate_control + 1 < s->rate_control_possibilities) { 758cabdff1aSopenharmony_ci frame_error = 1; 759cabdff1aSopenharmony_ci } 760cabdff1aSopenharmony_ci 761cabdff1aSopenharmony_ci for (int i = 0; i < s->number_of_regions; i++) { 762cabdff1aSopenharmony_ci if (s->absolute_region_power_index[i] > 33 || 763cabdff1aSopenharmony_ci s->absolute_region_power_index[i] < -31) 764cabdff1aSopenharmony_ci frame_error = 1; 765cabdff1aSopenharmony_ci } 766cabdff1aSopenharmony_ci 767cabdff1aSopenharmony_ci if ((avctx->err_recognition & AV_EF_CRCCHECK) && s->checksum_bits) { 768cabdff1aSopenharmony_ci static const uint16_t ChecksumTable[4] = {0x7F80, 0x7878, 0x6666, 0x5555}; 769cabdff1aSopenharmony_ci int wpf, checksum, sum, calculated_checksum, temp1; 770cabdff1aSopenharmony_ci 771cabdff1aSopenharmony_ci checksum = get_bits(gb, s->checksum_bits); 772cabdff1aSopenharmony_ci 773cabdff1aSopenharmony_ci wpf = bits_per_frame / 16; 774cabdff1aSopenharmony_ci sum = 0; 775cabdff1aSopenharmony_ci for (int i = 0; i < wpf - 1; i++) 776cabdff1aSopenharmony_ci sum ^= AV_RB16(avpkt->data + i * 2) << (i % 15); 777cabdff1aSopenharmony_ci sum ^= (AV_RB16(avpkt->data + (wpf - 1) * 2) & ~checksum) << ((wpf - 1) % 15); 778cabdff1aSopenharmony_ci sum = (sum >> 15) ^ (sum & 0x7FFF); 779cabdff1aSopenharmony_ci 780cabdff1aSopenharmony_ci calculated_checksum = 0; 781cabdff1aSopenharmony_ci for (int i = 0; i < 4; i++) { 782cabdff1aSopenharmony_ci temp1 = ChecksumTable[i] & sum; 783cabdff1aSopenharmony_ci 784cabdff1aSopenharmony_ci for (int j = 8; j > 0; j >>= 1) 785cabdff1aSopenharmony_ci temp1 ^= temp1 >> j; 786cabdff1aSopenharmony_ci 787cabdff1aSopenharmony_ci calculated_checksum <<= 1; 788cabdff1aSopenharmony_ci calculated_checksum |= temp1 & 1; 789cabdff1aSopenharmony_ci } 790cabdff1aSopenharmony_ci 791cabdff1aSopenharmony_ci if (checksum != calculated_checksum) { 792cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_WARNING, "Invalid checksum\n"); 793cabdff1aSopenharmony_ci if (avctx->err_recognition & AV_EF_EXPLODE) 794cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 795cabdff1aSopenharmony_ci frame_error = 1; 796cabdff1aSopenharmony_ci } 797cabdff1aSopenharmony_ci } 798cabdff1aSopenharmony_ci 799cabdff1aSopenharmony_ci if (frame_error) { 800cabdff1aSopenharmony_ci memcpy(s->imdct_in, s->backup_frame, number_of_valid_coefs * sizeof(float)); 801cabdff1aSopenharmony_ci memset(s->backup_frame, 0, number_of_valid_coefs * sizeof(float)); 802cabdff1aSopenharmony_ci } else { 803cabdff1aSopenharmony_ci memcpy(s->backup_frame, s->imdct_in, number_of_valid_coefs * sizeof(float)); 804cabdff1aSopenharmony_ci } 805cabdff1aSopenharmony_ci 806cabdff1aSopenharmony_ci frame->nb_samples = FRAME_SIZE; 807cabdff1aSopenharmony_ci if ((ret = ff_get_buffer(avctx, frame, 0)) < 0) 808cabdff1aSopenharmony_ci return ret; 809cabdff1aSopenharmony_ci 810cabdff1aSopenharmony_ci for (int i = 0; i < FRAME_SIZE; i += 2) 811cabdff1aSopenharmony_ci s->imdct_in[i] *= -1; 812cabdff1aSopenharmony_ci 813cabdff1aSopenharmony_ci s->tx_fn(s->tx_ctx, s->imdct_out, s->imdct_in, sizeof(float)); 814cabdff1aSopenharmony_ci s->fdsp->vector_fmul_window((float *)frame->data[0], 815cabdff1aSopenharmony_ci s->imdct_prev + (FRAME_SIZE >> 1), 816cabdff1aSopenharmony_ci s->imdct_out, s->window, 817cabdff1aSopenharmony_ci FRAME_SIZE >> 1); 818cabdff1aSopenharmony_ci FFSWAP(float *, s->imdct_out, s->imdct_prev); 819cabdff1aSopenharmony_ci 820cabdff1aSopenharmony_ci *got_frame = 1; 821cabdff1aSopenharmony_ci 822cabdff1aSopenharmony_ci return s->microsoft ? bits_per_frame / 8 : avpkt->size; 823cabdff1aSopenharmony_ci} 824cabdff1aSopenharmony_ci 825cabdff1aSopenharmony_cistatic av_cold void siren_flush(AVCodecContext *avctx) 826cabdff1aSopenharmony_ci{ 827cabdff1aSopenharmony_ci SirenContext *s = avctx->priv_data; 828cabdff1aSopenharmony_ci 829cabdff1aSopenharmony_ci memset(s->backup_frame, 0, sizeof(s->backup_frame)); 830cabdff1aSopenharmony_ci memset(s->imdct_prev, 0, FRAME_SIZE * sizeof(*s->imdct_prev)); 831cabdff1aSopenharmony_ci memset(s->imdct_out, 0, FRAME_SIZE * sizeof(*s->imdct_out)); 832cabdff1aSopenharmony_ci} 833cabdff1aSopenharmony_ci 834cabdff1aSopenharmony_cistatic av_cold int siren_close(AVCodecContext *avctx) 835cabdff1aSopenharmony_ci{ 836cabdff1aSopenharmony_ci SirenContext *s = avctx->priv_data; 837cabdff1aSopenharmony_ci 838cabdff1aSopenharmony_ci av_freep(&s->fdsp); 839cabdff1aSopenharmony_ci av_tx_uninit(&s->tx_ctx); 840cabdff1aSopenharmony_ci 841cabdff1aSopenharmony_ci return 0; 842cabdff1aSopenharmony_ci} 843cabdff1aSopenharmony_ci 844cabdff1aSopenharmony_ciconst FFCodec ff_siren_decoder = { 845cabdff1aSopenharmony_ci .p.name = "siren", 846cabdff1aSopenharmony_ci .p.long_name = NULL_IF_CONFIG_SMALL("Siren"), 847cabdff1aSopenharmony_ci .priv_data_size = sizeof(SirenContext), 848cabdff1aSopenharmony_ci .p.type = AVMEDIA_TYPE_AUDIO, 849cabdff1aSopenharmony_ci .p.id = AV_CODEC_ID_SIREN, 850cabdff1aSopenharmony_ci .init = siren_init, 851cabdff1aSopenharmony_ci .close = siren_close, 852cabdff1aSopenharmony_ci FF_CODEC_DECODE_CB(siren_decode), 853cabdff1aSopenharmony_ci .flush = siren_flush, 854cabdff1aSopenharmony_ci .p.capabilities = AV_CODEC_CAP_CHANNEL_CONF | 855cabdff1aSopenharmony_ci AV_CODEC_CAP_DR1, 856cabdff1aSopenharmony_ci .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | 857cabdff1aSopenharmony_ci FF_CODEC_CAP_INIT_CLEANUP, 858cabdff1aSopenharmony_ci}; 859cabdff1aSopenharmony_ci 860cabdff1aSopenharmony_ciconst FFCodec ff_msnsiren_decoder = { 861cabdff1aSopenharmony_ci .p.name = "msnsiren", 862cabdff1aSopenharmony_ci .p.long_name = NULL_IF_CONFIG_SMALL("MSN Siren"), 863cabdff1aSopenharmony_ci .priv_data_size = sizeof(SirenContext), 864cabdff1aSopenharmony_ci .p.type = AVMEDIA_TYPE_AUDIO, 865cabdff1aSopenharmony_ci .p.id = AV_CODEC_ID_MSNSIREN, 866cabdff1aSopenharmony_ci .init = siren_init, 867cabdff1aSopenharmony_ci .close = siren_close, 868cabdff1aSopenharmony_ci FF_CODEC_DECODE_CB(siren_decode), 869cabdff1aSopenharmony_ci .flush = siren_flush, 870cabdff1aSopenharmony_ci .p.capabilities = AV_CODEC_CAP_CHANNEL_CONF | 871cabdff1aSopenharmony_ci AV_CODEC_CAP_DR1, 872cabdff1aSopenharmony_ci .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | 873cabdff1aSopenharmony_ci FF_CODEC_CAP_INIT_CLEANUP, 874cabdff1aSopenharmony_ci}; 875