diff options
Diffstat (limited to 'debian/transcode/transcode-1.1.7/docs/tech')
22 files changed, 3986 insertions, 0 deletions
diff --git a/debian/transcode/transcode-1.1.7/docs/tech/Makefile.am b/debian/transcode/transcode-1.1.7/docs/tech/Makefile.am new file mode 100644 index 00000000..e0efc8ce --- /dev/null +++ b/debian/transcode/transcode-1.1.7/docs/tech/Makefile.am @@ -0,0 +1,22 @@ +# # Process this file with automake to produce Makefile.in. + +EXTRA_DIST = \ + $(docs_DATA) + +SUBDIRS = html + +docsdir = $(datadir)/doc/transcode/tech + +docs_DATA = \ + OPTIMIZERS \ + architecture.txt \ + avi_comments.txt \ + clone.txt \ + export-API.txt \ + filter-API.txt \ + ibp_support.txt \ + import-API.txt \ + libraries.txt \ + module-system-API.txt \ + filter_template.c + diff --git a/debian/transcode/transcode-1.1.7/docs/tech/Makefile.in b/debian/transcode/transcode-1.1.7/docs/tech/Makefile.in new file mode 100644 index 00000000..d59f6aa6 --- /dev/null +++ b/debian/transcode/transcode-1.1.7/docs/tech/Makefile.in @@ -0,0 +1,727 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ + +# # Process this file with automake to produce Makefile.in. + +VPATH = @srcdir@ +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@ +target_triplet = @target@ +subdir = docs/tech +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-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 uninstall-recursive +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__installdirs = "$(DESTDIR)$(docsdir)" +DATA = $(docs_DATA) +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ + $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ + distdir +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +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" +A52_CFLAGS = @A52_CFLAGS@ +A52_LIBS = @A52_LIBS@ +ACLIB_LIBS = @ACLIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ALTIVEC_CFLAGS = @ALTIVEC_CFLAGS@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AVILIB_LIBS = @AVILIB_LIBS@ +AWK = @AWK@ +BSDAV_CFLAGS = @BSDAV_CFLAGS@ +BSDAV_LIBS = @BSDAV_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXXCPP = @CXXCPP@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLDARWIN_CFLAGS = @DLDARWIN_CFLAGS@ +DLDARWIN_LIBS = @DLDARWIN_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FAAC_CFLAGS = @FAAC_CFLAGS@ +FAAC_LIBS = @FAAC_LIBS@ +FGREP = @FGREP@ +FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@ +FREETYPE2_LIBS = @FREETYPE2_LIBS@ +GREP = @GREP@ +IBP_LIBS = @IBP_LIBS@ +ICONV_CFLAGS = @ICONV_CFLAGS@ +ICONV_LIBS = @ICONV_LIBS@ +IMAGEMAGICK_CFLAGS = @IMAGEMAGICK_CFLAGS@ +IMAGEMAGICK_LIBS = @IMAGEMAGICK_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LAME_CFLAGS = @LAME_CFLAGS@ +LAME_LIBS = @LAME_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBAVCODEC_CFLAGS = @LIBAVCODEC_CFLAGS@ +LIBAVCODEC_LIBS = @LIBAVCODEC_LIBS@ +LIBAVFORMAT_CFLAGS = @LIBAVFORMAT_CFLAGS@ +LIBAVFORMAT_LIBS = @LIBAVFORMAT_LIBS@ +LIBDVDREAD_CFLAGS = @LIBDVDREAD_CFLAGS@ +LIBDVDREAD_LIBS = @LIBDVDREAD_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBJPEG_CFLAGS = @LIBJPEG_CFLAGS@ +LIBJPEG_LIBS = @LIBJPEG_LIBS@ +LIBMPEG2CONVERT_CFLAGS = @LIBMPEG2CONVERT_CFLAGS@ +LIBMPEG2CONVERT_LIBS = @LIBMPEG2CONVERT_LIBS@ +LIBMPEG2_CFLAGS = @LIBMPEG2_CFLAGS@ +LIBMPEG2_LIBS = @LIBMPEG2_LIBS@ +LIBOBJS = @LIBOBJS@ +LIBPOSTPROC_CFLAGS = @LIBPOSTPROC_CFLAGS@ +LIBPOSTPROC_LIBS = @LIBPOSTPROC_LIBS@ +LIBQUICKTIME_CFLAGS = @LIBQUICKTIME_CFLAGS@ +LIBQUICKTIME_LIBS = @LIBQUICKTIME_LIBS@ +LIBS = @LIBS@ +LIBTCAUDIO_LIBS = @LIBTCAUDIO_LIBS@ +LIBTCVIDEO_LIBS = @LIBTCVIDEO_LIBS@ +LIBTC_LIBS = @LIBTC_LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIBV4LCONVERT_CFLAGS = @LIBV4LCONVERT_CFLAGS@ +LIBV4LCONVERT_LIBS = @LIBV4LCONVERT_LIBS@ +LIBXML2_CFLAGS = @LIBXML2_CFLAGS@ +LIBXML2_LIBS = @LIBXML2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LZO_CFLAGS = @LZO_CFLAGS@ +LZO_LIBS = @LZO_LIBS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MJPEGTOOLS_CFLAGS = @MJPEGTOOLS_CFLAGS@ +MJPEGTOOLS_LIBS = @MJPEGTOOLS_LIBS@ +MKDIR_P = @MKDIR_P@ +MOD_PATH = @MOD_PATH@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OGG_CFLAGS = @OGG_CFLAGS@ +OGG_LIBS = @OGG_LIBS@ +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@ +PATH_TO_AWK = @PATH_TO_AWK@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PROF_PATH = @PROF_PATH@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +PVM3_CFLAGS = @PVM3_CFLAGS@ +PVM3_LIBS = @PVM3_LIBS@ +PVM3_PVMGS = @PVM3_PVMGS@ +RANLIB = @RANLIB@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SIMD_FLAGS = @SIMD_FLAGS@ +STRIP = @STRIP@ +THEORA_CFLAGS = @THEORA_CFLAGS@ +THEORA_LIBS = @THEORA_LIBS@ +USE_DLDARWIN = @USE_DLDARWIN@ +VERSION = @VERSION@ +VORBIS_CFLAGS = @VORBIS_CFLAGS@ +VORBIS_LIBS = @VORBIS_LIBS@ +WAVLIB_LIBS = @WAVLIB_LIBS@ +X264_CFLAGS = @X264_CFLAGS@ +X264_LIBS = @X264_LIBS@ +XIO_CFLAGS = @XIO_CFLAGS@ +XIO_LIBS = @XIO_LIBS@ +XMKMF = @XMKMF@ +XVID_CFLAGS = @XVID_CFLAGS@ +XVID_LIBS = @XVID_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +a52_config = @a52_config@ +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_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@ +bsdav_config = @bsdav_config@ +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@ +faac_config = @faac_config@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +iconv_config = @iconv_config@ +imagemagick_config = @imagemagick_config@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +lame_config = @lame_config@ +libdir = @libdir@ +libdvdread_config = @libdvdread_config@ +libexecdir = @libexecdir@ +libjpeg_config = @libjpeg_config@ +libjpegmmx_config = @libjpegmmx_config@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lzo_config = @lzo_config@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pvm3_config = @pvm3_config@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +x_includes = @x_includes@ +x_libraries = @x_libraries@ +xvid_config = @xvid_config@ +EXTRA_DIST = \ + $(docs_DATA) + +SUBDIRS = html +docsdir = $(datadir)/doc/transcode/tech +docs_DATA = \ + OPTIMIZERS \ + architecture.txt \ + avi_comments.txt \ + clone.txt \ + export-API.txt \ + filter-API.txt \ + ibp_support.txt \ + import-API.txt \ + libraries.txt \ + module-system-API.txt \ + filter_template.c + +all: all-recursive + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu docs/tech/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu docs/tech/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-docsDATA: $(docs_DATA) + @$(NORMAL_INSTALL) + test -z "$(docsdir)" || $(MKDIR_P) "$(DESTDIR)$(docsdir)" + @list='$(docs_DATA)'; test -n "$(docsdir)" || list=; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(docsdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(docsdir)" || exit $$?; \ + done + +uninstall-docsDATA: + @$(NORMAL_UNINSTALL) + @list='$(docs_DATA)'; test -n "$(docsdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + test -n "$$files" || exit 0; \ + echo " ( cd '$(DESTDIR)$(docsdir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(docsdir)" && rm -f $$files + +# 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. +$(RECURSIVE_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; 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" + +$(RECURSIVE_CLEAN_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + 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; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + 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 +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + 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" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @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 \ + test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + 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 +check-am: all-am +check: check-recursive +all-am: Makefile $(DATA) +installdirs: installdirs-recursive +installdirs-am: + for dir in "$(DESTDIR)$(docsdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +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: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +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 Makefile +distclean-am: clean-am distclean-generic distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: install-docsDATA + +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 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: uninstall-docsDATA + +.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ + install-am install-strip tags-recursive + +.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ + all all-am check check-am clean clean-generic clean-libtool \ + ctags ctags-recursive distclean distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-docsDATA 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-recursive uninstall uninstall-am uninstall-docsDATA + + +# 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: diff --git a/debian/transcode/transcode-1.1.7/docs/tech/OPTIMIZERS b/debian/transcode/transcode-1.1.7/docs/tech/OPTIMIZERS new file mode 100644 index 00000000..089c57bf --- /dev/null +++ b/debian/transcode/transcode-1.1.7/docs/tech/OPTIMIZERS @@ -0,0 +1,145 @@ +You want to improve you programming skills? +You cannot stand wasted CPU cycles? +You know how to write good/fast/efficient code? +Then this might be for you. + +Transcode has a lot of filter plugins which are not optimized. Filters +in transcode usually get a single video frame and do transformations on +that frame. The filter API is as simple as efficient it is explained in +great detail in /docs/filter-API.txt with sample code for a dummy +filter. + +All filters in transcode are in the filter/ directory and are mostly a +single C file. The variety of filters ranges from very simple filters +-- like filter_invert.c -- to complex stuff like filter_yuvdenoise.c. + +The audio filters are per definition less CPU intensive than the video +filters because they have to deal with less data. + +Here is an overview of filters which would be glad about a speedup +(lexicographical order) + +* filter_32detect.c + Is a interlace detection plugin. The detection algorithm could be + improved as well as the speed. + +* filter_aclip.c + Audio filter which generate audio clips from source + +* filter_astat.c + Audio filter which collects statistics about the audio stream. + +* filter_cshift.c + A chroma-lag shifter. It shifts the color components of the video to + the left or right. For RGB mode, the filter converts the data to YUV and + back again. + +* filter_dnr.c + A denoiser with no SIMD optimizations It uses a different algorithm + than the yuvdenoiser. + +* filter_fields.c + A very efficient and well written filter. + +* filter_invert.c + Simple filter which inverts the video. + +* filter_logo.c + renders a logo into the video stream. + +* filter_logoaway.c + removes a logo from the video stream. + +* filter_mask.c + Filter through a rectangular mask, everything outside the masked will + be blacked out. + +* filter_normalize.c + Normalizes the audio stream. The filter is based on mplayers volnorm + filter. + +* filter_resample.c + Resamples to audio stream doing conversions from eg. 48000Hz to + 44100Hz. The code is based on code from the sox application. + +* filter_smartdeinter.c + This filter provides a smart, motion-based deinterlacing + capability. In static picture areas, interlacing artifacts do + not appear, so data from both fields is used to provide full + detail. In moving areas, deinterlacing is performed. + + The filter was written for VirtualDub by Donald Graft. It produces + very good results. It was written with the RGB colorspace in mind. To + use it in transcode with YUV mode enabled a yuv2rgb and rgb2yuv + wrapper has been built around this filter. It would speed up a lot, if + rewritten for native YUV mode. There are probably other areas in this + filter which are a candidate for a speedup. + +* filter_smooth.c + Is a single-frame smoothing plugin. It is very CPU intensive + +* filter_testframe.c + It generates stream of testframes. Optimizing this filter is probably + not worth it but it is a good testbed for generating problematic + testframes. + +* filter_xsharpen.c + This filter performs a subtle but useful sharpening effect. The + result is a sharpening effect that not only avoids amplifying + noise, but also tends to reduce it. A welcome side effect is that + files processed with this filter tend to compress to smaller files. + + The filter was written for VirtualDub by Donald Graft. It was written + with the RGB colorspace in mind. To be useful with transcodes YUV + mode, the filter has been partially rewritten. + +* filter_yuvdenoise.c + This filter comes from the mjpeg tools and denoises the video by doing + a motion analyse. There are some SIMD parts in this filter but it could + be much faster. + +* filter_yuvmedian.c + This filter comes from the mjpeg tools and smoothes the video by + appying a median algorithm. It is CPU intensive. + + +/* ****************************************************************** */ + +Colorspaces +In transcode, the filter gets a char* which points to the raw video +data. Only two colorspaces are possible in transcode. + +* RGB +This is actually RGB24 meaning there are 24 bits or 3 Bytes available +for each pixel. It is a packed format, each component is 1 byte large. +The size of the image is Width*Height*3. +The memory layout is + + ___________________________________ +|__R__|__G__|__B__|__R__|__G__|__B__| .... + \_______________/ \_______________/ + Pixel(0,0) Pixel(1,0) + +* YUV (4:2:0) +This is actually YUV420P (I420) with 1+1/2 byte per pixel. It is a planar +format meaning first all Y data then Cb and then Cr. +The memory layout is + + __________________ ... ______ ... _____ +|__Y__|__Y__|__Y__| ... |__Cb_| ... |__Cr_| .... + \___/ \___/ \___/ + (0,0) (1,0) (2,0) + +There are Width*Height Y bytes, Width*Height/4 Cb bytes and +Width*Height/4 Cr bytes. The size of the image is Width*Height*3/2. + + +* YUV (4:2:2) +This is YUV422 8-bit planar, with 2 bytes per pixel. The layout is the +same as for YUV420P, but the Cb and Cr planes are twice as high (double +vertical resolution). + +Size of the image is 2*W*H. + +(c) 2003 Tilmann Bitterberg <transcode@tibit.org> +Modified: $Date: 2007-03-21 20:17:10 $ diff --git a/debian/transcode/transcode-1.1.7/docs/tech/architecture.txt b/debian/transcode/transcode-1.1.7/docs/tech/architecture.txt new file mode 100644 index 00000000..119c6222 --- /dev/null +++ b/debian/transcode/transcode-1.1.7/docs/tech/architecture.txt @@ -0,0 +1,262 @@ +==================================================== +A video frame in transcode -- Birth, life and death. +==================================================== + +This article has information about the generic stages of a frame in +the transcode core. It may help you when you want to do a filter for +transcode or just understand how transcode works. + +Transcode is a threaded application. The different threads which are +of importance here are one decoder thread, one encoder thread and N +frame processing threads. N is a number the user can control via +the second argument of transcodes -u option. + +Each frame is put into a frame_list_t (/src/framebuffer.h) +structure. The frames are buffered internally in a double linked +list. The order of an frame in this list denotes the decoding (and +therefore) the encoding order (/src/video_buffer.c) + +The import module decompresses a frame from the input file into a +format the core of transcode likes. Just after the frame arrives in +the decoder, the status of the frame is set to FRAME_WAIT. +the first frame pre-processing takes place here. + +1) preprocess_vid_frame() (/src/frame_preprocess.c) + If the frame number is out-of-range as denoted by -c, the skipped + attribute is attached to the frame and it is ignored by further + processing routines. If the user has given --pre_clip, this will + happen here. + +After the very early clipping the filters get their draw with the tag: + +2) TC_PRE_S_PROCESS + The _S_ stands for synchronous. This means for the filter it will + recieve one frame after another in decoding order. The filter is + executed by the decoding thread and runs inside this thread + putting the decoder on halt for its execution time. + +When all filters are done with TC_PRE_S_PROCESS, the frame leaves +the decoder and the sychronous part and now waits to be picked up by +one of the frame processing threads (/src/frame_threads.c). One +frame processing thread does the following: It grabs one frame from +the frame_list and sets its state to FRAME_LOCK to make sure no +other frame processing thread will take this frame. Now the frame +enters the filters again: + +3) TC_PRE_M_PROCESS + The frame passes all the filters in the order specified on the + command line. The frame ordering is not garanteed any more; the + frames may arrive in the filter in any order. The filter must be + reentrant in some way. + +Next, the internal processing routines take place: + +4) process_vid_frame() (/src/video_trans.c) + The following operations are applied to the frame in the hereby + given order + -j (clip) -I (deinterlace) -X (fast scale up) -B (fast scale + down) -Z (slow zoom) -Y (clip) -r (scale half) -z (flip) + -l (mirror) -k (rgbswap) -K (make grayscale) -G (gamma) + -C (antialias) + short: "jIXBZYrzlkKGC" + +The frame wanders off into the filters a third time: + +5) TC_POST_M_PROCESS + (the same as for 3) applies here, too) + +The frame processing thread now sets the status of the frame to +FRAME_READY which means the frame can now be picked up by the +encoder. The encoder does again some processing and calls the +filters for the fourth and last time. + +6) TC_POST_S_PROCESS + (the same as for 2) applies here, too) + +After this a internal post processing takes place: + +7) postprocess_vid_frame() (/src/frame_postprocess.c) + Very last clipping if the user wants this via --post_clip + +Finally, the processed frame is made available to preview filters with +the tag: + +8) TC_PREVIEW + This tag is intended only for the "preview" and "pv" filters (and any + new ones created with the same purpose), and allows the final video + frame after clipping via --post_clip to be shown to the user. The + frame should not be modified here. + +When the frame has the skip flag set it will not be encoded, all +other frames will encoded and freed. + + +=================== +Graphical structure +=================== + + decode() + | + 1) preprocess() + | + 2) filters(TC_PRE_S_PROCESS) + | + _____________/ | \______________ + / | | | \ + / | | | \ + N F R A M E P R O C E S S I N G T H R E A D S + / . . . . + | . . . . + | + 3) filters(TC_PRE_M_PROCESS) + | + 4) process_vid_frame() + | + 5) filters(TC_POST_M_PROCESS) + | + | . . . . + \ . . . . + \ | | | / + \________|______ | ______|_______/ + \ | / + | + 6) filters(TC_POST_S_PROCESS) + | + 7) postprocess() + | + 8) filters(TC_PREVIEW) + | + encode() + + +============== +Cloning Frames +============== + +A filter can clone a frame. What this means and when it is possible +to do it will be the topic of this section. We only consider the +filters slots since non of the core video function does cloning. +"Cloning a frame" means a frame gets duplicated (cloned) and encoded +twice. Of course, if the cloned frame gets modified, a different +cloned frame gets encoded. As the reader might know, there are four +filter slots in transcode (excluding TC_PREVIEW, which is not +relevant to this discussion). I'll abbrevate them for easier reading: + + Slot | Abb. | Comment + ---------------------+------+---------------------------------- + TC_PRE_S_PROCESS | ES | synchronous pre processing + TC_PRE_M_PROCESS | EM | multithreaded pre processing + TC_POST_M_PROCESS | OM | multithreaded post processing + TC_POST_S_PROCESS | OS | synchronous post processing + +Every filter in every slot can clone frames but the filter may not +be called again with the cloned frame again. This depends on the +slot the filter lives in. Note that a filter can live in several +slots, for example, it can set the clone flag at ES time and catch +the cloned frame at OM time if it likes to do so. The filter must +keep in mind, that the cloned frame may have different geometry at +OM time because it may be rescaled or resampled. + +How to read the following table. The field "Slot" denotes the slot +the filter is in when it sets CLONE. The "Slots to pass" field tells +the slots the cloned frame will pass. + + Slot | Slots to pass | Slots NOT passed + ------+---------------+----------------- + ES | EM OM OS | ES + EM | EM OM OS | ES + OM | OS | ES EM OM + OS | OS | ES EM OM + +Example 1: +A filter in ES sets CLONE. The filter itself will not see the cloned +frame, but all filters in following slots will. + +Example 2: +A filter in EM sets CLONE. The filter _will_ see the cloned frame +again and all consecutive slots will get it again, too. + +Notes on Cloning. +To clone a frame, the filter adds TC_FRAME_IS_CLONED to the frame +pointer attributes. The frame ID never gets incremented to reflect +the count of cloned frames. If the filter decides to clone a frame, +it gets the frame back with the same ID but with TC_FRAME_WAS_CLONED +set, so its easy to distinguish between the frame with the original +ID and the duplicated ID. + + +=============== +Skipping Frames +=============== + +A filter can apply the skipped attribute to a frame which tells +transcode the frame is not to be encoded but dropped. Not all slots +can skip a frame; only slots where there is asynchronous A/V are +allowed to do so. + + Slot | slot in which the frame will be dropped + ------+---------------------------------------- + ES | Before EM + EM | After EM, before OM + OM | After OM, before OS + OS | After OS, before encode + +In other words, a skipped frame gets dropped right after the filter +has returned. + +================================= +Choosing the Slot for your Filter +================================= + +If you want to do a filter you may not be sure in which slot it +should be in. This section helps you in finding the correct slot for +your filter. + +Multithreaded vs. Synchronous + + You should try as hard as possible to put your filter into one of + the _M_ slots. An _M_ slot is usually faster than an _S_ slot. + Imagine the decoder waits for data to arrive from the harddrive and + the encoder is busy. Having your filter run in _M_ could use the + time while noone else is doing something to process the frame. + The _S_ stages are run directly by the decoder respectivly the + encoder and will block the de/encoder in doing their real work. + + However, its not always possible to put a filter in _M_. In _M_ + slots the filter may recieve the frames in any order. So if the + filter does depend on correct frame ordering it cannot be in _M_. + It may be possible to rewrite the filter in a way so that it does + not depend on the order of frames, check if it can be done for your + filter. + +PRE vs. POST + + This decision is merely driven by the fact what your filter + actually does and which kind of data you want to have. Its usually + true, that a POST filter has to deal with less data than a PRE + filter. Of course, this is only true, if the user scales down and + not up but this is what most users do. + + As an example, a deinterlace should always be run as a PRE filter + before the the up/down scaling of the frame happens in + transcode-core. A denoiser can be either run in PRE or in POST + because it just does not matter. One can assume that if the user + wants deinterlacing, in POST you can be pretty sure that you work + with progressive material. + +Always keep in mind that a filter can be in multiple slots. It +depends on the filter which tag it wants. + + +================================= +Multiple Instances of your Filter +================================= + +If your you want to be able to run XXX: see /filter/filter_32detect.c + +======================= +Linked Framebuffer List +======================= +// XXX: WRITEME + +// vim: tw=68 diff --git a/debian/transcode/transcode-1.1.7/docs/tech/avi_comments.txt b/debian/transcode/transcode-1.1.7/docs/tech/avi_comments.txt new file mode 100644 index 00000000..b8a2709b --- /dev/null +++ b/debian/transcode/transcode-1.1.7/docs/tech/avi_comments.txt @@ -0,0 +1,117 @@ +# INFO +# +# The AVI file format supports so-called tomb-stone data. It can be +# used to write annotations into the AVI file. +# +# You can use this file as the argument to the transcode option +# --avi_comments. When the file is read, empty lines and lines +# starting with '#' are ignored. +# The syntax is: "TAG<space>STRING". The order of the tags does not +# matter. If a tag has no string following it, it is ignored. That +# means, you can use this file as input and only fill out the fields +# you want. +# +# A very simple example is: +# ----------------snip---------------- +# INAM My 1st Birthday +# ISBJ My first steps! +# IART My proud family +# ----------------snip---------------- +# +# Keep in mind that there is no endless space in the AVI header, +# most likely its around 1000 bytes. + + +# INAM - Stores the title of the subject of the file, such as +# "Seattle from Above." +INAM + +# ISBJ - Describes the contents of the file, such as +# "Aerial view of Seattle." +ISBJ + +# Lists the artist of the original subject of the file; +# for example, "Michaelangelo." +IART + +# Records the copyright information for the file; for example, +# "Copyright Encyclopedia International 1991." If there are multiple +# copyrights, separate them by semicolon followed by a space. +ICOP + +# Lists the name of the person or organization that commissioned +# the subject of the file; for example "Pope Julian II." +ICMS + +# Provides general comments about the file or the subject +# of the file. If the comment is several sentences long, end each +# sentence with a period. Do not include new-line characters. +ICMT + +# Indicates where the subject of the file is archived +IARL + +# Creation date. Specifies the date the subject of the file was created. List +# dates in year-month-day format, padding one-digit months and days with +# a zero on the left; for example, "1553-05-03" for May 3, 1553. +ICRD + +# Describes whether an image has been cropped and, if so, how it +# was cropped; for example, "lower-right corner." +ICRP + +# Specifies the size of the original subject of the file; for +# example, "8.5 in h, 11 in w." +IDIM + +# Stores dots per inch setting of the digitizer used to +# produce the file, such as "300." +IDPI + +# Stores the of the engineer who worked on the file. If there are +# multiple engineers, separate the names by a semicolon and a blank; +# for example, "Smith, John; Adams, Joe." +IENG + +# Describes the original work, such as "landscape,", "portrait," +# "still liefe," etc. +IGNR + +# Provides a list of keywords that refer to the file or subject of the +# file. Separate multiple keywords with a semicolon and a blank; +# for example, "Seattle, aerial view; scenery." +IKEY + +# ILGT - Describes the changes in the lightness settings on the digitizer +# required to produce the file. Note that the format of this information +# depends on the hardware used. +ILGT + +# IMED - Decribes the original subject of the file, such as +# "computer image," "drawing," "lithograph," and so on. +IMED + +# IPLT - Specifies the number of colors requested when digitizing +# an image, such as "256." +IPLT + +# IPRD - Specifies the name of title the file was originally intended +# for, such as "Encyclopedia of Pacific Northwest Geography." +IPRD + +# ISHP - Identifies the change in sharpness for the digitizer +# required to produce the file (the format depends on the hardware used). +ISHP + +# ISRC - Identifies the name of the person or organization who +# suplied the original subject of the file; for example, "Try Research." +ISRC + +# ISRF - Identifies the original form of the material that was digitized, +# such as "slide," "paper," "map," and so on. This is not necessarily +# the same as IMED +ISRF + +# ITCH - Identifies the technician who digitized the subject file; +# for example, "Smith, John." +ITCH diff --git a/debian/transcode/transcode-1.1.7/docs/tech/clone.txt b/debian/transcode/transcode-1.1.7/docs/tech/clone.txt new file mode 100644 index 00000000..fa8ba9d1 --- /dev/null +++ b/debian/transcode/transcode-1.1.7/docs/tech/clone.txt @@ -0,0 +1,101 @@ +---------------------------------------------------- +More accurate and up-to-date information is in /docs/architecture.txt +---------------------------------------------------- + +HOWTO clone frames + +I want to contribute a quick how-to how to use the new attribute +TC_FRAME_IS_CLONED. + +I have written two filters tc_video and tc_audio as an +demonstration example of the clone flag doing actually something +useful. These filters telecine a NTSC_FILM to NTSC_VIDEO +(23.9->29.9 fps) for video and audio. The input material must be +in 23.9 fps or weird results come out. Of course, you can use +ivtc+decimate to reverse the process and restore the original +video :) + +The best documentation is (as always) the source but let me +summarize my experience. + +A filter can clone (duplicate) a frame by setting the clone flag +to a frame by + ptr->attributes |= TC_FRAME_IS_CLONED; + +The encoder then deletes the flag and sets another flag named +TC_FRAME_WAS_CLONED. This is necessary for the filter because +frame IDs never get incremented. + +The filter has to live in the TC_POST_M_PROCESS or in the +TC_POST_S_PROCESS (synchronous) slot for this to work and its +quite a difference between TC_POST_M_PROCESS and TC_POST_S_PROCESS + +TC_POST_M_PROCESS: + The filter can set the the clone flag which causes the frame + to get encoded twice. The filter WON'T see the frame again, so + it cannot make modifications to the frame. This is what the + demo filter_clone uses. + + import -> .. -> filter (set_clone) -> encoder (frame)-, + / / + \______<<<________/ + +TC_POST_S_PROCESS: + The filter can set the clone flag which causes the frame to + get encoded and run through the filter again with the + was_cloned flag set. The filter can now check if this frame + already was cloned and not clone it again. This is very handy + when doing modulo insertions of frames. + + import -> .. -> filter (if !was_cloned -> encoder (frame)-, + / then set_clone) / + \_________<<<________________<<<____________/ + + +Definitions: +The frame ID never gets incremented to reflect the count of +cloned frames. If the filter decides to clone a frame, it gets the +frame back with the same ID but with TC_FRAME_WAS_CLONED set, so +its easy to distinguish between the frame with the original ID +and the duplicated ID. + +Limitations/Bugs: +- It is not possible to rerun the frame through the complete + filter pipeline. TC_POST_S_PROCESS is the most far away point + the frame can get back. + +- transcode's encoding frame counter is wrong, but the final + message, ie + [transcode] encoded 331 frames (0 dropped), clip length 11.04 s + is correct. + +Notes: +TC_FRAME_WAS_CLONED is introduced in this patch and is not +available in earlier transcode versions. + +Notes on the included filters: +The tc_video filter is pretty straight forward, doing a normal +telecine. Thanks to Thanassis Tsiodras who explained very +precise what telecine and what inverse telecine is. The code is +commented to show its work flow and workings. + +The tc_audio filter is a bit trickier, because the audio frames +have to get "repackaged". The audio import bufsize is tweaked to +read the frames in chunks suitable for 23.9 fps and the filter +then moves them back and forth to repackage them suitable for +29.9 fps. Considering this example. + + Import: 48000,16,2 @ 23.9 fps -> bufsize = 8008 + export: 48000,16,2 @ 29.9 fps -> bufsize = 6408 + + The filter does a conversion from 4 frames * 8008 to + 5 frames * 6408 + +No data is added or removed. + +I think this feature is now pretty usable so start hacking on +frame rate conversion filters :) + +Version 0.1 + +2002 Tilmann Bitterberg <transcode@tibit.org> diff --git a/debian/transcode/transcode-1.1.7/docs/tech/export-API.txt b/debian/transcode/transcode-1.1.7/docs/tech/export-API.txt new file mode 100644 index 00000000..bb74c9ff --- /dev/null +++ b/debian/transcode/transcode-1.1.7/docs/tech/export-API.txt @@ -0,0 +1,111 @@ + EXPORT MODULE WRITING HOWTO + --------------------------- +Changes: 2001-08-13: changed order of init/open + and stop/close calls. + +Some very short documentation on writing export modules for transcode + +include this file: +------------------ + +#include "transcode.h" //definition of vob_t and transfer_t structure + +data exchange structure for modules: +------------------------------------ + +typedef struct _vob_t { +//see transcode.h for details +} vob_t; + +typedef struct _transfer_t { + + int flag; // specifies context: TC_VIDEO for video + TC_AUDIO for audio + // or passes an integer to the module + + FILE *fd; // file handle for input stream + // NULL if import module performs reading + // unused in export module + + int size; // total amount of bytes in the buffer + + char *buffer; // pointer to data array with frame data + +} transfer_t; + + +single function interface: +-------------------------- + +int tc_export(int option, void *para1, void *para2); + +exit codes: all handled by transcode +TC_EXPORT_UNKNOWN option not supported +TC_EXPORT_OK no error, hopefully the default +TC_EXPORT_ERROR a critical error occured + +input parameter: +option contains the requested action id +para1/2 its actually meaning depends on option + +requested method: + +transcode calls the following routines in this order +for both export modules, i.e., first for video and then for the +audio context flag set. An export module should in general +be able to deal with audio and video and write it to +a common file. But the interface is more general. + +[1] +option=TC_EXPORT_NAME +para1=_transfer_t +para2=NULL +requested action: print out some general modules infos to stderr + and inherit transcode verbosity flag + (optional return capability flag) + + //>0.3.3 of transcode interpret flag returned + //to read module capabilities for sanity checks +status: optional + +[2] +option=TC_EXPORT_INIT +para1=_transfer_t +para2=_vob_t +requested action: initialize the encoder +status: required + + +[3] +option=TC_EXPORT_OPEN +para1=_transfer_t +para2=_vob_t +requested action: open outputfile +status: required + + +[4] +option=TC_EXPORT_ENCODE +para1=_transfer_t +para2=NULL +requested action: use this frame data to encode the next frame + in the sequence +status: required + + +[5] +option:TC_EXPORT_CLOSE +para1=_transfer_t +para2=NULL +requested action: close open files +status: required + + +[6] +option=TC_EXPORT_STOP +para1=_transfer_t +para2=NULL +requested action: stop the encoder, free memory and prepare for + module removal +status: required + diff --git a/debian/transcode/transcode-1.1.7/docs/tech/filter-API.txt b/debian/transcode/transcode-1.1.7/docs/tech/filter-API.txt new file mode 100644 index 00000000..002b6fdf --- /dev/null +++ b/debian/transcode/transcode-1.1.7/docs/tech/filter-API.txt @@ -0,0 +1,136 @@ + + // ================ + // API explanation: + // ================ + // + // (1) need more infos, than get pointer to transcode global + // information structure vob_t as defined in transcode.h. + // + // (2) 'tc_get_vob' and 'verbose' are exported by transcode. + // + // (3) filter is called first time with TC_FILTER_INIT flag set. + // + // (4) make sure to exit immediately if context (video/audio) or + // placement of call (pre/post) is not compatible with the filters + // intended purpose, since the filter is called 4 times per frame. + // + // (5) see framebuffer.h for a complete list of frame_list_t variables. + // + // (6) filter is last time with TC_FILTER_CLOSE flag set. This is important. + // The filter should be left in a state so that it could be called again + // with TC_FILTER_INIT. + // + // (Anytime) A filter may be called with TC_FILTER_GET_CONFIG to read the + // current config (optional) See /src/optstr.h for explanation + + + Notes and Hints about filter programming: + * Statics: All information and data you have calculated at INIT time and you + want to reuse later must be declared static (tables, flags, etc) + * The optstr_get function provides a convenient way for a developer to parse + human readable option strings. You are encouraged to use this function. + * If your filter shall be called multiple times during and encode session + (maybe first as a pre fileter and than as a post process filter) _you_ have + to take care to not overwrite your own data. A frame_list_t element has a + field called `instance' which will help you to keep your adress space clean. + See 32detect for an implementation. + * When TC_FILER_GET_CONFIG flag is set, the filter should return its + available parameters using the optstr_param and optstr_filter_desc funtions. + The last parameters of optstr_param are ranges with valid arguments for + this paramter. Sometimes it does not make sense to set the ranges, (e.g. if + the parameter "foo" is valid from 0 to "all frames in this file", so it is + considered good practice to use "oo" - the mathematical symbol for infinity + as the upper limit. + +Example filter code: + +#define MOD_NAME "filter_null.so" +#define MOD_VERSION "v0.1 (2003-10-12)" +#define MOD_CAP "demo filter plugin" +#define MOD_AUTHOR "Jon Doe <me@there>" + +#include "filter.h" +#include "optstr.h" + +int tc_filter(frame_list_t *ptr, char *options) +{ + + int pre, vid; + static int dummy_option = 0; + + static vob_t *vob=NULL; + + //---------------------------------- + // + // filter get config + // + //---------------------------------- + + if(ptr->tag & TC_FILTER_GET_CONFIG) { + if (options) { + optstr_filter_desc (MOD_NAME, MOP_CAP, MOD_VERSION, MOD_AUTHOR, "VARY", "1"); + + optstr_param (options, "dummy_options", // name + "This options does nothing", // comment + "%d", // format + "0", // default value + "0", // valid from + "255" // valid to + ); + } + return (0); + } + + //---------------------------------- + // + // filter init + // + //---------------------------------- + + if(ptr->tag & TC_FILTER_INIT) { + + if((vob = tc_get_vob())==NULL) return(-1); + + if (options) { + optstr_get (options, "dummy_option", "%d", &dummy_option); + } + + // filter init ok. + if(verbose) printf("[%s] %s %s\n", MOD_NAME, MOD_VERSION, MOD_CAP); + + return(0); + } + + //---------------------------------- + // + // filter close + // + //---------------------------------- + + + if(ptr->tag & TC_FILTER_CLOSE) { + // free memory, etc .. + return(0); + } + + //---------------------------------- + // + // filter frame routine + // + //---------------------------------- + + // tag variable indicates, if we are called before + // transcodes internal video/audo frame processing routines + // or after and determines video/audio context + + + if(ptr->tag & TC_PRE_M_PROCESS) pre=1; + if(ptr->tag & TC_POST_M_PROCESS) pre=0; + + if(ptr->tag & TC_VIDEO) vid=1; + if(ptr->tag & TC_AUDIO) vid=0; + + printf("[%s] frame [%06d] %s %16s call\n", MOD_NAME, ptr->id, (vid)?"(video)":"(audio)", (pre)?"pre-process filter":"post-process filter"); + + return(0); +} diff --git a/debian/transcode/transcode-1.1.7/docs/tech/filter_template.c b/debian/transcode/transcode-1.1.7/docs/tech/filter_template.c new file mode 100644 index 00000000..4f754a9f --- /dev/null +++ b/debian/transcode/transcode-1.1.7/docs/tech/filter_template.c @@ -0,0 +1,294 @@ +/* + * filter_template.c -- template code for NMS and back compatible + * transcode filters + * Written by Andrew Church <achurch@achurch.org> + * Templatized by Francesco Romani <fromani at gmail dot com> + * + * This file is part of transcode, a video stream processing tool. + * transcode is free software, distributable under the terms of the GNU + * General Public License (version 2 or later). See the file COPYING + * for details. + */ + +#define MOD_NAME "filter_template.so" +#define MOD_VERSION "v1.1.0 (2007-05-31)" +#define MOD_CAP "WRITE SUMMARY OF THE MODULE HERE" +#define MOD_AUTHOR "Andrew Church, Francesco Romani" + +#define MOD_FEATURES \ + TC_MODULE_FEATURE_FILTER|TC_MODULE_FEATURE_VIDEO|TC_MODULE_FEATURE_AUDIO +#define MOD_FLAGS \ + TC_MODULE_FLAG_RECONFIGURABLE + +#include "transcode.h" +#include "filter.h" +#include "libtc/libtc.h" +#include "libtc/optstr.h" +#include "libtc/tcmodule-plugin.h" + +static const char help_string[] = \ + "WRITE LONG AND DETAILED DESCRIPTION OF THE MODULE HERE"; + +/*************************************************************************/ + +typedef struct { + ; +} PrivateData; + +/*************************************************************************/ +/*************************************************************************/ + +/* Module interface routines and data. */ + +/*************************************************************************/ + +/** + * template_init: Initialize this instance of the module. See + * tcmodule-data.h for function details. + */ + +static int template_init(TCModuleInstance *self, uint32_t features) +{ + PrivateData *pd; + + TC_MODULE_SELF_CHECK(self, "init"); + TC_MODULE_INIT_CHECK(self, MOD_FEATURES, features); + + pd = tc_malloc(sizeof(PrivateData)); + if (!pd) { + tc_log_error(MOD_NAME, "init: out of memory!"); + return TC_ERROR; + } + self->userdata = pd; + + /* initialize data */ + + if (verbose) { + tc_log_info(MOD_NAME, "%s %s", MOD_VERSION, MOD_CAP); + } + return TC_OK; +} + +/*************************************************************************/ + +/** + * template_fini: Clean up after this instance of the module. See + * tcmodule-data.h for function details. + */ + +static int template_fini(TCModuleInstance *self) +{ + PrivateData *pd; + + TC_MODULE_SELF_CHECK(self, "fini"); + + pd = self->userdata; + + /* free data allocated in _init */ + + tc_free(self->userdata); + self->userdata = NULL; + return TC_OK; +} + +/*************************************************************************/ + +/** + * template_configure: Configure this instance of the module. See + * tcmodule-data.h for function details. + */ + +static int template_configure(TCModuleInstance *self, + const char *options, vob_t *vob) +{ + PrivateData *pd = NULL; + + TC_MODULE_SELF_CHECK(self, "configure"); + + pd = self->userdata; + + if (options) { + /* optstr_get() them */ + } + + /* handle other options */ + + return TC_OK; +} + +/*************************************************************************/ + +/** + * template_stop: Reset this instance of the module. See tcmodule-data.h + * for function details. + */ + +static int template_stop(TCModuleInstance *self) +{ + PrivateData *pd = NULL; + + TC_MODULE_SELF_CHECK(self, "stop"); + + pd = self->userdata; + + /* reverse all stuff done in _configure */ + + return TC_OK; +} + +/*************************************************************************/ + +/** + * template_inspect: Return the value of an option in this instance of + * the module. See tcmodule-data.h for function details. + */ + +static int template_inspect(TCModuleInstance *self, + const char *param, const char **value) +{ + PrivateData *pd = NULL; + + TC_MODULE_SELF_CHECK(self, "inspect"); + TC_MODULE_SELF_CHECK(param, "inspect"); + TC_MODULE_SELF_CHECK(value, "inspect"); + + pd = self->userdata; + + if (optstr_lookup(param, "help")) { + *value = help_string; + } + /* put back configurable options */ + + return TC_OK; +} + +/*************************************************************************/ + +/** + * template_filter_video: Perform the filter operation on the video + * stream. See tcmodule-data.h for function details. + */ + +static int template_filter_video(TCModuleInstance *self, vframe_list_t *frame) +{ + PrivateData *pd = NULL; + + TC_MODULE_SELF_CHECK(self, "filter_video"); + TC_MODULE_SELF_CHECK(frame, "filter_video"); + + pd = self->userdata; + + /* do the magic */ + + return TC_OK; +} + +/*************************************************************************/ + +/** + * template_filter_audio: Perform the filter operation on the audio + * stream. See tcmodule-data.h for function details. + */ + +static int template_filter_audio(TCModuleInstance *self, aframe_list_t *frame) +{ + PrivateData *pd = NULL; + + TC_MODULE_SELF_CHECK(self, "filter_audio"); + TC_MODULE_SELF_CHECK(frame, "filter_audio"); + + pd = self->userdata; + + /* do the magic */ + + return TC_OK; +} + +/*************************************************************************/ + +static const TCCodecID template_codecs_in[] = { + TC_CODEC_ERROR +}; +static const TCCodecID template_codecs_out[] = { + TC_CODEC_ERROR +}; +static const TCFormatID template_formats[] = { + TC_FORMAT_ERROR +}; + +static const TCModuleInfo template_info = { + .features = MOD_FEATURES, + .flags = MOD_FLAGS, + .name = MOD_NAME, + .version = MOD_VERSION, + .description = MOD_CAP, + .codecs_in = template_codecs_in, + .codecs_out = template_codecs_out, + .formats_in = template_formats, + .formats_out = template_formats +}; + +static const TCModuleClass template_class = { + .info = &template_info, + + .init = template_init, + .fini = template_fini, + .configure = template_configure, + .stop = template_stop, + .inspect = template_inspect, + + .filter_video = template_filter_video, + /* We have to handle the audio too! */ + .filter_audio = template_filter_audio, +}; + +extern const TCModuleClass *tc_plugin_setup(void) +{ + return &template_class; +} + +/*************************************************************************/ + +static int template_get_config(TCModuleInstance *self, char *options) +{ + PrivateData *pd = NULL; + + TC_MODULE_SELF_CHECK(self, "get_config"); + + pd = self->userdata; + + optstr_filter_desc(options, MOD_NAME, MOD_CAP, MOD_VERSION, + MOD_AUTHOR, "VAMEO", "1"); + + /* use optstr_param to do introspection */ + + return TC_OK; +} + +static int template_process(TCModuleInstance *self, + frame_list_t *frame) +{ + TC_MODULE_SELF_CHECK(self, "process"); + + /* choose what to do by frame->tag */ + + return TC_OK; +} + +/*************************************************************************/ + +/* Old-fashioned module interface. */ + +TC_FILTER_OLDINTERFACE(template) + +/*************************************************************************/ + +/* + * Local variables: + * c-file-style: "stroustrup" + * c-file-offsets: ((case-label . *) (statement-case-intro . *)) + * indent-tabs-mode: nil + * End: + * + * vim: expandtab shiftwidth=4: + */ diff --git a/debian/transcode/transcode-1.1.7/docs/tech/html/Makefile.am b/debian/transcode/transcode-1.1.7/docs/tech/html/Makefile.am new file mode 100644 index 00000000..e64cd267 --- /dev/null +++ b/debian/transcode/transcode-1.1.7/docs/tech/html/Makefile.am @@ -0,0 +1,15 @@ +EXTRA_DIST = \ + $(docs_DATA) + +docsdir = \ + $(datadir)/doc/transcode/tech/html + +docs_DATA = \ + index.html \ + tc_basic.css \ + tc_frame_buffer.html \ + tc_input_rotation.html \ + tc_libraries.html \ + tc_logo.png + + diff --git a/debian/transcode/transcode-1.1.7/docs/tech/html/Makefile.in b/debian/transcode/transcode-1.1.7/docs/tech/html/Makefile.in new file mode 100644 index 00000000..bc597711 --- /dev/null +++ b/debian/transcode/transcode-1.1.7/docs/tech/html/Makefile.in @@ -0,0 +1,520 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ +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@ +target_triplet = @target@ +subdir = docs/tech/html +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +SOURCES = +DIST_SOURCES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__installdirs = "$(DESTDIR)$(docsdir)" +DATA = $(docs_DATA) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +A52_CFLAGS = @A52_CFLAGS@ +A52_LIBS = @A52_LIBS@ +ACLIB_LIBS = @ACLIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ALTIVEC_CFLAGS = @ALTIVEC_CFLAGS@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AVILIB_LIBS = @AVILIB_LIBS@ +AWK = @AWK@ +BSDAV_CFLAGS = @BSDAV_CFLAGS@ +BSDAV_LIBS = @BSDAV_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXXCPP = @CXXCPP@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLDARWIN_CFLAGS = @DLDARWIN_CFLAGS@ +DLDARWIN_LIBS = @DLDARWIN_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FAAC_CFLAGS = @FAAC_CFLAGS@ +FAAC_LIBS = @FAAC_LIBS@ +FGREP = @FGREP@ +FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@ +FREETYPE2_LIBS = @FREETYPE2_LIBS@ +GREP = @GREP@ +IBP_LIBS = @IBP_LIBS@ +ICONV_CFLAGS = @ICONV_CFLAGS@ +ICONV_LIBS = @ICONV_LIBS@ +IMAGEMAGICK_CFLAGS = @IMAGEMAGICK_CFLAGS@ +IMAGEMAGICK_LIBS = @IMAGEMAGICK_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LAME_CFLAGS = @LAME_CFLAGS@ +LAME_LIBS = @LAME_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBAVCODEC_CFLAGS = @LIBAVCODEC_CFLAGS@ +LIBAVCODEC_LIBS = @LIBAVCODEC_LIBS@ +LIBAVFORMAT_CFLAGS = @LIBAVFORMAT_CFLAGS@ +LIBAVFORMAT_LIBS = @LIBAVFORMAT_LIBS@ +LIBDVDREAD_CFLAGS = @LIBDVDREAD_CFLAGS@ +LIBDVDREAD_LIBS = @LIBDVDREAD_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBJPEG_CFLAGS = @LIBJPEG_CFLAGS@ +LIBJPEG_LIBS = @LIBJPEG_LIBS@ +LIBMPEG2CONVERT_CFLAGS = @LIBMPEG2CONVERT_CFLAGS@ +LIBMPEG2CONVERT_LIBS = @LIBMPEG2CONVERT_LIBS@ +LIBMPEG2_CFLAGS = @LIBMPEG2_CFLAGS@ +LIBMPEG2_LIBS = @LIBMPEG2_LIBS@ +LIBOBJS = @LIBOBJS@ +LIBPOSTPROC_CFLAGS = @LIBPOSTPROC_CFLAGS@ +LIBPOSTPROC_LIBS = @LIBPOSTPROC_LIBS@ +LIBQUICKTIME_CFLAGS = @LIBQUICKTIME_CFLAGS@ +LIBQUICKTIME_LIBS = @LIBQUICKTIME_LIBS@ +LIBS = @LIBS@ +LIBTCAUDIO_LIBS = @LIBTCAUDIO_LIBS@ +LIBTCVIDEO_LIBS = @LIBTCVIDEO_LIBS@ +LIBTC_LIBS = @LIBTC_LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIBV4LCONVERT_CFLAGS = @LIBV4LCONVERT_CFLAGS@ +LIBV4LCONVERT_LIBS = @LIBV4LCONVERT_LIBS@ +LIBXML2_CFLAGS = @LIBXML2_CFLAGS@ +LIBXML2_LIBS = @LIBXML2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LZO_CFLAGS = @LZO_CFLAGS@ +LZO_LIBS = @LZO_LIBS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MJPEGTOOLS_CFLAGS = @MJPEGTOOLS_CFLAGS@ +MJPEGTOOLS_LIBS = @MJPEGTOOLS_LIBS@ +MKDIR_P = @MKDIR_P@ +MOD_PATH = @MOD_PATH@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OGG_CFLAGS = @OGG_CFLAGS@ +OGG_LIBS = @OGG_LIBS@ +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@ +PATH_TO_AWK = @PATH_TO_AWK@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PROF_PATH = @PROF_PATH@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +PVM3_CFLAGS = @PVM3_CFLAGS@ +PVM3_LIBS = @PVM3_LIBS@ +PVM3_PVMGS = @PVM3_PVMGS@ +RANLIB = @RANLIB@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SIMD_FLAGS = @SIMD_FLAGS@ +STRIP = @STRIP@ +THEORA_CFLAGS = @THEORA_CFLAGS@ +THEORA_LIBS = @THEORA_LIBS@ +USE_DLDARWIN = @USE_DLDARWIN@ +VERSION = @VERSION@ +VORBIS_CFLAGS = @VORBIS_CFLAGS@ +VORBIS_LIBS = @VORBIS_LIBS@ +WAVLIB_LIBS = @WAVLIB_LIBS@ +X264_CFLAGS = @X264_CFLAGS@ +X264_LIBS = @X264_LIBS@ +XIO_CFLAGS = @XIO_CFLAGS@ +XIO_LIBS = @XIO_LIBS@ +XMKMF = @XMKMF@ +XVID_CFLAGS = @XVID_CFLAGS@ +XVID_LIBS = @XVID_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +a52_config = @a52_config@ +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_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@ +bsdav_config = @bsdav_config@ +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@ +faac_config = @faac_config@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +iconv_config = @iconv_config@ +imagemagick_config = @imagemagick_config@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +lame_config = @lame_config@ +libdir = @libdir@ +libdvdread_config = @libdvdread_config@ +libexecdir = @libexecdir@ +libjpeg_config = @libjpeg_config@ +libjpegmmx_config = @libjpegmmx_config@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lzo_config = @lzo_config@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pvm3_config = @pvm3_config@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +x_includes = @x_includes@ +x_libraries = @x_libraries@ +xvid_config = @xvid_config@ +EXTRA_DIST = \ + $(docs_DATA) + +docsdir = \ + $(datadir)/doc/transcode/tech/html + +docs_DATA = \ + index.html \ + tc_basic.css \ + tc_frame_buffer.html \ + tc_input_rotation.html \ + tc_libraries.html \ + tc_logo.png + +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu docs/tech/html/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu docs/tech/html/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-docsDATA: $(docs_DATA) + @$(NORMAL_INSTALL) + test -z "$(docsdir)" || $(MKDIR_P) "$(DESTDIR)$(docsdir)" + @list='$(docs_DATA)'; test -n "$(docsdir)" || list=; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(docsdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(docsdir)" || exit $$?; \ + done + +uninstall-docsDATA: + @$(NORMAL_UNINSTALL) + @list='$(docs_DATA)'; test -n "$(docsdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + test -n "$$files" || exit 0; \ + echo " ( cd '$(DESTDIR)$(docsdir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(docsdir)" && rm -f $$files +tags: TAGS +TAGS: + +ctags: CTAGS +CTAGS: + + +distdir: $(DISTFILES) + @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 +check-am: all-am +check: check-am +all-am: Makefile $(DATA) +installdirs: + for dir in "$(DESTDIR)$(docsdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +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-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-docsDATA + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-docsDATA + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic clean-libtool \ + distclean distclean-generic distclean-libtool distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-docsDATA 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 \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + uninstall uninstall-am uninstall-docsDATA + + +# 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: diff --git a/debian/transcode/transcode-1.1.7/docs/tech/html/index.html b/debian/transcode/transcode-1.1.7/docs/tech/html/index.html new file mode 100644 index 00000000..2b6b1e04 --- /dev/null +++ b/debian/transcode/transcode-1.1.7/docs/tech/html/index.html @@ -0,0 +1,45 @@ +<?xml version="1.0"?> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <meta name="generator" content= + "HTML Tidy for Linux (vers 12 April 2005), see www.w3.org" /> + + <title>transcode internals</title> + <meta http-equiv="Content-Type" content= + "text/html; charset=us-ascii" /> + <meta name="Author" content="Francesco Romani" /> + <meta name="Keywords" content="transcode architecture internals" /> + <meta name="Generator" content="ViM 7.x" /> + <link rel="StyleSheet" href="tc_basic.css" type="text/css" media= + "screen" /> +</head> + +<body> + <div id="title" class="title"> + <h1>Transcode Internals</h1> + <img src="tc_logo.png" class="centered" alt="transcode logo" /> + </div> + + <div id="index"> + <h2>Contents</h2> + <table> + <tr> + <td><a href="tc_libraries.html">Internal libraries</a></td> + <td><p>Overview of private transcode libraries and main components.</p></td> + </tr> + <tr> + <td><a href="tc_input_rotation.html">Input Rotation</a></td> + <td><p>Design principles and notes about multiple-inputs handling.</p></td> + </tr> + <tr> + <td><a href="tc_frame_buffer.html">Frame Buffering</a></td> + <td><p>How internal frame (fifo) buffer works, and future directions.</p></td> + </tr> + </table> + </div> +</body> +</html> + diff --git a/debian/transcode/transcode-1.1.7/docs/tech/html/tc_basic.css b/debian/transcode/transcode-1.1.7/docs/tech/html/tc_basic.css new file mode 100644 index 00000000..2f34a2b6 --- /dev/null +++ b/debian/transcode/transcode-1.1.7/docs/tech/html/tc_basic.css @@ -0,0 +1,96 @@ + +body { + margin: 20px; + padding: 10px; + font-size: 12px; + background-color: #CDB5CD; +} + +div { + margin: 10px; + padding: 5px; + background-color: #FFFFFF; +} + +h1 { + margin: 10px; + padding: 5px; + font-size: 26px; + text-align: center; + background-color: #E9E9E9; +} + +table { + align: center; +} + +h2 { + font-size: 22px; + font-weight: bold; + line-height: 22px; + margin: 5px 5px; + background-color: #E9E9E9; +} + +h3 { + font-size: 16px; + line-height: 14px; + background-color: #E9E9E9; +} + +h4 { + background-color: #E9E9E9; +} + +p { + margin: 10px; + padding: 5px; + background-color: #E9E9E9; +} + +pre { + font-size: 10px; + text-align: left; +} + +blockquote { + font-style: italic; +} + +.centered { + align: center; + text-align: center; +} + +.version { + font-size: 8px; + text-align: right; + margin: 5px 5px 5px 5px; + padding: 5px 0px 0px 5px; +} + +.note { + align: right; + text-align: right; +} + +.banner { + align: right; + text-align: right; +} + +.title { + margin: 10px 10px 10px 10px; + padding: 10px 5px 5px 10px; + font-size: 16px; + align: center; + text-align: center; +} + +.footer { + margin: 5px 5px 5px 5px; + padding: 5px 0px 0px 5px; + font-size: 8px; + align: center; + text-align: center; +} diff --git a/debian/transcode/transcode-1.1.7/docs/tech/html/tc_frame_buffer.html b/debian/transcode/transcode-1.1.7/docs/tech/html/tc_frame_buffer.html new file mode 100644 index 00000000..93004576 --- /dev/null +++ b/debian/transcode/transcode-1.1.7/docs/tech/html/tc_frame_buffer.html @@ -0,0 +1,66 @@ +<?xml version="1.0"?> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <meta name="generator" content= + "HTML Tidy for Linux (vers 12 April 2005), see www.w3.org" /> + + <title>transcode internals</title> + <meta http-equiv="Content-Type" content= + "text/html; charset=us-ascii" /> + <meta name="Author" content="Francesco Romani" /> + <meta name="Keywords" content="transcode architecture internals" /> + <meta name="Generator" content="ViM 7.x" /> + <link rel="StyleSheet" href="tc_basic.css" type="text/css" media= + "screen" /> +</head> + +<body> + <div id="title" class="title"> + <h1>Transcode - TITLE OF PAGE</h1> + </div> + + <div id="summary"> + <h3>Summary</h3> + <p>a few lines (1-30) describing the page content and highlights</p> + </div> + + <hr /> + + <div id="index"> + <table> + <tr> + <td><a href="#foo">Paragraph 1</a></td> + <td><p>short description of paragraph 1</p></td> + </tr> + <tr> + <td><a href="#bar">Paragraph 2</a></td> + <td><p>short description of paragraph 2</p></td> + </tr> + <tr> + <td><a href="#baz">Paragraph N</a></td> + <td><p>short description of paragraph N</p></td> + </tr> + </table> + </div> + + <hr /> + + <div id="paragraph1"> + <a name="foo"><h4>Paragraph 1</h4></a> + <p>body of paragraph 1</p> + </div> + + <div id="paragraph2"> + <a name="bar"><h4>Paragraph 2</h4></a> + <p>body of paragraph 2</p> + </div> + + <div id="paragraphN"> + <a name="baz"><h4>Paragraph N</h4></a> + <p>body of paragraph N</p> + </div> +</body> +</html> diff --git a/debian/transcode/transcode-1.1.7/docs/tech/html/tc_input_rotation.html b/debian/transcode/transcode-1.1.7/docs/tech/html/tc_input_rotation.html new file mode 100644 index 00000000..6b7adad5 --- /dev/null +++ b/debian/transcode/transcode-1.1.7/docs/tech/html/tc_input_rotation.html @@ -0,0 +1,124 @@ +<?xml version="1.0"?> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <meta name="generator" content= + "HTML Tidy for Linux (vers 12 April 2005), see www.w3.org" /> + + <title>transcode internals</title> + <meta http-equiv="Content-Type" content= + "text/html; charset=us-ascii" /> + <meta name="Author" content="Francesco Romani" /> + <meta name="Keywords" content="transcode architecture internals input rotation" /> + <meta name="Generator" content="ViM 7.x" /> + <link rel="StyleSheet" href="tc_basic.css" type="text/css" media= + "screen" /> +</head> + +<body> + <div id="title" class="title"> + <h1>Transcode - Input files rotation</h1> + </div> + + <div id="summary"> + <h3>Summary</h3> + <p> + This page describe the design principles and notes of new (as in 1.1.0 version) input rotation code. + Input rotation intelligently handles directory containing almost-homogeneous content, and perform + a smart contatenation of inputs (as opposed to "blind cat" previously performed on 1.0.x and former + releases). Application scenario and intended use of new code is described first; this lead to + explanation of design princples. Design notes and some implementation details are then provided. + </p> + </div> + + <hr /> + + <div id="index"> + <table> + <tr> + <td><a href="#usecases">Intended application cases</a></td> + <td><p>describe the common use-cases scenario(s) for multiple inputs</p></td> + </tr> + <tr> + <td><a href="#principles">Design principles</a></td> + <td><p>design principles of input rotation infrastructure</p></td> + </tr> + <tr> + <td><a href="#probing">Design notes - probing</a></td> + <td><p>design notes about probing and input rotation</p></td> + </tr> + <tr> + <td><a href="#decoding">Design notes - importing</a></td> + <td><p>design notes on how transcode (main program) deals with input rotation</p></td> + </tr> + </table> + </div> + + <hr /> + + <div id="usecases"> + <a name="usecases"><h4>Intended application cases</h4></a> + <p> + New input rotation code introduced in 1.1.0 is a revision from the ground up of how multiple input + should be handled in transcode. First and foremost, some basic usage cases are identified: + </p> + <ul> + <li> + <p> + Jack wants to make a video clip from a bunch of JPEG images. + </p> + </li> + <li> + <p> + Tyler records TV using transcode itself, and he wants now to transcode a group of low-compressed AVIs + into XviD. + </p> + </li> + <li> + <p> + Marla has some NUV files and she wants to join them and transcode it to DVD. + </p> + </li> + </li> + </ul> + <p> + Some key aspects emerge from examination of intended use cases: + </p> + <ul> + <li> + <p> + Each input file can contains one <strong>or more</strong> source frame(s). + </p> + </li> + <li> + <p> + Multiple input need to be intelligently merged before to import (think to AVI case). + </p> + </li> + <li> + <p> + New code should handle grafefully and efficiently <strong>a lot</strong> of input files. + </p> + </li> + + </ul> + </div> + + <div id="principles"> + <a name="principles"><h4>Design principles</h4></a> + <p>body of paragraph</p> + </div> + + <div id="probing"> + <a name="probing"><h4>Design notes - probing</h4></a> + <p>body of paragraph</p> + </div> + + <div id="decoding"> + <a name="decoding"><h4>Design notes - decoding</h4></a> + <p>body of paragraph</p> + </div> +</body> +</html> diff --git a/debian/transcode/transcode-1.1.7/docs/tech/html/tc_libraries.html b/debian/transcode/transcode-1.1.7/docs/tech/html/tc_libraries.html new file mode 100644 index 00000000..c3318e13 --- /dev/null +++ b/debian/transcode/transcode-1.1.7/docs/tech/html/tc_libraries.html @@ -0,0 +1,256 @@ +<?xml version="1.0"?> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <meta name="generator" content= + "HTML Tidy for Linux (vers 12 April 2005), see www.w3.org" /> + + <title>transcode </title> + <meta http-equiv="Content-Type" content= + "text/html; charset=us-ascii" /> + <meta name="Author" content="Francesco Romani" /> + <meta name="Keywords" content="transcode architecture libraries" /> + <meta name="Generator" content="ViM 7.x" /> + <link rel="StyleSheet" href="tc_basic.css" type="text/css" media= + "screen" /> +</head> + +<body> + <div id="title" class="title"> + <h1>Transcode - overview of libraries</h1> + </div> + + <div id="summary"> + <h3>Summary</h3> + <p> + As part of 1.1.0 development cycle, an huge internal reorganization + effort has undergone. Reorganization isn't yet (as 1.1.0 released) + complete, and will involve every component in transcode codebase. + This document provide an overview of reorganized internal transcode + libraries, internal dependencies and purposes. + </p> + <h4>General Warning:</h4> + <p> + transcode libraries are quite carefully designed and implemented + in order to be independent, self contained as much as is possible, + but they <strong>are not</strong> intended to be easily separated by transcode + codebase and to be used in external projects. <strong>We don't care too + much about API/ABI stability yet, and we don't do testing on + this direction</strong>. Help us to improve code, or use it at own risk :) + </p> + </div> + + <hr /> + + <div id="index"> + <table> + <tr> + <td><a href="#aclib">aclib</a></td> + <td><p>low-level, optimized core routines.</p></td> + </tr> + <tr> + <td><a href="#avilib">avilib</a></td> + <td><p>simple AVI I/O support.</p></td> + </tr> + <tr> + <td><a href="#libtc">libtc</a></td> + <td><p>core utilities repository.</p></td> + </tr> + <tr> + <td><a href="#libtcaudio">libtcaudio</a></td> + <td><p>audio manipulation routines.</p></td> + </tr> + <tr> + <td><a href="#libtcvideo">libtcvideo</a></td> + <td><p>video manipulation routines.</p></td> + </tr> + </table> + </div> + + <hr /> + + <div id="aclib"> + <a name="aclib"><h4>aclib</h4></a> + <table> + <tr> + <td> + <h5>Dependencies:</h5> + </td> + <td> + <h5>Introduced in version:</h5> + </td> + </tr> + <tr> + <td> + <p>None</p> + </td> + <td> + <p>0.6.x or before</p> + </td> + </tr> + <tr> + <td> + <h5>Description:</h5> + <p> + provides accelerated, machine-dependent, utility functions like memcpy, colorspace conversion routines and so on. + </p> + </td> + </tr> + <tr> + <td> + <h5>Notes:</h5> + <ul> + <li> + <p><strong>"AC"</strong> stands originally for "<strong>A</strong>dvanced + <strong>C</strong> <strong>lib</strong>rary, + but at present day meaning of "AC" has been unspecified :) + </p> + </li> + <li> + <p>Rewritten completely during 1.1.0 cycle by Andrew Church.</p> + </li> + </ul> + </td> + </tr> + </table> + </div> + + <div id="avilib"> + <a name="avilib"><h4>avilib</h4></a> + <table> + <tr> + <td> + <h5>Dependencies:</h5> + </td> + <td> + <h5>Introduced in version:</h5> + </td> + </tr> + <tr> + <td> + <p>None</p> + </td> + <td> + <p>0.6.x or before</p> + </td> + </tr> + <tr> + <td> + <h5>Description:</h5> + <p> + provides I/O stream access to AVI files. Only multiplexing/demultiplexing, no encoding/decoding. + </p> + </td> + </tr> + <tr> + <td> + <h5>Notes:</h5> + <p>Scheduled for an heavy reorganization/refactoring during 1.2.0/1.3.0 cycle.</p> + </td> + </tr> + </table> + </div> + + <div id="libtc"> + <a name="libtc"><h4>libtc</h4></a> + <table> + <tr> + <td> + <h5>Dependencies:</h5> + </td> + <td> + <h5>Introduced in version:</h5> + </td> + </tr> + <tr> + <td> + <p>None</p> + </td> + <td> + <p>1.0.x</p> + </td> + </tr> + <tr> + <td> + <h5>Description:</h5> + <p> + utility/helpers collection. Provides memory allocation/disposal, string + manipulation, I/O helper functions. Also holds all low-level code + shared between modules. + </p> + </td> + </tr> + <tr> + <td> + <h5>Notes:</h5> + <p>Greatly enhanced during 1.1.0 cycle.</p> + </td> + </tr> + </table> + </div> + + <div id="libtcaudio"> + <a name="libtcaudio"><h4>libtcaudio</h4></a> + <table> + <tr> + <td> + <h5>Dependencies:</h5> + </td> + <td> + <h5>Introduced in version:</h5> + </td> + </tr> + <tr> + <td> + <p>None</p> + </td> + <td> + <p>1.1.x</p> + </td> + </tr> + <tr> + <td> + <h5>Description:</h5> + <p> + provides various audio manipulation functions used by transcode core and modules. + </p> + </td> + </tr> + </table> + </div> + + <div id="libtcvideo"> + <a name="libtcvideo"><h4>libtcvideo</h4></a> + <table> + <tr> + <td> + <h5>Dependencies:</h5> + </td> + <td> + <h5>Introduced in version:</h5> + </td> + </tr> + <tr> + <td> + <p><a href="#aclib">aclib</a></p> + </td> + <td> + <p>1.1.x</p> + </td> + </tr> + <tr> + <td> + <h5>Description:</h5> + <p> + provides various video manipulation functions used by transcode core and modules. + </p> + </td> + </tr> + </table> + </div> + + +</body> +</html> diff --git a/debian/transcode/transcode-1.1.7/docs/tech/html/tc_logo.png b/debian/transcode/transcode-1.1.7/docs/tech/html/tc_logo.png Binary files differnew file mode 100644 index 00000000..c06396ce --- /dev/null +++ b/debian/transcode/transcode-1.1.7/docs/tech/html/tc_logo.png diff --git a/debian/transcode/transcode-1.1.7/docs/tech/html/tc_template_page.html b/debian/transcode/transcode-1.1.7/docs/tech/html/tc_template_page.html new file mode 100644 index 00000000..f29fd16f --- /dev/null +++ b/debian/transcode/transcode-1.1.7/docs/tech/html/tc_template_page.html @@ -0,0 +1,66 @@ +<?xml version="1.0"?> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <meta name="generator" content= + "HTML Tidy for Linux (vers 12 April 2005), see www.w3.org" /> + + <title>transcode technical documentation template page</title> + <meta http-equiv="Content-Type" content= + "text/html; charset=us-ascii" /> + <meta name="Author" content="Francesco Romani" /> + <meta name="Keywords" content="transcode architecture internals template page" /> + <meta name="Generator" content="ViM 7.x" /> + <link rel="StyleSheet" href="tc_basic.css" type="text/css" media= + "screen" /> +</head> + +<body> + <div id="title" class="title"> + <h1>Transcode - TITLE OF PAGE</h1> + </div> + + <div id="summary"> + <h3>Summary</h3> + <p>a few lines (1-30) describing the page content and highlights</p> + </div> + + <hr /> + + <div id="index"> + <table> + <tr> + <td><a href="#foo">Paragraph 1</a></td> + <td><p>short description of paragraph 1</p></td> + </tr> + <tr> + <td><a href="#bar">Paragraph 2</a></td> + <td><p>short description of paragraph 2</p></td> + </tr> + <tr> + <td><a href="#baz">Paragraph N</a></td> + <td><p>short description of paragraph N</p></td> + </tr> + </table> + </div> + + <hr /> + + <div id="paragraph1"> + <a name="foo"><h4>Paragraph 1</h4></a> + <p>body of paragraph 1</p> + </div> + + <div id="paragraph2"> + <a name="bar"><h4>Paragraph 2</h4></a> + <p>body of paragraph 2</p> + </div> + + <div id="paragraphN"> + <a name="baz"><h4>Paragraph N</h4></a> + <p>body of paragraph N</p> + </div> +</body> +</html> diff --git a/debian/transcode/transcode-1.1.7/docs/tech/ibp_support.txt b/debian/transcode/transcode-1.1.7/docs/tech/ibp_support.txt new file mode 100644 index 00000000..5eeae97c --- /dev/null +++ b/debian/transcode/transcode-1.1.7/docs/tech/ibp_support.txt @@ -0,0 +1,65 @@ +IBP support for transcode + +This is the web page about IBP and related tools +http://loci.cs.utk.edu/ + +Binary utilities can user lors URI for input and/or output file. + +If we want to access file in the IBP depot then URI in form + +lors://host:port/local_path/file?bs=number&duration=number&copies=number&threads=number&timeout=number&servers=number&size=number + +is used. User can also use the short form URI + +lors:///local_path/file + +When we want to read an IBP file, the local_path/file specifies local file +where is stored exNode with XML specification. When writing an IBP file the +local_path/file specifies local file where to store exNode with XML +specification of IBP depots used. + +The paremeters in the full form of URI mean as follows: + +host specification of L-Bone server location +port specification of L-Bone server port (default 6767) +bs specification of block-size for transfer in megabytes (default 10) +duration specification of allocation duration in seconds (default 3600s) +copies specification of number of copies (default 1) +threads specification of number of threads (concurrent TCP streams) (default 1) +timeout specification of timeout in seconds (default 100) +servers specification of number of unique IBP depots (default 1) +size specification of assumed file size in bytes (default 10MB) + +There are environment variables that can be used instead of URI parameters for +the LoRS layer. + +LBONE_SERVER specifies L-Bone server location +LBONE_PORT specifies L-Bone server port (default 6767) +LORS_BLOCKSIZE specifies block-size for transfer in megabytes (default 10) +LORS_DURATION specifies duration of allocation in seconds (default 3600s) +LORS_COPIES specifies number of copies (default 1) +LORS_THREADS specifies number of threads (concurrent TCP streams) (default 1) +LORS_TIMEOUT specifies timeout in seconds (default 100) +LORS_SERVERS specifies number of unique IBP depots (default 1) +LORS_SIZE specifies assumed file size in bytes (default 10MB) + +At least LBONE_SERVER or host must be set. + +Transcode program can be used in almost traditional way. If we want to store +the file to the IBP depot then URI in form lors:///local_path/file is used +instead of local file name. The environment variables should be set unless user +specifies URI in its full form. The same form of URI can be used for loading +the file from the IBP depot. Transcode can read and write ordinary local files +as well. The prefix lors:// is required for accessing IBP, otherwise local file +is used. + +For example: + +LBONE_SERVER=our.ibp.host; +transcode -i lors:///video.dv.xnd -P1 -N 0x1 -y raw -o lors:///temp1-remux.avi.xnd -E 44100,16,2 -J resample + +Transcode will use source file identified by serialized description of IBP +exNode stored in video.dv.xnd file on local disc in the current directory. The +L-Bone server location is taken from environment variable (referring to +our.ibp.host) and resulting serialized exNode XML description will be +stored in the current directory as temp1-remux.avi.xnd diff --git a/debian/transcode/transcode-1.1.7/docs/tech/import-API.txt b/debian/transcode/transcode-1.1.7/docs/tech/import-API.txt new file mode 100644 index 00000000..e3c7958e --- /dev/null +++ b/debian/transcode/transcode-1.1.7/docs/tech/import-API.txt @@ -0,0 +1,95 @@ + IMPORT MODULE WRITING HOWTO + --------------------------- + +Some very short documentation on writing import modules for transcode + +include this file: +------------------ + +#include "transcode.h" // definition of vob_t and transfer_t structures + + +data exchange structures for modules: +----------------------------------- + +typedef struct _vob_t { +// see transcode.h for details +} vob_t; + +typedef struct _transfer_t { + + int flag; // specifies context: TC_VIDEO for video + TC_AUDIO for audio + // or passes an integer to the module + + FILE *fd; // file handle for input stream + // NULL if import module performs reading + + int size; // total amount of bytes in the buffer + + char *buffer; // pointer to data array with frame data + char *buffer2; + + int attributes; + +} transfer_t; + + +single function interface: +-------------------------- + +int tc_import(int opt, void *para1, void *para2); + +exit codes: all handled by transcode +TC_IMPORT_UNKNOWN option not supported +TC_IMPORT_OK no error, hopefully the default +TC_IMPORT_ERROR a critical error occurred + +input parameter: +opt contains the requested action id +para1/2 its actually meaning depends on option + +requested method: + +transcode calls the following routines in this order +for both import modules, i.e., first for video and subsequent with the +audio context flag set. + +[1] +opt=TC_IMPORT_NAME +para1=_transfer_t +para2=NULL +requested action: print out some general module infos to stderr + and inherit transcode verbosity flag + (optional return capability flag) + + //>0.3.3 of transcode interpret flag returned + //to read module capabilities for sanity checks +status: optional + +[2] +opt=TC_IMPORT_OPEN +para1=_transfer_t +para2=_vob_t +requested action: return a file handle for reading from the pipe or + return NULL if import modules handles data read +status: required if following option is not implemented + +[3] +opt=TC_IMPORT_DECODE +para1=_transfer_t +para2=_vob_t +requested action: return a frame and the total amount of bytes read + + //>0.3.3 of transcode accepts import module returned amount + //of bytes in buffer. Module does the error checks anyway. + +status: required if previous option is not implemented + +[4] +opt=TC_IMPORT_CLOSE +para1=_transfer_t +para2=NULL +requested action: close streams or any open files, free memory and prepare + module removal +status: required diff --git a/debian/transcode/transcode-1.1.7/docs/tech/libraries.txt b/debian/transcode/transcode-1.1.7/docs/tech/libraries.txt new file mode 100644 index 00000000..5120754b --- /dev/null +++ b/debian/transcode/transcode-1.1.7/docs/tech/libraries.txt @@ -0,0 +1,63 @@ +TRANSCODE LIBRARIES ORGANIZATION +================================ + + +Summary +------- + +As part of 1.1.0 development cycle, an huge internal reorganization +effort has undergone. Reorganization isn't yet (as 1.1.0 released) +complete, and will involve every component in transcode codebase. +This document provide an overview of reorganized internal transcode +libraries, internal dependencies and purposes. + +GENERAL WARNING: +transcode libraries are quite carefully designed and implemented +in order to be independent, self contained as much as is possible, +but they *are not* intended to be easily separated by transcode +codebase and to be used in external projects. We don't care too +much about API/ABI stability yet, and we don't do testing on +this direction. Help us to improve code, or use it at own risk :) + + +Overview +-------- + +Library: aclib +Dependencies: None +Purpose: + provides accleretad, machine-dependent, utility functions + like memcpy, colorspace conversion routines and so on. + +Library: avilib +Dependencies: None +Purpose: + provide I/O stream access to AVI files. Only multiplexing/demultiplexing, + no encoding/decoding. + +Library: libtc +Dependencies: None +Purpose: + utility/helpers collection. Provides memory allocation/disposal, string + manipulation, I/O helper functions. Also holds all low-level code + shared between modules. + +Library: libtcinput +Dependencies: libtc +Purpose: + input layer abstraction. Provide access to stream data from heterogeneous + media through a common layer. That's `tccat' program foundation. + +Library: libtcaudio +Dependencies: None +Purpose: + provides various audio manipulation functions used by transcode core + and modules. + +Library: libtcvideo +Dependencies: aclib +Purpose: + provides various video manipulation functions used by transcode core + and modules. + + diff --git a/debian/transcode/transcode-1.1.7/docs/tech/module-system-API.txt b/debian/transcode/transcode-1.1.7/docs/tech/module-system-API.txt new file mode 100644 index 00000000..9d8ee9c3 --- /dev/null +++ b/debian/transcode/transcode-1.1.7/docs/tech/module-system-API.txt @@ -0,0 +1,660 @@ + + Module System for Transcode 1.1.0 and later + =========================================== + + Francesco Romani <fromani@gmail.com>, Andrew Church <achurch@achurch.org> + - + Revision 0.5, 17 August 2006 + + Index: +--------------------------------------------------------------------------- + 1. Introduction + 2. Overview + 3. Core API + 3.1. What you need to use NMS + 3.2. Example code + 3.3. The module factory + 3.4. Creating and destroying modules + 3.5. TCModule + 3.6. Using modules + 4. Plugin API + 4.1. What you need to use NMS (as a plugin writer) + 4.2. Example code + 4.3. Structure of a NMS plugin + 4.4. The registration process + 5. Plugin-Writing-HOWTO + 6. Internal structure + 6.1. Why the factory? + 6.2. About multithreading safeness + 6.3. On explicit reference counting + 6.4. Possibile API and ABI breakage + 6.5. init VS configure, fini VS stop + 6.6. A bit more about multiplexors and demultiplexors + 7. Final notes + 8. Appendix A: planned improvements in 1.2.0 and beyond + + + *** + + 1. Introduction +--------------------------------------------------------------------------- + +This document provides basic informations about the new module system +introduced in transcode 1.1.0. New system has API, ABI and even semantic +incompatible with old one. This breakage was needed to address the +recognized problems of old model. We (designers and coders) hope that new +one will serve better our purposes. Anyway, new model hasn't any claim of +generality or effectiveness outside transcode use cases: new API was +designed to be the simplest and cleanest thing that work in transcode +environment, and it doesn't provide any guarantee outside this field. +I (Francesco) have chosen to reimplement our module system from scratch, +despite the fact that well-known libraries such glib provides own ones, +to lower as much as possible the dependencies count for transcode itself. +Other developers agrees on the importance of this objective, where it +is feasible to do (of course we hardly reimplement from scratch some +Audio/Video codecs!). +Header and source code files was written trying to achieve readability +and clarity. Reader is encouraged to take a look at source code and, +especially, header files to get more informantions and more precise +documentation about the functions and data structures provided. + +Feel free to suggest improvements to API and/or to this documentation. +PLEASE! report inconsistencies between this documentation and header +and/or source code files. +Send suggestions on transcode-devel@exit1.org mailing list. +Help us to make transcode better! + +Francesco's notes: +I'm not a native english speaker. Send me corrections about documentation +rather than code, and I will apply as soon as is possible :) + +Quick terminology overview: +- NMS: + Acronym of (transcode's) New Module System +- plugin: + a shared object (usually) on disk that implements one or more + 'module's. +- module: + the central abstract object handled by NMS. + A 'module' is a piece of C code that respect some given constraints + (see more) and is usable by transcode. Often a 'plugin' implements + only a 'module' (or a single 'module' is packed in a single 'plugin'), + but there isn't a such constraint, that's only the current practice. +- module instance: + a 'module' specify both the procedures and the data needed to be used + properly. We call 'instance' of a module the unshared, private portion + of such data. So, if a 'module' is created and runned multiple times, + each one has his private context and his private data, so everyone can + run independently from each other. Please note that 'modules' _always_ + have some common, shared (and unmodifiable) data. +- module class: + every module can belong to one or more 'module class'. A 'module class' + describe what a given module is supposed to do; this usually means + specifyng what functions and/or capabilities a given module supports + and/or provides. + + +2. Overview +--------------------------------------------------------------------------- + +The new module system (NMS) aims to provide a generic framework for +module handling through transcode, including external programs and +helper tools like tcmodinfo. +NMS aims also to incourage people writing of clean multi-instance plugins, +avoiding the 'single huge function syndrome' that affects most of filter +plugins as in transcode < 1.1.0. NMS provide a new and richer capabilities +support code, supporting a wider range of plugin classes: no more only +import (demux + decoding), filter and export (encoding + mux). + +NMS supports now five module classes, and is a fundamental part of module +revision process taken starting from transcode 1.1.0. +Please note that a given module CAN belong to more than one class (this +means that such module just implements more functions). + +- demuxing module: + take care of reading stream data and extract audio stream, + video stream and so on +- decoding module: + decodes A/V frame to raw data +- filter module: + apply some transformation to A/V raw data +- encoding module: + encodes raw data in a user-defined format +- muxing module: + packs encoded data in a user-defined container + +More module classes (notably an input and/or output abstraction) +can be added in future releases, but class count should not increase +too much in NMS lifespan. + +Exact specification and documentation about such extended module classes +are partially beyond the purpose of this document; they are further +examined only for the parts related to NMS. + +NMS has quite different usage from old module system. +A piece of code that want to use a transcode plugin through NMS should +roughly: + +- start a module factory: this will initialize the subsystem; the + most important parameter is the module search path, that is no longer + hardcoded into code. +- ask to a module factory to create a given module. This will trasparently + load a plugin if needed, resolve needed symbols, initialize it and + finally pass back as a reference to client code. In short, module factory + does all black magic for you ;) +- use the module exposed functions as you wish. + Above module classes requires roughly the implementation of one module + for each one plus some mandatory support methods. For example, filter + class requires the implementation of 'filter_video' or 'filter_audio' + (or both) operation, (WARNING: as in transcode 1.1.0, this is not + enforced, yet) but a given module can implement more than one class + simply providing more methods implementation. + As an user of a module, just request the operation and check + the returned code :) + Of course, you can also use the new capabilities system to peek what + a loaded module is supposed to do. More on this topic later. +- when you're set, ask to factory to unload the module. You CAN'T just + free your module manually, since factory needs again to do some black + magic to handle things nicely. +- eventually shutdown the module factory itself. Do this only when + you have released all modules instances, or factory will complain loudly. + +NMS Core API (from module *user* viewpoint) will be covered with greater +detail into section 3 of this document. +For interested people, section 6 of this document contains design notes +and some documentation about the NMS internals. + +From module writer viewpoint, some there are major changes too. +First af all, all new-style modules have a unified entry point with +following signature (defined in tcmodule-plugin.h): + +const TCModuleClass *tc_plugin_setup(void); + +If NMS code can't find such symbol defined in your shared object, +it assumes that given SO *IS NOT* a valid NMS module, and it will go +ahead. +NMS entry point is no longer the main entry point for a given module, +but it's simply the entry point for whole registration process. +Real execution of module code will happen through some function pointers +that each module should register into core as initialization stage. +This registration happen, as well as other needed intialization code, +into new entry point. + +So, NMS requires that each module provides (roughly) a single function +for each implemented operation. Formerly, this was already a good module +writing pratice, but was not required by former old module system which +used a single function interface to do everything. + +NMS has also explicit support for module instance data. Each module +descriptor provide an opaque pointer to module-defined data, which is +opaque to core and can be used freely by module code. + +To summarize, a NMS-compliant module will + +- provide a separate function for each implemented operation, plus + a few function for support routines (initialization, shutdown, + configuration, stop, introspection) which must conform to a + give signature. + Each method will handle explicitely private (instance) data. +- provide a single uniform entry point for registration process. + core uses module specific methods via some function pointers, + so real code can be made static and private; module itself + should give back to core valid function pointers to his methods + as part of registration process +- register his capabilities in the exported module initialziation + hook. This means registration of methods but also notification + of module capabilities. A module can do arbitrary operations + other than required ones, even this should never be needed. + +NMS Plugin API (from module *writer* viewpoint) will be covered with greater +detail into section 3 of this document. +Section 4 of this document will provide some hints for a module writer. + + +3. Core API +--------------------------------------------------------------------------- + +The reader of this section is encouraged to take a look of documentation +of functions and data structures embedded into header files of NMS to +become confident with the notions exposed here. +Interesting files: + + libtc/tcmodule-core.h + libtc/tcmodule-data.h + libtc/tcmodule-info.h + +This section will not explore the semantic and the meaning of parameters +of core API functions, interested reader should be better served just +reading comments on interesting header files. +This section will instead explore the semantic of NMS core API and will +serve to basic usage tutorial. + + +3.1. What you need to use NMS +----------------------------- + +To use transcode's NMS, you need to include some header files on your code: + +#include "tcmodule-core.h" +#include "tcmodule-info.h" + +Build system for transcode take care to setup the right include search path. +Otherwise, you should give explictely to gcc (code isn't tested on +different compilers due to lack of software): + +gcc $YOUR_OPTS -I/path/to/tc/src/libtc/ ... + +You also need to link libtc. + +Once you have set the gritty details, you are read to start. + + +3.2. Example code +----------------- + +Take a look into tools/tcmodinfo to get maybe the simplest way to use +the NMS. tcmodinfo will just load a user-requested module and will print +out it's capabilities. Future releases of this document will perhaps add +more (pseudo)code examples. + +You can also want to look NMS bundled test (in testsuite/ and or libtc/, in +latter case test is embedded, as a comment in tcmodule.c) to get some more +examples. + + +3.3. The module factory +----------------------- + +A key element in NMS is the module factory. From the point of view +of a module user, a factory is represented by a totally opaque handler +enterely managed by tcmodule code. +The factory take care of loading plugins (the real shared object holding +plugin code) if needed, unloading them if no longer need, accounting, +and create instances. In short, factory does all the dirty work for you. + +In order to obtain, and release, a factory handler, you must use the +tc_new_module_factory and tc_del_module_factory functions. +Arguments and syntax of this functions is documented on tcmodule-core.h +header file. + +Client code can theorically request an arbitrary number of factories, +but each factory can handle ONLY modules created by herself. To +request a factory to do an operation on a module NOT built by herself +will cause a undefined behaviour (expect crash or some other weird things). +In a just few words: DON'T DO THIS! :) +In the common case, "one factory will be enough for everyone". + + +3.4. Creating and destroying modules +------------------------------------ + +It's really simple. Just ask to your factory to create a brand new module +belonging to a given class and from a given name. +When the module is built, you must configure it passing some options +packed in a string using the configure function (tc_module_configure). +some modules can be reconfigured multiple times, some other can +be reconfigured just the first time; This behaviour is fully +module-(class-)dependent. +Options are specific to a module, and there is no way to describe they +in a general fashion. +Since a module can be (or must be, for multiplexors) reconfigured +a run time, the need for inspecting module settings arise. +NMS provide an explicit operation for inquiry the actual settings of +a module, the 'inspect' operation. Client code can request to know +the status each and/or all module configurable parameters using this +operation. + +Please note that NMS *NOT* knows _before_ to loading what every module +is capable to do, nor the class of a given module. Everything +is detected after the loading using new capabilities code. +This means that you can ask to load a given module without to already +know it's class, nor you ask to load all modules of a given class. +Both above requests will lead to an error. +As in transcode 1.1.0, module class and module name are in facts +tightly bound and can't be handled separately. + +Known module classes as in transcode 1.1.0: + + demultiplex, + decode, + filter, + encode, + multiplex + +Destroying a module is really simple. Just invoke the destruction +function using your factory and the module, and the latter will be +destroyed. But remember that real originating plugin will be +unloaded only with all spawned modules are destroyed. +In facts, destruction of last module triggers plugin +unloading. The factory can detect at any time if a given module is +the last one or not. You should'nt worry about this. + +Take care to check the return code of tc_del_module, since it +triggers plugin unloading it can fail. Some debug messages are +sent to (real) users using tc_log*(). +Future releases perhaps will add some detailed error codes than +actual ones, which just carries a "failed/succeeded" information. + + +3.5. TCModule +------------- + +The reader might also take a look at tcmodule-data.h. +The `TCModule' data structure represent a module instance. +It is composed by two main components: the module class data, +comprehending function pointers to real module and capabilities +information, and the module instance section, private for each module. + +You can see the declarations in tcmodule-data.h for more details. +Most of details are handled by NMS code, so you normally don't need +to access neither module class or module private instance data. +In facts, instance data should be accessed only by module code, and +should be opaque both for NMS and for client code. + +It's safe to access (in read-only) the class data, and this is also +needed to effectively use a module, since function pointers to module +methods are embedded in class data. For this purpose a few commodities +macro are provided. Direct access is also possible. +The only 'critical' field in a class structure is the 'id' one. +This field is used internally by NMS (see code) and should not be even +considered by client code. + +You can notice that both module instance data and module class data +have a 'id' field. These two fields are in fact independent, and both +must be considered opaque by client code. + + +3.6. Using modules +------------------ + +Usage of a module, if we want to ignore the internals and the gory details, +should be really easy and straightforwarded. +For each possibile module operation, there is a convenience (inline) function +for easier usage and to avoid clumsy module->operation(module, ... ) syntax. + +The list of supported operations follows: + +tc_module_configure(module, options, vob) + (re)configure a module, changing it's internal settings; + modules *requires* to be configure()d _explicitely_ + before the usage. + +tc_module_stop(module) + stop a module and prepare it for a new safe (re)configuration. + this means flushing all buffers, closing files and so on. + +tc_module_inspect(module, param, *value) + query about the actual value of a given parameter. + +tc_module_encode_video(module, inframe, outframe) +tc_module_encode_audio(module, inframe, outframe) + encode a give video or audio frame and store data in another one. + +tc_module_decode_video(module, inframe, outframe) +tc_module_decode_audio(module, inframe, outframe) + decode a give video or audio frame and store data in another one. + +tc_module_filter_video(module, vframe) +tc_module_filter_audio(module, aframe) + apply a filter in place to a video or audio frame. + +tc_module_multiplex(module, vframe, aframe) + pack given encoded audio and video frame (both at once or just one) + +tc_module_demultiplex(module, vframe, aframe) + unpack encoded audio and video frame (both or just one) + +Just use any of above functions in your code. Do not forget to check the +return code. In the common case, return value of -1 means 'error', +and 0 means 'succesfull'. + +A few special parameters exists for 'inspect': + +for 'inspect': +* "all" option will force the module to return to calling environment + a representation of /all/ internal parameters, packed in a single + string. This string will be packed in the same format accepted by + module option string +* "help" option will force the module to return a textual, human readable + overview of the module, along with an explanation of name, value range + and meaning of accepted parameters. Special parameters will not be + present in this description. + + +4. Plugin API +--------------------------------------------------------------------------- + +The reader of this section is encouraged to take a look of documentation +of functions and data structures embedded into header files of NMS to +become familiar with the notions exposed here. +Interesting files: + + libtc/tcmodule-plugin.h + libtc/tcmodule-data.h + libtc/tcmodule-info.h + + +4.1. What you need to use NMS (as a plugin writer) +-------------------------------------------------- + +Simply include the header file in your plugin source file (or in your main +plugin source file): + +#include "tcmodule-plugin.h" + +and you have access to all data structures, constants and functions +(in fact just one :) ) that you need. Of course, you must design your +plugin accordingly to NMS structure (covered later on this section and in +the following section). +Of course, your plugin must be compiled as shared object. + + +4.2. Example code +----------------- + +You can take a look to filter/filter_null.c multiplex/multiplex_null.c +or encode/encode_null.c. + +Future releases of this document will perhaps add more (pseudo)code +examples. + + +4.3. Structure of a NMS plugin +------------------------------ + +There is quite a few strict constraints about the structure of a NMS +plugin. Obviously, due to multiple-function-pointers structure, you +must provide a separate function for each method implemented. +This is intended to avoid the Single Huge Function Syndrome sometimes +found on old-style filters ;) + +Is recommended to keep the biggest number of symbols on your plugin +as private (just use 'static' qualifier for functions and reduce +the usage of global variables, better to avoid it totally if it's +feasible -and usually it's-). +NMS has explicit support for module private data, so you should not +need to use static variables on your plugin. +Of course you can still use these, but _you_ must take care of +multi-instances problems and so on. + +The only exception for above rule can be the capabilities data for +a plugin. This data is used only during the registration process +(see below for some other detail about this process), but is *copied* +into core in order to avoid dirty tricks. So you can just provide +a reference to some private variables. This is the preferred way +since it seems the most simple one. + +To see a simple skeleton of a NMS plugin, take a look at +filter/filter_null.c or multiplex/multiplex_null.c or +encode/encode_null.c + + +4.4. The registration process +----------------------------- + +The plugin registration process consist simply into a invocation +of tc_plugin_setup entry point. This function will return a +TCModuleClass filled by plugin with description informations +and with valid function pointers to operations implemented +by plugin. + +Core will do some sanity checks on this descriptor returned +by plugin, and use the given informations to fill it's +own descriptor. Core WILL NOT change the informations provided +by a plugin, unless they are detected as incorrect. In this +case an error will be emitted (via tc_log*()) and more. +Core will also setup sensible fallback values for all informations, +or operations, not provided by a given plugin. + +Once a plugin is registered, there is no way to change registered +data, nor to re-register or de-register itself. + + +4.5. The plugin entry point +--------------------------- + +(WRITEME) + +4.6. Intialization and finalization of a module +------------------------------------------------ + +There is a couple of mandatory operations that a module must implement +still not covered in this document. Those operations are the 'init' +intialization operation and the 'fini' finalization operation. +Those operations WILL NOT be exported to client code, and are used +*only* trasparently by NMS code. +'init' operation take care of initializing the part of a module that +isn't changed by configure() operation and sets defaults. +'fini' operation must cleanup everything and release *all* resources +acquired by a module. Is the 'one and true' finalization routine, the +last that is executed during the module life. + + +4.7. Differences between module classes +--------------------------------------- + +(WRITEME) + + +5. Plugin-Writing-HOWTO +--------------------------------------------------------------------------- + +FIXME: WRITEME + + +6. Internal structure +--------------------------------------------------------------------------- + +This section holds sparse design notes about NMS current implementation. +The reader is encouraged to take a look to source files (libtc/tcmodule*.c) +to see the gory details. + + +6.1. Why the factory? +--------------------- + +The factory descriptor was make explicite for generality and extendability. +Having explicit factory descriptor make it possible to use more than +one factory at time, even if this will be unlikely useful. +There are some use cases for this on actual codebase at time of writing. +Anyway, it's trivial to force code to use just one factory using something +like: + +/* some_tc_header.h */ + +extern TCModuleFactory main_factory; + +#define tc_load_module(type, name) \ + tc_new_module(main_factory, type, name) +#define tc_unload_module(type, name) \ + tc_del_module(main_factory, mod) + + +6.2. About multithreading safeness +---------------------------------- + +Multiple thread CANNOT execute operations concurrently on the same factory +descriptor. +It is safe to execute concurrently operations if each module operate on +it's own descriptor. This means different threads can safely use different +TCModule, but using one TCModule, or one TCFactory by two or more threads +won't work. + + +6.3. On explicit reference counting +----------------------------------- + +On linux systems, dlopen() manpage reports that dl code can trasparently +handle reference count of dlopen()ed modules, so there is no strict need +of explictely do reference counting and avoid multiple loading on NMS. +I don't know yet if this behaviour is portable. +Moreover, I don't still want to drop explicit reference count on NMS, +since it not complicate things too much and it can helps on accounting +and debug purposes. This can change in future releases, but this should +be a change totally transparent to client code. + + +6.4. Possibile API and ABI breakage +----------------------------------- + +Needs a careful review and a bit of discussion on transcode-devel. + + +6.5. init VS configure, fini VS stop +------------------------------------ + +This section will higlight and summarize the differences between the +init/configure and the stop/fini couple. + +init: ALWAYS executed BEFORE 'configure'. + Runs one and only one time during the life of a module. +configure: ALWAYS executed AFTER 'init'. + Can run one or more times during the life of a module. + Modules REQUIRES that configure is runned at least once. + It is possible that invokations of configures after the first + will be ignored by a given module. + +fini: ALWAYS executed AFTER 'stop'. + Runs one and only one time during the life of a module. + it is possible (and usually happens) that fini invokes 'stop'. +stop: ALWAYS executed BEFORE 'fini'. + Can run zero or more times during the life of a module. + Modules REQUIRES that stop is runned before to be re-configure()d. + It is possible that this function will do not anything useful. + + +7. Final notes +--------------------------------------------------------------------------- + +send any comment to <fromani@gmail.com>. Thanks for reading this. +Corrections about english are welcome. + + +8. Appendix A: planned improvements in 1.2.0 and beyond +--------------------------------------------------------------------------- +(without a particular order) + +1. Generic init/fini functions. Most of them are boilerplate code and + there is no need to replicate them every time. +2. New filter operations with explicit destination argument: + + int (*process_video)(TCModuleInstance self, vframe_list_t *src, vframe_list_t *dst); + int (*process_audio)(TCModuleInstance self, aframe_list_t *src, aframe_list_t *dst); + +3. Add open/close functions to improve (de)multiplexors: + + int (*open)(TCModuleInstance self, const char *name, uint32_t flags); + int (*close)(TCModuleInstance self); + +4. Needs careful planning: subdivide modules in separate classes to + reduce function bloat. +5. Make modules arguments explicit and handled by core: that semplifies + modules, reduce duplication, adds sanity checks for free. +6. Related to above: overhaul or get rid of optstr* stuff. +7. More docs, more sample code. +8. Make explicit preferred (native?) colorspace for modules (the one for which + the module is designed about, so it provide bests results). +9. Improve (make explicit?) flush API in muxers. +10. better muxing API (using chunks?). + +# EOF |
