以下解析基于fmpeg-6.0。
void avdevice_register_all(void)
{
avpriv_register_devices(outdev_list, indev_list);
}
从上面可以看出来,avdevice_register_all()通过avpriv_register_device注册所有输入输出列表上的设备。
其中,outdev_list如下:
static const FFOutputFormat * const outdev_list[] = {
&ff_alsa_muxer,
&ff_fbdev_muxer,
&ff_oss_muxer,
&ff_sdl2_muxer,
&ff_sndio_muxer,
&ff_v4l2_muxer,
&ff_xv_muxer,
NULL };
indev_list如下:
static const AVInputFormat * const indev_list[] = {
&ff_alsa_demuxer,
&ff_fbdev_demuxer,
&ff_lavfi_demuxer,
&ff_oss_demuxer,
&ff_sndio_demuxer,
&ff_v4l2_demuxer,
&ff_xcbgrab_demuxer,
NULL };
可见avpriv_register_device处理的是两个列表,一个是FFOutputormat列表,一个是AVInputFormat列表。下面看一下,具体如何做的,如下
void avpriv_register_devices(const FFOutputFormat * const o[], const AVInputFormat * const i[])
{
atomic_store_explicit(&outdev_list_intptr, (uintptr_t)o, memory_order_relaxed);
atomic_store_explicit(&indev_list_intptr, (uintptr_t)i, memory_order_relaxed);
}
其中的注册输入设备列表和输出设备列表的函数是宏定义函数,主要功能是将输入输出设备列表地址赋予静态变量outdev_list_intptr和indev_list_intptr。
uintptr_t是ISO C99定义的数据类型在stdint.h中,该类型长度始终和设备指针长度一致,故用于需要夸平台的指针和整数相互转换。
所以avdevice_register_all函数的主要功能是将输入输出format的指针赋值。