Merge commit '11a9320de54759340531177c9f2b1e31e6112cc2'
authorClément Bœsch <u@pkh.me>
Wed, 3 May 2017 10:51:48 +0000 (12:51 +0200)
committerClément Bœsch <u@pkh.me>
Wed, 3 May 2017 14:49:12 +0000 (16:49 +0200)
* commit '11a9320de54759340531177c9f2b1e31e6112cc2':
  build: Move build-system-related helper files to a separate subdirectory

"ffbuild" directory name is used instead of "avbuild".

Merged-by: Clément Bœsch <u@pkh.me>
19 files changed:
1  2 
.gitignore
Makefile
configure
doc/Makefile
doc/writing_filters.txt
ffbuild/.gitignore
ffbuild/arch.mak
ffbuild/common.mak
ffbuild/library.mak
ffbuild/version.sh
libavcodec/Makefile
libavdevice/Makefile
libavfilter/Makefile
libavformat/Makefile
libavutil/Makefile
libpostproc/Makefile
libswresample/Makefile
libswscale/Makefile
tests/fate.sh

diff --cc .gitignore
  *.so.*
  *.swp
  *.ver
 +*_g
 +\#*
 +.\#*
  /.config
  /.version
 -/avconv
 -/avplay
 -/avprobe
 -/avversion.h
 +/ffmpeg
 +/ffplay
 +/ffprobe
 +/ffserver
- /config.*
+ /config.asm
+ /config.h
  /coverage.info
 +/avversion.h
  /lcov/
 +/src
  /mapfile
diff --cc Makefile
+++ b/Makefile
@@@ -1,47 -1,94 +1,47 @@@
 -include avbuild/config.mak
 +MAIN_MAKEFILE=1
- include config.mak
++include ffbuild/config.mak
  
  vpath %.c    $(SRC_PATH)
 -vpath %.m    $(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 %/fate_config.sh.template $(SRC_PATH)
  
 -ifndef V
 -Q      = @
 -ECHO   = printf "$(1)\t%s\n" $(2)
 -BRIEF  = CC HOSTCC HOSTLD AS YASM AR LD
 -SILENT = DEPCC DEPHOSTCC DEPAS DEPYASM RANLIB RM STRIP
 -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_PATH)/%=%)); $(INSTALL))
 -endif
 -
 -ALLFFLIBS = avcodec avdevice avfilter avformat avresample avutil swscale
 -
 -IFLAGS     := -I. -I$(SRC_PATH)
 -CPPFLAGS   := $(IFLAGS) $(CPPFLAGS)
 -CFLAGS     += $(ECFLAGS)
 -CCFLAGS     = $(CPPFLAGS) $(CFLAGS)
 -OBJCFLAGS  += $(EOBJCFLAGS)
 -OBJCCFLAGS  = $(CPPFLAGS) $(CFLAGS) $(OBJCFLAGS)
 -ASFLAGS    := $(CPPFLAGS) $(ASFLAGS)
 -YASMFLAGS  += $(IFLAGS:%=%/) -Pconfig.asm
 -HOSTCCFLAGS = $(IFLAGS) $(HOSTCPPFLAGS) $(HOSTCFLAGS)
 -LDFLAGS    := $(ALLFFLIBS:%=$(LD_PATH)lib%) $(LDFLAGS)
 -
 -define COMPILE
 -      $(call $(1)DEP,$(1))
 -      $($(1)) $($(1)FLAGS) $($(1)_DEPFLAGS) $($(1)_C) $($(1)_O) $<
 -endef
 -
 -COMPILE_C = $(call COMPILE,CC)
 -COMPILE_S = $(call COMPILE,AS)
 -COMPILE_M = $(call COMPILE,OBJCC)
 -COMPILE_HOSTC = $(call COMPILE,HOSTCC)
 -
 -%.o: %.c
 -      $(COMPILE_C)
 -
 -%.o: %.S
 -      $(COMPILE_S)
 -
 -%.o: %.m
 -      $(COMPILE_M)
 -
 -%_host.o: %.c
 -      $(COMPILE_HOSTC)
 -
 -%.o: %.asm
 -      $(DEPYASM) $(YASMFLAGS) -I $(<D)/ -M -o $@ $< > $(@:.o=.d)
 -      $(YASM) $(YASMFLAGS) -I $(<D)/ -o $@ $<
 -      -$(STRIP) $(STRIPFLAGS) $@
 +AVPROGS-$(CONFIG_FFMPEG)   += ffmpeg
 +AVPROGS-$(CONFIG_FFPLAY)   += ffplay
 +AVPROGS-$(CONFIG_FFPROBE)  += ffprobe
 +AVPROGS-$(CONFIG_FFSERVER) += ffserver
  
 -%.i: %.c
 -      $(CC) $(CCFLAGS) $(CC_E) $<
 -
 -%.h.c:
 -      $(Q)echo '#include "$*.h"' >$@
 -
 -%.c %.h %.ver: TAG = GEN
 -
 -AVPROGS-$(CONFIG_AVCONV)   += avconv
 -AVPROGS-$(CONFIG_AVPLAY)   += avplay
 -AVPROGS-$(CONFIG_AVPROBE)  += avprobe
 -
 -AVPROGS    := $(AVPROGS-yes:%=%$(EXESUF))
 +AVPROGS    := $(AVPROGS-yes:%=%$(PROGSSUF)$(EXESUF))
 +INSTPROGS   = $(AVPROGS-yes:%=%$(PROGSSUF)$(EXESUF))
  PROGS      += $(AVPROGS)
  
 -AVBASENAMES = avconv avplay avprobe
 -ALLAVPROGS  = $(AVBASENAMES:%=%$(EXESUF))
 +AVBASENAMES  = ffmpeg ffplay ffprobe ffserver
 +ALLAVPROGS   = $(AVBASENAMES:%=%$(PROGSSUF)$(EXESUF))
 +ALLAVPROGS_G = $(AVBASENAMES:%=%$(PROGSSUF)_g$(EXESUF))
  
  $(foreach prog,$(AVBASENAMES),$(eval OBJS-$(prog) += cmdutils.o))
 +$(foreach prog,$(AVBASENAMES),$(eval OBJS-$(prog)-$(CONFIG_OPENCL) += cmdutils_opencl.o))
 +
 +OBJS-ffmpeg                   += ffmpeg_opt.o ffmpeg_filter.o
 +OBJS-ffmpeg-$(CONFIG_VIDEOTOOLBOX) += ffmpeg_videotoolbox.o
 +OBJS-ffmpeg-$(CONFIG_LIBMFX)  += ffmpeg_qsv.o
 +OBJS-ffmpeg-$(CONFIG_VAAPI)   += ffmpeg_vaapi.o
 +ifndef CONFIG_VIDEOTOOLBOX
 +OBJS-ffmpeg-$(CONFIG_VDA)     += ffmpeg_videotoolbox.o
 +endif
 +OBJS-ffmpeg-$(CONFIG_CUVID)   += ffmpeg_cuvid.o
 +OBJS-ffmpeg-$(HAVE_DXVA2_LIB) += ffmpeg_dxva2.o
 +OBJS-ffmpeg-$(HAVE_VDPAU_X11) += ffmpeg_vdpau.o
 +OBJS-ffserver                 += ffserver_config.o
  
 -OBJS-avconv                   += avconv_opt.o avconv_filter.o
 -OBJS-avconv-$(CONFIG_LIBMFX)  += avconv_qsv.o
 -OBJS-avconv-$(CONFIG_VAAPI)   += avconv_vaapi.o
 -OBJS-avconv-$(CONFIG_VDA)     += avconv_vda.o
 -OBJS-avconv-$(HAVE_DXVA2_LIB) += avconv_dxva2.o
 -OBJS-avconv-$(HAVE_VDPAU_X11) += avconv_vdpau.o
 -
 -TESTTOOLS   = audiogen videogen rotozoom tiny_psnr base64
 +TESTTOOLS   = audiogen videogen rotozoom tiny_psnr tiny_ssim base64 audiomatch
  HOSTPROGS  := $(TESTTOOLS:%=tests/%) doc/print_options
  
  # $(FFLIBS-yes) needs to be in linking order
