On Mon, 19 Mar 2018 12:42:16 -0300 James Almer <jamr...@gmail.com> wrote:
> Useful as well to quickly make a packet reference counted when it > isn't already so. > > Signed-off-by: James Almer <jamr...@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. _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel