[FFmpeg-devel] Weird cross platform support in ffmpeg

Александр cool.ipatovo at gmail.com
Tue May 31 13:03:00 EEST 2022


I tried to build ffmpeg 4.4 library and link with it and I received
multiple unresolved references. I came across on unusual architecture in
ffmpeg for multiple platforms.The library has many places with code like
this:

void foo()
{
    // DO SOMETHING
    if (ARCH_MIPS) // maybe #if ARCH_MIPS (...) #endif should be used instead?
         foo_mips(...);
    if (ARCH_PPC)
        foo_ppc(c);
    if (ARCH_ARM)
         foo_arm(...);
    if (ARCH_AARCH64)
        foo_aarch64(...);
}

This code leads to linker errors because there is no any stub methods for
other platforms. I observed root MakeFile, it optionally includes platform
dependent code for each library (path like $(LIB_SUBDIR)/$(ARCH)/MakeFile)
where each foo_<arch> is defined.

So, how does it work? In my opinion preprocessor directive #if should be
used, otherwise we will receive unresolved reference on any platform. Maybe
I missed something? because this code appears frequently for example:

   1. utils.c : ff_yuv2rgb_init_tables_ppc
   2. swscale_unscaled.c : ff_get_unscaled_swscale_ppc,
   ff_get_unscaled_swscale_arm, ff_get_unscaled_swscale_aarch64
   3. cpu.c : ff_get_cpu_max_align_x86, ff_get_cpu_max_align_mips
   4. float_dsp.c : ff_float_dsp_init_aarch64, ff_float_dsp_init_ppc,
   ff_float_dsp_init_x86
   5. etc.


More information about the ffmpeg-devel mailing list