Analyse du code source FFMPEG av_register_all()

Lorsque nous utilisons la bibliothèque FFMPEG, le premier appel est av_register_all(). Que fait cette fonction et à quoi sert-elle ? Voici une analyse simple.

Cet article est basé sur l'apprentissage du blog de Lei Xiaohua. Pour plus de détails, veuillez passer au diagramme de structure du code source FFmpeg - encoding_ffmpeg source code structure_Lei Xiaohua's blog-CSDN blog

 Analyse et explication

av_register_all() appelle d'abord avcodec_register_all() pour enregistrer l'accélérateur matériel, l'encodeur/décodeur, l'analyseur, le filtre Bitstream, puis enregistre tous les démultiplexeurs et les protocoles de streaming pris en charge.

La structure d'appel av_register_all() est la suivante :


void av_register_all(void)
{
    static int initialized;
 
    //如果注册了,就直接返回,避免重复注册
    if (initialized)
        return;
    initialized = 1;
    //注册所有的codec
    avcodec_register_all();
    //注册所有的MUXER(复用器和解复用器)
    /* (de)muxers */
    REGISTER_MUXER    (A64, a64);
    REGISTER_DEMUXER  (AAC, aac);
    REGISTER_MUXDEMUX (AC3, ac3);
    ......
}

 La structure d'appel avcodec_register_all() est la suivante :


void avcodec_register_all(void)
{
    static int initialized;
 
    //如果注册了,就直接返回,避免重复注册
    if (initialized)
        return;
    initialized = 1;
 
    /* hardware accelerators */
    REGISTER_HWACCEL (H263_VAAPI, h263_vaapi);
    REGISTER_HWACCEL (H264_DXVA2, h264_dxva2);
    REGISTER_HWACCEL (H264_VAAPI, h264_vaapi);
    REGISTER_HWACCEL (H264_VDA, h264_vda);
    REGISTER_HWACCEL (MPEG1_VDPAU, mpeg1_vdpau);
    REGISTER_HWACCEL (MPEG2_DXVA2, mpeg2_dxva2);
    REGISTER_HWACCEL (MPEG2_VAAPI, mpeg2_vaapi);
    REGISTER_HWACCEL (MPEG2_VDPAU, mpeg2_vdpau);
    REGISTER_HWACCEL (MPEG4_VAAPI, mpeg4_vaapi);
    REGISTER_HWACCEL (VC1_DXVA2, vc1_dxva2);
    REGISTER_HWACCEL (VC1_VAAPI, vc1_vaapi);
    REGISTER_HWACCEL (WMV3_DXVA2, wmv3_dxva2);
    REGISTER_HWACCEL (WMV3_VAAPI, wmv3_vaapi);
 
    /* video codecs */
    REGISTER_ENCODER (A64MULTI, a64multi);
    REGISTER_ENCODER (A64MULTI5, a64multi5);
    REGISTER_DECODER (AASC, aasc);
    ......
}

Examinons la structure et la fonction spécifiques de la macro REGISTER_XXXX.

Prenons l'exemple du démultiplexage


#define REGISTER_DEMUXER(X,x) { \
    extern AVInputFormat ff_##x##_demuxer; \
    if(CONFIG_##X##_DEMUXER) av_register_input_format(&ff_##x##_demuxer); }

Le ## dans la définition n'est peut-être pas très courant, sa signification est d'épisser deux chaînes, telles que

#define Conn(x,y) x##y

exprimer

int n = Conn(123,456); Le résultat est n=123456;

Nous prenons REGISTER_DEMUXER (AAC, aac) comme exemple, alors cela équivaut à

extern AVInputFormat ff_aac_demuxer; 
if(CONFIG_AAC_DEMUXER) av_register_input_format(&ff_aac_demuxer);

L'utilisation de REGISTER_DEMUXER (AAC, aac) consiste à appeler la fonction av_register_input_format

/** head of registered input format linked list */
static AVInputFormat *first_iformat = NULL;

void av_register_input_format(AVInputFormat *format)
{
    AVInputFormat **p;
    p = &first_iformat;
    while (*p != NULL) p = &(*p)->next;
    *p = format;
    format->next = NULL;
}

Nous pouvons voir que first_iformat est la tête de la liste liée, cette fonction consiste à parcourir la liste liée, puis à ajouter la structure que nous avons transmise à la fin de la liste liée, c'est-à-dire que l'enregistrement est terminé, afin que nous puissions utiliser la structure enregistrée plus tard, comme un encodeur, etc. Toutes les inscriptions se font ainsi.

De cette façon, nous comprenons pourquoi nous devons d'abord appeler av_register_all(), et le principe d'implémentation interne.

Avis

av_register_all() et avcodec_register_all() sont des fonctions API publiques qui peuvent être appelées, et les autres fonctions ne sont utilisées qu'en interne par ffmpeg. Si vous avez seulement besoin de faire de l'encodage, vous pouvez appeler directement avcodec_register_all() au lieu d'appeler av_register_all(), mais généralement appelez simplement av_register_all() directement.

Guess you like

Origin blog.csdn.net/yunxiaobaobei/article/details/130124700