summaryrefslogtreecommitdiff
path: root/libavformat/dfpwmdec.c
diff options
context:
space:
mode:
authorJack Bruienne <jackbruienne@gmail.com>2022-03-07 22:29:57 -0500
committerPaul B Mahol <onemda@gmail.com>2022-03-10 14:11:12 +0100
commit70fef2371c0bde5dea22889e8eeda03d3cddc5aa (patch)
tree553c03f5187cdc0a0fc2fc79614c08f19a915bab /libavformat/dfpwmdec.c
parent39a33038ce58b55288650c75ba7cc1957a522169 (diff)
avformat: add DFPWM raw format
This patch builds on my previous DFPWM codec patch, adding a raw audio format to be able to read/write the raw files that are most commonly used (as no other container format supports it yet). The muxers are mostly copied from the PCM demuxer and the raw muxers, as DFPWM is typically stored as raw data. Please see the previous patch for more information on DFPWM. Signed-off-by: Jack Bruienne <jackbruienne@gmail.com>
Diffstat (limited to 'libavformat/dfpwmdec.c')
-rw-r--r--libavformat/dfpwmdec.c82
1 files changed, 82 insertions, 0 deletions
diff --git a/libavformat/dfpwmdec.c b/libavformat/dfpwmdec.c
new file mode 100644
index 0000000000..25fc5cb30d
--- /dev/null
+++ b/libavformat/dfpwmdec.c
@@ -0,0 +1,82 @@
+/*
+ * RAW PCM demuxers
+ * Copyright (c) 2002 Fabrice Bellard
+ * Copyright (c) 2022 Jack Bruienne
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "libavutil/avstring.h"
+#include "avformat.h"
+#include "internal.h"
+#include "pcm.h"
+#include "libavutil/log.h"
+#include "libavutil/opt.h"
+#include "libavutil/avassert.h"
+
+typedef struct DFPWMAudioDemuxerContext {
+ AVClass *class;
+ int sample_rate;
+ int channels;
+} DFPWMAudioDemuxerContext;
+
+static int dfpwm_read_header(AVFormatContext *s)
+{
+ DFPWMAudioDemuxerContext *s1 = s->priv_data;
+ AVCodecParameters *par;
+ AVStream *st;
+
+ st = avformat_new_stream(s, NULL);
+ if (!st)
+ return AVERROR(ENOMEM);
+ par = st->codecpar;
+
+ par->codec_type = AVMEDIA_TYPE_AUDIO;
+ par->codec_id = s->iformat->raw_codec_id;
+ par->sample_rate = s1->sample_rate;
+ par->channels = s1->channels;
+ par->bits_per_coded_sample = 1;
+ par->block_align = 1;
+
+ avpriv_set_pts_info(st, 64, 1, par->sample_rate);
+ return 0;
+}
+
+static const AVOption dfpwm_options[] = {
+ { "sample_rate", "", offsetof(DFPWMAudioDemuxerContext, sample_rate), AV_OPT_TYPE_INT, {.i64 = 48000}, 0, INT_MAX, AV_OPT_FLAG_DECODING_PARAM },
+ { "channels", "", offsetof(DFPWMAudioDemuxerContext, channels), AV_OPT_TYPE_INT, {.i64 = 1}, 0, INT_MAX, AV_OPT_FLAG_DECODING_PARAM },
+ { NULL },
+};
+static const AVClass dfpwm_demuxer_class = {
+ .class_name = "dfpwm demuxer",
+ .item_name = av_default_item_name,
+ .option = dfpwm_options,
+ .version = LIBAVUTIL_VERSION_INT,
+};
+
+const AVInputFormat ff_dfpwm_demuxer = {
+ .name = "dfpwm",
+ .long_name = NULL_IF_CONFIG_SMALL("raw DFPWM1a"),
+ .priv_data_size = sizeof(DFPWMAudioDemuxerContext),
+ .read_header = dfpwm_read_header,
+ .read_packet = ff_pcm_read_packet,
+ .read_seek = ff_pcm_read_seek,
+ .flags = AVFMT_GENERIC_INDEX,
+ .extensions = "dfpwm",
+ .raw_codec_id = AV_CODEC_ID_DFPWM,
+ .priv_class = &dfpwm_demuxer_class,
+};