summaryrefslogtreecommitdiffstats
path: root/libass
diff options
context:
space:
mode:
authorDr.Smile <vabnick@gmail.com>2021-12-05 09:37:24 +0300
committerDr.Smile <vabnick@gmail.com>2022-12-04 02:17:38 +0300
commitd3563e80a88c83d9253ea044dd2676d0914e4822 (patch)
treee604890c4b33fb5ef63553d8724c8a8597a52a9e /libass
parentfceed8c028e0afc8e6860ad21d6d463f6a080043 (diff)
downloadlibass-d3563e80a88c83d9253ea044dd2676d0914e4822.tar.bz2
libass-d3563e80a88c83d9253ea044dd2676d0914e4822.tar.xz
be_blur: reorganize code
Diffstat (limited to 'libass')
-rw-r--r--libass/ass_bitmap_engine.h4
-rw-r--r--libass/c/c_be_blur.c76
-rw-r--r--libass/x86/be_blur.asm4
3 files changed, 33 insertions, 51 deletions
diff --git a/libass/ass_bitmap_engine.h b/libass/ass_bitmap_engine.h
index 3682984..3fbf6f2 100644
--- a/libass/ass_bitmap_engine.h
+++ b/libass/ass_bitmap_engine.h
@@ -39,8 +39,8 @@ typedef void BitmapMulFunc(uint8_t *dst, ptrdiff_t dst_stride,
const uint8_t *src2, ptrdiff_t src2_stride,
size_t width, size_t height);
-typedef void BeBlurFunc(uint8_t *buf, intptr_t stride,
- intptr_t width, intptr_t height, uint16_t *tmp);
+typedef void BeBlurFunc(uint8_t *buf, ptrdiff_t stride,
+ size_t width, size_t height, uint16_t *tmp);
// intermediate bitmaps represented as sets of verical stripes of int16_t[alignment / 2]
typedef void Convert8to16Func(int16_t *dst, const uint8_t *src, ptrdiff_t src_stride,
diff --git a/libass/c/c_be_blur.c b/libass/c/c_be_blur.c
index b8e25c9..e2ee10f 100644
--- a/libass/c/c_be_blur.c
+++ b/libass/c/c_be_blur.c
@@ -23,69 +23,51 @@
#include <stdint.h>
+static inline uint16_t sliding_sum(uint16_t *prev, uint16_t next)
+{
+ uint16_t sum = *prev + next;
+ *prev = next;
+ return sum;
+}
+
/**
* \brief Blur with [[1,2,1], [2,4,2], [1,2,1]] kernel
* This blur is the same as the one employed by vsfilter.
* Pure C implementation.
*/
-void ass_be_blur_c(uint8_t *buf, intptr_t stride,
- intptr_t width, intptr_t height, uint16_t *tmp)
+void ass_be_blur_c(uint8_t *buf, ptrdiff_t stride,
+ size_t width, size_t height, uint16_t *tmp)
{
uint16_t *col_pix_buf = tmp;
- uint16_t *col_sum_buf = tmp + width;
- unsigned x, y, old_pix, old_sum, temp1, temp2;
- uint8_t *src, *dst;
- y = 0;
+ uint16_t *col_sum_buf = tmp + stride;
{
- src=buf+y*stride;
-
- x = 1;
- old_pix = src[x-1];
- old_sum = old_pix;
+ size_t x = 1;
+ uint16_t sum = buf[x - 1];
for ( ; x < width; x++) {
- temp1 = src[x];
- temp2 = old_pix + temp1;
- old_pix = temp1;
- temp1 = old_sum + temp2;
- old_sum = temp2;
- col_pix_buf[x-1] = temp1;
- col_sum_buf[x-1] = temp1;
+ uint16_t col_pix = sliding_sum(&sum, buf[x - 1] + buf[x]);
+ col_pix_buf[x - 1] = col_sum_buf[x - 1] = col_pix;
}
- temp1 = old_sum + old_pix;
- col_pix_buf[x-1] = temp1;
- col_sum_buf[x-1] = temp1;
+ uint16_t col_pix = sum + buf[x - 1];
+ col_pix_buf[x - 1] = col_sum_buf[x - 1] = col_pix;
}
- for (y++; y < height; y++) {
- src=buf+y*stride;
- dst=buf+(y-1)*stride;
+ for (size_t y = 1; y < height; y++) {
+ uint8_t *dst = buf;
+ buf += stride;
- x = 1;
- old_pix = src[x-1];
- old_sum = old_pix;
+ size_t x = 1;
+ uint16_t sum = buf[x - 1];
for ( ; x < width; x++) {
- temp1 = src[x];
- temp2 = old_pix + temp1;
- old_pix = temp1;
- temp1 = old_sum + temp2;
- old_sum = temp2;
-
- temp2 = col_pix_buf[x-1] + temp1;
- col_pix_buf[x-1] = temp1;
- dst[x-1] = (col_sum_buf[x-1] + temp2) >> 4;
- col_sum_buf[x-1] = temp2;
+ uint16_t col_pix = sliding_sum(&sum, buf[x - 1] + buf[x]);
+ uint16_t col_sum = sliding_sum(&col_pix_buf[x - 1], col_pix);
+ dst[x - 1] = sliding_sum(&col_sum_buf[x - 1], col_sum) >> 4;
}
- temp1 = old_sum + old_pix;
- temp2 = col_pix_buf[x-1] + temp1;
- col_pix_buf[x-1] = temp1;
- dst[x-1] = (col_sum_buf[x-1] + temp2) >> 4;
- col_sum_buf[x-1] = temp2;
+ uint16_t col_pix = sum + buf[x - 1];
+ uint16_t col_sum = sliding_sum(&col_pix_buf[x - 1], col_pix);
+ dst[x - 1] = sliding_sum(&col_sum_buf[x - 1], col_sum) >> 4;
}
- {
- dst=buf+(y-1)*stride;
- for (x = 0; x < width; x++)
- dst[x] = (col_sum_buf[x] + col_pix_buf[x]) >> 4;
- }
+ for (size_t x = 0; x < width; x++)
+ buf[x] = (col_sum_buf[x] + col_pix_buf[x]) >> 4;
}
diff --git a/libass/x86/be_blur.asm b/libass/x86/be_blur.asm
index 3f5bcb3..e461907 100644
--- a/libass/x86/be_blur.asm
+++ b/libass/x86/be_blur.asm
@@ -24,8 +24,8 @@ SECTION .text
;------------------------------------------------------------------------------
; BE_BLUR
-; void be_blur(uint8_t *buf, intptr_t stride,
-; intptr_t width, intptr_t height, uint16_t *tmp);
+; void be_blur(uint8_t *buf, ptrdiff_t stride,
+; size_t width, size_t height, uint16_t *tmp);
;------------------------------------------------------------------------------
%macro BE_BLUR 0