mirror of
https://github.com/moonlight-stream/moonlight-embedded.git
synced 2025-07-03 00:06:06 +00:00
Set HDR metadata using legacy DRM API
This commit is contained in:
parent
a585072ff8
commit
0d0728f3c4
@ -112,6 +112,8 @@ drmModeRes *resources = NULL;
|
|||||||
drmModePlaneRes *plane_resources = NULL;
|
drmModePlaneRes *plane_resources = NULL;
|
||||||
drmModeCrtcPtr crtc = {0};
|
drmModeCrtcPtr crtc = {0};
|
||||||
|
|
||||||
|
drmModePropertyPtr hdr_metadata_prop = NULL;
|
||||||
|
|
||||||
drmModeAtomicReqPtr drm_request = NULL;
|
drmModeAtomicReqPtr drm_request = NULL;
|
||||||
drmModePropertyPtr plane_props[32];
|
drmModePropertyPtr plane_props[32];
|
||||||
drmModePropertyPtr conn_props[32];
|
drmModePropertyPtr conn_props[32];
|
||||||
@ -159,6 +161,8 @@ void *display_thread(void *param) {
|
|||||||
_fb_id = fb_id;
|
_fb_id = fb_id;
|
||||||
|
|
||||||
fb_id = 0;
|
fb_id = 0;
|
||||||
|
ret = pthread_mutex_unlock(&mutex);
|
||||||
|
assert(!ret);
|
||||||
|
|
||||||
uint32_t v4l2_colorspace;
|
uint32_t v4l2_colorspace;
|
||||||
switch (last_colorspace) {
|
switch (last_colorspace) {
|
||||||
@ -178,21 +182,9 @@ void *display_thread(void *param) {
|
|||||||
set_atomic_property(drm_request, plane_id, plane_props, "COLOR_SPACE", v4l2_colorspace);
|
set_atomic_property(drm_request, plane_id, plane_props, "COLOR_SPACE", v4l2_colorspace);
|
||||||
set_atomic_property(drm_request, plane_id, plane_props, "EOTF", last_hdr_state ? 2 : 0); // PQ or SDR
|
set_atomic_property(drm_request, plane_id, plane_props, "EOTF", last_hdr_state ? 2 : 0); // PQ or SDR
|
||||||
set_atomic_property(drm_request, plane_id, plane_props, "FB_ID", _fb_id);
|
set_atomic_property(drm_request, plane_id, plane_props, "FB_ID", _fb_id);
|
||||||
set_atomic_property(drm_request, conn_id, conn_props, "HDR_OUTPUT_METADATA", hdr_metadata_blob_id);
|
|
||||||
|
|
||||||
ret = pthread_mutex_unlock(&mutex);
|
ret = drmModeAtomicCommit(fd, drm_request, DRM_MODE_ATOMIC_NONBLOCK, NULL);
|
||||||
assert(!ret);
|
assert(!ret || errno == EBUSY);
|
||||||
|
|
||||||
// Commit the updates to the display hardware
|
|
||||||
//
|
|
||||||
// Note: DRM_MODE_ATOMIC_ALLOW_MODESET is used because a modeset may be required to switch
|
|
||||||
// between HDR and SDR mode.
|
|
||||||
ret = drmModeAtomicCommit(fd, drm_request, DRM_MODE_ATOMIC_NONBLOCK | DRM_MODE_ATOMIC_ALLOW_MODESET, NULL);
|
|
||||||
if (ret && errno != EBUSY) {
|
|
||||||
// We can sometimes hit this path for EINVAL when going from HDR->SDR but it
|
|
||||||
// seems transient, so don't assert if it occurs.
|
|
||||||
fprintf(stderr, "Commit failed: %d\n", errno);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -398,6 +390,9 @@ int rk_setup(int videoFormat, int width, int height, int redrawRate, void* conte
|
|||||||
if (!prop) {
|
if (!prop) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
if (!strcmp(prop->name, "HDR_OUTPUT_METADATA")) {
|
||||||
|
hdr_metadata_prop = prop;
|
||||||
|
}
|
||||||
conn_props[j] = prop;
|
conn_props[j] = prop;
|
||||||
}
|
}
|
||||||
drmModeFreeObjectProperties(props);
|
drmModeFreeObjectProperties(props);
|
||||||
@ -620,9 +615,10 @@ int rk_submit_decode_unit(PDECODE_UNIT decodeUnit) {
|
|||||||
mpp_packet_set_pos(mpi_packet, pkt_buf);
|
mpp_packet_set_pos(mpi_packet, pkt_buf);
|
||||||
mpp_packet_set_length(mpi_packet, length);
|
mpp_packet_set_length(mpi_packet, length);
|
||||||
|
|
||||||
pthread_mutex_lock(&mutex);
|
|
||||||
|
|
||||||
if (last_hdr_state != decodeUnit->hdrActive) {
|
if (last_hdr_state != decodeUnit->hdrActive) {
|
||||||
|
if (hdr_metadata_prop != NULL) {
|
||||||
|
int err;
|
||||||
|
|
||||||
if (hdr_metadata_blob_id) {
|
if (hdr_metadata_blob_id) {
|
||||||
drmModeDestroyPropertyBlob(fd, hdr_metadata_blob_id);
|
drmModeDestroyPropertyBlob(fd, hdr_metadata_blob_id);
|
||||||
hdr_metadata_blob_id = 0;
|
hdr_metadata_blob_id = 0;
|
||||||
@ -631,7 +627,6 @@ int rk_submit_decode_unit(PDECODE_UNIT decodeUnit) {
|
|||||||
if (decodeUnit->hdrActive) {
|
if (decodeUnit->hdrActive) {
|
||||||
struct rk_hdr_output_metadata outputMetadata;
|
struct rk_hdr_output_metadata outputMetadata;
|
||||||
SS_HDR_METADATA sunshineHdrMetadata;
|
SS_HDR_METADATA sunshineHdrMetadata;
|
||||||
int err;
|
|
||||||
|
|
||||||
// Sunshine will have HDR metadata but GFE will not
|
// Sunshine will have HDR metadata but GFE will not
|
||||||
if (!LiGetHdrMetadata(&sunshineHdrMetadata)) {
|
if (!LiGetHdrMetadata(&sunshineHdrMetadata)) {
|
||||||
@ -658,13 +653,21 @@ int rk_submit_decode_unit(PDECODE_UNIT decodeUnit) {
|
|||||||
fprintf(stderr, "Failed to create HDR metadata blob: %d\n", errno);
|
fprintf(stderr, "Failed to create HDR metadata blob: %d\n", errno);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
err = drmModeObjectSetProperty(fd, conn_id, DRM_MODE_OBJECT_CONNECTOR, hdr_metadata_prop->prop_id, hdr_metadata_blob_id);
|
||||||
|
if (err < 0) {
|
||||||
|
fprintf(stderr, "Failed to set HDR metadata: %d\n", errno);
|
||||||
|
} else {
|
||||||
|
printf("Set display HDR mode: %s\n", decodeUnit->hdrActive ? "active" : "inactive");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
fprintf(stderr, "HDR_OUTPUT_METADATA property is not supported by your display/kernel. Do you have an HDR display connected?\n");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
last_colorspace = decodeUnit->colorspace;
|
last_colorspace = decodeUnit->colorspace;
|
||||||
last_hdr_state = decodeUnit->hdrActive;
|
last_hdr_state = decodeUnit->hdrActive;
|
||||||
|
|
||||||
pthread_mutex_unlock(&mutex);
|
|
||||||
|
|
||||||
while (MPP_OK != mpi_api->decode_put_packet(mpi_ctx, mpi_packet));
|
while (MPP_OK != mpi_api->decode_put_packet(mpi_ctx, mpi_packet));
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user