//仅仅是把pkt的参数设为默认值,要求pkt的内存已经分配好了,如果为NULL,则此处会崩溃
void av_init_packet(AVPacket *pkt)
{
pkt->pts = AV_NOPTS_VALUE;
pkt->dts = AV_NOPTS_VALUE;
pkt->pos = -1;
pkt->duration = 0;
#if FF_API_CONVERGENCE_DURATION
FF_DISABLE_DEPRECATION_WARNINGS
pkt->convergence_duration = 0;
FF_ENABLE_DEPRECATION_WARNINGS
#endif
pkt->flags = 0;
pkt->stream_index = 0;
pkt->buf = NULL;
pkt->side_data = NULL;
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;
}
我们可以清楚的看到av_packet_alloc返回的是一个AVPacket的一个指针,内部为这个指针分配了内存,也就是说你可以为一个NULL的AVPacket指针分配内存,源码的内部调用了av_packet_unref函数,我们再看一下av_packet_unref函数的源码,如下:
//内部还是调用的av_init_packet,相当于先分配内存再设为默认值
void av_packet_unref(AVPacket *pkt)
{
av_packet_free_side_data(pkt);
av_buffer_unref(&pkt->buf);
av_init_packet(pkt);
pkt->data = NULL;
pkt->size = 0;
}
av_packet_unref函数内部依旧是调用了av_init_packet函数,也就是说av_packet_alloc相对于av_init_packet是内部调用关系,av_init_packet是直接为一个已经分配好内存的指针或对象参数置为默认值,而av_packet_alloc是为一个NULL指针分配内存并将其值置为默认
再来说说av_new_packet,源码如下:
//为pkt分配一个指定大小的内存
int av_new_packet(AVPacket *pkt, int size)
{
AVBufferRef *buf = NULL;
int ret = packet_alloc(&buf, size);//这个函数类似于把buf添加了一个额外的类似于头的东西
if (ret < 0)
return ret;
av_init_packet(pkt);
pkt->buf = buf;
pkt->data = buf->data;
pkt->size = size;
return 0;
}
//为buf添加了一个类似头的东西,这里不多解释,如果想加深了解请看这个AV_INPUT_BUFFER_PADDING_SIZE宏定义
static int packet_alloc(AVBufferRef **buf, int size)
{
int ret;
if (size < 0 || size >= INT_MAX - AV_INPUT_BUFFER_PADDING_SIZE)
return AVERROR(EINVAL);
ret = av_buffer_realloc(buf, size + AV_INPUT_BUFFER_PADDING_SIZE);
if (ret < 0)
return ret;
memset((*buf)->data + size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
return 0;
}
其实这个函数与av_packet_alloc函数类似,只不过是给packet指定了一个大小
原文:https://blog.csdn.net/u010380485/article/details/54668696