@@@ -66,7 -110,7 +66,7 @@@ SKIPHEADERS = cmdutils_common_opts.
  all: all-yes
  
  include $(SRC_PATH)/tools/Makefile
- include $(SRC_PATH)/common.mak
 -include $(SRC_PATH)/avbuild/common.mak
++include $(SRC_PATH)/ffbuild/common.mak
  
  FF_EXTRALIBS := $(FFEXTRALIBS)
  FF_DEP_LIBS  := $(DEP_LIBS)
@@@ -91,8 -129,8 +91,8 @@@ CONFIGURABLE_COMPONENTS 
      $(SRC_PATH)/libavcodec/bitstream_filters.c                      \
      $(SRC_PATH)/libavformat/protocols.c                             \
  
- config.h: .config
- .config: $(CONFIGURABLE_COMPONENTS)
 -config.h: avbuild/.config
 -avbuild/.config: $(CONFIGURABLE_COMPONENTS)
++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
@@@ -115,7 -152,7 +115,7 @@@ SUBDIR := $(1)
  include $(SRC_PATH)/$(1)/Makefile
  -include $(SRC_PATH)/$(1)/$(ARCH)/Makefile
  -include $(SRC_PATH)/$(1)/$(INTRINSICS)/Makefile
- include $(SRC_PATH)/library.mak
 -include $(SRC_PATH)/avbuild/library.mak
++include $(SRC_PATH)/ffbuild/library.mak
  endef
  
  $(foreach D,$(FFLIBS),$(eval $(call DOSUBDIR,lib$(D))))
@@@ -131,25 -168,20 +131,25 @@@ $(1)$(PROGSSUF)_g$(EXESUF): FF_EXTRALIB
  -include $$(OBJS-$(1):.o=.d)
  endef
  
 -$(foreach P,$(PROGS),$(eval $(call DOPROG,$(P:$(EXESUF)=))))
 +$(foreach P,$(PROGS),$(eval $(call DOPROG,$(P:$(PROGSSUF)$(EXESUF)=))))
 +
 +ffprobe.o cmdutils.o 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): %$(EXESUF): %.o $(FF_DEP_LIBS)
 +$(PROGS): %$(PROGSSUF)$(EXESUF): %$(PROGSSUF)_g$(EXESUF)
 +      $(CP) $< $@
 +      $(STRIP) $@
 +
 +%$(PROGSSUF)_g$(EXESUF): %.o $(FF_DEP_LIBS)
        $(LD) $(LDFLAGS) $(LDEXEFLAGS) $(LD_O) $(OBJS-$*) $(FF_EXTRALIBS)
  
- VERSION_SH  = $(SRC_PATH)/version.sh
 -VERSION_SH  = $(SRC_PATH)/avbuild/version.sh
++VERSION_SH  = $(SRC_PATH)/ffbuild/version.sh
  GIT_LOG     = $(SRC_PATH)/.git/logs/HEAD
  
- .version: $(wildcard $(GIT_LOG)) $(VERSION_SH) config.mak
 -.version: $(wildcard $(GIT_LOG)) $(VERSION_SH) avbuild/config.mak
++.version: $(wildcard $(GIT_LOG)) $(VERSION_SH) ffbuild/config.mak
  .version: M=@
  
 -cmdutils.o libavutil/utils.o: avversion.h
 -avversion.h .version:
 -      $(M)$(VERSION_SH) $(SRC_PATH) avversion.h $(EXTRA_VERSION)
 +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
@@@ -194,16 -221,14 +194,19 @@@ clean:
  
  distclean::
        $(RM) $(DISTCLEANSUFFIXES)
-       $(RM) config.* .config libavutil/avconfig.h .version mapfile avversion.h version.h libavutil/ffversion.h libavcodec/codec_names.h libavcodec/bsf_list.c libavformat/protocol_list.c
 -      $(RM) .version avversion.h config.asm config.h mapfile \
 -            avbuild/.config avbuild/config.* libavutil/avconfig.h \
 -            libavcodec/bsf_list.c libavformat/protocol_list.c
