avdevice_register_all()解析备忘

发布时间 2023-09-22 23:29:38作者: 远桥

以下解析基于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_intptrindev_list_intptr
uintptr_t是ISO C99定义的数据类型在stdint.h中,该类型长度始终和设备指针长度一致,故用于需要夸平台的指针和整数相互转换。
所以avdevice_register_all函数的主要功能是将输入输出format的指针赋值。