[FFmpeg-devel] [PATCH 1/6] avcodec/avpacket: add av_packet_make_ref()
Mark Thompson
sw at jkqxz.net
Sun Mar 25 20:54:28 EEST 2018
On 25/03/18 05:03, James Almer wrote:
> It works as a drop in replacement for the deprecated av_dup_packet(),
> to ensure a packet is reference counted.
>
> Signed-off-by: James Almer <jamrial at gmail.com>
> ---
> Better name welcome.
>
> libavcodec/avcodec.h | 18 +++++++++++++++++-
> libavcodec/avpacket.c | 18 ++++++++++++++++++
> 2 files changed, 35 insertions(+), 1 deletion(-)
>
> diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
> index 495242faf0..eb3fe4e428 100644
> --- a/libavcodec/avcodec.h
> +++ b/libavcodec/avcodec.h
> @@ -4360,7 +4360,7 @@ int av_packet_from_data(AVPacket *pkt, uint8_t *data, int size);
> * @warning This is a hack - the packet memory allocation stuff is broken. The
> * packet is allocated if it was not really allocated.
> *
> - * @deprecated Use av_packet_ref
> + * @deprecated Use av_packet_ref or av_packet_make_ref
> */
> attribute_deprecated
> int av_dup_packet(AVPacket *pkt);
> @@ -4531,6 +4531,22 @@ void av_packet_move_ref(AVPacket *dst, AVPacket *src);
> */
> int av_packet_copy_props(AVPacket *dst, const AVPacket *src);
>
> +/**
> + * Ensure the data described by a given packet is reference counted.
> + *
> + * @note This function does no ensure that the reference will be writable.
"does not ensure"
> + * Use av_packet_make_writable instead for that purpose.
> + *
> + * @see av_packet_ref
> + * @see av_packet_make_writable
> + *
> + * @param pkt packet whose data should be made reference counted.
> + *
> + * @return 0 on success, a negative AVERROR on error. On failure, the
> + * packet is unchanged.
> + */
> +int av_packet_make_ref(AVPacket *pkt);
"make_ref" seems pretty confusing as a name - it sounds like it will always make a new reference somehow.
Given the first line of the description, "ensure_refcounted"?
> +
> /**
> * Create a writable reference for the data described by a given packet,
> * avoiding data copy if possible.
> diff --git a/libavcodec/avpacket.c b/libavcodec/avpacket.c
> index 7faa082395..a6d2e6eb74 100644
> --- a/libavcodec/avpacket.c
> +++ b/libavcodec/avpacket.c
> @@ -655,6 +655,24 @@ void av_packet_move_ref(AVPacket *dst, AVPacket *src)
> src->size = 0;
> }
>
> +int av_packet_make_ref(AVPacket *pkt)
> +{
> + int ret;
> +
> + if (pkt->buf)
> + return 0;
> +
> + ret = packet_alloc(&pkt->buf, pkt->size);
> + if (ret < 0)
> + return ret;
> + if (pkt->size)
> + memcpy(pkt->buf->data, pkt->data, pkt->size);
> +
> + pkt->data = pkt->buf->data;
> +
> + return 0;
> +}
> +
> int av_packet_make_writable(AVPacket *pkt)
> {
> AVBufferRef *buf = NULL;
>
Looks like sensible thing to have.
- Mark
More information about the ffmpeg-devel
mailing list