++      $(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
 +ifeq ($(SRC_LINK),src)
 +      $(RM) src
 +endif
 +      $(RM) -rf doc/examples/pc-uninstalled
  
  config:
 -      $(SRC_PATH)/configure $(value LIBAV_CONFIGURATION)
 +      $(SRC_PATH)/configure $(value FFMPEG_CONFIGURATION)
  
 -check: all alltools checkheaders examples testprogs fate
 +check: all alltools examples testprogs fate
  
  include $(SRC_PATH)/tests/Makefile
  
diff --cc configure
+++ b/configure
@@@ -77,22 -77,17 +77,22 @@@ Help options
    --list-filters           show all available filters
  
  Standard options:
-   --logfile=FILE           log tests and output to FILE [config.log]
 -  --logfile=FILE           log tests and output to FILE [avbuild/config.log]
++  --logfile=FILE           log tests and output to FILE [ffbuild/config.log]
    --disable-logging        do not log configure debug information
 +  --fatal-warnings         fail if any configure warning is generated
    --prefix=PREFIX          install in PREFIX [$prefix_default]
    --bindir=DIR             install binaries in DIR [PREFIX/bin]
 -  --datadir=DIR            install data files in DIR [PREFIX/share/avconv]
 -  --docdir=DIR             install documentation in DIR [PREFIX/share/doc/libav]
 +  --datadir=DIR            install data files in DIR [PREFIX/share/ffmpeg]
 +  --docdir=DIR             install documentation in DIR [PREFIX/share/doc/ffmpeg]
    --libdir=DIR             install libs in DIR [PREFIX/lib]
 -  --shlibdir=DIR           install shared libs in DIR [PREFIX/lib]
 +  --shlibdir=DIR           install shared libs in DIR [LIBDIR]
    --incdir=DIR             install includes in DIR [PREFIX/include]
    --mandir=DIR             install man page in DIR [PREFIX/share/man]
 -  --enable-rpath           use rpath when linking programs (USE WITH CARE)
 +  --pkgconfigdir=DIR       install pkg-config files in DIR [LIBDIR/pkgconfig]
 +  --enable-rpath           use rpath to allow installing libraries in paths
 +                           not part of the dynamic linker search path
 +                           use rpath when linking programs (USE WITH CARE)
 +  --install-name-dir=DIR   Darwin directory name for installed targets
  
  Licensing options:
    --enable-gpl             allow use of GPL code, the resulting libs
@@@ -3224,7 -2495,7 +3224,7 @@@ doc_deps_any="manpages htmlpages podpag
  
  # default parameters
  
- logfile="config.log"
 -logfile="avbuild/config.log"
++logfile="ffbuild/config.log"
  
  # installation paths
  prefix_default="/usr/local"
@@@ -3581,16 -2808,10 +3581,17 @@@ disable_components()
  
  map 'disable_components $v' $LIBRARY_LIST
  
 -mkdir -p avbuild
 -echo "# $0 $LIBAV_CONFIGURATION" > $logfile
++mkdir -p ffbuild
 +echo "# $0 $FFMPEG_CONFIGURATION" > $logfile
  set >> $logfile
  
 +test -n "$valgrind" && toolchain="valgrind-memcheck"
 +
 +enabled ossfuzz && {
 +    add_cflags  -fsanitize=address,undefined -fsanitize-coverage=trace-pc-guard,trace-cmp -fno-omit-frame-pointer
 +    add_ldflags -fsanitize=address,undefined -fsanitize-coverage=trace-pc-guard,trace-cmp
 +}
 +
  case "$toolchain" in
      *-asan)
          cc_default="${toolchain%-asan}"
@@@ -5152,7 -4124,7 +5153,7 @@@ esc()
      echo "$*" | sed 's/%/%25/g;s/:/%3a/g'
  }
  
- echo "config:$arch:$subarch:$cpu:$target_os:$(esc $cc_ident):$(esc $FFMPEG_CONFIGURATION)" >config.fate
 -echo "config:$arch:$subarch:$cpu:$target_os:$(esc $cc_ident):$(esc $LIBAV_CONFIGURATION)" > avbuild/config.fate
++echo "config:$arch:$subarch:$cpu:$target_os:$(esc $cc_ident):$(esc $FFMPEG_CONFIGURATION)" > ffbuild/config.fate
  
  check_cpp_condition stdlib.h "defined(__PIC__) || defined(__pic__) || defined(PIC)" && enable_weak pic
  
@@@ -6617,15 -5211,11 +6618,15 @@@ fi # test "$quiet" != "yes
  
  test -e Makefile || echo "include $source_path/Makefile" > Makefile
  
 -config_files="$TMPH avbuild/config.mak"
 +enabled stripping || strip="echo skipping strip"
 +
- config_files="$TMPH config.mak doc/config.texi"
++config_files="$TMPH ffbuild/config.mak doc/config.texi"
  
- cat > config.mak <<EOF
 -cat > avbuild/config.mak <<EOF
++cat > ffbuild/config.mak <<EOF
  # Automatically generated by configure - do not modify!
 -LIBAV_CONFIGURATION=$LIBAV_CONFIGURATION
 +ifndef FFMPEG_CONFIG_MAK
 +FFMPEG_CONFIG_MAK=1
 +FFMPEG_CONFIGURATION=$FFMPEG_CONFIGURATION
  prefix=$prefix
  LIBDIR=\$(DESTDIR)$libdir
  SHLIBDIR=\$(DESTDIR)$shlibdir
@@@ -6753,20 -5323,19 +6754,20 @@@ get_version()
      name=$(toupper $lcname)
      file=$source_path/$lcname/version.h
      eval $(awk "/#define ${name}_VERSION_M/ { print \$2 \"=\" \$3 }" "$file")
 +    enabled raise_major && eval ${name}_VERSION_MAJOR=$((${name}_VERSION_MAJOR+100))
      eval ${name}_VERSION=\$${name}_VERSION_MAJOR.\$${name}_VERSION_MINOR.\$${name}_VERSION_MICRO
-     eval echo "${lcname}_VERSION=\$${name}_VERSION" >> config.mak
-     eval echo "${lcname}_VERSION_MAJOR=\$${name}_VERSION_MAJOR" >> config.mak
-     eval echo "${lcname}_VERSION_MINOR=\$${name}_VERSION_MINOR" >> config.mak
 -    eval echo "${lcname}_VERSION=\$${name}_VERSION"             >> avbuild/config.mak
 -    eval echo "${lcname}_VERSION_MAJOR=\$${name}_VERSION_MAJOR" >> avbuild/config.mak
 -    eval echo "${lcname}_VERSION_MINOR=\$${name}_VERSION_MINOR" >> avbuild/config.mak
++    eval echo "${lcname}_VERSION=\$${name}_VERSION"             >> ffbuild/config.mak
++    eval echo "${lcname}_VERSION_MAJOR=\$${name}_VERSION_MAJOR" >> ffbuild/config.mak
++    eval echo "${lcname}_VERSION_MINOR=\$${name}_VERSION_MINOR" >> ffbuild/config.mak
  }
  
  map 'get_version $v' $LIBRARY_LIST
  
- map 'eval echo "${v}_FFLIBS=\$${v}_deps" >> config.mak' $LIBRARY_LIST
 -map 'eval echo "${v}_FFLIBS=\$${v}_deps" >> avbuild/config.mak' $LIBRARY_LIST
++map 'eval echo "${v}_FFLIBS=\$${v}_deps" >> ffbuild/config.mak' $LIBRARY_LIST
  
  print_program_extralibs(){
      eval "program_extralibs=\$${1}_extralibs"
-     eval echo "EXTRALIBS-${1}=${program_extralibs}" >> config.mak
 -    eval echo "EXTRALIBS-${1}=${program_extralibs}" >> avbuild/config.mak
++    eval echo "EXTRALIBS-${1}=${program_extralibs}" >> ffbuild/config.mak
  }
  
  map 'print_program_extralibs $v' $PROGRAM_LIST
@@@ -6815,12 -5370,11 +6816,12 @@@ print_config CONFIG_ "$config_files" $C
                                       $CONFIG_EXTRA      \
                                       $ALL_COMPONENTS    \
  
 -echo "#endif /* LIBAV_CONFIG_H */" >> $TMPH
 +echo "#endif /* FFMPEG_CONFIG_H */" >> $TMPH
- echo "endif # FFMPEG_CONFIG_MAK" >> config.mak
++echo "endif # FFMPEG_CONFIG_MAK" >> ffbuild/config.mak
  
  # Do not overwrite an unchanged config.h to avoid superfluous rebuilds.
  cp_if_changed $TMPH config.h
- touch .config
 -touch avbuild/.config
