xref: /third_party/ffmpeg/libavcodec/pcm.c (revision cabdff1a)
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