Recherche avancée

Médias (1)

Mot : - Tags -/intégration

Autres articles (96)

  • MediaSPIP 0.1 Beta version

    25 avril 2011, par

    MediaSPIP 0.1 beta is the first version of MediaSPIP proclaimed as "usable".
    The zip file provided here only contains the sources of MediaSPIP in its standalone version.
    To get a working installation, you must manually install all-software dependencies on the server.
    If you want to use this archive for an installation in "farm mode", you will also need to proceed to other manual (...)

  • Multilang : améliorer l’interface pour les blocs multilingues

    18 février 2011, par

    Multilang est un plugin supplémentaire qui n’est pas activé par défaut lors de l’initialisation de MediaSPIP.
    Après son activation, une préconfiguration est mise en place automatiquement par MediaSPIP init permettant à la nouvelle fonctionnalité d’être automatiquement opérationnelle. Il n’est donc pas obligatoire de passer par une étape de configuration pour cela.

  • HTML5 audio and video support

    13 avril 2011, par

    MediaSPIP uses HTML5 video and audio tags to play multimedia files, taking advantage of the latest W3C innovations supported by modern browsers.
    The MediaSPIP player used has been created specifically for MediaSPIP and can be easily adapted to fit in with a specific theme.
    For older browsers the Flowplayer flash fallback is used.
    MediaSPIP allows for media playback on major mobile platforms with the above (...)

