From patchwork Mon Dec 10 11:32:51 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Tomas_H=C3=A4rdin?= X-Patchwork-Id: 11359 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 B3C0744C48A for ; Mon, 10 Dec 2018 13:32:58 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 0ADEF68AB55; Mon, 10 Dec 2018 13:32:49 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail.acc.umu.se (mail.acc.umu.se [130.239.18.156]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 59C8C68AAA2 for ; Mon, 10 Dec 2018 13:32:42 +0200 (EET) Received: from localhost (localhost.localdomain [127.0.0.1]) by amavisd-new (Postfix) with ESMTP id BEED644B92 for ; Mon, 10 Dec 2018 12:32:52 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=acc.umu.se; s=mail1; t=1544441572; bh=IjjdxB80IqxUbsC/iqdE1nIlX5CNDAZ7NxgnpHu3ql0=; h=Subject:From:To:Date:In-Reply-To:References:From; b=oAQXYNiNSrM1uA8sVUADHKeI5ORrBtW6QzGFUIUmZ/MndNZ7rqzaoXX8EnD250qMe f/bfKryiCuoLeEQXmaJhDVYoreiCaaKGKSkCCtgqoKypZVwhdJW9gj5kyOQxP/LPnu t3X1UFq3tfhJ2pw++AxBnJkp/eSjPbSGf5ZdhZ762mcBug7gQvyqJ0mTZa4cppZxcD 9Hmx6eifLPVpOaPOV1uPXn4xJwJ3rFSPz+sRq0ELxrxIr+0QjsEoCt7iSCq/J8YeMc ilQLAYyGb3iOc7KNDWD2B6pgp/DwFuM1SWFmjJ8OxGRDt08fj2Sh6/Z/tRJVss3OTs PhVo24e7znDOg== Received: from laptop.lan (h-39-105.A258.priv.bahnhof.se [79.136.39.105]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) (Authenticated sender: tjoppen) by mail.acc.umu.se (Postfix) with ESMTPSA id BEC0C44B8B for ; Mon, 10 Dec 2018 12:32:51 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=acc.umu.se; s=mail1; t=1544441571; bh=IjjdxB80IqxUbsC/iqdE1nIlX5CNDAZ7NxgnpHu3ql0=; h=Subject:From:To:Date:In-Reply-To:References:From; b=CIQkpmd8pY5ln9nguhN4p2rniu3s/iNEoQTDxj3XAuBbfU3OVm3OcV4gSx603wZ8G 4y4dny9SwCPOO/dVCPkeR3bB956Id7epOIqDbtTDvAnj5BxtoeZZbGweXuZ1iLit6E fuFvvEVl+aWKVGtwgMWa8A+frUSjAqgXGC1gAPJYaAMqPKadzY2SibDvWXToO3oUtX /+pEjGrT+mzT9b0cgRHkznjKM+kUEfqHiXRiQTz2EMwMoDHqnrnu4dJNKermua847U qUrFOqFIL8foZxaEbiEP0NtmP3/3wTpr/nRgugYm3fxpbxUF3o3K+bJHx0NkA2E0re aYXKd+HyelkaQ== Message-ID: <1544441571.21980.19.camel@acc.umu.se> From: Tomas =?ISO-8859-1?Q?H=E4rdin?= To: FFmpeg development discussions and patches Date: Mon, 10 Dec 2018 12:32:51 +0100 In-Reply-To: <1544441511.21980.17.camel@acc.umu.se> References: <1544441511.21980.17.camel@acc.umu.se> X-Mailer: Evolution 3.22.6-1+deb9u1 Mime-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 3/3] Add ADPCM IMA CRYO APC encoder 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" From 32cc6a96f80b5406e8327d912c8fc38812e6a664 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomas=20H=C3=A4rdin?= Date: Fri, 23 Nov 2018 15:15:02 +0100 Subject: [PATCH 3/3] Add ADPCM IMA CRYO APC encoder No trellis quantization yet --- Changelog | 1 + libavcodec/adpcmenc.c | 33 +++++++++++++++++++++++++++++++++ libavcodec/allcodecs.c | 1 + libavcodec/version.h | 4 ++-- tests/fate/acodec.mak | 2 ++ tests/ref/acodec/adpcm-ima_apc | 4 ++++ 6 files changed, 43 insertions(+), 2 deletions(-) create mode 100644 tests/ref/acodec/adpcm-ima_apc diff --git a/Changelog b/Changelog index f678feed65..e6ae0c1187 100644 --- a/Changelog +++ b/Changelog @@ -11,6 +11,7 @@ version : - dhav demuxer - PCM-DVD encoder - CRYO APC muxer +- ADPCM IMA CRYO APC encoder version 4.1: diff --git a/libavcodec/adpcmenc.c b/libavcodec/adpcmenc.c index 668939c778..0d757d5b46 100644 --- a/libavcodec/adpcmenc.c +++ b/libavcodec/adpcmenc.c @@ -54,6 +54,7 @@ typedef struct ADPCMEncodeContext { TrellisNode *node_buf; TrellisNode **nodep_buf; uint8_t *trellis_hash; + int extradata_updated; } ADPCMEncodeContext; #define FREEZE_INTERVAL 128 @@ -124,6 +125,15 @@ static av_cold int adpcm_encode_init(AVCodecContext *avctx) bytestream_put_le16(&extradata, ff_adpcm_AdaptCoeff2[i] * 4); } break; + case AV_CODEC_ID_ADPCM_IMA_APC: + if (avctx->trellis) { + av_log(avctx, AV_LOG_ERROR, "trellis encoding not implemented for CRYO APC\n"); + return AVERROR_PATCHWELCOME; + } + //extradata will be output in adpcm_encode_frame() + avctx->frame_size = BLKSIZE * 2 / avctx->channels; + avctx->block_align = BLKSIZE; + break; case AV_CODEC_ID_ADPCM_YAMAHA: avctx->frame_size = BLKSIZE * 2 / avctx->channels; avctx->block_align = BLKSIZE; @@ -491,6 +501,28 @@ static int adpcm_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, dst = avpkt->data; switch(avctx->codec->id) { + case AV_CODEC_ID_ADPCM_IMA_APC: + //initialize predictors using initial samples + if (!c->extradata_updated) { + uint8_t *side_data = av_packet_new_side_data( + avpkt, AV_PKT_DATA_NEW_EXTRADATA, 8); + + if (!side_data) { + return AVERROR(ENOMEM); + } + + for (ch = 0; ch < avctx->channels; ch++) { + c->status[ch].prev_sample = samples[ch]; + bytestream_put_le32(&side_data, c->status[ch].prev_sample); + } + c->extradata_updated = 1; + } + for (i = 0; i < frame->nb_samples*avctx->channels/2; i++) { + uint8_t l = adpcm_ima_compress_sample(&c->status[0], samples[2*i+0]); + uint8_t r = adpcm_ima_compress_sample(&c->status[st], samples[2*i+1]); + *dst++ = (l<<4) | r; + } + break; case AV_CODEC_ID_ADPCM_IMA_WAV: { int blocks, j; @@ -721,6 +753,7 @@ AVCodec ff_ ## name_ ## _encoder = { \ ADPCM_ENCODER(AV_CODEC_ID_ADPCM_IMA_QT, adpcm_ima_qt, sample_fmts_p, "ADPCM IMA QuickTime"); ADPCM_ENCODER(AV_CODEC_ID_ADPCM_IMA_WAV, adpcm_ima_wav, sample_fmts_p, "ADPCM IMA WAV"); +ADPCM_ENCODER(AV_CODEC_ID_ADPCM_IMA_APC, adpcm_ima_apc, sample_fmts, "ADPCM IMA CRYO APC"); ADPCM_ENCODER(AV_CODEC_ID_ADPCM_MS, adpcm_ms, sample_fmts, "ADPCM Microsoft"); ADPCM_ENCODER(AV_CODEC_ID_ADPCM_SWF, adpcm_swf, sample_fmts, "ADPCM Shockwave Flash"); ADPCM_ENCODER(AV_CODEC_ID_ADPCM_YAMAHA, adpcm_yamaha, sample_fmts, "ADPCM Yamaha"); diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c index d70646e91a..873f236531 100644 --- a/libavcodec/allcodecs.c +++ b/libavcodec/allcodecs.c @@ -586,6 +586,7 @@ extern AVCodec ff_adpcm_g726_decoder; 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_encoder; extern AVCodec ff_adpcm_ima_apc_decoder; extern AVCodec ff_adpcm_ima_dat4_decoder; extern AVCodec ff_adpcm_ima_dk3_decoder; diff --git a/libavcodec/version.h b/libavcodec/version.h index f758093582..5677a7feba 100644 --- a/libavcodec/version.h +++ b/libavcodec/version.h @@ -28,8 +28,8 @@ #include "libavutil/version.h" #define LIBAVCODEC_VERSION_MAJOR 58 -#define LIBAVCODEC_VERSION_MINOR 41 -#define LIBAVCODEC_VERSION_MICRO 101 +#define LIBAVCODEC_VERSION_MINOR 42 +#define LIBAVCODEC_VERSION_MICRO 100 #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ LIBAVCODEC_VERSION_MINOR, \ diff --git a/tests/fate/acodec.mak b/tests/fate/acodec.mak index 80d26de0f9..69bfa6940e 100644 --- a/tests/fate/acodec.mak +++ b/tests/fate/acodec.mak @@ -45,6 +45,7 @@ fate-acodec-pcm-u%le: FMT = nut fate-acodec-pcm-f%be: FMT = au FATE_ACODEC_ADPCM-$(call ENCDEC, ADPCM_ADX, ADX) += adx +FATE_ACODEC_ADPCM-$(call ENCDEC, ADPCM_IMA_APC, APC) += ima_apc FATE_ACODEC_ADPCM-$(call ENCDEC, ADPCM_IMA_QT, AIFF) += ima_qt FATE_ACODEC_ADPCM-$(call ENCDEC, ADPCM_IMA_WAV, WAV) += ima_wav FATE_ACODEC_ADPCM-$(call ENCDEC, ADPCM_MS, WAV) += ms @@ -58,6 +59,7 @@ fate-acodec-adpcm: $(FATE_ACODEC_ADPCM) fate-acodec-adpcm-%: CODEC = adpcm_$(@:fate-acodec-adpcm-%=%) fate-acodec-adpcm-adx: FMT = adx +fate-acodec-adpcm-ima_apc: FMT = apc fate-acodec-adpcm-ima_qt: FMT = aiff fate-acodec-adpcm-ima_wav: FMT = wav fate-acodec-adpcm-ms: FMT = wav diff --git a/tests/ref/acodec/adpcm-ima_apc b/tests/ref/acodec/adpcm-ima_apc new file mode 100644 index 0000000000..f168734c78 --- /dev/null +++ b/tests/ref/acodec/adpcm-ima_apc @@ -0,0 +1,4 @@ +45aca515c679bb0c315df766432d5630 *tests/data/fate/acodec-adpcm-ima_apc.apc +265248 tests/data/fate/acodec-adpcm-ima_apc.apc +03fc41cf61b7a160359147cd6363562a *tests/data/fate/acodec-adpcm-ima_apc.out.wav +stddev: 904.04 PSNR: 37.21 MAXDIFF:34026 bytes: 1058400/ 1060864 -- 2.11.0