kmssink: add alignment for video src crop size for dpu

upstream status: i.Mx specific

Conflicts:
	sys/kms/gstkmssink.c
diff --git a/sys/kms/gstkmssink.c b/sys/kms/gstkmssink.c
index 3264201..231c9b2 100644
--- a/sys/kms/gstkmssink.c
+++ b/sys/kms/gstkmssink.c
@@ -1738,7 +1738,8 @@
   guint64 dtrc_table_ofs;
   GstFlowReturn res;
   gboolean can_scale = TRUE;
-
+  guint32 fmt, alignment;
+  
   dump_hdr10meta (GST_KMS_SINK (vsink), buf);
 
   self = GST_KMS_SINK (vsink);
@@ -1752,6 +1753,13 @@
     return GST_FLOW_OK;
   }
 
+  if (strcmp (get_imx_drm_device_name(), "DPU") == 0) {
+    fmt = gst_drm_format_from_video (GST_VIDEO_INFO_FORMAT (&self->vinfo));
+    alignment = gst_drm_alignment_from_drm_format (fmt);
+  } else {
+    alignment = 1;
+  }
+
   if (buf)
     buffer = gst_kms_sink_get_input_buffer (self, buf);
   else if (self->last_buffer)
@@ -1809,15 +1817,15 @@
 retry_set_plane:
   gst_video_sink_center_rect (src, dst, &result, can_scale);
 
-  result.x += self->render_rect.x;
-  result.y += self->render_rect.y;
+  result.x = GST_ROUND_DOWN_N (result.x + self->render_rect.x, alignment);
+  result.y = GST_ROUND_DOWN_N (result.y + self->render_rect.y, alignment);;
 
   if (crop) {
     src.w = crop->width;
     src.h = crop->height;
   } else {
-    src.w = GST_VIDEO_INFO_WIDTH (&self->vinfo);
-    src.h = GST_VIDEO_INFO_HEIGHT (&self->vinfo);
+    src.w = GST_ROUND_DOWN_N (GST_VIDEO_INFO_WIDTH (&self->vinfo), alignment);
+    src.h = GST_ROUND_DOWN_N (GST_VIDEO_INFO_HEIGHT (&self->vinfo), alignment);
   }
 
   if (!gst_kms_sink_check_scale_ratio (self, result, src)) {