[FFmpeg-devel] [PATCH] 8svx: remove code duplication

Paul B Mahol onemda at gmail.com
Sun Nov 18 20:37:46 CET 2012


Removes limitation of max 2 channels for pcm s8 planar decoder.

AV_CODEC_ID_8SVX_RAW is not used by anything anymore and is going to be
removed.

Signed-off-by: Paul B Mahol <onemda at gmail.com>
---
 libavcodec/8svx.c   | 45 +++++++--------------------------------------
 libavcodec/Makefile |  2 +-
 libavcodec/pcm.c    | 12 ++++++++++++
 libavcodec/utils.c  |  1 +
 4 files changed, 21 insertions(+), 39 deletions(-)

diff --git a/libavcodec/8svx.c b/libavcodec/8svx.c
index 698ddd0..618ae87 100644
--- a/libavcodec/8svx.c
+++ b/libavcodec/8svx.c
@@ -82,12 +82,6 @@ static void delta_decode(uint8_t *dst, const uint8_t *src, int src_size,
     *state = val;
 }
 
-static void raw_decode(uint8_t *dst, const int8_t *src, int src_size)
-{
-    while (src_size--)
-        *dst++ = *src++ + 128;
-}
-
 /** decode a frame */
 static int eightsvx_decode_frame(AVCodecContext *avctx, void *data,
                                  int *got_frame_ptr, AVPacket *avpkt)
@@ -95,8 +89,7 @@ static int eightsvx_decode_frame(AVCodecContext *avctx, void *data,
     EightSvxContext *esc = avctx->priv_data;
     int buf_size;
     int ch, ret;
-    int is_compr = (avctx->codec_id != AV_CODEC_ID_PCM_S8_PLANAR);
-    int hdr_size  = is_compr ? 2 : 0;
+    int hdr_size = 2;
 
     /* decode and interleave the first packet */
     if (!esc->data[0] && avpkt) {
@@ -110,11 +103,9 @@ static int eightsvx_decode_frame(AVCodecContext *avctx, void *data,
             return AVERROR(EINVAL);
         }
 
-        if (is_compr) {
-            esc->fib_acc[0] = avpkt->data[1] + 128;
-            if (avctx->channels == 2)
-                esc->fib_acc[1] = avpkt->data[2+chan_size+1] + 128;
-        }
+        esc->fib_acc[0] = avpkt->data[1] + 128;
+        if (avctx->channels == 2)
+            esc->fib_acc[1] = avpkt->data[2+chan_size+1] + 128;
 
         esc->data_idx  = 0;
         esc->data_size = chan_size;
@@ -143,20 +134,15 @@ static int eightsvx_decode_frame(AVCodecContext *avctx, void *data,
     }
 
     /* get output buffer */
-    esc->frame.nb_samples = buf_size * (is_compr + 1);
+    esc->frame.nb_samples = buf_size * 2;
     if ((ret = avctx->get_buffer(avctx, &esc->frame)) < 0) {
         av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
         return ret;
     }
 
     for (ch = 0; ch < avctx->channels; ch++) {
-        if (is_compr) {
-            delta_decode(esc->frame.data[ch], &esc->data[ch][esc->data_idx],
-                         buf_size, &esc->fib_acc[ch], esc->table);
-        } else {
-            raw_decode(esc->frame.data[ch], &esc->data[ch][esc->data_idx],
-                       buf_size);
-        }
+        delta_decode(esc->frame.data[ch], &esc->data[ch][esc->data_idx],
+                     buf_size, &esc->fib_acc[ch], esc->table);
     }
 
     esc->data_idx += buf_size;
@@ -179,8 +165,6 @@ static av_cold int eightsvx_decode_init(AVCodecContext *avctx)
     switch (avctx->codec->id) {
     case AV_CODEC_ID_8SVX_FIB: esc->table = fibonacci;    break;
     case AV_CODEC_ID_8SVX_EXP: esc->table = exponential;  break;
-    case AV_CODEC_ID_PCM_S8_PLANAR:
-    case AV_CODEC_ID_8SVX_RAW: esc->table = NULL;         break;
     default:
         av_log(avctx, AV_LOG_ERROR, "Invalid codec id %d.\n", avctx->codec->id);
         return AVERROR_INVALIDDATA;
@@ -235,18 +219,3 @@ AVCodec ff_eightsvx_exp_decoder = {
                                                     AV_SAMPLE_FMT_NONE },
 };
 #endif
-#if CONFIG_PCM_S8_PLANAR_DECODER
-AVCodec ff_pcm_s8_planar_decoder = {
-    .name           = "pcm_s8_planar",
-    .type           = AVMEDIA_TYPE_AUDIO,
-    .id             = AV_CODEC_ID_PCM_S8_PLANAR,
-    .priv_data_size = sizeof(EightSvxContext),
-    .init           = eightsvx_decode_init,
-    .close          = eightsvx_decode_close,
-    .decode         = eightsvx_decode_frame,
-    .capabilities   = CODEC_CAP_DR1,
-    .long_name      = NULL_IF_CONFIG_SMALL("PCM signed 8-bit planar"),
-    .sample_fmts    = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_U8P,
-                                                      AV_SAMPLE_FMT_NONE },
-};
-#endif
diff --git a/libavcodec/Makefile b/libavcodec/Makefile
index 7b3462e..5945332 100644
--- a/libavcodec/Makefile
+++ b/libavcodec/Makefile
@@ -521,7 +521,7 @@ 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_S8_PLANAR_DECODER)      += 8svx.o
+OBJS-$(CONFIG_PCM_S8_PLANAR_DECODER)      += pcm.o
 OBJS-$(CONFIG_PCM_S16BE_DECODER)          += pcm.o
 OBJS-$(CONFIG_PCM_S16BE_ENCODER)          += pcm.o
 OBJS-$(CONFIG_PCM_S16BE_PLANAR_DECODER)   += pcm.o
