[Ffmpeg-devel] How to incorporate a subset of FFMPEG source in other projects?

Colin Ward lists
Fri Dec 2 04:48:06 CET 2005


Sven Over wrote:
> 

   [Snip]

> My question is, how to achieve this technically. I only need a small subset of 
> libavcodec/libavformat, namely the mpeg2video decoder and encoder, the mp2 
> audio decoder (maybe AC3 in the future), and the mpeg2 and mpeg2ts muxers. Is 
> there a good starting point to find out, what files I need include and to 
> modify? Maybe someone even has written some shell scripts to do the job.
> 
> If not, that's no problem, I will find out myself. But maybe someone has 
> already put some effort into this and has some good tips (or even scripts) 
> for me. (Or you can just point me to posts to this list in the mailing list 
> archive which covers this issue... like "RTFM" -> read the fine 
> mailinglist ;)

   I have put some effort into this.  I ported libav* to the PPC Amiga 
and it was *huge* - like about 7 or 8 MB!  So I cut it down to only 
support a few really popular formats such as MPEG, AVI, MOV and OGG and 
it was only 1.5 MB, which is much more acceptable.

   I did it the tedious way - I wrote a makefile that contained just the 
decoders that I needed for these formats and then tried to link my 
program.  When I got undefined symbols I added the extra .c files that 
were required and tried again.  I repeated this process for what seemed 
like hours until I got an executable.  It was tedious but it was better 
than linking in files that weren't needed - I am not sure of the 
granularity of the GNU linker but from some of the bloated files that it 
is generating on the Amiga I am fairly certain that if you link with a 
library then it will pull in the entire library rather than just the 
object files that it requires that are in the library.

   Anyway, two problems problem that I encountered that I would like to 
address and send in patches for are as follows:

   1) It is actually difficult to include a subset of containers and 
codecs because some functions are placed in incorrect files.  For 
example, let us say that codec "a" and codec "b" use a certain IDCT 
function and that you want to only include codec "a" in your project. 
You compile and link a.c but get an undefined reference to _idct.  So 
you have to include b.c as well, even though you are not using codec "b" 
because that is where the _idct function is defined.  So all of the 
functions in b.c get included in your executable because GNU ld doesn't 
do function level linking, and not only that, but one of the functions 
in b.c (that you are not even calling) now calls some file in codec "c" 
so you have to include c.c as well!  Then c.c wants d.c and so on!  Now 
if this hypothetical _idct funciton were moved into idct.c instead of 
being in b.c then the problem would be avoided.  A good example of this 
is an IDCT function that is in h264.c which I have to include even 
though I am not including h.264 support in my project.

   IIRC I have to include at least a dozen files in my project that 
shouldn't be included, just to access functions that should be elsewhere.

   2) You can't compile without USE_ENCODERS without having to hack 
certain files because certain encode() functions do not have #ifdef 
USE_ENCODERS around them.

   I have been meaning to look into these problems and submit some 
patches but have been too busy.  The FFMPEG maintainers can also be 
scary in their treatment of patches too.  ;-)  I should try to look into 
it soon.

/-------------------------------------------------------------------\
[Hitman/Code HQ - 6502/z80/68000/604e/80x86/ARM coder - Amiga rulez!]
[VZ-200/VIC-20/MZ-700/c16/c64*10/c128*8/Plus-4/CPC464/CD32/500*2    ]
[600/1000/1200*2/A4000/SNES/N64/Dreamcast/Athlon 1100/AmigaOne      ]
[Assembly Language: The most fun you can have with your clothes on! ]
\-------------------------------------------------------------------/





More information about the ffmpeg-devel mailing list