++touch ffbuild/.config
  
  enabled yasm && cp_if_changed $TMPASM config.asm
  
diff --cc doc/Makefile
@@@ -127,29 -73,19 +127,29 @@@ $(DOCS) doc/doxy/html: | doc
  $(DOC_EXAMPLES:%$(EXESUF)=%.o): | doc/examples
  OBJDIRS += doc/examples
  
 -DOXY_INPUT      = $(addprefix $(SRC_PATH)/, $(INSTHEADERS) $(DOC_EXAMPLES:%$(EXESUF)=%.c) $(LIB_EXAMPLES:%$(EXESUF)=%.c))
 -DOXY_TEMPLATES  = doxy_stylesheet.css footer.html header.html
 -DOXY_TEMPLATES := $(addprefix $(SRC_PATH)/doc/doxy/, $(DOXY_TEMPLATES))
 +DOXY_INPUT      = $(INSTHEADERS) $(DOC_EXAMPLES:%$(EXESUF)=%.c) $(LIB_EXAMPLES:%$(EXESUF)=%.c)
- DOXY_INPUT_DEPS = $(addprefix $(SRC_PATH)/, $(DOXY_INPUT)) config.mak
++DOXY_INPUT_DEPS = $(addprefix $(SRC_PATH)/, $(DOXY_INPUT)) ffbuild/config.mak
 +
 +doc/doxy/html: TAG = DOXY
 +doc/doxy/html: $(SRC_PATH)/doc/Doxyfile $(SRC_PATH)/doc/doxy-wrapper.sh $(DOXY_INPUT_DEPS)
 +      $(M)OUT_DIR=$$PWD/doc/doxy; cd $(SRC_PATH); ./doc/doxy-wrapper.sh $$OUT_DIR $< $(DOXYGEN) $(DOXY_INPUT);
 +
 +install-doc: install-html install-man
 +
 +install-html:
  
 -doc/doxy/html: $(SRC_PATH)/doc/Doxyfile $(DOXY_INPUT) $(DOXY_TEMPLATES)
 -      $(M)$(SRC_PATH)/doc/doxy-wrapper.sh $(SRC_PATH) $< $(DOXY_INPUT)
 +install-man:
  
 -install-progs-$(CONFIG_POD2MAN): install-man
 -install-progs-$(CONFIG_TEXI2HTML): install-doc
 +ifdef CONFIG_HTMLPAGES
 +install-progs-$(CONFIG_DOC): install-html
  
 -install-doc: $(HTMLPAGES)
 +install-html: $(HTMLPAGES)
        $(Q)mkdir -p "$(DOCDIR)"
        $(INSTALL) -m 644 $(HTMLPAGES) "$(DOCDIR)"
 +endif
 +
 +ifdef CONFIG_MANPAGES
 +install-progs-$(CONFIG_DOC): install-man
  
  install-man: $(MANPAGES)
        $(Q)mkdir -p "$(MANDIR)/man1"
index 66ebb53,0000000..5cd4ecd
mode 100644,000000..100644
--- /dev/null
@@@ -1,423 -1,0 +1,423 @@@
-     $ grep FOOBAR config.mak
 +This document is a tutorial/initiation for writing simple filters in
 +libavfilter.
 +
 +Foreword: just like everything else in FFmpeg, libavfilter is monolithic, which
 +means that it is highly recommended that you submit your filters to the FFmpeg
 +development mailing-list and make sure that they are applied. Otherwise, your filters
 +are likely to have a very short lifetime due to more or less regular internal API
 +changes, and a limited distribution, review, and testing.
 +
 +Bootstrap
 +=========
 +
 +Let's say you want to write a new simple video filter called "foobar" which
 +takes one frame in input, changes the pixels in whatever fashion you fancy, and
 +outputs the modified frame. The most simple way of doing this is to take a
 +similar filter.  We'll pick edgedetect, but any other should do. You can look
 +for others using the `./ffmpeg -v 0 -filters|grep ' V->V '` command.
 +
 + - sed 's/edgedetect/foobar/g;s/EdgeDetect/Foobar/g' libavfilter/vf_edgedetect.c > libavfilter/vf_foobar.c
 + - edit libavfilter/Makefile, and add an entry for "foobar" following the
 +   pattern of the other filters.
 + - edit libavfilter/allfilters.c, and add an entry for "foobar" following the
 +   pattern of the other filters.
 + - ./configure ...
 + - make -j<whatever> ffmpeg
 + - ./ffmpeg -i http://samples.ffmpeg.org/image-samples/lena.pnm -vf foobar foobar.png
 +   Note here: you can obviously use a random local image instead of a remote URL.
 +
 +If everything went right, you should get a foobar.png with Lena edge-detected.
 +
 +That's it, your new playground is ready.
 +
 +Some little details about what's going on:
 +libavfilter/allfilters.c:avfilter_register_all() is called at runtime to create
 +a list of the available filters, but it's important to know that this file is
 +also parsed by the configure script, which in turn will define variables for
 +the build system and the C:
 +
 +    --- after running configure ---
 +
- CONFIG_FOOBAR_FILTER=yes from the config.mak is later used to enable the filter in
- libavfilter/Makefile and CONFIG_FOOBAR_FILTER=1 from the config.h will be used
- for registering the filter in libavfilter/allfilters.c.
++    $ grep FOOBAR ffbuild/config.mak
 +    CONFIG_FOOBAR_FILTER=yes
 +    $ grep FOOBAR config.h
 +    #define CONFIG_FOOBAR_FILTER 1
 +
