From patchwork Wed Jan 25 21:28:38 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul B Mahol X-Patchwork-Id: 40123 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:3ca3:b0:b9:1511:ac2c with SMTP id b35csp26337pzj; Wed, 25 Jan 2023 13:28:52 -0800 (PST) X-Google-Smtp-Source: AMrXdXsEYH4LgngD8M08X9W1lvrBtfubddgZD9O6EBeZHzOitT+RHWOn37AJ2kBoc+pWpK4f8jl/ X-Received: by 2002:a05:6402:2b8c:b0:48f:a9a2:29fa with SMTP id fj12-20020a0564022b8c00b0048fa9a229famr35890932edb.2.1674682131975; Wed, 25 Jan 2023 13:28:51 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1674682131; cv=none; d=google.com; s=arc-20160816; b=sEEUQs/U7xm7J1WUVRSCEOQqbqI0xh2vOjhFpVb/keRCObPraAngxrzbaDVErnX7zi JTXUrTeb9bYkUr8C2YZGFcUHqRG1GplOpTW1E7ArYEKoiKo9tHb7zJV0v3+z3lbOwQkq KGmRJvlT1oJXqUK8fNLZwQGVfrB02ImL5Wmzk5M8Xkw/K1HS29YR2yurcCW25CkDpBP6 0kmxS4QcKb5LUsUXA8RKTdS0MML7ZhGY0vOrddBKoqZQD6R03yCKbm12EPVsm9TtAOWN dLqAnC+ryBgNG4TafdzkYBYrLQWpAouU2SKm0f8Q3HB+4ts8aDMCcqMXToavzcWNQ8rM NKxg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:reply-to:list-subscribe:list-help:list-post :list-archive:list-unsubscribe:list-id:precedence:subject:to :message-id:date:from:mime-version:dkim-signature:delivered-to; bh=Sj+OySbnPsDMWhbvthEq3dyzkdanK+5+TNkvyGgGrdI=; b=jFR7FrGJwOmSRjZVCuxpKjbAetmfi4Yb694HzCxt0O3pKzb6RVuBp8Ux982tOAK6oo /K3QNnW9474ujBwKgDAZkYD7DAOyFcaw7MXUkheX3H2tACBfIQwcts6Z2tpxuOTNtqDE QSRX4Q4skQTJpRlCWfQ+SDhqUp2qBf3CSxzzNQ6KZbe4N1SAahunL6214uDa8diSHej0 UkpYYQBI+P9/zYVJ9oW98LvIR1UKK60UoHeMKZsVptXWWByw0Z1iGgUSxRIhpB4ZwnSe sIFL7kxLWm7zoUhlsCEY36pofVhURqFwgxC384nTPJZypPAGmPgJGST82PotLh5KilPp uURA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=LD80Vt0U; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id p14-20020a056402044e00b00487ceac6d34si7364740edw.137.2023.01.25.13.28.50; Wed, 25 Jan 2023 13:28:51 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=LD80Vt0U; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id A7AFD68BE14; Wed, 25 Jan 2023 23:28:48 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-vs1-f44.google.com (mail-vs1-f44.google.com [209.85.217.44]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 733E468BE09 for ; Wed, 25 Jan 2023 23:28:41 +0200 (EET) Received: by mail-vs1-f44.google.com with SMTP id l125so70314vsc.2 for ; Wed, 25 Jan 2023 13:28:41 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=to:subject:message-id:date:from:mime-version:from:to:cc:subject :date:message-id:reply-to; bh=vBq4Gtl7DPX9CYuQNTWmiIk1NhmUR7z09M3HhV8z3mw=; b=LD80Vt0UvynSf1s6AqDoyJatu7xk/BFdKrzU5XupuJcAnMm9Dd+pivevIO+W4N6MpG +BtR2k5hpzlhHj6djcKXyRAfy8fPcvediWsXwFQ0yQckO8cNVzLRYRNDyUqErKukA7F/ MYUP8K3iMXHGPlhngD+zt8ePxCvGfyFndMlwdaTq6Ei03TbGEJmLggB3BnvA18p2QmBV Lg8Z6jGZC55RtImYt6+yuP1hXJHUAlnZUOYoV5SIVuS/Ro7PA1FrrW4bhvgYf8sAO1kO R/i0BK0DEh+N2xANJ1DmSXmtpEqxsX+TeRhKs4+E1awzRv/PnTbdSEDj4mr8PwW9ogAN /x3w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=to:subject:message-id:date:from:mime-version:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=vBq4Gtl7DPX9CYuQNTWmiIk1NhmUR7z09M3HhV8z3mw=; b=IUfGrNpj/+tXFT53MC3gWSR9TqXcHI7+OgMeFUhmrZO/o+vGLTBP1RHJahv6uHPey/ NPAIASvihhxtqUo71eX1i6T64x7+wbBY500mifds2/zuX2plftVDmBQ6gmLYKrppuesJ xtrlwn5Uh9Y/9vx/C1C8rLjQJdBFH2uPCqBPSKcRdgNKGHB2rPAhGDFkmXF1NULxqfeG nDuAmqJmj0ECmKX4RjwNrU1f6jNq9kEHEYb8ytxjOI15KbXWSN8K0Nh20WLvdliOA+UY 8gk8zGz0OI9fDNkc1IBtdzwcWULSRC7bqXDw7GITwXmPkTxoYQypW9g746vmQFeTuWEF /3mg== X-Gm-Message-State: AFqh2kqtvVc5LtLZicC2Xrer8vTDCyhGyLbVl3/g4zOZR2EecSfjSMgF iorIFx5xa2yNgLoyK1sLWd/Nbxakr9eU1Dj/fEXJjnkb X-Received: by 2002:a05:6102:5587:b0:3b5:32d0:edcc with SMTP id dc7-20020a056102558700b003b532d0edccmr4618949vsb.24.1674682120050; Wed, 25 Jan 2023 13:28:40 -0800 (PST) MIME-Version: 1.0 Received: by 2002:a05:612c:2428:b0:32a:5eaa:92e4 with HTTP; Wed, 25 Jan 2023 13:28:38 -0800 (PST) From: Paul B Mahol Date: Wed, 25 Jan 2023 22:28:38 +0100 Message-ID: To: FFmpeg development discussions and patches Subject: [FFmpeg-devel] [PATCH] XMD demuxer and decoder X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: SgLa8pKZ5Tvm Patch attached. From 280452a604103dbc1088bbeebaf533fdc4bc8eba Mon Sep 17 00:00:00 2001 From: Paul B Mahol Date: Wed, 25 Jan 2023 19:16:03 +0100 Subject: [PATCH 2/2] avformat: add XMD demuxer Signed-off-by: Paul B Mahol --- libavformat/Makefile | 1 + libavformat/allformats.c | 1 + libavformat/xmd.c | 80 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 82 insertions(+) create mode 100644 libavformat/xmd.c diff --git a/libavformat/Makefile b/libavformat/Makefile index 9052b023a7..89dbde9454 100644 --- a/libavformat/Makefile +++ b/libavformat/Makefile @@ -622,6 +622,7 @@ OBJS-$(CONFIG_WVE_DEMUXER) += wvedec.o pcm.o OBJS-$(CONFIG_WV_MUXER) += wvenc.o wv.o apetag.o img2.o OBJS-$(CONFIG_XA_DEMUXER) += xa.o OBJS-$(CONFIG_XBIN_DEMUXER) += bintext.o sauce.o +OBJS-$(CONFIG_XMD_DEMUXER) += xmd.o OBJS-$(CONFIG_XMV_DEMUXER) += xmv.o OBJS-$(CONFIG_XVAG_DEMUXER) += xvag.o OBJS-$(CONFIG_XWMA_DEMUXER) += xwma.o diff --git a/libavformat/allformats.c b/libavformat/allformats.c index 7c01c7f098..b5a3d909bd 100644 --- a/libavformat/allformats.c +++ b/libavformat/allformats.c @@ -502,6 +502,7 @@ extern const AVInputFormat ff_wv_demuxer; extern const AVOutputFormat ff_wv_muxer; extern const AVInputFormat ff_xa_demuxer; extern const AVInputFormat ff_xbin_demuxer; +extern const AVInputFormat ff_xmd_demuxer; extern const AVInputFormat ff_xmv_demuxer; extern const AVInputFormat ff_xvag_demuxer; extern const AVInputFormat ff_xwma_demuxer; diff --git a/libavformat/xmd.c b/libavformat/xmd.c new file mode 100644 index 0000000000..3dd80f4fde --- /dev/null +++ b/libavformat/xmd.c @@ -0,0 +1,80 @@ +/* + * XMD demuxer + * Copyright (c) 2023 Paul B Mahol + * + * 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/channel_layout.h" +#include "libavutil/intreadwrite.h" +#include "avformat.h" +#include "demux.h" +#include "internal.h" +#include "pcm.h" + +static int xmd_probe(const AVProbeData *p) +{ + if ((AV_RL32(p->buf) & 0xFFFFFF) != MKTAG('x','m','d',0)) + return 0; + if (p->buf[3] == 0 || + AV_RL16(p->buf+4) == 0 || + AV_RL32(p->buf+6) == 0) + return 0; + + return AVPROBE_SCORE_MAX / 3; +} + +static int xmd_read_header(AVFormatContext *s) +{ + AVIOContext *pb = s->pb; + AVCodecParameters *par; + int channels; + AVStream *st; + + avio_skip(pb, 3); + + st = avformat_new_stream(s, NULL); + if (!st) + return AVERROR(ENOMEM); + + par = st->codecpar; + par->codec_type = AVMEDIA_TYPE_AUDIO; + par->codec_id = AV_CODEC_ID_ADPCM_XMD; + channels = avio_r8(pb); + if (channels == 0) + return AVERROR_INVALIDDATA; + av_channel_layout_default(&par->ch_layout, channels); + par->sample_rate = avio_rl16(pb); + if (par->sample_rate <= 0) + return AVERROR_INVALIDDATA; + par->block_align = 21 * channels; + st->duration = (avio_rl32(pb) / par->block_align) * 32LL; + avpriv_set_pts_info(st, 64, 1, par->sample_rate); + avio_skip(pb, 7); + + return 0; +} + +const AVInputFormat ff_xmd_demuxer = { + .name = "xmd", + .long_name = NULL_IF_CONFIG_SMALL("Konami XMD"), + .read_probe = xmd_probe, + .read_header = xmd_read_header, + .read_packet = ff_pcm_read_packet, + .flags = AVFMT_GENERIC_INDEX, + .extensions = "xmd", +}; -- 2.39.1