1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * PCM codecs 3cabdff1aSopenharmony_ci * Copyright (c) 2001 Fabrice Bellard 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 * PCM codecs 25cabdff1aSopenharmony_ci */ 26cabdff1aSopenharmony_ci 27cabdff1aSopenharmony_ci#include "config.h" 28cabdff1aSopenharmony_ci#include "config_components.h" 29cabdff1aSopenharmony_ci#include "libavutil/attributes.h" 30cabdff1aSopenharmony_ci#include "libavutil/float_dsp.h" 31cabdff1aSopenharmony_ci#include "libavutil/reverse.h" 32cabdff1aSopenharmony_ci#include "libavutil/thread.h" 33cabdff1aSopenharmony_ci#include "avcodec.h" 34cabdff1aSopenharmony_ci#include "bytestream.h" 35cabdff1aSopenharmony_ci#include "codec_internal.h" 36cabdff1aSopenharmony_ci#include "encode.h" 37cabdff1aSopenharmony_ci#include "internal.h" 38cabdff1aSopenharmony_ci#include "mathops.h" 39cabdff1aSopenharmony_ci#include "pcm_tablegen.h" 40cabdff1aSopenharmony_ci 41cabdff1aSopenharmony_cistatic av_cold int pcm_encode_init(AVCodecContext *avctx) 42cabdff1aSopenharmony_ci{ 43cabdff1aSopenharmony_ci avctx->frame_size = 0; 44cabdff1aSopenharmony_ci#if !CONFIG_HARDCODED_TABLES 45cabdff1aSopenharmony_ci switch (avctx->codec->id) { 46cabdff1aSopenharmony_ci#define INIT_ONCE(id, name) \ 47cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_ ## id: \ 48cabdff1aSopenharmony_ci if (CONFIG_PCM_ ## id ## _ENCODER) { \ 49cabdff1aSopenharmony_ci static AVOnce init_static_once = AV_ONCE_INIT; \ 50cabdff1aSopenharmony_ci ff_thread_once(&init_static_once, pcm_ ## name ## _tableinit); \ 51cabdff1aSopenharmony_ci } \ 52cabdff1aSopenharmony_ci break 53cabdff1aSopenharmony_ci INIT_ONCE(ALAW, alaw); 54cabdff1aSopenharmony_ci INIT_ONCE(MULAW, ulaw); 55cabdff1aSopenharmony_ci INIT_ONCE(VIDC, vidc); 56cabdff1aSopenharmony_ci default: 57cabdff1aSopenharmony_ci break; 58cabdff1aSopenharmony_ci } 59cabdff1aSopenharmony_ci#endif 60cabdff1aSopenharmony_ci 61cabdff1aSopenharmony_ci avctx->bits_per_coded_sample = av_get_bits_per_sample(avctx->codec->id); 62cabdff1aSopenharmony_ci avctx->block_align = avctx->ch_layout.nb_channels * avctx->bits_per_coded_sample / 8; 63cabdff1aSopenharmony_ci avctx->bit_rate = avctx->block_align * 8LL * avctx->sample_rate; 64cabdff1aSopenharmony_ci 65cabdff1aSopenharmony_ci return 0; 66cabdff1aSopenharmony_ci} 67cabdff1aSopenharmony_ci 68cabdff1aSopenharmony_ci/** 69cabdff1aSopenharmony_ci * Write PCM samples macro 70cabdff1aSopenharmony_ci * @param type Datatype of native machine format 71cabdff1aSopenharmony_ci * @param endian bytestream_put_xxx() suffix 72cabdff1aSopenharmony_ci * @param src Source pointer (variable name) 73cabdff1aSopenharmony_ci * @param dst Destination pointer (variable name) 74cabdff1aSopenharmony_ci * @param n Total number of samples (variable name) 75cabdff1aSopenharmony_ci * @param shift Bitshift (bits) 76cabdff1aSopenharmony_ci * @param offset Sample value offset 77cabdff1aSopenharmony_ci */ 78cabdff1aSopenharmony_ci#define ENCODE(type, endian, src, dst, n, shift, offset) \ 79cabdff1aSopenharmony_ci samples_ ## type = (const type *) src; \ 80cabdff1aSopenharmony_ci for (; n > 0; n--) { \ 81cabdff1aSopenharmony_ci register type v = (*samples_ ## type++ >> shift) + offset; \ 82cabdff1aSopenharmony_ci bytestream_put_ ## endian(&dst, v); \ 83cabdff1aSopenharmony_ci } 84cabdff1aSopenharmony_ci 85cabdff1aSopenharmony_ci#define ENCODE_PLANAR(type, endian, dst, n, shift, offset) \ 86cabdff1aSopenharmony_ci n /= avctx->ch_layout.nb_channels; \ 87cabdff1aSopenharmony_ci for (c = 0; c < avctx->ch_layout.nb_channels; c++) { \ 88cabdff1aSopenharmony_ci int i; \ 89cabdff1aSopenharmony_ci samples_ ## type = (const type *) frame->extended_data[c]; \ 90cabdff1aSopenharmony_ci for (i = n; i > 0; i--) { \ 91cabdff1aSopenharmony_ci register type v = (*samples_ ## type++ >> shift) + offset; \ 92cabdff1aSopenharmony_ci bytestream_put_ ## endian(&dst, v); \ 93cabdff1aSopenharmony_ci } \ 94cabdff1aSopenharmony_ci } 95cabdff1aSopenharmony_ci 96cabdff1aSopenharmony_cistatic int pcm_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, 97cabdff1aSopenharmony_ci const AVFrame *frame, int *got_packet_ptr) 98cabdff1aSopenharmony_ci{ 99cabdff1aSopenharmony_ci int n, c, sample_size, v, ret; 100cabdff1aSopenharmony_ci const short *samples; 101cabdff1aSopenharmony_ci unsigned char *dst; 102cabdff1aSopenharmony_ci const uint8_t *samples_uint8_t; 103cabdff1aSopenharmony_ci const int16_t *samples_int16_t; 104cabdff1aSopenharmony_ci const int32_t *samples_int32_t; 105cabdff1aSopenharmony_ci const int64_t *samples_int64_t; 106cabdff1aSopenharmony_ci const uint16_t *samples_uint16_t; 107cabdff1aSopenharmony_ci const uint32_t *samples_uint32_t; 108cabdff1aSopenharmony_ci 109cabdff1aSopenharmony_ci sample_size = av_get_bits_per_sample(avctx->codec->id) / 8; 110cabdff1aSopenharmony_ci n = frame->nb_samples * avctx->ch_layout.nb_channels; 111cabdff1aSopenharmony_ci samples = (const short *)frame->data[0]; 112cabdff1aSopenharmony_ci 113cabdff1aSopenharmony_ci if ((ret = ff_get_encode_buffer(avctx, avpkt, n * sample_size, 0)) < 0) 114cabdff1aSopenharmony_ci return ret; 115cabdff1aSopenharmony_ci dst = avpkt->data; 116cabdff1aSopenharmony_ci 117cabdff1aSopenharmony_ci switch (avctx->codec->id) { 118cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_U32LE: 119cabdff1aSopenharmony_ci ENCODE(uint32_t, le32, samples, dst, n, 0, 0x80000000) 120cabdff1aSopenharmony_ci break; 121cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_U32BE: 122cabdff1aSopenharmony_ci ENCODE(uint32_t, be32, samples, dst, n, 0, 0x80000000) 123cabdff1aSopenharmony_ci break; 124cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_S24LE: 125cabdff1aSopenharmony_ci ENCODE(int32_t, le24, samples, dst, n, 8, 0) 126cabdff1aSopenharmony_ci break; 127cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_S24LE_PLANAR: 128cabdff1aSopenharmony_ci ENCODE_PLANAR(int32_t, le24, dst, n, 8, 0) 129cabdff1aSopenharmony_ci break; 130cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_S24BE: 131cabdff1aSopenharmony_ci ENCODE(int32_t, be24, samples, dst, n, 8, 0) 132cabdff1aSopenharmony_ci break; 133cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_U24LE: 134cabdff1aSopenharmony_ci ENCODE(uint32_t, le24, samples, dst, n, 8, 0x800000) 135cabdff1aSopenharmony_ci break; 136cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_U24BE: 137cabdff1aSopenharmony_ci ENCODE(uint32_t, be24, samples, dst, n, 8, 0x800000) 138cabdff1aSopenharmony_ci break; 139cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_S24DAUD: 140cabdff1aSopenharmony_ci for (; n > 0; n--) { 141cabdff1aSopenharmony_ci uint32_t tmp = ff_reverse[(*samples >> 8) & 0xff] + 142cabdff1aSopenharmony_ci (ff_reverse[*samples & 0xff] << 8); 143cabdff1aSopenharmony_ci tmp <<= 4; // sync flags would go here 144cabdff1aSopenharmony_ci bytestream_put_be24(&dst, tmp); 145cabdff1aSopenharmony_ci samples++; 146cabdff1aSopenharmony_ci } 147cabdff1aSopenharmony_ci break; 148cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_U16LE: 149cabdff1aSopenharmony_ci ENCODE(uint16_t, le16, samples, dst, n, 0, 0x8000) 150cabdff1aSopenharmony_ci break; 151cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_U16BE: 152cabdff1aSopenharmony_ci ENCODE(uint16_t, be16, samples, dst, n, 0, 0x8000) 153cabdff1aSopenharmony_ci break; 154cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_S8: 155cabdff1aSopenharmony_ci ENCODE(uint8_t, byte, samples, dst, n, 0, -128) 156cabdff1aSopenharmony_ci break; 157cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_S8_PLANAR: 158cabdff1aSopenharmony_ci ENCODE_PLANAR(uint8_t, byte, dst, n, 0, -128) 159cabdff1aSopenharmony_ci break; 160cabdff1aSopenharmony_ci#if HAVE_BIGENDIAN 161cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_S64LE: 162cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_F64LE: 163cabdff1aSopenharmony_ci ENCODE(int64_t, le64, samples, dst, n, 0, 0) 164cabdff1aSopenharmony_ci break; 165cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_S32LE: 166cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_F32LE: 167cabdff1aSopenharmony_ci ENCODE(int32_t, le32, samples, dst, n, 0, 0) 168cabdff1aSopenharmony_ci break; 169cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_S32LE_PLANAR: 170cabdff1aSopenharmony_ci ENCODE_PLANAR(int32_t, le32, dst, n, 0, 0) 171cabdff1aSopenharmony_ci break; 172cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_S16LE: 173cabdff1aSopenharmony_ci ENCODE(int16_t, le16, samples, dst, n, 0, 0) 174cabdff1aSopenharmony_ci break; 175cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_S16LE_PLANAR: 176cabdff1aSopenharmony_ci ENCODE_PLANAR(int16_t, le16, dst, n, 0, 0) 177cabdff1aSopenharmony_ci break; 178cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_F64BE: 179cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_F32BE: 180cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_S64BE: 181cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_S32BE: 182cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_S16BE: 183cabdff1aSopenharmony_ci#else 184cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_S64BE: 185cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_F64BE: 186cabdff1aSopenharmony_ci ENCODE(int64_t, be64, samples, dst, n, 0, 0) 187cabdff1aSopenharmony_ci break; 188cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_F32BE: 189cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_S32BE: 190cabdff1aSopenharmony_ci ENCODE(int32_t, be32, samples, dst, n, 0, 0) 191cabdff1aSopenharmony_ci break; 192cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_S16BE: 193cabdff1aSopenharmony_ci ENCODE(int16_t, be16, samples, dst, n, 0, 0) 194cabdff1aSopenharmony_ci break; 195cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_S16BE_PLANAR: 196cabdff1aSopenharmony_ci ENCODE_PLANAR(int16_t, be16, dst, n, 0, 0) 197cabdff1aSopenharmony_ci break; 198cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_F64LE: 199cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_F32LE: 200cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_S64LE: 201cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_S32LE: 202cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_S16LE: 203cabdff1aSopenharmony_ci#endif /* HAVE_BIGENDIAN */ 204cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_U8: 205cabdff1aSopenharmony_ci memcpy(dst, samples, n * sample_size); 206cabdff1aSopenharmony_ci break; 207cabdff1aSopenharmony_ci#if HAVE_BIGENDIAN 208cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_S16BE_PLANAR: 209cabdff1aSopenharmony_ci#else 210cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_S16LE_PLANAR: 211cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_S32LE_PLANAR: 212cabdff1aSopenharmony_ci#endif /* HAVE_BIGENDIAN */ 213cabdff1aSopenharmony_ci n /= avctx->ch_layout.nb_channels; 214cabdff1aSopenharmony_ci for (c = 0; c < avctx->ch_layout.nb_channels; c++) { 215cabdff1aSopenharmony_ci const uint8_t *src = frame->extended_data[c]; 216cabdff1aSopenharmony_ci bytestream_put_buffer(&dst, src, n * sample_size); 217cabdff1aSopenharmony_ci } 218cabdff1aSopenharmony_ci break; 219cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_ALAW: 220cabdff1aSopenharmony_ci for (; n > 0; n--) { 221cabdff1aSopenharmony_ci v = *samples++; 222cabdff1aSopenharmony_ci *dst++ = linear_to_alaw[(v + 32768) >> 2]; 223cabdff1aSopenharmony_ci } 224cabdff1aSopenharmony_ci break; 225cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_MULAW: 226cabdff1aSopenharmony_ci for (; n > 0; n--) { 227cabdff1aSopenharmony_ci v = *samples++; 228cabdff1aSopenharmony_ci *dst++ = linear_to_ulaw[(v + 32768) >> 2]; 229cabdff1aSopenharmony_ci } 230cabdff1aSopenharmony_ci break; 231cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_VIDC: 232cabdff1aSopenharmony_ci for (; n > 0; n--) { 233cabdff1aSopenharmony_ci v = *samples++; 234cabdff1aSopenharmony_ci *dst++ = linear_to_vidc[(v + 32768) >> 2]; 235cabdff1aSopenharmony_ci } 236cabdff1aSopenharmony_ci break; 237cabdff1aSopenharmony_ci default: 238cabdff1aSopenharmony_ci return -1; 239cabdff1aSopenharmony_ci } 240cabdff1aSopenharmony_ci 241cabdff1aSopenharmony_ci *got_packet_ptr = 1; 242cabdff1aSopenharmony_ci return 0; 243cabdff1aSopenharmony_ci} 244cabdff1aSopenharmony_ci 245cabdff1aSopenharmony_citypedef struct PCMDecode { 246cabdff1aSopenharmony_ci short table[256]; 247cabdff1aSopenharmony_ci void (*vector_fmul_scalar)(float *dst, const float *src, float mul, 248cabdff1aSopenharmony_ci int len); 249cabdff1aSopenharmony_ci float scale; 250cabdff1aSopenharmony_ci} PCMDecode; 251cabdff1aSopenharmony_ci 252cabdff1aSopenharmony_cistatic av_cold int pcm_decode_init(AVCodecContext *avctx) 253cabdff1aSopenharmony_ci{ 254cabdff1aSopenharmony_ci PCMDecode *s = avctx->priv_data; 255cabdff1aSopenharmony_ci AVFloatDSPContext *fdsp; 256cabdff1aSopenharmony_ci int i; 257cabdff1aSopenharmony_ci 258cabdff1aSopenharmony_ci if (avctx->ch_layout.nb_channels <= 0) { 259cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "PCM channels out of bounds\n"); 260cabdff1aSopenharmony_ci return AVERROR(EINVAL); 261cabdff1aSopenharmony_ci } 262cabdff1aSopenharmony_ci 263cabdff1aSopenharmony_ci switch (avctx->codec_id) { 264cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_ALAW: 265cabdff1aSopenharmony_ci for (i = 0; i < 256; i++) 266cabdff1aSopenharmony_ci s->table[i] = alaw2linear(i); 267cabdff1aSopenharmony_ci break; 268cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_MULAW: 269cabdff1aSopenharmony_ci for (i = 0; i < 256; i++) 270cabdff1aSopenharmony_ci s->table[i] = ulaw2linear(i); 271cabdff1aSopenharmony_ci break; 272cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_VIDC: 273cabdff1aSopenharmony_ci for (i = 0; i < 256; i++) 274cabdff1aSopenharmony_ci s->table[i] = vidc2linear(i); 275cabdff1aSopenharmony_ci break; 276cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_F16LE: 277cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_F24LE: 278cabdff1aSopenharmony_ci if (avctx->bits_per_coded_sample < 1 || avctx->bits_per_coded_sample > 24) 279cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 280cabdff1aSopenharmony_ci 281cabdff1aSopenharmony_ci s->scale = 1. / (1 << (avctx->bits_per_coded_sample - 1)); 282cabdff1aSopenharmony_ci fdsp = avpriv_float_dsp_alloc(0); 283cabdff1aSopenharmony_ci if (!fdsp) 284cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 285cabdff1aSopenharmony_ci s->vector_fmul_scalar = fdsp->vector_fmul_scalar; 286cabdff1aSopenharmony_ci av_free(fdsp); 287cabdff1aSopenharmony_ci break; 288cabdff1aSopenharmony_ci default: 289cabdff1aSopenharmony_ci break; 290cabdff1aSopenharmony_ci } 291cabdff1aSopenharmony_ci 292cabdff1aSopenharmony_ci avctx->sample_fmt = avctx->codec->sample_fmts[0]; 293cabdff1aSopenharmony_ci 294cabdff1aSopenharmony_ci if (avctx->sample_fmt == AV_SAMPLE_FMT_S32) 295cabdff1aSopenharmony_ci avctx->bits_per_raw_sample = av_get_bits_per_sample(avctx->codec_id); 296cabdff1aSopenharmony_ci 297cabdff1aSopenharmony_ci return 0; 298cabdff1aSopenharmony_ci} 299cabdff1aSopenharmony_ci 300cabdff1aSopenharmony_ci/** 301cabdff1aSopenharmony_ci * Read PCM samples macro 302cabdff1aSopenharmony_ci * @param size Data size of native machine format 303cabdff1aSopenharmony_ci * @param endian bytestream_get_xxx() endian suffix 304cabdff1aSopenharmony_ci * @param src Source pointer (variable name) 305cabdff1aSopenharmony_ci * @param dst Destination pointer (variable name) 306cabdff1aSopenharmony_ci * @param n Total number of samples (variable name) 307cabdff1aSopenharmony_ci * @param shift Bitshift (bits) 308cabdff1aSopenharmony_ci * @param offset Sample value offset 309cabdff1aSopenharmony_ci */ 310cabdff1aSopenharmony_ci#define DECODE(size, endian, src, dst, n, shift, offset) \ 311cabdff1aSopenharmony_ci for (; n > 0; n--) { \ 312cabdff1aSopenharmony_ci uint ## size ## _t v = bytestream_get_ ## endian(&src); \ 313cabdff1aSopenharmony_ci AV_WN ## size ## A(dst, (uint ## size ## _t)(v - offset) << shift); \ 314cabdff1aSopenharmony_ci dst += size / 8; \ 315cabdff1aSopenharmony_ci } 316cabdff1aSopenharmony_ci 317cabdff1aSopenharmony_ci#define DECODE_PLANAR(size, endian, src, dst, n, shift, offset) \ 318cabdff1aSopenharmony_ci n /= channels; \ 319cabdff1aSopenharmony_ci for (c = 0; c < avctx->ch_layout.nb_channels; c++) { \ 320cabdff1aSopenharmony_ci int i; \ 321cabdff1aSopenharmony_ci dst = frame->extended_data[c]; \ 322cabdff1aSopenharmony_ci for (i = n; i > 0; i--) { \ 323cabdff1aSopenharmony_ci uint ## size ## _t v = bytestream_get_ ## endian(&src); \ 324cabdff1aSopenharmony_ci AV_WN ## size ## A(dst, (uint ## size ##_t)(v - offset) << shift); \ 325cabdff1aSopenharmony_ci dst += size / 8; \ 326cabdff1aSopenharmony_ci } \ 327cabdff1aSopenharmony_ci } 328cabdff1aSopenharmony_ci 329cabdff1aSopenharmony_cistatic int pcm_decode_frame(AVCodecContext *avctx, AVFrame *frame, 330cabdff1aSopenharmony_ci int *got_frame_ptr, AVPacket *avpkt) 331cabdff1aSopenharmony_ci{ 332cabdff1aSopenharmony_ci const uint8_t *src = avpkt->data; 333cabdff1aSopenharmony_ci int buf_size = avpkt->size; 334cabdff1aSopenharmony_ci PCMDecode *s = avctx->priv_data; 335cabdff1aSopenharmony_ci int channels = avctx->ch_layout.nb_channels; 336cabdff1aSopenharmony_ci int sample_size, c, n, ret, samples_per_block; 337cabdff1aSopenharmony_ci uint8_t *samples; 338cabdff1aSopenharmony_ci int32_t *dst_int32_t; 339cabdff1aSopenharmony_ci 340cabdff1aSopenharmony_ci sample_size = av_get_bits_per_sample(avctx->codec_id) / 8; 341cabdff1aSopenharmony_ci 342cabdff1aSopenharmony_ci /* av_get_bits_per_sample returns 0 for AV_CODEC_ID_PCM_DVD */ 343cabdff1aSopenharmony_ci samples_per_block = 1; 344cabdff1aSopenharmony_ci if (avctx->codec_id == AV_CODEC_ID_PCM_LXF) { 345cabdff1aSopenharmony_ci /* we process 40-bit blocks per channel for LXF */ 346cabdff1aSopenharmony_ci samples_per_block = 2; 347cabdff1aSopenharmony_ci sample_size = 5; 348cabdff1aSopenharmony_ci } 349cabdff1aSopenharmony_ci 350cabdff1aSopenharmony_ci if (sample_size == 0) { 351cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "Invalid sample_size\n"); 352cabdff1aSopenharmony_ci return AVERROR(EINVAL); 353cabdff1aSopenharmony_ci } 354cabdff1aSopenharmony_ci 355cabdff1aSopenharmony_ci if (channels == 0) { 356cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "Invalid number of channels\n"); 357cabdff1aSopenharmony_ci return AVERROR(EINVAL); 358cabdff1aSopenharmony_ci } 359cabdff1aSopenharmony_ci 360cabdff1aSopenharmony_ci if (avctx->codec_id != avctx->codec->id) { 361cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "codec ids mismatch\n"); 362cabdff1aSopenharmony_ci return AVERROR(EINVAL); 363cabdff1aSopenharmony_ci } 364cabdff1aSopenharmony_ci 365cabdff1aSopenharmony_ci n = channels * sample_size; 366cabdff1aSopenharmony_ci 367cabdff1aSopenharmony_ci if (n && buf_size % n) { 368cabdff1aSopenharmony_ci if (buf_size < n) { 369cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, 370cabdff1aSopenharmony_ci "Invalid PCM packet, data has size %d but at least a size of %d was expected\n", 371cabdff1aSopenharmony_ci buf_size, n); 372cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 373cabdff1aSopenharmony_ci } else 374cabdff1aSopenharmony_ci buf_size -= buf_size % n; 375cabdff1aSopenharmony_ci } 376cabdff1aSopenharmony_ci 377cabdff1aSopenharmony_ci n = buf_size / sample_size; 378cabdff1aSopenharmony_ci 379cabdff1aSopenharmony_ci /* get output buffer */ 380cabdff1aSopenharmony_ci frame->nb_samples = n * samples_per_block / channels; 381cabdff1aSopenharmony_ci if ((ret = ff_get_buffer(avctx, frame, 0)) < 0) 382cabdff1aSopenharmony_ci return ret; 383cabdff1aSopenharmony_ci samples = frame->data[0]; 384cabdff1aSopenharmony_ci 385cabdff1aSopenharmony_ci switch (avctx->codec_id) { 386cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_U32LE: 387cabdff1aSopenharmony_ci DECODE(32, le32, src, samples, n, 0, 0x80000000) 388cabdff1aSopenharmony_ci break; 389cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_U32BE: 390cabdff1aSopenharmony_ci DECODE(32, be32, src, samples, n, 0, 0x80000000) 391cabdff1aSopenharmony_ci break; 392cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_S24LE: 393cabdff1aSopenharmony_ci DECODE(32, le24, src, samples, n, 8, 0) 394cabdff1aSopenharmony_ci break; 395cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_S24LE_PLANAR: 396cabdff1aSopenharmony_ci DECODE_PLANAR(32, le24, src, samples, n, 8, 0); 397cabdff1aSopenharmony_ci break; 398cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_S24BE: 399cabdff1aSopenharmony_ci DECODE(32, be24, src, samples, n, 8, 0) 400cabdff1aSopenharmony_ci break; 401cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_U24LE: 402cabdff1aSopenharmony_ci DECODE(32, le24, src, samples, n, 8, 0x800000) 403cabdff1aSopenharmony_ci break; 404cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_U24BE: 405cabdff1aSopenharmony_ci DECODE(32, be24, src, samples, n, 8, 0x800000) 406cabdff1aSopenharmony_ci break; 407cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_S24DAUD: 408cabdff1aSopenharmony_ci for (; n > 0; n--) { 409cabdff1aSopenharmony_ci uint32_t v = bytestream_get_be24(&src); 410cabdff1aSopenharmony_ci v >>= 4; // sync flags are here 411cabdff1aSopenharmony_ci AV_WN16A(samples, ff_reverse[(v >> 8) & 0xff] + 412cabdff1aSopenharmony_ci (ff_reverse[v & 0xff] << 8)); 413cabdff1aSopenharmony_ci samples += 2; 414cabdff1aSopenharmony_ci } 415cabdff1aSopenharmony_ci break; 416cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_U16LE: 417cabdff1aSopenharmony_ci DECODE(16, le16, src, samples, n, 0, 0x8000) 418cabdff1aSopenharmony_ci break; 419cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_U16BE: 420cabdff1aSopenharmony_ci DECODE(16, be16, src, samples, n, 0, 0x8000) 421cabdff1aSopenharmony_ci break; 422cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_S8: 423cabdff1aSopenharmony_ci for (; n > 0; n--) 424cabdff1aSopenharmony_ci *samples++ = *src++ + 128; 425cabdff1aSopenharmony_ci break; 426cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_SGA: 427cabdff1aSopenharmony_ci for (; n > 0; n--) { 428cabdff1aSopenharmony_ci int sign = *src >> 7; 429cabdff1aSopenharmony_ci int magn = *src & 0x7f; 430cabdff1aSopenharmony_ci *samples++ = sign ? 128 - magn : 128 + magn; 431cabdff1aSopenharmony_ci src++; 432cabdff1aSopenharmony_ci } 433cabdff1aSopenharmony_ci break; 434cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_S8_PLANAR: 435cabdff1aSopenharmony_ci n /= avctx->ch_layout.nb_channels; 436cabdff1aSopenharmony_ci for (c = 0; c < avctx->ch_layout.nb_channels; c++) { 437cabdff1aSopenharmony_ci int i; 438cabdff1aSopenharmony_ci samples = frame->extended_data[c]; 439cabdff1aSopenharmony_ci for (i = n; i > 0; i--) 440cabdff1aSopenharmony_ci *samples++ = *src++ + 128; 441cabdff1aSopenharmony_ci } 442cabdff1aSopenharmony_ci break; 443cabdff1aSopenharmony_ci#if HAVE_BIGENDIAN 444cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_S64LE: 445cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_F64LE: 446cabdff1aSopenharmony_ci DECODE(64, le64, src, samples, n, 0, 0) 447cabdff1aSopenharmony_ci break; 448cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_S32LE: 449cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_F32LE: 450cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_F24LE: 451cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_F16LE: 452cabdff1aSopenharmony_ci DECODE(32, le32, src, samples, n, 0, 0) 453cabdff1aSopenharmony_ci break; 454cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_S32LE_PLANAR: 455cabdff1aSopenharmony_ci DECODE_PLANAR(32, le32, src, samples, n, 0, 0); 456cabdff1aSopenharmony_ci break; 457cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_S16LE: 458cabdff1aSopenharmony_ci DECODE(16, le16, src, samples, n, 0, 0) 459cabdff1aSopenharmony_ci break; 460cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_S16LE_PLANAR: 461cabdff1aSopenharmony_ci DECODE_PLANAR(16, le16, src, samples, n, 0, 0); 462cabdff1aSopenharmony_ci break; 463cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_F64BE: 464cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_F32BE: 465cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_S64BE: 466cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_S32BE: 467cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_S16BE: 468cabdff1aSopenharmony_ci#else 469cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_S64BE: 470cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_F64BE: 471cabdff1aSopenharmony_ci DECODE(64, be64, src, samples, n, 0, 0) 472cabdff1aSopenharmony_ci break; 473cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_F32BE: 474cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_S32BE: 475cabdff1aSopenharmony_ci DECODE(32, be32, src, samples, n, 0, 0) 476cabdff1aSopenharmony_ci break; 477cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_S16BE: 478cabdff1aSopenharmony_ci DECODE(16, be16, src, samples, n, 0, 0) 479cabdff1aSopenharmony_ci break; 480cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_S16BE_PLANAR: 481cabdff1aSopenharmony_ci DECODE_PLANAR(16, be16, src, samples, n, 0, 0); 482cabdff1aSopenharmony_ci break; 483cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_F64LE: 484cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_F32LE: 485cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_F24LE: 486cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_F16LE: 487cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_S64LE: 488cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_S32LE: 489cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_S16LE: 490cabdff1aSopenharmony_ci#endif /* HAVE_BIGENDIAN */ 491cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_U8: 492cabdff1aSopenharmony_ci memcpy(samples, src, n * sample_size); 493cabdff1aSopenharmony_ci break; 494cabdff1aSopenharmony_ci#if HAVE_BIGENDIAN 495cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_S16BE_PLANAR: 496cabdff1aSopenharmony_ci#else 497cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_S16LE_PLANAR: 498cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_S32LE_PLANAR: 499cabdff1aSopenharmony_ci#endif /* HAVE_BIGENDIAN */ 500cabdff1aSopenharmony_ci n /= avctx->ch_layout.nb_channels; 501cabdff1aSopenharmony_ci for (c = 0; c < avctx->ch_layout.nb_channels; c++) { 502cabdff1aSopenharmony_ci samples = frame->extended_data[c]; 503cabdff1aSopenharmony_ci bytestream_get_buffer(&src, samples, n * sample_size); 504cabdff1aSopenharmony_ci } 505cabdff1aSopenharmony_ci break; 506cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_ALAW: 507cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_MULAW: 508cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_VIDC: 509cabdff1aSopenharmony_ci for (; n > 0; n--) { 510cabdff1aSopenharmony_ci AV_WN16A(samples, s->table[*src++]); 511cabdff1aSopenharmony_ci samples += 2; 512cabdff1aSopenharmony_ci } 513cabdff1aSopenharmony_ci break; 514cabdff1aSopenharmony_ci case AV_CODEC_ID_PCM_LXF: 515cabdff1aSopenharmony_ci { 516cabdff1aSopenharmony_ci int i; 517cabdff1aSopenharmony_ci n /= channels; 518cabdff1aSopenharmony_ci for (c = 0; c < channels; c++) { 519cabdff1aSopenharmony_ci dst_int32_t = (int32_t *)frame->extended_data[c]; 520cabdff1aSopenharmony_ci for (i = 0; i < n; i++) { 521cabdff1aSopenharmony_ci // extract low 20 bits and expand to 32 bits 522cabdff1aSopenharmony_ci *dst_int32_t++ = ((uint32_t)src[2]<<28) | 523cabdff1aSopenharmony_ci (src[1] << 20) | 524cabdff1aSopenharmony_ci (src[0] << 12) | 525cabdff1aSopenharmony_ci ((src[2] & 0x0F) << 8) | 526cabdff1aSopenharmony_ci src[1]; 527cabdff1aSopenharmony_ci // extract high 20 bits and expand to 32 bits 528cabdff1aSopenharmony_ci *dst_int32_t++ = ((uint32_t)src[4]<<24) | 529cabdff1aSopenharmony_ci (src[3] << 16) | 530cabdff1aSopenharmony_ci ((src[2] & 0xF0) << 8) | 531cabdff1aSopenharmony_ci (src[4] << 4) | 532cabdff1aSopenharmony_ci (src[3] >> 4); 533cabdff1aSopenharmony_ci src += 5; 534cabdff1aSopenharmony_ci } 535cabdff1aSopenharmony_ci } 536cabdff1aSopenharmony_ci break; 537cabdff1aSopenharmony_ci } 538cabdff1aSopenharmony_ci default: 539cabdff1aSopenharmony_ci return -1; 540cabdff1aSopenharmony_ci } 541cabdff1aSopenharmony_ci 542cabdff1aSopenharmony_ci if (avctx->codec_id == AV_CODEC_ID_PCM_F16LE || 543cabdff1aSopenharmony_ci avctx->codec_id == AV_CODEC_ID_PCM_F24LE) { 544cabdff1aSopenharmony_ci s->vector_fmul_scalar((float *)frame->extended_data[0], 545cabdff1aSopenharmony_ci (const float *)frame->extended_data[0], 546cabdff1aSopenharmony_ci s->scale, FFALIGN(frame->nb_samples * avctx->ch_layout.nb_channels, 4)); 547cabdff1aSopenharmony_ci emms_c(); 548cabdff1aSopenharmony_ci } 549cabdff1aSopenharmony_ci 550cabdff1aSopenharmony_ci *got_frame_ptr = 1; 551cabdff1aSopenharmony_ci 552cabdff1aSopenharmony_ci return buf_size; 553cabdff1aSopenharmony_ci} 554cabdff1aSopenharmony_ci 555cabdff1aSopenharmony_ci#define PCM_ENCODER_0(id_, sample_fmt_, name_, long_name_) 556cabdff1aSopenharmony_ci#define PCM_ENCODER_1(id_, sample_fmt_, name_, long_name_) \ 557cabdff1aSopenharmony_ciconst FFCodec ff_ ## name_ ## _encoder = { \ 558cabdff1aSopenharmony_ci .p.name = #name_, \ 559cabdff1aSopenharmony_ci .p.long_name = NULL_IF_CONFIG_SMALL(long_name_), \ 560cabdff1aSopenharmony_ci .p.type = AVMEDIA_TYPE_AUDIO, \ 561cabdff1aSopenharmony_ci .p.id = AV_CODEC_ID_ ## id_, \ 562cabdff1aSopenharmony_ci .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_VARIABLE_FRAME_SIZE, \ 563cabdff1aSopenharmony_ci .init = pcm_encode_init, \ 564cabdff1aSopenharmony_ci FF_CODEC_ENCODE_CB(pcm_encode_frame), \ 565cabdff1aSopenharmony_ci .p.sample_fmts = (const enum AVSampleFormat[]){ sample_fmt_, \ 566cabdff1aSopenharmony_ci AV_SAMPLE_FMT_NONE }, \ 567cabdff1aSopenharmony_ci .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE, \ 568cabdff1aSopenharmony_ci} 569cabdff1aSopenharmony_ci 570cabdff1aSopenharmony_ci#define PCM_ENCODER_2(cf, id, sample_fmt, name, long_name) \ 571cabdff1aSopenharmony_ci PCM_ENCODER_ ## cf(id, sample_fmt, name, long_name) 572cabdff1aSopenharmony_ci#define PCM_ENCODER_3(cf, id, sample_fmt, name, long_name) \ 573cabdff1aSopenharmony_ci PCM_ENCODER_2(cf, id, sample_fmt, name, long_name) 574cabdff1aSopenharmony_ci#define PCM_ENCODER(id, sample_fmt, name, long_name) \ 575cabdff1aSopenharmony_ci PCM_ENCODER_3(CONFIG_ ## id ## _ENCODER, id, sample_fmt, name, long_name) 576cabdff1aSopenharmony_ci 577cabdff1aSopenharmony_ci#define PCM_DECODER_0(id, sample_fmt, name, long_name) 578cabdff1aSopenharmony_ci#define PCM_DECODER_1(id_, sample_fmt_, name_, long_name_) \ 579cabdff1aSopenharmony_ciconst FFCodec ff_ ## name_ ## _decoder = { \ 580cabdff1aSopenharmony_ci .p.name = #name_, \ 581cabdff1aSopenharmony_ci .p.long_name = NULL_IF_CONFIG_SMALL(long_name_), \ 582cabdff1aSopenharmony_ci .p.type = AVMEDIA_TYPE_AUDIO, \ 583cabdff1aSopenharmony_ci .p.id = AV_CODEC_ID_ ## id_, \ 584cabdff1aSopenharmony_ci .priv_data_size = sizeof(PCMDecode), \ 585cabdff1aSopenharmony_ci .init = pcm_decode_init, \ 586cabdff1aSopenharmony_ci FF_CODEC_DECODE_CB(pcm_decode_frame), \ 587cabdff1aSopenharmony_ci .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_PARAM_CHANGE, \ 588cabdff1aSopenharmony_ci .p.sample_fmts = (const enum AVSampleFormat[]){ sample_fmt_, \ 589cabdff1aSopenharmony_ci AV_SAMPLE_FMT_NONE }, \ 590cabdff1aSopenharmony_ci .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE, \ 591cabdff1aSopenharmony_ci} 592cabdff1aSopenharmony_ci 593cabdff1aSopenharmony_ci#define PCM_DECODER_2(cf, id, sample_fmt, name, long_name) \ 594cabdff1aSopenharmony_ci PCM_DECODER_ ## cf(id, sample_fmt, name, long_name) 595cabdff1aSopenharmony_ci#define PCM_DECODER_3(cf, id, sample_fmt, name, long_name) \ 596cabdff1aSopenharmony_ci PCM_DECODER_2(cf, id, sample_fmt, name, long_name) 597cabdff1aSopenharmony_ci#define PCM_DECODER(id, sample_fmt, name, long_name) \ 598cabdff1aSopenharmony_ci PCM_DECODER_3(CONFIG_ ## id ## _DECODER, id, sample_fmt, name, long_name) 599cabdff1aSopenharmony_ci 600cabdff1aSopenharmony_ci#define PCM_CODEC(id, sample_fmt_, name, long_name_) \ 601cabdff1aSopenharmony_ci PCM_ENCODER(id, sample_fmt_, name, long_name_); \ 602cabdff1aSopenharmony_ci PCM_DECODER(id, sample_fmt_, name, long_name_) 603cabdff1aSopenharmony_ci 604cabdff1aSopenharmony_ci/* Note: Do not forget to add new entries to the Makefile as well. */ 605cabdff1aSopenharmony_ciPCM_CODEC (PCM_ALAW, AV_SAMPLE_FMT_S16, pcm_alaw, "PCM A-law / G.711 A-law"); 606cabdff1aSopenharmony_ciPCM_DECODER(PCM_F16LE, AV_SAMPLE_FMT_FLT, pcm_f16le, "PCM 16.8 floating point little-endian"); 607cabdff1aSopenharmony_ciPCM_DECODER(PCM_F24LE, AV_SAMPLE_FMT_FLT, pcm_f24le, "PCM 24.0 floating point little-endian"); 608cabdff1aSopenharmony_ciPCM_CODEC (PCM_F32BE, AV_SAMPLE_FMT_FLT, pcm_f32be, "PCM 32-bit floating point big-endian"); 609cabdff1aSopenharmony_ciPCM_CODEC (PCM_F32LE, AV_SAMPLE_FMT_FLT, pcm_f32le, "PCM 32-bit floating point little-endian"); 610cabdff1aSopenharmony_ciPCM_CODEC (PCM_F64BE, AV_SAMPLE_FMT_DBL, pcm_f64be, "PCM 64-bit floating point big-endian"); 611cabdff1aSopenharmony_ciPCM_CODEC (PCM_F64LE, AV_SAMPLE_FMT_DBL, pcm_f64le, "PCM 64-bit floating point little-endian"); 612cabdff1aSopenharmony_ciPCM_DECODER(PCM_LXF, AV_SAMPLE_FMT_S32P,pcm_lxf, "PCM signed 20-bit little-endian planar"); 613cabdff1aSopenharmony_ciPCM_CODEC (PCM_MULAW, AV_SAMPLE_FMT_S16, pcm_mulaw, "PCM mu-law / G.711 mu-law"); 614cabdff1aSopenharmony_ciPCM_CODEC (PCM_S8, AV_SAMPLE_FMT_U8, pcm_s8, "PCM signed 8-bit"); 615cabdff1aSopenharmony_ciPCM_CODEC (PCM_S8_PLANAR, AV_SAMPLE_FMT_U8P, pcm_s8_planar, "PCM signed 8-bit planar"); 616cabdff1aSopenharmony_ciPCM_CODEC (PCM_S16BE, AV_SAMPLE_FMT_S16, pcm_s16be, "PCM signed 16-bit big-endian"); 617cabdff1aSopenharmony_ciPCM_CODEC (PCM_S16BE_PLANAR, AV_SAMPLE_FMT_S16P,pcm_s16be_planar, "PCM signed 16-bit big-endian planar"); 618cabdff1aSopenharmony_ciPCM_CODEC (PCM_S16LE, AV_SAMPLE_FMT_S16, pcm_s16le, "PCM signed 16-bit little-endian"); 619cabdff1aSopenharmony_ciPCM_CODEC (PCM_S16LE_PLANAR, AV_SAMPLE_FMT_S16P,pcm_s16le_planar, "PCM signed 16-bit little-endian planar"); 620cabdff1aSopenharmony_ciPCM_CODEC (PCM_S24BE, AV_SAMPLE_FMT_S32, pcm_s24be, "PCM signed 24-bit big-endian"); 621cabdff1aSopenharmony_ciPCM_CODEC (PCM_S24DAUD, AV_SAMPLE_FMT_S16, pcm_s24daud, "PCM D-Cinema audio signed 24-bit"); 622cabdff1aSopenharmony_ciPCM_CODEC (PCM_S24LE, AV_SAMPLE_FMT_S32, pcm_s24le, "PCM signed 24-bit little-endian"); 623cabdff1aSopenharmony_ciPCM_CODEC (PCM_S24LE_PLANAR, AV_SAMPLE_FMT_S32P,pcm_s24le_planar, "PCM signed 24-bit little-endian planar"); 624cabdff1aSopenharmony_ciPCM_CODEC (PCM_S32BE, AV_SAMPLE_FMT_S32, pcm_s32be, "PCM signed 32-bit big-endian"); 625cabdff1aSopenharmony_ciPCM_CODEC (PCM_S32LE, AV_SAMPLE_FMT_S32, pcm_s32le, "PCM signed 32-bit little-endian"); 626cabdff1aSopenharmony_ciPCM_CODEC (PCM_S32LE_PLANAR, AV_SAMPLE_FMT_S32P,pcm_s32le_planar, "PCM signed 32-bit little-endian planar"); 627cabdff1aSopenharmony_ciPCM_CODEC (PCM_U8, AV_SAMPLE_FMT_U8, pcm_u8, "PCM unsigned 8-bit"); 628cabdff1aSopenharmony_ciPCM_CODEC (PCM_U16BE, AV_SAMPLE_FMT_S16, pcm_u16be, "PCM unsigned 16-bit big-endian"); 629cabdff1aSopenharmony_ciPCM_CODEC (PCM_U16LE, AV_SAMPLE_FMT_S16, pcm_u16le, "PCM unsigned 16-bit little-endian"); 630cabdff1aSopenharmony_ciPCM_CODEC (PCM_U24BE, AV_SAMPLE_FMT_S32, pcm_u24be, "PCM unsigned 24-bit big-endian"); 631cabdff1aSopenharmony_ciPCM_CODEC (PCM_U24LE, AV_SAMPLE_FMT_S32, pcm_u24le, "PCM unsigned 24-bit little-endian"); 632cabdff1aSopenharmony_ciPCM_CODEC (PCM_U32BE, AV_SAMPLE_FMT_S32, pcm_u32be, "PCM unsigned 32-bit big-endian"); 633cabdff1aSopenharmony_ciPCM_CODEC (PCM_U32LE, AV_SAMPLE_FMT_S32, pcm_u32le, "PCM unsigned 32-bit little-endian"); 634cabdff1aSopenharmony_ciPCM_CODEC (PCM_S64BE, AV_SAMPLE_FMT_S64, pcm_s64be, "PCM signed 64-bit big-endian"); 635cabdff1aSopenharmony_ciPCM_CODEC (PCM_S64LE, AV_SAMPLE_FMT_S64, pcm_s64le, "PCM signed 64-bit little-endian"); 636cabdff1aSopenharmony_ciPCM_CODEC (PCM_VIDC, AV_SAMPLE_FMT_S16, pcm_vidc, "PCM Archimedes VIDC"); 637cabdff1aSopenharmony_ciPCM_DECODER(PCM_SGA, AV_SAMPLE_FMT_U8, pcm_sga, "PCM SGA"); 638