[vlc-devel] [vlc-commits] picture: add picture_Clone()
Steve Lhomme
robux4 at gmail.com
Mon Nov 6 08:34:08 CET 2017
Although I agree with this addition. Doesn't the freeze means we're no
supposed to add new APIs' to libvlccore ?
On Sat, Nov 4, 2017 at 5:33 PM, Rémi Denis-Courmont <git at videolan.org> wrote:
> vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Sat Nov 4 17:55:22 2017 +0200| [00425a2585b1a9821b1521e907f01d98d03ae897] | committer: Rémi Denis-Courmont
>
> picture: add picture_Clone()
>
>> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=00425a2585b1a9821b1521e907f01d98d03ae897
> ---
>
> include/vlc_picture.h | 11 +++++++++++
> src/libvlccore.sym | 1 +
> src/misc/picture.c | 32 ++++++++++++++++++++++++++++++++
> src/misc/picture_pool.c | 6 ++++++
> 4 files changed, 50 insertions(+)
>
> diff --git a/include/vlc_picture.h b/include/vlc_picture.h
> index 3d71633fe4..74f156fbbd 100644
> --- a/include/vlc_picture.h
> +++ b/include/vlc_picture.h
> @@ -189,6 +189,17 @@ VLC_API void plane_CopyPixels( plane_t *p_dst, const plane_t *p_src );
> VLC_API void picture_Copy( picture_t *p_dst, const picture_t *p_src );
>
> /**
> + * Perform a shallow picture copy
> + *
> + * This function makes a shallow copy of an existing picture. The same planes
> + * and resources will be used, and the cloned picture reference count will be
> + * incremented.
> + *
> + * \return A clone picture on success, NULL on error.
> + */
> +VLC_API picture_t *picture_Clone(picture_t *pic);
> +
> +/**
> * This function will export a picture to an encoded bitstream.
> *
> * pp_image will contain the encoded bitstream in psz_format format.
> diff --git a/src/libvlccore.sym b/src/libvlccore.sym
> index 21316ce2b8..539ddff8a8 100644
> --- a/src/libvlccore.sym
> +++ b/src/libvlccore.sym
> @@ -295,6 +295,7 @@ net_vaPrintf
> net_Write
> NTPtime64
> picture_BlendSubpicture
> +picture_Clone
> picture_CopyPixels
> picture_Hold
> picture_Release
> diff --git a/src/misc/picture.c b/src/misc/picture.c
> index 2762358049..c14e600d3f 100644
> --- a/src/misc/picture.c
> +++ b/src/misc/picture.c
> @@ -374,6 +374,38 @@ void picture_Copy( picture_t *p_dst, const picture_t *p_src )
> picture_CopyProperties( p_dst, p_src );
> }
>
> +static void picture_DestroyClone(picture_t *clone)
> +{
> + picture_t *picture = ((picture_priv_t *)clone)->gc.opaque;
> +
> + free(clone);
> + picture_Release(picture);
> +}
> +
> +picture_t *picture_Clone(picture_t *picture)
> +{
> + /* TODO: merge common code with picture_pool_ClonePicture(). */
> + picture_resource_t res = {
> + .p_sys = picture->p_sys,
> + .pf_destroy = picture_DestroyClone,
> + };
> +
> + for (int i = 0; i < picture->i_planes; i++) {
> + res.p[i].p_pixels = picture->p[i].p_pixels;
> + res.p[i].i_lines = picture->p[i].i_lines;
> + res.p[i].i_pitch = picture->p[i].i_pitch;
> + }
> +
> + picture_t *clone = picture_NewFromResource(&picture->format, &res);
> + if (likely(clone != NULL)) {
> + ((picture_priv_t *)clone)->gc.opaque = picture;
> + picture_Hold(picture);
> +
> + if (picture->context != NULL)
> + clone->context = picture->context->copy(picture->context);
> + }
> + return clone;
> +}
>
> /*****************************************************************************
> *
> diff --git a/src/misc/picture_pool.c b/src/misc/picture_pool.c
> index bb957c4af5..7b5a82bfba 100644
> --- a/src/misc/picture_pool.c
> +++ b/src/misc/picture_pool.c
> @@ -299,6 +299,12 @@ void picture_pool_Cancel(picture_pool_t *pool, bool canceled)
> bool picture_pool_OwnsPic(picture_pool_t *pool, picture_t *pic)
> {
> picture_priv_t *priv = (picture_priv_t *)pic;
> +
> + while (priv->gc.destroy != picture_pool_ReleasePicture) {
> + pic = priv->gc.opaque;
> + priv = (picture_priv_t *)pic;
> + }
> +
> uintptr_t sys = (uintptr_t)priv->gc.opaque;
> picture_pool_t *picpool = (void *)(sys & ~(POOL_MAX - 1));
> return pool == picpool;
>
> _______________________________________________
> vlc-commits mailing list
> vlc-commits at videolan.org
> https://mailman.videolan.org/listinfo/vlc-commits
More information about the vlc-devel
mailing list