From patchwork Sun Mar 15 18:22:02 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul B Mahol X-Patchwork-Id: 18204 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id B8ABD44B9E5 for ; Sun, 15 Mar 2020 20:22:41 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id A2F3D68B037; Sun, 15 Mar 2020 20:22:41 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm1-f47.google.com (mail-wm1-f47.google.com [209.85.128.47]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 31E53689DC8 for ; Sun, 15 Mar 2020 20:22:35 +0200 (EET) Received: by mail-wm1-f47.google.com with SMTP id 6so15246240wmi.5 for ; Sun, 15 Mar 2020 11:22:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references; bh=r/U83AFPxH1brU0Y+iot7lPewroX4bDANvLTOiucj9o=; b=XSRegT1ZOu9mO2j0lWS3kEDtjCtJN5k/JSCZEM8Pm1NZaotyaBTzNqrBCCjMkFYKnM /Vinxxk0msIx+k8500JRWGKVUe/zh98P4WA3ONJAQeD2jje9L98txhUp19PA5YPTXsub 6cuFaMAJGEMKrdUQkoFIe7WN6ELw36FfX0wPNncKqdbdLUKDX+QBIWx8R9cCrLdM5Pxk bpOVqB9o26/aFRRZuTp3aAbTj9XHDiGCK4/TMlvEELIeM77ZRSMx10odzDvskIrc3qwp CwfQtSZ1ZYyCh8yT6lLCKJWGwuQWvoWHgw+RZVRFEZZvfy4gqOtQONVmgdSJ91WarH+e biog== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=r/U83AFPxH1brU0Y+iot7lPewroX4bDANvLTOiucj9o=; b=ZmFL/tlg24Lfw4LlOb3CaMZvunSYNHr7yA40g4UUaucxZBKhvOjtk48s9dnKo1WclZ 0EX9DafbXdYafwNWjFHnhK3Ku8Dp8zlUhiu6k4dO3agploBsbyeX2/yyztOwnXJyviu1 YFm2sgq1sCNeGF7do+w7/xPwn19C7huqzx74NLbuH6N8N/ELUVZziGSVacjho/CCVlz+ 2C+zx5eMhqsZj1ReyfaalK8dH5mnuenJOOYnN7vq5iJPTEPB+3B7RtCCExbiH9IXhTqB fh4Oa9CPa9sNx0/gD8HAwoA+zWVdXK2oZvI7AbSXoSlAHGeWjWdstAQz6gyKYWn2KGo/ B5AQ== X-Gm-Message-State: ANhLgQ0gTw624rqwrkxhCcfFDOsY3cl2pYGZeB6ux3oHGB7l0Jo35jba f9Ug3OEpfJ17YL8rQ3ymcxvm3Eeu X-Google-Smtp-Source: ADFU+vuiHG0dcB1YJJeuG+5eHDfcaK+JIHZ3tYo573PmmBzS2NNjkpGF14qRJlsGCLE0/b9TrVk3pA== X-Received: by 2002:a1c:b686:: with SMTP id g128mr18157364wmf.75.1584296554130; Sun, 15 Mar 2020 11:22:34 -0700 (PDT) Received: from localhost.localdomain ([37.244.255.176]) by smtp.gmail.com with ESMTPSA id b203sm27363164wmc.45.2020.03.15.11.22.32 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 15 Mar 2020 11:22:33 -0700 (PDT) From: Paul B Mahol To: ffmpeg-devel@ffmpeg.org Date: Sun, 15 Mar 2020 19:22:02 +0100 Message-Id: <20200315182206.20851-3-onemda@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200315182206.20851-1-onemda@gmail.com> References: <20200315182206.20851-1-onemda@gmail.com> Subject: [FFmpeg-devel] [PATCH 3/7] avcodec: add derf dpcm decoder 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 MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Signed-off-by: Paul B Mahol --- libavcodec/Makefile | 1 + libavcodec/allcodecs.c | 1 + libavcodec/avcodec.h | 1 + libavcodec/codec_desc.c | 7 +++++++ libavcodec/dpcm.c | 32 ++++++++++++++++++++++++++++++++ libavcodec/utils.c | 1 + 6 files changed, 43 insertions(+) diff --git a/libavcodec/Makefile b/libavcodec/Makefile index b50a26907f..a88643b7d2 100644 --- a/libavcodec/Makefile +++ b/libavcodec/Makefile @@ -265,6 +265,7 @@ OBJS-$(CONFIG_DCA_DECODER) += dcadec.o dca.o dcadata.o dcahuff.o \ OBJS-$(CONFIG_DCA_ENCODER) += dcaenc.o dca.o dcadata.o dcahuff.o \ dcaadpcm.o OBJS-$(CONFIG_DDS_DECODER) += dds.o +OBJS-$(CONFIG_DERF_DPCM_DECODER) += dpcm.o OBJS-$(CONFIG_DIRAC_DECODER) += diracdec.o dirac.o diracdsp.o diractab.o \ dirac_arith.o dirac_dwt.o dirac_vlc.o OBJS-$(CONFIG_DFA_DECODER) += dfa.o diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c index 379c5f7b81..6046b15164 100644 --- a/libavcodec/allcodecs.c +++ b/libavcodec/allcodecs.c @@ -569,6 +569,7 @@ extern AVCodec ff_pcm_vidc_encoder; extern AVCodec ff_pcm_vidc_decoder; /* DPCM codecs */ +extern AVCodec ff_derf_dpcm_decoder; extern AVCodec ff_gremlin_dpcm_decoder; extern AVCodec ff_interplay_dpcm_decoder; extern AVCodec ff_roq_dpcm_encoder; diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index 9ac97a122b..e9c658fddc 100644 --- a/libavcodec/avcodec.h +++ b/libavcodec/avcodec.h @@ -571,6 +571,7 @@ enum AVCodecID { AV_CODEC_ID_SDX2_DPCM = 0x14800, AV_CODEC_ID_GREMLIN_DPCM, + AV_CODEC_ID_DERF_DPCM, /* audio codecs */ AV_CODEC_ID_MP2 = 0x15000, diff --git a/libavcodec/codec_desc.c b/libavcodec/codec_desc.c index df3671765a..130e08c1f2 100644 --- a/libavcodec/codec_desc.c +++ b/libavcodec/codec_desc.c @@ -2415,6 +2415,13 @@ static const AVCodecDescriptor codec_descriptors[] = { .long_name = NULL_IF_CONFIG_SMALL("DPCM Gremlin"), .props = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY, }, + { + .id = AV_CODEC_ID_DERF_DPCM, + .type = AVMEDIA_TYPE_AUDIO, + .name = "derf_dpcm", + .long_name = NULL_IF_CONFIG_SMALL("DPCM Xilam DERF"), + .props = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY, + }, /* audio codecs */ { diff --git a/libavcodec/dpcm.c b/libavcodec/dpcm.c index 5958081b66..069bf1dcd8 100644 --- a/libavcodec/dpcm.c +++ b/libavcodec/dpcm.c @@ -49,6 +49,21 @@ typedef struct DPCMContext { const int8_t *sol_table; ///< delta table for SOL_DPCM } DPCMContext; +static const int32_t derf_steps[96] = { + 0, 1, 2, 3, 4, 5, 6, 7, + 8, 9, 10, 11, 12, 13, 14, 16, + 17, 19, 21, 23, 25, 28, 31, 34, + 37, 41, 45, 50, 55, 60, 66, 73, + 80, 88, 97, 107, 118, 130, 143, 157, + 173, 190, 209, 230, 253, 279, 307, 337, + 371, 408, 449, 494, 544, 598, 658, 724, + 796, 876, 963, 1060, 1166, 1282, 1411, 1552, + 1707, 1878, 2066, 2272, 2499, 2749, 3024, 3327, + 3660, 4026, 4428, 4871, 5358, 5894, 6484, 7132, + 7845, 8630, 9493, 10442, 11487, 12635, 13899, 15289, + 16818, 18500, 20350, 22385, 24623, 27086, 29794, 32767, +}; + static const int16_t interplay_delta_table[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, @@ -225,6 +240,7 @@ static int dpcm_decode_frame(AVCodecContext *avctx, void *data, else out = buf_size; break; + case AV_CODEC_ID_DERF_DPCM: case AV_CODEC_ID_GREMLIN_DPCM: case AV_CODEC_ID_SDX2_DPCM: out = buf_size; @@ -372,6 +388,21 @@ static int dpcm_decode_frame(AVCodecContext *avctx, void *data, } } break; + + case AV_CODEC_ID_DERF_DPCM: { + int idx = 0; + + while (output_samples < samples_end) { + uint8_t n = bytestream2_get_byteu(&gb); + int index = FFMIN(n & 0x7f, 95); + + s->sample[idx] += (n & 0x80 ? -1: 1) * derf_steps[index]; + s->sample[idx] = av_clip_int16(s->sample[idx]); + *output_samples++ = s->sample[idx]; + idx ^= stereo; + } + } + break; } *got_frame_ptr = 1; @@ -391,6 +422,7 @@ AVCodec ff_ ## name_ ## _decoder = { \ .capabilities = AV_CODEC_CAP_DR1, \ } +DPCM_DECODER(AV_CODEC_ID_DERF_DPCM, derf_dpcm, "DPCM Xilam DERF"); DPCM_DECODER(AV_CODEC_ID_GREMLIN_DPCM, gremlin_dpcm, "DPCM Gremlin"); DPCM_DECODER(AV_CODEC_ID_INTERPLAY_DPCM, interplay_dpcm, "DPCM Interplay"); DPCM_DECODER(AV_CODEC_ID_ROQ_DPCM, roq_dpcm, "DPCM id RoQ"); diff --git a/libavcodec/utils.c b/libavcodec/utils.c index c4dc136d3c..66bfdaf4f8 100644 --- a/libavcodec/utils.c +++ b/libavcodec/utils.c @@ -1478,6 +1478,7 @@ int av_get_exact_bits_per_sample(enum AVCodecID codec_id) case AV_CODEC_ID_PCM_S8_PLANAR: case AV_CODEC_ID_PCM_U8: case AV_CODEC_ID_SDX2_DPCM: + case AV_CODEC_ID_DERF_DPCM: return 8; case AV_CODEC_ID_PCM_S16BE: case AV_CODEC_ID_PCM_S16BE_PLANAR: