1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * Direct Stream Transfer (DST) decoder 3cabdff1aSopenharmony_ci * Copyright (c) 2014 Peter Ross <pross@xvid.org> 4cabdff1aSopenharmony_ci * 5cabdff1aSopenharmony_ci * This file is part of FFmpeg. 6cabdff1aSopenharmony_ci * 7cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 8cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 9cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 10cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 11cabdff1aSopenharmony_ci * 12cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 13cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 14cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15cabdff1aSopenharmony_ci * Lesser General Public License for more details. 16cabdff1aSopenharmony_ci * 17cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 18cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 19cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 20cabdff1aSopenharmony_ci */ 21cabdff1aSopenharmony_ci 22cabdff1aSopenharmony_ci/** 23cabdff1aSopenharmony_ci * @file 24cabdff1aSopenharmony_ci * Direct Stream Transfer (DST) decoder 25cabdff1aSopenharmony_ci * ISO/IEC 14496-3 Part 3 Subpart 10: Technical description of lossless coding of oversampled audio 26cabdff1aSopenharmony_ci */ 27cabdff1aSopenharmony_ci 28cabdff1aSopenharmony_ci#include "libavutil/intreadwrite.h" 29cabdff1aSopenharmony_ci#include "libavutil/mem_internal.h" 30cabdff1aSopenharmony_ci#include "libavutil/reverse.h" 31cabdff1aSopenharmony_ci#include "codec_internal.h" 32cabdff1aSopenharmony_ci#include "internal.h" 33cabdff1aSopenharmony_ci#include "get_bits.h" 34cabdff1aSopenharmony_ci#include "avcodec.h" 35cabdff1aSopenharmony_ci#include "golomb.h" 36cabdff1aSopenharmony_ci#include "mathops.h" 37cabdff1aSopenharmony_ci#include "dsd.h" 38cabdff1aSopenharmony_ci 39cabdff1aSopenharmony_ci#define DST_MAX_CHANNELS 6 40cabdff1aSopenharmony_ci#define DST_MAX_ELEMENTS (2 * DST_MAX_CHANNELS) 41cabdff1aSopenharmony_ci 42cabdff1aSopenharmony_ci#define DSD_FS44(sample_rate) (sample_rate * 8LL / 44100) 43cabdff1aSopenharmony_ci 44cabdff1aSopenharmony_ci#define DST_SAMPLES_PER_FRAME(sample_rate) (588 * DSD_FS44(sample_rate)) 45cabdff1aSopenharmony_ci 46cabdff1aSopenharmony_cistatic const int8_t fsets_code_pred_coeff[3][3] = { 47cabdff1aSopenharmony_ci { -8 }, 48cabdff1aSopenharmony_ci { -16, 8 }, 49cabdff1aSopenharmony_ci { -9, -5, 6 }, 50cabdff1aSopenharmony_ci}; 51cabdff1aSopenharmony_ci 52cabdff1aSopenharmony_cistatic const int8_t probs_code_pred_coeff[3][3] = { 53cabdff1aSopenharmony_ci { -8 }, 54cabdff1aSopenharmony_ci { -16, 8 }, 55cabdff1aSopenharmony_ci { -24, 24, -8 }, 56cabdff1aSopenharmony_ci}; 57cabdff1aSopenharmony_ci 58cabdff1aSopenharmony_citypedef struct ArithCoder { 59cabdff1aSopenharmony_ci unsigned int a; 60cabdff1aSopenharmony_ci unsigned int c; 61cabdff1aSopenharmony_ci} ArithCoder; 62cabdff1aSopenharmony_ci 63cabdff1aSopenharmony_citypedef struct Table { 64cabdff1aSopenharmony_ci unsigned int elements; 65cabdff1aSopenharmony_ci unsigned int length[DST_MAX_ELEMENTS]; 66cabdff1aSopenharmony_ci int coeff[DST_MAX_ELEMENTS][128]; 67cabdff1aSopenharmony_ci} Table; 68cabdff1aSopenharmony_ci 69cabdff1aSopenharmony_citypedef struct DSTContext { 70cabdff1aSopenharmony_ci AVClass *class; 71cabdff1aSopenharmony_ci 72cabdff1aSopenharmony_ci GetBitContext gb; 73cabdff1aSopenharmony_ci ArithCoder ac; 74cabdff1aSopenharmony_ci Table fsets, probs; 75cabdff1aSopenharmony_ci DECLARE_ALIGNED(16, uint8_t, status)[DST_MAX_CHANNELS][16]; 76cabdff1aSopenharmony_ci DECLARE_ALIGNED(16, int16_t, filter)[DST_MAX_ELEMENTS][16][256]; 77cabdff1aSopenharmony_ci DSDContext dsdctx[DST_MAX_CHANNELS]; 78cabdff1aSopenharmony_ci} DSTContext; 79cabdff1aSopenharmony_ci 80cabdff1aSopenharmony_cistatic av_cold int decode_init(AVCodecContext *avctx) 81cabdff1aSopenharmony_ci{ 82cabdff1aSopenharmony_ci DSTContext *s = avctx->priv_data; 83cabdff1aSopenharmony_ci int i; 84cabdff1aSopenharmony_ci 85cabdff1aSopenharmony_ci if (avctx->ch_layout.nb_channels > DST_MAX_CHANNELS) { 86cabdff1aSopenharmony_ci avpriv_request_sample(avctx, "Channel count %d", avctx->ch_layout.nb_channels); 87cabdff1aSopenharmony_ci return AVERROR_PATCHWELCOME; 88cabdff1aSopenharmony_ci } 89cabdff1aSopenharmony_ci 90cabdff1aSopenharmony_ci // the sample rate is only allowed to be 64,128,256 * 44100 by ISO/IEC 14496-3:2005(E) 91cabdff1aSopenharmony_ci // We are a bit more tolerant here, but this check is needed to bound the size and duration 92cabdff1aSopenharmony_ci if (avctx->sample_rate > 512 * 44100) 93cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 94cabdff1aSopenharmony_ci 95cabdff1aSopenharmony_ci 96cabdff1aSopenharmony_ci if (DST_SAMPLES_PER_FRAME(avctx->sample_rate) & 7) { 97cabdff1aSopenharmony_ci return AVERROR_PATCHWELCOME; 98cabdff1aSopenharmony_ci } 99cabdff1aSopenharmony_ci 100cabdff1aSopenharmony_ci avctx->sample_fmt = AV_SAMPLE_FMT_FLT; 101cabdff1aSopenharmony_ci 102cabdff1aSopenharmony_ci for (i = 0; i < avctx->ch_layout.nb_channels; i++) 103cabdff1aSopenharmony_ci memset(s->dsdctx[i].buf, 0x69, sizeof(s->dsdctx[i].buf)); 104cabdff1aSopenharmony_ci 105cabdff1aSopenharmony_ci ff_init_dsd_data(); 106cabdff1aSopenharmony_ci 107cabdff1aSopenharmony_ci return 0; 108cabdff1aSopenharmony_ci} 109cabdff1aSopenharmony_ci 110cabdff1aSopenharmony_cistatic int read_map(GetBitContext *gb, Table *t, unsigned int map[DST_MAX_CHANNELS], int channels) 111cabdff1aSopenharmony_ci{ 112cabdff1aSopenharmony_ci int ch; 113cabdff1aSopenharmony_ci t->elements = 1; 114cabdff1aSopenharmony_ci map[0] = 0; 115cabdff1aSopenharmony_ci if (!get_bits1(gb)) { 116cabdff1aSopenharmony_ci for (ch = 1; ch < channels; ch++) { 117cabdff1aSopenharmony_ci int bits = av_log2(t->elements) + 1; 118cabdff1aSopenharmony_ci map[ch] = get_bits(gb, bits); 119cabdff1aSopenharmony_ci if (map[ch] == t->elements) { 120cabdff1aSopenharmony_ci t->elements++; 121cabdff1aSopenharmony_ci if (t->elements >= DST_MAX_ELEMENTS) 122cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 123cabdff1aSopenharmony_ci } else if (map[ch] > t->elements) { 124cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 125cabdff1aSopenharmony_ci } 126cabdff1aSopenharmony_ci } 127cabdff1aSopenharmony_ci } else { 128cabdff1aSopenharmony_ci memset(map, 0, sizeof(*map) * DST_MAX_CHANNELS); 129cabdff1aSopenharmony_ci } 130cabdff1aSopenharmony_ci return 0; 131cabdff1aSopenharmony_ci} 132cabdff1aSopenharmony_ci 133cabdff1aSopenharmony_cistatic av_always_inline int get_sr_golomb_dst(GetBitContext *gb, unsigned int k) 134cabdff1aSopenharmony_ci{ 135cabdff1aSopenharmony_ci int v = get_ur_golomb_jpegls(gb, k, get_bits_left(gb), 0); 136cabdff1aSopenharmony_ci if (v && get_bits1(gb)) 137cabdff1aSopenharmony_ci v = -v; 138cabdff1aSopenharmony_ci return v; 139cabdff1aSopenharmony_ci} 140cabdff1aSopenharmony_ci 141cabdff1aSopenharmony_cistatic void read_uncoded_coeff(GetBitContext *gb, int *dst, unsigned int elements, 142cabdff1aSopenharmony_ci int coeff_bits, int is_signed, int offset) 143cabdff1aSopenharmony_ci{ 144cabdff1aSopenharmony_ci int i; 145cabdff1aSopenharmony_ci 146cabdff1aSopenharmony_ci for (i = 0; i < elements; i++) { 147cabdff1aSopenharmony_ci dst[i] = (is_signed ? get_sbits(gb, coeff_bits) : get_bits(gb, coeff_bits)) + offset; 148cabdff1aSopenharmony_ci } 149cabdff1aSopenharmony_ci} 150cabdff1aSopenharmony_ci 151cabdff1aSopenharmony_cistatic int read_table(GetBitContext *gb, Table *t, const int8_t code_pred_coeff[3][3], 152cabdff1aSopenharmony_ci int length_bits, int coeff_bits, int is_signed, int offset) 153cabdff1aSopenharmony_ci{ 154cabdff1aSopenharmony_ci unsigned int i, j, k; 155cabdff1aSopenharmony_ci for (i = 0; i < t->elements; i++) { 156cabdff1aSopenharmony_ci t->length[i] = get_bits(gb, length_bits) + 1; 157cabdff1aSopenharmony_ci if (!get_bits1(gb)) { 158cabdff1aSopenharmony_ci read_uncoded_coeff(gb, t->coeff[i], t->length[i], coeff_bits, is_signed, offset); 159cabdff1aSopenharmony_ci } else { 160cabdff1aSopenharmony_ci int method = get_bits(gb, 2), lsb_size; 161cabdff1aSopenharmony_ci if (method == 3) 162cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 163cabdff1aSopenharmony_ci 164cabdff1aSopenharmony_ci read_uncoded_coeff(gb, t->coeff[i], method + 1, coeff_bits, is_signed, offset); 165cabdff1aSopenharmony_ci 166cabdff1aSopenharmony_ci lsb_size = get_bits(gb, 3); 167cabdff1aSopenharmony_ci for (j = method + 1; j < t->length[i]; j++) { 168cabdff1aSopenharmony_ci int c, x = 0; 169cabdff1aSopenharmony_ci for (k = 0; k < method + 1; k++) 170cabdff1aSopenharmony_ci x += code_pred_coeff[method][k] * (unsigned)t->coeff[i][j - k - 1]; 171cabdff1aSopenharmony_ci c = get_sr_golomb_dst(gb, lsb_size); 172cabdff1aSopenharmony_ci if (x >= 0) 173cabdff1aSopenharmony_ci c -= (x + 4) / 8; 174cabdff1aSopenharmony_ci else 175cabdff1aSopenharmony_ci c += (-x + 3) / 8; 176cabdff1aSopenharmony_ci if (!is_signed) { 177cabdff1aSopenharmony_ci if (c < offset || c >= offset + (1<<coeff_bits)) 178cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 179cabdff1aSopenharmony_ci } 180cabdff1aSopenharmony_ci t->coeff[i][j] = c; 181cabdff1aSopenharmony_ci } 182cabdff1aSopenharmony_ci } 183cabdff1aSopenharmony_ci } 184cabdff1aSopenharmony_ci return 0; 185cabdff1aSopenharmony_ci} 186cabdff1aSopenharmony_ci 187cabdff1aSopenharmony_cistatic void ac_init(ArithCoder *ac, GetBitContext *gb) 188cabdff1aSopenharmony_ci{ 189cabdff1aSopenharmony_ci ac->a = 4095; 190cabdff1aSopenharmony_ci ac->c = get_bits(gb, 12); 191cabdff1aSopenharmony_ci} 192cabdff1aSopenharmony_ci 193cabdff1aSopenharmony_cistatic av_always_inline void ac_get(ArithCoder *ac, GetBitContext *gb, int p, int *e) 194cabdff1aSopenharmony_ci{ 195cabdff1aSopenharmony_ci unsigned int k = (ac->a >> 8) | ((ac->a >> 7) & 1); 196cabdff1aSopenharmony_ci unsigned int q = k * p; 197cabdff1aSopenharmony_ci unsigned int a_q = ac->a - q; 198cabdff1aSopenharmony_ci 199cabdff1aSopenharmony_ci *e = ac->c < a_q; 200cabdff1aSopenharmony_ci if (*e) { 201cabdff1aSopenharmony_ci ac->a = a_q; 202cabdff1aSopenharmony_ci } else { 203cabdff1aSopenharmony_ci ac->a = q; 204cabdff1aSopenharmony_ci ac->c -= a_q; 205cabdff1aSopenharmony_ci } 206cabdff1aSopenharmony_ci 207cabdff1aSopenharmony_ci if (ac->a < 2048) { 208cabdff1aSopenharmony_ci int n = 11 - av_log2(ac->a); 209cabdff1aSopenharmony_ci ac->a <<= n; 210cabdff1aSopenharmony_ci ac->c = (ac->c << n) | get_bits(gb, n); 211cabdff1aSopenharmony_ci } 212cabdff1aSopenharmony_ci} 213cabdff1aSopenharmony_ci 214cabdff1aSopenharmony_cistatic uint8_t prob_dst_x_bit(int c) 215cabdff1aSopenharmony_ci{ 216cabdff1aSopenharmony_ci return (ff_reverse[c & 127] >> 1) + 1; 217cabdff1aSopenharmony_ci} 218cabdff1aSopenharmony_ci 219cabdff1aSopenharmony_cistatic int build_filter(int16_t table[DST_MAX_ELEMENTS][16][256], const Table *fsets) 220cabdff1aSopenharmony_ci{ 221cabdff1aSopenharmony_ci int i, j, k, l; 222cabdff1aSopenharmony_ci 223cabdff1aSopenharmony_ci for (i = 0; i < fsets->elements; i++) { 224cabdff1aSopenharmony_ci int length = fsets->length[i]; 225cabdff1aSopenharmony_ci 226cabdff1aSopenharmony_ci for (j = 0; j < 16; j++) { 227cabdff1aSopenharmony_ci int total = av_clip(length - j * 8, 0, 8); 228cabdff1aSopenharmony_ci 229cabdff1aSopenharmony_ci for (k = 0; k < 256; k++) { 230cabdff1aSopenharmony_ci int64_t v = 0; 231cabdff1aSopenharmony_ci 232cabdff1aSopenharmony_ci for (l = 0; l < total; l++) 233cabdff1aSopenharmony_ci v += (((k >> l) & 1) * 2 - 1) * fsets->coeff[i][j * 8 + l]; 234cabdff1aSopenharmony_ci if ((int16_t)v != v) 235cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 236cabdff1aSopenharmony_ci table[i][j][k] = v; 237cabdff1aSopenharmony_ci } 238cabdff1aSopenharmony_ci } 239cabdff1aSopenharmony_ci } 240cabdff1aSopenharmony_ci return 0; 241cabdff1aSopenharmony_ci} 242cabdff1aSopenharmony_ci 243cabdff1aSopenharmony_cistatic int decode_frame(AVCodecContext *avctx, AVFrame *frame, 244cabdff1aSopenharmony_ci int *got_frame_ptr, AVPacket *avpkt) 245cabdff1aSopenharmony_ci{ 246cabdff1aSopenharmony_ci unsigned samples_per_frame = DST_SAMPLES_PER_FRAME(avctx->sample_rate); 247cabdff1aSopenharmony_ci unsigned map_ch_to_felem[DST_MAX_CHANNELS]; 248cabdff1aSopenharmony_ci unsigned map_ch_to_pelem[DST_MAX_CHANNELS]; 249cabdff1aSopenharmony_ci unsigned i, ch, same_map, dst_x_bit; 250cabdff1aSopenharmony_ci unsigned half_prob[DST_MAX_CHANNELS]; 251cabdff1aSopenharmony_ci const int channels = avctx->ch_layout.nb_channels; 252cabdff1aSopenharmony_ci DSTContext *s = avctx->priv_data; 253cabdff1aSopenharmony_ci GetBitContext *gb = &s->gb; 254cabdff1aSopenharmony_ci ArithCoder *ac = &s->ac; 255cabdff1aSopenharmony_ci uint8_t *dsd; 256cabdff1aSopenharmony_ci float *pcm; 257cabdff1aSopenharmony_ci int ret; 258cabdff1aSopenharmony_ci 259cabdff1aSopenharmony_ci if (avpkt->size <= 1) 260cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 261cabdff1aSopenharmony_ci 262cabdff1aSopenharmony_ci frame->nb_samples = samples_per_frame / 8; 263cabdff1aSopenharmony_ci if ((ret = ff_get_buffer(avctx, frame, 0)) < 0) 264cabdff1aSopenharmony_ci return ret; 265cabdff1aSopenharmony_ci dsd = frame->data[0]; 266cabdff1aSopenharmony_ci pcm = (float *)frame->data[0]; 267cabdff1aSopenharmony_ci 268cabdff1aSopenharmony_ci if ((ret = init_get_bits8(gb, avpkt->data, avpkt->size)) < 0) 269cabdff1aSopenharmony_ci return ret; 270cabdff1aSopenharmony_ci 271cabdff1aSopenharmony_ci if (!get_bits1(gb)) { 272cabdff1aSopenharmony_ci skip_bits1(gb); 273cabdff1aSopenharmony_ci if (get_bits(gb, 6)) 274cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 275cabdff1aSopenharmony_ci memcpy(frame->data[0], avpkt->data + 1, FFMIN(avpkt->size - 1, frame->nb_samples * channels)); 276cabdff1aSopenharmony_ci goto dsd; 277cabdff1aSopenharmony_ci } 278cabdff1aSopenharmony_ci 279cabdff1aSopenharmony_ci /* Segmentation (10.4, 10.5, 10.6) */ 280cabdff1aSopenharmony_ci 281cabdff1aSopenharmony_ci if (!get_bits1(gb)) { 282cabdff1aSopenharmony_ci avpriv_request_sample(avctx, "Not Same Segmentation"); 283cabdff1aSopenharmony_ci return AVERROR_PATCHWELCOME; 284cabdff1aSopenharmony_ci } 285cabdff1aSopenharmony_ci 286cabdff1aSopenharmony_ci if (!get_bits1(gb)) { 287cabdff1aSopenharmony_ci avpriv_request_sample(avctx, "Not Same Segmentation For All Channels"); 288cabdff1aSopenharmony_ci return AVERROR_PATCHWELCOME; 289cabdff1aSopenharmony_ci } 290cabdff1aSopenharmony_ci 291cabdff1aSopenharmony_ci if (!get_bits1(gb)) { 292cabdff1aSopenharmony_ci avpriv_request_sample(avctx, "Not End Of Channel Segmentation"); 293cabdff1aSopenharmony_ci return AVERROR_PATCHWELCOME; 294cabdff1aSopenharmony_ci } 295cabdff1aSopenharmony_ci 296cabdff1aSopenharmony_ci /* Mapping (10.7, 10.8, 10.9) */ 297cabdff1aSopenharmony_ci 298cabdff1aSopenharmony_ci same_map = get_bits1(gb); 299cabdff1aSopenharmony_ci 300cabdff1aSopenharmony_ci if ((ret = read_map(gb, &s->fsets, map_ch_to_felem, channels)) < 0) 301cabdff1aSopenharmony_ci return ret; 302cabdff1aSopenharmony_ci 303cabdff1aSopenharmony_ci if (same_map) { 304cabdff1aSopenharmony_ci s->probs.elements = s->fsets.elements; 305cabdff1aSopenharmony_ci memcpy(map_ch_to_pelem, map_ch_to_felem, sizeof(map_ch_to_felem)); 306cabdff1aSopenharmony_ci } else { 307cabdff1aSopenharmony_ci avpriv_request_sample(avctx, "Not Same Mapping"); 308cabdff1aSopenharmony_ci if ((ret = read_map(gb, &s->probs, map_ch_to_pelem, channels)) < 0) 309cabdff1aSopenharmony_ci return ret; 310cabdff1aSopenharmony_ci } 311cabdff1aSopenharmony_ci 312cabdff1aSopenharmony_ci /* Half Probability (10.10) */ 313cabdff1aSopenharmony_ci 314cabdff1aSopenharmony_ci for (ch = 0; ch < channels; ch++) 315cabdff1aSopenharmony_ci half_prob[ch] = get_bits1(gb); 316cabdff1aSopenharmony_ci 317cabdff1aSopenharmony_ci /* Filter Coef Sets (10.12) */ 318cabdff1aSopenharmony_ci 319cabdff1aSopenharmony_ci ret = read_table(gb, &s->fsets, fsets_code_pred_coeff, 7, 9, 1, 0); 320cabdff1aSopenharmony_ci if (ret < 0) 321cabdff1aSopenharmony_ci return ret; 322cabdff1aSopenharmony_ci 323cabdff1aSopenharmony_ci /* Probability Tables (10.13) */ 324cabdff1aSopenharmony_ci 325cabdff1aSopenharmony_ci ret = read_table(gb, &s->probs, probs_code_pred_coeff, 6, 7, 0, 1); 326cabdff1aSopenharmony_ci if (ret < 0) 327cabdff1aSopenharmony_ci return ret; 328cabdff1aSopenharmony_ci 329cabdff1aSopenharmony_ci /* Arithmetic Coded Data (10.11) */ 330cabdff1aSopenharmony_ci 331cabdff1aSopenharmony_ci if (get_bits1(gb)) 332cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 333cabdff1aSopenharmony_ci ac_init(ac, gb); 334cabdff1aSopenharmony_ci 335cabdff1aSopenharmony_ci ret = build_filter(s->filter, &s->fsets); 336cabdff1aSopenharmony_ci if (ret < 0) 337cabdff1aSopenharmony_ci return ret; 338cabdff1aSopenharmony_ci 339cabdff1aSopenharmony_ci memset(s->status, 0xAA, sizeof(s->status)); 340cabdff1aSopenharmony_ci memset(dsd, 0, frame->nb_samples * 4 * channels); 341cabdff1aSopenharmony_ci 342cabdff1aSopenharmony_ci ac_get(ac, gb, prob_dst_x_bit(s->fsets.coeff[0][0]), &dst_x_bit); 343cabdff1aSopenharmony_ci 344cabdff1aSopenharmony_ci for (i = 0; i < samples_per_frame; i++) { 345cabdff1aSopenharmony_ci for (ch = 0; ch < channels; ch++) { 346cabdff1aSopenharmony_ci const unsigned felem = map_ch_to_felem[ch]; 347cabdff1aSopenharmony_ci int16_t (*filter)[256] = s->filter[felem]; 348cabdff1aSopenharmony_ci uint8_t *status = s->status[ch]; 349cabdff1aSopenharmony_ci int prob, residual, v; 350cabdff1aSopenharmony_ci 351cabdff1aSopenharmony_ci#define F(x) filter[(x)][status[(x)]] 352cabdff1aSopenharmony_ci const int16_t predict = F( 0) + F( 1) + F( 2) + F( 3) + 353cabdff1aSopenharmony_ci F( 4) + F( 5) + F( 6) + F( 7) + 354cabdff1aSopenharmony_ci F( 8) + F( 9) + F(10) + F(11) + 355cabdff1aSopenharmony_ci F(12) + F(13) + F(14) + F(15); 356cabdff1aSopenharmony_ci#undef F 357cabdff1aSopenharmony_ci 358cabdff1aSopenharmony_ci if (!half_prob[ch] || i >= s->fsets.length[felem]) { 359cabdff1aSopenharmony_ci unsigned pelem = map_ch_to_pelem[ch]; 360cabdff1aSopenharmony_ci unsigned index = FFABS(predict) >> 3; 361cabdff1aSopenharmony_ci prob = s->probs.coeff[pelem][FFMIN(index, s->probs.length[pelem] - 1)]; 362cabdff1aSopenharmony_ci } else { 363cabdff1aSopenharmony_ci prob = 128; 364cabdff1aSopenharmony_ci } 365cabdff1aSopenharmony_ci 366cabdff1aSopenharmony_ci ac_get(ac, gb, prob, &residual); 367cabdff1aSopenharmony_ci v = ((predict >> 15) ^ residual) & 1; 368cabdff1aSopenharmony_ci dsd[((i >> 3) * channels + ch) << 2] |= v << (7 - (i & 0x7 )); 369cabdff1aSopenharmony_ci 370cabdff1aSopenharmony_ci AV_WL64A(status + 8, (AV_RL64A(status + 8) << 1) | ((AV_RL64A(status) >> 63) & 1)); 371cabdff1aSopenharmony_ci AV_WL64A(status, (AV_RL64A(status) << 1) | v); 372cabdff1aSopenharmony_ci } 373cabdff1aSopenharmony_ci } 374cabdff1aSopenharmony_ci 375cabdff1aSopenharmony_cidsd: 376cabdff1aSopenharmony_ci for (i = 0; i < channels; i++) { 377cabdff1aSopenharmony_ci ff_dsd2pcm_translate(&s->dsdctx[i], frame->nb_samples, 0, 378cabdff1aSopenharmony_ci frame->data[0] + i * 4, 379cabdff1aSopenharmony_ci channels * 4, pcm + i, channels); 380cabdff1aSopenharmony_ci } 381cabdff1aSopenharmony_ci 382cabdff1aSopenharmony_ci *got_frame_ptr = 1; 383cabdff1aSopenharmony_ci 384cabdff1aSopenharmony_ci return avpkt->size; 385cabdff1aSopenharmony_ci} 386cabdff1aSopenharmony_ci 387cabdff1aSopenharmony_ciconst FFCodec ff_dst_decoder = { 388cabdff1aSopenharmony_ci .p.name = "dst", 389cabdff1aSopenharmony_ci .p.long_name = NULL_IF_CONFIG_SMALL("DST (Digital Stream Transfer)"), 390cabdff1aSopenharmony_ci .p.type = AVMEDIA_TYPE_AUDIO, 391cabdff1aSopenharmony_ci .p.id = AV_CODEC_ID_DST, 392cabdff1aSopenharmony_ci .priv_data_size = sizeof(DSTContext), 393cabdff1aSopenharmony_ci .init = decode_init, 394cabdff1aSopenharmony_ci FF_CODEC_DECODE_CB(decode_frame), 395cabdff1aSopenharmony_ci .p.capabilities = AV_CODEC_CAP_DR1, 396cabdff1aSopenharmony_ci .p.sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_FLT, 397cabdff1aSopenharmony_ci AV_SAMPLE_FMT_NONE }, 398cabdff1aSopenharmony_ci .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE, 399cabdff1aSopenharmony_ci}; 400