Browse code

avcodec: add ADPCM AICA decoder

Signed-off-by: Paul B Mahol <onemda@gmail.com>

Paul B Mahol authored on 2015/10/28 22:51:27
Showing 10 changed files
... ...
@@ -28,6 +28,7 @@ version <next>:
28 28
 - SDX2 DPCM decoder
29 29
 - vibrato filter
30 30
 - innoHeim/Rsupport Screen Capture Codec decoder
31
+- ADPCM AICA decoder
31 32
 
32 33
 
33 34
 version 2.8:
... ...
@@ -887,6 +887,7 @@ following image formats are supported:
887 887
     @tab encoding supported through external library libfaac and libvo-aacenc
888 888
 @item AC-3                   @tab IX  @tab  IX
889 889
 @item ADPCM 4X Movie         @tab     @tab  X
890
+@item APDCM Yamaha AICA      @tab     @tab  X
890 891
 @item ADPCM CDROM XA         @tab     @tab  X
891 892
 @item ADPCM Creative Technology @tab     @tab  X
892 893
     @tab 16 -> 4, 8 -> 4, 8 -> 3, 8 -> 2
... ...
@@ -662,6 +662,7 @@ OBJS-$(CONFIG_ADPCM_4XM_DECODER)          += adpcm.o adpcm_data.o
662 662
 OBJS-$(CONFIG_ADPCM_ADX_DECODER)          += adxdec.o adx.o
663 663
 OBJS-$(CONFIG_ADPCM_ADX_ENCODER)          += adxenc.o adx.o
664 664
 OBJS-$(CONFIG_ADPCM_AFC_DECODER)          += adpcm.o adpcm_data.o
665
+OBJS-$(CONFIG_ADPCM_AICA_DECODER)         += adpcm.o adpcm_data.o
665 666
 OBJS-$(CONFIG_ADPCM_CT_DECODER)           += adpcm.o adpcm_data.o
666 667
 OBJS-$(CONFIG_ADPCM_DTK_DECODER)          += adpcm.o adpcm_data.o
667 668
 OBJS-$(CONFIG_ADPCM_EA_DECODER)           += adpcm.o adpcm_data.o
... ...
@@ -143,6 +143,7 @@ static av_cold int adpcm_decode_init(AVCodecContext * avctx)
143 143
     }
144 144
 
