[Spice-devel] [PATCH 2/2] audio: Avoid bad pipelines from gst_parse_launch
Fabiano FidĂȘncio
fabiano at fidencio.org
Tue Nov 25 15:26:08 PST 2014
On Wed, Nov 26, 2014 at 12:10 AM, Victor Toso <victortoso at redhat.com> wrote:
> Hi,
>
> ----- Original Message -----
>> On Tue, 2014-11-25 at 17:25 +0100, Victor Toso wrote:
>> > gst_parse_launch may return not NULL even when error is set.
>> > This can lead to data loss when playing or recording audio.
>> > ---
>> > gtk/spice-gstaudio.c | 12 ++++++++++--
>> > 1 file changed, 10 insertions(+), 2 deletions(-)
>> >
>> > diff --git a/gtk/spice-gstaudio.c b/gtk/spice-gstaudio.c
>> > index 5f9abb2..d6cc774 100644
>> > --- a/gtk/spice-gstaudio.c
>> > +++ b/gtk/spice-gstaudio.c
>> > @@ -245,7 +245,7 @@ static void record_start(SpiceRecordChannel *channel,
>> > gint format, gint channels
>> > "appsink caps=\"%s\" name=appsink",
>> > audio_caps);
>> >
>> > p->record.pipe = gst_parse_launch(pipeline, &error);
>> > - if (p->record.pipe == NULL) {
>> > + if (error != NULL) {
>> > g_warning("Failed to create pipeline: %s", error->message);
>> > goto lerr;
>> > }
>> > @@ -269,6 +269,10 @@ static void record_start(SpiceRecordChannel *channel,
>> > gint format, gint channels
>> > #endif
>> >
>> > lerr:
>> > + if (error != NULL && p->record.pipe != NULL) {
>> > + gst_object_unref(p->record.pipe);
>> > + p->record.pipe = NULL;
>> > + }
>>
>> It's kind-of related to your code here ...
>> I don't see a reason to have the goto and this lerr label here.
>> - audio_caps could only be set when the pipeline is NULL and freed right
>> inside this context.
>> - pipeline could be freed just after gst_parse_launch() and right before
>> the error checking.
>> - the error checking could cleanup the error and pipe inside the if and
>> simply return here.
>
> I agree that the code could be a bit simpler. I tried to keep the current design while we are dealing with two versions of gstreamer.
> Maybe we could do the refactoring when we do drop the gst 0.10 dependency? (removing ifdefs, for instance..)
As you prefer, but it's 5 lines patch to be done before yours.
>
>>
>>
>> > g_clear_error(&error);
>> > g_free(audio_caps);
>> > g_free(pipeline);
>> > @@ -345,7 +349,7 @@ static void playback_start(SpicePlaybackChannel
>> > *channel, gint format, gint chan
>> > "audioconvert ! audioresample !
>> > autoaudiosink name=\"audiosink\"",
>> > audio_caps);
>> > SPICE_DEBUG("audio pipeline: %s", pipeline);
>> > p->playback.pipe = gst_parse_launch(pipeline, &error);
>> > - if (p->playback.pipe == NULL) {
>> > + if (error != NULL) {
>> > g_warning("Failed to create pipeline: %s", error->message);
>> > goto lerr;
>> > }
>> > @@ -355,6 +359,10 @@ static void playback_start(SpicePlaybackChannel
>> > *channel, gint format, gint chan
>> > p->playback.channels = channels;
>> >
>> > lerr:
>> > + if (error != NULL && p->playback.pipe != NULL) {
>> > + gst_object_unref(p->playback.pipe);
>> > + p->playback.pipe = NULL;
>> > + }
>> > g_clear_error(&error);
>> > g_free(audio_caps);
>> > g_free(pipeline);
>>
>> The comments more or less apply to this hunk as well. But here I think a
>> goto exit would make sense. The label exit, however, should be in the
>> line 373 (just before the if (p->mmtime_id ...))
>>
>> Best Regards,
>> --
>> Fabiano FidĂȘncio
>>
>>
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/spice-devel
--
Fabiano FidĂȘncio
More information about the Spice-devel
mailing list