首页 > 解决方案 > 在这个简单的 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_parse2pkt->data都会指向一个带有新数据的新指针。所有这些新缓冲区在哪里被擦除?

标签: cffmpeg

解决方案


FFMpeg 使用引用计数来管理(某些)数据包。这个文档AVPacket 参考提到 av_free_packet() 只需要显式删除数据包。

在代码中查找av_packet_unref引用,这可以解释没有av_packet_free调用。


推荐阅读