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;