[Spice-devel] [spice-gtk v1 1/2] display-gst: small refactor get_decoded_frame()
Frediano Ziglio
fziglio at redhat.com
Wed Jan 23 21:45:23 UTC 2019
>
> From: Victor Toso <me at victortoso.com>
>
> Small refactor to make each code block a bit more obvious.
>
> This code should (1) find the @buffer in the queue; (2) remove all old
> elements from queue. That perfectly fit in two loops in sequence, but
> they don't need to be nested and they don't need to use the same
> pointer (gstframe).
>
> As @num_frames_dropped is only used in the second block, this was
> moved as well, together with the debug.
>
> Signed-off-by: Victor Toso <victortoso at redhat.com>
> ---
> src/channel-display-gst.c | 37 +++++++++++++++++++------------------
> 1 file changed, 19 insertions(+), 18 deletions(-)
>
> diff --git a/src/channel-display-gst.c b/src/channel-display-gst.c
> index 08c9f8f..2b42053 100644
> --- a/src/channel-display-gst.c
> +++ b/src/channel-display-gst.c
> @@ -212,8 +212,6 @@ static void schedule_frame(SpiceGstDecoder *decoder)
> */
> static SpiceGstFrame *get_decoded_frame(SpiceGstDecoder *decoder, GstBuffer
> *buffer)
> {
> - guint num_frames_dropped = 0;
> -
> /* Gstreamer sometimes returns the same buffer twice
> * or buffers that have a modified, and thus unrecognizable, PTS.
> * Blindly removing frames from the decoding_queue until we find a
> @@ -226,27 +224,30 @@ static SpiceGstFrame *get_decoded_frame(SpiceGstDecoder
> *decoder, GstBuffer *buf
> while (l) {
I wonder if this would be more readable with a
for (;;) {
if (l == NULL) {
return NULL;
}
saving all the NULL checks later
> gstframe = l->data;
> if (gstframe->timestamp == GST_BUFFER_PTS(buffer)) {
> -
> - /* Now that we know there is a match, remove it and the older
> - * frames from the decoding queue.
> - */
> - while ((gstframe = g_queue_pop_head(decoder->decoding_queue))) {
> - if (gstframe->timestamp == GST_BUFFER_PTS(buffer)) {
> - break;
> - }
> - /* The GStreamer pipeline dropped the corresponding
> - * buffer.
> - */
> - num_frames_dropped++;
> - free_gst_frame(gstframe);
> - }
> break;
> }
> gstframe = NULL;
> l = l->next;
> }
> - if (num_frames_dropped != 0) {
> - SPICE_DEBUG("the GStreamer pipeline dropped %u frames",
> num_frames_dropped);
> +
> + /* Now that we know there is a match, remove it and the older
> + * frames from the decoding queue.
> + */
> + if (gstframe != NULL) {
> + guint num_frames_dropped = 0;
> + SpiceGstFrame *late_frame = NULL;
> + /* The GStreamer pipeline dropped the corresponding
> + * buffer.
> + */
> + while ((late_frame = g_queue_pop_head(decoder->decoding_queue)) !=
> NULL &&
> + late_frame->timestamp > GST_BUFFER_PTS(buffer)) {
This can simply be
while ((late_frame = g_queue_pop_head(decoder->decoding_queue)) != gstframe) {
> + num_frames_dropped++;
> + free_gst_frame(late_frame);
> + }
> +
> + if (num_frames_dropped != 0) {
> + SPICE_DEBUG("the GStreamer pipeline dropped %u frames",
> num_frames_dropped);
> + }
> }
> return gstframe;
> }
Frediano
More information about the Spice-devel
mailing list