1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * Shorten decoder 3cabdff1aSopenharmony_ci * Copyright (c) 2005 Jeff Muizelaar 4cabdff1aSopenharmony_ci * 5cabdff1aSopenharmony_ci * This file is part of FFmpeg. 6cabdff1aSopenharmony_ci * 7cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 8cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 9cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 10cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 11cabdff1aSopenharmony_ci * 12cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 13cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 14cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15cabdff1aSopenharmony_ci * Lesser General Public License for more details. 16cabdff1aSopenharmony_ci * 17cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 18cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 19cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 20cabdff1aSopenharmony_ci */ 21cabdff1aSopenharmony_ci 22cabdff1aSopenharmony_ci/** 23cabdff1aSopenharmony_ci * @file 24cabdff1aSopenharmony_ci * Shorten decoder 25cabdff1aSopenharmony_ci * @author Jeff Muizelaar 26cabdff1aSopenharmony_ci */ 27cabdff1aSopenharmony_ci 28cabdff1aSopenharmony_ci#include <limits.h> 29cabdff1aSopenharmony_ci#include "avcodec.h" 30cabdff1aSopenharmony_ci#include "bswapdsp.h" 31cabdff1aSopenharmony_ci#include "bytestream.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 37cabdff1aSopenharmony_ci#define MAX_CHANNELS 8 38cabdff1aSopenharmony_ci#define MAX_BLOCKSIZE 65535 39cabdff1aSopenharmony_ci 40cabdff1aSopenharmony_ci#define OUT_BUFFER_SIZE 16384 41cabdff1aSopenharmony_ci 42cabdff1aSopenharmony_ci#define ULONGSIZE 2 43cabdff1aSopenharmony_ci 44cabdff1aSopenharmony_ci#define WAVE_FORMAT_PCM 0x0001 45cabdff1aSopenharmony_ci 46cabdff1aSopenharmony_ci#define DEFAULT_BLOCK_SIZE 256 47cabdff1aSopenharmony_ci 48cabdff1aSopenharmony_ci#define TYPESIZE 4 49cabdff1aSopenharmony_ci#define CHANSIZE 0 50cabdff1aSopenharmony_ci#define LPCQSIZE 2 51cabdff1aSopenharmony_ci#define ENERGYSIZE 3 52cabdff1aSopenharmony_ci#define BITSHIFTSIZE 2 53cabdff1aSopenharmony_ci 54cabdff1aSopenharmony_ci#define TYPE_S8 1 55cabdff1aSopenharmony_ci#define TYPE_U8 2 56cabdff1aSopenharmony_ci#define TYPE_S16HL 3 57cabdff1aSopenharmony_ci#define TYPE_U16HL 4 58cabdff1aSopenharmony_ci#define TYPE_S16LH 5 59cabdff1aSopenharmony_ci#define TYPE_U16LH 6 60cabdff1aSopenharmony_ci 61cabdff1aSopenharmony_ci#define NWRAP 3 62cabdff1aSopenharmony_ci#define NSKIPSIZE 1 63cabdff1aSopenharmony_ci 64cabdff1aSopenharmony_ci#define LPCQUANT 5 65cabdff1aSopenharmony_ci#define V2LPCQOFFSET (1 << LPCQUANT) 66cabdff1aSopenharmony_ci 67cabdff1aSopenharmony_ci#define FNSIZE 2 68cabdff1aSopenharmony_ci#define FN_DIFF0 0 69cabdff1aSopenharmony_ci#define FN_DIFF1 1 70cabdff1aSopenharmony_ci#define FN_DIFF2 2 71cabdff1aSopenharmony_ci#define FN_DIFF3 3 72cabdff1aSopenharmony_ci#define FN_QUIT 4 73cabdff1aSopenharmony_ci#define FN_BLOCKSIZE 5 74cabdff1aSopenharmony_ci#define FN_BITSHIFT 6 75cabdff1aSopenharmony_ci#define FN_QLPC 7 76cabdff1aSopenharmony_ci#define FN_ZERO 8 77cabdff1aSopenharmony_ci#define FN_VERBATIM 9 78cabdff1aSopenharmony_ci 79cabdff1aSopenharmony_ci/** indicates if the FN_* command is audio or non-audio */ 80cabdff1aSopenharmony_cistatic const uint8_t is_audio_command[10] = { 1, 1, 1, 1, 0, 0, 0, 1, 1, 0 }; 81cabdff1aSopenharmony_ci 82cabdff1aSopenharmony_ci#define VERBATIM_CKSIZE_SIZE 5 83cabdff1aSopenharmony_ci#define VERBATIM_BYTE_SIZE 8 84cabdff1aSopenharmony_ci#define CANONICAL_HEADER_SIZE 44 85cabdff1aSopenharmony_ci 86cabdff1aSopenharmony_citypedef struct ShortenContext { 87cabdff1aSopenharmony_ci AVCodecContext *avctx; 88cabdff1aSopenharmony_ci GetBitContext gb; 89cabdff1aSopenharmony_ci 90cabdff1aSopenharmony_ci int min_framesize, max_framesize; 91cabdff1aSopenharmony_ci unsigned channels; 92cabdff1aSopenharmony_ci 93cabdff1aSopenharmony_ci int32_t *decoded[MAX_CHANNELS]; 94cabdff1aSopenharmony_ci int32_t *decoded_base[MAX_CHANNELS]; 95cabdff1aSopenharmony_ci int32_t *offset[MAX_CHANNELS]; 96cabdff1aSopenharmony_ci int *coeffs; 97cabdff1aSopenharmony_ci uint8_t *bitstream; 98cabdff1aSopenharmony_ci int bitstream_size; 99cabdff1aSopenharmony_ci int bitstream_index; 100cabdff1aSopenharmony_ci unsigned int allocated_bitstream_size; 101cabdff1aSopenharmony_ci int header_size; 102cabdff1aSopenharmony_ci uint8_t header[OUT_BUFFER_SIZE]; 103cabdff1aSopenharmony_ci int version; 104cabdff1aSopenharmony_ci int cur_chan; 105cabdff1aSopenharmony_ci int bitshift; 106cabdff1aSopenharmony_ci int nmean; 107cabdff1aSopenharmony_ci int internal_ftype; 108cabdff1aSopenharmony_ci int nwrap; 109cabdff1aSopenharmony_ci int blocksize; 110cabdff1aSopenharmony_ci int bitindex; 111cabdff1aSopenharmony_ci int32_t lpcqoffset; 112cabdff1aSopenharmony_ci int got_header; 113cabdff1aSopenharmony_ci int got_quit_command; 114cabdff1aSopenharmony_ci int swap; 115cabdff1aSopenharmony_ci BswapDSPContext bdsp; 116cabdff1aSopenharmony_ci} ShortenContext; 117cabdff1aSopenharmony_ci 118cabdff1aSopenharmony_cistatic av_cold int shorten_decode_init(AVCodecContext *avctx) 119cabdff1aSopenharmony_ci{ 120cabdff1aSopenharmony_ci ShortenContext *s = avctx->priv_data; 121cabdff1aSopenharmony_ci s->avctx = avctx; 122cabdff1aSopenharmony_ci 123cabdff1aSopenharmony_ci ff_bswapdsp_init(&s->bdsp); 124cabdff1aSopenharmony_ci 125cabdff1aSopenharmony_ci return 0; 126cabdff1aSopenharmony_ci} 127cabdff1aSopenharmony_ci 128cabdff1aSopenharmony_cistatic int allocate_buffers(ShortenContext *s) 129cabdff1aSopenharmony_ci{ 130cabdff1aSopenharmony_ci int i, chan, err; 131cabdff1aSopenharmony_ci 132cabdff1aSopenharmony_ci for (chan = 0; chan < s->channels; chan++) { 133cabdff1aSopenharmony_ci if (FFMAX(1, s->nmean) >= UINT_MAX / sizeof(int32_t)) { 134cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "nmean too large\n"); 135cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 136cabdff1aSopenharmony_ci } 137cabdff1aSopenharmony_ci if (s->blocksize + (uint64_t)s->nwrap >= UINT_MAX / sizeof(int32_t)) { 138cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, 139cabdff1aSopenharmony_ci "s->blocksize + s->nwrap too large\n"); 140cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 141cabdff1aSopenharmony_ci } 142cabdff1aSopenharmony_ci 143cabdff1aSopenharmony_ci if ((err = av_reallocp_array(&s->offset[chan], 144cabdff1aSopenharmony_ci sizeof(int32_t), 145cabdff1aSopenharmony_ci FFMAX(1, s->nmean))) < 0) 146cabdff1aSopenharmony_ci return err; 147cabdff1aSopenharmony_ci 148cabdff1aSopenharmony_ci if ((err = av_reallocp_array(&s->decoded_base[chan], (s->blocksize + s->nwrap), 149cabdff1aSopenharmony_ci sizeof(s->decoded_base[0][0]))) < 0) 150cabdff1aSopenharmony_ci return err; 151cabdff1aSopenharmony_ci for (i = 0; i < s->nwrap; i++) 152cabdff1aSopenharmony_ci s->decoded_base[chan][i] = 0; 153cabdff1aSopenharmony_ci s->decoded[chan] = s->decoded_base[chan] + s->nwrap; 154cabdff1aSopenharmony_ci } 155cabdff1aSopenharmony_ci 156cabdff1aSopenharmony_ci if ((err = av_reallocp_array(&s->coeffs, s->nwrap, sizeof(*s->coeffs))) < 0) 157cabdff1aSopenharmony_ci return err; 158cabdff1aSopenharmony_ci 159cabdff1aSopenharmony_ci return 0; 160cabdff1aSopenharmony_ci} 161cabdff1aSopenharmony_ci 162cabdff1aSopenharmony_cistatic inline unsigned int get_uint(ShortenContext *s, int k) 163cabdff1aSopenharmony_ci{ 164cabdff1aSopenharmony_ci if (s->version != 0) { 165cabdff1aSopenharmony_ci k = get_ur_golomb_shorten(&s->gb, ULONGSIZE); 166cabdff1aSopenharmony_ci if (k > 31U) 167cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 168cabdff1aSopenharmony_ci } 169cabdff1aSopenharmony_ci return get_ur_golomb_shorten(&s->gb, k); 170cabdff1aSopenharmony_ci} 171cabdff1aSopenharmony_ci 172cabdff1aSopenharmony_cistatic void fix_bitshift(ShortenContext *s, int32_t *buffer) 173cabdff1aSopenharmony_ci{ 174cabdff1aSopenharmony_ci int i; 175cabdff1aSopenharmony_ci 176cabdff1aSopenharmony_ci if (s->bitshift == 32) { 177cabdff1aSopenharmony_ci for (i = 0; i < s->blocksize; i++) 178cabdff1aSopenharmony_ci buffer[i] = 0; 179cabdff1aSopenharmony_ci } else if (s->bitshift != 0) { 180cabdff1aSopenharmony_ci for (i = 0; i < s->blocksize; i++) 181cabdff1aSopenharmony_ci buffer[i] *= 1U << s->bitshift; 182cabdff1aSopenharmony_ci } 183cabdff1aSopenharmony_ci} 184cabdff1aSopenharmony_ci 185cabdff1aSopenharmony_cistatic int init_offset(ShortenContext *s) 186cabdff1aSopenharmony_ci{ 187cabdff1aSopenharmony_ci int32_t mean = 0; 188cabdff1aSopenharmony_ci int chan, i; 189cabdff1aSopenharmony_ci int nblock = FFMAX(1, s->nmean); 190cabdff1aSopenharmony_ci /* initialise offset */ 191cabdff1aSopenharmony_ci switch (s->internal_ftype) { 192cabdff1aSopenharmony_ci case TYPE_U8: 193cabdff1aSopenharmony_ci s->avctx->sample_fmt = AV_SAMPLE_FMT_U8P; 194cabdff1aSopenharmony_ci mean = 0x80; 195cabdff1aSopenharmony_ci break; 196cabdff1aSopenharmony_ci case TYPE_S16HL: 197cabdff1aSopenharmony_ci case TYPE_S16LH: 198cabdff1aSopenharmony_ci s->avctx->sample_fmt = AV_SAMPLE_FMT_S16P; 199cabdff1aSopenharmony_ci break; 200cabdff1aSopenharmony_ci default: 201cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "unknown audio type\n"); 202cabdff1aSopenharmony_ci return AVERROR_PATCHWELCOME; 203cabdff1aSopenharmony_ci } 204cabdff1aSopenharmony_ci 205cabdff1aSopenharmony_ci for (chan = 0; chan < s->channels; chan++) 206cabdff1aSopenharmony_ci for (i = 0; i < nblock; i++) 207cabdff1aSopenharmony_ci s->offset[chan][i] = mean; 208cabdff1aSopenharmony_ci return 0; 209cabdff1aSopenharmony_ci} 210cabdff1aSopenharmony_ci 211cabdff1aSopenharmony_cistatic int decode_aiff_header(AVCodecContext *avctx, const uint8_t *header, 212cabdff1aSopenharmony_ci int header_size) 213cabdff1aSopenharmony_ci{ 214cabdff1aSopenharmony_ci ShortenContext *s = avctx->priv_data; 215cabdff1aSopenharmony_ci int len, bps, exp; 216cabdff1aSopenharmony_ci GetByteContext gb; 217cabdff1aSopenharmony_ci uint64_t val; 218cabdff1aSopenharmony_ci uint32_t tag; 219cabdff1aSopenharmony_ci 220cabdff1aSopenharmony_ci bytestream2_init(&gb, header, header_size); 221cabdff1aSopenharmony_ci 222cabdff1aSopenharmony_ci if (bytestream2_get_le32(&gb) != MKTAG('F', 'O', 'R', 'M')) { 223cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "missing FORM tag\n"); 224cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 225cabdff1aSopenharmony_ci } 226cabdff1aSopenharmony_ci 227cabdff1aSopenharmony_ci bytestream2_skip(&gb, 4); /* chunk size */ 228cabdff1aSopenharmony_ci 229cabdff1aSopenharmony_ci tag = bytestream2_get_le32(&gb); 230cabdff1aSopenharmony_ci if (tag != MKTAG('A', 'I', 'F', 'F') && 231cabdff1aSopenharmony_ci tag != MKTAG('A', 'I', 'F', 'C')) { 232cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "missing AIFF tag\n"); 233cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 234cabdff1aSopenharmony_ci } 235cabdff1aSopenharmony_ci 236cabdff1aSopenharmony_ci while (bytestream2_get_le32(&gb) != MKTAG('C', 'O', 'M', 'M')) { 237cabdff1aSopenharmony_ci len = bytestream2_get_be32(&gb); 238cabdff1aSopenharmony_ci if (len < 0 || bytestream2_get_bytes_left(&gb) < 18LL + len + (len&1)) { 239cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "no COMM chunk found\n"); 240cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 241cabdff1aSopenharmony_ci } 242cabdff1aSopenharmony_ci bytestream2_skip(&gb, len + (len & 1)); 243cabdff1aSopenharmony_ci } 244cabdff1aSopenharmony_ci len = bytestream2_get_be32(&gb); 245cabdff1aSopenharmony_ci 246cabdff1aSopenharmony_ci if (len < 18) { 247cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "COMM chunk was too short\n"); 248cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 249cabdff1aSopenharmony_ci } 250cabdff1aSopenharmony_ci 251cabdff1aSopenharmony_ci bytestream2_skip(&gb, 6); 252cabdff1aSopenharmony_ci bps = bytestream2_get_be16(&gb); 253cabdff1aSopenharmony_ci avctx->bits_per_coded_sample = bps; 254cabdff1aSopenharmony_ci 255cabdff1aSopenharmony_ci s->swap = tag == MKTAG('A', 'I', 'F', 'C'); 256cabdff1aSopenharmony_ci 257cabdff1aSopenharmony_ci if (bps != 16 && bps != 8) { 258cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "unsupported number of bits per sample: %d\n", bps); 259cabdff1aSopenharmony_ci return AVERROR(ENOSYS); 260cabdff1aSopenharmony_ci } 261cabdff1aSopenharmony_ci 262cabdff1aSopenharmony_ci exp = bytestream2_get_be16(&gb) - 16383 - 63; 263cabdff1aSopenharmony_ci val = bytestream2_get_be64(&gb); 264cabdff1aSopenharmony_ci if (exp < -63 || exp > 63) { 265cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "exp %d is out of range\n", exp); 266cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 267cabdff1aSopenharmony_ci } 268cabdff1aSopenharmony_ci if (exp >= 0) 269cabdff1aSopenharmony_ci avctx->sample_rate = val << exp; 270cabdff1aSopenharmony_ci else 271cabdff1aSopenharmony_ci avctx->sample_rate = (val + (1ULL<<(-exp-1))) >> -exp; 272cabdff1aSopenharmony_ci len -= 18; 273cabdff1aSopenharmony_ci if (len > 0) 274cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_INFO, "%d header bytes unparsed\n", len); 275cabdff1aSopenharmony_ci 276cabdff1aSopenharmony_ci return 0; 277cabdff1aSopenharmony_ci} 278cabdff1aSopenharmony_ci 279cabdff1aSopenharmony_cistatic int decode_wave_header(AVCodecContext *avctx, const uint8_t *header, 280cabdff1aSopenharmony_ci int header_size) 281cabdff1aSopenharmony_ci{ 282cabdff1aSopenharmony_ci int len, bps; 283cabdff1aSopenharmony_ci short wave_format; 284cabdff1aSopenharmony_ci GetByteContext gb; 285cabdff1aSopenharmony_ci 286cabdff1aSopenharmony_ci bytestream2_init(&gb, header, header_size); 287cabdff1aSopenharmony_ci 288cabdff1aSopenharmony_ci if (bytestream2_get_le32(&gb) != MKTAG('R', 'I', 'F', 'F')) { 289cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "missing RIFF tag\n"); 290cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 291cabdff1aSopenharmony_ci } 292cabdff1aSopenharmony_ci 293cabdff1aSopenharmony_ci bytestream2_skip(&gb, 4); /* chunk size */ 294cabdff1aSopenharmony_ci 295cabdff1aSopenharmony_ci if (bytestream2_get_le32(&gb) != MKTAG('W', 'A', 'V', 'E')) { 296cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "missing WAVE tag\n"); 297cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 298cabdff1aSopenharmony_ci } 299cabdff1aSopenharmony_ci 300cabdff1aSopenharmony_ci while (bytestream2_get_le32(&gb) != MKTAG('f', 'm', 't', ' ')) { 301cabdff1aSopenharmony_ci len = bytestream2_get_le32(&gb); 302cabdff1aSopenharmony_ci bytestream2_skip(&gb, len); 303cabdff1aSopenharmony_ci if (len < 0 || bytestream2_get_bytes_left(&gb) < 16) { 304cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "no fmt chunk found\n"); 305cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 306cabdff1aSopenharmony_ci } 307cabdff1aSopenharmony_ci } 308cabdff1aSopenharmony_ci len = bytestream2_get_le32(&gb); 309cabdff1aSopenharmony_ci 310cabdff1aSopenharmony_ci if (len < 16) { 311cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "fmt chunk was too short\n"); 312cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 313cabdff1aSopenharmony_ci } 314cabdff1aSopenharmony_ci 315cabdff1aSopenharmony_ci wave_format = bytestream2_get_le16(&gb); 316cabdff1aSopenharmony_ci 317cabdff1aSopenharmony_ci switch (wave_format) { 318cabdff1aSopenharmony_ci case WAVE_FORMAT_PCM: 319cabdff1aSopenharmony_ci break; 320cabdff1aSopenharmony_ci default: 321cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "unsupported wave format\n"); 322cabdff1aSopenharmony_ci return AVERROR(ENOSYS); 323cabdff1aSopenharmony_ci } 324cabdff1aSopenharmony_ci 325cabdff1aSopenharmony_ci bytestream2_skip(&gb, 2); // skip channels (already got from shorten header) 326cabdff1aSopenharmony_ci avctx->sample_rate = bytestream2_get_le32(&gb); 327cabdff1aSopenharmony_ci bytestream2_skip(&gb, 4); // skip bit rate (represents original uncompressed bit rate) 328cabdff1aSopenharmony_ci bytestream2_skip(&gb, 2); // skip block align (not needed) 329cabdff1aSopenharmony_ci bps = bytestream2_get_le16(&gb); 330cabdff1aSopenharmony_ci avctx->bits_per_coded_sample = bps; 331cabdff1aSopenharmony_ci 332cabdff1aSopenharmony_ci if (bps != 16 && bps != 8) { 333cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "unsupported number of bits per sample: %d\n", bps); 334cabdff1aSopenharmony_ci return AVERROR(ENOSYS); 335cabdff1aSopenharmony_ci } 336cabdff1aSopenharmony_ci 337cabdff1aSopenharmony_ci len -= 16; 338cabdff1aSopenharmony_ci if (len > 0) 339cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_INFO, "%d header bytes unparsed\n", len); 340cabdff1aSopenharmony_ci 341cabdff1aSopenharmony_ci return 0; 342cabdff1aSopenharmony_ci} 343cabdff1aSopenharmony_ci 344cabdff1aSopenharmony_cistatic const int fixed_coeffs[][3] = { 345cabdff1aSopenharmony_ci { 0, 0, 0 }, 346cabdff1aSopenharmony_ci { 1, 0, 0 }, 347cabdff1aSopenharmony_ci { 2, -1, 0 }, 348cabdff1aSopenharmony_ci { 3, -3, 1 } 349cabdff1aSopenharmony_ci}; 350cabdff1aSopenharmony_ci 351cabdff1aSopenharmony_cistatic int decode_subframe_lpc(ShortenContext *s, int command, int channel, 352cabdff1aSopenharmony_ci int residual_size, int32_t coffset) 353cabdff1aSopenharmony_ci{ 354cabdff1aSopenharmony_ci int pred_order, sum, qshift, init_sum, i, j; 355cabdff1aSopenharmony_ci const int *coeffs; 356cabdff1aSopenharmony_ci 357cabdff1aSopenharmony_ci if (command == FN_QLPC) { 358cabdff1aSopenharmony_ci /* read/validate prediction order */ 359cabdff1aSopenharmony_ci pred_order = get_ur_golomb_shorten(&s->gb, LPCQSIZE); 360cabdff1aSopenharmony_ci if ((unsigned)pred_order > s->nwrap) { 361cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "invalid pred_order %d\n", 362cabdff1aSopenharmony_ci pred_order); 363cabdff1aSopenharmony_ci return AVERROR(EINVAL); 364cabdff1aSopenharmony_ci } 365cabdff1aSopenharmony_ci /* read LPC coefficients */ 366cabdff1aSopenharmony_ci for (i = 0; i < pred_order; i++) 367cabdff1aSopenharmony_ci s->coeffs[i] = get_sr_golomb_shorten(&s->gb, LPCQUANT); 368cabdff1aSopenharmony_ci coeffs = s->coeffs; 369cabdff1aSopenharmony_ci 370cabdff1aSopenharmony_ci qshift = LPCQUANT; 371cabdff1aSopenharmony_ci } else { 372cabdff1aSopenharmony_ci /* fixed LPC coeffs */ 373cabdff1aSopenharmony_ci pred_order = command; 374cabdff1aSopenharmony_ci if (pred_order >= FF_ARRAY_ELEMS(fixed_coeffs)) { 375cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "invalid pred_order %d\n", 376cabdff1aSopenharmony_ci pred_order); 377cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 378cabdff1aSopenharmony_ci } 379cabdff1aSopenharmony_ci coeffs = fixed_coeffs[pred_order]; 380cabdff1aSopenharmony_ci qshift = 0; 381cabdff1aSopenharmony_ci } 382cabdff1aSopenharmony_ci 383cabdff1aSopenharmony_ci /* subtract offset from previous samples to use in prediction */ 384cabdff1aSopenharmony_ci if (command == FN_QLPC && coffset) 385cabdff1aSopenharmony_ci for (i = -pred_order; i < 0; i++) 386cabdff1aSopenharmony_ci s->decoded[channel][i] -= (unsigned)coffset; 387cabdff1aSopenharmony_ci 388cabdff1aSopenharmony_ci /* decode residual and do LPC prediction */ 389cabdff1aSopenharmony_ci init_sum = pred_order ? (command == FN_QLPC ? s->lpcqoffset : 0) : coffset; 390cabdff1aSopenharmony_ci for (i = 0; i < s->blocksize; i++) { 391cabdff1aSopenharmony_ci sum = init_sum; 392cabdff1aSopenharmony_ci for (j = 0; j < pred_order; j++) 393cabdff1aSopenharmony_ci sum += coeffs[j] * (unsigned)s->decoded[channel][i - j - 1]; 394cabdff1aSopenharmony_ci s->decoded[channel][i] = get_sr_golomb_shorten(&s->gb, residual_size) + 395cabdff1aSopenharmony_ci (unsigned)(sum >> qshift); 396cabdff1aSopenharmony_ci } 397cabdff1aSopenharmony_ci 398cabdff1aSopenharmony_ci /* add offset to current samples */ 399cabdff1aSopenharmony_ci if (command == FN_QLPC && coffset) 400cabdff1aSopenharmony_ci for (i = 0; i < s->blocksize; i++) 401cabdff1aSopenharmony_ci s->decoded[channel][i] += (unsigned)coffset; 402cabdff1aSopenharmony_ci 403cabdff1aSopenharmony_ci return 0; 404cabdff1aSopenharmony_ci} 405cabdff1aSopenharmony_ci 406cabdff1aSopenharmony_cistatic int read_header(ShortenContext *s) 407cabdff1aSopenharmony_ci{ 408cabdff1aSopenharmony_ci int i, ret; 409cabdff1aSopenharmony_ci int maxnlpc = 0; 410cabdff1aSopenharmony_ci /* shorten signature */ 411cabdff1aSopenharmony_ci if (get_bits_long(&s->gb, 32) != AV_RB32("ajkg")) { 412cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "missing shorten magic 'ajkg'\n"); 413cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 414cabdff1aSopenharmony_ci } 415cabdff1aSopenharmony_ci 416cabdff1aSopenharmony_ci s->lpcqoffset = 0; 417cabdff1aSopenharmony_ci s->blocksize = DEFAULT_BLOCK_SIZE; 418cabdff1aSopenharmony_ci s->nmean = -1; 419cabdff1aSopenharmony_ci s->version = get_bits(&s->gb, 8); 420cabdff1aSopenharmony_ci s->internal_ftype = get_uint(s, TYPESIZE); 421cabdff1aSopenharmony_ci 422cabdff1aSopenharmony_ci s->channels = get_uint(s, CHANSIZE); 423cabdff1aSopenharmony_ci if (!s->channels) { 424cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "No channels reported\n"); 425cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 426cabdff1aSopenharmony_ci } 427cabdff1aSopenharmony_ci if (s->channels > MAX_CHANNELS) { 428cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "too many channels: %d\n", s->channels); 429cabdff1aSopenharmony_ci s->channels = 0; 430cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 431cabdff1aSopenharmony_ci } 432cabdff1aSopenharmony_ci if (s->avctx->ch_layout.nb_channels != s->channels) { 433cabdff1aSopenharmony_ci av_channel_layout_uninit(&s->avctx->ch_layout); 434cabdff1aSopenharmony_ci s->avctx->ch_layout.nb_channels = s->channels; 435cabdff1aSopenharmony_ci s->avctx->ch_layout.order = AV_CHANNEL_ORDER_UNSPEC; 436cabdff1aSopenharmony_ci } 437cabdff1aSopenharmony_ci 438cabdff1aSopenharmony_ci /* get blocksize if version > 0 */ 439cabdff1aSopenharmony_ci if (s->version > 0) { 440cabdff1aSopenharmony_ci int skip_bytes; 441cabdff1aSopenharmony_ci unsigned blocksize; 442cabdff1aSopenharmony_ci 443cabdff1aSopenharmony_ci blocksize = get_uint(s, av_log2(DEFAULT_BLOCK_SIZE)); 444cabdff1aSopenharmony_ci if (!blocksize || blocksize > MAX_BLOCKSIZE) { 445cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, 446cabdff1aSopenharmony_ci "invalid or unsupported block size: %d\n", 447cabdff1aSopenharmony_ci blocksize); 448cabdff1aSopenharmony_ci return AVERROR(EINVAL); 449cabdff1aSopenharmony_ci } 450cabdff1aSopenharmony_ci s->blocksize = blocksize; 451cabdff1aSopenharmony_ci 452cabdff1aSopenharmony_ci maxnlpc = get_uint(s, LPCQSIZE); 453cabdff1aSopenharmony_ci if (maxnlpc > 1024U) { 454cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "maxnlpc is: %d\n", maxnlpc); 455cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 456cabdff1aSopenharmony_ci } 457cabdff1aSopenharmony_ci s->nmean = get_uint(s, 0); 458cabdff1aSopenharmony_ci if (s->nmean > 32768U) { 459cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "nmean is: %d\n", s->nmean); 460cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 461cabdff1aSopenharmony_ci } 462cabdff1aSopenharmony_ci 463cabdff1aSopenharmony_ci skip_bytes = get_uint(s, NSKIPSIZE); 464cabdff1aSopenharmony_ci if ((unsigned)skip_bytes > FFMAX(get_bits_left(&s->gb), 0)/8) { 465cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "invalid skip_bytes: %d\n", skip_bytes); 466cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 467cabdff1aSopenharmony_ci } 468cabdff1aSopenharmony_ci 469cabdff1aSopenharmony_ci for (i = 0; i < skip_bytes; i++) 470cabdff1aSopenharmony_ci skip_bits(&s->gb, 8); 471cabdff1aSopenharmony_ci } 472cabdff1aSopenharmony_ci s->nwrap = FFMAX(NWRAP, maxnlpc); 473cabdff1aSopenharmony_ci 474cabdff1aSopenharmony_ci if (s->version > 1) 475cabdff1aSopenharmony_ci s->lpcqoffset = V2LPCQOFFSET; 476cabdff1aSopenharmony_ci 477cabdff1aSopenharmony_ci if (s->avctx->extradata_size > 0) 478cabdff1aSopenharmony_ci goto end; 479cabdff1aSopenharmony_ci 480cabdff1aSopenharmony_ci if (get_ur_golomb_shorten(&s->gb, FNSIZE) != FN_VERBATIM) { 481cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, 482cabdff1aSopenharmony_ci "missing verbatim section at beginning of stream\n"); 483cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 484cabdff1aSopenharmony_ci } 485cabdff1aSopenharmony_ci 486cabdff1aSopenharmony_ci s->header_size = get_ur_golomb_shorten(&s->gb, VERBATIM_CKSIZE_SIZE); 487cabdff1aSopenharmony_ci if (s->header_size >= OUT_BUFFER_SIZE || 488cabdff1aSopenharmony_ci s->header_size < CANONICAL_HEADER_SIZE) { 489cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "header is wrong size: %d\n", 490cabdff1aSopenharmony_ci s->header_size); 491cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 492cabdff1aSopenharmony_ci } 493cabdff1aSopenharmony_ci 494cabdff1aSopenharmony_ci for (i = 0; i < s->header_size; i++) 495cabdff1aSopenharmony_ci s->header[i] = (char)get_ur_golomb_shorten(&s->gb, VERBATIM_BYTE_SIZE); 496cabdff1aSopenharmony_ci 497cabdff1aSopenharmony_ci if (AV_RL32(s->header) == MKTAG('R','I','F','F')) { 498cabdff1aSopenharmony_ci if ((ret = decode_wave_header(s->avctx, s->header, s->header_size)) < 0) 499cabdff1aSopenharmony_ci return ret; 500cabdff1aSopenharmony_ci } else if (AV_RL32(s->header) == MKTAG('F','O','R','M')) { 501cabdff1aSopenharmony_ci if ((ret = decode_aiff_header(s->avctx, s->header, s->header_size)) < 0) 502cabdff1aSopenharmony_ci return ret; 503cabdff1aSopenharmony_ci } else { 504cabdff1aSopenharmony_ci avpriv_report_missing_feature(s->avctx, "unsupported bit packing %" 505cabdff1aSopenharmony_ci PRIX32, AV_RL32(s->header)); 506cabdff1aSopenharmony_ci return AVERROR_PATCHWELCOME; 507cabdff1aSopenharmony_ci } 508cabdff1aSopenharmony_ci 509cabdff1aSopenharmony_ciend: 510cabdff1aSopenharmony_ci 511cabdff1aSopenharmony_ci if ((ret = allocate_buffers(s)) < 0) 512cabdff1aSopenharmony_ci return ret; 513cabdff1aSopenharmony_ci 514cabdff1aSopenharmony_ci if ((ret = init_offset(s)) < 0) 515cabdff1aSopenharmony_ci return ret; 516cabdff1aSopenharmony_ci 517cabdff1aSopenharmony_ci s->cur_chan = 0; 518cabdff1aSopenharmony_ci s->bitshift = 0; 519cabdff1aSopenharmony_ci 520cabdff1aSopenharmony_ci s->got_header = 1; 521cabdff1aSopenharmony_ci 522cabdff1aSopenharmony_ci return 0; 523cabdff1aSopenharmony_ci} 524cabdff1aSopenharmony_ci 525cabdff1aSopenharmony_cistatic int shorten_decode_frame(AVCodecContext *avctx, AVFrame *frame, 526cabdff1aSopenharmony_ci int *got_frame_ptr, AVPacket *avpkt) 527cabdff1aSopenharmony_ci{ 528cabdff1aSopenharmony_ci const uint8_t *buf = avpkt->data; 529cabdff1aSopenharmony_ci int buf_size = avpkt->size; 530cabdff1aSopenharmony_ci ShortenContext *s = avctx->priv_data; 531cabdff1aSopenharmony_ci int i, input_buf_size = 0; 532cabdff1aSopenharmony_ci int ret; 533cabdff1aSopenharmony_ci 534cabdff1aSopenharmony_ci /* allocate internal bitstream buffer */ 535cabdff1aSopenharmony_ci if (s->max_framesize == 0) { 536cabdff1aSopenharmony_ci void *tmp_ptr; 537cabdff1aSopenharmony_ci s->max_framesize = 8192; // should hopefully be enough for the first header 538cabdff1aSopenharmony_ci tmp_ptr = av_fast_realloc(s->bitstream, &s->allocated_bitstream_size, 539cabdff1aSopenharmony_ci s->max_framesize + AV_INPUT_BUFFER_PADDING_SIZE); 540cabdff1aSopenharmony_ci if (!tmp_ptr) { 541cabdff1aSopenharmony_ci s->max_framesize = 0; 542cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "error allocating bitstream buffer\n"); 543cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 544cabdff1aSopenharmony_ci } 545cabdff1aSopenharmony_ci memset(tmp_ptr, 0, s->allocated_bitstream_size); 546cabdff1aSopenharmony_ci s->bitstream = tmp_ptr; 547cabdff1aSopenharmony_ci } 548cabdff1aSopenharmony_ci 549cabdff1aSopenharmony_ci /* append current packet data to bitstream buffer */ 550cabdff1aSopenharmony_ci buf_size = FFMIN(buf_size, s->max_framesize - s->bitstream_size); 551cabdff1aSopenharmony_ci input_buf_size = buf_size; 552cabdff1aSopenharmony_ci 553cabdff1aSopenharmony_ci if (s->bitstream_index + s->bitstream_size + buf_size + AV_INPUT_BUFFER_PADDING_SIZE > 554cabdff1aSopenharmony_ci s->allocated_bitstream_size) { 555cabdff1aSopenharmony_ci memmove(s->bitstream, &s->bitstream[s->bitstream_index], 556cabdff1aSopenharmony_ci s->bitstream_size); 557cabdff1aSopenharmony_ci s->bitstream_index = 0; 558cabdff1aSopenharmony_ci } 559cabdff1aSopenharmony_ci if (buf) 560cabdff1aSopenharmony_ci memcpy(&s->bitstream[s->bitstream_index + s->bitstream_size], buf, 561cabdff1aSopenharmony_ci buf_size); 562cabdff1aSopenharmony_ci buf = &s->bitstream[s->bitstream_index]; 563cabdff1aSopenharmony_ci buf_size += s->bitstream_size; 564cabdff1aSopenharmony_ci s->bitstream_size = buf_size; 565cabdff1aSopenharmony_ci memset(buf + buf_size, 0, AV_INPUT_BUFFER_PADDING_SIZE); 566cabdff1aSopenharmony_ci 567cabdff1aSopenharmony_ci /* do not decode until buffer has at least max_framesize bytes or 568cabdff1aSopenharmony_ci * the end of the file has been reached */ 569cabdff1aSopenharmony_ci if (buf_size < s->max_framesize && avpkt->data) { 570cabdff1aSopenharmony_ci *got_frame_ptr = 0; 571cabdff1aSopenharmony_ci return input_buf_size; 572cabdff1aSopenharmony_ci } 573cabdff1aSopenharmony_ci /* init and position bitstream reader */ 574cabdff1aSopenharmony_ci if ((ret = init_get_bits8(&s->gb, buf, buf_size)) < 0) 575cabdff1aSopenharmony_ci return ret; 576cabdff1aSopenharmony_ci skip_bits(&s->gb, s->bitindex); 577cabdff1aSopenharmony_ci 578cabdff1aSopenharmony_ci /* process header or next subblock */ 579cabdff1aSopenharmony_ci if (!s->got_header) { 580cabdff1aSopenharmony_ci 581cabdff1aSopenharmony_ci if ((ret = read_header(s)) < 0) 582cabdff1aSopenharmony_ci return ret; 583cabdff1aSopenharmony_ci 584cabdff1aSopenharmony_ci if (avpkt->size) { 585cabdff1aSopenharmony_ci int max_framesize; 586cabdff1aSopenharmony_ci void *tmp_ptr; 587cabdff1aSopenharmony_ci 588cabdff1aSopenharmony_ci max_framesize = FFMAX(s->max_framesize, s->blocksize * s->channels * 8); 589cabdff1aSopenharmony_ci tmp_ptr = av_fast_realloc(s->bitstream, &s->allocated_bitstream_size, 590cabdff1aSopenharmony_ci max_framesize + AV_INPUT_BUFFER_PADDING_SIZE); 591cabdff1aSopenharmony_ci if (!tmp_ptr) { 592cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "error allocating bitstream buffer\n"); 593cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 594cabdff1aSopenharmony_ci } 595cabdff1aSopenharmony_ci s->bitstream = tmp_ptr; 596cabdff1aSopenharmony_ci s->max_framesize = max_framesize; 597cabdff1aSopenharmony_ci *got_frame_ptr = 0; 598cabdff1aSopenharmony_ci goto finish_frame; 599cabdff1aSopenharmony_ci } 600cabdff1aSopenharmony_ci } 601cabdff1aSopenharmony_ci 602cabdff1aSopenharmony_ci /* if quit command was read previously, don't decode anything */ 603cabdff1aSopenharmony_ci if (s->got_quit_command) { 604cabdff1aSopenharmony_ci *got_frame_ptr = 0; 605cabdff1aSopenharmony_ci return avpkt->size; 606cabdff1aSopenharmony_ci } 607cabdff1aSopenharmony_ci 608cabdff1aSopenharmony_ci s->cur_chan = 0; 609cabdff1aSopenharmony_ci while (s->cur_chan < s->channels) { 610cabdff1aSopenharmony_ci unsigned cmd; 611cabdff1aSopenharmony_ci int len; 612cabdff1aSopenharmony_ci 613cabdff1aSopenharmony_ci if (get_bits_left(&s->gb) < 3 + FNSIZE) { 614cabdff1aSopenharmony_ci *got_frame_ptr = 0; 615cabdff1aSopenharmony_ci break; 616cabdff1aSopenharmony_ci } 617cabdff1aSopenharmony_ci 618cabdff1aSopenharmony_ci cmd = get_ur_golomb_shorten(&s->gb, FNSIZE); 619cabdff1aSopenharmony_ci 620cabdff1aSopenharmony_ci if (cmd > FN_VERBATIM) { 621cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "unknown shorten function %d\n", cmd); 622cabdff1aSopenharmony_ci *got_frame_ptr = 0; 623cabdff1aSopenharmony_ci break; 624cabdff1aSopenharmony_ci } 625cabdff1aSopenharmony_ci 626cabdff1aSopenharmony_ci if (!is_audio_command[cmd]) { 627cabdff1aSopenharmony_ci /* process non-audio command */ 628cabdff1aSopenharmony_ci switch (cmd) { 629cabdff1aSopenharmony_ci case FN_VERBATIM: 630cabdff1aSopenharmony_ci len = get_ur_golomb_shorten(&s->gb, VERBATIM_CKSIZE_SIZE); 631cabdff1aSopenharmony_ci if (len < 0 || len > get_bits_left(&s->gb)) { 632cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "verbatim length %d invalid\n", 633cabdff1aSopenharmony_ci len); 634cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 635cabdff1aSopenharmony_ci } 636cabdff1aSopenharmony_ci while (len--) 637cabdff1aSopenharmony_ci get_ur_golomb_shorten(&s->gb, VERBATIM_BYTE_SIZE); 638cabdff1aSopenharmony_ci break; 639cabdff1aSopenharmony_ci case FN_BITSHIFT: { 640cabdff1aSopenharmony_ci unsigned bitshift = get_ur_golomb_shorten(&s->gb, BITSHIFTSIZE); 641cabdff1aSopenharmony_ci if (bitshift > 32) { 642cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "bitshift %d is invalid\n", 643cabdff1aSopenharmony_ci bitshift); 644cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 645cabdff1aSopenharmony_ci } 646cabdff1aSopenharmony_ci s->bitshift = bitshift; 647cabdff1aSopenharmony_ci break; 648cabdff1aSopenharmony_ci } 649cabdff1aSopenharmony_ci case FN_BLOCKSIZE: { 650cabdff1aSopenharmony_ci unsigned blocksize = get_uint(s, av_log2(s->blocksize)); 651cabdff1aSopenharmony_ci if (blocksize > s->blocksize) { 652cabdff1aSopenharmony_ci avpriv_report_missing_feature(avctx, 653cabdff1aSopenharmony_ci "Increasing block size"); 654cabdff1aSopenharmony_ci return AVERROR_PATCHWELCOME; 655cabdff1aSopenharmony_ci } 656cabdff1aSopenharmony_ci if (!blocksize || blocksize > MAX_BLOCKSIZE) { 657cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "invalid or unsupported " 658cabdff1aSopenharmony_ci "block size: %d\n", blocksize); 659cabdff1aSopenharmony_ci return AVERROR(EINVAL); 660cabdff1aSopenharmony_ci } 661cabdff1aSopenharmony_ci s->blocksize = blocksize; 662cabdff1aSopenharmony_ci break; 663cabdff1aSopenharmony_ci } 664cabdff1aSopenharmony_ci case FN_QUIT: 665cabdff1aSopenharmony_ci s->got_quit_command = 1; 666cabdff1aSopenharmony_ci break; 667cabdff1aSopenharmony_ci } 668cabdff1aSopenharmony_ci if (cmd == FN_QUIT) 669cabdff1aSopenharmony_ci break; 670cabdff1aSopenharmony_ci } else { 671cabdff1aSopenharmony_ci /* process audio command */ 672cabdff1aSopenharmony_ci int residual_size = 0; 673cabdff1aSopenharmony_ci int channel = s->cur_chan; 674cabdff1aSopenharmony_ci int32_t coffset; 675cabdff1aSopenharmony_ci 676cabdff1aSopenharmony_ci /* get Rice code for residual decoding */ 677cabdff1aSopenharmony_ci if (cmd != FN_ZERO) { 678cabdff1aSopenharmony_ci residual_size = get_ur_golomb_shorten(&s->gb, ENERGYSIZE); 679cabdff1aSopenharmony_ci /* This is a hack as version 0 differed in the definition 680cabdff1aSopenharmony_ci * of get_sr_golomb_shorten(). */ 681cabdff1aSopenharmony_ci if (s->version == 0) 682cabdff1aSopenharmony_ci residual_size--; 683cabdff1aSopenharmony_ci if (residual_size > 30U) { 684cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "residual size unsupportd: %d\n", residual_size); 685cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 686cabdff1aSopenharmony_ci } 687cabdff1aSopenharmony_ci } 688cabdff1aSopenharmony_ci 689cabdff1aSopenharmony_ci /* calculate sample offset using means from previous blocks */ 690cabdff1aSopenharmony_ci if (s->nmean == 0) 691cabdff1aSopenharmony_ci coffset = s->offset[channel][0]; 692cabdff1aSopenharmony_ci else { 693cabdff1aSopenharmony_ci int32_t sum = (s->version < 2) ? 0 : s->nmean / 2; 694cabdff1aSopenharmony_ci for (i = 0; i < s->nmean; i++) 695cabdff1aSopenharmony_ci sum += (unsigned)s->offset[channel][i]; 696cabdff1aSopenharmony_ci coffset = sum / s->nmean; 697cabdff1aSopenharmony_ci if (s->version >= 2) 698cabdff1aSopenharmony_ci coffset = s->bitshift == 0 ? coffset : coffset >> s->bitshift - 1 >> 1; 699cabdff1aSopenharmony_ci } 700cabdff1aSopenharmony_ci 701cabdff1aSopenharmony_ci /* decode samples for this channel */ 702cabdff1aSopenharmony_ci if (cmd == FN_ZERO) { 703cabdff1aSopenharmony_ci for (i = 0; i < s->blocksize; i++) 704cabdff1aSopenharmony_ci s->decoded[channel][i] = 0; 705cabdff1aSopenharmony_ci } else { 706cabdff1aSopenharmony_ci if ((ret = decode_subframe_lpc(s, cmd, channel, 707cabdff1aSopenharmony_ci residual_size, coffset)) < 0) 708cabdff1aSopenharmony_ci return ret; 709cabdff1aSopenharmony_ci } 710cabdff1aSopenharmony_ci 711cabdff1aSopenharmony_ci /* update means with info from the current block */ 712cabdff1aSopenharmony_ci if (s->nmean > 0) { 713cabdff1aSopenharmony_ci int64_t sum = (s->version < 2) ? 0 : s->blocksize / 2; 714cabdff1aSopenharmony_ci for (i = 0; i < s->blocksize; i++) 715cabdff1aSopenharmony_ci sum += s->decoded[channel][i]; 716cabdff1aSopenharmony_ci 717cabdff1aSopenharmony_ci for (i = 1; i < s->nmean; i++) 718cabdff1aSopenharmony_ci s->offset[channel][i - 1] = s->offset[channel][i]; 719cabdff1aSopenharmony_ci 720cabdff1aSopenharmony_ci if (s->version < 2) 721cabdff1aSopenharmony_ci s->offset[channel][s->nmean - 1] = sum / s->blocksize; 722cabdff1aSopenharmony_ci else 723cabdff1aSopenharmony_ci s->offset[channel][s->nmean - 1] = s->bitshift == 32 ? 0 : (sum / s->blocksize) * (1LL << s->bitshift); 724cabdff1aSopenharmony_ci } 725cabdff1aSopenharmony_ci 726cabdff1aSopenharmony_ci /* copy wrap samples for use with next block */ 727cabdff1aSopenharmony_ci for (i = -s->nwrap; i < 0; i++) 728cabdff1aSopenharmony_ci s->decoded[channel][i] = s->decoded[channel][i + s->blocksize]; 729cabdff1aSopenharmony_ci 730cabdff1aSopenharmony_ci /* shift samples to add in unused zero bits which were removed 731cabdff1aSopenharmony_ci * during encoding */ 732cabdff1aSopenharmony_ci fix_bitshift(s, s->decoded[channel]); 733cabdff1aSopenharmony_ci 734cabdff1aSopenharmony_ci /* if this is the last channel in the block, output the samples */ 735cabdff1aSopenharmony_ci s->cur_chan++; 736cabdff1aSopenharmony_ci if (s->cur_chan == s->channels) { 737cabdff1aSopenharmony_ci uint8_t *samples_u8; 738cabdff1aSopenharmony_ci int16_t *samples_s16; 739cabdff1aSopenharmony_ci int chan; 740cabdff1aSopenharmony_ci 741cabdff1aSopenharmony_ci /* get output buffer */ 742cabdff1aSopenharmony_ci frame->nb_samples = s->blocksize; 743cabdff1aSopenharmony_ci if ((ret = ff_get_buffer(avctx, frame, 0)) < 0) 744cabdff1aSopenharmony_ci return ret; 745cabdff1aSopenharmony_ci 746cabdff1aSopenharmony_ci for (chan = 0; chan < s->channels; chan++) { 747cabdff1aSopenharmony_ci samples_u8 = ((uint8_t **)frame->extended_data)[chan]; 748cabdff1aSopenharmony_ci samples_s16 = ((int16_t **)frame->extended_data)[chan]; 749cabdff1aSopenharmony_ci for (i = 0; i < s->blocksize; i++) { 750cabdff1aSopenharmony_ci switch (s->internal_ftype) { 751cabdff1aSopenharmony_ci case TYPE_U8: 752cabdff1aSopenharmony_ci *samples_u8++ = av_clip_uint8(s->decoded[chan][i]); 753cabdff1aSopenharmony_ci break; 754cabdff1aSopenharmony_ci case TYPE_S16HL: 755cabdff1aSopenharmony_ci case TYPE_S16LH: 756cabdff1aSopenharmony_ci *samples_s16++ = av_clip_int16(s->decoded[chan][i]); 757cabdff1aSopenharmony_ci break; 758cabdff1aSopenharmony_ci } 759cabdff1aSopenharmony_ci } 760cabdff1aSopenharmony_ci if (s->swap && s->internal_ftype != TYPE_U8) 761cabdff1aSopenharmony_ci s->bdsp.bswap16_buf(((uint16_t **)frame->extended_data)[chan], 762cabdff1aSopenharmony_ci ((uint16_t **)frame->extended_data)[chan], 763cabdff1aSopenharmony_ci s->blocksize); 764cabdff1aSopenharmony_ci 765cabdff1aSopenharmony_ci } 766cabdff1aSopenharmony_ci 767cabdff1aSopenharmony_ci *got_frame_ptr = 1; 768cabdff1aSopenharmony_ci } 769cabdff1aSopenharmony_ci } 770cabdff1aSopenharmony_ci } 771cabdff1aSopenharmony_ci if (s->cur_chan < s->channels) 772cabdff1aSopenharmony_ci *got_frame_ptr = 0; 773cabdff1aSopenharmony_ci 774cabdff1aSopenharmony_cifinish_frame: 775cabdff1aSopenharmony_ci s->bitindex = get_bits_count(&s->gb) - 8 * (get_bits_count(&s->gb) / 8); 776cabdff1aSopenharmony_ci i = get_bits_count(&s->gb) / 8; 777cabdff1aSopenharmony_ci if (i > buf_size) { 778cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "overread: %d\n", i - buf_size); 779cabdff1aSopenharmony_ci s->bitstream_size = 0; 780cabdff1aSopenharmony_ci s->bitstream_index = 0; 781cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 782cabdff1aSopenharmony_ci } 783cabdff1aSopenharmony_ci if (s->bitstream_size) { 784cabdff1aSopenharmony_ci s->bitstream_index += i; 785cabdff1aSopenharmony_ci s->bitstream_size -= i; 786cabdff1aSopenharmony_ci return input_buf_size; 787cabdff1aSopenharmony_ci } else 788cabdff1aSopenharmony_ci return i; 789cabdff1aSopenharmony_ci} 790cabdff1aSopenharmony_ci 791cabdff1aSopenharmony_cistatic av_cold int shorten_decode_close(AVCodecContext *avctx) 792cabdff1aSopenharmony_ci{ 793cabdff1aSopenharmony_ci ShortenContext *s = avctx->priv_data; 794cabdff1aSopenharmony_ci int i; 795cabdff1aSopenharmony_ci 796cabdff1aSopenharmony_ci for (i = 0; i < s->channels; i++) { 797cabdff1aSopenharmony_ci s->decoded[i] = NULL; 798cabdff1aSopenharmony_ci av_freep(&s->decoded_base[i]); 799cabdff1aSopenharmony_ci av_freep(&s->offset[i]); 800cabdff1aSopenharmony_ci } 801cabdff1aSopenharmony_ci av_freep(&s->bitstream); 802cabdff1aSopenharmony_ci av_freep(&s->coeffs); 803cabdff1aSopenharmony_ci 804cabdff1aSopenharmony_ci return 0; 805cabdff1aSopenharmony_ci} 806cabdff1aSopenharmony_ci 807cabdff1aSopenharmony_ciconst FFCodec ff_shorten_decoder = { 808cabdff1aSopenharmony_ci .p.name = "shorten", 809cabdff1aSopenharmony_ci .p.long_name = NULL_IF_CONFIG_SMALL("Shorten"), 810cabdff1aSopenharmony_ci .p.type = AVMEDIA_TYPE_AUDIO, 811cabdff1aSopenharmony_ci .p.id = AV_CODEC_ID_SHORTEN, 812cabdff1aSopenharmony_ci .priv_data_size = sizeof(ShortenContext), 813cabdff1aSopenharmony_ci .init = shorten_decode_init, 814cabdff1aSopenharmony_ci .close = shorten_decode_close, 815cabdff1aSopenharmony_ci FF_CODEC_DECODE_CB(shorten_decode_frame), 816cabdff1aSopenharmony_ci .p.capabilities = AV_CODEC_CAP_CHANNEL_CONF | 817cabdff1aSopenharmony_ci AV_CODEC_CAP_DELAY | 818cabdff1aSopenharmony_ci AV_CODEC_CAP_DR1 | 819cabdff1aSopenharmony_ci AV_CODEC_CAP_SUBFRAMES , 820cabdff1aSopenharmony_ci .p.sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_S16P, 821cabdff1aSopenharmony_ci AV_SAMPLE_FMT_U8P, 822cabdff1aSopenharmony_ci AV_SAMPLE_FMT_NONE }, 823cabdff1aSopenharmony_ci .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE, 824cabdff1aSopenharmony_ci}; 825