Browse code

avcodec: add adpcm dat4 decoder

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

Paul B Mahol authored on 2016/04/03 19:55:17
Showing 8 changed files
... ...
@@ -18,6 +18,7 @@ version <next>:
18 18
 - coreimage filter (GPU based image filtering on OSX)
19 19
 - libdcadec removed
20 20
 - bitstream filter for extracting DTS core
21
+- ADPCM IMA DAT4 decoder
21 22
 
22 23
 version 3.0:
23 24
 - Common Encryption (CENC) MP4 encoding and decoding support
... ...
@@ -695,6 +695,7 @@ OBJS-$(CONFIG_ADPCM_G726_ENCODER)         += g726.o
695 695
 OBJS-$(CONFIG_ADPCM_G726LE_DECODER)       += g726.o
696 696
 OBJS-$(CONFIG_ADPCM_IMA_AMV_DECODER)      += adpcm.o adpcm_data.o
697 697
 OBJS-$(CONFIG_ADPCM_IMA_APC_DECODER)      += adpcm.o adpcm_data.o
698
+OBJS-$(CONFIG_ADPCM_IMA_DAT4_DECODER)     += adpcm.o adpcm_data.o
698 699
 OBJS-$(CONFIG_ADPCM_IMA_DK3_DECODER)      += adpcm.o adpcm_data.o
699 700
 OBJS-$(CONFIG_ADPCM_IMA_DK4_DECODER)      += adpcm.o adpcm_data.o
700 701
 OBJS-$(CONFIG_ADPCM_IMA_EA_EACS_DECODER)  += adpcm.o adpcm_data.o
... ...
@@ -110,6 +110,7 @@ static av_cold int adpcm_decode_init(AVCodecContext * avctx)
110 110
     case AV_CODEC_ID_ADPCM_PSX:
111 111
         max_channels = 8;
112 112
         break;
113
+    case AV_CODEC_ID_ADPCM_IMA_DAT4:
113 114
     case AV_CODEC_ID_ADPCM_THP:
114 115
     case AV_CODEC_ID_ADPCM_THP_LE:
115 116
         max_channels = 14;
... ...
@@ -144,6 +145,7 @@ static av_cold int adpcm_decode_init(AVCodecContext * avctx)
144 144
 
145 145
     switch(avctx->codec->id) {
146 146
         case AV_CODEC_ID_ADPCM_AICA:
147
+        case AV_CODEC_ID_ADPCM_IMA_DAT4:
147 148
         case AV_CODEC_ID_ADPCM_IMA_QT:
148 149
         case AV_CODEC_ID_ADPCM_IMA_WAV:
149 150
         case AV_CODEC_ID_ADPCM_4XM:
... ...
@@ -533,6 +535,7 @@ static int get_nb_samples(AVCodecContext *avctx, GetByteContext *gb,
533 533
     header_size = 0;
534 534
     switch (avctx->codec->id) {
535 535
         case AV_CODEC_ID_ADPCM_4XM:
536
+        case AV_CODEC_ID_ADPCM_IMA_DAT4:
536 537
         case AV_CODEC_ID_ADPCM_IMA_ISS:     header_size = 4 * ch;      break;
537 538
         case AV_CODEC_ID_ADPCM_IMA_AMV:     header_size = 8;           break;
538 539
         case AV_CODEC_ID_ADPCM_IMA_SMJPEG:  header_size = 4 * ch;      break;
... ...
@@ -984,6 +987,18 @@ static int adpcm_decode_frame(AVCodecContext *avctx, void *data,
984 984
             *samples++ = adpcm_ima_expand_nibble(&c->status[st], v2, 3);
985 985
         }
986 986
         break;
987
+    case AV_CODEC_ID_ADPCM_IMA_DAT4:
988
+        for (channel = 0; channel < avctx->channels; channel++) {
989
+            cs = &c->status[channel];
990
+            samples = samples_p[channel];
991
+            bytestream2_skip(&gb, 4);
992
+            for (n = 0; n < nb_samples; n += 2) {
993
+                int v = bytestream2_get_byteu(&gb);
994
+                *samples++ = adpcm_ima_expand_nibble(cs, v >> 4  , 3);
995
+                *samples++ = adpcm_ima_expand_nibble(cs, v & 0x0F, 3);
996
+            }
997
+        }
998
+        break;
987 999
     case AV_CODEC_ID_ADPCM_IMA_APC:
988 1000
         while (bytestream2_get_bytes_left(&gb) > 0) {
989 1001
             int v = bytestream2_get_byteu(&gb);
... ...
@@ -1670,6 +1685,7 @@ ADPCM_DECODER(AV_CODEC_ID_ADPCM_EA_R3,       sample_fmts_s16p, adpcm_ea_r3,
1670 1670
 ADPCM_DECODER(AV_CODEC_ID_ADPCM_EA_XAS,      sample_fmts_s16p, adpcm_ea_xas,      "ADPCM Electronic Arts XAS");
1671 1671
 ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_AMV,     sample_fmts_s16,  adpcm_ima_amv,     "ADPCM IMA AMV");
1672 1672
 ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_APC,     sample_fmts_s16,  adpcm_ima_apc,     "ADPCM IMA CRYO APC");
1673
+ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_DAT4,    sample_fmts_s16,  adpcm_ima_dat4,    "ADPCM IMA Eurocom DAT4");
1673 1674
 ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_DK3,     sample_fmts_s16,  adpcm_ima_dk3,     "ADPCM IMA Duck DK3");
1674 1675
 ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_DK4,     sample_fmts_s16,  adpcm_ima_dk4,     "ADPCM IMA Duck DK4");
