2015-02-28 18:12:25 +01:00
{ stdenv , fetchurl , pkgconfig , perl , texinfo , yasm
2015-05-28 13:39:10 +02:00
, alsaLib , bzip2 , fontconfig , freetype , gnutls , libiconv , lame , libass , libogg
2016-03-22 15:00:36 +01:00
, libtheora , libva , libvorbis , libvpx , lzma , libpulseaudio , soxr
2016-04-09 13:00:30 +02:00
, x264 , x265 , xvidcore , zlib , libopus
2015-04-07 09:34:27 +02:00
, openglSupport ? false , mesa ? null
# Build options
, runtimeCpuDetectBuild ? true # Detect CPU capabilities at runtime
2015-02-28 18:12:25 +01:00
, multithreadBuild ? true # Multithreading via pthreads/win32 threads
2017-04-23 03:46:23 +02:00
, sdlSupport ? ! stdenv . isArm , SDL ? null , SDL2 ? null
2016-03-22 15:00:36 +01:00
, vdpauSupport ? ! stdenv . isArm , libvdpau ? null
2015-04-07 09:34:27 +02:00
# Developer options
2015-02-28 18:12:25 +01:00
, debugDeveloper ? false
, optimizationsDeveloper ? true
2015-04-07 09:34:27 +02:00
, extraWarningsDeveloper ? false
2015-10-29 14:15:42 +01:00
# Darwin frameworks
2016-08-07 12:25:01 +02:00
, Cocoa , darwinFrameworks ? [ Cocoa ]
2015-04-07 09:34:27 +02:00
# Inherit generics
2016-05-17 00:58:15 +02:00
, branch , sha256 , version , patches ? [ ] , . . .
2015-02-28 18:12:25 +01:00
} :
/* M a i n t a i n e r n o t e s :
*
2015-04-07 09:34:27 +02:00
* THIS IS A MINIMAL BUILD OF FFMPEG , do not include dependencies unless
* a build that depends on ffmpeg requires them to be compiled into ffmpeg ,
* see ` ffmpeg-full' for an ffmpeg build with all features included .
2015-02-28 18:12:25 +01:00
*
2015-03-29 22:42:42 +02:00
* Need fixes to support Darwin :
2015-04-07 09:34:27 +02:00
* libvpx pulseaudio
2015-02-28 18:12:25 +01:00
*
* Known issues :
2015-04-07 09:34:27 +02:00
* 0 .6 - fails to compile ( unresolved ) ( so far , only disabling a number of
* features works , but that is not a feasible solution )
2015-02-28 18:12:25 +01:00
* 0 .6 .90 - mmx : compile errors ( fix : disable for 0 .6 . 9 0 - rc0 )
* 1 .1 - libsoxr : compile error ( fix : disable for 1 .1 )
2015-04-07 09:34:27 +02:00
* Support was initially added in 1 .1 before soxr api change , fix
* would probably be to add soxr-1 .0
2015-02-28 18:12:25 +01:00
* ALL - Cross-compiling will disable features not present on host OS
2015-04-07 09:34:27 +02:00
* ( e . g . dxva2 support [ DirectX ] will not be enabled unless natively
* compiled on Cygwin )
2015-02-28 18:12:25 +01:00
*
* /
let
2016-03-22 15:00:36 +01:00
inherit ( stdenv ) icCygwin isDarwin isFreeBSD isLinux isArm ;
2015-04-07 09:34:27 +02:00
inherit ( stdenv . lib ) optional optionals enableFeature ;
2015-02-28 18:12:25 +01:00
cmpVer = builtins . compareVersions ;
reqMin = requiredVersion : ( cmpVer requiredVersion branch != 1 ) ;
reqMatch = requiredVersion : ( cmpVer requiredVersion branch == 0 ) ;
2015-04-07 09:34:27 +02:00
ifMinVer = minVer : flag : if reqMin minVer then flag else null ;
2015-02-28 18:12:25 +01:00
# Version specific fix
verFix = withoutFix : fixVer : withFix : if reqMatch fixVer then withFix else withoutFix ;
2016-03-22 15:00:36 +01:00
# Disable dependency that needs fixes before it will work on Darwin or Arm
disDarwinOrArmFix = origArg : minVer : fixArg : if ( ( isDarwin || isArm ) && reqMin minVer ) then fixArg else origArg ;
2015-02-28 18:12:25 +01:00
in
2015-04-07 09:34:27 +02:00
assert openglSupport -> mesa != null ;
2015-02-28 18:12:25 +01:00
stdenv . mkDerivation rec {
name = " f f m p e g - ${ version } " ;
inherit version ;
src = fetchurl {
url = " h t t p s : / / w w w . f f m p e g . o r g / r e l e a s e s / ${ name } . t a r . b z 2 " ;
inherit sha256 ;
} ;
2016-05-17 00:58:15 +02:00
postPatch = '' p a t c h S h e b a n g s . '' ;
inherit patches ;
2015-02-28 18:12:25 +01:00
2016-08-29 02:30:01 +02:00
outputs = [ " b i n " " d e v " " o u t " ]
2015-10-11 16:34:23 +02:00
++ optional ( reqMin " 1 . 0 " ) " d o c " ; # just dev-doc
setOutputFlags = false ; # doesn't accept all and stores configureFlags in libs!
2015-02-28 18:12:25 +01:00
configureFlags = [
2015-04-07 09:34:27 +02:00
# License
" - - e n a b l e - g p l "
" - - e n a b l e - v e r s i o n 3 "
# Build flags
" - - e n a b l e - s h a r e d "
" - - d i s a b l e - s t a t i c "
( ifMinVer " 0 . 6 " " - - e n a b l e - p i c " )
( enableFeature runtimeCpuDetectBuild " r u n t i m e - c p u d e t e c t " )
" - - e n a b l e - h a r d c o d e d - t a b l e s "
( if multithreadBuild then (
if stdenv . isCygwin then
2015-02-28 18:12:25 +01:00
" - - d i s a b l e - p t h r e a d s - - e n a b l e - w 3 2 t h r e a d s "
else # Use POSIX threads by default
" - - e n a b l e - p t h r e a d s - - d i s a b l e - w 3 2 t h r e a d s " )
else
" - - d i s a b l e - p t h r e a d s - - d i s a b l e - w 3 2 t h r e a d s " )
2015-04-07 09:34:27 +02:00
( ifMinVer " 0 . 9 " " - - d i s a b l e - o s 2 t h r e a d s " ) # We don't support OS/2
2015-05-28 13:39:10 +02:00
" - - e n a b l e - n e t w o r k "
2015-04-07 09:34:27 +02:00
( ifMinVer " 2 . 4 " " - - e n a b l e - p i x e l u t i l s " )
# Executables
" - - e n a b l e - f f m p e g "
" - - d i s a b l e - f f p l a y "
( ifMinVer " 0 . 6 " " - - e n a b l e - f f p r o b e " )
" - - d i s a b l e - f f s e r v e r "
# Libraries
( ifMinVer " 0 . 6 " " - - e n a b l e - a v c o d e c " )
( ifMinVer " 0 . 6 " " - - e n a b l e - a v d e v i c e " )
" - - e n a b l e - a v f i l t e r "
( ifMinVer " 0 . 6 " " - - e n a b l e - a v f o r m a t " )
( ifMinVer " 1 . 0 " " - - e n a b l e - a v r e s a m p l e " )
( ifMinVer " 1 . 1 " " - - e n a b l e - a v u t i l " )
" - - e n a b l e - p o s t p r o c "
( ifMinVer " 0 . 9 " " - - e n a b l e - s w r e s a m p l e " )
" - - e n a b l e - s w s c a l e "
# Docs
( ifMinVer " 0 . 6 " " - - d i s a b l e - d o c " )
# External Libraries
" - - e n a b l e - b z l i b "
2015-05-28 13:39:10 +02:00
" - - e n a b l e - g n u t l s "
2015-04-07 09:34:27 +02:00
( ifMinVer " 1 . 0 " " - - e n a b l e - f o n t c o n f i g " )
( ifMinVer " 0 . 7 " " - - e n a b l e - l i b f r e e t y p e " )
" - - e n a b l e - l i b m p 3 l a m e "
( ifMinVer " 1 . 2 " " - - e n a b l e - i c o n v " )
" - - e n a b l e - l i b t h e o r a "
( ifMinVer " 0 . 6 " ( enableFeature ( isLinux || isFreeBSD ) " v a a p i " ) )
" - - e n a b l e - v d p a u "
" - - e n a b l e - l i b v o r b i s "
2016-03-22 15:00:36 +01:00
( disDarwinOrArmFix ( ifMinVer " 0 . 6 " " - - e n a b l e - l i b v p x " ) " 0 . 6 " " - - d i s a b l e - l i b v p x " )
2015-04-07 09:34:27 +02:00
( ifMinVer " 2 . 4 " " - - e n a b l e - l z m a " )
( ifMinVer " 2 . 2 " ( enableFeature openglSupport " o p e n g l " ) )
2016-03-22 15:00:36 +01:00
( disDarwinOrArmFix ( ifMinVer " 0 . 9 " " - - e n a b l e - l i b p u l s e " ) " 0 . 9 " " - - d i s a b l e - l i b p u l s e " )
2017-04-23 03:46:23 +02:00
( ifMinVer " 2 . 5 " ( if sdlSupport && reqMin " 3 . 2 " then " - - e n a b l e - s d l 2 " else if sdlSupport then " - - e n a b l e - s d l " else null ) ) # autodetected before 2.5, SDL1 support removed in 3.2 for SDL2
2015-04-07 09:34:27 +02:00
( ifMinVer " 1 . 2 " " - - e n a b l e - l i b s o x r " )
" - - e n a b l e - l i b x 2 6 4 "
" - - e n a b l e - l i b x v i d "
" - - e n a b l e - z l i b "
2016-03-26 15:01:22 +01:00
( ifMinVer " 2 . 8 " " - - e n a b l e - l i b o p u s " )
2016-04-09 13:00:30 +02:00
( ifMinVer " 2 . 8 " " - - e n a b l e - l i b x 2 6 5 " )
2015-04-07 09:34:27 +02:00
# Developer flags
( enableFeature debugDeveloper " d e b u g " )
( enableFeature optimizationsDeveloper " o p t i m i z a t i o n s " )
( enableFeature extraWarningsDeveloper " e x t r a - w a r n i n g s " )
" - - d i s a b l e - s t r i p p i n g "
2015-02-28 18:12:25 +01:00
# Disable mmx support for 0.6.90
2015-04-07 09:34:27 +02:00
( verFix null " 0 . 6 . 9 0 " " - - d i s a b l e - m m x " )
2015-05-11 23:37:53 +02:00
] ++ optional stdenv . cc . isClang " - - c c = c l a n g " ;
2015-02-28 18:12:25 +01:00
nativeBuildInputs = [ perl pkgconfig texinfo yasm ] ;
buildInputs = [
2015-05-28 13:39:10 +02:00
bzip2 fontconfig freetype gnutls libiconv lame libass libogg libtheora
2016-12-13 22:37:06 +01:00
libvdpau libvorbis lzma soxr x264 x265 xvidcore zlib libopus
2015-04-07 09:34:27 +02:00
] ++ optional openglSupport mesa
2016-03-22 15:00:36 +01:00
++ optionals ( ! isDarwin && ! isArm ) [ libvpx libpulseaudio ] # Need to be fixed on Darwin and ARM
++ optional ( ( isLinux || isFreeBSD ) && ! isArm ) libva
2015-10-29 14:15:42 +01:00
++ optional isLinux alsaLib
2016-08-07 12:25:01 +02:00
++ optionals isDarwin darwinFrameworks
2016-03-22 15:00:36 +01:00
++ optional vdpauSupport libvdpau
2017-04-23 03:46:23 +02:00
++ optional sdlSupport ( if reqMin " 3 . 2 " then SDL2 else SDL ) ;
2016-03-22 15:00:36 +01:00
2015-02-28 18:12:25 +01:00
enableParallelBuilding = true ;
2015-10-11 16:34:23 +02:00
postFixup = ''
2015-12-02 10:03:23 +01:00
moveToOutput bin " $ b i n "
moveToOutput share/ffmpeg/examples " $ d o c "
2015-10-11 16:34:23 +02:00
'' ;
2015-02-28 18:12:25 +01:00
/* C r o s s - c o m p i l a t i o n i s u n t e s t e d , c o n s i d e r t h i s a n o u t l i n e , m o r e w o r k
needs to be done to portions of the build to get it to work correctly * /
crossAttrs = let
os = ''
if [ " ${ stdenv . cross . config } " = " * c y g w i n * " ] ; then
# Probably should look for mingw too
echo " c y g w i n "
elif [ " ${ stdenv . cross . config } " = " * d a r w i n * " ] ; then
echo " d a r w i n "
elif [ " ${ stdenv . cross . config } " = " * f r e e b s d * " ] ; then
echo " f r e e b s d "
elif [ " ${ stdenv . cross . config } " = " * l i n u x * " ] ; then
echo " l i n u x "
elif [ " ${ stdenv . cross . config } " = " * n e t b s d * " ] ; then
echo " n e t b s d "
elif [ " ${ stdenv . cross . config } " = " * o p e n b s d * " ] ; then
echo " o p e n b s d "
fi
'' ;
in {
dontSetConfigureCross = true ;
configureFlags = configureFlags ++ [
" - - c r o s s - p r e f i x = ${ stdenv . cross . config } - "
" - - e n a b l e - c r o s s - c o m p i l e "
" - - t a r g e t _ o s = ${ os } "
" - - a r c h = ${ stdenv . cross . arch } "
] ;
} ;
2016-04-09 13:00:39 +02:00
installFlags = [ " i n s t a l l - m a n " ] ;
2015-02-28 18:12:25 +01:00
passthru = {
2016-03-22 15:00:36 +01:00
vaapiSupport = if reqMin " 0 . 6 " && ( ( isLinux || isFreeBSD ) && ! isArm ) then true else false ;
inherit vdpauSupport ;
2015-02-28 18:12:25 +01:00
} ;
2015-04-07 09:34:27 +02:00
meta = with stdenv . lib ; {
2015-02-28 18:12:25 +01:00
description = " A c o m p l e t e , c r o s s - p l a t f o r m s o l u t i o n t o r e c o r d , c o n v e r t a n d s t r e a m a u d i o a n d v i d e o " ;
homepage = http://www.ffmpeg.org/ ;
longDescription = ''
FFmpeg is the leading multimedia framework , able to decode , encode , transcode ,
mux , demux , stream , filter and play pretty much anything that humans and machines
have created . It supports the most obscure ancient formats up to the cutting edge .
No matter if they were designed by some standards committee , the community or
a corporation .
'' ;
2015-04-07 09:34:27 +02:00
license = licenses . gpl3 ;
2015-02-28 18:12:25 +01:00
platforms = platforms . all ;
maintainers = with maintainers ; [ codyopel fuuzetsu ] ;
inherit branch ;
} ;
}