Browse code

ADP demuxer

Signed-off-by: James Almer <jamrial@gmail.com>

James Almer authored on 2013/05/04 06:08:05
Showing 8 changed files
... ...
@@ -41,6 +41,7 @@ version <next>:
41 41
 - extractplanes filter
42 42
 - avectorscope filter
43 43
 - ADPCM DTK decoder
44
+- ADP demuxer
44 45
 
45 46
 
46 47
 version 1.2:
... ...
@@ -147,6 +147,8 @@ library:
147 147
     @tab Multimedia format used in game Heart Of Darkness.
148 148
 @item Apple HTTP Live Streaming @tab   @tab X
149 149
 @item Artworx Data Format       @tab   @tab X
150
+@item ADP                       @tab   @tab X
151
+    @tab Audio format used on the Nintendo Gamecube.
150 152
 @item AFC                       @tab   @tab X
151 153
     @tab Audio format used on the Nintendo Gamecube.
152 154
 @item ASF                       @tab X @tab X
... ...
@@ -55,6 +55,7 @@ OBJS-$(CONFIG_AC3_DEMUXER)               += ac3dec.o rawdec.o
55 55
 OBJS-$(CONFIG_AC3_MUXER)                 += rawenc.o
56 56
 OBJS-$(CONFIG_ACT_DEMUXER)               += act.o
57 57
 OBJS-$(CONFIG_ADF_DEMUXER)               += bintext.o sauce.o
58
+OBJS-$(CONFIG_ADP_DEMUXER)               += adp.o
58 59
 OBJS-$(CONFIG_ADX_DEMUXER)               += adxdec.o
59 60
 OBJS-$(CONFIG_ADX_MUXER)                 += rawenc.o
60 61
 OBJS-$(CONFIG_ADTS_MUXER)                += adtsenc.o
61 62
new file mode 100644
... ...
@@ -0,0 +1,91 @@
0
+/*
1
+ * ADP demuxer
2
+ * Copyright (c) 2013 James Almer
3
+ *
4
+ * This file is part of FFmpeg.
5
+ *
6
+ * FFmpeg is free software; you can redistribute it and/or
7
+ * modify it under the terms of the GNU Lesser General Public
8
+ * License as published by the Free Software Foundation; either
9
+ * version 2.1 of the License, or (at your option) any later version.
10
+ *
11
+ * FFmpeg is distributed in the hope that it will be useful,
12
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14
+ * Lesser General Public License for more details.
15
+ *
16
+ * You should have received a copy of the GNU Lesser General Public
17
+ * License along with FFmpeg; if not, write to the Free Software
18
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19
+ */
20
+
21
+#include "libavutil/channel_layout.h"
22
+#include "libavutil/intreadwrite.h"
23
+#include "avformat.h"
24
+#include "internal.h"
25
+
26
+static int adp_probe(AVProbeData *p)
27
+{
28
+    int i;
29
+
30
+    if (p->buf_size < 32)
31
+        return 0;
32
+
33
+    for (i = 0; i < p->buf_size - 3; i+=32)
34
+        if (p->buf[i] != p->buf[i+2] || p->buf[i+1] != p->buf[i+3])
35
+            return 0;
36
+
37
+    return p->buf_size < 260 ? 1 : AVPROBE_SCORE_MAX / 4;
38
+}
39
+
40
+static int adp_read_header(AVFormatContext *s)
41
+{
42
+    AVStream *st;
43
+
44
+    st = avformat_new_stream(s, NULL);
45
+    if (!st)
46
+        return AVERROR(ENOMEM);
47
+
48
+    st->codec->codec_type     = AVMEDIA_TYPE_AUDIO;
49
+    st->codec->codec_id       = AV_CODEC_ID_ADPCM_DTK;
50
+    st->codec->channel_layout = AV_CH_LAYOUT_STEREO;
51
+    st->codec->channels       = 2;
52
+    st->codec->sample_rate    = 48000;
53
+    st->start_time            = 0;
54
+    if (s->pb->seekable)
55
+        st->duration          = av_get_audio_frame_duration(st->codec, avio_size(s->pb));
56
+
57
+    avpriv_set_pts_info(st, 64, 1, st->codec->sample_rate);
58
+
59
+    return 0;
60
+}
61
+
62
+static int adp_read_packet(AVFormatContext *s, AVPacket *pkt)
63
+{
64
+    int ret, size = 1024;
65
+
66
+    if (url_feof(s->pb))
67
+        return AVERROR_EOF;
68
+
69
+    ret = av_get_packet(s->pb, pkt, size);
70
+
71
+    if (ret != size) {
72
+        if (ret < 0) {
73
+            av_free_packet(pkt);
74
+            return ret;
75
+        }
76
+        av_shrink_packet(pkt, ret);
77
+    }
78
+    pkt->stream_index = 0;
79
+
80
+    return ret;
81
+}
82
+
83
+AVInputFormat ff_adp_demuxer = {
84
+    .name           = "adp",
85
+    .long_name      = NULL_IF_CONFIG_SMALL("ADP"),
86
+    .read_probe     = adp_probe,
87
+    .read_header    = adp_read_header,
88
+    .read_packet    = adp_read_packet,
89
+    .extensions     = "adp,dtk",
90
+};
... ...
@@ -65,6 +65,7 @@ void av_register_all(void)
65 65
     REGISTER_MUXDEMUX(AC3,              ac3);
