[FFmpeg-devel] [PATCH v4 1/2] avcodec: add adpcm_ima_ssi encoder

Michael Niedermayer michael at niedermayer.cc
Fri May 15 22:42:11 EEST 2020


On Fri, May 08, 2020 at 02:31:27PM +0000, Zane van Iperen wrote:
> Signed-off-by: Zane van Iperen <zane at zanevaniperen.com>
> ---
>  Changelog              |  1 +
>  doc/general.texi       |  2 +-
>  libavcodec/Makefile    |  1 +
>  libavcodec/adpcmenc.c  | 65 +++++++++++++++++++++++++++++++-----------
>  libavcodec/allcodecs.c |  1 +
>  libavcodec/utils.c     |  1 +
>  libavcodec/version.h   |  2 +-
>  7 files changed, 55 insertions(+), 18 deletions(-)
> 
> diff --git a/Changelog b/Changelog
> index b75d2b6b96..002fccb5cf 100644
> --- a/Changelog
> +++ b/Changelog
> @@ -66,6 +66,7 @@ version <next>:
>  - asubboost filter
>  - Pro Pinball Series Soundbank demuxer
>  - pcm_rechunk bitstream filter
> +- Simon & Schuster Interactive ADPCM encoder
>  
>  
>  version 4.2:
> diff --git a/doc/general.texi b/doc/general.texi
> index 4aaf506e56..9b0ee96752 100644
> --- a/doc/general.texi
> +++ b/doc/general.texi
> @@ -1108,7 +1108,7 @@ following image formats are supported:
>  @item ADPCM IMA Funcom       @tab     @tab  X
>  @item ADPCM IMA High Voltage Software ALP   @tab     @tab  X
>  @item ADPCM IMA QuickTime    @tab  X  @tab  X
> - at item ADPCM IMA Simon & Schuster Interactive   @tab  @tab  X
> + at item ADPCM IMA Simon & Schuster Interactive   @tab  X  @tab  X
>  @item ADPCM IMA Ubisoft APM  @tab     @tab X
>  @item ADPCM IMA Loki SDL MJPEG  @tab     @tab  X
>  @item ADPCM IMA WAV          @tab  X  @tab  X
> diff --git a/libavcodec/Makefile b/libavcodec/Makefile
> index 38f6f07680..2fab8dc40b 100644
> --- a/libavcodec/Makefile
> +++ b/libavcodec/Makefile
> @@ -856,6 +856,7 @@ OBJS-$(CONFIG_ADPCM_IMA_QT_DECODER)       += adpcm.o adpcm_data.o
>  OBJS-$(CONFIG_ADPCM_IMA_QT_ENCODER)       += adpcmenc.o adpcm_data.o
>  OBJS-$(CONFIG_ADPCM_IMA_RAD_DECODER)      += adpcm.o adpcm_data.o
>  OBJS-$(CONFIG_ADPCM_IMA_SSI_DECODER)      += adpcm.o adpcm_data.o
> +OBJS-$(CONFIG_ADPCM_IMA_SSI_ENCODER)      += adpcmenc.o adpcm_data.o
>  OBJS-$(CONFIG_ADPCM_IMA_SMJPEG_DECODER)   += adpcm.o adpcm_data.o
>  OBJS-$(CONFIG_ADPCM_IMA_WAV_DECODER)      += adpcm.o adpcm_data.o
>  OBJS-$(CONFIG_ADPCM_IMA_WAV_ENCODER)      += adpcmenc.o adpcm_data.o
> diff --git a/libavcodec/adpcmenc.c b/libavcodec/adpcmenc.c
> index 668939c778..d1194c1f8f 100644
> --- a/libavcodec/adpcmenc.c
> +++ b/libavcodec/adpcmenc.c
> @@ -77,6 +77,15 @@ static av_cold int adpcm_encode_init(AVCodecContext *avctx)
>          return AVERROR(EINVAL);
>      }
>  
> +    if (avctx->trellis && avctx->codec->id == AV_CODEC_ID_ADPCM_IMA_SSI) {
> +        /*
> +         * The current trellis implementation doesn't work for extended
> +         * runs of samples without periodic resets. Disallow it.
> +         */
> +        av_log(avctx, AV_LOG_ERROR, "trellis not supported\n");

> +        return AVERROR(EINVAL);

AVERROR_PATCHWELCOME

[...]
> @@ -706,21 +737,23 @@ static const enum AVSampleFormat sample_fmts_p[] = {
>      AV_SAMPLE_FMT_S16P, AV_SAMPLE_FMT_NONE
>  };
>  
> -#define ADPCM_ENCODER(id_, name_, sample_fmts_, long_name_) \
> -AVCodec ff_ ## name_ ## _encoder = {                        \
> -    .name           = #name_,                               \
> -    .long_name      = NULL_IF_CONFIG_SMALL(long_name_),     \
> -    .type           = AVMEDIA_TYPE_AUDIO,                   \
> -    .id             = id_,                                  \
> -    .priv_data_size = sizeof(ADPCMEncodeContext),           \
> -    .init           = adpcm_encode_init,                    \
> -    .encode2        = adpcm_encode_frame,                   \
> -    .close          = adpcm_encode_close,                   \
> -    .sample_fmts    = sample_fmts_,                         \
> +#define ADPCM_ENCODER(id_, name_, sample_fmts_, capabilities_, long_name_) \
> +AVCodec ff_ ## name_ ## _encoder = {                                       \
> +    .name           = #name_,                                              \
> +    .long_name      = NULL_IF_CONFIG_SMALL(long_name_),                    \
> +    .type           = AVMEDIA_TYPE_AUDIO,                                  \
> +    .id             = id_,                                                 \
> +    .priv_data_size = sizeof(ADPCMEncodeContext),                          \
> +    .init           = adpcm_encode_init,                                   \
> +    .encode2        = adpcm_encode_frame,                                  \
> +    .close          = adpcm_encode_close,                                  \
> +    .sample_fmts    = sample_fmts_,                                        \
> +    .capabilities   = capabilities_,                                       \
>  }
>  
> -ADPCM_ENCODER(AV_CODEC_ID_ADPCM_IMA_QT,  adpcm_ima_qt,  sample_fmts_p, "ADPCM IMA QuickTime");
> -ADPCM_ENCODER(AV_CODEC_ID_ADPCM_IMA_WAV, adpcm_ima_wav, sample_fmts_p, "ADPCM IMA WAV");
> -ADPCM_ENCODER(AV_CODEC_ID_ADPCM_MS,      adpcm_ms,      sample_fmts,   "ADPCM Microsoft");
> -ADPCM_ENCODER(AV_CODEC_ID_ADPCM_SWF,     adpcm_swf,     sample_fmts,   "ADPCM Shockwave Flash");
> -ADPCM_ENCODER(AV_CODEC_ID_ADPCM_YAMAHA,  adpcm_yamaha,  sample_fmts,   "ADPCM Yamaha");
> +ADPCM_ENCODER(AV_CODEC_ID_ADPCM_IMA_QT,  adpcm_ima_qt,  sample_fmts_p, 0,                             "ADPCM IMA QuickTime");
> +ADPCM_ENCODER(AV_CODEC_ID_ADPCM_IMA_SSI, adpcm_ima_ssi, sample_fmts,   AV_CODEC_CAP_SMALL_LAST_FRAME, "ADPCM IMA Simon & Schuster Interactive");
> +ADPCM_ENCODER(AV_CODEC_ID_ADPCM_IMA_WAV, adpcm_ima_wav, sample_fmts_p, 0,                             "ADPCM IMA WAV");
> +ADPCM_ENCODER(AV_CODEC_ID_ADPCM_MS,      adpcm_ms,      sample_fmts,   0,                             "ADPCM Microsoft");
> +ADPCM_ENCODER(AV_CODEC_ID_ADPCM_SWF,     adpcm_swf,     sample_fmts,   0,                             "ADPCM Shockwave Flash");
> +ADPCM_ENCODER(AV_CODEC_ID_ADPCM_YAMAHA,  adpcm_yamaha,  sample_fmts,   0,                             "ADPCM Yamaha");

This could be split out into a seperate patch which adds the parameter before
the encoder using it, would make the commits slightly more readable

[...]
-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

It is what and why we do it that matters, not just one of them.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 181 bytes
Desc: not available
URL: <https://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20200515/22a0552d/attachment.sig>


More information about the ffmpeg-devel mailing list