kmssink: hold two input buffer after show frame

Kmssink need hold at least one original buffer to avoid vpu
overwrite the buffer still been displayed. Add buffer num to 2 to
workaround dcss drm video jitter issue.

upstream status: imx specific
diff --git a/sys/kms/gstkmssink.c b/sys/kms/gstkmssink.c
index 7bc7b32..69c3088 100644
--- a/sys/kms/gstkmssink.c
+++ b/sys/kms/gstkmssink.c
@@ -1457,7 +1457,12 @@
       self->is_alpha_set = FALSE;
       break;
     case GST_STATE_CHANGE_READY_TO_PAUSED:
+    {
+      guint i;
+      for (i = 0; i < DEFAULT_HOLD_BUFFER_NUM; i++)
+        self->hold_buf[i] = NULL;
       break;
+    }
     case GST_STATE_CHANGE_PAUSED_TO_PLAYING:
       break;
     default:
@@ -1476,7 +1481,12 @@
     }
     case GST_STATE_CHANGE_PAUSED_TO_READY:
     {
+      guint i;
       gst_kms_sink_set_primary_alpha (self, 255);
+      for (i = 0; i < DEFAULT_HOLD_BUFFER_NUM; i++) {
+        if (self->hold_buf[i])
+          gst_buffer_unref (self->hold_buf[i]);
+      }
       break;
     }
     case GST_STATE_CHANGE_READY_TO_NULL:
@@ -1756,6 +1766,18 @@
   self->frame_showed++;
 
 bail:
+  if (buf) {
+    guint i;
+
+    if (self->hold_buf[DEFAULT_HOLD_BUFFER_NUM-1])
+      gst_buffer_unref (self->hold_buf[DEFAULT_HOLD_BUFFER_NUM-1]);
+
+    for (i = DEFAULT_HOLD_BUFFER_NUM - 1; i > 0; i--)
+      self->hold_buf[i] = self->hold_buf[i-1];
+
+    self->hold_buf[0] = gst_buffer_ref (buf);
+  }
+
   gst_buffer_unref (buffer);
   return res;
 
diff --git a/sys/kms/gstkmssink.h b/sys/kms/gstkmssink.h
index 31f8e21..bfc1667 100644
--- a/sys/kms/gstkmssink.h
+++ b/sys/kms/gstkmssink.h
@@ -41,6 +41,8 @@
 #define GST_IS_KMS_SINK_CLASS(klass) \
   (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_KMS_SINK))
 
+#define DEFAULT_HOLD_BUFFER_NUM 2
+
 typedef struct _GstKMSSink GstKMSSink;
 typedef struct _GstKMSSinkClass GstKMSSinkClass;
 
@@ -82,6 +84,7 @@
   GstBufferPool *pool;
   GstAllocator *allocator;
   GstBuffer *last_buffer;
+  GstBuffer *hold_buf[DEFAULT_HOLD_BUFFER_NUM];
   GstMemory *tmp_kmsmem;
 
   gchar *devname;