From patchwork Fri Jun 2 19:56:17 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul B Mahol X-Patchwork-Id: 3804 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.103.10.2 with SMTP id 2csp352353vsk; Fri, 2 Jun 2017 13:05:11 -0700 (PDT) X-Received: by 10.223.133.182 with SMTP id 51mr6317964wrt.86.1496433911159; Fri, 02 Jun 2017 13:05:11 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1496433911; cv=none; d=google.com; s=arc-20160816; b=xsrn26f0zjjV1Kbx2QA7ck2pZn798uD2B7R0gOE6VFjbXst2DAgzNXKAIpfJv3jeqw WihqlBhtLR5uOZSMjdxwxWIgG5J8OxVEFQRSi0BrKpRNpKhItlsuttJj57DrGhqDO2sh DjKhkDhpQqPKK4N2AEzSoXYGffwxwBvL6r6Ax3GHCV4YMTdQ6Xvsd+MA6mUMHC+tk+hn Hua/pkWTWzFOP93AzWzGKngXTM4T/tEUrZzZpq0/6JK46HxWgc3nLjODc6Qlq8elZvq/ MC0vlbwmN4iUGF6oiVcNubLe8FNIuHjG9RUi3zQzvCL85dySZ3zYXFGHWnv4hLsYUYkP 8aJw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:message-id:date:to:from:dkim-signature :delivered-to:arc-authentication-results; bh=PeWxt3/VzgyFzmfRalDdvkv28KK2x7g8CvEXfdVusaA=; b=mMAdxAua4mQNMhv63l14OyULwZNlmB86x7rM6fLWgdQlAb4dqHpYe9Bys1ZHpTzVz4 exSmJECiNEtDbzLW2KN/oe1aX3ScNU9J16AnBO69LIZXqR2wauhALXdBbDOWwU13pCNf PUJqpld/buAV6RRrXkEYs5Mjr8DDwQq5q8yvtRHRfr0Kiig4rGAxY40EJyGtGByiWgl7 hbdEKpKFxj0Om21dGhrtwocBMmzG2cim2iPxWwFmkPGZaC3YqBd2gPP2YoUcpEk0COvo XqjzkhtAgXW73lHE5LgpvZwtsQ7sMEsjA/uqAunkSikmLZqIwfn0/V1oR5e1h8/LqHpo ovZg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com; 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=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 129si3935421wmu.24.2017.06.02.13.05.10; Fri, 02 Jun 2017 13:05:11 -0700 (PDT) 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; 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=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 98ED6689BF0; Fri, 2 Jun 2017 23:05:02 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr0-f195.google.com (mail-wr0-f195.google.com [209.85.128.195]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 5212D689C33 for ; Fri, 2 Jun 2017 23:04:56 +0300 (EEST) Received: by mail-wr0-f195.google.com with SMTP id v104so2135100wrb.0 for ; Fri, 02 Jun 2017 13:05:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id; bh=oIBVHykeIsY1BrCxePseVoEyIw6UAUgmV5/8/2GBns8=; b=S4qVzAb0ErnfJmNV4efu1d86q+VDCmH0V2A7kxSPqLDpF3yDJj73RzGmcEpMJJqJQY LF2SmdEs7M0WYvzgmRU5Yx25AOmy9HJNtP6TaXhqY8eb8rN20eKL64+tzZ+mDuul+aKn h9fV7aIKz7N27xDQpMUm3Cxg6LXwarcqeYYjK8T3Ja2tzwSDcuAQ5GCH6KwLhRtuQh5J VWQmule7+XvSODFcd1IkiRCjUjnKf4XHacX9L18zu1PpQkoPNwddpWo0dc59nJfOUH4s brxzr0GWK47a2s41zhUUmSxbriJh6uZN1qzSDSH5kJU0VwtMZhwNe1nqWuAnPVYmjb9o j2qA== 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; bh=oIBVHykeIsY1BrCxePseVoEyIw6UAUgmV5/8/2GBns8=; b=ZKrKl1u/S/85jOuAS2el+whAAgeyN7KlEE4yIX2ZIBAtScJ8edEDBOaN7MseUtnJMU gXYDxcNMDeu8jIuSuUuKBLb+tWaigqE9oWaEBgxnf+lxuZHsbgdYJd3rLY20b/WooOv+ +2ZADgmynFdJ2dn552QEwO7Be4ziVeh3CKnS8o5hhzersYMT0XC2MxqbogPrgD6BQfPS pMEJIsdMOx7y2a8K8VIdKZWtKx6Rz32GostVh28WD9i8pWa6yGowYvt6IEJuDeJQ22uW kgfXB5TGwEjcs7dfo37uQTgEYAXTHDz9lSdSkDAY2AHhEUhghbgzoXM/lhSLxRvkKGf7 Im7A== X-Gm-Message-State: AODbwcCtPsUJR0EBJthC9/b5sOrknqNWBbs7qp7PRRHcnghnJIdKfpSI aYiVZMCqQFLwUeLW X-Received: by 10.223.176.122 with SMTP id g55mr6357279wra.172.1496433396265; Fri, 02 Jun 2017 12:56:36 -0700 (PDT) Received: from localhost.localdomain ([94.250.174.60]) by smtp.gmail.com with ESMTPSA id t27sm4324515wra.35.2017.06.02.12.56.34 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 02 Jun 2017 12:56:35 -0700 (PDT) From: Paul B Mahol To: ffmpeg-devel@ffmpeg.org Date: Fri, 2 Jun 2017 21:56:17 +0200 Message-Id: <20170602195619.4374-1-onemda@gmail.com> X-Mailer: git-send-email 2.9.3 Subject: [FFmpeg-devel] [PATCH 1/3] avcodec: add Gremlin 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 | 44 ++++++++++++++++++++++++++++++++++++++------ 5 files changed, 48 insertions(+), 6 deletions(-) diff --git a/libavcodec/Makefile b/libavcodec/Makefile index 0818950..759cc0c 100644 --- a/libavcodec/Makefile +++ b/libavcodec/Makefile @@ -310,6 +310,7 @@ OBJS-$(CONFIG_G723_1_ENCODER) += g723_1enc.o g723_1.o \ OBJS-$(CONFIG_G729_DECODER) += g729dec.o lsp.o celp_math.o celp_filters.o acelp_filters.o acelp_pitch_delay.o acelp_vectors.o g729postfilter.o OBJS-$(CONFIG_GIF_DECODER) += gifdec.o lzw.o OBJS-$(CONFIG_GIF_ENCODER) += gif.o lzwenc.o +OBJS-$(CONFIG_GREMLIN_DPCM_DECODER) += dpcm.o OBJS-$(CONFIG_GSM_DECODER) += gsmdec.o gsmdec_data.o msgsmdec.o OBJS-$(CONFIG_GSM_MS_DECODER) += gsmdec.o gsmdec_data.o msgsmdec.o OBJS-$(CONFIG_H261_DECODER) += h261dec.o h261data.o h261.o diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c index 89fadcd..31a6010 100644 --- a/libavcodec/allcodecs.c +++ b/libavcodec/allcodecs.c @@ -518,6 +518,7 @@ static void register_all(void) REGISTER_DECODER(PCM_ZORK, pcm_zork); /* DPCM codecs */ + REGISTER_DECODER(GREMLIN_DPCM, gremlin_dpcm); REGISTER_DECODER(INTERPLAY_DPCM, interplay_dpcm); REGISTER_ENCDEC (ROQ_DPCM, roq_dpcm); REGISTER_DECODER(SOL_DPCM, sol_dpcm); diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index 00f9c82..59bd1c5 100644 --- a/libavcodec/avcodec.h +++ b/libavcodec/avcodec.h @@ -548,6 +548,7 @@ enum AVCodecID { AV_CODEC_ID_SOL_DPCM, AV_CODEC_ID_SDX2_DPCM = 0x14800, + AV_CODEC_ID_GREMLIN_DPCM, /* audio codecs */ AV_CODEC_ID_MP2 = 0x15000, diff --git a/libavcodec/codec_desc.c b/libavcodec/codec_desc.c index f0ca4ba..4cc5729 100644 --- a/libavcodec/codec_desc.c +++ b/libavcodec/codec_desc.c @@ -2249,6 +2249,13 @@ static const AVCodecDescriptor codec_descriptors[] = { .long_name = NULL_IF_CONFIG_SMALL("DPCM Squareroot-Delta-Exact"), .props = AV_CODEC_PROP_LOSSY, }, + { + .id = AV_CODEC_ID_GREMLIN_DPCM, + .type = AVMEDIA_TYPE_AUDIO, + .name = "gremlin_dpcm", + .long_name = NULL_IF_CONFIG_SMALL("DPCM Gremlin"), + .props = AV_CODEC_PROP_LOSSY, + }, /* audio codecs */ { diff --git a/libavcodec/dpcm.c b/libavcodec/dpcm.c index 2edd4d5..7d3934e 100644 --- a/libavcodec/dpcm.c +++ b/libavcodec/dpcm.c @@ -44,7 +44,7 @@ #include "mathops.h" typedef struct DPCMContext { - int16_t square_array[256]; + int16_t array[256]; int sample[2]; ///< previous sample (for SOL_DPCM) const int8_t *sol_table; ///< delta table for SOL_DPCM } DPCMContext; @@ -130,8 +130,8 @@ static av_cold int dpcm_decode_init(AVCodecContext *avctx) /* initialize square table */ for (i = 0; i < 128; i++) { int16_t square = i * i; - s->square_array[i ] = square; - s->square_array[i + 128] = -square; + s->array[i ] = square; + s->array[i + 128] = -square; } break; @@ -156,7 +156,25 @@ static av_cold int dpcm_decode_init(AVCodecContext *avctx) case AV_CODEC_ID_SDX2_DPCM: for (i = -128; i < 128; i++) { int16_t square = i * i * 2; - s->square_array[i+128] = i < 0 ? -square: square; + s->array[i+128] = i < 0 ? -square: square; + } + break; + + case AV_CODEC_ID_GREMLIN_DPCM: { + int delta = 0; + int code = 64; + int step = 45; + + s->array[0] = 0; + for (i = 0; i < 127; i++) { + delta += (code >> 5); + code += step; + step += 2; + + s->array[i*2 + 1] = delta; + s->array[i*2 + 2] = -delta; + } + s->array[255] = delta + (code >> 5); } break; @@ -207,6 +225,7 @@ static int dpcm_decode_frame(AVCodecContext *avctx, void *data, else out = buf_size; break; + case AV_CODEC_ID_GREMLIN_DPCM: case AV_CODEC_ID_SDX2_DPCM: out = buf_size; break; @@ -240,7 +259,7 @@ static int dpcm_decode_frame(AVCodecContext *avctx, void *data, /* decode the samples */ while (output_samples < samples_end) { - predictor[ch] += s->square_array[bytestream2_get_byteu(&gb)]; + predictor[ch] += s->array[bytestream2_get_byteu(&gb)]; predictor[ch] = av_clip_int16(predictor[ch]); *output_samples++ = predictor[ch]; @@ -335,12 +354,24 @@ static int dpcm_decode_frame(AVCodecContext *avctx, void *data, if (!(n & 1)) s->sample[ch] = 0; - s->sample[ch] += s->square_array[n + 128]; + s->sample[ch] += s->array[n + 128]; s->sample[ch] = av_clip_int16(s->sample[ch]); *output_samples++ = s->sample[ch]; ch ^= stereo; } break; + + case AV_CODEC_ID_GREMLIN_DPCM: { + int idx = 0; + + while (output_samples < samples_end) { + uint8_t n = bytestream2_get_byteu(&gb); + + *output_samples++ = s->sample[idx] += s->array[n]; + idx ^= 1; + } + } + break; } *got_frame_ptr = 1; @@ -360,6 +391,7 @@ AVCodec ff_ ## name_ ## _decoder = { \ .capabilities = AV_CODEC_CAP_DR1, \ } +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"); DPCM_DECODER(AV_CODEC_ID_SDX2_DPCM, sdx2_dpcm, "DPCM Squareroot-Delta-Exact");