From patchwork Sun Dec 23 18:24:49 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Michael Niedermayer X-Patchwork-Id: 11530 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 9666644C5E0 for ; Sun, 23 Dec 2018 20:26:20 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 46E6D68B074; Sun, 23 Dec 2018 20:26:17 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from vie01a-dmta-pe05-1.mx.upcmail.net (vie01a-dmta-pe05-1.mx.upcmail.net [84.116.36.11]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id B60EC68A8BD for ; Sun, 23 Dec 2018 20:26:10 +0200 (EET) Received: from [172.31.216.235] (helo=vie01a-pemc-psmtp-pe12.mail.upcmail.net) by vie01a-dmta-pe05.mx.upcmail.net with esmtp (Exim 4.88) (envelope-from ) id 1gb8S6-00052l-0c for ffmpeg-devel@ffmpeg.org; Sun, 23 Dec 2018 19:26:14 +0100 Received: from localhost ([213.47.41.20]) by vie01a-pemc-psmtp-pe12.mail.upcmail.net with ESMTP id b8R7g4Zyj2WSsb8R7gsqzw; Sun, 23 Dec 2018 19:25:14 +0100 X-Env-Mailfrom: michael@niedermayer.cc X-Env-Rcptto: ffmpeg-devel@ffmpeg.org X-SourceIP: 213.47.41.20 X-CNFS-Analysis: v=2.3 cv=E7kcWpVl c=1 sm=1 tr=0 a=I1eytVlZLDX1BM2VTtTtSw==:117 a=I1eytVlZLDX1BM2VTtTtSw==:17 a=MKtGQD3n3ToA:10 a=1oJP67jkp3AA:10 a=GEAsPZ9sns4A:10 a=ZZnuYtJkoWoA:10 a=YCA_ayjJysPa4A1GQ7YA:9 a=pHzHmUro8NiASowvMSCR:22 a=Ew2E2A-JSTLzCXPT_086:22 From: Michael Niedermayer To: FFmpeg development discussions and patches Date: Sun, 23 Dec 2018 19:24:49 +0100 Message-Id: <20181223182450.26476-1-michael@niedermayer.cc> X-Mailer: git-send-email 2.20.1 MIME-Version: 1.0 X-CMAE-Envelope: MS4wfF2r3sa6HxZ6+i9NqGl8e73l2fVgMFythPBCnXa0zw2B9BFtZLvS1Rns/Amy6FpXcuKGgLiF74KvlkfqQrj3Hvlwj2o2SpsWpuK7pIfElajy/OZ8l/cW 323ZOB/QigpaejQTLr3DNdj5jq51hUgFMvzgj6ZN9YbrPmQna7lBNH3H Subject: [FFmpeg-devel] [PATCH 1/2] avcodec/rangecoder: Add and test ff_rac_check_termination() 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" Signed-off-by: Michael Niedermayer --- libavcodec/rangecoder.c | 19 +++++++++++++++++++ libavcodec/rangecoder.h | 9 +++++++++ libavcodec/tests/rangecoder.c | 7 +++++-- 3 files changed, 33 insertions(+), 2 deletions(-) diff --git a/libavcodec/rangecoder.c b/libavcodec/rangecoder.c index fa7d5526d1..a6a3f082ef 100644 --- a/libavcodec/rangecoder.c +++ b/libavcodec/rangecoder.c @@ -121,3 +121,22 @@ int ff_rac_terminate(RangeCoder *c, int version) return c->bytestream - c->bytestream_start; } + +int ff_rac_check_termination(RangeCoder *c, int version) +{ + if (version == 1) { + RangeCoder tmp = *c; + get_rac(c, (uint8_t[]) { 129 }); + + if (c->bytestream == tmp.bytestream && c->bytestream > c->bytestream_start) + tmp.low -= *--tmp.bytestream; + tmp.bytestream_end = tmp.bytestream; + + if (get_rac(&tmp, (uint8_t[]) { 129 })) + return AVERROR_INVALIDDATA; + } else { + if (c->bytestream_end != c->bytestream) + return AVERROR_INVALIDDATA; + } + return 0; +} diff --git a/libavcodec/rangecoder.h b/libavcodec/rangecoder.h index 4495f6df1a..4d4ca4d526 100644 --- a/libavcodec/rangecoder.h +++ b/libavcodec/rangecoder.h @@ -57,6 +57,15 @@ void ff_init_range_decoder(RangeCoder *c, const uint8_t *buf, int buf_size); */ int ff_rac_terminate(RangeCoder *c, int version); +/** + * Check if at the current position there is a valid looking termination + * @param version version 0 requires the decoder to know the data size in bytes + * version 1 needs about 1 bit more space but does not need to + * carry the size from encoder to decoder + * @returns negative AVERROR code on error or non negative. + */ +int ff_rac_check_termination(RangeCoder *c, int version); + void ff_build_rac_states(RangeCoder *c, int factor, int max_p); static inline void renorm_encoder(RangeCoder *c) diff --git a/libavcodec/tests/rangecoder.c b/libavcodec/tests/rangecoder.c index 3fd07ed9a9..b6edc1493f 100644 --- a/libavcodec/tests/rangecoder.c +++ b/libavcodec/tests/rangecoder.c @@ -60,8 +60,11 @@ int main(void) av_log(NULL, AV_LOG_ERROR, "rac failure at %d pass %d version %d\n", i, p, version); return 1; } - if(version) - get_rac(&c, (uint8_t[]) { 129 }); + + if (ff_rac_check_termination(&c, version) < 0) { + av_log(NULL, AV_LOG_ERROR, "rac failure at termination pass %d version %d\n", p, version); + return 1; + } if (c.bytestream - c.bytestream_start - actual_length != version) { av_log(NULL, AV_LOG_ERROR, "rac failure at pass %d version %d\n", p, version); return 1;