From patchwork Fri Jun 9 02:34:19 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jun Zhao X-Patchwork-Id: 3882 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.103.10.2 with SMTP id 2csp3134717vsk; Thu, 8 Jun 2017 19:34:36 -0700 (PDT) X-Received: by 10.28.74.134 with SMTP id n6mr5738923wmi.40.1496975676151; Thu, 08 Jun 2017 19:34:36 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1496975676; cv=none; d=google.com; s=arc-20160816; b=j0+9AQdtg2SwlVAAE7i8kv8/HVqSi6q6CC8gDwG2YMjuxTM2YGvNJcc7960573Htny RXdBDwYXeyhE3yfXrY2Wi0yVS5qhnUVHf11iFs2reyDdASJtKP6vrHdz3G4QhHlYa6rv Y5OOoAp6f/rRe+47PKLgbwf5U+eRsapS/EecDr3C5PZUbPkucN7Tu6E+azGBZOujGMu4 TNSiOSweBfnXUKvrS3I/5DRdnIBkDvPWWPuyNM1nRuq4snT3csIGGXMlpzMpwMvkKUR+ 1PdNygSLR8xmudCLZLRqHZLFukHGNPUmM+7YTiUt8SuChFb7pDSnWkBYZTjPMPADAlTN RjRw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:reply-to:list-subscribe:list-help:list-post :list-archive:list-unsubscribe:list-id:precedence:subject :content-language:mime-version:user-agent:date:message-id:from:to :dkim-signature:delivered-to:arc-authentication-results; bh=JU6tAUWuFEPZK4QkWb/Vho04qG6F0kgCg8ezqOWbnkI=; b=x5vcdvL2poNOYsg8TweJ+W5nNDaUzxXeTyxhYa/hp8xSli8tZPoM9l+KuwaoAkUD+c EDhJnbUlVE/pbvhpKfwEfrxLEkHlWPmLVNJu0jbbccmPgIref39/bTG+Fh3B0flgBWGR zSkLBFJ1u9pisdD6y+QTjVAtujCgY+vvsUIPymFLaRajKRI32qaT/SfcVdjeU4meLI1M kC71wKVtcXs9VYJChBdfmnfGk9RhFG2o7E86BcbLe0AoZI/AXBe/toRvLBJMYjnCPF+a p/GeBK82cIZQ/O2AJUjo9rr6j6yiZ6OnkE05lKnwZ+qNEZDeEKZfngfaDHkQSS62kVpL jNTw== 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 189si109839wmz.140.2017.06.08.19.34.35; Thu, 08 Jun 2017 19:34:36 -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 E78B7689CEA; Fri, 9 Jun 2017 05:34:31 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pf0-f196.google.com (mail-pf0-f196.google.com [209.85.192.196]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id E2900680A6C for ; Fri, 9 Jun 2017 05:34:24 +0300 (EEST) Received: by mail-pf0-f196.google.com with SMTP id u26so7055793pfd.2 for ; Thu, 08 Jun 2017 19:34:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=to:from:subject:message-id:date:user-agent:mime-version :content-language; bh=AljgLn42vy1LRYTxkL/Lq77vFEaIRyr7hc4O8x+umMc=; b=rphbrJ9i/o/pKrO+wa3tuo9YNaiaeD4qJaREBlp3Y+xs7iJo2B06P/BuWT7GPk1PZq wApfBbsxjw9QhjoPeoumr8sMtO7ix+MiYBxa0WmPMeTAxtvnYtBJD7FAXBNVUiK8wLpq owcNENkzv7xtjXk4HRMjhdIpHtfyQgljA/mtG4IUfrTmFEl+zIiKxypqphaygxKisngv WnsqGKTbWtL7VXS6Jls2R7g6zM+GBFwO82TApJ0Cy4CX8SfJcy66PpbD8WcXuBssToGO 6JdTMNNw5Guq14RHhr8xNvCE7SudIg2Rgdc3l+adpcjias5dEAvHqPIpLwMOffhWKLk2 6jIA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:to:from:subject:message-id:date:user-agent :mime-version:content-language; bh=AljgLn42vy1LRYTxkL/Lq77vFEaIRyr7hc4O8x+umMc=; b=reQOPFAuqaJWoEMhpXCffmQbMw+lmQksLPAMs2lMzdWGsQFKF/Sd4S/E7i9CXMbdXb KHRoBATJRYMFKOWznXYsT2cPs+KWcMU6WYAcI0pbB+gp/hEhBGmngBNLFItqjzuvaaFZ VgU3q9AyIEcXi5hn2DEuYDnFmhRVYVFlnJA4TfDlLi4BmwiDiKLF8pjxe9YyXQCZr8Vh H0wUTBENtY55X1zkW5e1daHkUGi5yuJgE5uaAf9aiA+rJOWJpe8DHsN6mIQq1reSPbau HpHhN9iDy5A67VJqq6fQtDJn5KJmidv3mSAvTDqlyhmnp2JMCjBJVr050QtBPp3Ra7Ma cVJw== X-Gm-Message-State: AODbwcBoMouK3DaVqV531n8r4qg7pbgGkYXYlAqTZsOEe3X8plrmnfZ5 FNsIZDGmi+eF/g== X-Received: by 10.98.52.66 with SMTP id b63mr14427617pfa.7.1496975663407; Thu, 08 Jun 2017 19:34:23 -0700 (PDT) Received: from [10.239.204.30] ([192.55.54.45]) by smtp.gmail.com with ESMTPSA id p23sm12949803pfi.52.2017.06.08.19.34.20 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 08 Jun 2017 19:34:22 -0700 (PDT) To: FFmpeg development discussions and patches , Mark Thompson , Michael Niedermayer From: Jun Zhao Message-ID: Date: Fri, 9 Jun 2017 10:34:19 +0800 User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:52.0) Gecko/20100101 Thunderbird/52.1.1 MIME-Version: 1.0 Content-Language: en-US Subject: [FFmpeg-devel] [PATCH V4] lavc/golomb: Fix UE golomb overwrite issue. 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" V4: Fix rang check error in assert base on Mark's review V3: Clean the code logic base on Michael's review. V2: Add set_ue_golomb_long() to support 32bits UE golomb and update the unit test. From fa3f59e5fcb2cddcc44b0e895bfa02caa491fee5 Mon Sep 17 00:00:00 2001 From: Jun Zhao Date: Fri, 2 Jun 2017 15:05:49 +0800 Subject: [PATCH V4] lavc/golomb: Fix UE golomb overwrite issue. put_bits just support write up to 31 bits, when write 32 bit in put_bits, it's will overwrite the bit buffer, because the default assert level is 0, the av_assert2(n <= 31 && value < (1U << n)) in put_bits can not be trigger runtime. Add set_ue_golomb_long() to support 32bits UE golomb. Signed-off-by: Jun Zhao --- libavcodec/golomb.h | 17 ++++++++++++++++- libavcodec/put_bits.h | 35 +++++++++++++++++++++++++++++++++++ libavcodec/tests/golomb.c | 19 +++++++++++++++++++ 3 files changed, 70 insertions(+), 1 deletion(-) -- 2.11.0 diff --git a/libavcodec/golomb.h b/libavcodec/golomb.h index 0833aff468..52bb88daa7 100644 --- a/libavcodec/golomb.h +++ b/libavcodec/golomb.h @@ -458,7 +458,7 @@ static inline int get_te(GetBitContext *s, int r, char *file, const char *func, #endif /* TRACE */ /** - * write unsigned exp golomb code. + * write unsigned exp golomb code. 2^16-2 at most. */ static inline void set_ue_golomb(PutBitContext *pb, int i) { @@ -473,6 +473,21 @@ static inline void set_ue_golomb(PutBitContext *pb, int i) } /** + * write unsigned exp golomb code. 2^32-2 at most. + */ +static inline void set_ue_golomb_long(PutBitContext *pb, uint32_t i) +{ + av_assert2(i <= (UINT32_MAX - 1)); + + if (i < 256) + put_bits(pb, ff_ue_golomb_len[i], i + 1); + else { + int e = av_log2(i + 1); + put_bits64(pb, 2 * e + 1, i + 1); + } +} + +/** * write truncated unsigned exp golomb code. */ static inline void set_te_golomb(PutBitContext *pb, int i, int range) diff --git a/libavcodec/put_bits.h b/libavcodec/put_bits.h index 68ed391195..132d07558e 100644 --- a/libavcodec/put_bits.h +++ b/libavcodec/put_bits.h @@ -221,6 +221,41 @@ static void av_unused put_bits32(PutBitContext *s, uint32_t value) } /** + * Write up to 64 bits into a bitstream. + */ +static inline void put_bits64(PutBitContext *s, int n, uint64_t value) +{ + av_assert2((n == 64) || (n < 64 && value < (UINT64_C(1) << n))); + + if (n < 32) + put_bits(s, n, value); + else if (n == 32) + put_bits32(s, value); + else if (n < 64) { + uint32_t lo = value & 0xffffffff; + uint32_t hi = value >> 32; +#ifdef BITSTREAM_WRITER_LE + put_bits32(s, lo); + put_bits(s, n - 32, hi); +#else + put_bits(s, n - 32, hi); + put_bits32(s, lo); +#endif + } else { + uint32_t lo = value & 0xffffffff; + uint32_t hi = value >> 32; +#ifdef BITSTREAM_WRITER_LE + put_bits32(s, lo); + put_bits32(s, hi); +#else + put_bits32(s, hi); + put_bits32(s, lo); +#endif + + } +} + +/** * Return the pointer to the byte where the bitstream writer will put * the next bit. */ diff --git a/libavcodec/tests/golomb.c b/libavcodec/tests/golomb.c index 965367b7be..85b8a9390b 100644 --- a/libavcodec/tests/golomb.c +++ b/libavcodec/tests/golomb.c @@ -21,6 +21,7 @@ #include #include +#include "libavutil/internal.h" #include "libavutil/mem.h" #include "libavcodec/get_bits.h" @@ -76,6 +77,24 @@ int main(void) } } +#define EXTEND_L(i) ((i) << 4 | (i) & 15) + init_put_bits(&pb, temp, SIZE); + for (i = 0; i < COUNT; i++) + set_ue_golomb_long(&pb, EXTEND_L(i)); + flush_put_bits(&pb); + + init_get_bits(&gb, temp, 8 * SIZE); + for (i = 0; i < COUNT; i++) { + int j, s = show_bits_long(&gb, 32); + + j = get_ue_golomb_long(&gb); + if (j != EXTEND_L(i)) { + fprintf(stderr, "get_ue_golomb_long: expected %d, got %d. " + "bits: %8x\n", EXTEND_L(i), j, s); + ret = 1; + } + } + init_put_bits(&pb, temp, SIZE); for (i = 0; i < COUNT; i++) set_se_golomb(&pb, i - COUNT / 2);