// 注册硬件加速器 |
#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)
//以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);