1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * RealAudio Lossless decoder 3cabdff1aSopenharmony_ci * 4cabdff1aSopenharmony_ci * Copyright (c) 2012 Konstantin Shishkov 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 * This is a decoder for Real Audio Lossless format. 26cabdff1aSopenharmony_ci * Dedicated to the mastermind behind it, Ralph Wiggum. 27cabdff1aSopenharmony_ci */ 28cabdff1aSopenharmony_ci 29cabdff1aSopenharmony_ci#include "libavutil/attributes.h" 30cabdff1aSopenharmony_ci#include "libavutil/channel_layout.h" 31cabdff1aSopenharmony_ci#include "avcodec.h" 32cabdff1aSopenharmony_ci#include "codec_internal.h" 33cabdff1aSopenharmony_ci#include "get_bits.h" 34cabdff1aSopenharmony_ci#include "golomb.h" 35cabdff1aSopenharmony_ci#include "internal.h" 36cabdff1aSopenharmony_ci#include "unary.h" 37cabdff1aSopenharmony_ci#include "ralfdata.h" 38cabdff1aSopenharmony_ci 39cabdff1aSopenharmony_ci#define FILTER_NONE 0 40cabdff1aSopenharmony_ci#define FILTER_RAW 642 41cabdff1aSopenharmony_ci 42cabdff1aSopenharmony_citypedef struct VLCSet { 43cabdff1aSopenharmony_ci VLC filter_params; 44cabdff1aSopenharmony_ci VLC bias; 45cabdff1aSopenharmony_ci VLC coding_mode; 46cabdff1aSopenharmony_ci VLC filter_coeffs[10][11]; 47cabdff1aSopenharmony_ci VLC short_codes[15]; 48cabdff1aSopenharmony_ci VLC long_codes[125]; 49cabdff1aSopenharmony_ci} VLCSet; 50cabdff1aSopenharmony_ci 51cabdff1aSopenharmony_ci#define RALF_MAX_PKT_SIZE 8192 52cabdff1aSopenharmony_ci 53cabdff1aSopenharmony_citypedef struct RALFContext { 54cabdff1aSopenharmony_ci int version; 55cabdff1aSopenharmony_ci int max_frame_size; 56cabdff1aSopenharmony_ci VLCSet sets[3]; 57cabdff1aSopenharmony_ci int32_t channel_data[2][4096]; 58cabdff1aSopenharmony_ci 59cabdff1aSopenharmony_ci int filter_params; ///< combined filter parameters for the current channel data 60cabdff1aSopenharmony_ci int filter_length; ///< length of the filter for the current channel data 61cabdff1aSopenharmony_ci int filter_bits; ///< filter precision for the current channel data 62cabdff1aSopenharmony_ci int32_t filter[64]; 63cabdff1aSopenharmony_ci 64cabdff1aSopenharmony_ci unsigned bias[2]; ///< a constant value added to channel data after filtering 65cabdff1aSopenharmony_ci 66cabdff1aSopenharmony_ci int num_blocks; ///< number of blocks inside the frame 67cabdff1aSopenharmony_ci int sample_offset; 68cabdff1aSopenharmony_ci int block_size[1 << 12]; ///< size of the blocks 69cabdff1aSopenharmony_ci int block_pts[1 << 12]; ///< block start time (in milliseconds) 70cabdff1aSopenharmony_ci 71cabdff1aSopenharmony_ci uint8_t pkt[16384]; 72cabdff1aSopenharmony_ci int has_pkt; 73cabdff1aSopenharmony_ci} RALFContext; 74cabdff1aSopenharmony_ci 75cabdff1aSopenharmony_ci#define MAX_ELEMS 644 // no RALF table uses more than that 76cabdff1aSopenharmony_ci 77cabdff1aSopenharmony_cistatic av_cold int init_ralf_vlc(VLC *vlc, const uint8_t *data, int elems) 78cabdff1aSopenharmony_ci{ 79cabdff1aSopenharmony_ci uint8_t lens[MAX_ELEMS]; 80cabdff1aSopenharmony_ci uint16_t codes[MAX_ELEMS]; 81cabdff1aSopenharmony_ci int counts[17], prefixes[18]; 82cabdff1aSopenharmony_ci int i, cur_len; 83cabdff1aSopenharmony_ci int max_bits = 0; 84cabdff1aSopenharmony_ci int nb = 0; 85cabdff1aSopenharmony_ci 86cabdff1aSopenharmony_ci for (i = 0; i <= 16; i++) 87cabdff1aSopenharmony_ci counts[i] = 0; 88cabdff1aSopenharmony_ci for (i = 0; i < elems; i++) { 89cabdff1aSopenharmony_ci cur_len = (nb ? *data & 0xF : *data >> 4) + 1; 90cabdff1aSopenharmony_ci counts[cur_len]++; 91cabdff1aSopenharmony_ci max_bits = FFMAX(max_bits, cur_len); 92cabdff1aSopenharmony_ci lens[i] = cur_len; 93cabdff1aSopenharmony_ci data += nb; 94cabdff1aSopenharmony_ci nb ^= 1; 95cabdff1aSopenharmony_ci } 96cabdff1aSopenharmony_ci prefixes[1] = 0; 97cabdff1aSopenharmony_ci for (i = 1; i <= 16; i++) 98cabdff1aSopenharmony_ci prefixes[i + 1] = (prefixes[i] + counts[i]) << 1; 99cabdff1aSopenharmony_ci 100cabdff1aSopenharmony_ci for (i = 0; i < elems; i++) 101cabdff1aSopenharmony_ci codes[i] = prefixes[lens[i]]++; 102cabdff1aSopenharmony_ci 103cabdff1aSopenharmony_ci return ff_init_vlc_sparse(vlc, FFMIN(max_bits, 9), elems, 104cabdff1aSopenharmony_ci lens, 1, 1, codes, 2, 2, NULL, 0, 0, 0); 105cabdff1aSopenharmony_ci} 106cabdff1aSopenharmony_ci 107cabdff1aSopenharmony_cistatic av_cold int decode_close(AVCodecContext *avctx) 108cabdff1aSopenharmony_ci{ 109cabdff1aSopenharmony_ci RALFContext *ctx = avctx->priv_data; 110cabdff1aSopenharmony_ci int i, j, k; 111cabdff1aSopenharmony_ci 112cabdff1aSopenharmony_ci for (i = 0; i < 3; i++) { 113cabdff1aSopenharmony_ci ff_free_vlc(&ctx->sets[i].filter_params); 114cabdff1aSopenharmony_ci ff_free_vlc(&ctx->sets[i].bias); 115cabdff1aSopenharmony_ci ff_free_vlc(&ctx->sets[i].coding_mode); 116cabdff1aSopenharmony_ci for (j = 0; j < 10; j++) 117cabdff1aSopenharmony_ci for (k = 0; k < 11; k++) 118cabdff1aSopenharmony_ci ff_free_vlc(&ctx->sets[i].filter_coeffs[j][k]); 119cabdff1aSopenharmony_ci for (j = 0; j < 15; j++) 120cabdff1aSopenharmony_ci ff_free_vlc(&ctx->sets[i].short_codes[j]); 121cabdff1aSopenharmony_ci for (j = 0; j < 125; j++) 122cabdff1aSopenharmony_ci ff_free_vlc(&ctx->sets[i].long_codes[j]); 123cabdff1aSopenharmony_ci } 124cabdff1aSopenharmony_ci 125cabdff1aSopenharmony_ci return 0; 126cabdff1aSopenharmony_ci} 127cabdff1aSopenharmony_ci 128cabdff1aSopenharmony_cistatic av_cold int decode_init(AVCodecContext *avctx) 129cabdff1aSopenharmony_ci{ 130cabdff1aSopenharmony_ci RALFContext *ctx = avctx->priv_data; 131cabdff1aSopenharmony_ci int i, j, k; 132cabdff1aSopenharmony_ci int ret, channels; 133cabdff1aSopenharmony_ci 134cabdff1aSopenharmony_ci if (avctx->extradata_size < 24 || memcmp(avctx->extradata, "LSD:", 4)) { 135cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "Extradata is not groovy, dude\n"); 136cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 137cabdff1aSopenharmony_ci } 138cabdff1aSopenharmony_ci 139cabdff1aSopenharmony_ci ctx->version = AV_RB16(avctx->extradata + 4); 140cabdff1aSopenharmony_ci if (ctx->version != 0x103) { 141cabdff1aSopenharmony_ci avpriv_request_sample(avctx, "Unknown version %X", ctx->version); 142cabdff1aSopenharmony_ci return AVERROR_PATCHWELCOME; 143cabdff1aSopenharmony_ci } 144cabdff1aSopenharmony_ci 145cabdff1aSopenharmony_ci channels = AV_RB16(avctx->extradata + 8); 146cabdff1aSopenharmony_ci avctx->sample_rate = AV_RB32(avctx->extradata + 12); 147cabdff1aSopenharmony_ci if (channels < 1 || channels > 2 148cabdff1aSopenharmony_ci || avctx->sample_rate < 8000 || avctx->sample_rate > 96000) { 149cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "Invalid coding parameters %d Hz %d ch\n", 150cabdff1aSopenharmony_ci avctx->sample_rate, channels); 151cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 152cabdff1aSopenharmony_ci } 153cabdff1aSopenharmony_ci avctx->sample_fmt = AV_SAMPLE_FMT_S16P; 154cabdff1aSopenharmony_ci av_channel_layout_uninit(&avctx->ch_layout); 155cabdff1aSopenharmony_ci av_channel_layout_default(&avctx->ch_layout, channels); 156cabdff1aSopenharmony_ci 157cabdff1aSopenharmony_ci ctx->max_frame_size = AV_RB32(avctx->extradata + 16); 158cabdff1aSopenharmony_ci if (ctx->max_frame_size > (1 << 20) || !ctx->max_frame_size) { 159cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "invalid frame size %d\n", 160cabdff1aSopenharmony_ci ctx->max_frame_size); 161cabdff1aSopenharmony_ci } 162cabdff1aSopenharmony_ci ctx->max_frame_size = FFMAX(ctx->max_frame_size, avctx->sample_rate); 163cabdff1aSopenharmony_ci 164cabdff1aSopenharmony_ci for (i = 0; i < 3; i++) { 165cabdff1aSopenharmony_ci ret = init_ralf_vlc(&ctx->sets[i].filter_params, filter_param_def[i], 166cabdff1aSopenharmony_ci FILTERPARAM_ELEMENTS); 167cabdff1aSopenharmony_ci if (ret < 0) 168cabdff1aSopenharmony_ci return ret; 169cabdff1aSopenharmony_ci ret = init_ralf_vlc(&ctx->sets[i].bias, bias_def[i], BIAS_ELEMENTS); 170cabdff1aSopenharmony_ci if (ret < 0) 171cabdff1aSopenharmony_ci return ret; 172cabdff1aSopenharmony_ci ret = init_ralf_vlc(&ctx->sets[i].coding_mode, coding_mode_def[i], 173cabdff1aSopenharmony_ci CODING_MODE_ELEMENTS); 174cabdff1aSopenharmony_ci if (ret < 0) 175cabdff1aSopenharmony_ci return ret; 176cabdff1aSopenharmony_ci for (j = 0; j < 10; j++) { 177cabdff1aSopenharmony_ci for (k = 0; k < 11; k++) { 178cabdff1aSopenharmony_ci ret = init_ralf_vlc(&ctx->sets[i].filter_coeffs[j][k], 179cabdff1aSopenharmony_ci filter_coeffs_def[i][j][k], 180cabdff1aSopenharmony_ci FILTER_COEFFS_ELEMENTS); 181cabdff1aSopenharmony_ci if (ret < 0) 182cabdff1aSopenharmony_ci return ret; 183cabdff1aSopenharmony_ci } 184cabdff1aSopenharmony_ci } 185cabdff1aSopenharmony_ci for (j = 0; j < 15; j++) { 186cabdff1aSopenharmony_ci ret = init_ralf_vlc(&ctx->sets[i].short_codes[j], 187cabdff1aSopenharmony_ci short_codes_def[i][j], SHORT_CODES_ELEMENTS); 188cabdff1aSopenharmony_ci if (ret < 0) 189cabdff1aSopenharmony_ci return ret; 190cabdff1aSopenharmony_ci } 191cabdff1aSopenharmony_ci for (j = 0; j < 125; j++) { 192cabdff1aSopenharmony_ci ret = init_ralf_vlc(&ctx->sets[i].long_codes[j], 193cabdff1aSopenharmony_ci long_codes_def[i][j], LONG_CODES_ELEMENTS); 194cabdff1aSopenharmony_ci if (ret < 0) 195cabdff1aSopenharmony_ci return ret; 196cabdff1aSopenharmony_ci } 197cabdff1aSopenharmony_ci } 198cabdff1aSopenharmony_ci 199cabdff1aSopenharmony_ci return 0; 200cabdff1aSopenharmony_ci} 201cabdff1aSopenharmony_ci 202cabdff1aSopenharmony_cistatic inline int extend_code(GetBitContext *gb, int val, int range, int bits) 203cabdff1aSopenharmony_ci{ 204cabdff1aSopenharmony_ci if (val == 0) { 205cabdff1aSopenharmony_ci val = -range - get_ue_golomb(gb); 206cabdff1aSopenharmony_ci } else if (val == range * 2) { 207cabdff1aSopenharmony_ci val = range + get_ue_golomb(gb); 208cabdff1aSopenharmony_ci } else { 209cabdff1aSopenharmony_ci val -= range; 210cabdff1aSopenharmony_ci } 211cabdff1aSopenharmony_ci if (bits) 212cabdff1aSopenharmony_ci val = ((unsigned)val << bits) | get_bits(gb, bits); 213cabdff1aSopenharmony_ci return val; 214cabdff1aSopenharmony_ci} 215cabdff1aSopenharmony_ci 216cabdff1aSopenharmony_cistatic int decode_channel(RALFContext *ctx, GetBitContext *gb, int ch, 217cabdff1aSopenharmony_ci int length, int mode, int bits) 218cabdff1aSopenharmony_ci{ 219cabdff1aSopenharmony_ci int i, t; 220cabdff1aSopenharmony_ci int code_params; 221cabdff1aSopenharmony_ci VLCSet *set = ctx->sets + mode; 222cabdff1aSopenharmony_ci VLC *code_vlc; int range, range2, add_bits; 223cabdff1aSopenharmony_ci int *dst = ctx->channel_data[ch]; 224cabdff1aSopenharmony_ci 225cabdff1aSopenharmony_ci ctx->filter_params = get_vlc2(gb, set->filter_params.table, 9, 2); 226cabdff1aSopenharmony_ci if (ctx->filter_params > 1) { 227cabdff1aSopenharmony_ci ctx->filter_bits = (ctx->filter_params - 2) >> 6; 228cabdff1aSopenharmony_ci ctx->filter_length = ctx->filter_params - (ctx->filter_bits << 6) - 1; 229cabdff1aSopenharmony_ci } 230cabdff1aSopenharmony_ci 231cabdff1aSopenharmony_ci if (ctx->filter_params == FILTER_RAW) { 232cabdff1aSopenharmony_ci for (i = 0; i < length; i++) 233cabdff1aSopenharmony_ci dst[i] = get_bits(gb, bits); 234cabdff1aSopenharmony_ci ctx->bias[ch] = 0; 235cabdff1aSopenharmony_ci return 0; 236cabdff1aSopenharmony_ci } 237cabdff1aSopenharmony_ci 238cabdff1aSopenharmony_ci ctx->bias[ch] = get_vlc2(gb, set->bias.table, 9, 2); 239cabdff1aSopenharmony_ci ctx->bias[ch] = extend_code(gb, ctx->bias[ch], 127, 4); 240cabdff1aSopenharmony_ci 241cabdff1aSopenharmony_ci if (ctx->filter_params == FILTER_NONE) { 242cabdff1aSopenharmony_ci memset(dst, 0, sizeof(*dst) * length); 243cabdff1aSopenharmony_ci return 0; 244cabdff1aSopenharmony_ci } 245cabdff1aSopenharmony_ci 246cabdff1aSopenharmony_ci if (ctx->filter_params > 1) { 247cabdff1aSopenharmony_ci int cmode = 0, coeff = 0; 248cabdff1aSopenharmony_ci VLC *vlc = set->filter_coeffs[ctx->filter_bits] + 5; 249cabdff1aSopenharmony_ci 250cabdff1aSopenharmony_ci add_bits = ctx->filter_bits; 251cabdff1aSopenharmony_ci 252cabdff1aSopenharmony_ci for (i = 0; i < ctx->filter_length; i++) { 253cabdff1aSopenharmony_ci t = get_vlc2(gb, vlc[cmode].table, vlc[cmode].bits, 2); 254cabdff1aSopenharmony_ci t = extend_code(gb, t, 21, add_bits); 255cabdff1aSopenharmony_ci if (!cmode) 256cabdff1aSopenharmony_ci coeff -= 12U << add_bits; 257cabdff1aSopenharmony_ci coeff = (unsigned)t - coeff; 258cabdff1aSopenharmony_ci ctx->filter[i] = coeff; 259cabdff1aSopenharmony_ci 260cabdff1aSopenharmony_ci cmode = coeff >> add_bits; 261cabdff1aSopenharmony_ci if (cmode < 0) { 262cabdff1aSopenharmony_ci cmode = -1 - av_log2(-cmode); 263cabdff1aSopenharmony_ci if (cmode < -5) 264cabdff1aSopenharmony_ci cmode = -5; 265cabdff1aSopenharmony_ci } else if (cmode > 0) { 266cabdff1aSopenharmony_ci cmode = 1 + av_log2(cmode); 267cabdff1aSopenharmony_ci if (cmode > 5) 268cabdff1aSopenharmony_ci cmode = 5; 269cabdff1aSopenharmony_ci } 270cabdff1aSopenharmony_ci } 271cabdff1aSopenharmony_ci } 272cabdff1aSopenharmony_ci 273cabdff1aSopenharmony_ci code_params = get_vlc2(gb, set->coding_mode.table, set->coding_mode.bits, 2); 274cabdff1aSopenharmony_ci if (code_params >= 15) { 275cabdff1aSopenharmony_ci add_bits = av_clip((code_params / 5 - 3) / 2, 0, 10); 276cabdff1aSopenharmony_ci if (add_bits > 9 && (code_params % 5) != 2) 277cabdff1aSopenharmony_ci add_bits--; 278cabdff1aSopenharmony_ci range = 10; 279cabdff1aSopenharmony_ci range2 = 21; 280cabdff1aSopenharmony_ci code_vlc = set->long_codes + (code_params - 15); 281cabdff1aSopenharmony_ci } else { 282cabdff1aSopenharmony_ci add_bits = 0; 283cabdff1aSopenharmony_ci range = 6; 284cabdff1aSopenharmony_ci range2 = 13; 285cabdff1aSopenharmony_ci code_vlc = set->short_codes + code_params; 286cabdff1aSopenharmony_ci } 287cabdff1aSopenharmony_ci 288cabdff1aSopenharmony_ci for (i = 0; i < length; i += 2) { 289cabdff1aSopenharmony_ci int code1, code2; 290cabdff1aSopenharmony_ci 291cabdff1aSopenharmony_ci t = get_vlc2(gb, code_vlc->table, code_vlc->bits, 2); 292cabdff1aSopenharmony_ci code1 = t / range2; 293cabdff1aSopenharmony_ci code2 = t % range2; 294cabdff1aSopenharmony_ci dst[i] = extend_code(gb, code1, range, 0) * (1U << add_bits); 295cabdff1aSopenharmony_ci dst[i + 1] = extend_code(gb, code2, range, 0) * (1U << add_bits); 296cabdff1aSopenharmony_ci if (add_bits) { 297cabdff1aSopenharmony_ci dst[i] |= get_bits(gb, add_bits); 298cabdff1aSopenharmony_ci dst[i + 1] |= get_bits(gb, add_bits); 299cabdff1aSopenharmony_ci } 300cabdff1aSopenharmony_ci } 301cabdff1aSopenharmony_ci 302cabdff1aSopenharmony_ci return 0; 303cabdff1aSopenharmony_ci} 304cabdff1aSopenharmony_ci 305cabdff1aSopenharmony_cistatic void apply_lpc(RALFContext *ctx, int ch, int length, int bits) 306cabdff1aSopenharmony_ci{ 307cabdff1aSopenharmony_ci int i, j, acc; 308cabdff1aSopenharmony_ci int *audio = ctx->channel_data[ch]; 309cabdff1aSopenharmony_ci int bias = 1 << (ctx->filter_bits - 1); 310cabdff1aSopenharmony_ci int max_clip = (1 << bits) - 1, min_clip = -max_clip - 1; 311cabdff1aSopenharmony_ci 312cabdff1aSopenharmony_ci for (i = 1; i < length; i++) { 313cabdff1aSopenharmony_ci int flen = FFMIN(ctx->filter_length, i); 314cabdff1aSopenharmony_ci 315cabdff1aSopenharmony_ci acc = 0; 316cabdff1aSopenharmony_ci for (j = 0; j < flen; j++) 317cabdff1aSopenharmony_ci acc += (unsigned)ctx->filter[j] * audio[i - j - 1]; 318cabdff1aSopenharmony_ci if (acc < 0) { 319cabdff1aSopenharmony_ci acc = (acc + bias - 1) >> ctx->filter_bits; 320cabdff1aSopenharmony_ci acc = FFMAX(acc, min_clip); 321cabdff1aSopenharmony_ci } else { 322cabdff1aSopenharmony_ci acc = ((unsigned)acc + bias) >> ctx->filter_bits; 323cabdff1aSopenharmony_ci acc = FFMIN(acc, max_clip); 324cabdff1aSopenharmony_ci } 325cabdff1aSopenharmony_ci audio[i] += acc; 326cabdff1aSopenharmony_ci } 327cabdff1aSopenharmony_ci} 328cabdff1aSopenharmony_ci 329cabdff1aSopenharmony_cistatic int decode_block(AVCodecContext *avctx, GetBitContext *gb, 330cabdff1aSopenharmony_ci int16_t *dst0, int16_t *dst1) 331cabdff1aSopenharmony_ci{ 332cabdff1aSopenharmony_ci RALFContext *ctx = avctx->priv_data; 333cabdff1aSopenharmony_ci int len, ch, ret; 334cabdff1aSopenharmony_ci int dmode, mode[2], bits[2]; 335cabdff1aSopenharmony_ci int *ch0, *ch1; 336cabdff1aSopenharmony_ci int i; 337cabdff1aSopenharmony_ci unsigned int t, t2; 338cabdff1aSopenharmony_ci 339cabdff1aSopenharmony_ci len = 12 - get_unary(gb, 0, 6); 340cabdff1aSopenharmony_ci 341cabdff1aSopenharmony_ci if (len <= 7) len ^= 1; // codes for length = 6 and 7 are swapped 342cabdff1aSopenharmony_ci len = 1 << len; 343cabdff1aSopenharmony_ci 344cabdff1aSopenharmony_ci if (ctx->sample_offset + len > ctx->max_frame_size) { 345cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, 346cabdff1aSopenharmony_ci "Decoder's stomach is crying, it ate too many samples\n"); 347cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 348cabdff1aSopenharmony_ci } 349cabdff1aSopenharmony_ci 350cabdff1aSopenharmony_ci if (avctx->ch_layout.nb_channels > 1) 351cabdff1aSopenharmony_ci dmode = get_bits(gb, 2) + 1; 352cabdff1aSopenharmony_ci else 353cabdff1aSopenharmony_ci dmode = 0; 354cabdff1aSopenharmony_ci 355cabdff1aSopenharmony_ci mode[0] = (dmode == 4) ? 1 : 0; 356cabdff1aSopenharmony_ci mode[1] = (dmode >= 2) ? 2 : 0; 357cabdff1aSopenharmony_ci bits[0] = 16; 358cabdff1aSopenharmony_ci bits[1] = (mode[1] == 2) ? 17 : 16; 359cabdff1aSopenharmony_ci 360cabdff1aSopenharmony_ci for (ch = 0; ch < avctx->ch_layout.nb_channels; ch++) { 361cabdff1aSopenharmony_ci if ((ret = decode_channel(ctx, gb, ch, len, mode[ch], bits[ch])) < 0) 362cabdff1aSopenharmony_ci return ret; 363cabdff1aSopenharmony_ci if (ctx->filter_params > 1 && ctx->filter_params != FILTER_RAW) { 364cabdff1aSopenharmony_ci ctx->filter_bits += 3; 365cabdff1aSopenharmony_ci apply_lpc(ctx, ch, len, bits[ch]); 366cabdff1aSopenharmony_ci } 367cabdff1aSopenharmony_ci if (get_bits_left(gb) < 0) 368cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 369cabdff1aSopenharmony_ci } 370cabdff1aSopenharmony_ci ch0 = ctx->channel_data[0]; 371cabdff1aSopenharmony_ci ch1 = ctx->channel_data[1]; 372cabdff1aSopenharmony_ci switch (dmode) { 373cabdff1aSopenharmony_ci case 0: 374cabdff1aSopenharmony_ci for (i = 0; i < len; i++) 375cabdff1aSopenharmony_ci dst0[i] = ch0[i] + ctx->bias[0]; 376cabdff1aSopenharmony_ci break; 377cabdff1aSopenharmony_ci case 1: 378cabdff1aSopenharmony_ci for (i = 0; i < len; i++) { 379cabdff1aSopenharmony_ci dst0[i] = ch0[i] + ctx->bias[0]; 380cabdff1aSopenharmony_ci dst1[i] = ch1[i] + ctx->bias[1]; 381cabdff1aSopenharmony_ci } 382cabdff1aSopenharmony_ci break; 383cabdff1aSopenharmony_ci case 2: 384cabdff1aSopenharmony_ci for (i = 0; i < len; i++) { 385cabdff1aSopenharmony_ci ch0[i] += ctx->bias[0]; 386cabdff1aSopenharmony_ci dst0[i] = ch0[i]; 387cabdff1aSopenharmony_ci dst1[i] = ch0[i] - (ch1[i] + ctx->bias[1]); 388cabdff1aSopenharmony_ci } 389cabdff1aSopenharmony_ci break; 390cabdff1aSopenharmony_ci case 3: 391cabdff1aSopenharmony_ci for (i = 0; i < len; i++) { 392cabdff1aSopenharmony_ci t = ch0[i] + ctx->bias[0]; 393cabdff1aSopenharmony_ci t2 = ch1[i] + ctx->bias[1]; 394cabdff1aSopenharmony_ci dst0[i] = t + t2; 395cabdff1aSopenharmony_ci dst1[i] = t; 396cabdff1aSopenharmony_ci } 397cabdff1aSopenharmony_ci break; 398cabdff1aSopenharmony_ci case 4: 399cabdff1aSopenharmony_ci for (i = 0; i < len; i++) { 400cabdff1aSopenharmony_ci t = ch1[i] + ctx->bias[1]; 401cabdff1aSopenharmony_ci t2 = ((ch0[i] + ctx->bias[0]) * 2) | (t & 1); 402cabdff1aSopenharmony_ci dst0[i] = (int)(t2 + t) / 2; 403cabdff1aSopenharmony_ci dst1[i] = (int)(t2 - t) / 2; 404cabdff1aSopenharmony_ci } 405cabdff1aSopenharmony_ci break; 406cabdff1aSopenharmony_ci } 407cabdff1aSopenharmony_ci 408cabdff1aSopenharmony_ci ctx->sample_offset += len; 409cabdff1aSopenharmony_ci 410cabdff1aSopenharmony_ci return 0; 411cabdff1aSopenharmony_ci} 412cabdff1aSopenharmony_ci 413cabdff1aSopenharmony_cistatic int decode_frame(AVCodecContext *avctx, AVFrame *frame, 414cabdff1aSopenharmony_ci int *got_frame_ptr, AVPacket *avpkt) 415cabdff1aSopenharmony_ci{ 416cabdff1aSopenharmony_ci RALFContext *ctx = avctx->priv_data; 417cabdff1aSopenharmony_ci int16_t *samples0; 418cabdff1aSopenharmony_ci int16_t *samples1; 419cabdff1aSopenharmony_ci int ret; 420cabdff1aSopenharmony_ci GetBitContext gb; 421cabdff1aSopenharmony_ci int table_size, table_bytes, i; 422cabdff1aSopenharmony_ci const uint8_t *src, *block_pointer; 423cabdff1aSopenharmony_ci int src_size; 424cabdff1aSopenharmony_ci int bytes_left; 425cabdff1aSopenharmony_ci 426cabdff1aSopenharmony_ci if (ctx->has_pkt) { 427cabdff1aSopenharmony_ci ctx->has_pkt = 0; 428cabdff1aSopenharmony_ci table_bytes = (AV_RB16(avpkt->data) + 7) >> 3; 429cabdff1aSopenharmony_ci if (table_bytes + 3 > avpkt->size || avpkt->size > RALF_MAX_PKT_SIZE) { 430cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "Wrong packet's breath smells of wrong data!\n"); 431cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 432cabdff1aSopenharmony_ci } 433cabdff1aSopenharmony_ci if (memcmp(ctx->pkt, avpkt->data, 2 + table_bytes)) { 434cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "Wrong packet tails are wrong!\n"); 435cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 436cabdff1aSopenharmony_ci } 437cabdff1aSopenharmony_ci 438cabdff1aSopenharmony_ci src = ctx->pkt; 439cabdff1aSopenharmony_ci src_size = RALF_MAX_PKT_SIZE + avpkt->size; 440cabdff1aSopenharmony_ci memcpy(ctx->pkt + RALF_MAX_PKT_SIZE, avpkt->data + 2 + table_bytes, 441cabdff1aSopenharmony_ci avpkt->size - 2 - table_bytes); 442cabdff1aSopenharmony_ci } else { 443cabdff1aSopenharmony_ci if (avpkt->size == RALF_MAX_PKT_SIZE) { 444cabdff1aSopenharmony_ci memcpy(ctx->pkt, avpkt->data, avpkt->size); 445cabdff1aSopenharmony_ci ctx->has_pkt = 1; 446cabdff1aSopenharmony_ci *got_frame_ptr = 0; 447cabdff1aSopenharmony_ci 448cabdff1aSopenharmony_ci return avpkt->size; 449cabdff1aSopenharmony_ci } 450cabdff1aSopenharmony_ci src = avpkt->data; 451cabdff1aSopenharmony_ci src_size = avpkt->size; 452cabdff1aSopenharmony_ci } 453cabdff1aSopenharmony_ci 454cabdff1aSopenharmony_ci frame->nb_samples = ctx->max_frame_size; 455cabdff1aSopenharmony_ci if ((ret = ff_get_buffer(avctx, frame, 0)) < 0) 456cabdff1aSopenharmony_ci return ret; 457cabdff1aSopenharmony_ci samples0 = (int16_t *)frame->data[0]; 458cabdff1aSopenharmony_ci samples1 = (int16_t *)frame->data[1]; 459cabdff1aSopenharmony_ci 460cabdff1aSopenharmony_ci if (src_size < 5) { 461cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "too short packets are too short!\n"); 462cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 463cabdff1aSopenharmony_ci } 464cabdff1aSopenharmony_ci table_size = AV_RB16(src); 465cabdff1aSopenharmony_ci table_bytes = (table_size + 7) >> 3; 466cabdff1aSopenharmony_ci if (src_size < table_bytes + 3) { 467cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "short packets are short!\n"); 468cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 469cabdff1aSopenharmony_ci } 470cabdff1aSopenharmony_ci init_get_bits(&gb, src + 2, table_size); 471cabdff1aSopenharmony_ci ctx->num_blocks = 0; 472cabdff1aSopenharmony_ci while (get_bits_left(&gb) > 0) { 473cabdff1aSopenharmony_ci if (ctx->num_blocks >= FF_ARRAY_ELEMS(ctx->block_size)) 474cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 475cabdff1aSopenharmony_ci ctx->block_size[ctx->num_blocks] = get_bits(&gb, 13 + avctx->ch_layout.nb_channels); 476cabdff1aSopenharmony_ci if (get_bits1(&gb)) { 477cabdff1aSopenharmony_ci ctx->block_pts[ctx->num_blocks] = get_bits(&gb, 9); 478cabdff1aSopenharmony_ci } else { 479cabdff1aSopenharmony_ci ctx->block_pts[ctx->num_blocks] = 0; 480cabdff1aSopenharmony_ci } 481cabdff1aSopenharmony_ci ctx->num_blocks++; 482cabdff1aSopenharmony_ci } 483cabdff1aSopenharmony_ci 484cabdff1aSopenharmony_ci block_pointer = src + table_bytes + 2; 485cabdff1aSopenharmony_ci bytes_left = src_size - table_bytes - 2; 486cabdff1aSopenharmony_ci ctx->sample_offset = 0; 487cabdff1aSopenharmony_ci for (i = 0; i < ctx->num_blocks; i++) { 488cabdff1aSopenharmony_ci if (bytes_left < ctx->block_size[i]) { 489cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "I'm pedaling backwards\n"); 490cabdff1aSopenharmony_ci break; 491cabdff1aSopenharmony_ci } 492cabdff1aSopenharmony_ci init_get_bits(&gb, block_pointer, ctx->block_size[i] * 8); 493cabdff1aSopenharmony_ci if (decode_block(avctx, &gb, samples0 + ctx->sample_offset, 494cabdff1aSopenharmony_ci samples1 + ctx->sample_offset) < 0) { 495cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "Sir, I got carsick in your office. Not decoding the rest of packet.\n"); 496cabdff1aSopenharmony_ci break; 497cabdff1aSopenharmony_ci } 498cabdff1aSopenharmony_ci block_pointer += ctx->block_size[i]; 499cabdff1aSopenharmony_ci bytes_left -= ctx->block_size[i]; 500cabdff1aSopenharmony_ci } 501cabdff1aSopenharmony_ci 502cabdff1aSopenharmony_ci frame->nb_samples = ctx->sample_offset; 503cabdff1aSopenharmony_ci *got_frame_ptr = ctx->sample_offset > 0; 504cabdff1aSopenharmony_ci 505cabdff1aSopenharmony_ci return avpkt->size; 506cabdff1aSopenharmony_ci} 507cabdff1aSopenharmony_ci 508cabdff1aSopenharmony_cistatic void decode_flush(AVCodecContext *avctx) 509cabdff1aSopenharmony_ci{ 510cabdff1aSopenharmony_ci RALFContext *ctx = avctx->priv_data; 511cabdff1aSopenharmony_ci 512cabdff1aSopenharmony_ci ctx->has_pkt = 0; 513cabdff1aSopenharmony_ci} 514cabdff1aSopenharmony_ci 515cabdff1aSopenharmony_ci 516cabdff1aSopenharmony_ciconst FFCodec ff_ralf_decoder = { 517cabdff1aSopenharmony_ci .p.name = "ralf", 518cabdff1aSopenharmony_ci .p.long_name = NULL_IF_CONFIG_SMALL("RealAudio Lossless"), 519cabdff1aSopenharmony_ci .p.type = AVMEDIA_TYPE_AUDIO, 520cabdff1aSopenharmony_ci .p.id = AV_CODEC_ID_RALF, 521cabdff1aSopenharmony_ci .priv_data_size = sizeof(RALFContext), 522cabdff1aSopenharmony_ci .init = decode_init, 523cabdff1aSopenharmony_ci .close = decode_close, 524cabdff1aSopenharmony_ci FF_CODEC_DECODE_CB(decode_frame), 525cabdff1aSopenharmony_ci .flush = decode_flush, 526cabdff1aSopenharmony_ci .p.capabilities = AV_CODEC_CAP_CHANNEL_CONF | 527cabdff1aSopenharmony_ci AV_CODEC_CAP_DR1, 528cabdff1aSopenharmony_ci .p.sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_S16P, 529cabdff1aSopenharmony_ci AV_SAMPLE_FMT_NONE }, 530cabdff1aSopenharmony_ci .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_INIT_CLEANUP, 531cabdff1aSopenharmony_ci}; 532