Skip to content
Snippets Groups Projects
Commit a9a60106 authored by Luca Barbato's avatar Luca Barbato
Browse files

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.
parent 9b56d5c1
No related branches found
No related tags found
No related merge requests found
...@@ -12,12 +12,15 @@ libavutil: 2015-08-28 ...@@ -12,12 +12,15 @@ libavutil: 2015-08-28
API changes, most recent first: API changes, most recent first:
2015-xx-xx - xxxxxxx - lavc 57.6.0 - avcodec.h
2015-xx-xx - lavc 57.7.0 - avcodec.h 2015-xx-xx - lavc 57.7.0 - avcodec.h
xxxxxx - Deprecate av_free_packet(). Use av_packet_unref() as replacement, xxxxxx - Deprecate av_free_packet(). Use av_packet_unref() as replacement,
it resets the packet in a more consistent way. it resets the packet in a more consistent way.
xxxxxx - Deprecate av_dup_packet(), it is a no-op for most cases. xxxxxx - Deprecate av_dup_packet(), it is a no-op for most cases.
Use av_packet_ref() to make a non-refcounted AVPacket refcounted. 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 2015-xx-xx - xxxxxxx - lavc 57.5.0 - avcodec.h
Add data and linesize array to AVSubtitleRect, to be used instead of Add data and linesize array to AVSubtitleRect, to be used instead of
......
...@@ -3425,6 +3425,40 @@ void avsubtitle_free(AVSubtitle *sub); ...@@ -3425,6 +3425,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. * Initialize optional fields of a packet with default values.
* *
......
...@@ -46,6 +46,26 @@ FF_ENABLE_DEPRECATION_WARNINGS ...@@ -46,6 +46,26 @@ FF_ENABLE_DEPRECATION_WARNINGS
pkt->side_data_elems = 0; 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) static int packet_alloc(AVBufferRef **buf, int size)
{ {
int ret; int ret;
...@@ -343,6 +363,19 @@ fail: ...@@ -343,6 +363,19 @@ fail:
return ret; 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) void av_packet_move_ref(AVPacket *dst, AVPacket *src)
{ {
*dst = *src; *dst = *src;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment