assrender: optimize blending

Skip empty source pixels when blending an image. There can be hundreds
of images to blend at each frame, so this brings a nice performance
boost.

https://bugzilla.gnome.org/show_bug.cgi?id=753821
This commit is contained in:
Arnaud Vrac 2015-06-25 19:17:36 +02:00 committed by Sebastian Dröge
parent ecdc7bb37d
commit 3b1e095169

View file

@ -724,23 +724,28 @@ blit_bgra_premultiplied (GstAssRender * render, ASS_Image * ass_image,
dst_x = ass_image->dst_x + x_off; dst_x = ass_image->dst_x + x_off;
dst_y = ass_image->dst_y + y_off; dst_y = ass_image->dst_y + y_off;
if (dst_y >= height || dst_x >= width) w = MIN (ass_image->w, width - dst_x);
h = MIN (ass_image->h, height - dst_y);
if (w <= 0 || h <= 0)
goto next; goto next;
alpha = 255 - (ass_image->color & 0xff); alpha = 255 - (ass_image->color & 0xff);
if (!alpha)
goto next;
r = ((ass_image->color) >> 24) & 0xff; r = ((ass_image->color) >> 24) & 0xff;
g = ((ass_image->color) >> 16) & 0xff; g = ((ass_image->color) >> 16) & 0xff;
b = ((ass_image->color) >> 8) & 0xff; b = ((ass_image->color) >> 8) & 0xff;
src = ass_image->bitmap; src = ass_image->bitmap;
dst = data + dst_y * stride + dst_x * 4; dst = data + dst_y * stride + dst_x * 4;
w = MIN (ass_image->w, width - dst_x);
h = MIN (ass_image->h, height - dst_y);
src_skip = ass_image->stride - w; src_skip = ass_image->stride - w;
dst_skip = stride - w * 4; dst_skip = stride - w * 4;
for (y = 0; y < h; y++) { for (y = 0; y < h; y++) {
for (x = 0; x < w; x++) { for (x = 0; x < w; x++) {
if (src[0]) {
k = src[0] * alpha / 255; k = src[0] * alpha / 255;
if (dst[3] == 0) { if (dst[3] == 0) {
dst[3] = k; dst[3] = k;
@ -753,6 +758,7 @@ blit_bgra_premultiplied (GstAssRender * render, ASS_Image * ass_image,
dst[1] = (k * g + (255 - k) * dst[1]) / 255; dst[1] = (k * g + (255 - k) * dst[1]) / 255;
dst[0] = (k * b + (255 - k) * dst[0]) / 255; dst[0] = (k * b + (255 - k) * dst[0]) / 255;
} }
}
src++; src++;
dst += 4; dst += 4;
} }