yading@10: /* yading@10: * Windows Media Audio Lossless decoder yading@10: * Copyright (c) 2007 Baptiste Coudurier, Benjamin Larsson, Ulion yading@10: * Copyright (c) 2008 - 2011 Sascha Sommer, Benjamin Larsson yading@10: * Copyright (c) 2011 Andreas Ă–man yading@10: * Copyright (c) 2011 - 2012 Mashiat Sarker Shakkhar yading@10: * yading@10: * This file is part of FFmpeg. yading@10: * yading@10: * FFmpeg is free software; you can redistribute it and/or yading@10: * modify it under the terms of the GNU Lesser General Public yading@10: * License as published by the Free Software Foundation; either yading@10: * version 2.1 of the License, or (at your option) any later version. yading@10: * yading@10: * FFmpeg is distributed in the hope that it will be useful, yading@10: * but WITHOUT ANY WARRANTY; without even the implied warranty of yading@10: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU yading@10: * Lesser General Public License for more details. yading@10: * yading@10: * You should have received a copy of the GNU Lesser General Public yading@10: * License along with FFmpeg; if not, write to the Free Software yading@10: * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA yading@10: */ yading@10: yading@10: #include "libavutil/attributes.h" yading@10: #include "libavutil/avassert.h" yading@10: yading@10: #include "avcodec.h" yading@10: #include "internal.h" yading@10: #include "get_bits.h" yading@10: #include "put_bits.h" yading@10: #include "wma.h" yading@10: #include "wma_common.h" yading@10: yading@10: /** current decoder limitations */ yading@10: #define WMALL_MAX_CHANNELS 8 ///< max number of handled channels yading@10: #define MAX_SUBFRAMES 32 ///< max number of subframes per channel yading@10: #define MAX_BANDS 29 ///< max number of scale factor bands yading@10: #define MAX_FRAMESIZE 32768 ///< maximum compressed frame size yading@10: #define MAX_ORDER 256 yading@10: yading@10: #define WMALL_BLOCK_MIN_BITS 6 ///< log2 of min block size yading@10: #define WMALL_BLOCK_MAX_BITS 14 ///< log2 of max block size yading@10: #define WMALL_BLOCK_MAX_SIZE (1 << WMALL_BLOCK_MAX_BITS) ///< maximum block size yading@10: #define WMALL_BLOCK_SIZES (WMALL_BLOCK_MAX_BITS - WMALL_BLOCK_MIN_BITS + 1) ///< possible block sizes yading@10: yading@10: yading@10: /** yading@10: * @brief frame-specific decoder context for a single channel yading@10: */ yading@10: typedef struct { yading@10: int16_t prev_block_len; ///< length of the previous block yading@10: uint8_t transmit_coefs; yading@10: uint8_t num_subframes; yading@10: uint16_t subframe_len[MAX_SUBFRAMES]; ///< subframe length in samples yading@10: uint16_t subframe_offsets[MAX_SUBFRAMES]; ///< subframe positions in the current frame yading@10: uint8_t cur_subframe; ///< current subframe number yading@10: uint16_t decoded_samples; ///< number of already processed samples yading@10: int quant_step; ///< quantization step for the current subframe yading@10: int transient_counter; ///< number of transient samples from the beginning of the transient zone yading@10: } WmallChannelCtx; yading@10: yading@10: /** yading@10: * @brief main decoder context yading@10: */ yading@10: typedef struct WmallDecodeCtx { yading@10: /* generic decoder variables */ yading@10: AVCodecContext *avctx; yading@10: AVFrame frame; yading@10: uint8_t frame_data[MAX_FRAMESIZE + FF_INPUT_BUFFER_PADDING_SIZE]; ///< compressed frame data yading@10: PutBitContext pb; ///< context for filling the frame_data buffer yading@10: yading@10: /* frame size dependent frame information (set during initialization) */ yading@10: uint32_t decode_flags; ///< used compression features yading@10: int len_prefix; ///< frame is prefixed with its length yading@10: int dynamic_range_compression; ///< frame contains DRC data yading@10: uint8_t bits_per_sample; ///< integer audio sample size for the unscaled IMDCT output (used to scale to [-1.0, 1.0]) yading@10: uint16_t samples_per_frame; ///< number of samples to output yading@10: uint16_t log2_frame_size; yading@10: int8_t num_channels; ///< number of channels in the stream (same as AVCodecContext.num_channels) yading@10: int8_t lfe_channel; ///< lfe channel index yading@10: uint8_t max_num_subframes; yading@10: uint8_t subframe_len_bits; ///< number of bits used for the subframe length yading@10: uint8_t max_subframe_len_bit; ///< flag indicating that the subframe is of maximum size when the first subframe length bit is 1 yading@10: uint16_t min_samples_per_subframe; yading@10: yading@10: /* packet decode state */ yading@10: GetBitContext pgb; ///< bitstream reader context for the packet yading@10: int next_packet_start; ///< start offset of the next WMA packet in the demuxer packet yading@10: uint8_t packet_offset; ///< offset to the frame in the packet yading@10: uint8_t packet_sequence_number; ///< current packet number yading@10: int num_saved_bits; ///< saved number of bits yading@10: int frame_offset; ///< frame offset in the bit reservoir yading@10: int subframe_offset; ///< subframe offset in the bit reservoir yading@10: uint8_t packet_loss; ///< set in case of bitstream error yading@10: uint8_t packet_done; ///< set when a packet is fully decoded yading@10: yading@10: /* frame decode state */ yading@10: uint32_t frame_num; ///< current frame number (not used for decoding) yading@10: GetBitContext gb; ///< bitstream reader context yading@10: int buf_bit_size; ///< buffer size in bits yading@10: int16_t *samples_16[WMALL_MAX_CHANNELS]; ///< current samplebuffer pointer (16-bit) yading@10: int32_t *samples_32[WMALL_MAX_CHANNELS]; ///< current samplebuffer pointer (24-bit) yading@10: uint8_t drc_gain; ///< gain for the DRC tool yading@10: int8_t skip_frame; ///< skip output step yading@10: int8_t parsed_all_subframes; ///< all subframes decoded? yading@10: yading@10: /* subframe/block decode state */ yading@10: int16_t subframe_len; ///< current subframe length yading@10: int8_t channels_for_cur_subframe; ///< number of channels that contain the subframe yading@10: int8_t channel_indexes_for_cur_subframe[WMALL_MAX_CHANNELS]; yading@10: yading@10: WmallChannelCtx channel[WMALL_MAX_CHANNELS]; ///< per channel data yading@10: yading@10: // WMA Lossless-specific yading@10: yading@10: uint8_t do_arith_coding; yading@10: uint8_t do_ac_filter; yading@10: uint8_t do_inter_ch_decorr; yading@10: uint8_t do_mclms; yading@10: uint8_t do_lpc; yading@10: yading@10: int8_t acfilter_order; yading@10: int8_t acfilter_scaling; yading@10: int64_t acfilter_coeffs[16]; yading@10: int acfilter_prevvalues[WMALL_MAX_CHANNELS][16]; yading@10: yading@10: int8_t mclms_order; yading@10: int8_t mclms_scaling; yading@10: int16_t mclms_coeffs[128]; yading@10: int16_t mclms_coeffs_cur[4]; yading@10: int16_t mclms_prevvalues[WMALL_MAX_CHANNELS * 2 * 32]; yading@10: int16_t mclms_updates[WMALL_MAX_CHANNELS * 2 * 32]; yading@10: int mclms_recent; yading@10: yading@10: int movave_scaling; yading@10: int quant_stepsize; yading@10: yading@10: struct { yading@10: int order; yading@10: int scaling; yading@10: int coefsend; yading@10: int bitsend; yading@10: int16_t coefs[MAX_ORDER]; yading@10: int16_t lms_prevvalues[MAX_ORDER * 2]; yading@10: int16_t lms_updates[MAX_ORDER * 2]; yading@10: int recent; yading@10: } cdlms[WMALL_MAX_CHANNELS][9]; yading@10: yading@10: int cdlms_ttl[WMALL_MAX_CHANNELS]; yading@10: yading@10: int bV3RTM; yading@10: yading@10: int is_channel_coded[WMALL_MAX_CHANNELS]; yading@10: int update_speed[WMALL_MAX_CHANNELS]; yading@10: yading@10: int transient[WMALL_MAX_CHANNELS]; yading@10: int transient_pos[WMALL_MAX_CHANNELS]; yading@10: int seekable_tile; yading@10: yading@10: int ave_sum[WMALL_MAX_CHANNELS]; yading@10: yading@10: int channel_residues[WMALL_MAX_CHANNELS][WMALL_BLOCK_MAX_SIZE]; yading@10: yading@10: int lpc_coefs[WMALL_MAX_CHANNELS][40]; yading@10: int lpc_order; yading@10: int lpc_scaling; yading@10: int lpc_intbits; yading@10: yading@10: int channel_coeffs[WMALL_MAX_CHANNELS][WMALL_BLOCK_MAX_SIZE]; yading@10: } WmallDecodeCtx; yading@10: yading@10: yading@10: static av_cold int decode_init(AVCodecContext *avctx) yading@10: { yading@10: WmallDecodeCtx *s = avctx->priv_data; yading@10: uint8_t *edata_ptr = avctx->extradata; yading@10: unsigned int channel_mask; yading@10: int i, log2_max_num_subframes; yading@10: yading@10: s->avctx = avctx; yading@10: init_put_bits(&s->pb, s->frame_data, MAX_FRAMESIZE); yading@10: yading@10: if (avctx->extradata_size >= 18) { yading@10: s->decode_flags = AV_RL16(edata_ptr + 14); yading@10: channel_mask = AV_RL32(edata_ptr + 2); yading@10: s->bits_per_sample = AV_RL16(edata_ptr); yading@10: if (s->bits_per_sample == 16) yading@10: avctx->sample_fmt = AV_SAMPLE_FMT_S16P; yading@10: else if (s->bits_per_sample == 24) { yading@10: avctx->sample_fmt = AV_SAMPLE_FMT_S32P; yading@10: avpriv_report_missing_feature(avctx, "Bit-depth higher than 16"); yading@10: return AVERROR_PATCHWELCOME; yading@10: } else { yading@10: av_log(avctx, AV_LOG_ERROR, "Unknown bit-depth: %d\n", yading@10: s->bits_per_sample); yading@10: return AVERROR_INVALIDDATA; yading@10: } yading@10: /* dump the extradata */ yading@10: for (i = 0; i < avctx->extradata_size; i++) yading@10: av_dlog(avctx, "[%x] ", avctx->extradata[i]); yading@10: av_dlog(avctx, "\n"); yading@10: yading@10: } else { yading@10: avpriv_request_sample(avctx, "Unsupported extradata size"); yading@10: return AVERROR_PATCHWELCOME; yading@10: } yading@10: yading@10: /* generic init */ yading@10: s->log2_frame_size = av_log2(avctx->block_align) + 4; yading@10: yading@10: /* frame info */ yading@10: s->skip_frame = 1; /* skip first frame */ yading@10: s->packet_loss = 1; yading@10: s->len_prefix = s->decode_flags & 0x40; yading@10: yading@10: /* get frame len */ yading@10: s->samples_per_frame = 1 << ff_wma_get_frame_len_bits(avctx->sample_rate, yading@10: 3, s->decode_flags); yading@10: av_assert0(s->samples_per_frame <= WMALL_BLOCK_MAX_SIZE); yading@10: yading@10: /* init previous block len */ yading@10: for (i = 0; i < avctx->channels; i++) yading@10: s->channel[i].prev_block_len = s->samples_per_frame; yading@10: yading@10: /* subframe info */ yading@10: log2_max_num_subframes = (s->decode_flags & 0x38) >> 3; yading@10: s->max_num_subframes = 1 << log2_max_num_subframes; yading@10: s->max_subframe_len_bit = 0; yading@10: s->subframe_len_bits = av_log2(log2_max_num_subframes) + 1; yading@10: yading@10: s->min_samples_per_subframe = s->samples_per_frame / s->max_num_subframes; yading@10: s->dynamic_range_compression = s->decode_flags & 0x80; yading@10: s->bV3RTM = s->decode_flags & 0x100; yading@10: yading@10: if (s->max_num_subframes > MAX_SUBFRAMES) { yading@10: av_log(avctx, AV_LOG_ERROR, "invalid number of subframes %i\n", yading@10: s->max_num_subframes); yading@10: return AVERROR_INVALIDDATA; yading@10: } yading@10: yading@10: s->num_channels = avctx->channels; yading@10: yading@10: /* extract lfe channel position */ yading@10: s->lfe_channel = -1; yading@10: yading@10: if (channel_mask & 8) { yading@10: unsigned int mask; yading@10: for (mask = 1; mask < 16; mask <<= 1) yading@10: if (channel_mask & mask) yading@10: ++s->lfe_channel; yading@10: } yading@10: yading@10: if (s->num_channels < 0) { yading@10: av_log(avctx, AV_LOG_ERROR, "invalid number of channels %d\n", yading@10: s->num_channels); yading@10: return AVERROR_INVALIDDATA; yading@10: } else if (s->num_channels > WMALL_MAX_CHANNELS) { yading@10: avpriv_request_sample(avctx, yading@10: "More than %d channels", WMALL_MAX_CHANNELS); yading@10: return AVERROR_PATCHWELCOME; yading@10: } yading@10: yading@10: avcodec_get_frame_defaults(&s->frame); yading@10: avctx->coded_frame = &s->frame; yading@10: avctx->channel_layout = channel_mask; yading@10: return 0; yading@10: } yading@10: yading@10: /** yading@10: * @brief Decode the subframe length. yading@10: * @param s context yading@10: * @param offset sample offset in the frame yading@10: * @return decoded subframe length on success, < 0 in case of an error yading@10: */ yading@10: static int decode_subframe_length(WmallDecodeCtx *s, int offset) yading@10: { yading@10: int frame_len_ratio, subframe_len, len; yading@10: yading@10: /* no need to read from the bitstream when only one length is possible */ yading@10: if (offset == s->samples_per_frame - s->min_samples_per_subframe) yading@10: return s->min_samples_per_subframe; yading@10: yading@10: len = av_log2(s->max_num_subframes - 1) + 1; yading@10: frame_len_ratio = get_bits(&s->gb, len); yading@10: subframe_len = s->min_samples_per_subframe * (frame_len_ratio + 1); yading@10: yading@10: /* sanity check the length */ yading@10: if (subframe_len < s->min_samples_per_subframe || yading@10: subframe_len > s->samples_per_frame) { yading@10: av_log(s->avctx, AV_LOG_ERROR, "broken frame: subframe_len %i\n", yading@10: subframe_len); yading@10: return AVERROR_INVALIDDATA; yading@10: } yading@10: return subframe_len; yading@10: } yading@10: yading@10: /** yading@10: * @brief Decode how the data in the frame is split into subframes. yading@10: * Every WMA frame contains the encoded data for a fixed number of yading@10: * samples per channel. The data for every channel might be split yading@10: * into several subframes. This function will reconstruct the list of yading@10: * subframes for every channel. yading@10: * yading@10: * If the subframes are not evenly split, the algorithm estimates the yading@10: * channels with the lowest number of total samples. yading@10: * Afterwards, for each of these channels a bit is read from the yading@10: * bitstream that indicates if the channel contains a subframe with the yading@10: * next subframe size that is going to be read from the bitstream or not. yading@10: * If a channel contains such a subframe, the subframe size gets added to yading@10: * the channel's subframe list. yading@10: * The algorithm repeats these steps until the frame is properly divided yading@10: * between the individual channels. yading@10: * yading@10: * @param s context yading@10: * @return 0 on success, < 0 in case of an error yading@10: */ yading@10: static int decode_tilehdr(WmallDecodeCtx *s) yading@10: { yading@10: uint16_t num_samples[WMALL_MAX_CHANNELS] = { 0 }; /* sum of samples for all currently known subframes of a channel */ yading@10: uint8_t contains_subframe[WMALL_MAX_CHANNELS]; /* flag indicating if a channel contains the current subframe */ yading@10: int channels_for_cur_subframe = s->num_channels; /* number of channels that contain the current subframe */ yading@10: int fixed_channel_layout = 0; /* flag indicating that all channels use the same subfra2me offsets and sizes */ yading@10: int min_channel_len = 0; /* smallest sum of samples (channels with this length will be processed first) */ yading@10: int c, tile_aligned; yading@10: yading@10: /* reset tiling information */ yading@10: for (c = 0; c < s->num_channels; c++) yading@10: s->channel[c].num_subframes = 0; yading@10: yading@10: tile_aligned = get_bits1(&s->gb); yading@10: if (s->max_num_subframes == 1 || tile_aligned) yading@10: fixed_channel_layout = 1; yading@10: yading@10: /* loop until the frame data is split between the subframes */ yading@10: do { yading@10: int subframe_len, in_use = 0; yading@10: yading@10: /* check which channels contain the subframe */ yading@10: for (c = 0; c < s->num_channels; c++) { yading@10: if (num_samples[c] == min_channel_len) { yading@10: if (fixed_channel_layout || channels_for_cur_subframe == 1 || yading@10: (min_channel_len == s->samples_per_frame - s->min_samples_per_subframe)) { yading@10: contains_subframe[c] = in_use = 1; yading@10: } else { yading@10: if (get_bits1(&s->gb)) yading@10: contains_subframe[c] = in_use = 1; yading@10: } yading@10: } else yading@10: contains_subframe[c] = 0; yading@10: } yading@10: yading@10: if (!in_use) { yading@10: av_log(s->avctx, AV_LOG_ERROR, yading@10: "Found empty subframe\n"); yading@10: return AVERROR_INVALIDDATA; yading@10: } yading@10: yading@10: /* get subframe length, subframe_len == 0 is not allowed */ yading@10: if ((subframe_len = decode_subframe_length(s, min_channel_len)) <= 0) yading@10: return AVERROR_INVALIDDATA; yading@10: /* add subframes to the individual channels and find new min_channel_len */ yading@10: min_channel_len += subframe_len; yading@10: for (c = 0; c < s->num_channels; c++) { yading@10: WmallChannelCtx *chan = &s->channel[c]; yading@10: yading@10: if (contains_subframe[c]) { yading@10: if (chan->num_subframes >= MAX_SUBFRAMES) { yading@10: av_log(s->avctx, AV_LOG_ERROR, yading@10: "broken frame: num subframes > 31\n"); yading@10: return AVERROR_INVALIDDATA; yading@10: } yading@10: chan->subframe_len[chan->num_subframes] = subframe_len; yading@10: num_samples[c] += subframe_len; yading@10: ++chan->num_subframes; yading@10: if (num_samples[c] > s->samples_per_frame) { yading@10: av_log(s->avctx, AV_LOG_ERROR, "broken frame: " yading@10: "channel len(%d) > samples_per_frame(%d)\n", yading@10: num_samples[c], s->samples_per_frame); yading@10: return AVERROR_INVALIDDATA; yading@10: } yading@10: } else if (num_samples[c] <= min_channel_len) { yading@10: if (num_samples[c] < min_channel_len) { yading@10: channels_for_cur_subframe = 0; yading@10: min_channel_len = num_samples[c]; yading@10: } yading@10: ++channels_for_cur_subframe; yading@10: } yading@10: } yading@10: } while (min_channel_len < s->samples_per_frame); yading@10: yading@10: for (c = 0; c < s->num_channels; c++) { yading@10: int i, offset = 0; yading@10: for (i = 0; i < s->channel[c].num_subframes; i++) { yading@10: s->channel[c].subframe_offsets[i] = offset; yading@10: offset += s->channel[c].subframe_len[i]; yading@10: } yading@10: } yading@10: yading@10: return 0; yading@10: } yading@10: yading@10: static void decode_ac_filter(WmallDecodeCtx *s) yading@10: { yading@10: int i; yading@10: s->acfilter_order = get_bits(&s->gb, 4) + 1; yading@10: s->acfilter_scaling = get_bits(&s->gb, 4); yading@10: yading@10: for (i = 0; i < s->acfilter_order; i++) yading@10: s->acfilter_coeffs[i] = (s->acfilter_scaling ? yading@10: get_bits(&s->gb, s->acfilter_scaling) : 0) + 1; yading@10: } yading@10: yading@10: static void decode_mclms(WmallDecodeCtx *s) yading@10: { yading@10: s->mclms_order = (get_bits(&s->gb, 4) + 1) * 2; yading@10: s->mclms_scaling = get_bits(&s->gb, 4); yading@10: if (get_bits1(&s->gb)) { yading@10: int i, send_coef_bits; yading@10: int cbits = av_log2(s->mclms_scaling + 1); yading@10: if (1 << cbits < s->mclms_scaling + 1) yading@10: cbits++; yading@10: yading@10: send_coef_bits = (cbits ? get_bits(&s->gb, cbits) : 0) + 2; yading@10: yading@10: for (i = 0; i < s->mclms_order * s->num_channels * s->num_channels; i++) yading@10: s->mclms_coeffs[i] = get_bits(&s->gb, send_coef_bits); yading@10: yading@10: for (i = 0; i < s->num_channels; i++) { yading@10: int c; yading@10: for (c = 0; c < i; c++) yading@10: s->mclms_coeffs_cur[i * s->num_channels + c] = get_bits(&s->gb, send_coef_bits); yading@10: } yading@10: } yading@10: } yading@10: yading@10: static int decode_cdlms(WmallDecodeCtx *s) yading@10: { yading@10: int c, i; yading@10: int cdlms_send_coef = get_bits1(&s->gb); yading@10: yading@10: for (c = 0; c < s->num_channels; c++) { yading@10: s->cdlms_ttl[c] = get_bits(&s->gb, 3) + 1; yading@10: for (i = 0; i < s->cdlms_ttl[c]; i++) { yading@10: s->cdlms[c][i].order = (get_bits(&s->gb, 7) + 1) * 8; yading@10: if (s->cdlms[c][i].order > MAX_ORDER) { yading@10: av_log(s->avctx, AV_LOG_ERROR, yading@10: "Order[%d][%d] %d > max (%d), not supported\n", yading@10: c, i, s->cdlms[c][i].order, MAX_ORDER); yading@10: s->cdlms[0][0].order = 0; yading@10: return AVERROR_INVALIDDATA; yading@10: } yading@10: } yading@10: yading@10: for (i = 0; i < s->cdlms_ttl[c]; i++) yading@10: s->cdlms[c][i].scaling = get_bits(&s->gb, 4); yading@10: yading@10: if (cdlms_send_coef) { yading@10: for (i = 0; i < s->cdlms_ttl[c]; i++) { yading@10: int cbits, shift_l, shift_r, j; yading@10: cbits = av_log2(s->cdlms[c][i].order); yading@10: if ((1 << cbits) < s->cdlms[c][i].order) yading@10: cbits++; yading@10: s->cdlms[c][i].coefsend = get_bits(&s->gb, cbits) + 1; yading@10: yading@10: cbits = av_log2(s->cdlms[c][i].scaling + 1); yading@10: if ((1 << cbits) < s->cdlms[c][i].scaling + 1) yading@10: cbits++; yading@10: yading@10: s->cdlms[c][i].bitsend = get_bits(&s->gb, cbits) + 2; yading@10: shift_l = 32 - s->cdlms[c][i].bitsend; yading@10: shift_r = 32 - s->cdlms[c][i].scaling - 2; yading@10: for (j = 0; j < s->cdlms[c][i].coefsend; j++) yading@10: s->cdlms[c][i].coefs[j] = yading@10: (get_bits(&s->gb, s->cdlms[c][i].bitsend) << shift_l) >> shift_r; yading@10: } yading@10: } yading@10: } yading@10: yading@10: return 0; yading@10: } yading@10: yading@10: static int decode_channel_residues(WmallDecodeCtx *s, int ch, int tile_size) yading@10: { yading@10: int i = 0; yading@10: unsigned int ave_mean; yading@10: s->transient[ch] = get_bits1(&s->gb); yading@10: if (s->transient[ch]) { yading@10: s->transient_pos[ch] = get_bits(&s->gb, av_log2(tile_size)); yading@10: if (s->transient_pos[ch]) yading@10: s->transient[ch] = 0; yading@10: s->channel[ch].transient_counter = yading@10: FFMAX(s->channel[ch].transient_counter, s->samples_per_frame / 2); yading@10: } else if (s->channel[ch].transient_counter) yading@10: s->transient[ch] = 1; yading@10: yading@10: if (s->seekable_tile) { yading@10: ave_mean = get_bits(&s->gb, s->bits_per_sample); yading@10: s->ave_sum[ch] = ave_mean << (s->movave_scaling + 1); yading@10: } yading@10: yading@10: if (s->seekable_tile) { yading@10: if (s->do_inter_ch_decorr) yading@10: s->channel_residues[ch][0] = get_sbits_long(&s->gb, s->bits_per_sample + 1); yading@10: else yading@10: s->channel_residues[ch][0] = get_sbits_long(&s->gb, s->bits_per_sample); yading@10: i++; yading@10: } yading@10: for (; i < tile_size; i++) { yading@10: int quo = 0, rem, rem_bits, residue; yading@10: while(get_bits1(&s->gb)) { yading@10: quo++; yading@10: if (get_bits_left(&s->gb) <= 0) yading@10: return -1; yading@10: } yading@10: if (quo >= 32) yading@10: quo += get_bits_long(&s->gb, get_bits(&s->gb, 5) + 1); yading@10: yading@10: ave_mean = (s->ave_sum[ch] + (1 << s->movave_scaling)) >> (s->movave_scaling + 1); yading@10: if (ave_mean <= 1) yading@10: residue = quo; yading@10: else { yading@10: rem_bits = av_ceil_log2(ave_mean); yading@10: rem = get_bits_long(&s->gb, rem_bits); yading@10: residue = (quo << rem_bits) + rem; yading@10: } yading@10: yading@10: s->ave_sum[ch] = residue + s->ave_sum[ch] - yading@10: (s->ave_sum[ch] >> s->movave_scaling); yading@10: yading@10: if (residue & 1) yading@10: residue = -(residue >> 1) - 1; yading@10: else yading@10: residue = residue >> 1; yading@10: s->channel_residues[ch][i] = residue; yading@10: } yading@10: yading@10: return 0; yading@10: yading@10: } yading@10: yading@10: static void decode_lpc(WmallDecodeCtx *s) yading@10: { yading@10: int ch, i, cbits; yading@10: s->lpc_order = get_bits(&s->gb, 5) + 1; yading@10: s->lpc_scaling = get_bits(&s->gb, 4); yading@10: s->lpc_intbits = get_bits(&s->gb, 3) + 1; yading@10: cbits = s->lpc_scaling + s->lpc_intbits; yading@10: for (ch = 0; ch < s->num_channels; ch++) yading@10: for (i = 0; i < s->lpc_order; i++) yading@10: s->lpc_coefs[ch][i] = get_sbits(&s->gb, cbits); yading@10: } yading@10: yading@10: static void clear_codec_buffers(WmallDecodeCtx *s) yading@10: { yading@10: int ich, ilms; yading@10: yading@10: memset(s->acfilter_coeffs, 0, sizeof(s->acfilter_coeffs)); yading@10: memset(s->acfilter_prevvalues, 0, sizeof(s->acfilter_prevvalues)); yading@10: memset(s->lpc_coefs, 0, sizeof(s->lpc_coefs)); yading@10: yading@10: memset(s->mclms_coeffs, 0, sizeof(s->mclms_coeffs)); yading@10: memset(s->mclms_coeffs_cur, 0, sizeof(s->mclms_coeffs_cur)); yading@10: memset(s->mclms_prevvalues, 0, sizeof(s->mclms_prevvalues)); yading@10: memset(s->mclms_updates, 0, sizeof(s->mclms_updates)); yading@10: yading@10: for (ich = 0; ich < s->num_channels; ich++) { yading@10: for (ilms = 0; ilms < s->cdlms_ttl[ich]; ilms++) { yading@10: memset(s->cdlms[ich][ilms].coefs, 0, yading@10: sizeof(s->cdlms[ich][ilms].coefs)); yading@10: memset(s->cdlms[ich][ilms].lms_prevvalues, 0, yading@10: sizeof(s->cdlms[ich][ilms].lms_prevvalues)); yading@10: memset(s->cdlms[ich][ilms].lms_updates, 0, yading@10: sizeof(s->cdlms[ich][ilms].lms_updates)); yading@10: } yading@10: s->ave_sum[ich] = 0; yading@10: } yading@10: } yading@10: yading@10: /** yading@10: * @brief Reset filter parameters and transient area at new seekable tile. yading@10: */ yading@10: static void reset_codec(WmallDecodeCtx *s) yading@10: { yading@10: int ich, ilms; yading@10: s->mclms_recent = s->mclms_order * s->num_channels; yading@10: for (ich = 0; ich < s->num_channels; ich++) { yading@10: for (ilms = 0; ilms < s->cdlms_ttl[ich]; ilms++) yading@10: s->cdlms[ich][ilms].recent = s->cdlms[ich][ilms].order; yading@10: /* first sample of a seekable subframe is considered as the starting of yading@10: a transient area which is samples_per_frame samples long */ yading@10: s->channel[ich].transient_counter = s->samples_per_frame; yading@10: s->transient[ich] = 1; yading@10: s->transient_pos[ich] = 0; yading@10: } yading@10: } yading@10: yading@10: static void mclms_update(WmallDecodeCtx *s, int icoef, int *pred) yading@10: { yading@10: int i, j, ich, pred_error; yading@10: int order = s->mclms_order; yading@10: int num_channels = s->num_channels; yading@10: int range = 1 << (s->bits_per_sample - 1); yading@10: yading@10: for (ich = 0; ich < num_channels; ich++) { yading@10: pred_error = s->channel_residues[ich][icoef] - pred[ich]; yading@10: if (pred_error > 0) { yading@10: for (i = 0; i < order * num_channels; i++) yading@10: s->mclms_coeffs[i + ich * order * num_channels] += yading@10: s->mclms_updates[s->mclms_recent + i]; yading@10: for (j = 0; j < ich; j++) { yading@10: if (s->channel_residues[j][icoef] > 0) yading@10: s->mclms_coeffs_cur[ich * num_channels + j] += 1; yading@10: else if (s->channel_residues[j][icoef] < 0) yading@10: s->mclms_coeffs_cur[ich * num_channels + j] -= 1; yading@10: } yading@10: } else if (pred_error < 0) { yading@10: for (i = 0; i < order * num_channels; i++) yading@10: s->mclms_coeffs[i + ich * order * num_channels] -= yading@10: s->mclms_updates[s->mclms_recent + i]; yading@10: for (j = 0; j < ich; j++) { yading@10: if (s->channel_residues[j][icoef] > 0) yading@10: s->mclms_coeffs_cur[ich * num_channels + j] -= 1; yading@10: else if (s->channel_residues[j][icoef] < 0) yading@10: s->mclms_coeffs_cur[ich * num_channels + j] += 1; yading@10: } yading@10: } yading@10: } yading@10: yading@10: for (ich = num_channels - 1; ich >= 0; ich--) { yading@10: s->mclms_recent--; yading@10: s->mclms_prevvalues[s->mclms_recent] = s->channel_residues[ich][icoef]; yading@10: if (s->channel_residues[ich][icoef] > range - 1) yading@10: s->mclms_prevvalues[s->mclms_recent] = range - 1; yading@10: else if (s->channel_residues[ich][icoef] < -range) yading@10: s->mclms_prevvalues[s->mclms_recent] = -range; yading@10: yading@10: s->mclms_updates[s->mclms_recent] = 0; yading@10: if (s->channel_residues[ich][icoef] > 0) yading@10: s->mclms_updates[s->mclms_recent] = 1; yading@10: else if (s->channel_residues[ich][icoef] < 0) yading@10: s->mclms_updates[s->mclms_recent] = -1; yading@10: } yading@10: yading@10: if (s->mclms_recent == 0) { yading@10: memcpy(&s->mclms_prevvalues[order * num_channels], yading@10: s->mclms_prevvalues, yading@10: 2 * order * num_channels); yading@10: memcpy(&s->mclms_updates[order * num_channels], yading@10: s->mclms_updates, yading@10: 2 * order * num_channels); yading@10: s->mclms_recent = num_channels * order; yading@10: } yading@10: } yading@10: yading@10: static void mclms_predict(WmallDecodeCtx *s, int icoef, int *pred) yading@10: { yading@10: int ich, i; yading@10: int order = s->mclms_order; yading@10: int num_channels = s->num_channels; yading@10: yading@10: for (ich = 0; ich < num_channels; ich++) { yading@10: pred[ich] = 0; yading@10: if (!s->is_channel_coded[ich]) yading@10: continue; yading@10: for (i = 0; i < order * num_channels; i++) yading@10: pred[ich] += s->mclms_prevvalues[i + s->mclms_recent] * yading@10: s->mclms_coeffs[i + order * num_channels * ich]; yading@10: for (i = 0; i < ich; i++) yading@10: pred[ich] += s->channel_residues[i][icoef] * yading@10: s->mclms_coeffs_cur[i + num_channels * ich]; yading@10: pred[ich] += 1 << s->mclms_scaling - 1; yading@10: pred[ich] >>= s->mclms_scaling; yading@10: s->channel_residues[ich][icoef] += pred[ich]; yading@10: } yading@10: } yading@10: yading@10: static void revert_mclms(WmallDecodeCtx *s, int tile_size) yading@10: { yading@10: int icoef, pred[WMALL_MAX_CHANNELS] = { 0 }; yading@10: for (icoef = 0; icoef < tile_size; icoef++) { yading@10: mclms_predict(s, icoef, pred); yading@10: mclms_update(s, icoef, pred); yading@10: } yading@10: } yading@10: yading@10: static int lms_predict(WmallDecodeCtx *s, int ich, int ilms) yading@10: { yading@10: int pred = 0, icoef; yading@10: int recent = s->cdlms[ich][ilms].recent; yading@10: yading@10: for (icoef = 0; icoef < s->cdlms[ich][ilms].order; icoef++) yading@10: pred += s->cdlms[ich][ilms].coefs[icoef] * yading@10: s->cdlms[ich][ilms].lms_prevvalues[icoef + recent]; yading@10: yading@10: return pred; yading@10: } yading@10: yading@10: static void lms_update(WmallDecodeCtx *s, int ich, int ilms, yading@10: int input, int residue) yading@10: { yading@10: int icoef; yading@10: int recent = s->cdlms[ich][ilms].recent; yading@10: int range = 1 << s->bits_per_sample - 1; yading@10: yading@10: if (residue < 0) { yading@10: for (icoef = 0; icoef < s->cdlms[ich][ilms].order; icoef++) yading@10: s->cdlms[ich][ilms].coefs[icoef] -= yading@10: s->cdlms[ich][ilms].lms_updates[icoef + recent]; yading@10: } else if (residue > 0) { yading@10: for (icoef = 0; icoef < s->cdlms[ich][ilms].order; icoef++) yading@10: s->cdlms[ich][ilms].coefs[icoef] += yading@10: s->cdlms[ich][ilms].lms_updates[icoef + recent]; yading@10: } yading@10: yading@10: if (recent) yading@10: recent--; yading@10: else { yading@10: memcpy(&s->cdlms[ich][ilms].lms_prevvalues[s->cdlms[ich][ilms].order], yading@10: s->cdlms[ich][ilms].lms_prevvalues, yading@10: 2 * s->cdlms[ich][ilms].order); yading@10: memcpy(&s->cdlms[ich][ilms].lms_updates[s->cdlms[ich][ilms].order], yading@10: s->cdlms[ich][ilms].lms_updates, yading@10: 2 * s->cdlms[ich][ilms].order); yading@10: recent = s->cdlms[ich][ilms].order - 1; yading@10: } yading@10: yading@10: s->cdlms[ich][ilms].lms_prevvalues[recent] = av_clip(input, -range, range - 1); yading@10: if (!input) yading@10: s->cdlms[ich][ilms].lms_updates[recent] = 0; yading@10: else if (input < 0) yading@10: s->cdlms[ich][ilms].lms_updates[recent] = -s->update_speed[ich]; yading@10: else yading@10: s->cdlms[ich][ilms].lms_updates[recent] = s->update_speed[ich]; yading@10: yading@10: s->cdlms[ich][ilms].lms_updates[recent + (s->cdlms[ich][ilms].order >> 4)] >>= 2; yading@10: s->cdlms[ich][ilms].lms_updates[recent + (s->cdlms[ich][ilms].order >> 3)] >>= 1; yading@10: s->cdlms[ich][ilms].recent = recent; yading@10: } yading@10: yading@10: static void use_high_update_speed(WmallDecodeCtx *s, int ich) yading@10: { yading@10: int ilms, recent, icoef; yading@10: for (ilms = s->cdlms_ttl[ich] - 1; ilms >= 0; ilms--) { yading@10: recent = s->cdlms[ich][ilms].recent; yading@10: if (s->update_speed[ich] == 16) yading@10: continue; yading@10: if (s->bV3RTM) { yading@10: for (icoef = 0; icoef < s->cdlms[ich][ilms].order; icoef++) yading@10: s->cdlms[ich][ilms].lms_updates[icoef + recent] *= 2; yading@10: } else { yading@10: for (icoef = 0; icoef < s->cdlms[ich][ilms].order; icoef++) yading@10: s->cdlms[ich][ilms].lms_updates[icoef] *= 2; yading@10: } yading@10: } yading@10: s->update_speed[ich] = 16; yading@10: } yading@10: yading@10: static void use_normal_update_speed(WmallDecodeCtx *s, int ich) yading@10: { yading@10: int ilms, recent, icoef; yading@10: for (ilms = s->cdlms_ttl[ich] - 1; ilms >= 0; ilms--) { yading@10: recent = s->cdlms[ich][ilms].recent; yading@10: if (s->update_speed[ich] == 8) yading@10: continue; yading@10: if (s->bV3RTM) yading@10: for (icoef = 0; icoef < s->cdlms[ich][ilms].order; icoef++) yading@10: s->cdlms[ich][ilms].lms_updates[icoef + recent] /= 2; yading@10: else yading@10: for (icoef = 0; icoef < s->cdlms[ich][ilms].order; icoef++) yading@10: s->cdlms[ich][ilms].lms_updates[icoef] /= 2; yading@10: } yading@10: s->update_speed[ich] = 8; yading@10: } yading@10: yading@10: static void revert_cdlms(WmallDecodeCtx *s, int ch, yading@10: int coef_begin, int coef_end) yading@10: { yading@10: int icoef, pred, ilms, num_lms, residue, input; yading@10: yading@10: num_lms = s->cdlms_ttl[ch]; yading@10: for (ilms = num_lms - 1; ilms >= 0; ilms--) { yading@10: for (icoef = coef_begin; icoef < coef_end; icoef++) { yading@10: pred = 1 << (s->cdlms[ch][ilms].scaling - 1); yading@10: residue = s->channel_residues[ch][icoef]; yading@10: pred += lms_predict(s, ch, ilms); yading@10: input = residue + (pred >> s->cdlms[ch][ilms].scaling); yading@10: lms_update(s, ch, ilms, input, residue); yading@10: s->channel_residues[ch][icoef] = input; yading@10: } yading@10: } yading@10: } yading@10: yading@10: static void revert_inter_ch_decorr(WmallDecodeCtx *s, int tile_size) yading@10: { yading@10: if (s->num_channels != 2) yading@10: return; yading@10: else if (s->is_channel_coded[0] || s->is_channel_coded[1]) { yading@10: int icoef; yading@10: for (icoef = 0; icoef < tile_size; icoef++) { yading@10: s->channel_residues[0][icoef] -= s->channel_residues[1][icoef] >> 1; yading@10: s->channel_residues[1][icoef] += s->channel_residues[0][icoef]; yading@10: } yading@10: } yading@10: } yading@10: yading@10: static void revert_acfilter(WmallDecodeCtx *s, int tile_size) yading@10: { yading@10: int ich, pred, i, j; yading@10: int64_t *filter_coeffs = s->acfilter_coeffs; yading@10: int scaling = s->acfilter_scaling; yading@10: int order = s->acfilter_order; yading@10: yading@10: for (ich = 0; ich < s->num_channels; ich++) { yading@10: int *prevvalues = s->acfilter_prevvalues[ich]; yading@10: for (i = 0; i < order; i++) { yading@10: pred = 0; yading@10: for (j = 0; j < order; j++) { yading@10: if (i <= j) yading@10: pred += filter_coeffs[j] * prevvalues[j - i]; yading@10: else yading@10: pred += s->channel_residues[ich][i - j - 1] * filter_coeffs[j]; yading@10: } yading@10: pred >>= scaling; yading@10: s->channel_residues[ich][i] += pred; yading@10: } yading@10: for (i = order; i < tile_size; i++) { yading@10: pred = 0; yading@10: for (j = 0; j < order; j++) yading@10: pred += s->channel_residues[ich][i - j - 1] * filter_coeffs[j]; yading@10: pred >>= scaling; yading@10: s->channel_residues[ich][i] += pred; yading@10: } yading@10: for (j = 0; j < order; j++) yading@10: prevvalues[j] = s->channel_residues[ich][tile_size - j - 1]; yading@10: } yading@10: } yading@10: yading@10: static int decode_subframe(WmallDecodeCtx *s) yading@10: { yading@10: int offset = s->samples_per_frame; yading@10: int subframe_len = s->samples_per_frame; yading@10: int total_samples = s->samples_per_frame * s->num_channels; yading@10: int i, j, rawpcm_tile, padding_zeroes, res; yading@10: yading@10: s->subframe_offset = get_bits_count(&s->gb); yading@10: yading@10: /* reset channel context and find the next block offset and size yading@10: == the next block of the channel with the smallest number of yading@10: decoded samples */ yading@10: for (i = 0; i < s->num_channels; i++) { yading@10: if (offset > s->channel[i].decoded_samples) { yading@10: offset = s->channel[i].decoded_samples; yading@10: subframe_len = yading@10: s->channel[i].subframe_len[s->channel[i].cur_subframe]; yading@10: } yading@10: } yading@10: yading@10: /* get a list of all channels that contain the estimated block */ yading@10: s->channels_for_cur_subframe = 0; yading@10: for (i = 0; i < s->num_channels; i++) { yading@10: const int cur_subframe = s->channel[i].cur_subframe; yading@10: /* subtract already processed samples */ yading@10: total_samples -= s->channel[i].decoded_samples; yading@10: yading@10: /* and count if there are multiple subframes that match our profile */ yading@10: if (offset == s->channel[i].decoded_samples && yading@10: subframe_len == s->channel[i].subframe_len[cur_subframe]) { yading@10: total_samples -= s->channel[i].subframe_len[cur_subframe]; yading@10: s->channel[i].decoded_samples += yading@10: s->channel[i].subframe_len[cur_subframe]; yading@10: s->channel_indexes_for_cur_subframe[s->channels_for_cur_subframe] = i; yading@10: ++s->channels_for_cur_subframe; yading@10: } yading@10: } yading@10: yading@10: /* check if the frame will be complete after processing the yading@10: estimated block */ yading@10: if (!total_samples) yading@10: s->parsed_all_subframes = 1; yading@10: yading@10: yading@10: s->seekable_tile = get_bits1(&s->gb); yading@10: if (s->seekable_tile) { yading@10: clear_codec_buffers(s); yading@10: yading@10: s->do_arith_coding = get_bits1(&s->gb); yading@10: if (s->do_arith_coding) { yading@10: avpriv_request_sample(s->avctx, "Arithmetic coding"); yading@10: return AVERROR_PATCHWELCOME; yading@10: } yading@10: s->do_ac_filter = get_bits1(&s->gb); yading@10: s->do_inter_ch_decorr = get_bits1(&s->gb); yading@10: s->do_mclms = get_bits1(&s->gb); yading@10: yading@10: if (s->do_ac_filter) yading@10: decode_ac_filter(s); yading@10: yading@10: if (s->do_mclms) yading@10: decode_mclms(s); yading@10: yading@10: if ((res = decode_cdlms(s)) < 0) yading@10: return res; yading@10: s->movave_scaling = get_bits(&s->gb, 3); yading@10: s->quant_stepsize = get_bits(&s->gb, 8) + 1; yading@10: yading@10: reset_codec(s); yading@10: } else if (!s->cdlms[0][0].order) { yading@10: av_log(s->avctx, AV_LOG_DEBUG, yading@10: "Waiting for seekable tile\n"); yading@10: s->frame.nb_samples = 0; yading@10: return -1; yading@10: } yading@10: yading@10: rawpcm_tile = get_bits1(&s->gb); yading@10: yading@10: for (i = 0; i < s->num_channels; i++) yading@10: s->is_channel_coded[i] = 1; yading@10: yading@10: if (!rawpcm_tile) { yading@10: for (i = 0; i < s->num_channels; i++) yading@10: s->is_channel_coded[i] = get_bits1(&s->gb); yading@10: yading@10: if (s->bV3RTM) { yading@10: // LPC yading@10: s->do_lpc = get_bits1(&s->gb); yading@10: if (s->do_lpc) { yading@10: decode_lpc(s); yading@10: avpriv_request_sample(s->avctx, "Expect wrong output since " yading@10: "inverse LPC filter"); yading@10: } yading@10: } else yading@10: s->do_lpc = 0; yading@10: } yading@10: yading@10: yading@10: if (get_bits1(&s->gb)) yading@10: padding_zeroes = get_bits(&s->gb, 5); yading@10: else yading@10: padding_zeroes = 0; yading@10: yading@10: if (rawpcm_tile) { yading@10: int bits = s->bits_per_sample - padding_zeroes; yading@10: if (bits <= 0) { yading@10: av_log(s->avctx, AV_LOG_ERROR, yading@10: "Invalid number of padding bits in raw PCM tile\n"); yading@10: return AVERROR_INVALIDDATA; yading@10: } yading@10: av_dlog(s->avctx, "RAWPCM %d bits per sample. " yading@10: "total %d bits, remain=%d\n", bits, yading@10: bits * s->num_channels * subframe_len, get_bits_count(&s->gb)); yading@10: for (i = 0; i < s->num_channels; i++) yading@10: for (j = 0; j < subframe_len; j++) yading@10: s->channel_coeffs[i][j] = get_sbits_long(&s->gb, bits); yading@10: } else { yading@10: for (i = 0; i < s->num_channels; i++) yading@10: if (s->is_channel_coded[i]) { yading@10: decode_channel_residues(s, i, subframe_len); yading@10: if (s->seekable_tile) yading@10: use_high_update_speed(s, i); yading@10: else yading@10: use_normal_update_speed(s, i); yading@10: revert_cdlms(s, i, 0, subframe_len); yading@10: } else { yading@10: memset(s->channel_residues[i], 0, sizeof(**s->channel_residues) * subframe_len); yading@10: } yading@10: } yading@10: if (s->do_mclms) yading@10: revert_mclms(s, subframe_len); yading@10: if (s->do_inter_ch_decorr) yading@10: revert_inter_ch_decorr(s, subframe_len); yading@10: if (s->do_ac_filter) yading@10: revert_acfilter(s, subframe_len); yading@10: yading@10: /* Dequantize */ yading@10: if (s->quant_stepsize != 1) yading@10: for (i = 0; i < s->num_channels; i++) yading@10: for (j = 0; j < subframe_len; j++) yading@10: s->channel_residues[i][j] *= s->quant_stepsize; yading@10: yading@10: /* Write to proper output buffer depending on bit-depth */ yading@10: for (i = 0; i < s->channels_for_cur_subframe; i++) { yading@10: int c = s->channel_indexes_for_cur_subframe[i]; yading@10: int subframe_len = s->channel[c].subframe_len[s->channel[c].cur_subframe]; yading@10: yading@10: for (j = 0; j < subframe_len; j++) { yading@10: if (s->bits_per_sample == 16) { yading@10: *s->samples_16[c]++ = (int16_t) s->channel_residues[c][j] << padding_zeroes; yading@10: } else { yading@10: *s->samples_32[c]++ = s->channel_residues[c][j] << padding_zeroes; yading@10: } yading@10: } yading@10: } yading@10: yading@10: /* handled one subframe */ yading@10: for (i = 0; i < s->channels_for_cur_subframe; i++) { yading@10: int c = s->channel_indexes_for_cur_subframe[i]; yading@10: if (s->channel[c].cur_subframe >= s->channel[c].num_subframes) { yading@10: av_log(s->avctx, AV_LOG_ERROR, "broken subframe\n"); yading@10: return AVERROR_INVALIDDATA; yading@10: } yading@10: ++s->channel[c].cur_subframe; yading@10: } yading@10: return 0; yading@10: } yading@10: yading@10: /** yading@10: * @brief Decode one WMA frame. yading@10: * @param s codec context yading@10: * @return 0 if the trailer bit indicates that this is the last frame, yading@10: * 1 if there are additional frames yading@10: */ yading@10: static int decode_frame(WmallDecodeCtx *s) yading@10: { yading@10: GetBitContext* gb = &s->gb; yading@10: int more_frames = 0, len = 0, i, ret; yading@10: yading@10: s->frame.nb_samples = s->samples_per_frame; yading@10: if ((ret = ff_get_buffer(s->avctx, &s->frame, 0)) < 0) { yading@10: /* return an error if no frame could be decoded at all */ yading@10: s->packet_loss = 1; yading@10: return ret; yading@10: } yading@10: for (i = 0; i < s->num_channels; i++) { yading@10: s->samples_16[i] = (int16_t *)s->frame.extended_data[i]; yading@10: s->samples_32[i] = (int32_t *)s->frame.extended_data[i]; yading@10: } yading@10: yading@10: /* get frame length */ yading@10: if (s->len_prefix) yading@10: len = get_bits(gb, s->log2_frame_size); yading@10: yading@10: /* decode tile information */ yading@10: if (decode_tilehdr(s)) { yading@10: s->packet_loss = 1; yading@10: return 0; yading@10: } yading@10: yading@10: /* read drc info */ yading@10: if (s->dynamic_range_compression) yading@10: s->drc_gain = get_bits(gb, 8); yading@10: yading@10: /* no idea what these are for, might be the number of samples yading@10: that need to be skipped at the beginning or end of a stream */ yading@10: if (get_bits1(gb)) { yading@10: int av_unused skip; yading@10: yading@10: /* usually true for the first frame */ yading@10: if (get_bits1(gb)) { yading@10: skip = get_bits(gb, av_log2(s->samples_per_frame * 2)); yading@10: av_dlog(s->avctx, "start skip: %i\n", skip); yading@10: } yading@10: yading@10: /* sometimes true for the last frame */ yading@10: if (get_bits1(gb)) { yading@10: skip = get_bits(gb, av_log2(s->samples_per_frame * 2)); yading@10: av_dlog(s->avctx, "end skip: %i\n", skip); yading@10: } yading@10: yading@10: } yading@10: yading@10: /* reset subframe states */ yading@10: s->parsed_all_subframes = 0; yading@10: for (i = 0; i < s->num_channels; i++) { yading@10: s->channel[i].decoded_samples = 0; yading@10: s->channel[i].cur_subframe = 0; yading@10: } yading@10: yading@10: /* decode all subframes */ yading@10: while (!s->parsed_all_subframes) { yading@10: if (decode_subframe(s) < 0) { yading@10: s->packet_loss = 1; yading@10: return 0; yading@10: } yading@10: } yading@10: yading@10: av_dlog(s->avctx, "Frame done\n"); yading@10: yading@10: if (s->skip_frame) yading@10: s->skip_frame = 0; yading@10: yading@10: if (s->len_prefix) { yading@10: if (len != (get_bits_count(gb) - s->frame_offset) + 2) { yading@10: /* FIXME: not sure if this is always an error */ yading@10: av_log(s->avctx, AV_LOG_ERROR, yading@10: "frame[%i] would have to skip %i bits\n", s->frame_num, yading@10: len - (get_bits_count(gb) - s->frame_offset) - 1); yading@10: s->packet_loss = 1; yading@10: return 0; yading@10: } yading@10: yading@10: /* skip the rest of the frame data */ yading@10: skip_bits_long(gb, len - (get_bits_count(gb) - s->frame_offset) - 1); yading@10: } yading@10: yading@10: /* decode trailer bit */ yading@10: more_frames = get_bits1(gb); yading@10: ++s->frame_num; yading@10: return more_frames; yading@10: } yading@10: yading@10: /** yading@10: * @brief Calculate remaining input buffer length. yading@10: * @param s codec context yading@10: * @param gb bitstream reader context yading@10: * @return remaining size in bits yading@10: */ yading@10: static int remaining_bits(WmallDecodeCtx *s, GetBitContext *gb) yading@10: { yading@10: return s->buf_bit_size - get_bits_count(gb); yading@10: } yading@10: yading@10: /** yading@10: * @brief Fill the bit reservoir with a (partial) frame. yading@10: * @param s codec context yading@10: * @param gb bitstream reader context yading@10: * @param len length of the partial frame yading@10: * @param append decides whether to reset the buffer or not yading@10: */ yading@10: static void save_bits(WmallDecodeCtx *s, GetBitContext* gb, int len, yading@10: int append) yading@10: { yading@10: int buflen; yading@10: PutBitContext tmp; yading@10: yading@10: /* when the frame data does not need to be concatenated, the input buffer yading@10: is reset and additional bits from the previous frame are copied yading@10: and skipped later so that a fast byte copy is possible */ yading@10: yading@10: if (!append) { yading@10: s->frame_offset = get_bits_count(gb) & 7; yading@10: s->num_saved_bits = s->frame_offset; yading@10: init_put_bits(&s->pb, s->frame_data, MAX_FRAMESIZE); yading@10: } yading@10: yading@10: buflen = (s->num_saved_bits + len + 8) >> 3; yading@10: yading@10: if (len <= 0 || buflen > MAX_FRAMESIZE) { yading@10: avpriv_request_sample(s->avctx, "Too small input buffer"); yading@10: s->packet_loss = 1; yading@10: return; yading@10: } yading@10: yading@10: s->num_saved_bits += len; yading@10: if (!append) { yading@10: avpriv_copy_bits(&s->pb, gb->buffer + (get_bits_count(gb) >> 3), yading@10: s->num_saved_bits); yading@10: } else { yading@10: int align = 8 - (get_bits_count(gb) & 7); yading@10: align = FFMIN(align, len); yading@10: put_bits(&s->pb, align, get_bits(gb, align)); yading@10: len -= align; yading@10: avpriv_copy_bits(&s->pb, gb->buffer + (get_bits_count(gb) >> 3), len); yading@10: } yading@10: skip_bits_long(gb, len); yading@10: yading@10: tmp = s->pb; yading@10: flush_put_bits(&tmp); yading@10: yading@10: init_get_bits(&s->gb, s->frame_data, s->num_saved_bits); yading@10: skip_bits(&s->gb, s->frame_offset); yading@10: } yading@10: yading@10: static int decode_packet(AVCodecContext *avctx, void *data, int *got_frame_ptr, yading@10: AVPacket* avpkt) yading@10: { yading@10: WmallDecodeCtx *s = avctx->priv_data; yading@10: GetBitContext* gb = &s->pgb; yading@10: const uint8_t* buf = avpkt->data; yading@10: int buf_size = avpkt->size; yading@10: int num_bits_prev_frame, packet_sequence_number, spliced_packet; yading@10: yading@10: s->frame.nb_samples = 0; yading@10: yading@10: if (s->packet_done || s->packet_loss) { yading@10: s->packet_done = 0; yading@10: yading@10: /* sanity check for the buffer length */ yading@10: if (buf_size < avctx->block_align) yading@10: return 0; yading@10: yading@10: s->next_packet_start = buf_size - avctx->block_align; yading@10: buf_size = avctx->block_align; yading@10: s->buf_bit_size = buf_size << 3; yading@10: yading@10: /* parse packet header */ yading@10: init_get_bits(gb, buf, s->buf_bit_size); yading@10: packet_sequence_number = get_bits(gb, 4); yading@10: skip_bits(gb, 1); // Skip seekable_frame_in_packet, currently ununused yading@10: spliced_packet = get_bits1(gb); yading@10: if (spliced_packet) yading@10: avpriv_request_sample(avctx, "Bitstream splicing"); yading@10: yading@10: /* get number of bits that need to be added to the previous frame */ yading@10: num_bits_prev_frame = get_bits(gb, s->log2_frame_size); yading@10: yading@10: /* check for packet loss */ yading@10: if (!s->packet_loss && yading@10: ((s->packet_sequence_number + 1) & 0xF) != packet_sequence_number) { yading@10: s->packet_loss = 1; yading@10: av_log(avctx, AV_LOG_ERROR, "Packet loss detected! seq %x vs %x\n", yading@10: s->packet_sequence_number, packet_sequence_number); yading@10: } yading@10: s->packet_sequence_number = packet_sequence_number; yading@10: yading@10: if (num_bits_prev_frame > 0) { yading@10: int remaining_packet_bits = s->buf_bit_size - get_bits_count(gb); yading@10: if (num_bits_prev_frame >= remaining_packet_bits) { yading@10: num_bits_prev_frame = remaining_packet_bits; yading@10: s->packet_done = 1; yading@10: } yading@10: yading@10: /* Append the previous frame data to the remaining data from the yading@10: * previous packet to create a full frame. */ yading@10: save_bits(s, gb, num_bits_prev_frame, 1); yading@10: yading@10: /* decode the cross packet frame if it is valid */ yading@10: if (num_bits_prev_frame < remaining_packet_bits && !s->packet_loss) yading@10: decode_frame(s); yading@10: } else if (s->num_saved_bits - s->frame_offset) { yading@10: av_dlog(avctx, "ignoring %x previously saved bits\n", yading@10: s->num_saved_bits - s->frame_offset); yading@10: } yading@10: yading@10: if (s->packet_loss) { yading@10: /* Reset number of saved bits so that the decoder does not start yading@10: * to decode incomplete frames in the s->len_prefix == 0 case. */ yading@10: s->num_saved_bits = 0; yading@10: s->packet_loss = 0; yading@10: init_put_bits(&s->pb, s->frame_data, MAX_FRAMESIZE); yading@10: } yading@10: yading@10: } else { yading@10: int frame_size; yading@10: yading@10: s->buf_bit_size = (avpkt->size - s->next_packet_start) << 3; yading@10: init_get_bits(gb, avpkt->data, s->buf_bit_size); yading@10: skip_bits(gb, s->packet_offset); yading@10: yading@10: if (s->len_prefix && remaining_bits(s, gb) > s->log2_frame_size && yading@10: (frame_size = show_bits(gb, s->log2_frame_size)) && yading@10: frame_size <= remaining_bits(s, gb)) { yading@10: save_bits(s, gb, frame_size, 0); yading@10: s->packet_done = !decode_frame(s); yading@10: } else if (!s->len_prefix yading@10: && s->num_saved_bits > get_bits_count(&s->gb)) { yading@10: /* when the frames do not have a length prefix, we don't know the yading@10: * compressed length of the individual frames however, we know what yading@10: * part of a new packet belongs to the previous frame therefore we yading@10: * save the incoming packet first, then we append the "previous yading@10: * frame" data from the next packet so that we get a buffer that yading@10: * only contains full frames */ yading@10: s->packet_done = !decode_frame(s); yading@10: } else { yading@10: s->packet_done = 1; yading@10: } yading@10: } yading@10: yading@10: if (s->packet_done && !s->packet_loss && yading@10: remaining_bits(s, gb) > 0) { yading@10: /* save the rest of the data so that it can be decoded yading@10: * with the next packet */ yading@10: save_bits(s, gb, remaining_bits(s, gb), 0); yading@10: } yading@10: yading@10: *got_frame_ptr = s->frame.nb_samples > 0; yading@10: av_frame_move_ref(data, &s->frame); yading@10: yading@10: s->packet_offset = get_bits_count(gb) & 7; yading@10: yading@10: return (s->packet_loss) ? AVERROR_INVALIDDATA : get_bits_count(gb) >> 3; yading@10: } yading@10: yading@10: static void flush(AVCodecContext *avctx) yading@10: { yading@10: WmallDecodeCtx *s = avctx->priv_data; yading@10: s->packet_loss = 1; yading@10: s->packet_done = 0; yading@10: s->num_saved_bits = 0; yading@10: s->frame_offset = 0; yading@10: s->next_packet_start = 0; yading@10: s->cdlms[0][0].order = 0; yading@10: s->frame.nb_samples = 0; yading@10: init_put_bits(&s->pb, s->frame_data, MAX_FRAMESIZE); yading@10: } yading@10: yading@10: AVCodec ff_wmalossless_decoder = { yading@10: .name = "wmalossless", yading@10: .type = AVMEDIA_TYPE_AUDIO, yading@10: .id = AV_CODEC_ID_WMALOSSLESS, yading@10: .priv_data_size = sizeof(WmallDecodeCtx), yading@10: .init = decode_init, yading@10: .decode = decode_packet, yading@10: .flush = flush, yading@10: .capabilities = CODEC_CAP_SUBFRAMES | CODEC_CAP_DR1 | CODEC_CAP_DELAY, yading@10: .long_name = NULL_IF_CONFIG_SMALL("Windows Media Audio Lossless"), yading@10: .sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_S16P, yading@10: AV_SAMPLE_FMT_S32P, yading@10: AV_SAMPLE_FMT_NONE }, yading@10: };