From 4f64ff8b2f5b2c07249659214316afe4e5dfaa17 Mon Sep 17 00:00:00 2001 From: Ankit Nautiyal Date: Wed, 3 Apr 2019 18:44:35 +0530 Subject: [PATCH] libweston: Compute current protection for weston_output and weston_head The actual protection status for a given weston_head depends upon the corresponding drm_head's connector HDCP properties. On the other hand, the actual protection for a weston_output is the minimum of the protection status of its attached heads. As a head's protection changes, the current protection of the output to which the head is attached is recomputed. This patch adds the support to keep track of the current content-protection for heads and the outputs. Signed-off-by: Ankit Nautiyal --- include/libweston/libweston.h | 8 ++++++++ libweston/compositor.c | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/include/libweston/libweston.h b/include/libweston/libweston.h index d07d56f8..b49e453b 100644 --- a/include/libweston/libweston.h +++ b/include/libweston/libweston.h @@ -215,6 +215,9 @@ struct weston_head { char *name; /**< head name, e.g. connector name */ bool connected; /**< is physically connected */ bool non_desktop; /**< non-desktop display, e.g. HMD */ + + /** Current content protection status */ + enum weston_hdcp_protection current_protection; }; /** Represents an output @@ -292,6 +295,7 @@ struct weston_output { struct wl_list head_list; /**< List of driven weston_heads */ enum weston_hdcp_protection desired_protection; + enum weston_hdcp_protection current_protection; void (*start_repaint_loop)(struct weston_output *output); int (*repaint)(struct weston_output *output, @@ -2355,6 +2359,10 @@ struct wl_listener * weston_head_get_destroy_listener(struct weston_head *head, wl_notify_func_t notify); +void +weston_head_set_content_protection_status(struct weston_head *head, + enum weston_hdcp_protection status); + struct weston_head * weston_compositor_iterate_heads(struct weston_compositor *compositor, struct weston_head *iter); diff --git a/libweston/compositor.c b/libweston/compositor.c index 12b9016b..ddce8f0f 100644 --- a/libweston/compositor.c +++ b/libweston/compositor.c @@ -4769,6 +4769,7 @@ weston_head_init(struct weston_head *head, const char *name) wl_list_init(&head->resource_list); wl_list_init(&head->xdg_output_resource_list); head->name = strdup(name); + head->current_protection = WESTON_HDCP_DISABLE; } /** Send output heads changed signal @@ -5271,6 +5272,38 @@ weston_head_set_connection_status(struct weston_head *head, bool connected) weston_head_set_device_changed(head); } +static void +weston_output_compute_protection(struct weston_output *output) +{ + struct weston_head *head; + enum weston_hdcp_protection op_protection; + bool op_protection_valid = false; + + wl_list_for_each(head, &output->head_list, output_link) { + if (!op_protection_valid) { + op_protection = head->current_protection; + op_protection_valid = true; + } + if (head->current_protection < op_protection) + op_protection = head->current_protection; + } + + if (!op_protection_valid) + op_protection = WESTON_HDCP_DISABLE; + + if (output->current_protection != op_protection) + output->current_protection = op_protection; +} + +WL_EXPORT void +weston_head_set_content_protection_status(struct weston_head *head, + enum weston_hdcp_protection status) +{ + head->current_protection = status; + if (head->output) + weston_output_compute_protection(head->output); +} + /** Is the head currently connected? * * \param head The head to query.