Is the code in gst_video_encoder_release_frame correct?

Sebastian Dröge sebastian at centricular.com
Wed May 3 20:14:16 UTC 2017


On Wed, 2017-05-03 at 21:27 +0200, Martin Maurer wrote:
> Hi,
> 
> the following is an extract from 
> gst-plugins-base-1.0-1.11.91\gst-libs\gst\video\gstvideoencoder.c
> 
> static void
> gst_video_encoder_release_frame (GstVideoEncoder * enc,
>      GstVideoCodecFrame * frame)
> {
>    GList *link;
> 
>    /* unref once from the list */
>    link = g_list_find (enc->priv->frames, frame);
>    if (link) {
>      gst_video_codec_frame_unref (frame);
>      enc->priv->frames = g_list_delete_link (enc->priv->frames,
> link);
>    }
>    /* unref because this function takes ownership */
>    gst_video_codec_frame_unref (frame);
> }
> 
> Could there be an error, because the "unref" command is executed
> twice. 
> And both time with same parameter "frame".
> Is there perhaps a missing return or else statement needed?
> Must "frame" in first unref command be "link", or link maybe ok,
> because link is the same as frame, in case it is found?

That's correct. One reference is owned by the list, which is unreffed.
The other reference was owned by the caller of release_frame() (from
somewhere the caller must've gotten the reference after all), and that
one is released too here.

-- 
Sebastian Dröge, Centricular Ltd · http://www.centricular.com
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 963 bytes
Desc: This is a digitally signed message part
URL: <https://lists.freedesktop.org/archives/gstreamer-devel/attachments/20170503/24d9d56f/attachment-0001.sig>


More information about the gstreamer-devel mailing list