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

Stefano Sabatini stefasab at gmail.com
Tue Nov 20 12:23:29 CET 2012


On date Sunday 2012-11-18 19:37:46 +0000, Paul B Mahol encoded:
> 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;

LGTM (although I have to note that I'm not maintainer for the file),
nice cleanup.
-- 
FFmpeg = Fostering and Fantastic Mysterious Powerful Evanescent Gladiator


More information about the ffmpeg-devel mailing list