MMFMWK-7895 [MX8MQ] Enable Hantro video tiled and compression format.
kmssink support Hantro tiled and compressed video.
Signed-off-by: Song Bing <bing.song@nxp.com>
diff --git a/sys/kms/gstkmssink.c b/sys/kms/gstkmssink.c
index e0924a8..19d2614 100644
--- a/sys/kms/gstkmssink.c
+++ b/sys/kms/gstkmssink.c
@@ -46,6 +46,7 @@
#include <gst/video/videooverlay.h>
#include <gst/allocators/gstdmabuf.h>
#include <gst/allocators/gstdmabufmeta.h>
+#include <gst/allocators/gstphymemmeta.h>
#include <drm.h>
#include <xf86drm.h>
@@ -1165,6 +1166,9 @@
GstVideoInfo vinfo;
GstBufferPool *pool;
guint64 drm_modifier;
+ drmModeObjectPropertiesPtr props = NULL;
+ drmModePropertyPtr prop = NULL;
+ guint i;
gsize size;
self = GST_KMS_SINK (bsink);
@@ -1203,6 +1207,22 @@
drm_modifier = DRM_FORMAT_MOD_AMPHION_TILED;
gst_query_add_allocation_dmabuf_meta (query, drm_modifier);
+ props = drmModeObjectGetProperties (self->fd, self->plane_id, DRM_MODE_OBJECT_PLANE);
+ for (i = 0; i < props->count_props; ++i) {
+ prop = drmModeGetProperty(self->fd, props->props[i]);
+ if (!strcmp(prop->name, "dtrc_table_ofs")) {
+ GST_DEBUG ("has dtrc_table_ofs property, can support VSI tile format");
+ drm_modifier = DRM_FORMAT_MOD_VSI_G1_TILED;
+ gst_query_add_allocation_dmabuf_meta (query, drm_modifier);
+ drm_modifier = DRM_FORMAT_MOD_VSI_G2_TILED;
+ gst_query_add_allocation_dmabuf_meta (query, drm_modifier);
+ drm_modifier = DRM_FORMAT_MOD_VSI_G2_TILED_COMPRESSED;
+ gst_query_add_allocation_dmabuf_meta (query, drm_modifier);
+ }
+ drmModeFreeProperty (prop);
+ prop = NULL;
+ }
+
return TRUE;
/* ERRORS */
@@ -1400,7 +1420,7 @@
}
static void
-gst_kms_sink_set_primary_alpha (GstKMSSink * self, guint alpha)
+gst_kms_sink_set_kmsproperty (GstKMSSink * self, guint alpha, guint64 dtrc_table_ofs)
{
drmModeRes *res = NULL;
drmModePlaneRes *pres = NULL;
@@ -1409,6 +1429,18 @@
drmModePropertyPtr prop = NULL;
guint i;
+ props = drmModeObjectGetProperties (self->fd, self->plane_id, DRM_MODE_OBJECT_PLANE);
+ for (i = 0; i < props->count_props; ++i) {
+ prop = drmModeGetProperty(self->fd, props->props[i]);
+ if (!strcmp(prop->name, "dtrc_table_ofs") && dtrc_table_ofs) {
+ GST_DEBUG ("set DTRC table offset %lld to primary plane %d property %d",
+ dtrc_table_ofs, self->plane_id, prop->prop_id);
+ drmModeObjectSetProperty (self->ctrl_fd, self->plane_id, DRM_MODE_OBJECT_PLANE, prop->prop_id, dtrc_table_ofs);
+ }
+ drmModeFreeProperty (prop);
+ prop = NULL;
+ }
+
res = drmModeGetResources (self->fd);
if (!res)
goto out;
@@ -1425,20 +1457,16 @@
props = drmModeObjectGetProperties (self->fd, plane->plane_id, DRM_MODE_OBJECT_PLANE);
for (i = 0; i < props->count_props; ++i) {
- prop = drmModeGetProperty(self->fd, props->props[i]);
- if (!strcmp(prop->name, "alpha"))
- break;
+ prop = drmModeGetProperty(self->fd, props->props[i]);
+ if (!strcmp(prop->name, "alpha")) {
+ GST_DEBUG ("set global alpha %d to primary plane %d property %d",
+ alpha, plane->plane_id, prop->prop_id);
+ drmModeObjectSetProperty (self->ctrl_fd, plane->plane_id, DRM_MODE_OBJECT_PLANE, prop->prop_id, alpha);
+ }
drmModeFreeProperty (prop);
prop = NULL;
}
- if (prop) {
- GST_DEBUG ("set global alpha %d to primary plane %d property %d",
- alpha, plane->plane_id, prop->prop_id);
- drmModeObjectSetProperty (self->ctrl_fd, plane->plane_id, DRM_MODE_OBJECT_PLANE, prop->prop_id, alpha);
- drmModeFreeProperty (prop);
- }
-
out:
if (res)
drmModeFreeResources (res);
@@ -1465,7 +1493,7 @@
switch (transition) {
case GST_STATE_CHANGE_NULL_TO_READY:
- self->is_alpha_set = FALSE;
+ self->is_kmsproperty_set = FALSE;
break;
case GST_STATE_CHANGE_READY_TO_PAUSED:
{
@@ -1493,7 +1521,7 @@
case GST_STATE_CHANGE_PAUSED_TO_READY:
{
guint i;
- gst_kms_sink_set_primary_alpha (self, 255);
+ gst_kms_sink_set_kmsproperty (self, 255, 0);
for (i = 0; i < DEFAULT_HOLD_BUFFER_NUM; i++) {
if (self->hold_buf[i])
gst_buffer_unref (self->hold_buf[i]);
@@ -1651,6 +1679,8 @@
GstVideoRectangle src = { 0, };
GstVideoRectangle dst = { 0, };
GstVideoRectangle result;
+ GstPhyMemMeta *phymemmeta = NULL;
+ guint64 dtrc_table_ofs;
GstFlowReturn res;
dump_hdr10meta (GST_KMS_SINK (vsink), buf);
@@ -1682,9 +1712,18 @@
GST_TRACE_OBJECT (self, "displaying fb %d", fb_id);
- if (!self->is_alpha_set) {
- gst_kms_sink_set_primary_alpha (self, self->global_alpha);
- self->is_alpha_set = TRUE;
+ if (!self->is_kmsproperty_set) {
+ phymemmeta = GST_PHY_MEM_META_GET (buffer);
+ if (phymemmeta) {
+ GST_DEBUG_OBJECT (self, "physical memory meta x_padding: %d y_padding: %d \
+ RFC luma offset: %d chroma offset: %d",
+ phymemmeta->x_padding, phymemmeta->y_padding, phymemmeta->rfc_luma_offset, phymemmeta->rfc_chroma_offset);
+ dtrc_table_ofs = phymemmeta->rfc_luma_offset | ((guint64)phymemmeta->rfc_chroma_offset << 32);
+ gst_kms_sink_set_kmsproperty (self, self->global_alpha, dtrc_table_ofs);
+ } else
+ gst_kms_sink_set_kmsproperty (self, self->global_alpha, 0);
+
+ self->is_kmsproperty_set = TRUE;
}
GST_OBJECT_LOCK (self);
diff --git a/sys/kms/gstkmssink.h b/sys/kms/gstkmssink.h
index bfc1667..0c30eeb 100644
--- a/sys/kms/gstkmssink.h
+++ b/sys/kms/gstkmssink.h
@@ -73,7 +73,7 @@
gboolean scale_checked;
/* global alpha */
- gboolean is_alpha_set;
+ gboolean is_kmsproperty_set;
guint global_alpha;
gboolean modesetting_enabled;