++CONFIG_FOOBAR_FILTER=yes from the ffbuild/config.mak is later used to enable
++the filter in libavfilter/Makefile and CONFIG_FOOBAR_FILTER=1 from the config.h
++will be used for registering the filter in libavfilter/allfilters.c.
 +
 +Filter code layout
 +==================
 +
 +You now need some theory about the general code layout of a filter. Open your
 +libavfilter/vf_foobar.c. This section will detail the important parts of the
 +code you need to understand before messing with it.
 +
 +Copyright
 +---------
 +
 +First chunk is the copyright. Most filters are LGPL, and we are assuming
 +vf_foobar is as well. We are also assuming vf_foobar is not an edge detector
 +filter, so you can update the boilerplate with your credits.
 +
 +Doxy
 +----
 +
 +Next chunk is the Doxygen about the file. See https://ffmpeg.org/doxygen/trunk/.
 +Detail here what the filter is, does, and add some references if you feel like
 +it.
 +
 +Context
 +-------
 +
 +Skip the headers and scroll down to the definition of FoobarContext. This is
 +your local state context. It is already filled with 0 when you get it so do not
 +worry about uninitialized reads into this context. This is where you put all
 +"global" information that you need; typically the variables storing the user options.
 +You'll notice the first field "const AVClass *class"; it's the only field you
 +need to keep assuming you have a context. There is some magic you don't need to
 +care about around this field, just let it be (in the first position) for now.
 +
 +Options
 +-------
 +
 +Then comes the options array. This is what will define the user accessible
 +options. For example, -vf foobar=mode=colormix:high=0.4:low=0.1. Most options
 +have the following pattern:
 +  name, description, offset, type, default value, minimum value, maximum value, flags
 +
 + - name is the option name, keep it simple and lowercase
 + - description are short, in lowercase, without period, and describe what they
 +   do, for example "set the foo of the bar"
 + - offset is the offset of the field in your local context, see the OFFSET()
 +   macro; the option parser will use that information to fill the fields
 +   according to the user input
 + - type is any of AV_OPT_TYPE_* defined in libavutil/opt.h
 + - default value is an union where you pick the appropriate type; "{.dbl=0.3}",
 +   "{.i64=0x234}", "{.str=NULL}", ...
 + - min and max values define the range of available values, inclusive
 + - flags are AVOption generic flags. See AV_OPT_FLAG_* definitions
 +
 +When in doubt, just look at the other AVOption definitions all around the codebase,
 +there are tons of examples.
 +
 +Class
 +-----
 +
 +AVFILTER_DEFINE_CLASS(foobar) will define a unique foobar_class with some kind
 +of signature referencing the options, etc. which will be referenced in the
 +definition of the AVFilter.
 +
 +Filter definition
 +-----------------
 +
 +At the end of the file, you will find foobar_inputs, foobar_outputs and
 +the AVFilter ff_vf_foobar. Don't forget to update the AVFilter.description with
 +a description of what the filter does, starting with a capitalized letter and
 +ending with a period. You'd better drop the AVFilter.flags entry for now, and
 +re-add them later depending on the capabilities of your filter.
 +
 +Callbacks
 +---------
 +
 +Let's now study the common callbacks. Before going into details, note that all
 +these callbacks are explained in details in libavfilter/avfilter.h, so in
 +doubt, refer to the doxy in that file.
 +
 +init()
 +~~~~~~
 +
 +First one to be called is init(). It's flagged as cold because not called
 +often. Look for "cold" on
 +http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html for more
 +information.
 +
 +As the name suggests, init() is where you eventually initialize and allocate
 +your buffers, pre-compute your data, etc. Note that at this point, your local
 +context already has the user options initialized, but you still haven't any
 +clue about the kind of data input you will get, so this function is often
 +mainly used to sanitize the user options.
 +
 +Some init()s will also define the number of inputs or outputs dynamically
 +according to the user options. A good example of this is the split filter, but
 +we won't cover this here since vf_foobar is just a simple 1:1 filter.
 +
 +uninit()
 +~~~~~~~~
 +
 +Similarly, there is the uninit() callback, doing what the name suggests. Free
 +everything you allocated here.
 +
 +query_formats()
 +~~~~~~~~~~~~~~~
 +
 +This follows the init() and is used for the format negotiation. Basically
 +you specify here what pixel format(s) (gray, rgb 32, yuv 4:2:0, ...) you accept
 +for your inputs, and what you can output. All pixel formats are defined in
 +libavutil/pixfmt.h. If you don't change the pixel format between the input and
 +the output, you just have to define a pixel formats array and call
 +ff_set_common_formats(). For more complex negotiation, you can refer to other
 +filters such as vf_scale.
 +
 +config_props()
 +~~~~~~~~~~~~~~
 +
 +This callback is not necessary, but you will probably have one or more
 +config_props() anyway. It's not a callback for the filter itself but for its
 +inputs or outputs (they're called "pads" - AVFilterPad - in libavfilter's
 +lexicon).
 +
 +Inside the input config_props(), you are at a point where you know which pixel
 +format has been picked after query_formats(), and more information such as the
 +video width and height (inlink->{w,h}). So if you need to update your internal
 +context state depending on your input you can do it here. In edgedetect you can
 +see that this callback is used to allocate buffers depending on these
 +information. They will be destroyed in uninit().
 +
 +Inside the output config_props(), you can define what you want to change in the
 +output. Typically, if your filter is going to double the size of the video, you
 +will update outlink->w and outlink->h.
 +
 +filter_frame()
 +~~~~~~~~~~~~~~
 +
 +This is the callback you are waiting for from the beginning: it is where you
 +process the received frames. Along with the frame, you get the input link from
 +where the frame comes from.
 +
 +    static int filter_frame(AVFilterLink *inlink, AVFrame *in) { ... }
 +
 +You can get the filter context through that input link:
 +
 +    AVFilterContext *ctx = inlink->dst;
 +
 +Then access your internal state context:
 +
 +    FoobarContext *foobar = ctx->priv;
 +
 +And also the output link where you will send your frame when you are done:
 +
 +    AVFilterLink *outlink = ctx->outputs[0];
 +
 +Here, we are picking the first output. You can have several, but in our case we
 +only have one since we are in a 1:1 input-output situation.
 +
 +If you want to define a simple pass-through filter, you can just do:
 +
 +    return ff_filter_frame(outlink, in);
 +
 +But of course, you probably want to change the data of that frame.
 +
 +This can be done by accessing frame->data[] and frame->linesize[].  Important
 +note here: the width does NOT match the linesize. The linesize is always
 +greater or equal to the width. The padding created should not be changed or
 +even read. Typically, keep in mind that a previous filter in your chain might
 +have altered the frame dimension but not the linesize. Imagine a crop filter
 +that halves the video size: the linesizes won't be changed, just the width.
 +
 +    <-------------- linesize ------------------------>
 +    +-------------------------------+----------------+ ^
 +    |                               |                | |
 +    |                               |                | |
 +    |           picture             |    padding     | | height
 +    |                               |                | |
 +    |                               |                | |
 +    +-------------------------------+----------------+ v
 +    <----------- width ------------->
 +
 +Before modifying the "in" frame, you have to make sure it is writable, or get a
 +new one. Multiple scenarios are possible here depending on the kind of
 +processing you are doing.
 +
 +Let's say you want to change one pixel depending on multiple pixels (typically
 +the surrounding ones) of the input. In that case, you can't do an in-place
 +processing of the input so you will need to allocate a new frame, with the same
 +properties as the input one, and send that new frame to the next filter:
 +
 +    AVFrame *out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
 +    if (!out) {
 +        av_frame_free(&in);
 +        return AVERROR(ENOMEM);
 +    }
 +    av_frame_copy_props(out, in);
 +
 +    // out->data[...] = foobar(in->data[...])
 +
 +    av_frame_free(&in);
 +    return ff_filter_frame(outlink, out);
 +
 +In-place processing
 +~~~~~~~~~~~~~~~~~~~
 +
 +If you can just alter the input frame, you probably just want to do that
 +instead:
 +
 +    av_frame_make_writable(in);
 +    // in->data[...] = foobar(in->data[...])
 +    return ff_filter_frame(outlink, in);
 +
 +You may wonder why a frame might not be writable. The answer is that for
 +example a previous filter might still own the frame data: imagine a filter
 +prior to yours in the filtergraph that needs to cache the frame. You must not
 +alter that frame, otherwise it will make that previous filter buggy. This is
 +where av_frame_make_writable() helps (it won't have any effect if the frame
 +already is writable).
 +
 +The problem with using av_frame_make_writable() is that in the worst case it
 +will copy the whole input frame before you change it all over again with your
 +filter: if the frame is not writable, av_frame_make_writable() will allocate
 +new buffers, and copy the input frame data. You don't want that, and you can
 +avoid it by just allocating a new buffer if necessary, and process from in to
 +out in your filter, saving the memcpy. Generally, this is done following this
 +scheme:
 +
 +    int direct = 0;
 +    AVFrame *out;
 +
 +    if (av_frame_is_writable(in)) {
 +        direct = 1;
 +        out = in;
 +    } else {
 +        out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
 +        if (!out) {
 +            av_frame_free(&in);
 +            return AVERROR(ENOMEM);
 +        }
 +        av_frame_copy_props(out, in);
 +    }
 +
 +    // out->data[...] = foobar(in->data[...])
 +
 +    if (!direct)
 +        av_frame_free(&in);
 +    return ff_filter_frame(outlink, out);
 +
 +Of course, this will only work if you can do in-place processing. To test if
 +your filter handles well the permissions, you can use the perms filter. For
 +example with:
 +
 +    -vf perms=random,foobar
 +
 +Make sure no automatic pixel conversion is inserted between perms and foobar,
 +otherwise the frames permissions might change again and the test will be
 +meaningless: add av_log(0,0,"direct=%d\n",direct) in your code to check that.
 +You can avoid the issue with something like:
 +
 +    -vf format=rgb24,perms=random,foobar
 +
 +...assuming your filter accepts rgb24 of course. This will make sure the
 +necessary conversion is inserted before the perms filter.
 +
 +Timeline
 +~~~~~~~~
 +
 +Adding timeline support
 +(http://ffmpeg.org/ffmpeg-filters.html#Timeline-editing) is often an easy
 +feature to add. In the most simple case, you just have to add
 +AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC to the AVFilter.flags. You can typically
 +do this when your filter does not need to save the previous context frames, or
 +basically if your filter just alters whatever goes in and doesn't need
 +previous/future information. See for instance commit 86cb986ce that adds
 +timeline support to the fieldorder filter.
 +
 +In some cases, you might need to reset your context somehow. This is handled by
 +the AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL flag which is used if the filter
 +must not process the frames but still wants to keep track of the frames going
 +through (to keep them in cache for when it's enabled again). See for example
 +commit 69d72140a that adds timeline support to the phase filter.
 +
 +Threading
 +~~~~~~~~~
 +
 +libavfilter does not yet support frame threading, but you can add slice
 +threading to your filters.
 +
 +Let's say the foobar filter has the following frame processing function:
 +
 +    dst = out->data[0];
 +    src = in ->data[0];
 +
 +    for (y = 0; y < inlink->h; y++) {
 +        for (x = 0; x < inlink->w; x++)
 +            dst[x] = foobar(src[x]);
 +        dst += out->linesize[0];
 +        src += in ->linesize[0];
 +    }
 +
 +The first thing is to make this function work into slices. The new code will
 +look like this:
 +
 +    for (y = slice_start; y < slice_end; y++) {
 +        for (x = 0; x < inlink->w; x++)
 +            dst[x] = foobar(src[x]);
 +        dst += out->linesize[0];
 +        src += in ->linesize[0];
 +    }
 +
 +The source and destination pointers, and slice_start/slice_end will be defined
 +according to the number of jobs. Generally, it looks like this:
 +
 +    const int slice_start = (in->height *  jobnr   ) / nb_jobs;
 +    const int slice_end   = (in->height * (jobnr+1)) / nb_jobs;
 +    uint8_t       *dst = out->data[0] + slice_start * out->linesize[0];
 +    const uint8_t *src =  in->data[0] + slice_start *  in->linesize[0];
 +
 +This new code will be isolated in a new filter_slice():
 +
 +    static int filter_slice(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs) { ... }
 +
 +Note that we need our input and output frame to define slice_{start,end} and
 +dst/src, which are not available in that callback. They will be transmitted
 +through the opaque void *arg. You have to define a structure which contains
 +everything you need:
 +
 +    typedef struct ThreadData {
 +        AVFrame *in, *out;
 +    } ThreadData;
 +
 +If you need some more information from your local context, put them here.
 +
 +In you filter_slice function, you access it like that:
 +
 +    const ThreadData *td = arg;
 +
 +Then in your filter_frame() callback, you need to call the threading
 +distributor with something like this:
 +
 +    ThreadData td;
 +
 +    // ...
 +
 +    td.in  = in;
 +    td.out = out;
 +    ctx->internal->execute(ctx, filter_slice, &td, NULL, FFMIN(outlink->h, ctx->graph->nb_threads));
 +
 +    // ...
 +
 +    return ff_filter_frame(outlink, out);
 +
 +Last step is to add AVFILTER_FLAG_SLICE_THREADS flag to AVFilter.flags.
 +
 +For more example of slice threading additions, you can try to run git log -p
 +--grep 'slice threading' libavfilter/
 +
 +Finalization
 +~~~~~~~~~~~~
 +
 +When your awesome filter is finished, you have a few more steps before you're
 +done:
 +
 + - write its documentation in doc/filters.texi, and test the output with make
 +   doc/ffmpeg-filters.html.
 + - add a FATE test, generally by adding an entry in
 +   tests/fate/filter-video.mak, add running make fate-filter-foobar GEN=1 to
 +   generate the data.
 + - add an entry in the Changelog
 + - edit libavfilter/version.h and increase LIBAVFILTER_VERSION_MINOR by one
 +   (and reset LIBAVFILTER_VERSION_MICRO to 100)
 + - git add ... && git commit -m "avfilter: add foobar filter." && git format-patch -1
 +
 +When all of this is done, you can submit your patch to the ffmpeg-devel
 +mailing-list for review.  If you need any help, feel free to come on our IRC
 +channel, #ffmpeg-devel on irc.freenode.net.
index 0000000,693b7aa..693b7aa
mode 000000,100644..100644
--- /dev/null
index 08f78b4,0000000..08f78b4
mode 100644,000000..100644
--- /dev/null
index 909dfc1,0000000..1957370
mode 100644,000000..100644
--- /dev/null
@@@ -1,168 -1,0 +1,168 @@@
- include $(SRC_PATH)/arch.mak
 +#
 +# common bits used by all libraries
 +#
 +
 +DEFAULT_YASMD=.dbg
 +
 +ifeq ($(DBG),1)
 +YASMD=$(DEFAULT_YASMD)
 +else
 +YASMD=
 +endif
 +
 +ifndef SUBDIR
 +
 +ifndef V
 +Q      = @
 +ECHO   = printf "$(1)\t%s\n" $(2)
 +BRIEF  = CC CXX OBJCC HOSTCC HOSTLD AS YASM AR LD STRIP CP WINDRES
 +SILENT = DEPCC DEPHOSTCC DEPAS DEPYASM 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)
 +YASMFLAGS  += $(IFLAGS:%=%/) -Pconfig.asm
 +
 +HOSTCCFLAGS = $(IFLAGS) $(HOSTCPPFLAGS) $(HOSTCFLAGS)
 +LDFLAGS    := $(ALLFFLIBS:%=$(LD_PATH)lib%) $(LDFLAGS)
 +
 +define COMPILE
 +       $(call $(1)DEP,$(1))
 +       $($(1)) $($(1)FLAGS) $($(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_HOSTC = $(call COMPILE,HOSTCC)
 +
 +%.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_YASMD).asm: %.asm
 +      $(DEPYASM) $(YASMFLAGS) -I $(<D)/ -M -o $@ $< > $(@:.asm=.d)
 +      $(YASM) $(YASMFLAGS) -I $(<D)/ -e $< | sed '/^%/d;/^$$/d;' > $@
 +
 +%.o: %.asm
 +      $(DEPYASM) $(YASMFLAGS) -I $(<D)/ -M -o $@ $< > $(@:.o=.d)
 +      $(YASM) $(YASMFLAGS) -I $(<D)/ -o $@ $(patsubst $(SRC_PATH)/%,$(SRC_LINK)/%,$<)
 +      -$(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"' >$@
 +
 +%.c %.h %.ver: 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)) $(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))
 +$(HOBJS):     CCFLAGS += $(CFLAGS_HEADERS)
 +checkheaders: $(HOBJS)
 +.SECONDARY:   $(HOBJS:.o=.c)
 +
 +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
 +
 +OBJDIRS := $(OBJDIRS) $(dir $(OBJS) $(HOBJS) $(HOSTOBJS) $(SLIBOBJS) $(TESTOBJS))
 +
 +CLEANSUFFIXES     = *.d *.o *~ *.h.c *.gcda *.gcno *.map *.ver *.ho *$(DEFAULT_YASMD).asm
 +DISTCLEANSUFFIXES = *.pc
 +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_YASMD).d)
