libweston: introduce weston_eotf_mode
This is the switch to turn HDR mode on. The values in the enumeration come straight from CTA-861-G standard. Monitors advertise support for some of the HDR modes in their EDID, and I am not aware of any other way to detect if a HDR mode actually works or not. Different monitors may support different and multiple modes. Different modes may look different. Therefore the high-level choice of how to drive a HDR video sink is left for the Weston frontend to decide. All the details like what HDR metadata to use are left for the color manager. This commit adds the libweston API for backends to advertise support and for frontends to choose a mode. Backend and frontend implementations follow in other commits. The frontend API does not limit the EOTF mode to the supported ones to allow experimentation and overriding EDID. Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.com>
This commit is contained in:
committed by
Pekka Paalanen
parent
054aaa5a8b
commit
5f9b68d68f
@@ -207,6 +207,40 @@ struct weston_testsuite_data {
|
||||
void *test_private_data;
|
||||
};
|
||||
|
||||
/** EOTF mode for outputs and heads
|
||||
*
|
||||
* A list of EOTF modes for driving displays, defined by CTA-861-G for
|
||||
* Dynamic Range and Mastering InfoFrame.
|
||||
*
|
||||
* On heads, a bitmask of one or more entries shows which modes are claimed
|
||||
* supported.
|
||||
*
|
||||
* On outputs, the mode to be used for driving the video sink.
|
||||
*
|
||||
* For traditional non-HDR sRGB, use WESTON_EOTF_MODE_SDR.
|
||||
*/
|
||||
enum weston_eotf_mode {
|
||||
/** Invalid EOTF mode, or none supported. */
|
||||
WESTON_EOTF_MODE_NONE = 0,
|
||||
|
||||
/** Traditional gamma, SDR luminance range */
|
||||
WESTON_EOTF_MODE_SDR = 0x01,
|
||||
|
||||
/** Traditional gamma, HDR luminance range */
|
||||
WESTON_EOTF_MODE_TRADITIONAL_HDR = 0x02,
|
||||
|
||||
/** Preceptual quantizer, SMPTE ST 2084 */
|
||||
WESTON_EOTF_MODE_ST2084 = 0x04,
|
||||
|
||||
/** Hybrid log-gamma, ITU-R BT.2100 */
|
||||
WESTON_EOTF_MODE_HLG = 0x08,
|
||||
};
|
||||
|
||||
/** Bitmask of all defined EOTF modes */
|
||||
#define WESTON_EOTF_MODE_ALL_MASK \
|
||||
((uint32_t)(WESTON_EOTF_MODE_SDR | WESTON_EOTF_MODE_TRADITIONAL_HDR | \
|
||||
WESTON_EOTF_MODE_ST2084 | WESTON_EOTF_MODE_HLG))
|
||||
|
||||
/** Represents a head, usually a display connector
|
||||
*
|
||||
* \rst
|
||||
@@ -243,6 +277,7 @@ 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 */
|
||||
uint32_t supported_eotf_mask; /**< supported weston_eotf_mode bits */
|
||||
|
||||
/** Current content protection status */
|
||||
enum weston_hdcp_protection current_protection;
|
||||
@@ -361,6 +396,7 @@ struct weston_output {
|
||||
struct weston_color_transform *from_sRGB_to_blend;
|
||||
struct weston_color_transform *from_blend_to_output;
|
||||
bool from_blend_to_output_by_backend;
|
||||
enum weston_eotf_mode eotf_mode;
|
||||
|
||||
int (*enable)(struct weston_output *output);
|
||||
int (*disable)(struct weston_output *output);
|
||||
@@ -2107,6 +2143,13 @@ bool
|
||||
weston_output_set_color_profile(struct weston_output *output,
|
||||
struct weston_color_profile *cprof);
|
||||
|
||||
void
|
||||
weston_output_set_eotf_mode(struct weston_output *output,
|
||||
enum weston_eotf_mode eotf_mode);
|
||||
|
||||
enum weston_eotf_mode
|
||||
weston_output_get_eotf_mode(const struct weston_output *output);
|
||||
|
||||
void
|
||||
weston_output_init(struct weston_output *output,
|
||||
struct weston_compositor *compositor,
|
||||
@@ -2121,6 +2164,9 @@ weston_output_enable(struct weston_output *output);
|
||||
void
|
||||
weston_output_disable(struct weston_output *output);
|
||||
|
||||
uint32_t
|
||||
weston_output_get_supported_eotf_modes(struct weston_output *output);
|
||||
|
||||
void
|
||||
weston_compositor_flush_heads_changed(struct weston_compositor *compositor);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user