int av_open_input_stream(
AVFormatContext **ic_ptr, // 输出参数: 格式上下文
ByteIOContext *pb, // 字节IO上下文
const char *filename, // 文件名
AVInputFormat *fmt, // 输入的格式
AVFormatParameters *ap) // 格式参数, 调用时为NULL
{
int err;
AVFormatContext *ic;
AVFormatParameters default_ap;
// 使用缺省的格式参数
if(!ap){
ap=&default_ap;
memset(ap, 0, sizeof(default_ap));
}
if(!ap->prealloced_context)
ic = avformat_alloc_context(); // 分配格式上下文
else
ic = *ic_ptr;
if (!ic) {
err = AVERROR(ENOMEM);
goto fail;
}
// 初始化格式上下文
ic->iformat = fmt; // 格式
ic->pb = pb; // 字节IO上下文
ic->duration = AV_NOPTS_VALUE;
ic->start_time = AV_NOPTS_VALUE;
av_strlcpy(ic->filename, filename, sizeof(ic->filename)); // 文件名
/* 分配私有数据 */
if (fmt->priv_data_size > 0) {
ic->priv_data = av_mallocz(fmt->priv_data_size);
if (!ic->priv_data) {
err = AVERROR(ENOMEM);
goto fail;
}
} else {
ic->priv_data = NULL;
}
// 读首部
if (ic->iformat->read_header) {
err = ic->iformat->read_header(ic, ap);
if (err < 0)
goto fail;
}
// 获得数据偏移
if (pb && !ic->data_offset)
ic->data_offset = url_ftell(ic->pb);
#if LIBAVFORMAT_VERSION_MAJOR < 53
ff_metadata_demux_compat(ic);
#endif
// 原始的包缓冲剩余的大小
ic->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
// 输出参数: 格式上下文
*ic_ptr = ic;
return 0;
}
|