11From 0c69254faaa380f14588e50651a82a9e67d5731b Mon Sep 17 00:00:00 2001
22From: =?UTF-8?q?Lo=C3=AFc=20Le=20Page?= <llepage@igalia.com>
3- Date: Mon, 14 Oct 2024 18:47:48 +0200
3+ Date: Thu, 9 Apr 2026 19:41:44 +0200
44Subject: [PATCH] cefsrc: unmultiply alpha
55
66---
77 gstcefsrc.cc | 19 +++++++++++++++++++
88 1 file changed, 19 insertions(+)
99
1010diff --git a/gstcefsrc.cc b/gstcefsrc.cc
11- index b06897e..2c4b1da 100644
11+ index eba5b28..6f93195 100644
1212--- a/gstcefsrc.cc
1313+++ b/gstcefsrc.cc
14- @@ -116 ,6 +116 ,25 @@ class RenderHandler : public CefRenderHandler
15- new_buffer = gst_buffer_new_allocate (NULL, element ->vinfo.width * element ->vinfo.height * 4, NULL);
14+ @@ -257 ,6 +257 ,25 @@ class RenderHandler : public CefRenderHandler
15+ new_buffer = gst_buffer_new_allocate (NULL, src ->vinfo.width * src ->vinfo.height * 4, NULL);
1616 gst_buffer_fill (new_buffer, 0, buffer, w * h * 4);
1717
1818+ // CEF output is alpha pre-multipled,
1919+ // we need to unmultiply it to be compatible with the compositor
2020+ GstMapInfo info = {};
2121+ if (gst_buffer_map (new_buffer, &info, GST_MAP_READWRITE)) {
2222+ guint8 *data = info.data;
23- + for (gint i = 0; i < element ->vinfo.width * element ->vinfo.height; ++i)
23+ + for (gint i = 0; i < src ->vinfo.width * src ->vinfo.height; ++i)
2424+ {
2525+ float alpha = data[3];
2626+ if (alpha != 0 && alpha != 255) {
@@ -34,9 +34,8 @@ index b06897e..2c4b1da 100644
3434+ gst_buffer_unmap (new_buffer, &info);
3535+ }
3636+
37- GST_OBJECT_LOCK (element );
38- gst_buffer_replace (&(element ->current_buffer), new_buffer);
37+ GST_OBJECT_LOCK (src );
38+ gst_buffer_replace (&(src ->current_buffer), new_buffer);
3939 gst_buffer_unref (new_buffer);
4040- -
41412.43.0
42-
0 commit comments