Sur d’autres sites (12453)

  • ffmpeg error trying to create mpeg video

    18 juin 2012, par Eamonn McEvoy

    I am having trouble creating mpeg files, I have 2 bitmaps (2592*2160 32bit). I am trying to combine them into an mpeg file but I cant get it to work, the command I have tried is :

    ffmpeg -i %d.bmp -b:v 99.99M -r 1 -s 2592x2160 vid.mpg

    the output is

    ffmpeg -i %d.bmp -b:v 99.99M -r 1 -s 2592x2160  vid.mpg
    ffmpeg version N-41416-g718607b Copyright (c) 2000-2012 the FFmpeg developers
     built on Jun  8 2012 12:46:19 with gcc 4.6.3
     configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-ru
    ntime-cpudetect --enable-avisynth --enable-bzlib --enable-frei0r --enable-libass
    --enable-libcelt --enable-libopencore-amrnb --enable-libopencore-amrwb --enable
    -libfreetype --enable-libgsm --enable-libmp3lame --enable-libnut --enable-libope
    njpeg --enable-librtmp --enable-libschroedinger --enable-libspeex --enable-libth
    eora --enable-libutvideo --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-
    libvorbis --enable-libvpx --ena  libavutil      51. 56.100 / 51. 56.100
     libavcodec     54. 25.100 / 54. 25.100
     libavformat    54.  6.101 / 54.  6.101
     libavdevice    54.  0.100 / 54.  0.100
     libavfilter     2. 78.101 /  2. 78.101
     libswscale      2.  1.100 /  2.  1.100
     libswresample   0. 15.100 /  0. 15.100
     libpostproc    52.  0.100 / 52.  0.100
    [image2 @ 01e6be40] Stream #0: not enough frames to estimate rate; consider incr
    easing probesize
    Input #0, image2, from '%d.bmp':
     Duration: 00:00:00.08, start: 0.000000, bitrate: N/A
       Stream #0:0: Video: bmp, pal8, 2592x2160, 25 tbr, 25 tbn, 25 tbc
    File 'vid.mpg' already exists. Overwrite ? [y/N] y
    w:2592 h:2160 pixfmt:pal8 tb:1/25 sar:0/1 sws_param:flags=2
    [ffmpeg_buffersink @ 02bb3ce0] No opaque field provided
    [scale @ 02bb3f20] w:2592 h:2160 fmt:pal8 sar:0/1 -> w:2592 h:2160 fmt:yuv420p s
    ar:0/1 flags:0x4
    [mpeg1video @ 02b864a0] bitrate tolerance too small for bitrate
    Output #0, mpeg, to 'vid.mpg':
       Stream #0:0: Video: mpeg1video, yuv420p, 2592x2160, q=2-31, 99990 kb/s, 90k
    tbn, 5 tbc
    Stream mapping:
     Stream #0:0 -> #0:0 (bmp -> mpeg1video)
    Error while opening encoder for output stream #0:0 - maybe incorrect parameters
    such as bit_rate, rate, width or height

    If I leave out the -r parameter (ffmpeg -i %d.bmp -b:v 99.99M -s 2592x2160 vid.mpg) the output changes to :

    [mpeg @ 02f80120] buffer underflow i=0 bufi=749380 size=950639
    [mpeg @ 02f80120] buffer underflow i=0 bufi=751421 size=950639
    [mpeg @ 02f80120] packet too large, ignoring buffer limits to mux it
    [mpeg @ 02f80120] buffer underflow i=0 bufi=751421 size=950639
    [mpeg @ 02f80120] buffer underflow i=0 bufi=753462 size=950639
    [mpeg @ 02f80120] packet too large, ignoring buffer limits to mux it
    [mpeg @ 02f80120] buffer underflow i=0 bufi=753462 size=950639
    [mpeg @ 02f80120] buffer underflow i=0 bufi=755503 size=950639
    ...

    what am I doing wrong ?

  • Limitations of ffmpeg ?

    7 février 2016, par Eamonn McEvoy

    I am trying to convert an avi file to mpeg, but ffmpeg is giving me these error messages, ’buffer underflow’ and ’packet too large’

    The command I am using is :

    ffmpeg -I input.avi -s 2592x2160 -b 1200 output.mpg

    1. Dimensions of video - are there any limitations ?

      I have noticed that if I take a video with smaller dimensions it seems to work ok, Is there any way to accommodate files with large dimensions like this ?

    2. Frame rate - can ffmpeg pad out videos ?

      I also have issues with certain frame rates, the error message tells me that only certain frame rates are supported by the mpeg1 format, can I get ffmpeg to pad out my avi file to account for this ?

    3. File size - are there any limitations on the max file size that can be converted ?

    Thanks,
    Eamonn

    OUTPUT

    ffmpeg -i neoAvi.avi -s 2592x2160 -b 1200k neoMpg.mpg
    ffmpeg version N-41416-g718607b Copyright (c) 2000-2012 the FFmpeg developers
     built on Jun  8 2012 12:46:19 with gcc 4.6.3
     configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-ru
    ntime-cpudetect --enable-avisynth --enable-bzlib --enable-frei0r --enable-libass
    --enable-libcelt --enable-libopencore-amrnb --enable-libopencore-amrwb --enable
    -libfreetype --enable-libgsm --enable-libmp3lame --enable-libnut --enable-libope
    njpeg --enable-librtmp --enable-libschroedinger --enable-libspeex --enable-libth
    eora --enable-libutvideo --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-
    libvorbis --enable-libvpx --ena  libavutil      51. 56.100 / 51. 56.100
     libavcodec     54. 25.100 / 54. 25.100
     libavformat    54.  6.101 / 54.  6.101
     libavdevice    54.  0.100 / 54.  0.100
     libavfilter     2. 78.101 /  2. 78.101
     libswscale      2.  1.100 /  2.  1.100
     libswresample   0. 15.100 /  0. 15.100
     libpostproc    52.  0.100 / 52.  0.100
    [avi @ 01d2be20] Something went wrong during header parsing, I will ignore it an
    d try to continue anyway.
    [avi @ 01d2be20] Stream #0: not enough frames to estimate rate; consider increas
    ing probesize
    [avi @ 01d2be20] Stream #1: not enough frames to estimate rate; consider increas
    ing probesize
    [avi @ 01d2be20] Could not find codec parameters (Subtitle: none)
    Input #0, avi, from 'neoAvi.avi':
     Duration: 00:00:01.49, start: 0.000000, bitrate: 1493071 kb/s
       Stream #0:0: Video: rawvideo, pal8, 2592x2160, 33.33 tbr, 33.33 tbn, 33.33 t
    bc
       Stream #0:1: Subtitle: none
    Please use -b:a or -b:v, -b is ambiguous
    File 'neoMpg.mpg' already exists. Overwrite ? [y/N] y
    [mpeg @ 02ba71a0] packet too large, ignoring buffer limits to mux it
    [mpeg @ 02ba71a0] buffer underflow i=0 bufi=921414 size=946200
    [mpeg @ 02ba71a0] buffer underflow i=0 bufi=923455 size=946200
    [mpeg @ 02ba71a0] packet too large, ignoring buffer limits to mux it
    [mpeg @ 02ba71a0] buffer underflow i=0 bufi=923455 size=946200
    [mpeg @ 02ba71a0] buffer underflow i=0 bufi=925496 size=946200
    [mpeg @ 02ba71a0] packet too large, ignoring buffer limits to mux it
    [mpeg @ 02ba71a0] buffer underflow i=0 bufi=925496 size=946200
    [mpeg @ 02ba71a0] buffer underflow i=0 bufi=927537 size=946200
    ...
    [mpeg @ 02ba71a0] packet too large, ignoring buffer limits to mux it
    [mpeg @ 02ba71a0] buffer underflow i=0 bufi=921414 size=946200
    [mpeg @ 02ba71a0] buffer underflow i=0 bufi=923455 size=946200
    [mpeg @ 02ba71a0] packet too large, ignoring buffer limits to mux it
    [mpeg @ 02ba71a0] buffer underflow i=0 bufi=923455 size=946200
    [mpeg @ 02ba71a0] buffer underflow i=0 bufi=925496 size=946200
    [mpeg @ 02ba71a0] packet too large, ignoring buffer limits to mux it
    [mpeg @ 02ba71a0] buffer underflow i=0 bufi=925496 size=946200
    [mpeg @ 02ba71a0] buffer underflow i=0 bufi=927537 size=946200
    frame=    4 fps=3.2 q=5.5 size=    1380kB time=00:00:00.06 bitrate=169573.6kbits
    frame=   13 fps=7.3 q=29.1 size=    1604kB time=00:00:00.36 bitrate=35836.2kbits
    frame=   22 fps=9.5 q=31.0 size=    2100kB time=00:00:00.66 bitrate=25804.8kbits
    frame=   31 fps= 11 q=31.0 size=    2490kB time=00:00:00.96 bitrate=21101.5kbits
    frame=   40 fps= 12 q=31.0 size=    3010kB time=00:00:01.26 bitrate=19466.8kbits
    frame=   47 fps= 12 q=31.0 Lsize=    3128kB time=00:00:01.53 bitrate=16711.7kbit
    s/s dup=0 drop=3
    video:3116kB audio:0kB global headers:0kB muxing overhead 0.372684%
  • FFMPEG build on Windows using MSVC - make fails

    28 août 2024, par Maya Sela

    I am trying to build FFMPEG on Windows with MSVC. I am following this guide.
    
