FFmpeg源码:av_init_packet、get_packet_defaults、av_packet_alloc函数分析

一、av_init_packet函数

av_init_packet函数定义在FFmpeg源码(本文演示用的FFmpeg源码版本为7.0.1)的源文件libavcodec/avpacket.c中:

cpp 复制代码
/**
 * Initialize optional fields of a packet with default values.
 *
 * Note, this does not touch the data and size members, which have to be
 * initialized separately.
 *
 * @param pkt packet
 *
 * @see av_packet_alloc
 * @see av_packet_unref
 *
 * @deprecated This function is deprecated. Once it's removed,
               sizeof(AVPacket) will not be a part of the ABI anymore.
 */
void av_init_packet(AVPacket *pkt)
{
    pkt->pts                  = AV_NOPTS_VALUE;
    pkt->dts                  = AV_NOPTS_VALUE;
    pkt->pos                  = -1;
    pkt->duration             = 0;
    pkt->flags                = 0;
    pkt->stream_index         = 0;
    pkt->buf                  = NULL;
    pkt->side_data            = NULL;
    pkt->side_data_elems      = 0;
    pkt->opaque               = NULL;
    pkt->opaque_ref           = NULL;
    pkt->time_base            = av_make_q(0, 1);
}

该函数作用是:初始化一个AVPacket类型变量,给其成员变量赋默认值。注意:在最新版本的FFmpeg源码(比如7.0.1版本中)该函数已被弃用,不推荐继续使用。

形参pkt:输出型参数。指针,指向需要被初始化的AVPacket类型变量。该函数不会对pkt->data和pkt->size进行赋值。

返回值:无。

二、get_packet_defaults函数

新版本的FFmpeg源码使用get_packet_defaults函数来代替av_init_packet函数。get_packet_defaults函数定义在源文件libavcodec/avpacket.c中:

cpp 复制代码
/**
 * @brief Undefined timestamp value
 *
 * Usually reported by demuxer that work on containers that do not provide
 * either pts or dts.
 */
static void get_packet_defaults(AVPacket *pkt)
{
    memset(pkt, 0, sizeof(*pkt));

    pkt->pts             = AV_NOPTS_VALUE;
    pkt->dts             = AV_NOPTS_VALUE;
    pkt->pos             = -1;
    pkt->time_base       = av_make_q(0, 1);
}

该函数作用是:初始化一个已经分配了内存的AVPacket类型变量,给其成员变量pts、dts、pos、time_base赋默认值,让其它成员变量字节清零。注意:执行该函数前必须先给形参pkt指向的AVPacket类型变量分配内存,否则可能会导致程序崩溃。

形参pkt:输出型参数。指针,指向需要被初始化的AVPacket类型变量。执行该函数后:

pkt->pts和pkt->dts的值会变为AV_NOPTS_VALUE,也就是十进制的:-9223372036854775808。

宏AV_NOPTS_VALUE定义在libavutil/avutil.h中,表示时间戳的值未定义:

cpp 复制代码
/**
 * @brief Undefined timestamp value
 *
 * Usually reported by demuxer that work on containers that do not provide
 * either pts or dts.
 */

#define AV_NOPTS_VALUE          ((int64_t)UINT64_C(0x8000000000000000))

pkt->pos的值会变为-1,pkt->time_base->num的值会变为0,pkt->time_base->den的值会变为1。av_make_q函数的用法可以参考:《FFmpeg有理数相关的源码:AVRational结构体和其相关的函数分析》。

返回值:无

三、av_packet_alloc函数

av_packet_alloc函数定义在源文件libavcodec/avpacket.c中:

cpp 复制代码
/**
 * 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)
{
    AVPacket *pkt = av_malloc(sizeof(AVPacket));
    if (!pkt)
        return pkt;

    get_packet_defaults(pkt);

    return pkt;
}

该函数作用是:给一个AVPacket类型变量分配内存,并对其成员变量进行初始化。注意:该函数只会给AVPacket本身分配内存,而不会给里面的数据缓冲区(成员变量data和buf指向的缓冲区)分配内存。要想给里面的数据缓冲区分配内存可以使用av_new_packet函数。可以看到该函数内部调用了av_malloc函数来分配内存,关于av_malloc函数用法可以参考:《FFmpeg中内存分配和释放相关的源码:av_malloc函数、av_mallocz函数、av_free函数和av_freep函数分析》。

形参:无

返回值:指针,指向被分配了内存和初始化了的AVPacket类型变量。通过该函数得到的AVPacket类型变量之后必须通过av_packet_free()来释放其空间。

相关推荐
xcg34012311 小时前
关于视频抽帧调用虹软人脸识别的BufferedImage读取优化策略
ffmpeg·音视频·视频抽帧
繁依Fanyi14 小时前
使用 FFmpeg 剪辑视频指南
java·服务器·开发语言·ffmpeg·音视频
deadknight92 天前
定期自动统计大表执行情况
ffmpeg
cuijiecheng20184 天前
音视频入门基础:RTP专题(9)——FFmpeg接收RTP流的原理和内部实现
ffmpeg·音视频
偶是老李头4 天前
Ubuntu虚拟机NDK编译ffmpeg
linux·ubuntu·ffmpeg·android ndk
lucky-billy4 天前
Qt 中使用 ffmpeg 获取采集卡数据录制视频
qt·ffmpeg·音视频
cuijiecheng20184 天前
FFmpeg源码:url_find_protocol函数分析
ffmpeg
大懒猫软件4 天前
使用 Python 爬虫和 FFmpeg 爬取 B 站高清视频
爬虫·python·ffmpeg
柯木超4 天前
使用 Swift 完成FFmpeg音频录制、播放和视频格式转换应用
ffmpeg
hjjdebug6 天前
ffmpeg configure 研究1-命令行参数的分析
ffmpeg·configure·bash 脚本