amlvideosink: CF2 set the fence to control the speed of sending buffer [1/1]
PD#SWPL-112633
Problem:
decoder does not hold any buffer and therefore returns an error
Solution:
set fence to control the speed of sending buffer
Verify:
Yocto-BSP
Signed-off-by: zengliang.li <zengliang.li@amlogic.com>
Change-Id: I40ffb10faeccb9cf389798f84e5e66f855c70f9c
diff --git a/src/gstamlvideosink.c b/src/gstamlvideosink.c
index 2f92154..4d3d5f4 100644
--- a/src/gstamlvideosink.c
+++ b/src/gstamlvideosink.c
@@ -135,6 +135,8 @@
#define DRMBP_EXTRA_BUF_SZIE_FOR_DISPLAY 1
#define DRMBP_LIMIT_MAX_BUFSIZE_TO_BUFSIZE 1
#define DRMBP_UNLIMIT_MAX_BUFSIZE 0
+#define GST_AML_WAIT_FENCE 8
+#define GST_AML_WAIT_TIME 5000
typedef struct _GstAmlVideoSinkWindowSet
{
@@ -227,6 +229,7 @@
int gst_render_val_callback(void *userData, int key, void *value);
static gboolean gst_aml_video_sink_tunnel_buf(GstAmlVideoSink *vsink, GstBuffer *gst_buf, RenderBuffer *tunnel_lib_buf_wrap);
static gboolean gst_get_mediasync_instanceid(GstAmlVideoSink *vsink);
+static void gst_aml_video_sink_wait_fence (GstAmlVideoSink *sink);
#if GST_USE_PLAYBIN
static GstElement *gst_aml_video_sink_find_audio_sink(GstAmlVideoSink *sink);
#endif
@@ -963,6 +966,28 @@
return ret;
}
+static void gst_aml_video_sink_wait_fence (GstAmlVideoSink *sink)
+{
+ guint q_num = 0;
+ guint dq_num = 0;
+
+ GST_OBJECT_LOCK(sink);
+ q_num = sink->queued;
+ dq_num = sink->dequeued;
+ GST_OBJECT_UNLOCK(sink);
+
+ while ((q_num - dq_num > GST_AML_WAIT_FENCE) && sink->video_playing)
+ {
+ g_usleep(GST_AML_WAIT_TIME);
+ GST_TRACE_OBJECT(sink, "wait fence condition update: q_num %d , dq_num %d",q_num , dq_num);
+ GST_OBJECT_LOCK(sink);
+ q_num = sink->queued;
+ dq_num = sink->dequeued;
+ GST_OBJECT_UNLOCK(sink);
+ }
+ return;
+}
+
static GstFlowReturn gst_aml_video_sink_show_frame(GstVideoSink *vsink, GstBuffer *buffer)
{
GstAmlVideoSink *sink = GST_AML_VIDEO_SINK(vsink);
@@ -1061,6 +1086,9 @@
GST_OBJECT_UNLOCK(vsink);
+ //Set fence to control the speed of sending buffer
+ gst_aml_video_sink_wait_fence(sink);
+
if (render_display_frame(sink_priv->render_device_handle, tunnel_lib_buf_wrap) == -1)
{
GST_ERROR_OBJECT(sink, "render lib: display frame fail");