I have managed to setup the environment in order to configure successfully, but make doesn't work.
    
From VS2013 x64 Native Tools Command Prompt I run

    


    msys2_shell.cmd -use-full-path


    


    and from msys2_shell.cmd I go to the ffmpeg folder and run

    


    mingw32-make


    


    which outputs :

    


    awk: cmd. line:1:                                                                                                        ^ syntax error
awk: cmd. line:1: /including/ { sub(/^.*file: */, ""); gsub(/\/, "/"); if (!match($0, / /)) print "libavdevice/alldevices.o:", $0 }
awk: cmd. line:1:                                                                                                           ^ unterminated string
ffbuild/common.mak:67: recipe for target 'libavdevice/alldevices.o' failed
mingw32-make: *** [libavdevice/alldevices.o] Error 1


    


    Some more info :

    


    $ mingw32-make --version
GNU Make 3.82.90
Built for i686-pc-mingw32
Copyright (C) 1988-2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later /gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.


    


    FFMPEG snapshot version N-100459-ga7f9b3b
    
The Makefile :

    


    MAIN_MAKEFILE=1
include ffbuild/config.mak

vpath %.c    $(SRC_PATH)
vpath %.cpp  $(SRC_PATH)
vpath %.h    $(SRC_PATH)
vpath %.inc  $(SRC_PATH)
vpath %.m    $(SRC_PATH)
vpath %.S    $(SRC_PATH)
vpath %.asm  $(SRC_PATH)
vpath %.rc   $(SRC_PATH)
vpath %.v    $(SRC_PATH)
vpath %.texi $(SRC_PATH)
vpath %.cu   $(SRC_PATH)
vpath %.ptx  $(SRC_PATH)
vpath %/fate_config.sh.template $(SRC_PATH)

