kmssink: add hdr metadata reset when exit playback
upstream status: imx specific
diff --git a/sys/kms/gstkmssink.c b/sys/kms/gstkmssink.c
index 7f0d2cc..3c66826 100644
--- a/sys/kms/gstkmssink.c
+++ b/sys/kms/gstkmssink.c
@@ -1597,6 +1597,16 @@
if (self->hold_buf[i])
gst_buffer_unref (self->hold_buf[i]);
}
+ if (self->hdr10meta.eotf != 0) {
+ guint blob_id = 0;
+ gint err = 0;
+ self->hdr10meta.eotf = 0;
+ drmModeCreatePropertyBlob (self->fd, &self->hdr10meta, 1, &blob_id);
+ err = drmModeObjectSetProperty (self->ctrl_fd, self->conn_id, DRM_MODE_OBJECT_CONNECTOR, self->hdr_prop_id, blob_id);
+ drmModeDestroyPropertyBlob (self->fd, blob_id);
+ if (err)
+ GST_ERROR_OBJECT (self, "reset blob property fail %d", err);
+ }
break;
}
@@ -1714,7 +1724,7 @@
void
gst_kms_sink_config_hdr10 (GstKMSSink *self, GstBuffer * buf)
{
- guint blob_id = 0, prop_id = 0;
+ guint blob_id = 0;
int err;
gint i;
drmModeObjectPropertiesPtr props = NULL;
@@ -1761,30 +1771,32 @@
self->hdr10meta.min_mastering_display_luminance = meta->hdr10meta.minMasteringLuminance & 0xffff;
self->hdr10meta.max_fall = meta->hdr10meta.maxFrameAverageLightLevel;
self->hdr10meta.max_cll = meta->hdr10meta.maxContentLightLevel;
-
- props = drmModeObjectGetProperties (self->fd, self->conn_id, DRM_MODE_OBJECT_CONNECTOR);
- for (i = 0; i < props->count_props; ++i) {
- prop = drmModeGetProperty(self->fd, props->props[i]);
- if (!strcmp(prop->name, "HDR_SOURCE_METADATA")) {
- GST_DEBUG_OBJECT (self, "found HDR_SOURCE_METADATA property on connector %d property id %d",
- self->conn_id, prop->prop_id);
- prop_id = prop->prop_id;
+
+ if (!self->hdr_prop_id) {
+ props = drmModeObjectGetProperties (self->fd, self->conn_id, DRM_MODE_OBJECT_CONNECTOR);
+ for (i = 0; i < props->count_props; ++i) {
+ prop = drmModeGetProperty(self->fd, props->props[i]);
+ if (!strcmp(prop->name, "HDR_SOURCE_METADATA")) {
+ GST_DEBUG_OBJECT (self, "found HDR_SOURCE_METADATA property on connector %d property id %d",
+ self->conn_id, prop->prop_id);
+ self->hdr_prop_id = prop->prop_id;
+ }
+ drmModeFreeProperty (prop);
+ prop = NULL;
}
- drmModeFreeProperty (prop);
- prop = NULL;
}
- if (prop_id == 0) {
+ if (self->hdr_prop_id == 0) {
GST_WARNING_OBJECT (self, "no HDR_SOURCE_METADATA property found");
return;
}
drmModeCreatePropertyBlob (self->fd, &self->hdr10meta, sizeof (self->hdr10meta), &blob_id);
GST_INFO_OBJECT (self, "create blob id %d", blob_id);
- err = drmModeObjectSetProperty (self->ctrl_fd, self->conn_id, DRM_MODE_OBJECT_CONNECTOR, prop_id, blob_id);
+ err = drmModeObjectSetProperty (self->ctrl_fd, self->conn_id, DRM_MODE_OBJECT_CONNECTOR, self->hdr_prop_id, blob_id);
drmModeDestroyPropertyBlob (self->fd, blob_id);
if (err) {
- GST_ERROR_OBJECT (self, "set blob property fail");
+ GST_ERROR_OBJECT (self, "set blob property fail %d", err);
return;
}
}
@@ -2188,6 +2200,7 @@
sink->conn_id = -1;
sink->plane_id = -1;
sink->primary_plane_id = -1;
+ sink->hdr_prop_id = 0;
sink->can_scale = TRUE;
sink->scale_checked = FALSE;
sink->upscale_ratio = 1;
diff --git a/sys/kms/gstkmssink.h b/sys/kms/gstkmssink.h
index 28ad9cd..50a7676 100644
--- a/sys/kms/gstkmssink.h
+++ b/sys/kms/gstkmssink.h
@@ -87,6 +87,7 @@
/* hdr10 support */
struct hdr_static_metadata hdr10meta;
+ gint hdr_prop_id;
GstVideoInfo vinfo;
GstCaps *allowed_caps;