---
 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

Reply via email to