index 266176f,0000000..5e576d1
mode 100644,000000..100644
--- /dev/null
@@@ -1,98 -1,0 +1,98 @@@
- include $(SRC_PATH)/common.mak
++include $(SRC_PATH)/ffbuild/common.mak
 +
 +LIBVERSION := $(lib$(NAME)_VERSION)
 +LIBMAJOR   := $(lib$(NAME)_VERSION_MAJOR)
 +LIBMINOR   := $(lib$(NAME)_VERSION_MINOR)
 +INCINSTDIR := $(INCDIR)/lib$(NAME)
 +
 +INSTHEADERS := $(INSTHEADERS) $(HEADERS:%=$(SUBDIR)%)
 +
 +all-$(CONFIG_STATIC): $(SUBDIR)$(LIBNAME)
 +all-$(CONFIG_SHARED): $(SUBDIR)$(SLIBNAME)
 +
 +LIBOBJS := $(OBJS) $(SUBDIR)%.h.o $(TESTOBJS)
 +$(LIBOBJS) $(LIBOBJS:.o=.s) $(LIBOBJS:.o=.i):   CPPFLAGS += -DHAVE_AV_CONFIG_H
 +$(TESTOBJS) $(TESTOBJS:.o=.i): CFLAGS += -Umain
 +
 +$(SUBDIR)$(LIBNAME): $(OBJS)
 +      $(RM) $@
 +      $(AR) $(ARFLAGS) $(AR_O) $^
 +      $(RANLIB) $@
 +
 +install-headers: install-lib$(NAME)-headers install-lib$(NAME)-pkgconfig
 +
 +install-libs-$(CONFIG_STATIC): install-lib$(NAME)-static
 +install-libs-$(CONFIG_SHARED): install-lib$(NAME)-shared
 +
 +define RULES
 +$(TOOLS):     THISLIB = $(FULLNAME:%=$(LD_LIB))
 +$(TESTPROGS): THISLIB = $(SUBDIR)$(LIBNAME)
 +
 +$(TESTPROGS) $(TOOLS): %$(EXESUF): %.o
 +      $$(LD) $(LDFLAGS) $(LDEXEFLAGS) $$(LD_O) $$(filter %.o,$$^) $$(THISLIB) $(FFEXTRALIBS) $$(ELIBS)
 +
 +$(SUBDIR)lib$(NAME).ver: $(SUBDIR)lib$(NAME).v $(OBJS)
 +      $$(M)sed 's/MAJOR/$(lib$(NAME)_VERSION_MAJOR)/' $$< | $(VERSION_SCRIPT_POSTPROCESS_CMD) > $$@
 +
 +$(SUBDIR)$(SLIBNAME): $(SUBDIR)$(SLIBNAME_WITH_MAJOR)
 +      $(Q)cd ./$(SUBDIR) && $(LN_S) $(SLIBNAME_WITH_MAJOR) $(SLIBNAME)
 +
 +$(SUBDIR)$(SLIBNAME_WITH_MAJOR): $(OBJS) $(SLIBOBJS) $(SUBDIR)lib$(NAME).ver
 +      $(SLIB_CREATE_DEF_CMD)
 +      $$(LD) $(SHFLAGS) $(LDFLAGS) $(LDLIBFLAGS) $$(LD_O) $$(filter %.o,$$^) $(FFEXTRALIBS)
 +      $(SLIB_EXTRA_CMD)
 +
 +ifdef SUBDIR
 +$(SUBDIR)$(SLIBNAME_WITH_MAJOR): $(DEP_LIBS)
 +endif
 +
 +clean::
 +      $(RM) $(addprefix $(SUBDIR),$(CLEANFILES) $(CLEANSUFFIXES) $(LIBSUFFIXES)) \
 +          $(CLEANSUFFIXES:%=$(SUBDIR)$(ARCH)/%) $(CLEANSUFFIXES:%=$(SUBDIR)tests/%)
 + 
 +distclean:: clean
 +      $(RM) $(DISTCLEANSUFFIXES:%=$(SUBDIR)%) $(DISTCLEANSUFFIXES:%=$(SUBDIR)$(ARCH)/%) \
 +            $(DISTCLEANSUFFIXES:%=$(SUBDIR)tests/%)
 +
 +install-lib$(NAME)-shared: $(SUBDIR)$(SLIBNAME)
 +      $(Q)mkdir -p "$(SHLIBDIR)"
 +      $$(INSTALL) -m 755 $$< "$(SHLIBDIR)/$(SLIB_INSTALL_NAME)"
 +      $$(STRIP) "$(SHLIBDIR)/$(SLIB_INSTALL_NAME)"
 +      $(Q)$(foreach F,$(SLIB_INSTALL_LINKS),(cd "$(SHLIBDIR)" && $(LN_S) $(SLIB_INSTALL_NAME) $(F));)
 +      $(if $(SLIB_INSTALL_EXTRA_SHLIB),$$(INSTALL) -m 644 $(SLIB_INSTALL_EXTRA_SHLIB:%=$(SUBDIR)%) "$(SHLIBDIR)")
 +      $(if $(SLIB_INSTALL_EXTRA_LIB),$(Q)mkdir -p "$(LIBDIR)")
 +      $(if $(SLIB_INSTALL_EXTRA_LIB),$$(INSTALL) -m 644 $(SLIB_INSTALL_EXTRA_LIB:%=$(SUBDIR)%) "$(LIBDIR)")
 +
 +install-lib$(NAME)-static: $(SUBDIR)$(LIBNAME)
 +      $(Q)mkdir -p "$(LIBDIR)"
 +      $$(INSTALL) -m 644 $$< "$(LIBDIR)"
 +      $(LIB_INSTALL_EXTRA_CMD)
 +
 +install-lib$(NAME)-headers: $(addprefix $(SUBDIR),$(HEADERS) $(BUILT_HEADERS))
 +      $(Q)mkdir -p "$(INCINSTDIR)"
 +      $$(INSTALL) -m 644 $$^ "$(INCINSTDIR)"
 +
 +install-lib$(NAME)-pkgconfig: $(SUBDIR)lib$(FULLNAME).pc
 +      $(Q)mkdir -p "$(PKGCONFIGDIR)"
 +      $$(INSTALL) -m 644 $$^ "$(PKGCONFIGDIR)"
 +
 +uninstall-libs::
 +      -$(RM) "$(SHLIBDIR)/$(SLIBNAME_WITH_MAJOR)" \
 +             "$(SHLIBDIR)/$(SLIBNAME)"            \
 +             "$(SHLIBDIR)/$(SLIBNAME_WITH_VERSION)"
 +      -$(RM)  $(SLIB_INSTALL_EXTRA_SHLIB:%="$(SHLIBDIR)/%")
 +      -$(RM)  $(SLIB_INSTALL_EXTRA_LIB:%="$(LIBDIR)/%")
 +      -$(RM) "$(LIBDIR)/$(LIBNAME)"
 +
 +uninstall-headers::
 +      $(RM) $(addprefix "$(INCINSTDIR)/",$(HEADERS) $(BUILT_HEADERS))
 +      $(RM) "$(PKGCONFIGDIR)/lib$(FULLNAME).pc"
 +      -rmdir "$(INCINSTDIR)"
 +endef
 +
 +$(eval $(RULES))
 +
 +$(TOOLS):     $(DEP_LIBS) $(SUBDIR)$($(CONFIG_SHARED:yes=S)LIBNAME)
 +$(TESTPROGS): $(DEP_LIBS) $(SUBDIR)$(LIBNAME)
 +
 +testprogs: $(TESTPROGS)