TESTTOOLS   = audiogen videogen rotozoom tiny_psnr tiny_ssim base64 audiomatch
HOSTPROGS  := $(TESTTOOLS:%=tests/%) doc/print_options

# $(FFLIBS-yes) needs to be in linking order
FFLIBS-$(CONFIG_AVDEVICE)   += avdevice
FFLIBS-$(CONFIG_AVFILTER)   += avfilter
FFLIBS-$(CONFIG_AVFORMAT)   += avformat
FFLIBS-$(CONFIG_AVCODEC)    += avcodec
FFLIBS-$(CONFIG_AVRESAMPLE) += avresample
FFLIBS-$(CONFIG_POSTPROC)   += postproc
FFLIBS-$(CONFIG_SWRESAMPLE) += swresample
FFLIBS-$(CONFIG_SWSCALE)    += swscale

FFLIBS := avutil

DATA_FILES := $(wildcard $(SRC_PATH)/presets/*.ffpreset) $(SRC_PATH)/doc/ffprobe.xsd

SKIPHEADERS = compat/w32pthreads.h

# first so "all" becomes default target
all: all-yes

include $(SRC_PATH)/tools/Makefile
include $(SRC_PATH)/ffbuild/common.mak

FF_EXTRALIBS := $(FFEXTRALIBS)
FF_DEP_LIBS  := $(DEP_LIBS)
FF_STATIC_DEP_LIBS := $(STATIC_DEP_LIBS)

$(TOOLS): %$(EXESUF): %.o
    $(LD) $(LDFLAGS) $(LDEXEFLAGS) $(LD_O) $^ $(EXTRALIBS-$(*F)) $(EXTRALIBS) $(ELIBS)

target_dec_%_fuzzer$(EXESUF): target_dec_%_fuzzer.o $(FF_DEP_LIBS)
    $(LD) $(LDFLAGS) $(LDEXEFLAGS) $(LD_O) $^ $(ELIBS) $(FF_EXTRALIBS) $(LIBFUZZER_PATH)

tools/target_bsf_%_fuzzer$(EXESUF): tools/target_bsf_%_fuzzer.o $(FF_DEP_LIBS)
    $(LD) $(LDFLAGS) $(LDEXEFLAGS) $(LD_O) $^ $(ELIBS) $(FF_EXTRALIBS) $(LIBFUZZER_PATH)

target_dem_%_fuzzer$(EXESUF): target_dem_%_fuzzer.o $(FF_DEP_LIBS)
    $(LD) $(LDFLAGS) $(LDEXEFLAGS) $(LD_O) $^ $(ELIBS) $(FF_EXTRALIBS) $(LIBFUZZER_PATH)

tools/target_dem_fuzzer$(EXESUF): tools/target_dem_fuzzer.o $(FF_DEP_LIBS)
    $(LD) $(LDFLAGS) $(LDEXEFLAGS) $(LD_O) $^ $(ELIBS) $(FF_EXTRALIBS) $(LIBFUZZER_PATH)

tools/target_io_dem_fuzzer$(EXESUF): tools/target_io_dem_fuzzer.o $(FF_DEP_LIBS)
    $(LD) $(LDFLAGS) $(LDEXEFLAGS) $(LD_O) $^ $(ELIBS) $(FF_EXTRALIBS) $(LIBFUZZER_PATH)


tools/enum_options$(EXESUF): ELIBS = $(FF_EXTRALIBS)
tools/enum_options$(EXESUF): $(FF_DEP_LIBS)
tools/sofa2wavs$(EXESUF): ELIBS = $(FF_EXTRALIBS)
tools/uncoded_frame$(EXESUF): $(FF_DEP_LIBS)
tools/uncoded_frame$(EXESUF): ELIBS = $(FF_EXTRALIBS)
tools/target_dec_%_fuzzer$(EXESUF): $(FF_DEP_LIBS)
tools/target_dem_%_fuzzer$(EXESUF): $(FF_DEP_LIBS)

CONFIGURABLE_COMPONENTS =                                           \
    $(wildcard $(FFLIBS:%=$(SRC_PATH)/lib%/all*.c))                 \
    $(SRC_PATH)/libavcodec/bitstream_filters.c                      \
    $(SRC_PATH)/libavcodec/parsers.c                                \
    $(SRC_PATH)/libavformat/protocols.c                             \

config.h: ffbuild/.config
ffbuild/.config: $(CONFIGURABLE_COMPONENTS)
    @-tput bold 2>/dev/null
    @-printf '\nWARNING: $(?) newer than config.h, rerun configure\n\n'
    @-tput sgr0 2>/dev/null

SUBDIR_VARS := CLEANFILES FFLIBS HOSTPROGS TESTPROGS TOOLS               \
               HEADERS ARCH_HEADERS BUILT_HEADERS SKIPHEADERS            \
               ARMV5TE-OBJS ARMV6-OBJS ARMV8-OBJS VFP-OBJS NEON-OBJS     \
               ALTIVEC-OBJS VSX-OBJS MMX-OBJS X86ASM-OBJS                \
               MIPSFPU-OBJS MIPSDSPR2-OBJS MIPSDSP-OBJS MSA-OBJS         \
               MMI-OBJS OBJS SLIBOBJS HOSTOBJS TESTOBJS

define RESET
$(1) :=
$(1)-yes :=
endef

define DOSUBDIR
$(foreach V,$(SUBDIR_VARS),$(eval $(call RESET,$(V))))
SUBDIR := $(1)/
include $(SRC_PATH)/$(1)/Makefile
-include $(SRC_PATH)/$(1)/$(ARCH)/Makefile
-include $(SRC_PATH)/$(1)/$(INTRINSICS)/Makefile
include $(SRC_PATH)/ffbuild/library.mak
endef

$(foreach D,$(FFLIBS),$(eval $(call DOSUBDIR,lib$(D))))

include $(SRC_PATH)/fftools/Makefile
include $(SRC_PATH)/doc/Makefile
include $(SRC_PATH)/doc/examples/Makefile

libavcodec/utils.o libavformat/utils.o libavdevice/avdevice.o libavfilter/avfilter.o libavutil/utils.o libpostproc/postprocess.o libswresample/swresample.o libswscale/utils.o : libavutil/ffversion.h

$(PROGS): %$(PROGSSUF)$(EXESUF): %$(PROGSSUF)_g$(EXESUF)
ifeq ($(STRIPTYPE),direct)
    $(STRIP) -o $@ $<
else
    $(CP) $< $@
    $(STRIP) $@
endif

%$(PROGSSUF)_g$(EXESUF): $(FF_DEP_LIBS)
    $(LD) $(LDFLAGS) $(LDEXEFLAGS) $(LD_O) $(OBJS-$*) $(FF_EXTRALIBS)

VERSION_SH  = $(SRC_PATH)/ffbuild/version.sh
GIT_LOG     = $(SRC_PATH)/.git/logs/HEAD

.version: $(wildcard $(GIT_LOG)) $(VERSION_SH) ffbuild/config.mak
.version: M=@

libavutil/ffversion.h .version:
    $(M)$(VERSION_SH) $(SRC_PATH) libavutil/ffversion.h $(EXTRA_VERSION)
    $(Q)touch .version

# force version.sh to run whenever version might have changed
-include .version

install: install-libs install-headers

install-libs: install-libs-yes

install-data: $(DATA_FILES)
    $(Q)mkdir -p "$(DATADIR)"
    $(INSTALL) -m 644 $(DATA_FILES) "$(DATADIR)"

uninstall: uninstall-data uninstall-headers uninstall-libs uninstall-pkgconfig

uninstall-data:
    $(RM) -r "$(DATADIR)"

clean::
    $(RM) $(CLEANSUFFIXES)
    $(RM) $(addprefix compat/,$(CLEANSUFFIXES)) $(addprefix compat/*/,$(CLEANSUFFIXES)) $(addprefix compat/*/*/,$(CLEANSUFFIXES))
    $(RM) -r coverage-html
    $(RM) -rf coverage.info coverage.info.in lcov

