From patchwork Thu Feb 20 11:31:46 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zane van Iperen X-Patchwork-Id: 17853 Delivered-To: andriy.gelman@gmail.com Received: by 2002:a05:6214:1865:0:0:0:0 with SMTP id eh5csp1642801qvb; Thu, 20 Feb 2020 03:32:06 -0800 (PST) X-Google-Smtp-Source: APXvYqxMTIo8Y/VyzSbKcvalpMPnZxjBNpwXzj5d8J2NeqoYqoMV5oTLn+7DYe/bBHPvtZ4LLyf+ X-Received: by 2002:a17:906:5294:: with SMTP id c20mr29186459ejm.57.1582198326844; Thu, 20 Feb 2020 03:32:06 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1582198326; cv=none; d=google.com; s=arc-20160816; b=VsmioZCy+++bTXe2HXr0WPd0xS1D3s9Nsuumf0/1Y5B9wkfGR6qB0aqcKSnJxghfef DCttD8Ncujt6VVZ4qyUNA4E9K1fyGf9Qscc10d2825CTvtqe5RnsL9GBsYDw9ieOUduc SC4HLg4h5DdeyeCdcUPWjakrYyigw4oSDnqJOPHnLWzC+YLxI+JIjVKZVnQeMuCh8sij q31pQb8PHAvJwL07sUyKOcAWJ57BS8tIssOg+3R3DFAzQzoF3N1blVxOK9LGkq3PNRRx h6EPYMLfsM1e8g92DkMKZpAw1LPsu/8VU4LKGf3eotUGkoM90C+hYK3dXrkM/IdHurZm 7j/w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:feedback-id:references :in-reply-to:message-id:from:to:dkim-signature:date:delivered-to; bh=kf8661OO07JBw9T7xcK7ksqRYTUBm2xVPgqIkEY6g/4=; b=t1fwaILuL3vn3BywRRz4zBWt+HWgW5JCJ++8b7uXIyxY3l0J5qY5x57QAYN1hGF8Oj ToFJ/Sq3TkMGxbHnr/anYJ9N2COfV51ObNfpGHR3+R53XQdbVY+OZpbm+x5P5JGQcw/Z sHp4SArUbr3EL0C7RgChpQpXzX3lOxrpy40QLe6DTZjdSXdejYK52U3KAfu1uZU3ptha lNwk7EER5Fwyv6ayBl9jjH0nVY4IQlHq2NkDlcwG/cezs7jEX5DQTNhESMsv3Xy4NjG6 vT+rdxVv60Er5XsA+EPL2zZKYQ2VlRdu7uQqqvFjFFYWg8QjSPKsjHoZd/0ydga5ukUN V65g== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@zanevaniperen.com header.s=protonmail header.b=i3AtmXzN; 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=NONE dis=NONE) header.from=zanevaniperen.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id oa22si1799662ejb.210.2020.02.20.03.32.06; Thu, 20 Feb 2020 03:32:06 -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=@zanevaniperen.com header.s=protonmail header.b=i3AtmXzN; 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=NONE dis=NONE) header.from=zanevaniperen.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 0792668B01A; Thu, 20 Feb 2020 13:32:02 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail1.protonmail.ch (mail1.protonmail.ch [185.70.40.18]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id B614A68AFE4 for ; Thu, 20 Feb 2020 13:31:55 +0200 (EET) Date: Thu, 20 Feb 2020 11:31:46 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=zanevaniperen.com; s=protonmail; t=1582198314; bh=T2CvSgVUpRWejj0gECd1cqvhkELiTx9PQb5K/ALc2+w=; h=Date:To:From:Cc:Reply-To:Subject:In-Reply-To:References: Feedback-ID:From; b=i3AtmXzNdgkT+VLbLrbvBD/8XWR8OeZemSUCp1wJvUv/KO2DbGaDK9oaZGVsSrk6J kUti0PGb3gLxCOKbo68k54XIH2ji2wwJRd9e1C46HMnj+5Wdbko2wy7DJmdV1cV8+H mzqqzCEDHs4t4LCa2Ql3vi7tYnK10kieZdzvJiHY= To: ffmpeg-devel@ffmpeg.org From: Zane van Iperen Message-ID: <20200220113124.8083-2-zane@zanevaniperen.com> In-Reply-To: <20200220113124.8083-1-zane@zanevaniperen.com> References: <20200220113124.8083-1-zane@zanevaniperen.com> Feedback-ID: xylLYHwBzJW7F28tHN-oL9EBm6h5yqtCqG6YwPpJ2oMwBYJT6-HxTnFTF6p18axLiSywX61iUfj4CElBGg8-GA==:Ext:ProtonMail MIME-Version: 1.0 X-Spam-Status: No, score=-1.2 required=7.0 tests=ALL_TRUSTED,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF shortcircuit=no autolearn=disabled version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on mail.protonmail.ch Subject: [FFmpeg-devel] [PATCH v3 1/2] avcodec: add decoder for Rayman 2's ADPCM variant X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 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 Cc: Zane van Iperen Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: t6g1y2t+/CZq Content-Length: 8815 Adds support for the ADPCM variant used in Rayman 2's files. Signed-off-by: Zane van Iperen --- libavcodec/Makefile | 1 + libavcodec/adpcm.c | 21 +++++++++++++++++++++ libavcodec/allcodecs.c | 1 + libavcodec/avcodec.h | 1 + libavcodec/codec_desc.c | 7 +++++++ libavcodec/version.h | 2 +- 6 files changed, 32 insertions(+), 1 deletion(-) diff --git a/libavcodec/Makefile b/libavcodec/Makefile index 71eeb60901..1ade20613f 100644 --- a/libavcodec/Makefile +++ b/libavcodec/Makefile @@ -834,6 +834,7 @@ OBJS-$(CONFIG_ADPCM_G726LE_DECODER) += g726.o OBJS-$(CONFIG_ADPCM_G726LE_ENCODER) += g726.o OBJS-$(CONFIG_ADPCM_IMA_AMV_DECODER) += adpcm.o adpcm_data.o OBJS-$(CONFIG_ADPCM_IMA_APC_DECODER) += adpcm.o adpcm_data.o +OBJS-$(CONFIG_ADPCM_IMA_APM_DECODER) += adpcm.o adpcm_data.o OBJS-$(CONFIG_ADPCM_IMA_DAT4_DECODER) += adpcm.o adpcm_data.o OBJS-$(CONFIG_ADPCM_IMA_DK3_DECODER) += adpcm.o adpcm_data.o OBJS-$(CONFIG_ADPCM_IMA_DK4_DECODER) += adpcm.o adpcm_data.o diff --git a/libavcodec/adpcm.c b/libavcodec/adpcm.c index f5d20ddd81..9bc5175d24 100644 --- a/libavcodec/adpcm.c +++ b/libavcodec/adpcm.c @@ -14,6 +14,7 @@ * THP ADPCM decoder by Marco Gerards (mgerards@xs4all.nl) * Argonaut Games ADPCM decoder by Zane van Iperen (zane@zanevaniperen.com) * Simon & Schuster Interactive ADPCM decoder by Zane van Iperen (zane@zanevaniperen.com) + * Ubisoft ADPCM decoder by Zane van Iperen (zane@zanevaniperen.com) * * This file is part of FFmpeg. * @@ -150,6 +151,14 @@ static av_cold int adpcm_decode_init(AVCodecContext * avctx) c->status[1].predictor = av_clip_intp2(AV_RL32(avctx->extradata + 4), 18); } break; + case AV_CODEC_ID_ADPCM_IMA_APM: + if (avctx->extradata && avctx->extradata_size >= 16) { + c->status[0].predictor = AV_RL32(avctx->extradata + 0); + c->status[0].step_index = AV_RL32(avctx->extradata + 4); + c->status[1].predictor = AV_RL32(avctx->extradata + 8); + c->status[1].step_index = AV_RL32(avctx->extradata + 12); + } + break; case AV_CODEC_ID_ADPCM_IMA_WS: if (avctx->extradata && avctx->extradata_size >= 2) c->vqa_version = AV_RL16(avctx->extradata); @@ -665,6 +674,7 @@ static int get_nb_samples(AVCodecContext *avctx, GetByteContext *gb, case AV_CODEC_ID_ADPCM_YAMAHA: case AV_CODEC_ID_ADPCM_AICA: case AV_CODEC_ID_ADPCM_IMA_SSI: + case AV_CODEC_ID_ADPCM_IMA_APM: nb_samples = buf_size * 2 / ch; break; } @@ -1227,6 +1237,16 @@ static int adpcm_decode_frame(AVCodecContext *avctx, void *data, *samples++ = adpcm_ima_qt_expand_nibble(&c->status[st], v & 0x0F, 3); } break; + case AV_CODEC_ID_ADPCM_IMA_APM: + for (n = nb_samples / 2; n > 0; n--) { + for (channel = 0; channel < avctx->channels; channel++) { + int v = bytestream2_get_byteu(&gb); + *samples++ = adpcm_ima_qt_expand_nibble(&c->status[channel], v >> 4 , 3); + samples[st] = adpcm_ima_qt_expand_nibble(&c->status[channel], v & 0x0F, 3); + } + samples += avctx->channels; + } + break; case AV_CODEC_ID_ADPCM_IMA_OKI: while (bytestream2_get_bytes_left(&gb) > 0) { int v = bytestream2_get_byteu(&gb); @@ -1965,6 +1985,7 @@ ADPCM_DECODER(AV_CODEC_ID_ADPCM_EA_R3, sample_fmts_s16p, adpcm_ea_r3, ADPCM_DECODER(AV_CODEC_ID_ADPCM_EA_XAS, sample_fmts_s16p, adpcm_ea_xas, "ADPCM Electronic Arts XAS"); ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_AMV, sample_fmts_s16, adpcm_ima_amv, "ADPCM IMA AMV"); ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_APC, sample_fmts_s16, adpcm_ima_apc, "ADPCM IMA CRYO APC"); +ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_APM, sample_fmts_s16p, adpcm_ima_apm, "ADPCM IMA Ubisoft APM"); ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_DAT4, sample_fmts_s16, adpcm_ima_dat4, "ADPCM IMA Eurocom DAT4"); ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_DK3, sample_fmts_s16, adpcm_ima_dk3, "ADPCM IMA Duck DK3"); ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_DK4, sample_fmts_s16, adpcm_ima_dk4, "ADPCM IMA Duck DK4"); diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c index 103f34fd32..6f543ea96f 100644 --- a/libavcodec/allcodecs.c +++ b/libavcodec/allcodecs.c @@ -599,6 +599,7 @@ extern AVCodec ff_adpcm_g726le_encoder; extern AVCodec ff_adpcm_g726le_decoder; extern AVCodec ff_adpcm_ima_amv_decoder; extern AVCodec ff_adpcm_ima_apc_decoder; +extern AVCodec ff_adpcm_ima_apm_decoder; extern AVCodec ff_adpcm_ima_dat4_decoder; extern AVCodec ff_adpcm_ima_dk3_decoder; extern AVCodec ff_adpcm_ima_dk4_decoder; diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index 368341ba93..f9d1af6ef9 100644 --- a/libavcodec/avcodec.h +++ b/libavcodec/avcodec.h @@ -549,6 +549,7 @@ enum AVCodecID { AV_CODEC_ID_ADPCM_ARGO, AV_CODEC_ID_ADPCM_IMA_SSI, AV_CODEC_ID_ADPCM_ZORK, + AV_CODEC_ID_ADPCM_IMA_APM, /* AMR */ AV_CODEC_ID_AMR_NB = 0x12000, diff --git a/libavcodec/codec_desc.c b/libavcodec/codec_desc.c index 609c7501fd..c5c379885f 100644 --- a/libavcodec/codec_desc.c +++ b/libavcodec/codec_desc.c @@ -2318,6 +2318,13 @@ static const AVCodecDescriptor codec_descriptors[] = { .long_name = NULL_IF_CONFIG_SMALL("ADPCM Zork"), .props = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY, }, + { + .id = AV_CODEC_ID_ADPCM_IMA_APM, + .type = AVMEDIA_TYPE_AUDIO, + .name = "adpcm_ima_apm", + .long_name = NULL_IF_CONFIG_SMALL("ADPCM IMA Ubisoft APM"), + .props = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY, + }, /* AMR */ { diff --git a/libavcodec/version.h b/libavcodec/version.h index 5c8147f681..b534b9260d 100644 --- a/libavcodec/version.h +++ b/libavcodec/version.h @@ -28,7 +28,7 @@ #include "libavutil/version.h" #define LIBAVCODEC_VERSION_MAJOR 58 -#define LIBAVCODEC_VERSION_MINOR 70 +#define LIBAVCODEC_VERSION_MINOR 71 #define LIBAVCODEC_VERSION_MICRO 100 #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \