[FFmpeg-devel] [PATCH] avcodec/avpacket: add av_packet_make_writable()

wm4 nfxjfg at googlemail.com
Mon Mar 19 18:32:08 EET 2018


On Mon, 19 Mar 2018 12:42:16 -0300
James Almer <jamrial at gmail.com> wrote:

> Useful as well to quickly make a packet reference counted when it
> isn't already so.
> 
> Signed-off-by: James Almer <jamrial at gmail.com>
> ---
>  libavcodec/avcodec.h  | 11 +++++++++++
>  libavcodec/avpacket.c | 24 ++++++++++++++++++++++++
>  2 files changed, 35 insertions(+)
> 
> diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
> index a8322fb62a..a78017f1fb 100644
> --- a/libavcodec/avcodec.h
> +++ b/libavcodec/avcodec.h
> @@ -4518,6 +4518,17 @@ void av_packet_move_ref(AVPacket *dst, AVPacket *src);
>   */
>  int av_packet_copy_props(AVPacket *dst, const AVPacket *src);
>  
> +/**
> + * Create a writable reference for the data described by a given packet,
> + * avoiding data copy if possible.
> + *
> + * @param pkt Packet whose data should be made writable.
> + *
> + * @return 0 on success, a negative AVERROR on failure. On failure, the
> + *         packet is unchanged.
> + */
> +int av_packet_make_writable(AVPacket *pkt);
> +
>  /**
>   * Convert valid timing fields (timestamps / durations) in a packet from one
>   * timebase to another. Timestamps with unknown values (AV_NOPTS_VALUE) will be
> diff --git a/libavcodec/avpacket.c b/libavcodec/avpacket.c
> index fe8113ab76..0693ca6f62 100644
> --- a/libavcodec/avpacket.c
> +++ b/libavcodec/avpacket.c
> @@ -652,6 +652,30 @@ void av_packet_move_ref(AVPacket *dst, AVPacket *src)
>      src->size = 0;
>  }
>  
> +int av_packet_make_writable(AVPacket *pkt)
> +{
> +    AVBufferRef *buf = NULL;
> +    int ret;
> +
> +    if (pkt->buf && av_buffer_is_writable(pkt->buf))
> +        return 0;
> +
> +    if (!pkt->data)
> +        return AVERROR(EINVAL);
> +
> +    ret = packet_alloc(&buf, pkt->size);
> +    if (ret < 0)
> +        return ret;
> +    if (pkt->size)
> +        memcpy(buf->data, pkt->data, pkt->size);
> +
> +    av_buffer_unref(&pkt->buf);
> +    pkt->buf  = buf;
> +    pkt->data = buf->data;
> +
> +    return 0;
> +}
> +
>  void av_packet_rescale_ts(AVPacket *pkt, AVRational src_tb, AVRational dst_tb)
>  {
>      if (pkt->pts != AV_NOPTS_VALUE)

Why not just call av_buffer_make_writable()? This code seems fine too,
though.


More information about the ffmpeg-devel mailing list