distclean:: clean
    $(RM) .version avversion.h config.asm config.h mapfile  \
        ffbuild/.config ffbuild/config.* libavutil/avconfig.h \
        version.h libavutil/ffversion.h libavcodec/codec_names.h \
        libavcodec/bsf_list.c libavformat/protocol_list.c \
        libavcodec/codec_list.c libavcodec/parser_list.c \
        libavfilter/filter_list.c libavdevice/indev_list.c libavdevice/outdev_list.c \
        libavformat/muxer_list.c libavformat/demuxer_list.c
ifeq ($(SRC_LINK),src)
    $(RM) src
endif
    $(RM) -rf doc/examples/pc-uninstalled

config:
    $(SRC_PATH)/configure $(value FFMPEG_CONFIGURATION)

build: all alltools examples testprogs
check: all alltools examples testprogs fate

include $(SRC_PATH)/tests/Makefile

$(sort $(OUTDIRS)):
    $(Q)mkdir -p $@

# Dummy rule to stop make trying to rebuild removed or renamed headers
%.h:
    @:

# Disable suffix rules.  Most of the builtin rules are suffix rules,
# so this saves some time on slow systems.
.SUFFIXES:

.PHONY: all all-yes alltools build check config testprogs
.PHONY: *clean install* uninstall*


    


    Any suggestions ?
    
