[FFmpeg-devel] [PATCH v3 1/2] avcodec: add decoder for High Voltage Software's ALP ADPCM
Paul B Mahol
onemda at gmail.com
Sun Mar 8 16:32:25 EET 2020
lgtm
On 3/8/20, Zane van Iperen <zane at zanevaniperen.com> wrote:
> Signed-off-by: Zane van Iperen <zane at zanevaniperen.com>
> ---
> Changelog | 1 +
> doc/general.texi | 1 +
> libavcodec/Makefile | 1 +
> libavcodec/adpcm.c | 36 ++++++++++++++++++++++++++++++++++++
> libavcodec/allcodecs.c | 1 +
> libavcodec/avcodec.h | 1 +
> libavcodec/codec_desc.c | 7 +++++++
> libavcodec/version.h | 4 ++--
> 8 files changed, 50 insertions(+), 2 deletions(-)
>
> diff --git a/Changelog b/Changelog
> index cb310a3abc..a962657b85 100644
> --- a/Changelog
> +++ b/Changelog
> @@ -43,6 +43,7 @@ version <next>:
> - Rayman 2 ADPCM decoder
> - Rayman 2 APM demuxer
> - cas video filter
> +- High Voltage Software ADPCM decoder
>
>
> version 4.2:
> diff --git a/doc/general.texi b/doc/general.texi
> index dbdc348598..87eaad7791 100644
> --- a/doc/general.texi
> +++ b/doc/general.texi
> @@ -1100,6 +1100,7 @@ following image formats are supported:
> @item ADPCM IMA Electronic Arts EACS @tab @tab X
> @item ADPCM IMA Electronic Arts SEAD @tab @tab X
> @item ADPCM IMA Funcom @tab @tab X
> + at item ADPCM IMA High Voltage Software ALP @tab @tab X
> @item ADPCM IMA QuickTime @tab X @tab X
> @item ADPCM IMA Simon & Schuster Interactive @tab @tab X
> @item ADPCM IMA Ubisoft APM @tab @tab X
> diff --git a/libavcodec/Makefile b/libavcodec/Makefile
> index f1c032b456..0fd374ffed 100644
> --- a/libavcodec/Makefile
> +++ b/libavcodec/Makefile
> @@ -834,6 +834,7 @@ OBJS-$(CONFIG_ADPCM_G726_ENCODER) += g726.o
> OBJS-$(CONFIG_ADPCM_G726LE_DECODER) += g726.o
> OBJS-$(CONFIG_ADPCM_G726LE_ENCODER) += g726.o
> OBJS-$(CONFIG_ADPCM_IMA_AMV_DECODER) += adpcm.o adpcm_data.o
> +OBJS-$(CONFIG_ADPCM_IMA_ALP_DECODER) += adpcm.o adpcm_data.o
> OBJS-$(CONFIG_ADPCM_IMA_APC_DECODER) += adpcm.o adpcm_data.o
> OBJS-$(CONFIG_ADPCM_IMA_APM_DECODER) += adpcm.o adpcm_data.o
> OBJS-$(CONFIG_ADPCM_IMA_DAT4_DECODER) += adpcm.o adpcm_data.o
> diff --git a/libavcodec/adpcm.c b/libavcodec/adpcm.c
> index 5f152ee6ef..c69cac3379 100644
> --- a/libavcodec/adpcm.c
> +++ b/libavcodec/adpcm.c
> @@ -15,6 +15,7 @@
> * Argonaut Games ADPCM decoder by Zane van Iperen (zane at zanevaniperen.com)
> * Simon & Schuster Interactive ADPCM decoder by Zane van Iperen
> (zane at zanevaniperen.com)
> * Ubisoft ADPCM decoder by Zane van Iperen (zane at zanevaniperen.com)
> + * High Voltage Software ALP decoder by Zane van Iperen
> (zane at zanevaniperen.com)
> *
> * This file is part of FFmpeg.
> *
> @@ -280,6 +281,29 @@ static inline int16_t
> adpcm_ima_expand_nibble(ADPCMChannelStatus *c, int8_t nibb
> return (int16_t)c->predictor;
> }
>
> +static inline int16_t adpcm_ima_alp_expand_nibble(ADPCMChannelStatus *c,
> int8_t nibble, int shift)
> +{
> + int step_index;
> + int predictor;
> + int sign, delta, diff, step;
> +
> + step = ff_adpcm_step_table[c->step_index];
> + step_index = c->step_index + ff_adpcm_index_table[(unsigned)nibble];
> + step_index = av_clip(step_index, 0, 88);
> +
> + sign = nibble & 8;
> + delta = nibble & 7;
> + diff = (delta * step) >> shift;
> + predictor = c->predictor;
> + if (sign) predictor -= diff;
> + else predictor += diff;
> +
> + c->predictor = av_clip_int16(predictor);
> + c->step_index = step_index;
> +
> + return (int16_t)c->predictor;
> +}
> +
> static inline int16_t adpcm_ima_wav_expand_nibble(ADPCMChannelStatus *c,
> GetBitContext *gb, int bps)
> {
> int nibble, step_index, predictor, sign, delta, diff, step, shift;
> @@ -675,6 +699,7 @@ static int get_nb_samples(AVCodecContext *avctx,
> GetByteContext *gb,
> case AV_CODEC_ID_ADPCM_AICA:
> case AV_CODEC_ID_ADPCM_IMA_SSI:
> case AV_CODEC_ID_ADPCM_IMA_APM:
> + case AV_CODEC_ID_ADPCM_IMA_ALP:
> nb_samples = buf_size * 2 / ch;
> break;
> }
> @@ -1247,6 +1272,16 @@ static int adpcm_decode_frame(AVCodecContext *avctx,
> void *data,
> samples += avctx->channels;
> }
> break;
> + case AV_CODEC_ID_ADPCM_IMA_ALP:
> + for (n = nb_samples / 2; n > 0; n--) {
> + for (channel = 0; channel < avctx->channels; channel++) {
> + int v = bytestream2_get_byteu(&gb);
> + *samples++ =
> adpcm_ima_alp_expand_nibble(&c->status[channel], v >> 4 , 2);
> + samples[st] =
> adpcm_ima_alp_expand_nibble(&c->status[channel], v & 0x0F, 2);
> + }
> + samples += avctx->channels;
> + }
> + break;
> case AV_CODEC_ID_ADPCM_IMA_OKI:
> while (bytestream2_get_bytes_left(&gb) > 0) {
> int v = bytestream2_get_byteu(&gb);
> @@ -1997,6 +2032,7 @@ ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_QT,
> sample_fmts_s16p, adpcm_ima_qt,
> ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_RAD, sample_fmts_s16,
> adpcm_ima_rad, "ADPCM IMA Radical");
> ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_SSI, sample_fmts_s16,
> adpcm_ima_ssi, "ADPCM IMA Simon & Schuster Interactive");
> ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_SMJPEG, sample_fmts_s16,
> adpcm_ima_smjpeg, "ADPCM IMA Loki SDL MJPEG");
> +ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_ALP, sample_fmts_s16,
> adpcm_ima_alp, "ADPCM IMA High Voltage Software ALP");
> ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_WAV, sample_fmts_s16p,
> adpcm_ima_wav, "ADPCM IMA WAV");
> ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_WS, sample_fmts_both,
> adpcm_ima_ws, "ADPCM IMA Westwood");
> ADPCM_DECODER(AV_CODEC_ID_ADPCM_MS, sample_fmts_both, adpcm_ms,
> "ADPCM Microsoft");
> diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c
> index 674995df72..f4cf180716 100644
> --- a/libavcodec/allcodecs.c
> +++ b/libavcodec/allcodecs.c
> @@ -599,6 +599,7 @@ extern AVCodec ff_adpcm_g726_decoder;
> extern AVCodec ff_adpcm_g726le_encoder;
> extern AVCodec ff_adpcm_g726le_decoder;
> extern AVCodec ff_adpcm_ima_amv_decoder;
> +extern AVCodec ff_adpcm_ima_alp_decoder;
> extern AVCodec ff_adpcm_ima_apc_decoder;
> extern AVCodec ff_adpcm_ima_apm_decoder;
> extern AVCodec ff_adpcm_ima_dat4_decoder;
> diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
> index 5a0fc3405c..833642d692 100644
> --- a/libavcodec/avcodec.h
> +++ b/libavcodec/avcodec.h
> @@ -552,6 +552,7 @@ enum AVCodecID {
> AV_CODEC_ID_ADPCM_IMA_SSI,
> AV_CODEC_ID_ADPCM_ZORK,
> AV_CODEC_ID_ADPCM_IMA_APM,
> + AV_CODEC_ID_ADPCM_IMA_ALP,
>
> /* AMR */
> AV_CODEC_ID_AMR_NB = 0x12000,
> diff --git a/libavcodec/codec_desc.c b/libavcodec/codec_desc.c
> index 52178e7afe..0f5ddd9a9f 100644
> --- a/libavcodec/codec_desc.c
> +++ b/libavcodec/codec_desc.c
> @@ -2325,6 +2325,13 @@ static const AVCodecDescriptor codec_descriptors[] =
> {
> .long_name = NULL_IF_CONFIG_SMALL("ADPCM IMA Ubisoft APM"),
> .props = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
> },
> + {
> + .id = AV_CODEC_ID_ADPCM_IMA_ALP,
> + .type = AVMEDIA_TYPE_AUDIO,
> + .name = "adpcm_ima_alp",
> + .long_name = NULL_IF_CONFIG_SMALL("ADPCM IMA High Voltage Software
> ALP"),
> + .props = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
> + },
>
> /* AMR */
> {
> diff --git a/libavcodec/version.h b/libavcodec/version.h
> index 36536c3725..c051ac0754 100644
> --- a/libavcodec/version.h
> +++ b/libavcodec/version.h
> @@ -28,8 +28,8 @@
> #include "libavutil/version.h"
>
> #define LIBAVCODEC_VERSION_MAJOR 58
> -#define LIBAVCODEC_VERSION_MINOR 73
> -#define LIBAVCODEC_VERSION_MICRO 102
> +#define LIBAVCODEC_VERSION_MINOR 74
> +#define LIBAVCODEC_VERSION_MICRO 100
>
> #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
> LIBAVCODEC_VERSION_MINOR, \
> --
> 2.17.1
>
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".
More information about the ffmpeg-devel
mailing list