diff --git a/libavcodec/pcm.c b/libavcodec/pcm.c
index 9661ed5..f735b5e 100644
--- a/libavcodec/pcm.c
+++ b/libavcodec/pcm.c
@@ -378,6 +378,17 @@ static int pcm_decode_frame(AVCodecContext *avctx, void *data,
         for (; n > 0; n--)
             *samples++ = *src++ + 128;
         break;
+    case AV_CODEC_ID_PCM_S8_PLANAR:
+    {
+        int i;
+        n /= avctx->channels;
+        for (c = 0; c < avctx->channels; c++) {
+            samples = s->frame.extended_data[c];
+            for (i = n; i > 0; i--)
+                *samples++ = *src++ + 128;
+        }
+        break;
+    }
 #if HAVE_BIGENDIAN
     case AV_CODEC_ID_PCM_F64LE:
         DECODE(64, le64, src, samples, n, 0, 0)
@@ -550,6 +561,7 @@ PCM_CODEC  (PCM_F64LE,        AV_SAMPLE_FMT_DBL, pcm_f64le,        "PCM 64-bit f
 PCM_DECODER(PCM_LXF,          AV_SAMPLE_FMT_S32P,pcm_lxf,          "PCM signed 20-bit little-endian planar");
 PCM_CODEC  (PCM_MULAW,        AV_SAMPLE_FMT_S16, pcm_mulaw,        "PCM mu-law / G.711 mu-law");
 PCM_CODEC  (PCM_S8,           AV_SAMPLE_FMT_U8,  pcm_s8,           "PCM signed 8-bit");
+PCM_DECODER(PCM_S8_PLANAR,    AV_SAMPLE_FMT_U8P, pcm_s8_planar,    "PCM signed 8-bit planar");
 PCM_CODEC  (PCM_S16BE,        AV_SAMPLE_FMT_S16, pcm_s16be,        "PCM signed 16-bit big-endian");
 PCM_DECODER(PCM_S16BE_PLANAR, AV_SAMPLE_FMT_S16P,pcm_s16be_planar, "PCM signed 16-bit big-endian planar");
 PCM_CODEC  (PCM_S16LE,        AV_SAMPLE_FMT_S16, pcm_s16le,        "PCM signed 16-bit little-endian");
diff --git a/libavcodec/utils.c b/libavcodec/utils.c
index a4df3f3..b117271 100644
--- a/libavcodec/utils.c
+++ b/libavcodec/utils.c
@@ -2307,6 +2307,7 @@ int av_get_exact_bits_per_sample(enum AVCodecID codec_id)
     case AV_CODEC_ID_PCM_ALAW:
     case AV_CODEC_ID_PCM_MULAW:
     case AV_CODEC_ID_PCM_S8:
+    case AV_CODEC_ID_PCM_S8_PLANAR:
     case AV_CODEC_ID_PCM_U8:
     case AV_CODEC_ID_PCM_ZORK:
         return 8;
-- 
1.7.11.4



More information about the ffmpeg-devel mailing list