[FFmpeg-cvslog] avpacket: Provide an alloc and a free function for the struct
Luca Barbato
git at videolan.org
Thu Oct 29 14:20:36 CET 2015
ffmpeg | branch: master | Luca Barbato <lu_zero at gentoo.org> | Fri Oct 23 11:11:34 2015 +0200| [a9a60106370f862e191dea58e748626da6a8fe97] | committer: Luca Barbato
avpacket: Provide an alloc and a free function for the struct
Pave the way for having the size of the AVPacket struct not part
of the ABI.
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=a9a60106370f862e191dea58e748626da6a8fe97
---
doc/APIchanges | 3 +++
libavcodec/avcodec.h | 34 ++++++++++++++++++++++++++++++++++
libavcodec/avpacket.c | 33 +++++++++++++++++++++++++++++++++
3 files changed, 70 insertions(+)
diff --git a/doc/APIchanges b/doc/APIchanges
index 0c5d141..d301bd5 100644
--- a/doc/APIchanges
+++ b/doc/APIchanges
@@ -12,12 +12,15 @@ libavutil: 2015-08-28
API changes, most recent first:
+2015-xx-xx - xxxxxxx - lavc 57.6.0 - avcodec.h
2015-xx-xx - lavc 57.7.0 - avcodec.h
xxxxxx - Deprecate av_free_packet(). Use av_packet_unref() as replacement,
it resets the packet in a more consistent way.
xxxxxx - Deprecate av_dup_packet(), it is a no-op for most cases.
Use av_packet_ref() to make a non-refcounted AVPacket refcounted.
+ xxxxxx - Add av_packet_alloc(), av_packet_clone(), av_packet_free().
+ They match the AVFrame functions with the same name.
2015-xx-xx - xxxxxxx - lavc 57.5.0 - avcodec.h
Add data and linesize array to AVSubtitleRect, to be used instead of
diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
index 9eaa2c6..b47aafa 100644
--- a/libavcodec/avcodec.h
+++ b/libavcodec/avcodec.h
@@ -3426,6 +3426,40 @@ void avsubtitle_free(AVSubtitle *sub);
*/
/**
+ * Allocate an AVPacket and set its fields to default values. The resulting
+ * struct must be freed using av_packet_free().
+ *
+ * @return An AVPacket filled with default values or NULL on failure.
+ *
+ * @note this only allocates the AVPacket itself, not the data buffers. Those
+ * must be allocated through other means such as av_new_packet.
+ *
+ * @see av_new_packet
+ */
+AVPacket *av_packet_alloc(void);
+
+/**
+ * Create a new packet that references the same data as src.
+ *
+ * This is a shortcut for av_packet_alloc()+av_packet_ref().
+ *
+ * @return newly created AVPacket on success, NULL on error.
+ *
+ * @see av_packet_alloc
+ * @see av_packet_ref
+ */
+AVPacket *av_packet_clone(AVPacket *src);
+
+/**
+ * Free the packet, if the packet is reference counted, it will be
+ * unreferenced first.
+ *
+ * @param packet packet to be freed. The pointer will be set to NULL.
+ * @note passing NULL is a no-op.
+ */
+void av_packet_free(AVPacket **pkt);
+
+/**
* Initialize optional fields of a packet with default values.
*
* Note, this does not touch the data and size members, which have to be
diff --git a/libavcodec/avpacket.c b/libavcodec/avpacket.c
index cec5bf8..a6eb241 100644
--- a/libavcodec/avpacket.c
+++ b/libavcodec/avpacket.c
@@ -46,6 +46,26 @@ FF_ENABLE_DEPRECATION_WARNINGS
pkt->side_data_elems = 0;
}
+AVPacket *av_packet_alloc(void)
+{
+ AVPacket *pkt = av_mallocz(sizeof(AVPacket));
+ if (!pkt)
+ return pkt;
+
+ av_packet_unref(pkt);
+
+ return pkt;
+}
+
+void av_packet_free(AVPacket **pkt)
+{
+ if (!pkt || !*pkt)
+ return;
+
+ av_packet_unref(*pkt);
+ av_freep(pkt);
+}
+
static int packet_alloc(AVBufferRef **buf, int size)
{
int ret;
@@ -343,6 +363,19 @@ fail:
return ret;
}
+AVPacket *av_packet_clone(AVPacket *src)
+{
+ AVPacket *ret = av_packet_alloc();
+
+ if (!ret)
+ return ret;
+
+ if (av_packet_ref(ret, src))
+ av_packet_free(&ret);
+
+ return ret;
+}
+
void av_packet_move_ref(AVPacket *dst, AVPacket *src)
{
*dst = *src;
More information about the ffmpeg-cvslog
mailing list