History

avcodec: add ADPCM IMA XBOX decoder

Paul B Mahol committed 2 years ago

Commit c3083b31 parent 095f8039 files · +61 −2Browse files

Showing the changes to libavcodec (7 of 9 files). Show all

Unified · Split

7 files
  1. libavcodec/Makefile +1 −0
  2. libavcodec/adpcm.c +41 −0
  3. libavcodec/allcodecs.c +1 −0
  4. libavcodec/codec_desc.c +7 −0
  5. libavcodec/codec_id.h +1 −0
  6. libavcodec/utils.c +6 −0
  7. libavcodec/version.h +2 −2
libavcodec/Makefile+1−0
@@ -977,6 +977,7 @@ OBJS-$(CONFIG_ADPCM_IMA_WAV_DECODER) += adpcm.o adpcm_data.o · 976 unmodified lines
977OBJS-$(CONFIG_ADPCM_IMA_WAV_ENCODER) += adpcmenc.o adpcm_data.o977OBJS-$(CONFIG_ADPCM_IMA_WAV_ENCODER) += adpcmenc.o adpcm_data.o
978OBJS-$(CONFIG_ADPCM_IMA_WS_DECODER) += adpcm.o adpcm_data.o978OBJS-$(CONFIG_ADPCM_IMA_WS_DECODER) += adpcm.o adpcm_data.o
979OBJS-$(CONFIG_ADPCM_IMA_WS_ENCODER) += adpcmenc.o adpcm_data.o979OBJS-$(CONFIG_ADPCM_IMA_WS_ENCODER) += adpcmenc.o adpcm_data.o
980OBJS-$(CONFIG_ADPCM_IMA_XBOX_DECODER) += adpcm.o adpcm_data.o
980OBJS-$(CONFIG_ADPCM_MS_DECODER) += adpcm.o adpcm_data.o981OBJS-$(CONFIG_ADPCM_MS_DECODER) += adpcm.o adpcm_data.o
981OBJS-$(CONFIG_ADPCM_MS_ENCODER) += adpcmenc.o adpcm_data.o982OBJS-$(CONFIG_ADPCM_MS_ENCODER) += adpcmenc.o adpcm_data.o
982OBJS-$(CONFIG_ADPCM_MTAF_DECODER) += adpcm.o adpcm_data.o983OBJS-$(CONFIG_ADPCM_MTAF_DECODER) += adpcm.o adpcm_data.o
libavcodec/adpcm.c+41−0
@@ -307,6 +307,10 @@ static av_cold int adpcm_decode_init(AVCodecContext * avctx) · 306 unmodified lines
307 avctx->block_align != 17 * avctx->ch_layout.nb_channels)307 avctx->block_align != 17 * avctx->ch_layout.nb_channels)
308 return AVERROR_INVALIDDATA;308 return AVERROR_INVALIDDATA;
309 break;309 break;
310 case AV_CODEC_ID_ADPCM_IMA_XBOX:
311 if (avctx->bits_per_coded_sample != 4)
312 return AVERROR_INVALIDDATA;
313 break;
310 case AV_CODEC_ID_ADPCM_ZORK:314 case AV_CODEC_ID_ADPCM_ZORK:
311 if (avctx->bits_per_coded_sample != 8)315 if (avctx->bits_per_coded_sample != 8)
312 return AVERROR_INVALIDDATA;316 return AVERROR_INVALIDDATA;
@@ -321,6 +325,7 @@ static av_cold int adpcm_decode_init(AVCodecContext * avctx) · 8 unmodified lines
321 case AV_CODEC_ID_ADPCM_IMA_DAT4:325 case AV_CODEC_ID_ADPCM_IMA_DAT4:
322 case AV_CODEC_ID_ADPCM_IMA_QT:326 case AV_CODEC_ID_ADPCM_IMA_QT:
323 case AV_CODEC_ID_ADPCM_IMA_WAV:327 case AV_CODEC_ID_ADPCM_IMA_WAV:
328 case AV_CODEC_ID_ADPCM_IMA_XBOX:
324 case AV_CODEC_ID_ADPCM_4XM:329 case AV_CODEC_ID_ADPCM_4XM:
325 case AV_CODEC_ID_ADPCM_XA:330 case AV_CODEC_ID_ADPCM_XA:
326 case AV_CODEC_ID_ADPCM_XMD:331 case AV_CODEC_ID_ADPCM_XMD:
@@ -979,6 +984,15 @@ static int get_nb_samples(AVCodecContext *avctx, GetByteContext *gb, · 652 unmodified lines
979 return AVERROR_INVALIDDATA;984 return AVERROR_INVALIDDATA;
980 nb_samples = 1 + (buf_size - 4 * ch) / (bsize * ch) * bsamples;985 nb_samples = 1 + (buf_size - 4 * ch) / (bsize * ch) * bsamples;
981 ) /* End of CASE */986 ) /* End of CASE */
987 CASE(ADPCM_IMA_XBOX,
988 int bsize = ff_adpcm_ima_block_sizes[avctx->bits_per_coded_sample - 2];
989 int bsamples = ff_adpcm_ima_block_samples[avctx->bits_per_coded_sample - 2];
990 if (avctx->block_align > 0)
991 buf_size = FFMIN(buf_size, avctx->block_align);
992 if (buf_size < 4 * ch)
993 return AVERROR_INVALIDDATA;
994 nb_samples = (buf_size - 4 * ch) / (bsize * ch) * bsamples + 1;
995 ) /* End of CASE */
982 case AV_CODEC_ID_ADPCM_MS:996 case AV_CODEC_ID_ADPCM_MS:
983 if (avctx->block_align > 0)997 if (avctx->block_align > 0)
984 buf_size = FFMIN(buf_size, avctx->block_align);998 buf_size = FFMIN(buf_size, avctx->block_align);
@@ -1197,6 +1211,32 @@ static int adpcm_decode_frame(AVCodecContext *avctx, AVFrame *frame, · 212 unmodified lines
1197 }1211 }
1198 }1212 }
1199 ) /* End of CASE */1213 ) /* End of CASE */
1214 CASE(ADPCM_IMA_XBOX,
1215 for (int i = 0; i < channels; i++) {
1216 ADPCMChannelStatus *cs = &c->status[i];
1217 cs->predictor = samples_p[i][0] = sign_extend(bytestream2_get_le16u(&gb), 16);
1218
1219 cs->step_index = sign_extend(bytestream2_get_le16u(&gb), 16);
1220 if (cs->step_index > 88u) {
1221 av_log(avctx, AV_LOG_ERROR, "ERROR: step_index[%d] = %i\n",
1222 i, cs->step_index);
1223 return AVERROR_INVALIDDATA;
1224 }
1225 }
1226
1227 for (int n = 0; n < (nb_samples-1) / 8; n++) {
1228 for (int i = 0; i < channels; i++) {
1229 ADPCMChannelStatus *cs = &c->status[i];
1230 samples = &samples_p[i][1 + n * 8];
1231 for (int m = 0; m < 8; m += 2) {
1232 int v = bytestream2_get_byteu(&gb);
1233 samples[m ] = adpcm_ima_expand_nibble(cs, v & 0x0F, 3);
1234 samples[m + 1] = adpcm_ima_expand_nibble(cs, v >> 4 , 3);
1235 }
1236 }
1237 }
1238 frame->nb_samples--;
1239 ) /* End of CASE */
1200 CASE(ADPCM_4XM,1240 CASE(ADPCM_4XM,
1201 for (int i = 0; i < channels; i++)1241 for (int i = 0; i < channels; i++)
1202 c->status[i].predictor = sign_extend(bytestream2_get_le16u(&gb), 16);1242 c->status[i].predictor = sign_extend(bytestream2_get_le16u(&gb), 16);
@@ -2404,6 +2444,7 @@ ADPCM_DECODER(ADPCM_IMA_SMJPEG, sample_fmts_s16, adpcm_ima_smjpeg, "ADPCM IMA · 1201 unmodified lines
2404ADPCM_DECODER(ADPCM_IMA_ALP, sample_fmts_s16, adpcm_ima_alp, "ADPCM IMA High Voltage Software ALP")2444ADPCM_DECODER(ADPCM_IMA_ALP, sample_fmts_s16, adpcm_ima_alp, "ADPCM IMA High Voltage Software ALP")
2405ADPCM_DECODER(ADPCM_IMA_WAV, sample_fmts_s16p, adpcm_ima_wav, "ADPCM IMA WAV")2445ADPCM_DECODER(ADPCM_IMA_WAV, sample_fmts_s16p, adpcm_ima_wav, "ADPCM IMA WAV")
2406ADPCM_DECODER(ADPCM_IMA_WS, sample_fmts_both, adpcm_ima_ws, "ADPCM IMA Westwood")2446ADPCM_DECODER(ADPCM_IMA_WS, sample_fmts_both, adpcm_ima_ws, "ADPCM IMA Westwood")
2447ADPCM_DECODER(ADPCM_IMA_XBOX, sample_fmts_s16p, adpcm_ima_xbox, "ADPCM IMA Xbox")
2407ADPCM_DECODER(ADPCM_MS, sample_fmts_both, adpcm_ms, "ADPCM Microsoft")2448ADPCM_DECODER(ADPCM_MS, sample_fmts_both, adpcm_ms, "ADPCM Microsoft")
2408ADPCM_DECODER(ADPCM_MTAF, sample_fmts_s16p, adpcm_mtaf, "ADPCM MTAF")2449ADPCM_DECODER(ADPCM_MTAF, sample_fmts_s16p, adpcm_mtaf, "ADPCM MTAF")
2409ADPCM_DECODER(ADPCM_PSX, sample_fmts_s16p, adpcm_psx, "ADPCM Playstation")2450ADPCM_DECODER(ADPCM_PSX, sample_fmts_s16p, adpcm_psx, "ADPCM Playstation")
libavcodec/allcodecs.c+1−0
@@ -686,6 +686,7 @@ extern const FFCodec ff_adpcm_ima_wav_encoder; · 685 unmodified lines
686extern const FFCodec ff_adpcm_ima_wav_decoder;686extern const FFCodec ff_adpcm_ima_wav_decoder;
687extern const FFCodec ff_adpcm_ima_ws_encoder;687extern const FFCodec ff_adpcm_ima_ws_encoder;
688extern const FFCodec ff_adpcm_ima_ws_decoder;688extern const FFCodec ff_adpcm_ima_ws_decoder;
689extern const FFCodec ff_adpcm_ima_xbox_decoder;
689extern const FFCodec ff_adpcm_ms_encoder;690extern const FFCodec ff_adpcm_ms_encoder;
690extern const FFCodec ff_adpcm_ms_decoder;691extern const FFCodec ff_adpcm_ms_decoder;
691extern const FFCodec ff_adpcm_mtaf_decoder;692extern const FFCodec ff_adpcm_mtaf_decoder;
libavcodec/codec_desc.c+7−0
@@ -2597,6 +2597,13 @@ static const AVCodecDescriptor codec_descriptors[] = { · 2596 unmodified lines
2597 .long_name = NULL_IF_CONFIG_SMALL("ADPCM Konami XMD"),2597 .long_name = NULL_IF_CONFIG_SMALL("ADPCM Konami XMD"),
2598 .props = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,2598 .props = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
2599 },2599 },
2600 {
2601 .id = AV_CODEC_ID_ADPCM_IMA_XBOX,
2602 .type = AVMEDIA_TYPE_AUDIO,
2603 .name = "adpcm_ima_xbox",
2604 .long_name = NULL_IF_CONFIG_SMALL("ADPCM IMA Xbox"),
2605 .props = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
2606 },
2600 2607
2601 /* AMR */2608 /* AMR */
2602 {2609 {
libavcodec/codec_id.h+1−0
@@ -422,6 +422,7 @@ enum AVCodecID { · 421 unmodified lines
422 AV_CODEC_ID_ADPCM_IMA_MOFLEX,422 AV_CODEC_ID_ADPCM_IMA_MOFLEX,
423 AV_CODEC_ID_ADPCM_IMA_ACORN,423 AV_CODEC_ID_ADPCM_IMA_ACORN,
424 AV_CODEC_ID_ADPCM_XMD,424 AV_CODEC_ID_ADPCM_XMD,
425 AV_CODEC_ID_ADPCM_IMA_XBOX,
425 426
426 /* AMR */427 /* AMR */
427 AV_CODEC_ID_AMR_NB = 0x12000,428 AV_CODEC_ID_AMR_NB = 0x12000,
libavcodec/utils.c+6−0
@@ -558,6 +558,7 @@ int av_get_bits_per_sample(enum AVCodecID codec_id) · 557 unmodified lines
558 return 3;558 return 3;
559 case AV_CODEC_ID_ADPCM_SBPRO_4:559 case AV_CODEC_ID_ADPCM_SBPRO_4:
560 case AV_CODEC_ID_ADPCM_IMA_WAV:560 case AV_CODEC_ID_ADPCM_IMA_WAV:
561 case AV_CODEC_ID_ADPCM_IMA_XBOX:
561 case AV_CODEC_ID_ADPCM_IMA_QT:562 case AV_CODEC_ID_ADPCM_IMA_QT:
562 case AV_CODEC_ID_ADPCM_SWF:563 case AV_CODEC_ID_ADPCM_SWF:
563 case AV_CODEC_ID_ADPCM_MS:564 case AV_CODEC_ID_ADPCM_MS:
@@ -720,6 +721,11 @@ static int get_audio_frame_duration(enum AVCodecID id, int sr, int ch, int ba, · 156 unmodified lines
720 int blocks = frame_bytes / ba;721 int blocks = frame_bytes / ba;
721 int64_t tmp = 0;722 int64_t tmp = 0;
722 switch (id) {723 switch (id) {
724 case AV_CODEC_ID_ADPCM_IMA_XBOX:
725 if (bps != 4)
726 return 0;
727 tmp = blocks * ((ba - 4 * ch) / (bps * ch) * 8);
728 break;
723 case AV_CODEC_ID_ADPCM_IMA_WAV:729 case AV_CODEC_ID_ADPCM_IMA_WAV:
724 if (bps < 2 || bps > 5)730 if (bps < 2 || bps > 5)
725 return 0;731 return 0;
libavcodec/version.h+2−2
@@ -29,8 +29,8 @@ · 28 unmodified lines
29 29
30#include "version_major.h"30#include "version_major.h"
31 31
32#define LIBAVCODEC_VERSION_MINOR 2732#define LIBAVCODEC_VERSION_MINOR 28
33#define LIBAVCODEC_VERSION_MICRO 10133#define LIBAVCODEC_VERSION_MICRO 100
34 34
35#define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \35#define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
36 LIBAVCODEC_VERSION_MINOR, \36 LIBAVCODEC_VERSION_MINOR, \

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