gl-renderer: Censor protected views when output is recorded
Contents on an ouput are captured when screenshooter/recorder/screen sharing is enabled. In such cases the protected content must be censored to ensure that it is not recorded along with unprotected content. This is a required only when the surface protection is in enforced mode. Signed-off-by: Harish Krupo <harishkrupo@gmail.com> Signed-off-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
This commit is contained in:
committed by
Ankit Nautiyal
parent
faa5ab4e7b
commit
57d7883dd5
@@ -940,6 +940,49 @@ ensure_surface_buffer_is_ready(struct gl_renderer *gr,
|
|||||||
return (wait_ret == EGL_TRUE && destroy_ret == EGL_TRUE) ? 0 : -1;
|
return (wait_ret == EGL_TRUE && destroy_ret == EGL_TRUE) ? 0 : -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Checks if a view needs to be censored on an output
|
||||||
|
* Checks for 2 types of censor requirements
|
||||||
|
* - recording_censor: Censor protected view when a
|
||||||
|
* protected view is captured.
|
||||||
|
* - unprotected_censor: Censor regions of protected views
|
||||||
|
* when displayed on an output which has lower protection capability.
|
||||||
|
* Returns the originally stored gl_shader if content censoring is required,
|
||||||
|
* NULL otherwise.
|
||||||
|
*/
|
||||||
|
static struct gl_shader *
|
||||||
|
setup_censor_overrides(struct weston_output *output,
|
||||||
|
struct weston_view *ev)
|
||||||
|
{
|
||||||
|
struct gl_shader *replaced_shader = NULL;
|
||||||
|
struct weston_compositor *ec = ev->surface->compositor;
|
||||||
|
struct gl_renderer *gr = get_renderer(ec);
|
||||||
|
struct gl_surface_state *gs = get_surface_state(ev->surface);
|
||||||
|
bool recording_censor =
|
||||||
|
(output->disable_planes > 0) &&
|
||||||
|
(ev->surface->desired_protection > WESTON_HDCP_DISABLE);
|
||||||
|
|
||||||
|
bool unprotected_censor =
|
||||||
|
(ev->surface->desired_protection > output->current_protection);
|
||||||
|
|
||||||
|
/* When not in enforced mode, the client is notified of the protection */
|
||||||
|
/* change, so content censoring is not required */
|
||||||
|
if (ev->surface->protection_mode !=
|
||||||
|
WESTON_SURFACE_PROTECTION_MODE_ENFORCED)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
if (recording_censor || unprotected_censor) {
|
||||||
|
replaced_shader = gs->shader;
|
||||||
|
gs->color[0] = 0.40;
|
||||||
|
gs->color[1] = 0.0;
|
||||||
|
gs->color[2] = 0.0;
|
||||||
|
gs->color[3] = 1.0;
|
||||||
|
gs->shader = &gr->solid_shader;
|
||||||
|
}
|
||||||
|
|
||||||
|
return replaced_shader;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
draw_view(struct weston_view *ev, struct weston_output *output,
|
draw_view(struct weston_view *ev, struct weston_output *output,
|
||||||
pixman_region32_t *damage) /* in global coordinates */
|
pixman_region32_t *damage) /* in global coordinates */
|
||||||
@@ -955,8 +998,7 @@ draw_view(struct weston_view *ev, struct weston_output *output,
|
|||||||
pixman_region32_t surface_blend;
|
pixman_region32_t surface_blend;
|
||||||
GLint filter;
|
GLint filter;
|
||||||
int i;
|
int i;
|
||||||
bool shader_replaced = false;
|
struct gl_shader *replaced_shader = NULL;
|
||||||
struct gl_shader *tmp_shader = NULL;
|
|
||||||
|
|
||||||
/* In case of a runtime switch of renderers, we may not have received
|
/* In case of a runtime switch of renderers, we may not have received
|
||||||
* an attach for this surface since the switch. In that case we don't
|
* an attach for this surface since the switch. In that case we don't
|
||||||
@@ -975,16 +1017,7 @@ draw_view(struct weston_view *ev, struct weston_output *output,
|
|||||||
if (ensure_surface_buffer_is_ready(gr, gs) < 0)
|
if (ensure_surface_buffer_is_ready(gr, gs) < 0)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
if (ev->surface->protection_mode == WESTON_SURFACE_PROTECTION_MODE_ENFORCED &&
|
replaced_shader = setup_censor_overrides(output, ev);
|
||||||
ev->surface->desired_protection > output->current_protection) {
|
|
||||||
tmp_shader = gs->shader;
|
|
||||||
shader_replaced = true;
|
|
||||||
gs->color[0] = 0.40;
|
|
||||||
gs->color[1] = 0.0;
|
|
||||||
gs->color[2] = 0.0;
|
|
||||||
gs->color[3] = 1.0;
|
|
||||||
gs->shader = &gr->solid_shader;
|
|
||||||
}
|
|
||||||
|
|
||||||
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
|
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
|
||||||
|
|
||||||
@@ -1060,8 +1093,8 @@ draw_view(struct weston_view *ev, struct weston_output *output,
|
|||||||
out:
|
out:
|
||||||
pixman_region32_fini(&repaint);
|
pixman_region32_fini(&repaint);
|
||||||
|
|
||||||
if (shader_replaced)
|
if (replaced_shader)
|
||||||
gs->shader = tmp_shader;
|
gs->shader = replaced_shader;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|||||||
Reference in New Issue
Block a user