annotate ffmpeg/libavcodec/pcm.c @ 13:844d341cf643 tip

Back up before ISMIR
author Yading Song <yading.song@eecs.qmul.ac.uk>
date Thu, 31 Oct 2013 13:17:06 +0000
parents 6840f77b83aa
children
rev   line source
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