您的位置:首页 > 其它

ffmpeg开发 av_init_packet()和av_new_packet()

2014-01-01 14:37 399 查看
说明几点:

1. AVPacket中的buf, 是AVBufferBuf结构体,这个结构体是个单链表, 只有data和size两个元素, 分别指向的是AVPacket中的data和size

void av_init_packet(AVPacket *pkt)
{
pkt->pts                  = AV_NOPTS_VALUE;
pkt->dts                  = AV_NOPTS_VALUE;
pkt->pos                  = -1;
pkt->duration             = 0;
pkt->convergence_duration = 0;
pkt->flags                = 0;
pkt->stream_index         = 0;
#if FF_API_DESTRUCT_PACKET
pkt->destruct             = NULL;
#endif
pkt->buf                  = NULL; // 数据域没有, 为空
pkt->side_data            = NULL;
pkt->side_data_elems      = 0;
}

int av_new_packet(AVPacket *pkt, int size)
{
AVBufferRef *buf = NULL;
//判断size是否正确
if ((unsigned)size >= (unsigned)size + FF_INPUT_BUFFER_PADDING_SIZE)
return AVERROR(EINVAL);
//分配size大小
av_buffer_realloc(&buf, size + FF_INPUT_BUFFER_PADDING_SIZE);
if (!buf)
return AVERROR(ENOMEM);

memset(buf->data + size, 0, FF_INPUT_BUFFER_PADDING_SIZE);

av_init_packet(pkt);
pkt->buf      = buf;
pkt->data     = buf->data; //data域大小
pkt->size     = size;
#if FF_API_DESTRUCT_PACKET
pkt->destruct = dummy_destruct_packet;
#endif

return 0;
}


/* Makes duplicates of data, side_data, but does not copy any other fields */
//只复制数据域
static int copy_packet_data(AVPacket *pkt, AVPacket *src, int dup)
{
pkt->data      = NULL;
pkt->side_data = NULL;
if (pkt->buf) {
AVBufferRef *ref = av_buffer_ref(src->buf);
if (!ref)
return AVERROR(ENOMEM);
pkt->buf  = ref;
pkt->data = ref->data;
} else {
DUP_DATA(pkt->data, src->data, pkt->size, 1, ALLOC_BUF);
}
#if FF_API_DESTRUCT_PACKET
pkt->destruct = dummy_destruct_packet;
#endif
if (pkt->side_data_elems && dup)
pkt->side_data = src->side_data;
if (pkt->side_data_elems && !dup) {
return av_copy_packet_side_data(pkt, src);
}
return 0;

failed_alloc:
av_destruct_packet(pkt);
return AVERROR(ENOMEM);
}
int av_copy_packet_side_data(AVPacket *pkt, AVPacket *src);
源代码中还有一系列不常用的packet操作
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: