How to cross compile ffmpeg for iOS (iPhone and iPad)

In one of my latest projects I needed some audio/video streaming capabilities for iOS driven devices.

The first App. which we implemented was a audio/HDVideo low latency conference streaming application for smart phones.

The second app was around  MPEGTS to Elementary Stream demuxer for some dreambox streaming fun 🙂

The framework of choice is the swiss army knife for streaming stuff,.. ffmpeg. To be more precise, ffmpeg consists of serveral libraries and the command line programs ffmpeg, ffplay, ffprobe.

What do you need:

  • Xcode4.3
  • Apple’s command line tools (Xcode -> Preferences -> Components)
  • pkg-config -> download
  • gas-preprocessor -> download (extract under your ffmpeg root dir ./gas-preprocessor)
  • build-essentials -> you can download an install script
  • m4
  • autoconf
  • automake
  • libtool

I used the latest snapshot available at the the time of writing. Extract the snapshot .tar to a folder of our choice.

Thanks Michael, the lead developer of ffmpeg, the ffmpeg source comes with the convenient autotools facilities. So we only need to set the correct configure flags 🙂

1. Compiler flags:

As we need to do some cross-compiling we need to select the compiler/assembler which comes with our XCode

–cc=’/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin10-llvm-gcc-4.2′.

–as=’./gas-preprocessor/gas-preprocessor.pl /applications/xcode.app/contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin10-gcc-4.2′

–arch=arm

–target-os=darwin

–cpu=cortex-a8

–enable-pic

–disable-yasm

2. iOs SDK path:

–sysroot=’/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk’

3. extra flags:

–extra-cflags=’-mfpu=neon -pipe -Os -gdwarf-2 -miphoneos-version-min=5.0′

–extra-ldflags=’-arch armv7 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk -miphoneos-version-min=5.0′

4. configure ffmpeg library components:

for example:

 –disable-ffmpeg
–disable-ffplay
–disable-ffprobe
–disable-ffserver
–disable-avdevice
–disable-avfilter
–disable-everything

and then enable the components you need

–enable-decoder=xxx
–enable-parser=xxx
–enable-demuxer=xxx

after successful completion of ./configure run make… and voilà 🙂

If you get some errors complaining about  “error: invalid operand in inline asm: ” try to disable assembler directives with

–diasble-asm

have fun

Mario

 

iPhone4 slack joint microphone quickfix

One of my colleagues, Marvin – proud owner of an iPhone4, has been fighting for some weeks with his iPhone internal microphone. Skype and Facetime stuff are working without problems but on “Radio” calls he got unsuspected mutes. The issue occurs in not deterministic intervals.

First aid,… yeahhh we have to open the phone, … operation on the open heart :-).

The problem must be the bottom mic. So we disassembled the bottom part of the phone.

No fancy actions here,… one two three screws open, some lever actions to loosen the glue stuff and voilà it’s open.

If it were up to me I would eliminate the apple hardware and build in a Galaxy S hardware, but marvin was dead set against it,… I don’t know why 🙂

Update” :

We initial thought that the bottom microphone was causing the problem. It turns out we were wrong 🙂

After 3 days without mic. problems I would say the problem is the grounding screw left next to the upper microphone. The conductivity pad on the print is very small and it seems that slight corrosion which results in an increased transition resistance to GND causes the mic problem. 🙂

Have fun!

Mario