// 註冊硬件加速器 |
#define REGISTER_HWACCEL(X,x) { \ |
以MPEG2VEDIO的解碼器註冊爲例來說明:#define REGISTER_DECODER(MPEG2VEDIO,mpeg2video) { \
extern AVCodecmpeg2video_decoder; \
if(CONFIG_MPEG2VEDIO_DECODER) avcodec_register(&mpeg2video_decoder); }
調用:void avcodec_register(AVCodec*codec)
{
AVCodec **p;
avcodec_init();
p = &first_avcodec; //初始化公共變量first_avcodec
while(*p != NULL) p = &(*p)->next;
*p = codec;
codec->next = NULL;
}
此處就會將mpeg2video_decoder註冊到first_iformat結構體鏈表中,
mpeg2video_decoder結構體在Mpeg12.c中定義。
AVCodec mpegvideo_decoder = { "mpegvideo", CODEC_TYPE_VIDEO, CODEC_ID_MPEG2VIDEO, sizeof(Mpeg1Context), mpeg_decode_init, NULL, mpeg_decode_end, mpeg_decode_frame, CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 | CODEC_CAP_TRUNCATED | CODEC_CAP_DELAY, .flush= ff_mpeg_flush, .long_name= NULL_IF_CONFIG_SMALL("MPEG-1 video"), }; |
void avcodec_register(AVCodec *codec) |
void avcodec_init(void) |
av_cold void dsputil_static_init(void) |
// 註冊分離器和混合器 |
#define REGISTER_MUXER(X,x) { \ |
av_register_input_format (AVInputFormat *format)
{
AVInputFormat **p;
p = &first_iformat; //初始化公共變量first_iformat,這裏包含了輸入流的格式
while (*p != NULL) p = &(*p)->next;
*p = format;
format->next = NULL;
}
voidav_register_output_format(AVOutputFormat *format)
{
AVOutputFormat **p;
p = &first_oformat; //初始化公共變量first_oformat,這裏包含了輸出流的格式
while (*p != NULL) p = &(*p)->next;
*p = format;
format->next = NULL;
}
int av_register_protocol(URLProtocol *protocol){
URLProtocol **p;
p = &first_protocol;
while (*p != NULL) p = &(*p)->next;
*p = protocol;
protocol->next = NULL;
return 0;
}
//以mpegts流爲例,x_demuxer將會被mpegts_demux所代替。而mpegts_demux爲一個AVInputFormat結構體,其定義在mpegts.c中。
AVInputFormat mpegts_demuxer = { "mpegts", NULL_IF_CONFIG_SMALL("MPEG-2 transport stream format"), sizeof(MpegTSContext), mpegts_probe, mpegts_read_header, mpegts_read_packet, mpegts_read_close, read_seek, mpegts_get_pcr, .flags = AVFMT_SHOW_IDS|AVFMT_TS_DISCONT, }; |
此處的註冊會將使所有的複用和解複用註冊到first_iformat鏈表當中。
first_avcodec:全局的變量,將所有的編解碼器鏈接成一個鏈表:REGISTER_ENCODER(X,x) + REGISTER_DECODER ---> avcodec_register();
first_iformat:全局的變量,將所有的解複用鏈接一個鏈表 REGISTER_MUXER(X,x) ---> av_register_input_format()
first_oformat:全局的變量,將所以的複用鏈接成一個鏈表 。 REGISTER_MUXER(X,x) ----> av_register_output_format()
first_protocol:全局的變量,將所有支持的協議鏈接成鏈表。 REGISTER_PROTOCOL(X,x) ----> av_register_protocol
ffmpeg支持協議: file , Gopher , HTTP , PIPE, RTP , TCP , UDP.定義在 Allformats.c中:
REGISTER_PROTOCOL (FILE, file);
REGISTER_PROTOCOL (GOPHER, gopher);
REGISTER_PROTOCOL (HTTP, http);
REGISTER_PROTOCOL (PIPE, pipe);
REGISTER_PROTOCOL (RTP, rtp);
REGISTER_PROTOCOL (TCP, tcp);
REGISTER_PROTOCOL (UDP, udp);