3 * Copyright (c) 2001 Fabrice Bellard.
5 * This file is part of FFmpeg.
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
28 #include "bitstream.h" // for ff_reverse
29 #include "bytestream.h"
31 #define MAX_CHANNELS 64
33 /* from g711.c by SUN microsystems (unrestricted use) */
35 #define SIGN_BIT (0x80) /* Sign bit for a A-law byte. */
36 #define QUANT_MASK (0xf) /* Quantization field mask. */
37 #define NSEGS (8) /* Number of A-law segments. */
38 #define SEG_SHIFT (4) /* Left shift for segment number. */
39 #define SEG_MASK (0x70) /* Segment field mask. */
41 #define BIAS (0x84) /* Bias for linear code. */
44 * alaw2linear() - Convert an A-law value to 16-bit linear PCM
47 static int alaw2linear(unsigned char a_val
)
54 t
= a_val
& QUANT_MASK
;
55 seg
= ((unsigned)a_val
& SEG_MASK
) >> SEG_SHIFT
;
56 if(seg
) t
= (t
+ t
+ 1 + 32) << (seg
+ 2);
57 else t
= (t
+ t
+ 1 ) << 3;
59 return ((a_val
& SIGN_BIT
) ? t
: -t
);
62 static int ulaw2linear(unsigned char u_val
)
66 /* Complement to obtain normal u-law value. */
70 * Extract and bias the quantization bits. Then
71 * shift up by the segment number and subtract out the bias.
73 t
= ((u_val
& QUANT_MASK
) << 3) + BIAS
;
74 t
<<= ((unsigned)u_val
& SEG_MASK
) >> SEG_SHIFT
;
76 return ((u_val
& SIGN_BIT
) ? (BIAS
- t
) : (t
- BIAS
));
79 /* 16384 entries per table */
80 static uint8_t linear_to_alaw
[16384];
81 static uint8_t linear_to_ulaw
[16384];
83 static void build_xlaw_table(uint8_t *linear_to_xlaw
,
84 int (*xlaw2linear
)(unsigned char),
92 v1
= xlaw2linear(i
^ mask
);
93 v2
= xlaw2linear((i
+ 1) ^ mask
);
94 v
= (v1
+ v2
+ 4) >> 3;
99 linear_to_xlaw
[8192 + j
] = (i
^ mask
);
101 linear_to_xlaw
[8192 - j
] = (i
^ (mask
^ 0x80));
104 linear_to_xlaw
[0] = linear_to_xlaw
[1];
107 static int pcm_encode_init(AVCodecContext
*avctx
)
109 avctx
->frame_size
= 1;
110 switch(avctx
->codec
->id
) {
111 case CODEC_ID_PCM_ALAW
:
112 build_xlaw_table(linear_to_alaw
, alaw2linear
, 0xd5);
114 case CODEC_ID_PCM_MULAW
:
115 build_xlaw_table(linear_to_ulaw
, ulaw2linear
, 0xff);
121 switch(avctx
->codec
->id
) {
122 case CODEC_ID_PCM_S32LE
:
123 case CODEC_ID_PCM_S32BE
:
124 case CODEC_ID_PCM_U32LE
:
125 case CODEC_ID_PCM_U32BE
:
126 avctx
->block_align
= 4 * avctx
->channels
;
128 case CODEC_ID_PCM_S24LE
:
129 case CODEC_ID_PCM_S24BE
:
130 case CODEC_ID_PCM_U24LE
:
131 case CODEC_ID_PCM_U24BE
:
132 case CODEC_ID_PCM_S24DAUD
:
133 avctx
->block_align
= 3 * avctx
->channels
;
135 case CODEC_ID_PCM_S16LE
:
136 case CODEC_ID_PCM_S16BE
:
137 case CODEC_ID_PCM_U16LE
:
138 case CODEC_ID_PCM_U16BE
:
139 avctx
->block_align
= 2 * avctx
->channels
;
141 case CODEC_ID_PCM_S8
:
142 case CODEC_ID_PCM_U8
:
143 case CODEC_ID_PCM_MULAW
:
144 case CODEC_ID_PCM_ALAW
:
145 avctx
->block_align
= avctx
->channels
;
151 avctx
->coded_frame
= avcodec_alloc_frame();
152 avctx
->coded_frame
->key_frame
= 1;
157 static int pcm_encode_close(AVCodecContext
*avctx
)
159 av_freep(&avctx
->coded_frame
);
165 * \brief convert samples from 16 bit
166 * \param bps byte per sample for the destination format, must be >= 2
167 * \param le 0 for big-, 1 for little-endian
168 * \param us 0 for signed, 1 for unsigned output
169 * \param samples input samples
170 * \param dst output samples
171 * \param n number of samples in samples buffer.
173 static inline void encode_from16(int bps
, int le
, int us
,
174 short **samples
, uint8_t **dst
, int n
) {
175 int usum
= us
? 0x8000 : 0;
177 memset(*dst
, 0, n
* bps
);
178 if (le
) *dst
+= bps
- 2;
180 register int v
= *(*samples
)++;
182 if (le
) AV_WL16(*dst
, v
);
183 else AV_WB16(*dst
, v
);
186 if (le
) *dst
-= bps
- 2;
189 static int pcm_encode_frame(AVCodecContext
*avctx
,
190 unsigned char *frame
, int buf_size
, void *data
)
192 int n
, sample_size
, v
;
196 switch(avctx
->codec
->id
) {
197 case CODEC_ID_PCM_S32LE
:
198 case CODEC_ID_PCM_S32BE
:
199 case CODEC_ID_PCM_U32LE
:
200 case CODEC_ID_PCM_U32BE
:
203 case CODEC_ID_PCM_S24LE
:
204 case CODEC_ID_PCM_S24BE
:
205 case CODEC_ID_PCM_U24LE
:
206 case CODEC_ID_PCM_U24BE
:
207 case CODEC_ID_PCM_S24DAUD
:
210 case CODEC_ID_PCM_S16LE
:
211 case CODEC_ID_PCM_S16BE
:
212 case CODEC_ID_PCM_U16LE
:
213 case CODEC_ID_PCM_U16BE
:
220 n
= buf_size
/ sample_size
;
224 switch(avctx
->codec
->id
) {
225 case CODEC_ID_PCM_S32LE
:
226 encode_from16(4, 1, 0, &samples
, &dst
, n
);
228 case CODEC_ID_PCM_S32BE
:
229 encode_from16(4, 0, 0, &samples
, &dst
, n
);
231 case CODEC_ID_PCM_U32LE
:
232 encode_from16(4, 1, 1, &samples
, &dst
, n
);
234 case CODEC_ID_PCM_U32BE
:
235 encode_from16(4, 0, 1, &samples
, &dst
, n
);
237 case CODEC_ID_PCM_S24LE
:
238 encode_from16(3, 1, 0, &samples
, &dst
, n
);
240 case CODEC_ID_PCM_S24BE
:
241 encode_from16(3, 0, 0, &samples
, &dst
, n
);
243 case CODEC_ID_PCM_U24LE
:
244 encode_from16(3, 1, 1, &samples
, &dst
, n
);
246 case CODEC_ID_PCM_U24BE
:
247 encode_from16(3, 0, 1, &samples
, &dst
, n
);
249 case CODEC_ID_PCM_S24DAUD
:
251 uint32_t tmp
= ff_reverse
[*samples
>> 8] +
252 (ff_reverse
[*samples
& 0xff] << 8);
253 tmp
<<= 4; // sync flags would go here
254 bytestream_put_be24(&dst
, tmp
);
258 case CODEC_ID_PCM_S16LE
:
261 bytestream_put_le16(&dst
, v
);
264 case CODEC_ID_PCM_S16BE
:
267 bytestream_put_be16(&dst
, v
);
270 case CODEC_ID_PCM_U16LE
:
274 bytestream_put_le16(&dst
, v
);
277 case CODEC_ID_PCM_U16BE
:
281 bytestream_put_be16(&dst
, v
);
284 case CODEC_ID_PCM_S8
:
290 case CODEC_ID_PCM_U8
:
293 *dst
++ = (v
>> 8) + 128;
296 case CODEC_ID_PCM_ZORK
:
304 case CODEC_ID_PCM_ALAW
:
307 *dst
++ = linear_to_alaw
[(v
+ 32768) >> 2];
310 case CODEC_ID_PCM_MULAW
:
313 *dst
++ = linear_to_ulaw
[(v
+ 32768) >> 2];
319 //avctx->frame_size = (dst - frame) / (sample_size * avctx->channels);
324 typedef struct PCMDecode
{
328 static int pcm_decode_init(AVCodecContext
* avctx
)
330 PCMDecode
*s
= avctx
->priv_data
;
333 switch(avctx
->codec
->id
) {
334 case CODEC_ID_PCM_ALAW
:
336 s
->table
[i
] = alaw2linear(i
);
338 case CODEC_ID_PCM_MULAW
:
340 s
->table
[i
] = ulaw2linear(i
);
349 * \brief convert samples to 16 bit
350 * \param bps byte per sample for the source format, must be >= 2
351 * \param le 0 for big-, 1 for little-endian
352 * \param us 0 for signed, 1 for unsigned input
353 * \param src input samples
354 * \param samples output samples
355 * \param src_len number of bytes in src
357 static inline void decode_to16(int bps
, int le
, int us
,
358 uint8_t **src
, short **samples
, int src_len
)
360 int usum
= us
? -0x8000 : 0;
361 register int n
= src_len
/ bps
;
362 if (le
) *src
+= bps
- 2;
365 if (le
) v
= AV_RL16(*src
);
366 else v
= AV_RB16(*src
);
371 if (le
) *src
-= bps
- 2;
374 static int pcm_decode_frame(AVCodecContext
*avctx
,
375 void *data
, int *data_size
,
376 uint8_t *buf
, int buf_size
)
378 PCMDecode
*s
= avctx
->priv_data
;
381 uint8_t *src
, *src2
[MAX_CHANNELS
];
386 n
= av_get_bits_per_sample(avctx
->codec_id
)/8;
387 if(n
&& buf_size
% n
){
388 av_log(avctx
, AV_LOG_ERROR
, "invalid PCM packet\n");
391 if(avctx
->channels
<= 0 || avctx
->channels
> MAX_CHANNELS
){
392 av_log(avctx
, AV_LOG_ERROR
, "PCM channels out of bounds\n");
396 buf_size
= FFMIN(buf_size
, *data_size
/2);
399 n
= buf_size
/avctx
->channels
;
400 for(c
=0;c
<avctx
->channels
;c
++)
403 switch(avctx
->codec
->id
) {
404 case CODEC_ID_PCM_S32LE
:
405 decode_to16(4, 1, 0, &src
, &samples
, buf_size
);
407 case CODEC_ID_PCM_S32BE
:
408 decode_to16(4, 0, 0, &src
, &samples
, buf_size
);
410 case CODEC_ID_PCM_U32LE
:
411 decode_to16(4, 1, 1, &src
, &samples
, buf_size
);
413 case CODEC_ID_PCM_U32BE
:
414 decode_to16(4, 0, 1, &src
, &samples
, buf_size
);
416 case CODEC_ID_PCM_S24LE
:
417 decode_to16(3, 1, 0, &src
, &samples
, buf_size
);
419 case CODEC_ID_PCM_S24BE
:
420 decode_to16(3, 0, 0, &src
, &samples
, buf_size
);
422 case CODEC_ID_PCM_U24LE
:
423 decode_to16(3, 1, 1, &src
, &samples
, buf_size
);
425 case CODEC_ID_PCM_U24BE
:
426 decode_to16(3, 0, 1, &src
, &samples
, buf_size
);
428 case CODEC_ID_PCM_S24DAUD
:
431 uint32_t v
= bytestream_get_be24(&src
);
432 v
>>= 4; // sync flags are here
433 *samples
++ = ff_reverse
[(v
>> 8) & 0xff] +
434 (ff_reverse
[v
& 0xff] << 8);
437 case CODEC_ID_PCM_S16LE
:
440 *samples
++ = bytestream_get_le16(&src
);
443 case CODEC_ID_PCM_S16LE_PLANAR
:
445 for(c
=0;c
<avctx
->channels
;c
++)
446 *samples
++ = bytestream_get_le16(&src2
[c
]);
447 src
= src2
[avctx
->channels
-1];
449 case CODEC_ID_PCM_S16BE
:
452 *samples
++ = bytestream_get_be16(&src
);
455 case CODEC_ID_PCM_U16LE
:
458 *samples
++ = bytestream_get_le16(&src
) - 0x8000;
461 case CODEC_ID_PCM_U16BE
:
464 *samples
++ = bytestream_get_be16(&src
) - 0x8000;
467 case CODEC_ID_PCM_S8
:
470 *samples
++ = *src
++ << 8;
473 case CODEC_ID_PCM_U8
:
476 *samples
++ = ((int)*src
++ - 128) << 8;
479 case CODEC_ID_PCM_ZORK
:
488 case CODEC_ID_PCM_ALAW
:
489 case CODEC_ID_PCM_MULAW
:
492 *samples
++ = s
->table
[*src
++];
498 *data_size
= (uint8_t *)samples
- (uint8_t *)data
;
502 #ifdef CONFIG_ENCODERS
503 #define PCM_ENCODER(id,name) \
504 AVCodec name ## _encoder = { \
515 #define PCM_ENCODER(id,name)
518 #ifdef CONFIG_DECODERS
519 #define PCM_DECODER(id,name) \
520 AVCodec name ## _decoder = { \
531 #define PCM_DECODER(id,name)
534 #define PCM_CODEC(id, name) \
535 PCM_ENCODER(id,name) PCM_DECODER(id,name)
537 PCM_CODEC (CODEC_ID_PCM_S32LE
, pcm_s32le
);
538 PCM_CODEC (CODEC_ID_PCM_S32BE
, pcm_s32be
);
539 PCM_CODEC (CODEC_ID_PCM_U32LE
, pcm_u32le
);
540 PCM_CODEC (CODEC_ID_PCM_U32BE
, pcm_u32be
);
541 PCM_CODEC (CODEC_ID_PCM_S24LE
, pcm_s24le
);
542 PCM_CODEC (CODEC_ID_PCM_S24BE
, pcm_s24be
);
543 PCM_CODEC (CODEC_ID_PCM_U24LE
, pcm_u24le
);
544 PCM_CODEC (CODEC_ID_PCM_U24BE
, pcm_u24be
);
545 PCM_CODEC (CODEC_ID_PCM_S24DAUD
, pcm_s24daud
);
546 PCM_CODEC (CODEC_ID_PCM_S16LE
, pcm_s16le
);
547 PCM_DECODER(CODEC_ID_PCM_S16LE_PLANAR
, pcm_s16le_planar
);
548 PCM_CODEC (CODEC_ID_PCM_S16BE
, pcm_s16be
);
549 PCM_CODEC (CODEC_ID_PCM_U16LE
, pcm_u16le
);
550 PCM_CODEC (CODEC_ID_PCM_U16BE
, pcm_u16be
);
551 PCM_CODEC (CODEC_ID_PCM_S8
, pcm_s8
);
552 PCM_CODEC (CODEC_ID_PCM_U8
, pcm_u8
);
553 PCM_CODEC (CODEC_ID_PCM_ALAW
, pcm_alaw
);
554 PCM_CODEC (CODEC_ID_PCM_MULAW
, pcm_mulaw
);
555 PCM_CODEC (CODEC_ID_PCM_ZORK
, pcm_zork
);