[Spice-devel] [client v2 1/5] streaming: Document the GStreamer decoding process
Jonathon Jongsma
jjongsma at redhat.com
Tue Apr 18 21:56:37 UTC 2017
Looks good to me
Acked-by: Jonathon Jongsma <jjongsma at redhat.com>
On Thu, 2017-04-06 at 16:00 +0200, Francois Gouget wrote:
> Signed-off-by: Francois Gouget <fgouget at codeweavers.com>
> ---
> src/channel-display-gst.c | 26 ++++++++++++++++++++++++++
> 1 file changed, 26 insertions(+)
>
> diff --git a/src/channel-display-gst.c b/src/channel-display-gst.c
> index c4190b2d..7e0ddde4 100644
> --- a/src/channel-display-gst.c
> +++ b/src/channel-display-gst.c
> @@ -417,6 +417,32 @@ static void release_buffer_data(gpointer data)
> spice_msg_in_unref(frame_msg);
> }
>
> +/* spice_gst_decoder_queue_frame() queues the SpiceMsgIn message for
> decoding
> + * and displaying. The steps it goes through are as follows:
> + *
> + * 1) A SpiceFrame is created to keep track of SpiceMsgIn and some
> additional
> + * metadata. SpiceMsgIn is reffed. The SpiceFrame is then pushed
> to the
> + * decoding_queue.
> + * 2) The data part of SpiceMsgIn, which contains the compressed
> frame data,
> + * is wrapped in a GstBuffer and is pushed to the GStreamer
> pipeline for
> + * decoding. SpiceMsgIn is reffed.
> + * 3) As soon as the GStreamer pipeline no longer needs the
> compressed frame it
> + * calls release_buffer_data() to unref SpiceMsgIn.
> + * 4) Once the decompressed frame is available the GStreamer
> pipeline calls
> + * new_sample() in the GStreamer thread.
> + * 5) new_sample() then matches the decompressed frame to a
> SpiceFrame from
> + * the decoding queue using the GStreamer timestamp information
> to deal with
> + * dropped frames. The SpiceFrame is popped from the
> decoding_queue.
> + * 6) new_sample() then attaches the decompressed frame to the
> SpiceFrame,
> + * pushes it to the display_queue and calls schedule_frame().
> + * 7) schedule_frame() then uses the SpiceMsgIn's mm_time to arrange
> for
> + * display_frame() to be called, in the main thread, at the right
> time for
> + * the next frame.
> + * 8) display_frame() pops the first SpiceFrame from the
> display_queue and
> + * calls stream_display_frame().
> + * 9) display_frame() then frees the SpiceFrame and the decompressed
> frame.
> + * SpiceMsgIn is unreffed.
> + */
> static gboolean spice_gst_decoder_queue_frame(VideoDecoder
> *video_decoder,
> SpiceMsgIn *frame_msg,
> int32_t latency)
More information about the Spice-devel
mailing list