ffmpeg分析系列之四(探測(cè)輸入的格式)
調(diào)用av_open_input_file(&pFormatCtx, is->filename, NULL, 0, NULL)函數(shù)打開輸入的文件.
1. 分析一下函數(shù)原型:
int av_open_input_file(AVFormatContext **ic_ptr, // 輸出參數(shù): 格式上下文
const char *filename, // 文件名
AVInputFormat *fmt, // 輸入的格式, 為NULL, 即未知
int buf_size, // 緩沖的大小, 為0
AVFormatParameters *ap); // 格式的參數(shù), 為NULL
2. 初始化探測(cè)數(shù)據(jù):
AVProbeData probe_data, *pd = &probe_data;
pd->filename = "";
if (filename)
pd->filename = filename;
pd->buf = NULL;
pd->buf_size = 0;
3. 探測(cè)輸入的格式:
if (!fmt) { // fmt == NULL, 成立
fmt = av_probe_input_format(pd, 0);
}
進(jìn)入av_probe_input_format函數(shù):
AVInputFormat *av_probe_input_format(AVProbeData *pd, int is_opened) {
int score=0;
return av_probe_input_format2(pd, is_opened, &score);
}
進(jìn)入av_probe_input_format2函數(shù):
AVInputFormat *av_probe_input_format2(AVProbeData *pd, int is_opened, int *score_max)
{
AVInputFormat *fmt1, *fmt;
int score;
fmt = NULL;
for(fmt1 = first_iformat; fmt1 != NULL; fmt1 = fmt1->next) {
if (!is_opened == !(fmt1->flags & AVFMT_NOFILE)) // is_opened == 0, fmt1->flags 沒有設(shè)置 AVFMT_NOFILE 標(biāo)志時(shí)成立
continue;
/* 省略部分代碼 */
}
見libavformat/raw.c文件:
AVInputFormat h264_demuxer = {
"h264",
NULL_IF_CONFIG_SMALL("raw H.264 video format"),
0,
h264_probe,
video_read_header,
ff_raw_read_partial_packet,
.flags= AVFMT_GENERIC_INDEX,
.extensions = "h26l,h264,264", //FIXME remove after writing mpeg4_probe
.value = CODEC_ID_H264,
};
由于 h264_demuxer.flags == AVFMT_GENERIC_INDEX, 所以上面成立, continue, 返回的 AVInputFormat 指針為 NULL, 探測(cè)不成功.
posted on 2012-12-14 01:32 Khan 閱讀(1617) 評(píng)論(0) 編輯 收藏 引用 所屬分類: GCC/G++ 、跨平臺(tái)開發(fā) 、周邊技術(shù)