index edc4dd3,0000000..edc4dd3
mode 100755,000000..100755
--- /dev/null
@@@ -1,5 -1,3 +1,5 @@@
- include $(SUBDIR)../config.mak
++include $(SUBDIR)../ffbuild/config.mak
 +
  NAME = avcodec
  
  HEADERS = avcodec.h                                                     \
@@@ -1,5 -1,3 +1,5 @@@
- include $(SUBDIR)../config.mak
++include $(SUBDIR)../ffbuild/config.mak
 +
  NAME    = avdevice
  
  HEADERS = avdevice.h                                                    \
@@@ -1,5 -1,3 +1,5 @@@
- include $(SUBDIR)../config.mak
++include $(SUBDIR)../ffbuild/config.mak
 +
  NAME = avfilter
  
  HEADERS = avfilter.h                                                    \
@@@ -1,5 -1,3 +1,5 @@@
- include $(SUBDIR)../config.mak
++include $(SUBDIR)../ffbuild/config.mak
 +
  NAME = avformat
  
  HEADERS = avformat.h                                                    \
@@@ -1,5 -1,3 +1,5 @@@
- include $(SUBDIR)../config.mak
++include $(SUBDIR)../ffbuild/config.mak
 +
  NAME = avutil
  
  HEADERS = adler32.h                                                     \
