--- ffmpeg-0.5+svn20090706.orig/debian/source.lintian-overrides +++ ffmpeg-0.5+svn20090706/debian/source.lintian-overrides @@ -0,0 +1,4 @@ +# The dependencies for packages within ffmpeg are different than the +# dependencies for packages that depend on the ffmpeg libraries. +ffmpeg-debian source: debian-rules-calls-debhelper-in-odd-order dh_makeshlibs (line 174) +ffmpeg-debian source: debian-rules-calls-debhelper-in-odd-order dh_makeshlibs (line 178) --- ffmpeg-0.5+svn20090706.orig/debian/ffmpeg-doc.docs +++ ffmpeg-0.5+svn20090706/debian/ffmpeg-doc.docs @@ -0,0 +1 @@ +debian/tmp/usr/share/doc/ffmpeg-doc/html --- ffmpeg-0.5+svn20090706.orig/debian/rules +++ ffmpeg-0.5+svn20090706/debian/rules @@ -0,0 +1,149 @@ +#!/usr/bin/make -f + +include /usr/share/quilt/quilt.make + +EPOCH=4: +DEB_SOURCE := $(shell dpkg-parsechangelog | sed -n 's/^Source: //p') +DEB_VERSION := $(shell dpkg-parsechangelog | sed -n 's/^Version: //p') +UPSTREAM_VERSION := $(shell echo $(DEB_VERSION) | sed -r 's/[^:]+://; s/-[^-]+$$//') +SVN_VERSION := $(shell echo $(UPSTREAM_VERSION) | sed -nr 's/^[0-9.:-]+[+.]svn([0-9]+)$$/\1/p') +SHLIBS_VERSION := 3:0.svn20090303-1 + +ifeq ($(SVN_VERSION),) +$(error UPSTREAM_VERSION: $(UPSTREAM_VERSION) - but SVN_VERSION is empty! - check debian/rules) +endif + +LIB_PKGS := $(shell sed -nr 's/^Package:[[:space:]]*(lib(avutil|avcodec|avdevice|avformat|avfilter|postproc|swscale)(-extra-)?[0-9]+)[[:space:]]*$$/\1/p' debian/control) + +# Support multiple makes at once +ifneq (,$(filter parallel=%,$(DEB_BUILD_OPTIONS))) +NUMJOBS = -j$(patsubst parallel=%,%,$(filter parallel=%,$(DEB_BUILD_OPTIONS))) +else +# on i386 and amd64, we query the system unless overriden by DEB_BUILD_OPTIONS +ifeq ($(DEB_HOST_ARCH),i386) +NUMJOBS := -j$(shell getconf _NPROCESSORS_ONLN 2>/dev/null || echo 1) +else ifeq ($(DEB_HOST_ARCH),amd64) +NUMJOBS := -j$(shell getconf _NPROCESSORS_ONLN 2>/dev/null || echo 1) +endif +endif + +include debian/confflags + +$(info FLAVORS = $(FLAVORS)) +$(info DEB_BUILD_OPTIONS = $(DEB_BUILD_OPTIONS)) +$(info CFLAGS = $(CFLAGS)) + +configure-%: configure-stamp-% +configure-stamp-%: $(QUILT_STAMPFN) + dh_testdir + mkdir -p debian-$* + [ ! -r .svnrevision ] || \ + cp .svnrevision debian-$*/snapshot_version + cd debian-$* && CFLAGS="$(CFLAGS)" $(CURDIR)/configure \ + $($*_build_confflags) $(extra_$*_build_confflags) + touch $@ + +build-%: build-stamp-% +build-stamp-%: configure-stamp-% + dh_testdir + $(MAKE) -C debian-$* $(NUMJOBS) + touch $@ + +debian-shared/tools/qt-faststart: build-stamp-shared + $(MAKE) -C debian-shared tools/qt-faststart + +build-doxy: build-doxy-stamp +build-doxy-stamp: $(QUILT_STAMPFN) + dh_testdir + doxygen + touch $@ + +build: build-stamp +build-stamp: $(addprefix build-stamp-, $(FLAVORS)) debian-shared/tools/qt-faststart + touch $@ + +clean: clean-real unpatch +clean-real: + dh_testdir + dh_testroot + rm -f build-stamp $(addprefix build-stamp-, $(FLAVORS)) \ + $(addprefix configure-stamp-, $(FLAVORS)) patch-stamp \ + build-doxy-stamp + rm -rf $(addprefix debian-, $(FLAVORS)) doxy + dh_clean + +get-orig-source: + dh_testdir + sh debian/get-orig-source.sh -d $(SVN_VERSION) + +# The trailing newline is important! +define install_flavor + $(MAKE) -C debian-$(1) install DESTDIR=$(CURDIR)/debian/tmp \ + mandir=$(CURDIR)/debian/tmp/usr/share/man + +endef + +install: build + dh_testdir + dh_testroot + dh_prep + dh_installdirs -ptmp usr/share/doc/ffmpeg/html etc + dh_installdirs -ptmp usr/share/doc/ffmpeg-doc/html + $(foreach flavor,$(FLAVORS),$(call install_flavor,$(flavor))) + install -m 644 -D debian-shared/doc/*.html debian/tmp/usr/share/doc/ffmpeg/html/ + # don't fail on binary-indep only builds. + [ ! -d doxy ] || cp doxy/html/* debian/tmp/usr/share/doc/ffmpeg-doc/html + install -m 644 -D doc/ffserver.conf debian/tmp/etc/ + install -m 644 -D debian-shared/tools/qt-faststart debian/tmp/usr/bin/qt-faststart + dh_install -Xusr/share/doc/ffmpeg-doc -Xusr/share/doc/ffmpeg \ + --fail-missing --sourcedir=debian/tmp + +formats.txt: install + env LD_LIBRARY_PATH="$(LD_LIBRARY_PATH):$(CURDIR)/debian/tmp/usr/lib" \ + debian/tmp/usr/bin/ffmpeg -formats | tee $@ + +binary-indep: build-doxy install + +binary-arch: build install formats.txt + dh_testdir + dh_testroot + dh_installman -pffmpeg debian/qt-faststart.1 + dh_installdocs $(extradoc) doc/optimization.txt + dh_installdocs -A MAINTAINERS CREDITS doc/TODO + dh_installdocs -A debian/README.Debian + dh_installdocs RELEASE + dh_installdocs -p libavcodec52 formats.txt + dh_installexamples -pffmpeg doc/ffserver.conf debian/recordshow.sh + dh_installexamples -plibavcodec-dev libavcodec/apiexample.c + dh_installchangelogs Changelog + dh_lintian + dh_link + dh_compress + dh_fixperms + dh_strip --dbg-package=ffmpeg-dbg + +# strict internal dependencies + for pkg in $(LIB_PKGS); do \ + upkg=$$(echo "$$pkg" | sed -r 's/([0-9]+)$$/-extra-\1/'); \ + dh_makeshlibs -p"$$pkg" -V"$$pkg (>= $(EPOCH)$(UPSTREAM_VERSION)) | $$upkg (>= $(EPOCH)$(UPSTREAM_VERSION)), $$pkg (< $(EPOCH)$(UPSTREAM_VERSION)-99) | $$upkg (< $(EPOCH)$(UPSTREAM_VERSION)-99)"; \ + done + env LD_LIBRARY_PATH="$(LD_LIBRARY_PATH):$(CURDIR)/debian/tmp/usr/lib" \ + dh_shlibdeps +# target dependencies for external packages + for pkg in $(LIB_PKGS); do \ + upkg=$$(echo "$$pkg" | sed -r 's/([0-9]+)$$/-extra-\1/'); \ + dh_makeshlibs -p"$$pkg" -V"$$pkg (>= $(SHLIBS_VERSION)) | $$upkg (>= $(SHLIBS_VERSION))"; \ + done + dh_installdeb + dh_gencontrol -- -Vlib1394-dev="$(lib1394-dev)" + dh_md5sums + dh_builddeb + +binary: binary-indep binary-arch + +.PHONY: build $(addprefix build-, $(FLAVORS)) build-doxy \ + clean clean-real \ + configure $(addprefix configure-, $(FLAVORS)) \ + binary binary-indep binary-arch \ + install \ + get-orig-source --- ffmpeg-0.5+svn20090706.orig/debian/libavfilter0.install +++ ffmpeg-0.5+svn20090706/debian/libavfilter0.install @@ -0,0 +1 @@ +usr/lib/{,*/,*/*/}libavfilter.so.* --- ffmpeg-0.5+svn20090706.orig/debian/ffmpeg-doc.doc-base +++ ffmpeg-0.5+svn20090706/debian/ffmpeg-doc.doc-base @@ -0,0 +1,9 @@ +Document: ffmpeg-doc +Title: ffmpeg API Documentation +Author: FFmpeg Developers +Abstract: This is the main documentation for the ffmpeg API. +Section: Programming + +Format: HTML +Index: /usr/share/doc/ffmpeg-doc/html/index.html +Files: /usr/share/doc/ffmpeg-doc/html/*.html --- ffmpeg-0.5+svn20090706.orig/debian/libpostproc51.install +++ ffmpeg-0.5+svn20090706/debian/libpostproc51.install @@ -0,0 +1 @@ +usr/lib/{,*/,*/*/}libpostproc.so.* --- ffmpeg-0.5+svn20090706.orig/debian/libavdevice52.install +++ ffmpeg-0.5+svn20090706/debian/libavdevice52.install @@ -0,0 +1 @@ +usr/lib/{,*/,*/*/}libavdevice.so.* --- ffmpeg-0.5+svn20090706.orig/debian/libavdevice-dev.install +++ ffmpeg-0.5+svn20090706/debian/libavdevice-dev.install @@ -0,0 +1,4 @@ +usr/include/libavdevice +usr/lib/libavdevice.a +usr/lib/{,*/,*/*/}libavdevice.so +usr/lib/pkgconfig/libavdevice.pc --- ffmpeg-0.5+svn20090706.orig/debian/ffmpeg.docs +++ ffmpeg-0.5+svn20090706/debian/ffmpeg.docs @@ -0,0 +1 @@ +debian/tmp/usr/share/doc/ffmpeg/html --- ffmpeg-0.5+svn20090706.orig/debian/watch +++ ffmpeg-0.5+svn20090706/debian/watch @@ -0,0 +1,3 @@ +version=3 +opts="uversionmangle=s/.*-snapshot//i" \ +http://www.ffmpeg.org/releases/ffmpeg-(.*)\.tar\.bz2 --- ffmpeg-0.5+svn20090706.orig/debian/libavutil49.install +++ ffmpeg-0.5+svn20090706/debian/libavutil49.install @@ -0,0 +1 @@ +usr/lib/{,*/,*/*/}libavutil.so.* --- ffmpeg-0.5+svn20090706.orig/debian/libavutil-dev.install +++ ffmpeg-0.5+svn20090706/debian/libavutil-dev.install @@ -0,0 +1,4 @@ +usr/include/libavutil +usr/lib/libavutil.a +usr/lib/{,*/,*/*/}libavutil.so +usr/lib/pkgconfig/libavutil.pc --- ffmpeg-0.5+svn20090706.orig/debian/libavfilter0.lintian-overrides +++ ffmpeg-0.5+svn20090706/debian/libavfilter0.lintian-overrides @@ -0,0 +1,3 @@ +# Overriding these fpic lintian errors. Please see bug #528080. +libavfilter0: shlib-with-non-pic-code usr/lib/i686/cmov/libavfilter.so.0.4.0 +libavfilter0: shlib-with-non-pic-code usr/lib/libavfilter.so.0.4.0 --- ffmpeg-0.5+svn20090706.orig/debian/changelog +++ ffmpeg-0.5+svn20090706/debian/changelog @@ -0,0 +1,1272 @@ +ffmpeg (4:0.5+svn20090706-2) unstable; urgency=low + + [ Fabian Greffrath ] + * Enable support for libdirac, now that it has entered Debian. + + [ Andres Mejia ] + * Fix ordering of FLAVORS that are installed. (Closes: #543595) + + [ Reinhard Tartler ] + * prepare new upload + * simply debian/confflags by removing the case of renaming the source + package + + -- Reinhard Tartler Wed, 26 Aug 2009 09:12:49 +0200 + +ffmpeg (4:0.5+svn20090706-1) unstable; urgency=low + + * preparing new upstream version, 0.5 release branch, rev 19352 + - this version is capable of compiling swscale in LGPL mode + * rename source package back + - The replacement package with the 'missing bits' will be called + 'ffmpeg-extra' + - simplify README.upstream-upgrade + - rename the source package from 'ffmpeg-debian' -> 'ffmpeg' + * fix aac playback regression, thanks to Matthew Wakeling for reporting + (Closes: #540729) + * fix seeking in DIF (DV) movies + Thanks to Dan Dennedy for identifying the patch! (Closes: #540424) + * debian/rules: + - merge cond_enable_nf macro from master.extra branch + - don't disable ffserver in various optimized variants + - don't disable building of statically linked helper binaries + - simply by removing the case of renaming the source package + - change the shlibs file: s/-unstripped-/-extra-/ + + -- Reinhard Tartler Thu, 13 Aug 2009 12:48:27 +0200 + +ffmpeg-debian (4:0.5+svn20090609-2) unstable; urgency=low + + [ Fabian Greffrath ] + * Remove .install files for unstripped packages that we do not build + from this branch anyway. + * Remove debian/fixup-config.sh which was only a hack needed to repair + the crippled config.h + * Finally remove strip.sh. + + [ Andres Mejia ] + * Add vdpau support by including vdpau headers in deb packaging. + (Closes: #511544) + * Don't disable encoders if internalencoders is set in + DEB_BUILD_OPTIONS. + * Enable yasm for i386 and amd64. + + [ Reinhard Tartler ] + * clarifications suggested by upstream in README.Source + * refresh patches + + [ Fabian Greffrath ] + * Document the copyright notice and license for the VDPAU headers in + debian/copyright. + * Remove parallel make support from debian/confflags, it's overridden + in debian/rules anyway. + * Quote opts in debian/watch. + * Bump debhelper compat to 7. + * Clean up clean target in debian/rules in favour of debian/clean. + * Replace "dh_clean -k" by dh_prep. + + [ Reinhard Tartler ] + * remove duplicated libxvmc-dev build dependency + * sort build dependencies alphabetically + * remove section numbering from README.Debian + * add note about the lintian override + + -- Reinhard Tartler Thu, 13 Aug 2009 12:46:46 +0200 + +ffmpeg-debian (4:0.5+svn20090609-1) unstable; urgency=low + + [ Andres Mejia ] + * Add myself to Uploaders list. + * Reorder when dh_strip is done so qt-faststart is also + stripped. + * Update to control files. + * Add new confflags for new build dependencies. + * Use .docs files to add ffmpeg and ffmpeg-doc documentation. + * Use .docs files for installing documentation. + * Add comment to 900_doxyfile patch. + * Add man page for qt-faststart. + * Bump version in changelog to prepare new release + * Fix FTBFS for ffmpeg source package with -dev packages (Closes: #527761) + * Use dh_lintian to install lintian overrides + * Update comment on fpic-* patches + * Build-Depend on debhelper (>= 6.0.7~) for dh_lintian. + * Add lintian overrides for remaining fpic lintian errors. + * Shorten comment on lintian-overrides. + * Allow passing in extra confflags, removes the need for fix-fpic + DEB_BUILD_OPTIONS. + * Fix FTBFS on kfreebsd. (Closes: #528591) + * Include patches to allow us to use opencore-amr libraries. + + [ Reinhard Tartler ] + * remove debian/control.* mechanism + * improve patch description for debian/patches/100_kfreebsd + + [ Andres Mejia ] + * Add lintian overrides for ffmpeg-debian source warnings. + * Only use .svnrevision if it's readable. + * Update source lintian-overrides for modifications to debian/rules. + * Add fix for FTBFS for GNU Hurd OS. Thanks Marc Dequènes. + (Closes: #530436) + + [ Felipe Sateler ] + * Don't add -unstripped to the unstripped variant version number + in debian/README.upstream-upgrade. + * In the same file, pass explicit version to git-import-orig + + [ Fabian Greffrath ] + * Cleaned up debian/watch file. + * Add notes why we no longer strip the orig.tar.gz. + + [ Andres Mejia ] + * Fix watch file to ignore daily snapshots. + * Make get-orig-source.sh executable. + + [ Reinhard Tartler ] + * add patch for qtrle encoding (Closes: #530016) + * Enable xvmc support by adding libxvmc-dev to build dependencies + * really add libopenjpeg-dev to build depends, actually enabling + the openjpeg decoder. + * reorganise README.Debian for the new plan [tm] + * no longer strip the source on upstream upgrades + * Imported Upstream version 0.5+svn20090609 + * adjust notes in README.upstream-upgrade for the now unstripped + debian source package + * remove hack to build with stripped sources + * bump standards version, no changes needed + + -- Reinhard Tartler Sun, 05 Jul 2009 22:52:43 +0200 + +ffmpeg-debian (4:0.5+svn20090420-2) unstable; urgency=low + + * debian/control: fix dependencies for libavutil-dev and libavfilter-dev + so that they can be used with the unstripped variants properly. + * debian/rules: set nooptflags only for relevant architectures. + * explicitly disable 'dangerous' encoders on the --configure line. + * fix SHLIBS_VERSION in debian/rules (Closes: #527350). + + -- Reinhard Tartler Mon, 04 May 2009 07:41:19 +0200 + +ffmpeg-debian (4:0.5+svn20090420-1) unstable; urgency=low + + [ Fabian Greffrath ] + * Merge the contents of patents.txt into README.Debian and change some + paragraphs to (hopefully) add some more clarity on the removed encoders + and the package naming scheme. Based on suggestions by Xavier Douville + , thank you very much for the review. (Closes: #519025) + * Reorder some confflags to account for GPL licensed libraries. + * Remove patents.txt + * Explicitely mention that no decoders are disabled in our packages. + + [ Loïc Minier ] + * Disable more autodetecter ARM arch features + * Add neon and vfp flavors to armel disabled for now + * vfp CFLAGS: add "-mfpu=vfp -mfloat-abi=softfp" + + [ Reinhard Tartler ] + * New Upstream Version (svn revision 18630) + * bump epoch as 0.5 was released. Future version will use '+' to indicate + that the package is based on a release branch and '~' to indicate that + the package is based on the 'trunk' branch. + * update from the upstream release branch to generate a new upstream + tarball. + * add a git-buildpackage config file at debian/gbp.conf + * beautify identification string + * debian/rules: bump epoch to '4' + * update section names in control file + * update upstream svn server url + * fixup get-orig-source rules in debian/rules + * create right filenames for the orig.tar.gz files + * update README.upstream-upgrate for new versioning scheme + * remove debian/005_release_branch_changes.diff + * remove reference to 020_visibility_patch + * install the upstream license file and release notes + * allow -dev packages be installed with the unstripped variants + Closes: #526007, LP: #312898 + * be more careful with svn:externals in debian/get-orig-source.sh. + (Closes: #525348) + + -- Reinhard Tartler Sat, 02 May 2009 09:09:54 +0200 + +ffmpeg-debian (3:0.svn20090303-1) unstable; urgency=low + + * New Upstream Version (svn revision 17737 libswscale revision 28799) + - Electronic Arts TQI decoder + - OpenJPEG based JPEG 2000 decoder + - NC (NC4600) camera file demuxer + - Gopher client support + - MXF D-10 muxer + - generic metadata API + * debian/get-orig-source.sh: Track the version 0.5 release branch. The + version number does not really reflect this, but this package is + actually very close to the 0.5 release branch. + * various cleanups to improve get-orig-source.sh + * Remove liba52 from the suggests field in debian/control.ffmpeg, as + ffmpeg does no longer use it since upload 0.svn20080206-10. + * Fix the Vcs-Git urls to the correct locations. + * The libavformat52 now links against libavcodec52, which breaks + applications that *ALSO* link against libavcodec51. Adding a + Breaks: libavcodec51 should prevent this and (hopefully) Closes: #516885. + * improve parallel builds on SMP/multicores by supporting the parallel + flag in DEB_BUILD_OPTIONS, and default to the number of available CPUs + on i386 and amd64. + * Drop unapplied patches from debian/patches. + * bump shlibs version. + + -- Reinhard Tartler Tue, 03 Mar 2009 21:01:25 +0100 + +ffmpeg-debian (3:0.svn20090204-3) unstable; urgency=low + + [ Fabian Greffrath ] + * remove libasound2-dev from build-depends on non-Linux archs + + [ Reinhard Tartler ] + * fix postinst generation by calling dh_installdeb after dh_makeshlibs + * upload to unstable + + -- Reinhard Tartler Sun, 22 Feb 2009 09:32:49 +0100 + +ffmpeg-debian (3:0.svn20090204-2) experimental; urgency=low + + * add libxvmc-dev to build-depends in the 'ffmpeg' variant + * add libasound2-dev to build-depends. This means that ffplay is now able to + actually play using alsa directly instead only via libsdl + * add epochs for the "internal" shlibs dependencies + + -- Reinhard Tartler Thu, 05 Feb 2009 20:30:05 +0100 + +ffmpeg-debian (3:0.svn20090204-1) experimental; urgency=low + + [ Reinhard Tartler ] + * New Upstream Version (svn revision 16978 libswscale revision 28461) + + Upstream Changes: + - R3D REDCODE demuxer + - ALSA support for playback and record + + * strighten internal dependencies by using a shlibs.local file + Closes: #512844, #512466 + * New upstream version reintroduces a compatibility symbol ff_gcd + Closes: #512946 + * Bump shlibs because of changes of the Metadata API in libavformat. + Actually no other package should use them yet, but let's better play safe + here... + * no longer install dsputil.h. It exposes lots of function that are private + to ffmpeg and may change on any new upstream revision. Please get in touch + with the ffmpeg maintainers if you maintain packages that rely on that + ffmpeg internal headers like this. + * simplify debian/confflags by doing autodetection of headers: + - xvid.h + - lame/lame.h + - faac.h + - x264.h + - vdpau/vdpau.h + Also remove the setting externalcodecs from DEB_BUILD_OPTIONS. The codecs + will be enabled as soon as the headers are installed on the filesystem, + so there is no need in enabling that separately. + * install ffpresets in /usr/share/ffmpeg/. Currently only presets for + x264 are avaiable, so a libx264 enabled libavcodec (like + libavcodec-unstripped-52) is needed to actually use them. + + [ Fabian Greffrath ] + * Enabled Speex decoding via libspeex. + * Use an alternative approach to achieve strict internal dependencies + by calling dh_makeshlibs twice in debian/rules instead of a + debian/shlibs.local file. + + -- Reinhard Tartler Sun, 01 Feb 2009 19:54:27 +0100 + +ffmpeg-debian (3:0.svn20090119-1) experimental; urgency=low + + * New Upstream Version (svn revision 16681 libswscale revision 28341) + * update Vcs-Git tags. Packaging has now moved to git + * updates to packaging that faciliate building the unstripped and ubuntu + variants of this package + * enable xvmc support + + Upstream Changes: + - SVQ3 watermark decoding support + - hybrid WavPack support + + -- Reinhard Tartler Tue, 20 Jan 2009 00:55:26 +0100 + +ffmpeg-debian (3:0.svn20090110-1) experimental; urgency=low + + * new upstream svn snapshot (svn revision 16508, libswscale revision 28286) + + Upstream Changes: + - RV30 and RV40 decoder + - QCELP / PureVoice decoder + + * removed patch 050_fix_pkgconfig_files.patch. Merged upstream + * disabled patch 020_visibility_patch. It needs to be adapted to the new + upstream changes. Hopefully it will get merged into ffmpeg properly. + * install formats.txt in the libavcodec52 package to document what + formats this version of ffmpeg has enabled. + + -- Reinhard Tartler Sun, 11 Jan 2009 20:55:48 +0100 + +ffmpeg-debian (3:0.svn20081115-1) experimental; urgency=low + + * new upstream svn snapshot (svn revision 15824, libswscale revision 27910) + * bump standards version to version 3.8.0, no changes needed + * Adjust pkg-files to no longer put unnecessary dependencies in the generated + .pc files. Closes: #504220 + + -- Reinhard Tartler Mon, 10 Nov 2008 21:37:16 +0100 + +ffmpeg-debian (3:0.svn20081108-1) experimental; urgency=low + + * upstream svn snapshot (svn revision 15786, libswscale revision 27900). + * apply visibility patch from ffmpeg-devel mailing list. This reduces the + number of symbols that are exposed to other applications. Please file + bugs if applications fail to link against ffmpeg because of that. + * remove 001_fixup_version.diff patch and use upstream --extra-version + configure flag instead. + * now really remove 015_img_convert.patch from source package. + + -- Reinhard Tartler Sat, 08 Nov 2008 16:38:23 +0100 + +ffmpeg-debian (3:0.svn20080925-1) experimental; urgency=low + + [ Loic Minier ] + * Tweak sed versions regexps to deal with epochs and upstream revisions with + dashes and be generally stricter. + * Large cleanup to rules logic: drop some cruft, rewrite some small chunks + in a slightly more readable manner, whitespaces, .PHONY fixes, + internalencoders handling, shlibs logic... + * Rename SRC_VERSION to UPSTREAM_VERSION in rules. + * Use DEB_SOURCE from the Source: field of dpkg-parsechangelog's output + instead of hardcoding the name of the source. + + [ Reinhard Tartler ] + * new svn snapshot (svn revision 15404, libswscale revision 27636). + * SONAME change: libavcodec51 -> libavcodec52 + * drop old scaler (imgres/imgconvert). Upstream is about to remove it + completely. + - reporter claims that a newer snapshot fixes a crash in the dca decoder. + Thanks to "Alexander E. Patrakov" (Closes: #496612) + * reenable h261 encoder (Closes: #459073) + + [ Fabian Greffrath ] + * debian/{ffmpeg,lib*-dev}.install: + + Simplified, e.g. install the whole /usr/include/ sub-directory for each + particular library instead of single header files one by one. + * debian/control, debian/confflags: + + Enabled Dirac support via libschroedinger. (Closes: #499785) + * debian/changelog: + + Added an epoch needed for Ubuntu. + * debian/control: + + Removed Conflicts and Replaces against packages that either aren't even + in Debian 4.0 "Etch" anymore or that use the deprecated naming scheme + from . + + Since ffmpeg-config has been removed from our packages, all inter-package + Conflicts and Replaces may be removed, too. + + Removed Build-Conflicts against libdc1394-13-dev, because + libdc1394-22-dev already does this for us. + + Updated inter-package dependencies and demoted Depends on external + library packages to Suggests, since we shouldn't encourage package + maintainers to link statically against libav*. + * debian/confflags, debian/control, debian/rules, debian/libavfilter*: + + Built libavfilter and disabled vhook in turn (Closes: #499787). + + [ Loic Minier ] + * Remove debug echo which broke shlibs, sorry. + * Fix Vcs-* control fields; thanks Gerfried Fuchs. + * Mention upstream SVN in debian/copyright; thanks Gerfried Fuchs; + closes: #499914. + + -- Reinhard Tartler Sat, 06 Sep 2008 20:07:01 +0200 + +ffmpeg-debian (0.svn20080206-12) unstable; urgency=low + + * enable vhook in all flavors. (Closes: #490272, LP: #260296) + * make ffmpeg output a proper version number. (Closes: #496133, #483923) + + -- Reinhard Tartler Sat, 23 Aug 2008 10:49:10 +0200 + +ffmpeg-debian (0.svn20080206-11) unstable; urgency=low + + [ Reinhard Tartler ] + * new patch: patches/010_fix_ftbfs_hppa.diff: On hppa shared objects + do required object files to be build "-fPIC -DPIC". Patch taken + from upstream svn. + * bugfix: libraries linked with libX11 on GNU/kFreeBSD. Thanks to + Aurelien Jarno for the patch. (Closes: #487252) + + [ Fabian Greffrath ] + * debian/confflags, debian/control: + + Build-Depend on libdc1394-22-dev explicitely and add + Build-Conflicts on libdc1394-13-dev (Closes: #490319). + + -- Reinhard Tartler Wed, 16 Jul 2008 10:41:49 +0200 + +ffmpeg-debian (0.svn20080206-10) unstable; urgency=high + + * enable mmx and sse3 in builds. These CPU features are autodetected + at runtime on amd64 and i386 using the 'cpuid' instrcution. + (Closes: #489732) + * disable support for liba52-dev. ffmpeg has its own implementation. + * don't add -fPIC -DPIC forcefully to ./configure. upstream claim that + the configure script gets this right on all architectures itself. + * Add patch 020_bug489965_bufferoverflow_str_demuxer.diff. Fixes a + buffer overflow in the STR demuxer. Thanks to Moritz Muehlenhoff for + reporting the issue. (Closes: #489965) + * Raising severity to high because of security issue. + * rework the shlibs file. Make applications linking against libraries + produced by this source package generate an alternate dependency on + the 'unstripped' variants of this package. They actually do not exist + yet at this point, but this way reverse dependencies are enabled to + use them when they eventually appear. + + -- Reinhard Tartler Wed, 09 Jul 2008 14:04:06 +0200 + +ffmpeg-debian (0.svn20080206-9) unstable; urgency=low + + [ Reinhard Tartler ] + * cleanup 010_proper_rpath.diff: remove spurious linker search paths. + * debian/strip.sh: no need to remove the glue code for x264 and xvid. + However, since that code is not built in debian anyway, the orig.tar.gz + was not rebuilt with this change. + * provide mmx-enabled shared objects on amd64. AFAIK all amd64 machines + do support MMX. + * Provide optimized versions of the libraries along the unoptimized + ones. They are installed in machines and architecture specific + directories. Optimized for further target will be added per request, + please file bugs to request them. + * rename the source package (again), this time on upstream's request. + The former name was considered insulting by upstream, because it + somewhat indicated the original source was somehow 'non-free', which is + not the case. The new name now represents that we modified the package + so that it becomes acceptable for debian. + * Cleanups in debian/rules file. + * Add verbose explanations about the renaming in README.Debian. + + [ Fabian Greffrath ] + * debian/control: + + Added Conflicts and Replaces against obsolete library packages from + wearing the 'cvs' suffix in their names + (Closes: #484585, #484586, #484587, #484776, #484778). + + Added doxygen to Build-Depends. + + Introduced new package 'ffmpeg-doc' that contains html doxygen + documentation of the ffmpeg API (Closes: #438369). + + Changed Build-Depends from libdc1394-13-dev to libdc1394-22-dev, + which is supported upstream since r11501. + * debian/ffmpeg-doc.install: + + Added. + * debian/rules: + + Build and install html doxygen documentation. + + Avoid dependency of build-stamp rule on phony targets. + * debian/libavutil-dev.install, debian/rules, + debian/patches/010_ffmpeg-config.diff: + + Removed ffmpeg-config, use pkg-config instead (maintainers of affected + packages have been informed, see #487917 to #487922). + + [ Darren Salt ] + * Added patch 900_doxyfile: tell doxyfile to ignore debian* directories. + * debian/rules: + - Reworked building so that separate source & build directories are + used. This makes cleanup simpler and speeds up maintenance by avoiding + complete rebuilds when using "debuild binary". + - Removed some file installation 'cp' commands, made unnecessary due to + the build reworking. + - Unpatching is now done *after* cleaning. + + -- Reinhard Tartler Mon, 30 Jun 2008 15:27:50 +0200 + +ffmpeg-free (0.svn20080206-8) unstable; urgency=low + + [ Fabian Greffrath ] + + * debian/control: + + Added Conflicts and Replaces on libavutil-dev (<< 0.svn20080206-7) + to libavcodec-dev (Closes: #483548). + + [ Reinhard Tartler ] + + * remove patches from the debian package as disussed with upstream: + - 005_runtime_cpudetect.diff: it is supposed to fix runtime cpu detection + on i386. The code (and the define) has undergone large refactoring wrt. + the define RUNTIME_CPUDETECT. It is very likely to have undisired + side-effects with this version of ffmpeg. It therefore seem more safe + to me to actually remove this patch for now, and reinvestigate the + problems that occur, if they do. (Related to: #482717) + - 005_m68k_workaround.diff: works around bugs in gcc for m68k. + - 006_mips_pthreads.diff: was an workaround for (now fixed) #428741. + - 020_fix_sws_scale_crash: patch has been rejected upstream: + http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/2008-May/047846.html + - 054_h264_mmx_chroma_mc_crash.diff. According to upstream, this has + been fixed in a different way and is not reproducible. Verified that + the file referenced in bug #404176 does not crash anymore even + without this patch. + * new patch: 015_reenable-img_convert.diff. Unlike previous version of this + patch, this uses a more lightweight approach. With building imgresample, a + few symbol clashes occur with libswscale. We therefore strip off symbols + that are already provided by libswscale. (Closes: #483960). + * remove 011_link_plugins.diff. It is completely unnecessary now. + * refactor quilt usage: use /usr/share/quilt/quilt.make. + * support building in paralell. make snippet taken from the qemu package. + * cleanups in debian/rules. + * Move ffmpeg-config back to libavutil. This way we can avoid a circular + dependency between libavutil-dev and libavcodec-dev. (Closes: #484132). + libavcodec uses libavutil internally, so this dependency cannot be avoided. + * disable altivec, at least for now. (Closes: #482717) + * always compile with --disable-strip. We strip the binaries afterwards using + dh_strip anyways. + * Remove depdency substitutions ${shlibs:Depends} and ${misc:Depends} from the + -dev packages. + + -- Reinhard Tartler Wed, 04 Jun 2008 00:04:08 +0200 + +ffmpeg-free (0.svn20080206-7) unstable; urgency=low + + * debian/control: + + Removed unnecessary Conflicts and Replaces from libswscale0 + (Closes: #481908), thanks Guillem Jover. + + Made libavutil-dev depend on libavcodec-dev. + * debian/libavcodec.install, debian/libavutil.install: + + Moved ffmpeg-config (script and manpage) from libavutil-dev to + libavcodec-dev (really Closes: #482213, #482214). + + -- Fabian Greffrath Tue, 28 May 2008 16:02:03 +0200 + +ffmpeg-free (0.svn20080206-6) unstable; urgency=low + + * Bug fix: "libavg: FTBFS: ld: cannot find -ldts", thanks to Lucas + Nussbaum (Closes: #482213, 482214). Fixed by removing -ldts from + ffmpeg-config. + + -- Reinhard Tartler Tue, 27 May 2008 12:45:10 +0200 + +ffmpeg-free (0.svn20080206-5) unstable; urgency=low + + [ Fabian Greffrath ] + * debian/control: + + Fixed dependency typo, libswscale0 conflicts with libswsacle1d but not + libswscale1d (Closes: #481908). + + [ Reinhard Tartler ] + * disable 015_build_imgresample.diff. Please port all applications + needing the symbols sws_{scale,getContext}, + sws_{getCachedContext,freeContext} to use libswscale instead. + * downgrade debhelper depencency to level 5. We don't use any of the + level 6 features, and level 5 faciliates backporting to earlier + releases massively. + * remove unapplied patches from source to reduce the size of the + .diff.gz. The old patches can be retrieved from branches in our svn. + + -- Reinhard Tartler Thu, 22 May 2008 09:26:06 +0200 + +ffmpeg-free (0.svn20080206-4) unstable; urgency=low + + * debian/rules: + + Moved confflags, that result in GPL versions of the libraries, into a + dedicated variable gpl_confflags. Add this to the common confflags. + + Moved --prefix=/usr to the common confflags. + + Added some comments and whitespace (nothing special). + + Renamed the "risky" keyword to "internalencoders". Set this in + DEB_BUILD_OPTIONS in order to create and build from an unstripped tarball + in the get-orig-source and build rules (Closes: #478010). + + Introduced the "externalcodecs" keyword. Set this in DEB_BUILD_OPTIONS to + enable support for additional codecs via external libraries. + + Commented out the amr?b codecs among the external codecs, because the + resulting packages will be unredistributable. + + -- Fabian Greffrath Tue, 29 Apr 2008 09:07:11 +0100 + +ffmpeg-free (0.svn20080206-3) experimental; urgency=low + + * install qt-faststart. Thanks Stefan Hermann for the patch from ubuntu. + (Closes: #470484) + * Reenable 020_fix_libswscale_pic_code, fixes FTBFS on amd64. + * Reenable altivec, fixes FTBFS on powerpc. + * Add some notes about the removed mpeg encoders (Closes: #440702) + + -- Reinhard Tartler Fri, 18 Apr 2008 23:02:24 +0200 + +ffmpeg-free (0.svn20080206-2) experimental; urgency=low + + [ Reinhard Tartler ] + * patches/020_fix_sws_scale_crash: if sws_scale is given an invalid context + (e.g. a null pointer), the function will crash because of a null pointer + dereference. Add a check for that here. + * add Conflicts/Replaces for libswscale1d. + * Due to the fact that we no longer build the shared version of ffmpeg with + mmx optimisations, the following patches have been dropped: + - 020_mmx_optims.diff + - 020_mmx_pic_code.diff + - 020_disable_snow_mmx_in_pic.diff + - 020_fix_libswscale_pic_code + + [ Fabian Greffrath ] + * debian/control: + + Added libx11-dev and libxext-dev to Build-Depends. + * debian/rules: + + Build with --enable-x11grab (Closes: #441983). + + Build ffmpeg and shared libraries with --extra-cflags="-fPIC -DPIC" + (feeling confident that this closes: #472613) and "drop the surgery + regarding Makefile.pic and config.mak.pic". + + In this context, cleaned up build rule: Run '$(MAKE)' and '$(MAKE) clean' + from the top source directory instead of diving into the library + directories; force move during backup and recovery of the static + libraries; let the build rule itself depend on config-extra-includes.h + (instead of build-stamp) to avoid being run again from the binary rule; + some more minor changes of cosmetic type. + + Renamed config-extra-includes rule to config-extra-includes.h to + reflect the file name of the created file (also changed to override it + instead of appending) and to avoid the rule to be run twice. + + Disabled all architecture-specific optimizations for the time being. + + -- Fabian Greffrath Fri, 1 Apr 2008 17:22:00 +0100 + +ffmpeg-free (0.svn20080206-1) experimental; urgency=low + + [ Reinhard Tartler ] + * new upstream release (Closes: #471136) + * refreshed patches + * libogg was dropped upstream + * no longer install integer.h, as it is not part of the public API (see + upstream r11642). + * no longer install rtp.h, as it is not part of the public API (see + upstream r11505). + * install crc.h and sha1.h to libavutil-dev, since it is part of the + public API now. + * introduce new package: libavdevice52 and libavdevice-dev. + * Implemented debian/get-orig-source.sh and adjusted the get-orig-source + target in debian/rules to use that. + * fix invocation of the testsuite. + * bump standards version to 3.7.3 (no changes needed). + * add script recordshow.sh (Closes: 461434). Thanks to + Daniel Dickinson + * Introdcue binary package ffmpeg-dbg, which contains debugging symbols + of the shared library packages. + + [ Fabian Greffrath ] + * debian/changelog: + + Source is exported from SVN, not CVS. Reflect this in the versioning + scheme (Closes: #468319). + * debian/control: + + Changed Build-Depends to liba52-0.7.4-dev | liba52-dev. + + Improved descriptions and dependencies for libavdevice packages. + * debian/control, debian/compat: + + Bumped debhelper Build-Depends to (>= 6.0.0). + * debian/control, debian/*.install: + + Adopted shared library package names to upstream SONAMEs. + * debian/README.Debian: + + Updated, since AAC decoding (through FAAD) is now enabled. + + Updated URL for unofficial ffmpeg packages. + * debian/rules: + + Reordered confflags to optionally build LGPL versions of the libraries. + + Removed trailing whitespace. + + Removed unused strip rule. + + Added libxvidcore4-dev to weak-build-deps and fixed confflags + in DEB_BUILD_OPTIONS=risky accordingly. + + Added a get-orig-source rule to reproduce the source tarball. Produce an + unstripped tarball if DEB_BUILD_OPTIONS=risky. + + Do not run debian/fixup-config.sh if DEB_BUILD_OPTIONS=risky. + * debian/patches/011_link_plugins.diff: + + Updated to link all plugins against libavutil since they all use symbols + from this library. Resolves "symbols found in none of the libraries" + warnings from dpkg-shlibdeps. + + -- Reinhard Tartler Thu, 20 Mar 2008 17:57:21 +0100 + +ffmpeg-free (0.cvs20071007-4) experimental; urgency=low + + [ Fabian Greffrath ] + * debian/control: + + Wrapped Uploaders, Build-Depends and Depends, + Conflicts and Replaces fields. + + Added libfaad-dev to Build-Depends. + + Added Homepage field. + + Added ${misc:Depends} to all Depends. + * debian/rules: + + Enabled faad support via libfaad + (Closes: #400094, #418230, #447089, #448068, #449387). + + Added libmp3lame-dev to weak-build-deps in DEB_BUILD_OPTIONS=risky. + + Added support for amrnb, amrwb and x264 (Closes: #432170) in + DEB_BUILD_OPTIONS=risky. + + [ Reinhard Tartler ] + * added Fabian Greffrath to Uploaders + + -- Reinhard Tartler Thu, 20 Mar 2008 15:55:11 +0100 + +ffmpeg-free (0.cvs20071007-3) experimental; urgency=low + + * disable armv6 code generation. Thanks to Joey Hess for the patch + (Closes: #438923). + + -- Reinhard Tartler Sun, 13 Jan 2008 23:28:25 +0100 + +ffmpeg-free (0.cvs20071007-2) experimental; urgency=low + + * restore soname on libavutil. got dropped on previous upload. + * Bug fix: "needs libavutil-dev headers but doesn't depend on it", + thanks to rmh@aybabtu.com (Closes: #434494). This was actually already + fixed in a previous upload. + * build dependencies in debian/control are now multiline. + * Drop the XS- from the Vcs-Browser and Vcs-Svn field. + + -- Reinhard Tartler Sun, 16 Dec 2007 21:36:49 +0100 + +ffmpeg-free (0.cvs20071007-1) experimental; urgency=low + + * new upstream snapshot, using the same day as the mplayer release + * Refreshing patches: + -005_altivec_flags.diff: dropped, merged upstream + -005_m68k_workaround.diff: refreshed + -005_runtime_cpudetect.diff: refreshed + -006_mips_pthreads.diff: refreshed + -010_proper_rpath.diff: refreshed + -010_shared_library_versioning.diff: refreshed + -011_link_plugins.diff: refreshed (moved to top level makefile) + -015_build_imgresample.diff: refreshed + -020_disable_snow_mmx_in_pic.diff: refreshed + -020_fix_libswscale_pic_code.diff: refreshed + -020_mmx_optims.diff: refreshed + -020_mmx_pic_code.diff: refreshed + -040_early_altivec_detection.diff: disabled, doesn't apply anymore + -040_only_use_maltivec_when_needed.diff disabled, (causes ftbfs, needs revising) + -040_only_use_maltivec_when_needed.diff: refresh + -051_mjpeg_gray_support.diff, removed applied upstream + -053_rm_demux_crash.diff removed, applied upstream. + -060_fix_avi_skip.diff removed, does not apply anymore + * remove --enable-libdts. ffmpeg now has an internal dts decoder since + r9051 (2007-05-17). It seems that at least some packages link to libdts and + rely on the transitive dependency via ffmpeg. Please add explicit dependencies + on libdts instead! + * Don't ignore errors in upstream Makefile. Bug found via lintian. + + -- Reinhard Tartler Wed, 05 Dec 2007 17:33:34 +0100 + +ffmpeg-free (0.cvs20070307-7) UNRELEASED; urgency=low + + * debian/patches/051_mjpeg_gray_support.diff: + + Support grayscale MJPEG streams as sent by Axis cameras. + + -- Sam Hocevar (Debian packages) Tue, 31 Jul 2007 18:55:31 +0200 + +ffmpeg-free (0.cvs20070307-6) unstable; urgency=low + + * Rename the source package. We are (again) no longer shipping the + 'real' upstream source of ffmpeg. + * Add debian/strip.sh to strip ffmpeg upstream source disabling mpeg + based encoders as discussed with ftp-master at debconf7 + * update XS-Vcs tags in debian/control. + * make ffmpeg binNMU-able by using ${binary:Version} rather than + ${Source-Version} + + -- Reinhard Tartler Sat, 23 Jun 2007 15:11:21 +0100 + +ffmpeg (0.cvs20070307-5) unstable; urgency=low + + * upload to unstable + * remove x264 support, as it has been removed from unstable + + -- Reinhard Tartler Wed, 30 May 2007 15:19:20 +0200 + +ffmpeg (0.cvs20070307-4) experimental; urgency=low + + * added myself to uploaders + + * 020_fix_libswscale_pic_code: + + added, avoid some MMX code to avoid PIC code + + [ Sam Hocevar ] + + * fixed path in library installation. + + -- Reinhard Tartler Wed, 11 Apr 2007 23:17:47 +0200 + +ffmpeg (0.cvs20070307-3) experimental; urgency=low + + * debian/patches/015_build_imgresample.diff: + + Build imgresample functions even with swscaler activated, or legacy + applications will stop working. + + * debian/patches/053_rm_demux_crash.diff: + + New patch: fix a double free with corrupted rm files (Closes: #379922). + + * debian/patches/054_h264_mmx_chroma_mc_crash.diff: + + New patch: workaround for a buffer overflow in the MMX H264 chroma + motion compensation until upstream fixes it properly (Closes: #404176). + + * debian/patches/300_c++_compliant_headers.diff: + + Define INT64_C() when the system headers don't provide it, for instance + when building C++ code. + + * debian/control: + + Set pkg-multimedia-maintainers as main maintainer. + + Updated VCS fields. + * debian/rules: + + Huge cleanup. + + -- Sam Hocevar (Debian packages) Wed, 14 Mar 2007 19:40:42 +0100 + +ffmpeg (0.cvs20070307-2) experimental; urgency=low + + * debian/rules: + + Activate x264 support now that it is in unstable. + * debian/control: + + Build-depend on libx264-dev. + + -- Sam Hocevar (Debian packages) Mon, 12 Mar 2007 21:10:45 +0100 + +ffmpeg (0.cvs20070307-1) experimental; urgency=low + + [ Sam Hocevar ] + + * New upstream snapshot (Closes: #403330, #404788). + * This snapshot fixes numerous file parsing crashes (Closes: #404176, + Closes: #407003, #396282, #365006, #403398). + + * debian/patches/010_proper_rpath.diff: + + New patch. Link objects with the libraries that we generate, not the + ones installed on the system. + + * debian/patches/010_shared_library_versioning.diff: + + Strip unneeded prefix from .pc files (Closes: #404758). + + * debian/patches/011_link_plugins.diff: + + New patch. Link vhook plugins with the appropriate libraries. + + * debian/patches/013_strip_unneeded_linker_flags.diff: + + Remove unneeded -l flags from .pc files (Closes: #373986). + + * debian/patches/020_mmx_optims.diff: + * debian/patches/020_disable_snow_mmx_in_pic.diff: + + Sync patches. + + * debian/patches/020_really_use_liba52.diff: + * debian/patches/050_h264-misc-security-fixes.diff: + * debian/patches/051_asf-misc-security-fixes.diff: + + Drop patches, applied upstream or no longer relevant. + + * debian/patches/040_only_use_maltivec_when_needed.diff: + + Upgraded patch to cover libswscale. + + * debian/libavcodec-dev.install: + + Ship lzo.h and random.h. + + * debian/rules: + + Fix syntax for a few --enable flags. + + Only ship ffmpeg_powerpc_performance_evaluation_howto.txt.gz on + powerpc machines (Closes: #385079). + + Readded --enable-libtheora, it's here again. + + Activate --enable-swscaler (Closes: #399141, #398442). + + [ Reinhard Tartler ] + + * debian/rules: + + Ignore libswscale.pc and rgb2rgb.h. + + * debian/libavcodec-dev.install: + + Ship fifo.h and opt.h. + + * debian/patches/005_altivec_flags.diff: + * debian/patches/005_m68k_workaround.diff: + * debian/patches/005_runtime_cpudetect.diff: + * debian/patches/006_mips_pthreads.diff: + * debian/patches/020_really_use_liba52.diff: + + Sync patches. + + * debian/patches/007_disable_ffmpeg_option.diff: + * debian/patches/030_arm_cpu_detect.diff: + * debian/patches/030_arm_workaround.diff: + + Drop patches, applied upstream or no longer relevant. + + -- Sam Hocevar (Debian packages) Fri, 9 Mar 2007 15:13:16 +0100 + +ffmpeg (0.cvs20060823-7) unstable; urgency=high + + * debian/patches/040_only_use_maltivec_when_needed.diff: + + Fix a static function prototype that prevented programs using libpostproc + from working on PowerPC (Closes: #412214). + + * debian/control: + + Added Xs-Vcs-Browser and XS-Vcs-Svn fields. + + -- Sam Hocevar (Debian packages) Thu, 8 Mar 2007 17:51:37 +0100 + +ffmpeg (0.cvs20060823-6) unstable; urgency=high + + * Upload to unstable. + + -- Loic Minier Thu, 1 Feb 2007 21:36:47 +0100 + +ffmpeg (0.cvs20060823-5) testing-proposed-updates; urgency=high + + [ Loïc Minier ] + * Add myself to Uploaders. + * Exclude firewire libs from ffmpeg-config under kFreeBSD; based on a patch + by Petr Salinger; closes: #399701. + * Fix handling of debug in DEB_BUILD_OPTIONS; thanks Andreas Henriksson; + closes: #406474. + * SECURITY: New patch, 050_h264-misc-security-fixes, to properly check the + sps and pps ids before use and to check more bitstram values and fix + potential security holes; from upstream SVN r7585, r7586, and r7591. + * SECURITY: New patch, 051_asf-misc-security-fixes, to properly check + packet sizes, chunk sizes, and fragment positions; from upstream SVN r7640 + and r7650. + + [ Sam Hocevar ] + * debian/copyright: + + Fix typo and clarify licensing terms (Closes: #398235). + * debian/README.Debian: + + Removed mention of ffmpeg-config now that we ship .pc files. + * debian/patches/020_mmx_optims.diff: + + New patch, fix FTBFS with DEB_BUILD_OPTIONS=debug. + * debian/patches/040_early_altivec_detection.diff: + + New patch, detect AltiVec earlier on and only once so that we don't + risk using signal handlers in a multithreaded environment or when + the caller already installed a SIGILL handler. + * debian/patches/040_only_use_maltivec_when_needed.diff: + + New patch, only use -maltivec with files that use AltiVec intrinsics, + and make sure no codepath leads to these files on a non-AltiVec + machine (Closes: #405926). + * debian/patches/060_fix_avi_skip.diff: + + New patch, courtesy of Ben Hutchings: do not attempt to skip the ODML + if the current seek offset is already beyond it (Closes: #383734). + + -- Sam Hocevar (Debian packages) Mon, 29 Jan 2007 16:58:44 +0100 + +ffmpeg (0.cvs20060823-4) unstable; urgency=high + + * Maintainer upload. + * Acknowledging NMU (Closes: #386458). + + * High urgency because of FTBFS fix. + + * debian/patches/030_arm_workaround.diff: + + New patch courtesy of Aurélien Jarno: disable the broken ARM assembly + code in libavcodec/mpegaudiodec.c. + + * debian/patches/030_arm_cpu_detect.diff: + + New patch courtesy of Aurélien Jarno: correctly detect the newer ARM + CPUs. + + -- Sam Hocevar (Debian packages) Sun, 24 Sep 2006 23:38:29 +0200 + +ffmpeg (0.cvs20060823-3.1) unstable; urgency=medium + + * Non-maintainer upload. + * Fix variable substitution trick in debian/rules (Closes: #386458). + + -- Luk Claes Fri, 15 Sep 2006 21:29:07 +0200 + +ffmpeg (0.cvs20060823-3) unstable; urgency=low + + * debian/rules: + + Take local packages into account when computing shlibs dependencies, so + that ffplay/ffserver depend on the proper libraries (Closes: #386029). + + -- Sam Hocevar (Debian packages) Tue, 5 Sep 2006 17:44:00 +0200 + +ffmpeg (0.cvs20060823-2) unstable; urgency=low + + * debian/patches/020_really_use_liba52.diff: + + New patch: link with the shared liba52 instead of the built-in one. + + * debian/patches/006_mips_pthreads.diff: + + New patch: link libraries with -lpthreads on Linux MIPS because of a + known ld bug. + + * debian/patches/007_disable_ffmpeg_option.diff: + + New patch: add a --disable-ffmpeg option. + + -- Sam Hocevar (Debian packages) Wed, 30 Aug 2006 18:36:52 +0200 + +ffmpeg (0.cvs20060823-1) unstable; urgency=low + + * New SVN snapshot (Closes: #368904). + * debian/control: + + Set policy to 3.7.2. + + Do not build 1394 support on GNU/kFreeBSD or Hurd. Patch courtesy of + Petr Salinger (Closes: #372290). + * debian/rules: + + Minor cleanup. + + Removed --enable-theora, upstream dropped that option. + + * debian/patches/020_mmx_intrinsics.diff: + + Disabled intrinsics workaround because it is no longer necessary and it + causes trouble with some codecs such as H264 (Closes: #373765). + + -- Sam Hocevar (Debian packages) Wed, 23 Aug 2006 12:09:58 +0200 + +ffmpeg (0.cvs20060329-4) unstable; urgency=low + + * debian/control: + + Make each -dev package depend on the corresponding shared library + package (Closes: #361348). + + Moved libavutil files from libavformat-dev to libavcodec-dev which is + the real common dependency (Closes: #361269). + + -- Sam Hocevar (Debian packages) Sun, 9 Apr 2006 15:23:37 +0200 + +ffmpeg (0.cvs20060329-3) unstable; urgency=low + + * debian/rules: that build system is hopeless. We now run configure and + make twice, backup static libraries inbetween, then update timestamps + to fool make. That should fix the FTBFS (Closes: #361215). + + -- Sam Hocevar (Debian packages) Fri, 7 Apr 2006 11:33:15 +0200 + +ffmpeg (0.cvs20060329-2) unstable; urgency=low + + * debian/rules: fixed Makefile.pic generation. + + -- Sam Hocevar (Debian packages) Thu, 6 Apr 2006 16:37:05 +0200 + +ffmpeg (0.cvs20060329-1) unstable; urgency=low + + * New CVS snapshot. + * Upstream fixed a double free in img.c (Closes: #351455). + * Upstream fixed the libvorbisenc dependency in libavcodec.pc + (Closes: #357352). + + * debian/rules: + + Activated threading support (Closes: #335677). + + Manually reinstall dsputil.h. + + * debian/README.Debian: + + Removed mention of --plugin-libs. + + Added a note about the unofficial packages (Closes: #306752). + + * 020_disable_snow_mmx_in_pic.diff: (new patch) disable MMX acceleration in + the Snow encoder in PIC mode. + + -- Sam Hocevar (Debian packages) Thu, 30 Mar 2006 10:41:17 +0200 + +ffmpeg (0.cvs20060306-3) unstable; urgency=low + + * Switched patch system to quilt. + * debian/control: + + Build-depend on quilt. + + * 005_altivec_flags.diff: (new patch from old diff.gz) proper gcc flags to + only generate AltiVec code when explicitely asked. + + * 005_m68k_workaround.diff: (new patch from old diff.gz) use -O2 instead of + -O3 on m68k. + + * 005_runtime_cpudetect.diff: (new patch from old diff.gz) fix runtime CPU + detection on m68k and x86. + + * 010_ffmpeg-config.diff: (new patch from old diff.gz) the ffmpeg-config + script and associated manpage (legacy). + + * 010_shared_library_versioning.diff: (new patch from old diff.gz) use a + Debian-specific scheme for shared library versioning to avoid spreading + libraries incompatible with every other version. + + * 020_mmx_intrinsics.diff: (new patch from old diff.gz) use MMX intrinsics + in dsputil_mmx.c because gcc is unable to compute some register constraints + in PIC mode. + + * 020_mmx_pic_code.diff: (new patch from old diff.gz) ported some MMX code + to be PIC. + + -- Sam Hocevar (Debian packages) Wed, 29 Mar 2006 18:53:35 +0200 + +ffmpeg (0.cvs20060306-2) unstable; urgency=low + + * ffmpeg-config.in: removed references to _pic libraries. + + -- Sam Hocevar (Debian packages) Fri, 17 Mar 2006 20:08:29 +0100 + +ffmpeg (0.cvs20060306-1) unstable; urgency=low + + * New CVS snapshot. + * Upstream now properly installs dsputil.h (Closes: #354391). + * debian/control: + + Distribute shared versions of the libraries with a Debian-specific + soname. + * debian/rules: + + Removed all custom PIC rules. + + Moved ffmpeg-config to libavformat-dev instead of libavcodec-dev so that + it is present by default (Closes: #350750). + + Include apiexample.c in libavcodec-dev (Closes: #350027). + + -- Sam Hocevar (Debian packages) Mon, 6 Mar 2006 11:05:26 +0100 + +ffmpeg (0.cvs20050918-6) unstable; urgency=low + + * Developer upload. + * Acknowledge NMU. Thanks to Samuel Mimram (Closes: #342207). + * configure: + + Set RUNTIME_CPUDETECT (except on m68k where it ICEs and on x86 where it + fails to build some asm constructs) (Closes: #337846). + * debian/rules: + + Make the build process aware of DEB_BUILD_OPTIONS, thanks to Timo + Lindfors (Closes: #338895). + + -- Sam Hocevar (Debian packages) Sat, 21 Jan 2006 16:51:26 +0100 + +ffmpeg (0.cvs20050918-5.1) unstable; urgency=low + + * NMU. + * Fix exploitable heap overflow in libavcodec's handling of images with + PIX_FMT_PAL8 pixel formats (CVE-2005-4048), closes: #342207. + + -- Samuel Mimram Sun, 15 Jan 2006 14:44:36 +0100 + +ffmpeg (0.cvs20050918-5) unstable; urgency=low + + * ffmpeg-config.1: fixed the examples and added a note that static libraries + should be put after the objects that refer to them (Closes: #339803). + + -- Sam Hocevar (Debian packages) Fri, 18 Nov 2005 23:58:16 +0100 + +ffmpeg (0.cvs20050918-4) unstable; urgency=low + + * configure: + + Tell the configure script about m68k, ia64 and others. + + -- Sam Hocevar (Debian packages) Thu, 22 Sep 2005 14:43:59 +0200 + +ffmpeg (0.cvs20050918-3) unstable; urgency=low + + * configure: + + Use -O2 instead of -O3 on m68k to avoid ICEs. + + -- Sam Hocevar (Debian packages) Tue, 20 Sep 2005 17:33:14 +0200 + +ffmpeg (0.cvs20050918-2) unstable; urgency=low + + * libavcodec/i386/dsputil_mmx.c: + + Reworked the MMX intrinsics. + * tests/libav.regression.ref: + + Minor cosmetic fix to use double-digit numbers in test sequences. + * debian/control: + + PowerPC no longer needs to use gcc-3.4, since 4.x is the default. + * libavcodec/Makefile: + + Removed special compilation case for HPPA now that we use 4.x. + + -- Sam Hocevar (Debian packages) Sun, 18 Sep 2005 17:43:48 +0200 + +ffmpeg (0.cvs20050918-1) unstable; urgency=low + + * New CVS snapshot. + * Upstream applied most Debian patches. + * configure: + + Do not use -mabi=altivec (-maltivec is enough for our AltiVec code) so + that our code still runs on a G3 computer (Closes: #319151). + * debian/rules: + + When not cross-compiling, run the regression tests (Closes: #292102). + * debian/changelog: + + Updated the FSF address. + * ffmpeg-config.in: + + Fixed avcodec linkage (Closes: #328505). + * libavcodec/i386/mpegvideo_mmx_template.c: + + Applied patch from Tobias Grimm to fix the PIC MMX code for MPEG + encoding (Closes: #318493). + * libavcodec/i386/dsputil_mmx.c: + + Applied patch from Joshua Kwan to fix the AMD64 build (Closes: #324026). + + Reworked that patch so that it still compiles on x86. + + -- Sam Hocevar (Debian packages) Fri, 16 Sep 2005 13:03:47 +0200 + +ffmpeg (0.cvs20050811-2) unstable; urgency=low + + * ffmpeg-config.in: added a missing -lgsm. + + -- Sam Hocevar (Debian packages) Mon, 22 Aug 2005 19:51:53 +0200 + +ffmpeg (0.cvs20050811-1) unstable; urgency=low + + * New CVS snapshot. + * Upstream fixed an integer overflow in the MPEG encoder (Closes: #320150). + * debian/rules: + + Activated libgsm support. + + Fixed theora support. + + Switched installation method to dh_install. + * Applied patch from Christian Aichinger and others to fix the clobbering + of the %ebx register during build (Closes: #319563). + + -- Sam Hocevar (Debian packages) Thu, 11 Aug 2005 14:22:03 +0200 + +ffmpeg (0.cvs20050626-2) unstable; urgency=low + + * ffmpeg-config.in: fixed the theora link that caused FTBFS. + + -- Sam Hocevar (Debian packages) Fri, 1 Jul 2005 17:20:59 +0200 + +ffmpeg (0.cvs20050626-1) unstable; urgency=low + + * New CVS snapshot. + * debian/control: + + Set policy to 3.6.2.1. + * debian/rules: + + Fixed Vorbis support (Closes: #306023). + + Patch by Jonas Smedegaard : conditionally enable these + unofficial libraries if DEB_BUILD_OPTIONS includes "risky": + o Mpeg2 layer 3 / MP3 (liblame-dev). + o FAAD (libfaad2-dev). + o FAAC (libfaac-dev). + o XviD (libxvidcore-dev). + + Activated theora support. + + Activated IEEE 1394 support (Closes: #296737). + + -- Sam Hocevar (Debian packages) Sun, 26 Jun 2005 15:46:54 +0200 + +ffmpeg (0.cvs20050313-2) unstable; urgency=low + + * libavcodec/libpostproc/postprocess_template.c + libavcodec/i386/mpegvideo_mmx_template.c: fixed my PIC MMX code (Closes: #299700). + * debian/rules: use gcc-3.4 on PowerPC (Closes: #300686). + + -- Sam Hocevar (Debian packages) Mon, 21 Mar 2005 23:38:46 +0100 + +ffmpeg (0.cvs20050313-1) unstable; urgency=low + + * New CVS snapshot. + * configure: fixed the builtin vector test (Closes: #293284), thanks + to Jacob L. Anawalt. + * libavcodec/libpostproc/postprocess_template.c + libavcodec/i386/mpegvideo_mmx_template.c: fixed MMX code so that it can + be compiled in PIC mode, and reactivated MMX (Closes: #290447, #290358). + + -- Sam Hocevar (Debian packages) Sat, 12 Mar 2005 18:34:29 +0100 + +ffmpeg (0.cvs20050121-1) unstable; urgency=low + + * New CVS snapshot. + * This snapshot fixes integer overflows that may lead to arbitrary code + execution (Closes: #291566). + + -- Sam Hocevar (Debian packages) Fri, 21 Jan 2005 17:41:47 +0100 + +ffmpeg (0.cvs20050108-1) unstable; urgency=low + + * Re-done tarball snapshot so that it does not contain binaries. + * ffmpeg-config.in: + + Added missing -lvorbisenc (Closes: #289030). + * debian/rules: + + Install missing headers that are not in the install rule: bwswap.h, + dsputil.h, os_support.h (Closes: #289033). + + -- Sam Hocevar (Debian packages) Sat, 8 Jan 2005 11:30:58 +0100 + +ffmpeg (0.cvs20050106-1) unstable; urgency=low + + * New upstream snapshot. + * The extern/static declaration conflict was fixed upstream (Closes: #288906). + + -- Sam Hocevar (Debian packages) Thu, 6 Jan 2005 15:44:49 +0100 + +ffmpeg (0.cvs20040716-2) unstable; urgency=low + + * debian/rules: + + Include missing rtp.h / rtsp.h in libavformat-dev. + * ffmpeg-config.in: + + Added -lz to the libavcodec linking flags. + + Added -ldts / -ldts_pic, -la52, -lvorbis to the libavcodec linking flags. + + -- Sam Hocevar (Debian packages) Tue, 17 Aug 2004 13:27:41 +0200 + +ffmpeg (0.cvs20040716-1) unstable; urgency=low + + * Initial release (Closes: #199266). + + -- Sam Hocevar (Debian packages) Fri, 16 Jul 2004 12:47:27 +0200 + --- ffmpeg-0.5+svn20090706.orig/debian/README.upstream-upgrade +++ ffmpeg-0.5+svn20090706/debian/README.upstream-upgrade @@ -0,0 +1,42 @@ + +Checklist and howto for ffmpeg upstream upgrades: + +Needed packages: + + apt-get install devscripts git-buildpackage pristine-tar + +Stage in a tmp directory: + + mkdir /tmp/f ; cd /tmp/f + git clone git://git.debian.org/git/pkg-multimedia/ffmpeg-debian.git + cd ffmpeg-debian + branches="master.unstripped pristine-tar upstream upstream.unstripped" + for b in $branches; do git checkout -b $b origin/$b ; done + +Prepare the environment: + + SVNDATE=`date +%Y%m%d` + git checkout master + +Fetch and commit the new upstream version: + + debian/rules get-orig-source SVN_VERSION=${SVNDATE} + git-import-orig \ + --no-dch \ + --upstream-tag=upstream/0.5+svn${SVNDATE} \ + --upstream-version=0.5+svn${SVNDATE} \ + ../ffmpeg_0.5+svn${SVNDATE}.orig.tar.gz + +Check and note the svn revision numbers from +ffmpeg/{libswscale,}.svnrevision in debian/changelog + + git diff upstream^ Changelog libavcodec/allcodecs.c libavformat/allformats.c + +Document new formats additions in debian/changelog + +Build, test, and compare against the the version already in the archive: + - headers in the -dev packages with + - soname in the libraries + - formats.txt in the libavcodecs package + +Finialize debian/changelog, package should be upload ready now --- ffmpeg-0.5+svn20090706.orig/debian/recordshow.sh +++ ffmpeg-0.5+svn20090706/debian/recordshow.sh @@ -0,0 +1,58 @@ +#!/bin/bash + +# Copyright 2008, Daniel Dickinson +# +# This script script (which depends on xawtv for the v4lctl command to +# select channel) and crontab show how one can record tv shows using +# ffmpeg. + +STATION="$1" +TODAY=$(date +"%A %B %d %Y") +SHOWLENGTH="$2" +SHOWDIR="$3" +SHOWNAME="$4" + +function err_exit { + EXITCODE=$1 + shift + echo $* 1>&2 + exit $EXITCODE +} + +BADPARAM=FALSE + +if [ -z "STATION" ]; then + BADPARAM=TRUE +fi + +if [ -z "$SHOWDIR" ]; then + BADPARAM=TRUE +fi + +if [ -z "$SHOWLENGTH" ]; then + BADPARAM=TRUE +fi + +if [ "$BADPARAM" != "FALSE" ]; then + err_exit 2 "Usage: recordshow.sh station show-length show-dir [show-name]" +fi + +if [ -z "$SHOWNAME" ]; then + BASEFILENAME="$SHOWDIR/$TODAY" +else + BASEFILENAME="$SHOWDIR/$SHOWNAME-$TODAY" +fi + +SECONDS=$(echo $SHOWLENGTH | cut -f3 -d:) +MINUTES=$(echo $SHOWLENGTH | cut -f2 -d:) +HOURS=$(echo $SHOWLENGTH | cut -f1 -d:) + +TOTALSECONDS=0 + +TOTALSECONDS=$(expr $(expr $(expr $HOURS '*' 3600) + $(expr $MINUTES '*' 60)) + $SECONDS) + +/usr/bin/v4lctl setstation $1 >/dev/null || err_exit 1 "Unable to set station (channel) $STATION" +/usr/bin/v4lctl volume mute off >/dev/null || err_exit 4 "Unable to unmute audio" +/usr/bin/ffmpeg -y -tvstd ntsc -t "$TOTALSECONDS" -s 480x352 -re -deinterlace -f video4linux2 -i /dev/video0 -f audio_device -i /dev/dsp -ac 2 -s 768x576 -f mpegts -acodec mp2 -vcodec mpeg1video "$BASEFILENAME.mpegts" >/dev/null 2>&1 || err_exit 3 "Error recording show $BASEFILENAME to mpeg2 transport stream" +/usr/bin/v4lctl volume mute on >/dev/null || err_exit 5 "Unable to mute audio" + --- ffmpeg-0.5+svn20090706.orig/debian/libpostproc51.lintian-overrides +++ ffmpeg-0.5+svn20090706/debian/libpostproc51.lintian-overrides @@ -0,0 +1,3 @@ +# Overriding these fpic lintian errors. Please see bug #528080. +libpostproc51: shlib-with-non-pic-code usr/lib/i686/cmov/libpostproc.so.51.2.0 +libpostproc51: shlib-with-non-pic-code usr/lib/libpostproc.so.51.2.0 --- ffmpeg-0.5+svn20090706.orig/debian/libavformat52.lintian-overrides +++ ffmpeg-0.5+svn20090706/debian/libavformat52.lintian-overrides @@ -0,0 +1,3 @@ +# Overriding these fpic lintian errors. Please see bug #528080. +libavformat52: shlib-with-non-pic-code usr/lib/i686/cmov/libavformat.so.52.31.0 +libavformat52: shlib-with-non-pic-code usr/lib/libavformat.so.52.31.0 --- ffmpeg-0.5+svn20090706.orig/debian/README.Debian +++ ffmpeg-0.5+svn20090706/debian/README.Debian @@ -0,0 +1,235 @@ +lintian override shlib-with-non-pic-codeshlib-with-non-pic-code +================================================================== + +The lintian overrides for the non-pic shared libs error messages is not +really a matter of silencing lintian. The general idea is that the +override would serve as an indication that we know about the error +message and we're avoiding any bug reports or complaints by others about +the errors. + +We are aware that this override is too strict. It should only cover the +i386 architecture, as we know that the upstream build system will +produce PIC libraries where necessary. Only architectures like i386 will +be built non-PIC, mainly for performance reasons. + + -- Reinhard Tartler , Mon, 27 Jul 2009 12:08:55 +0200 + +FFmpeg package names +==================== + +The ffmpeg packaging has seen many renames in the course of its history. +Looking for more stable names, the ffmpeg maintainers agreed on moving to +a naming scheme which would fit known use cases and avoid confusion. + +Some of the constraints and proposed solutions on the new names follow: + + 1. Distributions such as Debian and Ubuntu want to carry multiple version of + the package to fit component divisions and please users; e.g. an + Ubuntu/universe and an Ubuntu/multiverse version, or a Debian/main and a + Debian/non-free version. It is conceived that there are usually two + variants of the ffmpeg package in these distributions: a) the vanilla + version shipped in the most permissible component if possible and b) a + 'stripped' package suitable for the most constrained component. + + For details why such a stripping is necessary in the first place, please + look further below in this document ("Disabled MPEG encoders"). + + 2. Packages from distributions and third party repositories such as the popular + debian-multimedia.org shouldn't interfere but coexist nicely. If these + repositories want to provide an alternate version of the source package, + they could do so with their own source and binary package names. It is + hoped that providing the vanilla source in one of the source packages will + remove the need to fork ffmpeg in these third party repositories. + + 3. The libraries built by various source packages shall be ABI compatible as + to allow packages built against the most constrained component to run + against the more permissible components; for instance vlc if built against + ffmpeg in main shall be able to run against the ffmpeg libraries from + non-free. The plan here is to use shlibs tricks to allow to install one + lib or the other. The shlibs would look like: + lib-name-in-main-99 (>= 1.2.3) | lib-name-in-non-free-99 (>= 1.2.3) + This scheme can be extended for third party repositories if it still needs + to be. + +For consistency at this date, Debian is missing a ffmpeg-extra source +package and Ubuntu had two source packages in the same component for a +short time. The binary package names are not unified and shlibs do not +allow to install one or the other library. + +To avoid gratuitous package renames, the proposed changes against the above +packages are: + + * For Debian and Ubuntu the binary packages in the 'main' component will + keep their original names without any additional marker. + + * The extra (unstripped) replacement packages in the 'non-free' + (Debian) and 'multiverse' (ubuntu) component will be built from a + source package named 'ffmpeg-extra'. The resulting binary packages + carry an '-extra-' marker in the name right between the library name + and its SONAME. + + * Ubuntu will track the ffmpeg packages in Debian and tries to minimize the + diff for maintenance reason. + + * If you disagree with the naming, please speak up on + pkg-multimedia-maintainers@lists.alioth.debian.org + + -- Reinhard Tartler , Sun, 26 Jul 2009 10:38:10 +0200 + + +Disabled MPEG encoders +====================== + +On Debconf 7, the ffmpeg maintainers had a conversation with James Troup +from the ftpteam about mpeg encoders in the ffmpeg package. The ftpteam +was pretty surprised about the accepted encoders, and admitted that they +were accepted by accident. We therefore had no choice but removing +them. We agreed on a plan that rather disables than removes the +encoders, for details see debian/strip.sh, rendering those encoders +unusable. + +Currently the following video encoders are disabled in the ffmpeg +package: H263, H264, MPEG2 video, MPEG4 and MS-MPEG4. No *decoders* are +disabled in any the ffmpeg package! + +The plan is to provide a source package called 'ffmpeg-extra', which builds +drop-in replacement binary package with the mpeg encoders enabled. Ideally, we +would be allowed to include those mpeg encoders enabled in non-free, but we +haven't heared back from the ftpteam about that idea. + + + -- Reinhard Tartler , Sun, 20 Apr 2008 08:43:23 +0200 + + +Further patent issues with ffmpeg +================================= + +In addition to the aforementioned MPEG encoders, some patents related to +ffmpeg which seem to be enforced against open source software cover the +following codec technologies and file formats: + + * MP3 encoding + * AAC encoding + * the ASF file format + + I did not activate MP3 encoding (through LAME) in libavcodec, nor AAC +encoding (through FAAC). However, since I have found no real enforcement +of the mysterious ASF file format patents, I did not deactivate ASF support in +libavformat. More details on these three issues are given in the following +paragraphs: + + +The MP3 audio coding format +=========================== + + Much has already been said about MP3 and the huge patent portfolio of +the MPEG members, especially the Fraunhofer institute. Eric Scheirer's +MPEG, Patents, and Audio Coding FAQ [1.1] is an attempt to "inject +some sanity in what is becoming an increasingly heated discussion +about patent rights surrounding MPEG technology, especially for audio +compression". It also has a few words about other patented products +covered in this document. + +[1.1] http://web.media.mit.edu/~eds/mpeg-patents-faq + + +The AAC audio coding format +=========================== + + Dolby's AAC (Advanced Audio Coding) is covered by patents owned by +Dolby Laboratories, AT&T Laboratories, Fraunhofer Institute and Sony +Corp. + + The FAAC project was threatened by the AAC license consortium. Press +report about how "an opensource project was closed down due to pressures +from the AAC license consortium which requires a lumpsum payment of +10,000 USD plus a per-copy payment of 1.35 USD, thus effectively banning +free software implementations. The policies surrounding AAC also harm +interoperability [2.2]." This was related by Heise [2.3] and FFII has +a page about the Dolby threat [2.1] as well as additional information +about MPEG-related patents [2.4]. + + The author stopped distributing the FAAC binaries, but still provides +full source code and CVS access. To my knowledge he has not been +threatened again. I also read on a web forum [2.5] that Cisco's lawyers +claim that their LGPL distribution of AAC software in MPEG4IP is +completely legal and that Dolby cannot forbid such distribution. + +[2.1] http://swpat.ffii.org/patents/effects/dolby/index.en.html +[2.2] http://www.xiph.org/archives/vorbis-dev/200011/0286.html +[2.3] http://www.heise.de/newsticker/data/vza-20.11.00-000/ +[2.4] http://swpat.ffii.org/patents/effects/mpeg/index.en.html +[2.5] http://www.hydrogenaudio.org/index.php?showtopic=310& + + +The ASF file encapsulation format +================================= + + Microsoft obtained a patent on the ASF (Active Stream Format) audio +file format on March 21, 2000: + + | United States Patent 6,041,345 Levi , et al. March 21, 2000 + | + | Active stream format for holding multiple media streams + | + | Abstract An active stream format is defined and adopted for a + | logical structure that encapsulates multiple data streams. The data + | streams may be of different media. The data of the data streams + | is partitioned into packets that are suitable for transmission + | over a transport medium. The packets may include error correcting + | information. The packets may also include clock licenses for + | dictating the advancement of a clock when the data streams are + | rendered. The format of ASF facilitates flexibility and choice + | of packet size and in specifying maximum bit rate at which data + | may be rendered. Error concealment strategies may be employed in + | the packetization of data to distribute portions of samples to + | multiple packets. Property information may be replicated and stored + | in separate packets to enhance its error tolerance. The format + | facilitates dynamic definition of media types and the packetization + | of data in such dynamically defined data types within the format. + + This patent is rumoured to have been enforced at least once, though +only through what I'd call non-hostile intimidation. Avery Lee, the +VirtualDub author, removed ASF support from his software after a phone +call from a Microsoft employee that he relates in his 5/12/2000 news +[3.1]. + + However I could not find evidence of an official threat: all I could +find on the web seemed to be interpretations of the VirtualDub author's +article, for instance on Advogato [3.2], CPT [3.3] or FFII [3.4]. Avery +Lee states that the phone call was from a programmer, not from the +legal department. There does not seem to be an official statement from +Microsoft. + +[3.1] http://web.archive.org/web/20000817222620/http://www.geocities.com/virtualdub/virtualdub_news.html +[3.2] http://www.advogato.com/article/101.html +[3.3] http://www.cptech.org/ip/business/software/audio.html +[3.4] http://swpat.ffii.org/patents/effects/asf/index.en.html + + +License of the Debian ffmpeg packages +===================================== + +The license for the whole work is the GPL, not the LGPL, because GPL-only +parts of ffmpeg were activated -- namely libpostproc, libswscale, x11grab and +(optionally) libfaad2. If you need LGPL versions of the libraries, please +comment out the appropriate line in debian/confflags. + + +Differences with unofficial ffmpeg packages +=========================================== + + There are popular unofficial ffmpeg packages at the following URL: + + http://www.debian-multimedia.org/ + + I have nothing to do with these packages and it would be very tedious +for me to track their changes. Given that my official packages use a +Debian-specific naming scheme for libraries, you should be able to +install at least the shared library packages together. + + Before submitting a bug report, please make sure it is related to the +Debian packages and not those unofficial packages. + + + -- Sam Hocevar Thu, 30 Mar 2006 10:23:16 +0200 --- ffmpeg-0.5+svn20090706.orig/debian/get-orig-source.sh +++ ffmpeg-0.5+svn20090706/debian/get-orig-source.sh @@ -0,0 +1,88 @@ +#!/bin/sh +# +# Script to create a 'pristine' tarball for the debian ffmpeg source package +# Copyright (C) 2008, Reinhard Tartler +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +set -eu + +usage() { + cat >&2 <&2 +} + +error () { + echo "$1" >&2 + exit 1; +} + +set +e +PARAMS=`getopt hd: "$@"` +if test $? -ne 0; then usage; exit 1; fi; +set -e + +eval set -- "$PARAMS" + +DEBUG=false +SVNDATE= + +while test $# -gt 0 +do + case $1 in + -h) usage; exit 1 ;; + -d) SVNDATE=$2; shift ;; + --) shift ; break ;; + *) echo "Internal error!" ; exit 1 ;; + esac + shift +done + +# sanity checks now +dh_testdir + +if [ -z $SVNDATE ]; then + error "you need to specify an svn date. e.g. 20081230 for Dec 29. 2008" +fi + +TARBALL=../ffmpeg_0.5+svn${SVNDATE}.orig.tar.gz +PACKAGENAME=ffmpeg + +TMPDIR=`mktemp -d` +trap 'rm -rf ${TMPDIR}' EXIT + +baseurl="svn://svn.ffmpeg.org/ffmpeg/branches/0.5" + +svn export -r{${SVNDATE}} \ + --ignore-externals \ + ${baseurl} \ + ${TMPDIR}/${PACKAGENAME} + +svn info -r{${SVNDATE}} \ + ${baseurl} \ + | awk '/^Revision/ {print $2}' \ + > ${TMPDIR}/${PACKAGENAME}/.svnrevision + +tar czf ${TARBALL} -C ${TMPDIR} ${PACKAGENAME} + --- ffmpeg-0.5+svn20090706.orig/debian/copyright +++ ffmpeg-0.5+svn20090706/debian/copyright @@ -0,0 +1,124 @@ +SVN snapshots are downloaded with subversion from the ffmpeg SVN at: + + +Upstream Authors: Fabrice Bellard + Alex Beregszaszi + BERO + Mario Brito + Ronald Bultje + Tim Ferguson + Brian Foley + Arpad Gereoffy + Philip Gladstone + Vladimir Gneushev + Wolfgang Hesseler + Falk Hueffner + Zdenek Kabelac + Robin Kay + Todd Kirby + Nick Kurshev + Mike Melanson + Michael Niedermayer + François Revol + Roman Shaposhnik + Dieter Shirley + Juan J. Sierralta + Ewald Snel + Leon van Stuivenberg + Roberto Togni + Lionel Ulmer + +Copyright (c) 2000-2004 Fabrice Bellard et al. + +The following files are licensed under the GNU GPL, as clarified below: + + * ffmpeg.c + * libavcodec: + + dtsdec.c + + i386/idct_mmx.c + + liba52/*.[ch] + * libavformat: + + x11grab.c + + gxfenc.c + * libpostproc: + + postprocess_internal.h + + postprocess_altivec_template.c + + postprocess.h + + postprocess_template.c + + postprocess.c + + mangle.h + * libswscale: + + swscale.c + + swscale-example.c + + yuv2rgb_template.c + + swscale_altivec_template.c + + yuv2rgb_altivec.c + + swscale_template.c + + rgb2rgb_template.c + + rgb2rgb.c + + cs_test.c + + yuv2rgb_mlib.c + + yuv2rgb.c + + | This library is free software; you can redistribute it and/or + | modify it under the terms of the GNU General Public License as + | published by the Free Software Foundation; either version 2 of + | the License, or (at your option) any later version. + | + | This library is distributed in the hope that it will be useful, + | but WITHOUT ANY WARRANTY; without even the implied warranty of + | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + | Lesser General Public License for more details. + | + | You should have received a copy of the GNU General Public License + | along with this program; if not, write to the Free Software + | Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +The rest of the code is licensed under the GNU LGPL: + + | This library is free software; you can redistribute it and/or + | modify it under the terms of the GNU Lesser General Public License as + | published by the Free Software Foundation; either version 2.1 of + | the License, or (at your option) any later version. + | + | This library is distributed in the hope that it will be useful, + | but WITHOUT ANY WARRANTY; without even the implied warranty of + | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + | Lesser General Public License for more details. + | + | You should have received a copy of the GNU General Public License + | along with this program; if not, write to the Free Software + | Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +On Debian GNU/Linux systems, the complete text of the GNU General Public +License can be found in `/usr/share/common-licenses/GPL' and the text of the +GNU Lesser General Public License is in `/usr/share/common-licenses/LGPL'. + +The VDPAU headers found in `debian/include/vdpau' were downloaded from +. +For them the following copyright notice and license apply: + + * This copyright notice applies to this header file: + * + * Copyright (c) 2008 NVIDIA Corporation + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. --- ffmpeg-0.5+svn20090706.orig/debian/libavdevice52.lintian-overrides +++ ffmpeg-0.5+svn20090706/debian/libavdevice52.lintian-overrides @@ -0,0 +1,3 @@ +# Overriding these fpic lintian errors. Please see bug #528080. +libavdevice52: shlib-with-non-pic-code usr/lib/i686/cmov/libavdevice.so.52.1.0 +libavdevice52: shlib-with-non-pic-code usr/lib/libavdevice.so.52.1.0 --- ffmpeg-0.5+svn20090706.orig/debian/libavformat52.install +++ ffmpeg-0.5+svn20090706/debian/libavformat52.install @@ -0,0 +1 @@ +usr/lib/{,*/,*/*/}libavformat.so.* --- ffmpeg-0.5+svn20090706.orig/debian/control +++ ffmpeg-0.5+svn20090706/debian/control @@ -0,0 +1,244 @@ +Source: ffmpeg +Section: libs +Priority: optional +Maintainer: Debian multimedia packages maintainers +Uploaders: Sam Hocevar (Debian packages) , + Loic Minier , + Reinhard Tartler , + Fabian Greffrath , + Andres Mejia +DM-Upload-Allowed: yes +Standards-Version: 3.8.2 +Vcs-Git: git://git.debian.org/git/pkg-multimedia/ffmpeg-debian.git +Vcs-Browser: http://git.debian.org/?p=pkg-multimedia/ffmpeg-debian.git;a=summary +Homepage: http://ffmpeg.org/ +Build-Depends-Indep: doxygen +Build-Depends: debhelper (>= 7), + libasound2-dev [!kfreebsd-i386 !kfreebsd-amd64 !hurd-i386], + libbz2-dev, + libdc1394-22-dev [!kfreebsd-i386 !kfreebsd-amd64 !hurd-i386], + libdirac-dev, + libfaad-dev | libfaad2-dev, + libfreetype6-dev, + libgsm1-dev, + libimlib2-dev, + libopenjpeg-dev, + libraw1394-dev [!kfreebsd-i386 !kfreebsd-amd64 !hurd-i386], + libschroedinger-dev, + libsdl1.2-dev, + libspeex-dev, + libtheora-dev (>> 0.0.0.alpha4), + libvorbis-dev, + libx11-dev, + libxext-dev, + libxvmc-dev, + quilt, + texi2html, + yasm [i386 amd64], + zlib1g-dev + +Package: ffmpeg +Section: video +Architecture: any +Depends: ${shlibs:Depends}, + ${misc:Depends} +Description: multimedia player, server and encoder + This package contains the ffplay multimedia player, the ffserver streaming + server and the ffmpeg audio and video encoder. They support most existing + file formats (AVI, MPEG, OGG, Matroska, ASF...) and encoding formats (MPEG, + DivX, MPEG4, AC3, DV...). + +Package: ffmpeg-dbg +Section: debug +Priority: extra +Architecture: any +Depends: libavutil49 (= ${binary:Version}), + libavcodec52 (= ${binary:Version}), + libavdevice52 (= ${binary:Version}), + libpostproc51 (= ${binary:Version}), + libavformat52 (= ${binary:Version}), + libswscale0 (= ${binary:Version}), + ffmpeg (= ${binary:Version}) +Description: Debug symbols for ffmpeg related packages + This package contains debug data of the ffmpeg related shared libraries. + . + Most people will not need this package. Please install it to produce useful + stacktraces to help debugging the ffmpeg library. + +Package: ffmpeg-doc +Section: doc +Architecture: all +Depends: ${misc:Depends} +Description: documentation of the ffmpeg API + This package contains the html doxygen documentation of the ffmpeg API. + +Package: libavutil49 +Architecture: any +Depends: ${shlibs:Depends}, + ${misc:Depends} +Description: ffmpeg utility library + This is the common utility library from the ffmpeg project. It is required + by all other ffmpeg libraries. + . + This package contains a Debian-specific version of the libavutil shared + object that should only be used by Debian packages. + +Package: libavcodec52 +Architecture: any +Depends: ${shlibs:Depends}, + ${misc:Depends} +Description: ffmpeg codec library + This is the codec library from the ffmpeg project. It supports most existing + encoding formats (MPEG, DivX, MPEG4, AC3, DV...). + . + This package contains a Debian-specific version of the libavcodec shared + object that should only be used by Debian packages. + +Package: libavdevice52 +Architecture: any +Depends: ${shlibs:Depends}, + ${misc:Depends} +Description: ffmpeg device handling library + This is the device handling library from the ffmpeg project. + . + This package contains a Debian-specific version of the libavdevice shared + object that should only be used by Debian packages. + +Package: libavformat52 +Architecture: any +Depends: ${shlibs:Depends}, + ${misc:Depends} +Breaks: libavcodec51 (<< 3:0.svn20090303-1) +Description: ffmpeg file format library + This is the demuxer library from the ffmpeg project. It supports most + existing file formats (AVI, MPEG, OGG, Matroska, ASF...). + . + This package contains a Debian-specific version of the libavformat shared + object that should only be used by Debian packages. + +Package: libavfilter0 +Architecture: any +Depends: ${shlibs:Depends}, + ${misc:Depends} +Description: ffmpeg video filtering library + This is the video filtering library from the ffmpeg project. + . + This package contains a Debian-specific version of the libavfilter shared + object that should only be used by Debian packages. + +Package: libpostproc51 +Architecture: any +Depends: ${shlibs:Depends}, + ${misc:Depends} +Description: ffmpeg video postprocessing library + This is the video postprocessing library from the ffmpeg project. + . + This package contains a Debian-specific version of the libpostproc shared + object that should only be used by Debian packages. + +Package: libswscale0 +Architecture: any +Depends: ${shlibs:Depends}, + ${misc:Depends} +Description: ffmpeg video scaling library + This is the video scaling library from the ffmpeg project. + . + This package contains a Debian-specific version of the libswscale shared + object that should only be used by Debian packages. + +Package: libavutil-dev +Section: libdevel +Architecture: any +Depends: libavutil49 (>= ${binary:Version}) | libavutil-unstripped-49 (>= ${binary:Version}), + libavutil49 (<= ${source:Upstream-Version}-99) | libavutil-unstripped-49 (<= ${source:Upstream-Version}-99) +Description: development files for libavutil + This is the common utility library from the ffmpeg project. It is required + by all other ffmpeg libraries. + . + This package contains the header files and static libraries needed to + compile applications or shared objects that use libavutil. + +Package: libavcodec-dev +Section: libdevel +Architecture: any +Depends: libavcodec52 (>= ${binary:Version}) | libavcodec-unstripped-52 (>= ${binary:Version}), + libavcodec52 (<= ${source:Upstream-Version}-99) | libavcodec-unstripped-52 (<= ${source:Upstream-Version}-99), + libavutil-dev (= ${binary:Version}) +Suggests: libfaad-dev, + libgsm1-dev, + libogg-dev, + libschroedinger-dev, + libspeex-dev, + libtheora-dev (>> 0.0.0.alpha4), + libvorbis-dev, + libx11-dev, + libxext-dev, + zlib1g-dev, + ${lib1394-dev} +Description: development files for libavcodec + This is the codec library from the ffmpeg project. It supports most existing + encoding formats (MPEG, DivX, MPEG4, AC3, DV...). + . + This package contains the header files and static libraries needed to + compile applications or shared objects that use libavcodec. + +Package: libavdevice-dev +Section: libdevel +Architecture: any +Depends: libavdevice52 (>= ${binary:Version}) | libavdevice-unstripped-52 (>= ${binary:Version}), + libavdevice52 (<= ${source:Upstream-Version}-99) | libavdevice-unstripped-52 (<= ${source:Upstream-Version}-99), + libavformat-dev (= ${binary:Version}) +Description: development files for libavdevice + This is the device handling library from the ffmpeg project. + . + This package contains the header files and static libraries needed to + compile applications or shared objects that use libavdevice. + +Package: libavformat-dev +Section: libdevel +Architecture: any +Depends: libavformat52 (>= ${binary:Version}) | libavformat-unstripped-52 (>= ${binary:Version}), + libavformat52 (<= ${source:Upstream-Version}-99) | libavformat-unstripped-52 (<= ${source:Upstream-Version}-99), + libavcodec-dev (= ${binary:Version}) +Description: development files for libavformat + This is the demuxer library from the ffmpeg project. It supports most + existing file formats (AVI, MPEG, OGG, Matroska, ASF...). + . + This package contains the header files and static libraries needed to + compile applications or shared objects that use libavformat. + +Package: libavfilter-dev +Section: libdevel +Architecture: any +Depends: libavfilter0 (>= ${binary:Version}) | libavfilter-unstripped-0 (>= ${binary:Version}), + libavfilter0 (<= ${source:Upstream-Version}-99) | libavfilter-unstripped-0 (<= ${source:Upstream-Version}-99), + libavcodec-dev (= ${binary:Version}) +Description: development files for libavfilter + This is the video filtering library from the ffmpeg project. + . + This package contains the header files and static libraries needed to + compile applications or shared objects that use libavfilter. + +Package: libpostproc-dev +Section: libdevel +Architecture: any +Depends: libpostproc51 (>= ${binary:Version}) | libpostproc-unstripped-51 (>= ${binary:Version}), + libpostproc51 (<= ${source:Upstream-Version}-99) | libpostproc-unstripped-51 (<= ${source:Upstream-Version}-99), + libavutil-dev (= ${binary:Version}) +Description: development files for libpostproc + This is the video postprocessing library from the ffmpeg project. + . + This package contains the header files and static libraries needed to + compile applications or shared objects that use libpostproc. + +Package: libswscale-dev +Section: libdevel +Architecture: any +Depends: libswscale0 (>= ${binary:Version}) | libswscale-unstripped-0 (>= ${binary:Version}), + libswscale0 (<= ${source:Upstream-Version}-99) | libswscale-unstripped-0 (<= ${source:Upstream-Version}-99), + libavutil-dev (= ${binary:Version}) +Description: development files for libswscale + This is the video scaling library from the ffmpeg project. + . + This package contains the header files and static libraries needed to + compile applications or shared objects that use libswscale. --- ffmpeg-0.5+svn20090706.orig/debian/ffmpeg.install +++ ffmpeg-0.5+svn20090706/debian/ffmpeg.install @@ -0,0 +1,4 @@ +etc +usr/bin +usr/share/man +usr/share/ffmpeg/*.ffpreset --- ffmpeg-0.5+svn20090706.orig/debian/libswscale0.install +++ ffmpeg-0.5+svn20090706/debian/libswscale0.install @@ -0,0 +1 @@ +usr/lib/{,*/,*/*/}libswscale.so.* --- ffmpeg-0.5+svn20090706.orig/debian/libavfilter-dev.install +++ ffmpeg-0.5+svn20090706/debian/libavfilter-dev.install @@ -0,0 +1,4 @@ +usr/include/libavfilter +usr/lib/libavfilter.a +usr/lib/{,*/,*/*/}libavfilter.so +usr/lib/pkgconfig/libavfilter.pc --- ffmpeg-0.5+svn20090706.orig/debian/libavcodec52.lintian-overrides +++ ffmpeg-0.5+svn20090706/debian/libavcodec52.lintian-overrides @@ -0,0 +1,3 @@ +# Overriding these fpic lintian errors. Please see bug #528080. +libavcodec52: shlib-with-non-pic-code usr/lib/i686/cmov/libavcodec.so.52.20.0 +libavcodec52: shlib-with-non-pic-code usr/lib/libavcodec.so.52.20.0 --- ffmpeg-0.5+svn20090706.orig/debian/libpostproc-dev.install +++ ffmpeg-0.5+svn20090706/debian/libpostproc-dev.install @@ -0,0 +1,4 @@ +usr/include/libpostproc +usr/lib/libpostproc.a +usr/lib/{,*/,*/*/}libpostproc.so +usr/lib/pkgconfig/libpostproc.pc --- ffmpeg-0.5+svn20090706.orig/debian/gbp.conf +++ ffmpeg-0.5+svn20090706/debian/gbp.conf @@ -0,0 +1,6 @@ +[DEFAULT] +upstream-branch = upstream +debian-branch = master +upstream-tag = upstream/%(version)s +debian-tag = debian/%(version)s +pristine-tar = True --- ffmpeg-0.5+svn20090706.orig/debian/libavutil49.lintian-overrides +++ ffmpeg-0.5+svn20090706/debian/libavutil49.lintian-overrides @@ -0,0 +1,3 @@ +# Overriding these fpic lintian errors. Please see bug #528080. +libavutil49: shlib-with-non-pic-code usr/lib/i686/cmov/libavutil.so.49.15.0 +libavutil49: shlib-with-non-pic-code usr/lib/libavutil.so.49.15.0 --- ffmpeg-0.5+svn20090706.orig/debian/confflags +++ ffmpeg-0.5+svn20090706/debian/confflags @@ -0,0 +1,189 @@ +# -*- mode: makefile -*- +# vim:syntax=make +# +# build a static version on every architecture in the 'debian' ffmpeg package +FLAVORS += static + +# shared is generic, i.e. without arch specific opcodes +FLAVORS += shared + +export DEB_HOST_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE) +export DEB_BUILD_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE) +export DEB_HOST_ARCH ?= $(shell dpkg-architecture -qDEB_HOST_ARCH) + +SVNREVISION=$(shell cat .svnrevision 2>/dev/null || echo "UNKNOWN") + +# the other flavors always build dynamic versions +# Also, disable architecture-specific optimizations for default shared build +ifeq ($(DEB_HOST_ARCH),armel) +nooptflags += --disable-armv5te --disable-armv6 --disable-armv6t2 +nooptflags += --disable-armvfp --disable-neon +# disabled for now as we need hwcaps support in glibc first +#FLAVORS += neon vfp +else ifeq ($(DEB_HOST_ARCH),arm) +nooptflags += --disable-armv5te --disable-armv6 --disable-armv6t2 +nooptflags += --disable-armvfp --disable-neon +else ifeq ($(DEB_HOST_ARCH),i386) +FLAVORS += cmov +else ifeq ($(DEB_HOST_ARCH),powerpc) +FLAVORS += altivec +nooptflags += --disable-altivec +else ifeq ($(DEB_HOST_ARCH),sparc) +FLAVORS += vis +nooptflags += --disable-vis +endif + +define cond_enable + $(shell test -r $(1) && echo --enable-$(2) ) +endef + +# variant that also require --enable-nonfree +define cond_enable_nf + $(shell test -r $(1) && echo --enable-$(2) --enable-nonfree ) +endef + +# Configuration flags causing the libs to be GPL tainted +gpl_confflags += --enable-gpl +gpl_confflags += --enable-postproc +gpl_confflags += --enable-swscale +gpl_confflags += --enable-x11grab + +# there is no libfaad in ubuntu/main, on in ubuntu/multiverse +gpl_confflags += $(call cond_enable,/usr/include/faad.h,libfaad) + +# "forbidden" encoders, see README.Debian for details +disable_encoders += --disable-encoder=h263 +disable_encoders += --disable-encoder=h263p +disable_encoders += --disable-encoder=mpeg2video +disable_encoders += --disable-encoder=mpeg4 +disable_encoders += --disable-encoder=msmpeg4v1 +disable_encoders += --disable-encoder=msmpeg4v2 +disable_encoders += --disable-encoder=msmpeg4v3 + +# don't disable encoders if internalencoders is set in DEB_BUILD_OPTIONS +ifeq (,$(filter internalencoders,$(DEB_BUILD_OPTIONS))) +confflags += $(disable_encoders) +endif + +# Common configuration flags +confflags += --extra-version='$(DEB_VERSION)' +confflags += --prefix=/usr +confflags += --enable-avfilter +confflags += --enable-avfilter-lavf +confflags += --enable-vdpau +confflags += --enable-bzlib +confflags += --enable-libdirac +confflags += --enable-libgsm +confflags += --enable-libopenjpeg +confflags += --enable-libschroedinger +confflags += --enable-libspeex +confflags += --enable-libtheora +confflags += --enable-libvorbis +confflags += --enable-pthreads +confflags += --enable-zlib +confflags += --disable-stripping +confflags += --disable-vhook +confflags += $(extra_common_confflags) + +# this part below is intended for the 'ffmpeg' package in ubuntu/multiverse +gpl_confflags += $(call cond_enable,/usr/include/xvid.h,libxvid) +gpl_confflags += $(call cond_enable,/usr/include/x264.h,libx264) + +confflags += $(call cond_enable,/usr/include/lame/lame.h,libmp3lame) +confflags += $(call cond_enable_nf,/usr/include/amrnb/sp_dec.h,libamr-nb) +confflags += $(call cond_enable_nf,/usr/include/amrwb/dec.h,libamr-wb) + +# AAC is considered non-free upstream +confflags += $(call cond_enable_nf,/usr/include/faac.h,libfaac) + +# comment out following line for LGPL versions of the libraries +confflags += $(gpl_confflags) + +# Enable IEEE 1394 (FireWire) support on Linux only +ifneq (,$(findstring linux,$(DEB_HOST_GNU_TYPE))) + confflags += --enable-libdc1394 + lib1394-dev += libraw1394-dev, libdc1394-22-dev +endif + +# We add vdpau headers ourselves so ffmpeg can stay in main +confflags += --extra-cflags="-I$(CURDIR)/debian/include" + +# XXX this probably needs fixing +CFLAGS := + +ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS))) +# Various parts of ffmpeg (and swscale) FTBFS when compiling with -fPIC +# and with mmx code enabled. + confflags += --disable-optimizations + confflags += --disable-mmx +endif + +# Configuration flags for the static libraries +static_build_confflags += $(confflags) + +# Configuration flags for the non-optimized shared libraries +shared_build_confflags += $(confflags) +# amd64 has no problems with optimized shared libs. i386 and arm do. +ifneq ($(DEB_HOST_ARCH),amd64) +shared_build_confflags += $(nooptflags) +endif +shared_build_confflags += --enable-shared +shared_build_confflags += --disable-static + +## armel architecture specific +# Configuration flags for the optimised shared libraries +vfp_build_confflags += $(confflags) +vfp_build_confflags += --shlibdir=/usr/lib/vfp +vfp_build_confflags += --enable-armvfp +vfp_build_confflags += --enable-shared +vfp_build_confflags += --disable-static +vfp_build_confflags += --extra-cflags="-mfpu=vfp -mfloat-abi=softfp" +vfp_build_confflags += --disable-ffmpeg +vfp_build_confflags += --disable-ffplay +neon_build_confflags += $(confflags) +neon_build_confflags += --shlibdir=/usr/lib/neon +neon_build_confflags += --enable-neon +neon_build_confflags += --enable-shared +neon_build_confflags += --disable-static +neon_build_confflags += --disable-ffmpeg +neon_build_confflags += --disable-ffplay + +## i386 architecture specific +# Configuration flags for the optimized shared libraries +cmov_build_confflags += $(confflags) +cmov_build_confflags += $(nooptflags) +cmov_build_confflags += --shlibdir=/usr/lib/i686/cmov +cmov_build_confflags += --cpu='i686' +cmov_build_confflags += --enable-shared +cmov_build_confflags += --disable-static +cmov_build_confflags += --disable-ffmpeg +cmov_build_confflags += --disable-ffplay + +## powerpc architecture specific +# Configuration flags for the optimized shared libraries +altivec_build_confflags += $(confflags) +altivec_build_confflags += --shlibdir=/usr/lib/altivec +altivec_build_confflags += --cpu='g4' +altivec_build_confflags += --enable-shared +altivec_build_confflags += --disable-static +altivec_build_confflags += --extra-cflags="-fPIC -DPIC" +altivec_build_confflags += --enable-altivec +altivec_build_confflags += --disable-ffmpeg +altivec_build_confflags += --disable-ffplay + +## sparc architecture specific +# Configuration flags for the optimized shared libraries +vis_build_confflags += $(confflags) +vis_build_confflags += --shlibdir=/usr/lib/v9 +vis_build_confflags += --cpu='sparc64' +vis_build_confflags += --enable-shared +vis_build_confflags += --disable-static +vis_build_confflags += --extra-cflags="-fPIC -DPIC" +vis_build_confflags += --disable-ffmpeg +vis_build_confflags += --disable-ffplay + +# Additional documentation for PowerPC +ifneq (,$(findstring powerpc,$(DEB_BUILD_GNU_TYPE))) + extradoc := doc/ffmpeg_powerpc_performance_evaluation_howto.txt +endif + --- ffmpeg-0.5+svn20090706.orig/debian/libswscale-dev.install +++ ffmpeg-0.5+svn20090706/debian/libswscale-dev.install @@ -0,0 +1,4 @@ +usr/include/libswscale +usr/lib/libswscale.a +usr/lib/{,*/,*/*/}libswscale.so +usr/lib/pkgconfig/libswscale.pc --- ffmpeg-0.5+svn20090706.orig/debian/qt-faststart.1 +++ ffmpeg-0.5+svn20090706/debian/qt-faststart.1 @@ -0,0 +1,36 @@ +.\" Hey, EMACS: -*- nroff -*- +.\" First parameter, NAME, should be all caps +.\" Second parameter, SECTION, should be 1-8, maybe w/ subsection +.\" other parameters are allowed: see man(7), man(1) +.TH QT-FASTSTART 1 "May 10, 2009" +.\" Please adjust this date whenever revising the manpage. +.\" +.\" Some roff macros, for reference: +.\" .nh disable hyphenation +.\" .hy enable hyphenation +.\" .ad l left justify +.\" .ad b justify to both left and right margins +.\" .nf disable filling +.\" .fi enable filling +.\" .br insert line break +.\" .sp insert n+1 empty lines +.\" for manpage-specific macros, see man(7) +.SH NAME +qt-faststart \- utility for Quicktime files +.SH SYNOPSIS +.B qt-faststart +.br +.SH DESCRIPTION +\fBqt-faststart\fP is a utility that rearranges a Quicktime file such that the +moov atom is in front of the data, thus facilitating network streaming. +.SH OPTIONS +Options processed by the executable: +.TP +\fB\\fR +The source Quicktime file. +.TP +\fB\\fR +The destination Quicktime file. +.SH AUTHOR +This manual page was written by Andres Mejia +for the Debian GNU/Linux system, but may be used by others. --- ffmpeg-0.5+svn20090706.orig/debian/clean +++ ffmpeg-0.5+svn20090706/debian/clean @@ -0,0 +1,3 @@ +config-extra-includes.h +EXTRA +formats.txt --- ffmpeg-0.5+svn20090706.orig/debian/libavformat-dev.install +++ ffmpeg-0.5+svn20090706/debian/libavformat-dev.install @@ -0,0 +1,4 @@ +usr/include/libavformat +usr/lib/libavformat.a +usr/lib/{,*/,*/*/}libavformat.so +usr/lib/pkgconfig/libavformat.pc --- ffmpeg-0.5+svn20090706.orig/debian/libswscale0.lintian-overrides +++ ffmpeg-0.5+svn20090706/debian/libswscale0.lintian-overrides @@ -0,0 +1,3 @@ +# Overriding these fpic lintian errors. Please see bug #528080. +libswscale0: shlib-with-non-pic-code usr/lib/i686/cmov/libswscale.so.0.7.1 +libswscale0: shlib-with-non-pic-code usr/lib/libswscale.so.0.7.1 --- ffmpeg-0.5+svn20090706.orig/debian/libavcodec-dev.install +++ ffmpeg-0.5+svn20090706/debian/libavcodec-dev.install @@ -0,0 +1,4 @@ +usr/include/libavcodec +usr/lib/libavcodec.a +usr/lib/{,*/,*/*/}libavcodec.so +usr/lib/pkgconfig/libavcodec.pc --- ffmpeg-0.5+svn20090706.orig/debian/compat +++ ffmpeg-0.5+svn20090706/debian/compat @@ -0,0 +1 @@ +7 --- ffmpeg-0.5+svn20090706.orig/debian/README.Source +++ ffmpeg-0.5+svn20090706/debian/README.Source @@ -0,0 +1,48 @@ + +In the past, Debian used to ship "stripped" ffmpeg packages, i.e. the +source code of the ffmpeg-debian package has been modified to disable +specific codecs (mostly encoders like H263, H264, MPEG2 video, MPEG4 and +MS-MPEG4) whose usage may represent patent infringement in certain +jurisdictions. To serve the purpose to remain free of patented encoding +technologies, the modifications to the ffmpeg source code have been done +in a "non-reversible" way by removing several lines from the source code +before packaging the release tarball. To reflect this divergence from +upstream ffmpeg, the Debian package has been renamed to ffmpeg-debian. +However, please note that only the code calling the affected codecs was +removed in previous versions to make them unavailable to the resulting +ffmpeg libraries. No encoder code was actually ever removed from the +Debian packages! + +Several complications have come along with the aforementioned measures: +* Further packaging hacks (e.g. debian/fixup-config.sh) have become + necessary in order to build the source code without the stripped + encoders. +* It was impossible to rebuild unstripped packages for private usage + from the ffmpeg-debian source code +* Ffmpeg upstream was not very happy about Debian redistributing a + stripped fork of their code, to say the least. + +Nowadays, while the situation remains pretty unchanged with regard to +the patent threat, the ffmpeg build system has seen a lot of +improvements. It now provides the possibility to explicitly disable +specific codecs from the libraries at configure time, allowing disabling +some patent encumbered codecs without the need to strip the source code. +The effect on the resulting binary packages would remain the same as +before. + +Regarding the source code, however, this would mean some significant +improvements: +* There is no more need to strip the source code in order to disable the + codecs and to apply further Debian-specific hacks to still make it + compile cleanly. +* In order to rebuild unstripped ffmpeg libraries for private usage, it + would be sufficient to comment out a few configure flags. +* Debian would not need to fork the ffmpeg source code anymore and call + their packages by a different name. + +Therefore, the pkg-multimedia-maintainers (the maintainers of the ffmpeg +packages in Debian) decided to not strip the ffmpeg source code in +further releases anymore but disable the patent encumbered codecs during +the configure phase of the packages as intended upstream. We are sure +this is the right thing to do with regard to the aforementioned +advantages for both our users and ourselves as maintainers. --- ffmpeg-0.5+svn20090706.orig/debian/libavcodec52.install +++ ffmpeg-0.5+svn20090706/debian/libavcodec52.install @@ -0,0 +1 @@ +usr/lib/{,*/,*/*/}libavcodec.so.* --- ffmpeg-0.5+svn20090706.orig/debian/include/vdpau/vdpau_x11.h +++ ffmpeg-0.5+svn20090706/debian/include/vdpau/vdpau_x11.h @@ -0,0 +1,174 @@ +/* + * This source file is documented using Doxygen markup. + * See http://www.stack.nl/~dimitri/doxygen/ + */ + +/* + * This copyright notice applies to this header file: + * + * Copyright (c) 2008 NVIDIA Corporation + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ + +/** + * \file vdpau_x11.h + * \brief X11 Window System Integration Layer + * + * This file contains the \ref api_winsys_x11 "X11 Window System + * Integration Layer". + */ + +#ifndef _VDPAU_X11_H +#define _VDPAU_X11_H + +#include +#include "vdpau.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \ingroup api_winsys + * @{ + */ + +/** + * \defgroup api_winsys_x11 X11 Window System Integration Layer + * + * The set of VDPAU functionality specific to usage with the X + * Window System. + * + * \section Driver Library Layout + * + * An X11-oriented VDPAU installation consists of the following + * components: + * + * - Header files. These files are located in the standard + * system header file path. + * - \c vdpau/vdpau.h + * - \c vdpau/vdpau_x11.h + * - The VDPAU wrapper library. These files are located in the + * standard system (possibly X11-specific) library path. + * - \c libvdpau.so.1 (runtime) + * - \c libvdpau.so (development) + * - Back-end driver files. These files are located in the + * standard system (possibly X11-specific) library path. + * - \c libvdpau_\%s.so + * For example: + * - \c libvdpau_nvidia.so + * - \c libvdpau_intel.so + * - \c libvdpau_ati.so + * + * The VDPAU wrapper library implements just one function; \ref + * vdp_device_create_x11. The wrapper will implement this function + * by dynamically loading the appropriate back-end driver file + * mentioned above. Long-term, the wrapper will use a + * VDPAU-specific X extension to determine which back-end driver + * to load. Currently, the wrapper library hard-codes the driver + * name as "nvidia", although this can be overridden using the + * environment variable VDPAU_DRIVER. + * + * The back-end driver is expected to implement a function named + * \b vdp_imp_device_create_x11. The wrapper will call this function to + * actually implement the \ref vdp_device_create_x11 application call. + * + * Note that it is theoretically possible for an application to + * create multiple \ref VdpDevice "VdpDevice" objects. In this + * case, the wrapper library may load multiple back-end drivers + * into the same application, and/or invoke a specific back-end + * driver's \b VdpImpDeviceCreateX11 multiple times. The wrapper + * libray imposes no policy regarding whether the application + * may instantiate multiple \ref VdpDevice "VdpDevice" objects for + * the same display and/or screen. However, back-end drivers are + * free to limit the number of \ref VdpDevice "VdpDevice" objects + * as required by their implementation. + * + * @{ + */ + +/** + * \brief Create a VdpDevice object for use with X11. + * \param[in] display The X Display that the VdpDevice VdpDevice + * will operate against. + * \param[in] screen The X screen that the VdpDevice will operate + * against. + * \param[out] device The new device's handle. + * \param[out] get_proc_address The get_proc_address entry point + * to use with this device. + * \return VdpStatus The completion status of the operation. + */ +typedef VdpStatus VdpDeviceCreateX11( + Display * display, + int screen, + /* output parameters follow */ + VdpDevice * device, + VdpGetProcAddress * * get_proc_address +); + +/** + * \brief Create a VdpDevice object for use with X11. + * This is an actual symbol of type \ref VdpDeviceCreateX11 + * + */ +VdpDeviceCreateX11 vdp_device_create_x11; + +/** + * \brief Create a VdpPresentationQueueTarget for use with X11. + * \param[in] device The device that will contain the queue + * target. + * \param[in] drawable The X11 Drawable that the presentation + * queue will present into. + * \param[out] target The new queue target's handle. + * \return VdpStatus The completion status of the operation. + * + * Note: VDPAU expects to own the entire drawable for the duration of time + * that the presentation queue target exists. In particular, + * implementations may choose to manipulate client-visible X11 window state + * as required. As such, it is recommended that applications create a + * dedicated window for the presentation queue target, as a child + * (grand-child, ...) of their top-level application window. + * + * Applications may also create child-windows of the presentation queue + * target, which will cover any presented video in the normal fashion. VDPAU + * implementations will not manipulate such child windows in any fashion. + */ +typedef VdpStatus VdpPresentationQueueTargetCreateX11( + VdpDevice device, + Drawable drawable, + /* output parameters follow */ + VdpPresentationQueueTarget * target +); + +/** \hideinitializer */ +#define VDP_FUNC_ID_PRESENTATION_QUEUE_TARGET_CREATE_X11 (VdpFuncId)(VDP_FUNC_ID_BASE_WINSYS + 0) + +/*@}*/ +/*@}*/ + +#ifdef __cplusplus +} +#endif + +#endif + --- ffmpeg-0.5+svn20090706.orig/debian/include/vdpau/vdpau.h +++ ffmpeg-0.5+svn20090706/debian/include/vdpau/vdpau.h @@ -0,0 +1,3972 @@ +/* + * This source file is documented using Doxygen markup. + * See http://www.stack.nl/~dimitri/doxygen/ + */ + +/* + * This copyright notice applies to this header file: + * + * Copyright (c) 2008 NVIDIA Corporation + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ + +/** + * \mainpage Video Decode and Presentation API for Unix + * + * \section intro Introduction + * + * The Video Decode and Presentation API for Unix (VDPAU) provides + * a complete solution for decoding, post-processing, compositing, + * and displaying compressed or uncompressed video streams. These + * video streams may be combined (composited) with bitmap content, + * to implement OSDs and other application user interfaces. + * + * \section api_partitioning API Partitioning + * + * VDPAU is split into two distinct modules: + * - \ref api_core + * - \ref api_winsys + * + * The intent is that most VDPAU functionality exists and + * operates identically across all possible Windowing Systems. + * This functionality is the \ref api_core. + * + * However, a small amount of functionality must be included that + * is tightly coupled to the underlying Windowing System. This + * functionality is the \ref api_winsys. Possibly examples + * include: + * - Creation of the initial VDPAU \ref VdpDevice "VdpDevice" + * handle, since this act requires intimate knowledge of the + * underlying Window System, such as specific display handle or + * driver identification. + * - Conversion of VDPAU surfaces to/from underlying Window + * System surface types, e.g. to allow manipulation of + * VDPAU-generated surfaces via native Window System APIs. + * + * \section objects Object Types + * + * VDPAU is roughly object oriented; most functionality is + * exposed by creating an object (handle) of a certain class + * (type), then executing various functions against that handle. + * The set of object classes supported, and their purpose, is + * discussed below. + * + * \subsection device_type Device Type + * + * A \ref VdpDevice "VdpDevice" is the root object in VDPAU's + * object system. The \ref api_winsys allows creation of a \ref + * VdpDevice "VdpDevice" object handle, from which all other API + * entry points can be retrieved and invoked. + * + * \subsection surface_types Surface Types + * + * A surface stores pixel information. Various types of surfaces + * existing for different purposes: + * + * - \ref VdpVideoSurface "VdpVideoSurface"s store decompressed + * YCbCr video frames in an implementation-defined internal + * format. + * - \ref VdpOutputSurface "VdpOutputSurface"s store RGB 4:4:4 + * data. They are legal render targets for video + * post-processing and compositing operations. + * - \ref VdpBitmapSurface "VdpBitmapSurface"s store RGB 4:4:4 + * data. These surfaces are designed to contain read-only + * bitmap data, to be used for OSD or application UI + * compositing. + * + * \subsection transfer_types Transfer Types + * + * A data transfer object reads data from a surface (or + * surfaces), processes it, and writes the result to another + * surface. Various types of processing are possible: + * + * - \ref VdpDecoder "VdpDecoder" objects process compressed video + * data, and generate decompressed images. + * - \ref VdpOutputSurface "VdpOutputSurface"s have their own \ref + * VdpOutputSurfaceRender "rendering functionality". + * - \ref VdpVideoMixer "VdpVideoMixer" objects perform video + * post-processing, de-interlacing, and compositing. + * - \ref VdpPresentationQueue "VdpPresentationQueue" is + * responsible for timestamp-based display of surfaces. + * + * \section data_flow Data Flow + * + * Compressed video data originates in the application's memory + * space. This memory is typically obtained using \c malloc, and + * filled via regular file or network read system calls. + * Alternatively, the application may \c mmap a file. + * + * The compressed data is then processed using a \ref VdpDecoder + * "VdpDecoder", which will decompress the field or frame, + * and write the result into a \ref VdpVideoSurface + * "VdpVideoSurface". This action may require reading pixel data + * from some number of other \ref VdpVideoSurface "VdpVideoSurface" + * objects, depending on the type of compressed data and + * field/frame in question. + * + * If the application wishes to display any form of OSD or + * user-interface, this must be created in a \ref + * VdpOutputSurface "VdpOutputSurface". + * + * This process begins with the creation of \ref VdpBitmapSurface + * "VdpBitmapSurface" objects to contain the OSD/UI's static data, + * such as individual glyphs. + * + * \ref VdpOutputSurface "VdpOutputSurface" \ref + * VdpOutputSurfaceRender "rendering functionality" may be used + * to composite together various \ref VdpBitmapSurface + * "VdpBitmapSurface"s and \ref VdpOutputSurface + * "VdpOutputSurface"s, into another VdpOutputSurface + * "VdpOutputSurface". + * + * Once video has been decoded, it must be post-processed. This + * involves various steps such as color space conversion, + * de-interlacing, and other video adjustments. This step is + * performed using an \ref VdpVideoMixer "VdpVideoMixer" object. + * This object can not only perform the aforementioned video + * post-processing, but also composite the video with a number of + * \ref VdpOutputSurface "VdpOutputSurface"s, thus allowing complex + * user interfaces to be built. The final result is written into + * another \ref VdpOutputSurface "VdpOutputSurface". + * + * Note that at this point, the resultant \ref VdpOutputSurface + * "VdpOutputSurface" may be fed back through the above path, + * either using \ref VdpOutputSurface "VdpOutputSurface" \ref + * VdpOutputSurfaceRender "rendering functionality", + * or as input to the \ref VdpVideoMixer "VdpVideoMixer" object. + * + * Finally, the resultant \ref VdpOutputSurface + * "VdpOutputSurface" must be displayed on screen. This is the job + * of the \ref VdpPresentationQueue "VdpPresentationQueue" object. + * + * \image html vdpau_data_flow.png + * + * \section entry_point_retrieval Entry Point Retrieval + * + * VDPAU is designed so that multiple implementations can be + * used without application changes. For example, VDPAU could be + * hosted on X11, or via direct GPU access. + * + * The key technology behind this is the use of function + * pointers and a "get proc address" style API for all entry + * points. Put another way, functions are not called directly + * via global symbols set up by the linker, but rather through + * pointers. + * + * In practical terms, the \ref api_winsys provides factory + * functions which not only create and return \ref VdpDevice + * "VdpDevice" objects, but also a function pointer to a \ref + * VdpGetProcAddress function, through which all entry point + * function pointers will be retrieved. + * + * \subsection entry_point_philosophy Philosophy + * + * It is entirely possible to envisage a simpler scheme whereby + * such function pointers are hidden. That is, the application + * would link against a wrapper library that exposed "real" + * functions. The application would then call such functions + * directly, by symbol, like any other function. The wrapper + * library would handle loading the appropriate back-end, and + * implementing a similar "get proc address" scheme internally. + * + * However, the above scheme does not work well in the context + * of separated \ref api_core and \ref api_winsys. In this + * scenario, one would require a separate wrapper library per + * Window System, since each Window System would have a + * different function name and prototype for the main factory + * function. If an application then wanted to be Window System + * agnostic (making final determination at run-time via some + * form of plugin), it may then need to link against two + * wrapper libraries, which would cause conflicts for all + * symbols other than the main factory function. + * + * Another disadvantage of the wrapper library approach is the + * extra level of function call required; the wrapper library + * would internally implement the existing "get proc address" + * and "function pointer" style dispatch anyway. Exposing this + * directly to the application is slightly more efficient. + * + * \section threading Multi-threading + * + * All VDPAU functionality is fully thread-safe; any number of + * threads may call into any VDPAU functions at any time. VDPAU + * may not be called from signal-handlers. + * + * Note, however, that this simply guarantees that internal + * VDPAU state will not be corrupted by thread usage, and that + * crashes and deadlocks will not occur. Completely arbitrary + * thread usage may not generate the results that an application + * desires. In particular, care must be taken when multiple + * threads are performing operations on the same VDPAU objects. + * + * VDPAU implementations guarantee correct flow of surface + * content through the rendering pipeline, but only when + * function calls that read from or write to a surface return to + * the caller prior to any thread calling any other function(s) + * that read from or write to the surface. Invoking multiple + * reads from a surface in parallel is OK. + * + * Note that this restriction is placed upon VDPAU function + * invocations, and specifically not upon any back-end + * hardware's physical rendering operations. VDPAU + * implementations are expected to internally synchronize such + * hardware operations. + * + * In a single-threaded application, the above restriction comes + * naturally; each function call completes before it is possible + * to begin a new function call. + * + * In a multi-threaded application, threads may need to be + * synchronized. For example, consider the situation where: + * + * - Thread 1 is parsing compressed video data, passing them + * through a \ref VdpDecoder "VdpDecoder" object, and filling a + * ring-buffer of \ref VdpVideoSurface "VdpVideoSurface"s + * - Thread 2 is consuming those \ref VdpVideoSurface + * "VdpVideoSurface"s, and using a \ref VdpVideoMixer + * "VdpVideoMixer" to process them and composite them with UI. + * + * In this case, the threads must synchronize to ensure that + * thread 1's call to \ref VdpDecoderRender has returned prior to + * thread 2's call(s) to \ref VdpVideoMixerRender that use that + * specific surface. This could be achieved using the following + * pseudo-code: + * + * \code + * Queue q_full_surfaces; + * Queue q_empty_surfaces; + * + * thread_1() { + * for (;;) { + * VdpVideoSurface s = q_empty_surfaces.get(); + * // Parse compressed stream here + * VdpDecoderRender(s, ...); + * q_full_surfaces.put(s); + * } + * } + * + * // This would need to be more complex if + * // VdpVideoMixerRender were to be provided with more + * // than one field/frame at a time. + * thread_1() { + * for (;;) { + * // Possibly, other rendering operations to mixer + * // layer surfaces here. + * VdpOutputSurface t = ...; + * VdpPresentationQueueBlockUntilSurfaceIdle(t); + * VdpVideoSurface s = q_full_surfaces.get(); + * VdpVideoMixerRender(s, t, ...); + * q_empty_surfaces.put(s); + * // Possibly, other rendering operations to "t" here + * VdpPresentationQueueDisplay(t, ...); + * } + * } + * \endcode + * + * Finally, note that VDPAU makes no guarantees regarding any + * level of parallelism in any given implementation. Put another + * way, use of multi-threading is not guaranteed to yield any + * performance gain, and in theory could even slightly reduce + * performance due to threading/synchronization overhead. + * + * However, the intent of the threading requirements is to allow + * for e.g. video decoding and video mixer operations to proceed + * in parallel in hardware. Given a (presumably multi-threaded) + * application that kept each portion of the hardware busy, this + * would yield a performance increase. + * + * \section endianness Surface Endianness + * + * When dealing with surface content, i.e. the input/output of + * Put/GetBits functions, applications must take care to access + * memory in the correct fashion, so as to avoid endianness + * issues. + * + * By established convention in the 3D graphics world, RGBA data + * is defined to be an array of 32-bit pixels containing packed + * RGBA components, not as an array of bytes or interleaved RGBA + * components. VDPAU follows this convention. As such, + * applications are expected to access such surfaces as arrays + * of 32-bit components (i.e. using a 32-bit pointer), and not + * as interleaved arrays of 8-bit components (i.e. using an + * 8-bit pointer.) Deviation from this convention will lead to + * endianness issues, unless appropriate care is taken. + * + * The same convention is followed for some packed YCbCr formats + * such as \ref VDP_YCBCR_FORMAT_Y8U8V8A8; i.e. they are + * considered arrays of 32-bit pixels, and hence should be + * accessed as such. + * + * For YCbCr formats with chroma decimation and/or planar + * formats, however, this convention is awkward. Therefore, + * formats such as \ref VDP_YCBCR_FORMAT_NV12 are defined as + * arrays of (potentially interleaved) byte-sized components. + * Hence, applications should manipulate such data 8-bits at a + * time, using 8-bit pointers. + * + * Note that one common usage for the input/output of + * Put/GetBits APIs is file I/O. Typical file I/O APIs treat all + * memory as a simple array of 8-bit values. This violates the + * rule requiring surface data to be accessed in its true native + * format. As such, applications may be required to solve + * endianness issues. Possible solutions include: + * + * - Authoring static UI data files according to the endianness + * of the target execution platform. + * - Conditionally byte-swapping Put/GetBits data buffers at + * run-time based on execution platform. + * + * Note: Complete details regarding each surface format's + * precise pixel layout is included with the documentation of + * each surface type. For example, see \ref + * VDP_RGBA_FORMAT_B8G8R8A8. + * + * \section video_mixer_usage Video Mixer Usage + * + * \subsection video_surface_content VdpVideoSurface Content + * + * Each \ref VdpVideoSurface "VdpVideoSurface" is expected to contain an + * entire frame's-worth of data, irrespective of whether an interlaced of + * progressive sequence is being decoded. + * + * Depending on the exact encoding structure of the compressed video stream, + * the application may need to call \ref VdpDecoderRender twice to fill a + * single \ref VdpVideoSurface "VdpVideoSurface". When the stream contains an + * encoded progressive frame, or a "frame coded" interlaced field-pair, a + * single \ref VdpDecoderRender call will fill the entire surface. When the + * stream contains separately encoded interlaced fields, two + * \ref VdpDecoderRender calls will be required; one for the top field, and + * one for the bottom field. + * + * Implementation note: When \ref VdpDecoderRender renders an interlaced + * field, this operation must not disturb the content of the other field in + * the surface. + * + * \subsection vm_surf_list VdpVideoMixer Surface List + * + * An video stream is logically composed of a sequence of fields. An + * example is shown below, in display order, assuming top field first: + * + *
t0 b0 t1 b1 t2 b2 t3 b3 t4 b4 t5 b5 t6 b6 t7 b7 t8 b8 t9 b9
+ * + * The canonical usage is to call \ref VdpVideoMixerRender once for decoded + * field, in display order, to yield one post-processed frame for display. + * + * For each call to \ref VdpVideoMixerRender, the field to be processed should + * be provided as the \b video_surface_current parameter. + * + * To enable operation of advanced de-interlacing algorithms and/or + * post-processing algorithms, some past and/or future surfaces should be + * provided as context. These are provided in the \b video_surface_past and + * \b video_surface_future lists. In general, these lists may contain any + * number of surfaces. Specific implementations may have specific requirements + * determining the minimum required number of surfaces for optimal operation, + * and the maximum number of useful surfaces, beyond which surfaces are not + * used. It is recommended that in all cases other than plain bob/weave, at + * least 2 past and 1 future frame be provided. + * + * Note that it is entirely possible, in general, for any of the + * \ref VdpVideoMixer "VdpVideoMixer" post-processing steps other than + * de-interlacing to require access to multiple input fields/frames. For + * example, an motion-sensitive noise-reduction algorithm. + * + * For example, when processing field t4, the \ref VdpVideoMixerRender + * parameters may contain the following values, if the application chose to + * provide 3 fields of context for both the past and future: + * + *
+ * current_picture_structure: VDP_VIDEO_MIXER_PICTURE_STRUCTURE_TOP_FIELD
+ * past:    [b3, t3, b2]
+ * current: t4
+ * future:  [b4, t5, b5]
+ * 
+ * + * Note that for both the past/future lists, array index 0 represents the + * field temporally closest to current, in display order. + * + * The \ref VdpVideoMixerRender parameter \b current_picture_structure applies + * to \b video_surface_current. The picture structure for the other surfaces + * will be automatically derived from that for the current picture. The + * derivation algorithm is extremely simple; the concatenated list + * past/current/future is simply assumed to have an alternating top/bottom + * pattern throughout. + * + * Continuing the example above, subsequent calls to \ref VdpVideoMixerRender + * would provide the following sets of parameters: + * + *
+ * current_picture_structure: VDP_VIDEO_MIXER_PICTURE_STRUCTURE_BOTTOM_FIELD
+ * past:    [t4, b3, t3]
+ * current: b4
+ * future:  [t5, b5, t6]
+ * 
+ * + * then: + * + *
+ * current_picture_structure: VDP_VIDEO_MIXER_PICTURE_STRUCTURE_TOP_FIELD
+ * past:    [b4, t4, b3]
+ * current: t5
+ * future:  [b5, t6, b7]
+ * 
+ * + * In other words, the concatenated list of past/current/future frames simply + * forms a window that slides through the sequence of decoded fields. + * + * It is syntactically legal for an application to choose not to provide a + * particular entry in the past or future lists. In this case, the "slot" in + * the surface list must be filled with the special value + * \ref VDP_INVALID_HANDLE, to explicitly indicate that the picture is + * missing; do not simply shuffle other surfaces together to fill in the gap. + * Note that entries should only be omitted under special circumstances, such + * as failed decode due to bitstream error during picture header parsing, + * since missing entries will typically cause advanced de-interlacing + * algorithms to experience significantly degraded operation. + * + * Specific examples for different de-interlacing types are presented below. + * + * \subsection deint_weave Weave De-interlacing + * + * Weave de-interlacing is the act of interleaving the lines of two temporally + * adjacent fields to form a frame for display. + * + * To disable de-interlacing for progressive streams, simply specify + * \b current_picture_structure as \ref VDP_VIDEO_MIXER_PICTURE_STRUCTURE_FRAME; + * no de-interlacing will be applied. + * + * Weave de-interlacing for interlaced streams is identical to disabling + * de-interlacing, as describe immediately above, because each + * \ref VdpVideoSurface already contains an entire frame's worth (i.e. two + * fields) of picture data. + * + * Inverse telecine is disabled when using weave de-interlacing. + * + * Weave de-interlacing produces one output frame for each input frame. The + * application should make one \ref VdpVideoMixerRender call per pair of + * decoded fields, or per decoded frame. + * + * Weave de-interlacing requires no entries in the past/future lists. + * + * All implementations must support weave de-interlacing. + * + * \subsection deint_bob Bob De-interlacing + * + * Bob de-interlacing is the act of vertically scaling a single field to the + * size of a single frame. + * + * To achieve bob de-interlacing, simply provide a single field as + * \b video_surface_current, and set \b current_picture_structure + * appropriately, to indicate whether a top or bottom field was provided. + * + * Inverse telecine is disabled when using bob de-interlacing. + * + * Bob de-interlacing produces one output frame for each input field. The + * application should make one \ref VdpVideoMixerRender call per decoded + * field. + * + * Bob de-interlacing requires no entries in the past/future lists. + * + * Bob de-interlacing is the default when no advanced method is requested and + * enabled. Advanced de-interlacing algorithms may fall back to bob e.g. when + * required past/future fields are missing. + * + * All implementations must support bob de-interlacing. + * + * \subsection deint_adv Advanced De-interlacing + * + * Operation of both temporal and temporal-spatial de-interlacing is + * identical; the only difference is the internal processing the algorithm + * performs in generating the output frame. + * + * These algorithms use various advanced processing on the pixels of both the + * current and various past/future fields in order to determine how best to + * de-interlacing individual portions of the image. + * + * Inverse telecine may be enabled when using advanced de-interlacing. + * + * Advanced de-interlacing produces one output frame for each input field. The + * application should make one \ref VdpVideoMixerRender call per decoded + * field. + * + * Advanced de-interlacing requires entries in the past/future lists. + * + * Availability of advanced de-interlacing algorithms is implementation + * dependent. + * + * \subsection deint_rate De-interlacing Rate + * + * For all de-interlacing algorithms except weave, a choice may be made to + * call \ref VdpVideoMixerRender for either each decoded field, or every + * second decoded field. + * + * If \ref VdpVideoMixerRender is called for every decoded field, the + * generated post-processed frame rate is equal to the decoded field rate. + * Put another way, the generated post-processed nominal field rate is equal + * to 2x the decoded field rate. This is standard practice. + * + * If \ref VdpVideoMixerRender is called for every second decoded field (say + * every top field), the generated post-processed frame rate is half to the + * decoded field rate. This mode of operation is thus referred to as + * "half-rate". + * + * Implementations may choose whether to support half-rate de-interlacing mode + * or not. Regular de-interlacing mode should be supported to any supported + * advanced de-interlacing algorithm. + * + * The descriptions of de-interlacing algorithms above assume that regular + * (not half-rate) operation is being performed, when detailing the number of + "half-rate" de-interlacing is used.deoMixerRender calls. + * + * Recall that the concatenation of past/current/future surface lists simply + * forms a window into the stream of decoded fields. To achieve standard + * de-interlacing, the window is slid through the list of decoded fields one + * field at a time, and a call is made to \ref VdpVideoMixerRender for each + * movement of the window. To achieve half-rate de-interlacing, the window is + * slid through the* list of decoded fields two fields at a time, and a + * call is made to \ref VdpVideoMixerRender for each movement of the window. + * + * \subsection invtc Inverse Telecine + * + * Assuming the implementation supports it, inverse telecine may be enabled + * alongside any advanced de-interlacing algorithm. Inverse telecine is never + * active for bob or weave. + * + * Operation of \ref VdpVideoMixerRender with inverse telecine active is + * identical to the basic operation mechanisms describe above in every way; + * all inverse telecine processing is performed internally to the + * \ref VdpVideoMixer "VdpVideoMixer". + * + * In particular, there is no provision way for \ref VdpVideoMixerRender to + * indicate when identical input fields have been observed, and consequently + * identical output frames may have been produced. + * + * De-interlacing (and inverse telecine) may be applied to streams that are + * marked as being progressive. This will allow detection of, and correct + * de-interlacing of, mixed interlace/progressive streams, bad edits, etc. + * To implement de-interlacing/inverse-telecine on progressive material, + * simply treat the stream of decoded frames as a stream of decoded fields, + * apply any telecine flags (see the next section), and then apply + * de-interlacing to those fields as described above. + * + * Implementations are free to determine whether inverse telecine operates + * in conjunction with half-rate de-interlacing or not. It should always + * operate with regular de-interlacing, when advertized. + * + * \subsection tcflags Telecine (Pull-Down) Flags + * + * Some media delivery formats, e.g. DVD-Video, include flags that are + * intended to modify the decoded field sequence before display. This allows + * e.g. 24p content to be encoded at 48i, which saves space relative to a 60i + * encoded stream, but still displayed at 60i, to match target consumer + * display equipment. + * + * If the inverse telecine option is not activated in the + * \ref VdpVideoMixer "VdpVideoMixer", these flags should be ignored, and the + * decoded fields passed directly to \ref VdpVideoMixerRender as detailed + * above. + * + * However, to make full use of the inverse telecine feature, these flags + * should be applied to the field stream, yielding another field stream with + * some repeated fields, before passing the field stream to + * \ref VdpVideoMixerRender. In this scenario, the sliding window mentioned + * in the descriptions above applies to the field stream after application of + * flags. + * + * \section extending Extending the API + * + * \subsection extend_enums Enumerations and Other Constants + * + * VDPAU defines a number of enumeration types. + * + * When modifying VDPAU, existing enumeration constants must + * continue to exist (although they may be deprecated), and do + * so in the existing order. + * + * The above discussion naturally applies to "manually" defined + * enumerations, using pre-processor macros, too. + * + * \subsection extend_structs Structures + * + * In most case, VDPAU includes no provision for modifying existing + * structure definitions, although they may be deprecated. + * + * New structures may be created, together with new API entry + * points or feature/attribute/parameter values, to expose new + * functionality. + * + * A few structures are considered plausible candidates for future extension. + * Such structures include a version number as the first field, indicating the + * exact layout of the client-provided data. Such structures may only be + * modified by adding new fields to the end of the structure, so that the + * original structure definition is completely compatible with a leading + * subset of fields of the extended structure. + * + * \subsection extend_functions Functions + * + * Existing functions may not be modified, although they may be + * deprecated. + * + * New functions may be added at will. Note the enumeration + * requirements when modifying the enumeration that defines the + * list of entry points. + * + * \section preemption_note Display Preemption + * + * Please note that the display may be preempted away from + * VDPAU at any time. See \ref display_preemption for more + * details. + * + * \subsection trademarks Trademarks + * + * VDPAU is a trademark of NVIDIA Corporation. You may freely use the + * VDPAU trademark, as long as trademark ownership is attributed to + * NVIDIA Corporation. + */ + +/** + * \file vdpau.h + * \brief The Core API + * + * This file contains the \ref api_core "Core API". + */ + +#ifndef _VDPAU_H +#define _VDPAU_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \defgroup api_core Core API + * + * The core API encompasses all VDPAU functionality that operates + * in the same fashion across all Window Systems. + * + * @{ + */ + +/** + * \defgroup base_types Basic Types + * + * VDPAU primarily uses ISO C99 types from \c stdint.h. + * + * @{ + */ + +/** \brief A true \ref VdpBool value */ +#define VDP_TRUE 1 +/** \brief A false \ref VdpBool value */ +#define VDP_FALSE 0 +/** + * \brief A boolean value, holding \ref VDP_TRUE or \ref + * VDP_FALSE. + */ +typedef int VdpBool; + +/*@}*/ + +/** + * \defgroup misc_types Miscellaneous Types + * + * @{ + */ + +/** + * \brief An invalid object handle value. + * + * This value may be used to represent an invalid, or + * non-existent, object (\ref VdpDevice "VdpDevice", + * \ref VdpVideoSurface "VdpVideoSurface", etc.) + * + * Note that most APIs require valid object handles in all + * cases, and will fail when presented with this value. + */ +#define VDP_INVALID_HANDLE 0xffffffffU + +/** + * \brief The set of all chroma formats for \ref VdpVideoSurface + * "VdpVideoSurface"s. + */ +typedef uint32_t VdpChromaType; + +/** \hideinitializer \brief 4:2:0 chroma format. */ +#define VDP_CHROMA_TYPE_420 (VdpChromaType)0 +/** \hideinitializer \brief 4:2:2 chroma format. */ +#define VDP_CHROMA_TYPE_422 (VdpChromaType)1 +/** \hideinitializer \brief 4:4:4 chroma format. */ +#define VDP_CHROMA_TYPE_444 (VdpChromaType)2 + +/** + * \brief The set of all known YCbCr surface formats. + */ +typedef uint32_t VdpYCbCrFormat; + +/** + * \hideinitializer + * \brief The "NV12" YCbCr surface format. + * + * This format has a two planes, a Y plane and a UV plane. + * + * The Y plane is an array of byte-sized Y components. + * Applications should access this data via a uint8_t pointer. + * + * The UV plane is an array of interleaved byte-sized U and V + * components, in the order U, V, U, V. Applications should + * access this data via a uint8_t pointer. + */ +#define VDP_YCBCR_FORMAT_NV12 (VdpYCbCrFormat)0 +/** + * \hideinitializer + * \brief The "YV12" YCbCr surface format. + * + * This format has a three planes, a Y plane, a U plane, and a V + * plane. + * + * Each of the planes is an array of byte-sized components. + * + * Applications should access this data via a uint8_t pointer. + */ +#define VDP_YCBCR_FORMAT_YV12 (VdpYCbCrFormat)1 +/** + * \hideinitializer + * \brief The "UYVY" YCbCr surface format. + * + * This format may also be known as Y422, UYNV, HDYC. + * + * This format has a single plane. + * + * This plane is an array of interleaved byte-sized Y, U, and V + * components, in the order U, Y, V, Y, U, Y, V, Y. + * + * Applications should access this data via a uint8_t pointer. + */ +#define VDP_YCBCR_FORMAT_UYVY (VdpYCbCrFormat)2 +/** + * \hideinitializer + * \brief The "YUYV" YCbCr surface format. + * + * This format may also be known as YUY2, YUNV, V422. + * + * This format has a single plane. + * + * This plane is an array of interleaved byte-sized Y, U, and V + * components, in the order Y, U, Y, V, Y, U, Y, V. + * + * Applications should access this data via a uint8_t pointer. + */ +#define VDP_YCBCR_FORMAT_YUYV (VdpYCbCrFormat)3 +/** + * \hideinitializer + * \brief A packed YCbCr format. + * + * This format has a single plane. + * + * This plane is an array packed 32-bit pixel data. Within each + * 32-bit pixel, bits [31:24] contain A, bits [23:16] contain V, + * bits [15:8] contain U, and bits [7:0] contain Y. + * + * Applications should access this data via a uint32_t pointer. + */ +#define VDP_YCBCR_FORMAT_Y8U8V8A8 (VdpYCbCrFormat)4 +/** + * \hideinitializer + * \brief A packed YCbCr format. + * + * This format has a single plane. + * + * This plane is an array packed 32-bit pixel data. Within each + * 32-bit pixel, bits [31:24] contain A, bits [23:16] contain Y, + * bits [15:8] contain U, and bits [7:0] contain V. + * + * Applications should access this data via a uint32_t pointer. + */ +#define VDP_YCBCR_FORMAT_V8U8Y8A8 (VdpYCbCrFormat)5 + +/** + * \brief The set of all known RGB surface formats. + */ +typedef uint32_t VdpRGBAFormat; + +/** + * \hideinitializer + * \brief A packed RGB format. + * + * This format has a single plane. + * + * This plane is an array packed 32-bit pixel data. Within each + * 32-bit pixel, bits [31:24] contain A, bits [23:16] contain R, + * bits [15:8] contain G, and bits [7:0] contain B. + * + * Applications should access this data via a uint32_t pointer. + */ +#define VDP_RGBA_FORMAT_B8G8R8A8 (VdpRGBAFormat)0 +/** + * \hideinitializer + * \brief A packed RGB format. + * + * This format has a single plane. + * + * This plane is an array packed 32-bit pixel data. Within each + * 32-bit pixel, bits [31:24] contain A, bits [23:16] contain B, + * bits [15:8] contain G, and bits [7:0] contain R. + * + * Applications should access this data via a uint32_t pointer. + */ +#define VDP_RGBA_FORMAT_R8G8B8A8 (VdpRGBAFormat)1 +/** + * \hideinitializer + * \brief A packed RGB format. + * + * This format has a single plane. + * + * This plane is an array packed 32-bit pixel data. Within each + * 32-bit pixel, bits [31:30] contain A, bits [29:20] contain B, + * bits [19:10] contain G, and bits [9:0] contain R. + * + * Applications should access this data via a uint32_t pointer. + */ +#define VDP_RGBA_FORMAT_R10G10B10A2 (VdpRGBAFormat)2 +/** + * \hideinitializer + * \brief A packed RGB format. + * + * This format has a single plane. + * + * This plane is an array packed 32-bit pixel data. Within each + * 32-bit pixel, bits [31:30] contain A, bits [29:20] contain R, + * bits [19:10] contain G, and bits [9:0] contain B. + * + * Applications should access this data via a uint32_t pointer. + */ +#define VDP_RGBA_FORMAT_B10G10R10A2 (VdpRGBAFormat)3 +/** + * \hideinitializer + * \brief An alpha-only surface format. + * + * This format has a single plane. + * + * This plane is an array of byte-sized components. + * + * Applications should access this data via a uint8_t pointer. + */ +#define VDP_RGBA_FORMAT_A8 (VdpRGBAFormat)4 + +/** + * \brief The set of all known indexed surface formats. + */ +typedef uint32_t VdpIndexedFormat; + +/** + * \hideinitializer + * \brief A 4-bit indexed format, with alpha. + * + * This format has a single plane. + * + * This plane is an array of byte-sized components. Within each + * byte, bits [7:4] contain I (index), and bits [3:0] contain A. + * + * Applications should access this data via a uint8_t pointer. + */ +#define VDP_INDEXED_FORMAT_A4I4 (VdpIndexedFormat)0 +/** + * \hideinitializer + * \brief A 4-bit indexed format, with alpha. + * + * This format has a single plane. + * + * This plane is an array of byte-sized components. Within each + * byte, bits [7:4] contain A, and bits [3:0] contain I (index). + * + * Applications should access this data via a uint8_t pointer. + */ +#define VDP_INDEXED_FORMAT_I4A4 (VdpIndexedFormat)1 +/** + * \hideinitializer + * \brief A 8-bit indexed format, with alpha. + * + * This format has a single plane. + * + * This plane is an array of interleaved byte-sized A and I + * (index) components, in the order A, I, A, I. + * + * Applications should access this data via a uint8_t pointer. + */ +#define VDP_INDEXED_FORMAT_A8I8 (VdpIndexedFormat)2 +/** + * \hideinitializer + * \brief A 8-bit indexed format, with alpha. + * + * This format has a single plane. + * + * This plane is an array of interleaved byte-sized A and I + * (index) components, in the order I, A, I, A. + * + * Applications should access this data via a uint8_t pointer. + */ +#define VDP_INDEXED_FORMAT_I8A8 (VdpIndexedFormat)3 + +/** + * \brief A location within a surface. + * + * The VDPAU co-ordinate system has its origin at the top-left + * of a surface, with x and y components increasing right and + * down. + */ +typedef struct { + /** X co-ordinate. */ + uint32_t x; + /** Y co-ordinate. */ + uint32_t y; +} VdpPoint; + +/** + * \brief A rectangular region of a surface. + * + * The co-ordinates are top-left inclusive, bottom-right + * exclusive. + * + * The VDPAU co-ordinate system has its origin at the top-left + * of a surface, with x and y components increasing right and + * down. + */ +typedef struct { + /** Left X co-ordinate. Inclusive. */ + uint32_t x0; + /** Top Y co-ordinate. Inclusive. */ + uint32_t y0; + /** Right X co-ordinate. Exclusive. */ + uint32_t x1; + /** Bottom Y co-ordinate. Exclusive. */ + uint32_t y1; +} VdpRect; + +/** + * A constant RGBA color. + * + * Note that the components are stored as float values in the + * range 0.0...1.0 rather than format-specific integer values. + * This allows VdpColor values to be independent from the exact + * surface format(s) in use. + */ +typedef struct { + float red; + float green; + float blue; + float alpha; +} VdpColor; + +/*@}*/ + +/** + * \defgroup error_handling Error Handling + * + * @{ + */ + +/** + * \hideinitializer + * \brief The set of all possible error codes. + */ +typedef enum { + /** The operation completed successfully; no error. */ + VDP_STATUS_OK = 0, + /** + * No backend implementation could be loaded. + */ + VDP_STATUS_NO_IMPLEMENTATION, + /** + * The display was preempted, or a fatal error occurred. + * + * The application must re-initialize VDPAU. + */ + VDP_STATUS_DISPLAY_PREEMPTED, + /** + * An invalid handle value was provided. + * + * Either the handle does not exist at all, or refers to an object of an + * incorrect type. + */ + VDP_STATUS_INVALID_HANDLE, + /** + * An invalid pointer was provided. + * + * Typically, this means that a NULL pointer was provided for an "output" + * parameter. + */ + VDP_STATUS_INVALID_POINTER, + /** + * An invalid/unsupported \ref VdpChromaType value was supplied. + */ + VDP_STATUS_INVALID_CHROMA_TYPE, + /** + * An invalid/unsupported \ref VdpYCbCrFormat value was supplied. + */ + VDP_STATUS_INVALID_Y_CB_CR_FORMAT, + /** + * An invalid/unsupported \ref VdpRGBAFormat value was supplied. + */ + VDP_STATUS_INVALID_RGBA_FORMAT, + /** + * An invalid/unsupported \ref VdpIndexedFormat value was supplied. + */ + VDP_STATUS_INVALID_INDEXED_FORMAT, + /** + * An invalid/unsupported \ref VdpColorStandard value was supplied. + */ + VDP_STATUS_INVALID_COLOR_STANDARD, + /** + * An invalid/unsupported \ref VdpColorTableFormat value was supplied. + */ + VDP_STATUS_INVALID_COLOR_TABLE_FORMAT, + /** + * An invalid/unsupported \ref VdpOutputSurfaceRenderBlendFactor value was + * supplied. + */ + VDP_STATUS_INVALID_BLEND_FACTOR, + /** + * An invalid/unsupported \ref VdpOutputSurfaceRenderBlendEquation value + * was supplied. + */ + VDP_STATUS_INVALID_BLEND_EQUATION, + /** + * An invalid/unsupported flag value/combination was supplied. + */ + VDP_STATUS_INVALID_FLAG, + /** + * An invalid/unsupported \ref VdpDecoderProfile value was supplied. + */ + VDP_STATUS_INVALID_DECODER_PROFILE, + /** + * An invalid/unsupported \ref VdpVideoMixerFeature value was supplied. + */ + VDP_STATUS_INVALID_VIDEO_MIXER_FEATURE, + /** + * An invalid/unsupported \ref VdpVideoMixerParameter value was supplied. + */ + VDP_STATUS_INVALID_VIDEO_MIXER_PARAMETER, + /** + * An invalid/unsupported \ref VdpVideoMixerAttribute value was supplied. + */ + VDP_STATUS_INVALID_VIDEO_MIXER_ATTRIBUTE, + /** + * An invalid/unsupported \ref VdpVideoMixerPictureStructure value was + * supplied. + */ + VDP_STATUS_INVALID_VIDEO_MIXER_PICTURE_STRUCTURE, + /** + * An invalid/unsupported \ref VdpFuncId value was supplied. + */ + VDP_STATUS_INVALID_FUNC_ID, + /** + * The size of a supplied object does not match the object it is being + * used with. + * + * For example, a \ref VdpVideoMixer "VdpVideoMixer" is configured to + * process \ref VdpVideoSurface "VdpVideoSurface" objects of a specific + * size. If presented with a \ref VdpVideoSurface "VdpVideoSurface" of a + * different size, this error will be raised. + */ + VDP_STATUS_INVALID_SIZE, + /** + * An invalid/unsupported value was supplied. + * + * This is a catch-all error code for values of type other than those + * with a specific error code. + */ + VDP_STATUS_INVALID_VALUE, + /** + * An invalid/unsupported structure version was specified in a versioned + * structure. This implies that the implementation is older than the + * header file the application was built against. + */ + VDP_STATUS_INVALID_STRUCT_VERSION, + /** + * The system does not have enough resources to complete the requested + * operation at this time. + */ + VDP_STATUS_RESOURCES, + /** + * The set of handles supplied are not all related to the same VdpDevice. + * + * When performing operations that operate on multiple surfaces, such as + * \ref VdpOutputSurfaceRenderOutputSurface or \ref VdpVideoMixerRender, + * all supplied surfaces must have been created within the context of the + * same \ref VdpDevice "VdpDevice" object. This error is raised if they were + * not. + */ + VDP_STATUS_HANDLE_DEVICE_MISMATCH, + /** + * A catch-all error, used when no other error code applies. + */ + VDP_STATUS_ERROR, +} VdpStatus; + +/** + * \brief Retrieve a string describing an error code. + * \param[in] status The error code. + * \return A pointer to the string. Note that this is a + * statically allocated read-only string. As such, the + * application must not free the returned pointer. The + * pointer is valid as long as the VDPAU implementation is + * present within the application's address space. + */ +typedef char const * VdpGetErrorString( + VdpStatus status +); + +/*@}*/ + +/** + * \defgroup versioning Versioning + * + * + * @{ + */ + +/** + * \brief The VDPAU version described by this header file. + * + * Note that VDPAU version numbers are simple integers that + * increase monotonically (typically by value 1) with each VDPAU + * header revision. + */ +#define VDPAU_VERSION 0 + +/** + * \brief Retrieve the VDPAU version implemented by the backend. + * \param[out] api_version The API version. + * \return VdpStatus The completion status of the operation. + */ +typedef VdpStatus VdpGetApiVersion( + /* output parameters follow */ + uint32_t * api_version +); + +/** + * \brief Retrieve an implementation-specific string description + * of the implementation. This typically includes detailed version + * information. + * \param[out] information_string A pointer to the information + * string. Note that this is a statically allocated + * read-only string. As such, the application must not + * free the returned pointer. The pointer is valid as long + * as the implementation is present within the + * application's address space. + * \return VdpStatus The completion status of the operation. + * + * Note that the returned string is useful for information + * reporting. It is not intended that the application should + * parse this string in order to determine any information about + * the implementation. + */ +typedef VdpStatus VdpGetInformationString( + /* output parameters follow */ + char const * * information_string +); + +/*@}*/ + +/** + * \defgroup VdpDevice VdpDevice; Primary API object + * + * The VdpDevice is the root of the VDPAU object system. Using a + * VdpDevice object, all other object types may be created. See + * the sections describing those other object types for details + * on object creation. + * + * Note that VdpDevice objects are created using the \ref + * api_winsys. + * + * @{ + */ + +/** + * \brief An opaque handle representing a VdpDevice object. + */ +typedef uint32_t VdpDevice; + +/** + * \brief Destroy a VdpDevice. + * \param[in] device The device to destroy. + * \return VdpStatus The completion status of the operation. + */ +typedef VdpStatus VdpDeviceDestroy( + VdpDevice device +); + +/*@}*/ + +/** + * \defgroup VdpCSCMatrix VdpCSCMatrix; CSC Matrix Manipulation + * + * When converting from YCbCr to RGB data formats, a color space + * conversion operation must be performed. This operation is + * parameterized using a "color space conversion matrix". The + * VdpCSCMatrix is a data structure representing this + * information. + * + * @{ + */ + +/** + * \brief Storage for a color space conversion matrix. + * + * Note that the application may choose to construct the matrix + * content by either: + * - Directly filling in the fields of the CSC matrix + * - Using the \ref VdpGenerateCSCMatrix helper function. + * + * The color space conversion equation is as follows: + * + * \f[ + * \left( \begin{array}{c} R \\ G \\ B \end{array} \right) + * = + * \left( \begin{array}{cccc} + * m_{0,0} & m_{0,1} & m_{0,2} & m_{0,3} \\ + * m_{1,0} & m_{1,1} & m_{1,2} & m_{1,3} \\ + * m_{2,0} & m_{2,1} & m_{2,2} & m_{2,3} + * \end{array} + * \right) + * * + * \left( \begin{array}{c} Y \\ Cb \\ Cr \\ 1.0 \end{array} + * \right) + * \f] + */ +typedef float VdpCSCMatrix[3][4]; + +#define VDP_PROCAMP_VERSION 0 + +/** + * \brief Procamp operation parameterization data. + * + * When performing a color space conversion operation, various + * adjustments can be performed at the same time, such as + * brightness and contrast. This structure defines the level of + * adjustments to make. + */ +typedef struct { + /** + * This field must be filled with VDP_PROCAMP_VERSION + */ + uint32_t struct_version; + /** + * Brightness adjustment amount. A value clamped between + * -1.0 and 1.0. 0.0 represents no modification. + */ + float brightness; + /** + * Contrast adjustment amount. A value clamped between + * 0.0 and 10.0. 1.0 represents no modification. + */ + float contrast; + /** + * Saturation adjustment amount. A value clamped between 0.0 and + * 10.0. 1.0 represents no modification. + */ + float saturation; + /** + * Hue adjustment amount. A value clamped between + * -PI and PI. 0.0 represents no modification. + */ + float hue; +} VdpProcamp; + +/** + * \brief YCbCr color space specification. + * + * A number of YCbCr color spaces exist. This enumeration + * defines the specifications known to VDPAU. + */ +typedef uint32_t VdpColorStandard; + +/** \hideinitializer \brief ITU-R BT.601 */ +#define VDP_COLOR_STANDARD_ITUR_BT_601 (VdpColorStandard)0 +/** \hideinitializer \brief ITU-R BT.709 */ +#define VDP_COLOR_STANDARD_ITUR_BT_709 (VdpColorStandard)1 +/** \hideinitializer \brief SMPTE-240M */ +#define VDP_COLOR_STANDARD_SMPTE_240M (VdpColorStandard)2 + +/** + * \brief Generate a color space conversion matrix + * \param[in] procamp The procamp adjustments to make. If NULL, + * no adjustments will be made. + * \param[in] standard The YCbCr color space to convert from. + * \param[out] csc_matrix The CSC matrix to initialize. + * \return VdpStatus The completion status of the operation. + */ +typedef VdpStatus VdpGenerateCSCMatrix( + VdpProcamp * procamp, + VdpColorStandard standard, + /* output parameters follow */ + VdpCSCMatrix * csc_matrix +); + +/*@}*/ + +/** + * \defgroup VdpVideoSurface VdpVideoSurface; Video Surface object + * + * A VdpVideoSurface stores YCbCr data in an internal format, + * with a variety of possible chroma sub-sampling options. + * + * A VdpVideoSurface may be filled with: + * - Data provided by the CPU via \ref + * VdpVideoSurfacePutBitsYCbCr (i.e. software decode.) + * - The result of applying a \ref VdpDecoder "VdpDecoder" to + * compressed video data. + * + * VdpVideoSurface content may be accessed by: + * - The application via \ref VdpVideoSurfaceGetBitsYCbCr + * - The Hardware that implements \ref VdpOutputSurface + * "VdpOutputSurface" \ref VdpOutputSurfaceRender + * "rendering functionality". + * - The Hardware the implements \ref VdpVideoMixer + * "VdpVideoMixer" functionality. + * + * VdpVideoSurfaces are not directly displayable. They must be + * converted into a displayable format using \ref VdpVideoMixer + * "VdpVideoMixer" objects. + * + * See \ref video_mixer_usage for additional information. + * + * @{ + */ + +/** + * \brief Query the implementation's VdpVideoSurface + * capabilities. + * \param[in] device The device to query. + * \param[in] surface_chroma_type The type of chroma type for + * which information is requested. + * \param[out] is_supported Is this chroma type supported? + * \param[out] max_width The maximum supported surface width for + * this chroma type. + * \param[out] max_height The maximum supported surface height + * for this chroma type. + * \return VdpStatus The completion status of the operation. + */ +typedef VdpStatus VdpVideoSurfaceQueryCapabilities( + VdpDevice device, + VdpChromaType surface_chroma_type, + /* output parameters follow */ + VdpBool * is_supported, + uint32_t * max_width, + uint32_t * max_height +); + +/** + * \brief Query the implementation's VdpVideoSurface + * GetBits/PutBits capabilities. + * \param[in] device The device to query. + * \param[in] surface_chroma_type The type of chroma type for + * which information is requested. + * \param[in] bits_ycbcr_format The format of application "bits" + * buffer for which information is requested. + * \param[out] is_supported Is this chroma type supported? + * \return VdpStatus The completion status of the operation. + */ +typedef VdpStatus VdpVideoSurfaceQueryGetPutBitsYCbCrCapabilities( + VdpDevice device, + VdpChromaType surface_chroma_type, + VdpYCbCrFormat bits_ycbcr_format, + /* output parameters follow */ + VdpBool * is_supported +); + +/** + * \brief An opaque handle representing a VdpVideoSurface + * object. + */ +typedef uint32_t VdpVideoSurface; + +/** + * \brief Create a VdpVideoSurface. + * \param[in] device The device that will contain the surface. + * \param[in] chroma_type The chroma type of the new surface. + * \param[in] width The width of the new surface. + * \param[in] height The height of the new surface. + * \param[out] surface The new surface's handle. + * \return VdpStatus The completion status of the operation. + * + * The memory backing the surface may not be initialized during + * creation. Applications are expected to initialize any region + * that they use, via \ref VdpDecoderRender or \ref + * VdpVideoSurfacePutBitsYCbCr. + */ +typedef VdpStatus VdpVideoSurfaceCreate( + VdpDevice device, + VdpChromaType chroma_type, + uint32_t width, + uint32_t height, + /* output parameters follow */ + VdpVideoSurface * surface +); + +/** + * \brief Destroy a VdpVideoSurface. + * \param[in] surface The surface's handle. + * \return VdpStatus The completion status of the operation. + */ +typedef VdpStatus VdpVideoSurfaceDestroy( + VdpVideoSurface surface +); + +/** + * \brief Retrieve the parameters used to create a + * VdpVideoSurface. + * \param[in] surface The surface's handle. + * \param[out] chroma_type The chroma type of the surface. + * \param[out] width The width of the surface. + * \param[out] height The height of the surface. + * \return VdpStatus The completion status of the operation. + */ +typedef VdpStatus VdpVideoSurfaceGetParameters( + VdpVideoSurface surface, + /* output parameters follow */ + VdpChromaType * chroma_type, + uint32_t * width, + uint32_t * height +); + +/** + * \brief Copy image data from a VdpVideoSurface to application + * memory in a specified YCbCr format. + * \param[in] surface The surface's handle. + * \param[in] destination_ycbcr_format The format of the + * application's data buffers. + * \param[in] destination_data Pointers to the application data + * buffers into which the image data will be written. Note + * that this is an array of pointers, one per plane. The + * destination_format parameter will define how many + * planes are required. + * \param[in] destination_pitches Pointers to the pitch values + * for the application data buffers. Note that this is an + * array of pointers, one per plane. The + * destination_format parameter will define how many + * planes are required. + * \return VdpStatus The completion status of the operation. + */ +typedef VdpStatus VdpVideoSurfaceGetBitsYCbCr( + VdpVideoSurface surface, + VdpYCbCrFormat destination_ycbcr_format, + void * const * destination_data, + uint32_t const * destination_pitches +); + +/** + * \brief Copy image data from application memory in a specific + * YCbCr format to a VdpVideoSurface. + * \param[in] surface The surface's handle. + * \param[in] source_ycbcr_format The format of the + * application's data buffers. + * \param[in] source_data Pointers to the application data + * buffers from which the image data will be copied. Note + * that this is an array of pointers, one per plane. The + * source_format parameter will define how many + * planes are required. + * \param[in] source_pitches Pointers to the pitch values + * for the application data buffers. Note that this is an + * array of pointers, one per plane. The + * source_format parameter will define how many + * planes are required. + * \return VdpStatus The completion status of the operation. + */ +typedef VdpStatus VdpVideoSurfacePutBitsYCbCr( + VdpVideoSurface surface, + VdpYCbCrFormat source_ycbcr_format, + void const * const * source_data, + uint32_t const * source_pitches +); + +/*@}*/ + +/** + * \defgroup VdpOutputSurface VdpOutputSurface; Output Surface \ + * object + * + * A VdpOutputSurface stores RGBA data in a defined format. + * + * A VdpOutputSurface may be filled with: + * - Data provided by the CPU via the various + * VdpOutputSurfacePutBits functions. + * - Using the VdpOutputSurface \ref VdpOutputSurfaceRender + * "rendering functionality". + * - Using a \ref VdpVideoMixer "VdpVideoMixer" object. + * + * VdpOutputSurface content may be accessed by: + * - The application via the various VdpOutputSurfaceGetBits + * functions. + * - The Hardware that implements VdpOutputSurface + * \ref VdpOutputSurfaceRender "rendering functionality". + * - The Hardware the implements \ref VdpVideoMixer + * "VdpVideoMixer" functionality. + * - The Hardware that implements \ref VdpPresentationQueue + * "VdpPresentationQueue" functionality, + * + * VdpVideoSurfaces are directly displayable using a \ref + * VdpPresentationQueue "VdpPresentationQueue" object. + * + * @{ + */ + +/** + * \brief The set of all known color table formats, for use with + * \ref VdpOutputSurfacePutBitsIndexed. + */ +typedef uint32_t VdpColorTableFormat; + +/** + * \hideinitializer + * \brief 8-bit per component packed into 32-bits + * + * This format is an array of packed 32-bit RGB color values. + * Bits [31:24] are unused, bits [23:16] contain R, bits [15:8] + * contain G, and bits [7:0] contain B. Note: The format is + * physically an array of uint32_t values, and should be accessed + * as such by the application in order to avoid endianness + * issues. + */ +#define VDP_COLOR_TABLE_FORMAT_B8G8R8X8 (VdpColorTableFormat)0 + +/** + * \brief Query the implementation's VdpOutputSurface + * capabilities. + * \param[in] device The device to query. + * \param[in] surface_rgba_format The surface format for + * which information is requested. + * \param[out] is_supported Is this surface format supported? + * \param[out] max_width The maximum supported surface width for + * this chroma type. + * \param[out] max_height The maximum supported surface height + * for this chroma type. + * \return VdpStatus The completion status of the operation. + */ +typedef VdpStatus VdpOutputSurfaceQueryCapabilities( + VdpDevice device, + VdpRGBAFormat surface_rgba_format, + /* output parameters follow */ + VdpBool * is_supported, + uint32_t * max_width, + uint32_t * max_height +); + +/** + * \brief Query the implementation's capability to perform a + * PutBits operation using application data matching the + * surface's format. + * \param[in] device The device to query. + * \param[in] surface_rgba_format The surface format for + * which information is requested. + * \param[out] is_supported Is this surface format supported? + * \return VdpStatus The completion status of the operation. + */ +typedef VdpStatus VdpOutputSurfaceQueryGetPutBitsNativeCapabilities( + VdpDevice device, + VdpRGBAFormat surface_rgba_format, + /* output parameters follow */ + VdpBool * is_supported +); + +/** + * \brief Query the implementation's capability to perform a + * PutBits operation using application data in a specific + * indexed format. + * \param[in] device The device to query. + * \param[in] surface_rgba_format The surface format for + * which information is requested. + * \param[in] bits_indexed_format The format of the application + * data buffer. + * \param[in] color_table_format The format of the color lookup + * table. + * \param[out] is_supported Is this surface format supported? + * \return VdpStatus The completion status of the operation. + */ +typedef VdpStatus VdpOutputSurfaceQueryPutBitsIndexedCapabilities( + VdpDevice device, + VdpRGBAFormat surface_rgba_format, + VdpIndexedFormat bits_indexed_format, + VdpColorTableFormat color_table_format, + /* output parameters follow */ + VdpBool * is_supported +); + +/** + * \brief Query the implementation's capability to perform a + * PutBits operation using application data in a specific + * YCbCr/YUB format. + * \param[in] device The device to query. + * \param[in] surface_rgba_format The surface format for which + * information is requested. + * \param[in] bits_ycbcr_format The format of the application + * data buffer. + * \param[out] is_supported Is this surface format supported? + * \return VdpStatus The completion status of the operation. + */ +typedef VdpStatus VdpOutputSurfaceQueryPutBitsYCbCrCapabilities( + VdpDevice device, + VdpRGBAFormat surface_rgba_format, + VdpYCbCrFormat bits_ycbcr_format, + /* output parameters follow */ + VdpBool * is_supported +); + +/** + * \brief An opaque handle representing a VdpOutputSurface + * object. + */ +typedef uint32_t VdpOutputSurface; + +/** + * \brief Create a VdpOutputSurface. + * \param[in] device The device that will contain the surface. + * \param[in] rgba_format The format of the new surface. + * \param[in] width The width of the new surface. + * \param[in] height The height of the new surface. + * \param[out] surface The new surface's handle. + * \return VdpStatus The completion status of the operation. + * + * The memory backing the surface will be initialized to 0 color + * and 0 alpha (i.e. black.) + */ +typedef VdpStatus VdpOutputSurfaceCreate( + VdpDevice device, + VdpRGBAFormat rgba_format, + uint32_t width, + uint32_t height, + /* output parameters follow */ + VdpOutputSurface * surface +); + +/** + * \brief Destroy a VdpOutputSurface. + * \param[in] surface The surface's handle. + * \return VdpStatus The completion status of the operation. + */ +typedef VdpStatus VdpOutputSurfaceDestroy( + VdpOutputSurface surface +); + +/** + * \brief Retrieve the parameters used to create a + * VdpOutputSurface. + * \param[in] surface The surface's handle. + * \param[out] rgba_format The format of the surface. + * \param[out] width The width of the surface. + * \param[out] height The height of the surface. + * \return VdpStatus The completion status of the operation. + */ +typedef VdpStatus VdpOutputSurfaceGetParameters( + VdpOutputSurface surface, + /* output parameters follow */ + VdpRGBAFormat * rgba_format, + uint32_t * width, + uint32_t * height +); + +/** + * \brief Copy image data from a VdpOutputSurface to application + * memory in the surface's native format. + * \param[in] surface The surface's handle. + * \param[in] source_rect The sub-rectangle of the source + * surface to copy. If NULL, the entire surface will be + * retrieved. + * \param[in] destination_data Pointers to the application data + * buffers into which the image data will be written. Note + * that this is an array of pointers, one per plane. The + * destination_format parameter will define how many + * planes are required. + * \param[in] destination_pitches Pointers to the pitch values + * for the application data buffers. Note that this is an + * array of pointers, one per plane. The + * destination_format parameter will define how many + * planes are required. + * \return VdpStatus The completion status of the operation. + */ +typedef VdpStatus VdpOutputSurfaceGetBitsNative( + VdpOutputSurface surface, + VdpRect const * source_rect, + void * const * destination_data, + uint32_t const * destination_pitches +); + +/** + * \brief Copy image data from application memory in the + * surface's native format to a VdpOutputSurface. + * \param[in] surface The surface's handle. + * \param[in] source_data Pointers to the application data + * buffers from which the image data will be copied. Note + * that this is an array of pointers, one per plane. The + * source_format parameter will define how many + * planes are required. + * \param[in] source_pitches Pointers to the pitch values + * for the application data buffers. Note that this is an + * array of pointers, one per plane. The + * source_format parameter will define how many + * planes are required. + * \param[in] destination_rect The sub-rectangle of the surface + * to fill with application data. If NULL, the entire + * surface will be updated. + * \return VdpStatus The completion status of the operation. + */ +typedef VdpStatus VdpOutputSurfacePutBitsNative( + VdpOutputSurface surface, + void const * const * source_data, + uint32_t const * source_pitches, + VdpRect const * destination_rect +); + +/** + * \brief Copy image data from application memory in a specific + * indexed format to a VdpOutputSurface. + * \param[in] surface The surface's handle. + * \param[in] source_indexed_format The format of the + * application's data buffers. + * \param[in] source_data Pointers to the application data + * buffers from which the image data will be copied. Note + * that this is an array of pointers, one per plane. The + * source_indexed_format parameter will define how many + * planes are required. + * \param[in] source_pitches Pointers to the pitch values + * for the application data buffers. Note that this is an + * array of pointers, one per plane. The + * source_indexed_format parameter will define how many + * planes are required. + * \param[in] destination_rect The sub-rectangle of the surface + * to fill with application data. If NULL, the entire + * surface will be updated. + * \param[in] color_table_format The format of the color_table. + * \param[in] color_table A table that maps between source index + * and target color data. See \ref VdpColorTableFormat for + * details regarding the memory layout. + * \return VdpStatus The completion status of the operation. + */ +typedef VdpStatus VdpOutputSurfacePutBitsIndexed( + VdpOutputSurface surface, + VdpIndexedFormat source_indexed_format, + void const * const * source_data, + uint32_t const * source_pitch, + VdpRect const * destination_rect, + VdpColorTableFormat color_table_format, + void const * color_table +); + +/** + * \brief Copy image data from application memory in a specific + * YCbCr format to a VdpOutputSurface. + * \param[in] surface The surface's handle. + * \param[in] source_ycbcr_format The format of the + * application's data buffers. + * \param[in] source_data Pointers to the application data + * buffers from which the image data will be copied. Note + * that this is an array of pointers, one per plane. The + * source_ycbcr_format parameter will define how many + * planes are required. + * \param[in] source_pitches Pointers to the pitch values + * for the application data buffers. Note that this is an + * array of pointers, one per plane. The + * source_ycbcr_format parameter will define how many + * planes are required. + * \param[in] destination_rect The sub-rectangle of the surface + * to fill with application data. If NULL, the entire + * surface will be updated. + * \param[in] csc_matrix The color space conversion matrix used + * by the copy operation. If NULL, a default matrix will + * be used internally. Th default matrix is equivalent to + * ITU-R BT.601 with no procamp changes. + * \return VdpStatus The completion status of the operation. + */ +typedef VdpStatus VdpOutputSurfacePutBitsYCbCr( + VdpOutputSurface surface, + VdpYCbCrFormat source_ycbcr_format, + void const * const * source_data, + uint32_t const * source_pitches, + VdpRect const * destination_rect, + VdpCSCMatrix const * csc_matrix +); + +/*@}*/ + +/** + * \defgroup VdpBitmapSurface VdpBitmapSurface; Bitmap Surface \ + * object + * + * A VdpBitmapSurface stores RGBA data in a defined format. + * + * A VdpBitmapSurface may be filled with: + * - Data provided by the CPU via the \ref + * VdpBitmapSurfacePutBitsNative function. + * + * VdpBitmapSurface content may be accessed by: + * - The Hardware that implements \ref VdpOutputSurface + * "VdpOutputSurface" \ref VdpOutputSurfaceRender + * "rendering functionality" + * + * VdpBitmapSurface objects are intended to store static read-only data, such + * as font glyphs, and the bitmaps used to compose an applications' + * user-interface. + * + * The primary differences between VdpBitmapSurfaces and + * \ref VdpOutputSurface "VdpOutputSurface"s are: + * + * - You cannot render to a VdpBitmapSurface, just upload native data via + * the PutBits API. + * + * - The read-only nature of a VdpBitmapSurface gives the implementation more + * flexibility in its choice of data storage location for the bitmap data. + * For example, some implementations may choose to store some/all + * VdpBitmapSurface objects in system memory to relieve GPU memory pressure. + * + * - VdpBitmapSurface and VdpOutputSurface may support different subsets of all + * known RGBA formats. + * + * @{ + */ + +/** + * \brief Query the implementation's VdpBitmapSurface + * capabilities. + * \param[in] device The device to query. + * \param[in] surface_rgba_format The surface format for + * which information is requested. + * \param[out] is_supported Is this surface format supported? + * \param[out] max_width The maximum supported surface width for + * this chroma type. + * \param[out] max_height The maximum supported surface height + * for this chroma type. + * \return VdpStatus The completion status of the operation. + */ +typedef VdpStatus VdpBitmapSurfaceQueryCapabilities( + VdpDevice device, + VdpRGBAFormat surface_rgba_format, + /* output parameters follow */ + VdpBool * is_supported, + uint32_t * max_width, + uint32_t * max_height +); + +/** + * \brief An opaque handle representing a VdpBitmapSurface + * object. + */ +typedef uint32_t VdpBitmapSurface; + +/** + * \brief Create a VdpBitmapSurface. + * \param[in] device The device that will contain the surface. + * \param[in] rgba_format The format of the new surface. + * \param[in] width The width of the new surface. + * \param[in] height The height of the new surface. + * \param[in] frequently_accessed Is this bitmap used + * frequently, or infrequently, by compositing options? + * Implementations may use this as a hint to determine how + * to allocate the underlying storage for the surface. + * \param[out] surface The new surface's handle. + * \return VdpStatus The completion status of the operation. + * + * The memory backing the surface may not be initialized + * during creation. Applications are expected initialize any + * region that they use, via \ref VdpBitmapSurfacePutBitsNative. + */ +typedef VdpStatus VdpBitmapSurfaceCreate( + VdpDevice device, + VdpRGBAFormat rgba_format, + uint32_t width, + uint32_t height, + VdpBool frequently_accessed, + /* output parameters follow */ + VdpBitmapSurface * surface +); + +/** + * \brief Destroy a VdpBitmapSurface. + * \param[in] surface The surface's handle. + * \return VdpStatus The completion status of the operation. + */ +typedef VdpStatus VdpBitmapSurfaceDestroy( + VdpBitmapSurface surface +); + +/** + * \brief Retrieve the parameters used to create a + * VdpBitmapSurface. + * \param[in] surface The surface's handle. + * \param[out] rgba_format The format of the surface. + * \param[out] width The width of the surface. + * \param[out] height The height of the surface. + * \param[out] frequently_accessed The frequently_accessed state + * of the surface. + * \return VdpStatus The completion status of the operation. + */ +typedef VdpStatus VdpBitmapSurfaceGetParameters( + VdpBitmapSurface surface, + /* output parameters follow */ + VdpRGBAFormat * rgba_format, + uint32_t * width, + uint32_t * height, + VdpBool * frequently_accessed +); + +/** + * \brief Copy image data from application memory in the + * surface's native format to a VdpBitmapSurface. + * \param[in] surface The surface's handle. + * \param[in] source_data Pointers to the application data + * buffers from which the image data will be copied. Note + * that this is an array of pointers, one per plane. The + * source_format parameter will define how many + * planes are required. + * \param[in] source_pitches Pointers to the pitch values + * for the application data buffers. Note that this is an + * array of pointers, one per plane. The + * source_format parameter will define how many + * planes are required. + * \param[in] destination_rect The sub-rectangle of the surface + * to fill with application data. If NULL, the entire + * surface will be updated. + * \return VdpStatus The completion status of the operation. + */ +typedef VdpStatus VdpBitmapSurfacePutBitsNative( + VdpBitmapSurface surface, + void const * const * source_data, + uint32_t const * source_pitches, + VdpRect const * destination_rect +); + +/*@}*/ + +/** + * \defgroup VdpOutputSurfaceRender VdpOutputSurface Rendering \ + * Functionality + * + * \ref VdpOutputSurface "VdpOutputSurface" objects + * directly provide some rendering/compositing operations. These + * are described below. + * + * @{ + */ + +/** + * \hideinitializer + * \brief The blending equation factors. + */ +typedef enum { + VDP_OUTPUT_SURFACE_RENDER_BLEND_FACTOR_ZERO = 0, + VDP_OUTPUT_SURFACE_RENDER_BLEND_FACTOR_ONE = 1, + VDP_OUTPUT_SURFACE_RENDER_BLEND_FACTOR_SRC_COLOR = 2, + VDP_OUTPUT_SURFACE_RENDER_BLEND_FACTOR_ONE_MINUS_SRC_COLOR = 3, + VDP_OUTPUT_SURFACE_RENDER_BLEND_FACTOR_SRC_ALPHA = 4, + VDP_OUTPUT_SURFACE_RENDER_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA = 5, + VDP_OUTPUT_SURFACE_RENDER_BLEND_FACTOR_DST_ALPHA = 6, + VDP_OUTPUT_SURFACE_RENDER_BLEND_FACTOR_ONE_MINUS_DST_ALPHA = 7, + VDP_OUTPUT_SURFACE_RENDER_BLEND_FACTOR_DST_COLOR = 8, + VDP_OUTPUT_SURFACE_RENDER_BLEND_FACTOR_ONE_MINUS_DST_COLOR = 9, + VDP_OUTPUT_SURFACE_RENDER_BLEND_FACTOR_SRC_ALPHA_SATURATE = 10, + VDP_OUTPUT_SURFACE_RENDER_BLEND_FACTOR_CONSTANT_COLOR = 11, + VDP_OUTPUT_SURFACE_RENDER_BLEND_FACTOR_ONE_MINUS_CONSTANT_COLOR = 12, + VDP_OUTPUT_SURFACE_RENDER_BLEND_FACTOR_CONSTANT_ALPHA = 13, + VDP_OUTPUT_SURFACE_RENDER_BLEND_FACTOR_ONE_MINUS_CONSTANT_ALPHA = 14, +} VdpOutputSurfaceRenderBlendFactor; + +/** + * \hideinitializer + * \brief The blending equations. + */ +typedef enum { + VDP_OUTPUT_SURFACE_RENDER_BLEND_EQUATION_SUBTRACT = 0, + VDP_OUTPUT_SURFACE_RENDER_BLEND_EQUATION_REVERSE_SUBTRACT = 1, + VDP_OUTPUT_SURFACE_RENDER_BLEND_EQUATION_ADD = 2, + VDP_OUTPUT_SURFACE_RENDER_BLEND_EQUATION_MIN = 3, + VDP_OUTPUT_SURFACE_RENDER_BLEND_EQUATION_MAX = 4, +} VdpOutputSurfaceRenderBlendEquation; + +#define VDP_OUTPUT_SURFACE_RENDER_BLEND_STATE_VERSION 0 + +/** + * \brief Complete blending operation definition. + */ +typedef struct { + /** + * This field must be filled with VDP_OUTPUT_SURFACE_RENDER_BLEND_STATE_VERSIION + */ + uint32_t struct_version; + VdpOutputSurfaceRenderBlendFactor blend_factor_source_color; + VdpOutputSurfaceRenderBlendFactor blend_factor_destination_color; + VdpOutputSurfaceRenderBlendFactor blend_factor_source_alpha; + VdpOutputSurfaceRenderBlendFactor blend_factor_destination_alpha; + VdpOutputSurfaceRenderBlendEquation blend_equation_color; + VdpOutputSurfaceRenderBlendEquation blend_equation_alpha; + VdpColor blend_constant; +} VdpOutputSurfaceRenderBlendState; + +/** + * \hideinitializer + * \brief Do not rotate source_surface prior to compositing. + */ +#define VDP_OUTPUT_SURFACE_RENDER_ROTATE_0 0 + +/** + * \hideinitializer + * \brief Rotate source_surface 90 degrees clockwise prior to + * compositing. + */ +#define VDP_OUTPUT_SURFACE_RENDER_ROTATE_90 1 + +/** + * \hideinitializer + * \brief Rotate source_surface 180 degrees prior to + * compositing. + */ +#define VDP_OUTPUT_SURFACE_RENDER_ROTATE_180 2 + +/** + * \hideinitializer + * \brief Rotate source_surface 270 degrees clockwise prior to + * compositing. + */ +#define VDP_OUTPUT_SURFACE_RENDER_ROTATE_270 3 + +/** + * \hideinitializer + * \brief A separate color is used for each vertex of the + * smooth-shaded quad. Hence, colors array contains 4 + * elements rather than 1. See description of colors + * array. + */ +#define VDP_OUTPUT_SURFACE_RENDER_COLOR_PER_VERTEX (1 << 2) + +/** + * \brief Composite a sub-rectangle of a \ref VdpOutputSurface + * "VdpOutputSurface" into a sub-rectangle of another + * \ref VdpOutputSurface VdpOutputSurface. + * \param[in] destination_surface The destination surface of the + * compositing operation. + * \param[in] destination_rect The sub-rectangle of the + * destination surface to update. If NULL, the entire + * destination surface will be updated. + * \param[in] source_surface The source surface for the + * compositing operation. The surface is treated as having + * four components: red, green, blue and alpha. Any + * missing components are treated as 1.0. For example, for + * an A8 VdpOutputSurface, alpha will come from the surface + * but red, green and blue will be treated as 1.0. If + * source_surface is NULL, all components will be treated + * as 1.0. Note that destination_surface and + * source_surface must have been allocated via the same + * \ref VdpDevice "VdpDevice". + * \param[in] source_rect The sub-rectangle of the source + * surface to read from. If NULL, the entire + * source_surface will be read. Left/right ot top/bottom + * co-ordinates may be swapped to flip the source. Any + * flip occurs prior to any requested rotation. Values + * from outside the source surface are valid and samples + * at those locations will be taken from the nearest edge. + * \param[in] colors A pointer to an array of \ref VdpColor + * "VdpColor" objects. If the flag + * VDP_OUTPUT_SURFACE_RENDER_COLOR_PER_VERTEX is set, + * VDPAU will four entries from the array, and treat them + * as the colors corresponding to the upper-left, + * upper-right, lower-right and lower-left corners of the + * post-rotation source (i.e. indices 0, 1, 2 and 3 run + * clockwise from the upper left corner). If the flag + * VDP_OUTPUT_SURFACE_RENDER_COLOR_PER_VERTEX is not + * set, VDPAU will use the single VdpColor for all four + * corners. If colors is NULL then red, green, blue and + * alpha values of 1.0 will be used. + * \param[in] blend_state If a blend state is provided, the + * blend state will be used for the composite operation. If + * NULL, blending is effectively disabled, which is + * equivalent to a blend equation of ADD, source blend + * factors of ONE and destination blend factors of ZERO. The + * blend math is the familiar OpenGL blend math: + * \f[ + * dst.a = equation(blendFactorDstAlpha*dst.a, + * blendFactorSrcAlpha*src.a); + * \f] + * \f[ + * dst.rgb = equation(blendFactorDstColor*dst.rgb, + * blendFactorSrcColor*src.rgb); + * \f] + * \param[in] flags A set of flags influencing how the + * compositing operation works. + * \arg \ref VDP_OUTPUT_SURFACE_RENDER_ROTATE_0 + * \arg \ref VDP_OUTPUT_SURFACE_RENDER_ROTATE_90 + * \arg \ref VDP_OUTPUT_SURFACE_RENDER_ROTATE_180 + * \arg \ref VDP_OUTPUT_SURFACE_RENDER_ROTATE_270 + * \arg \ref VDP_OUTPUT_SURFACE_RENDER_COLOR_PER_VERTEX + * \return VdpStatus The completion status of the operation. + * + * The general compositing pipeline is as follows. + * + * -# Extract source_rect from source_surface. + * + * -# The extracted source is rotated 0, 90, 180 or 270 degrees + * according to the flags. + * + * -# The rotated source is component-wise multiplied by a + * smooth-shaded quad with a (potentially) different color at + * each vertex. + * + * -# The resulting rotated, smooth-shaded quad is scaled to the + * size of destination_rect and composited with + * destination_surface using the provided blend state. + * + */ +typedef VdpStatus VdpOutputSurfaceRenderOutputSurface( + VdpOutputSurface destination_surface, + VdpRect const * destination_rect, + VdpOutputSurface source_surface, + VdpRect const * source_rect, + VdpColor const * colors, + VdpOutputSurfaceRenderBlendState const * blend_state, + uint32_t flags +); + +/** + * \brief Composite a sub-rectangle of a \ref VdpBitmapSurface + * "VdpBitmapSurface" into a sub-rectangle of a + * \ref VdpOutputSurface VdpOutputSurface. + * \param[in] destination_surface The destination surface of the + * compositing operation. + * \param[in] destination_rect The sub-rectangle of the + * destination surface to update. If NULL, the entire + * destination surface will be updated. + * \param[in] source_surface The source surface for the + * compositing operation. The surface is treated as having + * four components: red, green, blue and alpha. Any + * missing components are treated as 1.0. For example, for + * an A8 VdpBitmapSurface, alpha will come from the surface + * but red, green and blue will be treated as 1.0. If + * source_surface is NULL, all components will be treated + * as 1.0. Note that destination_surface and + * source_surface must have been allocated via the same + * \ref VdpDevice "VdpDevice". + * \param[in] source_rect The sub-rectangle of the source + * surface to read from. If NULL, the entire + * source_surface will be read. Left/right ot top/bottom + * co-ordinates may be swapped to flip the source. Any + * flip occurs prior to any requested rotation. Values + * from outside the source surface are valid and samples + * at those locations will be taken from the nearest edge. + * \param[in] colors A pointer to an array of \ref VdpColor + * "VdpColor" objects. If the flag + * VDP_OUTPUT_SURFACE_RENDER_COLOR_PER_VERTEX is set, + * VDPAU will four entries from the array, and treat them + * as the colors corresponding to the upper-left, + * upper-right, lower-right and lower-left corners of the + * post-rotation source (i.e. indices 0, 1, 2 and 3 run + * clockwise from the upper left corner). If the flag + * VDP_OUTPUT_SURFACE_RENDER_COLOR_PER_VERTEX is not + * set, VDPAU will use the single VdpColor for all four + * corners. If colors is NULL then red, green, blue and + * alpha values of 1.0 will be used. + * \param[in] blend_state If a blend state is provided, the + * blend state will be used for the composite operation. If + * NULL, blending is effectively disabled, which is + * equivalent to a blend equation of ADD, source blend + * factors of ONE and destination blend factors of ZERO. The + * blend math is the familiar OpenGL blend math: + * \f[ + * dst.a = equation(blendFactorDstAlpha*dst.a, + * blendFactorSrcAlpha*src.a); + * \f] + * \f[ + * dst.rgb = equation(blendFactorDstColor*dst.rgb, + * blendFactorSrcColor*src.rgb); + * \f] + * \param[in] flags A set of flags influencing how the + * compositing operation works. + * \arg \ref VDP_OUTPUT_SURFACE_RENDER_ROTATE_0 + * \arg \ref VDP_OUTPUT_SURFACE_RENDER_ROTATE_90 + * \arg \ref VDP_OUTPUT_SURFACE_RENDER_ROTATE_180 + * \arg \ref VDP_OUTPUT_SURFACE_RENDER_ROTATE_270 + * \arg \ref VDP_OUTPUT_SURFACE_RENDER_COLOR_PER_VERTEX + * \return VdpStatus The completion status of the operation. + * + * The general compositing pipeline is as follows. + * + * -# Extract source_rect from source_surface. + * + * -# The extracted source is rotated 0, 90, 180 or 270 degrees + * according to the flags. + * + * -# The rotated source is component-wise multiplied by a + * smooth-shaded quad with a (potentially) different color at + * each vertex. + * + * -# The resulting rotated, smooth-shaded quad is scaled to the + * size of destination_rect and composited with + * destination_surface using the provided blend state. + * + */ +typedef VdpStatus VdpOutputSurfaceRenderBitmapSurface( + VdpOutputSurface destination_surface, + VdpRect const * destination_rect, + VdpBitmapSurface source_surface, + VdpRect const * source_rect, + VdpColor const * colors, + VdpOutputSurfaceRenderBlendState const * blend_state, + uint32_t flags +); + +/*@}*/ + +/** + * \defgroup VdpDecoder VdpDecoder; Video Decoding object + * + * The VdpDecoder object decodes compressed video data, writing + * the results to a \ref VdpVideoSurface "VdpVideoSurface". + * + * A specific VDPAU implementation may support decoding multiple + * types of compressed video data. However, VdpDecoder objects + * are able to decode a specific type of compressed video data. + * This type must be specified during creation. + * + * @{ + */ + +/** + * \brief The set of all known compressed video formats, and + * associated profiles, that may be decoded. + */ +typedef uint32_t VdpDecoderProfile; + +/** \hideinitializer */ +#define VDP_DECODER_PROFILE_MPEG1 (VdpDecoderProfile)0 +/** \hideinitializer */ +#define VDP_DECODER_PROFILE_MPEG2_SIMPLE (VdpDecoderProfile)1 +/** \hideinitializer */ +#define VDP_DECODER_PROFILE_MPEG2_MAIN (VdpDecoderProfile)2 +/** \hideinitializer */ +/** \brief MPEG 4 part 10 == H.264 == AVC */ +#define VDP_DECODER_PROFILE_H264_BASELINE (VdpDecoderProfile)6 +/** \hideinitializer */ +#define VDP_DECODER_PROFILE_H264_MAIN (VdpDecoderProfile)7 +/** \hideinitializer */ +#define VDP_DECODER_PROFILE_H264_HIGH (VdpDecoderProfile)8 +/** \hideinitializer */ +#define VDP_DECODER_PROFILE_VC1_SIMPLE (VdpDecoderProfile)9 +/** \hideinitializer */ +#define VDP_DECODER_PROFILE_VC1_MAIN (VdpDecoderProfile)10 +/** \hideinitializer */ +#define VDP_DECODER_PROFILE_VC1_ADVANCED (VdpDecoderProfile)11 + +/** \hideinitializer */ +#define VDP_DECODER_LEVEL_MPEG1_NA 0 + +/** \hideinitializer */ +#define VDP_DECODER_LEVEL_MPEG2_LL 0 +/** \hideinitializer */ +#define VDP_DECODER_LEVEL_MPEG2_ML 1 +/** \hideinitializer */ +#define VDP_DECODER_LEVEL_MPEG2_HL14 2 +/** \hideinitializer */ +#define VDP_DECODER_LEVEL_MPEG2_HL 3 + +/** \hideinitializer */ +#define VDP_DECODER_LEVEL_H264_1 10 +/** \hideinitializer */ +#define VDP_DECODER_LEVEL_H264_1b 9 +/** \hideinitializer */ +#define VDP_DECODER_LEVEL_H264_1_1 11 +/** \hideinitializer */ +#define VDP_DECODER_LEVEL_H264_1_2 12 +/** \hideinitializer */ +#define VDP_DECODER_LEVEL_H264_1_3 13 +/** \hideinitializer */ +#define VDP_DECODER_LEVEL_H264_2 20 +/** \hideinitializer */ +#define VDP_DECODER_LEVEL_H264_2_1 21 +/** \hideinitializer */ +#define VDP_DECODER_LEVEL_H264_2_2 22 +/** \hideinitializer */ +#define VDP_DECODER_LEVEL_H264_3 30 +/** \hideinitializer */ +#define VDP_DECODER_LEVEL_H264_3_1 31 +/** \hideinitializer */ +#define VDP_DECODER_LEVEL_H264_3_2 32 +/** \hideinitializer */ +#define VDP_DECODER_LEVEL_H264_4 40 +/** \hideinitializer */ +#define VDP_DECODER_LEVEL_H264_4_1 41 +/** \hideinitializer */ +#define VDP_DECODER_LEVEL_H264_4_2 42 +/** \hideinitializer */ +#define VDP_DECODER_LEVEL_H264_5 50 +/** \hideinitializer */ +#define VDP_DECODER_LEVEL_H264_5_1 51 + +/** \hideinitializer */ +#define VDP_DECODER_LEVEL_VC1_SIMPLE_LOW 0 +/** \hideinitializer */ +#define VDP_DECODER_LEVEL_VC1_SIMPLE_MEDIUM 1 + +/** \hideinitializer */ +#define VDP_DECODER_LEVEL_VC1_MAIN_LOW 0 +/** \hideinitializer */ +#define VDP_DECODER_LEVEL_VC1_MAIN_MEDIUM 1 +/** \hideinitializer */ +#define VDP_DECODER_LEVEL_VC1_MAIN_HIGH 2 + +/** \hideinitializer */ +#define VDP_DECODER_LEVEL_VC1_ADVANCED_L0 0 +/** \hideinitializer */ +#define VDP_DECODER_LEVEL_VC1_ADVANCED_L1 1 +/** \hideinitializer */ +#define VDP_DECODER_LEVEL_VC1_ADVANCED_L2 2 +/** \hideinitializer */ +#define VDP_DECODER_LEVEL_VC1_ADVANCED_L3 3 +/** \hideinitializer */ +#define VDP_DECODER_LEVEL_VC1_ADVANCED_L4 4 + +/** + * \brief Query the implementation's VdpDecoder capabilities. + * \param[in] device The device to query. + * \param[in] profile The decoder profile for which information is requested. + * \param[out] is_supported Is this profile supported? + * \param[out] max_level The maximum specification level supported for this + * profile. + * \param[out] max_macroblocks The maximum supported surface size in + * macroblocks. Note that this could be greater than that dictated by + * the maximum level. + * \param[out] max_width The maximum supported surface width for this profile. + * Note that this could be greater than that dictated by the maximum + * level. + * \param[out] max_height The maximum supported surface height for this + * profile. Note that this could be greater than that dictated by the + * maximum level. + * \return VdpStatus The completion status of the operation. + */ +typedef VdpStatus VdpDecoderQueryCapabilities( + VdpDevice device, + VdpDecoderProfile profile, + /* output parameters follow */ + VdpBool * is_supported, + uint32_t * max_level, + uint32_t * max_macroblocks, + uint32_t * max_width, + uint32_t * max_height +); + +/** + * \brief An opaque handle representing a VdpDecoder object. + */ +typedef uint32_t VdpDecoder; + +/** + * \brief Create a VdpDecoder. + * \param[in] device The device that will contain the surface. + * \param[in] profile The video format the decoder will decode. + * \param[in] width The width of the new surface. + * \param[in] height The height of the new surface. + * \param[in] max_references The maximum number of references that may be + * used by a single frame in the stream to be decoded. This parameter + * exists mainly for formats such as H.264, where different streams + * may use a different number of references. Requesting too many + * references may waste memory, but decoding should still operate + * correctly. Requesting too few references will cause decoding to + * fail. + * \param[out] decoder The new decoder's handle. + * \return VdpStatus The completion status of the operation. + */ +typedef VdpStatus VdpDecoderCreate( + VdpDevice device, + VdpDecoderProfile profile, + uint32_t width, + uint32_t height, + uint32_t max_references, + /* output parameters follow */ + VdpDecoder * decoder +); + +/** + * \brief Destroy a VdpDecoder. + * \param[in] surface The decoder's handle. + * \return VdpStatus The completion status of the operation. + */ +typedef VdpStatus VdpDecoderDestroy( + VdpDecoder decoder +); + +/** + * \brief Retrieve the parameters used to create a + * VdpDecoder. + * \param[in] surface The surface's handle. + * \param[out] profile The video format used to create the + * decoder. + * \param[out] width The width of surfaces decode by the + * decoder. + * \param[out] height The height of surfaces decode by the + * decoder + * \return VdpStatus The completion status of the operation. + */ +typedef VdpStatus VdpDecoderGetParameters( + VdpDecoder decoder, + /* output parameters follow */ + VdpDecoderProfile * profile, + uint32_t * width, + uint32_t * height +); + +#define VDP_BITSTREAM_BUFFER_VERSION 0 + +/** + * \brief Application data buffer containing compressed video + * data. + */ +typedef struct { + /** + * This field must be filled with VDP_BITSTREAM_BUFFER_VERSION + */ + uint32_t struct_version; + /** A pointer to the bitstream data bytes */ + void const * bitstream; + /** The number of data bytes */ + uint32_t bitstream_bytes; +} VdpBitstreamBuffer; + +/** + * \brief A generic "picture information" pointer type. + * + * This type serves solely to document the expected usage of a + * generic (void *) function parameter. In actual usage, the + * application is expected to physically provide a pointer to an + * instance of one of the "real" VdpPictureInfo* structures, + * picking the type appropriate for the decoder object in + * question. + */ +typedef void * VdpPictureInfo; + +/** + * \brief Picture parameter information for an MPEG 1 or MPEG 2 + * picture. + * + * Note: References to "copy of bitstream field" in the field descriptions + * may refer to data literally parsed from the bitstream, or derived from + * the bitstream using a mechanism described in the specification. + */ +typedef struct { + /** + * Reference used by B and P frames. + * Set to VDP_INVALID_HANDLE when not used. + */ + VdpVideoSurface forward_reference; + /** + * Reference used by B frames. + * Set to VDP_INVALID_HANDLE when not used. + */ + VdpVideoSurface backward_reference; + /** Number of slices in the bitstream provided. */ + uint32_t slice_count; + + /** Copy of the MPEG bitstream field. */ + uint8_t picture_structure; + /** Copy of the MPEG bitstream field. */ + uint8_t picture_coding_type; + /** Copy of the MPEG bitstream field. */ + uint8_t intra_dc_precision; + /** Copy of the MPEG bitstream field. */ + uint8_t frame_pred_frame_dct; + /** Copy of the MPEG bitstream field. */ + uint8_t concealment_motion_vectors; + /** Copy of the MPEG bitstream field. */ + uint8_t intra_vlc_format; + /** Copy of the MPEG bitstream field. */ + uint8_t alternate_scan; + /** Copy of the MPEG bitstream field. */ + uint8_t q_scale_type; + /** Copy of the MPEG bitstream field. */ + uint8_t top_field_first; + /** Copy of the MPEG-1 bitstream field. For MPEG-2, set to 0. */ + uint8_t full_pel_forward_vector; + /** Copy of the MPEG-1 bitstream field. For MPEG-2, set to 0. */ + uint8_t full_pel_backward_vector; + /** + * Copy of the MPEG bitstream field. + * For MPEG-1, fill both horizontal and vertical entries. + */ + uint8_t f_code[2][2]; + /** Copy of the MPEG bitstream field, converted to raster order. */ + uint8_t intra_quantizer_matrix[64]; + /** Copy of the MPEG bitstream field, converted to raster order. */ + uint8_t non_intra_quantizer_matrix[64]; +} VdpPictureInfoMPEG1Or2; + +/** + * \brief Information about an H.264 reference frame + * + * Note: References to "copy of bitstream field" in the field descriptions + * may refer to data literally parsed from the bitstream, or derived from + * the bitstream using a mechanism described in the specification. + */ +typedef struct { + /** + * The surface that contains the reference image. + * Set to VDP_INVALID_HANDLE for unused entries. + */ + VdpVideoSurface surface; + /** Is this a long term reference (else short term). */ + VdpBool is_long_term; + /** + * Is the top field used as a reference. + * Set to VDP_FALSE for unused entries. + */ + VdpBool top_is_reference; + /** + * Is the bottom field used as a reference. + * Set to VDP_FALSE for unused entries. + */ + VdpBool bottom_is_reference; + /** [0]: top, [1]: bottom */ + int32_t field_order_cnt[2]; + /** + * Copy of the H.264 bitstream field: + * frame_num from slice_header for short-term references, + * LongTermPicNum from decoding algorithm for long-term references. + */ + uint16_t frame_idx; +} VdpReferenceFrameH264; + +/** + * \brief Picture parameter information for an H.264 picture. + * + * Note: The \ref referenceFrames array must contain the "DPB" as + * defined by the H.264 specification. In particular, once a + * reference frame has been decoded to a surface, that surface must + * continue to appear in the DPB until no longer required to predict + * any future frame. Once a surface is removed from the DPB, it can + * no longer be used as a reference, unless decoded again. + * + * Also note that only surfaces previously generated using \ref + * VdpDecoderRender may be used as reference frames. In particular, + * surfaces filled using any "put bits" API will not work. + * + * Note: References to "copy of bitstream field" in the field descriptions + * may refer to data literally parsed from the bitstream, or derived from + * the bitstream using a mechanism described in the specification. + */ +typedef struct { + /** Number of slices in the bitstream provided. */ + uint32_t slice_count; + /** [0]: top, [1]: bottom */ + int32_t field_order_cnt[2]; + /** Will the decoded frame be used as a reference later. */ + VdpBool is_reference; + + /** Copy of the H.264 bitstream field. */ + uint16_t frame_num; + /** Copy of the H.264 bitstream field. */ + uint8_t field_pic_flag; + /** Copy of the H.264 bitstream field. */ + uint8_t bottom_field_flag; + /** Copy of the H.264 bitstream field. */ + uint8_t num_ref_frames; + /** Copy of the H.264 bitstream field. */ + uint8_t mb_adaptive_frame_field_flag; + /** Copy of the H.264 bitstream field. */ + uint8_t constrained_intra_pred_flag; + /** Copy of the H.264 bitstream field. */ + uint8_t weighted_pred_flag; + /** Copy of the H.264 bitstream field. */ + uint8_t weighted_bipred_idc; + /** Copy of the H.264 bitstream field. */ + uint8_t frame_mbs_only_flag; + /** Copy of the H.264 bitstream field. */ + uint8_t transform_8x8_mode_flag; + /** Copy of the H.264 bitstream field. */ + int8_t chroma_qp_index_offset; + /** Copy of the H.264 bitstream field. */ + int8_t second_chroma_qp_index_offset; + /** Copy of the H.264 bitstream field. */ + int8_t pic_init_qp_minus26; + /** Copy of the H.264 bitstream field. */ + uint8_t num_ref_idx_l0_active_minus1; + /** Copy of the H.264 bitstream field. */ + uint8_t num_ref_idx_l1_active_minus1; + /** Copy of the H.264 bitstream field. */ + uint8_t log2_max_frame_num_minus4; + /** Copy of the H.264 bitstream field. */ + uint8_t pic_order_cnt_type; + /** Copy of the H.264 bitstream field. */ + uint8_t log2_max_pic_order_cnt_lsb_minus4; + /** Copy of the H.264 bitstream field. */ + uint8_t delta_pic_order_always_zero_flag; + /** Copy of the H.264 bitstream field. */ + uint8_t direct_8x8_inference_flag; + /** Copy of the H.264 bitstream field. */ + uint8_t entropy_coding_mode_flag; + /** Copy of the H.264 bitstream field. */ + uint8_t pic_order_present_flag; + /** Copy of the H.264 bitstream field. */ + uint8_t deblocking_filter_control_present_flag; + /** Copy of the H.264 bitstream field. */ + uint8_t redundant_pic_cnt_present_flag; + + /** Copy of the H.264 bitstream field, converted to raster order. */ + uint8_t scaling_lists_4x4[6][16]; + /** Copy of the H.264 bitstream field, converted to raster order. */ + uint8_t scaling_lists_8x8[2][64]; + + /** See \ref VdpPictureInfoH264 for instructions regarding this field. */ + VdpReferenceFrameH264 referenceFrames[16]; +} VdpPictureInfoH264; + +/** + * \brief Picture parameter information for a VC1 picture. + * + * Note: References to "copy of bitstream field" in the field descriptions + * may refer to data literally parsed from the bitstream, or derived from + * the bitstream using a mechanism described in the specification. + */ +typedef struct { + /** + * Reference used by B and P frames. + * Set to VDP_INVALID_HANDLE when not used. + */ + VdpVideoSurface forward_reference; + /** + * Reference used by B frames. + * Set to VDP_INVALID_HANDLE when not used. + */ + VdpVideoSurface backward_reference; + + /** Number of slices in the bitstream provided. */ + uint32_t slice_count; + /** I=0, P=1, B=3, BI=4 from 7.1.1.4. */ + uint8_t picture_type; + /** Progressive=0, Frame-interlace=2, Field-interlace=3; see VC-1 7.1.1.15. */ + uint8_t frame_coding_mode; + + /** Copy of the VC-1 bitstream field. See VC-1 6.1.5. */ + uint8_t postprocflag; + /** Copy of the VC-1 bitstream field. See VC-1 6.1.8. */ + uint8_t pulldown; + /** Copy of the VC-1 bitstream field. See VC-1 6.1.9. */ + uint8_t interlace; + /** Copy of the VC-1 bitstream field. See VC-1 6.1.10. */ + uint8_t tfcntrflag; + /** Copy of the VC-1 bitstream field. See VC-1 6.1.11. */ + uint8_t finterpflag; + /** Copy of the VC-1 bitstream field. See VC-1 6.1.3. */ + uint8_t psf; + /** Copy of the VC-1 bitstream field. See VC-1 6.2.8. */ + uint8_t dquant; + /** Copy of the VC-1 bitstream field. See VC-1 6.2.3. */ + uint8_t panscan_flag; + /** Copy of the VC-1 bitstream field. See VC-1 6.2.4. */ + uint8_t refdist_flag; + /** Copy of the VC-1 bitstream field. See VC-1 6.2.11. */ + uint8_t quantizer; + /** Copy of the VC-1 bitstream field. See VC-1 6.2.7. */ + uint8_t extended_mv; + /** Copy of the VC-1 bitstream field. See VC-1 6.2.14. */ + uint8_t extended_dmv; + /** Copy of the VC-1 bitstream field. See VC-1 6.2.10. */ + uint8_t overlap; + /** Copy of the VC-1 bitstream field. See VC-1 6.2.9. */ + uint8_t vstransform; + /** Copy of the VC-1 bitstream field. See VC-1 6.2.5. */ + uint8_t loopfilter; + /** Copy of the VC-1 bitstream field. See VC-1 6.2.6. */ + uint8_t fastuvmc; + /** Copy of the VC-1 bitstream field. See VC-1 6.12.15. */ + uint8_t range_mapy_flag; + /** Copy of the VC-1 bitstream field. */ + uint8_t range_mapy; + /** Copy of the VC-1 bitstream field. See VC-1 6.2.16. */ + uint8_t range_mapuv_flag; + /** Copy of the VC-1 bitstream field. */ + uint8_t range_mapuv; + + /** + * Copy of the VC-1 bitstream field. See VC-1 J.1.10. + * Only used by simple and main profiles. + */ + uint8_t multires; + /** + * Copy of the VC-1 bitstream field. See VC-1 J.1.16. + * Only used by simple and main profiles. + */ + uint8_t syncmarker; + /** + * VC-1 SP/MP range reduction control. + * Only used by simple and main profiles. + * Bit 0: Copy of rangered VC-1 bitstream field; See VC-1 J.1.17. + * Bit 1: Copy of rangeredfrm VC-1 bitstream fiels; See VC-1 7.1.13. + */ + uint8_t rangered; + /** + * Copy of the VC-1 bitstream field. See VC-1 J.1.17. + * Only used by simple and main profiles. + */ + uint8_t maxbframes; + + /** + * Out-of-loop deblocking enable. + * Bit 0 of POSTPROC from VC-1 7.1.1.27 + * Note that bit 1 of POSTPROC (dering enable) should not be included. + */ + uint8_t deblockEnable; + /** + * Parameter used by VC-1 Annex H deblocking algorithm. Note that VDPAU + * implementations may choose which deblocking algorithm to use. + * See VC-1 7.1.1.6 + */ + uint8_t pquant; +} VdpPictureInfoVC1; + +/** + * \brief Decode a compressed field/frame and render the result + * into a \ref VdpVideoSurface "VdpVideoSurface". + * \param[in] decoder The decoder object that will perform the + * decode operation. + * \param[in] target The video surface to render to. + * \param[in] picture_info A (pointer to a) structure containing + * information about the picture to be decoded. Note that + * the appropriate type of VdpPictureInfo* structure must + * be provided to match to profile that the decoder was + * created for. + * \param[in] bitstream_buffer_count The number of bitstream + * buffers containing compressed data for this picture. + * \param[in] bitstream_buffers An array of bitstream buffers. + * \return VdpStatus The completion status of the operation. + * + * See \ref video_mixer_usage for additional information. + */ +typedef VdpStatus VdpDecoderRender( + VdpDecoder decoder, + VdpVideoSurface target, + VdpPictureInfo const * picture_info, + uint32_t bitstream_buffer_count, + VdpBitstreamBuffer const * bitstream_buffers +); + +/*@}*/ + +/** + * \defgroup VdpVideoMixer VdpVideoMixer; Video Post-processing \ + * and Compositing object + * + * VdpVideoMixer can perform some subset of the following + * post-processing steps on video: + * - De-interlacing + * - Various types, with or without inverse telecine + * - Noise-reduction + * - Sharpness adjustment + * - Color space conversion to RGB + * - Chroma format upscaling to 4:4:4 + * + * A VdpVideoMixer takes a source \ref VdpVideoSurface + * "VdpVideoSurface" VdpVideoSurface and performs various video + * processing steps on it (potentially using information from + * past or future video surfaces). It scales the video and + * converts it to RGB, then optionally composites it with + * multiple auxiliary \ref VdpOutputSurface "VdpOutputSurface"s + * before writing the result to the destination \ref + * VdpOutputSurface "VdpOutputSurface". + * + * The video mixer compositing model is as follows: + * + * - A rectangle will be rendered on an output surface. No + * pixels will be rendered outside of this output rectangle. + * The contents of this rectangle will be a composite of many + * layers. + * + * - The first layer is the background color. The background + * color will fill the entire rectangle. + * + * - The second layer is the processed video which has been + * converted to RGB. These pixels will overwrite the + * background color of the first layer except where the second + * layer's rectangle does not completely cover the output + * rectangle. In those regions the background color will + * continue to show. If any portion of the second layer's + * output rectangle is outside of the output rectangle, those + * portions will be clipped. + * + * - The third layer contains some number of auxiliary layers + * (in the form of \ref VdpOutputSurface "VdpOutputSurface"s) + * which will be composited using the alpha value from the + * those surfaces. The compositing operations are equivalent + * to rendering with \ref VdpOutputSurfaceRenderOutputSurface + * using a source blend factor of SOURCE_ALPHA, a destination + * blend factor of ONE_MINUS_SOURCE_ALPHA and an equation of + * ADD. + * + * @{ + */ + +/** + * \brief A VdpVideoMixer feature that must be requested at + * creation time to be used. + * + * Certain advanced VdpVideoMixer features are optional, and the + * ability to use those features at all must be requested when + * the VdpVideoMixer object is created. Each feature is named via + * a specific VdpVideoMixerFeature value. + * + * Once requested, these features are permanently available + * within that specific VdpVideoMixer object. All features that + * are not explicitly requested at creation time default to + * being permanently unavailable. + * + * Even when requested, all features default to being initially + * disabled. However, applications can subsequently enable and + * disable features at any time. See \ref + * VdpVideoMixerSetFeatureEnables. + * + * Some features allow configuration of their operation. Each + * configurable item is an \ref VdpVideoMixerAttribute. These + * attributes may be manipulated at any time using \ref + * VdpVideoMixerSetAttributeValues. + */ +typedef uint32_t VdpVideoMixerFeature; + +/** + * \hideinitializer + * \brief A VdpVideoMixerFeature. + * + * When requested and enabled, motion adaptive temporal + * deinterlacing will be used on interlaced content. + * + * When multiple de-interlacing options are requested and + * enabled, the back-end implementation chooses the best + * algorithm to apply. + */ +#define VDP_VIDEO_MIXER_FEATURE_DEINTERLACE_TEMPORAL (VdpVideoMixerFeature)0 +/** + * \hideinitializer + * \brief A VdpVideoMixerFeature. + * + * When requested and enabled, this enables a more advanced + * version of temporal de-interlacing, that additionally uses + * edge-guided spatial interpolation. + * + * When multiple de-interlacing options are requested and + * enabled, the back-end implementation chooses the best + * algorithm to apply. + */ +#define VDP_VIDEO_MIXER_FEATURE_DEINTERLACE_TEMPORAL_SPATIAL (VdpVideoMixerFeature)1 +/** + * \hideinitializer + * \brief A VdpVideoMixerFeature. + * + * When requested and enabled, cadence detection will be enabled + * on interlaced content and the video mixer will try to extract + * progressive frames from pull-down material. + */ +#define VDP_VIDEO_MIXER_FEATURE_INVERSE_TELECINE (VdpVideoMixerFeature)2 +/** + * \hideinitializer + * \brief A VdpVideoMixerFeature. + * + * When requested and enabled, a noise reduction algorithm will + * be applied to the video. + */ +#define VDP_VIDEO_MIXER_FEATURE_NOISE_REDUCTION (VdpVideoMixerFeature)3 +/** + * \hideinitializer + * \brief A VdpVideoMixerFeature. + * + * When requested and enabled, a sharpening algorithm will be + * applied to the video. + */ +#define VDP_VIDEO_MIXER_FEATURE_SHARPNESS (VdpVideoMixerFeature)4 +/** + * \hideinitializer + * \brief A VdpVideoMixerFeature. + * + * When requested and enabled, the alpha of the rendered + * surface, which is normally set to the alpha of the background + * color, will be forced to 0.0 on pixels corresponding to + * source video surface luminance values in the range specified + * by attributes \ref VDP_VIDEO_MIXER_ATTRIBUTE_LUMA_KEY_MIN_LUMA + * to \ref VDP_VIDEO_MIXER_ATTRIBUTE_LUMA_KEY_MAX_LUMA. This + * keying is performed after scaling and de-interlacing. + */ +#define VDP_VIDEO_MIXER_FEATURE_LUMA_KEY (VdpVideoMixerFeature)5 + +/** + * \brief A VdpVideoMixer creation parameter. + * + * When a VdpVideoMixer is created, certain parameters may be + * supplied. Each parameter is named via a specific + * VdpVideoMixerParameter value. + * + * Each parameter has a specific type, and specific default + * value if not specified at VdpVideoMixer creation time. The + * application may query the legal supported range for some + * parameters. + */ +typedef uint32_t VdpVideoMixerParameter; + +/** + * \hideinitializer + * \brief The exact width of input video surfaces. + * + * This parameter's type is uint32_t. + * + * This parameter defaults to 0 if not specified, which entails + * that it must be specified. + * + * The application may query this parameter's supported + * range. + */ +#define VDP_VIDEO_MIXER_PARAMETER_VIDEO_SURFACE_WIDTH (VdpVideoMixerParameter)0 +/** + * \hideinitializer + * \brief The exact height of input video surfaces. + * + * This parameter's type is uint32_t. + * + * This parameter defaults to 0 if not specified, which entails + * that it must be specified. + * + * The application may query this parameter's supported + * range. + */ +#define VDP_VIDEO_MIXER_PARAMETER_VIDEO_SURFACE_HEIGHT (VdpVideoMixerParameter)1 +/** + * \hideinitializer + * \brief The chroma type of the input video surfaces the will + * process. + * + * This parameter's type is VdpChromaType. + * + * If not specified, this parameter defaults to + * VDP_CHROMA_TYPE_420. + * + * The application may not query this application's supported + * range, since it is a potentially disjoint enumeration. + */ +#define VDP_VIDEO_MIXER_PARAMETER_CHROMA_TYPE (VdpVideoMixerParameter)2 +/** + * \hideinitializer + * \brief The number of auxiliary layers in the mixer's + * compositing model. + * + * Note that this indicates the maximum number of layers that + * may be processed by a given \ref VdpVideoMixer "VdpVideoMixer" + * object. Each individual \ref VdpVideoMixerRender invocation + * may choose to use a different number of actual layers, from 0 + * up to this limit. + * + * This attribute's type is uint32_t. + * + * If not specified, this parameter defaults to 0. + * + * The application may query this parameter's supported + * range. + */ +#define VDP_VIDEO_MIXER_PARAMETER_LAYERS (VdpVideoMixerParameter)3 + +/** + * \brief An adjustable attribute of VdpVideoMixer operation. + * + * Various attributes of VdpVideoMixer operation may be adjusted + * at any time. Each attribute is named via a specific + * VdpVideoMixerAttribute value. + * + * Each attribute has a specific type, and specific default + * value if not specified at VdpVideoMixer creation time. The + * application may query the legal supported range for some + * attributes. + */ +typedef uint32_t VdpVideoMixerAttribute; + +/** + * \hideinitializer + * \brief The background color in the VdpVideoMixer's compositing + * model. + * + * This attribute's type is VdpColor. + * + * This parameter defaults to black (all color components 0.0 + * and alpha 1.0). + * + * The application may not query this parameter's supported + * range, since the type is not scalar. + */ +#define VDP_VIDEO_MIXER_ATTRIBUTE_BACKGROUND_COLOR (VdpVideoMixerAttribute)0 +/** + * \hideinitializer + * \brief The color-space conversion matrix used by the + * VdpVideoMixer. + * + * This attribute's type is \ref VdpCSCMatrix. + * + * Note: When using \ref VdpVideoMixerGetAttributeValues to retrieve the + * current CSC matrix, the attribute_values array must contain a pointer to + * a pointer a VdpCSCMatrix (VdpCSCMatrix** as a void *). The get function will + * either initialize the referenced CSC matrix to the current value, *or* + * clear the supplied pointer to NULL, if the previous set call supplied a + * value of NULL in parameter_values, to request the default matrix. + * + * \code + * VdpCSCMatrix matrix; + * VdpCSCMatrix * matrix_ptr; + * void * attribute_values[] = {&matrix_ptr}; + * VdpStatus st = vdp_video_mixer_get_attribute_values(..., attribute_values, ...); + * \endcode + * + * This parameter defaults to a matrix suitable for ITU-R BT.601 + * input surfaces, with no procamp adjustments. + * + * The application may not query this parameter's supported + * range, since the type is not scalar. + */ +#define VDP_VIDEO_MIXER_ATTRIBUTE_CSC_MATRIX (VdpVideoMixerAttribute)1 +/** + * \hideinitializer + * \brief The amount of noise reduction algorithm to apply. + * + * This attribute's type is float. + * + * This parameter defaults to 0.0, which equates to no noise + * reduction. + * + * The application may query this parameter's supported range. + * However, the range is fixed as 0.0...1.0. + */ +#define VDP_VIDEO_MIXER_ATTRIBUTE_NOISE_REDUCTION_LEVEL (VdpVideoMixerAttribute)2 +/** + * \hideinitializer + * \brief The amount of sharpening, or blurring, to apply. + * + * This attribute's type is float. + * + * This parameter defaults to 0.0, which equates to no + * sharpening. + * + * Positive values request sharpening. Negative values request + * blurring. + * + * The application may query this parameter's supported range. + * However, the range is fixed as -1.0...1.0. + */ +#define VDP_VIDEO_MIXER_ATTRIBUTE_SHARPNESS_LEVEL (VdpVideoMixerAttribute)3 +/** + * \hideinitializer + * \brief The minimum luma value for the luma key algorithm. + * + * This attribute's type is float. + * + * This parameter defaults to 0.0. + * + * The application may query this parameter's supported range. + * However, the range is fixed as 0.0...1.0. + */ +#define VDP_VIDEO_MIXER_ATTRIBUTE_LUMA_KEY_MIN_LUMA (VdpVideoMixerAttribute)4 +/** + * \hideinitializer + * \brief The maximum luma value for the luma key algorithm. + * + * This attribute's type is float. + * + * This parameter defaults to 1.0. + * + * The application may query this parameter's supported range. + * However, the range is fixed as 0.0...1.0. + */ +#define VDP_VIDEO_MIXER_ATTRIBUTE_LUMA_KEY_MAX_LUMA (VdpVideoMixerAttribute)5 +/** + * \hideinitializer + * \brief Whether de-interlacers should operate solely on luma, and bob chroma. + * + * Note: This attribute only affects advanced de-interlacing algorithms, not + * bob or weave. + * + * This attribute's type is uint8_t. + * + * This parameter defaults to 0. + * + * The application may query this parameter's supported range. + * However, the range is fixed as 0 (no/off) ... 1 (yes/on). + */ +#define VDP_VIDEO_MIXER_ATTRIBUTE_SKIP_CHROMA_DEINTERLACE (VdpVideoMixerAttribute)6 + +/** + * \brief Query the implementation's support for a specific + * feature. + * \param[in] device The device to query. + * \param[in] feature The feature for which support is to be + * queried. + * \param[out] is_supported Is the specified feature supported? + * \return VdpStatus The completion status of the operation. + */ +typedef VdpStatus VdpVideoMixerQueryFeatureSupport( + VdpDevice device, + VdpVideoMixerFeature feature, + /* output parameters follow */ + VdpBool * is_supported +); + +/** + * \brief Query the implementation's support for a specific + * parameter. + * \param[in] device The device to query. + * \param[in] parameter The parameter for which support is to be + * queried. + * \param[out] is_supported Is the specified parameter + * supported? + * \return VdpStatus The completion status of the operation. + */ +typedef VdpStatus VdpVideoMixerQueryParameterSupport( + VdpDevice device, + VdpVideoMixerParameter parameter, + /* output parameters follow */ + VdpBool * is_supported +); + +/** + * \brief Query the implementation's support for a specific + * attribute. + * \param[in] device The device to query. + * \param[in] feature The feature for which support is to be + * queried. + * \param[out] is_supported Is the specified feature supported? + * \return VdpStatus The completion status of the operation. + */ +typedef VdpStatus VdpVideoMixerQueryAttributeSupport( + VdpDevice device, + VdpVideoMixerAttribute attribute, + /* output parameters follow */ + VdpBool * is_supported +); + +/** + * \brief Query the implementation's supported for a specific + * parameter. + * \param[in] device The device to query. + * \param[in] parameter The parameter for which support is to be + * queried. + * \param[out] min_value The minimum supported value. + * \param[out] max_value The maximum supported value. + * \return VdpStatus The completion status of the operation. + */ +typedef VdpStatus VdpVideoMixerQueryParameterValueRange( + VdpDevice device, + VdpVideoMixerParameter parameter, + /* output parameters follow */ + void * min_value, + void * max_value +); + +/** + * \brief Query the implementation's supported for a specific + * attribute. + * \param[in] device The device to query. + * \param[in] attribute The attribute for which support is to be + * queried. + * \param[out] min_value The minimum supported value. + * \param[out] max_value The maximum supported value. + * \return VdpStatus The completion status of the operation. + */ +typedef VdpStatus VdpVideoMixerQueryAttributeValueRange( + VdpDevice device, + VdpVideoMixerAttribute attribute, + /* output parameters follow */ + void * min_value, + void * max_value +); + +/** + * \brief An opaque handle representing a VdpVideoMixer object. + */ +typedef uint32_t VdpVideoMixer; + +/** + * \brief Create a VdpVideoMixer. + * \param[in] device The device that will contain the mixer. + * \param[in] feature_count The number of features to request. + * \param[in] features The list of features to request. + * \param[in] parameter_count The number of parameters to set. + * \param[in] parameters The list of parameters to set. + * \param[in] parameter_values The values for the parameters. Note that each + * entry in the value array is a pointer to the actual value. In other + * words, the values themselves are not cast to "void *" and passed + * "inside" the array. + * \param[out] mixer The new mixer's handle. + * \return VdpStatus The completion status of the operation. + * + * Initially, all requested features will be disabled. They can + * be enabled using \ref VdpVideoMixerSetFeatureEnables. + * + * Initially, all attributes will have default values. Values + * can be changed using \ref VdpVideoMixerSetAttributeValues. + */ +typedef VdpStatus VdpVideoMixerCreate( + VdpDevice device, + // The set of features to request + uint32_t feature_count, + VdpVideoMixerFeature const * features, + // The parameters used during creation + uint32_t parameter_count, + VdpVideoMixerParameter const * parameters, + void const * const * parameter_values, + /* output parameters follow */ + VdpVideoMixer * mixer +); + +/** + * \brief Enable or disable features. + * \param[in] mixer The mixer to manipulate. + * \param[in] feature_count The number of features to + * enable/disable. + * \param[in] features The list of features to enable/disable. + * \param[in] feature_enables The list of new feature enable + * values. + * \return VdpStatus The completion status of the operation. + */ +typedef VdpStatus VdpVideoMixerSetFeatureEnables( + VdpVideoMixer mixer, + uint32_t feature_count, + VdpVideoMixerFeature const * features, + VdpBool const * feature_enables +); + +/** + * \brief Set attribute values + * \param[in] mixer The mixer to manipulate. + * \param[in] attribute_count The number of attributes to set. + * \param[in] attributes The list of attributes to set. + * \param[in] attribute_values The values for the attributes. Note that each + * entry in the value array is a pointer to the actual value. In other + * words, the values themselves are not cast to "void *" and passed + * "inside" the array. A NULL pointer requests that the default value be + * set for that attribute. + * \return VdpStatus The completion status of the operation. + */ +typedef VdpStatus VdpVideoMixerSetAttributeValues( + VdpVideoMixer mixer, + uint32_t attribute_count, + VdpVideoMixerAttribute const * attributes, + void const * const * attribute_values +); + +/** + * \brief Retrieve whether features were requested at creation + * time. + * \param[in] mixer The mixer to query. + * \param[in] feature_count The number of features to query. + * \param[in] features The list of features to query. + * \param[out] feature_supported A list of values indicating + * whether the feature was requested, and hence is + * available. + * \return VdpStatus The completion status of the operation. + */ +typedef VdpStatus VdpVideoMixerGetFeatureSupport( + VdpVideoMixer mixer, + uint32_t feature_count, + VdpVideoMixerFeature const * features, + /* output parameters follow */ + VdpBool * feature_supports +); + +/** + * \brief Retrieve whether features are enabled. + * \param[in] mixer The mixer to manipulate. + * \param[in] feature_count The number of features to query. + * \param[in] features The list of features to query. + * \param[out] feature_enabled A list of values indicating + * whether the feature is enabled. + * \return VdpStatus The completion status of the operation. + */ +typedef VdpStatus VdpVideoMixerGetFeatureEnables( + VdpVideoMixer mixer, + uint32_t feature_count, + VdpVideoMixerFeature const * features, + /* output parameters follow */ + VdpBool * feature_enables +); + +/** + * \brief Retrieve parameter values given at creation time. + * \param[in] mixer The mixer to manipulate. + * \param[in] parameter_count The number of parameters to query. + * \param[in] parameters The list of parameters to query. + * \param[out] parameter_values The list of current values for + * the parameters. Note that each entry in the value array is a pointer to + * storage that will receive the actual value. If the attribute's type is + * a pointer itself, please closely read the documentation for that + * attribute type for any other data passing requirements. + * \return VdpStatus The completion status of the operation. + */ +typedef VdpStatus VdpVideoMixerGetParameterValues( + VdpVideoMixer mixer, + uint32_t parameter_count, + VdpVideoMixerParameter const * parameters, + /* output parameters follow */ + void * const * parameter_values +); + +/** + * \brief Retrieve current attribute values. + * \param[in] mixer The mixer to manipulate. + * \param[in] attribute_count The number of attributes to query. + * \param[in] attributes The list of attributes to query. + * \param[out] attribute_values The list of current values for + * the attributes. Note that each entry in the value array is a pointer to + * storage that will receive the actual value. If the attribute's type is + * a pointer itself, please closely read the documentation for that + * attribute type for any other data passing requirements. + * \return VdpStatus The completion status of the operation. + */ +typedef VdpStatus VdpVideoMixerGetAttributeValues( + VdpVideoMixer mixer, + uint32_t attribute_count, + VdpVideoMixerAttribute const * attributes, + /* output parameters follow */ + void * const * attribute_values +); + +/** + * \brief Destroy a VdpVideoMixer. + * \param[in] device The device to destroy. + * \return VdpStatus The completion status of the operation. + */ +typedef VdpStatus VdpVideoMixerDestroy( + VdpVideoMixer mixer +); + +/** + * \hideinitializer + * \brief The structure of the picture present in a \ref + * VdpVideoSurface "VdpVideoSurface". + */ +typedef enum { + /** + * The picture is a field, and is the top field of the surface. + */ + VDP_VIDEO_MIXER_PICTURE_STRUCTURE_TOP_FIELD, + /** + * The picture is a field, and is the bottom field of the + * surface. + */ + VDP_VIDEO_MIXER_PICTURE_STRUCTURE_BOTTOM_FIELD, + /** + * The picture is a frame, and hence is the entire surface. + */ + VDP_VIDEO_MIXER_PICTURE_STRUCTURE_FRAME, +} VdpVideoMixerPictureStructure; + +#define VDP_LAYER_VERSION 0 + +/** + * \brief Definition of an additional \ref VdpOutputSurface + * "VdpOutputSurface" layer in the composting model. + */ +typedef struct { + /** + * This field must be filled with VDP_LAYER_VERSION + */ + uint32_t struct_version; + /** + * The surface to composite from. + */ + VdpOutputSurface source_surface; + /** + * The sub-rectangle of the source surface to use. If NULL, the + * entire source surface will be used. + */ + VdpRect const * source_rect; + /** + * The sub-rectangle of the destination surface to map + * this layer into. This rectangle is relative to the entire + * destination surface. This rectangle will be clipped by \ref + * VdpVideoMixerRender's \b destination_rect. If NULL, the + * destination rectangle will be sized to match the source + * rectangle, and will be located at the origin. + */ + VdpRect const * destination_rect; +} VdpLayer; + +/** + * \brief Perform a video post-processing and compositing + * operation. + * \param[in] mixer The mixer object that will perform the + * mixing/rendering operation. + * \param[in] background_surface A background image. If set to any value other + * than VDP_INVALID_HANDLE, the specific surface will be used instead of + * the background color as the first layer in the mixer's compositing + * process. + * \param[in] background_source_rect When background_surface is specified, + * this parameter indicates the portion of background_surface that will + * be used as the background layer. The specified region will be + * extracted and scaled to match the size of destination_rect. If NULL, + * the entire background_surface will be used. + * \param[in] current_picture_structure The picture structure of + * the field/frame to be processed. This field/frame is + * presented in the \b video_surface_current parameter. If + * frame, then all \b video_surface_* parameters are + * assumed to be frames. If field, then all + * video_surface_* parameters are assumed to be fields, + * with alternating top/bottom-ness derived from + * video_surface_current. + * \param[in] video_surfaces_past_count The number of provided + * fields/frames prior to the current picture. + * \param[in] video_surfaces_past The fields/frames prior to the + * current field/frame. Note that array index 0 is the + * field/frame temporally nearest to the current + * field/frame, with increasing array indices used for + * older frames. Unavailable entries may be set to + * \ref VDP_INVALID_HANDLE. + * \param[in] video_surface_current The field/frame to be + * processed. + * \param[in] video_surfaces_future_count The number of provided + * fields/frames following the current picture. + * \param[in] video_surfaces_future The fields/frames that + * follow the current field/frame. Note that array index 0 + * is the field/frame temporally nearest to the current + * field/frame, with increasing array indices used for + * newer frames. Unavailable entries may be set to \ref + * VDP_INVALID_HANDLE. + * \param[in] video_source_rect The sub-rectangle of the source + * video surface to extract and process. If NULL, the + * entire surface will be used. + * \param[in] destination_surface + * \param[in] destination_rect The sub-rectangle of the + * destination surface to modify. Note that rectangle clips + * all other actions. + * \param[in] destination_video_rect The sub-rectangle of the + * destination surface that will contain the processed + * video. This rectangle is relative to the entire + * destination surface. This rectangle is clipped by \b + * destination_rect. If NULL, the destination rectangle + * will be sized to match the source rectangle, and will + * be located at the origin. + * \param[in] layer_count The number of additional layers to + * composite above the video. + * \param[in] layers The array of additional layers to composite + * above the video. + * \return VdpStatus The completion status of the operation. + * + * For a complete discussion of how to use this API, please see + * \ref video_mixer_usage. + */ +typedef VdpStatus VdpVideoMixerRender( + VdpVideoMixer mixer, + VdpOutputSurface background_surface, + VdpRect const * background_source_rect, + VdpVideoMixerPictureStructure current_picture_structure, + uint32_t video_surface_past_count, + VdpVideoSurface const * video_surface_past, + VdpVideoSurface video_surface_current, + uint32_t video_surface_future_count, + VdpVideoSurface const * video_surface_future, + VdpRect const * video_source_rect, + VdpOutputSurface destination_surface, + VdpRect const * destination_rect, + VdpRect const * destination_video_rect, + uint32_t layer_count, + VdpLayer const * layers +); + +/*@}*/ + +/** + * \defgroup VdpPresentationQueue VdpPresentationQueue; Video \ + * presentation (display) object + * + * The VdpPresentationQueue manages a queue of surfaces and + * associated timestamps. For each surface in the queue, once + * the associated timestamp is reached, the surface is displayed + * to the user. This timestamp-based approach yields high + * quality video delivery. + * + * The exact location of the displayed content is Window System + * specific. For this reason, the \ref api_winsys provides an + * API to create a \ref VdpPresentationQueueTarget object (e.g. + * via \ref VdpPresentationQueueTargetCreateX11) which + * encapsulates this information. + * + * Note that the presentation queue performs no scaling of + * surfaces to match the display target's size, aspect ratio, + * etc. + * + * Surfaces that are too large to fit into the display target + * will be clipped. Surfaces that are too small to fill the + * display target will be aligned to the top-left corner of the + * display target, with the balance of the display target being + * filled with a constant configurable "background" color. + * + * Note that the presentation queue operates in a manner that is + * semantically equivalent to an overlay surface, with any + * required color key painting hidden internally. However, + * implementations are free to use whatever semantically + * equivalent technique they wish. Note that implementations + * that actually use color-keyed overlays will typically use + * the "background" color as the overlay color key value, so + * this color should be chosen with care. + * + * @{ + */ + +/** + * \brief The representation of a point in time. + * + * VdpTime timestamps are intended to be a high-precision timing + * system, potentially independent from any other time domain in + * the system. + * + * Time is represented in units of nanoseconds. The origin + * (i.e. the time represented by a value of 0) is implementation + * dependent. + */ +typedef uint64_t VdpTime; + +/** + * \brief An opaque handle representing the location where + * video will be presented. + * + * VdpPresentationQueueTarget are created using a \ref api_winsys + * specific API, such as \ref + * VdpPresentationQueueTargetCreateX11. + */ +typedef uint32_t VdpPresentationQueueTarget; + +/** + * \brief Destroy a VdpPresentationQueueTarget. + * \param[in] presentation_queue_target The target to destroy. + * \return VdpStatus The completion status of the operation. + */ +typedef VdpStatus VdpPresentationQueueTargetDestroy( + VdpPresentationQueueTarget presentation_queue_target +); + +/** + * \brief An opaque handle representing a presentation queue + * object. + */ +typedef uint32_t VdpPresentationQueue; + +/** + * \brief Create a VdpPresentationQueue. + * \param[in] device The device that will contain the queue. + * \param[in] presentation_queue_target The location to display + * the content. + * \param[out] presentation_queue The new queue's handle. + * \return VdpStatus The completion status of the operation. + * + * Note: The initial value for the background color will be set to + * an implementation-defined value. + */ +typedef VdpStatus VdpPresentationQueueCreate( + VdpDevice device, + VdpPresentationQueueTarget presentation_queue_target, + /* output parameters follow */ + VdpPresentationQueue * presentation_queue +); + +/** + * \brief Destroy a VdpPresentationQueue. + * \param[in] presentation_queue The queue to destroy. + * \return VdpStatus The completion status of the operation. + */ +typedef VdpStatus VdpPresentationQueueDestroy( + VdpPresentationQueue presentation_queue +); + +/** + * \brief Configure the background color setting. + * \param[in] presentation_queue The queue to manipulate. + * \param[in] background_color The new background color. + * + * Note: Implementations may choose whether to apply the + * new background color value immediately, or defer it until + * the next surface is presented. + */ +typedef VdpStatus VdpPresentationQueueSetBackgroundColor( + VdpPresentationQueue presentation_queue, + VdpColor * const background_color +); + +/** + * \brief Retrieve the current background color setting. + * \param[in] presentation_queue The queue to query. + * \param[out] background_color The current background color. + */ +typedef VdpStatus VdpPresentationQueueGetBackgroundColor( + VdpPresentationQueue presentation_queue, + VdpColor * background_color +); + +/** + * \brief Retrieve the presentation queue's "current" time. + * \param[in] presentation_queue The queue to query. + * \param[out] current_time The current time, which may + * represent a point between display VSYNC events. + * \return VdpStatus The completion status of the operation. + */ +typedef VdpStatus VdpPresentationQueueGetTime( + VdpPresentationQueue presentation_queue, + /* output parameters follow */ + VdpTime * current_time +); + +/** + * \brief Enter a surface into the presentation queue. + * \param[in] presentation_queue The queue to query. + * \param[in] surface The surface to enter into the queue. + * \param[in] clip_width If set to a non-zero value, the presentation queue + * will display only clip_width pixels of the surface (anchored to the + * top-left corner of the surface. + * \param[in] clip_height If set to a non-zero value, the presentation queue + * will display only clip_height lines of the surface (anchored to the + * top-left corner of the surface. + * \param[in] earliest_presentation_time The timestamp + * associated with the surface. The presentation queue + * will not display the surface until the presentation + * queue's current time is at least this value. + * \return VdpStatus The completion status of the operation. + * + * Applications may choose to allow resizing of the presentation queue target + * (which may be e.g. a regular Window when using an X11-based + * implementation). + * + * \b clip_width and \b clip_height may be used to limit the size of the + * displayed region of a surface, in order to match the specific region that + * was rendered to. + * + * In turn, this allows the application to allocate over-sized (e.g. + * screen-sized) surfaces, but render to a region that matches the current + * size of the video window. + * + * Using this technique, an application's response to window resizing may + * simply be to render to, and display, a different region of the surface, + * rather than de-/re-allocation of surfaces to match the updated window size. + */ +typedef VdpStatus VdpPresentationQueueDisplay( + VdpPresentationQueue presentation_queue, + VdpOutputSurface surface, + uint32_t clip_width, + uint32_t clip_height, + VdpTime earliest_presentation_time +); + +/** + * \brief Wait for a surface to finish being displayed. + * \param[in] presentation_queue The queue to query. + * \param[in] surface The surface to wait for. + * \param[out] first_presentation_time The timestamp of the + * VSYNC at which this surface was first displayed. Note + * that 0 means the surface was never displayed. + * \return VdpStatus The completion status of the operation. + * + * Note that this API will block indefinitely if queried about + * the surface most recently added to a presentation queue, + * since there is no other surface that could possibly replace + * the queried surface. + */ +typedef VdpStatus VdpPresentationQueueBlockUntilSurfaceIdle( + VdpPresentationQueue presentation_queue, + VdpOutputSurface surface, + /* output parameters follow */ + VdpTime * first_presentation_time +); + +/** + * \hideinitializer + * \brief The status of a surface within a presentation queue. + */ +typedef enum { + /** The surface is no queued or currently visible. */ + VDP_PRESENTATION_QUEUE_STATUS_IDLE, + /** The surface is in the queue, and not currently visible. */ + VDP_PRESENTATION_QUEUE_STATUS_QUEUED, + /** The surface is the currently visible surface. */ + VDP_PRESENTATION_QUEUE_STATUS_VISIBLE, +} VdpPresentationQueueStatus; + +/** + * \brief Poll the current queue status of a surface. + * \param[in] presentation_queue The queue to query. + * \param[in] surface The surface to query. + * \param[out] status The current status of the surface within + * the queue. + * \param[out] first_presentation_time The timestamp of the + * VSYNC at which this surface was first displayed. Note + * that 0 means the surface was never displayed. + * \return VdpStatus The completion status of the operation. + */ +typedef VdpStatus VdpPresentationQueueQuerySurfaceStatus( + VdpPresentationQueue presentation_queue, + VdpOutputSurface surface, + /* output parameters follow */ + VdpPresentationQueueStatus * status, + VdpTime * first_presentation_time +); + +/*@}*/ + +/** + * \defgroup display_preemption Display Preemption + * + * The Window System may operate within a frame-work (such as + * Linux's VT switching) where the display is shared between the + * Window System (e.g. X) and some other output mechanism (e.g. + * the VT.) Given this scenario, the Window System's control of + * the display could be preempted, and restored, at any time. + * + * VDPAU does not mandate that implementations hide such + * preemptions from VDPAU client applications; doing so may + * impose extreme burdens upon VDPAU implementations. Equally, + * however, implementations are free to hide such preemptions + * from client applications. + * + * VDPAU allows implementations to inform the client application + * when such a preemption has occurred, and then refuse to + * continue further operation. + * + * Similarly, some form of fatal hardware error could prevent further + * operation of the VDPAU implementation, without a complete + * re-initialization. + * + * The following discusses the behavior of implementations that + * choose not to hide preemption from client applications. + * + * When preemption occurs, VDPAU internally destroys all + * objects; the client application need not do this. However, if + * the client application wishes to continue operation, it must + * recreate all objects that it uses. It is probable that this + * recreation will not succeed until the display ownership is + * restored to the Window System. + * + * Once preemption has occurred, all VDPAU entry points will + * return the specific error code \ref + * VDP_STATUS_DISPLAY_PREEMPTED. + * + * VDPAU client applications may also be notified of such + * preemptions and fatal errors via a callback. See \ref + * VdpPreemptionCallbackRegister for more details. + * + * @{ + */ + +/** + * \brief A callback to notify the client application that a + * device's display has been preempted. + * \param[in] device The device that had its display preempted. + * \param[in] context The client-supplied callback context + * information. + * \return void No return value + */ +typedef void VdpPreemptionCallback( + VdpDevice device, + void * context +); + +/** + * \brief Configure the display preemption callback. + * \param[in] device The device to be monitored for preemption. + * \param[in] callback The client application's callback + * function. If NULL, the callback is unregistered. + * \param[in] context The client-supplied callback context + * information. This information will be passed to the + * callback function if/when invoked. + * \return VdpStatus The completion status of the operation. + */ +typedef VdpStatus VdpPreemptionCallbackRegister( + VdpDevice device, + VdpPreemptionCallback callback, + void * context +); + +/*@}*/ + +/** + * \defgroup get_proc_address Entry Point Retrieval + * + * In order to facilitate multiple implementations of VDPAU + * co-existing within a single process, all functionality is + * available via function pointers. The mechanism to retrieve + * those function pointers is described below. + * + * @{ + */ + +/** + * \brief A type suitable for \ref VdpGetProcAddress + * "VdpGetProcAddress"'s \b function_id parameter. + */ +typedef uint32_t VdpFuncId; + +/** \hideinitializer */ +#define VDP_FUNC_ID_GET_ERROR_STRING (VdpFuncId)0 +/** \hideinitializer */ +#define VDP_FUNC_ID_GET_PROC_ADDRESS (VdpFuncId)1 +/** \hideinitializer */ +#define VDP_FUNC_ID_GET_API_VERSION (VdpFuncId)2 +/** \hideinitializer */ +#define VDP_FUNC_ID_GET_INFORMATION_STRING (VdpFuncId)4 +/** \hideinitializer */ +#define VDP_FUNC_ID_DEVICE_DESTROY (VdpFuncId)5 +/** \hideinitializer */ +#define VDP_FUNC_ID_GENERATE_CSC_MATRIX (VdpFuncId)6 +/** \hideinitializer */ +#define VDP_FUNC_ID_VIDEO_SURFACE_QUERY_CAPABILITIES (VdpFuncId)7 +/** \hideinitializer */ +#define VDP_FUNC_ID_VIDEO_SURFACE_QUERY_GET_PUT_BITS_Y_CB_CR_CAPABILITIES (VdpFuncId)8 +/** \hideinitializer */ +#define VDP_FUNC_ID_VIDEO_SURFACE_CREATE (VdpFuncId)9 +/** \hideinitializer */ +#define VDP_FUNC_ID_VIDEO_SURFACE_DESTROY (VdpFuncId)10 +/** \hideinitializer */ +#define VDP_FUNC_ID_VIDEO_SURFACE_GET_PARAMETERS (VdpFuncId)11 +/** \hideinitializer */ +#define VDP_FUNC_ID_VIDEO_SURFACE_GET_BITS_Y_CB_CR (VdpFuncId)12 +/** \hideinitializer */ +#define VDP_FUNC_ID_VIDEO_SURFACE_PUT_BITS_Y_CB_CR (VdpFuncId)13 +/** \hideinitializer */ +#define VDP_FUNC_ID_OUTPUT_SURFACE_QUERY_CAPABILITIES (VdpFuncId)14 +/** \hideinitializer */ +#define VDP_FUNC_ID_OUTPUT_SURFACE_QUERY_GET_PUT_BITS_NATIVE_CAPABILITIES (VdpFuncId)15 +/** \hideinitializer */ +#define VDP_FUNC_ID_OUTPUT_SURFACE_QUERY_PUT_BITS_INDEXED_CAPABILITIES (VdpFuncId)16 +/** \hideinitializer */ +#define VDP_FUNC_ID_OUTPUT_SURFACE_QUERY_PUT_BITS_Y_CB_CR_CAPABILITIES (VdpFuncId)17 +/** \hideinitializer */ +#define VDP_FUNC_ID_OUTPUT_SURFACE_CREATE (VdpFuncId)18 +/** \hideinitializer */ +#define VDP_FUNC_ID_OUTPUT_SURFACE_DESTROY (VdpFuncId)19 +/** \hideinitializer */ +#define VDP_FUNC_ID_OUTPUT_SURFACE_GET_PARAMETERS (VdpFuncId)20 +/** \hideinitializer */ +#define VDP_FUNC_ID_OUTPUT_SURFACE_GET_BITS_NATIVE (VdpFuncId)21 +/** \hideinitializer */ +#define VDP_FUNC_ID_OUTPUT_SURFACE_PUT_BITS_NATIVE (VdpFuncId)22 +/** \hideinitializer */ +#define VDP_FUNC_ID_OUTPUT_SURFACE_PUT_BITS_INDEXED (VdpFuncId)23 +/** \hideinitializer */ +#define VDP_FUNC_ID_OUTPUT_SURFACE_PUT_BITS_Y_CB_CR (VdpFuncId)24 +/** \hideinitializer */ +#define VDP_FUNC_ID_BITMAP_SURFACE_QUERY_CAPABILITIES (VdpFuncId)25 +/** \hideinitializer */ +#define VDP_FUNC_ID_BITMAP_SURFACE_CREATE (VdpFuncId)26 +/** \hideinitializer */ +#define VDP_FUNC_ID_BITMAP_SURFACE_DESTROY (VdpFuncId)27 +/** \hideinitializer */ +#define VDP_FUNC_ID_BITMAP_SURFACE_GET_PARAMETERS (VdpFuncId)28 +/** \hideinitializer */ +#define VDP_FUNC_ID_BITMAP_SURFACE_PUT_BITS_NATIVE (VdpFuncId)29 +/** \hideinitializer */ +#define VDP_FUNC_ID_OUTPUT_SURFACE_RENDER_OUTPUT_SURFACE (VdpFuncId)33 +/** \hideinitializer */ +#define VDP_FUNC_ID_OUTPUT_SURFACE_RENDER_BITMAP_SURFACE (VdpFuncId)34 +/** \hideinitializer */ +#define VDP_FUNC_ID_OUTPUT_SURFACE_RENDER_VIDEO_SURFACE_LUMA (VdpFuncId)35 +/** \hideinitializer */ +#define VDP_FUNC_ID_DECODER_QUERY_CAPABILITIES (VdpFuncId)36 +/** \hideinitializer */ +#define VDP_FUNC_ID_DECODER_CREATE (VdpFuncId)37 +/** \hideinitializer */ +#define VDP_FUNC_ID_DECODER_DESTROY (VdpFuncId)38 +/** \hideinitializer */ +#define VDP_FUNC_ID_DECODER_GET_PARAMETERS (VdpFuncId)39 +/** \hideinitializer */ +#define VDP_FUNC_ID_DECODER_RENDER (VdpFuncId)40 +/** \hideinitializer */ +#define VDP_FUNC_ID_VIDEO_MIXER_QUERY_FEATURE_SUPPORT (VdpFuncId)41 +/** \hideinitializer */ +#define VDP_FUNC_ID_VIDEO_MIXER_QUERY_PARAMETER_SUPPORT (VdpFuncId)42 +/** \hideinitializer */ +#define VDP_FUNC_ID_VIDEO_MIXER_QUERY_ATTRIBUTE_SUPPORT (VdpFuncId)43 +/** \hideinitializer */ +#define VDP_FUNC_ID_VIDEO_MIXER_QUERY_PARAMETER_VALUE_RANGE (VdpFuncId)44 +/** \hideinitializer */ +#define VDP_FUNC_ID_VIDEO_MIXER_QUERY_ATTRIBUTE_VALUE_RANGE (VdpFuncId)45 +/** \hideinitializer */ +#define VDP_FUNC_ID_VIDEO_MIXER_CREATE (VdpFuncId)46 +/** \hideinitializer */ +#define VDP_FUNC_ID_VIDEO_MIXER_SET_FEATURE_ENABLES (VdpFuncId)47 +/** \hideinitializer */ +#define VDP_FUNC_ID_VIDEO_MIXER_SET_ATTRIBUTE_VALUES (VdpFuncId)48 +/** \hideinitializer */ +#define VDP_FUNC_ID_VIDEO_MIXER_GET_FEATURE_SUPPORT (VdpFuncId)49 +/** \hideinitializer */ +#define VDP_FUNC_ID_VIDEO_MIXER_GET_FEATURE_ENABLES (VdpFuncId)50 +/** \hideinitializer */ +#define VDP_FUNC_ID_VIDEO_MIXER_GET_PARAMETER_VALUES (VdpFuncId)51 +/** \hideinitializer */ +#define VDP_FUNC_ID_VIDEO_MIXER_GET_ATTRIBUTE_VALUES (VdpFuncId)52 +/** \hideinitializer */ +#define VDP_FUNC_ID_VIDEO_MIXER_DESTROY (VdpFuncId)53 +/** \hideinitializer */ +#define VDP_FUNC_ID_VIDEO_MIXER_RENDER (VdpFuncId)54 +/** \hideinitializer */ +#define VDP_FUNC_ID_PRESENTATION_QUEUE_TARGET_DESTROY (VdpFuncId)55 +/** \hideinitializer */ +#define VDP_FUNC_ID_PRESENTATION_QUEUE_CREATE (VdpFuncId)56 +/** \hideinitializer */ +#define VDP_FUNC_ID_PRESENTATION_QUEUE_DESTROY (VdpFuncId)57 +/** \hideinitializer */ +#define VDP_FUNC_ID_PRESENTATION_QUEUE_SET_BACKGROUND_COLOR (VdpFuncId)58 +/** \hideinitializer */ +#define VDP_FUNC_ID_PRESENTATION_QUEUE_GET_BACKGROUND_COLOR (VdpFuncId)59 +/** \hideinitializer */ +#define VDP_FUNC_ID_PRESENTATION_QUEUE_GET_TIME (VdpFuncId)62 +/** \hideinitializer */ +#define VDP_FUNC_ID_PRESENTATION_QUEUE_DISPLAY (VdpFuncId)63 +/** \hideinitializer */ +#define VDP_FUNC_ID_PRESENTATION_QUEUE_BLOCK_UNTIL_SURFACE_IDLE (VdpFuncId)64 +/** \hideinitializer */ +#define VDP_FUNC_ID_PRESENTATION_QUEUE_QUERY_SURFACE_STATUS (VdpFuncId)65 +/** \hideinitializer */ +#define VDP_FUNC_ID_PREEMPTION_CALLBACK_REGISTER (VdpFuncId)66 + +#define VDP_FUNC_ID_BASE_WINSYS 0x1000 + +/** + * \brief Retrieve a VDPAU function pointer. + * \param[in] device The device that the function will operate + * against. + * \param[in] function_id The specific function to retrieve. + * \param[out] function_pointer The actual pointer for the + * application to call. + * \return VdpStatus The completion status of the operation. + */ +typedef VdpStatus VdpGetProcAddress( + VdpDevice device, + VdpFuncId function_id, + /* output parameters follow */ + void * * function_pointer +); + +/*@}*/ +/*@}*/ + +/** + * \defgroup api_winsys Window System Integration Layer + * + * The set of VDPAU functionality specific to an individual + * Windowing System. + */ + +#ifdef __cplusplus +} +#endif + +#endif + --- ffmpeg-0.5+svn20090706.orig/debian/patches/aac-regression.patch +++ ffmpeg-0.5+svn20090706/debian/patches/aac-regression.patch @@ -0,0 +1,220 @@ +fix aac playback regression + +patch taken from upstream svn: + +------------------------------------------------------------------------ +r17856 | alexc | 2009-03-06 20:47:01 +0100 (Fr, 06. Mär 2009) | 3 lines + +Fix the channel allocation bug/assumption (issue 800). +Approved by Rob on IRC. + +------------------------------------------------------------------------ +r17860 | alexc | 2009-03-06 23:36:24 +0100 (Fr, 06. Mär 2009) | 2 lines + +If we get an error from ff_aac_parse_header() we should not trust the +header info that it provides. + +------------------------------------------------------------------------ +r17861 | alexc | 2009-03-06 23:37:21 +0100 (Fr, 06. Mär 2009) | 2 lines + +Re-indent after last commit. + +------------------------------------------------------------------------ + +diff --git a/libavcodec/aac.c b/libavcodec/aac.c +index 80195c0..b6759dd 100644 +--- a/libavcodec/aac.c ++++ b/libavcodec/aac.c +@@ -97,6 +97,56 @@ static VLC vlc_scalefactors; + static VLC vlc_spectral[11]; + + ++static ChannelElement* get_che(AACContext *ac, int type, int elem_id) { ++ static const int8_t tags_per_config[16] = { 0, 1, 1, 2, 3, 3, 4, 5, 0, 0, 0, 0, 0, 0, 0, 0 }; ++ if (ac->tag_che_map[type][elem_id]) { ++ return ac->tag_che_map[type][elem_id]; ++ } ++ if (ac->tags_mapped >= tags_per_config[ac->m4ac.chan_config]) { ++ return NULL; ++ } ++ switch (ac->m4ac.chan_config) { ++ case 7: ++ if (ac->tags_mapped == 3 && type == TYPE_CPE) { ++ ac->tags_mapped++; ++ return ac->tag_che_map[TYPE_CPE][elem_id] = ac->che[TYPE_CPE][2]; ++ } ++ case 6: ++ /* Some streams incorrectly code 5.1 audio as SCE[0] CPE[0] CPE[1] SCE[1] ++ instead of SCE[0] CPE[0] CPE[0] LFE[0]. If we seem to have ++ encountered such a stream, transfer the LFE[0] element to SCE[1] */ ++ if (ac->tags_mapped == tags_per_config[ac->m4ac.chan_config] - 1 && (type == TYPE_LFE || type == TYPE_SCE)) { ++ ac->tags_mapped++; ++ return ac->tag_che_map[type][elem_id] = ac->che[TYPE_LFE][0]; ++ } ++ case 5: ++ if (ac->tags_mapped == 2 && type == TYPE_CPE) { ++ ac->tags_mapped++; ++ return ac->tag_che_map[TYPE_CPE][elem_id] = ac->che[TYPE_CPE][1]; ++ } ++ case 4: ++ if (ac->tags_mapped == 2 && ac->m4ac.chan_config == 4 && type == TYPE_SCE) { ++ ac->tags_mapped++; ++ return ac->tag_che_map[TYPE_SCE][elem_id] = ac->che[TYPE_SCE][1]; ++ } ++ case 3: ++ case 2: ++ if (ac->tags_mapped == (ac->m4ac.chan_config != 2) && type == TYPE_CPE) { ++ ac->tags_mapped++; ++ return ac->tag_che_map[TYPE_CPE][elem_id] = ac->che[TYPE_CPE][0]; ++ } else if (ac->m4ac.chan_config == 2) { ++ return NULL; ++ } ++ case 1: ++ if (!ac->tags_mapped && type == TYPE_SCE) { ++ ac->tags_mapped++; ++ return ac->tag_che_map[TYPE_SCE][elem_id] = ac->che[TYPE_SCE][0]; ++ } ++ default: ++ return NULL; ++ } ++} ++ + /** + * Configure output channel order based on the current program configuration element. + * +@@ -106,7 +156,7 @@ static VLC vlc_spectral[11]; + * @return Returns error status. 0 - OK, !0 - error + */ + static int output_configure(AACContext *ac, enum ChannelPosition che_pos[4][MAX_ELEM_ID], +- enum ChannelPosition new_che_pos[4][MAX_ELEM_ID]) { ++ enum ChannelPosition new_che_pos[4][MAX_ELEM_ID], int channel_config) { + AVCodecContext *avctx = ac->avccontext; + int i, type, channels = 0; + +@@ -140,7 +190,16 @@ static int output_configure(AACContext *ac, enum ChannelPosition che_pos[4][MAX_ + } + } + ++ if (channel_config) { ++ memset(ac->tag_che_map, 0, 4 * MAX_ELEM_ID * sizeof(ac->che[0][0])); ++ ac->tags_mapped = 0; ++ } else { ++ memcpy(ac->tag_che_map, ac->che, 4 * MAX_ELEM_ID * sizeof(ac->che[0][0])); ++ ac->tags_mapped = 4*MAX_ELEM_ID; ++ } ++ + avctx->channels = channels; ++ + return 0; + } + +@@ -286,7 +345,7 @@ static int decode_ga_specific_config(AACContext * ac, GetBitContext * gb, int ch + if((ret = set_default_channel_config(ac, new_che_pos, channel_config))) + return ret; + } +- if((ret = output_configure(ac, ac->che_pos, new_che_pos))) ++ if((ret = output_configure(ac, ac->che_pos, new_che_pos, channel_config))) + return ret; + + if (extension_flag) { +@@ -394,7 +453,7 @@ static av_cold int aac_decode_init(AVCodecContext * avccontext) { + memset(new_che_pos, 0, 4 * MAX_ELEM_ID * sizeof(new_che_pos[0][0])); + if(set_default_channel_config(ac, new_che_pos, avccontext->channels - (avccontext->channels == 8))) + return -1; +- if(output_configure(ac, ac->che_pos, new_che_pos)) ++ if(output_configure(ac, ac->che_pos, new_che_pos, 1)) + return -1; + ac->m4ac.sample_rate = avccontext->sample_rate; + } else { +@@ -1538,19 +1597,20 @@ static int parse_adts_frame_header(AACContext * ac, GetBitContext * gb) { + ac->m4ac.sample_rate = hdr_info.sample_rate; + ac->m4ac.sampling_index = hdr_info.sampling_index; + ac->m4ac.object_type = hdr_info.object_type; +- } +- if (hdr_info.num_aac_frames == 1) { +- if (!hdr_info.crc_absent) +- skip_bits(gb, 16); +- } else { +- ff_log_missing_feature(ac->avccontext, "More than one AAC RDB per ADTS frame is", 0); +- return -1; ++ if (hdr_info.num_aac_frames == 1) { ++ if (!hdr_info.crc_absent) ++ skip_bits(gb, 16); ++ } else { ++ ff_log_missing_feature(ac->avccontext, "More than one AAC RDB per ADTS frame is", 0); ++ return -1; ++ } + } + return size; + } + + static int aac_decode_frame(AVCodecContext * avccontext, void * data, int * data_size, const uint8_t * buf, int buf_size) { + AACContext * ac = avccontext->priv_data; ++ ChannelElement * che = NULL; + GetBitContext gb; + enum RawDataBlockType elem_type; + int err, elem_id, data_size_tmp; +@@ -1573,15 +1633,7 @@ static int aac_decode_frame(AVCodecContext * avccontext, void * data, int * data + elem_id = get_bits(&gb, 4); + err = -1; + +- if(elem_type == TYPE_SCE && elem_id == 1 && +- !ac->che[TYPE_SCE][elem_id] && ac->che[TYPE_LFE][0]) { +- /* Some streams incorrectly code 5.1 audio as SCE[0] CPE[0] CPE[1] SCE[1] +- instead of SCE[0] CPE[0] CPE[0] LFE[0]. If we seem to have +- encountered such a stream, transfer the LFE[0] element to SCE[1] */ +- ac->che[TYPE_SCE][elem_id] = ac->che[TYPE_LFE][0]; +- ac->che[TYPE_LFE][0] = NULL; +- } +- if(elem_type < TYPE_DSE && !ac->che[elem_type][elem_id]) { ++ if(elem_type < TYPE_DSE && !(che=get_che(ac, elem_type, elem_id))) { + av_log(ac->avccontext, AV_LOG_ERROR, "channel element %d.%d is not allocated\n", elem_type, elem_id); + return -1; + } +@@ -1589,19 +1641,19 @@ static int aac_decode_frame(AVCodecContext * avccontext, void * data, int * data + switch (elem_type) { + + case TYPE_SCE: +- err = decode_ics(ac, &ac->che[TYPE_SCE][elem_id]->ch[0], &gb, 0, 0); ++ err = decode_ics(ac, &che->ch[0], &gb, 0, 0); + break; + + case TYPE_CPE: +- err = decode_cpe(ac, &gb, ac->che[TYPE_CPE][elem_id]); ++ err = decode_cpe(ac, &gb, che); + break; + + case TYPE_CCE: +- err = decode_cce(ac, &gb, ac->che[TYPE_CCE][elem_id]); ++ err = decode_cce(ac, &gb, che); + break; + + case TYPE_LFE: +- err = decode_ics(ac, &ac->che[TYPE_LFE][elem_id]->ch[0], &gb, 0, 0); ++ err = decode_ics(ac, &che->ch[0], &gb, 0, 0); + break; + + case TYPE_DSE: +@@ -1615,7 +1667,7 @@ static int aac_decode_frame(AVCodecContext * avccontext, void * data, int * data + memset(new_che_pos, 0, 4 * MAX_ELEM_ID * sizeof(new_che_pos[0][0])); + if((err = decode_pce(ac, new_che_pos, &gb))) + break; +- err = output_configure(ac, ac->che_pos, new_che_pos); ++ err = output_configure(ac, ac->che_pos, new_che_pos, 0); + break; + } + + Modified libavcodec/aac.h +diff --git a/libavcodec/aac.h b/libavcodec/aac.h +index 66b2e22..32e7224 100644 +--- a/libavcodec/aac.h ++++ b/libavcodec/aac.h +@@ -260,6 +260,8 @@ typedef struct { + * first index as the first 4 raw data block types + */ + ChannelElement * che[4][MAX_ELEM_ID]; ++ ChannelElement * tag_che_map[4][MAX_ELEM_ID]; ++ int tags_mapped; + /** @} */ + + /** --- ffmpeg-0.5+svn20090706.orig/debian/patches/100_kfreebsd +++ ffmpeg-0.5+svn20090706/debian/patches/100_kfreebsd @@ -0,0 +1,16 @@ +From: Aurelien Jarno +Subject: [PATCH] Fix FTBFS for kfreebsd +X-Upstream-Discussion: + +========================================================================== +--- a/configure ++++ b/configure +@@ -1649,6 +1649,8 @@ case $target_os in + interix) + disable vhook + ;; ++ gnu/kfreebsd) ++ ;; + + *) + die "Unknown OS '$target_os'." --- ffmpeg-0.5+svn20090706.orig/debian/patches/ffmpeg-debian_hurd.patch +++ ffmpeg-0.5+svn20090706/debian/patches/ffmpeg-debian_hurd.patch @@ -0,0 +1,14 @@ +Fix build failures for the GNU Hurd OS +=================================================================== +--- a/configure ++++ b/configure +@@ -1651,6 +1651,9 @@ case $target_os in + ;; + gnu/kfreebsd) + ;; ++ gnu) ++ disable dv1394 ++ ;; + + *) + die "Unknown OS '$target_os'." --- ffmpeg-0.5+svn20090706.orig/debian/patches/i386-fpic-workaround.patch +++ ffmpeg-0.5+svn20090706/debian/patches/i386-fpic-workaround.patch @@ -0,0 +1,21 @@ +Workaround to get ffmpeg packages built with i386 using -fPIC. +This disables -fPIC for the problematic files. +========================================================================== +--- a/Makefile ++++ b/Makefile +@@ -83,6 +83,15 @@ + + VHOOKCFLAGS += $(filter-out -mdynamic-no-pic,$(CFLAGS)) + ++# Disable use of -fPIC on problematic files for i386 ++ifeq (,$(findstring i386 i486 i586 i686,$(shell uname -m))) ++I386CFLAGS += $(filter-out -fPIC -DPIC,$(CFLAGS)) ++libavcodec/x86/dsputil_mmx.o: libavcodec/x86/dsputil_mmx.c ++ $(CC) $(I386CFLAGS) $(LIBOBJFLAGS) -c -o $@ $< ++libavcodec/x86/flacdsp_mmx.o: libavcodec/x86/flacdsp_mmx.c ++ $(CC) $(I386CFLAGS) $(LIBOBJFLAGS) -c -o $@ $< ++endif ++ + BASEHOOKS = fish null watermark + ALLHOOKS = $(BASEHOOKS) drawtext imlib2 ppm + ALLHOOKS_SRCS = $(addprefix vhook/, $(addsuffix .c, $(ALLHOOKS))) --- ffmpeg-0.5+svn20090706.orig/debian/patches/fpic-libswscale-fix.patch +++ ffmpeg-0.5+svn20090706/debian/patches/fpic-libswscale-fix.patch @@ -0,0 +1,578 @@ +This patch is currently being worked on to resolve all non-PIC issues with +the libswscale library. +For inquiries about this patch, please see bug #528080. +========================================================================== +--- a/libswscale/rgb2rgb_template.c ++++ b/libswscale/rgb2rgb_template.c +@@ -1424,9 +1424,12 @@ + __asm__ volatile ( + "test %%"REG_a", %%"REG_a" \n\t" + "jns 2f \n\t" +- "movq "MANGLE(mask24r)", %%mm5 \n\t" +- "movq "MANGLE(mask24g)", %%mm6 \n\t" +- "movq "MANGLE(mask24b)", %%mm7 \n\t" ++ "movq %0, %%mm5 \n\t" ++ "movq %1, %%mm6 \n\t" ++ "movq %2, %%mm7 \n\t" ++ : : "m"(mask24r), "m"(mask24g), "m"(mask24b) ++ ); ++ __asm__ volatile ( + ASMALIGN(4) + "1: \n\t" + PREFETCH" 32(%1, %%"REG_a") \n\t" +@@ -2147,8 +2150,8 @@ + { + __asm__ volatile( + "mov %2, %%"REG_a" \n\t" +- "movq "MANGLE(ff_bgr2YCoeff)", %%mm6 \n\t" +- "movq "MANGLE(ff_w1111)", %%mm5 \n\t" ++ "movq %3, %%mm6 \n\t" ++ "movq %4, %%mm5 \n\t" + "pxor %%mm7, %%mm7 \n\t" + "lea (%%"REG_a", %%"REG_a", 2), %%"REG_d" \n\t" + ASMALIGN(4) +@@ -2206,12 +2209,13 @@ + "psraw $7, %%mm4 \n\t" + + "packuswb %%mm4, %%mm0 \n\t" +- "paddusb "MANGLE(ff_bgr2YOffset)", %%mm0 \n\t" ++ "paddusb %5, %%mm0 \n\t" + + MOVNTQ" %%mm0, (%1, %%"REG_a") \n\t" + "add $8, %%"REG_a" \n\t" + " js 1b \n\t" +- : : "r" (src+width*3), "r" (ydst+width), "g" (-width) ++ : : "r" (src+width*3), "r" (ydst+width), "g" (-width), ++ "m"(ff_bgr2YCoeff), "m"(ff_w1111), "m"(ff_bgr2YOffset) + : "%"REG_a, "%"REG_d + ); + ydst += lumStride; +@@ -2220,8 +2224,8 @@ + src -= srcStride*2; + __asm__ volatile( + "mov %4, %%"REG_a" \n\t" +- "movq "MANGLE(ff_w1111)", %%mm5 \n\t" +- "movq "MANGLE(ff_bgr2UCoeff)", %%mm6 \n\t" ++ "movq %5, %%mm5 \n\t" ++ "movq %6, %%mm6 \n\t" + "pxor %%mm7, %%mm7 \n\t" + "lea (%%"REG_a", %%"REG_a", 2), %%"REG_d" \n\t" + "add %%"REG_d", %%"REG_d" \n\t" +@@ -2270,8 +2274,8 @@ + "psrlw $2, %%mm0 \n\t" + "psrlw $2, %%mm2 \n\t" + #endif +- "movq "MANGLE(ff_bgr2VCoeff)", %%mm1 \n\t" +- "movq "MANGLE(ff_bgr2VCoeff)", %%mm3 \n\t" ++ "movq %7, %%mm1 \n\t" ++ "movq %7, %%mm3 \n\t" + + "pmaddwd %%mm0, %%mm1 \n\t" + "pmaddwd %%mm2, %%mm3 \n\t" +@@ -2328,12 +2332,12 @@ + "paddw %%mm1, %%mm5 \n\t" + "paddw %%mm3, %%mm2 \n\t" + "paddw %%mm5, %%mm2 \n\t" +- "movq "MANGLE(ff_w1111)", %%mm5 \n\t" ++ "movq %5, %%mm5 \n\t" + "psrlw $2, %%mm4 \n\t" + "psrlw $2, %%mm2 \n\t" + #endif +- "movq "MANGLE(ff_bgr2VCoeff)", %%mm1 \n\t" +- "movq "MANGLE(ff_bgr2VCoeff)", %%mm3 \n\t" ++ "movq %7, %%mm1 \n\t" ++ "movq %7, %%mm3 \n\t" + + "pmaddwd %%mm4, %%mm1 \n\t" + "pmaddwd %%mm2, %%mm3 \n\t" +@@ -2357,13 +2361,16 @@ + "punpckldq %%mm4, %%mm0 \n\t" + "punpckhdq %%mm4, %%mm1 \n\t" + "packsswb %%mm1, %%mm0 \n\t" +- "paddb "MANGLE(ff_bgr2UVOffset)", %%mm0 \n\t" ++ "paddb %8, %%mm0 \n\t" + "movd %%mm0, (%2, %%"REG_a") \n\t" + "punpckhdq %%mm0, %%mm0 \n\t" + "movd %%mm0, (%3, %%"REG_a") \n\t" + "add $4, %%"REG_a" \n\t" + " js 1b \n\t" +- : : "r" (src+chromWidth*6), "r" (src+srcStride+chromWidth*6), "r" (udst+chromWidth), "r" (vdst+chromWidth), "g" (-chromWidth) ++ : : "r" (src+chromWidth*6), "r" (src+srcStride+chromWidth*6), ++ "r" (udst+chromWidth), "r" (vdst+chromWidth), "g" (-chromWidth), ++ "m"(ff_w1111), "m"(ff_bgr2UCoeff), "m"(ff_bgr2VCoeff), ++ "m"(ff_bgr2UVOffset) + : "%"REG_a, "%"REG_d + ); + +--- a/libswscale/rgb2rgb.c ++++ b/libswscale/rgb2rgb.c +@@ -123,6 +123,18 @@ + DECLARE_ASM_CONST(8, uint64_t, red_15mask) = 0x00007c0000007c00ULL; + DECLARE_ASM_CONST(8, uint64_t, green_15mask) = 0x000003e0000003e0ULL; + DECLARE_ASM_CONST(8, uint64_t, blue_15mask) = 0x0000001f0000001fULL; ++ ++// Some constants from swscale.c that are used here ++extern const uint64_t __attribute__((visibility("hidden"))) ff_bgr2YCoeff; ++extern const uint64_t __attribute__((visibility("hidden"))) ff_bgr2UCoeff; ++extern const uint64_t __attribute__((visibility("hidden"))) ff_bgr2VCoeff; ++extern const uint64_t __attribute__((visibility("hidden"))) ff_bgr2YOffset; ++extern const uint64_t __attribute__((visibility("hidden"))) ff_bgr2UVOffset; ++extern const uint64_t __attribute__((visibility("hidden"))) ff_w1111; ++extern const uint64_t __attribute__((visibility("hidden"))) ff_M24A; ++extern const uint64_t __attribute__((visibility("hidden"))) ff_M24B; ++extern const uint64_t __attribute__((visibility("hidden"))) ff_M24C; ++ + #endif /* ARCH_X86 */ + + #define RGB2YUV_SHIFT 8 +--- a/libswscale/swscale_template.c ++++ b/libswscale/swscale_template.c +@@ -669,9 +669,9 @@ + #define WRITEBGR32(dst, dstw, index, b, g, r, a, q0, q2, q3, t) REAL_WRITEBGR32(dst, dstw, index, b, g, r, a, q0, q2, q3, t) + + #define REAL_WRITERGB16(dst, dstw, index) \ +- "pand "MANGLE(bF8)", %%mm2 \n\t" /* B */\ +- "pand "MANGLE(bFC)", %%mm4 \n\t" /* G */\ +- "pand "MANGLE(bF8)", %%mm5 \n\t" /* R */\ ++ "pand %6, %%mm2 \n\t" /* B */\ ++ "pand %7, %%mm4 \n\t" /* G */\ ++ "pand %6, %%mm5 \n\t" /* R */\ + "psrlq $3, %%mm2 \n\t"\ + \ + "movq %%mm2, %%mm1 \n\t"\ +@@ -695,11 +695,18 @@ + "cmp "#dstw", "#index" \n\t"\ + " jb 1b \n\t" + #define WRITERGB16(dst, dstw, index) REAL_WRITERGB16(dst, dstw, index) ++#define WRITERGB16_END \ ++ :: "r" (&c->redDither), \ ++ "m" (dummy), "m" (dummy), "m" (dummy),\ ++ "r" (dest), "m" (dstW), "m" (bF8), \ ++ "m" (bFC) \ ++ : "%"REG_a, "%"REG_d, "%"REG_S \ ++ ); + + #define REAL_WRITERGB15(dst, dstw, index) \ +- "pand "MANGLE(bF8)", %%mm2 \n\t" /* B */\ +- "pand "MANGLE(bF8)", %%mm4 \n\t" /* G */\ +- "pand "MANGLE(bF8)", %%mm5 \n\t" /* R */\ ++ "pand %6, %%mm2 \n\t" /* B */\ ++ "pand %6, %%mm4 \n\t" /* G */\ ++ "pand %6, %%mm5 \n\t" /* R */\ + "psrlq $3, %%mm2 \n\t"\ + "psrlq $1, %%mm5 \n\t"\ + \ +@@ -724,6 +731,12 @@ + "cmp "#dstw", "#index" \n\t"\ + " jb 1b \n\t" + #define WRITERGB15(dst, dstw, index) REAL_WRITERGB15(dst, dstw, index) ++#define WRITERGB15_END \ ++ :: "r" (&c->redDither), \ ++ "m" (dummy), "m" (dummy), "m" (dummy),\ ++ "r" (dest), "m" (dstW), "m" (bF8) \ ++ : "%"REG_a, "%"REG_d, "%"REG_S \ ++ ); + + #define WRITEBGR24OLD(dst, dstw, index) \ + /* mm2=B, %%mm4=G, %%mm5=R, %%mm7=0 */\ +@@ -1063,7 +1076,7 @@ + #endif + + WRITERGB15(%4, %5, %%REGa) +- YSCALEYUV2PACKEDX_END ++ WRITERGB15_END + return; + case PIX_FMT_RGB565: + YSCALEYUV2PACKEDX_ACCURATE +@@ -1077,7 +1090,7 @@ + #endif + + WRITERGB16(%4, %5, %%REGa) +- YSCALEYUV2PACKEDX_END ++ WRITERGB16_END + return; + case PIX_FMT_YUYV422: + YSCALEYUV2PACKEDX_ACCURATE +@@ -1127,7 +1140,7 @@ + #endif + + WRITERGB15(%4, %5, %%REGa) +- YSCALEYUV2PACKEDX_END ++ WRITERGB15_END + return; + case PIX_FMT_RGB565: + YSCALEYUV2PACKEDX +@@ -1141,7 +1154,7 @@ + #endif + + WRITERGB16(%4, %5, %%REGa) +- YSCALEYUV2PACKEDX_END ++ WRITERGB16_END + return; + case PIX_FMT_YUYV422: + YSCALEYUV2PACKEDX +@@ -1238,7 +1251,7 @@ + "mov "ESP_OFFSET"(%5), %%"REG_b" \n\t" + + :: "c" (buf0), "d" (buf1), "S" (uvbuf0), "D" (uvbuf1), "m" (dest), +- "a" (&c->redDither) ++ "a" (&c->redDither), "m" (bF8) + ); + return; + case PIX_FMT_RGB565: +@@ -1259,7 +1272,7 @@ + "pop %%"REG_BP" \n\t" + "mov "ESP_OFFSET"(%5), %%"REG_b" \n\t" + :: "c" (buf0), "d" (buf1), "S" (uvbuf0), "D" (uvbuf1), "m" (dest), +- "a" (&c->redDither) ++ "a" (&c->redDither), "m" (bF8), "m" (bFC) + ); + return; + case PIX_FMT_YUYV422: +@@ -1354,7 +1367,7 @@ + "mov "ESP_OFFSET"(%5), %%"REG_b" \n\t" + + :: "c" (buf0), "d" (buf1), "S" (uvbuf0), "D" (uvbuf1), "m" (dest), +- "a" (&c->redDither) ++ "a" (&c->redDither), "m" (bF8) + ); + return; + case PIX_FMT_RGB565: +@@ -1376,7 +1389,7 @@ + "mov "ESP_OFFSET"(%5), %%"REG_b" \n\t" + + :: "c" (buf0), "d" (buf1), "S" (uvbuf0), "D" (uvbuf1), "m" (dest), +- "a" (&c->redDither) ++ "a" (&c->redDither), "m" (bF8), "m" (bFC) + ); + return; + case PIX_FMT_YUYV422: +@@ -1447,7 +1460,7 @@ + "mov "ESP_OFFSET"(%5), %%"REG_b" \n\t" + + :: "c" (buf0), "d" (buf1), "S" (uvbuf0), "D" (uvbuf1), "m" (dest), +- "a" (&c->redDither) ++ "a" (&c->redDither), "m" (bF8) + ); + return; + case PIX_FMT_RGB565: +@@ -1469,7 +1482,7 @@ + "mov "ESP_OFFSET"(%5), %%"REG_b" \n\t" + + :: "c" (buf0), "d" (buf1), "S" (uvbuf0), "D" (uvbuf1), "m" (dest), +- "a" (&c->redDither) ++ "a" (&c->redDither), "m" (bF8), "m" (bFC) + ); + return; + case PIX_FMT_YUYV422: +@@ -1504,7 +1517,7 @@ + { + #if HAVE_MMX + __asm__ volatile( +- "movq "MANGLE(bm01010101)", %%mm2 \n\t" ++ "movq %3, %%mm2 \n\t" + "mov %0, %%"REG_a" \n\t" + "1: \n\t" + "movq (%1, %%"REG_a",2), %%mm0 \n\t" +@@ -1515,7 +1528,7 @@ + "movq %%mm0, (%2, %%"REG_a") \n\t" + "add $8, %%"REG_a" \n\t" + " js 1b \n\t" +- : : "g" (-width), "r" (src+width*2), "r" (dst+width) ++ : : "g" (-width), "r" (src+width*2), "r" (dst+width), "m"(bm01010101) + : "%"REG_a + ); + #else +@@ -1529,7 +1542,7 @@ + { + #if HAVE_MMX + __asm__ volatile( +- "movq "MANGLE(bm01010101)", %%mm4 \n\t" ++ "movq %4, %%mm4 \n\t" + "mov %0, %%"REG_a" \n\t" + "1: \n\t" + "movq (%1, %%"REG_a",4), %%mm0 \n\t" +@@ -1546,7 +1559,8 @@ + "movd %%mm1, (%2, %%"REG_a") \n\t" + "add $4, %%"REG_a" \n\t" + " js 1b \n\t" +- : : "g" (-width), "r" (src1+width*4), "r" (dstU+width), "r" (dstV+width) ++ : : "g" (-width), "r" (src1+width*4), "r" (dstU+width), "r" (dstV+width), ++ "m"(bm01010101) + : "%"REG_a + ); + #else +@@ -1590,7 +1604,7 @@ + { + #if HAVE_MMX + __asm__ volatile( +- "movq "MANGLE(bm01010101)", %%mm4 \n\t" ++ "movq %4, %%mm4 \n\t" + "mov %0, %%"REG_a" \n\t" + "1: \n\t" + "movq (%1, %%"REG_a",4), %%mm0 \n\t" +@@ -1607,7 +1621,8 @@ + "movd %%mm1, (%2, %%"REG_a") \n\t" + "add $4, %%"REG_a" \n\t" + " js 1b \n\t" +- : : "g" (-width), "r" (src1+width*4), "r" (dstU+width), "r" (dstV+width) ++ : : "g" (-width), "r" (src1+width*4), "r" (dstU+width), "r" (dstV+width), ++ "m"(bm01010101) + : "%"REG_a + ); + #else +@@ -1688,20 +1703,20 @@ + + if(srcFormat == PIX_FMT_BGR24){ + __asm__ volatile( +- "movq "MANGLE(ff_bgr24toY1Coeff)", %%mm5 \n\t" +- "movq "MANGLE(ff_bgr24toY2Coeff)", %%mm6 \n\t" +- : ++ "movq %0, %%mm5 \n\t" ++ "movq %1, %%mm6 \n\t" ++ : : "m"(ff_bgr24toY1Coeff), "m"(ff_bgr24toY2Coeff) + ); + }else{ + __asm__ volatile( +- "movq "MANGLE(ff_rgb24toY1Coeff)", %%mm5 \n\t" +- "movq "MANGLE(ff_rgb24toY2Coeff)", %%mm6 \n\t" +- : ++ "movq %0, %%mm5 \n\t" ++ "movq %1, %%mm6 \n\t" ++ : : "m"(ff_rgb24toY1Coeff), "m"(ff_rgb24toY2Coeff) + ); + } + + __asm__ volatile( +- "movq "MANGLE(ff_bgr24toYOffset)", %%mm4 \n\t" ++ "movq %3, %%mm4 \n\t" + "mov %2, %%"REG_a" \n\t" + "pxor %%mm7, %%mm7 \n\t" + "1: \n\t" +@@ -1731,7 +1746,7 @@ + "add $4, %%"REG_a" \n\t" + " js 1b \n\t" + : "+r" (src) +- : "r" (dst+width), "g" (-width) ++ : "r" (dst+width), "g" (-width), "m"(ff_bgr24toYOffset) + : "%"REG_a + ); + } +@@ -1771,7 +1786,7 @@ + "paddd %%mm3, %%mm1 \n\t" + "paddd %%mm5, %%mm4 \n\t" + +- "movq "MANGLE(ff_bgr24toUVOffset)", %%mm3 \n\t" ++ "movq %4, %%mm3 \n\t" + "paddd %%mm3, %%mm0 \n\t" + "paddd %%mm3, %%mm2 \n\t" + "paddd %%mm3, %%mm1 \n\t" +@@ -1789,7 +1804,8 @@ + "add $4, %%"REG_a" \n\t" + " js 1b \n\t" + : "+r" (src) +- : "r" (dstU+width), "r" (dstV+width), "g" (-width), "m"(ff_bgr24toUV[srcFormat == PIX_FMT_RGB24][0]) ++ : "r" (dstU+width), "r" (dstV+width), "g" (-width), ++ "m"(ff_bgr24toUV[srcFormat == PIX_FMT_RGB24][0]), "m"(ff_bgr24toUVOffset) + : "%"REG_a + ); + } +--- a/libswscale/yuv2rgb_template.c ++++ b/libswscale/yuv2rgb_template.c +@@ -74,7 +74,7 @@ + \ + /* convert the luma part */\ + "movq %%mm6, %%mm7;" /* Copy 8 Y Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0 */\ +- "pand "MANGLE(mmx_00ffw)", %%mm6;" /* get Y even 00 Y6 00 Y4 00 Y2 00 Y0 */\ ++ "pand %9, %%mm6;" /* get Y even 00 Y6 00 Y4 00 Y2 00 Y0 */\ + \ + "psrlw $8, %%mm7;" /* get Y odd 00 Y7 00 Y5 00 Y3 00 Y1 */\ + \ +@@ -158,21 +158,63 @@ + PREFETCH" 64(%2) \n\t" \ + */ \ + +-#define YUV2RGB_ENDLOOP(depth) \ ++#define YUV2RGB16_ENDLOOP(depth) \ + "add $"AV_STRINGIFY(depth*8)", %1 \n\t" \ + "add $4, %0 \n\t" \ + " js 1b \n\t" \ + \ + : "+r" (index), "+r" (image) \ +- : "r" (pu - index), "r" (pv - index), "r"(&c->redDither), "r" (py - 2*index) \ ++ : "r" (pu - index), "r" (pv - index), "r"(&c->redDither), "r" (py - 2*index), \ ++ "m"(mmx_redmask), "m"(mmx_grnmask), "m"(dummy), "m"(mmx_00ffw) \ + ); \ + } \ + __asm__ volatile (EMMS); \ + return srcSliceH; \ + ++#define YUV2RGB15_ENDLOOP(depth) \ ++ "add $"AV_STRINGIFY(depth*8)", %1 \n\t" \ ++ "add $4, %0 \n\t" \ ++ " js 1b \n\t" \ ++\ ++ : "+r" (index), "+r" (image) \ ++ : "r" (pu - index), "r" (pv - index), "r"(&c->redDither), "r" (py - 2*index), \ ++ "m"(mmx_redmask), "m"(dummy), "m"(dummy), "m"(mmx_00ffw) \ ++ ); \ ++ } \ ++ __asm__ volatile (EMMS); \ ++ return srcSliceH; \ ++ ++#define YUV2RGB24_ENDLOOP(depth) \ ++ "add $"AV_STRINGIFY(depth*8)", %1 \n\t" \ ++ "add $4, %0 \n\t" \ ++ " js 1b \n\t" \ ++\ ++ : "+r" (index), "+r" (image) \ ++ : "r" (pu - index), "r" (pv - index), "r"(&c->redDither), "r" (py - 2*index), \ ++ "m"(ff_M24A), "m"(ff_M24C), "m"(ff_M24B), "m"(mmx_00ffw) \ ++ ); \ ++ } \ ++ __asm__ volatile (EMMS); \ ++ return srcSliceH; \ ++ ++#define YUV2RGB32_ENDLOOP(depth) \ ++ "add $"AV_STRINGIFY(depth*8)", %1 \n\t" \ ++ "add $4, %0 \n\t" \ ++ " js 1b \n\t" \ ++\ ++ : "+r" (index), "+r" (image) \ ++ : "r" (pu - index), "r" (pv - index), "r"(&c->redDither), "r" (py - 2*index), \ ++ "m"(dummy), "m"(dummy), "m"(dummy), "m"(mmx_00ffw) \ ++ ); \ ++ } \ ++ __asm__ volatile (EMMS); \ ++ return srcSliceH; \ ++ ++ + static inline int RENAME(yuv420_rgb16)(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY, + int srcSliceH, uint8_t* dst[], int dstStride[]){ + int y, h_size; ++ long dummy=0; + + YUV422_UNSHIFT + YUV2RGB_LOOP(2) +@@ -190,9 +232,9 @@ + "paddusb "RED_DITHER"(%4), %%mm1;" + #endif + /* mask unneeded bits off */ +- "pand "MANGLE(mmx_redmask)", %%mm0;" /* b7b6b5b4 b3_0_0_0 b7b6b5b4 b3_0_0_0 */ +- "pand "MANGLE(mmx_grnmask)", %%mm2;" /* g7g6g5g4 g3g2_0_0 g7g6g5g4 g3g2_0_0 */ +- "pand "MANGLE(mmx_redmask)", %%mm1;" /* r7r6r5r4 r3_0_0_0 r7r6r5r4 r3_0_0_0 */ ++ "pand %6, %%mm0;" /* b7b6b5b4 b3_0_0_0 b7b6b5b4 b3_0_0_0 */ ++ "pand %7, %%mm2;" /* g7g6g5g4 g3g2_0_0 g7g6g5g4 g3g2_0_0 */ ++ "pand %6, %%mm1;" /* r7r6r5r4 r3_0_0_0 r7r6r5r4 r3_0_0_0 */ + + "psrlw $3, %%mm0;" /* 0_0_0_b7 b6b5b4b3 0_0_0_b7 b6b5b4b3 */ + "pxor %%mm4, %%mm4;" /* zero mm4 */ +@@ -222,12 +264,13 @@ + + MOVNTQ " %%mm5, 8 (%1);" /* store pixel 4-7 */ + +- YUV2RGB_ENDLOOP(2) ++ YUV2RGB16_ENDLOOP(2) + } + + static inline int RENAME(yuv420_rgb15)(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY, + int srcSliceH, uint8_t* dst[], int dstStride[]){ + int y, h_size; ++ long dummy=0; + + YUV422_UNSHIFT + YUV2RGB_LOOP(2) +@@ -246,9 +289,9 @@ + #endif + + /* mask unneeded bits off */ +- "pand "MANGLE(mmx_redmask)", %%mm0;" /* b7b6b5b4 b3_0_0_0 b7b6b5b4 b3_0_0_0 */ +- "pand "MANGLE(mmx_redmask)", %%mm2;" /* g7g6g5g4 g3_0_0_0 g7g6g5g4 g3_0_0_0 */ +- "pand "MANGLE(mmx_redmask)", %%mm1;" /* r7r6r5r4 r3_0_0_0 r7r6r5r4 r3_0_0_0 */ ++ "pand %6, %%mm0;" /* b7b6b5b4 b3_0_0_0 b7b6b5b4 b3_0_0_0 */ ++ "pand %6, %%mm2;" /* g7g6g5g4 g3_0_0_0 g7g6g5g4 g3_0_0_0 */ ++ "pand %6, %%mm1;" /* r7r6r5r4 r3_0_0_0 r7r6r5r4 r3_0_0_0 */ + + "psrlw $3, %%mm0;" /* 0_0_0_b7 b6b5b4b3 0_0_0_b7 b6b5b4b3 */ + "psrlw $1, %%mm1;" /* 0_r7r6r5 r4r3_0_0 0_r7r6r5 r4r3_0_0 */ +@@ -279,12 +322,13 @@ + + MOVNTQ " %%mm5, 8 (%1);" /* store pixel 4-7 */ + +- YUV2RGB_ENDLOOP(2) ++ YUV2RGB15_ENDLOOP(2) + } + + static inline int RENAME(yuv420_rgb24)(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY, + int srcSliceH, uint8_t* dst[], int dstStride[]){ + int y, h_size; ++ long dummy=0; + + YUV422_UNSHIFT + YUV2RGB_LOOP(3) +@@ -293,8 +337,8 @@ + YUV2RGB + /* mm0=B, %%mm2=G, %%mm1=R */ + #if HAVE_MMX2 +- "movq "MANGLE(ff_M24A)", %%mm4 \n\t" +- "movq "MANGLE(ff_M24C)", %%mm7 \n\t" ++ "movq %6, %%mm4 \n\t" ++ "movq %7, %%mm7 \n\t" + "pshufw $0x50, %%mm0, %%mm5 \n\t" /* B3 B2 B3 B2 B1 B0 B1 B0 */ + "pshufw $0x50, %%mm2, %%mm3 \n\t" /* G3 G2 G3 G2 G1 G0 G1 G0 */ + "pshufw $0x00, %%mm1, %%mm6 \n\t" /* R1 R0 R1 R0 R1 R0 R1 R0 */ +@@ -313,7 +357,7 @@ + "pshufw $0x55, %%mm2, %%mm3 \n\t" /* G4 G3 G4 G3 G4 G3 G4 G3 */ + "pshufw $0xA5, %%mm1, %%mm6 \n\t" /* R5 R4 R5 R4 R3 R2 R3 R2 */ + +- "pand "MANGLE(ff_M24B)", %%mm5 \n\t" /* B5 B4 B3 */ ++ "pand %8, %%mm5 \n\t" /* B5 B4 B3 */ + "pand %%mm7, %%mm3 \n\t" /* G4 G3 */ + "pand %%mm4, %%mm6 \n\t" /* R4 R3 R2 */ + +@@ -328,7 +372,7 @@ + + "pand %%mm7, %%mm5 \n\t" /* B7 B6 */ + "pand %%mm4, %%mm3 \n\t" /* G7 G6 G5 */ +- "pand "MANGLE(ff_M24B)", %%mm6 \n\t" /* R7 R6 R5 */ ++ "pand %8, %%mm6 \n\t" /* R7 R6 R5 */ + "movd 4 (%3, %0), %%mm1;" /* Load 4 Cr 00 00 00 00 v3 v2 v1 v0 */ + \ + "por %%mm5, %%mm3 \n\t" +@@ -393,7 +437,7 @@ + "pxor %%mm4, %%mm4 \n\t" + #endif + +- YUV2RGB_ENDLOOP(3) ++ YUV2RGB24_ENDLOOP(3) + } + + #define RGB_PLANAR2PACKED32 \ +@@ -440,6 +484,7 @@ + static inline int RENAME(yuv420_rgb32)(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY, + int srcSliceH, uint8_t* dst[], int dstStride[]){ + int y, h_size; ++ long dummy=0; + + YUV422_UNSHIFT + YUV2RGB_LOOP(4) +@@ -449,5 +494,5 @@ + "pcmpeqd %%mm3, %%mm3;" /* fill mm3 */ + RGB_PLANAR2PACKED32 + +- YUV2RGB_ENDLOOP(4) ++ YUV2RGB32_ENDLOOP(4) + } +--- a/libswscale/yuv2rgb.c ++++ b/libswscale/yuv2rgb.c +@@ -47,6 +47,10 @@ + DECLARE_ASM_CONST(8, uint64_t, mmx_redmask) = 0xf8f8f8f8f8f8f8f8ULL; + DECLARE_ASM_CONST(8, uint64_t, mmx_grnmask) = 0xfcfcfcfcfcfcfcfcULL; + ++extern const uint64_t __attribute__((visibility("hidden"))) ff_M24A; ++extern const uint64_t __attribute__((visibility("hidden"))) ff_M24B; ++extern const uint64_t __attribute__((visibility("hidden"))) ff_M24C; ++ + //MMX versions + #undef RENAME + #undef HAVE_MMX2 --- ffmpeg-0.5+svn20090706.orig/debian/patches/fix-dv-seeking.patch +++ ffmpeg-0.5+svn20090706/debian/patches/fix-dv-seeking.patch @@ -0,0 +1,65 @@ +fix seeking in DIF (DV) movies, closes Bug: #540424 + +Thanks to Dan Dennedy for identifying the patch! + +------------------------------------------------------------------------ +r19192 | bcoudurier | 2009-06-15 00:34:28 +0200 (Mo, 15. Jun 2009) | 1 line + +check if frame size matches old sys and assumes corrupted input, fixes #1192 +------------------------------------------------------------------------ + +--- a/libavcodec/dv.c ++++ b/libavcodec/dv.c +@@ -1115,7 +1115,7 @@ static int dvvideo_decode_frame(AVCodecC + { + DVVideoContext *s = avctx->priv_data; + +- s->sys = dv_frame_profile(buf); ++ s->sys = dv_frame_profile(s->sys, buf, buf_size); + if (!s->sys || buf_size < s->sys->frame_size || dv_init_dynamic_tables(s->sys)) + return -1; /* NOTE: we only accept several full frames */ + +--- a/libavcodec/dvdata.h ++++ b/libavcodec/dvdata.h +@@ -698,7 +698,9 @@ enum dv_pack_type { + */ + #define DV_MAX_BPM 8 + +-static inline const DVprofile* dv_frame_profile(const uint8_t* frame) ++static inline ++const DVprofile* dv_frame_profile(const DVprofile *sys, ++ const uint8_t* frame, unsigned buf_size) + { + int i; + +@@ -715,6 +717,10 @@ static inline const DVprofile* dv_frame_ + if (dsf == dv_profiles[i].dsf && stype == dv_profiles[i].video_stype) + return &dv_profiles[i]; + ++ /* check if old sys matches and assumes corrupted input */ ++ if (sys && buf_size == sys->frame_size) ++ return sys; ++ + return NULL; + } + +--- a/libavformat/dv.c ++++ b/libavformat/dv.c +@@ -322,7 +322,7 @@ int dv_produce_packet(DVDemuxContext *c, + uint8_t *ppcm[4] = {0}; + + if (buf_size < DV_PROFILE_BYTES || +- !(c->sys = dv_frame_profile(buf)) || ++ !(c->sys = dv_frame_profile(c->sys, buf, buf_size)) || + buf_size < c->sys->frame_size) { + return -1; /* Broken frame, or not enough data */ + } +@@ -421,7 +421,7 @@ static int dv_read_header(AVFormatContex + url_fseek(s->pb, -DV_PROFILE_BYTES, SEEK_CUR) < 0) + return AVERROR(EIO); + +- c->dv_demux->sys = dv_frame_profile(c->buf); ++ c->dv_demux->sys = dv_frame_profile(c->dv_demux->sys, c->buf, DV_PROFILE_BYTES); + if (!c->dv_demux->sys) { + av_log(s, AV_LOG_ERROR, "Can't determine profile of DV input stream.\n"); + return -1; --- ffmpeg-0.5+svn20090706.orig/debian/patches/fix-qtrle-encoding-when-previous-frame-linesize.patch +++ ffmpeg-0.5+svn20090706/debian/patches/fix-qtrle-encoding-when-previous-frame-linesize.patch @@ -0,0 +1,72 @@ +From: Peter Fritzsche +Date: Sat, 23 May 2009 05:55:29 +0000 +Subject: [PATCH] fix qtrle encoding when previous frame linesize differs + +Applied upstream as revision 18908: + +------------------------------------------------------------------------ +r18908 | bcoudurier | 2009-05-23 07:55:29 +0200 (Sa, 23. Mai 2009) | 1 line + +fix qtrle encoding when previous frame linesize differs, fix #998 + + +diff --git a/libavcodec/qtrleenc.c b/libavcodec/qtrleenc.c +index 171ac25..46bb573 100644 +--- a/libavcodec/qtrleenc.c ++++ b/libavcodec/qtrleenc.c +@@ -121,18 +121,20 @@ static void qtrle_encode_line(QtrleEncContext *s, AVFrame *p, int line, uint8_t + /* The cost of the three different possibilities */ + int total_bulk_cost; + int total_skip_cost; + int total_repeat_cost; + + int temp_cost; + int j; + +- uint8_t *this_line = p-> data[0] + line*p->linesize[0] + (width - 1)*s->pixel_size; +- uint8_t *prev_line = s->previous_frame.data[0] + line*p->linesize[0] + (width - 1)*s->pixel_size; ++ uint8_t *this_line = p-> data[0] + line*p-> linesize[0] + ++ (width - 1)*s->pixel_size; ++ uint8_t *prev_line = s->previous_frame.data[0] + line*s->previous_frame.linesize[0] + ++ (width - 1)*s->pixel_size; + + s->length_table[width] = 0; + skipcount = 0; + + for (i = width - 1; i >= 0; i--) { + + if (!s->frame.key_frame && !memcmp(this_line, prev_line, s->pixel_size)) + skipcount = FFMIN(skipcount + 1, MAX_RLE_SKIP); +@@ -235,26 +237,27 @@ static void qtrle_encode_line(QtrleEncContext *s, AVFrame *p, int line, uint8_t + static int encode_frame(QtrleEncContext *s, AVFrame *p, uint8_t *buf) + { + int i; + int start_line = 0; + int end_line = s->avctx->height; + uint8_t *orig_buf = buf; + + if (!s->frame.key_frame) { ++ unsigned line_size = s->avctx->width * s->pixel_size; + for (start_line = 0; start_line < s->avctx->height; start_line++) + if (memcmp(p->data[0] + start_line*p->linesize[0], +- s->previous_frame.data[0] + start_line*p->linesize[0], +- p->linesize[0])) ++ s->previous_frame.data[0] + start_line*s->previous_frame.linesize[0], ++ line_size)) + break; + + for (end_line=s->avctx->height; end_line > start_line; end_line--) + if (memcmp(p->data[0] + (end_line - 1)*p->linesize[0], +- s->previous_frame.data[0] + (end_line - 1)*p->linesize[0], +- p->linesize[0])) ++ s->previous_frame.data[0] + (end_line - 1)*s->previous_frame.linesize[0], ++ line_size)) + break; + } + + bytestream_put_be32(&buf, 0); // CHUNK SIZE, patched later + + if ((start_line == 0 && end_line == s->avctx->height) || start_line == s->avctx->height) + bytestream_put_be16(&buf, 0); // header + else { + --- ffmpeg-0.5+svn20090706.orig/debian/patches/series +++ ffmpeg-0.5+svn20090706/debian/patches/series @@ -0,0 +1,9 @@ +100_kfreebsd +ffmpeg-debian_hurd.patch +fix-qtrle-encoding-when-previous-frame-linesize.patch +aac-regression.patch +fix-dv-seeking.patch +900_doxyfile +# fpic-ftbfs-fix.patch +# fpic-libpostproc-fix.patch +# fpic-libswscale-fix.patch --- ffmpeg-0.5+svn20090706.orig/debian/patches/fpic-ftbfs-fix.patch +++ ffmpeg-0.5+svn20090706/debian/patches/fpic-ftbfs-fix.patch @@ -0,0 +1,262 @@ +This patch fixes FTBFS issue when using -fPIC. +For inquiries about this patch, please see bug #528080. +========================================================================== +--- a/libavcodec/x86/dsputil_mmx.c ++++ b/libavcodec/x86/dsputil_mmx.c +@@ -695,14 +695,14 @@ + "punpckhdq %%mm1, %%mm1 \n\t" + "movd %%mm1, %3 \n\t" + +- : "=m" (*(uint32_t*)(dst + 0*dst_stride)), +- "=m" (*(uint32_t*)(dst + 1*dst_stride)), +- "=m" (*(uint32_t*)(dst + 2*dst_stride)), +- "=m" (*(uint32_t*)(dst + 3*dst_stride)) +- : "m" (*(uint32_t*)(src + 0*src_stride)), +- "m" (*(uint32_t*)(src + 1*src_stride)), +- "m" (*(uint32_t*)(src + 2*src_stride)), +- "m" (*(uint32_t*)(src + 3*src_stride)) ++ : "=r" (*(uint32_t*)(dst + 0*dst_stride)), ++ "=r" (*(uint32_t*)(dst + 1*dst_stride)), ++ "=r" (*(uint32_t*)(dst + 2*dst_stride)), ++ "=r" (*(uint32_t*)(dst + 3*dst_stride)) ++ : "r" (*(uint32_t*)(src + 0*src_stride)), ++ "r" (*(uint32_t*)(src + 1*src_stride)), ++ "r" (*(uint32_t*)(src + 2*src_stride)), ++ "r" (*(uint32_t*)(src + 3*src_stride)) + ); + } + +--- a/libavcodec/x86/h264dsp_mmx.c ++++ b/libavcodec/x86/h264dsp_mmx.c +@@ -943,8 +943,8 @@ + \ + __asm__ volatile(\ + "pxor %%mm7, %%mm7 \n\t"\ +- "movq %5, %%mm4 \n\t"\ +- "movq %6, %%mm5 \n\t"\ ++ "movq ff_pw_5, %%mm4 \n\t"\ ++ "movq ff_pw_16, %%mm5 \n\t"\ + "1: \n\t"\ + "movd -1(%0), %%mm1 \n\t"\ + "movd (%0), %%mm2 \n\t"\ +@@ -974,17 +974,15 @@ + "decl %2 \n\t"\ + " jnz 1b \n\t"\ + : "+a"(src), "+c"(dst), "+g"(h)\ +- : "d"((x86_reg)srcStride), "S"((x86_reg)dstStride), "m"(ff_pw_5), "m"(ff_pw_16)\ +- : "memory"\ ++ : "d"((x86_reg)srcStride), "S"((x86_reg)dstStride)\ + );\ + }\ + static av_noinline void OPNAME ## h264_qpel4_h_lowpass_l2_ ## MMX(uint8_t *dst, uint8_t *src, uint8_t *src2, int dstStride, int src2Stride){\ + int h=4;\ + __asm__ volatile(\ +- "pxor %%mm7, %%mm7 \n\t"\ +- "movq %0, %%mm4 \n\t"\ +- "movq %1, %%mm5 \n\t"\ +- :: "m"(ff_pw_5), "m"(ff_pw_16)\ ++ "pxor %mm7, %mm7 \n\t"\ ++ "movq ff_pw_5, %mm4 \n\t"\ ++ "movq ff_pw_16, %mm5 \n\t"\ + );\ + do{\ + __asm__ volatile(\ +@@ -1117,7 +1115,7 @@ + int h=8;\ + __asm__ volatile(\ + "pxor %%mm7, %%mm7 \n\t"\ +- "movq %5, %%mm6 \n\t"\ ++ "movq ff_pw_5, %%mm6 \n\t"\ + "1: \n\t"\ + "movq (%0), %%mm0 \n\t"\ + "movq 1(%0), %%mm2 \n\t"\ +@@ -1151,7 +1149,7 @@ + "punpcklbw %%mm7, %%mm5 \n\t"\ + "paddw %%mm3, %%mm2 \n\t"\ + "paddw %%mm5, %%mm4 \n\t"\ +- "movq %6, %%mm5 \n\t"\ ++ "movq ff_pw_16, %%mm5 \n\t"\ + "paddw %%mm5, %%mm2 \n\t"\ + "paddw %%mm5, %%mm4 \n\t"\ + "paddw %%mm2, %%mm0 \n\t"\ +@@ -1165,17 +1163,15 @@ + "decl %2 \n\t"\ + " jnz 1b \n\t"\ + : "+a"(src), "+c"(dst), "+g"(h)\ +- : "d"((x86_reg)srcStride), "S"((x86_reg)dstStride), "m"(ff_pw_5), "m"(ff_pw_16)\ +- : "memory"\ ++ : "d"((x86_reg)srcStride), "S"((x86_reg)dstStride)\ + );\ + }\ + \ + static av_noinline void OPNAME ## h264_qpel8_h_lowpass_l2_ ## MMX(uint8_t *dst, uint8_t *src, uint8_t *src2, int dstStride, int src2Stride){\ + int h=8;\ + __asm__ volatile(\ +- "pxor %%mm7, %%mm7 \n\t"\ +- "movq %0, %%mm6 \n\t"\ +- :: "m"(ff_pw_5)\ ++ "pxor %mm7, %mm7 \n\t"\ ++ "movq ff_pw_5, %mm6 \n\t"\ + );\ + do{\ + __asm__ volatile(\ +@@ -1211,7 +1207,7 @@ + "punpcklbw %%mm7, %%mm5 \n\t"\ + "paddw %%mm3, %%mm2 \n\t"\ + "paddw %%mm5, %%mm4 \n\t"\ +- "movq %5, %%mm5 \n\t"\ ++ "movq ff_pw_16, %%mm5 \n\t"\ + "paddw %%mm5, %%mm2 \n\t"\ + "paddw %%mm5, %%mm4 \n\t"\ + "paddw %%mm2, %%mm0 \n\t"\ +@@ -1226,9 +1222,7 @@ + "add %4, %1 \n\t"\ + "add %3, %2 \n\t"\ + : "+a"(src), "+c"(dst), "+d"(src2)\ +- : "D"((x86_reg)src2Stride), "S"((x86_reg)dstStride),\ +- "m"(ff_pw_16)\ +- : "memory"\ ++ : "D"((x86_reg)src2Stride), "S"((x86_reg)dstStride)\ + );\ + }while(--h);\ + }\ +@@ -1494,8 +1488,8 @@ + int h=16;\ + __asm__ volatile(\ + "pxor %%xmm15, %%xmm15 \n\t"\ +- "movdqa %6, %%xmm14 \n\t"\ +- "movdqa %7, %%xmm13 \n\t"\ ++ "movdqa ff_pw_5, %%xmm14 \n\t"\ ++ "movdqa ff_pw_16, %%xmm13 \n\t"\ + "1: \n\t"\ + "lddqu 3(%0), %%xmm1 \n\t"\ + "lddqu -5(%0), %%xmm7 \n\t"\ +@@ -1549,9 +1543,7 @@ + "decl %3 \n\t"\ + "jg 1b \n\t"\ + : "+a"(src), "+c"(dst), "+d"(src2), "+g"(h)\ +- : "D"((x86_reg)src2Stride), "S"((x86_reg)dstStride),\ +- "m"(ff_pw_5), "m"(ff_pw_16)\ +- : "memory"\ ++ : "D"((x86_reg)src2Stride), "S"((x86_reg)dstStride)\ + );\ + } + #else // ARCH_X86_64 +@@ -1571,9 +1563,8 @@ + static av_noinline void OPNAME ## h264_qpel8_h_lowpass_l2_ ## MMX(uint8_t *dst, uint8_t *src, uint8_t *src2, int dstStride, int src2Stride){\ + int h=8;\ + __asm__ volatile(\ +- "pxor %%xmm7, %%xmm7 \n\t"\ +- "movdqa %0, %%xmm6 \n\t"\ +- :: "m"(ff_pw_5)\ ++ "pxor %xmm7, %xmm7 \n\t"\ ++ "movdqa ff_pw_5, %xmm6 \n\t"\ + );\ + do{\ + __asm__ volatile(\ +@@ -1596,7 +1587,7 @@ + "psllw $2, %%xmm2 \n\t"\ + "movq (%2), %%xmm3 \n\t"\ + "psubw %%xmm1, %%xmm2 \n\t"\ +- "paddw %5, %%xmm5 \n\t"\ ++ "paddw ff_pw_16,%%xmm5 \n\t"\ + "pmullw %%xmm6, %%xmm2 \n\t"\ + "paddw %%xmm5, %%xmm2 \n\t"\ + "psraw $5, %%xmm2 \n\t"\ +@@ -1607,9 +1598,7 @@ + "add %4, %1 \n\t"\ + "add %3, %2 \n\t"\ + : "+a"(src), "+c"(dst), "+d"(src2)\ +- : "D"((x86_reg)src2Stride), "S"((x86_reg)dstStride),\ +- "m"(ff_pw_16)\ +- : "memory"\ ++ : "D"((x86_reg)src2Stride), "S"((x86_reg)dstStride)\ + );\ + }while(--h);\ + }\ +@@ -1619,7 +1608,7 @@ + int h=8;\ + __asm__ volatile(\ + "pxor %%xmm7, %%xmm7 \n\t"\ +- "movdqa %5, %%xmm6 \n\t"\ ++ "movdqa ff_pw_5, %%xmm6 \n\t"\ + "1: \n\t"\ + "lddqu -5(%0), %%xmm1 \n\t"\ + "movdqa %%xmm1, %%xmm0 \n\t"\ +@@ -1639,7 +1628,7 @@ + "paddw %%xmm4, %%xmm1 \n\t"\ + "psllw $2, %%xmm2 \n\t"\ + "psubw %%xmm1, %%xmm2 \n\t"\ +- "paddw %6, %%xmm5 \n\t"\ ++ "paddw ff_pw_16, %%xmm5 \n\t"\ + "pmullw %%xmm6, %%xmm2 \n\t"\ + "paddw %%xmm5, %%xmm2 \n\t"\ + "psraw $5, %%xmm2 \n\t"\ +@@ -1650,9 +1639,7 @@ + "decl %2 \n\t"\ + " jnz 1b \n\t"\ + : "+a"(src), "+c"(dst), "+g"(h)\ +- : "D"((x86_reg)srcStride), "S"((x86_reg)dstStride),\ +- "m"(ff_pw_5), "m"(ff_pw_16)\ +- : "memory"\ ++ : "D"((x86_reg)srcStride), "S"((x86_reg)dstStride)\ + );\ + }\ + static void OPNAME ## h264_qpel16_h_lowpass_ ## MMX(uint8_t *dst, uint8_t *src, int dstStride, int srcStride){\ +--- a/libavcodec/x86/flacdsp_mmx.c ++++ b/libavcodec/x86/flacdsp_mmx.c +@@ -89,12 +89,12 @@ + "movsd "MANGLE(ff_pd_1)", %%xmm1 \n\t" + "movsd "MANGLE(ff_pd_1)", %%xmm2 \n\t" + "1: \n\t" +- "movapd (%4,%0), %%xmm3 \n\t" +- "movupd -8(%5,%0), %%xmm4 \n\t" +- "movapd (%5,%0), %%xmm5 \n\t" ++ "movapd (%2,%0), %%xmm3 \n\t" ++ "movupd -8(%3,%0), %%xmm4 \n\t" ++ "movapd (%3,%0), %%xmm5 \n\t" + "mulpd %%xmm3, %%xmm4 \n\t" + "mulpd %%xmm3, %%xmm5 \n\t" +- "mulpd -16(%5,%0), %%xmm3 \n\t" ++ "mulpd -16(%3,%0), %%xmm3 \n\t" + "addpd %%xmm4, %%xmm1 \n\t" + "addpd %%xmm5, %%xmm0 \n\t" + "addpd %%xmm3, %%xmm2 \n\t" +@@ -107,9 +107,9 @@ + "addsd %%xmm4, %%xmm1 \n\t" + "addsd %%xmm5, %%xmm2 \n\t" + "movsd %%xmm0, %1 \n\t" +- "movsd %%xmm1, %2 \n\t" +- "movsd %%xmm2, %3 \n\t" +- :"+&r"(i), "=m"(autoc[j]), "=m"(autoc[j+1]), "=m"(autoc[j+2]) ++ "movsd %%xmm1, 8%1 \n\t" ++ "movsd %%xmm2, 16%1 \n\t" ++ :"+&r"(i), "=m"(autoc[j]) + :"r"(data1+len), "r"(data1+len-j) + ); + } else { +@@ -117,10 +117,10 @@ + "movsd "MANGLE(ff_pd_1)", %%xmm0 \n\t" + "movsd "MANGLE(ff_pd_1)", %%xmm1 \n\t" + "1: \n\t" +- "movapd (%3,%0), %%xmm3 \n\t" +- "movupd -8(%4,%0), %%xmm4 \n\t" ++ "movapd (%2,%0), %%xmm3 \n\t" ++ "movupd -8(%3,%0), %%xmm4 \n\t" + "mulpd %%xmm3, %%xmm4 \n\t" +- "mulpd (%4,%0), %%xmm3 \n\t" ++ "mulpd (%3,%0), %%xmm3 \n\t" + "addpd %%xmm4, %%xmm1 \n\t" + "addpd %%xmm3, %%xmm0 \n\t" + "add $16, %0 \n\t" +@@ -130,8 +130,8 @@ + "addsd %%xmm3, %%xmm0 \n\t" + "addsd %%xmm4, %%xmm1 \n\t" + "movsd %%xmm0, %1 \n\t" +- "movsd %%xmm1, %2 \n\t" +- :"+&r"(i), "=m"(autoc[j]), "=m"(autoc[j+1]) ++ "movsd %%xmm1, 8%1 \n\t" ++ :"+&r"(i), "=m"(autoc[j]) + :"r"(data1+len), "r"(data1+len-j) + ); + } --- ffmpeg-0.5+svn20090706.orig/debian/patches/fpic-libpostproc-fix.patch +++ ffmpeg-0.5+svn20090706/debian/patches/fpic-libpostproc-fix.patch @@ -0,0 +1,315 @@ +This patch resolves all non-PIC issues from the libpostproc library. +For inquiries about this patch, please see bug #528080. +========================================================================== +--- a/libpostproc/postprocess_template.c ++++ b/libpostproc/postprocess_template.c +@@ -369,16 +369,16 @@ + // FIXME rounding + __asm__ volatile( + "pxor %%mm7, %%mm7 \n\t" // 0 +- "movq "MANGLE(b80)", %%mm6 \n\t" // MIN_SIGNED_BYTE ++ "movq %2, %%mm6 \n\t" // MIN_SIGNED_BYTE + "leal (%0, %1), %%"REG_a" \n\t" + "leal (%%"REG_a", %1, 4), %%"REG_c" \n\t" + // 0 1 2 3 4 5 6 7 8 9 + // %0 eax eax+%1 eax+2%1 %0+4%1 ecx ecx+%1 ecx+2%1 %0+8%1 ecx+4%1 +- "movq "MANGLE(pQPb)", %%mm0 \n\t" // QP,..., QP ++ "movq %3, %%mm0 \n\t" // QP,..., QP + "movq %%mm0, %%mm1 \n\t" // QP,..., QP +- "paddusb "MANGLE(b02)", %%mm0 \n\t" ++ "paddusb %4, %%mm0 \n\t" + "psrlw $2, %%mm0 \n\t" +- "pand "MANGLE(b3F)", %%mm0 \n\t" // QP/4,..., QP/4 ++ "pand %5, %%mm0 \n\t" // QP/4,..., QP/4 + "paddusb %%mm1, %%mm0 \n\t" // QP*1.25 ... + "movq (%0, %1, 4), %%mm2 \n\t" // line 4 + "movq (%%"REG_c"), %%mm3 \n\t" // line 5 +@@ -407,8 +407,8 @@ + + "paddb %%mm6, %%mm5 \n\t" + "psrlw $2, %%mm5 \n\t" +- "pand "MANGLE(b3F)", %%mm5 \n\t" +- "psubb "MANGLE(b20)", %%mm5 \n\t" // (l5-l4)/8 ++ "pand %5, %%mm5 \n\t" ++ "psubb %6, %%mm5 \n\t" // (l5-l4)/8 + + "movq (%%"REG_a", %1, 2), %%mm2 \n\t" + "paddb %%mm6, %%mm2 \n\t" // line 3 + 0x80 +@@ -423,7 +423,8 @@ + "movq %%mm2, (%%"REG_c", %1) \n\t" + + : +- : "r" (src), "r" ((x86_reg)stride) ++ : "r" (src), "r" ((x86_reg)stride), "m"(b80), "m"(pQPb), "m"(b02), ++ "m"(b3f), "m"(b20) + : "%"REG_a, "%"REG_c + ); + #else //HAVE_MMX2 || HAVE_AMD3DNOW +@@ -496,7 +497,7 @@ + "paddusb %%mm0, %%mm0 \n\t" + "psubusb %%mm0, %%mm4 \n\t" + "pcmpeqb %%mm7, %%mm4 \n\t" // d <= QP ? -1 : 0 +- "psubusb "MANGLE(b01)", %%mm3 \n\t" ++ "psubusb %3, %%mm3 \n\t" + "pand %%mm4, %%mm3 \n\t" // d <= QP ? d : 0 + + PAVGB(%%mm7, %%mm3) // d/2 +@@ -545,7 +546,7 @@ + "movq %%mm0, (%%"REG_c", %1, 2) \n\t" // line 7 + + : +- : "r" (src), "r" ((x86_reg)stride), "m" (co->pQPb) ++ : "r" (src), "r" ((x86_reg)stride), "m" (co->pQPb), "m"(b01) + : "%"REG_a, "%"REG_c + ); + #else //HAVE_MMX2 || HAVE_AMD3DNOW +@@ -675,17 +676,17 @@ + + PMINUB(%%mm2, %%mm1, %%mm4) // MIN(|lenergy|,|renergy|)/8 + "movq %2, %%mm4 \n\t" // QP //FIXME QP+1 ? +- "paddusb "MANGLE(b01)", %%mm4 \n\t" ++ "paddusb %5, %%mm4 \n\t" + "pcmpgtb %%mm3, %%mm4 \n\t" // |menergy|/8 < QP + "psubusb %%mm1, %%mm3 \n\t" // d=|menergy|/8-MIN(|lenergy|,|renergy|)/8 + "pand %%mm4, %%mm3 \n\t" + + "movq %%mm3, %%mm1 \n\t" +-// "psubusb "MANGLE(b01)", %%mm3 \n\t" ++// "psubusb %5, %%mm3 \n\t" + PAVGB(%%mm7, %%mm3) + PAVGB(%%mm7, %%mm3) + "paddusb %%mm1, %%mm3 \n\t" +-// "paddusb "MANGLE(b01)", %%mm3 \n\t" ++// "paddusb %5, %%mm3 \n\t" + + "movq (%%"REG_a", %1, 2), %%mm6 \n\t" //l3 + "movq (%0, %1, 4), %%mm5 \n\t" //l4 +@@ -698,7 +699,7 @@ + "pand %%mm0, %%mm3 \n\t" + PMINUB(%%mm5, %%mm3, %%mm0) + +- "psubusb "MANGLE(b01)", %%mm3 \n\t" ++ "psubusb %5, %%mm3 \n\t" + PAVGB(%%mm7, %%mm3) + + "movq (%%"REG_a", %1, 2), %%mm0 \n\t" +@@ -730,7 +731,7 @@ + "movq (%%"REG_a", %1), %%mm3 \n\t" // l2 + "pxor %%mm6, %%mm2 \n\t" // -l5-1 + "movq %%mm2, %%mm5 \n\t" // -l5-1 +- "movq "MANGLE(b80)", %%mm4 \n\t" // 128 ++ "movq %3, %%mm4 \n\t" // 128 + "lea (%%"REG_a", %1, 4), %%"REG_c" \n\t" + PAVGB(%%mm3, %%mm2) // (l2-l5+256)/2 + PAVGB(%%mm0, %%mm4) // ~(l4-l3)/4 + 128 +@@ -742,7 +743,7 @@ + "pxor %%mm6, %%mm2 \n\t" // -l1-1 + PAVGB(%%mm3, %%mm2) // (l2-l1+256)/2 + PAVGB((%0), %%mm1) // (l0-l3+256)/2 +- "movq "MANGLE(b80)", %%mm3 \n\t" // 128 ++ "movq %3, %%mm3 \n\t" // 128 + PAVGB(%%mm2, %%mm3) // ~(l2-l1)/4 + 128 + PAVGB(%%mm1, %%mm3) // ~(l0-l3)/4 +(l2-l1)/8 + 128 + PAVGB(%%mm2, %%mm3) // ~(l0-l3)/8 +5(l2-l1)/16 + 128 +@@ -752,14 +753,14 @@ + "movq (%%"REG_c", %1, 2), %%mm1 \n\t" // l7 + "pxor %%mm6, %%mm1 \n\t" // -l7-1 + PAVGB((%0, %1, 4), %%mm1) // (l4-l7+256)/2 +- "movq "MANGLE(b80)", %%mm2 \n\t" // 128 ++ "movq %3, %%mm2 \n\t" // 128 + PAVGB(%%mm5, %%mm2) // ~(l6-l5)/4 + 128 + PAVGB(%%mm1, %%mm2) // ~(l4-l7)/4 +(l6-l5)/8 + 128 + PAVGB(%%mm5, %%mm2) // ~(l4-l7)/8 +5(l6-l5)/16 + 128 + // mm0=128-q, mm2=renergy/16 + 128, mm3=lenergy/16 + 128, mm4= menergy/16 + 128 + +- "movq "MANGLE(b00)", %%mm1 \n\t" // 0 +- "movq "MANGLE(b00)", %%mm5 \n\t" // 0 ++ "movq %4, %%mm1 \n\t" // 0 ++ "movq %4, %%mm5 \n\t" // 0 + "psubb %%mm2, %%mm1 \n\t" // 128 - renergy/16 + "psubb %%mm3, %%mm5 \n\t" // 128 - lenergy/16 + PMAXUB(%%mm1, %%mm2) // 128 + |renergy/16| +@@ -768,7 +769,7 @@ + + // mm0=128-q, mm3=128 + MIN(|lenergy|,|renergy|)/16, mm4= menergy/16 + 128 + +- "movq "MANGLE(b00)", %%mm7 \n\t" // 0 ++ "movq %4, %%mm7 \n\t" // 0 + "movq %2, %%mm2 \n\t" // QP + PAVGB(%%mm6, %%mm2) // 128 + QP/2 + "psubb %%mm6, %%mm2 \n\t" +@@ -782,13 +783,13 @@ + // mm0=128-q, mm1= SIGN(menergy), mm2= |menergy|/16 < QP/2, mm4= d/16 + + "movq %%mm4, %%mm3 \n\t" // d +- "psubusb "MANGLE(b01)", %%mm4 \n\t" ++ "psubusb %5, %%mm4 \n\t" + PAVGB(%%mm7, %%mm4) // d/32 + PAVGB(%%mm7, %%mm4) // (d + 32)/64 + "paddb %%mm3, %%mm4 \n\t" // 5d/64 + "pand %%mm2, %%mm4 \n\t" + +- "movq "MANGLE(b80)", %%mm5 \n\t" // 128 ++ "movq %3, %%mm5 \n\t" // 128 + "psubb %%mm0, %%mm5 \n\t" // q + "paddsb %%mm6, %%mm5 \n\t" // fix bad rounding + "pcmpgtb %%mm5, %%mm7 \n\t" // SIGN(q) +@@ -810,7 +811,8 @@ + "movq %%mm2, (%0, %1, 4) \n\t" + + : +- : "r" (src), "r" ((x86_reg)stride), "m" (c->pQPb) ++ : "r" (src), "r" ((x86_reg)stride), "m" (c->pQPb), "m"(b80), ++ "m"(b00), "m"(b01) + : "%"REG_a, "%"REG_c + ); + +@@ -1045,10 +1047,10 @@ + "psubusw %%mm1, %%mm5 \n\t" // ld + + +- "movq "MANGLE(w05)", %%mm2 \n\t" // 5 ++ "movq %3, %%mm2 \n\t" // 5 + "pmullw %%mm2, %%mm4 \n\t" + "pmullw %%mm2, %%mm5 \n\t" +- "movq "MANGLE(w20)", %%mm2 \n\t" // 32 ++ "movq %4, %%mm2 \n\t" // 32 + "paddw %%mm2, %%mm4 \n\t" + "paddw %%mm2, %%mm5 \n\t" + "psrlw $6, %%mm4 \n\t" +@@ -1098,7 +1100,7 @@ + "movq %%mm0, (%0, %1) \n\t" + + : "+r" (src) +- : "r" ((x86_reg)stride), "m" (c->pQPb) ++ : "r" ((x86_reg)stride), "m" (c->pQPb), "m"(w05), "m"(w20) + : "%"REG_a, "%"REG_c + ); + #else //HAVE_MMX2 || HAVE_AMD3DNOW +@@ -1237,7 +1239,7 @@ + "movq %%mm6, %%mm0 \n\t" // max + "psubb %%mm7, %%mm6 \n\t" // max - min + "movd %%mm6, %%ecx \n\t" +- "cmpb "MANGLE(deringThreshold)", %%cl \n\t" ++ "cmpb %4, %%cl \n\t" + " jb 1f \n\t" + "lea -24(%%"REG_SP"), %%"REG_c" \n\t" + "and "ALIGN_MASK", %%"REG_c" \n\t" +@@ -1264,9 +1266,9 @@ + "psubusb %%mm7, %%mm0 \n\t" + "psubusb %%mm7, %%mm2 \n\t" + "psubusb %%mm7, %%mm3 \n\t" +- "pcmpeqb "MANGLE(b00)", %%mm0 \n\t" // L10 > a ? 0 : -1 +- "pcmpeqb "MANGLE(b00)", %%mm2 \n\t" // L20 > a ? 0 : -1 +- "pcmpeqb "MANGLE(b00)", %%mm3 \n\t" // L00 > a ? 0 : -1 ++ "pcmpeqb %5, %%mm0 \n\t" // L10 > a ? 0 : -1 ++ "pcmpeqb %5, %%mm2 \n\t" // L20 > a ? 0 : -1 ++ "pcmpeqb %5, %%mm3 \n\t" // L00 > a ? 0 : -1 + "paddb %%mm2, %%mm0 \n\t" + "paddb %%mm3, %%mm0 \n\t" + +@@ -1287,9 +1289,9 @@ + "psubusb %%mm7, %%mm2 \n\t" + "psubusb %%mm7, %%mm4 \n\t" + "psubusb %%mm7, %%mm5 \n\t" +- "pcmpeqb "MANGLE(b00)", %%mm2 \n\t" // L11 > a ? 0 : -1 +- "pcmpeqb "MANGLE(b00)", %%mm4 \n\t" // L21 > a ? 0 : -1 +- "pcmpeqb "MANGLE(b00)", %%mm5 \n\t" // L01 > a ? 0 : -1 ++ "pcmpeqb %5, %%mm2 \n\t" // L11 > a ? 0 : -1 ++ "pcmpeqb %5, %%mm4 \n\t" // L21 > a ? 0 : -1 ++ "pcmpeqb %5, %%mm5 \n\t" // L01 > a ? 0 : -1 + "paddb %%mm4, %%mm2 \n\t" + "paddb %%mm5, %%mm2 \n\t" + // 0, 2, 3, 1 +@@ -1314,7 +1316,7 @@ + "psubusb " #lx ", " #t1 " \n\t"\ + "psubusb " #lx ", " #t0 " \n\t"\ + "psubusb " #lx ", " #sx " \n\t"\ +- "movq "MANGLE(b00)", " #lx " \n\t"\ ++ "movq %5, " #lx " \n\t"\ + "pcmpeqb " #lx ", " #t1 " \n\t" /* src[-1] > a ? 0 : -1*/\ + "pcmpeqb " #lx ", " #t0 " \n\t" /* src[+1] > a ? 0 : -1*/\ + "pcmpeqb " #lx ", " #sx " \n\t" /* src[0] > a ? 0 : -1*/\ +@@ -1330,8 +1332,8 @@ + PMINUB(t1, pplx, t0)\ + "paddb " #sx ", " #ppsx " \n\t"\ + "paddb " #psx ", " #ppsx " \n\t"\ +- "#paddb "MANGLE(b02)", " #ppsx " \n\t"\ +- "pand "MANGLE(b08)", " #ppsx " \n\t"\ ++ "#paddb %6, " #ppsx " \n\t"\ ++ "pand %7, " #ppsx " \n\t"\ + "pcmpeqb " #lx ", " #ppsx " \n\t"\ + "pand " #ppsx ", " #pplx " \n\t"\ + "pandn " #dst ", " #ppsx " \n\t"\ +@@ -1367,7 +1369,8 @@ + DERING_CORE((%0, %1, 8) ,(%%REGd, %1, 4),%%mm2,%%mm4,%%mm0,%%mm3,%%mm5,%%mm1,%%mm6,%%mm7) + + "1: \n\t" +- : : "r" (src), "r" ((x86_reg)stride), "m" (c->pQPb), "m"(c->pQPb2) ++ : : "r" (src), "r" ((x86_reg)stride), "m" (c->pQPb), "m"(c->pQPb2), ++ "m"(deringThreshold), "m"(b00), "m"(b02), "m"(b08) + : "%"REG_a, "%"REG_d, "%"REG_c + ); + #else //HAVE_MMX2 || HAVE_AMD3DNOW +@@ -2227,7 +2230,7 @@ + #else //L1_DIFF + #if defined (FAST_L2_DIFF) + "pcmpeqb %%mm7, %%mm7 \n\t" +- "movq "MANGLE(b80)", %%mm6 \n\t" ++ "movq %4, %%mm6 \n\t" + "pxor %%mm0, %%mm0 \n\t" + #define REAL_L2_DIFF_CORE(a, b)\ + "movq " #a ", %%mm5 \n\t"\ +@@ -2476,7 +2479,8 @@ + + "4: \n\t" + +- :: "r" (src), "r" (tempBlurred), "r"((x86_reg)stride), "m" (tempBlurredPast) ++ :: "r" (src), "r" (tempBlurred), "r"((x86_reg)stride), ++ "m" (tempBlurredPast), "m"(b80) + : "%"REG_a, "%"REG_d, "%"REG_c, "memory" + ); + #else //HAVE_MMX2 || HAVE_AMD3DNOW +@@ -2730,8 +2734,8 @@ + "movq %%mm6, %%mm1 \n\t" + "psllw $2, %%mm0 \n\t" + "psllw $2, %%mm1 \n\t" +- "paddw "MANGLE(w04)", %%mm0 \n\t" +- "paddw "MANGLE(w04)", %%mm1 \n\t" ++ "paddw %5, %%mm0 \n\t" ++ "paddw %5, %%mm1 \n\t" + + #define NEXT\ + "movq (%0), %%mm2 \n\t"\ +@@ -2820,7 +2824,7 @@ + "mov %4, %0 \n\t" //FIXME + + : "+&r"(src) +- : "r" ((x86_reg)step), "m" (c->pQPb), "r"(sums), "g"(src) ++ : "r" ((x86_reg)step), "m" (c->pQPb), "r"(sums), "g"(src), "m"(w04) + ); + + src+= step; // src points to begin of the 8x8 Block +@@ -3037,10 +3041,10 @@ + "psubusw %%mm1, %%mm5 \n\t" // ld + + +- "movq "MANGLE(w05)", %%mm2 \n\t" // 5 ++ "movq %4, %%mm2 \n\t" // 5 + "pmullw %%mm2, %%mm4 \n\t" + "pmullw %%mm2, %%mm5 \n\t" +- "movq "MANGLE(w20)", %%mm2 \n\t" // 32 ++ "movq %5, %%mm2 \n\t" // 32 + "paddw %%mm2, %%mm4 \n\t" + "paddw %%mm2, %%mm5 \n\t" + "psrlw $6, %%mm4 \n\t" +@@ -3092,7 +3096,8 @@ + "movq %%mm0, (%0, %1) \n\t" + + : "+r" (temp_src) +- : "r" ((x86_reg)step), "m" (c->pQPb), "m"(eq_mask) ++ : "r" ((x86_reg)step), "m" (c->pQPb), "m"(eq_mask), "m"(w05), ++ "m"(w20) + : "%"REG_a, "%"REG_c + ); + } --- ffmpeg-0.5+svn20090706.orig/debian/patches/900_doxyfile +++ ffmpeg-0.5+svn20090706/debian/patches/900_doxyfile @@ -0,0 +1,13 @@ +Exclude some directories we use for packaging. +========================================================================== +--- a/Doxyfile ++++ b/Doxyfile +@@ -359,7 +359,7 @@ + # excluded from the INPUT source files. This way you can easily exclude a + # subdirectory from a directory tree whose root is specified with the INPUT tag. + +-EXCLUDE = ++EXCLUDE = debian debian-shared debian-static debian-cmov .pc .git + + # The EXCLUDE_SYMLINKS tag can be used select whether or not files or directories + # that are symbolic links (a Unix filesystem feature) are excluded from the input.