145 145
     switch(avctx->codec->id) {
146
+        case AV_CODEC_ID_ADPCM_AICA:
146 147
         case AV_CODEC_ID_ADPCM_IMA_QT:
147 148
         case AV_CODEC_ID_ADPCM_IMA_WAV:
148 149
         case AV_CODEC_ID_ADPCM_4XM:
... ...
@@ -521,6 +522,7 @@ static int get_nb_samples(AVCodecContext *avctx, GetByteContext *gb,
521 521
     case AV_CODEC_ID_ADPCM_IMA_OKI:
522 522
     case AV_CODEC_ID_ADPCM_IMA_WS:
523 523
     case AV_CODEC_ID_ADPCM_YAMAHA:
524
+    case AV_CODEC_ID_ADPCM_AICA:
524 525
         nb_samples = buf_size * 2 / ch;
525 526
         break;
526 527
     }
... ...
@@ -1380,6 +1382,21 @@ static int adpcm_decode_frame(AVCodecContext *avctx, void *data,
1380 1380
             *samples++ = adpcm_yamaha_expand_nibble(&c->status[st], v >> 4  );
1381 1381
         }
1382 1382
         break;
1383
+    case AV_CODEC_ID_ADPCM_AICA:
1384
+        if (!c->has_status) {
1385
+            for (channel = 0; channel < avctx->channels; channel++)
1386
+                c->status[channel].step = 0;
1387
+            c->has_status = 1;
1388
+        }
1389
+        for (channel = 0; channel < avctx->channels; channel++) {
1390
+            samples = samples_p[channel];
1391
+            for (n = nb_samples >> 1; n > 0; n--) {
1392
+                int v = bytestream2_get_byteu(&gb);
1393
+                *samples++ = adpcm_yamaha_expand_nibble(&c->status[channel], v & 0x0F);
1394
+                *samples++ = adpcm_yamaha_expand_nibble(&c->status[channel], v >> 4  );
1395
+            }
1396
+        }
1397
+        break;
1383 1398
     case AV_CODEC_ID_ADPCM_AFC:
1384 1399
     {
1385 1400
         int samples_per_block;
... ...
@@ -1642,6 +1659,7 @@ AVCodec ff_ ## name_ ## _decoder = {                        \
1642 1642
 /* Note: Do not forget to add new entries to the Makefile as well. */
1643 1643
 ADPCM_DECODER(AV_CODEC_ID_ADPCM_4XM,         sample_fmts_s16p, adpcm_4xm,         "ADPCM 4X Movie");
1644 1644
 ADPCM_DECODER(AV_CODEC_ID_ADPCM_AFC,         sample_fmts_s16p, adpcm_afc,         "ADPCM Nintendo Gamecube AFC");
1645
+ADPCM_DECODER(AV_CODEC_ID_ADPCM_AICA,        sample_fmts_s16p, adpcm_aica,        "ADPCM Yamaha AICA");
1645 1646
 ADPCM_DECODER(AV_CODEC_ID_ADPCM_CT,          sample_fmts_s16,  adpcm_ct,          "ADPCM Creative Technology");
1646 1647
 ADPCM_DECODER(AV_CODEC_ID_ADPCM_DTK,         sample_fmts_s16p, adpcm_dtk,         "ADPCM Nintendo Gamecube DTK");
1647 1648
 ADPCM_DECODER(AV_CODEC_ID_ADPCM_EA,          sample_fmts_s16,  adpcm_ea,          "ADPCM Electronic Arts");
... ...
@@ -488,6 +488,7 @@ void avcodec_register_all(void)
488 488
     REGISTER_DECODER(ADPCM_4XM,         adpcm_4xm);
489 489
     REGISTER_ENCDEC (ADPCM_ADX,         adpcm_adx);
490 490
     REGISTER_DECODER(ADPCM_AFC,         adpcm_afc);
491
+    REGISTER_DECODER(ADPCM_AICA,        adpcm_aica);
491 492
     REGISTER_DECODER(ADPCM_CT,          adpcm_ct);
492 493
     REGISTER_DECODER(ADPCM_DTK,         adpcm_dtk);
493 494
     REGISTER_DECODER(ADPCM_EA,          adpcm_ea);
... ...
@@ -396,6 +396,7 @@ enum AVCodecID {
396 396
     AV_CODEC_ID_ADPCM_G726LE,
397 397
     AV_CODEC_ID_ADPCM_THP_LE,
398 398
     AV_CODEC_ID_ADPCM_PSX,
399
+    AV_CODEC_ID_ADPCM_AICA,
399 400
 
400 401
     /* AMR */
401 402
     AV_CODEC_ID_AMR_NB = 0x12000,
... ...
@@ -1999,6 +1999,13 @@ static const AVCodecDescriptor codec_descriptors[] = {
1999 1999
         .long_name = NULL_IF_CONFIG_SMALL("ADPCM Playstation"),
2000 2000
         .props     = AV_CODEC_PROP_LOSSY,
2001 2001
     },
2002
+    {
2003
+        .id        = AV_CODEC_ID_ADPCM_AICA,
2004
+        .type      = AVMEDIA_TYPE_AUDIO,
2005
+        .name      = "adpcm_aica",
2006
+        .long_name = NULL_IF_CONFIG_SMALL("ADPCM Yamaha AICA"),
2007
+        .props     = AV_CODEC_PROP_LOSSY,
2008
+    },
2002 2009
 
2003 2010
     /* AMR */
2004 2011
     {
... ...
@@ -2901,6 +2901,7 @@ int av_get_exact_bits_per_sample(enum AVCodecID codec_id)
2901 2901
     case AV_CODEC_ID_ADPCM_IMA_WS:
2902 2902
     case AV_CODEC_ID_ADPCM_G722:
2903 2903
     case AV_CODEC_ID_ADPCM_YAMAHA:
2904
+    case AV_CODEC_ID_ADPCM_AICA:
2904 2905
         return 4;
2905 2906
     case AV_CODEC_ID_DSD_LSBF:
2906 2907
     case AV_CODEC_ID_DSD_MSBF:
... ...
@@ -29,7 +29,7 @@
29 29
 #include "libavutil/version.h"
30 30
 
31 31
 #define LIBAVCODEC_VERSION_MAJOR  57
32
-#define LIBAVCODEC_VERSION_MINOR  12
32
+#define LIBAVCODEC_VERSION_MINOR  13
33 33
 #define LIBAVCODEC_VERSION_MICRO 100
34 34
 
35 35
 #define LIBAVCODEC_VERSION_INT  AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
... ...
@@ -90,6 +90,7 @@ static int genh_read_header(AVFormatContext *s)
90 90
                  return ret;
91 91
              AV_WL16(st->codec->extradata, 3);
92 92
              st->codec->codec_id = AV_CODEC_ID_ADPCM_IMA_WS;     break;
93
+    case 10: st->codec->codec_id = AV_CODEC_ID_ADPCM_AICA;       break;
93 94
     case 12: st->codec->codec_id = AV_CODEC_ID_ADPCM_THP;        break;
94 95
     case 13: st->codec->codec_id = AV_CODEC_ID_PCM_U8;           break;
95 96
     case 17: st->codec->codec_id = AV_CODEC_ID_ADPCM_IMA_QT;     break;