为何libavutil中的get_frame_defaults是内部函数?
FFmpeg AVFrame 初始化的限制
先看FFmpeg内部用于初始化AVFrame的函数实现:
static void get_frame_defaults(AVFrame *frame) { memset(frame, 0, sizeof(*frame)); frame->pts = frame->pkt_dts = AV_NOPTS_VALUE; frame->best_effort_timestamp = AV_NOPTS_VALUE; frame->duration = 0; #if FF_API_PKT_DURATION FF_DISABLE_DEPRECATION_WARNINGS frame->pkt_duration = 0; FF_ENABLE_DEPRECATION_WARNINGS #endif #if FF_API_FRAME_PKT FF_DISABLE_DEPRECATION_WARNINGS frame->pkt_pos = -1; frame->pkt_size = -1; FF_ENABLE_DEPRECATION_WARNINGS #endif frame->time_base = (AVRational){ 0, 1 }; frame->sample_aspect_ratio = (AVRational){ 0, 1 }; frame->format = -1; /* unknown */ frame->extended_data = frame->data; frame->color_primaries = AVCOL_PRI_UNSPECIFIED; frame->color_trc = AVCOL_TRC_UNSPECIFIED; frame->colorspace = AVCOL_SPC_UNSPECIFIED; frame->color_range = AVCOL_RANGE_UNSPECIFIED; frame->chroma_location = AVCHROMA_LOC_UNSPECIFIED; frame->flags = 0; }
这个函数被标记为static,仅能在定义它的源文件内部调用,外部代码无法直接访问。
初始化AVFrame的官方唯一途径是使用av_frame_alloc(以及用于操作已初始化AVFrame的av_frame_unref、av_frame_move_ref),这些函数均会在堆上动态分配AVFrame对象。
因此,FFmpeg没有原生方法支持初始化非动态分配的AVFrame对象(比如在栈上创建的AVFrame)。
对比之下,libavcodec提供了公开的av_init_packet函数,可用于初始化在栈等非堆位置创建的AVPacket对象。
内容的提问来源于stack exchange,提问作者zhang
相关产品推荐
相关产品推荐