index b9bb4be,0000000..3c21f00
mode 100644,000000..100644
--- /dev/null
@@@ -1,12 -1,0 +1,12 @@@
- include $(SUBDIR)../config.mak
++include $(SUBDIR)../ffbuild/config.mak
 +
 +NAME = postproc
 +FFLIBS = avutil
 +
 +HEADERS = postprocess.h        \
 +          version.h            \
 +
 +OBJS = postprocess.o
 +
 +# Windows resource file
 +SLIBOBJS-$(HAVE_GNU_WINDRES) += postprocres.o
index 120ee33,0000000..f50ee0d
mode 100644,000000..100644
--- /dev/null
@@@ -1,24 -1,0 +1,24 @@@
- include $(SUBDIR)../config.mak
++include $(SUBDIR)../ffbuild/config.mak
 +
 +NAME = swresample
 +FFLIBS = avutil
 +
 +HEADERS = swresample.h                       \
 +          version.h                          \
 +
 +OBJS = audioconvert.o                        \
 +       dither.o                              \
 +       options.o                             \
 +       rematrix.o                            \
 +       resample.o                            \
 +       resample_dsp.o                        \
 +       swresample.o                          \
 +       swresample_frame.o                    \
 +
 +OBJS-$(CONFIG_LIBSOXR) += soxr_resample.o
 +OBJS-$(CONFIG_SHARED)  += log2_tab.o
 +
 +# Windows resource file
 +SLIBOBJS-$(HAVE_GNU_WINDRES) += swresampleres.o
 +
 +TESTPROGS = swresample
@@@ -1,5 -1,3 +1,5 @@@
- include $(SUBDIR)../config.mak
++include $(SUBDIR)../ffbuild/config.mak
 +
  NAME = swscale
  
  HEADERS = swscale.h                                                     \
diff --cc tests/fate.sh
@@@ -85,8 -83,7 +85,8 @@@ clean()
  report(){
      date=$(date -u +%Y%m%d%H%M%S)
      echo "fate:1:${date}:${slot}:${version}:$1:$2:${branch}:${comment}" >report
-     cat ${build}/config.fate >>report
 -    cat ${build}/avbuild/config.fate ${build}/tests/data/fate/*.rep >> report 2> /dev/null
++    cat ${build}/ffbuild/config.fate >>report
 +    cat ${build}/tests/data/fate/*.rep >>report 2>/dev/null || for i in ${build}/tests/data/fate/*.rep ; do cat "$i" >>report 2>/dev/null; done
      test -n "$fate_recv" && $tar report *.log | gzip | $fate_recv
  }
  
@@@ -108,7 -105,7 +108,7 @@@ test -d "$src" && update || checkout |
  
  cd ${workdir}
  
- version=$(${src}/version.sh ${src})
 -version=$(${src}/avbuild/version.sh ${src})
++version=$(${src}/ffbuild/version.sh ${src})
  test "$version" = "$(cat version-$slot 2>/dev/null)" && exit 0
  echo ${version} >version-$slot