From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: <ffmpeg-devel-bounces@ffmpeg.org> Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTPS id F142E4BA7D for <ffmpegdev@gitmailbox.com>; Fri, 28 Mar 2025 08:46:07 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id DB005687C36; Fri, 28 Mar 2025 10:45:52 +0200 (EET) Received: from relay8-d.mail.gandi.net (relay8-d.mail.gandi.net [217.70.183.201]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 3DB3E687AFD for <ffmpeg-devel@ffmpeg.org>; Fri, 28 Mar 2025 10:45:45 +0200 (EET) Received: by mail.gandi.net (Postfix) with ESMTPSA id 7D03944447 for <ffmpeg-devel@ffmpeg.org>; Fri, 28 Mar 2025 08:45:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=niedermayer.cc; s=gm1; t=1743151544; 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=Qyjeyp0s323ZbImClb/OSRk+ZPSOy3O+TwbjCuQizO8=; b=mJNq8IwBM4c/cEt6VP0yQLdqlQ9HVKBFNdQ6FhuViMvlfSu0kUlx40wyoppaGkzzWVbfTc jRJ3ysrqgYPTPXo8b9Ry5QHmgRbTT40ogTzxZf+U8uRUXGZrZDvEwpSNKXYDhxxqRJ+2fJ rbWOg4lKQPHUe/Jwl0RP8+VLidjS+SGQSYd7xopVIReXSqKKrCiyunZecnylv7P5vkhWVr ZefQp5S6pduE7VLPnKe+uyRcQaeWsGVZCNwJTlTl2ivDE0HYa5Iaw+y0HiiQ7dAiTSkKcs Wht01pXrFYqBhy7SfxwrGeAwVYkxAQ7/OJqW2cyYOgQD9WqcwkdU28s0AEEXPw== From: Michael Niedermayer <michael@niedermayer.cc> To: FFmpeg development discussions and patches <ffmpeg-devel@ffmpeg.org> Date: Fri, 28 Mar 2025 09:45:42 +0100 Message-ID: <20250328084542.263642-2-michael@niedermayer.cc> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250328084542.263642-1-michael@niedermayer.cc> References: <20250328084542.263642-1-michael@niedermayer.cc> MIME-Version: 1.0 X-GND-State: clean X-GND-Score: -70 X-GND-Cause: gggruggvucftvghtrhhoucdtuddrgeefvddrtddtgddujedtkeehucetufdoteggodetrfdotffvucfrrhhofhhilhgvmecuifetpfffkfdpucggtfgfnhhsuhgsshgtrhhisggvnecuuegrihhlohhuthemuceftddunecusecvtfgvtghiphhivghnthhsucdlqddutddtmdenfghrlhcuvffnffculdeftddmnecujfgurhephffvufffkffojghfggfgsedtkeertdertddtnecuhfhrohhmpefoihgthhgrvghlucfpihgvuggvrhhmrgihvghruceomhhitghhrggvlhesnhhivgguvghrmhgrhigvrhdrtggtqeenucggtffrrghtthgvrhhnpedvgfefudeijeetieejkefgfffhtdeludeuffdvfeelieevjeetvedufeetfeejfeenucfkphepgedurdeiiedrieejrdduudefnecuvehluhhsthgvrhfuihiivgeptdenucfrrghrrghmpehinhgvthepgedurdeiiedrieejrdduudefpdhhvghloheplhhotggrlhhhohhsthdpmhgrihhlfhhrohhmpehmihgthhgrvghlsehnihgvuggvrhhmrgihvghrrdgttgdpnhgspghrtghpthhtohepuddprhgtphhtthhopehffhhmphgvghdquggvvhgvlhesfhhfmhhpvghgrdhorhhg X-GND-Sasl: michael@niedermayer.cc Subject: [FFmpeg-devel] [PATCH 2/2] avcodec/ffv1enc: Eliminate RemapEncoderState X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: FFmpeg development discussions and patches <ffmpeg-devel.ffmpeg.org> List-Unsubscribe: <https://ffmpeg.org/mailman/options/ffmpeg-devel>, <mailto:ffmpeg-devel-request@ffmpeg.org?subject=unsubscribe> List-Archive: <https://ffmpeg.org/pipermail/ffmpeg-devel> List-Post: <mailto:ffmpeg-devel@ffmpeg.org> List-Help: <mailto:ffmpeg-devel-request@ffmpeg.org?subject=help> List-Subscribe: <https://ffmpeg.org/mailman/listinfo/ffmpeg-devel>, <mailto:ffmpeg-devel-request@ffmpeg.org?subject=subscribe> Reply-To: FFmpeg development discussions and patches <ffmpeg-devel@ffmpeg.org> Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" <ffmpeg-devel-bounces@ffmpeg.org> Archived-At: <https://master.gitmailbox.com/ffmpegdev/20250328084542.263642-2-michael@niedermayer.cc/> List-Archive: <https://master.gitmailbox.com/ffmpegdev/> List-Post: <mailto:ffmpegdev@gitmailbox.com> Signed-off-by: Michael Niedermayer <michael@niedermayer.cc> --- libavcodec/ffv1enc.c | 151 +++++++++++++++++++------------------------ 1 file changed, 67 insertions(+), 84 deletions(-) diff --git a/libavcodec/ffv1enc.c b/libavcodec/ffv1enc.c index e7372e572b9..b156ff2dc10 100644 --- a/libavcodec/ffv1enc.c +++ b/libavcodec/ffv1enc.c @@ -1252,64 +1252,47 @@ static void load_rgb_float32_frame(FFV1Context *f, FFV1SliceContext *sc, AV_QSORT(sc->unit[3], i, struct Unit, CMP); } -typedef struct RemapEncoderState { +static int encode_float32_remap_segment(FFV1SliceContext *sc, + int p, int mul_count, int *mul_tab, int update, int final) +{ + const int pixel_num = sc->slice_width * sc->slice_height; uint8_t state[2][3][32]; int mul[4096+1]; - RangeCoder rc; - int lu; - int run; - int64_t last_val; - int compact_index; - int mul_count; - int i; - int pixel_num; - int p; - int current_mul_index; - int run1final; + RangeCoder rc = sc->c; + int lu = 0; + int run = 0; + int64_t last_val = -1; + int compact_index = -1; + int i = 0; + int current_mul_index = -1; + int run1final = 0; int64_t run1start_i; int64_t run1start_last_val; int run1start_mul_index; -} RemapEncoderState; -static int encode_float32_remap_segment(FFV1SliceContext *sc, - int p, int mul_count, int *mul_tab, int update, int final) -{ - RemapEncoderState s; - - s.pixel_num = sc->slice_width * sc->slice_height; - s.p = p; - s.i = 0; - s.rc = sc->c; - s.mul_count = mul_count; - memcpy(s.mul, mul_tab, sizeof(*mul_tab)*(mul_count+1)); - memset(s.state, 128, sizeof(s.state)); - put_symbol(&s.rc, s.state[0][0], s.mul_count, 0); - memset(s.state, 128, sizeof(s.state)); - s.last_val = -1; - s.compact_index = -1; - s.lu = 0; - s.run = 0; - s.current_mul_index = -1; - s.run1final = 0; - - for (; s.i < s.pixel_num+1; s.i++) { - int current_mul = s.current_mul_index < 0 ? 1 : FFABS(s.mul[s.current_mul_index]); + memcpy(mul, mul_tab, sizeof(*mul_tab)*(mul_count+1)); + memset(state, 128, sizeof(state)); + put_symbol(&rc, state[0][0], mul_count, 0); + memset(state, 128, sizeof(state)); + + for (; i < pixel_num+1; i++) { + int current_mul = current_mul_index < 0 ? 1 : FFABS(mul[current_mul_index]); int64_t val; - if (s.i == s.pixel_num) { - if (s.last_val == 0xFFFFFFFF) { + if (i == pixel_num) { + if (last_val == 0xFFFFFFFF) { break; } else { - val = s.last_val + ((1LL<<32) - s.last_val + current_mul - 1) / current_mul * current_mul; + val = last_val + ((1LL<<32) - last_val + current_mul - 1) / current_mul * current_mul; av_assert2(val >= (1LL<<32)); - val += s.lu * current_mul; //ensure a run1 ends + val += lu * current_mul; //ensure a run1 ends } } else - val = sc->unit[s.p][s.i].val; + val = sc->unit[p][i].val; - if (s.last_val != val) { - int64_t delta = val - s.last_val; + if (last_val != val) { + int64_t delta = val - last_val; int64_t step = FFMAX(1, (delta + current_mul/2) / current_mul); - av_assert2(s.last_val < val); + av_assert2(last_val < val); av_assert2(current_mul > 0); delta -= step*current_mul; @@ -1317,69 +1300,69 @@ static int encode_float32_remap_segment(FFV1SliceContext *sc, av_assert2(delta > -current_mul); av_assert2(step > 0); - if (s.lu) { - if (!s.run) { - s.run1start_i = s.i - 1; - s.run1start_last_val = s.last_val; - s.run1start_mul_index= s.current_mul_index; + if (lu) { + if (!run) { + run1start_i = i - 1; + run1start_last_val = last_val; + run1start_mul_index= current_mul_index; } if (step == 1) { - if (s.run1final) { + if (run1final) { if (current_mul>1) - put_symbol_inline(&s.rc, s.state[s.lu][1], delta, 1, NULL, NULL); + put_symbol_inline(&rc, state[lu][1], delta, 1, NULL, NULL); } - s.run ++; - av_assert2(s.last_val + current_mul + delta == val); + run ++; + av_assert2(last_val + current_mul + delta == val); } else { - if (s.run1final) { - if (s.run == 0) - s.lu ^= 1; - s.i--; // we did not encode val so we need to backstep - s.last_val += current_mul; + if (run1final) { + if (run == 0) + lu ^= 1; + i--; // we did not encode val so we need to backstep + last_val += current_mul; } else { - put_symbol_inline(&s.rc, s.state[s.lu][0], s.run, 0, NULL, NULL); - s.i = s.run1start_i; - s.last_val = s.run1start_last_val; // we could compute this instead of storing - s.current_mul_index = s.run1start_mul_index; + put_symbol_inline(&rc, state[lu][0], run, 0, NULL, NULL); + i = run1start_i; + last_val = run1start_last_val; // we could compute this instead of storing + current_mul_index = run1start_mul_index; } - s.run1final ^= 1; + run1final ^= 1; - s.run = 0; + run = 0; continue; } } else { - av_assert2(s.run == 0); - av_assert2(s.run1final == 0); - put_symbol_inline(&s.rc, s.state[s.lu][0], step - 1, 0, NULL, NULL); + av_assert2(run == 0); + av_assert2(run1final == 0); + put_symbol_inline(&rc, state[lu][0], step - 1, 0, NULL, NULL); if (current_mul > 1) - put_symbol_inline(&s.rc, s.state[s.lu][1], delta, 1, NULL, NULL); + put_symbol_inline(&rc, state[lu][1], delta, 1, NULL, NULL); if (step == 1) - s.lu ^= 1; + lu ^= 1; - av_assert2(s.last_val + step * current_mul + delta == val); + av_assert2(last_val + step * current_mul + delta == val); } - s.last_val = val; - s.current_mul_index = ((s.last_val + 1) * s.mul_count) >> 32; - if (!s.run || s.run1final) { - av_assert2(s.mul[ s.current_mul_index ]); - if (s.mul[ s.current_mul_index ] < 0) { - av_assert2(s.i < s.pixel_num); - s.mul[ s.current_mul_index ] *= -1; - put_symbol_inline(&s.rc, s.state[0][2], s.mul[ s.current_mul_index ], 0, NULL, NULL); + last_val = val; + current_mul_index = ((last_val + 1) * mul_count) >> 32; + if (!run || run1final) { + av_assert2(mul[ current_mul_index ]); + if (mul[ current_mul_index ] < 0) { + av_assert2(i < pixel_num); + mul[ current_mul_index ] *= -1; + put_symbol_inline(&rc, state[0][2], mul[ current_mul_index ], 0, NULL, NULL); } - s.compact_index ++; + compact_index ++; } } - if (!s.run || s.run1final) - if (final && s.i < s.pixel_num) - sc->bitmap[s.p][sc->unit[s.p][s.i].ndx] = s.compact_index; + if (!run || run1final) + if (final && i < pixel_num) + sc->bitmap[p][sc->unit[p][i].ndx] = compact_index; } if (update) { - sc->c = s.rc; + sc->c = rc; } - return get_rac_count(&s.rc); + return get_rac_count(&rc); } static void encode_float32_remap(FFV1Context *f, FFV1SliceContext *sc, -- 2.48.1 _______________________________________________ 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".