好不容易,在网上找到了 av_dup_packet() 函数源码。
又说pkt中没有destruct。。。。
只有本站会员才能查看附件,请 登录
应该如何解决。。。。
程序代码:
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libswscale/swscale.h>
#include <libavdevice/avdevice.h>
int av_dup_packet(AVPacket* pkt)
{
if (((pkt->destruct == av_destruct_packet_nofree) || (pkt->destruct == NULL)) && pkt->data) {
uint8_t* data; //定义数据栈上的数据指针
/* We duplicate the packet and don't forget to add the padding again. */
if ((unsigned)pkt->size > (unsigned)pkt->size + FF_INPUT_BUFFER_PADDING_SIZE)
return AVERROR(ENOMEM);
data = av_malloc(pkt->size + FF_INPUT_BUFFER_PADDING_SIZE); //申请内存
if (!data) {
return AVERROR(ENOMEM);
}
memcpy(data, pkt->data, pkt->size); //把共享的内存拷过去
memset(data + pkt->size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
pkt->data = data; // 重新设置pkt->data终于有自己的独立内存了,不用共享别的AVPacket的内存
pkt->destruct = av_destruct_packet; //设置析构函数指针
}
return 0;
}
#include <libavformat/avformat.h>
#include <libswscale/swscale.h>
#include <libavdevice/avdevice.h>
int av_dup_packet(AVPacket* pkt)
{
if (((pkt->destruct == av_destruct_packet_nofree) || (pkt->destruct == NULL)) && pkt->data) {
uint8_t* data; //定义数据栈上的数据指针
/* We duplicate the packet and don't forget to add the padding again. */
if ((unsigned)pkt->size > (unsigned)pkt->size + FF_INPUT_BUFFER_PADDING_SIZE)
return AVERROR(ENOMEM);
data = av_malloc(pkt->size + FF_INPUT_BUFFER_PADDING_SIZE); //申请内存
if (!data) {
return AVERROR(ENOMEM);
}
memcpy(data, pkt->data, pkt->size); //把共享的内存拷过去
memset(data + pkt->size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
pkt->data = data; // 重新设置pkt->data终于有自己的独立内存了,不用共享别的AVPacket的内存
pkt->destruct = av_destruct_packet; //设置析构函数指针
}
return 0;
}