History

avcodec: add decoder for Rayman 2's ADPCM variant

Adds support for the ADPCM variant used in Rayman 2's files.

Zane van Iperen committed 6 years ago

Commit af653571 parent 56df8296 files · +32 −1Browse files

Unified · Split

6 files
  1. libavcodec/Makefile +1 −0
  2. libavcodec/adpcm.c +21 −0
  3. libavcodec/allcodecs.c +1 −0
  4. libavcodec/avcodec.h +1 −0
  5. libavcodec/codec_desc.c +7 −0
  6. libavcodec/version.h +1 −1
libavcodec/Makefile+1−0
@@ -835,6 +835,7 @@ OBJS-$(CONFIG_ADPCM_G726LE_DECODER) += g726.o · 834 unmodified lines
835835 OBJS-$(CONFIG_ADPCM_G726LE_ENCODER) += g726.o
836836 OBJS-$(CONFIG_ADPCM_IMA_AMV_DECODER) += adpcm.o adpcm_data.o
837837 OBJS-$(CONFIG_ADPCM_IMA_APC_DECODER) += adpcm.o adpcm_data.o
838+OBJS-$(CONFIG_ADPCM_IMA_APM_DECODER) += adpcm.o adpcm_data.o
838839 OBJS-$(CONFIG_ADPCM_IMA_DAT4_DECODER) += adpcm.o adpcm_data.o
839840 OBJS-$(CONFIG_ADPCM_IMA_DK3_DECODER) += adpcm.o adpcm_data.o
840841 OBJS-$(CONFIG_ADPCM_IMA_DK4_DECODER) += adpcm.o adpcm_data.o
libavcodec/adpcm.c+21−0
@@ -14,6 +14,7 @@ · 13 unmodified lines
1414 * THP ADPCM decoder by Marco Gerards (mgerards@xs4all.nl)
1515 * Argonaut Games ADPCM decoder by Zane van Iperen (zane@zanevaniperen.com)
1616 * Simon & Schuster Interactive ADPCM decoder by Zane van Iperen (zane@zanevaniperen.com)
17+ * Ubisoft ADPCM decoder by Zane van Iperen (zane@zanevaniperen.com)
1718 *
1819 * This file is part of FFmpeg.
1920 *
@@ -150,6 +151,14 @@ static av_cold int adpcm_decode_init(AVCodecContext * avctx) · 130 unmodified lines
150151 c->status[1].predictor = av_clip_intp2(AV_RL32(avctx->extradata + 4), 18);
151152 }
152153 break;
154+ case AV_CODEC_ID_ADPCM_IMA_APM:
155+ if (avctx->extradata && avctx->extradata_size >= 16) {
156+ c->status[0].predictor = AV_RL32(avctx->extradata + 0);
157+ c->status[0].step_index = AV_RL32(avctx->extradata + 4);
158+ c->status[1].predictor = AV_RL32(avctx->extradata + 8);
159+ c->status[1].step_index = AV_RL32(avctx->extradata + 12);
160+ }
161+ break;
153162 case AV_CODEC_ID_ADPCM_IMA_WS:
154163 if (avctx->extradata && avctx->extradata_size >= 2)
155164 c->vqa_version = AV_RL16(avctx->extradata);
@@ -665,6 +674,7 @@ static int get_nb_samples(AVCodecContext *avctx, GetByteContext *gb, · 509 unmodified lines
665674 case AV_CODEC_ID_ADPCM_YAMAHA:
666675 case AV_CODEC_ID_ADPCM_AICA:
667676 case AV_CODEC_ID_ADPCM_IMA_SSI:
677+ case AV_CODEC_ID_ADPCM_IMA_APM:
668678 nb_samples = buf_size * 2 / ch;
669679 break;
670680 }
@@ -1227,6 +1237,16 @@ static int adpcm_decode_frame(AVCodecContext *avctx, void *data, · 556 unmodified lines
12271237 *samples++ = adpcm_ima_qt_expand_nibble(&c->status[st], v & 0x0F, 3);
12281238 }
12291239 break;
1240+ case AV_CODEC_ID_ADPCM_IMA_APM:
1241+ for (n = nb_samples / 2; n > 0; n--) {
1242+ for (channel = 0; channel < avctx->channels; channel++) {
1243+ int v = bytestream2_get_byteu(&gb);
1244+ *samples++ = adpcm_ima_qt_expand_nibble(&c->status[channel], v >> 4 , 3);
1245+ samples[st] = adpcm_ima_qt_expand_nibble(&c->status[channel], v & 0x0F, 3);
1246+ }
1247+ samples += avctx->channels;
1248+ }
1249+ break;
12301250 case AV_CODEC_ID_ADPCM_IMA_OKI:
12311251 while (bytestream2_get_bytes_left(&gb) > 0) {
12321252 int v = bytestream2_get_byteu(&gb);
@@ -1965,6 +1985,7 @@ ADPCM_DECODER(AV_CODEC_ID_ADPCM_EA_R3, sample_fmts_s16p, adpcm_ea_r3, · 732 unmodified lines
19651985 ADPCM_DECODER(AV_CODEC_ID_ADPCM_EA_XAS, sample_fmts_s16p, adpcm_ea_xas, "ADPCM Electronic Arts XAS");
19661986 ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_AMV, sample_fmts_s16, adpcm_ima_amv, "ADPCM IMA AMV");
19671987 ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_APC, sample_fmts_s16, adpcm_ima_apc, "ADPCM IMA CRYO APC");
1988+ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_APM, sample_fmts_s16, adpcm_ima_apm, "ADPCM IMA Ubisoft APM");
19681989 ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_DAT4, sample_fmts_s16, adpcm_ima_dat4, "ADPCM IMA Eurocom DAT4");
19691990 ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_DK3, sample_fmts_s16, adpcm_ima_dk3, "ADPCM IMA Duck DK3");
19701991 ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_DK4, sample_fmts_s16, adpcm_ima_dk4, "ADPCM IMA Duck DK4");
libavcodec/allcodecs.c+1−0
@@ -600,6 +600,7 @@ extern AVCodec ff_adpcm_g726le_encoder; · 599 unmodified lines
600600 extern AVCodec ff_adpcm_g726le_decoder;
601601 extern AVCodec ff_adpcm_ima_amv_decoder;
602602 extern AVCodec ff_adpcm_ima_apc_decoder;
603+extern AVCodec ff_adpcm_ima_apm_decoder;
603604 extern AVCodec ff_adpcm_ima_dat4_decoder;
604605 extern AVCodec ff_adpcm_ima_dk3_decoder;
605606 extern AVCodec ff_adpcm_ima_dk4_decoder;
libavcodec/avcodec.h+1−0
@@ -549,6 +549,7 @@ enum AVCodecID { · 548 unmodified lines
549549 AV_CODEC_ID_ADPCM_ARGO,
550550 AV_CODEC_ID_ADPCM_IMA_SSI,
551551 AV_CODEC_ID_ADPCM_ZORK,
552+ AV_CODEC_ID_ADPCM_IMA_APM,
552553
553554 /* AMR */
554555 AV_CODEC_ID_AMR_NB = 0x12000,
libavcodec/codec_desc.c+7−0
@@ -2318,6 +2318,13 @@ static const AVCodecDescriptor codec_descriptors[] = { · 2317 unmodified lines
23182318 .long_name = NULL_IF_CONFIG_SMALL("ADPCM Zork"),
23192319 .props = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
23202320 },
2321+ {
2322+ .id = AV_CODEC_ID_ADPCM_IMA_APM,
2323+ .type = AVMEDIA_TYPE_AUDIO,
2324+ .name = "adpcm_ima_apm",
2325+ .long_name = NULL_IF_CONFIG_SMALL("ADPCM IMA Ubisoft APM"),
2326+ .props = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
2327+ },
23212328
23222329 /* AMR */
23232330 {
libavcodec/version.h+1−1
@@ -28,7 +28,7 @@ · 27 unmodified lines
2828 #include "libavutil/version.h"
2929
3030 #define LIBAVCODEC_VERSION_MAJOR 58
31−#define LIBAVCODEC_VERSION_MINOR 71
31+#define LIBAVCODEC_VERSION_MINOR 72
3232 #define LIBAVCODEC_VERSION_MICRO 100
3333
3434 #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t