From patchwork Sun Feb 13 19:51:29 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul B Mahol X-Patchwork-Id: 34267 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6838:14aa:0:0:0:0 with SMTP id bz10csp4959255nkb; Sun, 13 Feb 2022 11:51:11 -0800 (PST) X-Google-Smtp-Source: ABdhPJwrivZgUAelcSQnsfDEQ1rsD2GhI8/UJaqnYJU1XyoRHxnkZXndTBlLN5YXBvHfCcE89+cY X-Received: by 2002:a17:906:2c9:: with SMTP id 9mr9074142ejk.32.1644781871592; Sun, 13 Feb 2022 11:51:11 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1644781871; cv=none; d=google.com; s=arc-20160816; b=DA1Yl9YQCbKTCaOjwKhRGwoXNyJL3GND+uUWbBOwH0pHpZyRzjZYtzyghl2T8mExKZ dM48e2IAQ4h8OK3M/vcplU21d3/CDF7io2VV+INIMOB+QCnSIBQrS/zRb4Ksy7gZftt2 KZ8TVHOHvXyml/33uOyqyMJ926dNsPmHTgJtPLtPS25S5w0iOABX1Nuw40M/e6MKPV6N XMQiIGW958vjxJ/NzjwUok+8yYDKCfFo6M3AKEqFSIThzTOECeS6F+F68O4EhS/AVt6B poXOmVdZo4h7VoYW5rjamA6DOZ4RkHxMwm6lj2Fe65LnkSWj4eLBeAV4m+B98MR8NtK4 vqRg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:message-id:date:to:from :dkim-signature:delivered-to; bh=cNU8znpbNZCmm8TevTT/DJFEwyQ2SHp7Y/Xe08jxQqo=; b=typ4nFCkmXsc+Z8wteWjPZpl6fbIfEKbhrPY4Fen/ohYbvw8yb6w5tC/NWfO7Czt9p +MAiN1oVjLDDIJdaTwy/jIRwrfzf1VXXr+www2JjK68Cdtotecni057qY7LTE3vIe1Yk +rMyygh6viR/d4w4N0nWWUyUGA5FObZmL3z+VDnBDTov+QxlXLrYgX2YTlwtuG7IsasY vIgy/Pg7tsnsQdOzchUHMP9hnq3avAv6pSiUf3M24KzorVTSnwrkxCvxfTxgDK4GG5lh WMEv4trddElgd6y4H/wP9tCIM2TL3xepG9dzfyX8UzfQtwI/ueHnqmvYpUVwvfUAwdjE 6MxQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b="eI3AR+M/"; 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 z7si10800120edd.396.2022.02.13.11.51.11; Sun, 13 Feb 2022 11:51:11 -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="eI3AR+M/"; 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 5C68768B214; Sun, 13 Feb 2022 21:51:08 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-ej1-f45.google.com (mail-ej1-f45.google.com [209.85.218.45]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 416F868B0F3 for ; Sun, 13 Feb 2022 21:51:02 +0200 (EET) Received: by mail-ej1-f45.google.com with SMTP id p15so33394981ejc.7 for ; Sun, 13 Feb 2022 11:51:02 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:subject:date:message-id:mime-version :content-transfer-encoding; bh=vcrnTsDanDpJ5mo8jirFelkResdrSoMa7eeRfyU1SPU=; b=eI3AR+M/jqrJR5P0P3QbAx2I2dSnTqkz5RL3k1L+Knub98aJsHOkxUx7xzMmx6RwPJ YJ8GT8F+ek11Ge73rOYWsLQ/1nuGHUMCXEeMEuYuN3bfjQ8PdHKc3YE5x8PcU6KWWzEs E0iIS5N6AhSlmmty2zZTrUPa+jOdUxM881SQNs8FRriEkIW67AltsMrgl4U3rAeRf8lc nYdAom+Verk1ZcvnJv22rrnSleJ4ShOl9E5+e1ZdFNd6usKIVz+DaGXINo81oAa38/j5 K9jPCnIWWwcFt4lD2+6WQojg/13c7fk7xAzA3IYb3a0zrHzS5bxpC8LCCVw0z7xDxEAX YEVA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:mime-version :content-transfer-encoding; bh=vcrnTsDanDpJ5mo8jirFelkResdrSoMa7eeRfyU1SPU=; b=beSYJlv8yydq5PfZF2bBTiS7gqYqi0+wvI1neRHSq5ggvnX8SyeLHWjipGxtwVwXnX AV/n/c1TrD4wUEyjA8Jg42x+LvaC9nB4iQWZi/2Ae7vC1yXysqPqv+ozrUNhpMXbpybk ZnIJ1Bn7SXWLc+QTreOTSd/c6lXH8uudcusOu0h54a6+mTq9+QeZnB5QAyLmDa1OhCqo 1npIeUBj+hOCd1ihBiA6fTgocbIW7hmyYjFUA9h2CYPPh3tKsDdZN9+UUmJSjFQ3R+wT rAKiuPLMh95dYAQ4hENVMICeAs6dMmYpCx1XqJKdqeGGiFFfZg4PWbNWZL0/c5uAoa/Z QmNA== X-Gm-Message-State: AOAM531EyZyE4HFXVp/mh2AjJO0dChvUpEqHS7WGzxlnJ5PsPvs1TR5m k//8hFz1vzKVxX1ehhXxgeMe11WLzk7Teg== X-Received: by 2002:a17:907:6d88:: with SMTP id sb8mr8680158ejc.25.1644781861690; Sun, 13 Feb 2022 11:51:01 -0800 (PST) Received: from localhost.localdomain ([95.168.118.32]) by smtp.gmail.com with ESMTPSA id n7sm10507441edr.8.2022.02.13.11.50.58 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 13 Feb 2022 11:51:01 -0800 (PST) From: Paul B Mahol To: ffmpeg-devel@ffmpeg.org Date: Sun, 13 Feb 2022 20:51:29 +0100 Message-Id: <20220213195131.1563462-1-onemda@gmail.com> X-Mailer: git-send-email 2.33.0 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 1/3] avcodec: add ADPCM IMA HVQM4 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: 8GeSAUR19h// Signed-off-by: Paul B Mahol --- libavcodec/Makefile | 1 + libavcodec/adpcm.c | 64 +++++++++++++++++++++++++++++++++++++++++ libavcodec/allcodecs.c | 1 + libavcodec/codec_desc.c | 7 +++++ libavcodec/codec_id.h | 1 + 5 files changed, 74 insertions(+) diff --git a/libavcodec/Makefile b/libavcodec/Makefile index cfc70a3eaf..150a734421 100644 --- a/libavcodec/Makefile +++ b/libavcodec/Makefile @@ -900,6 +900,7 @@ OBJS-$(CONFIG_ADPCM_IMA_DK3_DECODER) += adpcm.o adpcm_data.o OBJS-$(CONFIG_ADPCM_IMA_DK4_DECODER) += adpcm.o adpcm_data.o OBJS-$(CONFIG_ADPCM_IMA_EA_EACS_DECODER) += adpcm.o adpcm_data.o OBJS-$(CONFIG_ADPCM_IMA_EA_SEAD_DECODER) += adpcm.o adpcm_data.o +OBJS-$(CONFIG_ADPCM_IMA_HVQM4_DECODER) += adpcm.o adpcm_data.o OBJS-$(CONFIG_ADPCM_IMA_ISS_DECODER) += adpcm.o adpcm_data.o OBJS-$(CONFIG_ADPCM_IMA_MOFLEX_DECODER) += adpcm.o adpcm_data.o OBJS-$(CONFIG_ADPCM_IMA_MTF_DECODER) += adpcm.o adpcm_data.o diff --git a/libavcodec/adpcm.c b/libavcodec/adpcm.c index cfde5f58b9..f453628786 100644 --- a/libavcodec/adpcm.c +++ b/libavcodec/adpcm.c @@ -523,6 +523,49 @@ static inline int adpcm_ima_qt_expand_nibble(ADPCMChannelStatus *c, int nibble) return c->predictor; } +static void decode_adpcm_ima_hvqm4(AVCodecContext *avctx, int16_t *outbuf, int samples_to_do, + int frame_format, GetByteContext *gb) +{ + ADPCMDecodeContext *c = avctx->priv_data; + int st = avctx->channels == 2; + unsigned tmp; + + for (int ch = 0; ch < avctx->channels; ch++) { + switch (frame_format) { + case 1: /* combined hist+index */ + tmp = bytestream2_get_be16(gb); + c->status[ch].predictor = sign_extend(tmp & 0xFF80, 16); + c->status[ch].step_index = tmp & 0x7f; + break; + case 2: /* no hist/index (continues from previous frame) */ + default: + break; + case 3: /* separate hist+index */ + tmp = bytestream2_get_be16(gb); + c->status[ch].predictor = sign_extend(tmp, 16); + c->status[ch].step_index = bytestream2_get_byte(gb); + break; + } + + c->status[ch].step_index = av_clip(c->status[ch].step_index, 0, 88); + } + + if (frame_format == 1 || frame_format == 3) { + for (int ch = 0; ch < avctx->channels; ch++) + *outbuf++ = (int16_t)c->status[st - ch].predictor; + samples_to_do--; + } + + for (int i = 0; i < samples_to_do; i++) { + uint8_t nibble = bytestream2_get_byte(gb); + + *outbuf++ = adpcm_ima_qt_expand_nibble(&c->status[st], nibble & 0xF); + *outbuf++ = adpcm_ima_qt_expand_nibble(&c->status[ 0], nibble >> 4); + } + + bytestream2_seek(gb, 0, SEEK_END); +} + static inline int16_t adpcm_ms_expand_nibble(ADPCMChannelStatus *c, int nibble) { int predictor; @@ -910,6 +953,20 @@ static int get_nb_samples(AVCodecContext *avctx, GetByteContext *gb, *coded_samples -= *coded_samples % 28; nb_samples = (buf_size - 12) / 30 * 28; break; + case AV_CODEC_ID_ADPCM_IMA_HVQM4: + { + int frame_format = bytestream2_get_be16(gb); + int skip = 6; + + if (frame_format == 1) + skip += 2 * ch; + if (frame_format == 3) + skip += 3 * ch; + + nb_samples = (buf_size - skip) * 2 / ch; + bytestream2_seek(gb, 0, SEEK_SET); + } + break; case AV_CODEC_ID_ADPCM_IMA_EA_EACS: has_coded_samples = 1; *coded_samples = bytestream2_get_le32(gb); @@ -1453,6 +1510,12 @@ static int adpcm_decode_frame(AVCodecContext *avctx, void *data, *samples++ = adpcm_ima_expand_nibble(&c->status[st], v & 0x0F, 3); } ) /* End of CASE */ + CASE(ADPCM_IMA_HVQM4, + int format = bytestream2_get_be16(&gb); + + bytestream2_skip(&gb, 4); + decode_adpcm_ima_hvqm4(avctx, samples, nb_samples, format, &gb); + ) /* End of CASE */ CASE(ADPCM_IMA_SSI, for (int n = nb_samples >> (1 - st); n > 0; n--) { int v = bytestream2_get_byteu(&gb); @@ -2322,6 +2385,7 @@ ADPCM_DECODER(ADPCM_IMA_DK3, sample_fmts_s16, adpcm_ima_dk3, "ADPCM IMA ADPCM_DECODER(ADPCM_IMA_DK4, sample_fmts_s16, adpcm_ima_dk4, "ADPCM IMA Duck DK4") ADPCM_DECODER(ADPCM_IMA_EA_EACS, sample_fmts_s16, adpcm_ima_ea_eacs, "ADPCM IMA Electronic Arts EACS") ADPCM_DECODER(ADPCM_IMA_EA_SEAD, sample_fmts_s16, adpcm_ima_ea_sead, "ADPCM IMA Electronic Arts SEAD") +ADPCM_DECODER(ADPCM_IMA_HVQM4, sample_fmts_s16, adpcm_ima_hvqm4, "ADPCM IMA HVQM4") ADPCM_DECODER(ADPCM_IMA_ISS, sample_fmts_s16, adpcm_ima_iss, "ADPCM IMA Funcom ISS") ADPCM_DECODER(ADPCM_IMA_MOFLEX, sample_fmts_s16p, adpcm_ima_moflex, "ADPCM IMA MobiClip MOFLEX") ADPCM_DECODER(ADPCM_IMA_MTF, sample_fmts_s16, adpcm_ima_mtf, "ADPCM IMA Capcom's MT Framework") diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c index d1e10197de..89ba205a2f 100644 --- a/libavcodec/allcodecs.c +++ b/libavcodec/allcodecs.c @@ -642,6 +642,7 @@ extern const AVCodec ff_adpcm_ima_dk3_decoder; extern const AVCodec ff_adpcm_ima_dk4_decoder; extern const AVCodec ff_adpcm_ima_ea_eacs_decoder; extern const AVCodec ff_adpcm_ima_ea_sead_decoder; +extern const AVCodec ff_adpcm_ima_hvqm4_decoder; extern const AVCodec ff_adpcm_ima_iss_decoder; extern const AVCodec ff_adpcm_ima_moflex_decoder; extern const AVCodec ff_adpcm_ima_mtf_decoder; diff --git a/libavcodec/codec_desc.c b/libavcodec/codec_desc.c index 0974ee03de..6deba785dc 100644 --- a/libavcodec/codec_desc.c +++ b/libavcodec/codec_desc.c @@ -2475,6 +2475,13 @@ static const AVCodecDescriptor codec_descriptors[] = { .long_name = NULL_IF_CONFIG_SMALL("ADPCM IMA Acorn Replay"), .props = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY, }, + { + .id = AV_CODEC_ID_ADPCM_IMA_HVQM4, + .type = AVMEDIA_TYPE_AUDIO, + .name = "adpcm_ima_hvqm4", + .long_name = NULL_IF_CONFIG_SMALL("ADPCM IMA HVQM4"), + .props = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY, + }, /* AMR */ { diff --git a/libavcodec/codec_id.h b/libavcodec/codec_id.h index ab265ec584..f3f262ec75 100644 --- a/libavcodec/codec_id.h +++ b/libavcodec/codec_id.h @@ -401,6 +401,7 @@ enum AVCodecID { AV_CODEC_ID_ADPCM_IMA_CUNNING, AV_CODEC_ID_ADPCM_IMA_MOFLEX, AV_CODEC_ID_ADPCM_IMA_ACORN, + AV_CODEC_ID_ADPCM_IMA_HVQM4, /* AMR */ AV_CODEC_ID_AMR_NB = 0x12000,