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);