1675 1676
 ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_EA_EACS, sample_fmts_s16,  adpcm_ima_ea_eacs, "ADPCM IMA Electronic Arts EACS");
... ...
@@ -515,6 +515,7 @@ void avcodec_register_all(void)
515 515
     REGISTER_DECODER(ADPCM_G726LE,      adpcm_g726le);
516 516
     REGISTER_DECODER(ADPCM_IMA_AMV,     adpcm_ima_amv);
517 517
     REGISTER_DECODER(ADPCM_IMA_APC,     adpcm_ima_apc);
518
+    REGISTER_DECODER(ADPCM_IMA_DAT4,    adpcm_ima_dat4);
518 519
     REGISTER_DECODER(ADPCM_IMA_DK3,     adpcm_ima_dk3);
519 520
     REGISTER_DECODER(ADPCM_IMA_DK4,     adpcm_ima_dk4);
520 521
     REGISTER_DECODER(ADPCM_IMA_EA_EACS, adpcm_ima_ea_eacs);
... ...
@@ -397,6 +397,7 @@ enum AVCodecID {
397 397
     AV_CODEC_ID_ADPCM_THP_LE,
398 398
     AV_CODEC_ID_ADPCM_PSX,
399 399
     AV_CODEC_ID_ADPCM_AICA,
400
+    AV_CODEC_ID_ADPCM_IMA_DAT4,
400 401
 
401 402
     /* AMR */
402 403
     AV_CODEC_ID_AMR_NB = 0x12000,
... ...
@@ -2022,6 +2022,13 @@ static const AVCodecDescriptor codec_descriptors[] = {
2022 2022
         .long_name = NULL_IF_CONFIG_SMALL("ADPCM Yamaha AICA"),
2023 2023
         .props     = AV_CODEC_PROP_LOSSY,
2024 2024
     },
2025
+    {
2026
+        .id        = AV_CODEC_ID_ADPCM_IMA_DAT4,
2027
+        .type      = AVMEDIA_TYPE_AUDIO,
2028
+        .name      = "adpcm_ima_dat4",
2029
+        .long_name = NULL_IF_CONFIG_SMALL("ADPCM IMA Eurocom DAT4"),
2030
+        .props     = AV_CODEC_PROP_LOSSY,
2031
+    },
2025 2032
 
2026 2033
     /* AMR */
2027 2034
     {
... ...
@@ -3239,6 +3239,7 @@ static int get_audio_frame_duration(enum AVCodecID id, int sr, int ch, int ba,
3239 3239
             case AV_CODEC_ID_ADPCM_DTK:
3240 3240
                 return frame_bytes / (16 * ch) * 28;
3241 3241
             case AV_CODEC_ID_ADPCM_4XM:
3242
+            case AV_CODEC_ID_ADPCM_IMA_DAT4:
3242 3243
             case AV_CODEC_ID_ADPCM_IMA_ISS:
3243 3244
                 return (frame_bytes - 4 * ch) * 2 / ch;
3244 3245
             case AV_CODEC_ID_ADPCM_IMA_SMJPEG:
... ...
@@ -28,7 +28,7 @@
28 28
 #include "libavutil/version.h"
29 29
 
30 30
 #define LIBAVCODEC_VERSION_MAJOR  57
31
-#define LIBAVCODEC_VERSION_MINOR  33
31
+#define LIBAVCODEC_VERSION_MINOR  34
32 32
 #define LIBAVCODEC_VERSION_MICRO 100
33 33
 
34 34
 #define LIBAVCODEC_VERSION_INT  AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \