c - 在这个简单的 ffmpeg 示例中,这个指针在哪里被释放?
问题描述
我正在阅读这个简单的 ffmpeg 解码示例: http: //ffmpeg.org/doxygen/4.0/decode__video_8c_source.html。这部分代码引起了我的注意:
while (data_size > 0) {
ret = av_parser_parse2(parser, c, &pkt->data, &pkt->size,
data, data_size, AV_NOPTS_VALUE, AV_NOPTS_VALUE, 0);
if (ret < 0) {
fprintf(stderr, "Error while parsing\n");
exit(1);
}
data += ret;
data_size -= ret;
if (pkt->size)
decode(c, frame, pkt, outfilename);
}
如您所见,它通过了&pkt->data
,其中pkt->data
已经是一个指针。所以它传递一个指向指针的指针。因此,它pkt->data
在每次调用时都指向一个新分配的数据。然后,pkt
传递给 decode: decode(c, frame, pkt, outfilename);
。但是,其中的数据pkt->data
永远不会被释放。我没有找到它所在的任何地方。
当代码完成时,它会调用av_packet_free(&pkt);
,但这还不够,因为在每次调用 时av_parser_parse2
,pkt->data
都会指向一个带有新数据的新指针。所有这些新缓冲区在哪里被擦除?
解决方案
FFMpeg 使用引用计数来管理(某些)数据包。这个文档AVPacket 参考提到 av_free_packet() 只需要显式删除数据包。
在代码中查找av_packet_unref
引用,这可以解释没有av_packet_free
调用。
推荐阅读
- java - 总是返回 null 的方法
- python-3.x - 如何使用 Flask 向 Google Dialogflow 提交查询
- docker - docker swarm 服务可在 swarm 主机上访问,但不能在 LAN IP 地址上访问
- java - 从不同的方法调用相同的 API
- sql - SQL 组计数
- python - 如何通过字符串值和匹配行中的整数过滤熊猫数据框?
- java - 在java中创建一个打印子arrayList项的方法
- angular - 通过属性对象将组件传递给另一个组件(用于 ng-bootstrap 模态)
- tabulator - 如何使用制表符在输入框占位符中显示和更新当前页码
- java - 在 IntelliJ 中创建 .jar 文件