1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * FLAC (Free Lossless Audio Codec) decoder 3cabdff1aSopenharmony_ci * Copyright (c) 2003 Alex Beregszaszi 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 * FLAC (Free Lossless Audio Codec) decoder 25cabdff1aSopenharmony_ci * @author Alex Beregszaszi 26cabdff1aSopenharmony_ci * @see http://flac.sourceforge.net/ 27cabdff1aSopenharmony_ci * 28cabdff1aSopenharmony_ci * This decoder can be used in 1 of 2 ways: Either raw FLAC data can be fed 29cabdff1aSopenharmony_ci * through, starting from the initial 'fLaC' signature; or by passing the 30cabdff1aSopenharmony_ci * 34-byte streaminfo structure through avctx->extradata[_size] followed 31cabdff1aSopenharmony_ci * by data starting with the 0xFFF8 marker. 32cabdff1aSopenharmony_ci */ 33cabdff1aSopenharmony_ci 34cabdff1aSopenharmony_ci#include <limits.h> 35cabdff1aSopenharmony_ci 36cabdff1aSopenharmony_ci#include "libavutil/avassert.h" 37cabdff1aSopenharmony_ci#include "libavutil/crc.h" 38cabdff1aSopenharmony_ci#include "libavutil/opt.h" 39cabdff1aSopenharmony_ci#include "avcodec.h" 40cabdff1aSopenharmony_ci#include "codec_internal.h" 41cabdff1aSopenharmony_ci#include "get_bits.h" 42cabdff1aSopenharmony_ci#include "bytestream.h" 43cabdff1aSopenharmony_ci#include "golomb.h" 44cabdff1aSopenharmony_ci#include "flac.h" 45cabdff1aSopenharmony_ci#include "flacdata.h" 46cabdff1aSopenharmony_ci#include "flacdsp.h" 47cabdff1aSopenharmony_ci#include "thread.h" 48cabdff1aSopenharmony_ci#include "unary.h" 49cabdff1aSopenharmony_ci 50cabdff1aSopenharmony_ci 51cabdff1aSopenharmony_citypedef struct FLACContext { 52cabdff1aSopenharmony_ci AVClass *class; 53cabdff1aSopenharmony_ci struct FLACStreaminfo flac_stream_info; 54cabdff1aSopenharmony_ci 55cabdff1aSopenharmony_ci AVCodecContext *avctx; ///< parent AVCodecContext 56cabdff1aSopenharmony_ci GetBitContext gb; ///< GetBitContext initialized to start at the current frame 57cabdff1aSopenharmony_ci 58cabdff1aSopenharmony_ci int blocksize; ///< number of samples in the current frame 59cabdff1aSopenharmony_ci int sample_shift; ///< shift required to make output samples 16-bit or 32-bit 60cabdff1aSopenharmony_ci int ch_mode; ///< channel decorrelation type in the current frame 61cabdff1aSopenharmony_ci int got_streaminfo; ///< indicates if the STREAMINFO has been read 62cabdff1aSopenharmony_ci 63cabdff1aSopenharmony_ci int32_t *decoded[FLAC_MAX_CHANNELS]; ///< decoded samples 64cabdff1aSopenharmony_ci uint8_t *decoded_buffer; 65cabdff1aSopenharmony_ci unsigned int decoded_buffer_size; 66cabdff1aSopenharmony_ci int buggy_lpc; ///< use workaround for old lavc encoded files 67cabdff1aSopenharmony_ci 68cabdff1aSopenharmony_ci FLACDSPContext dsp; 69cabdff1aSopenharmony_ci} FLACContext; 70cabdff1aSopenharmony_ci 71cabdff1aSopenharmony_cistatic int allocate_buffers(FLACContext *s); 72cabdff1aSopenharmony_ci 73cabdff1aSopenharmony_cistatic void flac_set_bps(FLACContext *s) 74cabdff1aSopenharmony_ci{ 75cabdff1aSopenharmony_ci enum AVSampleFormat req = s->avctx->request_sample_fmt; 76cabdff1aSopenharmony_ci int need32 = s->flac_stream_info.bps > 16; 77cabdff1aSopenharmony_ci int want32 = av_get_bytes_per_sample(req) > 2; 78cabdff1aSopenharmony_ci int planar = av_sample_fmt_is_planar(req); 79cabdff1aSopenharmony_ci 80cabdff1aSopenharmony_ci if (need32 || want32) { 81cabdff1aSopenharmony_ci if (planar) 82cabdff1aSopenharmony_ci s->avctx->sample_fmt = AV_SAMPLE_FMT_S32P; 83cabdff1aSopenharmony_ci else 84cabdff1aSopenharmony_ci s->avctx->sample_fmt = AV_SAMPLE_FMT_S32; 85cabdff1aSopenharmony_ci s->sample_shift = 32 - s->flac_stream_info.bps; 86cabdff1aSopenharmony_ci } else { 87cabdff1aSopenharmony_ci if (planar) 88cabdff1aSopenharmony_ci s->avctx->sample_fmt = AV_SAMPLE_FMT_S16P; 89cabdff1aSopenharmony_ci else 90cabdff1aSopenharmony_ci s->avctx->sample_fmt = AV_SAMPLE_FMT_S16; 91cabdff1aSopenharmony_ci s->sample_shift = 16 - s->flac_stream_info.bps; 92cabdff1aSopenharmony_ci } 93cabdff1aSopenharmony_ci} 94cabdff1aSopenharmony_ci 95cabdff1aSopenharmony_cistatic av_cold int flac_decode_init(AVCodecContext *avctx) 96cabdff1aSopenharmony_ci{ 97cabdff1aSopenharmony_ci enum FLACExtradataFormat format; 98cabdff1aSopenharmony_ci uint8_t *streaminfo; 99cabdff1aSopenharmony_ci int ret; 100cabdff1aSopenharmony_ci FLACContext *s = avctx->priv_data; 101cabdff1aSopenharmony_ci s->avctx = avctx; 102cabdff1aSopenharmony_ci 103cabdff1aSopenharmony_ci /* for now, the raw FLAC header is allowed to be passed to the decoder as 104cabdff1aSopenharmony_ci frame data instead of extradata. */ 105cabdff1aSopenharmony_ci if (!avctx->extradata) 106cabdff1aSopenharmony_ci return 0; 107cabdff1aSopenharmony_ci 108cabdff1aSopenharmony_ci if (!ff_flac_is_extradata_valid(avctx, &format, &streaminfo)) 109cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 110cabdff1aSopenharmony_ci 111cabdff1aSopenharmony_ci /* initialize based on the demuxer-supplied streamdata header */ 112cabdff1aSopenharmony_ci ret = ff_flac_parse_streaminfo(avctx, &s->flac_stream_info, streaminfo); 113cabdff1aSopenharmony_ci if (ret < 0) 114cabdff1aSopenharmony_ci return ret; 115cabdff1aSopenharmony_ci ret = allocate_buffers(s); 116cabdff1aSopenharmony_ci if (ret < 0) 117cabdff1aSopenharmony_ci return ret; 118cabdff1aSopenharmony_ci flac_set_bps(s); 119cabdff1aSopenharmony_ci ff_flacdsp_init(&s->dsp, avctx->sample_fmt, 120cabdff1aSopenharmony_ci s->flac_stream_info.channels, s->flac_stream_info.bps); 121cabdff1aSopenharmony_ci s->got_streaminfo = 1; 122cabdff1aSopenharmony_ci 123cabdff1aSopenharmony_ci return 0; 124cabdff1aSopenharmony_ci} 125cabdff1aSopenharmony_ci 126cabdff1aSopenharmony_cistatic void dump_headers(AVCodecContext *avctx, FLACStreaminfo *s) 127cabdff1aSopenharmony_ci{ 128cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_DEBUG, " Max Blocksize: %d\n", s->max_blocksize); 129cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_DEBUG, " Max Framesize: %d\n", s->max_framesize); 130cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_DEBUG, " Samplerate: %d\n", s->samplerate); 131cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_DEBUG, " Channels: %d\n", s->channels); 132cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_DEBUG, " Bits: %d\n", s->bps); 133cabdff1aSopenharmony_ci} 134cabdff1aSopenharmony_ci 135cabdff1aSopenharmony_cistatic int allocate_buffers(FLACContext *s) 136cabdff1aSopenharmony_ci{ 137cabdff1aSopenharmony_ci int buf_size; 138cabdff1aSopenharmony_ci int ret; 139cabdff1aSopenharmony_ci 140cabdff1aSopenharmony_ci av_assert0(s->flac_stream_info.max_blocksize); 141cabdff1aSopenharmony_ci 142cabdff1aSopenharmony_ci buf_size = av_samples_get_buffer_size(NULL, s->flac_stream_info.channels, 143cabdff1aSopenharmony_ci s->flac_stream_info.max_blocksize, 144cabdff1aSopenharmony_ci AV_SAMPLE_FMT_S32P, 0); 145cabdff1aSopenharmony_ci if (buf_size < 0) 146cabdff1aSopenharmony_ci return buf_size; 147cabdff1aSopenharmony_ci 148cabdff1aSopenharmony_ci av_fast_malloc(&s->decoded_buffer, &s->decoded_buffer_size, buf_size); 149cabdff1aSopenharmony_ci if (!s->decoded_buffer) 150cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 151cabdff1aSopenharmony_ci 152cabdff1aSopenharmony_ci ret = av_samples_fill_arrays((uint8_t **)s->decoded, NULL, 153cabdff1aSopenharmony_ci s->decoded_buffer, 154cabdff1aSopenharmony_ci s->flac_stream_info.channels, 155cabdff1aSopenharmony_ci s->flac_stream_info.max_blocksize, 156cabdff1aSopenharmony_ci AV_SAMPLE_FMT_S32P, 0); 157cabdff1aSopenharmony_ci return ret < 0 ? ret : 0; 158cabdff1aSopenharmony_ci} 159cabdff1aSopenharmony_ci 160cabdff1aSopenharmony_ci/** 161cabdff1aSopenharmony_ci * Parse the STREAMINFO from an inline header. 162cabdff1aSopenharmony_ci * @param s the flac decoding context 163cabdff1aSopenharmony_ci * @param buf input buffer, starting with the "fLaC" marker 164cabdff1aSopenharmony_ci * @param buf_size buffer size 165cabdff1aSopenharmony_ci * @return non-zero if metadata is invalid 166cabdff1aSopenharmony_ci */ 167cabdff1aSopenharmony_cistatic int parse_streaminfo(FLACContext *s, const uint8_t *buf, int buf_size) 168cabdff1aSopenharmony_ci{ 169cabdff1aSopenharmony_ci int metadata_type, metadata_size, ret; 170cabdff1aSopenharmony_ci 171cabdff1aSopenharmony_ci if (buf_size < FLAC_STREAMINFO_SIZE+8) { 172cabdff1aSopenharmony_ci /* need more data */ 173cabdff1aSopenharmony_ci return 0; 174cabdff1aSopenharmony_ci } 175cabdff1aSopenharmony_ci flac_parse_block_header(&buf[4], NULL, &metadata_type, &metadata_size); 176cabdff1aSopenharmony_ci if (metadata_type != FLAC_METADATA_TYPE_STREAMINFO || 177cabdff1aSopenharmony_ci metadata_size != FLAC_STREAMINFO_SIZE) { 178cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 179cabdff1aSopenharmony_ci } 180cabdff1aSopenharmony_ci ret = ff_flac_parse_streaminfo(s->avctx, &s->flac_stream_info, &buf[8]); 181cabdff1aSopenharmony_ci if (ret < 0) 182cabdff1aSopenharmony_ci return ret; 183cabdff1aSopenharmony_ci ret = allocate_buffers(s); 184cabdff1aSopenharmony_ci if (ret < 0) 185cabdff1aSopenharmony_ci return ret; 186cabdff1aSopenharmony_ci flac_set_bps(s); 187cabdff1aSopenharmony_ci ff_flacdsp_init(&s->dsp, s->avctx->sample_fmt, 188cabdff1aSopenharmony_ci s->flac_stream_info.channels, s->flac_stream_info.bps); 189cabdff1aSopenharmony_ci s->got_streaminfo = 1; 190cabdff1aSopenharmony_ci 191cabdff1aSopenharmony_ci return 0; 192cabdff1aSopenharmony_ci} 193cabdff1aSopenharmony_ci 194cabdff1aSopenharmony_ci/** 195cabdff1aSopenharmony_ci * Determine the size of an inline header. 196cabdff1aSopenharmony_ci * @param buf input buffer, starting with the "fLaC" marker 197cabdff1aSopenharmony_ci * @param buf_size buffer size 198cabdff1aSopenharmony_ci * @return number of bytes in the header, or 0 if more data is needed 199cabdff1aSopenharmony_ci */ 200cabdff1aSopenharmony_cistatic int get_metadata_size(const uint8_t *buf, int buf_size) 201cabdff1aSopenharmony_ci{ 202cabdff1aSopenharmony_ci int metadata_last, metadata_size; 203cabdff1aSopenharmony_ci const uint8_t *buf_end = buf + buf_size; 204cabdff1aSopenharmony_ci 205cabdff1aSopenharmony_ci buf += 4; 206cabdff1aSopenharmony_ci do { 207cabdff1aSopenharmony_ci if (buf_end - buf < 4) 208cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 209cabdff1aSopenharmony_ci flac_parse_block_header(buf, &metadata_last, NULL, &metadata_size); 210cabdff1aSopenharmony_ci buf += 4; 211cabdff1aSopenharmony_ci if (buf_end - buf < metadata_size) { 212cabdff1aSopenharmony_ci /* need more data in order to read the complete header */ 213cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 214cabdff1aSopenharmony_ci } 215cabdff1aSopenharmony_ci buf += metadata_size; 216cabdff1aSopenharmony_ci } while (!metadata_last); 217cabdff1aSopenharmony_ci 218cabdff1aSopenharmony_ci return buf_size - (buf_end - buf); 219cabdff1aSopenharmony_ci} 220cabdff1aSopenharmony_ci 221cabdff1aSopenharmony_cistatic int decode_residuals(FLACContext *s, int32_t *decoded, int pred_order) 222cabdff1aSopenharmony_ci{ 223cabdff1aSopenharmony_ci GetBitContext gb = s->gb; 224cabdff1aSopenharmony_ci int i, tmp, partition, method_type, rice_order; 225cabdff1aSopenharmony_ci int rice_bits, rice_esc; 226cabdff1aSopenharmony_ci int samples; 227cabdff1aSopenharmony_ci 228cabdff1aSopenharmony_ci method_type = get_bits(&gb, 2); 229cabdff1aSopenharmony_ci rice_order = get_bits(&gb, 4); 230cabdff1aSopenharmony_ci 231cabdff1aSopenharmony_ci samples = s->blocksize >> rice_order; 232cabdff1aSopenharmony_ci rice_bits = 4 + method_type; 233cabdff1aSopenharmony_ci rice_esc = (1 << rice_bits) - 1; 234cabdff1aSopenharmony_ci 235cabdff1aSopenharmony_ci decoded += pred_order; 236cabdff1aSopenharmony_ci i = pred_order; 237cabdff1aSopenharmony_ci 238cabdff1aSopenharmony_ci if (method_type > 1) { 239cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "illegal residual coding method %d\n", 240cabdff1aSopenharmony_ci method_type); 241cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 242cabdff1aSopenharmony_ci } 243cabdff1aSopenharmony_ci 244cabdff1aSopenharmony_ci if (samples << rice_order != s->blocksize) { 245cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "invalid rice order: %i blocksize %i\n", 246cabdff1aSopenharmony_ci rice_order, s->blocksize); 247cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 248cabdff1aSopenharmony_ci } 249cabdff1aSopenharmony_ci 250cabdff1aSopenharmony_ci if (pred_order > samples) { 251cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "invalid predictor order: %i > %i\n", 252cabdff1aSopenharmony_ci pred_order, samples); 253cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 254cabdff1aSopenharmony_ci } 255cabdff1aSopenharmony_ci 256cabdff1aSopenharmony_ci for (partition = 0; partition < (1 << rice_order); partition++) { 257cabdff1aSopenharmony_ci tmp = get_bits(&gb, rice_bits); 258cabdff1aSopenharmony_ci if (tmp == rice_esc) { 259cabdff1aSopenharmony_ci tmp = get_bits(&gb, 5); 260cabdff1aSopenharmony_ci for (; i < samples; i++) 261cabdff1aSopenharmony_ci *decoded++ = get_sbits_long(&gb, tmp); 262cabdff1aSopenharmony_ci } else { 263cabdff1aSopenharmony_ci int real_limit = (tmp > 1) ? (INT_MAX >> (tmp - 1)) + 2 : INT_MAX; 264cabdff1aSopenharmony_ci for (; i < samples; i++) { 265cabdff1aSopenharmony_ci int v = get_sr_golomb_flac(&gb, tmp, real_limit, 1); 266cabdff1aSopenharmony_ci if (v == 0x80000000){ 267cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "invalid residual\n"); 268cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 269cabdff1aSopenharmony_ci } 270cabdff1aSopenharmony_ci 271cabdff1aSopenharmony_ci *decoded++ = v; 272cabdff1aSopenharmony_ci } 273cabdff1aSopenharmony_ci } 274cabdff1aSopenharmony_ci i= 0; 275cabdff1aSopenharmony_ci } 276cabdff1aSopenharmony_ci 277cabdff1aSopenharmony_ci s->gb = gb; 278cabdff1aSopenharmony_ci 279cabdff1aSopenharmony_ci return 0; 280cabdff1aSopenharmony_ci} 281cabdff1aSopenharmony_ci 282cabdff1aSopenharmony_cistatic int decode_subframe_fixed(FLACContext *s, int32_t *decoded, 283cabdff1aSopenharmony_ci int pred_order, int bps) 284cabdff1aSopenharmony_ci{ 285cabdff1aSopenharmony_ci const int blocksize = s->blocksize; 286cabdff1aSopenharmony_ci unsigned av_uninit(a), av_uninit(b), av_uninit(c), av_uninit(d); 287cabdff1aSopenharmony_ci int i; 288cabdff1aSopenharmony_ci int ret; 289cabdff1aSopenharmony_ci 290cabdff1aSopenharmony_ci /* warm up samples */ 291cabdff1aSopenharmony_ci for (i = 0; i < pred_order; i++) { 292cabdff1aSopenharmony_ci decoded[i] = get_sbits_long(&s->gb, bps); 293cabdff1aSopenharmony_ci } 294cabdff1aSopenharmony_ci 295cabdff1aSopenharmony_ci if ((ret = decode_residuals(s, decoded, pred_order)) < 0) 296cabdff1aSopenharmony_ci return ret; 297cabdff1aSopenharmony_ci 298cabdff1aSopenharmony_ci if (pred_order > 0) 299cabdff1aSopenharmony_ci a = decoded[pred_order-1]; 300cabdff1aSopenharmony_ci if (pred_order > 1) 301cabdff1aSopenharmony_ci b = a - decoded[pred_order-2]; 302cabdff1aSopenharmony_ci if (pred_order > 2) 303cabdff1aSopenharmony_ci c = b - decoded[pred_order-2] + decoded[pred_order-3]; 304cabdff1aSopenharmony_ci if (pred_order > 3) 305cabdff1aSopenharmony_ci d = c - decoded[pred_order-2] + 2U*decoded[pred_order-3] - decoded[pred_order-4]; 306cabdff1aSopenharmony_ci 307cabdff1aSopenharmony_ci switch (pred_order) { 308cabdff1aSopenharmony_ci case 0: 309cabdff1aSopenharmony_ci break; 310cabdff1aSopenharmony_ci case 1: 311cabdff1aSopenharmony_ci for (i = pred_order; i < blocksize; i++) 312cabdff1aSopenharmony_ci decoded[i] = a += decoded[i]; 313cabdff1aSopenharmony_ci break; 314cabdff1aSopenharmony_ci case 2: 315cabdff1aSopenharmony_ci for (i = pred_order; i < blocksize; i++) 316cabdff1aSopenharmony_ci decoded[i] = a += b += decoded[i]; 317cabdff1aSopenharmony_ci break; 318cabdff1aSopenharmony_ci case 3: 319cabdff1aSopenharmony_ci for (i = pred_order; i < blocksize; i++) 320cabdff1aSopenharmony_ci decoded[i] = a += b += c += decoded[i]; 321cabdff1aSopenharmony_ci break; 322cabdff1aSopenharmony_ci case 4: 323cabdff1aSopenharmony_ci for (i = pred_order; i < blocksize; i++) 324cabdff1aSopenharmony_ci decoded[i] = a += b += c += d += decoded[i]; 325cabdff1aSopenharmony_ci break; 326cabdff1aSopenharmony_ci default: 327cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "illegal pred order %d\n", pred_order); 328cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 329cabdff1aSopenharmony_ci } 330cabdff1aSopenharmony_ci 331cabdff1aSopenharmony_ci return 0; 332cabdff1aSopenharmony_ci} 333cabdff1aSopenharmony_ci 334cabdff1aSopenharmony_cistatic void lpc_analyze_remodulate(SUINT32 *decoded, const int coeffs[32], 335cabdff1aSopenharmony_ci int order, int qlevel, int len, int bps) 336cabdff1aSopenharmony_ci{ 337cabdff1aSopenharmony_ci int i, j; 338cabdff1aSopenharmony_ci int ebps = 1 << (bps-1); 339cabdff1aSopenharmony_ci unsigned sigma = 0; 340cabdff1aSopenharmony_ci 341cabdff1aSopenharmony_ci for (i = order; i < len; i++) 342cabdff1aSopenharmony_ci sigma |= decoded[i] + ebps; 343cabdff1aSopenharmony_ci 344cabdff1aSopenharmony_ci if (sigma < 2*ebps) 345cabdff1aSopenharmony_ci return; 346cabdff1aSopenharmony_ci 347cabdff1aSopenharmony_ci for (i = len - 1; i >= order; i--) { 348cabdff1aSopenharmony_ci int64_t p = 0; 349cabdff1aSopenharmony_ci for (j = 0; j < order; j++) 350cabdff1aSopenharmony_ci p += coeffs[j] * (int64_t)(int32_t)decoded[i-order+j]; 351cabdff1aSopenharmony_ci decoded[i] -= p >> qlevel; 352cabdff1aSopenharmony_ci } 353cabdff1aSopenharmony_ci for (i = order; i < len; i++, decoded++) { 354cabdff1aSopenharmony_ci int32_t p = 0; 355cabdff1aSopenharmony_ci for (j = 0; j < order; j++) 356cabdff1aSopenharmony_ci p += coeffs[j] * (uint32_t)decoded[j]; 357cabdff1aSopenharmony_ci decoded[j] += p >> qlevel; 358cabdff1aSopenharmony_ci } 359cabdff1aSopenharmony_ci} 360cabdff1aSopenharmony_ci 361cabdff1aSopenharmony_cistatic int decode_subframe_lpc(FLACContext *s, int32_t *decoded, int pred_order, 362cabdff1aSopenharmony_ci int bps) 363cabdff1aSopenharmony_ci{ 364cabdff1aSopenharmony_ci int i, ret; 365cabdff1aSopenharmony_ci int coeff_prec, qlevel; 366cabdff1aSopenharmony_ci int coeffs[32]; 367cabdff1aSopenharmony_ci 368cabdff1aSopenharmony_ci /* warm up samples */ 369cabdff1aSopenharmony_ci for (i = 0; i < pred_order; i++) { 370cabdff1aSopenharmony_ci decoded[i] = get_sbits_long(&s->gb, bps); 371cabdff1aSopenharmony_ci } 372cabdff1aSopenharmony_ci 373cabdff1aSopenharmony_ci coeff_prec = get_bits(&s->gb, 4) + 1; 374cabdff1aSopenharmony_ci if (coeff_prec == 16) { 375cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "invalid coeff precision\n"); 376cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 377cabdff1aSopenharmony_ci } 378cabdff1aSopenharmony_ci qlevel = get_sbits(&s->gb, 5); 379cabdff1aSopenharmony_ci if (qlevel < 0) { 380cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "qlevel %d not supported, maybe buggy stream\n", 381cabdff1aSopenharmony_ci qlevel); 382cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 383cabdff1aSopenharmony_ci } 384cabdff1aSopenharmony_ci 385cabdff1aSopenharmony_ci for (i = 0; i < pred_order; i++) { 386cabdff1aSopenharmony_ci coeffs[pred_order - i - 1] = get_sbits(&s->gb, coeff_prec); 387cabdff1aSopenharmony_ci } 388cabdff1aSopenharmony_ci 389cabdff1aSopenharmony_ci if ((ret = decode_residuals(s, decoded, pred_order)) < 0) 390cabdff1aSopenharmony_ci return ret; 391cabdff1aSopenharmony_ci 392cabdff1aSopenharmony_ci if ( ( s->buggy_lpc && s->flac_stream_info.bps <= 16) 393cabdff1aSopenharmony_ci || ( !s->buggy_lpc && bps <= 16 394cabdff1aSopenharmony_ci && bps + coeff_prec + av_log2(pred_order) <= 32)) { 395cabdff1aSopenharmony_ci s->dsp.lpc16(decoded, coeffs, pred_order, qlevel, s->blocksize); 396cabdff1aSopenharmony_ci } else { 397cabdff1aSopenharmony_ci s->dsp.lpc32(decoded, coeffs, pred_order, qlevel, s->blocksize); 398cabdff1aSopenharmony_ci if (s->flac_stream_info.bps <= 16) 399cabdff1aSopenharmony_ci lpc_analyze_remodulate(decoded, coeffs, pred_order, qlevel, s->blocksize, bps); 400cabdff1aSopenharmony_ci } 401cabdff1aSopenharmony_ci 402cabdff1aSopenharmony_ci return 0; 403cabdff1aSopenharmony_ci} 404cabdff1aSopenharmony_ci 405cabdff1aSopenharmony_cistatic inline int decode_subframe(FLACContext *s, int channel) 406cabdff1aSopenharmony_ci{ 407cabdff1aSopenharmony_ci int32_t *decoded = s->decoded[channel]; 408cabdff1aSopenharmony_ci int type, wasted = 0; 409cabdff1aSopenharmony_ci int bps = s->flac_stream_info.bps; 410cabdff1aSopenharmony_ci int i, tmp, ret; 411cabdff1aSopenharmony_ci 412cabdff1aSopenharmony_ci if (channel == 0) { 413cabdff1aSopenharmony_ci if (s->ch_mode == FLAC_CHMODE_RIGHT_SIDE) 414cabdff1aSopenharmony_ci bps++; 415cabdff1aSopenharmony_ci } else { 416cabdff1aSopenharmony_ci if (s->ch_mode == FLAC_CHMODE_LEFT_SIDE || s->ch_mode == FLAC_CHMODE_MID_SIDE) 417cabdff1aSopenharmony_ci bps++; 418cabdff1aSopenharmony_ci } 419cabdff1aSopenharmony_ci 420cabdff1aSopenharmony_ci if (get_bits1(&s->gb)) { 421cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "invalid subframe padding\n"); 422cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 423cabdff1aSopenharmony_ci } 424cabdff1aSopenharmony_ci type = get_bits(&s->gb, 6); 425cabdff1aSopenharmony_ci 426cabdff1aSopenharmony_ci if (get_bits1(&s->gb)) { 427cabdff1aSopenharmony_ci int left = get_bits_left(&s->gb); 428cabdff1aSopenharmony_ci if ( left <= 0 || 429cabdff1aSopenharmony_ci (left < bps && !show_bits_long(&s->gb, left)) || 430cabdff1aSopenharmony_ci !show_bits_long(&s->gb, bps)) { 431cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, 432cabdff1aSopenharmony_ci "Invalid number of wasted bits > available bits (%d) - left=%d\n", 433cabdff1aSopenharmony_ci bps, left); 434cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 435cabdff1aSopenharmony_ci } 436cabdff1aSopenharmony_ci wasted = 1 + get_unary(&s->gb, 1, get_bits_left(&s->gb)); 437cabdff1aSopenharmony_ci bps -= wasted; 438cabdff1aSopenharmony_ci } 439cabdff1aSopenharmony_ci if (bps > 32) { 440cabdff1aSopenharmony_ci avpriv_report_missing_feature(s->avctx, "Decorrelated bit depth > 32"); 441cabdff1aSopenharmony_ci return AVERROR_PATCHWELCOME; 442cabdff1aSopenharmony_ci } 443cabdff1aSopenharmony_ci 444cabdff1aSopenharmony_ci//FIXME use av_log2 for types 445cabdff1aSopenharmony_ci if (type == 0) { 446cabdff1aSopenharmony_ci tmp = get_sbits_long(&s->gb, bps); 447cabdff1aSopenharmony_ci for (i = 0; i < s->blocksize; i++) 448cabdff1aSopenharmony_ci decoded[i] = tmp; 449cabdff1aSopenharmony_ci } else if (type == 1) { 450cabdff1aSopenharmony_ci for (i = 0; i < s->blocksize; i++) 451cabdff1aSopenharmony_ci decoded[i] = get_sbits_long(&s->gb, bps); 452cabdff1aSopenharmony_ci } else if ((type >= 8) && (type <= 12)) { 453cabdff1aSopenharmony_ci if ((ret = decode_subframe_fixed(s, decoded, type & ~0x8, bps)) < 0) 454cabdff1aSopenharmony_ci return ret; 455cabdff1aSopenharmony_ci } else if (type >= 32) { 456cabdff1aSopenharmony_ci if ((ret = decode_subframe_lpc(s, decoded, (type & ~0x20)+1, bps)) < 0) 457cabdff1aSopenharmony_ci return ret; 458cabdff1aSopenharmony_ci } else { 459cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "invalid coding type\n"); 460cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 461cabdff1aSopenharmony_ci } 462cabdff1aSopenharmony_ci 463cabdff1aSopenharmony_ci if (wasted && wasted < 32) { 464cabdff1aSopenharmony_ci int i; 465cabdff1aSopenharmony_ci for (i = 0; i < s->blocksize; i++) 466cabdff1aSopenharmony_ci decoded[i] = (unsigned)decoded[i] << wasted; 467cabdff1aSopenharmony_ci } 468cabdff1aSopenharmony_ci 469cabdff1aSopenharmony_ci return 0; 470cabdff1aSopenharmony_ci} 471cabdff1aSopenharmony_ci 472cabdff1aSopenharmony_cistatic int decode_frame(FLACContext *s) 473cabdff1aSopenharmony_ci{ 474cabdff1aSopenharmony_ci int i, ret; 475cabdff1aSopenharmony_ci GetBitContext *gb = &s->gb; 476cabdff1aSopenharmony_ci FLACFrameInfo fi; 477cabdff1aSopenharmony_ci 478cabdff1aSopenharmony_ci if ((ret = ff_flac_decode_frame_header(s->avctx, gb, &fi, 0)) < 0) { 479cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "invalid frame header\n"); 480cabdff1aSopenharmony_ci return ret; 481cabdff1aSopenharmony_ci } 482cabdff1aSopenharmony_ci 483cabdff1aSopenharmony_ci if ( s->flac_stream_info.channels 484cabdff1aSopenharmony_ci && fi.channels != s->flac_stream_info.channels 485cabdff1aSopenharmony_ci && s->got_streaminfo) { 486cabdff1aSopenharmony_ci s->flac_stream_info.channels = fi.channels; 487cabdff1aSopenharmony_ci ff_flac_set_channel_layout(s->avctx, fi.channels); 488cabdff1aSopenharmony_ci ret = allocate_buffers(s); 489cabdff1aSopenharmony_ci if (ret < 0) 490cabdff1aSopenharmony_ci return ret; 491cabdff1aSopenharmony_ci } 492cabdff1aSopenharmony_ci s->flac_stream_info.channels = fi.channels; 493cabdff1aSopenharmony_ci ff_flac_set_channel_layout(s->avctx, fi.channels); 494cabdff1aSopenharmony_ci s->ch_mode = fi.ch_mode; 495cabdff1aSopenharmony_ci 496cabdff1aSopenharmony_ci if (!s->flac_stream_info.bps && !fi.bps) { 497cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "bps not found in STREAMINFO or frame header\n"); 498cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 499cabdff1aSopenharmony_ci } 500cabdff1aSopenharmony_ci if (!fi.bps) { 501cabdff1aSopenharmony_ci fi.bps = s->flac_stream_info.bps; 502cabdff1aSopenharmony_ci } else if (s->flac_stream_info.bps && fi.bps != s->flac_stream_info.bps) { 503cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "switching bps mid-stream is not " 504cabdff1aSopenharmony_ci "supported\n"); 505cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 506cabdff1aSopenharmony_ci } 507cabdff1aSopenharmony_ci 508cabdff1aSopenharmony_ci if (!s->flac_stream_info.bps) { 509cabdff1aSopenharmony_ci s->flac_stream_info.bps = s->avctx->bits_per_raw_sample = fi.bps; 510cabdff1aSopenharmony_ci flac_set_bps(s); 511cabdff1aSopenharmony_ci } 512cabdff1aSopenharmony_ci 513cabdff1aSopenharmony_ci if (!s->flac_stream_info.max_blocksize) 514cabdff1aSopenharmony_ci s->flac_stream_info.max_blocksize = FLAC_MAX_BLOCKSIZE; 515cabdff1aSopenharmony_ci if (fi.blocksize > s->flac_stream_info.max_blocksize) { 516cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "blocksize %d > %d\n", fi.blocksize, 517cabdff1aSopenharmony_ci s->flac_stream_info.max_blocksize); 518cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 519cabdff1aSopenharmony_ci } 520cabdff1aSopenharmony_ci s->blocksize = fi.blocksize; 521cabdff1aSopenharmony_ci 522cabdff1aSopenharmony_ci if (!s->flac_stream_info.samplerate && !fi.samplerate) { 523cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "sample rate not found in STREAMINFO" 524cabdff1aSopenharmony_ci " or frame header\n"); 525cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 526cabdff1aSopenharmony_ci } 527cabdff1aSopenharmony_ci if (fi.samplerate == 0) 528cabdff1aSopenharmony_ci fi.samplerate = s->flac_stream_info.samplerate; 529cabdff1aSopenharmony_ci s->flac_stream_info.samplerate = s->avctx->sample_rate = fi.samplerate; 530cabdff1aSopenharmony_ci 531cabdff1aSopenharmony_ci if (!s->got_streaminfo) { 532cabdff1aSopenharmony_ci ret = allocate_buffers(s); 533cabdff1aSopenharmony_ci if (ret < 0) 534cabdff1aSopenharmony_ci return ret; 535cabdff1aSopenharmony_ci s->got_streaminfo = 1; 536cabdff1aSopenharmony_ci dump_headers(s->avctx, &s->flac_stream_info); 537cabdff1aSopenharmony_ci } 538cabdff1aSopenharmony_ci ff_flacdsp_init(&s->dsp, s->avctx->sample_fmt, 539cabdff1aSopenharmony_ci s->flac_stream_info.channels, s->flac_stream_info.bps); 540cabdff1aSopenharmony_ci 541cabdff1aSopenharmony_ci// dump_headers(s->avctx, &s->flac_stream_info); 542cabdff1aSopenharmony_ci 543cabdff1aSopenharmony_ci /* subframes */ 544cabdff1aSopenharmony_ci for (i = 0; i < s->flac_stream_info.channels; i++) { 545cabdff1aSopenharmony_ci if ((ret = decode_subframe(s, i)) < 0) 546cabdff1aSopenharmony_ci return ret; 547cabdff1aSopenharmony_ci } 548cabdff1aSopenharmony_ci 549cabdff1aSopenharmony_ci align_get_bits(gb); 550cabdff1aSopenharmony_ci 551cabdff1aSopenharmony_ci /* frame footer */ 552cabdff1aSopenharmony_ci skip_bits(gb, 16); /* data crc */ 553cabdff1aSopenharmony_ci 554cabdff1aSopenharmony_ci return 0; 555cabdff1aSopenharmony_ci} 556cabdff1aSopenharmony_ci 557cabdff1aSopenharmony_cistatic int flac_decode_frame(AVCodecContext *avctx, AVFrame *frame, 558cabdff1aSopenharmony_ci int *got_frame_ptr, AVPacket *avpkt) 559cabdff1aSopenharmony_ci{ 560cabdff1aSopenharmony_ci const uint8_t *buf = avpkt->data; 561cabdff1aSopenharmony_ci int buf_size = avpkt->size; 562cabdff1aSopenharmony_ci FLACContext *s = avctx->priv_data; 563cabdff1aSopenharmony_ci int bytes_read = 0; 564cabdff1aSopenharmony_ci int ret; 565cabdff1aSopenharmony_ci 566cabdff1aSopenharmony_ci *got_frame_ptr = 0; 567cabdff1aSopenharmony_ci 568cabdff1aSopenharmony_ci if (s->flac_stream_info.max_framesize == 0) { 569cabdff1aSopenharmony_ci s->flac_stream_info.max_framesize = 570cabdff1aSopenharmony_ci ff_flac_get_max_frame_size(s->flac_stream_info.max_blocksize ? s->flac_stream_info.max_blocksize : FLAC_MAX_BLOCKSIZE, 571cabdff1aSopenharmony_ci FLAC_MAX_CHANNELS, 32); 572cabdff1aSopenharmony_ci } 573cabdff1aSopenharmony_ci 574cabdff1aSopenharmony_ci if (buf_size > 5 && !memcmp(buf, "\177FLAC", 5)) { 575cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_DEBUG, "skipping flac header packet 1\n"); 576cabdff1aSopenharmony_ci return buf_size; 577cabdff1aSopenharmony_ci } 578cabdff1aSopenharmony_ci 579cabdff1aSopenharmony_ci if (buf_size > 0 && (*buf & 0x7F) == FLAC_METADATA_TYPE_VORBIS_COMMENT) { 580cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_DEBUG, "skipping vorbis comment\n"); 581cabdff1aSopenharmony_ci return buf_size; 582cabdff1aSopenharmony_ci } 583cabdff1aSopenharmony_ci 584cabdff1aSopenharmony_ci /* check that there is at least the smallest decodable amount of data. 585cabdff1aSopenharmony_ci this amount corresponds to the smallest valid FLAC frame possible. 586cabdff1aSopenharmony_ci FF F8 69 02 00 00 9A 00 00 34 46 */ 587cabdff1aSopenharmony_ci if (buf_size < FLAC_MIN_FRAME_SIZE) 588cabdff1aSopenharmony_ci return buf_size; 589cabdff1aSopenharmony_ci 590cabdff1aSopenharmony_ci /* check for inline header */ 591cabdff1aSopenharmony_ci if (AV_RB32(buf) == MKBETAG('f','L','a','C')) { 592cabdff1aSopenharmony_ci if (!s->got_streaminfo && (ret = parse_streaminfo(s, buf, buf_size))) { 593cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "invalid header\n"); 594cabdff1aSopenharmony_ci return ret; 595cabdff1aSopenharmony_ci } 596cabdff1aSopenharmony_ci return get_metadata_size(buf, buf_size); 597cabdff1aSopenharmony_ci } 598cabdff1aSopenharmony_ci 599cabdff1aSopenharmony_ci /* decode frame */ 600cabdff1aSopenharmony_ci if ((ret = init_get_bits8(&s->gb, buf, buf_size)) < 0) 601cabdff1aSopenharmony_ci return ret; 602cabdff1aSopenharmony_ci if ((ret = decode_frame(s)) < 0) { 603cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "decode_frame() failed\n"); 604cabdff1aSopenharmony_ci return ret; 605cabdff1aSopenharmony_ci } 606cabdff1aSopenharmony_ci bytes_read = get_bits_count(&s->gb)/8; 607cabdff1aSopenharmony_ci 608cabdff1aSopenharmony_ci if ((s->avctx->err_recognition & (AV_EF_CRCCHECK|AV_EF_COMPLIANT)) && 609cabdff1aSopenharmony_ci av_crc(av_crc_get_table(AV_CRC_16_ANSI), 610cabdff1aSopenharmony_ci 0, buf, bytes_read)) { 611cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "CRC error at PTS %"PRId64"\n", avpkt->pts); 612cabdff1aSopenharmony_ci if (s->avctx->err_recognition & AV_EF_EXPLODE) 613cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 614cabdff1aSopenharmony_ci } 615cabdff1aSopenharmony_ci 616cabdff1aSopenharmony_ci /* get output buffer */ 617cabdff1aSopenharmony_ci frame->nb_samples = s->blocksize; 618cabdff1aSopenharmony_ci if ((ret = ff_thread_get_buffer(avctx, frame, 0)) < 0) 619cabdff1aSopenharmony_ci return ret; 620cabdff1aSopenharmony_ci 621cabdff1aSopenharmony_ci s->dsp.decorrelate[s->ch_mode](frame->data, s->decoded, 622cabdff1aSopenharmony_ci s->flac_stream_info.channels, 623cabdff1aSopenharmony_ci s->blocksize, s->sample_shift); 624cabdff1aSopenharmony_ci 625cabdff1aSopenharmony_ci if (bytes_read > buf_size) { 626cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "overread: %d\n", bytes_read - buf_size); 627cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 628cabdff1aSopenharmony_ci } 629cabdff1aSopenharmony_ci if (bytes_read < buf_size) { 630cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_DEBUG, "underread: %d orig size: %d\n", 631cabdff1aSopenharmony_ci buf_size - bytes_read, buf_size); 632cabdff1aSopenharmony_ci } 633cabdff1aSopenharmony_ci 634cabdff1aSopenharmony_ci *got_frame_ptr = 1; 635cabdff1aSopenharmony_ci 636cabdff1aSopenharmony_ci return bytes_read; 637cabdff1aSopenharmony_ci} 638cabdff1aSopenharmony_ci 639cabdff1aSopenharmony_cistatic av_cold int flac_decode_close(AVCodecContext *avctx) 640cabdff1aSopenharmony_ci{ 641cabdff1aSopenharmony_ci FLACContext *s = avctx->priv_data; 642cabdff1aSopenharmony_ci 643cabdff1aSopenharmony_ci av_freep(&s->decoded_buffer); 644cabdff1aSopenharmony_ci 645cabdff1aSopenharmony_ci return 0; 646cabdff1aSopenharmony_ci} 647cabdff1aSopenharmony_ci 648cabdff1aSopenharmony_cistatic const AVOption options[] = { 649cabdff1aSopenharmony_ci{ "use_buggy_lpc", "emulate old buggy lavc behavior", offsetof(FLACContext, buggy_lpc), AV_OPT_TYPE_BOOL, {.i64 = 0 }, 0, 1, AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_AUDIO_PARAM }, 650cabdff1aSopenharmony_ci{ NULL }, 651cabdff1aSopenharmony_ci}; 652cabdff1aSopenharmony_ci 653cabdff1aSopenharmony_cistatic const AVClass flac_decoder_class = { 654cabdff1aSopenharmony_ci .class_name = "FLAC decoder", 655cabdff1aSopenharmony_ci .item_name = av_default_item_name, 656cabdff1aSopenharmony_ci .option = options, 657cabdff1aSopenharmony_ci .version = LIBAVUTIL_VERSION_INT, 658cabdff1aSopenharmony_ci}; 659cabdff1aSopenharmony_ci 660cabdff1aSopenharmony_ciconst FFCodec ff_flac_decoder = { 661cabdff1aSopenharmony_ci .p.name = "flac", 662cabdff1aSopenharmony_ci .p.long_name = NULL_IF_CONFIG_SMALL("FLAC (Free Lossless Audio Codec)"), 663cabdff1aSopenharmony_ci .p.type = AVMEDIA_TYPE_AUDIO, 664cabdff1aSopenharmony_ci .p.id = AV_CODEC_ID_FLAC, 665cabdff1aSopenharmony_ci .priv_data_size = sizeof(FLACContext), 666cabdff1aSopenharmony_ci .init = flac_decode_init, 667cabdff1aSopenharmony_ci .close = flac_decode_close, 668cabdff1aSopenharmony_ci FF_CODEC_DECODE_CB(flac_decode_frame), 669cabdff1aSopenharmony_ci .p.capabilities = AV_CODEC_CAP_CHANNEL_CONF | 670cabdff1aSopenharmony_ci AV_CODEC_CAP_DR1 | 671cabdff1aSopenharmony_ci AV_CODEC_CAP_FRAME_THREADS, 672cabdff1aSopenharmony_ci .p.sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_S16, 673cabdff1aSopenharmony_ci AV_SAMPLE_FMT_S16P, 674cabdff1aSopenharmony_ci AV_SAMPLE_FMT_S32, 675cabdff1aSopenharmony_ci AV_SAMPLE_FMT_S32P, 676cabdff1aSopenharmony_ci AV_SAMPLE_FMT_NONE }, 677cabdff1aSopenharmony_ci .p.priv_class = &flac_decoder_class, 678cabdff1aSopenharmony_ci .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE, 679cabdff1aSopenharmony_ci}; 680