From patchwork Thu Apr 1 11:34:49 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zane van Iperen X-Patchwork-Id: 26681 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 3D07744BC08 for ; Thu, 1 Apr 2021 14:35:11 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 2497568A6EB; Thu, 1 Apr 2021 14:35:11 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from out0.migadu.com (out0.migadu.com [94.23.1.103]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 2DFB468A682 for ; Thu, 1 Apr 2021 14:35:05 +0300 (EEST) X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=zanevaniperen.com; s=key1; t=1617276904; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=HgOQsiO5ki9EzycQcdnYdZV37hoS+8mTNoHcFiNyT7M=; b=Q4uqnsGq7YiDjQnsN9rEMbBCXL+hMjdnUeBY3JyDTVC88chest/2XfbvV2D4HiywPQ6yfP OR8EUumCDPWflZasP6/MfoZtlazHbeH4oIObkcFO+eHSqUekhdwM4UGNVmNiKahoh4sk/J PhL1fVqdMkrxggWBTXyIS+SIWYY9H9aeoKbUrfeOncA+solxylj/ACtFKnWgvgnGE7fBRq sHnof1DVW8odSyByAbCWS/dBuXiyZuLJpSPEFPyxk4vSXRHyZnUmkOO+zLWdJ6+EdjJhbE 4rKx+gBR9TQ2gn8JsQBA94xInjXd9MeC8oWg/rY1y1X4akoa2dznkGilnWP0xw== From: Zane van Iperen To: ffmpeg-devel@ffmpeg.org Date: Thu, 1 Apr 2021 21:34:49 +1000 Message-Id: <20210401113449.12680-3-zane@zanevaniperen.com> In-Reply-To: <20210401113449.12680-1-zane@zanevaniperen.com> References: <20210401113449.12680-1-zane@zanevaniperen.com> MIME-Version: 1.0 X-Migadu-Flow: FLOW_OUT X-Migadu-Auth-User: git-morningstar@zanevaniperen.com Subject: [FFmpeg-devel] [PATCH 3/3] avcodec/adpcm: refactor init/flush code 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" Most of the codecs just need everything zeroed. Those that don't are either handled inline during decode, or pull state from extradata. Move state reset/init functionality into adpcm_flush(), and invoke it from adpcm_decode_init(). Signed-off-by: Zane van Iperen --- libavcodec/adpcm.c | 71 +++++++++++++++++++--------------------------- 1 file changed, 29 insertions(+), 42 deletions(-) diff --git a/libavcodec/adpcm.c b/libavcodec/adpcm.c index 8aab07e334..be14607eac 100644 --- a/libavcodec/adpcm.c +++ b/libavcodec/adpcm.c @@ -103,6 +103,8 @@ typedef struct ADPCMDecodeContext { int has_status; /**< Status flag. Reset to 0 after a flush. */ } ADPCMDecodeContext; +static void adpcm_flush(AVCodecContext *avctx); + static av_cold int adpcm_decode_init(AVCodecContext * avctx) { ADPCMDecodeContext *c = avctx->priv_data; @@ -150,38 +152,10 @@ static av_cold int adpcm_decode_init(AVCodecContext * avctx) } switch(avctx->codec->id) { - case AV_CODEC_ID_ADPCM_CT: - c->status[0].step = c->status[1].step = 511; - break; case AV_CODEC_ID_ADPCM_IMA_WAV: if (avctx->bits_per_coded_sample < 2 || avctx->bits_per_coded_sample > 5) return AVERROR_INVALIDDATA; break; - case AV_CODEC_ID_ADPCM_IMA_APC: - if (avctx->extradata && avctx->extradata_size >= 8) { - c->status[0].predictor = av_clip_intp2(AV_RL32(avctx->extradata ), 18); - c->status[1].predictor = av_clip_intp2(AV_RL32(avctx->extradata + 4), 18); - } - break; - case AV_CODEC_ID_ADPCM_IMA_APM: - if (avctx->extradata) { - if (avctx->extradata_size >= 28) { - c->status[0].predictor = av_clip_intp2(AV_RL32(avctx->extradata + 16), 18); - c->status[0].step_index = av_clip(AV_RL32(avctx->extradata + 20), 0, 88); - c->status[1].predictor = av_clip_intp2(AV_RL32(avctx->extradata + 4), 18); - c->status[1].step_index = av_clip(AV_RL32(avctx->extradata + 8), 0, 88); - } else if (avctx->extradata_size >= 16) { - c->status[0].predictor = av_clip_intp2(AV_RL32(avctx->extradata + 0), 18); - c->status[0].step_index = av_clip(AV_RL32(avctx->extradata + 4), 0, 88); - c->status[1].predictor = av_clip_intp2(AV_RL32(avctx->extradata + 8), 18); - c->status[1].step_index = av_clip(AV_RL32(avctx->extradata + 12), 0, 88); - } - } - break; - case AV_CODEC_ID_ADPCM_IMA_WS: - if (avctx->extradata && avctx->extradata_size >= 2) - c->vqa_version = AV_RL16(avctx->extradata); - break; case AV_CODEC_ID_ADPCM_ARGO: if (avctx->bits_per_coded_sample != 4 || avctx->block_align != 17 * avctx->channels) return AVERROR_INVALIDDATA; @@ -228,6 +202,7 @@ static av_cold int adpcm_decode_init(AVCodecContext * avctx) avctx->sample_fmt = AV_SAMPLE_FMT_S16; } + adpcm_flush(avctx); return 0; } @@ -2110,29 +2085,41 @@ static void adpcm_flush(AVCodecContext *avctx) { ADPCMDecodeContext *c = avctx->priv_data; + /* Just nuke the entire state and re-init. */ + memset(c, 0, sizeof(ADPCMDecodeContext)); + switch(avctx->codec_id) { - case AV_CODEC_ID_ADPCM_AICA: - for (int channel = 0; channel < avctx->channels; channel++) - c->status[channel].step = 0; + case AV_CODEC_ID_ADPCM_CT: + c->status[0].step = c->status[1].step = 511; break; - case AV_CODEC_ID_ADPCM_ARGO: - for (int channel = 0; channel < avctx->channels; channel++) { - c->status[channel].sample1 = 0; - c->status[channel].sample2 = 0; + case AV_CODEC_ID_ADPCM_IMA_APC: + if (avctx->extradata && avctx->extradata_size >= 8) { + c->status[0].predictor = av_clip_intp2(AV_RL32(avctx->extradata ), 18); + c->status[1].predictor = av_clip_intp2(AV_RL32(avctx->extradata + 4), 18); } break; - case AV_CODEC_ID_ADPCM_IMA_ALP: - case AV_CODEC_ID_ADPCM_IMA_CUNNING: - case AV_CODEC_ID_ADPCM_IMA_SSI: - case AV_CODEC_ID_ADPCM_ZORK: - for (int channel = 0; channel < avctx->channels; channel++) { - c->status[channel].predictor = 0; - c->status[channel].step_index = 0; + case AV_CODEC_ID_ADPCM_IMA_APM: + if (avctx->extradata) { + if (avctx->extradata_size >= 28) { + c->status[0].predictor = av_clip_intp2(AV_RL32(avctx->extradata + 16), 18); + c->status[0].step_index = av_clip(AV_RL32(avctx->extradata + 20), 0, 88); + c->status[1].predictor = av_clip_intp2(AV_RL32(avctx->extradata + 4), 18); + c->status[1].step_index = av_clip(AV_RL32(avctx->extradata + 8), 0, 88); + } else if (avctx->extradata_size >= 16) { + c->status[0].predictor = av_clip_intp2(AV_RL32(avctx->extradata + 0), 18); + c->status[0].step_index = av_clip(AV_RL32(avctx->extradata + 4), 0, 88); + c->status[1].predictor = av_clip_intp2(AV_RL32(avctx->extradata + 8), 18); + c->status[1].step_index = av_clip(AV_RL32(avctx->extradata + 12), 0, 88); + } } break; + case AV_CODEC_ID_ADPCM_IMA_WS: + if (avctx->extradata && avctx->extradata_size >= 2) + c->vqa_version = AV_RL16(avctx->extradata); + break; default: /* Other codecs may want to handle this during decoding. */ c->has_status = 0;