[Spice-devel] [RFC spice-server 1/2] streaming: Restart streams on video-codec changes

Kevin Pouget kpouget at redhat.com
Thu Jun 27 09:19:47 UTC 2019


Hello Uri,

On Thu, Jun 27, 2019 at 11:04 AM Uri Lublin <uril at redhat.com> wrote:
>
> On 6/27/19 11:40 AM, Frediano Ziglio wrote:
> >>
> >> Interrupt/restart the video streams when the user changes the
> >> preferred video-codecs (dcc_handle_preferred_video_codec_type) or when
> >> the host admin updates the list of video-codecs allowed
> >> (display_channel_set_video_codecs)
>
> Hi,
>
> This patch only stops the video stream.
> A new stream will be started automatically according to spice rules
> (video-stream detection).

indeed, I wasn't sure about the wording, because the purpose of the
patch is to trigger a stream restart, it's not to stop it, so I don't
know which word to put in the commit title! (I'll add your sentence in
the body anyway to clarify)

> >> ---
> >>   server/dcc.c             | 2 ++
> >>   server/display-channel.c | 2 ++
> >>   server/video-stream.c    | 5 +++++
> >>   3 files changed, 9 insertions(+)
> >>
> >> diff --git a/server/dcc.c b/server/dcc.c
> >> index a94e27e8..0deeed88 100644
> >> --- a/server/dcc.c
> >> +++ b/server/dcc.c
> >> @@ -1201,6 +1201,8 @@ static int
> >> dcc_handle_preferred_video_codec_type(DisplayChannelClient *dcc,
> >>
> >>       /* New client preference */
> >>       dcc_update_preferred_video_codecs(dcc);
> >> +    video_stream_detach_and_stop(DCC_TO_DC(dcc));
> >> +
> >>       return TRUE;
> >>   }
> >>
> >> diff --git a/server/display-channel.c b/server/display-channel.c
> >> index 071c0140..4b8e6e90 100644
> >> --- a/server/display-channel.c
> >> +++ b/server/display-channel.c
> >> @@ -255,6 +255,8 @@ void display_channel_set_video_codecs(DisplayChannel
> >> *display, GArray *video_cod
> >>       g_clear_pointer(&display->priv->video_codecs, g_array_unref);
> >>       display->priv->video_codecs = g_array_ref(video_codecs);
> >>       g_object_notify(G_OBJECT(display), "video-codecs");
> >> +
> >> +    video_stream_detach_and_stop(display);
> >>   }
> >>
> >>   GArray *display_channel_get_video_codecs(DisplayChannel *display)
> >> diff --git a/server/video-stream.c b/server/video-stream.c
> >> index 4ac25af8..f227713b 100644
> >> --- a/server/video-stream.c
> >> +++ b/server/video-stream.c
> >> @@ -925,6 +925,11 @@ void video_stream_detach_and_stop(DisplayChannel
> >> *display)
> >>       RingItem *stream_item;
> >>
> >>       spice_debug("trace");
> >> +
> >> +    if (!ring_is_initialized(&display->priv->streams)) {
> >> +        return;
> >> +    }
> >> +
> >
> > If this happens I would consider a program error and I would abort().
> >
> >>       while ((stream_item = ring_get_head(&display->priv->streams))) {
>
> When the ring is empty, ring_get_head returns NULL, and the
> while loop exits immediately. So this case is already covered.
> (It also aborts (spice_assert) if the the ring is "not initialized")

yes, it was a bug that the stream was uninitialized at this stage;
hence ring_is_empty was aborting the execution

I will let video_stream_detach_and_stop untouched


thanks,

Kevin

> >>           VideoStream *stream = SPICE_CONTAINEROF(stream_item, VideoStream,
> >>           link);
> >>
> >
> > Frediano
> > _______________________________________________
> > Spice-devel mailing list
> > Spice-devel at lists.freedesktop.org
> > https://lists.freedesktop.org/mailman/listinfo/spice-devel
> >
>


More information about the Spice-devel mailing list