History

avformat: add XMD demuxer

Paul B Mahol committed 3 years ago

Commit fa425751 parent 280e6e95 files · +84 −2Browse files

Unified · Split

5 files
  1. Changelog +1 −1
  2. libavformat/Makefile +1 −0
  3. libavformat/allformats.c +1 −0
  4. libavformat/version.h +1 −1
  5. libavformat/xmd.c +80 −0
Changelog+1−1
@@ -34,7 +34,7 @@ version <next>: · 33 unmodified lines
3434 - ssim360 video filter
3535 - ffmpeg CLI new options: -enc_stats_pre[_fmt], -enc_stats_post[_fmt]
3636 - hstack_vaapi, vstack_vaapi and xstack_vaapi filters
37−- XMD ADPCM decoder
37+- XMD ADPCM decoder and demuxer
3838
3939
4040 version 5.1:
libavformat/Makefile+1−0
@@ -621,6 +621,7 @@ OBJS-$(CONFIG_WVE_DEMUXER) += wvedec.o pcm.o · 620 unmodified lines
621621 OBJS-$(CONFIG_WV_MUXER) += wvenc.o wv.o apetag.o img2.o
622622 OBJS-$(CONFIG_XA_DEMUXER) += xa.o
623623 OBJS-$(CONFIG_XBIN_DEMUXER) += bintext.o sauce.o
624+OBJS-$(CONFIG_XMD_DEMUXER) += xmd.o pcm.o
624625 OBJS-$(CONFIG_XMV_DEMUXER) += xmv.o
625626 OBJS-$(CONFIG_XVAG_DEMUXER) += xvag.o
626627 OBJS-$(CONFIG_XWMA_DEMUXER) += xwma.o
libavformat/allformats.c+1−0
@@ -501,6 +501,7 @@ extern const AVInputFormat ff_wv_demuxer; · 500 unmodified lines
501501 extern const AVOutputFormat ff_wv_muxer;
502502 extern const AVInputFormat ff_xa_demuxer;
503503 extern const AVInputFormat ff_xbin_demuxer;
504+extern const AVInputFormat ff_xmd_demuxer;
504505 extern const AVInputFormat ff_xmv_demuxer;
505506 extern const AVInputFormat ff_xvag_demuxer;
506507 extern const AVInputFormat ff_xwma_demuxer;
libavformat/version.h+1−1
@@ -31,7 +31,7 @@ · 30 unmodified lines
3131
3232 #include "version_major.h"
3333
34−#define LIBAVFORMAT_VERSION_MINOR 36
34+#define LIBAVFORMAT_VERSION_MINOR 37
3535 #define LIBAVFORMAT_VERSION_MICRO 100
3636
3737 #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
libavformat/xmd.c+80−0
@@ -0,0 +1,80 @@
1+/*
2+ * XMD demuxer
3+ * Copyright (c) 2023 Paul B Mahol
4+ *
5+ * This file is part of FFmpeg.
6+ *
7+ * FFmpeg is free software; you can redistribute it and/or
8+ * modify it under the terms of the GNU Lesser General Public
9+ * License as published by the Free Software Foundation; either
10+ * version 2.1 of the License, or (at your option) any later version.
11+ *
12+ * FFmpeg is distributed in the hope that it will be useful,
13+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
14+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15+ * Lesser General Public License for more details.
16+ *
17+ * You should have received a copy of the GNU Lesser General Public
18+ * License along with FFmpeg; if not, write to the Free Software
19+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20+ */
21+
22+#include "libavutil/channel_layout.h"
23+#include "libavutil/intreadwrite.h"
24+#include "avformat.h"
25+#include "demux.h"
26+#include "internal.h"
27+#include "pcm.h"
28+
29+static int xmd_probe(const AVProbeData *p)
30+{
31+ if ((AV_RL32(p->buf) & 0xFFFFFF) != MKTAG('x','m','d',0))
32+ return 0;
33+ if (p->buf[3] == 0 || p->buf[3] > 2 ||
34+ AV_RL16(p->buf+4) == 0 ||
35+ AV_RL32(p->buf+6) == 0)
36+ return 0;
37+
38+ return AVPROBE_SCORE_MAX / 3;
39+}
40+
41+static int xmd_read_header(AVFormatContext *s)
42+{
43+ AVIOContext *pb = s->pb;
44+ AVCodecParameters *par;
45+ int channels;
46+ AVStream *st;
47+
48+ avio_skip(pb, 3);
49+
50+ st = avformat_new_stream(s, NULL);
51+ if (!st)
52+ return AVERROR(ENOMEM);
53+
54+ par = st->codecpar;
55+ par->codec_type = AVMEDIA_TYPE_AUDIO;
56+ par->codec_id = AV_CODEC_ID_ADPCM_XMD;
57+ channels = avio_r8(pb);
58+ if (channels == 0)
59+ return AVERROR_INVALIDDATA;
60+ av_channel_layout_default(&par->ch_layout, channels);
61+ par->sample_rate = avio_rl16(pb);
62+ if (par->sample_rate <= 0)
63+ return AVERROR_INVALIDDATA;
64+ par->block_align = 21 * channels;
65+ st->duration = (avio_rl32(pb) / par->block_align) * 32LL;
66+ avpriv_set_pts_info(st, 64, 1, par->sample_rate);
67+ avio_skip(pb, 7);
68+
69+ return 0;
70+}
71+
72+const AVInputFormat ff_xmd_demuxer = {
73+ .name = "xmd",
74+ .long_name = NULL_IF_CONFIG_SMALL("Konami XMD"),
75+ .read_probe = xmd_probe,
76+ .read_header = xmd_read_header,
77+ .read_packet = ff_pcm_read_packet,
78+ .flags = AVFMT_GENERIC_INDEX,
79+ .extensions = "xmd",
80+};

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