Thanks !

    


    EDIT
    
Tried starting with x64 Native Tools Command Prompt for VS 2019 and got the same result.

    


    EDIT #2 (because this is too long for a comment)

    


    $ mingw32-make Q=
mkdir -p libavutil/
mkdir -p libswscale/
mkdir -p libswresample/
mkdir -p libavcodec/
mkdir -p libavformat/
mkdir -p libavfilter/
mkdir -p libavdevice/
awk: cmd. line:1: /including/ { sub(/^.*file: */, ""); gsub(/\/, "/"); if (!match($0, / /)) print "libavdevice/alldevices.o:", $0 }
awk: cmd. line:1:                                                                                                        ^ syntax error
awk: cmd. line:1: /including/ { sub(/^.*file: */, ""); gsub(/\/, "/"); if (!match($0, / /)) print "libavdevice/alldevices.o:", $0 }
awk: cmd. line:1:                                                                                                           ^ unterminated string
ffbuild/common.mak:67: recipe for target 'libavdevice/alldevices.o' failed
mingw32-make: *** [libavdevice/alldevices.o] Error 1


    


    ffbuild/common.mak is :

    


    #
# common bits used by all libraries
#

DEFAULT_X86ASMD=.dbg

ifeq ($(DBG),1)
X86ASMD=$(DEFAULT_X86ASMD)
else
X86ASMD=
endif

ifndef SUBDIR

ifndef V
Q      = @
ECHO   = printf "$(1)\t%s\n" $(2)
BRIEF  = CC CXX OBJCC HOSTCC HOSTLD AS X86ASM AR LD STRIP CP WINDRES NVCC
SILENT = DEPCC DEPHOSTCC DEPAS DEPX86ASM RANLIB RM

MSG    = $@
M      = @$(call ECHO,$(TAG),$@);
$(foreach VAR,$(BRIEF), \
    $(eval override $(VAR) = @$$(call ECHO,$(VAR),$$(MSG)); $($(VAR))))
$(foreach VAR,$(SILENT),$(eval override $(VAR) = @$($(VAR))))
$(eval INSTALL = @$(call ECHO,INSTALL,$$(^:$(SRC_DIR)/%=%)); $(INSTALL))
endif

ALLFFLIBS = avcodec avdevice avfilter avformat avresample avutil postproc swscale swresample

