FFmpeg中av_init_packet()和av_packet_alloc()以及av_new_packet()三者的区别以及用法

不多说,直接上源码


//仅仅是把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指定了一个大小


区别已经说得很明白,至于用法也就一目了然了,如果还有什么不懂得地方可以加QQ群445236076讨论







  • 3
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值