parent
be4030ffb3
commit
ba2b668c84
@ -0,0 +1,12 @@ |
|||||||
|
/autom4te.cache/ |
||||||
|
/Makefile |
||||||
|
/config.status |
||||||
|
/configure.tmp |
||||||
|
/configure~ |
||||||
|
/.deps/ |
||||||
|
/.libs/ |
||||||
|
*.trs |
||||||
|
/unittests |
||||||
|
/test-driver |
||||||
|
/config.log |
||||||
|
/*.tmp |
||||||
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,3 @@ |
|||||||
|
ACLOCAL_AMFLAGS = -I m4
|
||||||
|
|
||||||
|
SUBDIRS = src
|
||||||
@ -0,0 +1,802 @@ |
|||||||
|
# Makefile.in generated by automake 1.16.1 from Makefile.am.
|
||||||
|
# @configure_input@
|
||||||
|
|
||||||
|
# Copyright (C) 1994-2018 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
# This Makefile.in is free software; the Free Software Foundation
|
||||||
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
|
# with or without modifications, as long as this notice is preserved.
|
||||||
|
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
|
||||||
|
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||||
|
# PARTICULAR PURPOSE.
|
||||||
|
|
||||||
|
@SET_MAKE@ |
||||||
|
VPATH = @srcdir@
|
||||||
|
am__is_gnu_make = { \
|
||||||
|
if test -z '$(MAKELEVEL)'; then \
|
||||||
|
false; \
|
||||||
|
elif test -n '$(MAKE_HOST)'; then \
|
||||||
|
true; \
|
||||||
|
elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
|
||||||
|
true; \
|
||||||
|
else \
|
||||||
|
false; \
|
||||||
|
fi; \
|
||||||
|
} |
||||||
|
am__make_running_with_option = \
|
||||||
|
case $${target_option-} in \
|
||||||
|
?) ;; \
|
||||||
|
*) echo "am__make_running_with_option: internal error: invalid" \
|
||||||
|
"target option '$${target_option-}' specified" >&2; \
|
||||||
|
exit 1;; \
|
||||||
|
esac; \
|
||||||
|
has_opt=no; \
|
||||||
|
sane_makeflags=$$MAKEFLAGS; \
|
||||||
|
if $(am__is_gnu_make); then \
|
||||||
|
sane_makeflags=$$MFLAGS; \
|
||||||
|
else \
|
||||||
|
case $$MAKEFLAGS in \
|
||||||
|
*\\[\ \ ]*) \
|
||||||
|
bs=\\; \
|
||||||
|
sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
|
||||||
|
| sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
|
||||||
|
esac; \
|
||||||
|
fi; \
|
||||||
|
skip_next=no; \
|
||||||
|
strip_trailopt () \
|
||||||
|
{ \
|
||||||
|
flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
|
||||||
|
}; \
|
||||||
|
for flg in $$sane_makeflags; do \
|
||||||
|
test $$skip_next = yes && { skip_next=no; continue; }; \
|
||||||
|
case $$flg in \
|
||||||
|
*=*|--*) continue;; \
|
||||||
|
-*I) strip_trailopt 'I'; skip_next=yes;; \
|
||||||
|
-*I?*) strip_trailopt 'I';; \
|
||||||
|
-*O) strip_trailopt 'O'; skip_next=yes;; \
|
||||||
|
-*O?*) strip_trailopt 'O';; \
|
||||||
|
-*l) strip_trailopt 'l'; skip_next=yes;; \
|
||||||
|
-*l?*) strip_trailopt 'l';; \
|
||||||
|
-[dEDm]) skip_next=yes;; \
|
||||||
|
-[JT]) skip_next=yes;; \
|
||||||
|
esac; \
|
||||||
|
case $$flg in \
|
||||||
|
*$$target_option*) has_opt=yes; break;; \
|
||||||
|
esac; \
|
||||||
|
done; \
|
||||||
|
test $$has_opt = yes
|
||||||
|
am__make_dryrun = (target_option=n; $(am__make_running_with_option))
|
||||||
|
am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
|
||||||
|
pkgdatadir = $(datadir)/@PACKAGE@
|
||||||
|
pkgincludedir = $(includedir)/@PACKAGE@
|
||||||
|
pkglibdir = $(libdir)/@PACKAGE@
|
||||||
|
pkglibexecdir = $(libexecdir)/@PACKAGE@
|
||||||
|
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
|
||||||
|
install_sh_DATA = $(install_sh) -c -m 644
|
||||||
|
install_sh_PROGRAM = $(install_sh) -c
|
||||||
|
install_sh_SCRIPT = $(install_sh) -c
|
||||||
|
INSTALL_HEADER = $(INSTALL_DATA)
|
||||||
|
transform = $(program_transform_name)
|
||||||
|
NORMAL_INSTALL = :
|
||||||
|
PRE_INSTALL = :
|
||||||
|
POST_INSTALL = :
|
||||||
|
NORMAL_UNINSTALL = :
|
||||||
|
PRE_UNINSTALL = :
|
||||||
|
POST_UNINSTALL = :
|
||||||
|
build_triplet = @build@
|
||||||
|
host_triplet = @host@
|
||||||
|
subdir = .
|
||||||
|
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
||||||
|
am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \
|
||||||
|
$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
|
||||||
|
$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
|
||||||
|
$(top_srcdir)/configure.ac
|
||||||
|
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
||||||
|
$(ACLOCAL_M4)
|
||||||
|
DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \
|
||||||
|
$(am__configure_deps) $(am__DIST_COMMON)
|
||||||
|
am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
|
||||||
|
configure.lineno config.status.lineno
|
||||||
|
mkinstalldirs = $(install_sh) -d
|
||||||
|
CONFIG_CLEAN_FILES =
|
||||||
|
CONFIG_CLEAN_VPATH_FILES =
|
||||||
|
AM_V_P = $(am__v_P_@AM_V@)
|
||||||
|
am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
|
||||||
|
am__v_P_0 = false
|
||||||
|
am__v_P_1 = :
|
||||||
|
AM_V_GEN = $(am__v_GEN_@AM_V@)
|
||||||
|
am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
|
||||||
|
am__v_GEN_0 = @echo " GEN " $@;
|
||||||
|
am__v_GEN_1 =
|
||||||
|
AM_V_at = $(am__v_at_@AM_V@)
|
||||||
|
am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
|
||||||
|
am__v_at_0 = @
|
||||||
|
am__v_at_1 =
|
||||||
|
SOURCES =
|
||||||
|
DIST_SOURCES =
|
||||||
|
RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
|
||||||
|
ctags-recursive dvi-recursive html-recursive info-recursive \
|
||||||
|
install-data-recursive install-dvi-recursive \
|
||||||
|
install-exec-recursive install-html-recursive \
|
||||||
|
install-info-recursive install-pdf-recursive \
|
||||||
|
install-ps-recursive install-recursive installcheck-recursive \
|
||||||
|
installdirs-recursive pdf-recursive ps-recursive \
|
||||||
|
tags-recursive uninstall-recursive
|
||||||
|
am__can_run_installinfo = \
|
||||||
|
case $$AM_UPDATE_INFO_DIR in \
|
||||||
|
n|no|NO) false;; \
|
||||||
|
*) (install-info --version) >/dev/null 2>&1;; \
|
||||||
|
esac
|
||||||
|
RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \
|
||||||
|
distclean-recursive maintainer-clean-recursive
|
||||||
|
am__recursive_targets = \
|
||||||
|
$(RECURSIVE_TARGETS) \
|
||||||
|
$(RECURSIVE_CLEAN_TARGETS) \
|
||||||
|
$(am__extra_recursive_targets)
|
||||||
|
AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
|
||||||
|
cscope distdir distdir-am dist dist-all distcheck
|
||||||
|
am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
|
||||||
|
# Read a list of newline-separated strings from the standard input,
|
||||||
|
# and print each of them once, without duplicates. Input order is
|
||||||
|
# *not* preserved.
|
||||||
|
am__uniquify_input = $(AWK) '\
|
||||||
|
BEGIN { nonempty = 0; } \
|
||||||
|
{ items[$$0] = 1; nonempty = 1; } \
|
||||||
|
END { if (nonempty) { for (i in items) print i; }; } \
|
||||||
|
' |
||||||
|
# Make sure the list of sources is unique. This is necessary because,
|
||||||
|
# e.g., the same source file might be shared among _SOURCES variables
|
||||||
|
# for different programs/libraries.
|
||||||
|
am__define_uniq_tagged_files = \
|
||||||
|
list='$(am__tagged_files)'; \
|
||||||
|
unique=`for i in $$list; do \
|
||||||
|
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
||||||
|
done | $(am__uniquify_input)`
|
||||||
|
ETAGS = etags
|
||||||
|
CTAGS = ctags
|
||||||
|
CSCOPE = cscope
|
||||||
|
DIST_SUBDIRS = $(SUBDIRS)
|
||||||
|
am__DIST_COMMON = $(srcdir)/Makefile.in ar-lib compile config.guess \
|
||||||
|
config.sub install-sh ltmain.sh missing
|
||||||
|
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
||||||
|
distdir = $(PACKAGE)-$(VERSION)
|
||||||
|
top_distdir = $(distdir)
|
||||||
|
am__remove_distdir = \
|
||||||
|
if test -d "$(distdir)"; then \
|
||||||
|
find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \
|
||||||
|
&& rm -rf "$(distdir)" \
|
||||||
|
|| { sleep 5 && rm -rf "$(distdir)"; }; \
|
||||||
|
else :; fi
|
||||||
|
am__post_remove_distdir = $(am__remove_distdir)
|
||||||
|
am__relativize = \
|
||||||
|
dir0=`pwd`; \
|
||||||
|
sed_first='s,^\([^/]*\)/.*$$,\1,'; \
|
||||||
|
sed_rest='s,^[^/]*/*,,'; \
|
||||||
|
sed_last='s,^.*/\([^/]*\)$$,\1,'; \
|
||||||
|
sed_butlast='s,/*[^/]*$$,,'; \
|
||||||
|
while test -n "$$dir1"; do \
|
||||||
|
first=`echo "$$dir1" | sed -e "$$sed_first"`; \
|
||||||
|
if test "$$first" != "."; then \
|
||||||
|
if test "$$first" = ".."; then \
|
||||||
|
dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
|
||||||
|
dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
|
||||||
|
else \
|
||||||
|
first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
|
||||||
|
if test "$$first2" = "$$first"; then \
|
||||||
|
dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
|
||||||
|
else \
|
||||||
|
dir2="../$$dir2"; \
|
||||||
|
fi; \
|
||||||
|
dir0="$$dir0"/"$$first"; \
|
||||||
|
fi; \
|
||||||
|
fi; \
|
||||||
|
dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
|
||||||
|
done; \
|
||||||
|
reldir="$$dir2"
|
||||||
|
DIST_ARCHIVES = $(distdir).tar.gz
|
||||||
|
GZIP_ENV = --best
|
||||||
|
DIST_TARGETS = dist-gzip
|
||||||
|
distuninstallcheck_listfiles = find . -type f -print
|
||||||
|
am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \
|
||||||
|
| sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$'
|
||||||
|
distcleancheck_listfiles = find . -type f -print
|
||||||
|
ACLOCAL = @ACLOCAL@
|
||||||
|
AMTAR = @AMTAR@
|
||||||
|
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
|
||||||
|
AR = @AR@
|
||||||
|
AUTOCONF = @AUTOCONF@
|
||||||
|
AUTOHEADER = @AUTOHEADER@
|
||||||
|
AUTOMAKE = @AUTOMAKE@
|
||||||
|
AWK = @AWK@
|
||||||
|
CC = @CC@
|
||||||
|
CCDEPMODE = @CCDEPMODE@
|
||||||
|
CFLAGS = @CFLAGS@
|
||||||
|
CPP = @CPP@
|
||||||
|
CPPFLAGS = @CPPFLAGS@
|
||||||
|
CXX = @CXX@
|
||||||
|
CXXCPP = @CXXCPP@
|
||||||
|
CXXDEPMODE = @CXXDEPMODE@
|
||||||
|
CXXFLAGS = @CXXFLAGS@
|
||||||
|
CYGPATH_W = @CYGPATH_W@
|
||||||
|
DEFS = @DEFS@
|
||||||
|
DEPDIR = @DEPDIR@
|
||||||
|
DLLTOOL = @DLLTOOL@
|
||||||
|
DSYMUTIL = @DSYMUTIL@
|
||||||
|
DUMPBIN = @DUMPBIN@
|
||||||
|
ECHO_C = @ECHO_C@
|
||||||
|
ECHO_N = @ECHO_N@
|
||||||
|
ECHO_T = @ECHO_T@
|
||||||
|
EGREP = @EGREP@
|
||||||
|
EXEEXT = @EXEEXT@
|
||||||
|
FFMPEG_LIBS = @FFMPEG_LIBS@
|
||||||
|
FGREP = @FGREP@
|
||||||
|
GREP = @GREP@
|
||||||
|
INSTALL = @INSTALL@
|
||||||
|
INSTALL_DATA = @INSTALL_DATA@
|
||||||
|
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
||||||
|
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
||||||
|
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
|
||||||
|
LD = @LD@
|
||||||
|
LDFLAGS = @LDFLAGS@
|
||||||
|
LIBOBJS = @LIBOBJS@
|
||||||
|
LIBS = @LIBS@
|
||||||
|
LIBTOOL = @LIBTOOL@
|
||||||
|
LIPO = @LIPO@
|
||||||
|
LN_S = @LN_S@
|
||||||
|
LTLIBOBJS = @LTLIBOBJS@
|
||||||
|
LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
|
||||||
|
MAINT = @MAINT@
|
||||||
|
MAKEINFO = @MAKEINFO@
|
||||||
|
MANIFEST_TOOL = @MANIFEST_TOOL@
|
||||||
|
MKDIR_P = @MKDIR_P@
|
||||||
|
NM = @NM@
|
||||||
|
NMEDIT = @NMEDIT@
|
||||||
|
OBJDUMP = @OBJDUMP@
|
||||||
|
OBJEXT = @OBJEXT@
|
||||||
|
OTOOL = @OTOOL@
|
||||||
|
OTOOL64 = @OTOOL64@
|
||||||
|
PACKAGE = @PACKAGE@
|
||||||
|
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
|
||||||
|
PACKAGE_NAME = @PACKAGE_NAME@
|
||||||
|
PACKAGE_STRING = @PACKAGE_STRING@
|
||||||
|
PACKAGE_TARNAME = @PACKAGE_TARNAME@
|
||||||
|
PACKAGE_URL = @PACKAGE_URL@
|
||||||
|
PACKAGE_VERSION = @PACKAGE_VERSION@
|
||||||
|
PATH_SEPARATOR = @PATH_SEPARATOR@
|
||||||
|
RANLIB = @RANLIB@
|
||||||
|
SED = @SED@
|
||||||
|
SET_MAKE = @SET_MAKE@
|
||||||
|
SHELL = @SHELL@
|
||||||
|
STRIP = @STRIP@
|
||||||
|
VERSION = @VERSION@
|
||||||
|
VERSION_INFO = @VERSION_INFO@
|
||||||
|
abs_builddir = @abs_builddir@
|
||||||
|
abs_srcdir = @abs_srcdir@
|
||||||
|
abs_top_builddir = @abs_top_builddir@
|
||||||
|
abs_top_srcdir = @abs_top_srcdir@
|
||||||
|
ac_ct_AR = @ac_ct_AR@
|
||||||
|
ac_ct_CC = @ac_ct_CC@
|
||||||
|
ac_ct_CXX = @ac_ct_CXX@
|
||||||
|
ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
|
||||||
|
am__include = @am__include@
|
||||||
|
am__leading_dot = @am__leading_dot@
|
||||||
|
am__quote = @am__quote@
|
||||||
|
am__tar = @am__tar@
|
||||||
|
am__untar = @am__untar@
|
||||||
|
bindir = @bindir@
|
||||||
|
build = @build@
|
||||||
|
build_alias = @build_alias@
|
||||||
|
build_cpu = @build_cpu@
|
||||||
|
build_os = @build_os@
|
||||||
|
build_vendor = @build_vendor@
|
||||||
|
builddir = @builddir@
|
||||||
|
datadir = @datadir@
|
||||||
|
datarootdir = @datarootdir@
|
||||||
|
docdir = @docdir@
|
||||||
|
dvidir = @dvidir@
|
||||||
|
exec_prefix = @exec_prefix@
|
||||||
|
host = @host@
|
||||||
|
host_alias = @host_alias@
|
||||||
|
host_cpu = @host_cpu@
|
||||||
|
host_os = @host_os@
|
||||||
|
host_vendor = @host_vendor@
|
||||||
|
htmldir = @htmldir@
|
||||||
|
includedir = @includedir@
|
||||||
|
infodir = @infodir@
|
||||||
|
install_sh = @install_sh@
|
||||||
|
libdir = @libdir@
|
||||||
|
libexecdir = @libexecdir@
|
||||||
|
localedir = @localedir@
|
||||||
|
localstatedir = @localstatedir@
|
||||||
|
mandir = @mandir@
|
||||||
|
mkdir_p = @mkdir_p@
|
||||||
|
oldincludedir = @oldincludedir@
|
||||||
|
pdfdir = @pdfdir@
|
||||||
|
prefix = @prefix@
|
||||||
|
program_transform_name = @program_transform_name@
|
||||||
|
psdir = @psdir@
|
||||||
|
runstatedir = @runstatedir@
|
||||||
|
sbindir = @sbindir@
|
||||||
|
sharedstatedir = @sharedstatedir@
|
||||||
|
srcdir = @srcdir@
|
||||||
|
sysconfdir = @sysconfdir@
|
||||||
|
target_alias = @target_alias@
|
||||||
|
top_build_prefix = @top_build_prefix@
|
||||||
|
top_builddir = @top_builddir@
|
||||||
|
top_srcdir = @top_srcdir@
|
||||||
|
ACLOCAL_AMFLAGS = -I m4
|
||||||
|
SUBDIRS = src
|
||||||
|
all: all-recursive |
||||||
|
|
||||||
|
.SUFFIXES: |
||||||
|
am--refresh: Makefile |
||||||
|
@:
|
||||||
|
$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) |
||||||
|
@for dep in $?; do \
|
||||||
|
case '$(am__configure_deps)' in \
|
||||||
|
*$$dep*) \
|
||||||
|
echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \
|
||||||
|
$(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \
|
||||||
|
&& exit 0; \
|
||||||
|
exit 1;; \
|
||||||
|
esac; \
|
||||||
|
done; \
|
||||||
|
echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \
|
||||||
|
$(am__cd) $(top_srcdir) && \
|
||||||
|
$(AUTOMAKE) --foreign Makefile
|
||||||
|
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status |
||||||
|
@case '$?' in \
|
||||||
|
*config.status*) \
|
||||||
|
echo ' $(SHELL) ./config.status'; \
|
||||||
|
$(SHELL) ./config.status;; \
|
||||||
|
*) \
|
||||||
|
echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles)'; \
|
||||||
|
cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles);; \
|
||||||
|
esac;
|
||||||
|
|
||||||
|
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) |
||||||
|
$(SHELL) ./config.status --recheck
|
||||||
|
|
||||||
|
$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) |
||||||
|
$(am__cd) $(srcdir) && $(AUTOCONF)
|
||||||
|
$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) |
||||||
|
$(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
|
||||||
|
$(am__aclocal_m4_deps): |
||||||
|
|
||||||
|
mostlyclean-libtool: |
||||||
|
-rm -f *.lo
|
||||||
|
|
||||||
|
clean-libtool: |
||||||
|
-rm -rf .libs _libs
|
||||||
|
|
||||||
|
distclean-libtool: |
||||||
|
-rm -f libtool config.lt
|
||||||
|
|
||||||
|
# This directory's subdirectories are mostly independent; you can cd
|
||||||
|
# into them and run 'make' without going through this Makefile.
|
||||||
|
# To change the values of 'make' variables: instead of editing Makefiles,
|
||||||
|
# (1) if the variable is set in 'config.status', edit 'config.status'
|
||||||
|
# (which will cause the Makefiles to be regenerated when you run 'make');
|
||||||
|
# (2) otherwise, pass the desired values on the 'make' command line.
|
||||||
|
$(am__recursive_targets): |
||||||
|
@fail=; \
|
||||||
|
if $(am__make_keepgoing); then \
|
||||||
|
failcom='fail=yes'; \
|
||||||
|
else \
|
||||||
|
failcom='exit 1'; \
|
||||||
|
fi; \
|
||||||
|
dot_seen=no; \
|
||||||
|
target=`echo $@ | sed s/-recursive//`; \
|
||||||
|
case "$@" in \
|
||||||
|
distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
|
||||||
|
*) list='$(SUBDIRS)' ;; \
|
||||||
|
esac; \
|
||||||
|
for subdir in $$list; do \
|
||||||
|
echo "Making $$target in $$subdir"; \
|
||||||
|
if test "$$subdir" = "."; then \
|
||||||
|
dot_seen=yes; \
|
||||||
|
local_target="$$target-am"; \
|
||||||
|
else \
|
||||||
|
local_target="$$target"; \
|
||||||
|
fi; \
|
||||||
|
($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
|
||||||
|
|| eval $$failcom; \
|
||||||
|
done; \
|
||||||
|
if test "$$dot_seen" = "no"; then \
|
||||||
|
$(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
|
||||||
|
fi; test -z "$$fail"
|
||||||
|
|
||||||
|
ID: $(am__tagged_files) |
||||||
|
$(am__define_uniq_tagged_files); mkid -fID $$unique
|
||||||
|
tags: tags-recursive |
||||||
|
TAGS: tags |
||||||
|
|
||||||
|
tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) |
||||||
|
set x; \
|
||||||
|
here=`pwd`; \
|
||||||
|
if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
|
||||||
|
include_option=--etags-include; \
|
||||||
|
empty_fix=.; \
|
||||||
|
else \
|
||||||
|
include_option=--include; \
|
||||||
|
empty_fix=; \
|
||||||
|
fi; \
|
||||||
|
list='$(SUBDIRS)'; for subdir in $$list; do \
|
||||||
|
if test "$$subdir" = .; then :; else \
|
||||||
|
test ! -f $$subdir/TAGS || \
|
||||||
|
set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
|
||||||
|
fi; \
|
||||||
|
done; \
|
||||||
|
$(am__define_uniq_tagged_files); \
|
||||||
|
shift; \
|
||||||
|
if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
|
||||||
|
test -n "$$unique" || unique=$$empty_fix; \
|
||||||
|
if test $$# -gt 0; then \
|
||||||
|
$(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
|
||||||
|
"$$@" $$unique; \
|
||||||
|
else \
|
||||||
|
$(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
|
||||||
|
$$unique; \
|
||||||
|
fi; \
|
||||||
|
fi
|
||||||
|
ctags: ctags-recursive |
||||||
|
|
||||||
|
CTAGS: ctags |
||||||
|
ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) |
||||||
|
$(am__define_uniq_tagged_files); \
|
||||||
|
test -z "$(CTAGS_ARGS)$$unique" \
|
||||||
|
|| $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
|
||||||
|
$$unique
|
||||||
|
|
||||||
|
GTAGS: |
||||||
|
here=`$(am__cd) $(top_builddir) && pwd` \
|
||||||
|
&& $(am__cd) $(top_srcdir) \
|
||||||
|
&& gtags -i $(GTAGS_ARGS) "$$here"
|
||||||
|
cscope: cscope.files |
||||||
|
test ! -s cscope.files \
|
||||||
|
|| $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS)
|
||||||
|
clean-cscope: |
||||||
|
-rm -f cscope.files
|
||||||
|
cscope.files: clean-cscope cscopelist |
||||||
|
cscopelist: cscopelist-recursive |
||||||
|
|
||||||
|
cscopelist-am: $(am__tagged_files) |
||||||
|
list='$(am__tagged_files)'; \
|
||||||
|
case "$(srcdir)" in \
|
||||||
|
[\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
|
||||||
|
*) sdir=$(subdir)/$(srcdir) ;; \
|
||||||
|
esac; \
|
||||||
|
for i in $$list; do \
|
||||||
|
if test -f "$$i"; then \
|
||||||
|
echo "$(subdir)/$$i"; \
|
||||||
|
else \
|
||||||
|
echo "$$sdir/$$i"; \
|
||||||
|
fi; \
|
||||||
|
done >> $(top_builddir)/cscope.files
|
||||||
|
|
||||||
|
distclean-tags: |
||||||
|
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
|
||||||
|
-rm -f cscope.out cscope.in.out cscope.po.out cscope.files
|
||||||
|
|
||||||
|
distdir: $(BUILT_SOURCES) |
||||||
|
$(MAKE) $(AM_MAKEFLAGS) distdir-am
|
||||||
|
|
||||||
|
distdir-am: $(DISTFILES) |
||||||
|
$(am__remove_distdir)
|
||||||
|
test -d "$(distdir)" || mkdir "$(distdir)"
|
||||||
|
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
||||||
|
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
||||||
|
list='$(DISTFILES)'; \
|
||||||
|
dist_files=`for file in $$list; do echo $$file; done | \
|
||||||
|
sed -e "s|^$$srcdirstrip/||;t" \
|
||||||
|
-e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
|
||||||
|
case $$dist_files in \
|
||||||
|
*/*) $(MKDIR_P) `echo "$$dist_files" | \
|
||||||
|
sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
|
||||||
|
sort -u` ;; \
|
||||||
|
esac; \
|
||||||
|
for file in $$dist_files; do \
|
||||||
|
if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
|
||||||
|
if test -d $$d/$$file; then \
|
||||||
|
dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
|
||||||
|
if test -d "$(distdir)/$$file"; then \
|
||||||
|
find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
|
||||||
|
fi; \
|
||||||
|
if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
|
||||||
|
cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
|
||||||
|
find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
|
||||||
|
fi; \
|
||||||
|
cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
|
||||||
|
else \
|
||||||
|
test -f "$(distdir)/$$file" \
|
||||||
|
|| cp -p $$d/$$file "$(distdir)/$$file" \
|
||||||
|
|| exit 1; \
|
||||||
|
fi; \
|
||||||
|
done
|
||||||
|
@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
|
||||||
|
if test "$$subdir" = .; then :; else \
|
||||||
|
$(am__make_dryrun) \
|
||||||
|
|| test -d "$(distdir)/$$subdir" \
|
||||||
|
|| $(MKDIR_P) "$(distdir)/$$subdir" \
|
||||||
|
|| exit 1; \
|
||||||
|
dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
|
||||||
|
$(am__relativize); \
|
||||||
|
new_distdir=$$reldir; \
|
||||||
|
dir1=$$subdir; dir2="$(top_distdir)"; \
|
||||||
|
$(am__relativize); \
|
||||||
|
new_top_distdir=$$reldir; \
|
||||||
|
echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
|
||||||
|
echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
|
||||||
|
($(am__cd) $$subdir && \
|
||||||
|
$(MAKE) $(AM_MAKEFLAGS) \
|
||||||
|
top_distdir="$$new_top_distdir" \
|
||||||
|
distdir="$$new_distdir" \
|
||||||
|
am__remove_distdir=: \
|
||||||
|
am__skip_length_check=: \
|
||||||
|
am__skip_mode_fix=: \
|
||||||
|
distdir) \
|
||||||
|
|| exit 1; \
|
||||||
|
fi; \
|
||||||
|
done
|
||||||
|
-test -n "$(am__skip_mode_fix)" \
|
||||||
|
|| find "$(distdir)" -type d ! -perm -755 \
|
||||||
|
-exec chmod u+rwx,go+rx {} \; -o \
|
||||||
|
! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
|
||||||
|
! -type d ! -perm -400 -exec chmod a+r {} \; -o \
|
||||||
|
! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
|
||||||
|
|| chmod -R a+r "$(distdir)"
|
||||||
|
dist-gzip: distdir |
||||||
|
tardir=$(distdir) && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz
|
||||||
|
$(am__post_remove_distdir)
|
||||||
|
|
||||||
|
dist-bzip2: distdir |
||||||
|
tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2
|
||||||
|
$(am__post_remove_distdir)
|
||||||
|
|
||||||
|
dist-lzip: distdir |
||||||
|
tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz
|
||||||
|
$(am__post_remove_distdir)
|
||||||
|
|
||||||
|
dist-xz: distdir |
||||||
|
tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz
|
||||||
|
$(am__post_remove_distdir)
|
||||||
|
|
||||||
|
dist-tarZ: distdir |
||||||
|
@echo WARNING: "Support for distribution archives compressed with" \
|
||||||
|
"legacy program 'compress' is deprecated." >&2
|
||||||
|
@echo WARNING: "It will be removed altogether in Automake 2.0" >&2
|
||||||
|
tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
|
||||||
|
$(am__post_remove_distdir)
|
||||||
|
|
||||||
|
dist-shar: distdir |
||||||
|
@echo WARNING: "Support for shar distribution archives is" \
|
||||||
|
"deprecated." >&2
|
||||||
|
@echo WARNING: "It will be removed altogether in Automake 2.0" >&2
|
||||||
|
shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz
|
||||||
|
$(am__post_remove_distdir)
|
||||||
|
|
||||||
|
dist-zip: distdir |
||||||
|
-rm -f $(distdir).zip
|
||||||
|
zip -rq $(distdir).zip $(distdir)
|
||||||
|
$(am__post_remove_distdir)
|
||||||
|
|
||||||
|
dist dist-all: |
||||||
|
$(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:'
|
||||||
|
$(am__post_remove_distdir)
|
||||||
|
|
||||||
|
# This target untars the dist file and tries a VPATH configuration. Then
|
||||||
|
# it guarantees that the distribution is self-contained by making another
|
||||||
|
# tarfile.
|
||||||
|
distcheck: dist |
||||||
|
case '$(DIST_ARCHIVES)' in \
|
||||||
|
*.tar.gz*) \
|
||||||
|
eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).tar.gz | $(am__untar) ;;\
|
||||||
|
*.tar.bz2*) \
|
||||||
|
bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\
|
||||||
|
*.tar.lz*) \
|
||||||
|
lzip -dc $(distdir).tar.lz | $(am__untar) ;;\
|
||||||
|
*.tar.xz*) \
|
||||||
|
xz -dc $(distdir).tar.xz | $(am__untar) ;;\
|
||||||
|
*.tar.Z*) \
|
||||||
|
uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
|
||||||
|
*.shar.gz*) \
|
||||||
|
eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\
|
||||||
|
*.zip*) \
|
||||||
|
unzip $(distdir).zip ;;\
|
||||||
|
esac
|
||||||
|
chmod -R a-w $(distdir)
|
||||||
|
chmod u+w $(distdir)
|
||||||
|
mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst
|
||||||
|
chmod a-w $(distdir)
|
||||||
|
test -d $(distdir)/_build || exit 0; \
|
||||||
|
dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
|
||||||
|
&& dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
|
||||||
|
&& am__cwd=`pwd` \
|
||||||
|
&& $(am__cd) $(distdir)/_build/sub \
|
||||||
|
&& ../../configure \
|
||||||
|
$(AM_DISTCHECK_CONFIGURE_FLAGS) \
|
||||||
|
$(DISTCHECK_CONFIGURE_FLAGS) \
|
||||||
|
--srcdir=../.. --prefix="$$dc_install_base" \
|
||||||
|
&& $(MAKE) $(AM_MAKEFLAGS) \
|
||||||
|
&& $(MAKE) $(AM_MAKEFLAGS) dvi \
|
||||||
|
&& $(MAKE) $(AM_MAKEFLAGS) check \
|
||||||
|
&& $(MAKE) $(AM_MAKEFLAGS) install \
|
||||||
|
&& $(MAKE) $(AM_MAKEFLAGS) installcheck \
|
||||||
|
&& $(MAKE) $(AM_MAKEFLAGS) uninstall \
|
||||||
|
&& $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
|
||||||
|
distuninstallcheck \
|
||||||
|
&& chmod -R a-w "$$dc_install_base" \
|
||||||
|
&& ({ \
|
||||||
|
(cd ../.. && umask 077 && mkdir "$$dc_destdir") \
|
||||||
|
&& $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
|
||||||
|
&& $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
|
||||||
|
&& $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
|
||||||
|
distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
|
||||||
|
} || { rm -rf "$$dc_destdir"; exit 1; }) \
|
||||||
|
&& rm -rf "$$dc_destdir" \
|
||||||
|
&& $(MAKE) $(AM_MAKEFLAGS) dist \
|
||||||
|
&& rm -rf $(DIST_ARCHIVES) \
|
||||||
|
&& $(MAKE) $(AM_MAKEFLAGS) distcleancheck \
|
||||||
|
&& cd "$$am__cwd" \
|
||||||
|
|| exit 1
|
||||||
|
$(am__post_remove_distdir)
|
||||||
|
@(echo "$(distdir) archives ready for distribution: "; \
|
||||||
|
list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
|
||||||
|
sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'
|
||||||
|
distuninstallcheck: |
||||||
|
@test -n '$(distuninstallcheck_dir)' || { \
|
||||||
|
echo 'ERROR: trying to run $@ with an empty' \
|
||||||
|
'$$(distuninstallcheck_dir)' >&2; \
|
||||||
|
exit 1; \
|
||||||
|
}; \
|
||||||
|
$(am__cd) '$(distuninstallcheck_dir)' || { \
|
||||||
|
echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \
|
||||||
|
exit 1; \
|
||||||
|
}; \
|
||||||
|
test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \
|
||||||
|
|| { echo "ERROR: files left after uninstall:" ; \
|
||||||
|
if test -n "$(DESTDIR)"; then \
|
||||||
|
echo " (check DESTDIR support)"; \
|
||||||
|
fi ; \
|
||||||
|
$(distuninstallcheck_listfiles) ; \
|
||||||
|
exit 1; } >&2
|
||||||
|
distcleancheck: distclean |
||||||
|
@if test '$(srcdir)' = . ; then \
|
||||||
|
echo "ERROR: distcleancheck can only run from a VPATH build" ; \
|
||||||
|
exit 1 ; \
|
||||||
|
fi
|
||||||
|
@test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
|
||||||
|
|| { echo "ERROR: files left in build directory after distclean:" ; \
|
||||||
|
$(distcleancheck_listfiles) ; \
|
||||||
|
exit 1; } >&2
|
||||||
|
check-am: all-am |
||||||
|
check: check-recursive |
||||||
|
all-am: Makefile |
||||||
|
installdirs: installdirs-recursive |
||||||
|
installdirs-am: |
||||||
|
install: install-recursive |
||||||
|
install-exec: install-exec-recursive |
||||||
|
install-data: install-data-recursive |
||||||
|
uninstall: uninstall-recursive |
||||||
|
|
||||||
|
install-am: all-am |
||||||
|
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
|
||||||
|
|
||||||
|
installcheck: installcheck-recursive |
||||||
|
install-strip: |
||||||
|
if test -z '$(STRIP)'; then \
|
||||||
|
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
|
||||||
|
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
|
||||||
|
install; \
|
||||||
|
else \
|
||||||
|
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
|
||||||
|
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
|
||||||
|
"INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
|
||||||
|
fi
|
||||||
|
mostlyclean-generic: |
||||||
|
|
||||||
|
clean-generic: |
||||||
|
|
||||||
|
distclean-generic: |
||||||
|
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
|
||||||
|
-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
|
||||||
|
|
||||||
|
maintainer-clean-generic: |
||||||
|
@echo "This command is intended for maintainers to use"
|
||||||
|
@echo "it deletes files that may require special tools to rebuild."
|
||||||
|
clean: clean-recursive |
||||||
|
|
||||||
|
clean-am: clean-generic clean-libtool mostlyclean-am |
||||||
|
|
||||||
|
distclean: distclean-recursive |
||||||
|
-rm -f $(am__CONFIG_DISTCLEAN_FILES)
|
||||||
|
-rm -f Makefile
|
||||||
|
distclean-am: clean-am distclean-generic distclean-libtool \
|
||||||
|
distclean-tags
|
||||||
|
|
||||||
|
dvi: dvi-recursive |
||||||
|
|
||||||
|
dvi-am: |
||||||
|
|
||||||
|
html: html-recursive |
||||||
|
|
||||||
|
html-am: |
||||||
|
|
||||||
|
info: info-recursive |
||||||
|
|
||||||
|
info-am: |
||||||
|
|
||||||
|
install-data-am: |
||||||
|
|
||||||
|
install-dvi: install-dvi-recursive |
||||||
|
|
||||||
|
install-dvi-am: |
||||||
|
|
||||||
|
install-exec-am: |
||||||
|
|
||||||
|
install-html: install-html-recursive |
||||||
|
|
||||||
|
install-html-am: |
||||||
|
|
||||||
|
install-info: install-info-recursive |
||||||
|
|
||||||
|
install-info-am: |
||||||
|
|
||||||
|
install-man: |
||||||
|
|
||||||
|
install-pdf: install-pdf-recursive |
||||||
|
|
||||||
|
install-pdf-am: |
||||||
|
|
||||||
|
install-ps: install-ps-recursive |
||||||
|
|
||||||
|
install-ps-am: |
||||||
|
|
||||||
|
installcheck-am: |
||||||
|
|
||||||
|
maintainer-clean: maintainer-clean-recursive |
||||||
|
-rm -f $(am__CONFIG_DISTCLEAN_FILES)
|
||||||
|
-rm -rf $(top_srcdir)/autom4te.cache
|
||||||
|
-rm -f Makefile
|
||||||
|
maintainer-clean-am: distclean-am maintainer-clean-generic |
||||||
|
|
||||||
|
mostlyclean: mostlyclean-recursive |
||||||
|
|
||||||
|
mostlyclean-am: mostlyclean-generic mostlyclean-libtool |
||||||
|
|
||||||
|
pdf: pdf-recursive |
||||||
|
|
||||||
|
pdf-am: |
||||||
|
|
||||||
|
ps: ps-recursive |
||||||
|
|
||||||
|
ps-am: |
||||||
|
|
||||||
|
uninstall-am: |
||||||
|
|
||||||
|
.MAKE: $(am__recursive_targets) install-am install-strip |
||||||
|
|
||||||
|
.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \
|
||||||
|
am--refresh check check-am clean clean-cscope clean-generic \
|
||||||
|
clean-libtool cscope cscopelist-am ctags ctags-am dist \
|
||||||
|
dist-all dist-bzip2 dist-gzip dist-lzip dist-shar dist-tarZ \
|
||||||
|
dist-xz dist-zip distcheck distclean distclean-generic \
|
||||||
|
distclean-libtool distclean-tags distcleancheck distdir \
|
||||||
|
distuninstallcheck dvi dvi-am html html-am info info-am \
|
||||||
|
install install-am install-data install-data-am install-dvi \
|
||||||
|
install-dvi-am install-exec install-exec-am install-html \
|
||||||
|
install-html-am install-info install-info-am install-man \
|
||||||
|
install-pdf install-pdf-am install-ps install-ps-am \
|
||||||
|
install-strip installcheck installcheck-am installdirs \
|
||||||
|
installdirs-am maintainer-clean maintainer-clean-generic \
|
||||||
|
mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \
|
||||||
|
ps ps-am tags tags-am uninstall uninstall-am
|
||||||
|
|
||||||
|
.PRECIOUS: Makefile |
||||||
|
|
||||||
|
|
||||||
|
# Tell versions [3.59,3.63) of GNU make to not export all variables.
|
||||||
|
# Otherwise a system limit (for SysV at least) may be exceeded.
|
||||||
|
.NOEXPORT: |
||||||
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,270 @@ |
|||||||
|
#! /bin/sh |
||||||
|
# Wrapper for Microsoft lib.exe |
||||||
|
|
||||||
|
me=ar-lib |
||||||
|
scriptversion=2012-03-01.08; # UTC |
||||||
|
|
||||||
|
# Copyright (C) 2010-2018 Free Software Foundation, Inc. |
||||||
|
# Written by Peter Rosin <peda@lysator.liu.se>. |
||||||
|
# |
||||||
|
# This program is free software; you can redistribute it and/or modify |
||||||
|
# it under the terms of the GNU General Public License as published by |
||||||
|
# the Free Software Foundation; either version 2, or (at your option) |
||||||
|
# any later version. |
||||||
|
# |
||||||
|
# This program is distributed in the hope that it will be useful, |
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
# GNU General Public License for more details. |
||||||
|
# |
||||||
|
# You should have received a copy of the GNU General Public License |
||||||
|
# along with this program. If not, see <https://www.gnu.org/licenses/>. |
||||||
|
|
||||||
|
# As a special exception to the GNU General Public License, if you |
||||||
|
# distribute this file as part of a program that contains a |
||||||
|
# configuration script generated by Autoconf, you may include it under |
||||||
|
# the same distribution terms that you use for the rest of that program. |
||||||
|
|
||||||
|
# This file is maintained in Automake, please report |
||||||
|
# bugs to <bug-automake@gnu.org> or send patches to |
||||||
|
# <automake-patches@gnu.org>. |
||||||
|
|
||||||
|
|
||||||
|
# func_error message |
||||||
|
func_error () |
||||||
|
{ |
||||||
|
echo "$me: $1" 1>&2 |
||||||
|
exit 1 |
||||||
|
} |
||||||
|
|
||||||
|
file_conv= |
||||||
|
|
||||||
|
# func_file_conv build_file |
||||||
|
# Convert a $build file to $host form and store it in $file |
||||||
|
# Currently only supports Windows hosts. |
||||||
|
func_file_conv () |
||||||
|
{ |
||||||
|
file=$1 |
||||||
|
case $file in |
||||||
|
/ | /[!/]*) # absolute file, and not a UNC file |
||||||
|
if test -z "$file_conv"; then |
||||||
|
# lazily determine how to convert abs files |
||||||
|
case `uname -s` in |
||||||
|
MINGW*) |
||||||
|
file_conv=mingw |
||||||
|
;; |
||||||
|
CYGWIN*) |
||||||
|
file_conv=cygwin |
||||||
|
;; |
||||||
|
*) |
||||||
|
file_conv=wine |
||||||
|
;; |
||||||
|
esac |
||||||
|
fi |
||||||
|
case $file_conv in |
||||||
|
mingw) |
||||||
|
file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` |
||||||
|
;; |
||||||
|
cygwin) |
||||||
|
file=`cygpath -m "$file" || echo "$file"` |
||||||
|
;; |
||||||
|
wine) |
||||||
|
file=`winepath -w "$file" || echo "$file"` |
||||||
|
;; |
||||||
|
esac |
||||||
|
;; |
||||||
|
esac |
||||||
|
} |
||||||
|
|
||||||
|
# func_at_file at_file operation archive |
||||||
|
# Iterate over all members in AT_FILE performing OPERATION on ARCHIVE |
||||||
|
# for each of them. |
||||||
|
# When interpreting the content of the @FILE, do NOT use func_file_conv, |
||||||
|
# since the user would need to supply preconverted file names to |
||||||
|
# binutils ar, at least for MinGW. |
||||||
|
func_at_file () |
||||||
|
{ |
||||||
|
operation=$2 |
||||||
|
archive=$3 |
||||||
|
at_file_contents=`cat "$1"` |
||||||
|
eval set x "$at_file_contents" |
||||||
|
shift |
||||||
|
|
||||||
|
for member |
||||||
|
do |
||||||
|
$AR -NOLOGO $operation:"$member" "$archive" || exit $? |
||||||
|
done |
||||||
|
} |
||||||
|
|
||||||
|
case $1 in |
||||||
|
'') |
||||||
|
func_error "no command. Try '$0 --help' for more information." |
||||||
|
;; |
||||||
|
-h | --h*) |
||||||
|
cat <<EOF |
||||||
|
Usage: $me [--help] [--version] PROGRAM ACTION ARCHIVE [MEMBER...] |
||||||
|
|
||||||
|
Members may be specified in a file named with @FILE. |
||||||
|
EOF |
||||||
|
exit $? |
||||||
|
;; |
||||||
|
-v | --v*) |
||||||
|
echo "$me, version $scriptversion" |
||||||
|
exit $? |
||||||
|
;; |
||||||
|
esac |
||||||
|
|
||||||
|
if test $# -lt 3; then |
||||||
|
func_error "you must specify a program, an action and an archive" |
||||||
|
fi |
||||||
|
|
||||||
|
AR=$1 |
||||||
|
shift |
||||||
|
while : |
||||||
|
do |
||||||
|
if test $# -lt 2; then |
||||||
|
func_error "you must specify a program, an action and an archive" |
||||||
|
fi |
||||||
|
case $1 in |
||||||
|
-lib | -LIB \ |
||||||
|
| -ltcg | -LTCG \ |
||||||
|
| -machine* | -MACHINE* \ |
||||||
|
| -subsystem* | -SUBSYSTEM* \ |
||||||
|
| -verbose | -VERBOSE \ |
||||||
|
| -wx* | -WX* ) |
||||||
|
AR="$AR $1" |
||||||
|
shift |
||||||
|
;; |
||||||
|
*) |
||||||
|
action=$1 |
||||||
|
shift |
||||||
|
break |
||||||
|
;; |
||||||
|
esac |
||||||
|
done |
||||||
|
orig_archive=$1 |
||||||
|
shift |
||||||
|
func_file_conv "$orig_archive" |
||||||
|
archive=$file |
||||||
|
|
||||||
|
# strip leading dash in $action |
||||||
|
action=${action#-} |
||||||
|
|
||||||
|
delete= |
||||||
|
extract= |
||||||
|
list= |
||||||
|
quick= |
||||||
|
replace= |
||||||
|
index= |
||||||
|
create= |
||||||
|
|
||||||
|
while test -n "$action" |
||||||
|
do |
||||||
|
case $action in |
||||||
|
d*) delete=yes ;; |
||||||
|
x*) extract=yes ;; |
||||||
|
t*) list=yes ;; |
||||||
|
q*) quick=yes ;; |
||||||
|
r*) replace=yes ;; |
||||||
|
s*) index=yes ;; |
||||||
|
S*) ;; # the index is always updated implicitly |
||||||
|
c*) create=yes ;; |
||||||
|
u*) ;; # TODO: don't ignore the update modifier |
||||||
|
v*) ;; # TODO: don't ignore the verbose modifier |
||||||
|
*) |
||||||
|
func_error "unknown action specified" |
||||||
|
;; |
||||||
|
esac |
||||||
|
action=${action#?} |
||||||
|
done |
||||||
|
|
||||||
|
case $delete$extract$list$quick$replace,$index in |
||||||
|
yes,* | ,yes) |
||||||
|
;; |
||||||
|
yesyes*) |
||||||
|
func_error "more than one action specified" |
||||||
|
;; |
||||||
|
*) |
||||||
|
func_error "no action specified" |
||||||
|
;; |
||||||
|
esac |
||||||
|
|
||||||
|
if test -n "$delete"; then |
||||||
|
if test ! -f "$orig_archive"; then |
||||||
|
func_error "archive not found" |
||||||
|
fi |
||||||
|
for member |
||||||
|
do |
||||||
|
case $1 in |
||||||
|
@*) |
||||||
|
func_at_file "${1#@}" -REMOVE "$archive" |
||||||
|
;; |
||||||
|
*) |
||||||
|
func_file_conv "$1" |
||||||
|
$AR -NOLOGO -REMOVE:"$file" "$archive" || exit $? |
||||||
|
;; |
||||||
|
esac |
||||||
|
done |
||||||
|
|
||||||
|
elif test -n "$extract"; then |
||||||
|
if test ! -f "$orig_archive"; then |
||||||
|
func_error "archive not found" |
||||||
|
fi |
||||||
|
if test $# -gt 0; then |
||||||
|
for member |
||||||
|
do |
||||||
|
case $1 in |
||||||
|
@*) |
||||||
|
func_at_file "${1#@}" -EXTRACT "$archive" |
||||||
|
;; |
||||||
|
*) |
||||||
|
func_file_conv "$1" |
||||||
|
$AR -NOLOGO -EXTRACT:"$file" "$archive" || exit $? |
||||||
|
;; |
||||||
|
esac |
||||||
|
done |
||||||
|
else |
||||||
|
$AR -NOLOGO -LIST "$archive" | sed -e 's/\\/\\\\/g' | while read member |
||||||
|
do |
||||||
|
$AR -NOLOGO -EXTRACT:"$member" "$archive" || exit $? |
||||||
|
done |
||||||
|
fi |
||||||
|
|
||||||
|
elif test -n "$quick$replace"; then |
||||||
|
if test ! -f "$orig_archive"; then |
||||||
|
if test -z "$create"; then |
||||||
|
echo "$me: creating $orig_archive" |
||||||
|
fi |
||||||
|
orig_archive= |
||||||
|
else |
||||||
|
orig_archive=$archive |
||||||
|
fi |
||||||
|
|
||||||
|
for member |
||||||
|
do |
||||||
|
case $1 in |
||||||
|
@*) |
||||||
|
func_file_conv "${1#@}" |
||||||
|
set x "$@" "@$file" |
||||||
|
;; |
||||||
|
*) |
||||||
|
func_file_conv "$1" |
||||||
|
set x "$@" "$file" |
||||||
|
;; |
||||||
|
esac |
||||||
|
shift |
||||||
|
shift |
||||||
|
done |
||||||
|
|
||||||
|
if test -n "$orig_archive"; then |
||||||
|
$AR -NOLOGO -OUT:"$archive" "$orig_archive" "$@" || exit $? |
||||||
|
else |
||||||
|
$AR -NOLOGO -OUT:"$archive" "$@" || exit $? |
||||||
|
fi |
||||||
|
|
||||||
|
elif test -n "$list"; then |
||||||
|
if test ! -f "$orig_archive"; then |
||||||
|
func_error "archive not found" |
||||||
|
fi |
||||||
|
$AR -NOLOGO -LIST "$archive" || exit $? |
||||||
|
fi |
||||||
@ -0,0 +1,3 @@ |
|||||||
|
#!/bin/sh |
||||||
|
|
||||||
|
autoreconf --force --install -I m4 |
||||||
@ -0,0 +1,348 @@ |
|||||||
|
#! /bin/sh |
||||||
|
# Wrapper for compilers which do not understand '-c -o'. |
||||||
|
|
||||||
|
scriptversion=2018-03-07.03; # UTC |
||||||
|
|
||||||
|
# Copyright (C) 1999-2018 Free Software Foundation, Inc. |
||||||
|
# Written by Tom Tromey <tromey@cygnus.com>. |
||||||
|
# |
||||||
|
# This program is free software; you can redistribute it and/or modify |
||||||
|
# it under the terms of the GNU General Public License as published by |
||||||
|
# the Free Software Foundation; either version 2, or (at your option) |
||||||
|
# any later version. |
||||||
|
# |
||||||
|
# This program is distributed in the hope that it will be useful, |
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
# GNU General Public License for more details. |
||||||
|
# |
||||||
|
# You should have received a copy of the GNU General Public License |
||||||
|
# along with this program. If not, see <https://www.gnu.org/licenses/>. |
||||||
|
|
||||||
|
# As a special exception to the GNU General Public License, if you |
||||||
|
# distribute this file as part of a program that contains a |
||||||
|
# configuration script generated by Autoconf, you may include it under |
||||||
|
# the same distribution terms that you use for the rest of that program. |
||||||
|
|
||||||
|
# This file is maintained in Automake, please report |
||||||
|
# bugs to <bug-automake@gnu.org> or send patches to |
||||||
|
# <automake-patches@gnu.org>. |
||||||
|
|
||||||
|
nl=' |
||||||
|
' |
||||||
|
|
||||||
|
# We need space, tab and new line, in precisely that order. Quoting is |
||||||
|
# there to prevent tools from complaining about whitespace usage. |
||||||
|
IFS=" "" $nl" |
||||||
|
|
||||||
|
file_conv= |
||||||
|
|
||||||
|
# func_file_conv build_file lazy |
||||||
|
# Convert a $build file to $host form and store it in $file |
||||||
|
# Currently only supports Windows hosts. If the determined conversion |
||||||
|
# type is listed in (the comma separated) LAZY, no conversion will |
||||||
|
# take place. |
||||||
|
func_file_conv () |
||||||
|
{ |
||||||
|
file=$1 |
||||||
|
case $file in |
||||||
|
/ | /[!/]*) # absolute file, and not a UNC file |
||||||
|
if test -z "$file_conv"; then |
||||||
|
# lazily determine how to convert abs files |
||||||
|
case `uname -s` in |
||||||
|
MINGW*) |
||||||
|
file_conv=mingw |
||||||
|
;; |
||||||
|
CYGWIN*) |
||||||
|
file_conv=cygwin |
||||||
|
;; |
||||||
|
*) |
||||||
|
file_conv=wine |
||||||
|
;; |
||||||
|
esac |
||||||
|
fi |
||||||
|
case $file_conv/,$2, in |
||||||
|
*,$file_conv,*) |
||||||
|
;; |
||||||
|
mingw/*) |
||||||
|
file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` |
||||||
|
;; |
||||||
|
cygwin/*) |
||||||
|
file=`cygpath -m "$file" || echo "$file"` |
||||||
|
;; |
||||||
|
wine/*) |
||||||
|
file=`winepath -w "$file" || echo "$file"` |
||||||
|
;; |
||||||
|
esac |
||||||
|
;; |
||||||
|
esac |
||||||
|
} |
||||||
|
|
||||||
|
# func_cl_dashL linkdir |
||||||
|
# Make cl look for libraries in LINKDIR |
||||||
|
func_cl_dashL () |
||||||
|
{ |
||||||
|
func_file_conv "$1" |
||||||
|
if test -z "$lib_path"; then |
||||||
|
lib_path=$file |
||||||
|
else |
||||||
|
lib_path="$lib_path;$file" |
||||||
|
fi |
||||||
|
linker_opts="$linker_opts -LIBPATH:$file" |
||||||
|
} |
||||||
|
|
||||||
|
# func_cl_dashl library |
||||||
|
# Do a library search-path lookup for cl |
||||||
|
func_cl_dashl () |
||||||
|
{ |
||||||
|
lib=$1 |
||||||
|
found=no |
||||||
|
save_IFS=$IFS |
||||||
|
IFS=';' |
||||||
|
for dir in $lib_path $LIB |
||||||
|
do |
||||||
|
IFS=$save_IFS |
||||||
|
if $shared && test -f "$dir/$lib.dll.lib"; then |
||||||
|
found=yes |
||||||
|
lib=$dir/$lib.dll.lib |
||||||
|
break |
||||||
|
fi |
||||||
|
if test -f "$dir/$lib.lib"; then |
||||||
|
found=yes |
||||||
|
lib=$dir/$lib.lib |
||||||
|
break |
||||||
|
fi |
||||||
|
if test -f "$dir/lib$lib.a"; then |
||||||
|
found=yes |
||||||
|
lib=$dir/lib$lib.a |
||||||
|
break |
||||||
|
fi |
||||||
|
done |
||||||
|
IFS=$save_IFS |
||||||
|
|
||||||
|
if test "$found" != yes; then |
||||||
|
lib=$lib.lib |
||||||
|
fi |
||||||
|
} |
||||||
|
|
||||||
|
# func_cl_wrapper cl arg... |
||||||
|
# Adjust compile command to suit cl |
||||||
|
func_cl_wrapper () |
||||||
|
{ |
||||||
|
# Assume a capable shell |
||||||
|
lib_path= |
||||||
|
shared=: |
||||||
|
linker_opts= |
||||||
|
for arg |
||||||
|
do |
||||||
|
if test -n "$eat"; then |
||||||
|
eat= |
||||||
|
else |
||||||
|
case $1 in |
||||||
|
-o) |
||||||
|
# configure might choose to run compile as 'compile cc -o foo foo.c'. |
||||||
|
eat=1 |
||||||
|
case $2 in |
||||||
|
*.o | *.[oO][bB][jJ]) |
||||||
|
func_file_conv "$2" |
||||||
|
set x "$@" -Fo"$file" |
||||||
|
shift |
||||||
|
;; |
||||||
|
*) |
||||||
|
func_file_conv "$2" |
||||||
|
set x "$@" -Fe"$file" |
||||||
|
shift |
||||||
|
;; |
||||||
|
esac |
||||||
|
;; |
||||||
|
-I) |
||||||
|
eat=1 |
||||||
|
func_file_conv "$2" mingw |
||||||
|
set x "$@" -I"$file" |
||||||
|
shift |
||||||
|
;; |
||||||
|
-I*) |
||||||
|
func_file_conv "${1#-I}" mingw |
||||||
|
set x "$@" -I"$file" |
||||||
|
shift |
||||||
|
;; |
||||||
|
-l) |
||||||
|
eat=1 |
||||||
|
func_cl_dashl "$2" |
||||||
|
set x "$@" "$lib" |
||||||
|
shift |
||||||
|
;; |
||||||
|
-l*) |
||||||
|
func_cl_dashl "${1#-l}" |
||||||
|
set x "$@" "$lib" |
||||||
|
shift |
||||||
|
;; |
||||||
|
-L) |
||||||
|
eat=1 |
||||||
|
func_cl_dashL "$2" |
||||||
|
;; |
||||||
|
-L*) |
||||||
|
func_cl_dashL "${1#-L}" |
||||||
|
;; |
||||||
|
-static) |
||||||
|
shared=false |
||||||
|
;; |
||||||
|
-Wl,*) |
||||||
|
arg=${1#-Wl,} |
||||||
|
save_ifs="$IFS"; IFS=',' |
||||||
|
for flag in $arg; do |
||||||
|
IFS="$save_ifs" |
||||||
|
linker_opts="$linker_opts $flag" |
||||||
|
done |
||||||
|
IFS="$save_ifs" |
||||||
|
;; |
||||||
|
-Xlinker) |
||||||
|
eat=1 |
||||||
|
linker_opts="$linker_opts $2" |
||||||
|
;; |
||||||
|
-*) |
||||||
|
set x "$@" "$1" |
||||||
|
shift |
||||||
|
;; |
||||||
|
*.cc | *.CC | *.cxx | *.CXX | *.[cC]++) |
||||||
|
func_file_conv "$1" |
||||||
|
set x "$@" -Tp"$file" |
||||||
|
shift |
||||||
|
;; |
||||||
|
*.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) |
||||||
|
func_file_conv "$1" mingw |
||||||
|
set x "$@" "$file" |
||||||
|
shift |
||||||
|
;; |
||||||
|
*) |
||||||
|
set x "$@" "$1" |
||||||
|
shift |
||||||
|
;; |
||||||
|
esac |
||||||
|
fi |
||||||
|
shift |
||||||
|
done |
||||||
|
if test -n "$linker_opts"; then |
||||||
|
linker_opts="-link$linker_opts" |
||||||
|
fi |
||||||
|
exec "$@" $linker_opts |
||||||
|
exit 1 |
||||||
|
} |
||||||
|
|
||||||
|
eat= |
||||||
|
|
||||||
|
case $1 in |
||||||
|
'') |
||||||
|
echo "$0: No command. Try '$0 --help' for more information." 1>&2 |
||||||
|
exit 1; |
||||||
|
;; |
||||||
|
-h | --h*) |
||||||
|
cat <<\EOF |
||||||
|
Usage: compile [--help] [--version] PROGRAM [ARGS] |
||||||
|
|
||||||
|
Wrapper for compilers which do not understand '-c -o'. |
||||||
|
Remove '-o dest.o' from ARGS, run PROGRAM with the remaining |
||||||
|
arguments, and rename the output as expected. |
||||||
|
|
||||||
|
If you are trying to build a whole package this is not the |
||||||
|
right script to run: please start by reading the file 'INSTALL'. |
||||||
|
|
||||||
|
Report bugs to <bug-automake@gnu.org>. |
||||||
|
EOF |
||||||
|
exit $? |
||||||
|
;; |
||||||
|
-v | --v*) |
||||||
|
echo "compile $scriptversion" |
||||||
|
exit $? |
||||||
|
;; |
||||||
|
cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \ |
||||||
|
icl | *[/\\]icl | icl.exe | *[/\\]icl.exe ) |
||||||
|
func_cl_wrapper "$@" # Doesn't return... |
||||||
|
;; |
||||||
|
esac |
||||||
|
|
||||||
|
ofile= |
||||||
|
cfile= |
||||||
|
|
||||||
|
for arg |
||||||
|
do |
||||||
|
if test -n "$eat"; then |
||||||
|
eat= |
||||||
|
else |
||||||
|
case $1 in |
||||||
|
-o) |
||||||
|
# configure might choose to run compile as 'compile cc -o foo foo.c'. |
||||||
|
# So we strip '-o arg' only if arg is an object. |
||||||
|
eat=1 |
||||||
|
case $2 in |
||||||
|
*.o | *.obj) |
||||||
|
ofile=$2 |
||||||
|
;; |
||||||
|
*) |
||||||
|
set x "$@" -o "$2" |
||||||
|
shift |
||||||
|
;; |
||||||
|
esac |
||||||
|
;; |
||||||
|
*.c) |
||||||
|
cfile=$1 |
||||||
|
set x "$@" "$1" |
||||||
|
shift |
||||||
|
;; |
||||||
|
*) |
||||||
|
set x "$@" "$1" |
||||||
|
shift |
||||||
|
;; |
||||||
|
esac |
||||||
|
fi |
||||||
|
shift |
||||||
|
done |
||||||
|
|
||||||
|
if test -z "$ofile" || test -z "$cfile"; then |
||||||
|
# If no '-o' option was seen then we might have been invoked from a |
||||||
|
# pattern rule where we don't need one. That is ok -- this is a |
||||||
|
# normal compilation that the losing compiler can handle. If no |
||||||
|
# '.c' file was seen then we are probably linking. That is also |
||||||
|
# ok. |
||||||
|
exec "$@" |
||||||
|
fi |
||||||
|
|
||||||
|
# Name of file we expect compiler to create. |
||||||
|
cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` |
||||||
|
|
||||||
|
# Create the lock directory. |
||||||
|
# Note: use '[/\\:.-]' here to ensure that we don't use the same name |
||||||
|
# that we are using for the .o file. Also, base the name on the expected |
||||||
|
# object file name, since that is what matters with a parallel build. |
||||||
|
lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d |
||||||
|
while true; do |
||||||
|
if mkdir "$lockdir" >/dev/null 2>&1; then |
||||||
|
break |
||||||
|
fi |
||||||
|
sleep 1 |
||||||
|
done |
||||||
|
# FIXME: race condition here if user kills between mkdir and trap. |
||||||
|
trap "rmdir '$lockdir'; exit 1" 1 2 15 |
||||||
|
|
||||||
|
# Run the compile. |
||||||
|
"$@" |
||||||
|
ret=$? |
||||||
|
|
||||||
|
if test -f "$cofile"; then |
||||||
|
test "$cofile" = "$ofile" || mv "$cofile" "$ofile" |
||||||
|
elif test -f "${cofile}bj"; then |
||||||
|
test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" |
||||||
|
fi |
||||||
|
|
||||||
|
rmdir "$lockdir" |
||||||
|
exit $ret |
||||||
|
|
||||||
|
# Local Variables: |
||||||
|
# mode: shell-script |
||||||
|
# sh-indentation: 2 |
||||||
|
# eval: (add-hook 'before-save-hook 'time-stamp) |
||||||
|
# time-stamp-start: "scriptversion=" |
||||||
|
# time-stamp-format: "%:y-%02m-%02d.%02H" |
||||||
|
# time-stamp-time-zone: "UTC0" |
||||||
|
# time-stamp-end: "; # UTC" |
||||||
|
# End: |
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,57 @@ |
|||||||
|
# ffmpeg-kit 4.5.1 configure.ac |
||||||
|
|
||||||
|
AC_INIT([ffmpeg-kit], [4.5.1], [https://github.com/tanersener/ffmpeg-kit/issues/new]) |
||||||
|
AC_CONFIG_MACRO_DIR([m4]) |
||||||
|
AC_CONFIG_SRCDIR([src/FFmpegKit.cpp]) |
||||||
|
|
||||||
|
AM_INIT_AUTOMAKE([-Wall -Werror foreign subdir-objects]) |
||||||
|
AM_MAINTAINER_MODE |
||||||
|
|
||||||
|
# Check for os version |
||||||
|
VERSION_OS=$(uname -s) |
||||||
|
AC_DEFINE_UNQUOTED(VERSION_OS, "$VERSION_OS", [os version]) |
||||||
|
|
||||||
|
# Check host so we can infer target CPU (and assembly optimizations) |
||||||
|
AC_CANONICAL_HOST |
||||||
|
|
||||||
|
# Check for processor characteristics |
||||||
|
AC_C_BIGENDIAN(AC_DEFINE([HIGHFIRST], [1], [big-endian machine])) |
||||||
|
|
||||||
|
# Checks for programs. |
||||||
|
cflags_bckup="$CFLAGS" |
||||||
|
AC_PROG_CC |
||||||
|
AC_PROG_CXX |
||||||
|
AM_PROG_AR |
||||||
|
CFLAGS="$cflags_bckup" |
||||||
|
|
||||||
|
FFMPEG_LIBS="-lavcodec -lavfilter -lavformat -lavutil -lswscale -lswresample" |
||||||
|
AC_SUBST(FFMPEG_LIBS) |
||||||
|
|
||||||
|
VERSION_INFO="5:5:1" |
||||||
|
AC_SUBST(VERSION_INFO) |
||||||
|
|
||||||
|
LT_INIT |
||||||
|
|
||||||
|
# Checks for header files. |
||||||
|
AC_CHECK_HEADERS([libavformat/avformat.h libavcodec/avcodec.h libavfilter/avfilter.h libavutil/avutil.h libswresample/swresample.h], [], [ |
||||||
|
AC_MSG_ERROR([unable to find ffmpeg headers]) |
||||||
|
]) |
||||||
|
AC_CHECK_HEADERS([fcntl.h limits.h stdint.h stdlib.h string.h sys/ioctl.h sys/time.h termios.h unistd.h]) |
||||||
|
|
||||||
|
# Checks for typedefs, structures, and compiler characteristics. |
||||||
|
AC_C_INLINE |
||||||
|
AC_TYPE_INT32_T |
||||||
|
AC_TYPE_INT64_T |
||||||
|
AC_TYPE_INT8_T |
||||||
|
AC_TYPE_SIZE_T |
||||||
|
AC_TYPE_UINT16_T |
||||||
|
AC_TYPE_UINT32_T |
||||||
|
AC_TYPE_UINT64_T |
||||||
|
AC_TYPE_UINT8_T |
||||||
|
|
||||||
|
# Checks for library functions. |
||||||
|
AC_CHECK_FUNCS([dup2 floor memmove memset select strchr strcspn strerror strrchr strstr strtol malloc strcpy strlen vsnprintf]) |
||||||
|
|
||||||
|
AC_CONFIG_FILES([Makefile src/Makefile]) |
||||||
|
|
||||||
|
AC_OUTPUT |
||||||
@ -0,0 +1,791 @@ |
|||||||
|
#! /bin/sh |
||||||
|
# depcomp - compile a program generating dependencies as side-effects |
||||||
|
|
||||||
|
scriptversion=2018-03-07.03; # UTC |
||||||
|
|
||||||
|
# Copyright (C) 1999-2018 Free Software Foundation, Inc. |
||||||
|
|
||||||
|
# This program is free software; you can redistribute it and/or modify |
||||||
|
# it under the terms of the GNU General Public License as published by |
||||||
|
# the Free Software Foundation; either version 2, or (at your option) |
||||||
|
# any later version. |
||||||
|
|
||||||
|
# This program is distributed in the hope that it will be useful, |
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
# GNU General Public License for more details. |
||||||
|
|
||||||
|
# You should have received a copy of the GNU General Public License |
||||||
|
# along with this program. If not, see <https://www.gnu.org/licenses/>. |
||||||
|
|
||||||
|
# As a special exception to the GNU General Public License, if you |
||||||
|
# distribute this file as part of a program that contains a |
||||||
|
# configuration script generated by Autoconf, you may include it under |
||||||
|
# the same distribution terms that you use for the rest of that program. |
||||||
|
|
||||||
|
# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>. |
||||||
|
|
||||||
|
case $1 in |
||||||
|
'') |
||||||
|
echo "$0: No command. Try '$0 --help' for more information." 1>&2 |
||||||
|
exit 1; |
||||||
|
;; |
||||||
|
-h | --h*) |
||||||
|
cat <<\EOF |
||||||
|
Usage: depcomp [--help] [--version] PROGRAM [ARGS] |
||||||
|
|
||||||
|
Run PROGRAMS ARGS to compile a file, generating dependencies |
||||||
|
as side-effects. |
||||||
|
|
||||||
|
Environment variables: |
||||||
|
depmode Dependency tracking mode. |
||||||
|
source Source file read by 'PROGRAMS ARGS'. |
||||||
|
object Object file output by 'PROGRAMS ARGS'. |
||||||
|
DEPDIR directory where to store dependencies. |
||||||
|
depfile Dependency file to output. |
||||||
|
tmpdepfile Temporary file to use when outputting dependencies. |
||||||
|
libtool Whether libtool is used (yes/no). |
||||||
|
|
||||||
|
Report bugs to <bug-automake@gnu.org>. |
||||||
|
EOF |
||||||
|
exit $? |
||||||
|
;; |
||||||
|
-v | --v*) |
||||||
|
echo "depcomp $scriptversion" |
||||||
|
exit $? |
||||||
|
;; |
||||||
|
esac |
||||||
|
|
||||||
|
# Get the directory component of the given path, and save it in the |
||||||
|
# global variables '$dir'. Note that this directory component will |
||||||
|
# be either empty or ending with a '/' character. This is deliberate. |
||||||
|
set_dir_from () |
||||||
|
{ |
||||||
|
case $1 in |
||||||
|
*/*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; |
||||||
|
*) dir=;; |
||||||
|
esac |
||||||
|
} |
||||||
|
|
||||||
|
# Get the suffix-stripped basename of the given path, and save it the |
||||||
|
# global variable '$base'. |
||||||
|
set_base_from () |
||||||
|
{ |
||||||
|
base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` |
||||||
|
} |
||||||
|
|
||||||
|
# If no dependency file was actually created by the compiler invocation, |
||||||
|
# we still have to create a dummy depfile, to avoid errors with the |
||||||
|
# Makefile "include basename.Plo" scheme. |
||||||
|
make_dummy_depfile () |
||||||
|
{ |
||||||
|
echo "#dummy" > "$depfile" |
||||||
|
} |
||||||
|
|
||||||
|
# Factor out some common post-processing of the generated depfile. |
||||||
|
# Requires the auxiliary global variable '$tmpdepfile' to be set. |
||||||
|
aix_post_process_depfile () |
||||||
|
{ |
||||||
|
# If the compiler actually managed to produce a dependency file, |
||||||
|
# post-process it. |
||||||
|
if test -f "$tmpdepfile"; then |
||||||
|
# Each line is of the form 'foo.o: dependency.h'. |
||||||
|
# Do two passes, one to just change these to |
||||||
|
# $object: dependency.h |
||||||
|
# and one to simply output |
||||||
|
# dependency.h: |
||||||
|
# which is needed to avoid the deleted-header problem. |
||||||
|
{ sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" |
||||||
|
sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" |
||||||
|
} > "$depfile" |
||||||
|
rm -f "$tmpdepfile" |
||||||
|
else |
||||||
|
make_dummy_depfile |
||||||
|
fi |
||||||
|
} |
||||||
|
|
||||||
|
# A tabulation character. |
||||||
|
tab=' ' |
||||||
|
# A newline character. |
||||||
|
nl=' |
||||||
|
' |
||||||
|
# Character ranges might be problematic outside the C locale. |
||||||
|
# These definitions help. |
||||||
|
upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ |
||||||
|
lower=abcdefghijklmnopqrstuvwxyz |
||||||
|
digits=0123456789 |
||||||
|
alpha=${upper}${lower} |
||||||
|
|
||||||
|
if test -z "$depmode" || test -z "$source" || test -z "$object"; then |
||||||
|
echo "depcomp: Variables source, object and depmode must be set" 1>&2 |
||||||
|
exit 1 |
||||||
|
fi |
||||||
|
|
||||||
|
# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. |
||||||
|
depfile=${depfile-`echo "$object" | |
||||||
|
sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} |
||||||
|
tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} |
||||||
|
|
||||||
|
rm -f "$tmpdepfile" |
||||||
|
|
||||||
|
# Avoid interferences from the environment. |
||||||
|
gccflag= dashmflag= |
||||||
|
|
||||||
|
# Some modes work just like other modes, but use different flags. We |
||||||
|
# parameterize here, but still list the modes in the big case below, |
||||||
|
# to make depend.m4 easier to write. Note that we *cannot* use a case |
||||||
|
# here, because this file can only contain one case statement. |
||||||
|
if test "$depmode" = hp; then |
||||||
|
# HP compiler uses -M and no extra arg. |
||||||
|
gccflag=-M |
||||||
|
depmode=gcc |
||||||
|
fi |
||||||
|
|
||||||
|
if test "$depmode" = dashXmstdout; then |
||||||
|
# This is just like dashmstdout with a different argument. |
||||||
|
dashmflag=-xM |
||||||
|
depmode=dashmstdout |
||||||
|
fi |
||||||
|
|
||||||
|
cygpath_u="cygpath -u -f -" |
||||||
|
if test "$depmode" = msvcmsys; then |
||||||
|
# This is just like msvisualcpp but w/o cygpath translation. |
||||||
|
# Just convert the backslash-escaped backslashes to single forward |
||||||
|
# slashes to satisfy depend.m4 |
||||||
|
cygpath_u='sed s,\\\\,/,g' |
||||||
|
depmode=msvisualcpp |
||||||
|
fi |
||||||
|
|
||||||
|
if test "$depmode" = msvc7msys; then |
||||||
|
# This is just like msvc7 but w/o cygpath translation. |
||||||
|
# Just convert the backslash-escaped backslashes to single forward |
||||||
|
# slashes to satisfy depend.m4 |
||||||
|
cygpath_u='sed s,\\\\,/,g' |
||||||
|
depmode=msvc7 |
||||||
|
fi |
||||||
|
|
||||||
|
if test "$depmode" = xlc; then |
||||||
|
# IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. |
||||||
|
gccflag=-qmakedep=gcc,-MF |
||||||
|
depmode=gcc |
||||||
|
fi |
||||||
|
|
||||||
|
case "$depmode" in |
||||||
|
gcc3) |
||||||
|
## gcc 3 implements dependency tracking that does exactly what |
||||||
|
## we want. Yay! Note: for some reason libtool 1.4 doesn't like |
||||||
|
## it if -MD -MP comes after the -MF stuff. Hmm. |
||||||
|
## Unfortunately, FreeBSD c89 acceptance of flags depends upon |
||||||
|
## the command line argument order; so add the flags where they |
||||||
|
## appear in depend2.am. Note that the slowdown incurred here |
||||||
|
## affects only configure: in makefiles, %FASTDEP% shortcuts this. |
||||||
|
for arg |
||||||
|
do |
||||||
|
case $arg in |
||||||
|
-c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; |
||||||
|
*) set fnord "$@" "$arg" ;; |
||||||
|
esac |
||||||
|
shift # fnord |
||||||
|
shift # $arg |
||||||
|
done |
||||||
|
"$@" |
||||||
|
stat=$? |
||||||
|
if test $stat -ne 0; then |
||||||
|
rm -f "$tmpdepfile" |
||||||
|
exit $stat |
||||||
|
fi |
||||||
|
mv "$tmpdepfile" "$depfile" |
||||||
|
;; |
||||||
|
|
||||||
|
gcc) |
||||||
|
## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. |
||||||
|
## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. |
||||||
|
## (see the conditional assignment to $gccflag above). |
||||||
|
## There are various ways to get dependency output from gcc. Here's |
||||||
|
## why we pick this rather obscure method: |
||||||
|
## - Don't want to use -MD because we'd like the dependencies to end |
||||||
|
## up in a subdir. Having to rename by hand is ugly. |
||||||
|
## (We might end up doing this anyway to support other compilers.) |
||||||
|
## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like |
||||||
|
## -MM, not -M (despite what the docs say). Also, it might not be |
||||||
|
## supported by the other compilers which use the 'gcc' depmode. |
||||||
|
## - Using -M directly means running the compiler twice (even worse |
||||||
|
## than renaming). |
||||||
|
if test -z "$gccflag"; then |
||||||
|
gccflag=-MD, |
||||||
|
fi |
||||||
|
"$@" -Wp,"$gccflag$tmpdepfile" |
||||||
|
stat=$? |
||||||
|
if test $stat -ne 0; then |
||||||
|
rm -f "$tmpdepfile" |
||||||
|
exit $stat |
||||||
|
fi |
||||||
|
rm -f "$depfile" |
||||||
|
echo "$object : \\" > "$depfile" |
||||||
|
# The second -e expression handles DOS-style file names with drive |
||||||
|
# letters. |
||||||
|
sed -e 's/^[^:]*: / /' \ |
||||||
|
-e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" |
||||||
|
## This next piece of magic avoids the "deleted header file" problem. |
||||||
|
## The problem is that when a header file which appears in a .P file |
||||||
|
## is deleted, the dependency causes make to die (because there is |
||||||
|
## typically no way to rebuild the header). We avoid this by adding |
||||||
|
## dummy dependencies for each header file. Too bad gcc doesn't do |
||||||
|
## this for us directly. |
||||||
|
## Some versions of gcc put a space before the ':'. On the theory |
||||||
|
## that the space means something, we add a space to the output as |
||||||
|
## well. hp depmode also adds that space, but also prefixes the VPATH |
||||||
|
## to the object. Take care to not repeat it in the output. |
||||||
|
## Some versions of the HPUX 10.20 sed can't process this invocation |
||||||
|
## correctly. Breaking it into two sed invocations is a workaround. |
||||||
|
tr ' ' "$nl" < "$tmpdepfile" \ |
||||||
|
| sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ |
||||||
|
| sed -e 's/$/ :/' >> "$depfile" |
||||||
|
rm -f "$tmpdepfile" |
||||||
|
;; |
||||||
|
|
||||||
|
hp) |
||||||
|
# This case exists only to let depend.m4 do its work. It works by |
||||||
|
# looking at the text of this script. This case will never be run, |
||||||
|
# since it is checked for above. |
||||||
|
exit 1 |
||||||
|
;; |
||||||
|
|
||||||
|
sgi) |
||||||
|
if test "$libtool" = yes; then |
||||||
|
"$@" "-Wp,-MDupdate,$tmpdepfile" |
||||||
|
else |
||||||
|
"$@" -MDupdate "$tmpdepfile" |
||||||
|
fi |
||||||
|
stat=$? |
||||||
|
if test $stat -ne 0; then |
||||||
|
rm -f "$tmpdepfile" |
||||||
|
exit $stat |
||||||
|
fi |
||||||
|
rm -f "$depfile" |
||||||
|
|
||||||
|
if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files |
||||||
|
echo "$object : \\" > "$depfile" |
||||||
|
# Clip off the initial element (the dependent). Don't try to be |
||||||
|
# clever and replace this with sed code, as IRIX sed won't handle |
||||||
|
# lines with more than a fixed number of characters (4096 in |
||||||
|
# IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; |
||||||
|
# the IRIX cc adds comments like '#:fec' to the end of the |
||||||
|
# dependency line. |
||||||
|
tr ' ' "$nl" < "$tmpdepfile" \ |
||||||
|
| sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ |
||||||
|
| tr "$nl" ' ' >> "$depfile" |
||||||
|
echo >> "$depfile" |
||||||
|
# The second pass generates a dummy entry for each header file. |
||||||
|
tr ' ' "$nl" < "$tmpdepfile" \ |
||||||
|
| sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ |
||||||
|
>> "$depfile" |
||||||
|
else |
||||||
|
make_dummy_depfile |
||||||
|
fi |
||||||
|
rm -f "$tmpdepfile" |
||||||
|
;; |
||||||
|
|
||||||
|
xlc) |
||||||
|
# This case exists only to let depend.m4 do its work. It works by |
||||||
|
# looking at the text of this script. This case will never be run, |
||||||
|
# since it is checked for above. |
||||||
|
exit 1 |
||||||
|
;; |
||||||
|
|
||||||
|
aix) |
||||||
|
# The C for AIX Compiler uses -M and outputs the dependencies |
||||||
|
# in a .u file. In older versions, this file always lives in the |
||||||
|
# current directory. Also, the AIX compiler puts '$object:' at the |
||||||
|
# start of each line; $object doesn't have directory information. |
||||||
|
# Version 6 uses the directory in both cases. |
||||||
|
set_dir_from "$object" |
||||||
|
set_base_from "$object" |
||||||
|
if test "$libtool" = yes; then |
||||||
|
tmpdepfile1=$dir$base.u |
||||||
|
tmpdepfile2=$base.u |
||||||
|
tmpdepfile3=$dir.libs/$base.u |
||||||
|
"$@" -Wc,-M |
||||||
|
else |
||||||
|
tmpdepfile1=$dir$base.u |
||||||
|
tmpdepfile2=$dir$base.u |
||||||
|
tmpdepfile3=$dir$base.u |
||||||
|
"$@" -M |
||||||
|
fi |
||||||
|
stat=$? |
||||||
|
if test $stat -ne 0; then |
||||||
|
rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" |
||||||
|
exit $stat |
||||||
|
fi |
||||||
|
|
||||||
|
for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" |
||||||
|
do |
||||||
|
test -f "$tmpdepfile" && break |
||||||
|
done |
||||||
|
aix_post_process_depfile |
||||||
|
;; |
||||||
|
|
||||||
|
tcc) |
||||||
|
# tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 |
||||||
|
# FIXME: That version still under development at the moment of writing. |
||||||
|
# Make that this statement remains true also for stable, released |
||||||
|
# versions. |
||||||
|
# It will wrap lines (doesn't matter whether long or short) with a |
||||||
|
# trailing '\', as in: |
||||||
|
# |
||||||
|
# foo.o : \ |
||||||
|
# foo.c \ |
||||||
|
# foo.h \ |
||||||
|
# |
||||||
|
# It will put a trailing '\' even on the last line, and will use leading |
||||||
|
# spaces rather than leading tabs (at least since its commit 0394caf7 |
||||||
|
# "Emit spaces for -MD"). |
||||||
|
"$@" -MD -MF "$tmpdepfile" |
||||||
|
stat=$? |
||||||
|
if test $stat -ne 0; then |
||||||
|
rm -f "$tmpdepfile" |
||||||
|
exit $stat |
||||||
|
fi |
||||||
|
rm -f "$depfile" |
||||||
|
# Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. |
||||||
|
# We have to change lines of the first kind to '$object: \'. |
||||||
|
sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" |
||||||
|
# And for each line of the second kind, we have to emit a 'dep.h:' |
||||||
|
# dummy dependency, to avoid the deleted-header problem. |
||||||
|
sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" |
||||||
|
rm -f "$tmpdepfile" |
||||||
|
;; |
||||||
|
|
||||||
|
## The order of this option in the case statement is important, since the |
||||||
|
## shell code in configure will try each of these formats in the order |
||||||
|
## listed in this file. A plain '-MD' option would be understood by many |
||||||
|
## compilers, so we must ensure this comes after the gcc and icc options. |
||||||
|
pgcc) |
||||||
|
# Portland's C compiler understands '-MD'. |
||||||
|
# Will always output deps to 'file.d' where file is the root name of the |
||||||
|
# source file under compilation, even if file resides in a subdirectory. |
||||||
|
# The object file name does not affect the name of the '.d' file. |
||||||
|
# pgcc 10.2 will output |
||||||
|
# foo.o: sub/foo.c sub/foo.h |
||||||
|
# and will wrap long lines using '\' : |
||||||
|
# foo.o: sub/foo.c ... \ |
||||||
|
# sub/foo.h ... \ |
||||||
|
# ... |
||||||
|
set_dir_from "$object" |
||||||
|
# Use the source, not the object, to determine the base name, since |
||||||
|
# that's sadly what pgcc will do too. |
||||||
|
set_base_from "$source" |
||||||
|
tmpdepfile=$base.d |
||||||
|
|
||||||
|
# For projects that build the same source file twice into different object |
||||||
|
# files, the pgcc approach of using the *source* file root name can cause |
||||||
|
# problems in parallel builds. Use a locking strategy to avoid stomping on |
||||||
|
# the same $tmpdepfile. |
||||||
|
lockdir=$base.d-lock |
||||||
|
trap " |
||||||
|
echo '$0: caught signal, cleaning up...' >&2 |
||||||
|
rmdir '$lockdir' |
||||||
|
exit 1 |
||||||
|
" 1 2 13 15 |
||||||
|
numtries=100 |
||||||
|
i=$numtries |
||||||
|
while test $i -gt 0; do |
||||||
|
# mkdir is a portable test-and-set. |
||||||
|
if mkdir "$lockdir" 2>/dev/null; then |
||||||
|
# This process acquired the lock. |
||||||
|
"$@" -MD |
||||||
|
stat=$? |
||||||
|
# Release the lock. |
||||||
|
rmdir "$lockdir" |
||||||
|
break |
||||||
|
else |
||||||
|
# If the lock is being held by a different process, wait |
||||||
|
# until the winning process is done or we timeout. |
||||||
|
while test -d "$lockdir" && test $i -gt 0; do |
||||||
|
sleep 1 |
||||||
|
i=`expr $i - 1` |
||||||
|
done |
||||||
|
fi |
||||||
|
i=`expr $i - 1` |
||||||
|
done |
||||||
|
trap - 1 2 13 15 |
||||||
|
if test $i -le 0; then |
||||||
|
echo "$0: failed to acquire lock after $numtries attempts" >&2 |
||||||
|
echo "$0: check lockdir '$lockdir'" >&2 |
||||||
|
exit 1 |
||||||
|
fi |
||||||
|
|
||||||
|
if test $stat -ne 0; then |
||||||
|
rm -f "$tmpdepfile" |
||||||
|
exit $stat |
||||||
|
fi |
||||||
|
rm -f "$depfile" |
||||||
|
# Each line is of the form `foo.o: dependent.h', |
||||||
|
# or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. |
||||||
|
# Do two passes, one to just change these to |
||||||
|
# `$object: dependent.h' and one to simply `dependent.h:'. |
||||||
|
sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" |
||||||
|
# Some versions of the HPUX 10.20 sed can't process this invocation |
||||||
|
# correctly. Breaking it into two sed invocations is a workaround. |
||||||
|
sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ |
||||||
|
| sed -e 's/$/ :/' >> "$depfile" |
||||||
|
rm -f "$tmpdepfile" |
||||||
|
;; |
||||||
|
|
||||||
|
hp2) |
||||||
|
# The "hp" stanza above does not work with aCC (C++) and HP's ia64 |
||||||
|
# compilers, which have integrated preprocessors. The correct option |
||||||
|
# to use with these is +Maked; it writes dependencies to a file named |
||||||
|
# 'foo.d', which lands next to the object file, wherever that |
||||||
|
# happens to be. |
||||||
|
# Much of this is similar to the tru64 case; see comments there. |
||||||
|
set_dir_from "$object" |
||||||
|
set_base_from "$object" |
||||||
|
if test "$libtool" = yes; then |
||||||
|
tmpdepfile1=$dir$base.d |
||||||
|
tmpdepfile2=$dir.libs/$base.d |
||||||
|
"$@" -Wc,+Maked |
||||||
|
else |
||||||
|
tmpdepfile1=$dir$base.d |
||||||
|
tmpdepfile2=$dir$base.d |
||||||
|
"$@" +Maked |
||||||
|
fi |
||||||
|
stat=$? |
||||||
|
if test $stat -ne 0; then |
||||||
|
rm -f "$tmpdepfile1" "$tmpdepfile2" |
||||||
|
exit $stat |
||||||
|
fi |
||||||
|
|
||||||
|
for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" |
||||||
|
do |
||||||
|
test -f "$tmpdepfile" && break |
||||||
|
done |
||||||
|
if test -f "$tmpdepfile"; then |
||||||
|
sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" |
||||||
|
# Add 'dependent.h:' lines. |
||||||
|
sed -ne '2,${ |
||||||
|
s/^ *// |
||||||
|
s/ \\*$// |
||||||
|
s/$/:/ |
||||||
|
p |
||||||
|
}' "$tmpdepfile" >> "$depfile" |
||||||
|
else |
||||||
|
make_dummy_depfile |
||||||
|
fi |
||||||
|
rm -f "$tmpdepfile" "$tmpdepfile2" |
||||||
|
;; |
||||||
|
|
||||||
|
tru64) |
||||||
|
# The Tru64 compiler uses -MD to generate dependencies as a side |
||||||
|
# effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. |
||||||
|
# At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put |
||||||
|
# dependencies in 'foo.d' instead, so we check for that too. |
||||||
|
# Subdirectories are respected. |
||||||
|
set_dir_from "$object" |
||||||
|
set_base_from "$object" |
||||||
|
|
||||||
|
if test "$libtool" = yes; then |
||||||
|
# Libtool generates 2 separate objects for the 2 libraries. These |
||||||
|
# two compilations output dependencies in $dir.libs/$base.o.d and |
||||||
|
# in $dir$base.o.d. We have to check for both files, because |
||||||
|
# one of the two compilations can be disabled. We should prefer |
||||||
|
# $dir$base.o.d over $dir.libs/$base.o.d because the latter is |
||||||
|
# automatically cleaned when .libs/ is deleted, while ignoring |
||||||
|
# the former would cause a distcleancheck panic. |
||||||
|
tmpdepfile1=$dir$base.o.d # libtool 1.5 |
||||||
|
tmpdepfile2=$dir.libs/$base.o.d # Likewise. |
||||||
|
tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 |
||||||
|
"$@" -Wc,-MD |
||||||
|
else |
||||||
|
tmpdepfile1=$dir$base.d |
||||||
|
tmpdepfile2=$dir$base.d |
||||||
|
tmpdepfile3=$dir$base.d |
||||||
|
"$@" -MD |
||||||
|
fi |
||||||
|
|
||||||
|
stat=$? |
||||||
|
if test $stat -ne 0; then |
||||||
|
rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" |
||||||
|
exit $stat |
||||||
|
fi |
||||||
|
|
||||||
|
for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" |
||||||
|
do |
||||||
|
test -f "$tmpdepfile" && break |
||||||
|
done |
||||||
|
# Same post-processing that is required for AIX mode. |
||||||
|
aix_post_process_depfile |
||||||
|
;; |
||||||
|
|
||||||
|
msvc7) |
||||||
|
if test "$libtool" = yes; then |
||||||
|
showIncludes=-Wc,-showIncludes |
||||||
|
else |
||||||
|
showIncludes=-showIncludes |
||||||
|
fi |
||||||
|
"$@" $showIncludes > "$tmpdepfile" |
||||||
|
stat=$? |
||||||
|
grep -v '^Note: including file: ' "$tmpdepfile" |
||||||
|
if test $stat -ne 0; then |
||||||
|
rm -f "$tmpdepfile" |
||||||
|
exit $stat |
||||||
|
fi |
||||||
|
rm -f "$depfile" |
||||||
|
echo "$object : \\" > "$depfile" |
||||||
|
# The first sed program below extracts the file names and escapes |
||||||
|
# backslashes for cygpath. The second sed program outputs the file |
||||||
|
# name when reading, but also accumulates all include files in the |
||||||
|
# hold buffer in order to output them again at the end. This only |
||||||
|
# works with sed implementations that can handle large buffers. |
||||||
|
sed < "$tmpdepfile" -n ' |
||||||
|
/^Note: including file: *\(.*\)/ { |
||||||
|
s//\1/ |
||||||
|
s/\\/\\\\/g |
||||||
|
p |
||||||
|
}' | $cygpath_u | sort -u | sed -n ' |
||||||
|
s/ /\\ /g |
||||||
|
s/\(.*\)/'"$tab"'\1 \\/p |
||||||
|
s/.\(.*\) \\/\1:/ |
||||||
|
H |
||||||
|
$ { |
||||||
|
s/.*/'"$tab"'/ |
||||||
|
G |
||||||
|
p |
||||||
|
}' >> "$depfile" |
||||||
|
echo >> "$depfile" # make sure the fragment doesn't end with a backslash |
||||||
|
rm -f "$tmpdepfile" |
||||||
|
;; |
||||||
|
|
||||||
|
msvc7msys) |
||||||
|
# This case exists only to let depend.m4 do its work. It works by |
||||||
|
# looking at the text of this script. This case will never be run, |
||||||
|
# since it is checked for above. |
||||||
|
exit 1 |
||||||
|
;; |
||||||
|
|
||||||
|
#nosideeffect) |
||||||
|
# This comment above is used by automake to tell side-effect |
||||||
|
# dependency tracking mechanisms from slower ones. |
||||||
|
|
||||||
|
dashmstdout) |
||||||
|
# Important note: in order to support this mode, a compiler *must* |
||||||
|
# always write the preprocessed file to stdout, regardless of -o. |
||||||
|
"$@" || exit $? |
||||||
|
|
||||||
|
# Remove the call to Libtool. |
||||||
|
if test "$libtool" = yes; then |
||||||
|
while test "X$1" != 'X--mode=compile'; do |
||||||
|
shift |
||||||
|
done |
||||||
|
shift |
||||||
|
fi |
||||||
|
|
||||||
|
# Remove '-o $object'. |
||||||
|
IFS=" " |
||||||
|
for arg |
||||||
|
do |
||||||
|
case $arg in |
||||||
|
-o) |
||||||
|
shift |
||||||
|
;; |
||||||
|
$object) |
||||||
|
shift |
||||||
|
;; |
||||||
|
*) |
||||||
|
set fnord "$@" "$arg" |
||||||
|
shift # fnord |
||||||
|
shift # $arg |
||||||
|
;; |
||||||
|
esac |
||||||
|
done |
||||||
|
|
||||||
|
test -z "$dashmflag" && dashmflag=-M |
||||||
|
# Require at least two characters before searching for ':' |
||||||
|
# in the target name. This is to cope with DOS-style filenames: |
||||||
|
# a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. |
||||||
|
"$@" $dashmflag | |
||||||
|
sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" |
||||||
|
rm -f "$depfile" |
||||||
|
cat < "$tmpdepfile" > "$depfile" |
||||||
|
# Some versions of the HPUX 10.20 sed can't process this sed invocation |
||||||
|
# correctly. Breaking it into two sed invocations is a workaround. |
||||||
|
tr ' ' "$nl" < "$tmpdepfile" \ |
||||||
|
| sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ |
||||||
|
| sed -e 's/$/ :/' >> "$depfile" |
||||||
|
rm -f "$tmpdepfile" |
||||||
|
;; |
||||||
|
|
||||||
|
dashXmstdout) |
||||||
|
# This case only exists to satisfy depend.m4. It is never actually |
||||||
|
# run, as this mode is specially recognized in the preamble. |
||||||
|
exit 1 |
||||||
|
;; |
||||||
|
|
||||||
|
makedepend) |
||||||
|
"$@" || exit $? |
||||||
|
# Remove any Libtool call |
||||||
|
if test "$libtool" = yes; then |
||||||
|
while test "X$1" != 'X--mode=compile'; do |
||||||
|
shift |
||||||
|
done |
||||||
|
shift |
||||||
|
fi |
||||||
|
# X makedepend |
||||||
|
shift |
||||||
|
cleared=no eat=no |
||||||
|
for arg |
||||||
|
do |
||||||
|
case $cleared in |
||||||
|
no) |
||||||
|
set ""; shift |
||||||
|
cleared=yes ;; |
||||||
|
esac |
||||||
|
if test $eat = yes; then |
||||||
|
eat=no |
||||||
|
continue |
||||||
|
fi |
||||||
|
case "$arg" in |
||||||
|
-D*|-I*) |
||||||
|
set fnord "$@" "$arg"; shift ;; |
||||||
|
# Strip any option that makedepend may not understand. Remove |
||||||
|
# the object too, otherwise makedepend will parse it as a source file. |
||||||
|
-arch) |
||||||
|
eat=yes ;; |
||||||
|
-*|$object) |
||||||
|
;; |
||||||
|
*) |
||||||
|
set fnord "$@" "$arg"; shift ;; |
||||||
|
esac |
||||||
|
done |
||||||
|
obj_suffix=`echo "$object" | sed 's/^.*\././'` |
||||||
|
touch "$tmpdepfile" |
||||||
|
${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" |
||||||
|
rm -f "$depfile" |
||||||
|
# makedepend may prepend the VPATH from the source file name to the object. |
||||||
|
# No need to regex-escape $object, excess matching of '.' is harmless. |
||||||
|
sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" |
||||||
|
# Some versions of the HPUX 10.20 sed can't process the last invocation |
||||||
|
# correctly. Breaking it into two sed invocations is a workaround. |
||||||
|
sed '1,2d' "$tmpdepfile" \ |
||||||
|
| tr ' ' "$nl" \ |
||||||
|
| sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ |
||||||
|
| sed -e 's/$/ :/' >> "$depfile" |
||||||
|
rm -f "$tmpdepfile" "$tmpdepfile".bak |
||||||
|
;; |
||||||
|
|
||||||
|
cpp) |
||||||
|
# Important note: in order to support this mode, a compiler *must* |
||||||
|
# always write the preprocessed file to stdout. |
||||||
|
"$@" || exit $? |
||||||
|
|
||||||
|
# Remove the call to Libtool. |
||||||
|
if test "$libtool" = yes; then |
||||||
|
while test "X$1" != 'X--mode=compile'; do |
||||||
|
shift |
||||||
|
done |
||||||
|
shift |
||||||
|
fi |
||||||
|
|
||||||
|
# Remove '-o $object'. |
||||||
|
IFS=" " |
||||||
|
for arg |
||||||
|
do |
||||||
|
case $arg in |
||||||
|
-o) |
||||||
|
shift |
||||||
|
;; |
||||||
|
$object) |
||||||
|
shift |
||||||
|
;; |
||||||
|
*) |
||||||
|
set fnord "$@" "$arg" |
||||||
|
shift # fnord |
||||||
|
shift # $arg |
||||||
|
;; |
||||||
|
esac |
||||||
|
done |
||||||
|
|
||||||
|
"$@" -E \ |
||||||
|
| sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ |
||||||
|
-e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ |
||||||
|
| sed '$ s: \\$::' > "$tmpdepfile" |
||||||
|
rm -f "$depfile" |
||||||
|
echo "$object : \\" > "$depfile" |
||||||
|
cat < "$tmpdepfile" >> "$depfile" |
||||||
|
sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" |
||||||
|
rm -f "$tmpdepfile" |
||||||
|
;; |
||||||
|
|
||||||
|
msvisualcpp) |
||||||
|
# Important note: in order to support this mode, a compiler *must* |
||||||
|
# always write the preprocessed file to stdout. |
||||||
|
"$@" || exit $? |
||||||
|
|
||||||
|
# Remove the call to Libtool. |
||||||
|
if test "$libtool" = yes; then |
||||||
|
while test "X$1" != 'X--mode=compile'; do |
||||||
|
shift |
||||||
|
done |
||||||
|
shift |
||||||
|
fi |
||||||
|
|
||||||
|
IFS=" " |
||||||
|
for arg |
||||||
|
do |
||||||
|
case "$arg" in |
||||||
|
-o) |
||||||
|
shift |
||||||
|
;; |
||||||
|
$object) |
||||||
|
shift |
||||||
|
;; |
||||||
|
"-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") |
||||||
|
set fnord "$@" |
||||||
|
shift |
||||||
|
shift |
||||||
|
;; |
||||||
|
*) |
||||||
|
set fnord "$@" "$arg" |
||||||
|
shift |
||||||
|
shift |
||||||
|
;; |
||||||
|
esac |
||||||
|
done |
||||||
|
"$@" -E 2>/dev/null | |
||||||
|
sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" |
||||||
|
rm -f "$depfile" |
||||||
|
echo "$object : \\" > "$depfile" |
||||||
|
sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" |
||||||
|
echo "$tab" >> "$depfile" |
||||||
|
sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" |
||||||
|
rm -f "$tmpdepfile" |
||||||
|
;; |
||||||
|
|
||||||
|
msvcmsys) |
||||||
|
# This case exists only to let depend.m4 do its work. It works by |
||||||
|
# looking at the text of this script. This case will never be run, |
||||||
|
# since it is checked for above. |
||||||
|
exit 1 |
||||||
|
;; |
||||||
|
|
||||||
|
none) |
||||||
|
exec "$@" |
||||||
|
;; |
||||||
|
|
||||||
|
*) |
||||||
|
echo "Unknown depmode $depmode" 1>&2 |
||||||
|
exit 1 |
||||||
|
;; |
||||||
|
esac |
||||||
|
|
||||||
|
exit 0 |
||||||
|
|
||||||
|
# Local Variables: |
||||||
|
# mode: shell-script |
||||||
|
# sh-indentation: 2 |
||||||
|
# eval: (add-hook 'before-save-hook 'time-stamp) |
||||||
|
# time-stamp-start: "scriptversion=" |
||||||
|
# time-stamp-format: "%:y-%02m-%02d.%02H" |
||||||
|
# time-stamp-time-zone: "UTC0" |
||||||
|
# time-stamp-end: "; # UTC" |
||||||
|
# End: |
||||||
@ -0,0 +1,518 @@ |
|||||||
|
#!/bin/sh |
||||||
|
# install - install a program, script, or datafile |
||||||
|
|
||||||
|
scriptversion=2018-03-11.20; # UTC |
||||||
|
|
||||||
|
# This originates from X11R5 (mit/util/scripts/install.sh), which was |
||||||
|
# later released in X11R6 (xc/config/util/install.sh) with the |
||||||
|
# following copyright and license. |
||||||
|
# |
||||||
|
# Copyright (C) 1994 X Consortium |
||||||
|
# |
||||||
|
# Permission is hereby granted, free of charge, to any person obtaining a copy |
||||||
|
# of this software and associated documentation files (the "Software"), to |
||||||
|
# deal in the Software without restriction, including without limitation the |
||||||
|
# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or |
||||||
|
# sell copies of the Software, and to permit persons to whom the Software is |
||||||
|
# furnished to do so, subject to the following conditions: |
||||||
|
# |
||||||
|
# The above copyright notice and this permission notice shall be included in |
||||||
|
# all copies or substantial portions of the Software. |
||||||
|
# |
||||||
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
||||||
|
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
||||||
|
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
||||||
|
# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN |
||||||
|
# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- |
||||||
|
# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
||||||
|
# |
||||||
|
# Except as contained in this notice, the name of the X Consortium shall not |
||||||
|
# be used in advertising or otherwise to promote the sale, use or other deal- |
||||||
|
# ings in this Software without prior written authorization from the X Consor- |
||||||
|
# tium. |
||||||
|
# |
||||||
|
# |
||||||
|
# FSF changes to this file are in the public domain. |
||||||
|
# |
||||||
|
# Calling this script install-sh is preferred over install.sh, to prevent |
||||||
|
# 'make' implicit rules from creating a file called install from it |
||||||
|
# when there is no Makefile. |
||||||
|
# |
||||||
|
# This script is compatible with the BSD install script, but was written |
||||||
|
# from scratch. |
||||||
|
|
||||||
|
tab=' ' |
||||||
|
nl=' |
||||||
|
' |
||||||
|
IFS=" $tab$nl" |
||||||
|
|
||||||
|
# Set DOITPROG to "echo" to test this script. |
||||||
|
|
||||||
|
doit=${DOITPROG-} |
||||||
|
doit_exec=${doit:-exec} |
||||||
|
|
||||||
|
# Put in absolute file names if you don't have them in your path; |
||||||
|
# or use environment vars. |
||||||
|
|
||||||
|
chgrpprog=${CHGRPPROG-chgrp} |
||||||
|
chmodprog=${CHMODPROG-chmod} |
||||||
|
chownprog=${CHOWNPROG-chown} |
||||||
|
cmpprog=${CMPPROG-cmp} |
||||||
|
cpprog=${CPPROG-cp} |
||||||
|
mkdirprog=${MKDIRPROG-mkdir} |
||||||
|
mvprog=${MVPROG-mv} |
||||||
|
rmprog=${RMPROG-rm} |
||||||
|
stripprog=${STRIPPROG-strip} |
||||||
|
|
||||||
|
posix_mkdir= |
||||||
|
|
||||||
|
# Desired mode of installed file. |
||||||
|
mode=0755 |
||||||
|
|
||||||
|
chgrpcmd= |
||||||
|
chmodcmd=$chmodprog |
||||||
|
chowncmd= |
||||||
|
mvcmd=$mvprog |
||||||
|
rmcmd="$rmprog -f" |
||||||
|
stripcmd= |
||||||
|
|
||||||
|
src= |
||||||
|
dst= |
||||||
|
dir_arg= |
||||||
|
dst_arg= |
||||||
|
|
||||||
|
copy_on_change=false |
||||||
|
is_target_a_directory=possibly |
||||||
|
|
||||||
|
usage="\ |
||||||
|
Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE |
||||||
|
or: $0 [OPTION]... SRCFILES... DIRECTORY |
||||||
|
or: $0 [OPTION]... -t DIRECTORY SRCFILES... |
||||||
|
or: $0 [OPTION]... -d DIRECTORIES... |
||||||
|
|
||||||
|
In the 1st form, copy SRCFILE to DSTFILE. |
||||||
|
In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. |
||||||
|
In the 4th, create DIRECTORIES. |
||||||
|
|
||||||
|
Options: |
||||||
|
--help display this help and exit. |
||||||
|
--version display version info and exit. |
||||||
|
|
||||||
|
-c (ignored) |
||||||
|
-C install only if different (preserve the last data modification time) |
||||||
|
-d create directories instead of installing files. |
||||||
|
-g GROUP $chgrpprog installed files to GROUP. |
||||||
|
-m MODE $chmodprog installed files to MODE. |
||||||
|
-o USER $chownprog installed files to USER. |
||||||
|
-s $stripprog installed files. |
||||||
|
-t DIRECTORY install into DIRECTORY. |
||||||
|
-T report an error if DSTFILE is a directory. |
||||||
|
|
||||||
|
Environment variables override the default commands: |
||||||
|
CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG |
||||||
|
RMPROG STRIPPROG |
||||||
|
" |
||||||
|
|
||||||
|
while test $# -ne 0; do |
||||||
|
case $1 in |
||||||
|
-c) ;; |
||||||
|
|
||||||
|
-C) copy_on_change=true;; |
||||||
|
|
||||||
|
-d) dir_arg=true;; |
||||||
|
|
||||||
|
-g) chgrpcmd="$chgrpprog $2" |
||||||
|
shift;; |
||||||
|
|
||||||
|
--help) echo "$usage"; exit $?;; |
||||||
|
|
||||||
|
-m) mode=$2 |
||||||
|
case $mode in |
||||||
|
*' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*) |
||||||
|
echo "$0: invalid mode: $mode" >&2 |
||||||
|
exit 1;; |
||||||
|
esac |
||||||
|
shift;; |
||||||
|
|
||||||
|
-o) chowncmd="$chownprog $2" |
||||||
|
shift;; |
||||||
|
|
||||||
|
-s) stripcmd=$stripprog;; |
||||||
|
|
||||||
|
-t) |
||||||
|
is_target_a_directory=always |
||||||
|
dst_arg=$2 |
||||||
|
# Protect names problematic for 'test' and other utilities. |
||||||
|
case $dst_arg in |
||||||
|
-* | [=\(\)!]) dst_arg=./$dst_arg;; |
||||||
|
esac |
||||||
|
shift;; |
||||||
|
|
||||||
|
-T) is_target_a_directory=never;; |
||||||
|
|
||||||
|
--version) echo "$0 $scriptversion"; exit $?;; |
||||||
|
|
||||||
|
--) shift |
||||||
|
break;; |
||||||
|
|
||||||
|
-*) echo "$0: invalid option: $1" >&2 |
||||||
|
exit 1;; |
||||||
|
|
||||||
|
*) break;; |
||||||
|
esac |
||||||
|
shift |
||||||
|
done |
||||||
|
|
||||||
|
# We allow the use of options -d and -T together, by making -d |
||||||
|
# take the precedence; this is for compatibility with GNU install. |
||||||
|
|
||||||
|
if test -n "$dir_arg"; then |
||||||
|
if test -n "$dst_arg"; then |
||||||
|
echo "$0: target directory not allowed when installing a directory." >&2 |
||||||
|
exit 1 |
||||||
|
fi |
||||||
|
fi |
||||||
|
|
||||||
|
if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then |
||||||
|
# When -d is used, all remaining arguments are directories to create. |
||||||
|
# When -t is used, the destination is already specified. |
||||||
|
# Otherwise, the last argument is the destination. Remove it from $@. |
||||||
|
for arg |
||||||
|
do |
||||||
|
if test -n "$dst_arg"; then |
||||||
|
# $@ is not empty: it contains at least $arg. |
||||||
|
set fnord "$@" "$dst_arg" |
||||||
|
shift # fnord |
||||||
|
fi |
||||||
|
shift # arg |
||||||
|
dst_arg=$arg |
||||||
|
# Protect names problematic for 'test' and other utilities. |
||||||
|
case $dst_arg in |
||||||
|
-* | [=\(\)!]) dst_arg=./$dst_arg;; |
||||||
|
esac |
||||||
|
done |
||||||
|
fi |
||||||
|
|
||||||
|
if test $# -eq 0; then |
||||||
|
if test -z "$dir_arg"; then |
||||||
|
echo "$0: no input file specified." >&2 |
||||||
|
exit 1 |
||||||
|
fi |
||||||
|
# It's OK to call 'install-sh -d' without argument. |
||||||
|
# This can happen when creating conditional directories. |
||||||
|
exit 0 |
||||||
|
fi |
||||||
|
|
||||||
|
if test -z "$dir_arg"; then |
||||||
|
if test $# -gt 1 || test "$is_target_a_directory" = always; then |
||||||
|
if test ! -d "$dst_arg"; then |
||||||
|
echo "$0: $dst_arg: Is not a directory." >&2 |
||||||
|
exit 1 |
||||||
|
fi |
||||||
|
fi |
||||||
|
fi |
||||||
|
|
||||||
|
if test -z "$dir_arg"; then |
||||||
|
do_exit='(exit $ret); exit $ret' |
||||||
|
trap "ret=129; $do_exit" 1 |
||||||
|
trap "ret=130; $do_exit" 2 |
||||||
|
trap "ret=141; $do_exit" 13 |
||||||
|
trap "ret=143; $do_exit" 15 |
||||||
|
|
||||||
|
# Set umask so as not to create temps with too-generous modes. |
||||||
|
# However, 'strip' requires both read and write access to temps. |
||||||
|
case $mode in |
||||||
|
# Optimize common cases. |
||||||
|
*644) cp_umask=133;; |
||||||
|
*755) cp_umask=22;; |
||||||
|
|
||||||
|
*[0-7]) |
||||||
|
if test -z "$stripcmd"; then |
||||||
|
u_plus_rw= |
||||||
|
else |
||||||
|
u_plus_rw='% 200' |
||||||
|
fi |
||||||
|
cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; |
||||||
|
*) |
||||||
|
if test -z "$stripcmd"; then |
||||||
|
u_plus_rw= |
||||||
|
else |
||||||
|
u_plus_rw=,u+rw |
||||||
|
fi |
||||||
|
cp_umask=$mode$u_plus_rw;; |
||||||
|
esac |
||||||
|
fi |
||||||
|
|
||||||
|
for src |
||||||
|
do |
||||||
|
# Protect names problematic for 'test' and other utilities. |
||||||
|
case $src in |
||||||
|
-* | [=\(\)!]) src=./$src;; |
||||||
|
esac |
||||||
|
|
||||||
|
if test -n "$dir_arg"; then |
||||||
|
dst=$src |
||||||
|
dstdir=$dst |
||||||
|
test -d "$dstdir" |
||||||
|
dstdir_status=$? |
||||||
|
else |
||||||
|
|
||||||
|
# Waiting for this to be detected by the "$cpprog $src $dsttmp" command |
||||||
|
# might cause directories to be created, which would be especially bad |
||||||
|
# if $src (and thus $dsttmp) contains '*'. |
||||||
|
if test ! -f "$src" && test ! -d "$src"; then |
||||||
|
echo "$0: $src does not exist." >&2 |
||||||
|
exit 1 |
||||||
|
fi |
||||||
|
|
||||||
|
if test -z "$dst_arg"; then |
||||||
|
echo "$0: no destination specified." >&2 |
||||||
|
exit 1 |
||||||
|
fi |
||||||
|
dst=$dst_arg |
||||||
|
|
||||||
|
# If destination is a directory, append the input filename. |
||||||
|
if test -d "$dst"; then |
||||||
|
if test "$is_target_a_directory" = never; then |
||||||
|
echo "$0: $dst_arg: Is a directory" >&2 |
||||||
|
exit 1 |
||||||
|
fi |
||||||
|
dstdir=$dst |
||||||
|
dstbase=`basename "$src"` |
||||||
|
case $dst in |
||||||
|
*/) dst=$dst$dstbase;; |
||||||
|
*) dst=$dst/$dstbase;; |
||||||
|
esac |
||||||
|
dstdir_status=0 |
||||||
|
else |
||||||
|
dstdir=`dirname "$dst"` |
||||||
|
test -d "$dstdir" |
||||||
|
dstdir_status=$? |
||||||
|
fi |
||||||
|
fi |
||||||
|
|
||||||
|
case $dstdir in |
||||||
|
*/) dstdirslash=$dstdir;; |
||||||
|
*) dstdirslash=$dstdir/;; |
||||||
|
esac |
||||||
|
|
||||||
|
obsolete_mkdir_used=false |
||||||
|
|
||||||
|
if test $dstdir_status != 0; then |
||||||
|
case $posix_mkdir in |
||||||
|
'') |
||||||
|
# Create intermediate dirs using mode 755 as modified by the umask. |
||||||
|
# This is like FreeBSD 'install' as of 1997-10-28. |
||||||
|
umask=`umask` |
||||||
|
case $stripcmd.$umask in |
||||||
|
# Optimize common cases. |
||||||
|
*[2367][2367]) mkdir_umask=$umask;; |
||||||
|
.*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; |
||||||
|
|
||||||
|
*[0-7]) |
||||||
|
mkdir_umask=`expr $umask + 22 \ |
||||||
|
- $umask % 100 % 40 + $umask % 20 \ |
||||||
|
- $umask % 10 % 4 + $umask % 2 |
||||||
|
`;; |
||||||
|
*) mkdir_umask=$umask,go-w;; |
||||||
|
esac |
||||||
|
|
||||||
|
# With -d, create the new directory with the user-specified mode. |
||||||
|
# Otherwise, rely on $mkdir_umask. |
||||||
|
if test -n "$dir_arg"; then |
||||||
|
mkdir_mode=-m$mode |
||||||
|
else |
||||||
|
mkdir_mode= |
||||||
|
fi |
||||||
|
|
||||||
|
posix_mkdir=false |
||||||
|
case $umask in |
||||||
|
*[123567][0-7][0-7]) |
||||||
|
# POSIX mkdir -p sets u+wx bits regardless of umask, which |
||||||
|
# is incompatible with FreeBSD 'install' when (umask & 300) != 0. |
||||||
|
;; |
||||||
|
*) |
||||||
|
# Note that $RANDOM variable is not portable (e.g. dash); Use it |
||||||
|
# here however when possible just to lower collision chance. |
||||||
|
tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ |
||||||
|
|
||||||
|
trap 'ret=$?; rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null; exit $ret' 0 |
||||||
|
|
||||||
|
# Because "mkdir -p" follows existing symlinks and we likely work |
||||||
|
# directly in world-writeable /tmp, make sure that the '$tmpdir' |
||||||
|
# directory is successfully created first before we actually test |
||||||
|
# 'mkdir -p' feature. |
||||||
|
if (umask $mkdir_umask && |
||||||
|
$mkdirprog $mkdir_mode "$tmpdir" && |
||||||
|
exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1 |
||||||
|
then |
||||||
|
if test -z "$dir_arg" || { |
||||||
|
# Check for POSIX incompatibilities with -m. |
||||||
|
# HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or |
||||||
|
# other-writable bit of parent directory when it shouldn't. |
||||||
|
# FreeBSD 6.1 mkdir -m -p sets mode of existing directory. |
||||||
|
test_tmpdir="$tmpdir/a" |
||||||
|
ls_ld_tmpdir=`ls -ld "$test_tmpdir"` |
||||||
|
case $ls_ld_tmpdir in |
||||||
|
d????-?r-*) different_mode=700;; |
||||||
|
d????-?--*) different_mode=755;; |
||||||
|
*) false;; |
||||||
|
esac && |
||||||
|
$mkdirprog -m$different_mode -p -- "$test_tmpdir" && { |
||||||
|
ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"` |
||||||
|
test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" |
||||||
|
} |
||||||
|
} |
||||||
|
then posix_mkdir=: |
||||||
|
fi |
||||||
|
rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" |
||||||
|
else |
||||||
|
# Remove any dirs left behind by ancient mkdir implementations. |
||||||
|
rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null |
||||||
|
fi |
||||||
|
trap '' 0;; |
||||||
|
esac;; |
||||||
|
esac |
||||||
|
|
||||||
|
if |
||||||
|
$posix_mkdir && ( |
||||||
|
umask $mkdir_umask && |
||||||
|
$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" |
||||||
|
) |
||||||
|
then : |
||||||
|
else |
||||||
|
|
||||||
|
# The umask is ridiculous, or mkdir does not conform to POSIX, |
||||||
|
# or it failed possibly due to a race condition. Create the |
||||||
|
# directory the slow way, step by step, checking for races as we go. |
||||||
|
|
||||||
|
case $dstdir in |
||||||
|
/*) prefix='/';; |
||||||
|
[-=\(\)!]*) prefix='./';; |
||||||
|
*) prefix='';; |
||||||
|
esac |
||||||
|
|
||||||
|
oIFS=$IFS |
||||||
|
IFS=/ |
||||||
|
set -f |
||||||
|
set fnord $dstdir |
||||||
|
shift |
||||||
|
set +f |
||||||
|
IFS=$oIFS |
||||||
|
|
||||||
|
prefixes= |
||||||
|
|
||||||
|
for d |
||||||
|
do |
||||||
|
test X"$d" = X && continue |
||||||
|
|
||||||
|
prefix=$prefix$d |
||||||
|
if test -d "$prefix"; then |
||||||
|
prefixes= |
||||||
|
else |
||||||
|
if $posix_mkdir; then |
||||||
|
(umask=$mkdir_umask && |
||||||
|
$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break |
||||||
|
# Don't fail if two instances are running concurrently. |
||||||
|
test -d "$prefix" || exit 1 |
||||||
|
else |
||||||
|
case $prefix in |
||||||
|
*\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; |
||||||
|
*) qprefix=$prefix;; |
||||||
|
esac |
||||||
|
prefixes="$prefixes '$qprefix'" |
||||||
|
fi |
||||||
|
fi |
||||||
|
prefix=$prefix/ |
||||||
|
done |
||||||
|
|
||||||
|
if test -n "$prefixes"; then |
||||||
|
# Don't fail if two instances are running concurrently. |
||||||
|
(umask $mkdir_umask && |
||||||
|
eval "\$doit_exec \$mkdirprog $prefixes") || |
||||||
|
test -d "$dstdir" || exit 1 |
||||||
|
obsolete_mkdir_used=true |
||||||
|
fi |
||||||
|
fi |
||||||
|
fi |
||||||
|
|
||||||
|
if test -n "$dir_arg"; then |
||||||
|
{ test -z "$chowncmd" || $doit $chowncmd "$dst"; } && |
||||||
|
{ test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && |
||||||
|
{ test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || |
||||||
|
test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 |
||||||
|
else |
||||||
|
|
||||||
|
# Make a couple of temp file names in the proper directory. |
||||||
|
dsttmp=${dstdirslash}_inst.$$_ |
||||||
|
rmtmp=${dstdirslash}_rm.$$_ |
||||||
|
|
||||||
|
# Trap to clean up those temp files at exit. |
||||||
|
trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 |
||||||
|
|
||||||
|
# Copy the file name to the temp name. |
||||||
|
(umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && |
||||||
|
|
||||||
|
# and set any options; do chmod last to preserve setuid bits. |
||||||
|
# |
||||||
|
# If any of these fail, we abort the whole thing. If we want to |
||||||
|
# ignore errors from any of these, just make sure not to ignore |
||||||
|
# errors from the above "$doit $cpprog $src $dsttmp" command. |
||||||
|
# |
||||||
|
{ test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && |
||||||
|
{ test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && |
||||||
|
{ test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && |
||||||
|
{ test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && |
||||||
|
|
||||||
|
# If -C, don't bother to copy if it wouldn't change the file. |
||||||
|
if $copy_on_change && |
||||||
|
old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && |
||||||
|
new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && |
||||||
|
set -f && |
||||||
|
set X $old && old=:$2:$4:$5:$6 && |
||||||
|
set X $new && new=:$2:$4:$5:$6 && |
||||||
|
set +f && |
||||||
|
test "$old" = "$new" && |
||||||
|
$cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 |
||||||
|
then |
||||||
|
rm -f "$dsttmp" |
||||||
|
else |
||||||
|
# Rename the file to the real destination. |
||||||
|
$doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || |
||||||
|
|
||||||
|
# The rename failed, perhaps because mv can't rename something else |
||||||
|
# to itself, or perhaps because mv is so ancient that it does not |
||||||
|
# support -f. |
||||||
|
{ |
||||||
|
# Now remove or move aside any old file at destination location. |
||||||
|
# We try this two ways since rm can't unlink itself on some |
||||||
|
# systems and the destination file might be busy for other |
||||||
|
# reasons. In this case, the final cleanup might fail but the new |
||||||
|
# file should still install successfully. |
||||||
|
{ |
||||||
|
test ! -f "$dst" || |
||||||
|
$doit $rmcmd -f "$dst" 2>/dev/null || |
||||||
|
{ $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && |
||||||
|
{ $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } |
||||||
|
} || |
||||||
|
{ echo "$0: cannot unlink or rename $dst" >&2 |
||||||
|
(exit 1); exit 1 |
||||||
|
} |
||||||
|
} && |
||||||
|
|
||||||
|
# Now rename the file to the real destination. |
||||||
|
$doit $mvcmd "$dsttmp" "$dst" |
||||||
|
} |
||||||
|
fi || exit 1 |
||||||
|
|
||||||
|
trap '' 0 |
||||||
|
fi |
||||||
|
done |
||||||
|
|
||||||
|
# Local variables: |
||||||
|
# eval: (add-hook 'before-save-hook 'time-stamp) |
||||||
|
# time-stamp-start: "scriptversion=" |
||||||
|
# time-stamp-format: "%:y-%02m-%02d.%02H" |
||||||
|
# time-stamp-time-zone: "UTC0" |
||||||
|
# time-stamp-end: "; # UTC" |
||||||
|
# End: |
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,437 @@ |
|||||||
|
# Helper functions for option handling. -*- Autoconf -*- |
||||||
|
# |
||||||
|
# Copyright (C) 2004-2005, 2007-2009, 2011-2015 Free Software |
||||||
|
# Foundation, Inc. |
||||||
|
# Written by Gary V. Vaughan, 2004 |
||||||
|
# |
||||||
|
# This file is free software; the Free Software Foundation gives |
||||||
|
# unlimited permission to copy and/or distribute it, with or without |
||||||
|
# modifications, as long as this notice is preserved. |
||||||
|
|
||||||
|
# serial 8 ltoptions.m4 |
||||||
|
|
||||||
|
# This is to help aclocal find these macros, as it can't see m4_define. |
||||||
|
AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) |
||||||
|
|
||||||
|
|
||||||
|
# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) |
||||||
|
# ------------------------------------------ |
||||||
|
m4_define([_LT_MANGLE_OPTION], |
||||||
|
[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) |
||||||
|
|
||||||
|
|
||||||
|
# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) |
||||||
|
# --------------------------------------- |
||||||
|
# Set option OPTION-NAME for macro MACRO-NAME, and if there is a |
||||||
|
# matching handler defined, dispatch to it. Other OPTION-NAMEs are |
||||||
|
# saved as a flag. |
||||||
|
m4_define([_LT_SET_OPTION], |
||||||
|
[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl |
||||||
|
m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), |
||||||
|
_LT_MANGLE_DEFUN([$1], [$2]), |
||||||
|
[m4_warning([Unknown $1 option '$2'])])[]dnl |
||||||
|
]) |
||||||
|
|
||||||
|
|
||||||
|
# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) |
||||||
|
# ------------------------------------------------------------ |
||||||
|
# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. |
||||||
|
m4_define([_LT_IF_OPTION], |
||||||
|
[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) |
||||||
|
|
||||||
|
|
||||||
|
# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) |
||||||
|
# ------------------------------------------------------- |
||||||
|
# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME |
||||||
|
# are set. |
||||||
|
m4_define([_LT_UNLESS_OPTIONS], |
||||||
|
[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), |
||||||
|
[m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), |
||||||
|
[m4_define([$0_found])])])[]dnl |
||||||
|
m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 |
||||||
|
])[]dnl |
||||||
|
]) |
||||||
|
|
||||||
|
|
||||||
|
# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) |
||||||
|
# ---------------------------------------- |
||||||
|
# OPTION-LIST is a space-separated list of Libtool options associated |
||||||
|
# with MACRO-NAME. If any OPTION has a matching handler declared with |
||||||
|
# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about |
||||||
|
# the unknown option and exit. |
||||||
|
m4_defun([_LT_SET_OPTIONS], |
||||||
|
[# Set options |
||||||
|
m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), |
||||||
|
[_LT_SET_OPTION([$1], _LT_Option)]) |
||||||
|
|
||||||
|
m4_if([$1],[LT_INIT],[ |
||||||
|
dnl |
||||||
|
dnl Simply set some default values (i.e off) if boolean options were not |
||||||
|
dnl specified: |
||||||
|
_LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no |
||||||
|
]) |
||||||
|
_LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no |
||||||
|
]) |
||||||
|
dnl |
||||||
|
dnl If no reference was made to various pairs of opposing options, then |
||||||
|
dnl we run the default mode handler for the pair. For example, if neither |
||||||
|
dnl 'shared' nor 'disable-shared' was passed, we enable building of shared |
||||||
|
dnl archives by default: |
||||||
|
_LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) |
||||||
|
_LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) |
||||||
|
_LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) |
||||||
|
_LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], |
||||||
|
[_LT_ENABLE_FAST_INSTALL]) |
||||||
|
_LT_UNLESS_OPTIONS([LT_INIT], [aix-soname=aix aix-soname=both aix-soname=svr4], |
||||||
|
[_LT_WITH_AIX_SONAME([aix])]) |
||||||
|
]) |
||||||
|
])# _LT_SET_OPTIONS |
||||||
|
|
||||||
|
|
||||||
|
## --------------------------------- ## |
||||||
|
## Macros to handle LT_INIT options. ## |
||||||
|
## --------------------------------- ## |
||||||
|
|
||||||
|
# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) |
||||||
|
# ----------------------------------------- |
||||||
|
m4_define([_LT_MANGLE_DEFUN], |
||||||
|
[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) |
||||||
|
|
||||||
|
|
||||||
|
# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) |
||||||
|
# ----------------------------------------------- |
||||||
|
m4_define([LT_OPTION_DEFINE], |
||||||
|
[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl |
||||||
|
])# LT_OPTION_DEFINE |
||||||
|
|
||||||
|
|
||||||
|
# dlopen |
||||||
|
# ------ |
||||||
|
LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes |
||||||
|
]) |
||||||
|
|
||||||
|
AU_DEFUN([AC_LIBTOOL_DLOPEN], |
||||||
|
[_LT_SET_OPTION([LT_INIT], [dlopen]) |
||||||
|
AC_DIAGNOSE([obsolete], |
||||||
|
[$0: Remove this warning and the call to _LT_SET_OPTION when you |
||||||
|
put the 'dlopen' option into LT_INIT's first parameter.]) |
||||||
|
]) |
||||||
|
|
||||||
|
dnl aclocal-1.4 backwards compatibility: |
||||||
|
dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) |
||||||
|
|
||||||
|
|
||||||
|
# win32-dll |
||||||
|
# --------- |
||||||
|
# Declare package support for building win32 dll's. |
||||||
|
LT_OPTION_DEFINE([LT_INIT], [win32-dll], |
||||||
|
[enable_win32_dll=yes |
||||||
|
|
||||||
|
case $host in |
||||||
|
*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) |
||||||
|
AC_CHECK_TOOL(AS, as, false) |
||||||
|
AC_CHECK_TOOL(DLLTOOL, dlltool, false) |
||||||
|
AC_CHECK_TOOL(OBJDUMP, objdump, false) |
||||||
|
;; |
||||||
|
esac |
||||||
|
|
||||||
|
test -z "$AS" && AS=as |
||||||
|
_LT_DECL([], [AS], [1], [Assembler program])dnl |
||||||
|
|
||||||
|
test -z "$DLLTOOL" && DLLTOOL=dlltool |
||||||
|
_LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl |
||||||
|
|
||||||
|
test -z "$OBJDUMP" && OBJDUMP=objdump |
||||||
|
_LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl |
||||||
|
])# win32-dll |
||||||
|
|
||||||
|
AU_DEFUN([AC_LIBTOOL_WIN32_DLL], |
||||||
|
[AC_REQUIRE([AC_CANONICAL_HOST])dnl |
||||||
|
_LT_SET_OPTION([LT_INIT], [win32-dll]) |
||||||
|
AC_DIAGNOSE([obsolete], |
||||||
|
[$0: Remove this warning and the call to _LT_SET_OPTION when you |
||||||
|
put the 'win32-dll' option into LT_INIT's first parameter.]) |
||||||
|
]) |
||||||
|
|
||||||
|
dnl aclocal-1.4 backwards compatibility: |
||||||
|
dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) |
||||||
|
|
||||||
|
|
||||||
|
# _LT_ENABLE_SHARED([DEFAULT]) |
||||||
|
# ---------------------------- |
||||||
|
# implement the --enable-shared flag, and supports the 'shared' and |
||||||
|
# 'disable-shared' LT_INIT options. |
||||||
|
# DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. |
||||||
|
m4_define([_LT_ENABLE_SHARED], |
||||||
|
[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl |
||||||
|
AC_ARG_ENABLE([shared], |
||||||
|
[AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], |
||||||
|
[build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], |
||||||
|
[p=${PACKAGE-default} |
||||||
|
case $enableval in |
||||||
|
yes) enable_shared=yes ;; |
||||||
|
no) enable_shared=no ;; |
||||||
|
*) |
||||||
|
enable_shared=no |
||||||
|
# Look at the argument we got. We use all the common list separators. |
||||||
|
lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, |
||||||
|
for pkg in $enableval; do |
||||||
|
IFS=$lt_save_ifs |
||||||
|
if test "X$pkg" = "X$p"; then |
||||||
|
enable_shared=yes |
||||||
|
fi |
||||||
|
done |
||||||
|
IFS=$lt_save_ifs |
||||||
|
;; |
||||||
|
esac], |
||||||
|
[enable_shared=]_LT_ENABLE_SHARED_DEFAULT) |
||||||
|
|
||||||
|
_LT_DECL([build_libtool_libs], [enable_shared], [0], |
||||||
|
[Whether or not to build shared libraries]) |
||||||
|
])# _LT_ENABLE_SHARED |
||||||
|
|
||||||
|
LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) |
||||||
|
LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) |
||||||
|
|
||||||
|
# Old names: |
||||||
|
AC_DEFUN([AC_ENABLE_SHARED], |
||||||
|
[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) |
||||||
|
]) |
||||||
|
|
||||||
|
AC_DEFUN([AC_DISABLE_SHARED], |
||||||
|
[_LT_SET_OPTION([LT_INIT], [disable-shared]) |
||||||
|
]) |
||||||
|
|
||||||
|
AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) |
||||||
|
AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) |
||||||
|
|
||||||
|
dnl aclocal-1.4 backwards compatibility: |
||||||
|
dnl AC_DEFUN([AM_ENABLE_SHARED], []) |
||||||
|
dnl AC_DEFUN([AM_DISABLE_SHARED], []) |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# _LT_ENABLE_STATIC([DEFAULT]) |
||||||
|
# ---------------------------- |
||||||
|
# implement the --enable-static flag, and support the 'static' and |
||||||
|
# 'disable-static' LT_INIT options. |
||||||
|
# DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. |
||||||
|
m4_define([_LT_ENABLE_STATIC], |
||||||
|
[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl |
||||||
|
AC_ARG_ENABLE([static], |
||||||
|
[AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], |
||||||
|
[build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], |
||||||
|
[p=${PACKAGE-default} |
||||||
|
case $enableval in |
||||||
|
yes) enable_static=yes ;; |
||||||
|
no) enable_static=no ;; |
||||||
|
*) |
||||||
|
enable_static=no |
||||||
|
# Look at the argument we got. We use all the common list separators. |
||||||
|
lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, |
||||||
|
for pkg in $enableval; do |
||||||
|
IFS=$lt_save_ifs |
||||||
|
if test "X$pkg" = "X$p"; then |
||||||
|
enable_static=yes |
||||||
|
fi |
||||||
|
done |
||||||
|
IFS=$lt_save_ifs |
||||||
|
;; |
||||||
|
esac], |
||||||
|
[enable_static=]_LT_ENABLE_STATIC_DEFAULT) |
||||||
|
|
||||||
|
_LT_DECL([build_old_libs], [enable_static], [0], |
||||||
|
[Whether or not to build static libraries]) |
||||||
|
])# _LT_ENABLE_STATIC |
||||||
|
|
||||||
|
LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) |
||||||
|
LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) |
||||||
|
|
||||||
|
# Old names: |
||||||
|
AC_DEFUN([AC_ENABLE_STATIC], |
||||||
|
[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) |
||||||
|
]) |
||||||
|
|
||||||
|
AC_DEFUN([AC_DISABLE_STATIC], |
||||||
|
[_LT_SET_OPTION([LT_INIT], [disable-static]) |
||||||
|
]) |
||||||
|
|
||||||
|
AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) |
||||||
|
AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) |
||||||
|
|
||||||
|
dnl aclocal-1.4 backwards compatibility: |
||||||
|
dnl AC_DEFUN([AM_ENABLE_STATIC], []) |
||||||
|
dnl AC_DEFUN([AM_DISABLE_STATIC], []) |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# _LT_ENABLE_FAST_INSTALL([DEFAULT]) |
||||||
|
# ---------------------------------- |
||||||
|
# implement the --enable-fast-install flag, and support the 'fast-install' |
||||||
|
# and 'disable-fast-install' LT_INIT options. |
||||||
|
# DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. |
||||||
|
m4_define([_LT_ENABLE_FAST_INSTALL], |
||||||
|
[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl |
||||||
|
AC_ARG_ENABLE([fast-install], |
||||||
|
[AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], |
||||||
|
[optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], |
||||||
|
[p=${PACKAGE-default} |
||||||
|
case $enableval in |
||||||
|
yes) enable_fast_install=yes ;; |
||||||
|
no) enable_fast_install=no ;; |
||||||
|
*) |
||||||
|
enable_fast_install=no |
||||||
|
# Look at the argument we got. We use all the common list separators. |
||||||
|
lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, |
||||||
|
for pkg in $enableval; do |
||||||
|
IFS=$lt_save_ifs |
||||||
|
if test "X$pkg" = "X$p"; then |
||||||
|
enable_fast_install=yes |
||||||
|
fi |
||||||
|
done |
||||||
|
IFS=$lt_save_ifs |
||||||
|
;; |
||||||
|
esac], |
||||||
|
[enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) |
||||||
|
|
||||||
|
_LT_DECL([fast_install], [enable_fast_install], [0], |
||||||
|
[Whether or not to optimize for fast installation])dnl |
||||||
|
])# _LT_ENABLE_FAST_INSTALL |
||||||
|
|
||||||
|
LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) |
||||||
|
LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) |
||||||
|
|
||||||
|
# Old names: |
||||||
|
AU_DEFUN([AC_ENABLE_FAST_INSTALL], |
||||||
|
[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) |
||||||
|
AC_DIAGNOSE([obsolete], |
||||||
|
[$0: Remove this warning and the call to _LT_SET_OPTION when you put |
||||||
|
the 'fast-install' option into LT_INIT's first parameter.]) |
||||||
|
]) |
||||||
|
|
||||||
|
AU_DEFUN([AC_DISABLE_FAST_INSTALL], |
||||||
|
[_LT_SET_OPTION([LT_INIT], [disable-fast-install]) |
||||||
|
AC_DIAGNOSE([obsolete], |
||||||
|
[$0: Remove this warning and the call to _LT_SET_OPTION when you put |
||||||
|
the 'disable-fast-install' option into LT_INIT's first parameter.]) |
||||||
|
]) |
||||||
|
|
||||||
|
dnl aclocal-1.4 backwards compatibility: |
||||||
|
dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) |
||||||
|
dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) |
||||||
|
|
||||||
|
|
||||||
|
# _LT_WITH_AIX_SONAME([DEFAULT]) |
||||||
|
# ---------------------------------- |
||||||
|
# implement the --with-aix-soname flag, and support the `aix-soname=aix' |
||||||
|
# and `aix-soname=both' and `aix-soname=svr4' LT_INIT options. DEFAULT |
||||||
|
# is either `aix', `both' or `svr4'. If omitted, it defaults to `aix'. |
||||||
|
m4_define([_LT_WITH_AIX_SONAME], |
||||||
|
[m4_define([_LT_WITH_AIX_SONAME_DEFAULT], [m4_if($1, svr4, svr4, m4_if($1, both, both, aix))])dnl |
||||||
|
shared_archive_member_spec= |
||||||
|
case $host,$enable_shared in |
||||||
|
power*-*-aix[[5-9]]*,yes) |
||||||
|
AC_MSG_CHECKING([which variant of shared library versioning to provide]) |
||||||
|
AC_ARG_WITH([aix-soname], |
||||||
|
[AS_HELP_STRING([--with-aix-soname=aix|svr4|both], |
||||||
|
[shared library versioning (aka "SONAME") variant to provide on AIX, @<:@default=]_LT_WITH_AIX_SONAME_DEFAULT[@:>@.])], |
||||||
|
[case $withval in |
||||||
|
aix|svr4|both) |
||||||
|
;; |
||||||
|
*) |
||||||
|
AC_MSG_ERROR([Unknown argument to --with-aix-soname]) |
||||||
|
;; |
||||||
|
esac |
||||||
|
lt_cv_with_aix_soname=$with_aix_soname], |
||||||
|
[AC_CACHE_VAL([lt_cv_with_aix_soname], |
||||||
|
[lt_cv_with_aix_soname=]_LT_WITH_AIX_SONAME_DEFAULT) |
||||||
|
with_aix_soname=$lt_cv_with_aix_soname]) |
||||||
|
AC_MSG_RESULT([$with_aix_soname]) |
||||||
|
if test aix != "$with_aix_soname"; then |
||||||
|
# For the AIX way of multilib, we name the shared archive member |
||||||
|
# based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o', |
||||||
|
# and 'shr.imp' or 'shr_64.imp', respectively, for the Import File. |
||||||
|
# Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag, |
||||||
|
# the AIX toolchain works better with OBJECT_MODE set (default 32). |
||||||
|
if test 64 = "${OBJECT_MODE-32}"; then |
||||||
|
shared_archive_member_spec=shr_64 |
||||||
|
else |
||||||
|
shared_archive_member_spec=shr |
||||||
|
fi |
||||||
|
fi |
||||||
|
;; |
||||||
|
*) |
||||||
|
with_aix_soname=aix |
||||||
|
;; |
||||||
|
esac |
||||||
|
|
||||||
|
_LT_DECL([], [shared_archive_member_spec], [0], |
||||||
|
[Shared archive member basename, for filename based shared library versioning on AIX])dnl |
||||||
|
])# _LT_WITH_AIX_SONAME |
||||||
|
|
||||||
|
LT_OPTION_DEFINE([LT_INIT], [aix-soname=aix], [_LT_WITH_AIX_SONAME([aix])]) |
||||||
|
LT_OPTION_DEFINE([LT_INIT], [aix-soname=both], [_LT_WITH_AIX_SONAME([both])]) |
||||||
|
LT_OPTION_DEFINE([LT_INIT], [aix-soname=svr4], [_LT_WITH_AIX_SONAME([svr4])]) |
||||||
|
|
||||||
|
|
||||||
|
# _LT_WITH_PIC([MODE]) |
||||||
|
# -------------------- |
||||||
|
# implement the --with-pic flag, and support the 'pic-only' and 'no-pic' |
||||||
|
# LT_INIT options. |
||||||
|
# MODE is either 'yes' or 'no'. If omitted, it defaults to 'both'. |
||||||
|
m4_define([_LT_WITH_PIC], |
||||||
|
[AC_ARG_WITH([pic], |
||||||
|
[AS_HELP_STRING([--with-pic@<:@=PKGS@:>@], |
||||||
|
[try to use only PIC/non-PIC objects @<:@default=use both@:>@])], |
||||||
|
[lt_p=${PACKAGE-default} |
||||||
|
case $withval in |
||||||
|
yes|no) pic_mode=$withval ;; |
||||||
|
*) |
||||||
|
pic_mode=default |
||||||
|
# Look at the argument we got. We use all the common list separators. |
||||||
|
lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, |
||||||
|
for lt_pkg in $withval; do |
||||||
|
IFS=$lt_save_ifs |
||||||
|
if test "X$lt_pkg" = "X$lt_p"; then |
||||||
|
pic_mode=yes |
||||||
|
fi |
||||||
|
done |
||||||
|
IFS=$lt_save_ifs |
||||||
|
;; |
||||||
|
esac], |
||||||
|
[pic_mode=m4_default([$1], [default])]) |
||||||
|
|
||||||
|
_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl |
||||||
|
])# _LT_WITH_PIC |
||||||
|
|
||||||
|
LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) |
||||||
|
LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) |
||||||
|
|
||||||
|
# Old name: |
||||||
|
AU_DEFUN([AC_LIBTOOL_PICMODE], |
||||||
|
[_LT_SET_OPTION([LT_INIT], [pic-only]) |
||||||
|
AC_DIAGNOSE([obsolete], |
||||||
|
[$0: Remove this warning and the call to _LT_SET_OPTION when you |
||||||
|
put the 'pic-only' option into LT_INIT's first parameter.]) |
||||||
|
]) |
||||||
|
|
||||||
|
dnl aclocal-1.4 backwards compatibility: |
||||||
|
dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) |
||||||
|
|
||||||
|
## ----------------- ## |
||||||
|
## LTDL_INIT Options ## |
||||||
|
## ----------------- ## |
||||||
|
|
||||||
|
m4_define([_LTDL_MODE], []) |
||||||
|
LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], |
||||||
|
[m4_define([_LTDL_MODE], [nonrecursive])]) |
||||||
|
LT_OPTION_DEFINE([LTDL_INIT], [recursive], |
||||||
|
[m4_define([_LTDL_MODE], [recursive])]) |
||||||
|
LT_OPTION_DEFINE([LTDL_INIT], [subproject], |
||||||
|
[m4_define([_LTDL_MODE], [subproject])]) |
||||||
|
|
||||||
|
m4_define([_LTDL_TYPE], []) |
||||||
|
LT_OPTION_DEFINE([LTDL_INIT], [installable], |
||||||
|
[m4_define([_LTDL_TYPE], [installable])]) |
||||||
|
LT_OPTION_DEFINE([LTDL_INIT], [convenience], |
||||||
|
[m4_define([_LTDL_TYPE], [convenience])]) |
||||||
@ -0,0 +1,124 @@ |
|||||||
|
# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- |
||||||
|
# |
||||||
|
# Copyright (C) 2004-2005, 2007-2008, 2011-2015 Free Software |
||||||
|
# Foundation, Inc. |
||||||
|
# Written by Gary V. Vaughan, 2004 |
||||||
|
# |
||||||
|
# This file is free software; the Free Software Foundation gives |
||||||
|
# unlimited permission to copy and/or distribute it, with or without |
||||||
|
# modifications, as long as this notice is preserved. |
||||||
|
|
||||||
|
# serial 6 ltsugar.m4 |
||||||
|
|
||||||
|
# This is to help aclocal find these macros, as it can't see m4_define. |
||||||
|
AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) |
||||||
|
|
||||||
|
|
||||||
|
# lt_join(SEP, ARG1, [ARG2...]) |
||||||
|
# ----------------------------- |
||||||
|
# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their |
||||||
|
# associated separator. |
||||||
|
# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier |
||||||
|
# versions in m4sugar had bugs. |
||||||
|
m4_define([lt_join], |
||||||
|
[m4_if([$#], [1], [], |
||||||
|
[$#], [2], [[$2]], |
||||||
|
[m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) |
||||||
|
m4_define([_lt_join], |
||||||
|
[m4_if([$#$2], [2], [], |
||||||
|
[m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) |
||||||
|
|
||||||
|
|
||||||
|
# lt_car(LIST) |
||||||
|
# lt_cdr(LIST) |
||||||
|
# ------------ |
||||||
|
# Manipulate m4 lists. |
||||||
|
# These macros are necessary as long as will still need to support |
||||||
|
# Autoconf-2.59, which quotes differently. |
||||||
|
m4_define([lt_car], [[$1]]) |
||||||
|
m4_define([lt_cdr], |
||||||
|
[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], |
||||||
|
[$#], 1, [], |
||||||
|
[m4_dquote(m4_shift($@))])]) |
||||||
|
m4_define([lt_unquote], $1) |
||||||
|
|
||||||
|
|
||||||
|
# lt_append(MACRO-NAME, STRING, [SEPARATOR]) |
||||||
|
# ------------------------------------------ |
||||||
|
# Redefine MACRO-NAME to hold its former content plus 'SEPARATOR''STRING'. |
||||||
|
# Note that neither SEPARATOR nor STRING are expanded; they are appended |
||||||
|
# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). |
||||||
|
# No SEPARATOR is output if MACRO-NAME was previously undefined (different |
||||||
|
# than defined and empty). |
||||||
|
# |
||||||
|
# This macro is needed until we can rely on Autoconf 2.62, since earlier |
||||||
|
# versions of m4sugar mistakenly expanded SEPARATOR but not STRING. |
||||||
|
m4_define([lt_append], |
||||||
|
[m4_define([$1], |
||||||
|
m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) |
||||||
|
# ---------------------------------------------------------- |
||||||
|
# Produce a SEP delimited list of all paired combinations of elements of |
||||||
|
# PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list |
||||||
|
# has the form PREFIXmINFIXSUFFIXn. |
||||||
|
# Needed until we can rely on m4_combine added in Autoconf 2.62. |
||||||
|
m4_define([lt_combine], |
||||||
|
[m4_if(m4_eval([$# > 3]), [1], |
||||||
|
[m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl |
||||||
|
[[m4_foreach([_Lt_prefix], [$2], |
||||||
|
[m4_foreach([_Lt_suffix], |
||||||
|
]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, |
||||||
|
[_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) |
||||||
|
|
||||||
|
|
||||||
|
# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) |
||||||
|
# ----------------------------------------------------------------------- |
||||||
|
# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited |
||||||
|
# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. |
||||||
|
m4_define([lt_if_append_uniq], |
||||||
|
[m4_ifdef([$1], |
||||||
|
[m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], |
||||||
|
[lt_append([$1], [$2], [$3])$4], |
||||||
|
[$5])], |
||||||
|
[lt_append([$1], [$2], [$3])$4])]) |
||||||
|
|
||||||
|
|
||||||
|
# lt_dict_add(DICT, KEY, VALUE) |
||||||
|
# ----------------------------- |
||||||
|
m4_define([lt_dict_add], |
||||||
|
[m4_define([$1($2)], [$3])]) |
||||||
|
|
||||||
|
|
||||||
|
# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) |
||||||
|
# -------------------------------------------- |
||||||
|
m4_define([lt_dict_add_subkey], |
||||||
|
[m4_define([$1($2:$3)], [$4])]) |
||||||
|
|
||||||
|
|
||||||
|
# lt_dict_fetch(DICT, KEY, [SUBKEY]) |
||||||
|
# ---------------------------------- |
||||||
|
m4_define([lt_dict_fetch], |
||||||
|
[m4_ifval([$3], |
||||||
|
m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), |
||||||
|
m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) |
||||||
|
|
||||||
|
|
||||||
|
# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) |
||||||
|
# ----------------------------------------------------------------- |
||||||
|
m4_define([lt_if_dict_fetch], |
||||||
|
[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], |
||||||
|
[$5], |
||||||
|
[$6])]) |
||||||
|
|
||||||
|
|
||||||
|
# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) |
||||||
|
# -------------------------------------------------------------- |
||||||
|
m4_define([lt_dict_filter], |
||||||
|
[m4_if([$5], [], [], |
||||||
|
[lt_join(m4_quote(m4_default([$4], [[, ]])), |
||||||
|
lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), |
||||||
|
[lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl |
||||||
|
]) |
||||||
@ -0,0 +1,23 @@ |
|||||||
|
# ltversion.m4 -- version numbers -*- Autoconf -*- |
||||||
|
# |
||||||
|
# Copyright (C) 2004, 2011-2015 Free Software Foundation, Inc. |
||||||
|
# Written by Scott James Remnant, 2004 |
||||||
|
# |
||||||
|
# This file is free software; the Free Software Foundation gives |
||||||
|
# unlimited permission to copy and/or distribute it, with or without |
||||||
|
# modifications, as long as this notice is preserved. |
||||||
|
|
||||||
|
# @configure_input@ |
||||||
|
|
||||||
|
# serial 4179 ltversion.m4 |
||||||
|
# This file is part of GNU Libtool |
||||||
|
|
||||||
|
m4_define([LT_PACKAGE_VERSION], [2.4.6]) |
||||||
|
m4_define([LT_PACKAGE_REVISION], [2.4.6]) |
||||||
|
|
||||||
|
AC_DEFUN([LTVERSION_VERSION], |
||||||
|
[macro_version='2.4.6' |
||||||
|
macro_revision='2.4.6' |
||||||
|
_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) |
||||||
|
_LT_DECL(, macro_revision, 0) |
||||||
|
]) |
||||||
@ -0,0 +1,99 @@ |
|||||||
|
# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- |
||||||
|
# |
||||||
|
# Copyright (C) 2004-2005, 2007, 2009, 2011-2015 Free Software |
||||||
|
# Foundation, Inc. |
||||||
|
# Written by Scott James Remnant, 2004. |
||||||
|
# |
||||||
|
# This file is free software; the Free Software Foundation gives |
||||||
|
# unlimited permission to copy and/or distribute it, with or without |
||||||
|
# modifications, as long as this notice is preserved. |
||||||
|
|
||||||
|
# serial 5 lt~obsolete.m4 |
||||||
|
|
||||||
|
# These exist entirely to fool aclocal when bootstrapping libtool. |
||||||
|
# |
||||||
|
# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN), |
||||||
|
# which have later been changed to m4_define as they aren't part of the |
||||||
|
# exported API, or moved to Autoconf or Automake where they belong. |
||||||
|
# |
||||||
|
# The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN |
||||||
|
# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us |
||||||
|
# using a macro with the same name in our local m4/libtool.m4 it'll |
||||||
|
# pull the old libtool.m4 in (it doesn't see our shiny new m4_define |
||||||
|
# and doesn't know about Autoconf macros at all.) |
||||||
|
# |
||||||
|
# So we provide this file, which has a silly filename so it's always |
||||||
|
# included after everything else. This provides aclocal with the |
||||||
|
# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything |
||||||
|
# because those macros already exist, or will be overwritten later. |
||||||
|
# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. |
||||||
|
# |
||||||
|
# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. |
||||||
|
# Yes, that means every name once taken will need to remain here until |
||||||
|
# we give up compatibility with versions before 1.7, at which point |
||||||
|
# we need to keep only those names which we still refer to. |
||||||
|
|
||||||
|
# This is to help aclocal find these macros, as it can't see m4_define. |
||||||
|
AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) |
||||||
|
|
||||||
|
m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) |
||||||
|
m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) |
||||||
|
m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) |
||||||
|
m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) |
||||||
|
m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) |
||||||
|
m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) |
||||||
|
m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) |
||||||
|
m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) |
||||||
|
m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) |
||||||
|
m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) |
||||||
|
m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) |
||||||
|
m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) |
||||||
|
m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) |
||||||
|
m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) |
||||||
|
m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) |
||||||
|
m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) |
||||||
|
m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) |
||||||
|
m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) |
||||||
|
m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) |
||||||
|
m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) |
||||||
|
m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) |
||||||
|
m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) |
||||||
|
m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) |
||||||
|
m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) |
||||||
|
m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) |
||||||
|
m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) |
||||||
|
m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) |
||||||
|
m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) |
||||||
|
m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) |
||||||
|
m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) |
||||||
|
m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) |
||||||
|
m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) |
||||||
|
m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) |
||||||
|
m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) |
||||||
|
m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) |
||||||
|
m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) |
||||||
|
m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) |
||||||
|
m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) |
||||||
|
m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) |
||||||
|
m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) |
||||||
|
m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) |
||||||
|
m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) |
||||||
|
m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) |
||||||
|
m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) |
||||||
|
m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) |
||||||
|
m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) |
||||||
|
m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) |
||||||
|
m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) |
||||||
|
m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) |
||||||
|
m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) |
||||||
|
m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) |
||||||
|
m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) |
||||||
|
m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) |
||||||
|
m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) |
||||||
|
m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])]) |
||||||
|
m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])]) |
||||||
|
m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])]) |
||||||
|
m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])]) |
||||||
|
m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])]) |
||||||
|
m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])]) |
||||||
|
m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) |
||||||
@ -0,0 +1,215 @@ |
|||||||
|
#! /bin/sh |
||||||
|
# Common wrapper for a few potentially missing GNU programs. |
||||||
|
|
||||||
|
scriptversion=2018-03-07.03; # UTC |
||||||
|
|
||||||
|
# Copyright (C) 1996-2018 Free Software Foundation, Inc. |
||||||
|
# Originally written by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996. |
||||||
|
|
||||||
|
# This program is free software; you can redistribute it and/or modify |
||||||
|
# it under the terms of the GNU General Public License as published by |
||||||
|
# the Free Software Foundation; either version 2, or (at your option) |
||||||
|
# any later version. |
||||||
|
|
||||||
|
# This program is distributed in the hope that it will be useful, |
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
# GNU General Public License for more details. |
||||||
|
|
||||||
|
# You should have received a copy of the GNU General Public License |
||||||
|
# along with this program. If not, see <https://www.gnu.org/licenses/>. |
||||||
|
|
||||||
|
# As a special exception to the GNU General Public License, if you |
||||||
|
# distribute this file as part of a program that contains a |
||||||
|
# configuration script generated by Autoconf, you may include it under |
||||||
|
# the same distribution terms that you use for the rest of that program. |
||||||
|
|
||||||
|
if test $# -eq 0; then |
||||||
|
echo 1>&2 "Try '$0 --help' for more information" |
||||||
|
exit 1 |
||||||
|
fi |
||||||
|
|
||||||
|
case $1 in |
||||||
|
|
||||||
|
--is-lightweight) |
||||||
|
# Used by our autoconf macros to check whether the available missing |
||||||
|
# script is modern enough. |
||||||
|
exit 0 |
||||||
|
;; |
||||||
|
|
||||||
|
--run) |
||||||
|
# Back-compat with the calling convention used by older automake. |
||||||
|
shift |
||||||
|
;; |
||||||
|
|
||||||
|
-h|--h|--he|--hel|--help) |
||||||
|
echo "\ |
||||||
|
$0 [OPTION]... PROGRAM [ARGUMENT]... |
||||||
|
|
||||||
|
Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due |
||||||
|
to PROGRAM being missing or too old. |
||||||
|
|
||||||
|
Options: |
||||||
|
-h, --help display this help and exit |
||||||
|
-v, --version output version information and exit |
||||||
|
|
||||||
|
Supported PROGRAM values: |
||||||
|
aclocal autoconf autoheader autom4te automake makeinfo |
||||||
|
bison yacc flex lex help2man |
||||||
|
|
||||||
|
Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and |
||||||
|
'g' are ignored when checking the name. |
||||||
|
|
||||||
|
Send bug reports to <bug-automake@gnu.org>." |
||||||
|
exit $? |
||||||
|
;; |
||||||
|
|
||||||
|
-v|--v|--ve|--ver|--vers|--versi|--versio|--version) |
||||||
|
echo "missing $scriptversion (GNU Automake)" |
||||||
|
exit $? |
||||||
|
;; |
||||||
|
|
||||||
|
-*) |
||||||
|
echo 1>&2 "$0: unknown '$1' option" |
||||||
|
echo 1>&2 "Try '$0 --help' for more information" |
||||||
|
exit 1 |
||||||
|
;; |
||||||
|
|
||||||
|
esac |
||||||
|
|
||||||
|
# Run the given program, remember its exit status. |
||||||
|
"$@"; st=$? |
||||||
|
|
||||||
|
# If it succeeded, we are done. |
||||||
|
test $st -eq 0 && exit 0 |
||||||
|
|
||||||
|
# Also exit now if we it failed (or wasn't found), and '--version' was |
||||||
|
# passed; such an option is passed most likely to detect whether the |
||||||
|
# program is present and works. |
||||||
|
case $2 in --version|--help) exit $st;; esac |
||||||
|
|
||||||
|
# Exit code 63 means version mismatch. This often happens when the user |
||||||
|
# tries to use an ancient version of a tool on a file that requires a |
||||||
|
# minimum version. |
||||||
|
if test $st -eq 63; then |
||||||
|
msg="probably too old" |
||||||
|
elif test $st -eq 127; then |
||||||
|
# Program was missing. |
||||||
|
msg="missing on your system" |
||||||
|
else |
||||||
|
# Program was found and executed, but failed. Give up. |
||||||
|
exit $st |
||||||
|
fi |
||||||
|
|
||||||
|
perl_URL=https://www.perl.org/ |
||||||
|
flex_URL=https://github.com/westes/flex |
||||||
|
gnu_software_URL=https://www.gnu.org/software |
||||||
|
|
||||||
|
program_details () |
||||||
|
{ |
||||||
|
case $1 in |
||||||
|
aclocal|automake) |
||||||
|
echo "The '$1' program is part of the GNU Automake package:" |
||||||
|
echo "<$gnu_software_URL/automake>" |
||||||
|
echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" |
||||||
|
echo "<$gnu_software_URL/autoconf>" |
||||||
|
echo "<$gnu_software_URL/m4/>" |
||||||
|
echo "<$perl_URL>" |
||||||
|
;; |
||||||
|
autoconf|autom4te|autoheader) |
||||||
|
echo "The '$1' program is part of the GNU Autoconf package:" |
||||||
|
echo "<$gnu_software_URL/autoconf/>" |
||||||
|
echo "It also requires GNU m4 and Perl in order to run:" |
||||||
|
echo "<$gnu_software_URL/m4/>" |
||||||
|
echo "<$perl_URL>" |
||||||
|
;; |
||||||
|
esac |
||||||
|
} |
||||||
|
|
||||||
|
give_advice () |
||||||
|
{ |
||||||
|
# Normalize program name to check for. |
||||||
|
normalized_program=`echo "$1" | sed ' |
||||||
|
s/^gnu-//; t |
||||||
|
s/^gnu//; t |
||||||
|
s/^g//; t'` |
||||||
|
|
||||||
|
printf '%s\n' "'$1' is $msg." |
||||||
|
|
||||||
|
configure_deps="'configure.ac' or m4 files included by 'configure.ac'" |
||||||
|
case $normalized_program in |
||||||
|
autoconf*) |
||||||
|
echo "You should only need it if you modified 'configure.ac'," |
||||||
|
echo "or m4 files included by it." |
||||||
|
program_details 'autoconf' |
||||||
|
;; |
||||||
|
autoheader*) |
||||||
|
echo "You should only need it if you modified 'acconfig.h' or" |
||||||
|
echo "$configure_deps." |
||||||
|
program_details 'autoheader' |
||||||
|
;; |
||||||
|
automake*) |
||||||
|
echo "You should only need it if you modified 'Makefile.am' or" |
||||||
|
echo "$configure_deps." |
||||||
|
program_details 'automake' |
||||||
|
;; |
||||||
|
aclocal*) |
||||||
|
echo "You should only need it if you modified 'acinclude.m4' or" |
||||||
|
echo "$configure_deps." |
||||||
|
program_details 'aclocal' |
||||||
|
;; |
||||||
|
autom4te*) |
||||||
|
echo "You might have modified some maintainer files that require" |
||||||
|
echo "the 'autom4te' program to be rebuilt." |
||||||
|
program_details 'autom4te' |
||||||
|
;; |
||||||
|
bison*|yacc*) |
||||||
|
echo "You should only need it if you modified a '.y' file." |
||||||
|
echo "You may want to install the GNU Bison package:" |
||||||
|
echo "<$gnu_software_URL/bison/>" |
||||||
|
;; |
||||||
|
lex*|flex*) |
||||||
|
echo "You should only need it if you modified a '.l' file." |
||||||
|
echo "You may want to install the Fast Lexical Analyzer package:" |
||||||
|
echo "<$flex_URL>" |
||||||
|
;; |
||||||
|
help2man*) |
||||||
|
echo "You should only need it if you modified a dependency" \ |
||||||
|
"of a man page." |
||||||
|
echo "You may want to install the GNU Help2man package:" |
||||||
|
echo "<$gnu_software_URL/help2man/>" |
||||||
|
;; |
||||||
|
makeinfo*) |
||||||
|
echo "You should only need it if you modified a '.texi' file, or" |
||||||
|
echo "any other file indirectly affecting the aspect of the manual." |
||||||
|
echo "You might want to install the Texinfo package:" |
||||||
|
echo "<$gnu_software_URL/texinfo/>" |
||||||
|
echo "The spurious makeinfo call might also be the consequence of" |
||||||
|
echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" |
||||||
|
echo "want to install GNU make:" |
||||||
|
echo "<$gnu_software_URL/make/>" |
||||||
|
;; |
||||||
|
*) |
||||||
|
echo "You might have modified some files without having the proper" |
||||||
|
echo "tools for further handling them. Check the 'README' file, it" |
||||||
|
echo "often tells you about the needed prerequisites for installing" |
||||||
|
echo "this package. You may also peek at any GNU archive site, in" |
||||||
|
echo "case some other package contains this missing '$1' program." |
||||||
|
;; |
||||||
|
esac |
||||||
|
} |
||||||
|
|
||||||
|
give_advice "$1" | sed -e '1s/^/WARNING: /' \ |
||||||
|
-e '2,$s/^/ /' >&2 |
||||||
|
|
||||||
|
# Propagate the correct exit status (expected to be 127 for a program |
||||||
|
# not found, 63 for a program that failed due to version mismatch). |
||||||
|
exit $st |
||||||
|
|
||||||
|
# Local variables: |
||||||
|
# eval: (add-hook 'before-save-hook 'time-stamp) |
||||||
|
# time-stamp-start: "scriptversion=" |
||||||
|
# time-stamp-format: "%:y-%02m-%02d.%02H" |
||||||
|
# time-stamp-time-zone: "UTC0" |
||||||
|
# time-stamp-end: "; # UTC" |
||||||
|
# End: |
||||||
@ -0,0 +1,6 @@ |
|||||||
|
/Makefile |
||||||
|
/.deps/ |
||||||
|
*.o |
||||||
|
*.lo |
||||||
|
/.libs/ |
||||||
|
*.la |
||||||
@ -0,0 +1,203 @@ |
|||||||
|
/*
|
||||||
|
* Copyright (c) 2022 Taner Sener |
||||||
|
* |
||||||
|
* This file is part of FFmpegKit. |
||||||
|
* |
||||||
|
* FFmpegKit is free software: you can redistribute it and/or modify |
||||||
|
* it under the terms of the GNU Lesser General License as published by |
||||||
|
* the Free Software Foundation, either version 3 of the License, or |
||||||
|
* (at your option) any later version. |
||||||
|
* |
||||||
|
* FFmpegKit is distributed in the hope that it will be useful, |
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
* GNU Lesser General License for more details. |
||||||
|
* |
||||||
|
* You should have received a copy of the GNU Lesser General License |
||||||
|
* along with FFmpegKit. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/ |
||||||
|
|
||||||
|
#include "AbstractSession.h" |
||||||
|
#include "FFmpegKit.h" |
||||||
|
#include "FFmpegKitConfig.h" |
||||||
|
#include "LogCallback.h" |
||||||
|
#include "ReturnCode.h" |
||||||
|
#include <mutex> |
||||||
|
#include <thread> |
||||||
|
#include <iostream> |
||||||
|
#include <atomic> |
||||||
|
#include <algorithm> |
||||||
|
#include <condition_variable> |
||||||
|
|
||||||
|
static std::atomic<long> sessionIdGenerator(1); |
||||||
|
|
||||||
|
extern void addSessionToSessionHistory(const std::shared_ptr<ffmpegkit::Session> session); |
||||||
|
|
||||||
|
ffmpegkit::AbstractSession::AbstractSession(const std::shared_ptr<std::list<std::string>> arguments, const ffmpegkit::LogCallback logCallback, const LogRedirectionStrategy logRedirectionStrategy) : |
||||||
|
_arguments{arguments}, |
||||||
|
_sessionId{sessionIdGenerator++}, |
||||||
|
_logCallback{logCallback}, |
||||||
|
_createTime{std::chrono::system_clock::now()}, |
||||||
|
_logs{std::make_shared<std::list<std::shared_ptr<ffmpegkit::Log>>>()}, |
||||||
|
_state{SessionStateCreated}, |
||||||
|
_returnCode{nullptr}, |
||||||
|
_logRedirectionStrategy{logRedirectionStrategy} { |
||||||
|
addSessionToSessionHistory(shared_from_this()); |
||||||
|
} |
||||||
|
|
||||||
|
void ffmpegkit::AbstractSession::waitForAsynchronousMessagesInTransmit(const int timeout) const { |
||||||
|
std::mutex mutex; |
||||||
|
std::unique_lock<std::mutex> lock(mutex); |
||||||
|
std::condition_variable condition_variable; |
||||||
|
const std::chrono::time_point<std::chrono::system_clock> expireTime = std::chrono::system_clock::now() + std::chrono::milliseconds(timeout); |
||||||
|
|
||||||
|
while (this->thereAreAsynchronousMessagesInTransmit() && (std::chrono::system_clock::now() < expireTime)) { |
||||||
|
condition_variable.wait_for(lock, std::chrono::milliseconds(100)); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
ffmpegkit::LogCallback ffmpegkit::AbstractSession::getLogCallback() const { |
||||||
|
return _logCallback; |
||||||
|
} |
||||||
|
|
||||||
|
long ffmpegkit::AbstractSession::getSessionId() const { |
||||||
|
return _sessionId; |
||||||
|
} |
||||||
|
|
||||||
|
std::chrono::time_point<std::chrono::system_clock> ffmpegkit::AbstractSession::getCreateTime() const { |
||||||
|
return _createTime; |
||||||
|
} |
||||||
|
|
||||||
|
std::chrono::time_point<std::chrono::system_clock> ffmpegkit::AbstractSession::getStartTime() const { |
||||||
|
return _startTime; |
||||||
|
} |
||||||
|
|
||||||
|
std::chrono::time_point<std::chrono::system_clock> ffmpegkit::AbstractSession::getEndTime() const { |
||||||
|
return _endTime; |
||||||
|
} |
||||||
|
|
||||||
|
long ffmpegkit::AbstractSession::getDuration() const { |
||||||
|
const std::chrono::time_point<std::chrono::system_clock> startTime = _startTime; |
||||||
|
const std::chrono::time_point<std::chrono::system_clock> endTime = _endTime; |
||||||
|
|
||||||
|
if (startTime.time_since_epoch() != std::chrono::microseconds(0) && endTime.time_since_epoch() != std::chrono::microseconds(0)) { |
||||||
|
return std::chrono::duration_cast<std::chrono::milliseconds>(endTime - startTime).count(); |
||||||
|
} |
||||||
|
|
||||||
|
return 0; |
||||||
|
} |
||||||
|
|
||||||
|
std::shared_ptr<std::list<std::string>> ffmpegkit::AbstractSession::getArguments() const { |
||||||
|
return _arguments; |
||||||
|
} |
||||||
|
|
||||||
|
std::string ffmpegkit::AbstractSession::getCommand() const { |
||||||
|
return ffmpegkit::FFmpegKitConfig::argumentsToString(_arguments); |
||||||
|
} |
||||||
|
|
||||||
|
std::shared_ptr<std::list<std::shared_ptr<ffmpegkit::Log>>> ffmpegkit::AbstractSession::getAllLogsWithTimeout(const int waitTimeout) const { |
||||||
|
this->waitForAsynchronousMessagesInTransmit(waitTimeout); |
||||||
|
|
||||||
|
if (this->thereAreAsynchronousMessagesInTransmit()) { |
||||||
|
std::cout << "getAllLogsWithTimeout was called to return all logs but there are still logs being transmitted for session id " << _sessionId << "." << std::endl; |
||||||
|
} |
||||||
|
|
||||||
|
return this->getLogs(); |
||||||
|
} |
||||||
|
std::shared_ptr<std::list<std::shared_ptr<ffmpegkit::Log>>> ffmpegkit::AbstractSession::getAllLogs() const { |
||||||
|
return this->getAllLogsWithTimeout(ffmpegkit::AbstractSession::DefaultTimeoutForAsynchronousMessagesInTransmit); |
||||||
|
} |
||||||
|
|
||||||
|
std::shared_ptr<std::list<std::shared_ptr<ffmpegkit::Log>>> ffmpegkit::AbstractSession::getLogs() const { |
||||||
|
return _logs; |
||||||
|
} |
||||||
|
|
||||||
|
std::string ffmpegkit::AbstractSession::getAllLogsAsStringWithTimeout(const int waitTimeout) const { |
||||||
|
this->waitForAsynchronousMessagesInTransmit(waitTimeout); |
||||||
|
|
||||||
|
if (this->thereAreAsynchronousMessagesInTransmit()) { |
||||||
|
std::cout << "getAllLogsAsStringWithTimeout was called to return all logs but there are still logs being transmitted for session id " << _sessionId << "." << std::endl; |
||||||
|
} |
||||||
|
|
||||||
|
return this->getLogsAsString(); |
||||||
|
} |
||||||
|
|
||||||
|
std::string ffmpegkit::AbstractSession::getAllLogsAsString() const { |
||||||
|
return this->getAllLogsAsStringWithTimeout(ffmpegkit::AbstractSession::DefaultTimeoutForAsynchronousMessagesInTransmit); |
||||||
|
} |
||||||
|
|
||||||
|
std::string ffmpegkit::AbstractSession::getLogsAsString() const { |
||||||
|
std::string concatenatedString; |
||||||
|
|
||||||
|
std::for_each(_logs->cbegin(), _logs->cend(), [&](std::shared_ptr<ffmpegkit::Log> log) { |
||||||
|
concatenatedString.append(log->getMessage()); |
||||||
|
}); |
||||||
|
|
||||||
|
return concatenatedString; |
||||||
|
} |
||||||
|
|
||||||
|
std::string ffmpegkit::AbstractSession::getOutput() const { |
||||||
|
return this->getAllLogsAsString(); |
||||||
|
} |
||||||
|
|
||||||
|
ffmpegkit::SessionState ffmpegkit::AbstractSession::getState() const { |
||||||
|
return _state; |
||||||
|
} |
||||||
|
|
||||||
|
std::shared_ptr<ffmpegkit::ReturnCode> ffmpegkit::AbstractSession::getReturnCode() const { |
||||||
|
return _returnCode; |
||||||
|
} |
||||||
|
|
||||||
|
std::string ffmpegkit::AbstractSession::getFailStackTrace() const { |
||||||
|
return _failStackTrace; |
||||||
|
} |
||||||
|
|
||||||
|
ffmpegkit::LogRedirectionStrategy ffmpegkit::AbstractSession::getLogRedirectionStrategy() const { |
||||||
|
return _logRedirectionStrategy; |
||||||
|
} |
||||||
|
|
||||||
|
bool ffmpegkit::AbstractSession::thereAreAsynchronousMessagesInTransmit() const { |
||||||
|
return (FFmpegKitConfig::messagesInTransmit(_sessionId) != 0); |
||||||
|
} |
||||||
|
|
||||||
|
void ffmpegkit::AbstractSession::addLog(const std::shared_ptr<ffmpegkit::Log> log) { |
||||||
|
_logs->push_back(log); |
||||||
|
} |
||||||
|
|
||||||
|
void ffmpegkit::AbstractSession::startRunning() { |
||||||
|
_state = SessionStateRunning; |
||||||
|
_startTime = std::chrono::system_clock::now(); |
||||||
|
} |
||||||
|
|
||||||
|
void ffmpegkit::AbstractSession::complete(const std::shared_ptr<ffmpegkit::ReturnCode> returnCode) { |
||||||
|
_returnCode = returnCode; |
||||||
|
_state = SessionStateCompleted; |
||||||
|
_endTime = std::chrono::system_clock::now(); |
||||||
|
} |
||||||
|
|
||||||
|
void ffmpegkit::AbstractSession::fail(const char* error) { |
||||||
|
_failStackTrace = error; |
||||||
|
_state = SessionStateFailed; |
||||||
|
_endTime = std::chrono::system_clock::now(); |
||||||
|
} |
||||||
|
|
||||||
|
bool ffmpegkit::AbstractSession::isFFmpeg() const { |
||||||
|
// IMPLEMENTED IN SUBCLASSES
|
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
bool ffmpegkit::AbstractSession::isFFprobe() const { |
||||||
|
// IMPLEMENTED IN SUBCLASSES
|
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
bool ffmpegkit::AbstractSession::isMediaInformation() const { |
||||||
|
// IMPLEMENTED IN SUBCLASSES
|
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
void ffmpegkit::AbstractSession::cancel() { |
||||||
|
if (_state == SessionStateRunning) { |
||||||
|
FFmpegKit::cancel(_sessionId); |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,287 @@ |
|||||||
|
/*
|
||||||
|
* Copyright (c) 2022 Taner Sener |
||||||
|
* |
||||||
|
* This file is part of FFmpegKit. |
||||||
|
* |
||||||
|
* FFmpegKit is free software: you can redistribute it and/or modify |
||||||
|
* it under the terms of the GNU Lesser General License as published by |
||||||
|
* the Free Software Foundation, either version 3 of the License, or |
||||||
|
* (at your option) any later version. |
||||||
|
* |
||||||
|
* FFmpegKit is distributed in the hope that it will be useful, |
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
* GNU Lesser General License for more details. |
||||||
|
* |
||||||
|
* You should have received a copy of the GNU Lesser General License |
||||||
|
* along with FFmpegKit. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/ |
||||||
|
|
||||||
|
#ifndef FFMPEG_KIT_ABSTRACT_SESSION_H |
||||||
|
#define FFMPEG_KIT_ABSTRACT_SESSION_H |
||||||
|
|
||||||
|
#include "Session.h" |
||||||
|
|
||||||
|
namespace ffmpegkit { |
||||||
|
|
||||||
|
/**
|
||||||
|
* Abstract session implementation which includes common features shared by <code>FFmpeg</code>, |
||||||
|
* <code>FFprobe</code> and <code>MediaInformation</code> sessions. |
||||||
|
*/ |
||||||
|
class AbstractSession : public Session, std::enable_shared_from_this<AbstractSession> { |
||||||
|
public: |
||||||
|
|
||||||
|
/**
|
||||||
|
* Defines how long default "getAll" methods wait, in milliseconds. |
||||||
|
*/ |
||||||
|
static constexpr int DefaultTimeoutForAsynchronousMessagesInTransmit = 5000; |
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new abstract session. |
||||||
|
* |
||||||
|
* @param arguments command arguments |
||||||
|
* @param logCallback session specific log callback |
||||||
|
* @param logRedirectionStrategy session specific log redirection strategy |
||||||
|
*/ |
||||||
|
AbstractSession(const std::shared_ptr<std::list<std::string>> arguments, const ffmpegkit::LogCallback logCallback, const LogRedirectionStrategy logRedirectionStrategy); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Waits for all asynchronous messages to be transmitted until the given timeout. |
||||||
|
* |
||||||
|
* @param timeout wait timeout in milliseconds |
||||||
|
*/ |
||||||
|
void waitForAsynchronousMessagesInTransmit(const int timeout) const; |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the session specific log callback. |
||||||
|
* |
||||||
|
* @return session specific log callback |
||||||
|
*/ |
||||||
|
ffmpegkit::LogCallback getLogCallback() const override; |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the session identifier. |
||||||
|
* |
||||||
|
* @return session identifier |
||||||
|
*/ |
||||||
|
long getSessionId() const override; |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns session create time. |
||||||
|
* |
||||||
|
* @return session create time |
||||||
|
*/ |
||||||
|
std::chrono::time_point<std::chrono::system_clock> getCreateTime() const override; |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns session start time. |
||||||
|
* |
||||||
|
* @return session start time |
||||||
|
*/ |
||||||
|
std::chrono::time_point<std::chrono::system_clock> getStartTime() const override; |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns session end time. |
||||||
|
* |
||||||
|
* @return session end time |
||||||
|
*/ |
||||||
|
std::chrono::time_point<std::chrono::system_clock> getEndTime() const override; |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the time taken to execute this session. |
||||||
|
* |
||||||
|
* @return time taken to execute this session in milliseconds or zero (0) if the session is |
||||||
|
* not over yet |
||||||
|
*/ |
||||||
|
long getDuration() const override; |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns command arguments as a list. |
||||||
|
* |
||||||
|
* @return command arguments as a list |
||||||
|
*/ |
||||||
|
std::shared_ptr<std::list<std::string>> getArguments() const override; |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns command arguments as a concatenated string. |
||||||
|
* |
||||||
|
* @return command arguments as a concatenated string |
||||||
|
*/ |
||||||
|
std::string getCommand() const override; |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns all log entries generated for this session. If there are asynchronous |
||||||
|
* messages that are not delivered yet, this method waits for them until the given timeout. |
||||||
|
* |
||||||
|
* @param waitTimeout wait timeout for asynchronous messages in milliseconds |
||||||
|
* @return list of log entries generated for this session |
||||||
|
*/ |
||||||
|
std::shared_ptr<std::list<std::shared_ptr<ffmpegkit::Log>>> getAllLogsWithTimeout(const int waitTimeout) const override; |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns all log entries generated for this session. If there are asynchronous |
||||||
|
* messages that are not delivered yet, this method waits for them. |
||||||
|
* |
||||||
|
* @return list of log entries generated for this session |
||||||
|
*/ |
||||||
|
std::shared_ptr<std::list<std::shared_ptr<ffmpegkit::Log>>> getAllLogs() const override; |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns all log entries delivered for this session. Note that if there are asynchronous |
||||||
|
* messages that are not delivered yet, this method will not wait for them and will return |
||||||
|
* immediately. |
||||||
|
* |
||||||
|
* @return list of log entries received for this session |
||||||
|
*/ |
||||||
|
std::shared_ptr<std::list<std::shared_ptr<ffmpegkit::Log>>> getLogs() const override; |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns all log entries generated for this session as a concatenated string. If there are |
||||||
|
* asynchronous messages that are not delivered yet, this method waits for them until |
||||||
|
* the given timeout. |
||||||
|
* |
||||||
|
* @param waitTimeout wait timeout for asynchronous messages in milliseconds |
||||||
|
* @return all log entries generated for this session as a concatenated string |
||||||
|
*/ |
||||||
|
std::string getAllLogsAsStringWithTimeout(const int waitTimeout) const override; |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns all log entries generated for this session as a concatenated string. If there are |
||||||
|
* asynchronous messages that are not delivered yet, this method waits for them. |
||||||
|
* |
||||||
|
* @return all log entries generated for this session as a concatenated string |
||||||
|
*/ |
||||||
|
std::string getAllLogsAsString() const override; |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns all log entries delivered for this session as a concatenated string. Note that if |
||||||
|
* there are asynchronous messages that are not delivered yet, this method will not wait |
||||||
|
* for them and will return immediately. |
||||||
|
* |
||||||
|
* @return list of log entries received for this session |
||||||
|
*/ |
||||||
|
std::string getLogsAsString() const override; |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the log output generated while running the session. |
||||||
|
* |
||||||
|
* @return log output generated |
||||||
|
*/ |
||||||
|
std::string getOutput() const override; |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the state of the session. |
||||||
|
* |
||||||
|
* @return state of the session |
||||||
|
*/ |
||||||
|
ffmpegkit::SessionState getState() const override; |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the return code for this session. Note that return code is only set for sessions |
||||||
|
* that end with SessionStateCompleted state. If a session is not started, still running or failed then |
||||||
|
* this method returns nil. |
||||||
|
* |
||||||
|
* @return the return code for this session if the session has completed, nil if session is |
||||||
|
* not started, still running or failed |
||||||
|
*/ |
||||||
|
std::shared_ptr<ffmpegkit::ReturnCode> getReturnCode() const override; |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the stack trace of the exception received while executing this session. |
||||||
|
* <p> |
||||||
|
* The stack trace is only set for sessions that end with SessionStateFailed state. For sessions that has |
||||||
|
* SessionStateCompleted state this method returns nil. |
||||||
|
* |
||||||
|
* @return stack trace of the exception received while executing this session, nil if session |
||||||
|
* is not started, still running or completed |
||||||
|
*/ |
||||||
|
std::string getFailStackTrace() const override; |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns session specific log redirection strategy. |
||||||
|
* |
||||||
|
* @return session specific log redirection strategy |
||||||
|
*/ |
||||||
|
ffmpegkit::LogRedirectionStrategy getLogRedirectionStrategy() const override; |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns whether there are still asynchronous messages being transmitted for this |
||||||
|
* session or not. |
||||||
|
* |
||||||
|
* @return true if there are still asynchronous messages being transmitted, false |
||||||
|
* otherwise |
||||||
|
*/ |
||||||
|
bool thereAreAsynchronousMessagesInTransmit() const override; |
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds a new log entry for this session. |
||||||
|
* |
||||||
|
* It is invoked internally by <code>FFmpegKit</code> library methods. Must not be used by user |
||||||
|
* applications. |
||||||
|
* |
||||||
|
* @param log log entry |
||||||
|
*/ |
||||||
|
void addLog(const std::shared_ptr<ffmpegkit::Log> log) override; |
||||||
|
|
||||||
|
/**
|
||||||
|
* Starts running the session. |
||||||
|
*/ |
||||||
|
void startRunning() override; |
||||||
|
|
||||||
|
/**
|
||||||
|
* Completes running the session with the provided return code. |
||||||
|
* |
||||||
|
* @param returnCode return code of the execution |
||||||
|
*/ |
||||||
|
void complete(const std::shared_ptr<ffmpegkit::ReturnCode> returnCode) override; |
||||||
|
|
||||||
|
/**
|
||||||
|
* Ends running the session with a failure. |
||||||
|
* |
||||||
|
* @param error error received |
||||||
|
*/ |
||||||
|
void fail(const char* error) override; |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns whether it is an <code>FFmpeg</code> session or not. |
||||||
|
* |
||||||
|
* @return true if it is an <code>FFmpeg</code> session, false otherwise |
||||||
|
*/ |
||||||
|
virtual bool isFFmpeg() const override; |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns whether it is an <code>FFprobe</code> session or not. |
||||||
|
* |
||||||
|
* @return true if it is an <code>FFprobe</code> session, false otherwise |
||||||
|
*/ |
||||||
|
virtual bool isFFprobe() const override; |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns whether it is a <code>MediaInformation</code> session or not. |
||||||
|
* |
||||||
|
* @return true if it is a <code>MediaInformation</code> session, false otherwise |
||||||
|
*/ |
||||||
|
virtual bool isMediaInformation() const override; |
||||||
|
|
||||||
|
/**
|
||||||
|
* Cancels running the session. |
||||||
|
*/ |
||||||
|
void cancel() override; |
||||||
|
|
||||||
|
private: |
||||||
|
const long _sessionId; |
||||||
|
ffmpegkit::LogCallback _logCallback; |
||||||
|
std::chrono::time_point<std::chrono::system_clock> _createTime; |
||||||
|
std::chrono::time_point<std::chrono::system_clock> _startTime; |
||||||
|
std::chrono::time_point<std::chrono::system_clock> _endTime; |
||||||
|
std::shared_ptr<std::list<std::string>> _arguments; |
||||||
|
std::shared_ptr<std::list<std::shared_ptr<ffmpegkit::Log>>> _logs; |
||||||
|
SessionState _state; |
||||||
|
std::shared_ptr<ffmpegkit::ReturnCode> _returnCode; |
||||||
|
std::string _failStackTrace; |
||||||
|
LogRedirectionStrategy _logRedirectionStrategy; |
||||||
|
}; |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
#endif // FFMPEG_KIT_ABSTRACT_SESSION_H
|
||||||
@ -0,0 +1,36 @@ |
|||||||
|
/*
|
||||||
|
* Copyright (c) 2022 Taner Sener |
||||||
|
* |
||||||
|
* This file is part of FFmpegKit. |
||||||
|
* |
||||||
|
* FFmpegKit is free software: you can redistribute it and/or modify |
||||||
|
* it under the terms of the GNU Lesser General Public License as published by |
||||||
|
* the Free Software Foundation, either version 3 of the License, or |
||||||
|
* (at your option) any later version. |
||||||
|
* |
||||||
|
* FFmpegKit is distributed in the hope that it will be useful, |
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
* GNU Lesser General Public License for more details. |
||||||
|
* |
||||||
|
* You should have received a copy of the GNU Lesser General Public License |
||||||
|
* along with FFmpegKit. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/ |
||||||
|
|
||||||
|
#include "ArchDetect.h" |
||||||
|
|
||||||
|
extern void* ffmpegKitInitialize(); |
||||||
|
|
||||||
|
static const void* _archDetectInitializer = ffmpegKitInitialize(); |
||||||
|
|
||||||
|
std::string ffmpegkit::ArchDetect::getArch() { |
||||||
|
#ifdef FFMPEG_KIT_ARM64 |
||||||
|
return "arm64"; |
||||||
|
#elif FFMPEG_KIT_I386 |
||||||
|
return "i386"; |
||||||
|
#elif FFMPEG_KIT_X86_64 |
||||||
|
return "x86_64"; |
||||||
|
#else |
||||||
|
return ""; |
||||||
|
#endif |
||||||
|
} |
||||||
@ -0,0 +1,43 @@ |
|||||||
|
/*
|
||||||
|
* Copyright (c) 2022 Taner Sener |
||||||
|
* |
||||||
|
* This file is part of FFmpegKit. |
||||||
|
* |
||||||
|
* FFmpegKit is free software: you can redistribute it and/or modify |
||||||
|
* it under the terms of the GNU Lesser General Public License as published by |
||||||
|
* the Free Software Foundation, either version 3 of the License, or |
||||||
|
* (at your option) any later version. |
||||||
|
* |
||||||
|
* FFmpegKit is distributed in the hope that it will be useful, |
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
* GNU Lesser General Public License for more details. |
||||||
|
* |
||||||
|
* You should have received a copy of the GNU Lesser General Public License |
||||||
|
* along with FFmpegKit. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/ |
||||||
|
|
||||||
|
#ifndef FFMPEG_KIT_ARCH_DETECT_H |
||||||
|
#define FFMPEG_KIT_ARCH_DETECT_H |
||||||
|
|
||||||
|
#include <string> |
||||||
|
|
||||||
|
namespace ffmpegkit { |
||||||
|
|
||||||
|
/**
|
||||||
|
* Detects the running architecture. |
||||||
|
*/ |
||||||
|
class ArchDetect { |
||||||
|
public: |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns architecture name loaded. |
||||||
|
* |
||||||
|
* @return architecture name loaded |
||||||
|
*/ |
||||||
|
static std::string getArch(); |
||||||
|
}; |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
#endif // FFMPEG_KIT_ARCH_DETECT_H
|
||||||
@ -0,0 +1,73 @@ |
|||||||
|
/*
|
||||||
|
* Copyright (c) 2022 Taner Sener |
||||||
|
* |
||||||
|
* This file is part of FFmpegKit. |
||||||
|
* |
||||||
|
* FFmpegKit is free software: you can redistribute it and/or modify |
||||||
|
* it under the terms of the GNU Lesser General Public License as published by |
||||||
|
* the Free Software Foundation, either version 3 of the License, or |
||||||
|
* (at your option) any later version. |
||||||
|
* |
||||||
|
* FFmpegKit is distributed in the hope that it will be useful, |
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
* GNU Lesser General Public License for more details. |
||||||
|
* |
||||||
|
* You should have received a copy of the GNU Lesser General Public License |
||||||
|
* along with FFmpegKit. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/ |
||||||
|
|
||||||
|
#include "Chapter.h" |
||||||
|
|
||||||
|
ffmpegkit::Chapter::Chapter(std::shared_ptr<rapidjson::Value> chapterValue) : _chapterValue{chapterValue} { |
||||||
|
} |
||||||
|
|
||||||
|
int64_t ffmpegkit::Chapter::getId() { |
||||||
|
return (*_chapterValue)[KeyId].GetInt64(); |
||||||
|
} |
||||||
|
|
||||||
|
std::string ffmpegkit::Chapter::getTimeBase() { |
||||||
|
return (*_chapterValue)[KeyTimeBase].GetString(); |
||||||
|
} |
||||||
|
|
||||||
|
int64_t ffmpegkit::Chapter::getStart() { |
||||||
|
return (*_chapterValue)[KeyStart].GetInt64(); |
||||||
|
} |
||||||
|
|
||||||
|
std::string ffmpegkit::Chapter::getStartTime() { |
||||||
|
return (*_chapterValue)[KeyStartTime].GetString(); |
||||||
|
} |
||||||
|
|
||||||
|
int64_t ffmpegkit::Chapter::getEnd() { |
||||||
|
return (*_chapterValue)[KeyEnd].GetInt64(); |
||||||
|
} |
||||||
|
|
||||||
|
std::string ffmpegkit::Chapter::getEndTime() { |
||||||
|
return (*_chapterValue)[KeyEndTime].GetString(); |
||||||
|
} |
||||||
|
|
||||||
|
std::shared_ptr<rapidjson::Value> ffmpegkit::Chapter::getTags() { |
||||||
|
auto tags = std::make_shared<rapidjson::Value>(); |
||||||
|
*tags = (*_chapterValue)[KeyTags]; |
||||||
|
return tags; |
||||||
|
} |
||||||
|
|
||||||
|
std::string ffmpegkit::Chapter::getStringProperty(const char* key) { |
||||||
|
return (*_chapterValue)[key].GetString(); |
||||||
|
} |
||||||
|
|
||||||
|
int64_t ffmpegkit::Chapter::getNumberProperty(const char* key) { |
||||||
|
return (*_chapterValue)[key].GetInt64(); |
||||||
|
} |
||||||
|
|
||||||
|
std::shared_ptr<rapidjson::Value> ffmpegkit::Chapter::getProperties(const char* key) { |
||||||
|
auto value = std::make_shared<rapidjson::Value>(); |
||||||
|
*value = (*_chapterValue)[key]; |
||||||
|
return value; |
||||||
|
} |
||||||
|
|
||||||
|
std::shared_ptr<rapidjson::Value> ffmpegkit::Chapter::getAllProperties() { |
||||||
|
auto all = std::make_shared<rapidjson::Value>(); |
||||||
|
*all = (*_chapterValue); |
||||||
|
return all; |
||||||
|
} |
||||||
@ -0,0 +1,93 @@ |
|||||||
|
/*
|
||||||
|
* Copyright (c) 2022 Taner Sener |
||||||
|
* |
||||||
|
* This file is part of FFmpegKit. |
||||||
|
* |
||||||
|
* FFmpegKit is free software: you can redistribute it and/or modify |
||||||
|
* it under the terms of the GNU Lesser General Public License as published by |
||||||
|
* the Free Software Foundation, either version 3 of the License, or |
||||||
|
* (at your option) any later version. |
||||||
|
* |
||||||
|
* FFmpegKit is distributed in the hope that it will be useful, |
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
* GNU Lesser General Public License for more details. |
||||||
|
* |
||||||
|
* You should have received a copy of the GNU Lesser General Public License |
||||||
|
* along with FFmpegKit. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/ |
||||||
|
|
||||||
|
#ifndef FFMPEG_KIT_CHAPTER_H |
||||||
|
#define FFMPEG_KIT_CHAPTER_H |
||||||
|
|
||||||
|
#include "rapidjson/document.h" |
||||||
|
#include <string> |
||||||
|
#include <iostream> |
||||||
|
#include <memory> |
||||||
|
|
||||||
|
namespace ffmpegkit { |
||||||
|
|
||||||
|
/**
|
||||||
|
* Chapter class. |
||||||
|
*/ |
||||||
|
class Chapter { |
||||||
|
public: |
||||||
|
static constexpr const char* KeyId = "id"; |
||||||
|
static constexpr const char* KeyTimeBase = "time_base"; |
||||||
|
static constexpr const char* KeyStart = "start"; |
||||||
|
static constexpr const char* KeyStartTime = "start_time"; |
||||||
|
static constexpr const char* KeyEnd = "end"; |
||||||
|
static constexpr const char* KeyEndTime = "end_time"; |
||||||
|
static constexpr const char* KeyTags = "tags"; |
||||||
|
|
||||||
|
Chapter(std::shared_ptr<rapidjson::Value> chapterValue); |
||||||
|
|
||||||
|
int64_t getId(); |
||||||
|
|
||||||
|
std::string getTimeBase(); |
||||||
|
|
||||||
|
int64_t getStart(); |
||||||
|
|
||||||
|
std::string getStartTime(); |
||||||
|
|
||||||
|
int64_t getEnd(); |
||||||
|
|
||||||
|
std::string getEndTime(); |
||||||
|
|
||||||
|
std::shared_ptr<rapidjson::Value> getTags(); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the chapter property associated with the key. |
||||||
|
* |
||||||
|
* @return chapter property as string or nil if the key is not found |
||||||
|
*/ |
||||||
|
std::string getStringProperty(const char* key); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the chapter property associated with the key. |
||||||
|
* |
||||||
|
* @return chapter property as number or nil if the key is not found |
||||||
|
*/ |
||||||
|
int64_t getNumberProperty(const char* key); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the chapter properties associated with the key. |
||||||
|
* |
||||||
|
* @return chapter properties in a dictionary or nil if the key is not found |
||||||
|
*/ |
||||||
|
std::shared_ptr<rapidjson::Value> getProperties(const char* key); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns all chapter properties defined. |
||||||
|
* |
||||||
|
* @return all chapter properties in a dictionary or nil if no properties are defined |
||||||
|
*/ |
||||||
|
std::shared_ptr<rapidjson::Value> getAllProperties(); |
||||||
|
|
||||||
|
private: |
||||||
|
std::shared_ptr<rapidjson::Value> _chapterValue; |
||||||
|
}; |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
#endif // FFMPEG_KIT_CHAPTER_H
|
||||||
@ -0,0 +1,81 @@ |
|||||||
|
/*
|
||||||
|
* Copyright (c) 2022 Taner Sener |
||||||
|
* |
||||||
|
* This file is part of FFmpegKit. |
||||||
|
* |
||||||
|
* FFmpegKit is free software: you can redistribute it and/or modify |
||||||
|
* it under the terms of the GNU Lesser General Public License as published by |
||||||
|
* the Free Software Foundation, either version 3 of the License, or |
||||||
|
* (at your option) any later version. |
||||||
|
* |
||||||
|
* FFmpegKit is distributed in the hope that it will be useful, |
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
* GNU Lesser General Public License for more details. |
||||||
|
* |
||||||
|
* You should have received a copy of the GNU Lesser General Public License |
||||||
|
* along with FFmpegKit. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/ |
||||||
|
|
||||||
|
#include "fftools_ffmpeg.h" |
||||||
|
#include "ArchDetect.h" |
||||||
|
#include "FFmpegKit.h" |
||||||
|
#include "FFmpegKitConfig.h" |
||||||
|
#include "Packages.h" |
||||||
|
|
||||||
|
extern void* ffmpegKitInitialize(); |
||||||
|
|
||||||
|
static const void* _ffmpegKitInitializer = ffmpegKitInitialize(); |
||||||
|
|
||||||
|
std::shared_ptr<ffmpegkit::FFmpegSession> ffmpegkit::FFmpegKit::executeWithArguments(const std::shared_ptr<std::list<std::string>> arguments) { |
||||||
|
auto session = std::make_shared<FFmpegSession>(arguments); |
||||||
|
ffmpegkit::FFmpegKitConfig::ffmpegExecute(session); |
||||||
|
return session; |
||||||
|
} |
||||||
|
|
||||||
|
std::shared_ptr<ffmpegkit::FFmpegSession> ffmpegkit::FFmpegKit::executeWithArgumentsAsync(const std::shared_ptr<std::list<std::string>> arguments, FFmpegSessionCompleteCallback completeCallback) { |
||||||
|
auto session = std::make_shared<FFmpegSession>(arguments, completeCallback); |
||||||
|
ffmpegkit::FFmpegKitConfig::asyncFFmpegExecute(session); |
||||||
|
return session; |
||||||
|
} |
||||||
|
|
||||||
|
std::shared_ptr<ffmpegkit::FFmpegSession> ffmpegkit::FFmpegKit::executeWithArgumentsAsync(const std::shared_ptr<std::list<std::string>> arguments, FFmpegSessionCompleteCallback completeCallback, ffmpegkit::LogCallback logCallback, ffmpegkit::StatisticsCallback statisticsCallback) { |
||||||
|
auto session = std::make_shared<FFmpegSession>(arguments, completeCallback, logCallback, statisticsCallback); |
||||||
|
ffmpegkit::FFmpegKitConfig::asyncFFmpegExecute(session); |
||||||
|
return session; |
||||||
|
} |
||||||
|
|
||||||
|
std::shared_ptr<ffmpegkit::FFmpegSession> ffmpegkit::FFmpegKit::execute(const std::string command) { |
||||||
|
auto session = std::make_shared<FFmpegSession>(FFmpegKitConfig::parseArguments(command.c_str())); |
||||||
|
ffmpegkit::FFmpegKitConfig::ffmpegExecute(session); |
||||||
|
return session; |
||||||
|
} |
||||||
|
|
||||||
|
std::shared_ptr<ffmpegkit::FFmpegSession> ffmpegkit::FFmpegKit::executeAsync(const std::string command, FFmpegSessionCompleteCallback completeCallback) { |
||||||
|
auto session = std::make_shared<FFmpegSession>(FFmpegKitConfig::parseArguments(command.c_str()), completeCallback); |
||||||
|
ffmpegkit::FFmpegKitConfig::asyncFFmpegExecute(session); |
||||||
|
return session; |
||||||
|
} |
||||||
|
|
||||||
|
std::shared_ptr<ffmpegkit::FFmpegSession> ffmpegkit::FFmpegKit::executeAsync(const std::string command, FFmpegSessionCompleteCallback completeCallback, ffmpegkit::LogCallback logCallback, ffmpegkit::StatisticsCallback statisticsCallback) { |
||||||
|
auto session = std::make_shared<FFmpegSession>(FFmpegKitConfig::parseArguments(command.c_str()), completeCallback, logCallback, statisticsCallback); |
||||||
|
ffmpegkit::FFmpegKitConfig::asyncFFmpegExecute(session); |
||||||
|
return session; |
||||||
|
} |
||||||
|
|
||||||
|
void ffmpegkit::FFmpegKit::cancel() { |
||||||
|
|
||||||
|
/*
|
||||||
|
* ZERO (0) IS A SPECIAL SESSION ID |
||||||
|
* WHEN IT IS PASSED TO THIS METHOD, A SIGINT IS GENERATED WHICH CANCELS ALL ONGOING SESSIONS |
||||||
|
*/ |
||||||
|
cancel_operation(0); |
||||||
|
} |
||||||
|
|
||||||
|
void ffmpegkit::FFmpegKit::cancel(const long sessionId) { |
||||||
|
cancel_operation(sessionId); |
||||||
|
} |
||||||
|
|
||||||
|
std::shared_ptr<std::list<std::shared_ptr<ffmpegkit::FFmpegSession>>> ffmpegkit::FFmpegKit::listSessions() { |
||||||
|
return ffmpegkit::FFmpegKitConfig::getFFmpegSessions(); |
||||||
|
} |
||||||
@ -0,0 +1,146 @@ |
|||||||
|
/*
|
||||||
|
* Copyright (c) 2022 Taner Sener |
||||||
|
* |
||||||
|
* This file is part of FFmpegKit. |
||||||
|
* |
||||||
|
* FFmpegKit is free software: you can redistribute it and/or modify |
||||||
|
* it under the terms of the GNU Lesser General Public License as published by |
||||||
|
* the Free Software Foundation, either version 3 of the License, or |
||||||
|
* (at your option) any later version. |
||||||
|
* |
||||||
|
* FFmpegKit is distributed in the hope that it will be useful, |
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
* GNU Lesser General Public License for more details. |
||||||
|
* |
||||||
|
* You should have received a copy of the GNU Lesser General Public License |
||||||
|
* along with FFmpegKit. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/ |
||||||
|
|
||||||
|
#ifndef FFMPEG_KIT_H |
||||||
|
#define FFMPEG_KIT_H |
||||||
|
|
||||||
|
#include <string.h> |
||||||
|
#include <stdlib.h> |
||||||
|
#include "LogCallback.h" |
||||||
|
#include "FFmpegSession.h" |
||||||
|
#include "StatisticsCallback.h" |
||||||
|
|
||||||
|
namespace ffmpegkit { |
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Main class to run <code>FFmpeg</code> commands. Supports executing commands both synchronously and |
||||||
|
* asynchronously. |
||||||
|
* <pre> |
||||||
|
* FFmpegSession *session = [FFmpegKit execute:@"-i file1.mp4 -c:v libxvid file1.avi"]; |
||||||
|
* |
||||||
|
* FFmpegSession *asyncSession = [FFmpegKit executeAsync:@"-i file1.mp4 -c:v libxvid file1.avi" withCompleteCallback:completeCallback]; |
||||||
|
* </pre> |
||||||
|
* <p>Provides overloaded <code>execute</code> methods to define session specific callbacks. |
||||||
|
* <pre> |
||||||
|
* FFmpegSession *asyncSession = [FFmpegKit executeAsync:@"-i file1.mp4 -c:v libxvid file1.avi" withCompleteCallback:completeCallback withLogCallback:logCallback withStatisticsCallback:statisticsCallback]; |
||||||
|
* </pre> |
||||||
|
*/ |
||||||
|
class FFmpegKit { |
||||||
|
public: |
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Synchronously executes FFmpeg with arguments provided. |
||||||
|
* |
||||||
|
* @param arguments FFmpeg command options/arguments as string list |
||||||
|
* @return FFmpeg session created for this execution |
||||||
|
*/ |
||||||
|
static std::shared_ptr<ffmpegkit::FFmpegSession> executeWithArguments(const std::shared_ptr<std::list<std::string>> arguments); |
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Starts an asynchronous FFmpeg execution with arguments provided. |
||||||
|
* |
||||||
|
* <p>Note that this method returns immediately and does not wait the execution to complete. |
||||||
|
* You must use an FFmpegSessionCompleteCallback if you want to be notified about the result. |
||||||
|
* |
||||||
|
* @param arguments FFmpeg command options/arguments as string list |
||||||
|
* @param completeCallback callback that will be called when the execution has completed |
||||||
|
* @return FFmpeg session created for this execution |
||||||
|
*/ |
||||||
|
static std::shared_ptr<ffmpegkit::FFmpegSession> executeWithArgumentsAsync(const std::shared_ptr<std::list<std::string>> arguments, FFmpegSessionCompleteCallback completeCallback); |
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Starts an asynchronous FFmpeg execution with arguments provided. |
||||||
|
* |
||||||
|
* <p>Note that this method returns immediately and does not wait the execution to complete. |
||||||
|
* You must use an FFmpegSessionCompleteCallback if you want to be notified about the result. |
||||||
|
* |
||||||
|
* @param arguments FFmpeg command options/arguments as string list |
||||||
|
* @param completeCallback callback that will be called when the execution has completed |
||||||
|
* @param logCallback callback that will receive logs |
||||||
|
* @param statisticsCallback callback that will receive statistics |
||||||
|
* @return FFmpeg session created for this execution |
||||||
|
*/ |
||||||
|
static std::shared_ptr<ffmpegkit::FFmpegSession> executeWithArgumentsAsync(const std::shared_ptr<std::list<std::string>> arguments, FFmpegSessionCompleteCallback completeCallback, ffmpegkit::LogCallback logCallback, ffmpegkit::StatisticsCallback statisticsCallback); |
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Synchronously executes FFmpeg command provided. Space character is used to split command |
||||||
|
* into arguments. You can use single or double quote characters to specify arguments inside |
||||||
|
* your command. |
||||||
|
* |
||||||
|
* @param command FFmpeg command |
||||||
|
* @return FFmpeg session created for this execution |
||||||
|
*/ |
||||||
|
static std::shared_ptr<ffmpegkit::FFmpegSession> execute(const std::string command); |
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Starts an asynchronous FFmpeg execution for the given command. Space character is used to split the command |
||||||
|
* into arguments. You can use single or double quote characters to specify arguments inside your command. |
||||||
|
* |
||||||
|
* <p>Note that this method returns immediately and does not wait the execution to complete. You must use an |
||||||
|
* FFmpegSessionCompleteCallback if you want to be notified about the result. |
||||||
|
* |
||||||
|
* @param command FFmpeg command |
||||||
|
* @param completeCallback callback that will be called when the execution has completed |
||||||
|
* @return FFmpeg session created for this execution |
||||||
|
*/ |
||||||
|
static std::shared_ptr<ffmpegkit::FFmpegSession> executeAsync(const std::string command, FFmpegSessionCompleteCallback completeCallback); |
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Starts an asynchronous FFmpeg execution for the given command. Space character is used to split the command |
||||||
|
* into arguments. You can use single or double quote characters to specify arguments inside your command. |
||||||
|
* |
||||||
|
* <p>Note that this method returns immediately and does not wait the execution to complete. You must use an |
||||||
|
* FFmpegSessionCompleteCallback if you want to be notified about the result. |
||||||
|
* |
||||||
|
* @param command FFmpeg command |
||||||
|
* @param completeCallback callback that will be called when the execution has completed |
||||||
|
* @param logCallback callback that will receive logs |
||||||
|
* @param statisticsCallback callback that will receive statistics |
||||||
|
* @return FFmpeg session created for this execution |
||||||
|
*/ |
||||||
|
static std::shared_ptr<ffmpegkit::FFmpegSession> executeAsync(const std::string command, FFmpegSessionCompleteCallback completeCallback, ffmpegkit::LogCallback logCallback, ffmpegkit::StatisticsCallback statisticsCallback); |
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Cancels all running sessions. |
||||||
|
* |
||||||
|
* <p>This method does not wait for termination to complete and returns immediately. |
||||||
|
*/ |
||||||
|
static void cancel(); |
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Cancels the session specified with <code>sessionId</code>. |
||||||
|
* |
||||||
|
* <p>This method does not wait for termination to complete and returns immediately. |
||||||
|
* |
||||||
|
* @param sessionId id of the session that will be cancelled |
||||||
|
*/ |
||||||
|
static void cancel(const long sessionId); |
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Lists all FFmpeg sessions in the session history. |
||||||
|
* |
||||||
|
* @return all FFmpeg sessions in the session history |
||||||
|
*/ |
||||||
|
static std::shared_ptr<std::list<std::shared_ptr<ffmpegkit::FFmpegSession>>> listSessions(); |
||||||
|
|
||||||
|
}; |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
#endif // FFMPEG_KIT_H
|
||||||
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,432 @@ |
|||||||
|
/*
|
||||||
|
* Copyright (c) 2022 Taner Sener |
||||||
|
* |
||||||
|
* This file is part of FFmpegKit. |
||||||
|
* |
||||||
|
* FFmpegKit is free software: you can redistribute it and/or modify |
||||||
|
* it under the terms of the GNU Lesser General Public License as published by |
||||||
|
* the Free Software Foundation, either version 3 of the License, or |
||||||
|
* (at your option) any later version. |
||||||
|
* |
||||||
|
* FFmpegKit is distributed in the hope that it will be useful, |
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
* GNU Lesser General Public License for more details. |
||||||
|
* |
||||||
|
* You should have received a copy of the GNU Lesser General Public License |
||||||
|
* along with FFmpegKit. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/ |
||||||
|
|
||||||
|
#ifndef FFMPEG_KIT_CONFIG_H |
||||||
|
#define FFMPEG_KIT_CONFIG_H |
||||||
|
|
||||||
|
#include <stdio.h> |
||||||
|
#include <pthread.h> |
||||||
|
#include <unistd.h> |
||||||
|
#include "FFmpegSession.h" |
||||||
|
#include "FFprobeSession.h" |
||||||
|
#include "Level.h" |
||||||
|
#include "LogCallback.h" |
||||||
|
#include "MediaInformationSession.h" |
||||||
|
#include "Signal.h" |
||||||
|
#include "StatisticsCallback.h" |
||||||
|
#include <map> |
||||||
|
|
||||||
|
namespace ffmpegkit { |
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Configuration class of <code>FFmpegKit</code> library. Allows customizing the global library |
||||||
|
* options. Provides helper methods to support additional resources. |
||||||
|
*/ |
||||||
|
class FFmpegKitConfig { |
||||||
|
public: |
||||||
|
|
||||||
|
/** Global library version */ |
||||||
|
static constexpr const char* FFmpegKitVersion = "4.5.1"; |
||||||
|
|
||||||
|
/**
|
||||||
|
* Prefix of named pipes created by ffmpeg-kit. |
||||||
|
*/ |
||||||
|
static constexpr const char* FFmpegKitNamedPipePrefix = "fk_pipe_"; |
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Enables log and statistics redirection. |
||||||
|
* |
||||||
|
* <p>When redirection is enabled FFmpeg/FFprobe logs are redirected to stdout and sessions |
||||||
|
* collect log and statistics entries for the executions. It is possible to define global or |
||||||
|
* session specific log/statistics callbacks as well. |
||||||
|
* |
||||||
|
* <p>Note that redirection is enabled by default. If you do not want to use its functionality |
||||||
|
* please use disableRedirection method to disable it. |
||||||
|
*/ |
||||||
|
static void enableRedirection(); |
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Disables log and statistics redirection. |
||||||
|
* |
||||||
|
* <p>When redirection is disabled logs are printed to stderr, all logs and statistics |
||||||
|
* callbacks are disabled and <code>FFprobe</code>'s <code>getMediaInformation</code> methods |
||||||
|
* do not work. |
||||||
|
*/ |
||||||
|
static void disableRedirection(); |
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Sets and overrides <code>fontconfig</code> configuration directory. |
||||||
|
* |
||||||
|
* @param path directory that contains fontconfig configuration (fonts.conf) |
||||||
|
* @return zero on success, non-zero on error |
||||||
|
*/ |
||||||
|
static int setFontconfigConfigurationPath(const char* path); |
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Registers the fonts inside the given path, so they become available to use in FFmpeg |
||||||
|
* filters. |
||||||
|
* |
||||||
|
* <p>Note that you need to build <code>FFmpegKit</code> with <code>fontconfig</code> |
||||||
|
* enabled or use a prebuilt package with <code>fontconfig</code> inside to be able to use |
||||||
|
* fonts in <code>FFmpeg</code>. |
||||||
|
* |
||||||
|
* @param fontDirectoryPath directory that contains fonts (.ttf and .otf files) |
||||||
|
* @param fontNameMapping custom font name mappings, useful to access your fonts with more |
||||||
|
* friendly names |
||||||
|
*/ |
||||||
|
static void setFontDirectory(const char* fontDirectoryPath, const std::map<std::string, std::string>& fontNameMapping); |
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Registers the fonts inside the given list of font directories, so they become available |
||||||
|
* to use in FFmpeg filters. |
||||||
|
* |
||||||
|
* <p>Note that you need to build <code>FFmpegKit</code> with <code>fontconfig</code> |
||||||
|
* enabled or use a prebuilt package with <code>fontconfig</code> inside to be able to use |
||||||
|
* fonts in <code>FFmpeg</code>. |
||||||
|
* |
||||||
|
* @param fontDirectoryList list of directories that contain fonts (.ttf and .otf files) |
||||||
|
* @param fontNameMapping custom font name mappings, useful to access your fonts with more |
||||||
|
* friendly names |
||||||
|
*/ |
||||||
|
static void setFontDirectoryList(const std::list<std::string>& fontDirectoryList, const std::map<std::string, std::string>& fontNameMapping); |
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Creates a new named pipe to use in <code>FFmpeg</code> operations. |
||||||
|
* |
||||||
|
* <p>Please note that creator is responsible of closing created pipes. |
||||||
|
* |
||||||
|
* @return the full path of the named pipe |
||||||
|
*/ |
||||||
|
static std::shared_ptr<std::string> registerNewFFmpegPipe(); |
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Closes a previously created <code>FFmpeg</code> pipe. |
||||||
|
* |
||||||
|
* @param ffmpegPipePath full path of the FFmpeg pipe |
||||||
|
*/ |
||||||
|
static void closeFFmpegPipe(const char* ffmpegPipePath); |
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Returns the version of FFmpeg bundled within <code>FFmpegKit</code> library. |
||||||
|
* |
||||||
|
* @return the version of FFmpeg |
||||||
|
*/ |
||||||
|
static std::string getFFmpegVersion(); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns FFmpegKit library version. |
||||||
|
* |
||||||
|
* @return FFmpegKit version |
||||||
|
*/ |
||||||
|
static std::string getVersion(); |
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Returns whether FFmpegKit release is a Long Term Release or not. |
||||||
|
* |
||||||
|
* @return true/yes or false/no |
||||||
|
*/ |
||||||
|
static bool isLTSBuild(); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns FFmpegKit library build date. |
||||||
|
* |
||||||
|
* @return FFmpegKit library build date |
||||||
|
*/ |
||||||
|
static std::string getBuildDate(); |
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Sets an environment variable. |
||||||
|
* |
||||||
|
* @param variableName environment variable name |
||||||
|
* @param variableValue environment variable value |
||||||
|
* @return zero on success, non-zero on error |
||||||
|
*/ |
||||||
|
static int setEnvironmentVariable(const char* variableName, const char* variableValue); |
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Registers a new ignored signal. Ignored signals are not handled by <code>FFmpegKit</code> |
||||||
|
* library. |
||||||
|
* |
||||||
|
* @param signal signal to be ignored |
||||||
|
*/ |
||||||
|
static void ignoreSignal(const ffmpegkit::Signal signal); |
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Synchronously executes the FFmpeg session provided. |
||||||
|
* |
||||||
|
* @param ffmpegSession FFmpeg session which includes command options/arguments |
||||||
|
*/ |
||||||
|
static void ffmpegExecute(const std::shared_ptr<ffmpegkit::FFmpegSession> ffmpegSession); |
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Synchronously executes the FFprobe session provided. |
||||||
|
* |
||||||
|
* @param ffprobeSession FFprobe session which includes command options/arguments |
||||||
|
*/ |
||||||
|
static void ffprobeExecute(const std::shared_ptr<ffmpegkit::FFprobeSession> ffprobeSession); |
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Synchronously executes the media information session provided. |
||||||
|
* |
||||||
|
* @param mediaInformationSession media information session which includes command options/arguments |
||||||
|
* @param waitTimeout max time to wait until media information is transmitted |
||||||
|
*/ |
||||||
|
static void getMediaInformationExecute(const std::shared_ptr<ffmpegkit::MediaInformationSession> mediaInformationSession, const int waitTimeout); |
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Starts an asynchronous FFmpeg execution for the given session. |
||||||
|
* |
||||||
|
* <p>Note that this method returns immediately and does not wait the execution to complete. |
||||||
|
* You must use an FFmpegSessionCompleteCallback if you want to be notified about the result. |
||||||
|
* |
||||||
|
* @param ffmpegSession FFmpeg session which includes command options/arguments |
||||||
|
*/ |
||||||
|
static void asyncFFmpegExecute(const std::shared_ptr<ffmpegkit::FFmpegSession> ffmpegSession); |
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Starts an asynchronous FFprobe execution for the given session. |
||||||
|
* |
||||||
|
* <p>Note that this method returns immediately and does not wait the execution to complete. |
||||||
|
* You must use an FFprobeSessionCompleteCallback if you want to be notified about the result. |
||||||
|
* |
||||||
|
* @param ffprobeSession FFprobe session which includes command options/arguments |
||||||
|
*/ |
||||||
|
static void asyncFFprobeExecute(const std::shared_ptr<ffmpegkit::FFprobeSession> ffprobeSession); |
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Starts an asynchronous FFprobe execution for the given media information session. |
||||||
|
* |
||||||
|
* <p>Note that this method returns immediately and does not wait the execution to complete. |
||||||
|
* You must use an MediaInformationSessionCompleteCallback if you want to be notified about the result. |
||||||
|
* |
||||||
|
* @param mediaInformationSession media information session which includes command options/arguments |
||||||
|
* @param waitTimeout max time to wait until media information is transmitted |
||||||
|
*/ |
||||||
|
static void asyncGetMediaInformationExecute(const std::shared_ptr<ffmpegkit::MediaInformationSession> mediaInformationSession, int waitTimeout); |
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Sets a global log callback to redirect FFmpeg/FFprobe logs. |
||||||
|
* |
||||||
|
* @param logCallback log callback or nil to disable a previously defined log callback |
||||||
|
*/ |
||||||
|
static void enableLogCallback(const ffmpegkit::LogCallback logCallback); |
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Sets a global statistics callback to redirect FFmpeg statistics. |
||||||
|
* |
||||||
|
* @param statisticsCallback statistics callback or nil to disable a previously defined statistics callback |
||||||
|
*/ |
||||||
|
static void enableStatisticsCallback(const ffmpegkit::StatisticsCallback statisticsCallback); |
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Sets a global FFmpegSessionCompleteCallback to receive execution results for FFmpeg sessions. |
||||||
|
* |
||||||
|
* @param ffmpegSessionCompleteCallback complete callback or nil to disable a previously defined callback |
||||||
|
*/ |
||||||
|
static void enableFFmpegSessionCompleteCallback(const FFmpegSessionCompleteCallback ffmpegSessionCompleteCallback); |
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Returns the global FFmpegSessionCompleteCallback set. |
||||||
|
* |
||||||
|
* @return global FFmpegSessionCompleteCallback or nil if it is not set |
||||||
|
*/ |
||||||
|
static FFmpegSessionCompleteCallback getFFmpegSessionCompleteCallback(); |
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Sets a global FFprobeSessionCompleteCallback to receive execution results for FFprobe sessions. |
||||||
|
* |
||||||
|
* @param ffprobeSessionCompleteCallback complete callback or nil to disable a previously defined callback |
||||||
|
*/ |
||||||
|
static void enableFFprobeSessionCompleteCallback(const FFprobeSessionCompleteCallback ffprobeSessionCompleteCallback); |
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Returns the global FFprobeSessionCompleteCallback set. |
||||||
|
* |
||||||
|
* @return global FFprobeSessionCompleteCallback or nil if it is not set |
||||||
|
*/ |
||||||
|
static FFprobeSessionCompleteCallback getFFprobeSessionCompleteCallback(); |
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Sets a global MediaInformationSessionCompleteCallback to receive execution results for MediaInformation sessions. |
||||||
|
* |
||||||
|
* @param mediaInformationSessionCompleteCallback complete callback or nil to disable a previously defined |
||||||
|
* callback |
||||||
|
*/ |
||||||
|
static void enableMediaInformationSessionCompleteCallback(const MediaInformationSessionCompleteCallback mediaInformationSessionCompleteCallback); |
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Returns the global MediaInformationSessionCompleteCallback set. |
||||||
|
* |
||||||
|
* @return global MediaInformationSessionCompleteCallback or nil if it is not set |
||||||
|
*/ |
||||||
|
static MediaInformationSessionCompleteCallback getMediaInformationSessionCompleteCallback(); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the current log level. |
||||||
|
* |
||||||
|
* @return current log level |
||||||
|
*/ |
||||||
|
static ffmpegkit::Level getLogLevel(); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the log level. |
||||||
|
* |
||||||
|
* @param level new log level |
||||||
|
*/ |
||||||
|
static void setLogLevel(const ffmpegkit::Level level); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Converts int log level to string. |
||||||
|
* |
||||||
|
* @param level value |
||||||
|
* @return string value |
||||||
|
*/ |
||||||
|
static std::string logLevelToString(const ffmpegkit::Level level); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the session history size. |
||||||
|
* |
||||||
|
* @return session history size |
||||||
|
*/ |
||||||
|
static int getSessionHistorySize(); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the session history size. |
||||||
|
* |
||||||
|
* @param sessionHistorySize session history size, should be smaller than 1000 |
||||||
|
*/ |
||||||
|
static void setSessionHistorySize(const int sessionHistorySize); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the session specified with <code>sessionId</code> from the session history. |
||||||
|
* |
||||||
|
* @param sessionId session identifier |
||||||
|
* @return session specified with sessionId or nil if it is not found in the history |
||||||
|
*/ |
||||||
|
static std::shared_ptr<ffmpegkit::Session> getSession(const long sessionId); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the last session created from the session history. |
||||||
|
* |
||||||
|
* @return the last session created or nil if session history is empty |
||||||
|
*/ |
||||||
|
static std::shared_ptr<ffmpegkit::Session> getLastSession(); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the last session completed from the session history. |
||||||
|
* |
||||||
|
* @return the last session completed. If there are no completed sessions in the history this |
||||||
|
* method will return nil |
||||||
|
*/ |
||||||
|
static std::shared_ptr<ffmpegkit::Session> getLastCompletedSession(); |
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Returns all sessions in the session history. |
||||||
|
* |
||||||
|
* @return all sessions in the session history |
||||||
|
*/ |
||||||
|
static std::shared_ptr<std::list<std::shared_ptr<ffmpegkit::Session>>> getSessions(); |
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Clears all, including ongoing, sessions in the session history. |
||||||
|
* <p>Note that callbacks cannot be triggered for deleted sessions. |
||||||
|
*/ |
||||||
|
static void clearSessions(); |
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Returns all FFmpeg sessions in the session history. |
||||||
|
* |
||||||
|
* @return all FFmpeg sessions in the session history |
||||||
|
*/ |
||||||
|
static std::shared_ptr<std::list<std::shared_ptr<ffmpegkit::FFmpegSession>>> getFFmpegSessions(); |
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Returns all FFprobe sessions in the session history. |
||||||
|
* |
||||||
|
* @return all FFprobe sessions in the session history |
||||||
|
*/ |
||||||
|
static std::shared_ptr<std::list<std::shared_ptr<ffmpegkit::FFprobeSession>>> getFFprobeSessions(); |
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Returns all MediaInformation sessions in the session history. |
||||||
|
* |
||||||
|
* @return all MediaInformation sessions in the session history |
||||||
|
*/ |
||||||
|
static std::shared_ptr<std::list<std::shared_ptr<ffmpegkit::MediaInformationSession>>> getMediaInformationSessions(); |
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Returns sessions that have the given state. |
||||||
|
* |
||||||
|
* @return sessions that have the given state from the session history |
||||||
|
*/ |
||||||
|
static std::shared_ptr<std::list<std::shared_ptr<ffmpegkit::Session>>> getSessionsByState(const SessionState state); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the active log redirection strategy. |
||||||
|
* |
||||||
|
* @return log redirection strategy |
||||||
|
*/ |
||||||
|
static LogRedirectionStrategy getLogRedirectionStrategy(); |
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Sets the log redirection strategy |
||||||
|
* |
||||||
|
* @param logRedirectionStrategy log redirection strategy |
||||||
|
*/ |
||||||
|
static void setLogRedirectionStrategy(const LogRedirectionStrategy logRedirectionStrategy); |
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Returns the number of async messages that are not transmitted to the callbacks for |
||||||
|
* this session. |
||||||
|
* |
||||||
|
* @param sessionId id of the session |
||||||
|
* @return number of async messages that are not transmitted to the callbacks for this session |
||||||
|
*/ |
||||||
|
static int messagesInTransmit(const long sessionId); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Converts session state to string. |
||||||
|
* |
||||||
|
* @param state session state |
||||||
|
* @return string value |
||||||
|
*/ |
||||||
|
static std::string sessionStateToString(SessionState state); |
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Parses the given command into arguments. Uses space character to split the arguments. |
||||||
|
* Supports single and double quote characters. |
||||||
|
* |
||||||
|
* @param command string command |
||||||
|
* @return list of arguments |
||||||
|
*/ |
||||||
|
static std::shared_ptr<std::list<std::string>> parseArguments(const char* command); |
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Concatenates arguments into a string adding a space character between two arguments. |
||||||
|
* |
||||||
|
* @param arguments arguments |
||||||
|
* @return concatenated string containing all arguments |
||||||
|
*/ |
||||||
|
static std::string argumentsToString(std::shared_ptr<std::list<std::string>> arguments); |
||||||
|
|
||||||
|
}; |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
#endif // FFMPEG_KIT_CONFIG_H
|
||||||
@ -0,0 +1,89 @@ |
|||||||
|
/*
|
||||||
|
* Copyright (c) 2022 Taner Sener |
||||||
|
* |
||||||
|
* This file is part of FFmpegKit. |
||||||
|
* |
||||||
|
* FFmpegKit is free software: you can redistribute it and/or modify |
||||||
|
* it under the terms of the GNU Lesser General License as published by |
||||||
|
* the Free Software Foundation, either version 3 of the License, or |
||||||
|
* (at your option) any later version. |
||||||
|
* |
||||||
|
* FFmpegKit is distributed in the hope that it will be useful, |
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
* GNU Lesser General License for more details. |
||||||
|
* |
||||||
|
* You should have received a copy of the GNU Lesser General License |
||||||
|
* along with FFmpegKit. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/ |
||||||
|
|
||||||
|
#include "FFmpegSession.h" |
||||||
|
#include "FFmpegKitConfig.h" |
||||||
|
#include "LogCallback.h" |
||||||
|
#include "StatisticsCallback.h" |
||||||
|
|
||||||
|
ffmpegkit::FFmpegSession::FFmpegSession(const std::shared_ptr<std::list<std::string>> arguments) : |
||||||
|
ffmpegkit::FFmpegSession(arguments, nullptr, nullptr, nullptr) { |
||||||
|
} |
||||||
|
|
||||||
|
ffmpegkit::FFmpegSession::FFmpegSession(const std::shared_ptr<std::list<std::string>> arguments, FFmpegSessionCompleteCallback completeCallback) : |
||||||
|
ffmpegkit::FFmpegSession(arguments, completeCallback, nullptr, nullptr) { |
||||||
|
} |
||||||
|
|
||||||
|
ffmpegkit::FFmpegSession::FFmpegSession(const std::shared_ptr<std::list<std::string>> arguments, FFmpegSessionCompleteCallback completeCallback, ffmpegkit::LogCallback logCallback, ffmpegkit::StatisticsCallback statisticsCallback) : |
||||||
|
ffmpegkit::FFmpegSession(arguments, completeCallback, logCallback, statisticsCallback, ffmpegkit::FFmpegKitConfig::getLogRedirectionStrategy()) { |
||||||
|
} |
||||||
|
|
||||||
|
ffmpegkit::FFmpegSession::FFmpegSession(const std::shared_ptr<std::list<std::string>> arguments, FFmpegSessionCompleteCallback completeCallback, ffmpegkit::LogCallback logCallback, ffmpegkit::StatisticsCallback statisticsCallback, LogRedirectionStrategy logRedirectionStrategy) : |
||||||
|
ffmpegkit::AbstractSession(arguments, logCallback, logRedirectionStrategy), _completeCallback{completeCallback}, _statisticsCallback{statisticsCallback} { |
||||||
|
} |
||||||
|
|
||||||
|
ffmpegkit::StatisticsCallback ffmpegkit::FFmpegSession::getStatisticsCallback() { |
||||||
|
return _statisticsCallback; |
||||||
|
} |
||||||
|
|
||||||
|
ffmpegkit::FFmpegSessionCompleteCallback ffmpegkit::FFmpegSession::getCompleteCallback() { |
||||||
|
return _completeCallback; |
||||||
|
} |
||||||
|
|
||||||
|
std::shared_ptr<std::list<std::shared_ptr<ffmpegkit::Statistics>>> ffmpegkit::FFmpegSession::getAllStatisticsWithTimeout(const int waitTimeout) { |
||||||
|
this->waitForAsynchronousMessagesInTransmit(waitTimeout); |
||||||
|
|
||||||
|
if (this->thereAreAsynchronousMessagesInTransmit()) { |
||||||
|
std::cout << "getAllStatisticsWithTimeout was called to return all statistics but there are still statistics being transmitted for session id " << this->getSessionId() << "." << std::endl; |
||||||
|
} |
||||||
|
|
||||||
|
return this->getStatistics(); |
||||||
|
} |
||||||
|
|
||||||
|
std::shared_ptr<std::list<std::shared_ptr<ffmpegkit::Statistics>>> ffmpegkit::FFmpegSession::getAllStatistics() { |
||||||
|
return this->getAllStatisticsWithTimeout(ffmpegkit::AbstractSession::DefaultTimeoutForAsynchronousMessagesInTransmit); |
||||||
|
} |
||||||
|
|
||||||
|
std::shared_ptr<std::list<std::shared_ptr<ffmpegkit::Statistics>>> ffmpegkit::FFmpegSession::getStatistics() { |
||||||
|
return _statistics; |
||||||
|
} |
||||||
|
|
||||||
|
std::shared_ptr<ffmpegkit::Statistics> ffmpegkit::FFmpegSession::getLastReceivedStatistics() { |
||||||
|
if (_statistics->size() > 0) { |
||||||
|
return _statistics->back(); |
||||||
|
} else { |
||||||
|
return nullptr; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
void ffmpegkit::FFmpegSession::addStatistics(const std::shared_ptr<ffmpegkit::Statistics> statistics) { |
||||||
|
_statistics->push_back(statistics); |
||||||
|
} |
||||||
|
|
||||||
|
bool ffmpegkit::FFmpegSession::isFFmpeg() const { |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
bool ffmpegkit::FFmpegSession::isFFprobe() const { |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
bool ffmpegkit::FFmpegSession::isMediaInformation() const { |
||||||
|
return false; |
||||||
|
} |
||||||
@ -0,0 +1,157 @@ |
|||||||
|
/*
|
||||||
|
* Copyright (c) 2022 Taner Sener |
||||||
|
* |
||||||
|
* This file is part of FFmpegKit. |
||||||
|
* |
||||||
|
* FFmpegKit is free software: you can redistribute it and/or modify |
||||||
|
* it under the terms of the GNU Lesser General License as published by |
||||||
|
* the Free Software Foundation, either version 3 of the License, or |
||||||
|
* (at your option) any later version. |
||||||
|
* |
||||||
|
* FFmpegKit is distributed in the hope that it will be useful, |
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
* GNU Lesser General License for more details. |
||||||
|
* |
||||||
|
* You should have received a copy of the GNU Lesser General License |
||||||
|
* along with FFmpegKit. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/ |
||||||
|
|
||||||
|
#ifndef FFMPEG_KIT_FFMPEG_SESSION_H |
||||||
|
#define FFMPEG_KIT_FFMPEG_SESSION_H |
||||||
|
|
||||||
|
#include "AbstractSession.h" |
||||||
|
#include "StatisticsCallback.h" |
||||||
|
#include "FFmpegSessionCompleteCallback.h" |
||||||
|
|
||||||
|
namespace ffmpegkit { |
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>An FFmpeg session. |
||||||
|
*/ |
||||||
|
class FFmpegSession : public AbstractSession { |
||||||
|
public: |
||||||
|
|
||||||
|
/**
|
||||||
|
* Builds a new FFmpeg session. |
||||||
|
* |
||||||
|
* @param arguments command arguments |
||||||
|
*/ |
||||||
|
FFmpegSession(const std::shared_ptr<std::list<std::string>> arguments); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Builds a new FFmpeg session. |
||||||
|
* |
||||||
|
* @param arguments command arguments |
||||||
|
* @param completeCallback session specific complete callback |
||||||
|
*/ |
||||||
|
FFmpegSession(const std::shared_ptr<std::list<std::string>> arguments, ffmpegkit::FFmpegSessionCompleteCallback completeCallback); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Builds a new FFmpeg session. |
||||||
|
* |
||||||
|
* @param arguments command arguments |
||||||
|
* @param completeCallback session specific complete callback |
||||||
|
* @param logCallback session specific log callback |
||||||
|
* @param statisticsCallback session specific statistics callback |
||||||
|
*/ |
||||||
|
FFmpegSession(const std::shared_ptr<std::list<std::string>> arguments, ffmpegkit::FFmpegSessionCompleteCallback completeCallback, ffmpegkit::LogCallback logCallback, ffmpegkit::StatisticsCallback statisticsCallback); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Builds a new FFmpeg session. |
||||||
|
* |
||||||
|
* @param arguments command arguments |
||||||
|
* @param completeCallback session specific complete callback |
||||||
|
* @param logCallback session specific log callback |
||||||
|
* @param statisticsCallback session specific statistics callback |
||||||
|
* @param logRedirectionStrategy session specific log redirection strategy |
||||||
|
*/ |
||||||
|
FFmpegSession(const std::shared_ptr<std::list<std::string>> arguments, ffmpegkit::FFmpegSessionCompleteCallback completeCallback, ffmpegkit::LogCallback logCallback, ffmpegkit::StatisticsCallback statisticsCallback, ffmpegkit::LogRedirectionStrategy logRedirectionStrategy); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the session specific statistics callback. |
||||||
|
* |
||||||
|
* @return session specific statistics callback |
||||||
|
*/ |
||||||
|
ffmpegkit::StatisticsCallback getStatisticsCallback(); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the session specific complete callback. |
||||||
|
* |
||||||
|
* @return session specific complete callback |
||||||
|
*/ |
||||||
|
ffmpegkit::FFmpegSessionCompleteCallback getCompleteCallback(); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns all statistics entries generated for this session. If there are asynchronous |
||||||
|
* messages that are not delivered yet, this method waits for them until the given timeout. |
||||||
|
* |
||||||
|
* @param waitTimeout wait timeout for asynchronous messages in milliseconds |
||||||
|
* @return list of statistics entries generated for this session |
||||||
|
*/ |
||||||
|
std::shared_ptr<std::list<std::shared_ptr<ffmpegkit::Statistics>>> getAllStatisticsWithTimeout(const int waitTimeout); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns all statistics entries generated for this session. If there are asynchronous |
||||||
|
* messages that are not delivered yet, this method waits for them until |
||||||
|
* AbstractSessionDefaultTimeoutForAsynchronousMessagesInTransmit expires. |
||||||
|
* |
||||||
|
* @return list of statistics entries generated for this session |
||||||
|
*/ |
||||||
|
std::shared_ptr<std::list<std::shared_ptr<ffmpegkit::Statistics>>> getAllStatistics(); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns all statistics entries delivered for this session. Note that if there are |
||||||
|
* asynchronous messages that are not delivered yet, this method will not wait for |
||||||
|
* them and will return immediately. |
||||||
|
* |
||||||
|
* @return list of statistics entries received for this session |
||||||
|
*/ |
||||||
|
std::shared_ptr<std::list<std::shared_ptr<ffmpegkit::Statistics>>> getStatistics(); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the last received statistics entry. |
||||||
|
* |
||||||
|
* @return the last received statistics entry or nil if there are not any statistics entries |
||||||
|
* received |
||||||
|
*/ |
||||||
|
std::shared_ptr<ffmpegkit::Statistics> getLastReceivedStatistics(); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds a new statistics entry for this session. It is invoked internally by <code>FFmpegKit</code> library methods. |
||||||
|
* Must not be used by user applications. |
||||||
|
* |
||||||
|
* @param statistics statistics entry |
||||||
|
*/ |
||||||
|
void addStatistics(const std::shared_ptr<ffmpegkit::Statistics> statistics); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns whether it is an <code>FFmpeg</code> session or not. |
||||||
|
* |
||||||
|
* @return true if it is an <code>FFmpeg</code> session, false otherwise |
||||||
|
*/ |
||||||
|
bool isFFmpeg() const override; |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns whether it is an <code>FFprobe</code> session or not. |
||||||
|
* |
||||||
|
* @return true if it is an <code>FFprobe</code> session, false otherwise |
||||||
|
*/ |
||||||
|
bool isFFprobe() const override; |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns whether it is a <code>MediaInformation</code> session or not. |
||||||
|
* |
||||||
|
* @return true if it is a <code>MediaInformation</code> session, false otherwise |
||||||
|
*/ |
||||||
|
bool isMediaInformation() const override; |
||||||
|
|
||||||
|
private: |
||||||
|
ffmpegkit::StatisticsCallback _statisticsCallback; |
||||||
|
FFmpegSessionCompleteCallback _completeCallback; |
||||||
|
std::shared_ptr<std::list<std::shared_ptr<ffmpegkit::Statistics>>> _statistics; |
||||||
|
}; |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
#endif // FFMPEG_KIT_FFMPEG_SESSION_H
|
||||||
@ -0,0 +1,57 @@ |
|||||||
|
/*
|
||||||
|
* Copyright (c) 2022 Taner Sener |
||||||
|
* |
||||||
|
* This file is part of FFmpegKit. |
||||||
|
* |
||||||
|
* FFmpegKit is free software: you can redistribute it and/or modify |
||||||
|
* it under the terms of the GNU Lesser General Public License as published by |
||||||
|
* the Free Software Foundation, either version 3 of the License, or |
||||||
|
* (at your option) any later version. |
||||||
|
* |
||||||
|
* FFmpegKit is distributed in the hope that it will be useful, |
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
* GNU Lesser General Public License for more details. |
||||||
|
* |
||||||
|
* You should have received a copy of the GNU Lesser General Public License |
||||||
|
* along with FFmpegKit. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/ |
||||||
|
|
||||||
|
#ifndef FFMPEG_KIT_FFMPEG_SESSION_COMPLETE_CALLBACK_H |
||||||
|
#define FFMPEG_KIT_FFMPEG_SESSION_COMPLETE_CALLBACK_H |
||||||
|
|
||||||
|
#include <iostream> |
||||||
|
#include <memory> |
||||||
|
|
||||||
|
namespace ffmpegkit { |
||||||
|
|
||||||
|
class FFmpegSession; |
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Callback function that is invoked when an asynchronous <code>FFmpeg</code> session has ended. |
||||||
|
* <p>Session has either SessionStateCompleted or SessionStateFailed state when |
||||||
|
* the callback is invoked. |
||||||
|
* <p>If it has SessionStateCompleted state, <code>ReturnCode</code> should be checked to |
||||||
|
* see the execution result. |
||||||
|
* <p>If <code>getState</code> returns SessionStateFailed then |
||||||
|
* <code>getFailStackTrace</code> should be used to get the failure reason. |
||||||
|
* <pre> |
||||||
|
* switch ([session getState]) { |
||||||
|
* case SessionStateCompleted: |
||||||
|
* ReturnCode *returnCode = [session getReturnCode]; |
||||||
|
* break; |
||||||
|
* case SessionStateFailed: |
||||||
|
* NSString *failStackTrace = [session getFailStackTrace]; |
||||||
|
* break; |
||||||
|
* } |
||||||
|
* </pre> |
||||||
|
* |
||||||
|
* @param session session of the completed execution |
||||||
|
*/ |
||||||
|
typedef void (*FFmpegSessionCompleteCallback)(const std::shared_ptr<ffmpegkit::FFmpegSession> session); |
||||||
|
|
||||||
|
#include "FFmpegSession.h" |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
#endif // FFMPEG_KIT_FFMPEG_SESSION_COMPLETE_CALLBACK_H
|
||||||
@ -0,0 +1,120 @@ |
|||||||
|
/*
|
||||||
|
* Copyright (c) 2022 Taner Sener |
||||||
|
* |
||||||
|
* This file is part of FFmpegKit. |
||||||
|
* |
||||||
|
* FFmpegKit is free software: you can redistribute it and/or modify |
||||||
|
* it under the terms of the GNU Lesser General Public License as published by |
||||||
|
* the Free Software Foundation, either version 3 of the License, or |
||||||
|
* (at your option) any later version. |
||||||
|
* |
||||||
|
* FFmpegKit is distributed in the hope that it will be useful, |
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
* GNU Lesser General Public License for more details. |
||||||
|
* |
||||||
|
* You should have received a copy of the GNU Lesser General Public License |
||||||
|
* along with FFmpegKit. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/ |
||||||
|
|
||||||
|
#include "fftools_ffmpeg.h" |
||||||
|
#include "FFmpegKit.h" |
||||||
|
#include "FFmpegKitConfig.h" |
||||||
|
#include "FFprobeKit.h" |
||||||
|
|
||||||
|
extern void* ffmpegKitInitialize(); |
||||||
|
|
||||||
|
static const void* _ffprobeKitInitializer = ffmpegKitInitialize(); |
||||||
|
|
||||||
|
static std::shared_ptr<std::list<std::string>> defaultGetMediaInformationCommandArguments(const std::string& path) { |
||||||
|
std::shared_ptr<std::list<std::string>> arguments = std::make_shared<std::list<std::string>>(); |
||||||
|
arguments->push_back(std::string("-v")); |
||||||
|
arguments->push_back(std::string("error")); |
||||||
|
arguments->push_back(std::string("-hide_banner")); |
||||||
|
arguments->push_back(std::string("-print_format")); |
||||||
|
arguments->push_back(std::string("json")); |
||||||
|
arguments->push_back(std::string("-show_format")); |
||||||
|
arguments->push_back(std::string("-show_streams")); |
||||||
|
arguments->push_back(std::string("-show_chapters")); |
||||||
|
arguments->push_back(std::string("-i")); |
||||||
|
arguments->push_back(path); |
||||||
|
return arguments; |
||||||
|
} |
||||||
|
|
||||||
|
std::shared_ptr<ffmpegkit::FFprobeSession> ffmpegkit::FFprobeKit::executeWithArguments(const std::shared_ptr<std::list<std::string>> arguments) { |
||||||
|
auto session = std::make_shared<FFprobeSession>(arguments); |
||||||
|
ffmpegkit::FFmpegKitConfig::ffprobeExecute(session); |
||||||
|
return session; |
||||||
|
} |
||||||
|
|
||||||
|
std::shared_ptr<ffmpegkit::FFprobeSession> ffmpegkit::FFprobeKit::executeWithArgumentsAsync(const std::shared_ptr<std::list<std::string>> arguments, FFprobeSessionCompleteCallback completeCallback) { |
||||||
|
auto session = std::make_shared<FFprobeSession>(arguments, completeCallback); |
||||||
|
ffmpegkit::FFmpegKitConfig::asyncFFprobeExecute(session); |
||||||
|
return session; |
||||||
|
} |
||||||
|
|
||||||
|
std::shared_ptr<ffmpegkit::FFprobeSession> ffmpegkit::FFprobeKit::executeWithArgumentsAsync(const std::shared_ptr<std::list<std::string>> arguments, FFprobeSessionCompleteCallback completeCallback, ffmpegkit::LogCallback logCallback) { |
||||||
|
auto session = std::make_shared<FFprobeSession>(arguments, completeCallback, logCallback); |
||||||
|
ffmpegkit::FFmpegKitConfig::asyncFFprobeExecute(session); |
||||||
|
return session; |
||||||
|
} |
||||||
|
|
||||||
|
std::shared_ptr<ffmpegkit::FFprobeSession> ffmpegkit::FFprobeKit::execute(const std::string command) { |
||||||
|
auto session = std::make_shared<FFprobeSession>(FFmpegKitConfig::parseArguments(command.c_str())); |
||||||
|
ffmpegkit::FFmpegKitConfig::ffprobeExecute(session); |
||||||
|
return session; |
||||||
|
} |
||||||
|
|
||||||
|
std::shared_ptr<ffmpegkit::FFprobeSession> ffmpegkit::FFprobeKit::executeAsync(const std::string command, FFprobeSessionCompleteCallback completeCallback) { |
||||||
|
auto session = std::make_shared<FFprobeSession>(FFmpegKitConfig::parseArguments(command.c_str()), completeCallback); |
||||||
|
ffmpegkit::FFmpegKitConfig::asyncFFprobeExecute(session); |
||||||
|
return session; |
||||||
|
} |
||||||
|
|
||||||
|
std::shared_ptr<ffmpegkit::FFprobeSession> ffmpegkit::FFprobeKit::executeAsync(const std::string command, FFprobeSessionCompleteCallback completeCallback, ffmpegkit::LogCallback logCallback){ |
||||||
|
auto session = std::make_shared<FFprobeSession>(FFmpegKitConfig::parseArguments(command.c_str()), completeCallback, logCallback); |
||||||
|
ffmpegkit::FFmpegKitConfig::asyncFFprobeExecute(session); |
||||||
|
return session; |
||||||
|
} |
||||||
|
|
||||||
|
std::shared_ptr<ffmpegkit::MediaInformationSession> ffmpegkit::FFprobeKit::getMediaInformation(const std::string path) { |
||||||
|
auto arguments = defaultGetMediaInformationCommandArguments(path); |
||||||
|
auto session = std::make_shared<MediaInformationSession>(arguments); |
||||||
|
ffmpegkit::FFmpegKitConfig::getMediaInformationExecute(session, ffmpegkit::AbstractSession::DefaultTimeoutForAsynchronousMessagesInTransmit); |
||||||
|
return session; |
||||||
|
} |
||||||
|
|
||||||
|
std::shared_ptr<ffmpegkit::MediaInformationSession> ffmpegkit::FFprobeKit::getMediaInformation(const std::string path, const int waitTimeout) { |
||||||
|
auto arguments = defaultGetMediaInformationCommandArguments(path); |
||||||
|
auto session = std::make_shared<MediaInformationSession>(arguments); |
||||||
|
ffmpegkit::FFmpegKitConfig::getMediaInformationExecute(session, waitTimeout); |
||||||
|
return session; |
||||||
|
} |
||||||
|
|
||||||
|
std::shared_ptr<ffmpegkit::MediaInformationSession> ffmpegkit::FFprobeKit::getMediaInformationAsync(const std::string path, MediaInformationSessionCompleteCallback completeCallback) { |
||||||
|
auto arguments = defaultGetMediaInformationCommandArguments(path); |
||||||
|
auto session = std::make_shared<MediaInformationSession>(arguments, completeCallback); |
||||||
|
ffmpegkit::FFmpegKitConfig::asyncGetMediaInformationExecute(session, ffmpegkit::AbstractSession::DefaultTimeoutForAsynchronousMessagesInTransmit); |
||||||
|
return session; |
||||||
|
} |
||||||
|
|
||||||
|
std::shared_ptr<ffmpegkit::MediaInformationSession> ffmpegkit::FFprobeKit::getMediaInformationAsync(const std::string path, MediaInformationSessionCompleteCallback completeCallback, ffmpegkit::LogCallback logCallback, const int waitTimeout) { |
||||||
|
auto arguments = defaultGetMediaInformationCommandArguments(path); |
||||||
|
auto session = std::make_shared<MediaInformationSession>(arguments, completeCallback, logCallback); |
||||||
|
ffmpegkit::FFmpegKitConfig::asyncGetMediaInformationExecute(session, waitTimeout); |
||||||
|
return session; |
||||||
|
} |
||||||
|
|
||||||
|
std::shared_ptr<ffmpegkit::MediaInformationSession> ffmpegkit::FFprobeKit::getMediaInformationFromCommand(const std::string command) { |
||||||
|
auto session = std::make_shared<MediaInformationSession>(FFmpegKitConfig::parseArguments(command.c_str())); |
||||||
|
ffmpegkit::FFmpegKitConfig::getMediaInformationExecute(session, ffmpegkit::AbstractSession::DefaultTimeoutForAsynchronousMessagesInTransmit); |
||||||
|
return session; |
||||||
|
} |
||||||
|
|
||||||
|
std::shared_ptr<std::list<std::shared_ptr<ffmpegkit::FFprobeSession>>> ffmpegkit::FFprobeKit::listFFprobeSessions() { |
||||||
|
return ffmpegkit::FFmpegKitConfig::getFFprobeSessions(); |
||||||
|
} |
||||||
|
|
||||||
|
std::shared_ptr<std::list<std::shared_ptr<ffmpegkit::MediaInformationSession>>> ffmpegkit::FFprobeKit::listMediaInformationSessions() { |
||||||
|
return ffmpegkit::FFmpegKitConfig::getMediaInformationSessions(); |
||||||
|
} |
||||||
@ -0,0 +1,189 @@ |
|||||||
|
/*
|
||||||
|
* Copyright (c) 2022 Taner Sener |
||||||
|
* |
||||||
|
* This file is part of FFmpegKit. |
||||||
|
* |
||||||
|
* FFmpegKit is free software: you can redistribute it and/or modify |
||||||
|
* it under the terms of the GNU Lesser General Public License as published by |
||||||
|
* the Free Software Foundation, either version 3 of the License, or |
||||||
|
* (at your option) any later version. |
||||||
|
* |
||||||
|
* FFmpegKit is distributed in the hope that it will be useful, |
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
* GNU Lesser General Public License for more details. |
||||||
|
* |
||||||
|
* You should have received a copy of the GNU Lesser General Public License |
||||||
|
* along with FFmpegKit. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/ |
||||||
|
|
||||||
|
#ifndef FFPROBE_KIT_H |
||||||
|
#define FFPROBE_KIT_H |
||||||
|
|
||||||
|
#include <string.h> |
||||||
|
#include <stdlib.h> |
||||||
|
#include "FFprobeSession.h" |
||||||
|
#include "MediaInformationJsonParser.h" |
||||||
|
|
||||||
|
namespace ffmpegkit { |
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Main class to run <code>FFprobe</code> commands. Supports executing commands both synchronously and |
||||||
|
* asynchronously. |
||||||
|
* <pre> |
||||||
|
* FFprobeSession *session = [FFprobeKit execute:@"-hide_banner -v error -show_entries format=size -of default=noprint_wrappers=1 file1.mp4"]; |
||||||
|
* |
||||||
|
* FFprobeSession *asyncSession = [FFprobeKit executeAsync:@"-hide_banner -v error -show_entries format=size -of default=noprint_wrappers=1 file1.mp4" withCompleteCallback:completeCallback]; |
||||||
|
* </pre> |
||||||
|
* <p>Provides overloaded <code>execute</code> methods to define session specific callbacks. |
||||||
|
* <pre> |
||||||
|
* FFprobeSession *session = [FFprobeKit executeAsync:@"-hide_banner -v error -show_entries format=size -of default=noprint_wrappers=1 file1.mp4" withCompleteCallback:completeCallback withLogCallback:logCallback]; |
||||||
|
* </pre> |
||||||
|
* <p>It can extract media information for a file or a url, using getMediaInformation method. |
||||||
|
* <pre> |
||||||
|
* MediaInformationSession *session = [FFprobeKit getMediaInformation:@"file1.mp4"]; |
||||||
|
* </pre> |
||||||
|
*/ |
||||||
|
class FFprobeKit { |
||||||
|
public: |
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Synchronously executes FFprobe with arguments provided. |
||||||
|
* |
||||||
|
* @param arguments FFprobe command options/arguments as string array |
||||||
|
* @return FFprobe session created for this execution |
||||||
|
*/ |
||||||
|
static std::shared_ptr<ffmpegkit::FFprobeSession> executeWithArguments(const std::shared_ptr<std::list<std::string>> arguments); |
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Starts an asynchronous FFprobe execution with arguments provided. |
||||||
|
* |
||||||
|
* <p>Note that this method returns immediately and does not wait the execution to complete. |
||||||
|
* You must use an FFprobeSessionCompleteCallback if you want to be notified about the result. |
||||||
|
* |
||||||
|
* @param arguments FFprobe command options/arguments as string array |
||||||
|
* @param completeCallback callback that will be called when the execution has completed |
||||||
|
* @return FFprobe session created for this execution |
||||||
|
*/ |
||||||
|
static std::shared_ptr<ffmpegkit::FFprobeSession> executeWithArgumentsAsync(const std::shared_ptr<std::list<std::string>> arguments, FFprobeSessionCompleteCallback completeCallback); |
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Starts an asynchronous FFprobe execution with arguments provided. |
||||||
|
* |
||||||
|
* <p>Note that this method returns immediately and does not wait the execution to complete. |
||||||
|
* You must use an FFprobeSessionCompleteCallback if you want to be notified about the result. |
||||||
|
* |
||||||
|
* @param arguments FFprobe command options/arguments as string array |
||||||
|
* @param completeCallback callback that will be notified when execution has completed |
||||||
|
* @param logCallback callback that will receive logs |
||||||
|
* @return FFprobe session created for this execution |
||||||
|
*/ |
||||||
|
static std::shared_ptr<ffmpegkit::FFprobeSession> executeWithArgumentsAsync(const std::shared_ptr<std::list<std::string>> arguments, FFprobeSessionCompleteCallback completeCallback, ffmpegkit::LogCallback logCallback); |
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Synchronously executes FFprobe command provided. Space character is used to split command |
||||||
|
* into arguments. You can use single or double quote characters to specify arguments inside |
||||||
|
* your command. |
||||||
|
* |
||||||
|
* @param command FFprobe command |
||||||
|
* @return FFprobe session created for this execution |
||||||
|
*/ |
||||||
|
static std::shared_ptr<ffmpegkit::FFprobeSession> execute(const std::string command); |
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Starts an asynchronous FFprobe execution for the given command. Space character is used to split the command |
||||||
|
* into arguments. You can use single or double quote characters to specify arguments inside your command. |
||||||
|
* |
||||||
|
* <p>Note that this method returns immediately and does not wait the execution to complete. You must use an |
||||||
|
* FFprobeSessionCompleteCallback if you want to be notified about the result. |
||||||
|
* |
||||||
|
* @param command FFprobe command |
||||||
|
* @param completeCallback callback that will be called when the execution has completed |
||||||
|
* @return FFprobe session created for this execution |
||||||
|
*/ |
||||||
|
static std::shared_ptr<ffmpegkit::FFprobeSession> executeAsync(const std::string command, FFprobeSessionCompleteCallback completeCallback); |
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Starts an asynchronous FFprobe execution for the given command. Space character is used to split the command |
||||||
|
* into arguments. You can use single or double quote characters to specify arguments inside your command. |
||||||
|
* |
||||||
|
* <p>Note that this method returns immediately and does not wait the execution to complete. You must use an |
||||||
|
* FFprobeSessionCompleteCallback if you want to be notified about the result. |
||||||
|
* |
||||||
|
* @param command FFprobe command |
||||||
|
* @param completeCallback callback that will be notified when execution has completed |
||||||
|
* @param logCallback callback that will receive logs |
||||||
|
* @return FFprobe session created for this execution |
||||||
|
*/ |
||||||
|
static std::shared_ptr<ffmpegkit::FFprobeSession> executeAsync(const std::string command, FFprobeSessionCompleteCallback completeCallback, ffmpegkit::LogCallback logCallback); |
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Extracts media information for the file specified with path. |
||||||
|
* |
||||||
|
* @param path path or uri of a media file |
||||||
|
* @return media information session created for this execution |
||||||
|
*/ |
||||||
|
static std::shared_ptr<ffmpegkit::MediaInformationSession> getMediaInformation(const std::string path); |
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Extracts media information for the file specified with path. |
||||||
|
* |
||||||
|
* @param path path or uri of a media file |
||||||
|
* @param waitTimeout max time to wait until media information is transmitted |
||||||
|
* @return media information session created for this execution |
||||||
|
*/ |
||||||
|
static std::shared_ptr<ffmpegkit::MediaInformationSession> getMediaInformation(const std::string path, const int waitTimeout); |
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Starts an asynchronous FFprobe execution to extract the media information for the specified file. |
||||||
|
* |
||||||
|
* <p>Note that this method returns immediately and does not wait the execution to complete. You must use an |
||||||
|
* MediaInformationSessionCompleteCallback if you want to be notified about the result. |
||||||
|
* |
||||||
|
* @param path path or uri of a media file |
||||||
|
* @param completeCallback callback that will be called when the execution has completed |
||||||
|
* @return media information session created for this execution |
||||||
|
*/ |
||||||
|
static std::shared_ptr<ffmpegkit::MediaInformationSession> getMediaInformationAsync(const std::string path, MediaInformationSessionCompleteCallback completeCallback); |
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Starts an asynchronous FFprobe execution to extract the media information for the specified file. |
||||||
|
* |
||||||
|
* <p>Note that this method returns immediately and does not wait the execution to complete. You must use an |
||||||
|
* MediaInformationSessionCompleteCallback if you want to be notified about the result. |
||||||
|
* |
||||||
|
* @param path path or uri of a media file |
||||||
|
* @param completeCallback callback that will be notified when execution has completed |
||||||
|
* @param logCallback callback that will receive logs |
||||||
|
* @param waitTimeout max time to wait until media information is transmitted |
||||||
|
* @return media information session created for this execution |
||||||
|
*/ |
||||||
|
static std::shared_ptr<ffmpegkit::MediaInformationSession> getMediaInformationAsync(const std::string path, MediaInformationSessionCompleteCallback completeCallback, ffmpegkit::LogCallback logCallback, const int waitTimeout); |
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Extracts media information using the command provided asynchronously. |
||||||
|
* |
||||||
|
* @param command FFprobe command that prints media information for a file in JSON format |
||||||
|
* @return media information session created for this execution |
||||||
|
*/ |
||||||
|
static std::shared_ptr<ffmpegkit::MediaInformationSession> getMediaInformationFromCommand(const std::string command); |
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Lists all FFprobe sessions in the session history. |
||||||
|
* |
||||||
|
* @return all FFprobe sessions in the session history |
||||||
|
*/ |
||||||
|
static std::shared_ptr<std::list<std::shared_ptr<ffmpegkit::FFprobeSession>>> listFFprobeSessions(); |
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Lists all MediaInformation sessions in the session history. |
||||||
|
* |
||||||
|
* @return all MediaInformation sessions in the session history |
||||||
|
*/ |
||||||
|
static std::shared_ptr<std::list<std::shared_ptr<ffmpegkit::MediaInformationSession>>> listMediaInformationSessions(); |
||||||
|
|
||||||
|
}; |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
#endif // FFPROBE_KIT_H
|
||||||
@ -0,0 +1,54 @@ |
|||||||
|
/*
|
||||||
|
* Copyright (c) 2022 Taner Sener |
||||||
|
* |
||||||
|
* This file is part of FFmpegKit. |
||||||
|
* |
||||||
|
* FFmpegKit is free software: you can redistribute it and/or modify |
||||||
|
* it under the terms of the GNU Lesser General License as published by |
||||||
|
* the Free Software Foundation, either version 3 of the License, or |
||||||
|
* (at your option) any later version. |
||||||
|
* |
||||||
|
* FFmpegKit is distributed in the hope that it will be useful, |
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
* GNU Lesser General License for more details. |
||||||
|
* |
||||||
|
* You should have received a copy of the GNU Lesser General License |
||||||
|
* along with FFmpegKit. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/ |
||||||
|
|
||||||
|
#include "FFprobeSession.h" |
||||||
|
#include "FFmpegKitConfig.h" |
||||||
|
#include "LogCallback.h" |
||||||
|
|
||||||
|
ffmpegkit::FFprobeSession::FFprobeSession(const std::shared_ptr<std::list<std::string>> arguments) : |
||||||
|
ffmpegkit::FFprobeSession(arguments, nullptr, nullptr) { |
||||||
|
} |
||||||
|
|
||||||
|
ffmpegkit::FFprobeSession::FFprobeSession(const std::shared_ptr<std::list<std::string>> arguments, const FFprobeSessionCompleteCallback completeCallback) : |
||||||
|
ffmpegkit::FFprobeSession(arguments, completeCallback, nullptr) { |
||||||
|
} |
||||||
|
|
||||||
|
ffmpegkit::FFprobeSession::FFprobeSession(const std::shared_ptr<std::list<std::string>> arguments, const FFprobeSessionCompleteCallback completeCallback, const ffmpegkit::LogCallback logCallback) : |
||||||
|
ffmpegkit::AbstractSession(arguments, logCallback, ffmpegkit::FFmpegKitConfig::getLogRedirectionStrategy()), _completeCallback{completeCallback} { |
||||||
|
} |
||||||
|
|
||||||
|
ffmpegkit::FFprobeSession::FFprobeSession(const std::shared_ptr<std::list<std::string>> arguments, const FFprobeSessionCompleteCallback completeCallback, const ffmpegkit::LogCallback logCallback, const LogRedirectionStrategy logRedirectionStrategy) : |
||||||
|
ffmpegkit::AbstractSession(arguments, logCallback, logRedirectionStrategy), _completeCallback{completeCallback} { |
||||||
|
} |
||||||
|
|
||||||
|
ffmpegkit::FFprobeSessionCompleteCallback ffmpegkit::FFprobeSession::getCompleteCallback() { |
||||||
|
return _completeCallback; |
||||||
|
} |
||||||
|
|
||||||
|
bool ffmpegkit::FFprobeSession::isFFmpeg() const { |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
bool ffmpegkit::FFprobeSession::isFFprobe() const { |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
bool ffmpegkit::FFprobeSession::isMediaInformation() const { |
||||||
|
return false; |
||||||
|
} |
||||||
@ -0,0 +1,102 @@ |
|||||||
|
/*
|
||||||
|
* Copyright (c) 2022 Taner Sener |
||||||
|
* |
||||||
|
* This file is part of FFmpegKit. |
||||||
|
* |
||||||
|
* FFmpegKit is free software: you can redistribute it and/or modify |
||||||
|
* it under the terms of the GNU Lesser General License as published by |
||||||
|
* the Free Software Foundation, either version 3 of the License, or |
||||||
|
* (at your option) any later version. |
||||||
|
* |
||||||
|
* FFmpegKit is distributed in the hope that it will be useful, |
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
* GNU Lesser General License for more details. |
||||||
|
* |
||||||
|
* You should have received a copy of the GNU Lesser General License |
||||||
|
* along with FFmpegKit. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/ |
||||||
|
|
||||||
|
#ifndef FFMPEG_KIT_FFPROBE_SESSION_H |
||||||
|
#define FFMPEG_KIT_FFPROBE_SESSION_H |
||||||
|
|
||||||
|
#include "AbstractSession.h" |
||||||
|
#include "FFprobeSessionCompleteCallback.h" |
||||||
|
|
||||||
|
namespace ffmpegkit { |
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>An FFprobe session. |
||||||
|
*/ |
||||||
|
class FFprobeSession : public AbstractSession { |
||||||
|
public: |
||||||
|
|
||||||
|
/**
|
||||||
|
* Builds a new FFprobe session. |
||||||
|
* |
||||||
|
* @param arguments command arguments |
||||||
|
*/ |
||||||
|
FFprobeSession(const std::shared_ptr<std::list<std::string>> arguments); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Builds a new FFprobe session. |
||||||
|
* |
||||||
|
* @param arguments command arguments |
||||||
|
* @param completeCallback session specific complete callback |
||||||
|
*/ |
||||||
|
FFprobeSession(const std::shared_ptr<std::list<std::string>> arguments, const FFprobeSessionCompleteCallback completeCallback); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Builds a new FFprobe session. |
||||||
|
* |
||||||
|
* @param arguments command arguments |
||||||
|
* @param completeCallback session specific complete callback |
||||||
|
* @param logCallback session specific log callback |
||||||
|
*/ |
||||||
|
FFprobeSession(const std::shared_ptr<std::list<std::string>> arguments, const FFprobeSessionCompleteCallback completeCallback, const ffmpegkit::LogCallback logCallback); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Builds a new FFprobe session. |
||||||
|
* |
||||||
|
* @param arguments command arguments |
||||||
|
* @param completeCallback session specific complete callback |
||||||
|
* @param logCallback session specific log callback |
||||||
|
* @param logRedirectionStrategy session specific log redirection strategy |
||||||
|
*/ |
||||||
|
FFprobeSession(const std::shared_ptr<std::list<std::string>> arguments, const FFprobeSessionCompleteCallback completeCallback, const ffmpegkit::LogCallback logCallback, const LogRedirectionStrategy logRedirectionStrategy); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the session specific complete callback. |
||||||
|
* |
||||||
|
* @return session specific complete callback |
||||||
|
*/ |
||||||
|
ffmpegkit::FFprobeSessionCompleteCallback getCompleteCallback(); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns whether it is an <code>FFmpeg</code> session or not. |
||||||
|
* |
||||||
|
* @return true if it is an <code>FFmpeg</code> session, false otherwise |
||||||
|
*/ |
||||||
|
bool isFFmpeg() const override; |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns whether it is an <code>FFprobe</code> session or not. |
||||||
|
* |
||||||
|
* @return true if it is an <code>FFprobe</code> session, false otherwise |
||||||
|
*/ |
||||||
|
bool isFFprobe() const override; |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns whether it is a <code>MediaInformation</code> session or not. |
||||||
|
* |
||||||
|
* @return true if it is a <code>MediaInformation</code> session, false otherwise |
||||||
|
*/ |
||||||
|
bool isMediaInformation() const override; |
||||||
|
|
||||||
|
private: |
||||||
|
FFprobeSessionCompleteCallback _completeCallback; |
||||||
|
}; |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
#endif // FFMPEG_KIT_FFPROBE_SESSION_H
|
||||||
@ -0,0 +1,57 @@ |
|||||||
|
/*
|
||||||
|
* Copyright (c) 2022 Taner Sener |
||||||
|
* |
||||||
|
* This file is part of FFmpegKit. |
||||||
|
* |
||||||
|
* FFmpegKit is free software: you can redistribute it and/or modify |
||||||
|
* it under the terms of the GNU Lesser General Public License as published by |
||||||
|
* the Free Software Foundation, either version 3 of the License, or |
||||||
|
* (at your option) any later version. |
||||||
|
* |
||||||
|
* FFmpegKit is distributed in the hope that it will be useful, |
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
* GNU Lesser General Public License for more details. |
||||||
|
* |
||||||
|
* You should have received a copy of the GNU Lesser General Public License |
||||||
|
* along with FFmpegKit. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/ |
||||||
|
|
||||||
|
#ifndef FFMPEG_KIT_FFPROBE_SESSION_COMPLETE_CALLBACK_H |
||||||
|
#define FFMPEG_KIT_FFPROBE_SESSION_COMPLETE_CALLBACK_H |
||||||
|
|
||||||
|
#include <iostream> |
||||||
|
#include <memory> |
||||||
|
|
||||||
|
namespace ffmpegkit { |
||||||
|
|
||||||
|
class FFprobeSession; |
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Callback function that is invoked when an asynchronous <code>FFprobe</code> session has ended. |
||||||
|
* <p>Session has either SessionStateCompleted or SessionStateFailed state when |
||||||
|
* the callback is invoked. |
||||||
|
* <p>If it has SessionStateCompleted state, <code>ReturnCode</code> should be checked to |
||||||
|
* see the execution result. |
||||||
|
* <p>If <code>getState</code> returns SessionStateFailed then |
||||||
|
* <code>getFailStackTrace</code> should be used to get the failure reason. |
||||||
|
* <pre> |
||||||
|
* switch ([session getState]) { |
||||||
|
* case SessionStateCompleted: |
||||||
|
* ReturnCode *returnCode = [session getReturnCode]; |
||||||
|
* break; |
||||||
|
* case SessionStateFailed: |
||||||
|
* NSString *failStackTrace = [session getFailStackTrace]; |
||||||
|
* break; |
||||||
|
* } |
||||||
|
* </pre> |
||||||
|
* |
||||||
|
* @param session session of the completed execution |
||||||
|
*/ |
||||||
|
typedef void (*FFprobeSessionCompleteCallback)(const std::shared_ptr<ffmpegkit::FFprobeSession> session); |
||||||
|
|
||||||
|
#include "FFprobeSession.h" |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
#endif // FFMPEG_KIT_FFPROBE_SESSION_COMPLETE_CALLBACK_H
|
||||||
@ -0,0 +1,89 @@ |
|||||||
|
/*
|
||||||
|
* Copyright (c) 2022 Taner Sener |
||||||
|
* |
||||||
|
* This file is part of FFmpegKit. |
||||||
|
* |
||||||
|
* FFmpegKit is free software: you can redistribute it and/or modify |
||||||
|
* it under the terms of the GNU Lesser General License as published by |
||||||
|
* the Free Software Foundation, either version 3 of the License, or |
||||||
|
* (at your option) any later version. |
||||||
|
* |
||||||
|
* FFmpegKit is distributed in the hope that it will be useful, |
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
* GNU Lesser General License for more details. |
||||||
|
* |
||||||
|
* You should have received a copy of the GNU Lesser General License |
||||||
|
* along with FFmpegKit. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/ |
||||||
|
|
||||||
|
#ifndef FFMPEG_KIT_LEVEL_H |
||||||
|
#define FFMPEG_KIT_LEVEL_H |
||||||
|
|
||||||
|
namespace ffmpegkit { |
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Enumeration type for log levels. |
||||||
|
*/ |
||||||
|
enum Level { |
||||||
|
|
||||||
|
/**
|
||||||
|
* This log level is defined by FFmpegKit. It is used to specify logs printed to stderr by |
||||||
|
* FFmpeg. Logs that has this level are not filtered and always redirected. |
||||||
|
*/ |
||||||
|
LevelAVLogStdErr = -16, |
||||||
|
|
||||||
|
/**
|
||||||
|
* Print no output. |
||||||
|
*/ |
||||||
|
LevelAVLogQuiet = -8, |
||||||
|
|
||||||
|
/**
|
||||||
|
* Something went really wrong and we will crash now. |
||||||
|
*/ |
||||||
|
LevelAVLogPanic = 0, |
||||||
|
|
||||||
|
/**
|
||||||
|
* Something went wrong and recovery is not possible. |
||||||
|
* For example, no header was found for a format which depends |
||||||
|
* on headers or an illegal combination of parameters is used. |
||||||
|
*/ |
||||||
|
LevelAVLogFatal = 8, |
||||||
|
|
||||||
|
/**
|
||||||
|
* Something went wrong and cannot losslessly be recovered. |
||||||
|
* However, not all future data is affected. |
||||||
|
*/ |
||||||
|
LevelAVLogError = 16, |
||||||
|
|
||||||
|
/**
|
||||||
|
* Something somehow does not look correct. This may or may not |
||||||
|
* lead to problems. An example would be the use of '-vstrict -2'. |
||||||
|
*/ |
||||||
|
LevelAVLogWarning = 24, |
||||||
|
|
||||||
|
/**
|
||||||
|
* Standard information. |
||||||
|
*/ |
||||||
|
LevelAVLogInfo = 32, |
||||||
|
|
||||||
|
/**
|
||||||
|
* Detailed information. |
||||||
|
*/ |
||||||
|
LevelAVLogVerbose = 40, |
||||||
|
|
||||||
|
/**
|
||||||
|
* Stuff which is only useful for libav* developers. |
||||||
|
*/ |
||||||
|
LevelAVLogDebug = 48, |
||||||
|
|
||||||
|
/**
|
||||||
|
* Extremely verbose debugging, useful for libav* development. |
||||||
|
*/ |
||||||
|
LevelAVLogTrace = 56 |
||||||
|
|
||||||
|
}; |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
#endif // FFMPEG_KIT_LEVEL_H
|
||||||
@ -0,0 +1,35 @@ |
|||||||
|
/*
|
||||||
|
* Copyright (c) 2022 Taner Sener |
||||||
|
* |
||||||
|
* This file is part of FFmpegKit. |
||||||
|
* |
||||||
|
* FFmpegKit is free software: you can redistribute it and/or modify |
||||||
|
* it under the terms of the GNU Lesser General License as published by |
||||||
|
* the Free Software Foundation, either version 3 of the License, or |
||||||
|
* (at your option) any later version. |
||||||
|
* |
||||||
|
* FFmpegKit is distributed in the hope that it will be useful, |
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
* GNU Lesser General License for more details. |
||||||
|
* |
||||||
|
* You should have received a copy of the GNU Lesser General License |
||||||
|
* along with FFmpegKit. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/ |
||||||
|
|
||||||
|
#include "Log.h" |
||||||
|
|
||||||
|
ffmpegkit::Log::Log(const long sessionId, const ffmpegkit::Level level, const char* message) : _sessionId{sessionId}, _level{level}, _message{message} { |
||||||
|
} |
||||||
|
|
||||||
|
long ffmpegkit::Log::getSessionId() const { |
||||||
|
return _sessionId; |
||||||
|
} |
||||||
|
|
||||||
|
ffmpegkit::Level ffmpegkit::Log::getLevel() const { |
||||||
|
return _level; |
||||||
|
} |
||||||
|
|
||||||
|
std::string ffmpegkit::Log::getMessage() const { |
||||||
|
return _message; |
||||||
|
} |
||||||
@ -0,0 +1,46 @@ |
|||||||
|
/*
|
||||||
|
* Copyright (c) 2022 Taner Sener |
||||||
|
* |
||||||
|
* This file is part of FFmpegKit. |
||||||
|
* |
||||||
|
* FFmpegKit is free software: you can redistribute it and/or modify |
||||||
|
* it under the terms of the GNU Lesser General License as published by |
||||||
|
* the Free Software Foundation, either version 3 of the License, or |
||||||
|
* (at your option) any later version. |
||||||
|
* |
||||||
|
* FFmpegKit is distributed in the hope that it will be useful, |
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
* GNU Lesser General License for more details. |
||||||
|
* |
||||||
|
* You should have received a copy of the GNU Lesser General License |
||||||
|
* along with FFmpegKit. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/ |
||||||
|
|
||||||
|
#ifndef FFMPEG_KIT_LOG_H |
||||||
|
#define FFMPEG_KIT_LOG_H |
||||||
|
|
||||||
|
#include "Level.h" |
||||||
|
#include <string> |
||||||
|
|
||||||
|
namespace ffmpegkit { |
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Log entry for an <code>FFmpegKit</code> session. |
||||||
|
*/ |
||||||
|
class Log { |
||||||
|
public: |
||||||
|
Log(const long sessionId, const ffmpegkit::Level level, const char* message); |
||||||
|
long getSessionId() const; |
||||||
|
ffmpegkit::Level getLevel() const; |
||||||
|
std::string getMessage() const; |
||||||
|
|
||||||
|
private: |
||||||
|
long _sessionId; |
||||||
|
ffmpegkit::Level _level; |
||||||
|
std::string _message; |
||||||
|
}; |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
#endif // FFMPEG_KIT_LOG_H
|
||||||
@ -0,0 +1,38 @@ |
|||||||
|
/*
|
||||||
|
* Copyright (c) 2022 Taner Sener |
||||||
|
* |
||||||
|
* This file is part of FFmpegKit. |
||||||
|
* |
||||||
|
* FFmpegKit is free software: you can redistribute it and/or modify |
||||||
|
* it under the terms of the GNU Lesser General Public License as published by |
||||||
|
* the Free Software Foundation, either version 3 of the License, or |
||||||
|
* (at your option) any later version. |
||||||
|
* |
||||||
|
* FFmpegKit is distributed in the hope that it will be useful, |
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
* GNU Lesser General Public License for more details. |
||||||
|
* |
||||||
|
* You should have received a copy of the GNU Lesser General Public License |
||||||
|
* along with FFmpegKit. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/ |
||||||
|
|
||||||
|
#ifndef FFMPEG_KIT_LOG_CALLBACK_H |
||||||
|
#define FFMPEG_KIT_LOG_CALLBACK_H |
||||||
|
|
||||||
|
#include "Log.h" |
||||||
|
#include <iostream> |
||||||
|
#include <memory> |
||||||
|
|
||||||
|
namespace ffmpegkit { |
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Callback that receives logs generated for <code>FFmpegKit</code> sessions. |
||||||
|
* |
||||||
|
* @param log log entry |
||||||
|
*/ |
||||||
|
typedef void (*LogCallback)(const std::shared_ptr<ffmpegkit::Log> log); |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
#endif // FFMPEG_KIT_LOG_CALLBACK_H
|
||||||
@ -0,0 +1,35 @@ |
|||||||
|
/*
|
||||||
|
* Copyright (c) 2022 Taner Sener |
||||||
|
* |
||||||
|
* This file is part of FFmpegKit. |
||||||
|
* |
||||||
|
* FFmpegKit is free software: you can redistribute it and/or modify |
||||||
|
* it under the terms of the GNU Lesser General License as published by |
||||||
|
* the Free Software Foundation, either version 3 of the License, or |
||||||
|
* (at your option) any later version. |
||||||
|
* |
||||||
|
* FFmpegKit is distributed in the hope that it will be useful, |
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
* GNU Lesser General License for more details. |
||||||
|
* |
||||||
|
* You should have received a copy of the GNU Lesser General License |
||||||
|
* along with FFmpegKit. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/ |
||||||
|
|
||||||
|
#ifndef FFMPEG_KIT_LOG_REDIRECTION_STRATEGY_H |
||||||
|
#define FFMPEG_KIT_LOG_REDIRECTION_STRATEGY_H |
||||||
|
|
||||||
|
namespace ffmpegkit { |
||||||
|
|
||||||
|
enum LogRedirectionStrategy { |
||||||
|
LogRedirectionStrategyAlwaysPrintLogs = 0, |
||||||
|
LogRedirectionStrategyPrintLogsWhenNoCallbacksDefined = 1, |
||||||
|
LogRedirectionStrategyPrintLogsWhenGlobalCallbackNotDefined = 2, |
||||||
|
LogRedirectionStrategyPrintLogsWhenSessionCallbackNotDefined = 3, |
||||||
|
LogRedirectionStrategyNeverPrintLogs = 4 |
||||||
|
}; |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
#endif // FFMPEG_KIT_LOG_REDIRECTION_STRATEGY_H
|
||||||
@ -0,0 +1,64 @@ |
|||||||
|
lib_LTLIBRARIES = libffmpegkit.la
|
||||||
|
|
||||||
|
libffmpegkit_la_LIBADD = @FFMPEG_LIBS@
|
||||||
|
|
||||||
|
libffmpegkit_la_SOURCES = \
|
||||||
|
AbstractSession.cpp \
|
||||||
|
ArchDetect.cpp \
|
||||||
|
Chapter.cpp \
|
||||||
|
FFmpegKit.cpp \
|
||||||
|
FFmpegKitConfig.cpp \
|
||||||
|
FFmpegSession.cpp \
|
||||||
|
FFprobeKit.cpp \
|
||||||
|
FFprobeSession.cpp \
|
||||||
|
Log.cpp \
|
||||||
|
MediaInformation.cpp \
|
||||||
|
MediaInformationJsonParser.cpp \
|
||||||
|
MediaInformationSession.cpp \
|
||||||
|
Packages.cpp \
|
||||||
|
ReturnCode.cpp \
|
||||||
|
Statistics.cpp \
|
||||||
|
StreamInformation.cpp \
|
||||||
|
ffmpegkit_exception.cpp \
|
||||||
|
fftools_cmdutils.c \
|
||||||
|
fftools_ffmpeg.c \
|
||||||
|
fftools_ffmpeg_filter.c \
|
||||||
|
fftools_ffmpeg_hw.c \
|
||||||
|
fftools_ffmpeg_opt.c \
|
||||||
|
fftools_ffprobe.c
|
||||||
|
|
||||||
|
include_HEADERS = \
|
||||||
|
AbstractSession.h \
|
||||||
|
ArchDetect.h \
|
||||||
|
Chapter.h \
|
||||||
|
FFmpegKit.h \
|
||||||
|
FFmpegKitConfig.h \
|
||||||
|
FFmpegSession.h \
|
||||||
|
FFmpegSessionCompleteCallback.h \
|
||||||
|
FFprobeKit.h \
|
||||||
|
FFprobeSession.h \
|
||||||
|
FFprobeSessionCompleteCallback.h \
|
||||||
|
Level.h \
|
||||||
|
Log.h \
|
||||||
|
LogCallback.h \
|
||||||
|
LogRedirectionStrategy.h \
|
||||||
|
MediaInformation.h \
|
||||||
|
MediaInformationJsonParser.h \
|
||||||
|
MediaInformationSession.h \
|
||||||
|
MediaInformationSessionCompleteCallback.h \
|
||||||
|
Packages.h \
|
||||||
|
ReturnCode.h \
|
||||||
|
Session.h \
|
||||||
|
SessionState.h \
|
||||||
|
Signal.h \
|
||||||
|
Statistics.h \
|
||||||
|
StatisticsCallback.h \
|
||||||
|
StreamInformation.h \
|
||||||
|
ffmpegkit_exception.h \
|
||||||
|
fftools_cmdutils.h \
|
||||||
|
fftools_ffmpeg.h
|
||||||
|
|
||||||
|
libffmpegkit_la_CFLAGS = $(CFLAGS)
|
||||||
|
libffmpegkit_la_OBJCFLAGS = $(CFLAGS)
|
||||||
|
libffmpegkit_la_CXXFLAGS = $(CXXFLAGS)
|
||||||
|
libffmpegkit_la_LDFLAGS = -version-info @VERSION_INFO@
|
||||||
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,92 @@ |
|||||||
|
/*
|
||||||
|
* Copyright (c) 2022 Taner Sener |
||||||
|
* |
||||||
|
* This file is part of FFmpegKit. |
||||||
|
* |
||||||
|
* FFmpegKit is free software: you can redistribute it and/or modify |
||||||
|
* it under the terms of the GNU Lesser General Public License as published by |
||||||
|
* the Free Software Foundation, either version 3 of the License, or |
||||||
|
* (at your option) any later version. |
||||||
|
* |
||||||
|
* FFmpegKit is distributed in the hope that it will be useful, |
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
* GNU Lesser General Public License for more details. |
||||||
|
* |
||||||
|
* You should have received a copy of the GNU Lesser General Public License |
||||||
|
* along with FFmpegKit. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/ |
||||||
|
|
||||||
|
#include "MediaInformation.h" |
||||||
|
|
||||||
|
ffmpegkit::MediaInformation::MediaInformation(std::shared_ptr<rapidjson::Value> mediaInformationValue, std::shared_ptr<std::vector<std::shared_ptr<ffmpegkit::StreamInformation>>> streams, std::shared_ptr<std::vector<std::shared_ptr<ffmpegkit::Chapter>>> chapters) : |
||||||
|
_mediaInformationValue{mediaInformationValue}, _streams{streams}, _chapters{chapters} { |
||||||
|
} |
||||||
|
|
||||||
|
std::string ffmpegkit::MediaInformation::getFilename() { |
||||||
|
return (*_mediaInformationValue)[KeyFilename].GetString(); |
||||||
|
} |
||||||
|
|
||||||
|
std::string ffmpegkit::MediaInformation::getFormat() { |
||||||
|
return (*_mediaInformationValue)[KeyFormat].GetString(); |
||||||
|
} |
||||||
|
|
||||||
|
std::string ffmpegkit::MediaInformation::getLongFormat() { |
||||||
|
return (*_mediaInformationValue)[KeyFormatLong].GetString(); |
||||||
|
} |
||||||
|
|
||||||
|
std::string ffmpegkit::MediaInformation::getStartTime() { |
||||||
|
return (*_mediaInformationValue)[KeyStartTime].GetString(); |
||||||
|
} |
||||||
|
|
||||||
|
std::string ffmpegkit::MediaInformation::getDuration() { |
||||||
|
return (*_mediaInformationValue)[KeyDuration].GetString(); |
||||||
|
} |
||||||
|
|
||||||
|
std::string ffmpegkit::MediaInformation::getSize() { |
||||||
|
return (*_mediaInformationValue)[KeySize].GetString(); |
||||||
|
} |
||||||
|
|
||||||
|
std::string ffmpegkit::MediaInformation::getBitrate() { |
||||||
|
return (*_mediaInformationValue)[KeyBitRate].GetString(); |
||||||
|
} |
||||||
|
|
||||||
|
std::shared_ptr<rapidjson::Value> ffmpegkit::MediaInformation::getTags() { |
||||||
|
auto tags = std::make_shared<rapidjson::Value>(); |
||||||
|
*tags = (*_mediaInformationValue)[KeyTags]; |
||||||
|
return tags; |
||||||
|
} |
||||||
|
|
||||||
|
std::shared_ptr<std::vector<std::shared_ptr<ffmpegkit::StreamInformation>>> ffmpegkit::MediaInformation::getStreams() { |
||||||
|
return _streams; |
||||||
|
} |
||||||
|
|
||||||
|
std::shared_ptr<std::vector<std::shared_ptr<ffmpegkit::Chapter>>> ffmpegkit::MediaInformation::getChapters() { |
||||||
|
return _chapters; |
||||||
|
} |
||||||
|
|
||||||
|
std::string ffmpegkit::MediaInformation::getStringProperty(const char* key) { |
||||||
|
return (*_mediaInformationValue)[key].GetString(); |
||||||
|
} |
||||||
|
|
||||||
|
int64_t ffmpegkit::MediaInformation::getNumberProperty(const char* key) { |
||||||
|
return (*_mediaInformationValue)[key].GetInt64(); |
||||||
|
} |
||||||
|
|
||||||
|
std::shared_ptr<rapidjson::Value> ffmpegkit::MediaInformation::getProperties(const char* key) { |
||||||
|
auto value = std::make_shared<rapidjson::Value>(); |
||||||
|
*value = (*_mediaInformationValue)[key]; |
||||||
|
return value; |
||||||
|
} |
||||||
|
|
||||||
|
std::shared_ptr<rapidjson::Value> ffmpegkit::MediaInformation::getMediaProperties() { |
||||||
|
auto mediaProperties = std::make_shared<rapidjson::Value>(); |
||||||
|
*mediaProperties = (*_mediaInformationValue)[KeyMediaProperties]; |
||||||
|
return mediaProperties; |
||||||
|
} |
||||||
|
|
||||||
|
std::shared_ptr<rapidjson::Value> ffmpegkit::MediaInformation::getAllProperties() { |
||||||
|
auto all = std::make_shared<rapidjson::Value>(); |
||||||
|
*all = (*_mediaInformationValue); |
||||||
|
return all; |
||||||
|
} |
||||||
@ -0,0 +1,160 @@ |
|||||||
|
/*
|
||||||
|
* Copyright (c) 2022 Taner Sener |
||||||
|
* |
||||||
|
* This file is part of FFmpegKit. |
||||||
|
* |
||||||
|
* FFmpegKit is free software: you can redistribute it and/or modify |
||||||
|
* it under the terms of the GNU Lesser General Public License as published by |
||||||
|
* the Free Software Foundation, either version 3 of the License, or |
||||||
|
* (at your option) any later version. |
||||||
|
* |
||||||
|
* FFmpegKit is distributed in the hope that it will be useful, |
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
* GNU Lesser General Public License for more details. |
||||||
|
* |
||||||
|
* You should have received a copy of the GNU Lesser General Public License |
||||||
|
* along with FFmpegKit. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/ |
||||||
|
|
||||||
|
#ifndef FFMPEG_KIT_MEDIA_INFORMATION_H |
||||||
|
#define FFMPEG_KIT_MEDIA_INFORMATION_H |
||||||
|
|
||||||
|
#include "Chapter.h" |
||||||
|
#include "StreamInformation.h" |
||||||
|
#include <memory> |
||||||
|
#include <vector> |
||||||
|
|
||||||
|
namespace ffmpegkit { |
||||||
|
|
||||||
|
/**
|
||||||
|
* Media information class. |
||||||
|
*/ |
||||||
|
class MediaInformation { |
||||||
|
public: |
||||||
|
static constexpr const char* KeyMediaProperties = "format"; |
||||||
|
static constexpr const char* KeyFilename = "filename"; |
||||||
|
static constexpr const char* KeyFormat = "format_name"; |
||||||
|
static constexpr const char* KeyFormatLong = "format_long_name"; |
||||||
|
static constexpr const char* KeyStartTime = "start_time"; |
||||||
|
static constexpr const char* KeyDuration = "duration"; |
||||||
|
static constexpr const char* KeySize = "size"; |
||||||
|
static constexpr const char* KeyBitRate = "bit_rate"; |
||||||
|
static constexpr const char* KeyTags = "tags"; |
||||||
|
|
||||||
|
MediaInformation(std::shared_ptr<rapidjson::Value> mediaInformationValue, std::shared_ptr<std::vector<std::shared_ptr<ffmpegkit::StreamInformation>>> streams, std::shared_ptr<std::vector<std::shared_ptr<ffmpegkit::Chapter>>> chapters); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns file name. |
||||||
|
* |
||||||
|
* @return media file name |
||||||
|
*/ |
||||||
|
std::string getFilename(); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns format. |
||||||
|
* |
||||||
|
* @return media format |
||||||
|
*/ |
||||||
|
std::string getFormat(); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns long format. |
||||||
|
* |
||||||
|
* @return media long format |
||||||
|
*/ |
||||||
|
std::string getLongFormat(); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns duration. |
||||||
|
* |
||||||
|
* @return media duration in milliseconds |
||||||
|
*/ |
||||||
|
std::string getDuration(); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns start time. |
||||||
|
* |
||||||
|
* @return media start time in milliseconds |
||||||
|
*/ |
||||||
|
std::string getStartTime(); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns size. |
||||||
|
* |
||||||
|
* @return media size in bytes |
||||||
|
*/ |
||||||
|
std::string getSize(); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns bitrate. |
||||||
|
* |
||||||
|
* @return media bitrate in kb/s |
||||||
|
*/ |
||||||
|
std::string getBitrate(); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns all tags. |
||||||
|
* |
||||||
|
* @return tags dictionary |
||||||
|
*/ |
||||||
|
std::shared_ptr<rapidjson::Value> getTags(); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns all streams. |
||||||
|
* |
||||||
|
* @return streams array |
||||||
|
*/ |
||||||
|
std::shared_ptr<std::vector<std::shared_ptr<ffmpegkit::StreamInformation>>> getStreams(); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns all chapters. |
||||||
|
* |
||||||
|
* @return chapters array |
||||||
|
*/ |
||||||
|
std::shared_ptr<std::vector<std::shared_ptr<ffmpegkit::Chapter>>> getChapters(); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the media property associated with the key. |
||||||
|
* |
||||||
|
* @return media property as string or nil if the key is not found |
||||||
|
*/ |
||||||
|
std::string getStringProperty(const char* key); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the media property associated with the key. |
||||||
|
* |
||||||
|
* @return media property as number or nil if the key is not found |
||||||
|
*/ |
||||||
|
int64_t getNumberProperty(const char* key); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the media properties associated with the key. |
||||||
|
* |
||||||
|
* @return media properties in a dictionary or nil if the key is not found |
||||||
|
*/ |
||||||
|
std::shared_ptr<rapidjson::Value> getProperties(const char* key); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns all media properties. |
||||||
|
* |
||||||
|
* @return all media properties in a dictionary or nil if no media properties are defined |
||||||
|
*/ |
||||||
|
std::shared_ptr<rapidjson::Value> getMediaProperties(); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns all properties defined. |
||||||
|
* |
||||||
|
* @return all properties in a dictionary or nil if no properties are defined |
||||||
|
*/ |
||||||
|
std::shared_ptr<rapidjson::Value> getAllProperties(); |
||||||
|
|
||||||
|
private: |
||||||
|
std::shared_ptr<rapidjson::Value> _mediaInformationValue; |
||||||
|
std::shared_ptr<std::vector<std::shared_ptr<ffmpegkit::StreamInformation>>> _streams; |
||||||
|
std::shared_ptr<std::vector<std::shared_ptr<ffmpegkit::Chapter>>> _chapters; |
||||||
|
}; |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
#endif // FFMPEG_KIT_MEDIA_INFORMATION_H
|
||||||
@ -0,0 +1,76 @@ |
|||||||
|
/*
|
||||||
|
* Copyright (c) 2022 Taner Sener |
||||||
|
* |
||||||
|
* This file is part of FFmpegKit. |
||||||
|
* |
||||||
|
* FFmpegKit is free software: you can redistribute it and/or modify |
||||||
|
* it under the terms of the GNU Lesser General Public License as published by |
||||||
|
* the Free Software Foundation, either version 3 of the License, or |
||||||
|
* (at your option) any later version. |
||||||
|
* |
||||||
|
* FFmpegKit is distributed in the hope that it will be useful, |
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
* GNU Lesser General Public License for more details. |
||||||
|
* |
||||||
|
* You should have received a copy of the GNU Lesser General Public License |
||||||
|
* along with FFmpegKit. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/ |
||||||
|
|
||||||
|
#include "MediaInformationJsonParser.h" |
||||||
|
#include "rapidjson/reader.h" |
||||||
|
#include "rapidjson/document.h" |
||||||
|
#include "rapidjson/error/en.h" |
||||||
|
#include <memory> |
||||||
|
|
||||||
|
static const char* MediaInformationJsonParserKeyStreams = "streams"; |
||||||
|
static const char* MediaInformationJsonParserKeyChapters = "chapters"; |
||||||
|
|
||||||
|
std::shared_ptr<ffmpegkit::MediaInformation> ffmpegkit::MediaInformationJsonParser::from(const char* ffprobeJsonOutput) { |
||||||
|
std::string error; |
||||||
|
|
||||||
|
std::shared_ptr<ffmpegkit::MediaInformation> mediaInformation = fromWithError(ffprobeJsonOutput, error); |
||||||
|
if (mediaInformation == nullptr) { |
||||||
|
std::cout << "MediaInformation parsing failed: " << error << std::endl; |
||||||
|
} |
||||||
|
|
||||||
|
return mediaInformation; |
||||||
|
} |
||||||
|
|
||||||
|
std::shared_ptr<ffmpegkit::MediaInformation> ffmpegkit::MediaInformationJsonParser::fromWithError(const char* ffprobeJsonOutput, std::string& error) { |
||||||
|
std::shared_ptr<rapidjson::Document> document = std::make_shared<rapidjson::Document>(); |
||||||
|
|
||||||
|
document->Parse(ffprobeJsonOutput); |
||||||
|
|
||||||
|
if (document->HasParseError()) { |
||||||
|
error = GetParseError_En(document->GetParseError()); |
||||||
|
return nullptr; |
||||||
|
} else { |
||||||
|
std::shared_ptr<std::vector<std::shared_ptr<ffmpegkit::StreamInformation>>> streams = std::make_shared<std::vector<std::shared_ptr<ffmpegkit::StreamInformation>>>(); |
||||||
|
std::shared_ptr<std::vector<std::shared_ptr<ffmpegkit::Chapter>>> chapters = std::make_shared<std::vector<std::shared_ptr<ffmpegkit::Chapter>>>(); |
||||||
|
|
||||||
|
if (document->HasMember(MediaInformationJsonParserKeyStreams)) { |
||||||
|
rapidjson::Value& streamArray = (*document.get())[MediaInformationJsonParserKeyStreams]; |
||||||
|
if (streamArray.IsArray()) { |
||||||
|
for (rapidjson::SizeType i = 0; i < streamArray.Size(); i++) { |
||||||
|
auto stream = std::make_shared<rapidjson::Value>(); |
||||||
|
*stream = streamArray[i]; |
||||||
|
streams->push_back(std::make_shared<ffmpegkit::StreamInformation>(stream)); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if (document->HasMember(MediaInformationJsonParserKeyChapters)) { |
||||||
|
rapidjson::Value& chapterArray = (*document.get())[MediaInformationJsonParserKeyChapters]; |
||||||
|
if (chapterArray.IsArray()) { |
||||||
|
for (rapidjson::SizeType i = 0; i < chapterArray.Size(); i++) { |
||||||
|
auto chapter = std::make_shared<rapidjson::Value>(); |
||||||
|
*chapter = chapterArray[i]; |
||||||
|
chapters->push_back(std::make_shared<ffmpegkit::Chapter>(chapter)); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
return std::make_shared<ffmpegkit::MediaInformation>(std::static_pointer_cast<rapidjson::Value>(document), streams, chapters); |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,55 @@ |
|||||||
|
/*
|
||||||
|
* Copyright (c) 2022 Taner Sener |
||||||
|
* |
||||||
|
* This file is part of FFmpegKit. |
||||||
|
* |
||||||
|
* FFmpegKit is free software: you can redistribute it and/or modify |
||||||
|
* it under the terms of the GNU Lesser General Public License as published by |
||||||
|
* the Free Software Foundation, either version 3 of the License, or |
||||||
|
* (at your option) any later version. |
||||||
|
* |
||||||
|
* FFmpegKit is distributed in the hope that it will be useful, |
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
* GNU Lesser General Public License for more details. |
||||||
|
* |
||||||
|
* You should have received a copy of the GNU Lesser General Public License |
||||||
|
* along with FFmpegKit. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/ |
||||||
|
|
||||||
|
#ifndef FFMPEG_KIT_MEDIA_INFORMATION_PARSER_H |
||||||
|
#define FFMPEG_KIT_MEDIA_INFORMATION_PARSER_H |
||||||
|
|
||||||
|
#include "MediaInformation.h" |
||||||
|
#include <memory> |
||||||
|
|
||||||
|
namespace ffmpegkit { |
||||||
|
|
||||||
|
/**
|
||||||
|
* A parser that constructs MediaInformation from FFprobe's json output. |
||||||
|
*/ |
||||||
|
class MediaInformationJsonParser { |
||||||
|
public: |
||||||
|
|
||||||
|
/**
|
||||||
|
* Extracts <code>MediaInformation</code> from the given FFprobe json output. |
||||||
|
* |
||||||
|
* @param ffprobeJsonOutput FFprobe json output |
||||||
|
* @return created MediaInformation instance of nil if a parsing error occurs |
||||||
|
*/ |
||||||
|
static std::shared_ptr<ffmpegkit::MediaInformation> from(const char* ffprobeJsonOutput); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Extracts <code>MediaInformation</code> from the given FFprobe json output. |
||||||
|
* |
||||||
|
* @param ffprobeJsonOutput FFprobe json output |
||||||
|
* @param error error to save the parsing error if a parsing error occurs |
||||||
|
* @return created MediaInformation instance |
||||||
|
*/ |
||||||
|
static std::shared_ptr<ffmpegkit::MediaInformation> fromWithError(const char* ffprobeJsonOutput, std::string& error); |
||||||
|
|
||||||
|
}; |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
#endif // FFMPEG_KIT_MEDIA_INFORMATION_PARSER_H
|
||||||
@ -0,0 +1,58 @@ |
|||||||
|
/*
|
||||||
|
* Copyright (c) 2022 Taner Sener |
||||||
|
* |
||||||
|
* This file is part of FFmpegKit. |
||||||
|
* |
||||||
|
* FFmpegKit is free software: you can redistribute it and/or modify |
||||||
|
* it under the terms of the GNU Lesser General License as published by |
||||||
|
* the Free Software Foundation, either version 3 of the License, or |
||||||
|
* (at your option) any later version. |
||||||
|
* |
||||||
|
* FFmpegKit is distributed in the hope that it will be useful, |
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
* GNU Lesser General License for more details. |
||||||
|
* |
||||||
|
* You should have received a copy of the GNU Lesser General License |
||||||
|
* along with FFmpegKit. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/ |
||||||
|
|
||||||
|
#include "MediaInformationSession.h" |
||||||
|
#include "LogCallback.h" |
||||||
|
#include "MediaInformation.h" |
||||||
|
|
||||||
|
ffmpegkit::MediaInformationSession::MediaInformationSession(const std::shared_ptr<std::list<std::string>> arguments) : |
||||||
|
ffmpegkit::MediaInformationSession(arguments, nullptr, nullptr) { |
||||||
|
} |
||||||
|
|
||||||
|
ffmpegkit::MediaInformationSession::MediaInformationSession(const std::shared_ptr<std::list<std::string>> arguments, ffmpegkit::MediaInformationSessionCompleteCallback completeCallback) : |
||||||
|
ffmpegkit::MediaInformationSession(arguments, completeCallback, nullptr) { |
||||||
|
} |
||||||
|
|
||||||
|
ffmpegkit::MediaInformationSession::MediaInformationSession(const std::shared_ptr<std::list<std::string>> arguments, ffmpegkit::MediaInformationSessionCompleteCallback completeCallback, ffmpegkit::LogCallback logCallback) : |
||||||
|
ffmpegkit::AbstractSession(arguments, logCallback, ffmpegkit::LogRedirectionStrategyNeverPrintLogs), _completeCallback{completeCallback}, _mediaInformation{nullptr} { |
||||||
|
} |
||||||
|
|
||||||
|
std::shared_ptr<ffmpegkit::MediaInformation> ffmpegkit::MediaInformationSession::getMediaInformation() { |
||||||
|
return _mediaInformation; |
||||||
|
} |
||||||
|
|
||||||
|
void ffmpegkit::MediaInformationSession::setMediaInformation(const std::shared_ptr<ffmpegkit::MediaInformation> mediaInformation) { |
||||||
|
_mediaInformation = mediaInformation; |
||||||
|
} |
||||||
|
|
||||||
|
ffmpegkit::MediaInformationSessionCompleteCallback ffmpegkit::MediaInformationSession::getCompleteCallback() { |
||||||
|
return _completeCallback; |
||||||
|
} |
||||||
|
|
||||||
|
bool ffmpegkit::MediaInformationSession::isFFmpeg() const { |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
bool ffmpegkit::MediaInformationSession::isFFprobe() const { |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
bool ffmpegkit::MediaInformationSession::isMediaInformation() const { |
||||||
|
return true; |
||||||
|
} |
||||||
@ -0,0 +1,110 @@ |
|||||||
|
/*
|
||||||
|
* Copyright (c) 2022 Taner Sener |
||||||
|
* |
||||||
|
* This file is part of FFmpegKit. |
||||||
|
* |
||||||
|
* FFmpegKit is free software: you can redistribute it and/or modify |
||||||
|
* it under the terms of the GNU Lesser General License as published by |
||||||
|
* the Free Software Foundation, either version 3 of the License, or |
||||||
|
* (at your option) any later version. |
||||||
|
* |
||||||
|
* FFmpegKit is distributed in the hope that it will be useful, |
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
* GNU Lesser General License for more details. |
||||||
|
* |
||||||
|
* You should have received a copy of the GNU Lesser General License |
||||||
|
* along with FFmpegKit. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/ |
||||||
|
|
||||||
|
#ifndef FFMPEG_KIT_MEDIA_INFORMATION_SESSION_H |
||||||
|
#define FFMPEG_KIT_MEDIA_INFORMATION_SESSION_H |
||||||
|
|
||||||
|
#include "AbstractSession.h" |
||||||
|
#include "MediaInformation.h" |
||||||
|
#include "MediaInformationSessionCompleteCallback.h" |
||||||
|
|
||||||
|
namespace ffmpegkit { |
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>A custom FFprobe session, which produces a <code>MediaInformation</code> object using the |
||||||
|
* FFprobe output. |
||||||
|
*/ |
||||||
|
class MediaInformationSession : public AbstractSession { |
||||||
|
public: |
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new media information session. |
||||||
|
* |
||||||
|
* @param arguments command arguments |
||||||
|
*/ |
||||||
|
MediaInformationSession(const std::shared_ptr<std::list<std::string>> arguments); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new media information session. |
||||||
|
* |
||||||
|
* @param arguments command arguments |
||||||
|
* @param completeCallback session specific complete callback |
||||||
|
*/ |
||||||
|
MediaInformationSession(const std::shared_ptr<std::list<std::string>> arguments, ffmpegkit::MediaInformationSessionCompleteCallback completeCallback); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new media information session. |
||||||
|
* |
||||||
|
* @param arguments command arguments |
||||||
|
* @param completeCallback session specific complete callback |
||||||
|
* @param logCallback session specific log callback |
||||||
|
*/ |
||||||
|
MediaInformationSession(const std::shared_ptr<std::list<std::string>> arguments, ffmpegkit::MediaInformationSessionCompleteCallback completeCallback, ffmpegkit::LogCallback logCallback); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the media information extracted in this session. |
||||||
|
* |
||||||
|
* @return media information extracted or nil if the command failed or the output can not be |
||||||
|
* parsed |
||||||
|
*/ |
||||||
|
std::shared_ptr<ffmpegkit::MediaInformation> getMediaInformation(); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the media information extracted in this session. |
||||||
|
* |
||||||
|
* @param mediaInformation media information extracted |
||||||
|
*/ |
||||||
|
void setMediaInformation(const std::shared_ptr<ffmpegkit::MediaInformation> mediaInformation); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the session specific complete callback. |
||||||
|
* |
||||||
|
* @return session specific complete callback |
||||||
|
*/ |
||||||
|
ffmpegkit::MediaInformationSessionCompleteCallback getCompleteCallback(); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns whether it is an <code>FFmpeg</code> session or not. |
||||||
|
* |
||||||
|
* @return true if it is an <code>FFmpeg</code> session, false otherwise |
||||||
|
*/ |
||||||
|
bool isFFmpeg() const override; |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns whether it is an <code>FFprobe</code> session or not. |
||||||
|
* |
||||||
|
* @return true if it is an <code>FFprobe</code> session, false otherwise |
||||||
|
*/ |
||||||
|
bool isFFprobe() const override; |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns whether it is a <code>MediaInformation</code> session or not. |
||||||
|
* |
||||||
|
* @return true if it is a <code>MediaInformation</code> session, false otherwise |
||||||
|
*/ |
||||||
|
bool isMediaInformation() const override; |
||||||
|
|
||||||
|
private: |
||||||
|
ffmpegkit::MediaInformationSessionCompleteCallback _completeCallback; |
||||||
|
std::shared_ptr<ffmpegkit::MediaInformation> _mediaInformation; |
||||||
|
}; |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
#endif // FFMPEG_KIT_MEDIA_INFORMATION_SESSION_H
|
||||||
@ -0,0 +1,58 @@ |
|||||||
|
/*
|
||||||
|
* Copyright (c) 2022 Taner Sener |
||||||
|
* |
||||||
|
* This file is part of FFmpegKit. |
||||||
|
* |
||||||
|
* FFmpegKit is free software: you can redistribute it and/or modify |
||||||
|
* it under the terms of the GNU Lesser General Public License as published by |
||||||
|
* the Free Software Foundation, either version 3 of the License, or |
||||||
|
* (at your option) any later version. |
||||||
|
* |
||||||
|
* FFmpegKit is distributed in the hope that it will be useful, |
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
* GNU Lesser General Public License for more details. |
||||||
|
* |
||||||
|
* You should have received a copy of the GNU Lesser General Public License |
||||||
|
* along with FFmpegKit. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/ |
||||||
|
|
||||||
|
#ifndef FFMPEG_KIT_MEDIA_INFORMATION_SESSION_COMPLETE_CALLBACK_H |
||||||
|
#define FFMPEG_KIT_MEDIA_INFORMATION_SESSION_COMPLETE_CALLBACK_H |
||||||
|
|
||||||
|
#include <iostream> |
||||||
|
#include <memory> |
||||||
|
|
||||||
|
namespace ffmpegkit { |
||||||
|
|
||||||
|
class MediaInformationSession; |
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Callback function that is invoked when an asynchronous <code>MediaInformation</code> session |
||||||
|
* has ended. |
||||||
|
* <p>Session has either SessionStateCompleted or SessionStateFailed state when |
||||||
|
* the callback is invoked. |
||||||
|
* <p>If it has SessionStateCompleted state, <code>ReturnCode</code> should be checked to |
||||||
|
* see the execution result. |
||||||
|
* <p>If <code>getState</code> returns SessionStateFailed then |
||||||
|
* <code>getFailStackTrace</code> should be used to get the failure reason. |
||||||
|
* <pre> |
||||||
|
* switch ([session getState]) { |
||||||
|
* case SessionStateCompleted: |
||||||
|
* ReturnCode *returnCode = [session getReturnCode]; |
||||||
|
* break; |
||||||
|
* case SessionStateFailed: |
||||||
|
* NSString *failStackTrace = [session getFailStackTrace]; |
||||||
|
* break; |
||||||
|
* } |
||||||
|
* </pre> |
||||||
|
* |
||||||
|
* @param session session of the completed execution |
||||||
|
*/ |
||||||
|
typedef void (*MediaInformationSessionCompleteCallback)(const std::shared_ptr<ffmpegkit::MediaInformationSession> session); |
||||||
|
|
||||||
|
#include "MediaInformationSession.h" |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
#endif // FFMPEG_KIT_MEDIA_INFORMATION_SESSION_COMPLETE_CALLBACK_H
|
||||||
@ -0,0 +1,251 @@ |
|||||||
|
/*
|
||||||
|
* Copyright (c) 2022 Taner Sener |
||||||
|
* |
||||||
|
* This file is part of FFmpegKit. |
||||||
|
* |
||||||
|
* FFmpegKit is free software: you can redistribute it and/or modify |
||||||
|
* it under the terms of the GNU Lesser General License as published by |
||||||
|
* the Free Software Foundation, either version 3 of the License, or |
||||||
|
* (at your option) any later version. |
||||||
|
* |
||||||
|
* FFmpegKit is distributed in the hope that it will be useful, |
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
* GNU Lesser General License for more details. |
||||||
|
* |
||||||
|
* You should have received a copy of the GNU Lesser General License |
||||||
|
* along with FFmpegKit. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/ |
||||||
|
|
||||||
|
#include "Packages.h" |
||||||
|
#include "config.h" |
||||||
|
#include <memory> |
||||||
|
#include <algorithm> |
||||||
|
|
||||||
|
static const std::set<const char*> supportedExternalLibraries = { |
||||||
|
"dav1d", |
||||||
|
"fontconfig", |
||||||
|
"freetype", |
||||||
|
"fribidi", |
||||||
|
"gmp", |
||||||
|
"gnutls", |
||||||
|
"kvazaar", |
||||||
|
"mp3lame", |
||||||
|
"libaom", |
||||||
|
"libass", |
||||||
|
"iconv", |
||||||
|
"libilbc", |
||||||
|
"libtheora", |
||||||
|
"libvidstab", |
||||||
|
"libvorbis", |
||||||
|
"libvpx", |
||||||
|
"libwebp", |
||||||
|
"libxml2", |
||||||
|
"opencore-amr", |
||||||
|
"openh264", |
||||||
|
"opus", |
||||||
|
"rubberband", |
||||||
|
"sdl2", |
||||||
|
"shine", |
||||||
|
"snappy", |
||||||
|
"soxr", |
||||||
|
"speex", |
||||||
|
"tesseract", |
||||||
|
"twolame", |
||||||
|
"x264", |
||||||
|
"x265", |
||||||
|
"xvid" |
||||||
|
}; |
||||||
|
|
||||||
|
std::string ffmpegkit::Packages::getPackageName() { |
||||||
|
std::shared_ptr<std::set<std::string>> enabledLibrarySet = getExternalLibraries(); |
||||||
|
#define contains_ext_lib(element) enabledLibrarySet->find(element) != enabledLibrarySet->end() |
||||||
|
bool speex = contains_ext_lib("speex"); |
||||||
|
bool fribidi = contains_ext_lib("fribidi"); |
||||||
|
bool gnutls = contains_ext_lib("gnutls"); |
||||||
|
bool xvid = contains_ext_lib("xvid"); |
||||||
|
|
||||||
|
bool min = false; |
||||||
|
bool minGpl = false; |
||||||
|
bool https = false; |
||||||
|
bool httpsGpl = false; |
||||||
|
bool audio = false; |
||||||
|
bool video = false; |
||||||
|
bool full = false; |
||||||
|
bool fullGpl = false; |
||||||
|
|
||||||
|
if (speex && fribidi) { |
||||||
|
if (xvid) { |
||||||
|
fullGpl = true; |
||||||
|
} else { |
||||||
|
full = true; |
||||||
|
} |
||||||
|
} else if (speex) { |
||||||
|
audio = true; |
||||||
|
} else if (fribidi) { |
||||||
|
video = true; |
||||||
|
} else if (xvid) { |
||||||
|
if (gnutls) { |
||||||
|
httpsGpl = true; |
||||||
|
} else { |
||||||
|
minGpl = true; |
||||||
|
} |
||||||
|
} else { |
||||||
|
if (gnutls) { |
||||||
|
https = true; |
||||||
|
} else { |
||||||
|
min = true; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if (fullGpl) { |
||||||
|
if (contains_ext_lib("dav1d") && |
||||||
|
contains_ext_lib("fontconfig") && |
||||||
|
contains_ext_lib("freetype") && |
||||||
|
contains_ext_lib("fribidi") && |
||||||
|
contains_ext_lib("gmp") && |
||||||
|
contains_ext_lib("gnutls") && |
||||||
|
contains_ext_lib("kvazaar") && |
||||||
|
contains_ext_lib("mp3lame") && |
||||||
|
contains_ext_lib("libass") && |
||||||
|
contains_ext_lib("iconv") && |
||||||
|
contains_ext_lib("libilbc") && |
||||||
|
contains_ext_lib("libtheora") && |
||||||
|
contains_ext_lib("libvidstab") && |
||||||
|
contains_ext_lib("libvorbis") && |
||||||
|
contains_ext_lib("libvpx") && |
||||||
|
contains_ext_lib("libwebp") && |
||||||
|
contains_ext_lib("libxml2") && |
||||||
|
contains_ext_lib("opencore-amr") && |
||||||
|
contains_ext_lib("opus") && |
||||||
|
contains_ext_lib("shine") && |
||||||
|
contains_ext_lib("snappy") && |
||||||
|
contains_ext_lib("soxr") && |
||||||
|
contains_ext_lib("speex") && |
||||||
|
contains_ext_lib("twolame") && |
||||||
|
contains_ext_lib("x264") && |
||||||
|
contains_ext_lib("x265") && |
||||||
|
contains_ext_lib("xvid")) { |
||||||
|
return "full-gpl"; |
||||||
|
} else { |
||||||
|
return "custom"; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if (full) { |
||||||
|
if (contains_ext_lib("dav1d") && |
||||||
|
contains_ext_lib("fontconfig") && |
||||||
|
contains_ext_lib("freetype") && |
||||||
|
contains_ext_lib("fribidi") && |
||||||
|
contains_ext_lib("gmp") && |
||||||
|
contains_ext_lib("gnutls") && |
||||||
|
contains_ext_lib("kvazaar") && |
||||||
|
contains_ext_lib("mp3lame") && |
||||||
|
contains_ext_lib("libass") && |
||||||
|
contains_ext_lib("iconv") && |
||||||
|
contains_ext_lib("libilbc") && |
||||||
|
contains_ext_lib("libtheora") && |
||||||
|
contains_ext_lib("libvorbis") && |
||||||
|
contains_ext_lib("libvpx") && |
||||||
|
contains_ext_lib("libwebp") && |
||||||
|
contains_ext_lib("libxml2") && |
||||||
|
contains_ext_lib("opencore-amr") && |
||||||
|
contains_ext_lib("opus") && |
||||||
|
contains_ext_lib("shine") && |
||||||
|
contains_ext_lib("snappy") && |
||||||
|
contains_ext_lib("soxr") && |
||||||
|
contains_ext_lib("speex") && |
||||||
|
contains_ext_lib("twolame")) { |
||||||
|
return "full"; |
||||||
|
} else { |
||||||
|
return "custom"; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if (video) { |
||||||
|
if (contains_ext_lib("dav1d") && |
||||||
|
contains_ext_lib("fontconfig") && |
||||||
|
contains_ext_lib("freetype") && |
||||||
|
contains_ext_lib("fribidi") && |
||||||
|
contains_ext_lib("kvazaar") && |
||||||
|
contains_ext_lib("libass") && |
||||||
|
contains_ext_lib("iconv") && |
||||||
|
contains_ext_lib("libtheora") && |
||||||
|
contains_ext_lib("libvpx") && |
||||||
|
contains_ext_lib("libwebp") && |
||||||
|
contains_ext_lib("snappy")) { |
||||||
|
return "video"; |
||||||
|
} else { |
||||||
|
return "custom"; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if (audio) { |
||||||
|
if (contains_ext_lib("mp3lame") && |
||||||
|
contains_ext_lib("libilbc") && |
||||||
|
contains_ext_lib("libvorbis") && |
||||||
|
contains_ext_lib("opencore-amr") && |
||||||
|
contains_ext_lib("opus") && |
||||||
|
contains_ext_lib("shine") && |
||||||
|
contains_ext_lib("soxr") && |
||||||
|
contains_ext_lib("speex") && |
||||||
|
contains_ext_lib("twolame")) { |
||||||
|
return "audio"; |
||||||
|
} else { |
||||||
|
return "custom"; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if (httpsGpl) { |
||||||
|
if (contains_ext_lib("gmp") && |
||||||
|
contains_ext_lib("gnutls") && |
||||||
|
contains_ext_lib("libvidstab") && |
||||||
|
contains_ext_lib("x264") && |
||||||
|
contains_ext_lib("x265") && |
||||||
|
contains_ext_lib("xvid")) { |
||||||
|
return "https-gpl"; |
||||||
|
} else { |
||||||
|
return "custom"; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if (https) { |
||||||
|
if (contains_ext_lib("gmp") && |
||||||
|
contains_ext_lib("gnutls")) { |
||||||
|
return "https"; |
||||||
|
} else { |
||||||
|
return "custom"; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if (minGpl) { |
||||||
|
if (contains_ext_lib("libvidstab") && |
||||||
|
contains_ext_lib("x264") && |
||||||
|
contains_ext_lib("x265") && |
||||||
|
contains_ext_lib("xvid")) { |
||||||
|
return "min-gpl"; |
||||||
|
} else { |
||||||
|
return "custom"; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
return "min"; |
||||||
|
} |
||||||
|
|
||||||
|
std::shared_ptr<std::set<std::string>> ffmpegkit::Packages::getExternalLibraries() { |
||||||
|
std::string buildConfiguration(FFMPEG_CONFIGURATION); |
||||||
|
char libraryName1[50]; |
||||||
|
char libraryName2[50]; |
||||||
|
std::shared_ptr<std::set<std::string>> enabledLibrarySet = std::make_shared<std::set<std::string>>(); |
||||||
|
|
||||||
|
std::for_each(supportedExternalLibraries.cbegin(), supportedExternalLibraries.cend(), [&](const char* supportedExternalLibrary) { |
||||||
|
sprintf(libraryName1, "enable-%s", supportedExternalLibrary); |
||||||
|
sprintf(libraryName2, "enable-lib%s", supportedExternalLibrary); |
||||||
|
|
||||||
|
if (buildConfiguration.find(libraryName1) != std::string::npos || buildConfiguration.find(libraryName2) != std::string::npos) { |
||||||
|
enabledLibrarySet->insert(supportedExternalLibrary); |
||||||
|
} |
||||||
|
}); |
||||||
|
|
||||||
|
return enabledLibrarySet; |
||||||
|
} |
||||||
@ -0,0 +1,53 @@ |
|||||||
|
/*
|
||||||
|
* Copyright (c) 2022 Taner Sener |
||||||
|
* |
||||||
|
* This file is part of FFmpegKit. |
||||||
|
* |
||||||
|
* FFmpegKit is free software: you can redistribute it and/or modify |
||||||
|
* it under the terms of the GNU Lesser General License as published by |
||||||
|
* the Free Software Foundation, either version 3 of the License, or |
||||||
|
* (at your option) any later version. |
||||||
|
* |
||||||
|
* FFmpegKit is distributed in the hope that it will be useful, |
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
* GNU Lesser General License for more details. |
||||||
|
* |
||||||
|
* You should have received a copy of the GNU Lesser General License |
||||||
|
* along with FFmpegKit. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/ |
||||||
|
|
||||||
|
#ifndef FFMPEG_KIT_PACKAGES_H |
||||||
|
#define FFMPEG_KIT_PACKAGES_H |
||||||
|
|
||||||
|
#include <set> |
||||||
|
#include <iostream> |
||||||
|
#include <memory> |
||||||
|
#include <string> |
||||||
|
|
||||||
|
namespace ffmpegkit { |
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Helper class to extract binary package information. |
||||||
|
*/ |
||||||
|
class Packages { |
||||||
|
public: |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the FFmpegKit binary package name. |
||||||
|
* |
||||||
|
* @return predicted FFmpegKit binary package name |
||||||
|
*/ |
||||||
|
static std::string getPackageName(); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns enabled external libraries by FFmpeg. |
||||||
|
* |
||||||
|
* @return enabled external libraries |
||||||
|
*/ |
||||||
|
static std::shared_ptr<std::set<std::string>> getExternalLibraries(); |
||||||
|
}; |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
#endif // FFMPEG_KIT_PACKAGES_H
|
||||||
@ -0,0 +1,51 @@ |
|||||||
|
/*
|
||||||
|
* Copyright (c) 2022 Taner Sener |
||||||
|
* |
||||||
|
* This file is part of FFmpegKit. |
||||||
|
* |
||||||
|
* FFmpegKit is free software: you can redistribute it and/or modify |
||||||
|
* it under the terms of the GNU Lesser General License as published by |
||||||
|
* the Free Software Foundation, either version 3 of the License, or |
||||||
|
* (at your option) any later version. |
||||||
|
* |
||||||
|
* FFmpegKit is distributed in the hope that it will be useful, |
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
* GNU Lesser General License for more details. |
||||||
|
* |
||||||
|
* You should have received a copy of the GNU Lesser General License |
||||||
|
* along with FFmpegKit. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/ |
||||||
|
|
||||||
|
#include "ReturnCode.h" |
||||||
|
|
||||||
|
bool ffmpegkit::ReturnCode::isSuccess(const std::shared_ptr<ffmpegkit::ReturnCode> value) { |
||||||
|
return (value != nullptr) && (value->getValue() == Success); |
||||||
|
} |
||||||
|
|
||||||
|
bool ffmpegkit::ReturnCode::isCancel(const std::shared_ptr<ffmpegkit::ReturnCode> value) { |
||||||
|
return (value != nullptr) && (value->getValue() == Cancel); |
||||||
|
} |
||||||
|
|
||||||
|
ffmpegkit::ReturnCode::ReturnCode(const int value) : _value {value} { |
||||||
|
} |
||||||
|
|
||||||
|
int ffmpegkit::ReturnCode::getValue() const { |
||||||
|
return _value; |
||||||
|
} |
||||||
|
|
||||||
|
bool ffmpegkit::ReturnCode::isValueSuccess() const { |
||||||
|
return (_value == Success); |
||||||
|
} |
||||||
|
|
||||||
|
bool ffmpegkit::ReturnCode::isValueError() const { |
||||||
|
return ((_value != Success) && (_value != Cancel)); |
||||||
|
} |
||||||
|
|
||||||
|
bool ffmpegkit::ReturnCode::isValueCancel() const { |
||||||
|
return (_value == Cancel); |
||||||
|
} |
||||||
|
|
||||||
|
std::ostream& operator<<(std::ostream& out, const ffmpegkit::ReturnCode& o) { |
||||||
|
return out << o.getValue(); |
||||||
|
} |
||||||
@ -0,0 +1,48 @@ |
|||||||
|
/*
|
||||||
|
* Copyright (c) 2022 Taner Sener |
||||||
|
* |
||||||
|
* This file is part of FFmpegKit. |
||||||
|
* |
||||||
|
* FFmpegKit is free software: you can redistribute it and/or modify |
||||||
|
* it under the terms of the GNU Lesser General License as published by |
||||||
|
* the Free Software Foundation, either version 3 of the License, or |
||||||
|
* (at your option) any later version. |
||||||
|
* |
||||||
|
* FFmpegKit is distributed in the hope that it will be useful, |
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
* GNU Lesser General License for more details. |
||||||
|
* |
||||||
|
* You should have received a copy of the GNU Lesser General License |
||||||
|
* along with FFmpegKit. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/ |
||||||
|
|
||||||
|
#ifndef FFMPEG_KIT_RETURN_CODE_H |
||||||
|
#define FFMPEG_KIT_RETURN_CODE_H |
||||||
|
|
||||||
|
#include <memory> |
||||||
|
|
||||||
|
namespace ffmpegkit { |
||||||
|
|
||||||
|
class ReturnCode { |
||||||
|
public: |
||||||
|
static constexpr int Success = 0; |
||||||
|
static constexpr int Cancel = 255; |
||||||
|
|
||||||
|
static bool isSuccess(const std::shared_ptr<ffmpegkit::ReturnCode> value); |
||||||
|
static bool isCancel(const std::shared_ptr<ffmpegkit::ReturnCode> value); |
||||||
|
|
||||||
|
ReturnCode(const int value); |
||||||
|
int getValue() const; |
||||||
|
bool isValueSuccess() const; |
||||||
|
bool isValueError() const; |
||||||
|
bool isValueCancel() const; |
||||||
|
friend std::ostream& operator<<(std::ostream& out, const ReturnCode& o); |
||||||
|
|
||||||
|
private: |
||||||
|
int _value; |
||||||
|
}; |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
#endif // FFMPEG_KIT_RETURN_CODE_H
|
||||||
@ -0,0 +1,260 @@ |
|||||||
|
/*
|
||||||
|
* Copyright (c) 2022 Taner Sener |
||||||
|
* |
||||||
|
* This file is part of FFmpegKit. |
||||||
|
* |
||||||
|
* FFmpegKit is free software: you can redistribute it and/or modify |
||||||
|
* it under the terms of the GNU Lesser General License as published by |
||||||
|
* the Free Software Foundation, either version 3 of the License, or |
||||||
|
* (at your option) any later version. |
||||||
|
* |
||||||
|
* FFmpegKit is distributed in the hope that it will be useful, |
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
* GNU Lesser General License for more details. |
||||||
|
* |
||||||
|
* You should have received a copy of the GNU Lesser General License |
||||||
|
* along with FFmpegKit. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/ |
||||||
|
|
||||||
|
#ifndef FFMPEG_KIT_SESSION_H |
||||||
|
#define FFMPEG_KIT_SESSION_H |
||||||
|
|
||||||
|
#include "Log.h" |
||||||
|
#include "LogCallback.h" |
||||||
|
#include "LogRedirectionStrategy.h" |
||||||
|
#include "ReturnCode.h" |
||||||
|
#include "SessionState.h" |
||||||
|
#include <string> |
||||||
|
#include <chrono> |
||||||
|
#include <list> |
||||||
|
|
||||||
|
namespace ffmpegkit { |
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Common interface for all <code>FFmpegKit</code> sessions. |
||||||
|
*/ |
||||||
|
class Session { |
||||||
|
public: |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the session specific log callback. |
||||||
|
* |
||||||
|
* @return session specific log callback |
||||||
|
*/ |
||||||
|
virtual ffmpegkit::LogCallback getLogCallback() const = 0; |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the session identifier. |
||||||
|
* |
||||||
|
* @return session identifier |
||||||
|
*/ |
||||||
|
virtual long getSessionId() const = 0; |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns session create time. |
||||||
|
* |
||||||
|
* @return session create time |
||||||
|
*/ |
||||||
|
virtual std::chrono::time_point<std::chrono::system_clock> getCreateTime() const = 0; |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns session start time. |
||||||
|
* |
||||||
|
* @return session start time |
||||||
|
*/ |
||||||
|
virtual std::chrono::time_point<std::chrono::system_clock> getStartTime() const = 0; |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns session end time. |
||||||
|
* |
||||||
|
* @return session end time |
||||||
|
*/ |
||||||
|
virtual std::chrono::time_point<std::chrono::system_clock> getEndTime() const = 0; |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the time taken to execute this session. |
||||||
|
* |
||||||
|
* @return time taken to execute this session in milliseconds or zero (0) if the session is |
||||||
|
* not over yet |
||||||
|
*/ |
||||||
|
virtual long getDuration() const = 0; |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns command arguments as a list. |
||||||
|
* |
||||||
|
* @return command arguments as a list |
||||||
|
*/ |
||||||
|
virtual std::shared_ptr<std::list<std::string>> getArguments() const = 0; |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns command arguments as a concatenated string. |
||||||
|
* |
||||||
|
* @return command arguments as a concatenated string |
||||||
|
*/ |
||||||
|
virtual std::string getCommand() const = 0; |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns all log entries generated for this session. If there are asynchronous |
||||||
|
* messages that are not delivered yet, this method waits for them until the given timeout. |
||||||
|
* |
||||||
|
* @param waitTimeout wait timeout for asynchronous messages in milliseconds |
||||||
|
* @return list of log entries generated for this session |
||||||
|
*/ |
||||||
|
virtual std::shared_ptr<std::list<std::shared_ptr<ffmpegkit::Log>>> getAllLogsWithTimeout(const int waitTimeout) const = 0; |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns all log entries generated for this session. If there are asynchronous |
||||||
|
* messages that are not delivered yet, this method waits for them. |
||||||
|
* |
||||||
|
* @return list of log entries generated for this session |
||||||
|
*/ |
||||||
|
virtual std::shared_ptr<std::list<std::shared_ptr<ffmpegkit::Log>>> getAllLogs() const = 0; |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns all log entries delivered for this session. Note that if there are asynchronous |
||||||
|
* messages that are not delivered yet, this method will not wait for them and will return |
||||||
|
* immediately. |
||||||
|
* |
||||||
|
* @return list of log entries received for this session |
||||||
|
*/ |
||||||
|
virtual std::shared_ptr<std::list<std::shared_ptr<ffmpegkit::Log>>> getLogs() const = 0; |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns all log entries generated for this session as a concatenated string. If there are |
||||||
|
* asynchronous messages that are not delivered yet, this method waits for them until |
||||||
|
* the given timeout. |
||||||
|
* |
||||||
|
* @param waitTimeout wait timeout for asynchronous messages in milliseconds |
||||||
|
* @return all log entries generated for this session as a concatenated string |
||||||
|
*/ |
||||||
|
virtual std::string getAllLogsAsStringWithTimeout(const int waitTimeout) const = 0; |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns all log entries generated for this session as a concatenated string. If there are |
||||||
|
* asynchronous messages that are not delivered yet, this method waits for them. |
||||||
|
* |
||||||
|
* @return all log entries generated for this session as a concatenated string |
||||||
|
*/ |
||||||
|
virtual std::string getAllLogsAsString() const = 0; |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns all log entries delivered for this session as a concatenated string. Note that if |
||||||
|
* there are asynchronous messages that are not delivered yet, this method will not wait |
||||||
|
* for them and will return immediately. |
||||||
|
* |
||||||
|
* @return list of log entries received for this session |
||||||
|
*/ |
||||||
|
virtual std::string getLogsAsString() const = 0; |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the log output generated while running the session. |
||||||
|
* |
||||||
|
* @return log output generated |
||||||
|
*/ |
||||||
|
virtual std::string getOutput() const = 0; |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the state of the session. |
||||||
|
* |
||||||
|
* @return state of the session |
||||||
|
*/ |
||||||
|
virtual ffmpegkit::SessionState getState() const = 0; |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the return code for this session. Note that return code is only set for sessions |
||||||
|
* that end with SessionStateCompleted state. If a session is not started, still running or failed then |
||||||
|
* this method returns nil. |
||||||
|
* |
||||||
|
* @return the return code for this session if the session has completed, nil if session is |
||||||
|
* not started, still running or failed |
||||||
|
*/ |
||||||
|
virtual std::shared_ptr<ffmpegkit::ReturnCode> getReturnCode() const = 0; |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the stack trace of the exception received while executing this session. |
||||||
|
* <p> |
||||||
|
* The stack trace is only set for sessions that end with SessionStateFailed state. For sessions that has |
||||||
|
* SessionStateCompleted state this method returns nil. |
||||||
|
* |
||||||
|
* @return stack trace of the exception received while executing this session, nil if session |
||||||
|
* is not started, still running or completed |
||||||
|
*/ |
||||||
|
virtual std::string getFailStackTrace() const = 0; |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns session specific log redirection strategy. |
||||||
|
* |
||||||
|
* @return session specific log redirection strategy |
||||||
|
*/ |
||||||
|
virtual LogRedirectionStrategy getLogRedirectionStrategy() const = 0; |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns whether there are still asynchronous messages being transmitted for this |
||||||
|
* session or not. |
||||||
|
* |
||||||
|
* @return true if there are still asynchronous messages being transmitted, false |
||||||
|
* otherwise |
||||||
|
*/ |
||||||
|
virtual bool thereAreAsynchronousMessagesInTransmit() const = 0; |
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds a new log entry for this session. |
||||||
|
* |
||||||
|
* It is invoked internally by <code>FFmpegKit</code> library methods. Must not be used by user |
||||||
|
* applications. |
||||||
|
* |
||||||
|
* @param log log entry |
||||||
|
*/ |
||||||
|
virtual void addLog(const std::shared_ptr<ffmpegkit::Log> log) = 0; |
||||||
|
|
||||||
|
/**
|
||||||
|
* Starts running the session. |
||||||
|
*/ |
||||||
|
virtual void startRunning() = 0; |
||||||
|
|
||||||
|
/**
|
||||||
|
* Completes running the session with the provided return code. |
||||||
|
* |
||||||
|
* @param returnCode return code of the execution |
||||||
|
*/ |
||||||
|
virtual void complete(const std::shared_ptr<ffmpegkit::ReturnCode> returnCode) = 0; |
||||||
|
|
||||||
|
/**
|
||||||
|
* Ends running the session with a failure. |
||||||
|
* |
||||||
|
* @param error error received |
||||||
|
*/ |
||||||
|
virtual void fail(const char* error) = 0; |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns whether it is an <code>FFmpeg</code> session or not. |
||||||
|
* |
||||||
|
* @return true if it is an <code>FFmpeg</code> session, false otherwise |
||||||
|
*/ |
||||||
|
virtual bool isFFmpeg() const = 0; |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns whether it is an <code>FFprobe</code> session or not. |
||||||
|
* |
||||||
|
* @return true if it is an <code>FFprobe</code> session, false otherwise |
||||||
|
*/ |
||||||
|
virtual bool isFFprobe() const = 0; |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns whether it is a <code>MediaInformation</code> session or not. |
||||||
|
* |
||||||
|
* @return true if it is a <code>MediaInformation</code> session, false otherwise |
||||||
|
*/ |
||||||
|
virtual bool isMediaInformation() const = 0; |
||||||
|
|
||||||
|
/**
|
||||||
|
* Cancels running the session. |
||||||
|
*/ |
||||||
|
virtual void cancel() = 0; |
||||||
|
|
||||||
|
}; |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
#endif // FFMPEG_KIT_SESSION_H
|
||||||
@ -0,0 +1,34 @@ |
|||||||
|
/*
|
||||||
|
* Copyright (c) 2022 Taner Sener |
||||||
|
* |
||||||
|
* This file is part of FFmpegKit. |
||||||
|
* |
||||||
|
* FFmpegKit is free software: you can redistribute it and/or modify |
||||||
|
* it under the terms of the GNU Lesser General License as published by |
||||||
|
* the Free Software Foundation, either version 3 of the License, or |
||||||
|
* (at your option) any later version. |
||||||
|
* |
||||||
|
* FFmpegKit is distributed in the hope that it will be useful, |
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
* GNU Lesser General License for more details. |
||||||
|
* |
||||||
|
* You should have received a copy of the GNU Lesser General License |
||||||
|
* along with FFmpegKit. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/ |
||||||
|
|
||||||
|
#ifndef FFMPEG_KIT_SESSION_STATE_H |
||||||
|
#define FFMPEG_KIT_SESSION_STATE_H |
||||||
|
|
||||||
|
namespace ffmpegkit { |
||||||
|
|
||||||
|
enum SessionState { |
||||||
|
SessionStateCreated = 0, |
||||||
|
SessionStateRunning = 1, |
||||||
|
SessionStateFailed = 2, |
||||||
|
SessionStateCompleted = 3 |
||||||
|
}; |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
#endif // FFMPEG_KIT_SESSION_STATE_H
|
||||||
@ -0,0 +1,35 @@ |
|||||||
|
/*
|
||||||
|
* Copyright (c) 2022 Taner Sener |
||||||
|
* |
||||||
|
* This file is part of FFmpegKit. |
||||||
|
* |
||||||
|
* FFmpegKit is free software: you can redistribute it and/or modify |
||||||
|
* it under the terms of the GNU Lesser General License as published by |
||||||
|
* the Free Software Foundation, either version 3 of the License, or |
||||||
|
* (at your option) any later version. |
||||||
|
* |
||||||
|
* FFmpegKit is distributed in the hope that it will be useful, |
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
* GNU Lesser General License for more details. |
||||||
|
* |
||||||
|
* You should have received a copy of the GNU Lesser General License |
||||||
|
* along with FFmpegKit. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/ |
||||||
|
|
||||||
|
#ifndef FFMPEG_KIT_SIGNAL_H |
||||||
|
#define FFMPEG_KIT_SIGNAL_H |
||||||
|
|
||||||
|
namespace ffmpegkit { |
||||||
|
|
||||||
|
enum Signal { |
||||||
|
SignalInt = 2, |
||||||
|
SignalQuit = 3, |
||||||
|
SignalPipe = 13, |
||||||
|
SignalTerm = 15, |
||||||
|
SignalXcpu = 24 |
||||||
|
}; |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
#endif // FFMPEG_KIT_SIGNAL_H
|
||||||
@ -0,0 +1,56 @@ |
|||||||
|
/*
|
||||||
|
* Copyright (c) 2022 Taner Sener |
||||||
|
* |
||||||
|
* This file is part of FFmpegKit. |
||||||
|
* |
||||||
|
* FFmpegKit is free software: you can redistribute it and/or modify |
||||||
|
* it under the terms of the GNU Lesser General Public License as published by |
||||||
|
* the Free Software Foundation, either version 3 of the License, or |
||||||
|
* (at your option) any later version. |
||||||
|
* |
||||||
|
* FFmpegKit is distributed in the hope that it will be useful, |
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
* GNU Lesser General Public License for more details. |
||||||
|
* |
||||||
|
* You should have received a copy of the GNU Lesser General Public License |
||||||
|
* along with FFmpegKit. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/ |
||||||
|
|
||||||
|
#include "Statistics.h" |
||||||
|
|
||||||
|
ffmpegkit::Statistics::Statistics(const long sessionId, const int videoFrameNumber, const float videoFps, const float videoQuality, const int64_t size, const int time, const double bitrate, const double speed) : |
||||||
|
_sessionId{sessionId}, _videoFrameNumber{videoFrameNumber}, _videoFps{videoFps}, _videoQuality{videoQuality}, _size{size}, _time{time}, _bitrate{bitrate}, _speed{speed} { |
||||||
|
} |
||||||
|
|
||||||
|
long ffmpegkit::Statistics::getSessionId() { |
||||||
|
return _sessionId; |
||||||
|
} |
||||||
|
|
||||||
|
int ffmpegkit::Statistics::getVideoFrameNumber() { |
||||||
|
return _videoFrameNumber; |
||||||
|
} |
||||||
|
|
||||||
|
float ffmpegkit::Statistics::getVideoFps() { |
||||||
|
return _videoFps; |
||||||
|
} |
||||||
|
|
||||||
|
float ffmpegkit::Statistics::getVideoQuality() { |
||||||
|
return _videoQuality; |
||||||
|
} |
||||||
|
|
||||||
|
int64_t ffmpegkit::Statistics::getSize() { |
||||||
|
return _size; |
||||||
|
} |
||||||
|
|
||||||
|
int ffmpegkit::Statistics::getTime() { |
||||||
|
return _time; |
||||||
|
} |
||||||
|
|
||||||
|
double ffmpegkit::Statistics::getBitrate() { |
||||||
|
return _bitrate; |
||||||
|
} |
||||||
|
|
||||||
|
double ffmpegkit::Statistics::getSpeed() { |
||||||
|
return _speed; |
||||||
|
} |
||||||
@ -0,0 +1,56 @@ |
|||||||
|
/*
|
||||||
|
* Copyright (c) 2022 Taner Sener |
||||||
|
* |
||||||
|
* This file is part of FFmpegKit. |
||||||
|
* |
||||||
|
* FFmpegKit is free software: you can redistribute it and/or modify |
||||||
|
* it under the terms of the GNU Lesser General Public License as published by |
||||||
|
* the Free Software Foundation, either version 3 of the License, or |
||||||
|
* (at your option) any later version. |
||||||
|
* |
||||||
|
* FFmpegKit is distributed in the hope that it will be useful, |
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
* GNU Lesser General Public License for more details. |
||||||
|
* |
||||||
|
* You should have received a copy of the GNU Lesser General Public License |
||||||
|
* along with FFmpegKit. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/ |
||||||
|
|
||||||
|
#ifndef FFMPEG_KIT_STATISTICS_H |
||||||
|
#define FFMPEG_KIT_STATISTICS_H |
||||||
|
|
||||||
|
#include <stdlib.h> |
||||||
|
|
||||||
|
namespace ffmpegkit { |
||||||
|
|
||||||
|
/**
|
||||||
|
* Statistics entry for an FFmpeg execute session. |
||||||
|
*/ |
||||||
|
class Statistics { |
||||||
|
public: |
||||||
|
|
||||||
|
Statistics(const long sessionId, const int videoFrameNumber, const float videoFps, const float videoQuality, const int64_t size, const int time, const double bitrate, const double speed); |
||||||
|
long getSessionId(); |
||||||
|
int getVideoFrameNumber(); |
||||||
|
float getVideoFps(); |
||||||
|
float getVideoQuality(); |
||||||
|
int64_t getSize(); |
||||||
|
int getTime(); |
||||||
|
double getBitrate(); |
||||||
|
double getSpeed(); |
||||||
|
|
||||||
|
private: |
||||||
|
long _sessionId; |
||||||
|
int _videoFrameNumber; |
||||||
|
float _videoFps; |
||||||
|
float _videoQuality; |
||||||
|
int64_t _size; |
||||||
|
int _time; |
||||||
|
double _bitrate; |
||||||
|
double _speed; |
||||||
|
}; |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
#endif // FFMPEG_KIT_STATISTICS_H
|
||||||
@ -0,0 +1,38 @@ |
|||||||
|
/*
|
||||||
|
* Copyright (c) 2022 Taner Sener |
||||||
|
* |
||||||
|
* This file is part of FFmpegKit. |
||||||
|
* |
||||||
|
* FFmpegKit is free software: you can redistribute it and/or modify |
||||||
|
* it under the terms of the GNU Lesser General Public License as published by |
||||||
|
* the Free Software Foundation, either version 3 of the License, or |
||||||
|
* (at your option) any later version. |
||||||
|
* |
||||||
|
* FFmpegKit is distributed in the hope that it will be useful, |
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
* GNU Lesser General Public License for more details. |
||||||
|
* |
||||||
|
* You should have received a copy of the GNU Lesser General Public License |
||||||
|
* along with FFmpegKit. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/ |
||||||
|
|
||||||
|
#ifndef FFMPEG_KIT_STATISTICS_CALLBACK_H |
||||||
|
#define FFMPEG_KIT_STATISTICS_CALLBACK_H |
||||||
|
|
||||||
|
#include "Statistics.h" |
||||||
|
#include <iostream> |
||||||
|
#include <memory> |
||||||
|
|
||||||
|
namespace ffmpegkit { |
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Callback that receives statistics generated for <code>FFmpegKit</code> sessions. |
||||||
|
* |
||||||
|
* @param statistics statistics entry |
||||||
|
*/ |
||||||
|
typedef void (*StatisticsCallback)(const std::shared_ptr<ffmpegkit::Statistics> statistics); |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
#endif // FFMPEG_KIT_STATISTICS_CALLBACK_H
|
||||||
@ -0,0 +1,117 @@ |
|||||||
|
/*
|
||||||
|
* Copyright (c) 2022 Taner Sener |
||||||
|
* |
||||||
|
* This file is part of FFmpegKit. |
||||||
|
* |
||||||
|
* FFmpegKit is free software: you can redistribute it and/or modify |
||||||
|
* it under the terms of the GNU Lesser General Public License as published by |
||||||
|
* the Free Software Foundation, either version 3 of the License, or |
||||||
|
* (at your option) any later version. |
||||||
|
* |
||||||
|
* FFmpegKit is distributed in the hope that it will be useful, |
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
* GNU Lesser General Public License for more details. |
||||||
|
* |
||||||
|
* You should have received a copy of the GNU Lesser General Public License |
||||||
|
* along with FFmpegKit. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/ |
||||||
|
|
||||||
|
#include "StreamInformation.h" |
||||||
|
|
||||||
|
ffmpegkit::StreamInformation::StreamInformation(std::shared_ptr<rapidjson::Value> streamInformationValue) : _streamInformationValue{streamInformationValue} { |
||||||
|
} |
||||||
|
|
||||||
|
int64_t ffmpegkit::StreamInformation::getIndex() { |
||||||
|
return (*_streamInformationValue)[KeyIndex].GetInt64(); |
||||||
|
} |
||||||
|
|
||||||
|
std::string ffmpegkit::StreamInformation::getType() { |
||||||
|
return (*_streamInformationValue)[KeyType].GetString(); |
||||||
|
} |
||||||
|
|
||||||
|
std::string ffmpegkit::StreamInformation::getCodec() { |
||||||
|
return (*_streamInformationValue)[KeyCodec].GetString(); |
||||||
|
} |
||||||
|
|
||||||
|
std::string ffmpegkit::StreamInformation::getCodecLong() { |
||||||
|
return (*_streamInformationValue)[KeyCodecLong].GetString(); |
||||||
|
} |
||||||
|
|
||||||
|
std::string ffmpegkit::StreamInformation::getFormat() { |
||||||
|
return (*_streamInformationValue)[KeyFormat].GetString(); |
||||||
|
} |
||||||
|
|
||||||
|
int64_t ffmpegkit::StreamInformation::getWidth() { |
||||||
|
return (*_streamInformationValue)[KeyWidth].GetInt64(); |
||||||
|
} |
||||||
|
|
||||||
|
int64_t ffmpegkit::StreamInformation::getHeight() { |
||||||
|
return (*_streamInformationValue)[KeyHeight].GetInt64(); |
||||||
|
} |
||||||
|
|
||||||
|
std::string ffmpegkit::StreamInformation::getBitrate() { |
||||||
|
return (*_streamInformationValue)[KeyBitRate].GetString(); |
||||||
|
} |
||||||
|
|
||||||
|
std::string ffmpegkit::StreamInformation::getSampleRate() { |
||||||
|
return (*_streamInformationValue)[KeySampleRate].GetString(); |
||||||
|
} |
||||||
|
|
||||||
|
std::string ffmpegkit::StreamInformation::getSampleFormat() { |
||||||
|
return (*_streamInformationValue)[KeySampleFormat].GetString(); |
||||||
|
} |
||||||
|
|
||||||
|
std::string ffmpegkit::StreamInformation::getChannelLayout() { |
||||||
|
return (*_streamInformationValue)[KeyChannelLayout].GetString(); |
||||||
|
} |
||||||
|
|
||||||
|
std::string ffmpegkit::StreamInformation::getSampleAspectRatio() { |
||||||
|
return (*_streamInformationValue)[KeySampleAspectRatio].GetString(); |
||||||
|
} |
||||||
|
|
||||||
|
std::string ffmpegkit::StreamInformation::getDisplayAspectRatio() { |
||||||
|
return (*_streamInformationValue)[KeyDisplayAspectRatio].GetString(); |
||||||
|
} |
||||||
|
|
||||||
|
std::string ffmpegkit::StreamInformation::getAverageFrameRate() { |
||||||
|
return (*_streamInformationValue)[KeyAverageFrameRate].GetString(); |
||||||
|
} |
||||||
|
|
||||||
|
std::string ffmpegkit::StreamInformation::getRealFrameRate() { |
||||||
|
return (*_streamInformationValue)[KeyRealFrameRate].GetString(); |
||||||
|
} |
||||||
|
|
||||||
|
std::string ffmpegkit::StreamInformation::getTimeBase() { |
||||||
|
return (*_streamInformationValue)[KeyTimeBase].GetString(); |
||||||
|
} |
||||||
|
|
||||||
|
std::string ffmpegkit::StreamInformation::getCodecTimeBase() { |
||||||
|
return (*_streamInformationValue)[KeyCodecTimeBase].GetString(); |
||||||
|
} |
||||||
|
|
||||||
|
std::shared_ptr<rapidjson::Value> ffmpegkit::StreamInformation::getTags() { |
||||||
|
auto tags = std::make_shared<rapidjson::Value>(); |
||||||
|
*tags = (*_streamInformationValue)[KeyTags]; |
||||||
|
return tags; |
||||||
|
} |
||||||
|
|
||||||
|
std::string ffmpegkit::StreamInformation::getStringProperty(const char* key) { |
||||||
|
return (*_streamInformationValue)[key].GetString(); |
||||||
|
} |
||||||
|
|
||||||
|
int64_t ffmpegkit::StreamInformation::getNumberProperty(const char* key) { |
||||||
|
return (*_streamInformationValue)[key].GetInt64(); |
||||||
|
} |
||||||
|
|
||||||
|
std::shared_ptr<rapidjson::Value> ffmpegkit::StreamInformation::getProperties(const char* key) { |
||||||
|
auto value = std::make_shared<rapidjson::Value>(); |
||||||
|
*value = (*_streamInformationValue)[key]; |
||||||
|
return value; |
||||||
|
} |
||||||
|
|
||||||
|
std::shared_ptr<rapidjson::Value> ffmpegkit::StreamInformation::getAllProperties() { |
||||||
|
auto all = std::make_shared<rapidjson::Value>(); |
||||||
|
*all = (*_streamInformationValue); |
||||||
|
return all; |
||||||
|
} |
||||||
@ -0,0 +1,215 @@ |
|||||||
|
/*
|
||||||
|
* Copyright (c) 2022 Taner Sener |
||||||
|
* |
||||||
|
* This file is part of FFmpegKit. |
||||||
|
* |
||||||
|
* FFmpegKit is free software: you can redistribute it and/or modify |
||||||
|
* it under the terms of the GNU Lesser General Public License as published by |
||||||
|
* the Free Software Foundation, either version 3 of the License, or |
||||||
|
* (at your option) any later version. |
||||||
|
* |
||||||
|
* FFmpegKit is distributed in the hope that it will be useful, |
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
* GNU Lesser General Public License for more details. |
||||||
|
* |
||||||
|
* You should have received a copy of the GNU Lesser General Public License |
||||||
|
* along with FFmpegKit. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/ |
||||||
|
|
||||||
|
#ifndef FFMPEG_KIT_STREAM_INFORMATION_H |
||||||
|
#define FFMPEG_KIT_STREAM_INFORMATION_H |
||||||
|
|
||||||
|
#include "rapidjson/document.h" |
||||||
|
#include <string> |
||||||
|
#include <memory> |
||||||
|
|
||||||
|
namespace ffmpegkit { |
||||||
|
|
||||||
|
/**
|
||||||
|
* Stream information class. |
||||||
|
*/ |
||||||
|
class StreamInformation { |
||||||
|
public: |
||||||
|
static constexpr const char* KeyIndex = "index"; |
||||||
|
static constexpr const char* KeyType = "codec_type"; |
||||||
|
static constexpr const char* KeyCodec = "codec_name"; |
||||||
|
static constexpr const char* KeyCodecLong = "codec_long_name"; |
||||||
|
static constexpr const char* KeyFormat = "pix_fmt"; |
||||||
|
static constexpr const char* KeyWidth = "width"; |
||||||
|
static constexpr const char* KeyHeight = "height"; |
||||||
|
static constexpr const char* KeyBitRate = "bit_rate"; |
||||||
|
static constexpr const char* KeySampleRate = "sample_rate"; |
||||||
|
static constexpr const char* KeySampleFormat = "sample_fmt"; |
||||||
|
static constexpr const char* KeyChannelLayout = "channel_layout"; |
||||||
|
static constexpr const char* KeySampleAspectRatio = "sample_aspect_ratio"; |
||||||
|
static constexpr const char* KeyDisplayAspectRatio = "display_aspect_ratio"; |
||||||
|
static constexpr const char* KeyAverageFrameRate = "avg_frame_rate"; |
||||||
|
static constexpr const char* KeyRealFrameRate = "r_frame_rate"; |
||||||
|
static constexpr const char* KeyTimeBase = "time_base"; |
||||||
|
static constexpr const char* KeyCodecTimeBase = "codec_time_base"; |
||||||
|
static constexpr const char* KeyTags = "tags"; |
||||||
|
|
||||||
|
StreamInformation(std::shared_ptr<rapidjson::Value> streamInformationValue); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns stream index. |
||||||
|
* |
||||||
|
* @return stream index, starting from zero |
||||||
|
*/ |
||||||
|
int64_t getIndex(); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns stream type. |
||||||
|
* |
||||||
|
* @return stream type; audio or video |
||||||
|
*/ |
||||||
|
std::string getType(); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns stream codec. |
||||||
|
* |
||||||
|
* @return stream codec |
||||||
|
*/ |
||||||
|
std::string getCodec(); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns stream codec in long format. |
||||||
|
* |
||||||
|
* @return stream codec with additional profile and mode information |
||||||
|
*/ |
||||||
|
std::string getCodecLong(); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns stream format. |
||||||
|
* |
||||||
|
* @return stream format |
||||||
|
*/ |
||||||
|
std::string getFormat(); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns width. |
||||||
|
* |
||||||
|
* @return width in pixels |
||||||
|
*/ |
||||||
|
int64_t getWidth(); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns height. |
||||||
|
* |
||||||
|
* @return height in pixels |
||||||
|
*/ |
||||||
|
int64_t getHeight(); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns bitrate. |
||||||
|
* |
||||||
|
* @return bitrate in kb/s |
||||||
|
*/ |
||||||
|
std::string getBitrate(); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns sample rate. |
||||||
|
* |
||||||
|
* @return sample rate in hz |
||||||
|
*/ |
||||||
|
std::string getSampleRate(); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns sample format. |
||||||
|
* |
||||||
|
* @return sample format |
||||||
|
*/ |
||||||
|
std::string getSampleFormat(); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns channel layout. |
||||||
|
* |
||||||
|
* @return channel layout |
||||||
|
*/ |
||||||
|
std::string getChannelLayout(); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns sample aspect ratio. |
||||||
|
* |
||||||
|
* @return sample aspect ratio |
||||||
|
*/ |
||||||
|
std::string getSampleAspectRatio(); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns display aspect ratio. |
||||||
|
* |
||||||
|
* @return display aspect ratio |
||||||
|
*/ |
||||||
|
std::string getDisplayAspectRatio(); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns average frame rate. |
||||||
|
* |
||||||
|
* @return average frame rate in fps |
||||||
|
*/ |
||||||
|
std::string getAverageFrameRate(); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns real frame rate. |
||||||
|
* |
||||||
|
* @return real frame rate in tbr |
||||||
|
*/ |
||||||
|
std::string getRealFrameRate(); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns time base. |
||||||
|
* |
||||||
|
* @return time base in tbn |
||||||
|
*/ |
||||||
|
std::string getTimeBase(); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns codec time base. |
||||||
|
* |
||||||
|
* @return codec time base in tbc |
||||||
|
*/ |
||||||
|
std::string getCodecTimeBase(); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns all tags. |
||||||
|
* |
||||||
|
* @return tags dictionary |
||||||
|
*/ |
||||||
|
std::shared_ptr<rapidjson::Value> getTags(); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the stream property associated with the key. |
||||||
|
* |
||||||
|
* @return stream property as string or nil if the key is not found |
||||||
|
*/ |
||||||
|
std::string getStringProperty(const char* key); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the stream property associated with the key. |
||||||
|
* |
||||||
|
* @return stream property as number or nil if the key is not found |
||||||
|
*/ |
||||||
|
int64_t getNumberProperty(const char* key); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the stream properties associated with the key. |
||||||
|
* |
||||||
|
* @return stream properties in a dictionary or nil if the key is not found |
||||||
|
*/ |
||||||
|
std::shared_ptr<rapidjson::Value> getProperties(const char* key); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns all stream properties defined. |
||||||
|
* |
||||||
|
* @return all stream properties in a dictionary or nil if no properties are defined |
||||||
|
*/ |
||||||
|
std::shared_ptr<rapidjson::Value> getAllProperties(); |
||||||
|
|
||||||
|
private: |
||||||
|
std::shared_ptr<rapidjson::Value> _streamInformationValue; |
||||||
|
}; |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
#endif // FFMPEG_KIT_STREAM_INFORMATION_H
|
||||||
@ -0,0 +1,23 @@ |
|||||||
|
/*
|
||||||
|
* Copyright (c) 2018-2022 Taner Sener |
||||||
|
* |
||||||
|
* This file is part of FFmpegKit. |
||||||
|
* |
||||||
|
* FFmpegKit is free software: you can redistribute it and/or modify |
||||||
|
* it under the terms of the GNU Lesser General Public License as published by |
||||||
|
* the Free Software Foundation, either version 3 of the License, or |
||||||
|
* (at your option) any later version. |
||||||
|
* |
||||||
|
* FFmpegKit is distributed in the hope that it will be useful, |
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
* GNU Lesser General Public License for more details. |
||||||
|
* |
||||||
|
* You should have received a copy of the GNU Lesser General Public License |
||||||
|
* along with FFmpegKit. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/ |
||||||
|
|
||||||
|
#include "ffmpegkit_exception.h" |
||||||
|
|
||||||
|
/** Holds information to implement exception handling. */ |
||||||
|
__thread jmp_buf ex_buf__; |
||||||
@ -0,0 +1,29 @@ |
|||||||
|
/*
|
||||||
|
* Copyright (c) 2018-2022 Taner Sener |
||||||
|
* |
||||||
|
* This file is part of FFmpegKit. |
||||||
|
* |
||||||
|
* FFmpegKit is free software: you can redistribute it and/or modify |
||||||
|
* it under the terms of the GNU Lesser General Public License as published by |
||||||
|
* the Free Software Foundation, either version 3 of the License, or |
||||||
|
* (at your option) any later version. |
||||||
|
* |
||||||
|
* FFmpegKit is distributed in the hope that it will be useful, |
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
* GNU Lesser General Public License for more details. |
||||||
|
* |
||||||
|
* You should have received a copy of the GNU Lesser General Public License |
||||||
|
* along with FFmpegKit. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/ |
||||||
|
|
||||||
|
#ifndef FFMPEG_KIT_EXCEPTION_H |
||||||
|
#define FFMPEG_KIT_EXCEPTION_H |
||||||
|
|
||||||
|
#include <stdio.h> |
||||||
|
#include <setjmp.h> |
||||||
|
|
||||||
|
/** Holds information to implement exception handling. */ |
||||||
|
extern __thread jmp_buf ex_buf__; |
||||||
|
|
||||||
|
#endif // FFMPEG_KIT_EXCEPTION_H
|
||||||
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,641 @@ |
|||||||
|
/*
|
||||||
|
* Various utilities for command line tools |
||||||
|
* copyright (c) 2003 Fabrice Bellard |
||||||
|
* |
||||||
|
* This file is part of FFmpeg. |
||||||
|
* |
||||||
|
* FFmpeg is free software; you can redistribute it and/or |
||||||
|
* modify it under the terms of the GNU Lesser General Public |
||||||
|
* License as published by the Free Software Foundation; either |
||||||
|
* version 2.1 of the License, or (at your option) any later version. |
||||||
|
* |
||||||
|
* FFmpeg is distributed in the hope that it will be useful, |
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
||||||
|
* Lesser General Public License for more details. |
||||||
|
* |
||||||
|
* You should have received a copy of the GNU Lesser General Public |
||||||
|
* License along with FFmpeg; if not, write to the Free Software |
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
||||||
|
*/ |
||||||
|
|
||||||
|
/*
|
||||||
|
* CHANGES 01.2020 |
||||||
|
* - ffprobe support changes |
||||||
|
* - AV_LOG_STDERR introduced |
||||||
|
* |
||||||
|
* CHANGES 12.2019 |
||||||
|
* - Concurrent execution support |
||||||
|
* |
||||||
|
* CHANGES 03.2019 |
||||||
|
* -------------------------------------------------------- |
||||||
|
* - config.h include removed |
||||||
|
* |
||||||
|
* CHANGES 08.2018 |
||||||
|
* -------------------------------------------------------- |
||||||
|
* - fftools_ prefix added to file name and include guards |
||||||
|
* |
||||||
|
* CHANGES 07.2018 |
||||||
|
* -------------------------------------------------------- |
||||||
|
* - Include guards renamed |
||||||
|
* - Unused headers removed |
||||||
|
*/ |
||||||
|
|
||||||
|
#ifndef FFTOOLS_CMDUTILS_H |
||||||
|
#define FFTOOLS_CMDUTILS_H |
||||||
|
|
||||||
|
#include <stdint.h> |
||||||
|
|
||||||
|
#include "libavcodec/avcodec.h" |
||||||
|
#include "libavfilter/avfilter.h" |
||||||
|
#include "libavformat/avformat.h" |
||||||
|
#include "libswscale/swscale.h" |
||||||
|
|
||||||
|
#ifdef _WIN32 |
||||||
|
#undef main /* We don't want SDL to override our main() */ |
||||||
|
#endif |
||||||
|
|
||||||
|
/**
|
||||||
|
* Defines logs printed to stderr by ffmpeg. They are not filtered and always redirected. |
||||||
|
*/ |
||||||
|
#define AV_LOG_STDERR -16 |
||||||
|
|
||||||
|
/**
|
||||||
|
* program name, defined by the program for show_version(). |
||||||
|
*/ |
||||||
|
extern __thread char *program_name; |
||||||
|
|
||||||
|
/**
|
||||||
|
* program birth year, defined by the program for show_banner() |
||||||
|
*/ |
||||||
|
extern __thread int program_birth_year; |
||||||
|
|
||||||
|
extern __thread AVCodecContext *avcodec_opts[AVMEDIA_TYPE_NB]; |
||||||
|
extern __thread AVFormatContext *avformat_opts; |
||||||
|
extern __thread AVDictionary *sws_dict; |
||||||
|
extern __thread AVDictionary *swr_opts; |
||||||
|
extern __thread AVDictionary *format_opts, *codec_opts, *resample_opts; |
||||||
|
extern __thread int hide_banner; |
||||||
|
extern __thread int find_stream_info; |
||||||
|
|
||||||
|
/**
|
||||||
|
* Register a program-specific cleanup routine. |
||||||
|
*/ |
||||||
|
void register_exit(void (*cb)(int ret)); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Wraps exit with a program-specific cleanup routine. |
||||||
|
*/ |
||||||
|
void exit_program(int ret) av_noreturn; |
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialize dynamic library loading |
||||||
|
*/ |
||||||
|
void init_dynload(void); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialize the cmdutils option system, in particular |
||||||
|
* allocate the *_opts contexts. |
||||||
|
*/ |
||||||
|
void init_opts(void); |
||||||
|
/**
|
||||||
|
* Uninitialize the cmdutils option system, in particular |
||||||
|
* free the *_opts contexts and their contents. |
||||||
|
*/ |
||||||
|
void uninit_opts(void); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Trivial log callback. |
||||||
|
* Only suitable for opt_help and similar since it lacks prefix handling. |
||||||
|
*/ |
||||||
|
void log_callback_help(void* ptr, int level, const char* fmt, va_list vl); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Override the cpuflags. |
||||||
|
*/ |
||||||
|
int opt_cpuflags(void *optctx, const char *opt, const char *arg); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Override the cpucount. |
||||||
|
*/ |
||||||
|
int opt_cpucount(void *optctx, const char *opt, const char *arg); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Fallback for options that are not explicitly handled, these will be |
||||||
|
* parsed through AVOptions. |
||||||
|
*/ |
||||||
|
int opt_default(void *optctx, const char *opt, const char *arg); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the libav* libraries log level. |
||||||
|
*/ |
||||||
|
int opt_loglevel(void *optctx, const char *opt, const char *arg); |
||||||
|
|
||||||
|
int opt_report(void *optctx, const char *opt, const char *arg); |
||||||
|
|
||||||
|
int opt_max_alloc(void *optctx, const char *opt, const char *arg); |
||||||
|
|
||||||
|
int opt_codec_debug(void *optctx, const char *opt, const char *arg); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Limit the execution time. |
||||||
|
*/ |
||||||
|
int opt_timelimit(void *optctx, const char *opt, const char *arg); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse a string and return its corresponding value as a double. |
||||||
|
* Exit from the application if the string cannot be correctly |
||||||
|
* parsed or the corresponding value is invalid. |
||||||
|
* |
||||||
|
* @param context the context of the value to be set (e.g. the |
||||||
|
* corresponding command line option name) |
||||||
|
* @param numstr the string to be parsed |
||||||
|
* @param type the type (OPT_INT64 or OPT_FLOAT) as which the |
||||||
|
* string should be parsed |
||||||
|
* @param min the minimum valid accepted value |
||||||
|
* @param max the maximum valid accepted value |
||||||
|
*/ |
||||||
|
double parse_number_or_die(const char *context, const char *numstr, int type, |
||||||
|
double min, double max); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse a string specifying a time and return its corresponding |
||||||
|
* value as a number of microseconds. Exit from the application if |
||||||
|
* the string cannot be correctly parsed. |
||||||
|
* |
||||||
|
* @param context the context of the value to be set (e.g. the |
||||||
|
* corresponding command line option name) |
||||||
|
* @param timestr the string to be parsed |
||||||
|
* @param is_duration a flag which tells how to interpret timestr, if |
||||||
|
* not zero timestr is interpreted as a duration, otherwise as a |
||||||
|
* date |
||||||
|
* |
||||||
|
* @see av_parse_time() |
||||||
|
*/ |
||||||
|
int64_t parse_time_or_die(const char *context, const char *timestr, |
||||||
|
int is_duration); |
||||||
|
|
||||||
|
typedef struct SpecifierOpt { |
||||||
|
char *specifier; /**< stream/chapter/program/... specifier */ |
||||||
|
union { |
||||||
|
uint8_t *str; |
||||||
|
int i; |
||||||
|
int64_t i64; |
||||||
|
uint64_t ui64; |
||||||
|
float f; |
||||||
|
double dbl; |
||||||
|
} u; |
||||||
|
} SpecifierOpt; |
||||||
|
|
||||||
|
typedef struct OptionDef { |
||||||
|
const char *name; |
||||||
|
int flags; |
||||||
|
#define HAS_ARG 0x0001 |
||||||
|
#define OPT_BOOL 0x0002 |
||||||
|
#define OPT_EXPERT 0x0004 |
||||||
|
#define OPT_STRING 0x0008 |
||||||
|
#define OPT_VIDEO 0x0010 |
||||||
|
#define OPT_AUDIO 0x0020 |
||||||
|
#define OPT_INT 0x0080 |
||||||
|
#define OPT_FLOAT 0x0100 |
||||||
|
#define OPT_SUBTITLE 0x0200 |
||||||
|
#define OPT_INT64 0x0400 |
||||||
|
#define OPT_EXIT 0x0800 |
||||||
|
#define OPT_DATA 0x1000 |
||||||
|
#define OPT_PERFILE 0x2000 /* the option is per-file (currently ffmpeg-only). |
||||||
|
implied by OPT_OFFSET or OPT_SPEC */ |
||||||
|
#define OPT_OFFSET 0x4000 /* option is specified as an offset in a passed optctx */ |
||||||
|
#define OPT_SPEC 0x8000 /* option is to be stored in an array of SpecifierOpt. |
||||||
|
Implies OPT_OFFSET. Next element after the offset is |
||||||
|
an int containing element count in the array. */ |
||||||
|
#define OPT_TIME 0x10000 |
||||||
|
#define OPT_DOUBLE 0x20000 |
||||||
|
#define OPT_INPUT 0x40000 |
||||||
|
#define OPT_OUTPUT 0x80000 |
||||||
|
union { |
||||||
|
void *dst_ptr; |
||||||
|
int (*func_arg)(void *, const char *, const char *); |
||||||
|
size_t off; |
||||||
|
} u; |
||||||
|
const char *help; |
||||||
|
const char *argname; |
||||||
|
} OptionDef; |
||||||
|
|
||||||
|
/**
|
||||||
|
* Print help for all options matching specified flags. |
||||||
|
* |
||||||
|
* @param options a list of options |
||||||
|
* @param msg title of this group. Only printed if at least one option matches. |
||||||
|
* @param req_flags print only options which have all those flags set. |
||||||
|
* @param rej_flags don't print options which have any of those flags set. |
||||||
|
* @param alt_flags print only options that have at least one of those flags set |
||||||
|
*/ |
||||||
|
void show_help_options(const OptionDef *options, const char *msg, int req_flags, |
||||||
|
int rej_flags, int alt_flags); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Show help for all options with given flags in class and all its |
||||||
|
* children. |
||||||
|
*/ |
||||||
|
void show_help_children(const AVClass *avClass, int flags); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Per-fftool specific help handler. Implemented in each |
||||||
|
* fftool, called by show_help(). |
||||||
|
*/ |
||||||
|
void show_help_default_ffmpeg(const char *opt, const char *arg); |
||||||
|
void show_help_default_ffprobe(const char *opt, const char *arg); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Generic -h handler common to all fftools. |
||||||
|
*/ |
||||||
|
int show_help(void *optctx, const char *opt, const char *arg); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse the command line arguments. |
||||||
|
* |
||||||
|
* @param optctx an opaque options context |
||||||
|
* @param argc number of command line arguments |
||||||
|
* @param argv values of command line arguments |
||||||
|
* @param options Array with the definitions required to interpret every |
||||||
|
* option of the form: -option_name [argument] |
||||||
|
* @param parse_arg_function Name of the function called to process every |
||||||
|
* argument without a leading option name flag. NULL if such arguments do |
||||||
|
* not have to be processed. |
||||||
|
*/ |
||||||
|
void parse_options(void *optctx, int argc, char **argv, const OptionDef *options, |
||||||
|
void (* parse_arg_function)(void *optctx, const char*)); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse one given option. |
||||||
|
* |
||||||
|
* @return on success 1 if arg was consumed, 0 otherwise; negative number on error |
||||||
|
*/ |
||||||
|
int parse_option(void *optctx, const char *opt, const char *arg, |
||||||
|
const OptionDef *options); |
||||||
|
|
||||||
|
/**
|
||||||
|
* An option extracted from the commandline. |
||||||
|
* Cannot use AVDictionary because of options like -map which can be |
||||||
|
* used multiple times. |
||||||
|
*/ |
||||||
|
typedef struct Option { |
||||||
|
const OptionDef *opt; |
||||||
|
const char *key; |
||||||
|
const char *val; |
||||||
|
} Option; |
||||||
|
|
||||||
|
typedef struct OptionGroupDef { |
||||||
|
/**< group name */ |
||||||
|
const char *name; |
||||||
|
/**
|
||||||
|
* Option to be used as group separator. Can be NULL for groups which |
||||||
|
* are terminated by a non-option argument (e.g. ffmpeg output files) |
||||||
|
*/ |
||||||
|
const char *sep; |
||||||
|
/**
|
||||||
|
* Option flags that must be set on each option that is |
||||||
|
* applied to this group |
||||||
|
*/ |
||||||
|
int flags; |
||||||
|
} OptionGroupDef; |
||||||
|
|
||||||
|
typedef struct OptionGroup { |
||||||
|
const OptionGroupDef *group_def; |
||||||
|
const char *arg; |
||||||
|
|
||||||
|
Option *opts; |
||||||
|
int nb_opts; |
||||||
|
|
||||||
|
AVDictionary *codec_opts; |
||||||
|
AVDictionary *format_opts; |
||||||
|
AVDictionary *resample_opts; |
||||||
|
AVDictionary *sws_dict; |
||||||
|
AVDictionary *swr_opts; |
||||||
|
} OptionGroup; |
||||||
|
|
||||||
|
/**
|
||||||
|
* A list of option groups that all have the same group type |
||||||
|
* (e.g. input files or output files) |
||||||
|
*/ |
||||||
|
typedef struct OptionGroupList { |
||||||
|
const OptionGroupDef *group_def; |
||||||
|
|
||||||
|
OptionGroup *groups; |
||||||
|
int nb_groups; |
||||||
|
} OptionGroupList; |
||||||
|
|
||||||
|
typedef struct OptionParseContext { |
||||||
|
OptionGroup global_opts; |
||||||
|
|
||||||
|
OptionGroupList *groups; |
||||||
|
int nb_groups; |
||||||
|
|
||||||
|
/* parsing state */ |
||||||
|
OptionGroup cur_group; |
||||||
|
} OptionParseContext; |
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse an options group and write results into optctx. |
||||||
|
* |
||||||
|
* @param optctx an app-specific options context. NULL for global options group |
||||||
|
* @param g option group |
||||||
|
*/ |
||||||
|
int parse_optgroup(void *optctx, OptionGroup *g); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Split the commandline into an intermediate form convenient for further |
||||||
|
* processing. |
||||||
|
* |
||||||
|
* The commandline is assumed to be composed of options which either belong to a |
||||||
|
* group (those with OPT_SPEC, OPT_OFFSET or OPT_PERFILE) or are global |
||||||
|
* (everything else). |
||||||
|
* |
||||||
|
* A group (defined by an OptionGroupDef struct) is a sequence of options |
||||||
|
* terminated by either a group separator option (e.g. -i) or a parameter that |
||||||
|
* is not an option (doesn't start with -). A group without a separator option |
||||||
|
* must always be first in the supplied groups list. |
||||||
|
* |
||||||
|
* All options within the same group are stored in one OptionGroup struct in an |
||||||
|
* OptionGroupList, all groups with the same group definition are stored in one |
||||||
|
* OptionGroupList in OptionParseContext.groups. The order of group lists is the |
||||||
|
* same as the order of group definitions. |
||||||
|
*/ |
||||||
|
int split_commandline(OptionParseContext *octx, int argc, char *argv[], |
||||||
|
const OptionDef *options, |
||||||
|
const OptionGroupDef *groups, int nb_groups); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Free all allocated memory in an OptionParseContext. |
||||||
|
*/ |
||||||
|
void uninit_parse_context(OptionParseContext *octx); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Find the '-loglevel' option in the command line args and apply it. |
||||||
|
*/ |
||||||
|
void parse_loglevel(int argc, char **argv, const OptionDef *options); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Return index of option opt in argv or 0 if not found. |
||||||
|
*/ |
||||||
|
int locate_option(int argc, char **argv, const OptionDef *options, |
||||||
|
const char *optname); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if the given stream matches a stream specifier. |
||||||
|
* |
||||||
|
* @param s Corresponding format context. |
||||||
|
* @param st Stream from s to be checked. |
||||||
|
* @param spec A stream specifier of the [v|a|s|d]:[\<stream index\>] form. |
||||||
|
* |
||||||
|
* @return 1 if the stream matches, 0 if it doesn't, <0 on error |
||||||
|
*/ |
||||||
|
int check_stream_specifier(AVFormatContext *s, AVStream *st, const char *spec); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Filter out options for given codec. |
||||||
|
* |
||||||
|
* Create a new options dictionary containing only the options from |
||||||
|
* opts which apply to the codec with ID codec_id. |
||||||
|
* |
||||||
|
* @param opts dictionary to place options in |
||||||
|
* @param codec_id ID of the codec that should be filtered for |
||||||
|
* @param s Corresponding format context. |
||||||
|
* @param st A stream from s for which the options should be filtered. |
||||||
|
* @param codec The particular codec for which the options should be filtered. |
||||||
|
* If null, the default one is looked up according to the codec id. |
||||||
|
* @return a pointer to the created dictionary |
||||||
|
*/ |
||||||
|
AVDictionary *filter_codec_opts(AVDictionary *opts, enum AVCodecID codec_id, |
||||||
|
AVFormatContext *s, AVStream *st, const AVCodec *codec); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Setup AVCodecContext options for avformat_find_stream_info(). |
||||||
|
* |
||||||
|
* Create an array of dictionaries, one dictionary for each stream |
||||||
|
* contained in s. |
||||||
|
* Each dictionary will contain the options from codec_opts which can |
||||||
|
* be applied to the corresponding stream codec context. |
||||||
|
* |
||||||
|
* @return pointer to the created array of dictionaries, NULL if it |
||||||
|
* cannot be created |
||||||
|
*/ |
||||||
|
AVDictionary **setup_find_stream_info_opts(AVFormatContext *s, |
||||||
|
AVDictionary *codec_opts); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Print an error message to stderr, indicating filename and a human |
||||||
|
* readable description of the error code err. |
||||||
|
* |
||||||
|
* If strerror_r() is not available the use of this function in a |
||||||
|
* multithreaded application may be unsafe. |
||||||
|
* |
||||||
|
* @see av_strerror() |
||||||
|
*/ |
||||||
|
void print_error(const char *filename, int err); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Print the program banner to stderr. The banner contents depend on the |
||||||
|
* current version of the repository and of the libav* libraries used by |
||||||
|
* the program. |
||||||
|
*/ |
||||||
|
void show_banner(int argc, char **argv, const OptionDef *options); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Print the version of the program to stdout. The version message |
||||||
|
* depends on the current versions of the repository and of the libav* |
||||||
|
* libraries. |
||||||
|
* This option processing function does not utilize the arguments. |
||||||
|
*/ |
||||||
|
int show_version(void *optctx, const char *opt, const char *arg); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Print the build configuration of the program to stdout. The contents |
||||||
|
* depend on the definition of FFMPEG_CONFIGURATION. |
||||||
|
* This option processing function does not utilize the arguments. |
||||||
|
*/ |
||||||
|
int show_buildconf(void *optctx, const char *opt, const char *arg); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Print the license of the program to stdout. The license depends on |
||||||
|
* the license of the libraries compiled into the program. |
||||||
|
* This option processing function does not utilize the arguments. |
||||||
|
*/ |
||||||
|
int show_license(void *optctx, const char *opt, const char *arg); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Print a listing containing all the formats supported by the |
||||||
|
* program (including devices). |
||||||
|
* This option processing function does not utilize the arguments. |
||||||
|
*/ |
||||||
|
int show_formats(void *optctx, const char *opt, const char *arg); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Print a listing containing all the muxers supported by the |
||||||
|
* program (including devices). |
||||||
|
* This option processing function does not utilize the arguments. |
||||||
|
*/ |
||||||
|
int show_muxers(void *optctx, const char *opt, const char *arg); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Print a listing containing all the demuxer supported by the |
||||||
|
* program (including devices). |
||||||
|
* This option processing function does not utilize the arguments. |
||||||
|
*/ |
||||||
|
int show_demuxers(void *optctx, const char *opt, const char *arg); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Print a listing containing all the devices supported by the |
||||||
|
* program. |
||||||
|
* This option processing function does not utilize the arguments. |
||||||
|
*/ |
||||||
|
int show_devices(void *optctx, const char *opt, const char *arg); |
||||||
|
|
||||||
|
#if CONFIG_AVDEVICE |
||||||
|
/**
|
||||||
|
* Print a listing containing autodetected sinks of the output device. |
||||||
|
* Device name with options may be passed as an argument to limit results. |
||||||
|
*/ |
||||||
|
int show_sinks(void *optctx, const char *opt, const char *arg); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Print a listing containing autodetected sources of the input device. |
||||||
|
* Device name with options may be passed as an argument to limit results. |
||||||
|
*/ |
||||||
|
int show_sources(void *optctx, const char *opt, const char *arg); |
||||||
|
#endif |
||||||
|
|
||||||
|
/**
|
||||||
|
* Print a listing containing all the codecs supported by the |
||||||
|
* program. |
||||||
|
* This option processing function does not utilize the arguments. |
||||||
|
*/ |
||||||
|
int show_codecs(void *optctx, const char *opt, const char *arg); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Print a listing containing all the decoders supported by the |
||||||
|
* program. |
||||||
|
*/ |
||||||
|
int show_decoders(void *optctx, const char *opt, const char *arg); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Print a listing containing all the encoders supported by the |
||||||
|
* program. |
||||||
|
*/ |
||||||
|
int show_encoders(void *optctx, const char *opt, const char *arg); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Print a listing containing all the filters supported by the |
||||||
|
* program. |
||||||
|
* This option processing function does not utilize the arguments. |
||||||
|
*/ |
||||||
|
int show_filters(void *optctx, const char *opt, const char *arg); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Print a listing containing all the bit stream filters supported by the |
||||||
|
* program. |
||||||
|
* This option processing function does not utilize the arguments. |
||||||
|
*/ |
||||||
|
int show_bsfs(void *optctx, const char *opt, const char *arg); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Print a listing containing all the protocols supported by the |
||||||
|
* program. |
||||||
|
* This option processing function does not utilize the arguments. |
||||||
|
*/ |
||||||
|
int show_protocols(void *optctx, const char *opt, const char *arg); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Print a listing containing all the pixel formats supported by the |
||||||
|
* program. |
||||||
|
* This option processing function does not utilize the arguments. |
||||||
|
*/ |
||||||
|
int show_pix_fmts(void *optctx, const char *opt, const char *arg); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Print a listing containing all the standard channel layouts supported by |
||||||
|
* the program. |
||||||
|
* This option processing function does not utilize the arguments. |
||||||
|
*/ |
||||||
|
int show_layouts(void *optctx, const char *opt, const char *arg); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Print a listing containing all the sample formats supported by the |
||||||
|
* program. |
||||||
|
*/ |
||||||
|
int show_sample_fmts(void *optctx, const char *opt, const char *arg); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Print a listing containing all the color names and values recognized |
||||||
|
* by the program. |
||||||
|
*/ |
||||||
|
int show_colors(void *optctx, const char *opt, const char *arg); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Return a positive value if a line read from standard input |
||||||
|
* starts with [yY], otherwise return 0. |
||||||
|
*/ |
||||||
|
int read_yesno(void); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a file corresponding to a preset file. |
||||||
|
* |
||||||
|
* If is_path is non-zero, look for the file in the path preset_name. |
||||||
|
* Otherwise search for a file named arg.ffpreset in the directories |
||||||
|
* $FFMPEG_DATADIR (if set), $HOME/.ffmpeg, and in the datadir defined |
||||||
|
* at configuration time or in a "ffpresets" folder along the executable |
||||||
|
* on win32, in that order. If no such file is found and |
||||||
|
* codec_name is defined, then search for a file named |
||||||
|
* codec_name-preset_name.avpreset in the above-mentioned directories. |
||||||
|
* |
||||||
|
* @param filename buffer where the name of the found filename is written |
||||||
|
* @param filename_size size in bytes of the filename buffer |
||||||
|
* @param preset_name name of the preset to search |
||||||
|
* @param is_path tell if preset_name is a filename path |
||||||
|
* @param codec_name name of the codec for which to look for the |
||||||
|
* preset, may be NULL |
||||||
|
*/ |
||||||
|
FILE *get_preset_file(char *filename, size_t filename_size, |
||||||
|
const char *preset_name, int is_path, const char *codec_name); |
||||||
|
|
||||||
|
/**
|
||||||
|
* Realloc array to hold new_size elements of elem_size. |
||||||
|
* Calls exit() on failure. |
||||||
|
* |
||||||
|
* @param array array to reallocate |
||||||
|
* @param elem_size size in bytes of each element |
||||||
|
* @param size new element count will be written here |
||||||
|
* @param new_size number of elements to place in reallocated array |
||||||
|
* @return reallocated array |
||||||
|
*/ |
||||||
|
void *grow_array(void *array, int elem_size, int *size, int new_size); |
||||||
|
|
||||||
|
#define media_type_string av_get_media_type_string |
||||||
|
|
||||||
|
#define GROW_ARRAY(array, nb_elems)\ |
||||||
|
array = grow_array(array, sizeof(*array), &nb_elems, nb_elems + 1) |
||||||
|
|
||||||
|
#define GET_PIX_FMT_NAME(pix_fmt)\ |
||||||
|
const char *name = av_get_pix_fmt_name(pix_fmt); |
||||||
|
|
||||||
|
#define GET_CODEC_NAME(id)\ |
||||||
|
const char *name = avcodec_descriptor_get(id)->name; |
||||||
|
|
||||||
|
#define GET_SAMPLE_FMT_NAME(sample_fmt)\ |
||||||
|
const char *name = av_get_sample_fmt_name(sample_fmt) |
||||||
|
|
||||||
|
#define GET_SAMPLE_RATE_NAME(rate)\ |
||||||
|
char name[16];\
|
||||||
|
snprintf(name, sizeof(name), "%d", rate); |
||||||
|
|
||||||
|
#define GET_CH_LAYOUT_NAME(ch_layout)\ |
||||||
|
char name[16];\
|
||||||
|
snprintf(name, sizeof(name), "0x%" PRIx64, ch_layout); |
||||||
|
|
||||||
|
#define GET_CH_LAYOUT_DESC(ch_layout)\ |
||||||
|
char name[128];\
|
||||||
|
av_get_channel_layout_string(name, sizeof(name), 0, ch_layout); |
||||||
|
|
||||||
|
double get_rotation(AVStream *st); |
||||||
|
|
||||||
|
#endif /* FFTOOLS_CMDUTILS_H */ |
||||||
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,791 @@ |
|||||||
|
/*
|
||||||
|
* This file is part of FFmpeg. |
||||||
|
* |
||||||
|
* FFmpeg is free software; you can redistribute it and/or |
||||||
|
* modify it under the terms of the GNU Lesser General Public |
||||||
|
* License as published by the Free Software Foundation; either |
||||||
|
* version 2.1 of the License, or (at your option) any later version. |
||||||
|
* |
||||||
|
* FFmpeg is distributed in the hope that it will be useful, |
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
||||||
|
* Lesser General Public License for more details. |
||||||
|
* |
||||||
|
* You should have received a copy of the GNU Lesser General Public |
||||||
|
* License along with FFmpeg; if not, write to the Free Software |
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
||||||
|
*/ |
||||||
|
|
||||||
|
/*
|
||||||
|
* CHANGES 06.2020 |
||||||
|
* - cancel_operation() method signature updated with id |
||||||
|
* |
||||||
|
* CHANGES 01.2020 |
||||||
|
* - ffprobe support changes |
||||||
|
* |
||||||
|
* CHANGES 12.2019 |
||||||
|
* - Concurrent execution support |
||||||
|
* |
||||||
|
* CHANGES 03.2019 |
||||||
|
* -------------------------------------------------------- |
||||||
|
* - config.h include removed |
||||||
|
* |
||||||
|
* CHANGES 08.2018 |
||||||
|
* -------------------------------------------------------- |
||||||
|
* - fftools_ prefix added to file name and include guards |
||||||
|
* - set_report_callback() method declared |
||||||
|
* - cancel_operation() method declared |
||||||
|
* |
||||||
|
* CHANGES 07.2018 |
||||||
|
* -------------------------------------------------------- |
||||||
|
* - Include guards renamed |
||||||
|
*/ |
||||||
|
|
||||||
|
#ifndef FFTOOLS_FFMPEG_H |
||||||
|
#define FFTOOLS_FFMPEG_H |
||||||
|
|
||||||
|
#include <stdint.h> |
||||||
|
#include <stdio.h> |
||||||
|
#include <signal.h> |
||||||
|
|
||||||
|
#include "fftools_cmdutils.h" |
||||||
|
|
||||||
|
#include "libavformat/avformat.h" |
||||||
|
#include "libavformat/avio.h" |
||||||
|
|
||||||
|
#include "libavcodec/avcodec.h" |
||||||
|
#include "libavcodec/bsf.h" |
||||||
|
|
||||||
|
#include "libavfilter/avfilter.h" |
||||||
|
|
||||||
|
#include "libavutil/avutil.h" |
||||||
|
#include "libavutil/dict.h" |
||||||
|
#include "libavutil/eval.h" |
||||||
|
#include "libavutil/fifo.h" |
||||||
|
#include "libavutil/hwcontext.h" |
||||||
|
#include "libavutil/pixfmt.h" |
||||||
|
#include "libavutil/rational.h" |
||||||
|
#include "libavutil/thread.h" |
||||||
|
#include "libavutil/threadmessage.h" |
||||||
|
|
||||||
|
#include "libswresample/swresample.h" |
||||||
|
|
||||||
|
#define VSYNC_AUTO -1 |
||||||
|
#define VSYNC_PASSTHROUGH 0 |
||||||
|
#define VSYNC_CFR 1 |
||||||
|
#define VSYNC_VFR 2 |
||||||
|
#define VSYNC_VSCFR 0xfe |
||||||
|
#define VSYNC_DROP 0xff |
||||||
|
|
||||||
|
#define MAX_STREAMS 1024 /* arbitrary sanity check value */ |
||||||
|
|
||||||
|
enum HWAccelID { |
||||||
|
HWACCEL_NONE = 0, |
||||||
|
HWACCEL_AUTO, |
||||||
|
HWACCEL_GENERIC, |
||||||
|
HWACCEL_VIDEOTOOLBOX, |
||||||
|
}; |
||||||
|
|
||||||
|
typedef struct HWAccel { |
||||||
|
const char *name; |
||||||
|
int (*init)(AVCodecContext *s); |
||||||
|
enum HWAccelID id; |
||||||
|
enum AVPixelFormat pix_fmt; |
||||||
|
} HWAccel; |
||||||
|
|
||||||
|
typedef struct HWDevice { |
||||||
|
const char *name; |
||||||
|
enum AVHWDeviceType type; |
||||||
|
AVBufferRef *device_ref; |
||||||
|
} HWDevice; |
||||||
|
|
||||||
|
/* select an input stream for an output stream */ |
||||||
|
typedef struct StreamMap { |
||||||
|
int disabled; /* 1 is this mapping is disabled by a negative map */ |
||||||
|
int file_index; |
||||||
|
int stream_index; |
||||||
|
int sync_file_index; |
||||||
|
int sync_stream_index; |
||||||
|
char *linklabel; /* name of an output link, for mapping lavfi outputs */ |
||||||
|
} StreamMap; |
||||||
|
|
||||||
|
typedef struct { |
||||||
|
int file_idx, stream_idx, channel_idx; // input
|
||||||
|
int ofile_idx, ostream_idx; // output
|
||||||
|
} AudioChannelMap; |
||||||
|
|
||||||
|
typedef struct OptionsContext { |
||||||
|
OptionGroup *g; |
||||||
|
|
||||||
|
/* input/output options */ |
||||||
|
int64_t start_time; |
||||||
|
int64_t start_time_eof; |
||||||
|
int seek_timestamp; |
||||||
|
const char *format; |
||||||
|
|
||||||
|
SpecifierOpt *codec_names; |
||||||
|
int nb_codec_names; |
||||||
|
SpecifierOpt *audio_channels; |
||||||
|
int nb_audio_channels; |
||||||
|
SpecifierOpt *audio_sample_rate; |
||||||
|
int nb_audio_sample_rate; |
||||||
|
SpecifierOpt *frame_rates; |
||||||
|
int nb_frame_rates; |
||||||
|
SpecifierOpt *max_frame_rates; |
||||||
|
int nb_max_frame_rates; |
||||||
|
SpecifierOpt *frame_sizes; |
||||||
|
int nb_frame_sizes; |
||||||
|
SpecifierOpt *frame_pix_fmts; |
||||||
|
int nb_frame_pix_fmts; |
||||||
|
|
||||||
|
/* input options */ |
||||||
|
int64_t input_ts_offset; |
||||||
|
int loop; |
||||||
|
int rate_emu; |
||||||
|
float readrate; |
||||||
|
int accurate_seek; |
||||||
|
int thread_queue_size; |
||||||
|
|
||||||
|
SpecifierOpt *ts_scale; |
||||||
|
int nb_ts_scale; |
||||||
|
SpecifierOpt *dump_attachment; |
||||||
|
int nb_dump_attachment; |
||||||
|
SpecifierOpt *hwaccels; |
||||||
|
int nb_hwaccels; |
||||||
|
SpecifierOpt *hwaccel_devices; |
||||||
|
int nb_hwaccel_devices; |
||||||
|
SpecifierOpt *hwaccel_output_formats; |
||||||
|
int nb_hwaccel_output_formats; |
||||||
|
SpecifierOpt *autorotate; |
||||||
|
int nb_autorotate; |
||||||
|
|
||||||
|
/* output options */ |
||||||
|
StreamMap *stream_maps; |
||||||
|
int nb_stream_maps; |
||||||
|
AudioChannelMap *audio_channel_maps; /* one info entry per -map_channel */ |
||||||
|
int nb_audio_channel_maps; /* number of (valid) -map_channel settings */ |
||||||
|
int metadata_global_manual; |
||||||
|
int metadata_streams_manual; |
||||||
|
int metadata_chapters_manual; |
||||||
|
const char **attachments; |
||||||
|
int nb_attachments; |
||||||
|
|
||||||
|
int chapters_input_file; |
||||||
|
|
||||||
|
int64_t recording_time; |
||||||
|
int64_t stop_time; |
||||||
|
uint64_t limit_filesize; |
||||||
|
float mux_preload; |
||||||
|
float mux_max_delay; |
||||||
|
int shortest; |
||||||
|
int bitexact; |
||||||
|
|
||||||
|
int video_disable; |
||||||
|
int audio_disable; |
||||||
|
int subtitle_disable; |
||||||
|
int data_disable; |
||||||
|
|
||||||
|
/* indexed by output file stream index */ |
||||||
|
int *streamid_map; |
||||||
|
int nb_streamid_map; |
||||||
|
|
||||||
|
SpecifierOpt *metadata; |
||||||
|
int nb_metadata; |
||||||
|
SpecifierOpt *max_frames; |
||||||
|
int nb_max_frames; |
||||||
|
SpecifierOpt *bitstream_filters; |
||||||
|
int nb_bitstream_filters; |
||||||
|
SpecifierOpt *codec_tags; |
||||||
|
int nb_codec_tags; |
||||||
|
SpecifierOpt *sample_fmts; |
||||||
|
int nb_sample_fmts; |
||||||
|
SpecifierOpt *qscale; |
||||||
|
int nb_qscale; |
||||||
|
SpecifierOpt *forced_key_frames; |
||||||
|
int nb_forced_key_frames; |
||||||
|
SpecifierOpt *force_fps; |
||||||
|
int nb_force_fps; |
||||||
|
SpecifierOpt *frame_aspect_ratios; |
||||||
|
int nb_frame_aspect_ratios; |
||||||
|
SpecifierOpt *rc_overrides; |
||||||
|
int nb_rc_overrides; |
||||||
|
SpecifierOpt *intra_matrices; |
||||||
|
int nb_intra_matrices; |
||||||
|
SpecifierOpt *inter_matrices; |
||||||
|
int nb_inter_matrices; |
||||||
|
SpecifierOpt *chroma_intra_matrices; |
||||||
|
int nb_chroma_intra_matrices; |
||||||
|
SpecifierOpt *top_field_first; |
||||||
|
int nb_top_field_first; |
||||||
|
SpecifierOpt *metadata_map; |
||||||
|
int nb_metadata_map; |
||||||
|
SpecifierOpt *presets; |
||||||
|
int nb_presets; |
||||||
|
SpecifierOpt *copy_initial_nonkeyframes; |
||||||
|
int nb_copy_initial_nonkeyframes; |
||||||
|
SpecifierOpt *copy_prior_start; |
||||||
|
int nb_copy_prior_start; |
||||||
|
SpecifierOpt *filters; |
||||||
|
int nb_filters; |
||||||
|
SpecifierOpt *filter_scripts; |
||||||
|
int nb_filter_scripts; |
||||||
|
SpecifierOpt *reinit_filters; |
||||||
|
int nb_reinit_filters; |
||||||
|
SpecifierOpt *fix_sub_duration; |
||||||
|
int nb_fix_sub_duration; |
||||||
|
SpecifierOpt *canvas_sizes; |
||||||
|
int nb_canvas_sizes; |
||||||
|
SpecifierOpt *pass; |
||||||
|
int nb_pass; |
||||||
|
SpecifierOpt *passlogfiles; |
||||||
|
int nb_passlogfiles; |
||||||
|
SpecifierOpt *max_muxing_queue_size; |
||||||
|
int nb_max_muxing_queue_size; |
||||||
|
SpecifierOpt *muxing_queue_data_threshold; |
||||||
|
int nb_muxing_queue_data_threshold; |
||||||
|
SpecifierOpt *guess_layout_max; |
||||||
|
int nb_guess_layout_max; |
||||||
|
SpecifierOpt *apad; |
||||||
|
int nb_apad; |
||||||
|
SpecifierOpt *discard; |
||||||
|
int nb_discard; |
||||||
|
SpecifierOpt *disposition; |
||||||
|
int nb_disposition; |
||||||
|
SpecifierOpt *program; |
||||||
|
int nb_program; |
||||||
|
SpecifierOpt *time_bases; |
||||||
|
int nb_time_bases; |
||||||
|
SpecifierOpt *enc_time_bases; |
||||||
|
int nb_enc_time_bases; |
||||||
|
SpecifierOpt *autoscale; |
||||||
|
int nb_autoscale; |
||||||
|
} OptionsContext; |
||||||
|
|
||||||
|
typedef struct InputFilter { |
||||||
|
AVFilterContext *filter; |
||||||
|
struct InputStream *ist; |
||||||
|
struct FilterGraph *graph; |
||||||
|
uint8_t *name; |
||||||
|
enum AVMediaType type; // AVMEDIA_TYPE_SUBTITLE for sub2video
|
||||||
|
|
||||||
|
AVFifoBuffer *frame_queue; |
||||||
|
|
||||||
|
// parameters configured for this input
|
||||||
|
int format; |
||||||
|
|
||||||
|
int width, height; |
||||||
|
AVRational sample_aspect_ratio; |
||||||
|
|
||||||
|
int sample_rate; |
||||||
|
int channels; |
||||||
|
uint64_t channel_layout; |
||||||
|
|
||||||
|
AVBufferRef *hw_frames_ctx; |
||||||
|
|
||||||
|
int eof; |
||||||
|
} InputFilter; |
||||||
|
|
||||||
|
typedef struct OutputFilter { |
||||||
|
AVFilterContext *filter; |
||||||
|
struct OutputStream *ost; |
||||||
|
struct FilterGraph *graph; |
||||||
|
uint8_t *name; |
||||||
|
|
||||||
|
/* temporary storage until stream maps are processed */ |
||||||
|
AVFilterInOut *out_tmp; |
||||||
|
enum AVMediaType type; |
||||||
|
|
||||||
|
/* desired output stream properties */ |
||||||
|
int width, height; |
||||||
|
AVRational frame_rate; |
||||||
|
int format; |
||||||
|
int sample_rate; |
||||||
|
uint64_t channel_layout; |
||||||
|
|
||||||
|
// those are only set if no format is specified and the encoder gives us multiple options
|
||||||
|
int *formats; |
||||||
|
uint64_t *channel_layouts; |
||||||
|
int *sample_rates; |
||||||
|
} OutputFilter; |
||||||
|
|
||||||
|
typedef struct FilterGraph { |
||||||
|
int index; |
||||||
|
const char *graph_desc; |
||||||
|
|
||||||
|
AVFilterGraph *graph; |
||||||
|
int reconfiguration; |
||||||
|
|
||||||
|
InputFilter **inputs; |
||||||
|
int nb_inputs; |
||||||
|
OutputFilter **outputs; |
||||||
|
int nb_outputs; |
||||||
|
} FilterGraph; |
||||||
|
|
||||||
|
typedef struct InputStream { |
||||||
|
int file_index; |
||||||
|
AVStream *st; |
||||||
|
int discard; /* true if stream data should be discarded */ |
||||||
|
int user_set_discard; |
||||||
|
int decoding_needed; /* non zero if the packets must be decoded in 'raw_fifo', see DECODING_FOR_* */ |
||||||
|
#define DECODING_FOR_OST 1 |
||||||
|
#define DECODING_FOR_FILTER 2 |
||||||
|
|
||||||
|
AVCodecContext *dec_ctx; |
||||||
|
const AVCodec *dec; |
||||||
|
AVFrame *decoded_frame; |
||||||
|
AVFrame *filter_frame; /* a ref of decoded_frame, to be sent to filters */ |
||||||
|
AVPacket *pkt; |
||||||
|
|
||||||
|
int64_t start; /* time when read started */ |
||||||
|
/* predicted dts of the next packet read for this stream or (when there are
|
||||||
|
* several frames in a packet) of the next frame in current packet (in AV_TIME_BASE units) */ |
||||||
|
int64_t next_dts; |
||||||
|
int64_t first_dts; ///< dts of the first packet read for this stream (in AV_TIME_BASE units)
|
||||||
|
int64_t dts; ///< dts of the last packet read for this stream (in AV_TIME_BASE units)
|
||||||
|
|
||||||
|
int64_t next_pts; ///< synthetic pts for the next decode frame (in AV_TIME_BASE units)
|
||||||
|
int64_t pts; ///< current pts of the decoded frame (in AV_TIME_BASE units)
|
||||||
|
int wrap_correction_done; |
||||||
|
|
||||||
|
int64_t filter_in_rescale_delta_last; |
||||||
|
|
||||||
|
int64_t min_pts; /* pts with the smallest value in a current stream */ |
||||||
|
int64_t max_pts; /* pts with the higher value in a current stream */ |
||||||
|
|
||||||
|
// when forcing constant input framerate through -r,
|
||||||
|
// this contains the pts that will be given to the next decoded frame
|
||||||
|
int64_t cfr_next_pts; |
||||||
|
|
||||||
|
int64_t nb_samples; /* number of samples in the last decoded audio frame before looping */ |
||||||
|
|
||||||
|
double ts_scale; |
||||||
|
int saw_first_ts; |
||||||
|
AVDictionary *decoder_opts; |
||||||
|
AVRational framerate; /* framerate forced with -r */ |
||||||
|
int top_field_first; |
||||||
|
int guess_layout_max; |
||||||
|
|
||||||
|
int autorotate; |
||||||
|
|
||||||
|
int fix_sub_duration; |
||||||
|
struct { /* previous decoded subtitle and related variables */ |
||||||
|
int got_output; |
||||||
|
int ret; |
||||||
|
AVSubtitle subtitle; |
||||||
|
} prev_sub; |
||||||
|
|
||||||
|
struct sub2video { |
||||||
|
int64_t last_pts; |
||||||
|
int64_t end_pts; |
||||||
|
AVFifoBuffer *sub_queue; ///< queue of AVSubtitle* before filter init
|
||||||
|
AVFrame *frame; |
||||||
|
int w, h; |
||||||
|
unsigned int initialize; ///< marks if sub2video_update should force an initialization
|
||||||
|
} sub2video; |
||||||
|
|
||||||
|
int dr1; |
||||||
|
|
||||||
|
/* decoded data from this stream goes into all those filters
|
||||||
|
* currently video and audio only */ |
||||||
|
InputFilter **filters; |
||||||
|
int nb_filters; |
||||||
|
|
||||||
|
int reinit_filters; |
||||||
|
|
||||||
|
/* hwaccel options */ |
||||||
|
enum HWAccelID hwaccel_id; |
||||||
|
enum AVHWDeviceType hwaccel_device_type; |
||||||
|
char *hwaccel_device; |
||||||
|
enum AVPixelFormat hwaccel_output_format; |
||||||
|
|
||||||
|
/* hwaccel context */ |
||||||
|
void *hwaccel_ctx; |
||||||
|
void (*hwaccel_uninit)(AVCodecContext *s); |
||||||
|
int (*hwaccel_get_buffer)(AVCodecContext *s, AVFrame *frame, int flags); |
||||||
|
int (*hwaccel_retrieve_data)(AVCodecContext *s, AVFrame *frame); |
||||||
|
enum AVPixelFormat hwaccel_pix_fmt; |
||||||
|
enum AVPixelFormat hwaccel_retrieved_pix_fmt; |
||||||
|
AVBufferRef *hw_frames_ctx; |
||||||
|
|
||||||
|
/* stats */ |
||||||
|
// combined size of all the packets read
|
||||||
|
uint64_t data_size; |
||||||
|
/* number of packets successfully read for this stream */ |
||||||
|
uint64_t nb_packets; |
||||||
|
// number of frames/samples retrieved from the decoder
|
||||||
|
uint64_t frames_decoded; |
||||||
|
uint64_t samples_decoded; |
||||||
|
|
||||||
|
int64_t *dts_buffer; |
||||||
|
int nb_dts_buffer; |
||||||
|
|
||||||
|
int got_output; |
||||||
|
} InputStream; |
||||||
|
|
||||||
|
typedef struct InputFile { |
||||||
|
AVFormatContext *ctx; |
||||||
|
int eof_reached; /* true if eof reached */ |
||||||
|
int eagain; /* true if last read attempt returned EAGAIN */ |
||||||
|
int ist_index; /* index of first stream in input_streams */ |
||||||
|
int loop; /* set number of times input stream should be looped */ |
||||||
|
int64_t duration; /* actual duration of the longest stream in a file
|
||||||
|
at the moment when looping happens */ |
||||||
|
AVRational time_base; /* time base of the duration */ |
||||||
|
int64_t input_ts_offset; |
||||||
|
|
||||||
|
int64_t ts_offset; |
||||||
|
int64_t last_ts; |
||||||
|
int64_t start_time; /* user-specified start time in AV_TIME_BASE or AV_NOPTS_VALUE */ |
||||||
|
int seek_timestamp; |
||||||
|
int64_t recording_time; |
||||||
|
int nb_streams; /* number of stream that ffmpeg is aware of; may be different
|
||||||
|
from ctx.nb_streams if new streams appear during av_read_frame() */ |
||||||
|
int nb_streams_warn; /* number of streams that the user was warned of */ |
||||||
|
int rate_emu; |
||||||
|
float readrate; |
||||||
|
int accurate_seek; |
||||||
|
|
||||||
|
AVPacket *pkt; |
||||||
|
|
||||||
|
#if HAVE_THREADS |
||||||
|
AVThreadMessageQueue *in_thread_queue; |
||||||
|
pthread_t thread; /* thread reading from this file */ |
||||||
|
int non_blocking; /* reading packets from the thread should not block */ |
||||||
|
int joined; /* the thread has been joined */ |
||||||
|
int thread_queue_size; /* maximum number of queued packets */ |
||||||
|
#endif |
||||||
|
} InputFile; |
||||||
|
|
||||||
|
enum forced_keyframes_const { |
||||||
|
FKF_N, |
||||||
|
FKF_N_FORCED, |
||||||
|
FKF_PREV_FORCED_N, |
||||||
|
FKF_PREV_FORCED_T, |
||||||
|
FKF_T, |
||||||
|
FKF_NB |
||||||
|
}; |
||||||
|
|
||||||
|
#define ABORT_ON_FLAG_EMPTY_OUTPUT (1 << 0) |
||||||
|
#define ABORT_ON_FLAG_EMPTY_OUTPUT_STREAM (1 << 1) |
||||||
|
|
||||||
|
extern const char *const forced_keyframes_const_names[]; |
||||||
|
|
||||||
|
typedef enum { |
||||||
|
ENCODER_FINISHED = 1, |
||||||
|
MUXER_FINISHED = 2, |
||||||
|
} OSTFinished ; |
||||||
|
|
||||||
|
typedef struct OutputStream { |
||||||
|
int file_index; /* file index */ |
||||||
|
int index; /* stream index in the output file */ |
||||||
|
int source_index; /* InputStream index */ |
||||||
|
AVStream *st; /* stream in the output file */ |
||||||
|
int encoding_needed; /* true if encoding needed for this stream */ |
||||||
|
int frame_number; |
||||||
|
/* input pts and corresponding output pts
|
||||||
|
for A/V sync */ |
||||||
|
struct InputStream *sync_ist; /* input stream to sync against */ |
||||||
|
int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ // FIXME look at frame_number
|
||||||
|
/* pts of the first frame encoded for this stream, used for limiting
|
||||||
|
* recording time */ |
||||||
|
int64_t first_pts; |
||||||
|
/* dts of the last packet sent to the muxer */ |
||||||
|
int64_t last_mux_dts; |
||||||
|
// the timebase of the packets sent to the muxer
|
||||||
|
AVRational mux_timebase; |
||||||
|
AVRational enc_timebase; |
||||||
|
|
||||||
|
AVBSFContext *bsf_ctx; |
||||||
|
|
||||||
|
AVCodecContext *enc_ctx; |
||||||
|
AVCodecParameters *ref_par; /* associated input codec parameters with encoders options applied */ |
||||||
|
const AVCodec *enc; |
||||||
|
int64_t max_frames; |
||||||
|
AVFrame *filtered_frame; |
||||||
|
AVFrame *last_frame; |
||||||
|
AVPacket *pkt; |
||||||
|
int last_dropped; |
||||||
|
int last_nb0_frames[3]; |
||||||
|
|
||||||
|
void *hwaccel_ctx; |
||||||
|
|
||||||
|
/* video only */ |
||||||
|
AVRational frame_rate; |
||||||
|
AVRational max_frame_rate; |
||||||
|
int is_cfr; |
||||||
|
int force_fps; |
||||||
|
int top_field_first; |
||||||
|
int rotate_overridden; |
||||||
|
int autoscale; |
||||||
|
double rotate_override_value; |
||||||
|
|
||||||
|
AVRational frame_aspect_ratio; |
||||||
|
|
||||||
|
/* forced key frames */ |
||||||
|
int64_t forced_kf_ref_pts; |
||||||
|
int64_t *forced_kf_pts; |
||||||
|
int forced_kf_count; |
||||||
|
int forced_kf_index; |
||||||
|
char *forced_keyframes; |
||||||
|
AVExpr *forced_keyframes_pexpr; |
||||||
|
double forced_keyframes_expr_const_values[FKF_NB]; |
||||||
|
int dropped_keyframe; |
||||||
|
|
||||||
|
/* audio only */ |
||||||
|
int *audio_channels_map; /* list of the channels id to pick from the source stream */ |
||||||
|
int audio_channels_mapped; /* number of channels in audio_channels_map */ |
||||||
|
|
||||||
|
char *logfile_prefix; |
||||||
|
FILE *logfile; |
||||||
|
|
||||||
|
OutputFilter *filter; |
||||||
|
char *avfilter; |
||||||
|
char *filters; ///< filtergraph associated to the -filter option
|
||||||
|
char *filters_script; ///< filtergraph script associated to the -filter_script option
|
||||||
|
|
||||||
|
AVDictionary *encoder_opts; |
||||||
|
AVDictionary *sws_dict; |
||||||
|
AVDictionary *swr_opts; |
||||||
|
AVDictionary *resample_opts; |
||||||
|
char *apad; |
||||||
|
OSTFinished finished; /* no more packets should be written for this stream */ |
||||||
|
int unavailable; /* true if the steram is unavailable (possibly temporarily) */ |
||||||
|
int stream_copy; |
||||||
|
|
||||||
|
// init_output_stream() has been called for this stream
|
||||||
|
// The encoder and the bitstream filters have been initialized and the stream
|
||||||
|
// parameters are set in the AVStream.
|
||||||
|
int initialized; |
||||||
|
|
||||||
|
int inputs_done; |
||||||
|
|
||||||
|
const char *attachment_filename; |
||||||
|
int copy_initial_nonkeyframes; |
||||||
|
int copy_prior_start; |
||||||
|
char *disposition; |
||||||
|
|
||||||
|
int keep_pix_fmt; |
||||||
|
|
||||||
|
/* stats */ |
||||||
|
// combined size of all the packets written
|
||||||
|
uint64_t data_size; |
||||||
|
// number of packets send to the muxer
|
||||||
|
uint64_t packets_written; |
||||||
|
// number of frames/samples sent to the encoder
|
||||||
|
uint64_t frames_encoded; |
||||||
|
uint64_t samples_encoded; |
||||||
|
|
||||||
|
/* packet quality factor */ |
||||||
|
int quality; |
||||||
|
|
||||||
|
int max_muxing_queue_size; |
||||||
|
|
||||||
|
/* the packets are buffered here until the muxer is ready to be initialized */ |
||||||
|
AVFifoBuffer *muxing_queue; |
||||||
|
|
||||||
|
/*
|
||||||
|
* The size of the AVPackets' buffers in queue. |
||||||
|
* Updated when a packet is either pushed or pulled from the queue. |
||||||
|
*/ |
||||||
|
size_t muxing_queue_data_size; |
||||||
|
|
||||||
|
/* Threshold after which max_muxing_queue_size will be in effect */ |
||||||
|
size_t muxing_queue_data_threshold; |
||||||
|
|
||||||
|
/* packet picture type */ |
||||||
|
int pict_type; |
||||||
|
|
||||||
|
/* frame encode sum of squared error values */ |
||||||
|
int64_t error[4]; |
||||||
|
} OutputStream; |
||||||
|
|
||||||
|
typedef struct OutputFile { |
||||||
|
AVFormatContext *ctx; |
||||||
|
AVDictionary *opts; |
||||||
|
int ost_index; /* index of the first stream in output_streams */ |
||||||
|
int64_t recording_time; ///< desired length of the resulting file in microseconds == AV_TIME_BASE units
|
||||||
|
int64_t start_time; ///< start time in microseconds == AV_TIME_BASE units
|
||||||
|
uint64_t limit_filesize; /* filesize limit expressed in bytes */ |
||||||
|
|
||||||
|
int shortest; |
||||||
|
|
||||||
|
int header_written; |
||||||
|
} OutputFile; |
||||||
|
|
||||||
|
extern __thread InputStream **input_streams; |
||||||
|
extern __thread int nb_input_streams; |
||||||
|
extern __thread InputFile **input_files; |
||||||
|
extern __thread int nb_input_files; |
||||||
|
|
||||||
|
extern __thread OutputStream **output_streams; |
||||||
|
extern __thread int nb_output_streams; |
||||||
|
extern __thread OutputFile **output_files; |
||||||
|
extern __thread int nb_output_files; |
||||||
|
|
||||||
|
extern __thread FilterGraph **filtergraphs; |
||||||
|
extern __thread int nb_filtergraphs; |
||||||
|
|
||||||
|
extern __thread char *vstats_filename; |
||||||
|
extern __thread char *sdp_filename; |
||||||
|
|
||||||
|
extern __thread float audio_drift_threshold; |
||||||
|
extern __thread float dts_delta_threshold; |
||||||
|
extern __thread float dts_error_threshold; |
||||||
|
|
||||||
|
extern __thread int audio_volume; |
||||||
|
extern __thread int audio_sync_method; |
||||||
|
extern __thread int video_sync_method; |
||||||
|
extern __thread float frame_drop_threshold; |
||||||
|
extern __thread int do_benchmark; |
||||||
|
extern __thread int do_benchmark_all; |
||||||
|
extern __thread int do_deinterlace; |
||||||
|
extern __thread int do_hex_dump; |
||||||
|
extern __thread int do_pkt_dump; |
||||||
|
extern __thread int copy_ts; |
||||||
|
extern __thread int start_at_zero; |
||||||
|
extern __thread int copy_tb; |
||||||
|
extern __thread int debug_ts; |
||||||
|
extern __thread int exit_on_error; |
||||||
|
extern __thread int abort_on_flags; |
||||||
|
extern __thread int print_stats; |
||||||
|
extern __thread int64_t stats_period; |
||||||
|
extern __thread int qp_hist; |
||||||
|
extern __thread int stdin_interaction; |
||||||
|
extern __thread int frame_bits_per_raw_sample; |
||||||
|
extern __thread AVIOContext *progress_avio; |
||||||
|
extern __thread float max_error_rate; |
||||||
|
extern __thread char *videotoolbox_pixfmt; |
||||||
|
|
||||||
|
extern __thread int filter_nbthreads; |
||||||
|
extern __thread int filter_complex_nbthreads; |
||||||
|
extern __thread int vstats_version; |
||||||
|
extern __thread int auto_conversion_filters; |
||||||
|
|
||||||
|
extern __thread const AVIOInterruptCB int_cb; |
||||||
|
|
||||||
|
extern const HWAccel hwaccels[]; |
||||||
|
#if CONFIG_QSV |
||||||
|
extern __thread char *qsv_device; |
||||||
|
#endif |
||||||
|
extern __thread HWDevice *filter_hw_device; |
||||||
|
|
||||||
|
void term_init(void); |
||||||
|
void term_exit(void); |
||||||
|
|
||||||
|
void reset_options(OptionsContext *o, int is_input); |
||||||
|
void show_usage(void); |
||||||
|
|
||||||
|
void opt_output_file(void *optctx, const char *filename); |
||||||
|
|
||||||
|
void remove_avoptions(AVDictionary **a, AVDictionary *b); |
||||||
|
void assert_avoptions(AVDictionary *m); |
||||||
|
|
||||||
|
int guess_input_channel_layout(InputStream *ist); |
||||||
|
|
||||||
|
enum AVPixelFormat choose_pixel_fmt(AVStream *st, AVCodecContext *avctx, const AVCodec *codec, enum AVPixelFormat target); |
||||||
|
void choose_sample_fmt(AVStream *st, const AVCodec *codec); |
||||||
|
|
||||||
|
int configure_filtergraph(FilterGraph *fg); |
||||||
|
int configure_output_filter(FilterGraph *fg, OutputFilter *ofilter, AVFilterInOut *out); |
||||||
|
void check_filter_outputs(void); |
||||||
|
int ist_in_filtergraph(FilterGraph *fg, InputStream *ist); |
||||||
|
int filtergraph_is_simple(FilterGraph *fg); |
||||||
|
int init_simple_filtergraph(InputStream *ist, OutputStream *ost); |
||||||
|
int init_complex_filtergraph(FilterGraph *fg); |
||||||
|
|
||||||
|
void sub2video_update(InputStream *ist, int64_t heartbeat_pts, AVSubtitle *sub); |
||||||
|
|
||||||
|
int ifilter_parameters_from_frame(InputFilter *ifilter, const AVFrame *frame); |
||||||
|
|
||||||
|
int ffmpeg_parse_options(int argc, char **argv); |
||||||
|
|
||||||
|
int videotoolbox_init(AVCodecContext *s); |
||||||
|
int qsv_init(AVCodecContext *s); |
||||||
|
|
||||||
|
HWDevice *hw_device_get_by_name(const char *name); |
||||||
|
int hw_device_init_from_string(const char *arg, HWDevice **dev); |
||||||
|
void hw_device_free_all(void); |
||||||
|
|
||||||
|
int hw_device_setup_for_decode(InputStream *ist); |
||||||
|
int hw_device_setup_for_encode(OutputStream *ost); |
||||||
|
int hw_device_setup_for_filter(FilterGraph *fg); |
||||||
|
|
||||||
|
int hwaccel_decode_init(AVCodecContext *avctx); |
||||||
|
|
||||||
|
void set_report_callback(void (*callback)(int, float, float, int64_t, int, double, double)); |
||||||
|
|
||||||
|
void cancel_operation(long id); |
||||||
|
|
||||||
|
int opt_map(void *optctx, const char *opt, const char *arg); |
||||||
|
int opt_map_channel(void *optctx, const char *opt, const char *arg); |
||||||
|
int opt_recording_timestamp(void *optctx, const char *opt, const char *arg); |
||||||
|
int opt_data_frames(void *optctx, const char *opt, const char *arg); |
||||||
|
int opt_progress(void *optctx, const char *opt, const char *arg); |
||||||
|
int opt_target(void *optctx, const char *opt, const char *arg); |
||||||
|
int opt_vsync(void *optctx, const char *opt, const char *arg); |
||||||
|
int opt_abort_on(void *optctx, const char *opt, const char *arg); |
||||||
|
int opt_stats_period(void *optctx, const char *opt, const char *arg); |
||||||
|
int opt_qscale(void *optctx, const char *opt, const char *arg); |
||||||
|
int opt_profile(void *optctx, const char *opt, const char *arg); |
||||||
|
int opt_filter_complex(void *optctx, const char *opt, const char *arg); |
||||||
|
int opt_filter_complex_script(void *optctx, const char *opt, const char *arg); |
||||||
|
int opt_attach(void *optctx, const char *opt, const char *arg); |
||||||
|
int opt_video_frames(void *optctx, const char *opt, const char *arg); |
||||||
|
int opt_video_codec(void *optctx, const char *opt, const char *arg); |
||||||
|
int opt_sameq(void *optctx, const char *opt, const char *arg); |
||||||
|
int opt_timecode(void *optctx, const char *opt, const char *arg); |
||||||
|
|
||||||
|
int opt_vstats_file(void *optctx, const char *opt, const char *arg); |
||||||
|
int opt_vstats(void *optctx, const char *opt, const char *arg); |
||||||
|
int opt_video_frames(void *optctx, const char *opt, const char *arg); |
||||||
|
int opt_old2new(void *optctx, const char *opt, const char *arg); |
||||||
|
int opt_streamid(void *optctx, const char *opt, const char *arg); |
||||||
|
int opt_bitrate(void *optctx, const char *opt, const char *arg); |
||||||
|
int show_hwaccels(void *optctx, const char *opt, const char *arg); |
||||||
|
int opt_video_filters(void *optctx, const char *opt, const char *arg); |
||||||
|
int opt_audio_frames(void *optctx, const char *opt, const char *arg); |
||||||
|
int opt_audio_qscale(void *optctx, const char *opt, const char *arg); |
||||||
|
int opt_audio_codec(void *optctx, const char *opt, const char *arg); |
||||||
|
int opt_channel_layout(void *optctx, const char *opt, const char *arg); |
||||||
|
int opt_preset(void *optctx, const char *opt, const char *arg); |
||||||
|
int opt_audio_filters(void *optctx, const char *opt, const char *arg); |
||||||
|
int opt_subtitle_codec(void *optctx, const char *opt, const char *arg); |
||||||
|
int opt_video_channel(void *optctx, const char *opt, const char *arg); |
||||||
|
int opt_video_standard(void *optctx, const char *opt, const char *arg); |
||||||
|
int opt_sdp_file(void *optctx, const char *opt, const char *arg); |
||||||
|
int opt_data_codec(void *optctx, const char *opt, const char *arg); |
||||||
|
int opt_init_hw_device(void *optctx, const char *opt, const char *arg); |
||||||
|
int opt_filter_hw_device(void *optctx, const char *opt, const char *arg); |
||||||
|
void add_input_streams(OptionsContext *o, AVFormatContext *ic); |
||||||
|
void assert_file_overwrite(const char *filename); |
||||||
|
void dump_attachment(AVStream *st, const char *filename); |
||||||
|
uint8_t *get_line(AVIOContext *s); |
||||||
|
void uninit_options(OptionsContext *o); |
||||||
|
void init_options(OptionsContext *o); |
||||||
|
AVDictionary *strip_specifiers(AVDictionary *dict); |
||||||
|
void parse_meta_type(char *arg, char *type, int *index, const char **stream_spec); |
||||||
|
int fftools_copy_metadata(char *outspec, char *inspec, AVFormatContext *oc, AVFormatContext *ic, OptionsContext *o); |
||||||
|
const AVCodec *find_codec_or_die(const char *name, enum AVMediaType type, int encoder); |
||||||
|
const AVCodec *choose_decoder(OptionsContext *o, AVFormatContext *s, AVStream *st); |
||||||
|
int open_input_file(OptionsContext *o, const char *filename); |
||||||
|
int get_preset_file_2(const char *preset_name, const char *codec_name, AVIOContext **s); |
||||||
|
int choose_encoder(OptionsContext *o, AVFormatContext *s, OutputStream *ost); |
||||||
|
OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, enum AVMediaType type, int source_index); |
||||||
|
void parse_matrix_coeffs(uint16_t *dest, const char *str); |
||||||
|
uint8_t *fftools_read_file(const char *filename); |
||||||
|
char *get_ost_filters(OptionsContext *o, AVFormatContext *oc, OutputStream *ost); |
||||||
|
void check_streamcopy_filters(OptionsContext *o, AVFormatContext *oc, const OutputStream *ost, enum AVMediaType type); |
||||||
|
OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc, int source_index); |
||||||
|
OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc, int source_index); |
||||||
|
OutputStream *new_data_stream(OptionsContext *o, AVFormatContext *oc, int source_index); |
||||||
|
OutputStream *new_unknown_stream(OptionsContext *o, AVFormatContext *oc, int source_index); |
||||||
|
OutputStream *new_attachment_stream(OptionsContext *o, AVFormatContext *oc, int source_index); |
||||||
|
OutputStream *new_subtitle_stream(OptionsContext *o, AVFormatContext *oc, int source_index); |
||||||
|
int copy_chapters(InputFile *ifile, OutputFile *ofile, int copy_metadata); |
||||||
|
void init_output_filter(OutputFilter *ofilter, OptionsContext *o, AVFormatContext *oc); |
||||||
|
int init_complex_filters(void); |
||||||
|
int open_output_file(OptionsContext *o, const char *filename); |
||||||
|
int opt_default_new(OptionsContext *o, const char *opt, const char *arg); |
||||||
|
int open_files(OptionGroupList *l, const char *inout, int (*open_file)(OptionsContext*, const char*)); |
||||||
|
|
||||||
|
#endif /* FFTOOLS_FFMPEG_H */ |
||||||
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,572 @@ |
|||||||
|
/*
|
||||||
|
* This file is part of FFmpeg. |
||||||
|
* |
||||||
|
* FFmpeg is free software; you can redistribute it and/or |
||||||
|
* modify it under the terms of the GNU Lesser General Public |
||||||
|
* License as published by the Free Software Foundation; either |
||||||
|
* version 2.1 of the License, or (at your option) any later version. |
||||||
|
* |
||||||
|
* FFmpeg is distributed in the hope that it will be useful, |
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
||||||
|
* Lesser General Public License for more details. |
||||||
|
* |
||||||
|
* You should have received a copy of the GNU Lesser General Public |
||||||
|
* License along with FFmpeg; if not, write to the Free Software |
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
||||||
|
*/ |
||||||
|
|
||||||
|
/*
|
||||||
|
* CHANGES 12.2019 |
||||||
|
* - Concurrent execution support |
||||||
|
* |
||||||
|
* CHANGES 08.2018 |
||||||
|
* -------------------------------------------------------- |
||||||
|
* - fftools_ prefix added to file name and parent header |
||||||
|
*/ |
||||||
|
|
||||||
|
#include <string.h> |
||||||
|
|
||||||
|
#include "libavutil/avstring.h" |
||||||
|
#include "libavutil/pixdesc.h" |
||||||
|
#include "libavfilter/buffersink.h" |
||||||
|
|
||||||
|
#include "fftools_ffmpeg.h" |
||||||
|
|
||||||
|
__thread int nb_hw_devices; |
||||||
|
__thread HWDevice **hw_devices; |
||||||
|
|
||||||
|
static HWDevice *hw_device_get_by_type(enum AVHWDeviceType type) |
||||||
|
{ |
||||||
|
HWDevice *found = NULL; |
||||||
|
int i; |
||||||
|
for (i = 0; i < nb_hw_devices; i++) { |
||||||
|
if (hw_devices[i]->type == type) { |
||||||
|
if (found) |
||||||
|
return NULL; |
||||||
|
found = hw_devices[i]; |
||||||
|
} |
||||||
|
} |
||||||
|
return found; |
||||||
|
} |
||||||
|
|
||||||
|
HWDevice *hw_device_get_by_name(const char *name) |
||||||
|
{ |
||||||
|
int i; |
||||||
|
for (i = 0; i < nb_hw_devices; i++) { |
||||||
|
if (!strcmp(hw_devices[i]->name, name)) |
||||||
|
return hw_devices[i]; |
||||||
|
} |
||||||
|
return NULL; |
||||||
|
} |
||||||
|
|
||||||
|
static HWDevice *hw_device_add(void) |
||||||
|
{ |
||||||
|
int err; |
||||||
|
err = av_reallocp_array(&hw_devices, nb_hw_devices + 1, |
||||||
|
sizeof(*hw_devices)); |
||||||
|
if (err) { |
||||||
|
nb_hw_devices = 0; |
||||||
|
return NULL; |
||||||
|
} |
||||||
|
hw_devices[nb_hw_devices] = av_mallocz(sizeof(HWDevice)); |
||||||
|
if (!hw_devices[nb_hw_devices]) |
||||||
|
return NULL; |
||||||
|
return hw_devices[nb_hw_devices++]; |
||||||
|
} |
||||||
|
|
||||||
|
static char *hw_device_default_name(enum AVHWDeviceType type) |
||||||
|
{ |
||||||
|
// Make an automatic name of the form "type%d". We arbitrarily
|
||||||
|
// limit at 1000 anonymous devices of the same type - there is
|
||||||
|
// probably something else very wrong if you get to this limit.
|
||||||
|
const char *type_name = av_hwdevice_get_type_name(type); |
||||||
|
char *name; |
||||||
|
size_t index_pos; |
||||||
|
int index, index_limit = 1000; |
||||||
|
index_pos = strlen(type_name); |
||||||
|
name = av_malloc(index_pos + 4); |
||||||
|
if (!name) |
||||||
|
return NULL; |
||||||
|
for (index = 0; index < index_limit; index++) { |
||||||
|
snprintf(name, index_pos + 4, "%s%d", type_name, index); |
||||||
|
if (!hw_device_get_by_name(name)) |
||||||
|
break; |
||||||
|
} |
||||||
|
if (index >= index_limit) { |
||||||
|
av_freep(&name); |
||||||
|
return NULL; |
||||||
|
} |
||||||
|
return name; |
||||||
|
} |
||||||
|
|
||||||
|
int hw_device_init_from_string(const char *arg, HWDevice **dev_out) |
||||||
|
{ |
||||||
|
// "type=name:device,key=value,key2=value2"
|
||||||
|
// "type:device,key=value,key2=value2"
|
||||||
|
// -> av_hwdevice_ctx_create()
|
||||||
|
// "type=name@name"
|
||||||
|
// "type@name"
|
||||||
|
// -> av_hwdevice_ctx_create_derived()
|
||||||
|
|
||||||
|
AVDictionary *options = NULL; |
||||||
|
const char *type_name = NULL, *name = NULL, *device = NULL; |
||||||
|
enum AVHWDeviceType type; |
||||||
|
HWDevice *dev, *src; |
||||||
|
AVBufferRef *device_ref = NULL; |
||||||
|
int err; |
||||||
|
const char *errmsg, *p, *q; |
||||||
|
size_t k; |
||||||
|
|
||||||
|
k = strcspn(arg, ":=@"); |
||||||
|
p = arg + k; |
||||||
|
|
||||||
|
type_name = av_strndup(arg, k); |
||||||
|
if (!type_name) { |
||||||
|
err = AVERROR(ENOMEM); |
||||||
|
goto fail; |
||||||
|
} |
||||||
|
type = av_hwdevice_find_type_by_name(type_name); |
||||||
|
if (type == AV_HWDEVICE_TYPE_NONE) { |
||||||
|
errmsg = "unknown device type"; |
||||||
|
goto invalid; |
||||||
|
} |
||||||
|
|
||||||
|
if (*p == '=') { |
||||||
|
k = strcspn(p + 1, ":@"); |
||||||
|
|
||||||
|
name = av_strndup(p + 1, k); |
||||||
|
if (!name) { |
||||||
|
err = AVERROR(ENOMEM); |
||||||
|
goto fail; |
||||||
|
} |
||||||
|
if (hw_device_get_by_name(name)) { |
||||||
|
errmsg = "named device already exists"; |
||||||
|
goto invalid; |
||||||
|
} |
||||||
|
|
||||||
|
p += 1 + k; |
||||||
|
} else { |
||||||
|
name = hw_device_default_name(type); |
||||||
|
if (!name) { |
||||||
|
err = AVERROR(ENOMEM); |
||||||
|
goto fail; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if (!*p) { |
||||||
|
// New device with no parameters.
|
||||||
|
err = av_hwdevice_ctx_create(&device_ref, type, |
||||||
|
NULL, NULL, 0); |
||||||
|
if (err < 0) |
||||||
|
goto fail; |
||||||
|
|
||||||
|
} else if (*p == ':') { |
||||||
|
// New device with some parameters.
|
||||||
|
++p; |
||||||
|
q = strchr(p, ','); |
||||||
|
if (q) { |
||||||
|
if (q - p > 0) { |
||||||
|
device = av_strndup(p, q - p); |
||||||
|
if (!device) { |
||||||
|
err = AVERROR(ENOMEM); |
||||||
|
goto fail; |
||||||
|
} |
||||||
|
} |
||||||
|
err = av_dict_parse_string(&options, q + 1, "=", ",", 0); |
||||||
|
if (err < 0) { |
||||||
|
errmsg = "failed to parse options"; |
||||||
|
goto invalid; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
err = av_hwdevice_ctx_create(&device_ref, type, |
||||||
|
q ? device : p[0] ? p : NULL, |
||||||
|
options, 0); |
||||||
|
if (err < 0) |
||||||
|
goto fail; |
||||||
|
|
||||||
|
} else if (*p == '@') { |
||||||
|
// Derive from existing device.
|
||||||
|
|
||||||
|
src = hw_device_get_by_name(p + 1); |
||||||
|
if (!src) { |
||||||
|
errmsg = "invalid source device name"; |
||||||
|
goto invalid; |
||||||
|
} |
||||||
|
|
||||||
|
err = av_hwdevice_ctx_create_derived(&device_ref, type, |
||||||
|
src->device_ref, 0); |
||||||
|
if (err < 0) |
||||||
|
goto fail; |
||||||
|
} else { |
||||||
|
errmsg = "parse error"; |
||||||
|
goto invalid; |
||||||
|
} |
||||||
|
|
||||||
|
dev = hw_device_add(); |
||||||
|
if (!dev) { |
||||||
|
err = AVERROR(ENOMEM); |
||||||
|
goto fail; |
||||||
|
} |
||||||
|
|
||||||
|
dev->name = name; |
||||||
|
dev->type = type; |
||||||
|
dev->device_ref = device_ref; |
||||||
|
|
||||||
|
if (dev_out) |
||||||
|
*dev_out = dev; |
||||||
|
|
||||||
|
name = NULL; |
||||||
|
err = 0; |
||||||
|
done: |
||||||
|
av_freep(&type_name); |
||||||
|
av_freep(&name); |
||||||
|
av_freep(&device); |
||||||
|
av_dict_free(&options); |
||||||
|
return err; |
||||||
|
invalid: |
||||||
|
av_log(NULL, AV_LOG_ERROR, |
||||||
|
"Invalid device specification \"%s\": %s\n", arg, errmsg); |
||||||
|
err = AVERROR(EINVAL); |
||||||
|
goto done; |
||||||
|
fail: |
||||||
|
av_log(NULL, AV_LOG_ERROR, |
||||||
|
"Device creation failed: %d.\n", err); |
||||||
|
av_buffer_unref(&device_ref); |
||||||
|
goto done; |
||||||
|
} |
||||||
|
|
||||||
|
static int hw_device_init_from_type(enum AVHWDeviceType type, |
||||||
|
const char *device, |
||||||
|
HWDevice **dev_out) |
||||||
|
{ |
||||||
|
AVBufferRef *device_ref = NULL; |
||||||
|
HWDevice *dev; |
||||||
|
char *name; |
||||||
|
int err; |
||||||
|
|
||||||
|
name = hw_device_default_name(type); |
||||||
|
if (!name) { |
||||||
|
err = AVERROR(ENOMEM); |
||||||
|
goto fail; |
||||||
|
} |
||||||
|
|
||||||
|
err = av_hwdevice_ctx_create(&device_ref, type, device, NULL, 0); |
||||||
|
if (err < 0) { |
||||||
|
av_log(NULL, AV_LOG_ERROR, |
||||||
|
"Device creation failed: %d.\n", err); |
||||||
|
goto fail; |
||||||
|
} |
||||||
|
|
||||||
|
dev = hw_device_add(); |
||||||
|
if (!dev) { |
||||||
|
err = AVERROR(ENOMEM); |
||||||
|
goto fail; |
||||||
|
} |
||||||
|
|
||||||
|
dev->name = name; |
||||||
|
dev->type = type; |
||||||
|
dev->device_ref = device_ref; |
||||||
|
|
||||||
|
if (dev_out) |
||||||
|
*dev_out = dev; |
||||||
|
|
||||||
|
return 0; |
||||||
|
|
||||||
|
fail: |
||||||
|
av_freep(&name); |
||||||
|
av_buffer_unref(&device_ref); |
||||||
|
return err; |
||||||
|
} |
||||||
|
|
||||||
|
void hw_device_free_all(void) |
||||||
|
{ |
||||||
|
int i; |
||||||
|
for (i = 0; i < nb_hw_devices; i++) { |
||||||
|
av_freep(&hw_devices[i]->name); |
||||||
|
av_buffer_unref(&hw_devices[i]->device_ref); |
||||||
|
av_freep(&hw_devices[i]); |
||||||
|
} |
||||||
|
av_freep(&hw_devices); |
||||||
|
nb_hw_devices = 0; |
||||||
|
} |
||||||
|
|
||||||
|
static HWDevice *hw_device_match_by_codec(const AVCodec *codec) |
||||||
|
{ |
||||||
|
const AVCodecHWConfig *config; |
||||||
|
HWDevice *dev; |
||||||
|
int i; |
||||||
|
for (i = 0;; i++) { |
||||||
|
config = avcodec_get_hw_config(codec, i); |
||||||
|
if (!config) |
||||||
|
return NULL; |
||||||
|
if (!(config->methods & AV_CODEC_HW_CONFIG_METHOD_HW_DEVICE_CTX)) |
||||||
|
continue; |
||||||
|
dev = hw_device_get_by_type(config->device_type); |
||||||
|
if (dev) |
||||||
|
return dev; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
int hw_device_setup_for_decode(InputStream *ist) |
||||||
|
{ |
||||||
|
const AVCodecHWConfig *config; |
||||||
|
enum AVHWDeviceType type; |
||||||
|
HWDevice *dev = NULL; |
||||||
|
int err, auto_device = 0; |
||||||
|
|
||||||
|
if (ist->hwaccel_device) { |
||||||
|
dev = hw_device_get_by_name(ist->hwaccel_device); |
||||||
|
if (!dev) { |
||||||
|
if (ist->hwaccel_id == HWACCEL_AUTO) { |
||||||
|
auto_device = 1; |
||||||
|
} else if (ist->hwaccel_id == HWACCEL_GENERIC) { |
||||||
|
type = ist->hwaccel_device_type; |
||||||
|
err = hw_device_init_from_type(type, ist->hwaccel_device, |
||||||
|
&dev); |
||||||
|
} else { |
||||||
|
// This will be dealt with by API-specific initialisation
|
||||||
|
// (using hwaccel_device), so nothing further needed here.
|
||||||
|
return 0; |
||||||
|
} |
||||||
|
} else { |
||||||
|
if (ist->hwaccel_id == HWACCEL_AUTO) { |
||||||
|
ist->hwaccel_device_type = dev->type; |
||||||
|
} else if (ist->hwaccel_device_type != dev->type) { |
||||||
|
av_log(ist->dec_ctx, AV_LOG_ERROR, "Invalid hwaccel device " |
||||||
|
"specified for decoder: device %s of type %s is not " |
||||||
|
"usable with hwaccel %s.\n", dev->name, |
||||||
|
av_hwdevice_get_type_name(dev->type), |
||||||
|
av_hwdevice_get_type_name(ist->hwaccel_device_type)); |
||||||
|
return AVERROR(EINVAL); |
||||||
|
} |
||||||
|
} |
||||||
|
} else { |
||||||
|
if (ist->hwaccel_id == HWACCEL_AUTO) { |
||||||
|
auto_device = 1; |
||||||
|
} else if (ist->hwaccel_id == HWACCEL_GENERIC) { |
||||||
|
type = ist->hwaccel_device_type; |
||||||
|
dev = hw_device_get_by_type(type); |
||||||
|
|
||||||
|
// When "-qsv_device device" is used, an internal QSV device named
|
||||||
|
// as "__qsv_device" is created. Another QSV device is created too
|
||||||
|
// if "-init_hw_device qsv=name:device" is used. There are 2 QSV devices
|
||||||
|
// if both "-qsv_device device" and "-init_hw_device qsv=name:device"
|
||||||
|
// are used, hw_device_get_by_type(AV_HWDEVICE_TYPE_QSV) returns NULL.
|
||||||
|
// To keep back-compatibility with the removed ad-hoc libmfx setup code,
|
||||||
|
// call hw_device_get_by_name("__qsv_device") to select the internal QSV
|
||||||
|
// device.
|
||||||
|
if (!dev && type == AV_HWDEVICE_TYPE_QSV) |
||||||
|
dev = hw_device_get_by_name("__qsv_device"); |
||||||
|
|
||||||
|
if (!dev) |
||||||
|
err = hw_device_init_from_type(type, NULL, &dev); |
||||||
|
} else { |
||||||
|
dev = hw_device_match_by_codec(ist->dec); |
||||||
|
if (!dev) { |
||||||
|
// No device for this codec, but not using generic hwaccel
|
||||||
|
// and therefore may well not need one - ignore.
|
||||||
|
return 0; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if (auto_device) { |
||||||
|
int i; |
||||||
|
if (!avcodec_get_hw_config(ist->dec, 0)) { |
||||||
|
// Decoder does not support any hardware devices.
|
||||||
|
return 0; |
||||||
|
} |
||||||
|
for (i = 0; !dev; i++) { |
||||||
|
config = avcodec_get_hw_config(ist->dec, i); |
||||||
|
if (!config) |
||||||
|
break; |
||||||
|
type = config->device_type; |
||||||
|
dev = hw_device_get_by_type(type); |
||||||
|
if (dev) { |
||||||
|
av_log(ist->dec_ctx, AV_LOG_INFO, "Using auto " |
||||||
|
"hwaccel type %s with existing device %s.\n", |
||||||
|
av_hwdevice_get_type_name(type), dev->name); |
||||||
|
} |
||||||
|
} |
||||||
|
for (i = 0; !dev; i++) { |
||||||
|
config = avcodec_get_hw_config(ist->dec, i); |
||||||
|
if (!config) |
||||||
|
break; |
||||||
|
type = config->device_type; |
||||||
|
// Try to make a new device of this type.
|
||||||
|
err = hw_device_init_from_type(type, ist->hwaccel_device, |
||||||
|
&dev); |
||||||
|
if (err < 0) { |
||||||
|
// Can't make a device of this type.
|
||||||
|
continue; |
||||||
|
} |
||||||
|
if (ist->hwaccel_device) { |
||||||
|
av_log(ist->dec_ctx, AV_LOG_INFO, "Using auto " |
||||||
|
"hwaccel type %s with new device created " |
||||||
|
"from %s.\n", av_hwdevice_get_type_name(type), |
||||||
|
ist->hwaccel_device); |
||||||
|
} else { |
||||||
|
av_log(ist->dec_ctx, AV_LOG_INFO, "Using auto " |
||||||
|
"hwaccel type %s with new default device.\n", |
||||||
|
av_hwdevice_get_type_name(type)); |
||||||
|
} |
||||||
|
} |
||||||
|
if (dev) { |
||||||
|
ist->hwaccel_device_type = type; |
||||||
|
} else { |
||||||
|
av_log(ist->dec_ctx, AV_LOG_INFO, "Auto hwaccel " |
||||||
|
"disabled: no device found.\n"); |
||||||
|
ist->hwaccel_id = HWACCEL_NONE; |
||||||
|
return 0; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if (!dev) { |
||||||
|
av_log(ist->dec_ctx, AV_LOG_ERROR, "No device available " |
||||||
|
"for decoder: device type %s needed for codec %s.\n", |
||||||
|
av_hwdevice_get_type_name(type), ist->dec->name); |
||||||
|
return err; |
||||||
|
} |
||||||
|
|
||||||
|
ist->dec_ctx->hw_device_ctx = av_buffer_ref(dev->device_ref); |
||||||
|
if (!ist->dec_ctx->hw_device_ctx) |
||||||
|
return AVERROR(ENOMEM); |
||||||
|
|
||||||
|
return 0; |
||||||
|
} |
||||||
|
|
||||||
|
int hw_device_setup_for_encode(OutputStream *ost) |
||||||
|
{ |
||||||
|
const AVCodecHWConfig *config; |
||||||
|
HWDevice *dev = NULL; |
||||||
|
AVBufferRef *frames_ref = NULL; |
||||||
|
int i; |
||||||
|
|
||||||
|
if (ost->filter) { |
||||||
|
frames_ref = av_buffersink_get_hw_frames_ctx(ost->filter->filter); |
||||||
|
if (frames_ref && |
||||||
|
((AVHWFramesContext*)frames_ref->data)->format == |
||||||
|
ost->enc_ctx->pix_fmt) { |
||||||
|
// Matching format, will try to use hw_frames_ctx.
|
||||||
|
} else { |
||||||
|
frames_ref = NULL; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
for (i = 0;; i++) { |
||||||
|
config = avcodec_get_hw_config(ost->enc, i); |
||||||
|
if (!config) |
||||||
|
break; |
||||||
|
|
||||||
|
if (frames_ref && |
||||||
|
config->methods & AV_CODEC_HW_CONFIG_METHOD_HW_FRAMES_CTX && |
||||||
|
(config->pix_fmt == AV_PIX_FMT_NONE || |
||||||
|
config->pix_fmt == ost->enc_ctx->pix_fmt)) { |
||||||
|
av_log(ost->enc_ctx, AV_LOG_VERBOSE, "Using input " |
||||||
|
"frames context (format %s) with %s encoder.\n", |
||||||
|
av_get_pix_fmt_name(ost->enc_ctx->pix_fmt), |
||||||
|
ost->enc->name); |
||||||
|
ost->enc_ctx->hw_frames_ctx = av_buffer_ref(frames_ref); |
||||||
|
if (!ost->enc_ctx->hw_frames_ctx) |
||||||
|
return AVERROR(ENOMEM); |
||||||
|
return 0; |
||||||
|
} |
||||||
|
|
||||||
|
if (!dev && |
||||||
|
config->methods & AV_CODEC_HW_CONFIG_METHOD_HW_DEVICE_CTX) |
||||||
|
dev = hw_device_get_by_type(config->device_type); |
||||||
|
} |
||||||
|
|
||||||
|
if (dev) { |
||||||
|
av_log(ost->enc_ctx, AV_LOG_VERBOSE, "Using device %s " |
||||||
|
"(type %s) with %s encoder.\n", dev->name, |
||||||
|
av_hwdevice_get_type_name(dev->type), ost->enc->name); |
||||||
|
ost->enc_ctx->hw_device_ctx = av_buffer_ref(dev->device_ref); |
||||||
|
if (!ost->enc_ctx->hw_device_ctx) |
||||||
|
return AVERROR(ENOMEM); |
||||||
|
} else { |
||||||
|
// No device required, or no device available.
|
||||||
|
} |
||||||
|
return 0; |
||||||
|
} |
||||||
|
|
||||||
|
static int hwaccel_retrieve_data(AVCodecContext *avctx, AVFrame *input) |
||||||
|
{ |
||||||
|
InputStream *ist = avctx->opaque; |
||||||
|
AVFrame *output = NULL; |
||||||
|
enum AVPixelFormat output_format = ist->hwaccel_output_format; |
||||||
|
int err; |
||||||
|
|
||||||
|
if (input->format == output_format) { |
||||||
|
// Nothing to do.
|
||||||
|
return 0; |
||||||
|
} |
||||||
|
|
||||||
|
output = av_frame_alloc(); |
||||||
|
if (!output) |
||||||
|
return AVERROR(ENOMEM); |
||||||
|
|
||||||
|
output->format = output_format; |
||||||
|
|
||||||
|
err = av_hwframe_transfer_data(output, input, 0); |
||||||
|
if (err < 0) { |
||||||
|
av_log(avctx, AV_LOG_ERROR, "Failed to transfer data to " |
||||||
|
"output frame: %d.\n", err); |
||||||
|
goto fail; |
||||||
|
} |
||||||
|
|
||||||
|
err = av_frame_copy_props(output, input); |
||||||
|
if (err < 0) { |
||||||
|
av_frame_unref(output); |
||||||
|
goto fail; |
||||||
|
} |
||||||
|
|
||||||
|
av_frame_unref(input); |
||||||
|
av_frame_move_ref(input, output); |
||||||
|
av_frame_free(&output); |
||||||
|
|
||||||
|
return 0; |
||||||
|
|
||||||
|
fail: |
||||||
|
av_frame_free(&output); |
||||||
|
return err; |
||||||
|
} |
||||||
|
|
||||||
|
int hwaccel_decode_init(AVCodecContext *avctx) |
||||||
|
{ |
||||||
|
InputStream *ist = avctx->opaque; |
||||||
|
|
||||||
|
ist->hwaccel_retrieve_data = &hwaccel_retrieve_data; |
||||||
|
|
||||||
|
return 0; |
||||||
|
} |
||||||
|
|
||||||
|
int hw_device_setup_for_filter(FilterGraph *fg) |
||||||
|
{ |
||||||
|
HWDevice *dev; |
||||||
|
int i; |
||||||
|
|
||||||
|
// If the user has supplied exactly one hardware device then just
|
||||||
|
// give it straight to every filter for convenience. If more than
|
||||||
|
// one device is available then the user needs to pick one explcitly
|
||||||
|
// with the filter_hw_device option.
|
||||||
|
if (filter_hw_device) |
||||||
|
dev = filter_hw_device; |
||||||
|
else if (nb_hw_devices == 1) |
||||||
|
dev = hw_devices[0]; |
||||||
|
else |
||||||
|
dev = NULL; |
||||||
|
|
||||||
|
if (dev) { |
||||||
|
for (i = 0; i < fg->graph->nb_filters; i++) { |
||||||
|
fg->graph->filters[i]->hw_device_ctx = |
||||||
|
av_buffer_ref(dev->device_ref); |
||||||
|
if (!fg->graph->filters[i]->hw_device_ctx) |
||||||
|
return AVERROR(ENOMEM); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
return 0; |
||||||
|
} |
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Loading…
Reference in new issue