From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTP id 269A14A836 for ; Wed, 10 Apr 2024 13:43:06 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 2E75C68C81B; Wed, 10 Apr 2024 16:43:04 +0300 (EEST) Received: from mail-pl1-f172.google.com (mail-pl1-f172.google.com [209.85.214.172]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 4BB4568C463 for ; Wed, 10 Apr 2024 16:42:56 +0300 (EEST) Received: by mail-pl1-f172.google.com with SMTP id d9443c01a7336-1e2178b2cf2so60161925ad.0 for ; Wed, 10 Apr 2024 06:42:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1712756573; x=1713361373; darn=ffmpeg.org; h=content-transfer-encoding:in-reply-to:from:content-language :references:to:subject:user-agent:mime-version:date:message-id:from :to:cc:subject:date:message-id:reply-to; bh=vO+QTA74puNKpgKhDiuPfDBquMMke7BDlgZVO9HfILM=; b=PQnC3CxYKWevcmfV3bjXZyprtbzjCZ2WtDhaUcyPqjQ+es9VDrT2Gv+pAKkna9kPlM BJ3n02fKpwnKgfW7POaW7EYwKrQuzw6KHGOUljUCu9tLJKdwOOBGsU938AuHB98k8FMg Yst3LuB3mTG4N4o6Fet9vjTmgqIgQmJRcal25f2GqxCSo8MVsxrjs4GqRqnmhBvyc25S iBiUS5XvqswdltWi/w176URe5qleixCEKkxGePunXU9v3l3vZchf+P1AswWmeUjM+pxx pYKYgbYHYoevs9gDMuZkxyiaKNlV7TeXzZUkfz69h4W3DGb/4/WgG+NffOKBp4v4kLNG AQHQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1712756573; x=1713361373; h=content-transfer-encoding:in-reply-to:from:content-language :references:to:subject:user-agent:mime-version:date:message-id :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=vO+QTA74puNKpgKhDiuPfDBquMMke7BDlgZVO9HfILM=; b=kESJdnC/uZJiBzjLHKgAbO/AGg0Gl4kkpCeHgAdy8zbJ3lKHoszjEMx26sI2VD0X2N E/eSmA9p83iRvq+3GmdeNxwPdWgqj8mZLTvj1dSoRya/hlZu8k1rkvtWBVrLXVF8RThu aNEJPB/srnMs0SwikQSNTkS3hyijyavY4oVMd341wA/igR3WeCTrWhou9Z2rgF8PaApu s01YOO+xytjgIhy62m5Xyeom3EfpgzZ2xq6CfsF+M4/GQ3AY+lx4YoikHIAZu8dRF24A GZ+DsCshc+91WoAlb6ETsv84gsdvbonBkK03S91S7U/w2OjhTzvEBZLVdYX7+byNtHcL PLrg== X-Gm-Message-State: AOJu0YyZnOlnoH3Yo1gWorAHdb15oBlFsE+SfRfnep8uYQDU+yPQ8gZ2 NszQBvx/xwc6Jki6/Ec0lImHn8l1dRNUeX6JANz7ouOjxDOZKjFoYX6jk1Ml X-Google-Smtp-Source: AGHT+IHHgAAfIJjYTD9SgaTPkLWTpqIdShCayrpQzVmBrE4R/atIaIWzMFQzKwzL32Y6R7uvx8KHhg== X-Received: by 2002:a17:902:e84f:b0:1e4:c75e:aae2 with SMTP id t15-20020a170902e84f00b001e4c75eaae2mr3456137plg.59.1712756573018; Wed, 10 Apr 2024 06:42:53 -0700 (PDT) Received: from [192.168.0.16] ([190.194.167.233]) by smtp.gmail.com with ESMTPSA id u6-20020a170902e5c600b001dc3916853csm10693239plf.73.2024.04.10.06.42.51 for (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Wed, 10 Apr 2024 06:42:52 -0700 (PDT) Message-ID: <164770af-7349-4ff1-93d3-73f30ac90966@gmail.com> Date: Wed, 10 Apr 2024 10:42:51 -0300 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird To: ffmpeg-devel@ffmpeg.org References: <20240410133118.28144-1-anton@khirnov.net> <20240410133118.28144-9-anton@khirnov.net> Content-Language: en-US From: James Almer In-Reply-To: <20240410133118.28144-9-anton@khirnov.net> Subject: Re: [FFmpeg-devel] [PATCH 09/10] lavc/hevc_ps: reduce the size of ShortTermRPS.used X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 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 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="us-ascii"; Format="flowed" Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: On 4/10/2024 10:31 AM, Anton Khirnov wrote: > It is currently an array of 32 uint8_t, each storing a single flag. A > single uint32_t is sufficient. > > Reduces sizeof(HEVCSPS) by 1792 bytes. > --- > libavcodec/hevc_ps.c | 33 +++++++++++++++++++-------------- > libavcodec/hevc_ps.h | 2 +- > libavcodec/hevc_refs.c | 6 +++--- > libavcodec/vulkan_hevc.c | 8 ++++---- > 4 files changed, 27 insertions(+), 22 deletions(-) > > diff --git a/libavcodec/hevc_ps.c b/libavcodec/hevc_ps.c > index a6b0021bc3..76fe507e7b 100644 > --- a/libavcodec/hevc_ps.c > +++ b/libavcodec/hevc_ps.c > @@ -107,6 +107,7 @@ int ff_hevc_decode_short_term_rps(GetBitContext *gb, AVCodecContext *avctx, > int k = 0; > int i; > > + rps->used = 0; > rps->rps_predict = 0; > > if (rps != sps->st_rps && sps->nb_st_rps) > @@ -114,6 +115,7 @@ int ff_hevc_decode_short_term_rps(GetBitContext *gb, AVCodecContext *avctx, > > if (rps->rps_predict) { > const ShortTermRPS *rps_ridx; > + uint8_t used[32] = { 0 }; > int delta_rps; > > if (is_slice_header) { > @@ -139,13 +141,13 @@ int ff_hevc_decode_short_term_rps(GetBitContext *gb, AVCodecContext *avctx, > } > delta_rps = (1 - (rps->delta_rps_sign << 1)) * rps->abs_delta_rps; > for (i = 0; i <= rps_ridx->num_delta_pocs; i++) { > - int used = rps->used[k] = get_bits1(gb); > + used[k] = get_bits1(gb); > > rps->use_delta_flag = 0; > - if (!used) > + if (!used[k]) > rps->use_delta_flag = get_bits1(gb); > > - if (used || rps->use_delta_flag) { > + if (used[k] || rps->use_delta_flag) { > if (i < rps_ridx->num_delta_pocs) > delta_poc = delta_rps + rps_ridx->delta_poc[i]; > else > @@ -157,7 +159,7 @@ int ff_hevc_decode_short_term_rps(GetBitContext *gb, AVCodecContext *avctx, > } > } > > - if (k >= FF_ARRAY_ELEMS(rps->used)) { > + if (k >= FF_ARRAY_ELEMS(used)) { > av_log(avctx, AV_LOG_ERROR, > "Invalid num_delta_pocs: %d\n", k); > return AVERROR_INVALIDDATA; > @@ -167,35 +169,38 @@ int ff_hevc_decode_short_term_rps(GetBitContext *gb, AVCodecContext *avctx, > rps->num_negative_pics = k0; > // sort in increasing order (smallest first) > if (rps->num_delta_pocs != 0) { > - int used, tmp; > + int u, tmp; > for (i = 1; i < rps->num_delta_pocs; i++) { > delta_poc = rps->delta_poc[i]; > - used = rps->used[i]; > + u = used[i]; > for (k = i - 1; k >= 0; k--) { > tmp = rps->delta_poc[k]; > if (delta_poc < tmp) { > rps->delta_poc[k + 1] = tmp; > - rps->used[k + 1] = rps->used[k]; > + used[k + 1] = used[k]; > rps->delta_poc[k] = delta_poc; > - rps->used[k] = used; > + used[k] = u; > } > } > } > } > if ((rps->num_negative_pics >> 1) != 0) { > - int used; > + int u; > k = rps->num_negative_pics - 1; > // flip the negative values to largest first > for (i = 0; i < rps->num_negative_pics >> 1; i++) { > delta_poc = rps->delta_poc[i]; > - used = rps->used[i]; > + u = used[i]; > rps->delta_poc[i] = rps->delta_poc[k]; > - rps->used[i] = rps->used[k]; > + used[i] = used[k]; > rps->delta_poc[k] = delta_poc; > - rps->used[k] = used; > + used[k] = u; > k--; > } > } > + > + for (unsigned i = 0; i < FF_ARRAY_ELEMS(used); i++) > + rps->used |= used[i] * (1 << i); > } else { > unsigned int nb_positive_pics; > > @@ -222,7 +227,7 @@ int ff_hevc_decode_short_term_rps(GetBitContext *gb, AVCodecContext *avctx, > } > prev -= delta_poc; > rps->delta_poc[i] = prev; > - rps->used[i] = get_bits1(gb); > + rps->used |= get_bits1(gb) * (1 << i); > } > prev = 0; > for (i = 0; i < nb_positive_pics; i++) { > @@ -235,7 +240,7 @@ int ff_hevc_decode_short_term_rps(GetBitContext *gb, AVCodecContext *avctx, > } > prev += delta_poc; > rps->delta_poc[rps->num_negative_pics + i] = prev; > - rps->used[rps->num_negative_pics + i] = get_bits1(gb); > + rps->used |= get_bits1(gb) * (1 << (rps->num_negative_pics + i)); > } > } > } > diff --git a/libavcodec/hevc_ps.h b/libavcodec/hevc_ps.h > index 6ef29a8ea7..92b85115f7 100644 > --- a/libavcodec/hevc_ps.h > +++ b/libavcodec/hevc_ps.h > @@ -79,7 +79,7 @@ typedef struct ShortTermRPS { > int num_delta_pocs; > int rps_idx_num_delta_pocs; > int32_t delta_poc[32]; > - uint8_t used[32]; > + uint32_t used; > } ShortTermRPS; > > typedef struct HEVCWindow { > diff --git a/libavcodec/hevc_refs.c b/libavcodec/hevc_refs.c > index aed649933d..19f3fa81da 100644 > --- a/libavcodec/hevc_refs.c > +++ b/libavcodec/hevc_refs.c > @@ -501,7 +501,7 @@ int ff_hevc_frame_rps(HEVCContext *s) > int poc = s->poc + short_rps->delta_poc[i]; > int list; > > - if (!short_rps->used[i]) > + if (!(short_rps->used & (1 << i))) > list = ST_FOLL; > else if (i < short_rps->num_negative_pics) > list = ST_CURR_BEF; > @@ -540,9 +540,9 @@ int ff_hevc_frame_nb_refs(const HEVCContext *s) > > if (rps) { > for (i = 0; i < rps->num_negative_pics; i++) > - ret += !!rps->used[i]; > + ret += !!(rps->used & (1 << i)); > for (; i < rps->num_delta_pocs; i++) > - ret += !!rps->used[i]; > + ret += !!(rps->used & (1 << i)); > } > > if (long_rps) { > diff --git a/libavcodec/vulkan_hevc.c b/libavcodec/vulkan_hevc.c > index 5d7c6b1b64..c2b65fc201 100644 > --- a/libavcodec/vulkan_hevc.c > +++ b/libavcodec/vulkan_hevc.c > @@ -374,17 +374,17 @@ static void set_sps(const HEVCSPS *sps, int sps_idx, > /* NOTE: This is the predicted, and *reordered* version. > * Probably incorrect, but the spec doesn't say which version to use. */ > for (int j = 0; j < sps->st_rps[i].num_delta_pocs; j++) > - str[i].used_by_curr_pic_flag |= sps->st_rps[i].used[j] << j; > + str[i].used_by_curr_pic_flag |= st_rps->used; > > for (int j = 0; j < str[i].num_negative_pics; j++) { > - str[i].delta_poc_s0_minus1[j] = st_rps->delta_poc[j] - (j ? st_rps->delta_poc[j - 1] : 0) - 1; > - str[i].used_by_curr_pic_s0_flag |= sps->st_rps[i].used[j] << j; > + str[i].delta_poc_s0_minus1[j] = st_rps->delta_poc[j] - (j ? st_rps->delta_poc[j - 1] : 0) - 1; > + str[i].used_by_curr_pic_s0_flag |= st_rps->used & ((1 << str[i].num_negative_pics) - 1); av_mod_uintp2(st_rps->used, str[i].num_negative_pics). > } > > for (int j = 0; j < str[i].num_positive_pics; j++) { > str[i].delta_poc_s0_minus1[j] = st_rps->delta_poc[st_rps->num_negative_pics + j] - > (j ? st_rps->delta_poc[st_rps->num_negative_pics + j - 1] : 0) - 1; > - str[i].used_by_curr_pic_s0_flag |= sps->st_rps[i].used[str[i].num_negative_pics + j] << j; > + str[i].used_by_curr_pic_s0_flag |= st_rps->used >> str[i].num_negative_pics; > } > } > _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".