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