amlvideosink: CF2 add set frame rate and refine under flow [1/1]
PD#SWPL-148200
Problem:
1.set frame rate to render lib
2.refine under flow report
Solution:
1.set frame rate to render lib
2.refine under flow report
Verify:
ah212
Change-Id: I54804a34e78db4cbb21a8b7dbf77dc7bc8d7a5c0
Signed-off-by: fei.deng <fei.deng@amlogic.com>
diff --git a/src/gstamlvideosink.c b/src/gstamlvideosink.c
index 2a14b3d..fdf3680 100644
--- a/src/gstamlvideosink.c
+++ b/src/gstamlvideosink.c
@@ -182,6 +182,7 @@
gboolean fullscreen;
gboolean mute;
gboolean show_first_frame_asap;
+ gboolean emitUnderflowSignal;
#if GST_IMPORT_LGE_PROP
GstAmlVideoSinkLgeCtxt lge_ctxt;
@@ -402,7 +403,7 @@
GstBaseSink *basesink = (GstBaseSink *)sink;
sink->last_displayed_buf_pts = 0;
- sink->last_dec_buf_pts = 0;
+ sink->last_dec_buf_pts = GST_CLOCK_TIME_NONE;
/* init eos detect */
sink->queued = 0;
sink->dequeued = 0;
@@ -415,6 +416,10 @@
sink->secure_mode = FALSE;
sink->eos_detect_thread_handle = NULL;
sink->quit_eos_detect_thread = FALSE;
+ sink->frame_rate_num = 0;
+ sink->frame_rate_denom = 0;
+ sink->frame_rate_changed = FALSE;
+ sink->frame_rate = 0.0;
g_mutex_init(&sink->eos_lock);
g_cond_init(&sink->eos_cond);
@@ -1062,6 +1067,14 @@
sink_priv->video_info_changed = FALSE;
}
+ if (sink->frame_rate_changed) {
+ sink->frame_rate_changed = FALSE;
+ RenderFraction frame_rate_fraction;
+ frame_rate_fraction.num = sink->frame_rate_num;
+ frame_rate_fraction.denom = sink->frame_rate_denom;
+ render_set_value(sink_priv->render_device_handle, KEY_VIDEO_FRAME_RATE, &sink->default_sync);
+ }
+
if (!gst_aml_video_sink_check_buf(sink, buffer))
{
GST_ERROR_OBJECT(sink, "buf out of segment return");
@@ -1223,6 +1236,7 @@
gint num, denom;
if (gst_structure_get_fraction( structure, "framerate", &num, &denom ))
{
+ GST_DEBUG_OBJECT(sink, "framerate num:%d,denom:%d",num,denom);
if ( denom == 0 ) denom= 1;
sink->frame_rate= (double)num/(double)denom;
if ( sink->frame_rate <= 0.0 )
@@ -1230,6 +1244,11 @@
GST_DEBUG_OBJECT(sink, "caps have framerate of 0 - assume 60");
sink->frame_rate= 60.0;
}
+ if (sink->frame_rate_num != num || sink->frame_rate_denom != denom) {
+ sink->frame_rate_num = num;
+ sink->frame_rate_denom = denom;
+ sink->frame_rate_changed = TRUE;
+ }
}
}
} break;
@@ -1241,6 +1260,7 @@
GST_DEBUG_OBJECT(sink, "pass to basesink");
result = GST_BASE_SINK_CLASS(parent_class)->event((GstBaseSink *)sink, event);
+ GST_DEBUG_OBJECT(sink, "done");
return result;
}
@@ -1393,6 +1413,7 @@
sink_priv->use_dmabuf = USE_DMABUF;
sink_priv->mediasync_instanceid = -1;
sink_priv->show_first_frame_asap = FALSE;
+ sink_priv->emitUnderflowSignal = FALSE;
}
static void gst_render_msg_callback(void *userData, RenderMsgType type, void *msg)
@@ -1459,9 +1480,9 @@
} break;
case MSG_UNDER_FLOW: {
GstAmlVideoSinkPrivate *sink_priv = GST_AML_VIDEO_SINK_GET_PRIVATE(sink);
- if (!sink_priv->got_eos) {
+ if (sink->video_playing && !sink_priv->got_eos) {
GST_LOG_OBJECT(sink, "signal under flow");
- g_signal_emit (G_OBJECT (sink), g_signals[SIGNAL_UNDERFLOW], 0, 0, NULL);
+ sink_priv->emitUnderflowSignal = TRUE;
}
} break;
default:
@@ -1805,12 +1826,17 @@
GstAmlVideoSink *sink = (GstAmlVideoSink *)data;
GstAmlVideoSinkPrivate *sink_priv = GST_AML_VIDEO_SINK_GET_PRIVATE(sink);
int eosCountDown;
+ double frameRate = (sink->frame_rate > 0.0 ? sink->frame_rate : 30.0);
GST_DEBUG("eos_detection_thread: enter");
eosCountDown = 2;
while (!sink->quit_eos_detect_thread )
{
- usleep(1000000/sink->frame_rate);
+ usleep(1000000/frameRate);
+ if (sink->video_playing && sink_priv->emitUnderflowSignal) {
+ sink_priv->emitUnderflowSignal = FALSE;
+ g_signal_emit (G_OBJECT (sink), g_signals[SIGNAL_UNDERFLOW], 0, 0, NULL);
+ }
if (sink->video_playing && sink_priv->got_eos)
{
if (sink->queued == sink->rendered + sink->droped)
diff --git a/src/gstamlvideosink.h b/src/gstamlvideosink.h
index bc8da5c..2b7e30e 100644
--- a/src/gstamlvideosink.h
+++ b/src/gstamlvideosink.h
@@ -64,6 +64,9 @@
GCond eos_cond;
gboolean quit_eos_detect_thread;
GThread *eos_detect_thread_handle;
+ gint frame_rate_num;
+ gint frame_rate_denom;
+ gboolean frame_rate_changed;
double frame_rate;
gboolean video_playing;