---
libavcodec/Makefile | 94 ++++++++--------
libavcodec/{pcm.c => pcmdec.c} | 242 +++++-----------------------------------
libavcodec/pcmenc.c | 240 +++++++++++++++++++++++++++++++++++++++
3 files changed, 313 insertions(+), 263 deletions(-)
rename libavcodec/{pcm.c => pcmdec.c} (54%)
create mode 100644 libavcodec/pcmenc.c
diff --git a/libavcodec/Makefile b/libavcodec/Makefile
index a63e2ba..095cfdb 100644
--- a/libavcodec/Makefile
+++ b/libavcodec/Makefile
@@ -429,55 +429,55 @@ OBJS-$(CONFIG_ZMBV_DECODER) += zmbv.o
OBJS-$(CONFIG_ZMBV_ENCODER) += zmbvenc.o
# (AD)PCM decoders/encoders
-OBJS-$(CONFIG_PCM_ALAW_DECODER) += pcm.o
-OBJS-$(CONFIG_PCM_ALAW_ENCODER) += pcm.o
+OBJS-$(CONFIG_PCM_ALAW_DECODER) += pcmdec.o
+OBJS-$(CONFIG_PCM_ALAW_ENCODER) += pcmenc.o
OBJS-$(CONFIG_PCM_BLURAY_DECODER) += pcm-mpeg.o
-OBJS-$(CONFIG_PCM_DVD_DECODER) += pcm.o
-OBJS-$(CONFIG_PCM_DVD_ENCODER) += pcm.o
-OBJS-$(CONFIG_PCM_F32BE_DECODER) += pcm.o
-OBJS-$(CONFIG_PCM_F32BE_ENCODER) += pcm.o
-OBJS-$(CONFIG_PCM_F32LE_DECODER) += pcm.o
-OBJS-$(CONFIG_PCM_F32LE_ENCODER) += pcm.o
-OBJS-$(CONFIG_PCM_F64BE_DECODER) += pcm.o
-OBJS-$(CONFIG_PCM_F64BE_ENCODER) += pcm.o
-OBJS-$(CONFIG_PCM_F64LE_DECODER) += pcm.o
-OBJS-$(CONFIG_PCM_F64LE_ENCODER) += pcm.o
-OBJS-$(CONFIG_PCM_LXF_DECODER) += pcm.o
-OBJS-$(CONFIG_PCM_MULAW_DECODER) += pcm.o
-OBJS-$(CONFIG_PCM_MULAW_ENCODER) += pcm.o
-OBJS-$(CONFIG_PCM_S8_DECODER) += pcm.o
-OBJS-$(CONFIG_PCM_S8_ENCODER) += pcm.o
+OBJS-$(CONFIG_PCM_DVD_DECODER) += pcmdec.o
+OBJS-$(CONFIG_PCM_DVD_ENCODER) += pcmenc.o
+OBJS-$(CONFIG_PCM_F32BE_DECODER) += pcmdec.o
+OBJS-$(CONFIG_PCM_F32BE_ENCODER) += pcmenc.o
+OBJS-$(CONFIG_PCM_F32LE_DECODER) += pcmdec.o
+OBJS-$(CONFIG_PCM_F32LE_ENCODER) += pcmenc.o
+OBJS-$(CONFIG_PCM_F64BE_DECODER) += pcmdec.o
+OBJS-$(CONFIG_PCM_F64BE_ENCODER) += pcmenc.o
+OBJS-$(CONFIG_PCM_F64LE_DECODER) += pcmdec.o
+OBJS-$(CONFIG_PCM_F64LE_ENCODER) += pcmenc.o
+OBJS-$(CONFIG_PCM_LXF_DECODER) += pcmdec.o
+OBJS-$(CONFIG_PCM_MULAW_DECODER) += pcmdec.o
+OBJS-$(CONFIG_PCM_MULAW_ENCODER) += pcmenc.o
+OBJS-$(CONFIG_PCM_S8_DECODER) += pcmdec.o
+OBJS-$(CONFIG_PCM_S8_ENCODER) += pcmenc.o
OBJS-$(CONFIG_PCM_S8_PLANAR_DECODER) += 8svx.o
-OBJS-$(CONFIG_PCM_S16BE_DECODER) += pcm.o
-OBJS-$(CONFIG_PCM_S16BE_ENCODER) += pcm.o
-OBJS-$(CONFIG_PCM_S16LE_DECODER) += pcm.o
-OBJS-$(CONFIG_PCM_S16LE_ENCODER) += pcm.o
-OBJS-$(CONFIG_PCM_S16LE_PLANAR_DECODER) += pcm.o
-OBJS-$(CONFIG_PCM_S24BE_DECODER) += pcm.o
-OBJS-$(CONFIG_PCM_S24BE_ENCODER) += pcm.o
-OBJS-$(CONFIG_PCM_S24DAUD_DECODER) += pcm.o
-OBJS-$(CONFIG_PCM_S24DAUD_ENCODER) += pcm.o
-OBJS-$(CONFIG_PCM_S24LE_DECODER) += pcm.o
-OBJS-$(CONFIG_PCM_S24LE_ENCODER) += pcm.o
-OBJS-$(CONFIG_PCM_S32BE_DECODER) += pcm.o
-OBJS-$(CONFIG_PCM_S32BE_ENCODER) += pcm.o
-OBJS-$(CONFIG_PCM_S32LE_DECODER) += pcm.o
-OBJS-$(CONFIG_PCM_S32LE_ENCODER) += pcm.o
-OBJS-$(CONFIG_PCM_U8_DECODER) += pcm.o
-OBJS-$(CONFIG_PCM_U8_ENCODER) += pcm.o
-OBJS-$(CONFIG_PCM_U16BE_DECODER) += pcm.o
-OBJS-$(CONFIG_PCM_U16BE_ENCODER) += pcm.o
-OBJS-$(CONFIG_PCM_U16LE_DECODER) += pcm.o
-OBJS-$(CONFIG_PCM_U16LE_ENCODER) += pcm.o
-OBJS-$(CONFIG_PCM_U24BE_DECODER) += pcm.o
-OBJS-$(CONFIG_PCM_U24BE_ENCODER) += pcm.o
-OBJS-$(CONFIG_PCM_U24LE_DECODER) += pcm.o
-OBJS-$(CONFIG_PCM_U24LE_ENCODER) += pcm.o
-OBJS-$(CONFIG_PCM_U32BE_DECODER) += pcm.o
-OBJS-$(CONFIG_PCM_U32BE_ENCODER) += pcm.o
-OBJS-$(CONFIG_PCM_U32LE_DECODER) += pcm.o
-OBJS-$(CONFIG_PCM_U32LE_ENCODER) += pcm.o
-OBJS-$(CONFIG_PCM_ZORK_DECODER) += pcm.o
+OBJS-$(CONFIG_PCM_S16BE_DECODER) += pcmdec.o
+OBJS-$(CONFIG_PCM_S16BE_ENCODER) += pcmenc.o
+OBJS-$(CONFIG_PCM_S16LE_DECODER) += pcmdec.o
+OBJS-$(CONFIG_PCM_S16LE_ENCODER) += pcmenc.o
+OBJS-$(CONFIG_PCM_S16LE_PLANAR_DECODER) += pcmdec.o
+OBJS-$(CONFIG_PCM_S24BE_DECODER) += pcmdec.o
+OBJS-$(CONFIG_PCM_S24BE_ENCODER) += pcmenc.o
+OBJS-$(CONFIG_PCM_S24DAUD_DECODER) += pcmdec.o
+OBJS-$(CONFIG_PCM_S24DAUD_ENCODER) += pcmenc.o
+OBJS-$(CONFIG_PCM_S24LE_DECODER) += pcmdec.o
+OBJS-$(CONFIG_PCM_S24LE_ENCODER) += pcmenc.o
+OBJS-$(CONFIG_PCM_S32BE_DECODER) += pcmdec.o
+OBJS-$(CONFIG_PCM_S32BE_ENCODER) += pcmenc.o
+OBJS-$(CONFIG_PCM_S32LE_DECODER) += pcmdec.o
+OBJS-$(CONFIG_PCM_S32LE_ENCODER) += pcmenc.o
+OBJS-$(CONFIG_PCM_U8_DECODER) += pcmdec.o
+OBJS-$(CONFIG_PCM_U8_ENCODER) += pcmenc.o
+OBJS-$(CONFIG_PCM_U16BE_DECODER) += pcmdec.o
+OBJS-$(CONFIG_PCM_U16BE_ENCODER) += pcmenc.o
+OBJS-$(CONFIG_PCM_U16LE_DECODER) += pcmdec.o
+OBJS-$(CONFIG_PCM_U16LE_ENCODER) += pcmenc.o
+OBJS-$(CONFIG_PCM_U24BE_DECODER) += pcmdec.o
+OBJS-$(CONFIG_PCM_U24BE_ENCODER) += pcmenc.o
+OBJS-$(CONFIG_PCM_U24LE_DECODER) += pcmdec.o
+OBJS-$(CONFIG_PCM_U24LE_ENCODER) += pcmenc.o
+OBJS-$(CONFIG_PCM_U32BE_DECODER) += pcmdec.o
+OBJS-$(CONFIG_PCM_U32BE_ENCODER) += pcmenc.o
+OBJS-$(CONFIG_PCM_U32LE_DECODER) += pcmdec.o
+OBJS-$(CONFIG_PCM_U32LE_ENCODER) += pcmenc.o
+OBJS-$(CONFIG_PCM_ZORK_DECODER) += pcmdec.o
OBJS-$(CONFIG_ADPCM_4XM_DECODER) += adpcm.o adpcm_data.o
OBJS-$(CONFIG_ADPCM_ADX_DECODER) += adxdec.o adx.o
diff --git a/libavcodec/pcm.c b/libavcodec/pcmdec.c
similarity index 54%
rename from libavcodec/pcm.c
rename to libavcodec/pcmdec.c
index c6c6bc0..609edc2 100644
--- a/libavcodec/pcm.c
+++ b/libavcodec/pcmdec.c
@@ -1,5 +1,5 @@
/*
- * PCM codecs
+ * PCM decoders
* Copyright (c) 2001 Fabrice Bellard
*
* This file is part of Libav.
@@ -21,185 +21,17 @@
/**
* @file
- * PCM codecs
+ * PCM decoders
*/
#include "libavutil/attributes.h"
#include "avcodec.h"
#include "bytestream.h"
-#include "internal.h"
#include "mathops.h"
#include "pcm_tablegen.h"
#define MAX_CHANNELS 64
-static av_cold int pcm_encode_init(AVCodecContext *avctx)
-{
- avctx->frame_size = 0;
- switch (avctx->codec->id) {
- case AV_CODEC_ID_PCM_ALAW:
- pcm_alaw_tableinit();
- break;
- case AV_CODEC_ID_PCM_MULAW:
- pcm_ulaw_tableinit();
- break;
- default:
- break;
- }
-
- avctx->bits_per_coded_sample = av_get_bits_per_sample(avctx->codec->id);
- avctx->block_align = avctx->channels *
avctx->bits_per_coded_sample / 8;
- avctx->bit_rate = avctx->block_align * avctx->sample_rate * 8;
- avctx->coded_frame = avcodec_alloc_frame();
- if (!avctx->coded_frame)
- return AVERROR(ENOMEM);
-
- return 0;
-}
-
-static av_cold int pcm_encode_close(AVCodecContext *avctx)
-{
- av_freep(&avctx->coded_frame);
-
- return 0;
-}
-
-/**
- * Write PCM samples macro
- * @param type Datatype of native machine format
- * @param endian bytestream_put_xxx() suffix
- * @param src Source pointer (variable name)
- * @param dst Destination pointer (variable name)
- * @param n Total number of samples (variable name)
- * @param shift Bitshift (bits)
- * @param offset Sample value offset
- */
-#define ENCODE(type, endian, src, dst, n, shift, offset) \
- samples_ ## type = (const type *) src; \
- for (; n > 0; n--) { \
- register type v = (*samples_ ## type++ >> shift) + offset; \
- bytestream_put_ ## endian(&dst, v); \
- }
-
-static int pcm_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
- const AVFrame *frame, int *got_packet_ptr)
-{
- int n, sample_size, v, ret;
- const short *samples;
- unsigned char *dst;
- const uint8_t *srcu8;
- const int16_t *samples_int16_t;
- const int32_t *samples_int32_t;
- const int64_t *samples_int64_t;
- const uint16_t *samples_uint16_t;
- const uint32_t *samples_uint32_t;
-
- sample_size = av_get_bits_per_sample(avctx->codec->id) / 8;
- n = frame->nb_samples * avctx->channels;
- samples = (const short *)frame->data[0];
-
- if ((ret = ff_alloc_packet(avpkt, n * sample_size))) {
- av_log(avctx, AV_LOG_ERROR, "Error getting output packet\n");
- return ret;
- }
- dst = avpkt->data;
-
- switch (avctx->codec->id) {
- case AV_CODEC_ID_PCM_U32LE:
- ENCODE(uint32_t, le32, samples, dst, n, 0, 0x80000000)
- break;
- case AV_CODEC_ID_PCM_U32BE:
- ENCODE(uint32_t, be32, samples, dst, n, 0, 0x80000000)
- break;
- case AV_CODEC_ID_PCM_S24LE:
- ENCODE(int32_t, le24, samples, dst, n, 8, 0)
- break;
- case AV_CODEC_ID_PCM_S24BE:
- ENCODE(int32_t, be24, samples, dst, n, 8, 0)
- break;
- case AV_CODEC_ID_PCM_U24LE:
- ENCODE(uint32_t, le24, samples, dst, n, 8, 0x800000)
- break;
- case AV_CODEC_ID_PCM_U24BE:
- ENCODE(uint32_t, be24, samples, dst, n, 8, 0x800000)
- break;
- case AV_CODEC_ID_PCM_S24DAUD:
- for (; n > 0; n--) {
- uint32_t tmp = ff_reverse[(*samples >> 8) & 0xff] +
- (ff_reverse[*samples & 0xff] << 8);
- tmp <<= 4; // sync flags would go here
- bytestream_put_be24(&dst, tmp);
- samples++;
- }
- break;
- case AV_CODEC_ID_PCM_U16LE:
- ENCODE(uint16_t, le16, samples, dst, n, 0, 0x8000)
- break;
- case AV_CODEC_ID_PCM_U16BE:
- ENCODE(uint16_t, be16, samples, dst, n, 0, 0x8000)
- break;
- case AV_CODEC_ID_PCM_S8:
- srcu8 = frame->data[0];
- for (; n > 0; n--) {
- v = *srcu8++;
- *dst++ = v - 128;
- }
- break;
-#if HAVE_BIGENDIAN
- case AV_CODEC_ID_PCM_F64LE:
- ENCODE(int64_t, le64, samples, dst, n, 0, 0)
- break;
- case AV_CODEC_ID_PCM_S32LE:
- case AV_CODEC_ID_PCM_F32LE:
- ENCODE(int32_t, le32, samples, dst, n, 0, 0)
- break;
- case AV_CODEC_ID_PCM_S16LE:
- ENCODE(int16_t, le16, samples, dst, n, 0, 0)
- break;
- case AV_CODEC_ID_PCM_F64BE:
- case AV_CODEC_ID_PCM_F32BE:
- case AV_CODEC_ID_PCM_S32BE:
- case AV_CODEC_ID_PCM_S16BE:
-#else
- case AV_CODEC_ID_PCM_F64BE:
- ENCODE(int64_t, be64, samples, dst, n, 0, 0)
- break;
- case AV_CODEC_ID_PCM_F32BE:
- case AV_CODEC_ID_PCM_S32BE:
- ENCODE(int32_t, be32, samples, dst, n, 0, 0)
- break;
- case AV_CODEC_ID_PCM_S16BE:
- ENCODE(int16_t, be16, samples, dst, n, 0, 0)
- break;
- case AV_CODEC_ID_PCM_F64LE:
- case AV_CODEC_ID_PCM_F32LE:
- case AV_CODEC_ID_PCM_S32LE:
- case AV_CODEC_ID_PCM_S16LE:
-#endif /* HAVE_BIGENDIAN */
- case AV_CODEC_ID_PCM_U8:
- memcpy(dst, samples, n * sample_size);
- dst += n * sample_size;
- break;
- case AV_CODEC_ID_PCM_ALAW:
- for (; n > 0; n--) {
- v = *samples++;
- *dst++ = linear_to_alaw[(v + 32768) >> 2];
- }
- break;
- case AV_CODEC_ID_PCM_MULAW:
- for (; n > 0; n--) {
- v = *samples++;
- *dst++ = linear_to_ulaw[(v + 32768) >> 2];
- }
- break;
- default:
- return -1;
- }
-
- *got_packet_ptr = 1;
- return 0;
-}
-
typedef struct PCMDecode {
AVFrame frame;
short table[256];
@@ -475,24 +307,6 @@ static int pcm_decode_frame(AVCodecContext *avctx, void
*data,
return buf_size;
}
-#if CONFIG_ENCODERS
-#define PCM_ENCODER(id_, sample_fmt_, name_, long_name_) \
-AVCodec ff_ ## name_ ## _encoder = { \
- .name = #name_, \
- .type = AVMEDIA_TYPE_AUDIO, \
- .id = id_, \
- .init = pcm_encode_init, \
- .encode2 = pcm_encode_frame, \
- .close = pcm_encode_close, \
- .capabilities = CODEC_CAP_VARIABLE_FRAME_SIZE, \
- .sample_fmts = (const enum AVSampleFormat[]){ sample_fmt_, \
- AV_SAMPLE_FMT_NONE }, \
- .long_name = NULL_IF_CONFIG_SMALL(long_name_), \
-}
-#else
-#define PCM_ENCODER(id, sample_fmt_, name, long_name_)
-#endif
-
#if CONFIG_DECODERS
#define PCM_DECODER(id_, sample_fmt_, name_, long_name_) \
AVCodec ff_ ## name_ ## _decoder = { \
@@ -511,33 +325,29 @@ AVCodec ff_ ## name_ ## _decoder = {
\
#define PCM_DECODER(id, sample_fmt_, name, long_name_)
#endif
-#define PCM_CODEC(id, sample_fmt_, name, long_name_) \
- PCM_ENCODER(id, sample_fmt_, name, long_name_); \
- PCM_DECODER(id, sample_fmt_, name, long_name_)
-
/* Note: Do not forget to add new entries to the Makefile as well. */
-PCM_CODEC (AV_CODEC_ID_PCM_ALAW, AV_SAMPLE_FMT_S16, pcm_alaw,
"PCM A-law");
-PCM_DECODER(AV_CODEC_ID_PCM_DVD, AV_SAMPLE_FMT_S32, pcm_dvd,
"PCM signed 20|24-bit big-endian");
-PCM_CODEC (AV_CODEC_ID_PCM_F32BE, AV_SAMPLE_FMT_FLT, pcm_f32be,
"PCM 32-bit floating point big-endian");
-PCM_CODEC (AV_CODEC_ID_PCM_F32LE, AV_SAMPLE_FMT_FLT, pcm_f32le,
"PCM 32-bit floating point little-endian");
-PCM_CODEC (AV_CODEC_ID_PCM_F64BE, AV_SAMPLE_FMT_DBL, pcm_f64be,
"PCM 64-bit floating point big-endian");
-PCM_CODEC (AV_CODEC_ID_PCM_F64LE, AV_SAMPLE_FMT_DBL, pcm_f64le,
"PCM 64-bit floating point little-endian");
+PCM_DECODER(AV_CODEC_ID_PCM_ALAW, AV_SAMPLE_FMT_S16, pcm_alaw,
"PCM A-law");
+PCM_DECODER(AV_CODEC_ID_PCM_DVD, AV_SAMPLE_FMT_S32, pcm_dvd,
"PCM signed 20|24-bit big-endian");
+PCM_DECODER(AV_CODEC_ID_PCM_F32BE, AV_SAMPLE_FMT_FLT, pcm_f32be,
"PCM 32-bit floating point big-endian");
+PCM_DECODER(AV_CODEC_ID_PCM_F32LE, AV_SAMPLE_FMT_FLT, pcm_f32le,
"PCM 32-bit floating point little-endian");
+PCM_DECODER(AV_CODEC_ID_PCM_F64BE, AV_SAMPLE_FMT_DBL, pcm_f64be,
"PCM 64-bit floating point big-endian");
+PCM_DECODER(AV_CODEC_ID_PCM_F64LE, AV_SAMPLE_FMT_DBL, pcm_f64le,
"PCM 64-bit floating point little-endian");
PCM_DECODER(AV_CODEC_ID_PCM_LXF, AV_SAMPLE_FMT_S32P, pcm_lxf,
"PCM signed 20-bit little-endian planar");
-PCM_CODEC (AV_CODEC_ID_PCM_MULAW, AV_SAMPLE_FMT_S16, pcm_mulaw,
"PCM mu-law");
-PCM_CODEC (AV_CODEC_ID_PCM_S8, AV_SAMPLE_FMT_U8, pcm_s8,
"PCM signed 8-bit");
-PCM_CODEC (AV_CODEC_ID_PCM_S16BE, AV_SAMPLE_FMT_S16, pcm_s16be,
"PCM signed 16-bit big-endian");
-PCM_CODEC (AV_CODEC_ID_PCM_S16LE, AV_SAMPLE_FMT_S16, pcm_s16le,
"PCM signed 16-bit little-endian");
-PCM_DECODER(AV_CODEC_ID_PCM_S16LE_PLANAR, AV_SAMPLE_FMT_S16, pcm_s16le_planar,
"PCM 16-bit little-endian planar");
-PCM_CODEC (AV_CODEC_ID_PCM_S24BE, AV_SAMPLE_FMT_S32, pcm_s24be,
"PCM signed 24-bit big-endian");
-PCM_CODEC (AV_CODEC_ID_PCM_S24DAUD, AV_SAMPLE_FMT_S16, pcm_s24daud,
"PCM D-Cinema audio signed 24-bit");
-PCM_CODEC (AV_CODEC_ID_PCM_S24LE, AV_SAMPLE_FMT_S32, pcm_s24le,
"PCM signed 24-bit little-endian");
-PCM_CODEC (AV_CODEC_ID_PCM_S32BE, AV_SAMPLE_FMT_S32, pcm_s32be,
"PCM signed 32-bit big-endian");
-PCM_CODEC (AV_CODEC_ID_PCM_S32LE, AV_SAMPLE_FMT_S32, pcm_s32le,
"PCM signed 32-bit little-endian");
-PCM_CODEC (AV_CODEC_ID_PCM_U8, AV_SAMPLE_FMT_U8, pcm_u8,
"PCM unsigned 8-bit");
-PCM_CODEC (AV_CODEC_ID_PCM_U16BE, AV_SAMPLE_FMT_S16, pcm_u16be,
"PCM unsigned 16-bit big-endian");
-PCM_CODEC (AV_CODEC_ID_PCM_U16LE, AV_SAMPLE_FMT_S16, pcm_u16le,
"PCM unsigned 16-bit little-endian");
-PCM_CODEC (AV_CODEC_ID_PCM_U24BE, AV_SAMPLE_FMT_S32, pcm_u24be,
"PCM unsigned 24-bit big-endian");
-PCM_CODEC (AV_CODEC_ID_PCM_U24LE, AV_SAMPLE_FMT_S32, pcm_u24le,
"PCM unsigned 24-bit little-endian");
-PCM_CODEC (AV_CODEC_ID_PCM_U32BE, AV_SAMPLE_FMT_S32, pcm_u32be,
"PCM unsigned 32-bit big-endian");
-PCM_CODEC (AV_CODEC_ID_PCM_U32LE, AV_SAMPLE_FMT_S32, pcm_u32le,
"PCM unsigned 32-bit little-endian");
-PCM_DECODER(AV_CODEC_ID_PCM_ZORK, AV_SAMPLE_FMT_U8, pcm_zork,
"PCM Zork");
+PCM_DECODER(AV_CODEC_ID_PCM_MULAW, AV_SAMPLE_FMT_S16, pcm_mulaw,
"PCM mu-law");
+PCM_DECODER(AV_CODEC_ID_PCM_S8, AV_SAMPLE_FMT_U8, pcm_s8,
"PCM signed 8-bit");
+PCM_DECODER(AV_CODEC_ID_PCM_S16BE, AV_SAMPLE_FMT_S16, pcm_s16be,
"PCM signed 16-bit big-endian");
+PCM_DECODER(AV_CODEC_ID_PCM_S16LE, AV_SAMPLE_FMT_S16, pcm_s16le,
"PCM signed 16-bit little-endian");
+PCM_DECODER(AV_CODEC_ID_PCM_S16LE_PLANAR, AV_SAMPLE_FMT_S16,
pcm_s16le_planar, "PCM 16-bit little-endian planar");
+PCM_DECODER(AV_CODEC_ID_PCM_S24BE, AV_SAMPLE_FMT_S32, pcm_s24be,
"PCM signed 24-bit big-endian");
+PCM_DECODER(AV_CODEC_ID_PCM_S24DAUD, AV_SAMPLE_FMT_S16, pcm_s24daud,
"PCM D-Cinema audio signed 24-bit");
+PCM_DECODER(AV_CODEC_ID_PCM_S24LE, AV_SAMPLE_FMT_S32, pcm_s24le,
"PCM signed 24-bit little-endian");
+PCM_DECODER(AV_CODEC_ID_PCM_S32BE, AV_SAMPLE_FMT_S32, pcm_s32be,
"PCM signed 32-bit big-endian");
+PCM_DECODER(AV_CODEC_ID_PCM_S32LE, AV_SAMPLE_FMT_S32, pcm_s32le,
"PCM signed 32-bit little-endian");
+PCM_DECODER(AV_CODEC_ID_PCM_U8, AV_SAMPLE_FMT_U8, pcm_u8,
"PCM unsigned 8-bit");
+PCM_DECODER(AV_CODEC_ID_PCM_U16BE, AV_SAMPLE_FMT_S16, pcm_u16be,
"PCM unsigned 16-bit big-endian");
+PCM_DECODER(AV_CODEC_ID_PCM_U16LE, AV_SAMPLE_FMT_S16, pcm_u16le,
"PCM unsigned 16-bit little-endian");
+PCM_DECODER(AV_CODEC_ID_PCM_U24BE, AV_SAMPLE_FMT_S32, pcm_u24be,
"PCM unsigned 24-bit big-endian");
+PCM_DECODER(AV_CODEC_ID_PCM_U24LE, AV_SAMPLE_FMT_S32, pcm_u24le,
"PCM unsigned 24-bit little-endian");
+PCM_DECODER(AV_CODEC_ID_PCM_U32BE, AV_SAMPLE_FMT_S32, pcm_u32be,
"PCM unsigned 32-bit big-endian");
+PCM_DECODER(AV_CODEC_ID_PCM_U32LE, AV_SAMPLE_FMT_S32, pcm_u32le,
"PCM unsigned 32-bit little-endian");
+PCM_DECODER(AV_CODEC_ID_PCM_ZORK, AV_SAMPLE_FMT_U8, pcm_zork,
"PCM Zork");
diff --git a/libavcodec/pcmenc.c b/libavcodec/pcmenc.c
new file mode 100644
index 0000000..7259b88
--- /dev/null
+++ b/libavcodec/pcmenc.c
@@ -0,0 +1,240 @@
+/*
+ * PCM encoders
+ * Copyright (c) 2001 Fabrice Bellard
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * PCM encoders
+ */
+
+#include "libavutil/attributes.h"
+#include "avcodec.h"
+#include "bytestream.h"
+#include "internal.h"
+#include "mathops.h"
+#include "pcm_tablegen.h"
+
+static av_cold int pcm_encode_init(AVCodecContext *avctx)
+{
+ avctx->frame_size = 0;
+ switch (avctx->codec->id) {
+ case AV_CODEC_ID_PCM_ALAW:
+ pcm_alaw_tableinit();
+ break;
+ case AV_CODEC_ID_PCM_MULAW:
+ pcm_ulaw_tableinit();
+ break;
+ default:
+ break;
+ }
+
+ avctx->bits_per_coded_sample = av_get_bits_per_sample(avctx->codec->id);
+ avctx->block_align = avctx->channels *
avctx->bits_per_coded_sample / 8;
+ avctx->bit_rate = avctx->block_align * avctx->sample_rate * 8;
+ avctx->coded_frame = avcodec_alloc_frame();
+ if (!avctx->coded_frame)
+ return AVERROR(ENOMEM);
+
+ return 0;
+}
+
+static av_cold int pcm_encode_close(AVCodecContext *avctx)
+{
+ av_freep(&avctx->coded_frame);
+
+ return 0;
+}
+
+/**
+ * Write PCM samples macro
+ * @param type Datatype of native machine format
+ * @param endian bytestream_put_xxx() suffix
+ * @param src Source pointer (variable name)
+ * @param dst Destination pointer (variable name)
+ * @param n Total number of samples (variable name)
+ * @param shift Bitshift (bits)
+ * @param offset Sample value offset
+ */
+#define ENCODE(type, endian, src, dst, n, shift, offset) \
+ samples_ ## type = (const type *) src; \
+ for (; n > 0; n--) { \
+ register type v = (*samples_ ## type++ >> shift) + offset; \
+ bytestream_put_ ## endian(&dst, v); \
+ }
+
+static int pcm_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
+ const AVFrame *frame, int *got_packet_ptr)
+{
+ int n, sample_size, v, ret;
+ const short *samples;
+ unsigned char *dst;
+ const uint8_t *srcu8;
+ const int16_t *samples_int16_t;
+ const int32_t *samples_int32_t;
+ const int64_t *samples_int64_t;
+ const uint16_t *samples_uint16_t;
+ const uint32_t *samples_uint32_t;
+
+ sample_size = av_get_bits_per_sample(avctx->codec->id) / 8;
+ n = frame->nb_samples * avctx->channels;
+ samples = (const short *)frame->data[0];
+
+ if ((ret = ff_alloc_packet(avpkt, n * sample_size))) {
+ av_log(avctx, AV_LOG_ERROR, "Error getting output packet\n");
+ return ret;
+ }
+ dst = avpkt->data;
+
+ switch (avctx->codec->id) {
+ case AV_CODEC_ID_PCM_U32LE:
+ ENCODE(uint32_t, le32, samples, dst, n, 0, 0x80000000)
+ break;
+ case AV_CODEC_ID_PCM_U32BE:
+ ENCODE(uint32_t, be32, samples, dst, n, 0, 0x80000000)
+ break;
+ case AV_CODEC_ID_PCM_S24LE:
+ ENCODE(int32_t, le24, samples, dst, n, 8, 0)
+ break;
+ case AV_CODEC_ID_PCM_S24BE:
+ ENCODE(int32_t, be24, samples, dst, n, 8, 0)
+ break;
+ case AV_CODEC_ID_PCM_U24LE:
+ ENCODE(uint32_t, le24, samples, dst, n, 8, 0x800000)
+ break;
+ case AV_CODEC_ID_PCM_U24BE:
+ ENCODE(uint32_t, be24, samples, dst, n, 8, 0x800000)
+ break;
+ case AV_CODEC_ID_PCM_S24DAUD:
+ for (; n > 0; n--) {
+ uint32_t tmp = ff_reverse[(*samples >> 8) & 0xff] +
+ (ff_reverse[*samples & 0xff] << 8);
+ tmp <<= 4; // sync flags would go here
+ bytestream_put_be24(&dst, tmp);
+ samples++;
+ }
+ break;
+ case AV_CODEC_ID_PCM_U16LE:
+ ENCODE(uint16_t, le16, samples, dst, n, 0, 0x8000)
+ break;
+ case AV_CODEC_ID_PCM_U16BE:
+ ENCODE(uint16_t, be16, samples, dst, n, 0, 0x8000)
+ break;
+ case AV_CODEC_ID_PCM_S8:
+ srcu8 = frame->data[0];
+ for (; n > 0; n--) {
+ v = *srcu8++;
+ *dst++ = v - 128;
+ }
+ break;
+#if HAVE_BIGENDIAN
+ case AV_CODEC_ID_PCM_F64LE:
+ ENCODE(int64_t, le64, samples, dst, n, 0, 0)
+ break;
+ case AV_CODEC_ID_PCM_S32LE:
+ case AV_CODEC_ID_PCM_F32LE:
+ ENCODE(int32_t, le32, samples, dst, n, 0, 0)
+ break;
+ case AV_CODEC_ID_PCM_S16LE:
+ ENCODE(int16_t, le16, samples, dst, n, 0, 0)
+ break;
+ case AV_CODEC_ID_PCM_F64BE:
+ case AV_CODEC_ID_PCM_F32BE:
+ case AV_CODEC_ID_PCM_S32BE:
+ case AV_CODEC_ID_PCM_S16BE:
+#else
+ case AV_CODEC_ID_PCM_F64BE:
+ ENCODE(int64_t, be64, samples, dst, n, 0, 0)
+ break;
+ case AV_CODEC_ID_PCM_F32BE:
+ case AV_CODEC_ID_PCM_S32BE:
+ ENCODE(int32_t, be32, samples, dst, n, 0, 0)
+ break;
+ case AV_CODEC_ID_PCM_S16BE:
+ ENCODE(int16_t, be16, samples, dst, n, 0, 0)
+ break;
+ case AV_CODEC_ID_PCM_F64LE:
+ case AV_CODEC_ID_PCM_F32LE:
+ case AV_CODEC_ID_PCM_S32LE:
+ case AV_CODEC_ID_PCM_S16LE:
+#endif /* HAVE_BIGENDIAN */
+ case AV_CODEC_ID_PCM_U8:
+ memcpy(dst, samples, n * sample_size);
+ dst += n * sample_size;
+ break;
+ case AV_CODEC_ID_PCM_ALAW:
+ for (; n > 0; n--) {
+ v = *samples++;
+ *dst++ = linear_to_alaw[(v + 32768) >> 2];
+ }
+ break;
+ case AV_CODEC_ID_PCM_MULAW:
+ for (; n > 0; n--) {
+ v = *samples++;
+ *dst++ = linear_to_ulaw[(v + 32768) >> 2];
+ }
+ break;
+ default:
+ return -1;
+ }
+
+ *got_packet_ptr = 1;
+ return 0;
+}
+
+#if CONFIG_ENCODERS
+#define PCM_ENCODER(id_, sample_fmt_, name_, long_name_) \
+AVCodec ff_ ## name_ ## _encoder = { \
+ .name = #name_, \
+ .type = AVMEDIA_TYPE_AUDIO, \
+ .id = id_, \
+ .init = pcm_encode_init, \
+ .encode2 = pcm_encode_frame, \
+ .close = pcm_encode_close, \
+ .capabilities = CODEC_CAP_VARIABLE_FRAME_SIZE, \
+ .sample_fmts = (const enum AVSampleFormat[]){ sample_fmt_, \
+ AV_SAMPLE_FMT_NONE }, \
+ .long_name = NULL_IF_CONFIG_SMALL(long_name_), \
+}
+#else
+#define PCM_ENCODER(id, sample_fmt_, name, long_name_)
+#endif
+
+/* Note: Do not forget to add new entries to the Makefile as well. */
+PCM_ENCODER(AV_CODEC_ID_PCM_ALAW, AV_SAMPLE_FMT_S16, pcm_alaw, "PCM
A-law");
+PCM_ENCODER(AV_CODEC_ID_PCM_F32BE, AV_SAMPLE_FMT_FLT, pcm_f32be, "PCM
32-bit floating point big-endian");
+PCM_ENCODER(AV_CODEC_ID_PCM_F32LE, AV_SAMPLE_FMT_FLT, pcm_f32le, "PCM
32-bit floating point little-endian");
+PCM_ENCODER(AV_CODEC_ID_PCM_F64BE, AV_SAMPLE_FMT_DBL, pcm_f64be, "PCM
64-bit floating point big-endian");
+PCM_ENCODER(AV_CODEC_ID_PCM_F64LE, AV_SAMPLE_FMT_DBL, pcm_f64le, "PCM
64-bit floating point little-endian");
+PCM_ENCODER(AV_CODEC_ID_PCM_MULAW, AV_SAMPLE_FMT_S16, pcm_mulaw, "PCM
mu-law");
+PCM_ENCODER(AV_CODEC_ID_PCM_S8, AV_SAMPLE_FMT_U8, pcm_s8, "PCM
signed 8-bit");
+PCM_ENCODER(AV_CODEC_ID_PCM_S16BE, AV_SAMPLE_FMT_S16, pcm_s16be, "PCM
signed 16-bit big-endian");
+PCM_ENCODER(AV_CODEC_ID_PCM_S16LE, AV_SAMPLE_FMT_S16, pcm_s16le, "PCM
signed 16-bit little-endian");
+PCM_ENCODER(AV_CODEC_ID_PCM_S24BE, AV_SAMPLE_FMT_S32, pcm_s24be, "PCM
signed 24-bit big-endian");
+PCM_ENCODER(AV_CODEC_ID_PCM_S24DAUD, AV_SAMPLE_FMT_S16, pcm_s24daud, "PCM
D-Cinema audio signed 24-bit");
+PCM_ENCODER(AV_CODEC_ID_PCM_S24LE, AV_SAMPLE_FMT_S32, pcm_s24le, "PCM
signed 24-bit little-endian");
+PCM_ENCODER(AV_CODEC_ID_PCM_S32BE, AV_SAMPLE_FMT_S32, pcm_s32be, "PCM
signed 32-bit big-endian");
+PCM_ENCODER(AV_CODEC_ID_PCM_S32LE, AV_SAMPLE_FMT_S32, pcm_s32le, "PCM
signed 32-bit little-endian");
+PCM_ENCODER(AV_CODEC_ID_PCM_U8, AV_SAMPLE_FMT_U8, pcm_u8, "PCM
unsigned 8-bit");
+PCM_ENCODER(AV_CODEC_ID_PCM_U16BE, AV_SAMPLE_FMT_S16, pcm_u16be, "PCM
unsigned 16-bit big-endian");
+PCM_ENCODER(AV_CODEC_ID_PCM_U16LE, AV_SAMPLE_FMT_S16, pcm_u16le, "PCM
unsigned 16-bit little-endian");
+PCM_ENCODER(AV_CODEC_ID_PCM_U24BE, AV_SAMPLE_FMT_S32, pcm_u24be, "PCM
unsigned 24-bit big-endian");
+PCM_ENCODER(AV_CODEC_ID_PCM_U24LE, AV_SAMPLE_FMT_S32, pcm_u24le, "PCM
unsigned 24-bit little-endian");
+PCM_ENCODER(AV_CODEC_ID_PCM_U32BE, AV_SAMPLE_FMT_S32, pcm_u32be, "PCM
unsigned 32-bit big-endian");
+PCM_ENCODER(AV_CODEC_ID_PCM_U32LE, AV_SAMPLE_FMT_S32, pcm_u32le, "PCM
unsigned 32-bit little-endian");
--
1.7.1
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel