[Spice-devel] [client 2/5] gstreamer: Avoid a couple of forward function declarations
Francois Gouget
fgouget at codeweavers.com
Fri Jun 14 16:18:03 UTC 2019
Signed-off-by: Francois Gouget <fgouget at codeweavers.com>
---
src/channel-display-gst.c | 81 ++++++++++++++++++++-------------------
1 file changed, 42 insertions(+), 39 deletions(-)
diff --git a/src/channel-display-gst.c b/src/channel-display-gst.c
index c756f916..50f29060 100644
--- a/src/channel-display-gst.c
+++ b/src/channel-display-gst.c
@@ -120,8 +120,6 @@ static void free_gst_frame(SpiceGstFrame *gstframe)
/* ---------- GStreamer pipeline ---------- */
static void schedule_frame(SpiceGstDecoder *decoder);
-static void fetch_pending_sample(SpiceGstDecoder *decoder);
-static SpiceGstFrame *get_decoded_frame(SpiceGstDecoder *decoder, GstBuffer *buffer);
RECORDER(frames_stats, 64, "Frames statistics");
@@ -184,46 +182,10 @@ static gboolean display_frame(gpointer video_decoder)
return G_SOURCE_REMOVE;
}
-/* main loop or GStreamer streaming thread */
-static void schedule_frame(SpiceGstDecoder *decoder)
-{
- guint32 now = stream_get_time(decoder->base.stream);
- g_mutex_lock(&decoder->queues_mutex);
-
- while (!decoder->timer_id) {
- while (decoder->display_frame == NULL && decoder->pending_samples) {
- fetch_pending_sample(decoder);
- }
-
- SpiceGstFrame *gstframe = decoder->display_frame;
- if (!gstframe) {
- break;
- }
-
- if (spice_mmtime_diff(gstframe->encoded_frame->mm_time, now) >= 0) {
- decoder->timer_id = g_timeout_add(gstframe->encoded_frame->mm_time - now,
- display_frame, decoder);
- } else if (decoder->display_frame && !decoder->pending_samples) {
- /* Still attempt to display the least out of date frame so the
- * video is not completely frozen for an extended period of time.
- */
- decoder->timer_id = g_timeout_add(0, display_frame, decoder);
- } else {
- SPICE_DEBUG("%s: rendering too late by %u ms (ts: %u, mmtime: %u), dropping",
- __FUNCTION__, now - gstframe->encoded_frame->mm_time,
- gstframe->encoded_frame->mm_time, now);
- stream_dropped_frame_on_playback(decoder->base.stream);
- decoder->display_frame = NULL;
- free_gst_frame(gstframe);
- }
- }
-
- g_mutex_unlock(&decoder->queues_mutex);
-}
-
/* Get the decoded frame relative to buffer or NULL if not found.
* Dequeue the frame from decoding_queue and return it, caller
* is responsible to free the pointer.
+ *
* queues_mutex must be held.
*/
static SpiceGstFrame *get_decoded_frame(SpiceGstDecoder *decoder, GstBuffer *buffer)
@@ -283,6 +245,10 @@ static SpiceGstFrame *get_decoded_frame(SpiceGstDecoder *decoder, GstBuffer *buf
return gstframe;
}
+/* Helper for schedule_frame().
+ *
+ * queues_mutex must be held.
+ */
static void fetch_pending_sample(SpiceGstDecoder *decoder)
{
GstSample *sample = gst_app_sink_pull_sample(decoder->appsink);
@@ -315,6 +281,43 @@ static void fetch_pending_sample(SpiceGstDecoder *decoder)
}
}
+/* main loop or GStreamer streaming thread */
+static void schedule_frame(SpiceGstDecoder *decoder)
+{
+ guint32 now = stream_get_time(decoder->base.stream);
+ g_mutex_lock(&decoder->queues_mutex);
+
+ while (!decoder->timer_id) {
+ while (decoder->display_frame == NULL && decoder->pending_samples) {
+ fetch_pending_sample(decoder);
+ }
+
+ SpiceGstFrame *gstframe = decoder->display_frame;
+ if (!gstframe) {
+ break;
+ }
+
+ if (spice_mmtime_diff(gstframe->encoded_frame->mm_time, now) >= 0) {
+ decoder->timer_id = g_timeout_add(gstframe->encoded_frame->mm_time - now,
+ display_frame, decoder);
+ } else if (decoder->display_frame && !decoder->pending_samples) {
+ /* Still attempt to display the least out of date frame so the
+ * video is not completely frozen for an extended period of time.
+ */
+ decoder->timer_id = g_timeout_add(0, display_frame, decoder);
+ } else {
+ SPICE_DEBUG("%s: rendering too late by %u ms (ts: %u, mmtime: %u), dropping",
+ __FUNCTION__, now - gstframe->encoded_frame->mm_time,
+ gstframe->encoded_frame->mm_time, now);
+ stream_dropped_frame_on_playback(decoder->base.stream);
+ decoder->display_frame = NULL;
+ free_gst_frame(gstframe);
+ }
+ }
+
+ g_mutex_unlock(&decoder->queues_mutex);
+}
+
/* GStreamer thread
*
* We cannot use GStreamer's signals because they are not always run in
--
2.20.1
More information about the Spice-devel
mailing list