1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * Windows Media Audio Lossless decoder 3cabdff1aSopenharmony_ci * Copyright (c) 2007 Baptiste Coudurier, Benjamin Larsson, Ulion 4cabdff1aSopenharmony_ci * Copyright (c) 2008 - 2011 Sascha Sommer, Benjamin Larsson 5cabdff1aSopenharmony_ci * Copyright (c) 2011 Andreas Öman 6cabdff1aSopenharmony_ci * Copyright (c) 2011 - 2012 Mashiat Sarker Shakkhar 7cabdff1aSopenharmony_ci * 8cabdff1aSopenharmony_ci * This file is part of FFmpeg. 9cabdff1aSopenharmony_ci * 10cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 11cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 12cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 13cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 14cabdff1aSopenharmony_ci * 15cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 16cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 17cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 18cabdff1aSopenharmony_ci * Lesser General Public License for more details. 19cabdff1aSopenharmony_ci * 20cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 21cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 22cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 23cabdff1aSopenharmony_ci */ 24cabdff1aSopenharmony_ci 25cabdff1aSopenharmony_ci#include <inttypes.h> 26cabdff1aSopenharmony_ci 27cabdff1aSopenharmony_ci#include "libavutil/attributes.h" 28cabdff1aSopenharmony_ci#include "libavutil/avassert.h" 29cabdff1aSopenharmony_ci#include "libavutil/mem_internal.h" 30cabdff1aSopenharmony_ci 31cabdff1aSopenharmony_ci#include "avcodec.h" 32cabdff1aSopenharmony_ci#include "codec_internal.h" 33cabdff1aSopenharmony_ci#include "internal.h" 34cabdff1aSopenharmony_ci#include "get_bits.h" 35cabdff1aSopenharmony_ci#include "put_bits.h" 36cabdff1aSopenharmony_ci#include "lossless_audiodsp.h" 37cabdff1aSopenharmony_ci#include "wma.h" 38cabdff1aSopenharmony_ci#include "wma_common.h" 39cabdff1aSopenharmony_ci 40cabdff1aSopenharmony_ci/** current decoder limitations */ 41cabdff1aSopenharmony_ci#define WMALL_MAX_CHANNELS 8 ///< max number of handled channels 42cabdff1aSopenharmony_ci#define MAX_SUBFRAMES 32 ///< max number of subframes per channel 43cabdff1aSopenharmony_ci#define MAX_BANDS 29 ///< max number of scale factor bands 44cabdff1aSopenharmony_ci#define MAX_FRAMESIZE 32768 ///< maximum compressed frame size 45cabdff1aSopenharmony_ci#define MAX_ORDER 256 46cabdff1aSopenharmony_ci 47cabdff1aSopenharmony_ci#define WMALL_BLOCK_MIN_BITS 6 ///< log2 of min block size 48cabdff1aSopenharmony_ci#define WMALL_BLOCK_MAX_BITS 14 ///< log2 of max block size 49cabdff1aSopenharmony_ci#define WMALL_BLOCK_MAX_SIZE (1 << WMALL_BLOCK_MAX_BITS) ///< maximum block size 50cabdff1aSopenharmony_ci#define WMALL_BLOCK_SIZES (WMALL_BLOCK_MAX_BITS - WMALL_BLOCK_MIN_BITS + 1) ///< possible block sizes 51cabdff1aSopenharmony_ci 52cabdff1aSopenharmony_ci#define WMALL_COEFF_PAD_SIZE 16 ///< pad coef buffers with 0 for use with SIMD 53cabdff1aSopenharmony_ci 54cabdff1aSopenharmony_ci/** 55cabdff1aSopenharmony_ci * @brief frame-specific decoder context for a single channel 56cabdff1aSopenharmony_ci */ 57cabdff1aSopenharmony_citypedef struct WmallChannelCtx { 58cabdff1aSopenharmony_ci int16_t prev_block_len; ///< length of the previous block 59cabdff1aSopenharmony_ci uint8_t transmit_coefs; 60cabdff1aSopenharmony_ci uint8_t num_subframes; 61cabdff1aSopenharmony_ci uint16_t subframe_len[MAX_SUBFRAMES]; ///< subframe length in samples 62cabdff1aSopenharmony_ci uint16_t subframe_offsets[MAX_SUBFRAMES]; ///< subframe positions in the current frame 63cabdff1aSopenharmony_ci uint8_t cur_subframe; ///< current subframe number 64cabdff1aSopenharmony_ci uint16_t decoded_samples; ///< number of already processed samples 65cabdff1aSopenharmony_ci int quant_step; ///< quantization step for the current subframe 66cabdff1aSopenharmony_ci int transient_counter; ///< number of transient samples from the beginning of the transient zone 67cabdff1aSopenharmony_ci} WmallChannelCtx; 68cabdff1aSopenharmony_ci 69cabdff1aSopenharmony_ci/** 70cabdff1aSopenharmony_ci * @brief main decoder context 71cabdff1aSopenharmony_ci */ 72cabdff1aSopenharmony_citypedef struct WmallDecodeCtx { 73cabdff1aSopenharmony_ci /* generic decoder variables */ 74cabdff1aSopenharmony_ci AVCodecContext *avctx; 75cabdff1aSopenharmony_ci AVFrame *frame; 76cabdff1aSopenharmony_ci LLAudDSPContext dsp; ///< accelerated DSP functions 77cabdff1aSopenharmony_ci uint8_t *frame_data; ///< compressed frame data 78cabdff1aSopenharmony_ci int max_frame_size; ///< max bitstream size 79cabdff1aSopenharmony_ci PutBitContext pb; ///< context for filling the frame_data buffer 80cabdff1aSopenharmony_ci 81cabdff1aSopenharmony_ci /* frame size dependent frame information (set during initialization) */ 82cabdff1aSopenharmony_ci uint32_t decode_flags; ///< used compression features 83cabdff1aSopenharmony_ci int len_prefix; ///< frame is prefixed with its length 84cabdff1aSopenharmony_ci int dynamic_range_compression; ///< frame contains DRC data 85cabdff1aSopenharmony_ci uint8_t bits_per_sample; ///< integer audio sample size for the unscaled IMDCT output (used to scale to [-1.0, 1.0]) 86cabdff1aSopenharmony_ci uint16_t samples_per_frame; ///< number of samples to output 87cabdff1aSopenharmony_ci uint16_t log2_frame_size; 88cabdff1aSopenharmony_ci int8_t num_channels; ///< number of channels in the stream (same as AVCodecContext.num_channels) 89cabdff1aSopenharmony_ci int8_t lfe_channel; ///< lfe channel index 90cabdff1aSopenharmony_ci uint8_t max_num_subframes; 91cabdff1aSopenharmony_ci uint8_t subframe_len_bits; ///< number of bits used for the subframe length 92cabdff1aSopenharmony_ci uint8_t max_subframe_len_bit; ///< flag indicating that the subframe is of maximum size when the first subframe length bit is 1 93cabdff1aSopenharmony_ci uint16_t min_samples_per_subframe; 94cabdff1aSopenharmony_ci 95cabdff1aSopenharmony_ci /* packet decode state */ 96cabdff1aSopenharmony_ci GetBitContext pgb; ///< bitstream reader context for the packet 97cabdff1aSopenharmony_ci int next_packet_start; ///< start offset of the next WMA packet in the demuxer packet 98cabdff1aSopenharmony_ci uint8_t packet_offset; ///< offset to the frame in the packet 99cabdff1aSopenharmony_ci uint8_t packet_sequence_number; ///< current packet number 100cabdff1aSopenharmony_ci int num_saved_bits; ///< saved number of bits 101cabdff1aSopenharmony_ci int frame_offset; ///< frame offset in the bit reservoir 102cabdff1aSopenharmony_ci int subframe_offset; ///< subframe offset in the bit reservoir 103cabdff1aSopenharmony_ci uint8_t packet_loss; ///< set in case of bitstream error 104cabdff1aSopenharmony_ci uint8_t packet_done; ///< set when a packet is fully decoded 105cabdff1aSopenharmony_ci 106cabdff1aSopenharmony_ci /* frame decode state */ 107cabdff1aSopenharmony_ci uint32_t frame_num; ///< current frame number (not used for decoding) 108cabdff1aSopenharmony_ci GetBitContext gb; ///< bitstream reader context 109cabdff1aSopenharmony_ci int buf_bit_size; ///< buffer size in bits 110cabdff1aSopenharmony_ci int16_t *samples_16[WMALL_MAX_CHANNELS]; ///< current sample buffer pointer (16-bit) 111cabdff1aSopenharmony_ci int32_t *samples_32[WMALL_MAX_CHANNELS]; ///< current sample buffer pointer (24-bit) 112cabdff1aSopenharmony_ci uint8_t drc_gain; ///< gain for the DRC tool 113cabdff1aSopenharmony_ci int8_t skip_frame; ///< skip output step 114cabdff1aSopenharmony_ci int8_t parsed_all_subframes; ///< all subframes decoded? 115cabdff1aSopenharmony_ci 116cabdff1aSopenharmony_ci /* subframe/block decode state */ 117cabdff1aSopenharmony_ci int16_t subframe_len; ///< current subframe length 118cabdff1aSopenharmony_ci int8_t channels_for_cur_subframe; ///< number of channels that contain the subframe 119cabdff1aSopenharmony_ci int8_t channel_indexes_for_cur_subframe[WMALL_MAX_CHANNELS]; 120cabdff1aSopenharmony_ci 121cabdff1aSopenharmony_ci WmallChannelCtx channel[WMALL_MAX_CHANNELS]; ///< per channel data 122cabdff1aSopenharmony_ci 123cabdff1aSopenharmony_ci // WMA Lossless-specific 124cabdff1aSopenharmony_ci 125cabdff1aSopenharmony_ci uint8_t do_arith_coding; 126cabdff1aSopenharmony_ci uint8_t do_ac_filter; 127cabdff1aSopenharmony_ci uint8_t do_inter_ch_decorr; 128cabdff1aSopenharmony_ci uint8_t do_mclms; 129cabdff1aSopenharmony_ci uint8_t do_lpc; 130cabdff1aSopenharmony_ci 131cabdff1aSopenharmony_ci int8_t acfilter_order; 132cabdff1aSopenharmony_ci int8_t acfilter_scaling; 133cabdff1aSopenharmony_ci int16_t acfilter_coeffs[16]; 134cabdff1aSopenharmony_ci int acfilter_prevvalues[WMALL_MAX_CHANNELS][16]; 135cabdff1aSopenharmony_ci 136cabdff1aSopenharmony_ci int8_t mclms_order; 137cabdff1aSopenharmony_ci int8_t mclms_scaling; 138cabdff1aSopenharmony_ci int16_t mclms_coeffs[WMALL_MAX_CHANNELS * WMALL_MAX_CHANNELS * 32]; 139cabdff1aSopenharmony_ci int16_t mclms_coeffs_cur[WMALL_MAX_CHANNELS * WMALL_MAX_CHANNELS]; 140cabdff1aSopenharmony_ci int32_t mclms_prevvalues[WMALL_MAX_CHANNELS * 2 * 32]; 141cabdff1aSopenharmony_ci int32_t mclms_updates[WMALL_MAX_CHANNELS * 2 * 32]; 142cabdff1aSopenharmony_ci int mclms_recent; 143cabdff1aSopenharmony_ci 144cabdff1aSopenharmony_ci int movave_scaling; 145cabdff1aSopenharmony_ci int quant_stepsize; 146cabdff1aSopenharmony_ci 147cabdff1aSopenharmony_ci struct { 148cabdff1aSopenharmony_ci int order; 149cabdff1aSopenharmony_ci int scaling; 150cabdff1aSopenharmony_ci int coefsend; 151cabdff1aSopenharmony_ci int bitsend; 152cabdff1aSopenharmony_ci DECLARE_ALIGNED(16, int16_t, coefs)[MAX_ORDER + WMALL_COEFF_PAD_SIZE/sizeof(int16_t)]; 153cabdff1aSopenharmony_ci DECLARE_ALIGNED(16, int32_t, lms_prevvalues)[MAX_ORDER * 2 + WMALL_COEFF_PAD_SIZE/sizeof(int16_t)]; 154cabdff1aSopenharmony_ci DECLARE_ALIGNED(16, int16_t, lms_updates)[MAX_ORDER * 2 + WMALL_COEFF_PAD_SIZE/sizeof(int16_t)]; 155cabdff1aSopenharmony_ci int recent; 156cabdff1aSopenharmony_ci } cdlms[WMALL_MAX_CHANNELS][9]; 157cabdff1aSopenharmony_ci 158cabdff1aSopenharmony_ci int cdlms_ttl[WMALL_MAX_CHANNELS]; 159cabdff1aSopenharmony_ci 160cabdff1aSopenharmony_ci int bV3RTM; 161cabdff1aSopenharmony_ci 162cabdff1aSopenharmony_ci int is_channel_coded[WMALL_MAX_CHANNELS]; 163cabdff1aSopenharmony_ci int update_speed[WMALL_MAX_CHANNELS]; 164cabdff1aSopenharmony_ci 165cabdff1aSopenharmony_ci int transient[WMALL_MAX_CHANNELS]; 166cabdff1aSopenharmony_ci int transient_pos[WMALL_MAX_CHANNELS]; 167cabdff1aSopenharmony_ci int seekable_tile; 168cabdff1aSopenharmony_ci 169cabdff1aSopenharmony_ci unsigned ave_sum[WMALL_MAX_CHANNELS]; 170cabdff1aSopenharmony_ci 171cabdff1aSopenharmony_ci int channel_residues[WMALL_MAX_CHANNELS][WMALL_BLOCK_MAX_SIZE]; 172cabdff1aSopenharmony_ci 173cabdff1aSopenharmony_ci int lpc_coefs[WMALL_MAX_CHANNELS][40]; 174cabdff1aSopenharmony_ci int lpc_order; 175cabdff1aSopenharmony_ci int lpc_scaling; 176cabdff1aSopenharmony_ci int lpc_intbits; 177cabdff1aSopenharmony_ci} WmallDecodeCtx; 178cabdff1aSopenharmony_ci 179cabdff1aSopenharmony_ci/** Get sign of integer (1 for positive, -1 for negative and 0 for zero) */ 180cabdff1aSopenharmony_ci#define WMASIGN(x) (((x) > 0) - ((x) < 0)) 181cabdff1aSopenharmony_ci 182cabdff1aSopenharmony_cistatic av_cold int decode_init(AVCodecContext *avctx) 183cabdff1aSopenharmony_ci{ 184cabdff1aSopenharmony_ci WmallDecodeCtx *s = avctx->priv_data; 185cabdff1aSopenharmony_ci uint8_t *edata_ptr = avctx->extradata; 186cabdff1aSopenharmony_ci unsigned int channel_mask; 187cabdff1aSopenharmony_ci int i, log2_max_num_subframes; 188cabdff1aSopenharmony_ci 189cabdff1aSopenharmony_ci if (avctx->block_align <= 0 || avctx->block_align > (1<<21)) { 190cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "block_align is not set or invalid\n"); 191cabdff1aSopenharmony_ci return AVERROR(EINVAL); 192cabdff1aSopenharmony_ci } 193cabdff1aSopenharmony_ci 194cabdff1aSopenharmony_ci if (avctx->extradata_size >= 18) { 195cabdff1aSopenharmony_ci s->decode_flags = AV_RL16(edata_ptr + 14); 196cabdff1aSopenharmony_ci channel_mask = AV_RL32(edata_ptr + 2); 197cabdff1aSopenharmony_ci s->bits_per_sample = AV_RL16(edata_ptr); 198cabdff1aSopenharmony_ci if (s->bits_per_sample == 16) 199cabdff1aSopenharmony_ci avctx->sample_fmt = AV_SAMPLE_FMT_S16P; 200cabdff1aSopenharmony_ci else if (s->bits_per_sample == 24) { 201cabdff1aSopenharmony_ci avctx->sample_fmt = AV_SAMPLE_FMT_S32P; 202cabdff1aSopenharmony_ci avctx->bits_per_raw_sample = 24; 203cabdff1aSopenharmony_ci } else { 204cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "Unknown bit-depth: %"PRIu8"\n", 205cabdff1aSopenharmony_ci s->bits_per_sample); 206cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 207cabdff1aSopenharmony_ci } 208cabdff1aSopenharmony_ci /* dump the extradata */ 209cabdff1aSopenharmony_ci for (i = 0; i < avctx->extradata_size; i++) 210cabdff1aSopenharmony_ci ff_dlog(avctx, "[%x] ", avctx->extradata[i]); 211cabdff1aSopenharmony_ci ff_dlog(avctx, "\n"); 212cabdff1aSopenharmony_ci 213cabdff1aSopenharmony_ci } else { 214cabdff1aSopenharmony_ci avpriv_request_sample(avctx, "Unsupported extradata size"); 215cabdff1aSopenharmony_ci return AVERROR_PATCHWELCOME; 216cabdff1aSopenharmony_ci } 217cabdff1aSopenharmony_ci 218cabdff1aSopenharmony_ci if (channel_mask) { 219cabdff1aSopenharmony_ci av_channel_layout_uninit(&avctx->ch_layout); 220cabdff1aSopenharmony_ci av_channel_layout_from_mask(&avctx->ch_layout, channel_mask); 221cabdff1aSopenharmony_ci } 222cabdff1aSopenharmony_ci av_assert0(avctx->ch_layout.nb_channels >= 0); 223cabdff1aSopenharmony_ci if (avctx->ch_layout.nb_channels > WMALL_MAX_CHANNELS) { 224cabdff1aSopenharmony_ci avpriv_request_sample(avctx, 225cabdff1aSopenharmony_ci "More than " AV_STRINGIFY(WMALL_MAX_CHANNELS) " channels"); 226cabdff1aSopenharmony_ci return AVERROR_PATCHWELCOME; 227cabdff1aSopenharmony_ci } 228cabdff1aSopenharmony_ci 229cabdff1aSopenharmony_ci s->num_channels = avctx->ch_layout.nb_channels; 230cabdff1aSopenharmony_ci 231cabdff1aSopenharmony_ci /* extract lfe channel position */ 232cabdff1aSopenharmony_ci s->lfe_channel = -1; 233cabdff1aSopenharmony_ci 234cabdff1aSopenharmony_ci if (channel_mask & 8) { 235cabdff1aSopenharmony_ci unsigned int mask; 236cabdff1aSopenharmony_ci for (mask = 1; mask < 16; mask <<= 1) 237cabdff1aSopenharmony_ci if (channel_mask & mask) 238cabdff1aSopenharmony_ci ++s->lfe_channel; 239cabdff1aSopenharmony_ci } 240cabdff1aSopenharmony_ci 241cabdff1aSopenharmony_ci s->max_frame_size = MAX_FRAMESIZE * avctx->ch_layout.nb_channels; 242cabdff1aSopenharmony_ci s->frame_data = av_mallocz(s->max_frame_size + AV_INPUT_BUFFER_PADDING_SIZE); 243cabdff1aSopenharmony_ci if (!s->frame_data) 244cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 245cabdff1aSopenharmony_ci 246cabdff1aSopenharmony_ci s->avctx = avctx; 247cabdff1aSopenharmony_ci ff_llauddsp_init(&s->dsp); 248cabdff1aSopenharmony_ci init_put_bits(&s->pb, s->frame_data, s->max_frame_size); 249cabdff1aSopenharmony_ci 250cabdff1aSopenharmony_ci /* generic init */ 251cabdff1aSopenharmony_ci s->log2_frame_size = av_log2(avctx->block_align) + 4; 252cabdff1aSopenharmony_ci 253cabdff1aSopenharmony_ci /* frame info */ 254cabdff1aSopenharmony_ci s->skip_frame = 1; /* skip first frame */ 255cabdff1aSopenharmony_ci s->packet_loss = 1; 256cabdff1aSopenharmony_ci s->len_prefix = s->decode_flags & 0x40; 257cabdff1aSopenharmony_ci 258cabdff1aSopenharmony_ci /* get frame len */ 259cabdff1aSopenharmony_ci s->samples_per_frame = 1 << ff_wma_get_frame_len_bits(avctx->sample_rate, 260cabdff1aSopenharmony_ci 3, s->decode_flags); 261cabdff1aSopenharmony_ci av_assert0(s->samples_per_frame <= WMALL_BLOCK_MAX_SIZE); 262cabdff1aSopenharmony_ci 263cabdff1aSopenharmony_ci /* init previous block len */ 264cabdff1aSopenharmony_ci for (i = 0; i < avctx->ch_layout.nb_channels; i++) 265cabdff1aSopenharmony_ci s->channel[i].prev_block_len = s->samples_per_frame; 266cabdff1aSopenharmony_ci 267cabdff1aSopenharmony_ci /* subframe info */ 268cabdff1aSopenharmony_ci log2_max_num_subframes = (s->decode_flags & 0x38) >> 3; 269cabdff1aSopenharmony_ci s->max_num_subframes = 1 << log2_max_num_subframes; 270cabdff1aSopenharmony_ci s->max_subframe_len_bit = 0; 271cabdff1aSopenharmony_ci s->subframe_len_bits = av_log2(log2_max_num_subframes) + 1; 272cabdff1aSopenharmony_ci 273cabdff1aSopenharmony_ci s->min_samples_per_subframe = s->samples_per_frame / s->max_num_subframes; 274cabdff1aSopenharmony_ci s->dynamic_range_compression = s->decode_flags & 0x80; 275cabdff1aSopenharmony_ci s->bV3RTM = s->decode_flags & 0x100; 276cabdff1aSopenharmony_ci 277cabdff1aSopenharmony_ci if (s->max_num_subframes > MAX_SUBFRAMES) { 278cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "invalid number of subframes %"PRIu8"\n", 279cabdff1aSopenharmony_ci s->max_num_subframes); 280cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 281cabdff1aSopenharmony_ci } 282cabdff1aSopenharmony_ci 283cabdff1aSopenharmony_ci s->frame = av_frame_alloc(); 284cabdff1aSopenharmony_ci if (!s->frame) 285cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 286cabdff1aSopenharmony_ci 287cabdff1aSopenharmony_ci return 0; 288cabdff1aSopenharmony_ci} 289cabdff1aSopenharmony_ci 290cabdff1aSopenharmony_ci/** 291cabdff1aSopenharmony_ci * @brief Decode the subframe length. 292cabdff1aSopenharmony_ci * @param s context 293cabdff1aSopenharmony_ci * @param offset sample offset in the frame 294cabdff1aSopenharmony_ci * @return decoded subframe length on success, < 0 in case of an error 295cabdff1aSopenharmony_ci */ 296cabdff1aSopenharmony_cistatic int decode_subframe_length(WmallDecodeCtx *s, int offset) 297cabdff1aSopenharmony_ci{ 298cabdff1aSopenharmony_ci int frame_len_ratio, subframe_len, len; 299cabdff1aSopenharmony_ci 300cabdff1aSopenharmony_ci /* no need to read from the bitstream when only one length is possible */ 301cabdff1aSopenharmony_ci if (offset == s->samples_per_frame - s->min_samples_per_subframe) 302cabdff1aSopenharmony_ci return s->min_samples_per_subframe; 303cabdff1aSopenharmony_ci 304cabdff1aSopenharmony_ci len = av_log2(s->max_num_subframes - 1) + 1; 305cabdff1aSopenharmony_ci frame_len_ratio = get_bits(&s->gb, len); 306cabdff1aSopenharmony_ci subframe_len = s->min_samples_per_subframe * (frame_len_ratio + 1); 307cabdff1aSopenharmony_ci 308cabdff1aSopenharmony_ci /* sanity check the length */ 309cabdff1aSopenharmony_ci if (subframe_len < s->min_samples_per_subframe || 310cabdff1aSopenharmony_ci subframe_len > s->samples_per_frame) { 311cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "broken frame: subframe_len %i\n", 312cabdff1aSopenharmony_ci subframe_len); 313cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 314cabdff1aSopenharmony_ci } 315cabdff1aSopenharmony_ci return subframe_len; 316cabdff1aSopenharmony_ci} 317cabdff1aSopenharmony_ci 318cabdff1aSopenharmony_ci/** 319cabdff1aSopenharmony_ci * @brief Decode how the data in the frame is split into subframes. 320cabdff1aSopenharmony_ci * Every WMA frame contains the encoded data for a fixed number of 321cabdff1aSopenharmony_ci * samples per channel. The data for every channel might be split 322cabdff1aSopenharmony_ci * into several subframes. This function will reconstruct the list of 323cabdff1aSopenharmony_ci * subframes for every channel. 324cabdff1aSopenharmony_ci * 325cabdff1aSopenharmony_ci * If the subframes are not evenly split, the algorithm estimates the 326cabdff1aSopenharmony_ci * channels with the lowest number of total samples. 327cabdff1aSopenharmony_ci * Afterwards, for each of these channels a bit is read from the 328cabdff1aSopenharmony_ci * bitstream that indicates if the channel contains a subframe with the 329cabdff1aSopenharmony_ci * next subframe size that is going to be read from the bitstream or not. 330cabdff1aSopenharmony_ci * If a channel contains such a subframe, the subframe size gets added to 331cabdff1aSopenharmony_ci * the channel's subframe list. 332cabdff1aSopenharmony_ci * The algorithm repeats these steps until the frame is properly divided 333cabdff1aSopenharmony_ci * between the individual channels. 334cabdff1aSopenharmony_ci * 335cabdff1aSopenharmony_ci * @param s context 336cabdff1aSopenharmony_ci * @return 0 on success, < 0 in case of an error 337cabdff1aSopenharmony_ci */ 338cabdff1aSopenharmony_cistatic int decode_tilehdr(WmallDecodeCtx *s) 339cabdff1aSopenharmony_ci{ 340cabdff1aSopenharmony_ci uint16_t num_samples[WMALL_MAX_CHANNELS] = { 0 }; /* sum of samples for all currently known subframes of a channel */ 341cabdff1aSopenharmony_ci uint8_t contains_subframe[WMALL_MAX_CHANNELS]; /* flag indicating if a channel contains the current subframe */ 342cabdff1aSopenharmony_ci int channels_for_cur_subframe = s->num_channels; /* number of channels that contain the current subframe */ 343cabdff1aSopenharmony_ci int fixed_channel_layout = 0; /* flag indicating that all channels use the same subfra2me offsets and sizes */ 344cabdff1aSopenharmony_ci int min_channel_len = 0; /* smallest sum of samples (channels with this length will be processed first) */ 345cabdff1aSopenharmony_ci int c, tile_aligned; 346cabdff1aSopenharmony_ci 347cabdff1aSopenharmony_ci /* reset tiling information */ 348cabdff1aSopenharmony_ci for (c = 0; c < s->num_channels; c++) 349cabdff1aSopenharmony_ci s->channel[c].num_subframes = 0; 350cabdff1aSopenharmony_ci 351cabdff1aSopenharmony_ci tile_aligned = get_bits1(&s->gb); 352cabdff1aSopenharmony_ci if (s->max_num_subframes == 1 || tile_aligned) 353cabdff1aSopenharmony_ci fixed_channel_layout = 1; 354cabdff1aSopenharmony_ci 355cabdff1aSopenharmony_ci /* loop until the frame data is split between the subframes */ 356cabdff1aSopenharmony_ci do { 357cabdff1aSopenharmony_ci int subframe_len, in_use = 0; 358cabdff1aSopenharmony_ci 359cabdff1aSopenharmony_ci /* check which channels contain the subframe */ 360cabdff1aSopenharmony_ci for (c = 0; c < s->num_channels; c++) { 361cabdff1aSopenharmony_ci if (num_samples[c] == min_channel_len) { 362cabdff1aSopenharmony_ci if (fixed_channel_layout || channels_for_cur_subframe == 1 || 363cabdff1aSopenharmony_ci (min_channel_len == s->samples_per_frame - s->min_samples_per_subframe)) { 364cabdff1aSopenharmony_ci contains_subframe[c] = 1; 365cabdff1aSopenharmony_ci } else { 366cabdff1aSopenharmony_ci contains_subframe[c] = get_bits1(&s->gb); 367cabdff1aSopenharmony_ci } 368cabdff1aSopenharmony_ci in_use |= contains_subframe[c]; 369cabdff1aSopenharmony_ci } else 370cabdff1aSopenharmony_ci contains_subframe[c] = 0; 371cabdff1aSopenharmony_ci } 372cabdff1aSopenharmony_ci 373cabdff1aSopenharmony_ci if (!in_use) { 374cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, 375cabdff1aSopenharmony_ci "Found empty subframe\n"); 376cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 377cabdff1aSopenharmony_ci } 378cabdff1aSopenharmony_ci 379cabdff1aSopenharmony_ci /* get subframe length, subframe_len == 0 is not allowed */ 380cabdff1aSopenharmony_ci if ((subframe_len = decode_subframe_length(s, min_channel_len)) <= 0) 381cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 382cabdff1aSopenharmony_ci /* add subframes to the individual channels and find new min_channel_len */ 383cabdff1aSopenharmony_ci min_channel_len += subframe_len; 384cabdff1aSopenharmony_ci for (c = 0; c < s->num_channels; c++) { 385cabdff1aSopenharmony_ci WmallChannelCtx *chan = &s->channel[c]; 386cabdff1aSopenharmony_ci 387cabdff1aSopenharmony_ci if (contains_subframe[c]) { 388cabdff1aSopenharmony_ci if (chan->num_subframes >= MAX_SUBFRAMES) { 389cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, 390cabdff1aSopenharmony_ci "broken frame: num subframes > 31\n"); 391cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 392cabdff1aSopenharmony_ci } 393cabdff1aSopenharmony_ci chan->subframe_len[chan->num_subframes] = subframe_len; 394cabdff1aSopenharmony_ci num_samples[c] += subframe_len; 395cabdff1aSopenharmony_ci ++chan->num_subframes; 396cabdff1aSopenharmony_ci if (num_samples[c] > s->samples_per_frame) { 397cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "broken frame: " 398cabdff1aSopenharmony_ci "channel len(%"PRIu16") > samples_per_frame(%"PRIu16")\n", 399cabdff1aSopenharmony_ci num_samples[c], s->samples_per_frame); 400cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 401cabdff1aSopenharmony_ci } 402cabdff1aSopenharmony_ci } else if (num_samples[c] <= min_channel_len) { 403cabdff1aSopenharmony_ci if (num_samples[c] < min_channel_len) { 404cabdff1aSopenharmony_ci channels_for_cur_subframe = 0; 405cabdff1aSopenharmony_ci min_channel_len = num_samples[c]; 406cabdff1aSopenharmony_ci } 407cabdff1aSopenharmony_ci ++channels_for_cur_subframe; 408cabdff1aSopenharmony_ci } 409cabdff1aSopenharmony_ci } 410cabdff1aSopenharmony_ci } while (min_channel_len < s->samples_per_frame); 411cabdff1aSopenharmony_ci 412cabdff1aSopenharmony_ci for (c = 0; c < s->num_channels; c++) { 413cabdff1aSopenharmony_ci int i, offset = 0; 414cabdff1aSopenharmony_ci for (i = 0; i < s->channel[c].num_subframes; i++) { 415cabdff1aSopenharmony_ci s->channel[c].subframe_offsets[i] = offset; 416cabdff1aSopenharmony_ci offset += s->channel[c].subframe_len[i]; 417cabdff1aSopenharmony_ci } 418cabdff1aSopenharmony_ci } 419cabdff1aSopenharmony_ci 420cabdff1aSopenharmony_ci return 0; 421cabdff1aSopenharmony_ci} 422cabdff1aSopenharmony_ci 423cabdff1aSopenharmony_cistatic void decode_ac_filter(WmallDecodeCtx *s) 424cabdff1aSopenharmony_ci{ 425cabdff1aSopenharmony_ci int i; 426cabdff1aSopenharmony_ci s->acfilter_order = get_bits(&s->gb, 4) + 1; 427cabdff1aSopenharmony_ci s->acfilter_scaling = get_bits(&s->gb, 4); 428cabdff1aSopenharmony_ci 429cabdff1aSopenharmony_ci for (i = 0; i < s->acfilter_order; i++) 430cabdff1aSopenharmony_ci s->acfilter_coeffs[i] = get_bitsz(&s->gb, s->acfilter_scaling) + 1; 431cabdff1aSopenharmony_ci} 432cabdff1aSopenharmony_ci 433cabdff1aSopenharmony_cistatic void decode_mclms(WmallDecodeCtx *s) 434cabdff1aSopenharmony_ci{ 435cabdff1aSopenharmony_ci s->mclms_order = (get_bits(&s->gb, 4) + 1) * 2; 436cabdff1aSopenharmony_ci s->mclms_scaling = get_bits(&s->gb, 4); 437cabdff1aSopenharmony_ci if (get_bits1(&s->gb)) { 438cabdff1aSopenharmony_ci int i, send_coef_bits; 439cabdff1aSopenharmony_ci int cbits = av_log2(s->mclms_scaling + 1); 440cabdff1aSopenharmony_ci if (1 << cbits < s->mclms_scaling + 1) 441cabdff1aSopenharmony_ci cbits++; 442cabdff1aSopenharmony_ci 443cabdff1aSopenharmony_ci send_coef_bits = get_bitsz(&s->gb, cbits) + 2; 444cabdff1aSopenharmony_ci 445cabdff1aSopenharmony_ci for (i = 0; i < s->mclms_order * s->num_channels * s->num_channels; i++) 446cabdff1aSopenharmony_ci s->mclms_coeffs[i] = get_bits(&s->gb, send_coef_bits); 447cabdff1aSopenharmony_ci 448cabdff1aSopenharmony_ci for (i = 0; i < s->num_channels; i++) { 449cabdff1aSopenharmony_ci int c; 450cabdff1aSopenharmony_ci for (c = 0; c < i; c++) 451cabdff1aSopenharmony_ci s->mclms_coeffs_cur[i * s->num_channels + c] = get_bits(&s->gb, send_coef_bits); 452cabdff1aSopenharmony_ci } 453cabdff1aSopenharmony_ci } 454cabdff1aSopenharmony_ci} 455cabdff1aSopenharmony_ci 456cabdff1aSopenharmony_cistatic int decode_cdlms(WmallDecodeCtx *s) 457cabdff1aSopenharmony_ci{ 458cabdff1aSopenharmony_ci int c, i; 459cabdff1aSopenharmony_ci int cdlms_send_coef = get_bits1(&s->gb); 460cabdff1aSopenharmony_ci 461cabdff1aSopenharmony_ci for (c = 0; c < s->num_channels; c++) { 462cabdff1aSopenharmony_ci s->cdlms_ttl[c] = get_bits(&s->gb, 3) + 1; 463cabdff1aSopenharmony_ci for (i = 0; i < s->cdlms_ttl[c]; i++) { 464cabdff1aSopenharmony_ci s->cdlms[c][i].order = (get_bits(&s->gb, 7) + 1) * 8; 465cabdff1aSopenharmony_ci if (s->cdlms[c][i].order > MAX_ORDER) { 466cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, 467cabdff1aSopenharmony_ci "Order[%d][%d] %d > max (%d), not supported\n", 468cabdff1aSopenharmony_ci c, i, s->cdlms[c][i].order, MAX_ORDER); 469cabdff1aSopenharmony_ci s->cdlms[0][0].order = 0; 470cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 471cabdff1aSopenharmony_ci } 472cabdff1aSopenharmony_ci if(s->cdlms[c][i].order & 8 && s->bits_per_sample == 16) { 473cabdff1aSopenharmony_ci static int warned; 474cabdff1aSopenharmony_ci if(!warned) 475cabdff1aSopenharmony_ci avpriv_request_sample(s->avctx, "CDLMS of order %d", 476cabdff1aSopenharmony_ci s->cdlms[c][i].order); 477cabdff1aSopenharmony_ci warned = 1; 478cabdff1aSopenharmony_ci } 479cabdff1aSopenharmony_ci } 480cabdff1aSopenharmony_ci 481cabdff1aSopenharmony_ci for (i = 0; i < s->cdlms_ttl[c]; i++) 482cabdff1aSopenharmony_ci s->cdlms[c][i].scaling = get_bits(&s->gb, 4); 483cabdff1aSopenharmony_ci 484cabdff1aSopenharmony_ci if (cdlms_send_coef) { 485cabdff1aSopenharmony_ci for (i = 0; i < s->cdlms_ttl[c]; i++) { 486cabdff1aSopenharmony_ci int cbits, shift_l, shift_r, j; 487cabdff1aSopenharmony_ci cbits = av_log2(s->cdlms[c][i].order); 488cabdff1aSopenharmony_ci if ((1 << cbits) < s->cdlms[c][i].order) 489cabdff1aSopenharmony_ci cbits++; 490cabdff1aSopenharmony_ci s->cdlms[c][i].coefsend = get_bits(&s->gb, cbits) + 1; 491cabdff1aSopenharmony_ci 492cabdff1aSopenharmony_ci cbits = av_log2(s->cdlms[c][i].scaling + 1); 493cabdff1aSopenharmony_ci if ((1 << cbits) < s->cdlms[c][i].scaling + 1) 494cabdff1aSopenharmony_ci cbits++; 495cabdff1aSopenharmony_ci 496cabdff1aSopenharmony_ci s->cdlms[c][i].bitsend = get_bitsz(&s->gb, cbits) + 2; 497cabdff1aSopenharmony_ci shift_l = 32 - s->cdlms[c][i].bitsend; 498cabdff1aSopenharmony_ci shift_r = 32 - s->cdlms[c][i].scaling - 2; 499cabdff1aSopenharmony_ci for (j = 0; j < s->cdlms[c][i].coefsend; j++) 500cabdff1aSopenharmony_ci s->cdlms[c][i].coefs[j] = 501cabdff1aSopenharmony_ci (get_bits(&s->gb, s->cdlms[c][i].bitsend) << shift_l) >> shift_r; 502cabdff1aSopenharmony_ci } 503cabdff1aSopenharmony_ci } 504cabdff1aSopenharmony_ci 505cabdff1aSopenharmony_ci for (i = 0; i < s->cdlms_ttl[c]; i++) 506cabdff1aSopenharmony_ci memset(s->cdlms[c][i].coefs + s->cdlms[c][i].order, 507cabdff1aSopenharmony_ci 0, WMALL_COEFF_PAD_SIZE); 508cabdff1aSopenharmony_ci } 509cabdff1aSopenharmony_ci 510cabdff1aSopenharmony_ci return 0; 511cabdff1aSopenharmony_ci} 512cabdff1aSopenharmony_ci 513cabdff1aSopenharmony_cistatic int decode_channel_residues(WmallDecodeCtx *s, int ch, int tile_size) 514cabdff1aSopenharmony_ci{ 515cabdff1aSopenharmony_ci int i = 0; 516cabdff1aSopenharmony_ci unsigned int ave_mean; 517cabdff1aSopenharmony_ci s->transient[ch] = get_bits1(&s->gb); 518cabdff1aSopenharmony_ci if (s->transient[ch]) { 519cabdff1aSopenharmony_ci s->transient_pos[ch] = get_bits(&s->gb, av_log2(tile_size)); 520cabdff1aSopenharmony_ci if (s->transient_pos[ch]) 521cabdff1aSopenharmony_ci s->transient[ch] = 0; 522cabdff1aSopenharmony_ci s->channel[ch].transient_counter = 523cabdff1aSopenharmony_ci FFMAX(s->channel[ch].transient_counter, s->samples_per_frame / 2); 524cabdff1aSopenharmony_ci } else if (s->channel[ch].transient_counter) 525cabdff1aSopenharmony_ci s->transient[ch] = 1; 526cabdff1aSopenharmony_ci 527cabdff1aSopenharmony_ci if (s->seekable_tile) { 528cabdff1aSopenharmony_ci ave_mean = get_bits(&s->gb, s->bits_per_sample); 529cabdff1aSopenharmony_ci s->ave_sum[ch] = ave_mean << (s->movave_scaling + 1); 530cabdff1aSopenharmony_ci } 531cabdff1aSopenharmony_ci 532cabdff1aSopenharmony_ci if (s->seekable_tile) { 533cabdff1aSopenharmony_ci if (s->do_inter_ch_decorr) 534cabdff1aSopenharmony_ci s->channel_residues[ch][0] = get_sbits_long(&s->gb, s->bits_per_sample + 1); 535cabdff1aSopenharmony_ci else 536cabdff1aSopenharmony_ci s->channel_residues[ch][0] = get_sbits_long(&s->gb, s->bits_per_sample); 537cabdff1aSopenharmony_ci i++; 538cabdff1aSopenharmony_ci } 539cabdff1aSopenharmony_ci for (; i < tile_size; i++) { 540cabdff1aSopenharmony_ci int rem, rem_bits; 541cabdff1aSopenharmony_ci unsigned quo = 0, residue; 542cabdff1aSopenharmony_ci while(get_bits1(&s->gb)) { 543cabdff1aSopenharmony_ci quo++; 544cabdff1aSopenharmony_ci if (get_bits_left(&s->gb) <= 0) 545cabdff1aSopenharmony_ci return -1; 546cabdff1aSopenharmony_ci } 547cabdff1aSopenharmony_ci if (quo >= 32) 548cabdff1aSopenharmony_ci quo += get_bits_long(&s->gb, get_bits(&s->gb, 5) + 1); 549cabdff1aSopenharmony_ci 550cabdff1aSopenharmony_ci ave_mean = (s->ave_sum[ch] + (1 << s->movave_scaling)) >> (s->movave_scaling + 1); 551cabdff1aSopenharmony_ci if (ave_mean <= 1) 552cabdff1aSopenharmony_ci residue = quo; 553cabdff1aSopenharmony_ci else { 554cabdff1aSopenharmony_ci rem_bits = av_ceil_log2(ave_mean); 555cabdff1aSopenharmony_ci rem = get_bits_long(&s->gb, rem_bits); 556cabdff1aSopenharmony_ci residue = (quo << rem_bits) + rem; 557cabdff1aSopenharmony_ci } 558cabdff1aSopenharmony_ci 559cabdff1aSopenharmony_ci s->ave_sum[ch] = residue + s->ave_sum[ch] - 560cabdff1aSopenharmony_ci (s->ave_sum[ch] >> s->movave_scaling); 561cabdff1aSopenharmony_ci 562cabdff1aSopenharmony_ci residue = (residue >> 1) ^ -(residue & 1); 563cabdff1aSopenharmony_ci s->channel_residues[ch][i] = residue; 564cabdff1aSopenharmony_ci } 565cabdff1aSopenharmony_ci 566cabdff1aSopenharmony_ci return 0; 567cabdff1aSopenharmony_ci 568cabdff1aSopenharmony_ci} 569cabdff1aSopenharmony_ci 570cabdff1aSopenharmony_cistatic void decode_lpc(WmallDecodeCtx *s) 571cabdff1aSopenharmony_ci{ 572cabdff1aSopenharmony_ci int ch, i, cbits; 573cabdff1aSopenharmony_ci s->lpc_order = get_bits(&s->gb, 5) + 1; 574cabdff1aSopenharmony_ci s->lpc_scaling = get_bits(&s->gb, 4); 575cabdff1aSopenharmony_ci s->lpc_intbits = get_bits(&s->gb, 3) + 1; 576cabdff1aSopenharmony_ci cbits = s->lpc_scaling + s->lpc_intbits; 577cabdff1aSopenharmony_ci for (ch = 0; ch < s->num_channels; ch++) 578cabdff1aSopenharmony_ci for (i = 0; i < s->lpc_order; i++) 579cabdff1aSopenharmony_ci s->lpc_coefs[ch][i] = get_sbits(&s->gb, cbits); 580cabdff1aSopenharmony_ci} 581cabdff1aSopenharmony_ci 582cabdff1aSopenharmony_cistatic void clear_codec_buffers(WmallDecodeCtx *s) 583cabdff1aSopenharmony_ci{ 584cabdff1aSopenharmony_ci int ich, ilms; 585cabdff1aSopenharmony_ci 586cabdff1aSopenharmony_ci memset(s->acfilter_coeffs, 0, sizeof(s->acfilter_coeffs)); 587cabdff1aSopenharmony_ci memset(s->acfilter_prevvalues, 0, sizeof(s->acfilter_prevvalues)); 588cabdff1aSopenharmony_ci memset(s->lpc_coefs, 0, sizeof(s->lpc_coefs)); 589cabdff1aSopenharmony_ci 590cabdff1aSopenharmony_ci memset(s->mclms_coeffs, 0, sizeof(s->mclms_coeffs)); 591cabdff1aSopenharmony_ci memset(s->mclms_coeffs_cur, 0, sizeof(s->mclms_coeffs_cur)); 592cabdff1aSopenharmony_ci memset(s->mclms_prevvalues, 0, sizeof(s->mclms_prevvalues)); 593cabdff1aSopenharmony_ci memset(s->mclms_updates, 0, sizeof(s->mclms_updates)); 594cabdff1aSopenharmony_ci 595cabdff1aSopenharmony_ci for (ich = 0; ich < s->num_channels; ich++) { 596cabdff1aSopenharmony_ci for (ilms = 0; ilms < s->cdlms_ttl[ich]; ilms++) { 597cabdff1aSopenharmony_ci memset(s->cdlms[ich][ilms].coefs, 0, 598cabdff1aSopenharmony_ci sizeof(s->cdlms[ich][ilms].coefs)); 599cabdff1aSopenharmony_ci memset(s->cdlms[ich][ilms].lms_prevvalues, 0, 600cabdff1aSopenharmony_ci sizeof(s->cdlms[ich][ilms].lms_prevvalues)); 601cabdff1aSopenharmony_ci memset(s->cdlms[ich][ilms].lms_updates, 0, 602cabdff1aSopenharmony_ci sizeof(s->cdlms[ich][ilms].lms_updates)); 603cabdff1aSopenharmony_ci } 604cabdff1aSopenharmony_ci s->ave_sum[ich] = 0; 605cabdff1aSopenharmony_ci } 606cabdff1aSopenharmony_ci} 607cabdff1aSopenharmony_ci 608cabdff1aSopenharmony_ci/** 609cabdff1aSopenharmony_ci * @brief Reset filter parameters and transient area at new seekable tile. 610cabdff1aSopenharmony_ci */ 611cabdff1aSopenharmony_cistatic void reset_codec(WmallDecodeCtx *s) 612cabdff1aSopenharmony_ci{ 613cabdff1aSopenharmony_ci int ich, ilms; 614cabdff1aSopenharmony_ci s->mclms_recent = s->mclms_order * s->num_channels; 615cabdff1aSopenharmony_ci for (ich = 0; ich < s->num_channels; ich++) { 616cabdff1aSopenharmony_ci for (ilms = 0; ilms < s->cdlms_ttl[ich]; ilms++) 617cabdff1aSopenharmony_ci s->cdlms[ich][ilms].recent = s->cdlms[ich][ilms].order; 618cabdff1aSopenharmony_ci /* first sample of a seekable subframe is considered as the starting of 619cabdff1aSopenharmony_ci a transient area which is samples_per_frame samples long */ 620cabdff1aSopenharmony_ci s->channel[ich].transient_counter = s->samples_per_frame; 621cabdff1aSopenharmony_ci s->transient[ich] = 1; 622cabdff1aSopenharmony_ci s->transient_pos[ich] = 0; 623cabdff1aSopenharmony_ci } 624cabdff1aSopenharmony_ci} 625cabdff1aSopenharmony_ci 626cabdff1aSopenharmony_cistatic void mclms_update(WmallDecodeCtx *s, int icoef, int *pred) 627cabdff1aSopenharmony_ci{ 628cabdff1aSopenharmony_ci int i, j, ich, pred_error; 629cabdff1aSopenharmony_ci int order = s->mclms_order; 630cabdff1aSopenharmony_ci int num_channels = s->num_channels; 631cabdff1aSopenharmony_ci int range = 1 << (s->bits_per_sample - 1); 632cabdff1aSopenharmony_ci 633cabdff1aSopenharmony_ci for (ich = 0; ich < num_channels; ich++) { 634cabdff1aSopenharmony_ci pred_error = s->channel_residues[ich][icoef] - (unsigned)pred[ich]; 635cabdff1aSopenharmony_ci if (pred_error > 0) { 636cabdff1aSopenharmony_ci for (i = 0; i < order * num_channels; i++) 637cabdff1aSopenharmony_ci s->mclms_coeffs[i + ich * order * num_channels] += 638cabdff1aSopenharmony_ci s->mclms_updates[s->mclms_recent + i]; 639cabdff1aSopenharmony_ci for (j = 0; j < ich; j++) 640cabdff1aSopenharmony_ci s->mclms_coeffs_cur[ich * num_channels + j] += WMASIGN(s->channel_residues[j][icoef]); 641cabdff1aSopenharmony_ci } else if (pred_error < 0) { 642cabdff1aSopenharmony_ci for (i = 0; i < order * num_channels; i++) 643cabdff1aSopenharmony_ci s->mclms_coeffs[i + ich * order * num_channels] -= 644cabdff1aSopenharmony_ci s->mclms_updates[s->mclms_recent + i]; 645cabdff1aSopenharmony_ci for (j = 0; j < ich; j++) 646cabdff1aSopenharmony_ci s->mclms_coeffs_cur[ich * num_channels + j] -= WMASIGN(s->channel_residues[j][icoef]); 647cabdff1aSopenharmony_ci } 648cabdff1aSopenharmony_ci } 649cabdff1aSopenharmony_ci 650cabdff1aSopenharmony_ci for (ich = num_channels - 1; ich >= 0; ich--) { 651cabdff1aSopenharmony_ci s->mclms_recent--; 652cabdff1aSopenharmony_ci s->mclms_prevvalues[s->mclms_recent] = av_clip(s->channel_residues[ich][icoef], 653cabdff1aSopenharmony_ci -range, range - 1); 654cabdff1aSopenharmony_ci s->mclms_updates[s->mclms_recent] = WMASIGN(s->channel_residues[ich][icoef]); 655cabdff1aSopenharmony_ci } 656cabdff1aSopenharmony_ci 657cabdff1aSopenharmony_ci if (s->mclms_recent == 0) { 658cabdff1aSopenharmony_ci memcpy(&s->mclms_prevvalues[order * num_channels], 659cabdff1aSopenharmony_ci s->mclms_prevvalues, 660cabdff1aSopenharmony_ci sizeof(int32_t) * order * num_channels); 661cabdff1aSopenharmony_ci memcpy(&s->mclms_updates[order * num_channels], 662cabdff1aSopenharmony_ci s->mclms_updates, 663cabdff1aSopenharmony_ci sizeof(int32_t) * order * num_channels); 664cabdff1aSopenharmony_ci s->mclms_recent = num_channels * order; 665cabdff1aSopenharmony_ci } 666cabdff1aSopenharmony_ci} 667cabdff1aSopenharmony_ci 668cabdff1aSopenharmony_cistatic void mclms_predict(WmallDecodeCtx *s, int icoef, int *pred) 669cabdff1aSopenharmony_ci{ 670cabdff1aSopenharmony_ci int ich, i; 671cabdff1aSopenharmony_ci int order = s->mclms_order; 672cabdff1aSopenharmony_ci int num_channels = s->num_channels; 673cabdff1aSopenharmony_ci 674cabdff1aSopenharmony_ci for (ich = 0; ich < num_channels; ich++) { 675cabdff1aSopenharmony_ci pred[ich] = 0; 676cabdff1aSopenharmony_ci if (!s->is_channel_coded[ich]) 677cabdff1aSopenharmony_ci continue; 678cabdff1aSopenharmony_ci for (i = 0; i < order * num_channels; i++) 679cabdff1aSopenharmony_ci pred[ich] += (uint32_t)s->mclms_prevvalues[i + s->mclms_recent] * 680cabdff1aSopenharmony_ci s->mclms_coeffs[i + order * num_channels * ich]; 681cabdff1aSopenharmony_ci for (i = 0; i < ich; i++) 682cabdff1aSopenharmony_ci pred[ich] += (uint32_t)s->channel_residues[i][icoef] * 683cabdff1aSopenharmony_ci s->mclms_coeffs_cur[i + num_channels * ich]; 684cabdff1aSopenharmony_ci pred[ich] += (1U << s->mclms_scaling) >> 1; 685cabdff1aSopenharmony_ci pred[ich] >>= s->mclms_scaling; 686cabdff1aSopenharmony_ci s->channel_residues[ich][icoef] += (unsigned)pred[ich]; 687cabdff1aSopenharmony_ci } 688cabdff1aSopenharmony_ci} 689cabdff1aSopenharmony_ci 690cabdff1aSopenharmony_cistatic void revert_mclms(WmallDecodeCtx *s, int tile_size) 691cabdff1aSopenharmony_ci{ 692cabdff1aSopenharmony_ci int icoef, pred[WMALL_MAX_CHANNELS] = { 0 }; 693cabdff1aSopenharmony_ci for (icoef = 0; icoef < tile_size; icoef++) { 694cabdff1aSopenharmony_ci mclms_predict(s, icoef, pred); 695cabdff1aSopenharmony_ci mclms_update(s, icoef, pred); 696cabdff1aSopenharmony_ci } 697cabdff1aSopenharmony_ci} 698cabdff1aSopenharmony_ci 699cabdff1aSopenharmony_cistatic void use_high_update_speed(WmallDecodeCtx *s, int ich) 700cabdff1aSopenharmony_ci{ 701cabdff1aSopenharmony_ci int ilms, recent, icoef; 702cabdff1aSopenharmony_ci for (ilms = s->cdlms_ttl[ich] - 1; ilms >= 0; ilms--) { 703cabdff1aSopenharmony_ci recent = s->cdlms[ich][ilms].recent; 704cabdff1aSopenharmony_ci if (s->update_speed[ich] == 16) 705cabdff1aSopenharmony_ci continue; 706cabdff1aSopenharmony_ci if (s->bV3RTM) { 707cabdff1aSopenharmony_ci for (icoef = 0; icoef < s->cdlms[ich][ilms].order; icoef++) 708cabdff1aSopenharmony_ci s->cdlms[ich][ilms].lms_updates[icoef + recent] *= 2; 709cabdff1aSopenharmony_ci } else { 710cabdff1aSopenharmony_ci for (icoef = 0; icoef < s->cdlms[ich][ilms].order; icoef++) 711cabdff1aSopenharmony_ci s->cdlms[ich][ilms].lms_updates[icoef] *= 2; 712cabdff1aSopenharmony_ci } 713cabdff1aSopenharmony_ci } 714cabdff1aSopenharmony_ci s->update_speed[ich] = 16; 715cabdff1aSopenharmony_ci} 716cabdff1aSopenharmony_ci 717cabdff1aSopenharmony_cistatic void use_normal_update_speed(WmallDecodeCtx *s, int ich) 718cabdff1aSopenharmony_ci{ 719cabdff1aSopenharmony_ci int ilms, recent, icoef; 720cabdff1aSopenharmony_ci for (ilms = s->cdlms_ttl[ich] - 1; ilms >= 0; ilms--) { 721cabdff1aSopenharmony_ci recent = s->cdlms[ich][ilms].recent; 722cabdff1aSopenharmony_ci if (s->update_speed[ich] == 8) 723cabdff1aSopenharmony_ci continue; 724cabdff1aSopenharmony_ci if (s->bV3RTM) 725cabdff1aSopenharmony_ci for (icoef = 0; icoef < s->cdlms[ich][ilms].order; icoef++) 726cabdff1aSopenharmony_ci s->cdlms[ich][ilms].lms_updates[icoef + recent] /= 2; 727cabdff1aSopenharmony_ci else 728cabdff1aSopenharmony_ci for (icoef = 0; icoef < s->cdlms[ich][ilms].order; icoef++) 729cabdff1aSopenharmony_ci s->cdlms[ich][ilms].lms_updates[icoef] /= 2; 730cabdff1aSopenharmony_ci } 731cabdff1aSopenharmony_ci s->update_speed[ich] = 8; 732cabdff1aSopenharmony_ci} 733cabdff1aSopenharmony_ci 734cabdff1aSopenharmony_ci#define CD_LMS(bits, ROUND) \ 735cabdff1aSopenharmony_cistatic void lms_update ## bits (WmallDecodeCtx *s, int ich, int ilms, int input) \ 736cabdff1aSopenharmony_ci{ \ 737cabdff1aSopenharmony_ci int recent = s->cdlms[ich][ilms].recent; \ 738cabdff1aSopenharmony_ci int range = 1 << s->bits_per_sample - 1; \ 739cabdff1aSopenharmony_ci int order = s->cdlms[ich][ilms].order; \ 740cabdff1aSopenharmony_ci int ##bits##_t *prev = (int##bits##_t *)s->cdlms[ich][ilms].lms_prevvalues; \ 741cabdff1aSopenharmony_ci \ 742cabdff1aSopenharmony_ci if (recent) \ 743cabdff1aSopenharmony_ci recent--; \ 744cabdff1aSopenharmony_ci else { \ 745cabdff1aSopenharmony_ci memcpy(prev + order, prev, (bits/8) * order); \ 746cabdff1aSopenharmony_ci memcpy(s->cdlms[ich][ilms].lms_updates + order, \ 747cabdff1aSopenharmony_ci s->cdlms[ich][ilms].lms_updates, \ 748cabdff1aSopenharmony_ci sizeof(*s->cdlms[ich][ilms].lms_updates) * order); \ 749cabdff1aSopenharmony_ci recent = order - 1; \ 750cabdff1aSopenharmony_ci } \ 751cabdff1aSopenharmony_ci \ 752cabdff1aSopenharmony_ci prev[recent] = av_clip(input, -range, range - 1); \ 753cabdff1aSopenharmony_ci s->cdlms[ich][ilms].lms_updates[recent] = WMASIGN(input) * s->update_speed[ich]; \ 754cabdff1aSopenharmony_ci \ 755cabdff1aSopenharmony_ci s->cdlms[ich][ilms].lms_updates[recent + (order >> 4)] >>= 2; \ 756cabdff1aSopenharmony_ci s->cdlms[ich][ilms].lms_updates[recent + (order >> 3)] >>= 1; \ 757cabdff1aSopenharmony_ci s->cdlms[ich][ilms].recent = recent; \ 758cabdff1aSopenharmony_ci memset(s->cdlms[ich][ilms].lms_updates + recent + order, 0, \ 759cabdff1aSopenharmony_ci sizeof(s->cdlms[ich][ilms].lms_updates) - \ 760cabdff1aSopenharmony_ci sizeof(*s->cdlms[ich][ilms].lms_updates)*(recent+order)); \ 761cabdff1aSopenharmony_ci} \ 762cabdff1aSopenharmony_ci \ 763cabdff1aSopenharmony_cistatic void revert_cdlms ## bits (WmallDecodeCtx *s, int ch, \ 764cabdff1aSopenharmony_ci int coef_begin, int coef_end) \ 765cabdff1aSopenharmony_ci{ \ 766cabdff1aSopenharmony_ci int icoef, ilms, num_lms, residue, input; \ 767cabdff1aSopenharmony_ci unsigned pred;\ 768cabdff1aSopenharmony_ci \ 769cabdff1aSopenharmony_ci num_lms = s->cdlms_ttl[ch]; \ 770cabdff1aSopenharmony_ci for (ilms = num_lms - 1; ilms >= 0; ilms--) { \ 771cabdff1aSopenharmony_ci for (icoef = coef_begin; icoef < coef_end; icoef++) { \ 772cabdff1aSopenharmony_ci int##bits##_t *prevvalues = (int##bits##_t *)s->cdlms[ch][ilms].lms_prevvalues; \ 773cabdff1aSopenharmony_ci pred = (1 << s->cdlms[ch][ilms].scaling) >> 1; \ 774cabdff1aSopenharmony_ci residue = s->channel_residues[ch][icoef]; \ 775cabdff1aSopenharmony_ci pred += s->dsp.scalarproduct_and_madd_int## bits (s->cdlms[ch][ilms].coefs, \ 776cabdff1aSopenharmony_ci prevvalues + s->cdlms[ch][ilms].recent, \ 777cabdff1aSopenharmony_ci s->cdlms[ch][ilms].lms_updates + \ 778cabdff1aSopenharmony_ci s->cdlms[ch][ilms].recent, \ 779cabdff1aSopenharmony_ci FFALIGN(s->cdlms[ch][ilms].order, ROUND), \ 780cabdff1aSopenharmony_ci WMASIGN(residue)); \ 781cabdff1aSopenharmony_ci input = residue + (unsigned)((int)pred >> s->cdlms[ch][ilms].scaling); \ 782cabdff1aSopenharmony_ci lms_update ## bits(s, ch, ilms, input); \ 783cabdff1aSopenharmony_ci s->channel_residues[ch][icoef] = input; \ 784cabdff1aSopenharmony_ci } \ 785cabdff1aSopenharmony_ci } \ 786cabdff1aSopenharmony_ci if (bits <= 16) emms_c(); \ 787cabdff1aSopenharmony_ci} 788cabdff1aSopenharmony_ci 789cabdff1aSopenharmony_ciCD_LMS(16, WMALL_COEFF_PAD_SIZE) 790cabdff1aSopenharmony_ciCD_LMS(32, 8) 791cabdff1aSopenharmony_ci 792cabdff1aSopenharmony_cistatic void revert_inter_ch_decorr(WmallDecodeCtx *s, int tile_size) 793cabdff1aSopenharmony_ci{ 794cabdff1aSopenharmony_ci if (s->num_channels != 2) 795cabdff1aSopenharmony_ci return; 796cabdff1aSopenharmony_ci else if (s->is_channel_coded[0] || s->is_channel_coded[1]) { 797cabdff1aSopenharmony_ci int icoef; 798cabdff1aSopenharmony_ci for (icoef = 0; icoef < tile_size; icoef++) { 799cabdff1aSopenharmony_ci s->channel_residues[0][icoef] -= (unsigned)(s->channel_residues[1][icoef] >> 1); 800cabdff1aSopenharmony_ci s->channel_residues[1][icoef] += (unsigned) s->channel_residues[0][icoef]; 801cabdff1aSopenharmony_ci } 802cabdff1aSopenharmony_ci } 803cabdff1aSopenharmony_ci} 804cabdff1aSopenharmony_ci 805cabdff1aSopenharmony_cistatic void revert_acfilter(WmallDecodeCtx *s, int tile_size) 806cabdff1aSopenharmony_ci{ 807cabdff1aSopenharmony_ci int ich, pred, i, j; 808cabdff1aSopenharmony_ci int16_t *filter_coeffs = s->acfilter_coeffs; 809cabdff1aSopenharmony_ci int scaling = s->acfilter_scaling; 810cabdff1aSopenharmony_ci int order = s->acfilter_order; 811cabdff1aSopenharmony_ci 812cabdff1aSopenharmony_ci for (ich = 0; ich < s->num_channels; ich++) { 813cabdff1aSopenharmony_ci int *prevvalues = s->acfilter_prevvalues[ich]; 814cabdff1aSopenharmony_ci for (i = 0; i < order; i++) { 815cabdff1aSopenharmony_ci pred = 0; 816cabdff1aSopenharmony_ci for (j = 0; j < order; j++) { 817cabdff1aSopenharmony_ci if (i <= j) 818cabdff1aSopenharmony_ci pred += (uint32_t)filter_coeffs[j] * prevvalues[j - i]; 819cabdff1aSopenharmony_ci else 820cabdff1aSopenharmony_ci pred += (uint32_t)s->channel_residues[ich][i - j - 1] * filter_coeffs[j]; 821cabdff1aSopenharmony_ci } 822cabdff1aSopenharmony_ci pred >>= scaling; 823cabdff1aSopenharmony_ci s->channel_residues[ich][i] += (unsigned)pred; 824cabdff1aSopenharmony_ci } 825cabdff1aSopenharmony_ci for (i = order; i < tile_size; i++) { 826cabdff1aSopenharmony_ci pred = 0; 827cabdff1aSopenharmony_ci for (j = 0; j < order; j++) 828cabdff1aSopenharmony_ci pred += (uint32_t)s->channel_residues[ich][i - j - 1] * filter_coeffs[j]; 829cabdff1aSopenharmony_ci pred >>= scaling; 830cabdff1aSopenharmony_ci s->channel_residues[ich][i] += (unsigned)pred; 831cabdff1aSopenharmony_ci } 832cabdff1aSopenharmony_ci for (j = order - 1; j >= 0; j--) 833cabdff1aSopenharmony_ci if (tile_size <= j) { 834cabdff1aSopenharmony_ci prevvalues[j] = prevvalues[j - tile_size]; 835cabdff1aSopenharmony_ci }else 836cabdff1aSopenharmony_ci prevvalues[j] = s->channel_residues[ich][tile_size - j - 1]; 837cabdff1aSopenharmony_ci } 838cabdff1aSopenharmony_ci} 839cabdff1aSopenharmony_ci 840cabdff1aSopenharmony_cistatic int decode_subframe(WmallDecodeCtx *s) 841cabdff1aSopenharmony_ci{ 842cabdff1aSopenharmony_ci int offset = s->samples_per_frame; 843cabdff1aSopenharmony_ci int subframe_len = s->samples_per_frame; 844cabdff1aSopenharmony_ci int total_samples = s->samples_per_frame * s->num_channels; 845cabdff1aSopenharmony_ci int i, j, rawpcm_tile, padding_zeroes, res; 846cabdff1aSopenharmony_ci 847cabdff1aSopenharmony_ci s->subframe_offset = get_bits_count(&s->gb); 848cabdff1aSopenharmony_ci 849cabdff1aSopenharmony_ci /* reset channel context and find the next block offset and size 850cabdff1aSopenharmony_ci == the next block of the channel with the smallest number of 851cabdff1aSopenharmony_ci decoded samples */ 852cabdff1aSopenharmony_ci for (i = 0; i < s->num_channels; i++) { 853cabdff1aSopenharmony_ci if (offset > s->channel[i].decoded_samples) { 854cabdff1aSopenharmony_ci offset = s->channel[i].decoded_samples; 855cabdff1aSopenharmony_ci subframe_len = 856cabdff1aSopenharmony_ci s->channel[i].subframe_len[s->channel[i].cur_subframe]; 857cabdff1aSopenharmony_ci } 858cabdff1aSopenharmony_ci } 859cabdff1aSopenharmony_ci 860cabdff1aSopenharmony_ci /* get a list of all channels that contain the estimated block */ 861cabdff1aSopenharmony_ci s->channels_for_cur_subframe = 0; 862cabdff1aSopenharmony_ci for (i = 0; i < s->num_channels; i++) { 863cabdff1aSopenharmony_ci const int cur_subframe = s->channel[i].cur_subframe; 864cabdff1aSopenharmony_ci /* subtract already processed samples */ 865cabdff1aSopenharmony_ci total_samples -= s->channel[i].decoded_samples; 866cabdff1aSopenharmony_ci 867cabdff1aSopenharmony_ci /* and count if there are multiple subframes that match our profile */ 868cabdff1aSopenharmony_ci if (offset == s->channel[i].decoded_samples && 869cabdff1aSopenharmony_ci subframe_len == s->channel[i].subframe_len[cur_subframe]) { 870cabdff1aSopenharmony_ci total_samples -= s->channel[i].subframe_len[cur_subframe]; 871cabdff1aSopenharmony_ci s->channel[i].decoded_samples += 872cabdff1aSopenharmony_ci s->channel[i].subframe_len[cur_subframe]; 873cabdff1aSopenharmony_ci s->channel_indexes_for_cur_subframe[s->channels_for_cur_subframe] = i; 874cabdff1aSopenharmony_ci ++s->channels_for_cur_subframe; 875cabdff1aSopenharmony_ci } 876cabdff1aSopenharmony_ci } 877cabdff1aSopenharmony_ci 878cabdff1aSopenharmony_ci /* check if the frame will be complete after processing the 879cabdff1aSopenharmony_ci estimated block */ 880cabdff1aSopenharmony_ci if (!total_samples) 881cabdff1aSopenharmony_ci s->parsed_all_subframes = 1; 882cabdff1aSopenharmony_ci 883cabdff1aSopenharmony_ci 884cabdff1aSopenharmony_ci s->seekable_tile = get_bits1(&s->gb); 885cabdff1aSopenharmony_ci if (s->seekable_tile) { 886cabdff1aSopenharmony_ci clear_codec_buffers(s); 887cabdff1aSopenharmony_ci 888cabdff1aSopenharmony_ci s->do_arith_coding = get_bits1(&s->gb); 889cabdff1aSopenharmony_ci if (s->do_arith_coding) { 890cabdff1aSopenharmony_ci avpriv_request_sample(s->avctx, "Arithmetic coding"); 891cabdff1aSopenharmony_ci return AVERROR_PATCHWELCOME; 892cabdff1aSopenharmony_ci } 893cabdff1aSopenharmony_ci s->do_ac_filter = get_bits1(&s->gb); 894cabdff1aSopenharmony_ci s->do_inter_ch_decorr = get_bits1(&s->gb); 895cabdff1aSopenharmony_ci s->do_mclms = get_bits1(&s->gb); 896cabdff1aSopenharmony_ci 897cabdff1aSopenharmony_ci if (s->do_ac_filter) 898cabdff1aSopenharmony_ci decode_ac_filter(s); 899cabdff1aSopenharmony_ci 900cabdff1aSopenharmony_ci if (s->do_mclms) 901cabdff1aSopenharmony_ci decode_mclms(s); 902cabdff1aSopenharmony_ci 903cabdff1aSopenharmony_ci if ((res = decode_cdlms(s)) < 0) 904cabdff1aSopenharmony_ci return res; 905cabdff1aSopenharmony_ci s->movave_scaling = get_bits(&s->gb, 3); 906cabdff1aSopenharmony_ci s->quant_stepsize = get_bits(&s->gb, 8) + 1; 907cabdff1aSopenharmony_ci 908cabdff1aSopenharmony_ci reset_codec(s); 909cabdff1aSopenharmony_ci } 910cabdff1aSopenharmony_ci 911cabdff1aSopenharmony_ci rawpcm_tile = get_bits1(&s->gb); 912cabdff1aSopenharmony_ci 913cabdff1aSopenharmony_ci if (!rawpcm_tile && !s->cdlms[0][0].order) { 914cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_DEBUG, 915cabdff1aSopenharmony_ci "Waiting for seekable tile\n"); 916cabdff1aSopenharmony_ci av_frame_unref(s->frame); 917cabdff1aSopenharmony_ci return -1; 918cabdff1aSopenharmony_ci } 919cabdff1aSopenharmony_ci 920cabdff1aSopenharmony_ci 921cabdff1aSopenharmony_ci for (i = 0; i < s->num_channels; i++) 922cabdff1aSopenharmony_ci s->is_channel_coded[i] = 1; 923cabdff1aSopenharmony_ci 924cabdff1aSopenharmony_ci if (!rawpcm_tile) { 925cabdff1aSopenharmony_ci for (i = 0; i < s->num_channels; i++) 926cabdff1aSopenharmony_ci s->is_channel_coded[i] = get_bits1(&s->gb); 927cabdff1aSopenharmony_ci 928cabdff1aSopenharmony_ci if (s->bV3RTM) { 929cabdff1aSopenharmony_ci // LPC 930cabdff1aSopenharmony_ci s->do_lpc = get_bits1(&s->gb); 931cabdff1aSopenharmony_ci if (s->do_lpc) { 932cabdff1aSopenharmony_ci decode_lpc(s); 933cabdff1aSopenharmony_ci avpriv_request_sample(s->avctx, "Expect wrong output since " 934cabdff1aSopenharmony_ci "inverse LPC filter"); 935cabdff1aSopenharmony_ci } 936cabdff1aSopenharmony_ci } else 937cabdff1aSopenharmony_ci s->do_lpc = 0; 938cabdff1aSopenharmony_ci } 939cabdff1aSopenharmony_ci 940cabdff1aSopenharmony_ci if (get_bits_left(&s->gb) < 1) 941cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 942cabdff1aSopenharmony_ci 943cabdff1aSopenharmony_ci if (get_bits1(&s->gb)) 944cabdff1aSopenharmony_ci padding_zeroes = get_bits(&s->gb, 5); 945cabdff1aSopenharmony_ci else 946cabdff1aSopenharmony_ci padding_zeroes = 0; 947cabdff1aSopenharmony_ci 948cabdff1aSopenharmony_ci if (rawpcm_tile) { 949cabdff1aSopenharmony_ci int bits = s->bits_per_sample - padding_zeroes; 950cabdff1aSopenharmony_ci if (bits <= 0) { 951cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, 952cabdff1aSopenharmony_ci "Invalid number of padding bits in raw PCM tile\n"); 953cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 954cabdff1aSopenharmony_ci } 955cabdff1aSopenharmony_ci ff_dlog(s->avctx, "RAWPCM %d bits per sample. " 956cabdff1aSopenharmony_ci "total %d bits, remain=%d\n", bits, 957cabdff1aSopenharmony_ci bits * s->num_channels * subframe_len, get_bits_count(&s->gb)); 958cabdff1aSopenharmony_ci for (i = 0; i < s->num_channels; i++) 959cabdff1aSopenharmony_ci for (j = 0; j < subframe_len; j++) 960cabdff1aSopenharmony_ci s->channel_residues[i][j] = get_sbits_long(&s->gb, bits); 961cabdff1aSopenharmony_ci } else { 962cabdff1aSopenharmony_ci if (s->bits_per_sample < padding_zeroes) 963cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 964cabdff1aSopenharmony_ci for (i = 0; i < s->num_channels; i++) { 965cabdff1aSopenharmony_ci if (s->is_channel_coded[i]) { 966cabdff1aSopenharmony_ci decode_channel_residues(s, i, subframe_len); 967cabdff1aSopenharmony_ci if (s->seekable_tile) 968cabdff1aSopenharmony_ci use_high_update_speed(s, i); 969cabdff1aSopenharmony_ci else 970cabdff1aSopenharmony_ci use_normal_update_speed(s, i); 971cabdff1aSopenharmony_ci if (s->bits_per_sample > 16) 972cabdff1aSopenharmony_ci revert_cdlms32(s, i, 0, subframe_len); 973cabdff1aSopenharmony_ci else 974cabdff1aSopenharmony_ci revert_cdlms16(s, i, 0, subframe_len); 975cabdff1aSopenharmony_ci } else { 976cabdff1aSopenharmony_ci memset(s->channel_residues[i], 0, sizeof(**s->channel_residues) * subframe_len); 977cabdff1aSopenharmony_ci } 978cabdff1aSopenharmony_ci } 979cabdff1aSopenharmony_ci 980cabdff1aSopenharmony_ci if (s->do_mclms) 981cabdff1aSopenharmony_ci revert_mclms(s, subframe_len); 982cabdff1aSopenharmony_ci if (s->do_inter_ch_decorr) 983cabdff1aSopenharmony_ci revert_inter_ch_decorr(s, subframe_len); 984cabdff1aSopenharmony_ci if (s->do_ac_filter) 985cabdff1aSopenharmony_ci revert_acfilter(s, subframe_len); 986cabdff1aSopenharmony_ci 987cabdff1aSopenharmony_ci /* Dequantize */ 988cabdff1aSopenharmony_ci if (s->quant_stepsize != 1) 989cabdff1aSopenharmony_ci for (i = 0; i < s->num_channels; i++) 990cabdff1aSopenharmony_ci for (j = 0; j < subframe_len; j++) 991cabdff1aSopenharmony_ci s->channel_residues[i][j] *= (unsigned)s->quant_stepsize; 992cabdff1aSopenharmony_ci } 993cabdff1aSopenharmony_ci 994cabdff1aSopenharmony_ci /* Write to proper output buffer depending on bit-depth */ 995cabdff1aSopenharmony_ci for (i = 0; i < s->channels_for_cur_subframe; i++) { 996cabdff1aSopenharmony_ci int c = s->channel_indexes_for_cur_subframe[i]; 997cabdff1aSopenharmony_ci int subframe_len = s->channel[c].subframe_len[s->channel[c].cur_subframe]; 998cabdff1aSopenharmony_ci 999cabdff1aSopenharmony_ci for (j = 0; j < subframe_len; j++) { 1000cabdff1aSopenharmony_ci if (s->bits_per_sample == 16) { 1001cabdff1aSopenharmony_ci *s->samples_16[c]++ = (int16_t) s->channel_residues[c][j] * (1 << padding_zeroes); 1002cabdff1aSopenharmony_ci } else { 1003cabdff1aSopenharmony_ci *s->samples_32[c]++ = s->channel_residues[c][j] * (256U << padding_zeroes); 1004cabdff1aSopenharmony_ci } 1005cabdff1aSopenharmony_ci } 1006cabdff1aSopenharmony_ci } 1007cabdff1aSopenharmony_ci 1008cabdff1aSopenharmony_ci /* handled one subframe */ 1009cabdff1aSopenharmony_ci for (i = 0; i < s->channels_for_cur_subframe; i++) { 1010cabdff1aSopenharmony_ci int c = s->channel_indexes_for_cur_subframe[i]; 1011cabdff1aSopenharmony_ci if (s->channel[c].cur_subframe >= s->channel[c].num_subframes) { 1012cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "broken subframe\n"); 1013cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1014cabdff1aSopenharmony_ci } 1015cabdff1aSopenharmony_ci ++s->channel[c].cur_subframe; 1016cabdff1aSopenharmony_ci } 1017cabdff1aSopenharmony_ci return 0; 1018cabdff1aSopenharmony_ci} 1019cabdff1aSopenharmony_ci 1020cabdff1aSopenharmony_ci/** 1021cabdff1aSopenharmony_ci * @brief Decode one WMA frame. 1022cabdff1aSopenharmony_ci * @param s codec context 1023cabdff1aSopenharmony_ci * @return 0 if the trailer bit indicates that this is the last frame, 1024cabdff1aSopenharmony_ci * 1 if there are additional frames 1025cabdff1aSopenharmony_ci */ 1026cabdff1aSopenharmony_cistatic int decode_frame(WmallDecodeCtx *s) 1027cabdff1aSopenharmony_ci{ 1028cabdff1aSopenharmony_ci GetBitContext* gb = &s->gb; 1029cabdff1aSopenharmony_ci int more_frames = 0, len = 0, i, ret; 1030cabdff1aSopenharmony_ci 1031cabdff1aSopenharmony_ci s->frame->nb_samples = s->samples_per_frame; 1032cabdff1aSopenharmony_ci if ((ret = ff_get_buffer(s->avctx, s->frame, 0)) < 0) { 1033cabdff1aSopenharmony_ci /* return an error if no frame could be decoded at all */ 1034cabdff1aSopenharmony_ci s->packet_loss = 1; 1035cabdff1aSopenharmony_ci s->frame->nb_samples = 0; 1036cabdff1aSopenharmony_ci return ret; 1037cabdff1aSopenharmony_ci } 1038cabdff1aSopenharmony_ci for (i = 0; i < s->num_channels; i++) { 1039cabdff1aSopenharmony_ci s->samples_16[i] = (int16_t *)s->frame->extended_data[i]; 1040cabdff1aSopenharmony_ci s->samples_32[i] = (int32_t *)s->frame->extended_data[i]; 1041cabdff1aSopenharmony_ci } 1042cabdff1aSopenharmony_ci 1043cabdff1aSopenharmony_ci /* get frame length */ 1044cabdff1aSopenharmony_ci if (s->len_prefix) 1045cabdff1aSopenharmony_ci len = get_bits(gb, s->log2_frame_size); 1046cabdff1aSopenharmony_ci 1047cabdff1aSopenharmony_ci /* decode tile information */ 1048cabdff1aSopenharmony_ci if ((ret = decode_tilehdr(s))) { 1049cabdff1aSopenharmony_ci s->packet_loss = 1; 1050cabdff1aSopenharmony_ci av_frame_unref(s->frame); 1051cabdff1aSopenharmony_ci return ret; 1052cabdff1aSopenharmony_ci } 1053cabdff1aSopenharmony_ci 1054cabdff1aSopenharmony_ci /* read drc info */ 1055cabdff1aSopenharmony_ci if (s->dynamic_range_compression) 1056cabdff1aSopenharmony_ci s->drc_gain = get_bits(gb, 8); 1057cabdff1aSopenharmony_ci 1058cabdff1aSopenharmony_ci /* no idea what these are for, might be the number of samples 1059cabdff1aSopenharmony_ci that need to be skipped at the beginning or end of a stream */ 1060cabdff1aSopenharmony_ci if (get_bits1(gb)) { 1061cabdff1aSopenharmony_ci int av_unused skip; 1062cabdff1aSopenharmony_ci 1063cabdff1aSopenharmony_ci /* usually true for the first frame */ 1064cabdff1aSopenharmony_ci if (get_bits1(gb)) { 1065cabdff1aSopenharmony_ci skip = get_bits(gb, av_log2(s->samples_per_frame * 2)); 1066cabdff1aSopenharmony_ci ff_dlog(s->avctx, "start skip: %i\n", skip); 1067cabdff1aSopenharmony_ci } 1068cabdff1aSopenharmony_ci 1069cabdff1aSopenharmony_ci /* sometimes true for the last frame */ 1070cabdff1aSopenharmony_ci if (get_bits1(gb)) { 1071cabdff1aSopenharmony_ci skip = get_bits(gb, av_log2(s->samples_per_frame * 2)); 1072cabdff1aSopenharmony_ci ff_dlog(s->avctx, "end skip: %i\n", skip); 1073cabdff1aSopenharmony_ci s->frame->nb_samples -= skip; 1074cabdff1aSopenharmony_ci if (s->frame->nb_samples <= 0) 1075cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1076cabdff1aSopenharmony_ci } 1077cabdff1aSopenharmony_ci 1078cabdff1aSopenharmony_ci } 1079cabdff1aSopenharmony_ci 1080cabdff1aSopenharmony_ci /* reset subframe states */ 1081cabdff1aSopenharmony_ci s->parsed_all_subframes = 0; 1082cabdff1aSopenharmony_ci for (i = 0; i < s->num_channels; i++) { 1083cabdff1aSopenharmony_ci s->channel[i].decoded_samples = 0; 1084cabdff1aSopenharmony_ci s->channel[i].cur_subframe = 0; 1085cabdff1aSopenharmony_ci } 1086cabdff1aSopenharmony_ci 1087cabdff1aSopenharmony_ci /* decode all subframes */ 1088cabdff1aSopenharmony_ci while (!s->parsed_all_subframes) { 1089cabdff1aSopenharmony_ci int decoded_samples = s->channel[0].decoded_samples; 1090cabdff1aSopenharmony_ci if (decode_subframe(s) < 0) { 1091cabdff1aSopenharmony_ci s->packet_loss = 1; 1092cabdff1aSopenharmony_ci if (s->frame->nb_samples) 1093cabdff1aSopenharmony_ci s->frame->nb_samples = decoded_samples; 1094cabdff1aSopenharmony_ci return 0; 1095cabdff1aSopenharmony_ci } 1096cabdff1aSopenharmony_ci } 1097cabdff1aSopenharmony_ci 1098cabdff1aSopenharmony_ci ff_dlog(s->avctx, "Frame done\n"); 1099cabdff1aSopenharmony_ci 1100cabdff1aSopenharmony_ci s->skip_frame = 0; 1101cabdff1aSopenharmony_ci 1102cabdff1aSopenharmony_ci if (s->len_prefix) { 1103cabdff1aSopenharmony_ci if (len != (get_bits_count(gb) - s->frame_offset) + 2) { 1104cabdff1aSopenharmony_ci /* FIXME: not sure if this is always an error */ 1105cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, 1106cabdff1aSopenharmony_ci "frame[%"PRIu32"] would have to skip %i bits\n", 1107cabdff1aSopenharmony_ci s->frame_num, 1108cabdff1aSopenharmony_ci len - (get_bits_count(gb) - s->frame_offset) - 1); 1109cabdff1aSopenharmony_ci s->packet_loss = 1; 1110cabdff1aSopenharmony_ci return 0; 1111cabdff1aSopenharmony_ci } 1112cabdff1aSopenharmony_ci 1113cabdff1aSopenharmony_ci /* skip the rest of the frame data */ 1114cabdff1aSopenharmony_ci skip_bits_long(gb, len - (get_bits_count(gb) - s->frame_offset) - 1); 1115cabdff1aSopenharmony_ci } 1116cabdff1aSopenharmony_ci 1117cabdff1aSopenharmony_ci /* decode trailer bit */ 1118cabdff1aSopenharmony_ci more_frames = get_bits1(gb); 1119cabdff1aSopenharmony_ci ++s->frame_num; 1120cabdff1aSopenharmony_ci return more_frames; 1121cabdff1aSopenharmony_ci} 1122cabdff1aSopenharmony_ci 1123cabdff1aSopenharmony_ci/** 1124cabdff1aSopenharmony_ci * @brief Calculate remaining input buffer length. 1125cabdff1aSopenharmony_ci * @param s codec context 1126cabdff1aSopenharmony_ci * @param gb bitstream reader context 1127cabdff1aSopenharmony_ci * @return remaining size in bits 1128cabdff1aSopenharmony_ci */ 1129cabdff1aSopenharmony_cistatic int remaining_bits(WmallDecodeCtx *s, GetBitContext *gb) 1130cabdff1aSopenharmony_ci{ 1131cabdff1aSopenharmony_ci return s->buf_bit_size - get_bits_count(gb); 1132cabdff1aSopenharmony_ci} 1133cabdff1aSopenharmony_ci 1134cabdff1aSopenharmony_ci/** 1135cabdff1aSopenharmony_ci * @brief Fill the bit reservoir with a (partial) frame. 1136cabdff1aSopenharmony_ci * @param s codec context 1137cabdff1aSopenharmony_ci * @param gb bitstream reader context 1138cabdff1aSopenharmony_ci * @param len length of the partial frame 1139cabdff1aSopenharmony_ci * @param append decides whether to reset the buffer or not 1140cabdff1aSopenharmony_ci */ 1141cabdff1aSopenharmony_cistatic void save_bits(WmallDecodeCtx *s, GetBitContext* gb, int len, 1142cabdff1aSopenharmony_ci int append) 1143cabdff1aSopenharmony_ci{ 1144cabdff1aSopenharmony_ci int buflen; 1145cabdff1aSopenharmony_ci PutBitContext tmp; 1146cabdff1aSopenharmony_ci 1147cabdff1aSopenharmony_ci /* when the frame data does not need to be concatenated, the input buffer 1148cabdff1aSopenharmony_ci is reset and additional bits from the previous frame are copied 1149cabdff1aSopenharmony_ci and skipped later so that a fast byte copy is possible */ 1150cabdff1aSopenharmony_ci 1151cabdff1aSopenharmony_ci if (!append) { 1152cabdff1aSopenharmony_ci s->frame_offset = get_bits_count(gb) & 7; 1153cabdff1aSopenharmony_ci s->num_saved_bits = s->frame_offset; 1154cabdff1aSopenharmony_ci init_put_bits(&s->pb, s->frame_data, s->max_frame_size); 1155cabdff1aSopenharmony_ci } 1156cabdff1aSopenharmony_ci 1157cabdff1aSopenharmony_ci buflen = (s->num_saved_bits + len + 8) >> 3; 1158cabdff1aSopenharmony_ci 1159cabdff1aSopenharmony_ci if (len <= 0 || buflen > s->max_frame_size) { 1160cabdff1aSopenharmony_ci avpriv_request_sample(s->avctx, "Too small input buffer"); 1161cabdff1aSopenharmony_ci s->packet_loss = 1; 1162cabdff1aSopenharmony_ci s->num_saved_bits = 0; 1163cabdff1aSopenharmony_ci return; 1164cabdff1aSopenharmony_ci } 1165cabdff1aSopenharmony_ci 1166cabdff1aSopenharmony_ci s->num_saved_bits += len; 1167cabdff1aSopenharmony_ci if (!append) { 1168cabdff1aSopenharmony_ci ff_copy_bits(&s->pb, gb->buffer + (get_bits_count(gb) >> 3), 1169cabdff1aSopenharmony_ci s->num_saved_bits); 1170cabdff1aSopenharmony_ci } else { 1171cabdff1aSopenharmony_ci int align = 8 - (get_bits_count(gb) & 7); 1172cabdff1aSopenharmony_ci align = FFMIN(align, len); 1173cabdff1aSopenharmony_ci put_bits(&s->pb, align, get_bits(gb, align)); 1174cabdff1aSopenharmony_ci len -= align; 1175cabdff1aSopenharmony_ci ff_copy_bits(&s->pb, gb->buffer + (get_bits_count(gb) >> 3), len); 1176cabdff1aSopenharmony_ci } 1177cabdff1aSopenharmony_ci skip_bits_long(gb, len); 1178cabdff1aSopenharmony_ci 1179cabdff1aSopenharmony_ci tmp = s->pb; 1180cabdff1aSopenharmony_ci flush_put_bits(&tmp); 1181cabdff1aSopenharmony_ci 1182cabdff1aSopenharmony_ci init_get_bits(&s->gb, s->frame_data, s->num_saved_bits); 1183cabdff1aSopenharmony_ci skip_bits(&s->gb, s->frame_offset); 1184cabdff1aSopenharmony_ci} 1185cabdff1aSopenharmony_ci 1186cabdff1aSopenharmony_cistatic int decode_packet(AVCodecContext *avctx, AVFrame *rframe, 1187cabdff1aSopenharmony_ci int *got_frame_ptr, AVPacket* avpkt) 1188cabdff1aSopenharmony_ci{ 1189cabdff1aSopenharmony_ci WmallDecodeCtx *s = avctx->priv_data; 1190cabdff1aSopenharmony_ci GetBitContext* gb = &s->pgb; 1191cabdff1aSopenharmony_ci const uint8_t* buf = avpkt->data; 1192cabdff1aSopenharmony_ci int buf_size = avpkt->size; 1193cabdff1aSopenharmony_ci int num_bits_prev_frame, packet_sequence_number, spliced_packet; 1194cabdff1aSopenharmony_ci 1195cabdff1aSopenharmony_ci s->frame->nb_samples = 0; 1196cabdff1aSopenharmony_ci 1197cabdff1aSopenharmony_ci if (!buf_size && s->num_saved_bits > get_bits_count(&s->gb)) { 1198cabdff1aSopenharmony_ci s->packet_done = 0; 1199cabdff1aSopenharmony_ci if (!decode_frame(s)) 1200cabdff1aSopenharmony_ci s->num_saved_bits = 0; 1201cabdff1aSopenharmony_ci } else if (s->packet_done || s->packet_loss) { 1202cabdff1aSopenharmony_ci s->packet_done = 0; 1203cabdff1aSopenharmony_ci 1204cabdff1aSopenharmony_ci if (!buf_size) 1205cabdff1aSopenharmony_ci return 0; 1206cabdff1aSopenharmony_ci 1207cabdff1aSopenharmony_ci s->next_packet_start = buf_size - FFMIN(avctx->block_align, buf_size); 1208cabdff1aSopenharmony_ci buf_size = FFMIN(avctx->block_align, buf_size); 1209cabdff1aSopenharmony_ci s->buf_bit_size = buf_size << 3; 1210cabdff1aSopenharmony_ci 1211cabdff1aSopenharmony_ci /* parse packet header */ 1212cabdff1aSopenharmony_ci init_get_bits(gb, buf, s->buf_bit_size); 1213cabdff1aSopenharmony_ci packet_sequence_number = get_bits(gb, 4); 1214cabdff1aSopenharmony_ci skip_bits(gb, 1); // Skip seekable_frame_in_packet, currently unused 1215cabdff1aSopenharmony_ci spliced_packet = get_bits1(gb); 1216cabdff1aSopenharmony_ci if (spliced_packet) 1217cabdff1aSopenharmony_ci avpriv_request_sample(avctx, "Bitstream splicing"); 1218cabdff1aSopenharmony_ci 1219cabdff1aSopenharmony_ci /* get number of bits that need to be added to the previous frame */ 1220cabdff1aSopenharmony_ci num_bits_prev_frame = get_bits(gb, s->log2_frame_size); 1221cabdff1aSopenharmony_ci 1222cabdff1aSopenharmony_ci /* check for packet loss */ 1223cabdff1aSopenharmony_ci if (!s->packet_loss && 1224cabdff1aSopenharmony_ci ((s->packet_sequence_number + 1) & 0xF) != packet_sequence_number) { 1225cabdff1aSopenharmony_ci s->packet_loss = 1; 1226cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, 1227cabdff1aSopenharmony_ci "Packet loss detected! seq %"PRIx8" vs %x\n", 1228cabdff1aSopenharmony_ci s->packet_sequence_number, packet_sequence_number); 1229cabdff1aSopenharmony_ci } 1230cabdff1aSopenharmony_ci s->packet_sequence_number = packet_sequence_number; 1231cabdff1aSopenharmony_ci 1232cabdff1aSopenharmony_ci if (num_bits_prev_frame > 0) { 1233cabdff1aSopenharmony_ci int remaining_packet_bits = s->buf_bit_size - get_bits_count(gb); 1234cabdff1aSopenharmony_ci if (num_bits_prev_frame >= remaining_packet_bits) { 1235cabdff1aSopenharmony_ci num_bits_prev_frame = remaining_packet_bits; 1236cabdff1aSopenharmony_ci s->packet_done = 1; 1237cabdff1aSopenharmony_ci } 1238cabdff1aSopenharmony_ci 1239cabdff1aSopenharmony_ci /* Append the previous frame data to the remaining data from the 1240cabdff1aSopenharmony_ci * previous packet to create a full frame. */ 1241cabdff1aSopenharmony_ci save_bits(s, gb, num_bits_prev_frame, 1); 1242cabdff1aSopenharmony_ci 1243cabdff1aSopenharmony_ci /* decode the cross packet frame if it is valid */ 1244cabdff1aSopenharmony_ci if (num_bits_prev_frame < remaining_packet_bits && !s->packet_loss) 1245cabdff1aSopenharmony_ci decode_frame(s); 1246cabdff1aSopenharmony_ci } else if (s->num_saved_bits - s->frame_offset) { 1247cabdff1aSopenharmony_ci ff_dlog(avctx, "ignoring %x previously saved bits\n", 1248cabdff1aSopenharmony_ci s->num_saved_bits - s->frame_offset); 1249cabdff1aSopenharmony_ci } 1250cabdff1aSopenharmony_ci 1251cabdff1aSopenharmony_ci if (s->packet_loss) { 1252cabdff1aSopenharmony_ci /* Reset number of saved bits so that the decoder does not start 1253cabdff1aSopenharmony_ci * to decode incomplete frames in the s->len_prefix == 0 case. */ 1254cabdff1aSopenharmony_ci s->num_saved_bits = 0; 1255cabdff1aSopenharmony_ci s->packet_loss = 0; 1256cabdff1aSopenharmony_ci init_put_bits(&s->pb, s->frame_data, s->max_frame_size); 1257cabdff1aSopenharmony_ci } 1258cabdff1aSopenharmony_ci 1259cabdff1aSopenharmony_ci } else { 1260cabdff1aSopenharmony_ci int frame_size; 1261cabdff1aSopenharmony_ci 1262cabdff1aSopenharmony_ci s->buf_bit_size = (avpkt->size - s->next_packet_start) << 3; 1263cabdff1aSopenharmony_ci init_get_bits(gb, avpkt->data, s->buf_bit_size); 1264cabdff1aSopenharmony_ci skip_bits(gb, s->packet_offset); 1265cabdff1aSopenharmony_ci 1266cabdff1aSopenharmony_ci if (s->len_prefix && remaining_bits(s, gb) > s->log2_frame_size && 1267cabdff1aSopenharmony_ci (frame_size = show_bits(gb, s->log2_frame_size)) && 1268cabdff1aSopenharmony_ci frame_size <= remaining_bits(s, gb)) { 1269cabdff1aSopenharmony_ci save_bits(s, gb, frame_size, 0); 1270cabdff1aSopenharmony_ci 1271cabdff1aSopenharmony_ci if (!s->packet_loss) 1272cabdff1aSopenharmony_ci s->packet_done = !decode_frame(s); 1273cabdff1aSopenharmony_ci } else if (!s->len_prefix 1274cabdff1aSopenharmony_ci && s->num_saved_bits > get_bits_count(&s->gb)) { 1275cabdff1aSopenharmony_ci /* when the frames do not have a length prefix, we don't know the 1276cabdff1aSopenharmony_ci * compressed length of the individual frames however, we know what 1277cabdff1aSopenharmony_ci * part of a new packet belongs to the previous frame therefore we 1278cabdff1aSopenharmony_ci * save the incoming packet first, then we append the "previous 1279cabdff1aSopenharmony_ci * frame" data from the next packet so that we get a buffer that 1280cabdff1aSopenharmony_ci * only contains full frames */ 1281cabdff1aSopenharmony_ci s->packet_done = !decode_frame(s); 1282cabdff1aSopenharmony_ci } else { 1283cabdff1aSopenharmony_ci s->packet_done = 1; 1284cabdff1aSopenharmony_ci } 1285cabdff1aSopenharmony_ci } 1286cabdff1aSopenharmony_ci 1287cabdff1aSopenharmony_ci if (remaining_bits(s, gb) < 0) { 1288cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "Overread %d\n", -remaining_bits(s, gb)); 1289cabdff1aSopenharmony_ci s->packet_loss = 1; 1290cabdff1aSopenharmony_ci } 1291cabdff1aSopenharmony_ci 1292cabdff1aSopenharmony_ci if (s->packet_done && !s->packet_loss && 1293cabdff1aSopenharmony_ci remaining_bits(s, gb) > 0) { 1294cabdff1aSopenharmony_ci /* save the rest of the data so that it can be decoded 1295cabdff1aSopenharmony_ci * with the next packet */ 1296cabdff1aSopenharmony_ci save_bits(s, gb, remaining_bits(s, gb), 0); 1297cabdff1aSopenharmony_ci } 1298cabdff1aSopenharmony_ci 1299cabdff1aSopenharmony_ci *got_frame_ptr = s->frame->nb_samples > 0; 1300cabdff1aSopenharmony_ci av_frame_move_ref(rframe, s->frame); 1301cabdff1aSopenharmony_ci 1302cabdff1aSopenharmony_ci s->packet_offset = get_bits_count(gb) & 7; 1303cabdff1aSopenharmony_ci 1304cabdff1aSopenharmony_ci return (s->packet_loss) ? AVERROR_INVALIDDATA : buf_size ? get_bits_count(gb) >> 3 : 0; 1305cabdff1aSopenharmony_ci} 1306cabdff1aSopenharmony_ci 1307cabdff1aSopenharmony_cistatic void flush(AVCodecContext *avctx) 1308cabdff1aSopenharmony_ci{ 1309cabdff1aSopenharmony_ci WmallDecodeCtx *s = avctx->priv_data; 1310cabdff1aSopenharmony_ci s->packet_loss = 1; 1311cabdff1aSopenharmony_ci s->packet_done = 0; 1312cabdff1aSopenharmony_ci s->num_saved_bits = 0; 1313cabdff1aSopenharmony_ci s->frame_offset = 0; 1314cabdff1aSopenharmony_ci s->next_packet_start = 0; 1315cabdff1aSopenharmony_ci s->cdlms[0][0].order = 0; 1316cabdff1aSopenharmony_ci s->frame->nb_samples = 0; 1317cabdff1aSopenharmony_ci init_put_bits(&s->pb, s->frame_data, s->max_frame_size); 1318cabdff1aSopenharmony_ci} 1319cabdff1aSopenharmony_ci 1320cabdff1aSopenharmony_cistatic av_cold int decode_close(AVCodecContext *avctx) 1321cabdff1aSopenharmony_ci{ 1322cabdff1aSopenharmony_ci WmallDecodeCtx *s = avctx->priv_data; 1323cabdff1aSopenharmony_ci 1324cabdff1aSopenharmony_ci av_frame_free(&s->frame); 1325cabdff1aSopenharmony_ci av_freep(&s->frame_data); 1326cabdff1aSopenharmony_ci 1327cabdff1aSopenharmony_ci return 0; 1328cabdff1aSopenharmony_ci} 1329cabdff1aSopenharmony_ci 1330cabdff1aSopenharmony_ciconst FFCodec ff_wmalossless_decoder = { 1331cabdff1aSopenharmony_ci .p.name = "wmalossless", 1332cabdff1aSopenharmony_ci .p.long_name = NULL_IF_CONFIG_SMALL("Windows Media Audio Lossless"), 1333cabdff1aSopenharmony_ci .p.type = AVMEDIA_TYPE_AUDIO, 1334cabdff1aSopenharmony_ci .p.id = AV_CODEC_ID_WMALOSSLESS, 1335cabdff1aSopenharmony_ci .priv_data_size = sizeof(WmallDecodeCtx), 1336cabdff1aSopenharmony_ci .init = decode_init, 1337cabdff1aSopenharmony_ci .close = decode_close, 1338cabdff1aSopenharmony_ci FF_CODEC_DECODE_CB(decode_packet), 1339cabdff1aSopenharmony_ci .flush = flush, 1340cabdff1aSopenharmony_ci .p.capabilities = AV_CODEC_CAP_SUBFRAMES | AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY, 1341cabdff1aSopenharmony_ci .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_INIT_CLEANUP, 1342cabdff1aSopenharmony_ci .p.sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_S16P, 1343cabdff1aSopenharmony_ci AV_SAMPLE_FMT_S32P, 1344cabdff1aSopenharmony_ci AV_SAMPLE_FMT_NONE }, 1345cabdff1aSopenharmony_ci}; 1346