From patchwork Mon Jun 5 00:43:35 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jun Zhao X-Patchwork-Id: 3838 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.103.10.2 with SMTP id 2csp1137036vsk; Sun, 4 Jun 2017 17:49:50 -0700 (PDT) X-Received: by 10.28.144.10 with SMTP id s10mr6417107wmd.62.1496623790320; Sun, 04 Jun 2017 17:49:50 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1496623790; cv=none; d=google.com; s=arc-20160816; b=VycC9RMwuyXstXx4bjklYSxR8iCBAU68CEhYNmV9Pv5K9ewFo/oGCX7R5MNuvPXBw4 L9TNZNeLxfktidhltfc/CMVuIkXrunRxXCPXOYKTmxXTBVe8rJdcOItvZxoliuA4OI2F 4kh7BNvNDeKCpWpdmy8svx3KGQ8SKbR39j1JE3ct4GdzZdKv8ugxJK8Uxk03Qn9hTaKT JmgE1gM9O4jOkJxsyiW2I/SOcCubDzLRc3I4syBxL80aESemRPS+hVHyOIz/yQMF0c2I 1Su85Hmuw8Mu2RMR5pVYeZG3wh4hylhHPjaFDp1LtpTILyZDaFonDDL+/FFcIllrxLdw KtLA== 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=05S9zyI2dpbxDnlQCEnlSk7PXvGPB93GdMCBJBK2W/Q=; b=eUFUoHW/+Gd4N1ZQuFjoqzpboFJg937mJUj6H1rkiAgpkF2qrEm+ibYl6pIFyBiyRf ZoDoyt4H98dzbQYeBaEHryT3q/DRdP1lwbq3l4FYs5ja2Mh36y8WMlyektzI/UoNFe8H mm1TpDzTQPOgm9XY9aZK8jyM0Z3pm5Bgiy/w8GB6RvJ+zxzdrziN31wIK9VDrl/gtNzB 8I+BFph+ImR/LRa0wwK69Lp/A+srKXFgmhL9PlSb0025ZCqF/sV6mP0UxWHUKB3qjKCy m1G/CZkS04i1iyZZ+TAuA2DxhKQs9xSQmIaIMJg7LPLfqi9CXzY74Ty/vRvRBxX5OVC3 B9EQ== 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 v1si87034wrv.93.2017.06.04.17.49.49; Sun, 04 Jun 2017 17:49:50 -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 B992F689DDB; Mon, 5 Jun 2017 03:49:39 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pg0-f66.google.com (mail-pg0-f66.google.com [74.125.83.66]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 4F491689DC9 for ; Mon, 5 Jun 2017 03:49:33 +0300 (EEST) Received: by mail-pg0-f66.google.com with SMTP id s62so7881896pgc.0 for ; Sun, 04 Jun 2017 17:49:39 -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=rf/ZKzNg0/XYkgWs0bpr3JpR7x0E7pUwD49qLcXkMNc=; b=TO+izNuA6IsuLZ6wtNyhErZUryusk16wmb1NaxpMn+quuOWZtqZraI/CXwcSy+zM8U lnz1RSq5njQkr+4DrYXMidO729x9Epc60ErrfVawzPYQk/Jyi8QlF6MoqrnY8hm1FvJ7 0r3ZEqUH7qGRr0iU7uFgr2dj3b+4HQC894o2oX1uM6fWi0BIVIurySwG3qYnnv0IKi2U Nwiw3vYm41NaXRHhaauZ02xlxnkpKcy8mwimdudkHeDY4CpNsu3S2tC/JLEsQZU3FfDX xIsnSfUJZ4FBdwYxXLIbAt0D2y3C/QwdWpLxzj8FwQ6rEq9JMblxLM9K7KusfB1ZyPhL N4zw== 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=rf/ZKzNg0/XYkgWs0bpr3JpR7x0E7pUwD49qLcXkMNc=; b=k4SeuuebSZtgVte3ThQp1sB8bAvVqTIu6oT4mgU8a0VKHDieGqJXp/fGWHmLlBs2D1 vCfcX8I1qMqDGfu2aK5tr7QOQhDeE3m5mxRdrIA5YlM0F7N3w15efdDafiIBY0iC1cdI cClz+Mrpf6NvI7XddZof2pjnnPN9TEB2Pr4o/sByPRae+aBzFiUNY9mgzTsC9aC1tUec V5d2ZEX4maE2C2mOdKjrWdxrZwfLR/CQqCADxGZafsPr0nmEkdwsrULRoxtTwlQVqTzC M2ECFsZJN+oZrxn6eZVtbF8osWEjfMwOvcM40az/5/uUFGyHGnm5IQlbU2MlCFK+vAGc gyJQ== X-Gm-Message-State: AODbwcBZXFnwBPn0UBLcDC7xgn/d34paClOXl173rmTkV0ATvPnjizs+ zHXGSCiabdjIkg== X-Received: by 10.84.224.14 with SMTP id r14mr12154702plj.285.1496623420533; Sun, 04 Jun 2017 17:43:40 -0700 (PDT) Received: from [10.239.204.74] ([192.55.54.40]) by smtp.gmail.com with ESMTPSA id g23sm47442382pfb.54.2017.06.04.17.43.37 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 04 Jun 2017 17:43:38 -0700 (PDT) To: FFmpeg development discussions and patches , Michael Niedermayer , Carl Eugen Hoyos From: Jun Zhao Message-ID: <7b19843f-a9ac-84f7-bbed-3691d4427071@gmail.com> Date: Mon, 5 Jun 2017 08:43:35 +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 V2] 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" V2: Add Add set_ue_golomb_long() to support 32bits UE golomb and update the unit test. From 6fe36e4e2a41f70e2a41c5eba90b5143b4eeba7b Mon Sep 17 00:00:00 2001 From: Jun Zhao Date: Fri, 2 Jun 2017 15:05:49 +0800 Subject: [PATCH V2] 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 | 20 +++++++++++++++++++- libavcodec/put_bits.h | 35 +++++++++++++++++++++++++++++++++++ libavcodec/tests/golomb.c | 19 +++++++++++++++++++ 3 files changed, 73 insertions(+), 1 deletion(-) diff --git a/libavcodec/golomb.h b/libavcodec/golomb.h index 0833aff468..47ab884282 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,24 @@ 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 <= (0xffffffff - 2)); + + if (i < 256) + put_bits(pb, ff_ue_golomb_len[i], i + 1); + else { + int e = av_log2(i + 1); + if (e < 16) + put_bits(pb, 2 * e + 1, i + 1); + else + 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..06f0ebbeba 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 && value < (1UL << 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);