66 66
     REGISTER_DEMUXER (ACT,              act);
67 67
     REGISTER_DEMUXER (ADF,              adf);
68
+    REGISTER_DEMUXER (ADP,              adp);
68 69
     REGISTER_MUXER   (ADTS,             adts);
69 70
     REGISTER_MUXDEMUX(ADX,              adx);
70 71
     REGISTER_DEMUXER (AEA,              aea);
... ...
@@ -30,8 +30,8 @@
30 30
 #include "libavutil/avutil.h"
31 31
 
32 32
 #define LIBAVFORMAT_VERSION_MAJOR 55
33
-#define LIBAVFORMAT_VERSION_MINOR  4
34
-#define LIBAVFORMAT_VERSION_MICRO 101
33
+#define LIBAVFORMAT_VERSION_MINOR  5
34
+#define LIBAVFORMAT_VERSION_MICRO 100
35 35
 
36 36
 #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
37 37
                                                LIBAVFORMAT_VERSION_MINOR, \
... ...
@@ -16,6 +16,9 @@ fate-adpcm-creative-8-2.6bit: CMD = md5 -i $(SAMPLES)/creative/BBC_3BIT.VOC -f s
16 16
 FATE_ADPCM-$(call DEMDEC, VOC, ADPCM_SBPRO_4) += fate-adpcm-creative-8-4bit
17 17
 fate-adpcm-creative-8-4bit: CMD = md5 -i $(SAMPLES)/creative/BBC_4BIT.VOC -f s16le
18 18
 
19
+FATE_ADPCM-$(call DEMDEC, ADP, ADPCM_DTK) += fate-adpcm-dtk
20
+fate-adpcm-dtk: CMD = framecrc -i $(SAMPLES)/adp/shakespr_partial.adp -f s16le
21
+
19 22
 FATE_ADPCM-$(call DEMDEC, EA, ADPCM_EA) += fate-adpcm-ea-1
20 23
 fate-adpcm-ea-1: CMD = framecrc -i $(SAMPLES)/ea-wve/networkBackbone-partial.wve -frames:a 26 -vn
21 24
 
22 25
new file mode 100644
... ...
@@ -0,0 +1,33 @@
0
+#tb 0: 1/48000
1
+0,          0,          0,      896,     3584, 0xdae789d5
2
+0,        896,        896,      896,     3584, 0x168ed9b6
3
+0,       1792,       1792,      896,     3584, 0x8920c8d5
4
+0,       2688,       2688,      896,     3584, 0xaf0a3245
5
+0,       3584,       3584,      896,     3584, 0x884ee935
6
+0,       4480,       4480,      896,     3584, 0xe6a832ad
7
+0,       5376,       5376,      896,     3584, 0x1fa12ea2
8
+0,       6272,       6272,      896,     3584, 0xf119198c
9
+0,       7168,       7168,      896,     3584, 0x0a6dbf72
10
+0,       8064,       8064,      896,     3584, 0xd3467881
11
+0,       8960,       8960,      896,     3584, 0x25d504ec
12
+0,       9856,       9856,      896,     3584, 0x452730c9
13
+0,      10752,      10752,      896,     3584, 0x42b92ff1
14
+0,      11648,      11648,      896,     3584, 0x85c67bf3
15
+0,      12544,      12544,      896,     3584, 0xab4d99e9
16
+0,      13440,      13440,      896,     3584, 0xe5bfc4da
17
+0,      14336,      14336,      896,     3584, 0x7a5210e9
18
+0,      15232,      15232,      896,     3584, 0x5265fcd3
19
+0,      16128,      16128,      896,     3584, 0x76531427
20
+0,      17024,      17024,      896,     3584, 0xb2b8d7ab
21
+0,      17920,      17920,      896,     3584, 0x05a453e8
22
+0,      18816,      18816,      896,     3584, 0x742c45bb
23
+0,      19712,      19712,      896,     3584, 0x57aaee3b
24
+0,      20608,      20608,      896,     3584, 0x997bf703
25
+0,      21504,      21504,      896,     3584, 0xe2d14b13
26
+0,      22400,      22400,      896,     3584, 0xdafbdd2f
27
+0,      23296,      23296,      896,     3584, 0x448cec3a
28
+0,      24192,      24192,      896,     3584, 0xe6f6fb9c
29
+0,      25088,      25088,      896,     3584, 0x0310276a
30
+0,      25984,      25984,      896,     3584, 0x44bf04e9
31
+0,      26880,      26880,      896,     3584, 0xe2105d33
32
+0,      27776,      27776,      896,     3584, 0x08b7d5e0