# NASM requires -I path terminated with /
IFLAGS     := -I. -I$(SRC_LINK)/
CPPFLAGS   := $(IFLAGS) $(CPPFLAGS)
CFLAGS     += $(ECFLAGS)
CCFLAGS     = $(CPPFLAGS) $(CFLAGS)
OBJCFLAGS  += $(EOBJCFLAGS)
OBJCCFLAGS  = $(CPPFLAGS) $(CFLAGS) $(OBJCFLAGS)
ASFLAGS    := $(CPPFLAGS) $(ASFLAGS)
CXXFLAGS   := $(CPPFLAGS) $(CFLAGS) $(CXXFLAGS)
X86ASMFLAGS += $(IFLAGS:%=%/) -I$( -Pconfig.asm

HOSTCCFLAGS = $(IFLAGS) $(HOSTCPPFLAGS) $(HOSTCFLAGS)
LDFLAGS    := $(ALLFFLIBS:%=$(LD_PATH)lib%) $(LDFLAGS)

define COMPILE
       $(call $(1)DEP,$(1))
       $($(1)) $($(1)FLAGS) $($(2)) $($(1)_DEPFLAGS) $($(1)_C) $($(1)_O) $(patsubst $(SRC_PATH)/%,$(SRC_LINK)/%,$<)
endef

COMPILE_C = $(call COMPILE,CC)
COMPILE_CXX = $(call COMPILE,CXX)
COMPILE_S = $(call COMPILE,AS)
COMPILE_M = $(call COMPILE,OBJCC)
COMPILE_X86ASM = $(call COMPILE,X86ASM)
COMPILE_HOSTC = $(call COMPILE,HOSTCC)
COMPILE_NVCC = $(call COMPILE,NVCC)
COMPILE_MMI = $(call COMPILE,CC,MMIFLAGS)
COMPILE_MSA = $(call COMPILE,CC,MSAFLAGS)

%_mmi.o: %_mmi.c
    $(COMPILE_MMI)

%_msa.o: %_msa.c
    $(COMPILE_MSA)

%.o: %.c
    $(COMPILE_C)

%.o: %.cpp
    $(COMPILE_CXX)

%.o: %.m
    $(COMPILE_M)

%.s: %.c
    $(CC) $(CCFLAGS) -S -o $@ $<

%.o: %.S
    $(COMPILE_S)

%_host.o: %.c
    $(COMPILE_HOSTC)

%$(DEFAULT_X86ASMD).asm: %.asm
    $(DEPX86ASM) $(X86ASMFLAGS) -M -o $@ $< > $(@:.asm=.d)
    $(X86ASM) $(X86ASMFLAGS) -e $< | sed '/^%/d;/^$$/d;' > $@

%.o: %.asm
    $(COMPILE_X86ASM)
    -$(if $(ASMSTRIPFLAGS), $(STRIP) $(ASMSTRIPFLAGS) $@)

%.o: %.rc
    $(WINDRES) $(IFLAGS) --preprocessor "$(DEPWINDRES) -E -xc-header -DRC_INVOKED $(CC_DEPFLAGS)" -o $@ $<

%.i: %.c
    $(CC) $(CCFLAGS) $(CC_E) $<

%.h.c:
    $(Q)echo '#include "$*.h"' >$@

%.ptx: %.cu $(SRC_PATH)/compat/cuda/cuda_runtime.h
    $(COMPILE_NVCC)

%.ptx.c: %.ptx
    $(Q)sh $(SRC_PATH)/compat/cuda/ptx2c.sh $@ $(patsubst $(SRC_PATH)/%,$(SRC_LINK)/%,$<)

%.c %.h %.pc %.ver %.version: TAG = GEN

# Dummy rule to stop make trying to rebuild removed or renamed headers
%.h:
    @:

# Disable suffix rules.  Most of the builtin rules are suffix rules,
# so this saves some time on slow systems.
.SUFFIXES:

# Do not delete intermediate files from chains of implicit rules
$(OBJS):
endif

include $(SRC_PATH)/ffbuild/arch.mak

OBJS      += $(OBJS-yes)
SLIBOBJS  += $(SLIBOBJS-yes)
FFLIBS    := $($(NAME)_FFLIBS) $(FFLIBS-yes) $(FFLIBS)
TESTPROGS += $(TESTPROGS-yes)

LDLIBS       = $(FFLIBS:%=%$(BUILDSUF))
FFEXTRALIBS := $(LDLIBS:%=$(LD_LIB)) $(foreach lib,EXTRALIBS-$(NAME) $(FFLIBS:%=EXTRALIBS-%),$($(lib))) $(EXTRALIBS)

OBJS      := $(sort $(OBJS:%=$(SUBDIR)%))
SLIBOBJS  := $(sort $(SLIBOBJS:%=$(SUBDIR)%))
TESTOBJS  := $(TESTOBJS:%=$(SUBDIR)tests/%) $(TESTPROGS:%=$(SUBDIR)tests/%.o)
TESTPROGS := $(TESTPROGS:%=$(SUBDIR)tests/%$(EXESUF))
HOSTOBJS  := $(HOSTPROGS:%=$(SUBDIR)%.o)
HOSTPROGS := $(HOSTPROGS:%=$(SUBDIR)%$(HOSTEXESUF))
TOOLS     += $(TOOLS-yes)
TOOLOBJS  := $(TOOLS:%=tools/%.o)
TOOLS     := $(TOOLS:%=tools/%$(EXESUF))
HEADERS   += $(HEADERS-yes)

PATH_LIBNAME = $(foreach NAME,$(1),lib$(NAME)/$($(2)LIBNAME))
DEP_LIBS := $(foreach lib,$(FFLIBS),$(call PATH_LIBNAME,$(lib),$(CONFIG_SHARED:yes=S)))
STATIC_DEP_LIBS := $(foreach lib,$(FFLIBS),$(call PATH_LIBNAME,$(lib)))

SRC_DIR    := $(SRC_PATH)/lib$(NAME)
ALLHEADERS := $(subst $(SRC_DIR)/,$(SUBDIR),$(wildcard $(SRC_DIR)/*.h $(SRC_DIR)/$(ARCH)/*.h))
SKIPHEADERS += $(ARCH_HEADERS:%=$(ARCH)/%) $(SKIPHEADERS-)
SKIPHEADERS := $(SKIPHEADERS:%=$(SUBDIR)%)
HOBJS        = $(filter-out $(SKIPHEADERS:.h=.h.o),$(ALLHEADERS:.h=.h.o))
PTXOBJS      = $(filter %.ptx.o,$(OBJS))
$(HOBJS):     CCFLAGS += $(CFLAGS_HEADERS)
checkheaders: $(HOBJS)
.SECONDARY:   $(HOBJS:.o=.c) $(PTXOBJS:.o=.c) $(PTXOBJS:.o=)

alltools: $(TOOLS)

$(HOSTOBJS): %.o: %.c
    $(COMPILE_HOSTC)

$(HOSTPROGS): %$(HOSTEXESUF): %.o
    $(HOSTLD) $(HOSTLDFLAGS) $(HOSTLD_O) $^ $(HOSTEXTRALIBS)

$(OBJS):     | $(sort $(dir $(OBJS)))
$(HOBJS):    | $(sort $(dir $(HOBJS)))
$(HOSTOBJS): | $(sort $(dir $(HOSTOBJS)))
$(SLIBOBJS): | $(sort $(dir $(SLIBOBJS)))
$(TESTOBJS): | $(sort $(dir $(TESTOBJS)))
$(TOOLOBJS): | tools

OUTDIRS := $(OUTDIRS) $(dir $(OBJS) $(HOBJS) $(HOSTOBJS) $(SLIBOBJS) $(TESTOBJS))

CLEANSUFFIXES     = *.d *.gcda *.gcno *.h.c *.ho *.map *.o *.pc *.ptx *.ptx.c *.ver *.version *$(DEFAULT_X86ASMD).asm *~ *.ilk *.pdb
LIBSUFFIXES       = *.a *.lib *.so *.so.* *.dylib *.dll *.def *.dll.a

define RULES
clean::
    $(RM) $(HOSTPROGS) $(TESTPROGS) $(TOOLS)
endef

$(eval $(RULES))

-include $(wildcard $(OBJS:.o=.d) $(HOSTOBJS:.o=.d) $(TESTOBJS:.o=.d) $(HOBJS:.o=.d) $(SLIBOBJS:.o=.d)) $(OBJS:.o=$(DEFAULT_X86ASMD).d)