AVFrame内存管理api

int av_frame_ref(AVFrame *dst, const AVFrame *src)

类似于复制,src复制到dst,不过只是将src里面数据的引用加1,然后将引用添加到dst中

AVFrame *av_frame_clone(const AVFrame *src);
作用同av_frame_ref类似,增加src的引用计数,但同时会初始化av_frame_clone 对象

void av_frame_unref(AVFrame* frame)
将frame引用计数减一。

av_frame_free():释放AVFrame的结构体空间。这个函数就有点意思了。因为他不仅仅释放结构体空间,还涉及到AVFrame中的uint8_t *data[AV_NUM_DATA_POINTERS];字段的释放问题。,如果AVFrame中的uint8_t *data[AV_NUM_DATA_POINTERS]中的引用==1,则释放data的空间。

av_frame_unref()函数就是针对frame的buf数组 逐个调用av_buffer_unref()。av_buffer_unref之前也讲过了。就是引用计数变为0,就释放data,否则只释放结构体自身内存。 注意,前提是buf[i] 不能是null.

void av_frame_unref(AVFrame *frame)
{
int i;

if (!frame)
    return;

wipe_side_data(frame);

for (i = 0; i < FF_ARRAY_ELEMS(frame->buf); i++)
    av_buffer_unref(&frame->buf[i]);
for (i = 0; i < frame->nb_extended_buf; i++)
    av_buffer_unref(&frame->extended_buf[i]);
av_freep(&frame->extended_buf);
av_dict_free(&frame->metadata);

#if FF_API_FRAME_QP
FF_DISABLE_DEPRECATION_WARNINGS
av_buffer_unref(&frame->qp_table_buf);
FF_ENABLE_DEPRECATION_WARNINGS
#endif

av_buffer_unref(&frame->hw_frames_ctx);

av_buffer_unref(&frame->opaque_ref);
av_buffer_unref(&frame->private_ref);

get_frame_defaults(frame);

}
————————————————
版权声明:本文为CSDN博主「oooooome」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/oooooome/article/details/111993911
https://blog.csdn.net/oooooome/article/details/111993911?ops_request_misc=&request_id=&biz_id=102&utm_term=av_frame_unref&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-7-111993911.nonecase&spm=1018.2226.3001.4187

猜你喜欢

转载自blog.csdn.net/weixin_43466192/article/details/125313511