--- 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/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/confflags +++ ffmpeg-0.5+svn20090706/debian/confflags @@ -0,0 +1,182 @@ +# -*- 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) +# Ubuntu karmic and later assume v6 + VFP; just override CPU since it defaults +# to uname -m +nooptflags += --cpu=armv6 --extra-cflags="-mfpu=vfp -mfloat-abi=softfp" +#FLAVORS += vfp +FLAVORS += neon +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) + +# 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-libgsm +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) +confflags += $(call cond_enable,/usr/include/lame/lame.h,libmp3lame) +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 +# NB: NEON always implies v7+ and ffmpeg's NEON implementation requires VFP +neon_build_confflags += $(confflags) +neon_build_confflags += --shlibdir=/usr/lib/neon/vfp +neon_build_confflags += --cpu=armv7-a +neon_build_confflags += --extra-cflags="-mfpu=neon -mfloat-abi=softfp -fPIC -DPIC" +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/libavcodec52.install +++ ffmpeg-0.5+svn20090706/debian/libavcodec52.install @@ -0,0 +1 @@ +usr/lib/{,*/,*/*/}libavcodec.so.* --- 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/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/libpostproc51.install +++ ffmpeg-0.5+svn20090706/debian/libpostproc51.install @@ -0,0 +1 @@ +usr/lib/{,*/,*/*/}libpostproc.so.* --- 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/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/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/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/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/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/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/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/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/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/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/libavformat52.install +++ ffmpeg-0.5+svn20090706/debian/libavformat52.install @@ -0,0 +1 @@ +usr/lib/{,*/,*/*/}libavformat.so.* --- 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/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/changelog +++ ffmpeg-0.5+svn20090706/debian/changelog @@ -0,0 +1,1493 @@ +ffmpeg (4:0.5+svn20090706-2ubuntu2.1) karmic-security; urgency=low + + * SECURITY UPDATE: Fix a multitude of security issues + - debian/patches/CVE-2009-46XX/security-issue03.patch: check stream + existence before assignment + - debian/patches/CVE-2009-46XX/security-issue04.patch: check submap + indexes + - debian/patches/CVE-2009-46XX/security-issue05.patch: check classbook + value + - debian/patches/CVE-2009-46XX/security-issue06.patch: add checks for + per-packet mode indexes and per-header mode mapping indexes + - debian/patches/CVE-2009-46XX/security-issue07.patch: check masterbook + index and subclass book index. + - debian/patches/CVE-2009-46XX/security-issue08.patch: check + res_setup->books + - debian/patches/CVE-2009-46XX/security-issue09.patch: check + begin/end/partition_size + - debian/patches/CVE-2009-46XX/security-issue10.patch: check validity + of channels & samplerate + - debian/patches/CVE-2009-46XX/security-issue11.patch: fix book_idx + check + - debian/patches/CVE-2009-46XX/security-issue12.patch: sanity checks + for magnitude and angle + - debian/patches/CVE-2009-46XX/security-issue13.patch: fix = -> == typo + - debian/patches/CVE-2009-46XX/security-issue14.patch: check dimensions + against 0 too + - debian/patches/CVE-2009-46XX/security-issue15.patch: fix + init_get_bits() buffer size + - debian/patches/CVE-2009-46XX/security-issue17.patch: make sure that + all memory allocations succeed + - debian/patches/CVE-2009-46XX/security-issue18.patch: fix possible + buffer over-read in vorbis_comment + - debian/patches/CVE-2009-46XX/security-issue19.patch: set data_size to + 0 to avoid having it uninitialized + - debian/patches/CVE-2009-46XX/security-issue20.patch: disable parsing + for ogg streams where no ogg header was found + - debian/patches/CVE-2009-46XX/security-issue22.patch: check codec_id + and codec_type, make sure priv_data is freed and codec is set to NULL + - CVE-2009-4632 + - CVE-2009-4633 + - CVE-2009-4634 + - CVE-2009-4635 + - CVE-2009-4637 + - CVE-2009-4639 + - CVE-2009-4640 + + -- Marc Deslauriers Thu, 08 Apr 2010 09:34:05 -0400 + +ffmpeg (4:0.5+svn20090706-2ubuntu2) karmic; urgency=low + + [ Reinhard Tartler ] + * Make arguments of av_set_pts_info() unsigned. + * update debian/changelog + * use patch for issue1245 from git.ffmpeg.org + * Support constant-quant encoding for libtheora, LP: #356322 + * increase swscale compile time width (VOF/VOFW), LP: #443264 + + [ Loïc Minier ] + * Update config for karmic's armel toolchain. + * Enable neon flavour; LP: #383240. + * Update NEON confflags to assume v7 and VFP. + * Add backported NEON patches from ffmpeg trunk; see debian/patches/neon/. + * Pass proper --cpu and --extra-flags on armel. + * Pass -fPIC -DPIC to neon pass. + + -- Loïc Minier Tue, 13 Oct 2009 23:56:04 +0200 + +ffmpeg (4:0.5+svn20090706-2ubuntu1) karmic; urgency=low + + * merge from debian. Remaining changes: + - disabled output decoders: faad, openjpeg, dirac (all not in main) + - build arm vfp variant + - don't build depend on yasm. + * fix dependencies on -extra packages: LP: #418705, #416348 + * no need to remove mpeg encoders in the ubuntu package, unless we hear + otherwise from some patent owner. This brings back the mpeg2video + encoder is available. cf. formats.txt.gz LP: #416585 + + -- Reinhard Tartler Wed, 26 Aug 2009 11:20:03 +0200 + +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-1ubuntu3) karmic; urgency=low + + * update the dependencies of the -dev packages for the + unstripped -> extra renaming + + -- Reinhard Tartler Tue, 25 Aug 2009 16:37:23 +0200 + +ffmpeg (4:0.5+svn20090706-1ubuntu2) karmic; urgency=low + + * really drop libopenjpeg from build depends. + + -- Reinhard Tartler Tue, 25 Aug 2009 08:17:17 +0200 + +ffmpeg (4:0.5+svn20090706-1ubuntu1) karmic; urgency=low + + * merge from debian. Remaining changes: + - don't build-depend on libfaad-dev, disabling faad decoder. + - build arm vfp variant + - don't build libopenjpeg support (not in main) + * change shlibs file to make applications depend on the -extra- packages. + * don't build depend on yasm. + + -- Reinhard Tartler Sat, 15 Aug 2009 18:18:23 +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-1ubuntu3) karmic; urgency=low + + * do not forcefully enable objenjpeg, it is not avaiable in this build + anyway + * don't build against faac in any case, it is deemed non-free + + -- Reinhard Tartler Sat, 25 Jul 2009 09:15:12 +0200 + +ffmpeg-debian (4:0.5+svn20090609-1ubuntu2) karmic; urgency=low + + * remove libopenjpeg-dev from build depends (fixes FTBFS) + * remove duplicate libxvmc-dev build-dependency + + -- Reinhard Tartler Fri, 24 Jul 2009 21:53:47 +0200 + +ffmpeg-debian (4:0.5+svn20090609-1ubuntu1) karmic; urgency=low + + * merge from debian. Remaining changes: + - don't build-depend on libfaad-dev, disabling faad decoder. + - build arm vfp variant + * update gbp.conf + * move gbp.conf to debian/ + + -- Reinhard Tartler Sat, 18 Jul 2009 10:55:24 +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-1ubuntu6) jaunty; urgency=low + + * vfp CFLAGS: add "-mfpu=vfp -mfloat-abi=softfp". + + -- Loic Minier Fri, 10 Apr 2009 21:34:29 +0200 + +ffmpeg-debian (3:0.svn20090303-1ubuntu5) jaunty; urgency=low + + * Disable more autodetected ARM arch features. + * Add neon and vfp flavors to armel disabled for now. + * Enable vfp pass on armel; leave the neon disabled. + + -- Loïc Minier Fri, 10 Apr 2009 17:58:52 +0200 + +ffmpeg-debian (3:0.svn20090303-1ubuntu4) jaunty; urgency=low + + * brown paperbag upload. Actually include the patch intended for the + last upload. + + -- Reinhard Tartler Sat, 21 Mar 2009 14:55:46 +0100 + +ffmpeg-debian (3:0.svn20090303-1ubuntu3) jaunty; urgency=low + + * don't disable ffserver in specialised flavors. Fixes LP: #345370 + + -- Reinhard Tartler Sat, 21 Mar 2009 14:52:25 +0100 + +ffmpeg-debian (3:0.svn20090303-1ubuntu2) jaunty; urgency=low + + * No-change rebuild to fix lpia shared library dependencies. + + -- Colin Watson Thu, 19 Mar 2009 17:26:36 +0000 + +ffmpeg-debian (3:0.svn20090303-1ubuntu1) jaunty; urgency=low + + * FFE granted in LP: #340303. + + * merge from debian/unstable. + * remaining changes to debian: + - don't build-depend on libfaad-dev, disabling faad decoder. + + -- Reinhard Tartler Fri, 13 Mar 2009 08:54:33 +0100 + +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-2ubuntu1) jaunty; urgency=low + + * merge from debian. Remaining changes: + - don't build depend on libfaad-dev + + -- Reinhard Tartler Thu, 05 Feb 2009 21:22:01 +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-1ubuntu1) jaunty; urgency=low + + * merge from debian. LP: #318501 + * new version fixes CVE-2008-3230, LP: #253767 + + -- Reinhard Tartler Tue, 20 Jan 2009 09:20:53 +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-1ubuntu1) jaunty; urgency=low + + * merge from debian. + * keep myself in the maintainer field. If you are touching this or the + 'ffmpeg' package in multiverse, please get in touch with me. Both + source packages come from the same packaging branch. + * drop dependency on faad. + + -- Reinhard Tartler Sat, 15 Nov 2008 19:44:29 +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-1ubuntu3) jaunty; urgency=low + + * really disable faad support completely. + + -- Reinhard Tartler Mon, 10 Nov 2008 10:58:01 +0100 + +ffmpeg-debian (3:0.svn20081108-1ubuntu2) jaunty; urgency=low + + * drop the patch to dlopen faad at runtime for now. it needs more + polishing, and we can have that functionality easier with the 'ffmpeg' + source package that will appear in multiverse. + + -- Reinhard Tartler Mon, 10 Nov 2008 10:31:47 +0100 + +ffmpeg-debian (3:0.svn20081108-1ubuntu1) jaunty; urgency=low + + * merge from debian. + * keep myself in the maintainer field. If you are touching this or the + 'ffmpeg' package in multiverse, please get in touch with me. Both + source packages come from the same packaging branch. + * drop dependency on faad. + * import patches from old packaging to dlopen libfaad at runtime. + + -- Reinhard Tartler Mon, 10 Nov 2008 07:31: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/compat +++ ffmpeg-0.5+svn20090706/debian/compat @@ -0,0 +1 @@ +7 --- 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/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/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/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/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/gbp.conf +++ ffmpeg-0.5+svn20090706/debian/gbp.conf @@ -0,0 +1,6 @@ +[DEFAULT] +upstream-branch = upstream +debian-branch = ubuntu.karmic +upstream-tag = upstream/%(version)s +debian-tag = debian/%(version)s +pristine-tar = True --- ffmpeg-0.5+svn20090706.orig/debian/control +++ ffmpeg-0.5+svn20090706/debian/control @@ -0,0 +1,241 @@ +Source: ffmpeg +Section: libs +Priority: optional +Maintainer: Ubuntu Core Developers +XSBC-Original-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], + libfreetype6-dev, + libgsm1-dev, + libimlib2-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, + 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-extra-49 (>= ${source:Upstream-Version}), + libavutil49 (<= ${source:Upstream-Version}-99) | libavutil-extra-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-extra-52 (>= ${source:Upstream-Version}), + libavcodec52 (<= ${source:Upstream-Version}-99) | libavcodec-extra-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-extra-52 (>= ${source:Upstream-Version}), + libavdevice52 (<= ${source:Upstream-Version}-99) | libavdevice-extra-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-extra-52 (>= ${source:Upstream-Version}), + libavformat52 (<= ${source:Upstream-Version}-99) | libavformat-extra-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-extra-0 (>= ${source:Upstream-Version}), + libavfilter0 (<= ${source:Upstream-Version}-99) | libavfilter-extra-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-extra-51 (>= ${source:Upstream-Version}), + libpostproc51 (<= ${source:Upstream-Version}-99) | libpostproc-extra-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-extra-0 (>= ${source:Upstream-Version}), + libswscale0 (<= ${source:Upstream-Version}-99) | libswscale-extra-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/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/clean +++ ffmpeg-0.5+svn20090706/debian/clean @@ -0,0 +1,3 @@ +config-extra-includes.h +EXTRA +formats.txt --- 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/libavutil49.install +++ ffmpeg-0.5+svn20090706/debian/libavutil49.install @@ -0,0 +1 @@ +usr/lib/{,*/,*/*/}libavutil.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/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/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/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/patches/series +++ ffmpeg-0.5+svn20090706/debian/patches/series @@ -0,0 +1,53 @@ +100_kfreebsd +ffmpeg-debian_hurd.patch +fix-qtrle-encoding-when-previous-frame-linesize.patch +aac-regression.patch +fix-dv-seeking.patch +fix-constant-quant-encoding.patch +increase-VOFW-on-x86.patch +issue1245.patch +900_doxyfile +# fpic-ftbfs-fix.patch +# fpic-libpostproc-fix.patch +# fpic-libswscale-fix.patch + +# NEON backport +neon/0001-ARM-NEON-optimised-add_pixels_clamped.patch +neon/0002-ARM-NEON-optimized-put_signed_pixels_clamped.patch +neon/0003-Add-guaranteed-alignment-for-loading-dest-pixels-in-.patch +neon/0004-Reorganise-intreadwrite.h.patch +neon/0005-ARM-asm-for-AV_RN.patch +neon/0006-ARM-NEON-put_pixels_clamped.patch +neon/0007-ARM-Use-fewer-register-in-NEON-put_pixels-_y2-and-_x.patch +neon/0008-ARM-NEON-VP3-Loop-Filter.patch +neon/0009-ARM-actually-add-VP3-loop-filter.patch +neon/0010-ARM-add-some-PLD-in-NEON-IDCT.patch +neon/0011-ARM-slightly-faster-NEON-H264-horizontal-loop-filter.patch +neon/0012-ARM-enable-fast_unaligned-when-cpu-armv-67-is-specif.patch +neon/0013-ARM-NEON-VP3-IDCT.patch +neon/0014-ARM-NEON-optimised-vorbis_inverse_coupling.patch +neon/0015-ARM-handle-VFP-register-arguments-in-ff_vector_fmul_.patch +neon/0016-ARM-NEON-optimised-FFT-and-MDCT.patch +neon/0017-ARM-faster-NEON-IMDCT.patch +neon/0018-Prepare-for-optimised-forward-MDCT-implementations.patch +neon/0019-ARM-NEON-optimised-MDCT.patch +neon/0020-ARM-remove-unnecessary-.fpu-neon-directives.patch +neon/0021-ARM-check-for-VFP-register-arguments.patch +CVE-2009-46XX/security-issue03.patch +CVE-2009-46XX/security-issue04.patch +CVE-2009-46XX/security-issue05.patch +CVE-2009-46XX/security-issue06.patch +CVE-2009-46XX/security-issue07.patch +CVE-2009-46XX/security-issue08.patch +CVE-2009-46XX/security-issue09.patch +CVE-2009-46XX/security-issue10.patch +CVE-2009-46XX/security-issue11.patch +CVE-2009-46XX/security-issue12.patch +CVE-2009-46XX/security-issue13.patch +CVE-2009-46XX/security-issue14.patch +CVE-2009-46XX/security-issue15.patch +CVE-2009-46XX/security-issue17.patch +CVE-2009-46XX/security-issue18.patch +CVE-2009-46XX/security-issue19.patch +CVE-2009-46XX/security-issue20.patch +CVE-2009-46XX/security-issue22.patch --- 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/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-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/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/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/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. --- ffmpeg-0.5+svn20090706.orig/debian/patches/increase-VOFW-on-x86.patch +++ ffmpeg-0.5+svn20090706/debian/patches/increase-VOFW-on-x86.patch @@ -0,0 +1,30 @@ +From: michael +Date: Tue, 5 May 2009 01:34:16 +0000 (+0000) +Subject: Change VOFW for x86 to 5120, it allows larger images to be scaled and was +X-Git-Url: http://git.ffmpeg.org/?p=libswscale;a=commitdiff_plain;h=c9d08ac2f27b3c7a18db9d2ef417673f77be405f + +Change VOFW for x86 to 5120, it allows larger images to be scaled and was +not slower. Other archs are not changed as the larger VOFW was slower on PPC. + + +git-svn-id: file:///var/local/repositories/mplayer/trunk/libswscale@29256 b3059339-0415-0410-9bf9-f77b7e298cf2 +--- + +diff --git a/swscale_internal.h b/swscale_internal.h +index 3995887..eb11166 100644 +--- a/libswscale/swscale_internal.h ++++ b/libswscale/swscale_internal.h +@@ -33,7 +33,12 @@ + + #define MAX_FILTER_SIZE 256 + +-#define VOFW 2048 ++#if ARCH_X86 ++#define VOFW 5120 ++#else ++#define VOFW 2048 // faster on PPC and not tested on others ++#endif ++ + #define VOF (VOFW*2) + + #ifdef WORDS_BIGENDIAN --- 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/issue1245.patch +++ ffmpeg-0.5+svn20090706/debian/patches/issue1245.patch @@ -0,0 +1,38 @@ +From: michael +Date: Wed, 1 Jul 2009 18:50:31 +0000 (+0000) +Subject: Make arguments of av_set_pts_info() unsigned. +X-Git-Url: http://git.ffmpeg.org/?p=ffmpeg;a=commitdiff_plain;h=248dc1dd4cacbb7cb27d6bc0e66ff4f902b3bdc0 + +Make arguments of av_set_pts_info() unsigned. +Fixes issue1240/mpeg1/smclockmpeg1.avi.3.1 + + +git-svn-id: file:///var/local/repositories/ffmpeg/trunk@19319 9553f0bf-9b14-0410-a0b8-cfaf0461ba5b +--- + +diff --git a/libavformat/avformat.h b/libavformat/avformat.h +index 57faaed..2185edc 100644 +--- a/libavformat/avformat.h ++++ b/libavformat/avformat.h +@@ -963,7 +963,7 @@ AVChapter *ff_new_chapter(AVFormatContext *s, int id, AVRational time_base, + * @param pts_den denominator to convert to seconds (MPEG: 90000) + */ + void av_set_pts_info(AVStream *s, int pts_wrap_bits, +- int pts_num, int pts_den); ++ unsigned int pts_num, unsigned int pts_den); + + #define AVSEEK_FLAG_BACKWARD 1 ///< seek backward + #define AVSEEK_FLAG_BYTE 2 ///< seeking based on position in bytes +diff --git a/libavformat/utils.c b/libavformat/utils.c +index 9325e3d..b1c0363 100644 +--- a/libavformat/utils.c ++++ b/libavformat/utils.c +@@ -3304,7 +3304,7 @@ char *ff_data_to_hex(char *buff, const uint8_t *src, int s) + } + + void av_set_pts_info(AVStream *s, int pts_wrap_bits, +- int pts_num, int pts_den) ++ unsigned int pts_num, unsigned int pts_den) + { + unsigned int gcd= av_gcd(pts_num, pts_den); + s->pts_wrap_bits = pts_wrap_bits; --- 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/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-constant-quant-encoding.patch +++ ffmpeg-0.5+svn20090706/debian/patches/fix-constant-quant-encoding.patch @@ -0,0 +1,47 @@ +From: conrad +Date: Wed, 30 Sep 2009 22:25:49 +0000 (+0000) +Subject: Support constant-quant encoding for libtheora +X-Git-Url: http://git.ffmpeg.org/?p=ffmpeg;a=commitdiff_plain;h=a5ac197b1e60ca44cbc1ea0f64e25af977f7dae5 + +Support constant-quant encoding for libtheora +Based on a patch by j f (gonzaz-z # operamail (d) com) + +git-svn-id: file:///var/local/repositories/ffmpeg/trunk@20109 9553f0bf-9b14-0410-a0b8-cfaf0461ba5b +--- + +diff --git a/libavcodec/libtheoraenc.c b/libavcodec/libtheoraenc.c +index 9da0d19..f028595 100644 +--- a/libavcodec/libtheoraenc.c ++++ b/libavcodec/libtheoraenc.c +@@ -106,11 +106,9 @@ static av_cold int encode_init(AVCodecContext* avc_context) + } + t_info.colorspace = OC_CS_UNSPECIFIED; + t_info.pixelformat = OC_PF_420; +- t_info.target_bitrate = avc_context->bit_rate; + t_info.keyframe_frequency = avc_context->gop_size; + t_info.keyframe_frequency_force = avc_context->gop_size; + t_info.keyframe_mindistance = avc_context->keyint_min; +- t_info.quality = 0; + + t_info.quick_p = 1; + t_info.dropframes_p = 0; +@@ -120,6 +118,19 @@ static av_cold int encode_init(AVCodecContext* avc_context) + t_info.noise_sensitivity = 1; + t_info.sharpness = 0; + ++ if (avc_context->flags & CODEC_FLAG_QSCALE) { ++ /* to be constant with the libvorbis implementation, clip global_quality to 0 - 10 ++ Theora accepts a quality parameter p, which is: ++ * 0 <= p <=63 ++ * an int value ++ */ ++ t_info.quality = av_clip(avc_context->global_quality / (float)FF_QP2LAMBDA, 0, 10) * 6.3; ++ t_info.target_bitrate = 0; ++ } else { ++ t_info.target_bitrate = avc_context->bit_rate; ++ t_info.quality = 0; ++ } ++ + /* Now initialise libtheora */ + if (theora_encode_init( &(h->t_state), &t_info ) != 0) { + av_log(avc_context, AV_LOG_ERROR, "theora_encode_init failed\n"); --- ffmpeg-0.5+svn20090706.orig/debian/patches/neon/0010-ARM-add-some-PLD-in-NEON-IDCT.patch +++ ffmpeg-0.5+svn20090706/debian/patches/neon/0010-ARM-add-some-PLD-in-NEON-IDCT.patch @@ -0,0 +1,55 @@ +From 8d8bd2247af043b8b61af8bbc4c131524182531a Mon Sep 17 00:00:00 2001 +From: mru +Date: Thu, 28 May 2009 17:19:28 +0000 +Subject: [PATCH 10/27] ARM: add some PLD in NEON IDCT + +git-svn-id: file:///var/local/repositories/ffmpeg/trunk@18972 9553f0bf-9b14-0410-a0b8-cfaf0461ba5b +--- + libavcodec/arm/simple_idct_neon.S | 17 +++++++++++++++-- + 1 files changed, 15 insertions(+), 2 deletions(-) + +diff --git a/libavcodec/arm/simple_idct_neon.S b/libavcodec/arm/simple_idct_neon.S +index e7099a2..0882481 100644 +--- a/libavcodec/arm/simple_idct_neon.S ++++ b/libavcodec/arm/simple_idct_neon.S +@@ -68,6 +68,19 @@ + .text + .align 6 + ++function idct_row4_pld_neon ++ pld [r0] ++ add r3, r0, r1, lsl #2 ++ pld [r0, r1] ++ pld [r0, r1, lsl #1] ++ pld [r3, -r1] ++ pld [r3] ++ pld [r3, r1] ++ add r3, r3, r1, lsl #1 ++ pld [r3] ++ pld [r3, r1] ++ .endfunc ++ + function idct_row4_neon + vmov.i32 q15, #(1<<(ROW_SHIFT-1)) + vld1.64 {d2-d5}, [r2,:128]! +@@ -252,7 +265,7 @@ idct_coeff_neon: + function ff_simple_idct_put_neon, export=1 + idct_start r2 + +- bl idct_row4_neon ++ bl idct_row4_pld_neon + bl idct_row4_neon + add r2, r2, #-128 + bl idct_col4_neon +@@ -307,7 +320,7 @@ function idct_col4_add8_neon + function ff_simple_idct_add_neon, export=1 + idct_start r2 + +- bl idct_row4_neon ++ bl idct_row4_pld_neon + bl idct_row4_neon + add r2, r2, #-128 + bl idct_col4_neon +-- +1.6.3.3 + --- ffmpeg-0.5+svn20090706.orig/debian/patches/neon/0004-Reorganise-intreadwrite.h.patch +++ ffmpeg-0.5+svn20090706/debian/patches/neon/0004-Reorganise-intreadwrite.h.patch @@ -0,0 +1,312 @@ +From f4bfca647b7228833d0e102f68d0726594c502b1 Mon Sep 17 00:00:00 2001 +From: mru +Date: Sat, 18 Apr 2009 00:00:22 +0000 +Subject: [PATCH 04/27] Reorganise intreadwrite.h + +This changes intreadwrite.h to support per-arch implementations of the +various macros allowing us to take advantage of special instructions +or other properties the compiler does not know about. + +git-svn-id: file:///var/local/repositories/ffmpeg/trunk@18600 9553f0bf-9b14-0410-a0b8-cfaf0461ba5b +--- + libavutil/intreadwrite.h | 213 ++++++++++++++++++++++++++++++---------------- + 1 files changed, 141 insertions(+), 72 deletions(-) + +diff --git a/libavutil/intreadwrite.h b/libavutil/intreadwrite.h +index 7c5909e..b1c5c2a 100644 +--- a/libavutil/intreadwrite.h ++++ b/libavutil/intreadwrite.h +@@ -23,119 +23,88 @@ + #include "config.h" + #include "bswap.h" + +-#ifdef __GNUC__ ++/* ++ * Arch-specific headers can provide any combination of ++ * AV_[RW][BLN](16|32|64) macros. Preprocessor symbols must be ++ * defined, even if these are implemented as inline functions. ++ */ ++ ++ ++/* ++ * Define AV_[RW]N helper macros to simplify definitions not provided ++ * by per-arch headers. ++ */ ++ ++#if defined(__GNUC__) + + struct unaligned_64 { uint64_t l; } __attribute__((packed)); + struct unaligned_32 { uint32_t l; } __attribute__((packed)); + struct unaligned_16 { uint16_t l; } __attribute__((packed)); + +-#define AV_RN16(a) (((const struct unaligned_16 *) (a))->l) +-#define AV_RN32(a) (((const struct unaligned_32 *) (a))->l) +-#define AV_RN64(a) (((const struct unaligned_64 *) (a))->l) +- +-#define AV_WN16(a, b) (((struct unaligned_16 *) (a))->l) = (b) +-#define AV_WN32(a, b) (((struct unaligned_32 *) (a))->l) = (b) +-#define AV_WN64(a, b) (((struct unaligned_64 *) (a))->l) = (b) ++# define AV_RN(s, p) (((const struct unaligned_##s *) (p))->l) ++# define AV_WN(s, p, v) (((struct unaligned_##s *) (p))->l) = (v) + + #elif defined(__DECC) + +-#define AV_RN16(a) (*((const __unaligned uint16_t*)(a))) +-#define AV_RN32(a) (*((const __unaligned uint32_t*)(a))) +-#define AV_RN64(a) (*((const __unaligned uint64_t*)(a))) +- +-#define AV_WN16(a, b) *((__unaligned uint16_t*)(a)) = (b) +-#define AV_WN32(a, b) *((__unaligned uint32_t*)(a)) = (b) +-#define AV_WN64(a, b) *((__unaligned uint64_t*)(a)) = (b) +- +-#else +- +-#define AV_RN16(a) (*((const uint16_t*)(a))) +-#define AV_RN32(a) (*((const uint32_t*)(a))) +-#define AV_RN64(a) (*((const uint64_t*)(a))) +- +-#define AV_WN16(a, b) *((uint16_t*)(a)) = (b) +-#define AV_WN32(a, b) *((uint32_t*)(a)) = (b) +-#define AV_WN64(a, b) *((uint64_t*)(a)) = (b) +- +-#endif /* !__GNUC__ */ +- +-/* endian macros */ +-#define AV_RB8(x) (((const uint8_t*)(x))[0]) +-#define AV_WB8(p, d) do { ((uint8_t*)(p))[0] = (d); } while(0) +- +-#define AV_RL8(x) AV_RB8(x) +-#define AV_WL8(p, d) AV_WB8(p, d) +- +-#if HAVE_FAST_UNALIGNED +-# ifdef WORDS_BIGENDIAN +-# define AV_RB16(x) AV_RN16(x) +-# define AV_WB16(p, d) AV_WN16(p, d) +- +-# define AV_RL16(x) bswap_16(AV_RN16(x)) +-# define AV_WL16(p, d) AV_WN16(p, bswap_16(d)) +- +-# define AV_RB32(x) AV_RN32(x) +-# define AV_WB32(p, d) AV_WN32(p, d) ++# define AV_RN(s, p) (*((const __unaligned uint##s##_t*)(p))) ++# define AV_WN(s, p, v) *((__unaligned uint##s##_t*)(p)) = (v) + +-# define AV_RL32(x) bswap_32(AV_RN32(x)) +-# define AV_WL32(p, d) AV_WN32(p, bswap_32(d)) ++#elif HAVE_FAST_UNALIGNED + +-# define AV_RB64(x) AV_RN64(x) +-# define AV_WB64(p, d) AV_WN64(p, d) ++# define AV_RN(s, p) (*((const uint##s##_t*)(p))) ++# define AV_WN(s, p, v) *((uint##s##_t*)(p)) = (v) + +-# define AV_RL64(x) bswap_64(AV_RN64(x)) +-# define AV_WL64(p, d) AV_WN64(p, bswap_64(d)) +-# else /* WORDS_BIGENDIAN */ +-# define AV_RB16(x) bswap_16(AV_RN16(x)) +-# define AV_WB16(p, d) AV_WN16(p, bswap_16(d)) +- +-# define AV_RL16(x) AV_RN16(x) +-# define AV_WL16(p, d) AV_WN16(p, d) +- +-# define AV_RB32(x) bswap_32(AV_RN32(x)) +-# define AV_WB32(p, d) AV_WN32(p, bswap_32(d)) +- +-# define AV_RL32(x) AV_RN32(x) +-# define AV_WL32(p, d) AV_WN32(p, d) +- +-# define AV_RB64(x) bswap_64(AV_RN64(x)) +-# define AV_WB64(p, d) AV_WN64(p, bswap_64(d)) ++#else + +-# define AV_RL64(x) AV_RN64(x) +-# define AV_WL64(p, d) AV_WN64(p, d) +-# endif +-#else /* HAVE_FAST_UNALIGNED */ +-#define AV_RB16(x) ((((const uint8_t*)(x))[0] << 8) | ((const uint8_t*)(x))[1]) ++#ifndef AV_RB16 ++#define AV_RB16(x) ((((const uint8_t*)(x))[0] << 8) | \ ++ ((const uint8_t*)(x))[1]) ++#endif ++#ifndef AV_WB16 + #define AV_WB16(p, d) do { \ + ((uint8_t*)(p))[1] = (d); \ + ((uint8_t*)(p))[0] = (d)>>8; } while(0) ++#endif + ++#ifndef AV_RL16 + #define AV_RL16(x) ((((const uint8_t*)(x))[1] << 8) | \ + ((const uint8_t*)(x))[0]) ++#endif ++#ifndef AV_WL16 + #define AV_WL16(p, d) do { \ + ((uint8_t*)(p))[0] = (d); \ + ((uint8_t*)(p))[1] = (d)>>8; } while(0) ++#endif + ++#ifndef AV_RB32 + #define AV_RB32(x) ((((const uint8_t*)(x))[0] << 24) | \ + (((const uint8_t*)(x))[1] << 16) | \ + (((const uint8_t*)(x))[2] << 8) | \ + ((const uint8_t*)(x))[3]) ++#endif ++#ifndef AV_WB32 + #define AV_WB32(p, d) do { \ + ((uint8_t*)(p))[3] = (d); \ + ((uint8_t*)(p))[2] = (d)>>8; \ + ((uint8_t*)(p))[1] = (d)>>16; \ + ((uint8_t*)(p))[0] = (d)>>24; } while(0) ++#endif + ++#ifndef AV_RL32 + #define AV_RL32(x) ((((const uint8_t*)(x))[3] << 24) | \ + (((const uint8_t*)(x))[2] << 16) | \ + (((const uint8_t*)(x))[1] << 8) | \ + ((const uint8_t*)(x))[0]) ++#endif ++#ifndef AV_WL32 + #define AV_WL32(p, d) do { \ + ((uint8_t*)(p))[0] = (d); \ + ((uint8_t*)(p))[1] = (d)>>8; \ + ((uint8_t*)(p))[2] = (d)>>16; \ + ((uint8_t*)(p))[3] = (d)>>24; } while(0) ++#endif + ++#ifndef AV_RB64 + #define AV_RB64(x) (((uint64_t)((const uint8_t*)(x))[0] << 56) | \ + ((uint64_t)((const uint8_t*)(x))[1] << 48) | \ + ((uint64_t)((const uint8_t*)(x))[2] << 40) | \ +@@ -144,6 +113,8 @@ struct unaligned_16 { uint16_t l; } __attribute__((packed)); + ((uint64_t)((const uint8_t*)(x))[5] << 16) | \ + ((uint64_t)((const uint8_t*)(x))[6] << 8) | \ + (uint64_t)((const uint8_t*)(x))[7]) ++#endif ++#ifndef AV_WB64 + #define AV_WB64(p, d) do { \ + ((uint8_t*)(p))[7] = (d); \ + ((uint8_t*)(p))[6] = (d)>>8; \ +@@ -153,7 +124,9 @@ struct unaligned_16 { uint16_t l; } __attribute__((packed)); + ((uint8_t*)(p))[2] = (d)>>40; \ + ((uint8_t*)(p))[1] = (d)>>48; \ + ((uint8_t*)(p))[0] = (d)>>56; } while(0) ++#endif + ++#ifndef AV_RL64 + #define AV_RL64(x) (((uint64_t)((const uint8_t*)(x))[7] << 56) | \ + ((uint64_t)((const uint8_t*)(x))[6] << 48) | \ + ((uint64_t)((const uint8_t*)(x))[5] << 40) | \ +@@ -162,6 +135,8 @@ struct unaligned_16 { uint16_t l; } __attribute__((packed)); + ((uint64_t)((const uint8_t*)(x))[2] << 16) | \ + ((uint64_t)((const uint8_t*)(x))[1] << 8) | \ + (uint64_t)((const uint8_t*)(x))[0]) ++#endif ++#ifndef AV_WL64 + #define AV_WL64(p, d) do { \ + ((uint8_t*)(p))[0] = (d); \ + ((uint8_t*)(p))[1] = (d)>>8; \ +@@ -171,7 +146,101 @@ struct unaligned_16 { uint16_t l; } __attribute__((packed)); + ((uint8_t*)(p))[5] = (d)>>40; \ + ((uint8_t*)(p))[6] = (d)>>48; \ + ((uint8_t*)(p))[7] = (d)>>56; } while(0) +-#endif /* HAVE_FAST_UNALIGNED */ ++#endif ++ ++#ifdef WORDS_BIGENDIAN ++# define AV_RN(s, p) AV_RB##s(p) ++# define AV_WN(s, p, v) AV_WB##s(p, v) ++#else ++# define AV_RN(s, p) AV_RL##s(p) ++# define AV_WN(s, p, v) AV_WL##s(p, v) ++#endif ++ ++#endif /* HAVE_FAST_UNALIGNED */ ++ ++#ifndef AV_RN16 ++# define AV_RN16(p) AV_RN(16, p) ++#endif ++ ++#ifndef AV_RN32 ++# define AV_RN32(p) AV_RN(32, p) ++#endif ++ ++#ifndef AV_RN64 ++# define AV_RN64(p) AV_RN(64, p) ++#endif ++ ++#ifndef AV_WN16 ++# define AV_WN16(p, v) AV_WN(16, p, v) ++#endif ++ ++#ifndef AV_WN32 ++# define AV_WN32(p, v) AV_WN(32, p, v) ++#endif ++ ++#ifndef AV_WN64 ++# define AV_WN64(p, v) AV_WN(64, p, v) ++#endif ++ ++#ifdef WORDS_BIGENDIAN ++# define AV_RB(s, p) AV_RN(s, p) ++# define AV_WB(s, p, v) AV_WN(s, p, v) ++# define AV_RL(s, p) bswap_##s(AV_RN(s, p)) ++# define AV_WL(s, p, v) AV_WN(s, p, bswap_##s(v)) ++#else ++# define AV_RB(s, p) bswap_##s(AV_RN(s, p)) ++# define AV_WB(s, p, v) AV_WN(s, p, bswap_##s(v)) ++# define AV_RL(s, p) AV_RN(s, p) ++# define AV_WL(s, p, v) AV_WN(s, p, v) ++#endif ++ ++#define AV_RB8(x) (((const uint8_t*)(x))[0]) ++#define AV_WB8(p, d) do { ((uint8_t*)(p))[0] = (d); } while(0) ++ ++#define AV_RL8(x) AV_RB8(x) ++#define AV_WL8(p, d) AV_WB8(p, d) ++ ++#ifndef AV_RB16 ++# define AV_RB16(p) AV_RB(16, p) ++#endif ++#ifndef AV_WB16 ++# define AV_WB16(p, v) AV_WB(16, p, v) ++#endif ++ ++#ifndef AV_RL16 ++# define AV_RL16(p) AV_RL(16, p) ++#endif ++#ifndef AV_WL16 ++# define AV_WL16(p, v) AV_WL(16, p, v) ++#endif ++ ++#ifndef AV_RB32 ++# define AV_RB32(p) AV_RB(32, p) ++#endif ++#ifndef AV_WB32 ++# define AV_WB32(p, v) AV_WB(32, p, v) ++#endif ++ ++#ifndef AV_RL32 ++# define AV_RL32(p) AV_RL(32, p) ++#endif ++#ifndef AV_WL32 ++# define AV_WL32(p, v) AV_WL(32, p, v) ++#endif ++ ++#ifndef AV_RB64 ++# define AV_RB64(p) AV_RB(64, p) ++#endif ++#ifndef AV_WB64 ++# define AV_WB64(p, v) AV_WB(64, p, v) ++#endif ++ ++#ifndef AV_RL64 ++# define AV_RL64(p) AV_RL(64, p) ++#endif ++#ifndef AV_WL64 ++# define AV_WL64(p, v) AV_WL(64, p, v) ++#endif + + #define AV_RB24(x) ((((const uint8_t*)(x))[0] << 16) | \ + (((const uint8_t*)(x))[1] << 8) | \ +-- +1.6.3.3 + --- ffmpeg-0.5+svn20090706.orig/debian/patches/neon/0020-ARM-remove-unnecessary-.fpu-neon-directives.patch +++ ffmpeg-0.5+svn20090706/debian/patches/neon/0020-ARM-remove-unnecessary-.fpu-neon-directives.patch @@ -0,0 +1,80 @@ +From cf79e9ce120293a3d8fd6887298283c27ee866d4 Mon Sep 17 00:00:00 2001 +From: mru +Date: Fri, 2 Oct 2009 19:35:12 +0000 +Subject: [PATCH 20/20] ARM: remove unnecessary .fpu neon directives + +git-svn-id: file:///var/local/repositories/ffmpeg/trunk@20151 9553f0bf-9b14-0410-a0b8-cfaf0461ba5b +--- + libavcodec/arm/dsputil_neon_s.S | 1 - + libavcodec/arm/h264dsp_neon.S | 2 -- + libavcodec/arm/h264idct_neon.S | 2 -- + libavcodec/arm/mdct_neon.S | 1 - + libavcodec/arm/simple_idct_neon.S | 2 -- + 5 files changed, 0 insertions(+), 8 deletions(-) + +diff --git a/libavcodec/arm/dsputil_neon_s.S b/libavcodec/arm/dsputil_neon_s.S +index 71d09c6..f039349 100644 +--- a/libavcodec/arm/dsputil_neon_s.S ++++ b/libavcodec/arm/dsputil_neon_s.S +@@ -23,7 +23,6 @@ + #include "asm.S" + + preserve8 +- .fpu neon + .text + + .macro pixels16 avg=0 +diff --git a/libavcodec/arm/h264dsp_neon.S b/libavcodec/arm/h264dsp_neon.S +index 03e21f1..78f312d 100644 +--- a/libavcodec/arm/h264dsp_neon.S ++++ b/libavcodec/arm/h264dsp_neon.S +@@ -20,8 +20,6 @@ + + #include "asm.S" + +- .fpu neon +- + .macro transpose_8x8 r0 r1 r2 r3 r4 r5 r6 r7 + vtrn.32 \r0, \r4 + vtrn.32 \r1, \r5 +diff --git a/libavcodec/arm/h264idct_neon.S b/libavcodec/arm/h264idct_neon.S +index 6527390..d30e703 100644 +--- a/libavcodec/arm/h264idct_neon.S ++++ b/libavcodec/arm/h264idct_neon.S +@@ -21,8 +21,6 @@ + #include "asm.S" + + preserve8 +- .fpu neon +- + .text + + function ff_h264_idct_add_neon, export=1 +diff --git a/libavcodec/arm/mdct_neon.S b/libavcodec/arm/mdct_neon.S +index 5cd4647..f089519 100644 +--- a/libavcodec/arm/mdct_neon.S ++++ b/libavcodec/arm/mdct_neon.S +@@ -21,7 +21,6 @@ + + #include "asm.S" + +- .fpu neon + .text + + function ff_imdct_half_neon, export=1 +diff --git a/libavcodec/arm/simple_idct_neon.S b/libavcodec/arm/simple_idct_neon.S +index 0882481..4c329d8 100644 +--- a/libavcodec/arm/simple_idct_neon.S ++++ b/libavcodec/arm/simple_idct_neon.S +@@ -45,8 +45,6 @@ + #define w7 d1[2] + #define w4c d1[3] + +- .fpu neon +- + .macro idct_col4_top + vmull.s16 q7, d6, w2 /* q9 = W2 * col[2] */ + vmull.s16 q8, d6, w6 /* q10 = W6 * col[2] */ +-- +1.6.3.3 + --- ffmpeg-0.5+svn20090706.orig/debian/patches/neon/0016-ARM-NEON-optimised-FFT-and-MDCT.patch +++ ffmpeg-0.5+svn20090706/debian/patches/neon/0016-ARM-NEON-optimised-FFT-and-MDCT.patch @@ -0,0 +1,664 @@ +From 2d316e271f8837e0888b664ae45f6174f827a982 Mon Sep 17 00:00:00 2001 +From: =?utf-8?q?Lo=C3=AFc=20Minier?= +Date: Sat, 10 Oct 2009 12:58:17 +0200 +Subject: [PATCH 16/27] ARM: NEON optimised FFT and MDCT + +Vorbis and AC3 ~3x faster. + +Parts by Naotoshi Nojiri, naonoj gmail + +git-svn-id: file:///var/local/repositories/ffmpeg/trunk@19806 9553f0bf-9b14-0410-a0b8-cfaf0461ba5b + +Conflicts: + + libavcodec/Makefile +--- + libavcodec/Makefile | 5 + + libavcodec/arm/fft_neon.S | 369 ++++++++++++++++++++++++++++++++++++++++++++ + libavcodec/arm/mdct_neon.S | 178 +++++++++++++++++++++ + libavcodec/dsputil.h | 4 + + libavcodec/fft.c | 10 +- + 5 files changed, 565 insertions(+), 1 deletions(-) + create mode 100644 libavcodec/arm/fft_neon.S + create mode 100644 libavcodec/arm/mdct_neon.S + +diff --git a/libavcodec/Makefile b/libavcodec/Makefile +index a213309..02e0e8a 100644 +--- a/libavcodec/Makefile ++++ b/libavcodec/Makefile +@@ -480,6 +480,11 @@ OBJS-$(HAVE_IWMMXT) += arm/dsputil_iwmmxt.o \ + arm/mpegvideo_iwmmxt.o \ + + NEON-OBJS-$(CONFIG_THEORA_DECODER) += arm/vp3dsp_neon.o ++ ++NEON-OBJS-$(CONFIG_FFT) += arm/fft_neon.o \ ++ ++NEON-OBJS-$(CONFIG_MDCT) += arm/mdct_neon.o \ ++ + NEON-OBJS-$(CONFIG_VP3_DECODER) += arm/vp3dsp_neon.o + + OBJS-$(HAVE_NEON) += arm/dsputil_neon.o \ +diff --git a/libavcodec/arm/fft_neon.S b/libavcodec/arm/fft_neon.S +new file mode 100644 +index 0000000..6ed5789 +--- /dev/null ++++ b/libavcodec/arm/fft_neon.S +@@ -0,0 +1,369 @@ ++/* ++ * ARM NEON optimised FFT ++ * ++ * Copyright (c) 2009 Mans Rullgard ++ * Copyright (c) 2009 Naotoshi Nojiri ++ * ++ * This file is part of FFmpeg. ++ * ++ * FFmpeg is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU Lesser General Public ++ * License as published by the Free Software Foundation; either ++ * version 2.1 of the License, or (at your option) any later version. ++ * ++ * FFmpeg is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ * Lesser General Public License for more details. ++ * ++ * You should have received a copy of the GNU Lesser General Public ++ * License along with FFmpeg; if not, write to the Free Software ++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA ++ */ ++ ++#include "asm.S" ++ ++#define M_SQRT1_2 0.70710678118654752440 ++ ++ .text ++ ++function fft4_neon ++ vld1.32 {d0-d3}, [r0,:128] ++ ++ vext.32 q8, q1, q1, #1 @ i2,r3 d3=i3,r2 ++ vsub.f32 d6, d0, d1 @ r0-r1,i0-i1 ++ vsub.f32 d7, d16, d17 @ r3-r2,i2-i3 ++ vadd.f32 d4, d0, d1 @ r0+r1,i0+i1 ++ vadd.f32 d5, d2, d3 @ i2+i3,r2+r3 ++ vadd.f32 d1, d6, d7 ++ vsub.f32 d3, d6, d7 ++ vadd.f32 d0, d4, d5 ++ vsub.f32 d2, d4, d5 ++ ++ vst1.32 {d0-d3}, [r0,:128] ++ ++ bx lr ++.endfunc ++ ++function fft8_neon ++ mov r1, r0 ++ vld1.32 {d0-d3}, [r1,:128]! ++ vld1.32 {d16-d19}, [r1,:128] ++ ++ movw r2, #0x04f3 @ sqrt(1/2) ++ movt r2, #0x3f35 ++ eor r3, r2, #1<<31 ++ vdup.32 d31, r2 ++ ++ vext.32 q11, q1, q1, #1 @ i2,r3,i3,r2 ++ vadd.f32 d4, d16, d17 @ r4+r5,i4+i5 ++ vmov d28, r3, r2 ++ vadd.f32 d5, d18, d19 @ r6+r7,i6+i7 ++ vsub.f32 d17, d16, d17 @ r4-r5,i4-i5 ++ vsub.f32 d19, d18, d19 @ r6-r7,i6-i7 ++ vrev64.32 d29, d28 ++ vadd.f32 d20, d0, d1 @ r0+r1,i0+i1 ++ vadd.f32 d21, d2, d3 @ r2+r3,i2+i3 ++ vmul.f32 d26, d17, d28 @ -a2r*w,a2i*w ++ vext.32 q3, q2, q2, #1 ++ vmul.f32 d27, d19, d29 @ a3r*w,-a3i*w ++ vsub.f32 d23, d22, d23 @ i2-i3,r3-r2 ++ vsub.f32 d22, d0, d1 @ r0-r1,i0-i1 ++ vmul.f32 d24, d17, d31 @ a2r*w,a2i*w ++ vmul.f32 d25, d19, d31 @ a3r*w,a3i*w ++ vadd.f32 d0, d20, d21 ++ vsub.f32 d2, d20, d21 ++ vadd.f32 d1, d22, d23 ++ vrev64.32 q13, q13 ++ vsub.f32 d3, d22, d23 ++ vsub.f32 d6, d6, d7 ++ vadd.f32 d24, d24, d26 @ a2r+a2i,a2i-a2r t1,t2 ++ vadd.f32 d25, d25, d27 @ a3r-a3i,a3i+a3r t5,t6 ++ vadd.f32 d7, d4, d5 ++ vsub.f32 d18, d2, d6 ++ vext.32 q13, q12, q12, #1 ++ vadd.f32 d2, d2, d6 ++ vsub.f32 d16, d0, d7 ++ vadd.f32 d5, d25, d24 ++ vsub.f32 d4, d26, d27 ++ vadd.f32 d0, d0, d7 ++ vsub.f32 d17, d1, d5 ++ vsub.f32 d19, d3, d4 ++ vadd.f32 d3, d3, d4 ++ vadd.f32 d1, d1, d5 ++ ++ vst1.32 {d16-d19}, [r1,:128] ++ vst1.32 {d0-d3}, [r0,:128] ++ ++ bx lr ++.endfunc ++ ++function fft16_neon ++ movrel r1, mppm ++ vld1.32 {d16-d19}, [r0,:128]! @ q8{r0,i0,r1,i1} q9{r2,i2,r3,i3} ++ pld [r0, #32] ++ vld1.32 {d2-d3}, [r1,:128] ++ vext.32 q13, q9, q9, #1 ++ vld1.32 {d22-d25}, [r0,:128]! @ q11{r4,i4,r5,i5} q12{r6,i5,r7,i7} ++ vadd.f32 d4, d16, d17 ++ vsub.f32 d5, d16, d17 ++ vadd.f32 d18, d18, d19 ++ vsub.f32 d19, d26, d27 ++ ++ vadd.f32 d20, d22, d23 ++ vsub.f32 d22, d22, d23 ++ vsub.f32 d23, d24, d25 ++ vadd.f32 q8, q2, q9 @ {r0,i0,r1,i1} ++ vadd.f32 d21, d24, d25 ++ vmul.f32 d24, d22, d2 ++ vsub.f32 q9, q2, q9 @ {r2,i2,r3,i3} ++ vmul.f32 d25, d23, d3 ++ vuzp.32 d16, d17 @ {r0,r1,i0,i1} ++ vmul.f32 q1, q11, d2[1] ++ vuzp.32 d18, d19 @ {r2,r3,i2,i3} ++ vrev64.32 q12, q12 ++ vadd.f32 q11, q12, q1 @ {t1a,t2a,t5,t6} ++ vld1.32 {d24-d27}, [r0,:128]! @ q12{r8,i8,r9,i9} q13{r10,i10,r11,i11} ++ vzip.32 q10, q11 ++ vld1.32 {d28-d31}, [r0,:128] @ q14{r12,i12,r13,i13} q15{r14,i14,r15,i15} ++ vadd.f32 d0, d22, d20 ++ vadd.f32 d1, d21, d23 ++ vsub.f32 d2, d21, d23 ++ vsub.f32 d3, d22, d20 ++ sub r0, r0, #96 ++ vext.32 q13, q13, q13, #1 ++ vsub.f32 q10, q8, q0 @ {r4,r5,i4,i5} ++ vadd.f32 q8, q8, q0 @ {r0,r1,i0,i1} ++ vext.32 q15, q15, q15, #1 ++ vsub.f32 q11, q9, q1 @ {r6,r7,i6,i7} ++ vswp d25, d26 @ q12{r8,i8,i10,r11} q13{r9,i9,i11,r10} ++ vadd.f32 q9, q9, q1 @ {r2,r3,i2,i3} ++ vswp d29, d30 @ q14{r12,i12,i14,r15} q15{r13,i13,i15,r14} ++ vadd.f32 q0, q12, q13 @ {t1,t2,t5,t6} ++ vadd.f32 q1, q14, q15 @ {t1a,t2a,t5a,t6a} ++ movrel r2, ff_cos_16 ++ vsub.f32 q13, q12, q13 @ {t3,t4,t7,t8} ++ vrev64.32 d1, d1 ++ vsub.f32 q15, q14, q15 @ {t3a,t4a,t7a,t8a} ++ vrev64.32 d3, d3 ++ movrel r3, pmmp ++ vswp d1, d26 @ q0{t1,t2,t3,t4} q13{t6,t5,t7,t8} ++ vswp d3, d30 @ q1{t1a,t2a,t3a,t4a} q15{t6a,t5a,t7a,t8a} ++ vadd.f32 q12, q0, q13 @ {r8,i8,r9,i9} ++ vadd.f32 q14, q1, q15 @ {r12,i12,r13,i13} ++ vld1.32 {d4-d5}, [r2,:64] ++ vsub.f32 q13, q0, q13 @ {r10,i10,r11,i11} ++ vsub.f32 q15, q1, q15 @ {r14,i14,r15,i15} ++ vswp d25, d28 @ q12{r8,i8,r12,i12} q14{r9,i9,r13,i13} ++ vld1.32 {d6-d7}, [r3,:128] ++ vrev64.32 q1, q14 ++ vmul.f32 q14, q14, d4[1] ++ vmul.f32 q1, q1, q3 ++ vmla.f32 q14, q1, d5[1] @ {t1a,t2a,t5a,t6a} ++ vswp d27, d30 @ q13{r10,i10,r14,i14} q15{r11,i11,r15,i15} ++ vzip.32 q12, q14 ++ vadd.f32 d0, d28, d24 ++ vadd.f32 d1, d25, d29 ++ vsub.f32 d2, d25, d29 ++ vsub.f32 d3, d28, d24 ++ vsub.f32 q12, q8, q0 @ {r8,r9,i8,i9} ++ vadd.f32 q8, q8, q0 @ {r0,r1,i0,i1} ++ vsub.f32 q14, q10, q1 @ {r12,r13,i12,i13} ++ mov r1, #32 ++ vadd.f32 q10, q10, q1 @ {r4,r5,i4,i5} ++ vrev64.32 q0, q13 ++ vmul.f32 q13, q13, d5[0] ++ vrev64.32 q1, q15 ++ vmul.f32 q15, q15, d5[1] ++ vst2.32 {d16-d17},[r0,:128], r1 ++ vmul.f32 q0, q0, q3 ++ vst2.32 {d20-d21},[r0,:128], r1 ++ vmul.f32 q1, q1, q3 ++ vmla.f32 q13, q0, d5[0] @ {t1,t2,t5,t6} ++ vmla.f32 q15, q1, d4[1] @ {t1a,t2a,t5a,t6a} ++ vst2.32 {d24-d25},[r0,:128], r1 ++ vst2.32 {d28-d29},[r0,:128] ++ vzip.32 q13, q15 ++ sub r0, r0, #80 ++ vadd.f32 d0, d30, d26 ++ vadd.f32 d1, d27, d31 ++ vsub.f32 d2, d27, d31 ++ vsub.f32 d3, d30, d26 ++ vsub.f32 q13, q9, q0 @ {r10,r11,i10,i11} ++ vadd.f32 q9, q9, q0 @ {r2,r3,i2,i3} ++ vsub.f32 q15, q11, q1 @ {r14,r15,i14,i15} ++ vadd.f32 q11, q11, q1 @ {r6,r7,i6,i7} ++ vst2.32 {d18-d19},[r0,:128], r1 ++ vst2.32 {d22-d23},[r0,:128], r1 ++ vst2.32 {d26-d27},[r0,:128], r1 ++ vst2.32 {d30-d31},[r0,:128] ++ bx lr ++.endfunc ++ ++function fft_pass_neon ++ push {r4-r6,lr} ++ mov r6, r2 @ n ++ lsl r5, r2, #3 @ 2 * n * sizeof FFTSample ++ lsl r4, r2, #4 @ 2 * n * sizeof FFTComplex ++ lsl r2, r2, #5 @ 4 * n * sizeof FFTComplex ++ add r3, r2, r4 ++ add r4, r4, r0 @ &z[o1] ++ add r2, r2, r0 @ &z[o2] ++ add r3, r3, r0 @ &z[o3] ++ vld1.32 {d20-d21},[r2,:128] @ {z[o2],z[o2+1]} ++ movrel r12, pmmp ++ vld1.32 {d22-d23},[r3,:128] @ {z[o3],z[o3+1]} ++ add r5, r5, r1 @ wim ++ vld1.32 {d6-d7}, [r12,:128] @ pmmp ++ vswp d21, d22 ++ vld1.32 {d4}, [r1,:64]! @ {wre[0],wre[1]} ++ sub r5, r5, #4 @ wim-- ++ vrev64.32 q1, q11 ++ vmul.f32 q11, q11, d4[1] ++ vmul.f32 q1, q1, q3 ++ vld1.32 {d5[0]}, [r5,:32] @ d5[0] = wim[-1] ++ vmla.f32 q11, q1, d5[0] @ {t1a,t2a,t5a,t6a} ++ vld2.32 {d16-d17},[r0,:128] @ {z[0],z[1]} ++ sub r6, r6, #1 @ n-- ++ vld2.32 {d18-d19},[r4,:128] @ {z[o1],z[o1+1]} ++ vzip.32 q10, q11 ++ vadd.f32 d0, d22, d20 ++ vadd.f32 d1, d21, d23 ++ vsub.f32 d2, d21, d23 ++ vsub.f32 d3, d22, d20 ++ vsub.f32 q10, q8, q0 ++ vadd.f32 q8, q8, q0 ++ vsub.f32 q11, q9, q1 ++ vadd.f32 q9, q9, q1 ++ vst2.32 {d20-d21},[r2,:128]! @ {z[o2],z[o2+1]} ++ vst2.32 {d16-d17},[r0,:128]! @ {z[0],z[1]} ++ vst2.32 {d22-d23},[r3,:128]! @ {z[o3],z[o3+1]} ++ vst2.32 {d18-d19},[r4,:128]! @ {z[o1],z[o1+1]} ++ sub r5, r5, #8 @ wim -= 2 ++1: ++ vld1.32 {d20-d21},[r2,:128] @ {z[o2],z[o2+1]} ++ vld1.32 {d22-d23},[r3,:128] @ {z[o3],z[o3+1]} ++ vswp d21, d22 ++ vld1.32 {d4}, [r1]! @ {wre[0],wre[1]} ++ vrev64.32 q0, q10 ++ vmul.f32 q10, q10, d4[0] ++ vrev64.32 q1, q11 ++ vmul.f32 q11, q11, d4[1] ++ vld1.32 {d5}, [r5] @ {wim[-1],wim[0]} ++ vmul.f32 q0, q0, q3 ++ sub r5, r5, #8 @ wim -= 2 ++ vmul.f32 q1, q1, q3 ++ vmla.f32 q10, q0, d5[1] @ {t1,t2,t5,t6} ++ vmla.f32 q11, q1, d5[0] @ {t1a,t2a,t5a,t6a} ++ vld2.32 {d16-d17},[r0,:128] @ {z[0],z[1]} ++ subs r6, r6, #1 @ n-- ++ vld2.32 {d18-d19},[r4,:128] @ {z[o1],z[o1+1]} ++ vzip.32 q10, q11 ++ vadd.f32 d0, d22, d20 ++ vadd.f32 d1, d21, d23 ++ vsub.f32 d2, d21, d23 ++ vsub.f32 d3, d22, d20 ++ vsub.f32 q10, q8, q0 ++ vadd.f32 q8, q8, q0 ++ vsub.f32 q11, q9, q1 ++ vadd.f32 q9, q9, q1 ++ vst2.32 {d20-d21}, [r2,:128]! @ {z[o2],z[o2+1]} ++ vst2.32 {d16-d17}, [r0,:128]! @ {z[0],z[1]} ++ vst2.32 {d22-d23}, [r3,:128]! @ {z[o3],z[o3+1]} ++ vst2.32 {d18-d19}, [r4,:128]! @ {z[o1],z[o1+1]} ++ bne 1b ++ ++ pop {r4-r6,pc} ++.endfunc ++ ++.macro def_fft n, n2, n4 ++ .align 6 ++function fft\n\()_neon ++ push {r4, lr} ++ mov r4, r0 ++ bl fft\n2\()_neon ++ add r0, r4, #\n4*2*8 ++ bl fft\n4\()_neon ++ add r0, r4, #\n4*3*8 ++ bl fft\n4\()_neon ++ mov r0, r4 ++ pop {r4, lr} ++ movrel r1, ff_cos_\n ++ mov r2, #\n4/2 ++ b fft_pass_neon ++.endfunc ++.endm ++ ++ def_fft 32, 16, 8 ++ def_fft 64, 32, 16 ++ def_fft 128, 64, 32 ++ def_fft 256, 128, 64 ++ def_fft 512, 256, 128 ++ def_fft 1024, 512, 256 ++ def_fft 2048, 1024, 512 ++ def_fft 4096, 2048, 1024 ++ def_fft 8192, 4096, 2048 ++ def_fft 16384, 8192, 4096 ++ def_fft 32768, 16384, 8192 ++ def_fft 65536, 32768, 16384 ++ ++function ff_fft_calc_neon, export=1 ++ ldr r2, [r0] ++ sub r2, r2, #2 ++ movrel r3, fft_tab_neon ++ ldr r3, [r3, r2, lsl #2] ++ mov r0, r1 ++ bx r3 ++.endfunc ++ ++function ff_fft_permute_neon, export=1 ++ push {r4,lr} ++ mov r12, #1 ++ ldr r2, [r0] @ nbits ++ ldr r3, [r0, #20] @ tmp_buf ++ ldr r0, [r0, #8] @ revtab ++ lsl r12, r12, r2 ++ mov r2, r12 ++1: ++ vld1.32 {d0-d1}, [r1,:128]! ++ ldr r4, [r0], #4 ++ uxtah lr, r3, r4 ++ uxtah r4, r3, r4, ror #16 ++ vst1.32 {d0}, [lr,:64] ++ vst1.32 {d1}, [r4,:64] ++ subs r12, r12, #2 ++ bgt 1b ++ ++ sub r1, r1, r2, lsl #3 ++1: ++ vld1.32 {d0-d3}, [r3,:128]! ++ vst1.32 {d0-d3}, [r1,:128]! ++ subs r2, r2, #4 ++ bgt 1b ++ ++ pop {r4,pc} ++.endfunc ++ ++ .section .rodata ++ .align 4 ++fft_tab_neon: ++ .word fft4_neon ++ .word fft8_neon ++ .word fft16_neon ++ .word fft32_neon ++ .word fft64_neon ++ .word fft128_neon ++ .word fft256_neon ++ .word fft512_neon ++ .word fft1024_neon ++ .word fft2048_neon ++ .word fft4096_neon ++ .word fft8192_neon ++ .word fft16384_neon ++ .word fft32768_neon ++ .word fft65536_neon ++ .size fft_tab_neon, . - fft_tab_neon ++ ++ .align 4 ++pmmp: .float +1.0, -1.0, -1.0, +1.0 ++mppm: .float -M_SQRT1_2, M_SQRT1_2, M_SQRT1_2, -M_SQRT1_2 +diff --git a/libavcodec/arm/mdct_neon.S b/libavcodec/arm/mdct_neon.S +new file mode 100644 +index 0000000..6d1dcfd +--- /dev/null ++++ b/libavcodec/arm/mdct_neon.S +@@ -0,0 +1,178 @@ ++/* ++ * ARM NEON optimised MDCT ++ * Copyright (c) 2009 Mans Rullgard ++ * ++ * This file is part of FFmpeg. ++ * ++ * FFmpeg is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU Lesser General Public ++ * License as published by the Free Software Foundation; either ++ * version 2.1 of the License, or (at your option) any later version. ++ * ++ * FFmpeg is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ * Lesser General Public License for more details. ++ * ++ * You should have received a copy of the GNU Lesser General Public ++ * License along with FFmpeg; if not, write to the Free Software ++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA ++ */ ++ ++#include "asm.S" ++ ++ .fpu neon ++ .text ++ ++function ff_imdct_half_neon, export=1 ++ push {r4-r8,lr} ++ ++ mov r12, #1 ++ ldr lr, [r0, #4] @ nbits ++ ldr r4, [r0, #8] @ tcos ++ ldr r5, [r0, #12] @ tsin ++ ldr r3, [r0, #24] @ revtab ++ lsl r12, r12, lr @ n = 1 << nbits ++ lsr lr, r12, #2 @ n4 = n >> 2 ++ add r7, r2, r12, lsl #1 ++ mov r12, #-16 ++ sub r7, r7, #16 ++ ++ vld1.32 {d16-d17},[r7,:128],r12 @ d16=x,n1 d17=x,n0 ++ vld1.32 {d0-d1}, [r2,:128]! @ d0 =m0,x d1 =m1,x ++ vld1.32 {d2}, [r4,:64]! @ d2=c0,c1 ++ vld1.32 {d3}, [r5,:64]! @ d3=s0,s1 ++ vuzp.32 d17, d16 ++ vuzp.32 d0, d1 ++ vmul.f32 d6, d16, d2 ++ vmul.f32 d7, d0, d2 ++1: ++ subs lr, lr, #2 ++ ldr r6, [r3], #4 ++ vmul.f32 d4, d0, d3 ++ vmul.f32 d5, d16, d3 ++ vsub.f32 d4, d6, d4 ++ vadd.f32 d5, d5, d7 ++ uxtah r8, r1, r6, ror #16 ++ uxtah r6, r1, r6 ++ beq 1f ++ vld1.32 {d16-d17},[r7,:128],r12 ++ vld1.32 {d0-d1}, [r2,:128]! ++ vuzp.32 d17, d16 ++ vld1.32 {d2}, [r4,:64]! ++ vuzp.32 d0, d1 ++ vmul.f32 d6, d16, d2 ++ vld1.32 {d3}, [r5,:64]! ++ vmul.f32 d7, d0, d2 ++ vst2.32 {d4[0],d5[0]}, [r6,:64] ++ vst2.32 {d4[1],d5[1]}, [r8,:64] ++ b 1b ++1: ++ vst2.32 {d4[0],d5[0]}, [r6,:64] ++ vst2.32 {d4[1],d5[1]}, [r8,:64] ++ ++ mov r4, r0 ++ mov r6, r1 ++ add r0, r0, #16 ++ bl ff_fft_calc_neon ++ ++ mov r12, #1 ++ ldr lr, [r4, #4] @ nbits ++ ldr r5, [r4, #12] @ tsin ++ ldr r4, [r4, #8] @ tcos ++ lsl r12, r12, lr @ n = 1 << nbits ++ lsr lr, r12, #3 @ n8 = n >> 3 ++ ++ add r4, r4, lr, lsl #2 ++ add r5, r5, lr, lsl #2 ++ add r6, r6, lr, lsl #3 ++ sub r1, r4, #8 ++ sub r2, r5, #8 ++ sub r3, r6, #16 ++ ++ mov r7, #-16 ++ mov r12, #-8 ++ mov r8, r6 ++ mov r0, r3 ++ ++ vld1.32 {d0-d1}, [r3,:128], r7 @ d0 =i1,r1 d1 =i0,r0 ++ vld1.32 {d20-d21},[r6,:128]! @ d20=i2,r2 d21=i3,r3 ++ vld1.32 {d18}, [r2,:64], r12 @ d18=s1,s0 ++ vuzp.32 d20, d21 ++ vuzp.32 d0, d1 ++1: ++ subs lr, lr, #2 ++ vmul.f32 d7, d0, d18 ++ vld1.32 {d19}, [r5,:64]! @ d19=s2,s3 ++ vmul.f32 d4, d1, d18 ++ vld1.32 {d16}, [r1,:64], r12 @ d16=c1,c0 ++ vmul.f32 d5, d21, d19 ++ vld1.32 {d17}, [r4,:64]! @ d17=c2,c3 ++ vmul.f32 d6, d20, d19 ++ vmul.f32 d22, d1, d16 ++ vmul.f32 d23, d21, d17 ++ vmul.f32 d24, d0, d16 ++ vmul.f32 d25, d20, d17 ++ vadd.f32 d7, d7, d22 ++ vadd.f32 d6, d6, d23 ++ vsub.f32 d4, d4, d24 ++ vsub.f32 d5, d5, d25 ++ beq 1f ++ vld1.32 {d0-d1}, [r3,:128], r7 ++ vld1.32 {d20-d21},[r6,:128]! ++ vld1.32 {d18}, [r2,:64], r12 ++ vuzp.32 d20, d21 ++ vuzp.32 d0, d1 ++ vrev64.32 q3, q3 ++ vtrn.32 d4, d6 ++ vtrn.32 d5, d7 ++ vswp d5, d6 ++ vst1.32 {d4-d5}, [r0,:128], r7 ++ vst1.32 {d6-d7}, [r8,:128]! ++ b 1b ++1: ++ vrev64.32 q3, q3 ++ vtrn.32 d4, d6 ++ vtrn.32 d5, d7 ++ vswp d5, d6 ++ vst1.32 {d4-d5}, [r0,:128] ++ vst1.32 {d6-d7}, [r8,:128] ++ ++ pop {r4-r8,pc} ++.endfunc ++ ++function ff_imdct_calc_neon, export=1 ++ push {r4-r6,lr} ++ ++ ldr r3, [r0, #4] ++ mov r4, #1 ++ mov r5, r1 ++ lsl r4, r4, r3 ++ add r1, r1, r4 ++ ++ bl ff_imdct_half_neon ++ ++ add r0, r5, r4, lsl #2 ++ add r1, r5, r4, lsl #1 ++ sub r0, r0, #8 ++ sub r2, r1, #16 ++ mov r3, #-16 ++ mov r6, #-8 ++ vmov.i32 d30, #1<<31 ++1: ++ vld1.32 {d0-d1}, [r2,:128], r3 ++ pld [r0, #-16] ++ vrev64.32 q0, q0 ++ vld1.32 {d2-d3}, [r1,:128]! ++ veor d4, d1, d30 ++ pld [r2, #-16] ++ vrev64.32 q1, q1 ++ veor d5, d0, d30 ++ vst1.32 {d2}, [r0,:64], r6 ++ vst1.32 {d3}, [r0,:64], r6 ++ vst1.32 {d4-d5}, [r5,:128]! ++ subs r4, r4, #16 ++ bgt 1b ++ ++ pop {r4-r6,pc} ++.endfunc +diff --git a/libavcodec/dsputil.h b/libavcodec/dsputil.h +index e9c2bfc..c4abd14 100644 +--- a/libavcodec/dsputil.h ++++ b/libavcodec/dsputil.h +@@ -692,11 +692,13 @@ extern FFTSample* ff_cos_tabs[13]; + int ff_fft_init(FFTContext *s, int nbits, int inverse); + void ff_fft_permute_c(FFTContext *s, FFTComplex *z); + void ff_fft_permute_sse(FFTContext *s, FFTComplex *z); ++void ff_fft_permute_neon(FFTContext *s, FFTComplex *z); + void ff_fft_calc_c(FFTContext *s, FFTComplex *z); + void ff_fft_calc_sse(FFTContext *s, FFTComplex *z); + void ff_fft_calc_3dn(FFTContext *s, FFTComplex *z); + void ff_fft_calc_3dn2(FFTContext *s, FFTComplex *z); + void ff_fft_calc_altivec(FFTContext *s, FFTComplex *z); ++void ff_fft_calc_neon(FFTContext *s, FFTComplex *z); + + /** + * Do the permutation needed BEFORE calling ff_fft_calc(). +@@ -766,6 +768,8 @@ void ff_imdct_calc_3dn2(MDCTContext *s, FFTSample *output, const FFTSample *inpu + void ff_imdct_half_3dn2(MDCTContext *s, FFTSample *output, const FFTSample *input); + void ff_imdct_calc_sse(MDCTContext *s, FFTSample *output, const FFTSample *input); + void ff_imdct_half_sse(MDCTContext *s, FFTSample *output, const FFTSample *input); ++void ff_imdct_calc_neon(MDCTContext *s, FFTSample *output, const FFTSample *input); ++void ff_imdct_half_neon(MDCTContext *s, FFTSample *output, const FFTSample *input); + void ff_mdct_calc(MDCTContext *s, FFTSample *out, const FFTSample *input); + void ff_mdct_end(MDCTContext *s); + +diff --git a/libavcodec/fft.c b/libavcodec/fft.c +index 296f634..b05ddda 100644 +--- a/libavcodec/fft.c ++++ b/libavcodec/fft.c +@@ -64,6 +64,7 @@ av_cold int ff_fft_init(FFTContext *s, int nbits, int inverse) + float alpha, c1, s1, s2; + int split_radix = 1; + int av_unused has_vectors; ++ int revtab_shift = 0; + + if (nbits < 2 || nbits > 16) + goto fail; +@@ -112,6 +113,12 @@ av_cold int ff_fft_init(FFTContext *s, int nbits, int inverse) + s->fft_calc = ff_fft_calc_altivec; + split_radix = 0; + } ++#elif HAVE_NEON ++ s->fft_permute = ff_fft_permute_neon; ++ s->fft_calc = ff_fft_calc_neon; ++ s->imdct_calc = ff_imdct_calc_neon; ++ s->imdct_half = ff_imdct_half_neon; ++ revtab_shift = 3; + #endif + + if (split_radix) { +@@ -125,7 +132,8 @@ av_cold int ff_fft_init(FFTContext *s, int nbits, int inverse) + tab[m/2-i] = tab[i]; + } + for(i=0; irevtab[-split_radix_permutation(i, n, s->inverse) & (n-1)] = i; ++ s->revtab[-split_radix_permutation(i, n, s->inverse) & (n-1)] = ++ i << revtab_shift; + s->tmp_buf = av_malloc(n * sizeof(FFTComplex)); + } else { + int np, nblocks, np2, l; +-- +1.6.3.3 + --- ffmpeg-0.5+svn20090706.orig/debian/patches/neon/0021-ARM-check-for-VFP-register-arguments.patch +++ ffmpeg-0.5+svn20090706/debian/patches/neon/0021-ARM-check-for-VFP-register-arguments.patch @@ -0,0 +1,55 @@ +From 2062a3d147ea6123eb0aa2b010be6c662e58f291 Mon Sep 17 00:00:00 2001 +From: mru +Date: Mon, 20 Jul 2009 22:30:24 +0000 +Subject: [PATCH] ARM: check for VFP register arguments + +git-svn-id: file:///var/local/repositories/ffmpeg/trunk@19474 9553f0bf-9b14-0410-a0b8-cfaf0461ba5b +--- + configure | 6 ++++++ + libavcodec/arm/asm.S | 9 +++++++++ + 2 files changed, 15 insertions(+), 0 deletions(-) + +diff --git a/configure b/configure +index 7459215..d0c7096 100755 +--- a/configure ++++ b/configure +@@ -917,6 +917,7 @@ HAVE_LIST=" + termios_h + threads + truncf ++ vfp_args + winsock2_h + yasm + " +@@ -1866,6 +1867,11 @@ fi + + # check for assembler specific support + ++enabled arm && check_ld < +Date: Fri, 11 Sep 2009 02:01:18 +0000 +Subject: [PATCH 17/27] ARM: faster NEON IMDCT + +git-svn-id: file:///var/local/repositories/ffmpeg/trunk@19817 9553f0bf-9b14-0410-a0b8-cfaf0461ba5b +--- + libavcodec/arm/mdct_neon.S | 46 ++++++++++++++++--------------------------- + 1 files changed, 17 insertions(+), 29 deletions(-) + +diff --git a/libavcodec/arm/mdct_neon.S b/libavcodec/arm/mdct_neon.S +index 6d1dcfd..d84eccd 100644 +--- a/libavcodec/arm/mdct_neon.S ++++ b/libavcodec/arm/mdct_neon.S +@@ -38,30 +38,28 @@ function ff_imdct_half_neon, export=1 + mov r12, #-16 + sub r7, r7, #16 + +- vld1.32 {d16-d17},[r7,:128],r12 @ d16=x,n1 d17=x,n0 +- vld1.32 {d0-d1}, [r2,:128]! @ d0 =m0,x d1 =m1,x ++ vld2.32 {d16-d17},[r7,:128],r12 @ d16=x,n1 d17=x,n0 ++ vld2.32 {d0-d1}, [r2,:128]! @ d0 =m0,x d1 =m1,x ++ vrev64.32 d17, d17 + vld1.32 {d2}, [r4,:64]! @ d2=c0,c1 ++ vmul.f32 d6, d17, d2 + vld1.32 {d3}, [r5,:64]! @ d3=s0,s1 +- vuzp.32 d17, d16 +- vuzp.32 d0, d1 +- vmul.f32 d6, d16, d2 + vmul.f32 d7, d0, d2 + 1: + subs lr, lr, #2 + ldr r6, [r3], #4 + vmul.f32 d4, d0, d3 +- vmul.f32 d5, d16, d3 ++ vmul.f32 d5, d17, d3 + vsub.f32 d4, d6, d4 + vadd.f32 d5, d5, d7 + uxtah r8, r1, r6, ror #16 + uxtah r6, r1, r6 + beq 1f +- vld1.32 {d16-d17},[r7,:128],r12 +- vld1.32 {d0-d1}, [r2,:128]! +- vuzp.32 d17, d16 ++ vld2.32 {d16-d17},[r7,:128],r12 ++ vld2.32 {d0-d1}, [r2,:128]! ++ vrev64.32 d17, d17 + vld1.32 {d2}, [r4,:64]! +- vuzp.32 d0, d1 +- vmul.f32 d6, d16, d2 ++ vmul.f32 d6, d17, d2 + vld1.32 {d3}, [r5,:64]! + vmul.f32 d7, d0, d2 + vst2.32 {d4[0],d5[0]}, [r6,:64] +@@ -95,11 +93,9 @@ function ff_imdct_half_neon, export=1 + mov r8, r6 + mov r0, r3 + +- vld1.32 {d0-d1}, [r3,:128], r7 @ d0 =i1,r1 d1 =i0,r0 +- vld1.32 {d20-d21},[r6,:128]! @ d20=i2,r2 d21=i3,r3 ++ vld2.32 {d0-d1}, [r3,:128], r7 @ d0 =i1,r1 d1 =i0,r0 ++ vld2.32 {d20-d21},[r6,:128]! @ d20=i2,r2 d21=i3,r3 + vld1.32 {d18}, [r2,:64], r12 @ d18=s1,s0 +- vuzp.32 d20, d21 +- vuzp.32 d0, d1 + 1: + subs lr, lr, #2 + vmul.f32 d7, d0, d18 +@@ -118,25 +114,17 @@ function ff_imdct_half_neon, export=1 + vsub.f32 d4, d4, d24 + vsub.f32 d5, d5, d25 + beq 1f +- vld1.32 {d0-d1}, [r3,:128], r7 +- vld1.32 {d20-d21},[r6,:128]! ++ vld2.32 {d0-d1}, [r3,:128], r7 ++ vld2.32 {d20-d21},[r6,:128]! + vld1.32 {d18}, [r2,:64], r12 +- vuzp.32 d20, d21 +- vuzp.32 d0, d1 + vrev64.32 q3, q3 +- vtrn.32 d4, d6 +- vtrn.32 d5, d7 +- vswp d5, d6 +- vst1.32 {d4-d5}, [r0,:128], r7 +- vst1.32 {d6-d7}, [r8,:128]! ++ vst2.32 {d4,d6}, [r0,:128], r7 ++ vst2.32 {d5,d7}, [r8,:128]! + b 1b + 1: + vrev64.32 q3, q3 +- vtrn.32 d4, d6 +- vtrn.32 d5, d7 +- vswp d5, d6 +- vst1.32 {d4-d5}, [r0,:128] +- vst1.32 {d6-d7}, [r8,:128] ++ vst2.32 {d4,d6}, [r0,:128] ++ vst2.32 {d5,d7}, [r8,:128] + + pop {r4-r8,pc} + .endfunc +-- +1.6.3.3 + --- ffmpeg-0.5+svn20090706.orig/debian/patches/neon/0009-ARM-actually-add-VP3-loop-filter.patch +++ ffmpeg-0.5+svn20090706/debian/patches/neon/0009-ARM-actually-add-VP3-loop-filter.patch @@ -0,0 +1,114 @@ +From 2ca1dc1b533f6916ac593d435e1af8a299944d2c Mon Sep 17 00:00:00 2001 +From: conrad +Date: Sat, 23 May 2009 18:47:26 +0000 +Subject: [PATCH 09/27] ARM: actually add VP3 loop filter + +git-svn-id: file:///var/local/repositories/ffmpeg/trunk@18917 9553f0bf-9b14-0410-a0b8-cfaf0461ba5b +--- + libavcodec/arm/vp3dsp_neon.S | 94 ++++++++++++++++++++++++++++++++++++++++++ + 1 files changed, 94 insertions(+), 0 deletions(-) + create mode 100644 libavcodec/arm/vp3dsp_neon.S + +diff --git a/libavcodec/arm/vp3dsp_neon.S b/libavcodec/arm/vp3dsp_neon.S +new file mode 100644 +index 0000000..cce80dd +--- /dev/null ++++ b/libavcodec/arm/vp3dsp_neon.S +@@ -0,0 +1,94 @@ ++/* ++ * Copyright (c) 2009 David Conrad ++ * ++ * This file is part of FFmpeg. ++ * ++ * FFmpeg is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU Lesser General Public ++ * License as published by the Free Software Foundation; either ++ * version 2.1 of the License, or (at your option) any later version. ++ * ++ * FFmpeg is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ * Lesser General Public License for more details. ++ * ++ * You should have received a copy of the GNU Lesser General Public ++ * License along with FFmpeg; if not, write to the Free Software ++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA ++ */ ++ ++#include "asm.S" ++ ++.macro vp3_loop_filter ++ vsubl.u8 q3, d18, d17 ++ vsubl.u8 q2, d16, d19 ++ vadd.i16 q1, q3, q3 ++ vadd.i16 q2, q2, q3 ++ vadd.i16 q0, q1, q2 ++ vrshr.s16 q0, q0, #3 ++ vmovl.u8 q9, d18 ++ vdup.u16 q15, r2 ++ ++ vabs.s16 q1, q0 ++ vshr.s16 q0, q0, #15 ++ vqsub.u16 q2, q15, q1 ++ vqsub.u16 q3, q2, q1 ++ vsub.i16 q1, q2, q3 ++ veor q1, q1, q0 ++ vsub.i16 q0, q1, q0 ++ ++ vaddw.u8 q2, q0, d17 ++ vsub.i16 q3, q9, q0 ++ vqmovun.s16 d0, q2 ++ vqmovun.s16 d1, q3 ++.endm ++ ++function ff_vp3_v_loop_filter_neon, export=1 ++ sub ip, r0, r1 ++ sub r0, r0, r1, lsl #1 ++ vld1.64 {d16}, [r0,:64], r1 ++ vld1.64 {d17}, [r0,:64], r1 ++ vld1.64 {d18}, [r0,:64], r1 ++ vld1.64 {d19}, [r0,:64], r1 ++ ldrb r2, [r2, #129*4] ++ ++ vp3_loop_filter ++ ++ vst1.64 {d0}, [ip,:64], r1 ++ vst1.64 {d1}, [ip,:64], r1 ++ bx lr ++.endfunc ++ ++function ff_vp3_h_loop_filter_neon, export=1 ++ sub ip, r0, #1 ++ sub r0, r0, #2 ++ vld1.32 {d16[]}, [r0], r1 ++ vld1.32 {d17[]}, [r0], r1 ++ vld1.32 {d18[]}, [r0], r1 ++ vld1.32 {d19[]}, [r0], r1 ++ vld1.32 {d16[1]}, [r0], r1 ++ vld1.32 {d17[1]}, [r0], r1 ++ vld1.32 {d18[1]}, [r0], r1 ++ vld1.32 {d19[1]}, [r0], r1 ++ ldrb r2, [r2, #129*4] ++ ++ vtrn.8 d16, d17 ++ vtrn.8 d18, d19 ++ vtrn.16 d16, d18 ++ vtrn.16 d17, d19 ++ ++ vp3_loop_filter ++ ++ vtrn.8 d0, d1 ++ ++ vst1.16 {d0[0]}, [ip], r1 ++ vst1.16 {d1[0]}, [ip], r1 ++ vst1.16 {d0[1]}, [ip], r1 ++ vst1.16 {d1[1]}, [ip], r1 ++ vst1.16 {d0[2]}, [ip], r1 ++ vst1.16 {d1[2]}, [ip], r1 ++ vst1.16 {d0[3]}, [ip], r1 ++ vst1.16 {d1[3]}, [ip], r1 ++ bx lr ++.endfunc +-- +1.6.3.3 + --- ffmpeg-0.5+svn20090706.orig/debian/patches/neon/0006-ARM-NEON-put_pixels_clamped.patch +++ ffmpeg-0.5+svn20090706/debian/patches/neon/0006-ARM-NEON-put_pixels_clamped.patch @@ -0,0 +1,69 @@ +From 9744978dd7b9ca9dda0846fa82faf6fa264a52a7 Mon Sep 17 00:00:00 2001 +From: conrad +Date: Wed, 29 Apr 2009 11:31:43 +0000 +Subject: [PATCH 06/27] ARM: NEON put_pixels_clamped + +git-svn-id: file:///var/local/repositories/ffmpeg/trunk@18712 9553f0bf-9b14-0410-a0b8-cfaf0461ba5b +--- + libavcodec/arm/dsputil_neon.c | 2 ++ + libavcodec/arm/dsputil_neon_s.S | 24 ++++++++++++++++++++++++ + 2 files changed, 26 insertions(+), 0 deletions(-) + +diff --git a/libavcodec/arm/dsputil_neon.c b/libavcodec/arm/dsputil_neon.c +index 37425a3..9b95130 100644 +--- a/libavcodec/arm/dsputil_neon.c ++++ b/libavcodec/arm/dsputil_neon.c +@@ -42,6 +42,7 @@ void ff_put_pixels8_xy2_no_rnd_neon(uint8_t *, const uint8_t *, int, int); + void ff_avg_pixels16_neon(uint8_t *, const uint8_t *, int, int); + + void ff_add_pixels_clamped_neon(const DCTELEM *, uint8_t *, int); ++void ff_put_pixels_clamped_neon(const DCTELEM *, uint8_t *, int); + void ff_put_signed_pixels_clamped_neon(const DCTELEM *, uint8_t *, int); + + void ff_put_h264_qpel16_mc00_neon(uint8_t *, uint8_t *, int); +@@ -180,6 +181,7 @@ void ff_dsputil_init_neon(DSPContext *c, AVCodecContext *avctx) + c->avg_pixels_tab[0][0] = ff_avg_pixels16_neon; + + c->add_pixels_clamped = ff_add_pixels_clamped_neon; ++ c->put_pixels_clamped = ff_put_pixels_clamped_neon; + c->put_signed_pixels_clamped = ff_put_signed_pixels_clamped_neon; + + c->put_h264_chroma_pixels_tab[0] = ff_put_h264_chroma_mc8_neon; +diff --git a/libavcodec/arm/dsputil_neon_s.S b/libavcodec/arm/dsputil_neon_s.S +index f16293d..a55e05f 100644 +--- a/libavcodec/arm/dsputil_neon_s.S ++++ b/libavcodec/arm/dsputil_neon_s.S +@@ -273,6 +273,30 @@ function ff_put_h264_qpel8_mc00_neon, export=1 + pixfunc2 put_ pixels8_y2, _no_rnd, vhadd.u8 + pixfunc2 put_ pixels8_xy2, _no_rnd, vshrn.u16, 1 + ++function ff_put_pixels_clamped_neon, export=1 ++ vld1.64 {d16-d19}, [r0,:128]! ++ vqmovun.s16 d0, q8 ++ vld1.64 {d20-d23}, [r0,:128]! ++ vqmovun.s16 d1, q9 ++ vld1.64 {d24-d27}, [r0,:128]! ++ vqmovun.s16 d2, q10 ++ vld1.64 {d28-d31}, [r0,:128]! ++ vqmovun.s16 d3, q11 ++ vst1.64 {d0}, [r1,:64], r2 ++ vqmovun.s16 d4, q12 ++ vst1.64 {d1}, [r1,:64], r2 ++ vqmovun.s16 d5, q13 ++ vst1.64 {d2}, [r1,:64], r2 ++ vqmovun.s16 d6, q14 ++ vst1.64 {d3}, [r1,:64], r2 ++ vqmovun.s16 d7, q15 ++ vst1.64 {d4}, [r1,:64], r2 ++ vst1.64 {d5}, [r1,:64], r2 ++ vst1.64 {d6}, [r1,:64], r2 ++ vst1.64 {d7}, [r1,:64], r2 ++ bx lr ++ .endfunc ++ + function ff_put_signed_pixels_clamped_neon, export=1 + vmov.u8 d31, #128 + vld1.64 {d16-d17}, [r0,:128]! +-- +1.6.3.3 + --- ffmpeg-0.5+svn20090706.orig/debian/patches/neon/0001-ARM-NEON-optimised-add_pixels_clamped.patch +++ ffmpeg-0.5+svn20090706/debian/patches/neon/0001-ARM-NEON-optimised-add_pixels_clamped.patch @@ -0,0 +1,94 @@ +From 75eadd829625f3ef75fad613846ff98773e547ca Mon Sep 17 00:00:00 2001 +From: mru +Date: Sat, 4 Apr 2009 20:18:58 +0000 +Subject: [PATCH 01/27] ARM: NEON optimised add_pixels_clamped + +Based on patch by David Conrad. + +git-svn-id: file:///var/local/repositories/ffmpeg/trunk@18332 9553f0bf-9b14-0410-a0b8-cfaf0461ba5b +--- + libavcodec/arm/dsputil_neon.c | 4 +++ + libavcodec/arm/dsputil_neon_s.S | 45 +++++++++++++++++++++++++++++++++++++++ + 2 files changed, 49 insertions(+), 0 deletions(-) + +diff --git a/libavcodec/arm/dsputil_neon.c b/libavcodec/arm/dsputil_neon.c +index e18a487..2e56308 100644 +--- a/libavcodec/arm/dsputil_neon.c ++++ b/libavcodec/arm/dsputil_neon.c +@@ -41,6 +41,8 @@ void ff_put_pixels8_xy2_no_rnd_neon(uint8_t *, const uint8_t *, int, int); + + void ff_avg_pixels16_neon(uint8_t *, const uint8_t *, int, int); + ++void ff_add_pixels_clamped_neon(const DCTELEM *, uint8_t *, int); ++ + void ff_put_h264_qpel16_mc00_neon(uint8_t *, uint8_t *, int); + void ff_put_h264_qpel16_mc10_neon(uint8_t *, uint8_t *, int); + void ff_put_h264_qpel16_mc20_neon(uint8_t *, uint8_t *, int); +@@ -176,6 +178,8 @@ void ff_dsputil_init_neon(DSPContext *c, AVCodecContext *avctx) + + c->avg_pixels_tab[0][0] = ff_avg_pixels16_neon; + ++ c->add_pixels_clamped = ff_add_pixels_clamped_neon; ++ + c->put_h264_chroma_pixels_tab[0] = ff_put_h264_chroma_mc8_neon; + c->put_h264_chroma_pixels_tab[1] = ff_put_h264_chroma_mc4_neon; + +diff --git a/libavcodec/arm/dsputil_neon_s.S b/libavcodec/arm/dsputil_neon_s.S +index 3b39d2e..c305210 100644 +--- a/libavcodec/arm/dsputil_neon_s.S ++++ b/libavcodec/arm/dsputil_neon_s.S +@@ -273,6 +273,51 @@ function ff_put_h264_qpel8_mc00_neon, export=1 + pixfunc2 put_ pixels8_y2, _no_rnd, vhadd.u8 + pixfunc2 put_ pixels8_xy2, _no_rnd, vshrn.u16, 1 + ++function ff_add_pixels_clamped_neon, export=1 ++ mov r3, r1 ++ vld1.64 {d16}, [r1,:64], r2 ++ vld1.64 {d0-d1}, [r0,:128]! ++ vaddw.u8 q0, q0, d16 ++ vld1.64 {d17}, [r1,:64], r2 ++ vld1.64 {d2-d3}, [r0,:128]! ++ vqmovun.s16 d0, q0 ++ vld1.64 {d18}, [r1,:64], r2 ++ vaddw.u8 q1, q1, d17 ++ vld1.64 {d4-d5}, [r0,:128]! ++ vaddw.u8 q2, q2, d18 ++ vst1.64 {d0}, [r3,:64], r2 ++ vqmovun.s16 d2, q1 ++ vld1.64 {d19}, [r1,:64], r2 ++ vld1.64 {d6-d7}, [r0,:128]! ++ vaddw.u8 q3, q3, d19 ++ vqmovun.s16 d4, q2 ++ vst1.64 {d2}, [r3,:64], r2 ++ vld1.64 {d16}, [r1,:64], r2 ++ vqmovun.s16 d6, q3 ++ vld1.64 {d0-d1}, [r0,:128]! ++ vaddw.u8 q0, q0, d16 ++ vst1.64 {d4}, [r3,:64], r2 ++ vld1.64 {d17}, [r1,:64], r2 ++ vld1.64 {d2-d3}, [r0,:128]! ++ vaddw.u8 q1, q1, d17 ++ vst1.64 {d6}, [r3,:64], r2 ++ vqmovun.s16 d0, q0 ++ vld1.64 {d18}, [r1,:64], r2 ++ vld1.64 {d4-d5}, [r0,:128]! ++ vaddw.u8 q2, q2, d18 ++ vst1.64 {d0}, [r3,:64], r2 ++ vqmovun.s16 d2, q1 ++ vld1.64 {d19}, [r1,:64], r2 ++ vqmovun.s16 d4, q2 ++ vld1.64 {d6-d7}, [r0,:128]! ++ vaddw.u8 q3, q3, d19 ++ vst1.64 {d2}, [r3,:64], r2 ++ vqmovun.s16 d6, q3 ++ vst1.64 {d4}, [r3,:64], r2 ++ vst1.64 {d6}, [r3,:64], r2 ++ bx lr ++ .endfunc ++ + function ff_float_to_int16_neon, export=1 + subs r2, r2, #8 + vld1.64 {d0-d1}, [r1,:128]! +-- +1.6.3.3 + --- ffmpeg-0.5+svn20090706.orig/debian/patches/neon/0007-ARM-Use-fewer-register-in-NEON-put_pixels-_y2-and-_x.patch +++ ffmpeg-0.5+svn20090706/debian/patches/neon/0007-ARM-Use-fewer-register-in-NEON-put_pixels-_y2-and-_x.patch @@ -0,0 +1,168 @@ +From dcd9d80a563a1877e1e5f9182d1bf0ac08ccc7d4 Mon Sep 17 00:00:00 2001 +From: conrad +Date: Wed, 29 Apr 2009 11:38:09 +0000 +Subject: [PATCH 07/27] ARM: Use fewer register in NEON put_pixels _y2 and _xy2 + Approved by Mans on IRC + +git-svn-id: file:///var/local/repositories/ffmpeg/trunk@18713 9553f0bf-9b14-0410-a0b8-cfaf0461ba5b +--- + libavcodec/arm/dsputil_neon_s.S | 64 ++++++++++++++++----------------------- + 1 files changed, 26 insertions(+), 38 deletions(-) + +diff --git a/libavcodec/arm/dsputil_neon_s.S b/libavcodec/arm/dsputil_neon_s.S +index a55e05f..303b11c 100644 +--- a/libavcodec/arm/dsputil_neon_s.S ++++ b/libavcodec/arm/dsputil_neon_s.S +@@ -73,35 +73,29 @@ + .endm + + .macro pixels16_y2 vhadd=vrhadd.u8 +- push {lr} +- add ip, r1, r2 +- lsl lr, r2, #1 +- vld1.64 {d0, d1}, [r1], lr +- vld1.64 {d2, d3}, [ip], lr ++ vld1.64 {d0, d1}, [r1], r2 ++ vld1.64 {d2, d3}, [r1], r2 + 1: subs r3, r3, #2 + \vhadd q2, q0, q1 +- vld1.64 {d0, d1}, [r1], lr ++ vld1.64 {d0, d1}, [r1], r2 + \vhadd q3, q0, q1 +- vld1.64 {d2, d3}, [ip], lr ++ vld1.64 {d2, d3}, [r1], r2 + pld [r1] +- pld [ip] ++ pld [r1, r2] + vst1.64 {d4, d5}, [r0,:128], r2 + vst1.64 {d6, d7}, [r0,:128], r2 + bne 1b +- pop {pc} ++ bx lr + .endm + + .macro pixels16_xy2 vshrn=vrshrn.u16 no_rnd=0 +- push {lr} +- lsl lr, r2, #1 +- add ip, r1, r2 +- vld1.64 {d0-d2}, [r1], lr +- vld1.64 {d4-d6}, [ip], lr ++ vld1.64 {d0-d2}, [r1], r2 ++ vld1.64 {d4-d6}, [r1], r2 + .if \no_rnd + vmov.i16 q13, #1 + .endif + pld [r1] +- pld [ip] ++ pld [r1, r2] + vext.8 q1, q0, q1, #1 + vext.8 q3, q2, q3, #1 + vaddl.u8 q8, d0, d2 +@@ -109,7 +103,7 @@ + vaddl.u8 q9, d4, d6 + vaddl.u8 q11, d5, d7 + 1: subs r3, r3, #2 +- vld1.64 {d0-d2}, [r1], lr ++ vld1.64 {d0-d2}, [r1], r2 + vadd.u16 q12, q8, q9 + pld [r1] + .if \no_rnd +@@ -123,11 +117,11 @@ + .endif + \vshrn d29, q1, #2 + vaddl.u8 q8, d0, d30 +- vld1.64 {d2-d4}, [ip], lr ++ vld1.64 {d2-d4}, [r1], r2 + vaddl.u8 q10, d1, d31 + vst1.64 {d28,d29}, [r0,:128], r2 + vadd.u16 q12, q8, q9 +- pld [ip] ++ pld [r1, r2] + .if \no_rnd + vadd.u16 q12, q12, q13 + .endif +@@ -142,7 +136,7 @@ + vaddl.u8 q11, d3, d5 + vst1.64 {d30,d31}, [r0,:128], r2 + bgt 1b +- pop {pc} ++ bx lr + .endm + + .macro pixels8 +@@ -180,41 +174,35 @@ + .endm + + .macro pixels8_y2 vhadd=vrhadd.u8 +- push {lr} +- add ip, r1, r2 +- lsl lr, r2, #1 +- vld1.64 {d0}, [r1], lr +- vld1.64 {d1}, [ip], lr ++ vld1.64 {d0}, [r1], r2 ++ vld1.64 {d1}, [r1], r2 + 1: subs r3, r3, #2 + \vhadd d4, d0, d1 +- vld1.64 {d0}, [r1], lr ++ vld1.64 {d0}, [r1], r2 + \vhadd d5, d0, d1 +- vld1.64 {d1}, [ip], lr ++ vld1.64 {d1}, [r1], r2 + pld [r1] +- pld [ip] ++ pld [r1, r2] + vst1.64 {d4}, [r0,:64], r2 + vst1.64 {d5}, [r0,:64], r2 + bne 1b +- pop {pc} ++ bx lr + .endm + + .macro pixels8_xy2 vshrn=vrshrn.u16 no_rnd=0 +- push {lr} +- lsl lr, r2, #1 +- add ip, r1, r2 +- vld1.64 {d0, d1}, [r1], lr +- vld1.64 {d2, d3}, [ip], lr ++ vld1.64 {d0, d1}, [r1], r2 ++ vld1.64 {d2, d3}, [r1], r2 + .if \no_rnd + vmov.i16 q11, #1 + .endif + pld [r1] +- pld [ip] ++ pld [r1, r2] + vext.8 d4, d0, d1, #1 + vext.8 d6, d2, d3, #1 + vaddl.u8 q8, d0, d4 + vaddl.u8 q9, d2, d6 + 1: subs r3, r3, #2 +- vld1.64 {d0, d1}, [r1], lr ++ vld1.64 {d0, d1}, [r1], r2 + pld [r1] + vadd.u16 q10, q8, q9 + vext.8 d4, d0, d1, #1 +@@ -223,9 +211,9 @@ + .endif + vaddl.u8 q8, d0, d4 + \vshrn d5, q10, #2 +- vld1.64 {d2, d3}, [ip], lr ++ vld1.64 {d2, d3}, [r1], r2 + vadd.u16 q10, q8, q9 +- pld [ip] ++ pld [r1, r2] + .if \no_rnd + vadd.u16 q10, q10, q11 + .endif +@@ -235,7 +223,7 @@ + vaddl.u8 q9, d2, d6 + vst1.64 {d7}, [r0,:64], r2 + bgt 1b +- pop {pc} ++ bx lr + .endm + + .macro pixfunc pfx name suf rnd_op args:vararg +-- +1.6.3.3 + --- ffmpeg-0.5+svn20090706.orig/debian/patches/neon/0011-ARM-slightly-faster-NEON-H264-horizontal-loop-filter.patch +++ ffmpeg-0.5+svn20090706/debian/patches/neon/0011-ARM-slightly-faster-NEON-H264-horizontal-loop-filter.patch @@ -0,0 +1,85 @@ +From 56f78a98e66f1bd2bc29b00a048421e2f1760785 Mon Sep 17 00:00:00 2001 +From: mru +Date: Wed, 17 Jun 2009 22:33:04 +0000 +Subject: [PATCH 11/27] ARM: slightly faster NEON H264 horizontal loop filter + +git-svn-id: file:///var/local/repositories/ffmpeg/trunk@19216 9553f0bf-9b14-0410-a0b8-cfaf0461ba5b +--- + libavcodec/arm/h264dsp_neon.S | 49 +++++++++++++++++++++-------------------- + 1 files changed, 25 insertions(+), 24 deletions(-) + +diff --git a/libavcodec/arm/h264dsp_neon.S b/libavcodec/arm/h264dsp_neon.S +index 44a1373..03e21f1 100644 +--- a/libavcodec/arm/h264dsp_neon.S ++++ b/libavcodec/arm/h264dsp_neon.S +@@ -37,6 +37,13 @@ + vtrn.8 \r6, \r7 + .endm + ++ .macro transpose_4x4 r0 r1 r2 r3 ++ vtrn.16 \r0, \r2 ++ vtrn.16 \r1, \r3 ++ vtrn.8 \r0, \r1 ++ vtrn.8 \r2, \r3 ++ .endm ++ + .macro swap4 r0 r1 r2 r3 r4 r5 r6 r7 + vswp \r0, \r4 + vswp \r1, \r5 +@@ -469,35 +476,29 @@ function ff_h264_h_loop_filter_luma_neon, export=1 + transpose_8x8 q3, q10, q9, q8, q0, q1, q2, q13 + + align_push_regs +- sub sp, sp, #16 +- vst1.64 {d4, d5}, [sp,:128] +- sub sp, sp, #16 +- vst1.64 {d20,d21}, [sp,:128] + + h264_loop_filter_luma + +- vld1.64 {d20,d21}, [sp,:128]! +- vld1.64 {d4, d5}, [sp,:128]! +- +- transpose_8x8 q3, q10, q4, q8, q0, q5, q2, q13 ++ transpose_4x4 q4, q8, q0, q5 + + sub r0, r0, r1, lsl #4 +- vst1.64 {d6}, [r0], r1 +- vst1.64 {d20}, [r0], r1 +- vst1.64 {d8}, [r0], r1 +- vst1.64 {d16}, [r0], r1 +- vst1.64 {d0}, [r0], r1 +- vst1.64 {d10}, [r0], r1 +- vst1.64 {d4}, [r0], r1 +- vst1.64 {d26}, [r0], r1 +- vst1.64 {d7}, [r0], r1 +- vst1.64 {d21}, [r0], r1 +- vst1.64 {d9}, [r0], r1 +- vst1.64 {d17}, [r0], r1 +- vst1.64 {d1}, [r0], r1 +- vst1.64 {d11}, [r0], r1 +- vst1.64 {d5}, [r0], r1 +- vst1.64 {d27}, [r0], r1 ++ add r0, r0, #2 ++ vst1.32 {d8[0]}, [r0], r1 ++ vst1.32 {d16[0]}, [r0], r1 ++ vst1.32 {d0[0]}, [r0], r1 ++ vst1.32 {d10[0]}, [r0], r1 ++ vst1.32 {d8[1]}, [r0], r1 ++ vst1.32 {d16[1]}, [r0], r1 ++ vst1.32 {d0[1]}, [r0], r1 ++ vst1.32 {d10[1]}, [r0], r1 ++ vst1.32 {d9[0]}, [r0], r1 ++ vst1.32 {d17[0]}, [r0], r1 ++ vst1.32 {d1[0]}, [r0], r1 ++ vst1.32 {d11[0]}, [r0], r1 ++ vst1.32 {d9[1]}, [r0], r1 ++ vst1.32 {d17[1]}, [r0], r1 ++ vst1.32 {d1[1]}, [r0], r1 ++ vst1.32 {d11[1]}, [r0], r1 + + align_pop_regs + bx lr +-- +1.6.3.3 + --- ffmpeg-0.5+svn20090706.orig/debian/patches/neon/0013-ARM-NEON-VP3-IDCT.patch +++ ffmpeg-0.5+svn20090706/debian/patches/neon/0013-ARM-NEON-VP3-IDCT.patch @@ -0,0 +1,340 @@ +From 2056fee95d5b017aad91df30e68d1cec96ddfeb6 Mon Sep 17 00:00:00 2001 +From: conrad +Date: Sat, 4 Jul 2009 20:41:11 +0000 +Subject: [PATCH 13/27] ARM: NEON VP3 IDCT + 15% faster VP3/Theora, 10% faster VP6 + +git-svn-id: file:///var/local/repositories/ffmpeg/trunk@19345 9553f0bf-9b14-0410-a0b8-cfaf0461ba5b +--- + libavcodec/arm/dsputil_arm.c | 10 ++ + libavcodec/arm/vp3dsp_neon.S | 282 ++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 292 insertions(+), 0 deletions(-) + +diff --git a/libavcodec/arm/dsputil_arm.c b/libavcodec/arm/dsputil_arm.c +index c8a277e..c0ab0c9 100644 +--- a/libavcodec/arm/dsputil_arm.c ++++ b/libavcodec/arm/dsputil_arm.c +@@ -43,6 +43,10 @@ void ff_simple_idct_neon(DCTELEM *data); + void ff_simple_idct_put_neon(uint8_t *dest, int line_size, DCTELEM *data); + void ff_simple_idct_add_neon(uint8_t *dest, int line_size, DCTELEM *data); + ++void ff_vp3_idct_neon(DCTELEM *data); ++void ff_vp3_idct_put_neon(uint8_t *dest, int line_size, DCTELEM *data); ++void ff_vp3_idct_add_neon(uint8_t *dest, int line_size, DCTELEM *data); ++ + /* XXX: local hack */ + static void (*ff_put_pixels_clamped)(const DCTELEM *block, uint8_t *pixels, int line_size); + static void (*ff_add_pixels_clamped)(const DCTELEM *block, uint8_t *pixels, int line_size); +@@ -180,6 +184,12 @@ void dsputil_init_arm(DSPContext* c, AVCodecContext *avctx) + c->idct_add= ff_simple_idct_add_neon; + c->idct = ff_simple_idct_neon; + c->idct_permutation_type = FF_PARTTRANS_IDCT_PERM; ++ } else if ((CONFIG_VP3_DECODER || CONFIG_VP5_DECODER || CONFIG_VP6_DECODER || CONFIG_THEORA_DECODER) && ++ idct_algo==FF_IDCT_VP3){ ++ c->idct_put= ff_vp3_idct_put_neon; ++ c->idct_add= ff_vp3_idct_add_neon; ++ c->idct = ff_vp3_idct_neon; ++ c->idct_permutation_type = FF_TRANSPOSE_IDCT_PERM; + #endif + } + } +diff --git a/libavcodec/arm/vp3dsp_neon.S b/libavcodec/arm/vp3dsp_neon.S +index cce80dd..b2e16f4 100644 +--- a/libavcodec/arm/vp3dsp_neon.S ++++ b/libavcodec/arm/vp3dsp_neon.S +@@ -20,6 +20,22 @@ + + #include "asm.S" + ++.section .rodata ++.align 4 ++ ++vp3_idct_constants: ++.short 64277, 60547, 54491, 46341, 36410, 25080, 12785 ++ ++#define xC1S7 d0[0] ++#define xC2S6 d0[1] ++#define xC3S5 d0[2] ++#define xC4S4 d0[3] ++#define xC5S3 d1[0] ++#define xC6S2 d1[1] ++#define xC7S1 d1[2] ++ ++.text ++ + .macro vp3_loop_filter + vsubl.u8 q3, d18, d17 + vsubl.u8 q2, d16, d19 +@@ -92,3 +108,269 @@ function ff_vp3_h_loop_filter_neon, export=1 + vst1.16 {d1[3]}, [ip], r1 + bx lr + .endfunc ++ ++ ++function vp3_idct_start_neon ++ vpush {d8-d15} ++ movrel r3, vp3_idct_constants ++ vld1.64 {d0-d1}, [r3,:128] ++ vld1.64 {d16-d19}, [r2,:128]! ++ vld1.64 {d20-d23}, [r2,:128]! ++ vld1.64 {d24-d27}, [r2,:128]! ++ vadd.s16 q1, q8, q12 ++ vsub.s16 q8, q8, q12 ++ vld1.64 {d28-d31}, [r2,:128]! ++.endfunc ++ ++function vp3_idct_core_neon ++ vmull.s16 q2, d18, xC1S7 // (ip[1] * C1) << 16 ++ vmull.s16 q3, d19, xC1S7 ++ vmull.s16 q4, d2, xC4S4 // ((ip[0] + ip[4]) * C4) << 16 ++ vmull.s16 q5, d3, xC4S4 ++ vmull.s16 q6, d16, xC4S4 // ((ip[0] - ip[4]) * C4) << 16 ++ vmull.s16 q7, d17, xC4S4 ++ vshrn.s32 d4, q2, #16 ++ vshrn.s32 d5, q3, #16 ++ vshrn.s32 d6, q4, #16 ++ vshrn.s32 d7, q5, #16 ++ vshrn.s32 d8, q6, #16 ++ vshrn.s32 d9, q7, #16 ++ vadd.s16 q12, q1, q3 // E = (ip[0] + ip[4]) * C4 ++ vadd.s16 q8, q8, q4 // F = (ip[0] - ip[4]) * C4 ++ vadd.s16 q1, q2, q9 // ip[1] * C1 ++ ++ vmull.s16 q2, d30, xC1S7 // (ip[7] * C1) << 16 ++ vmull.s16 q3, d31, xC1S7 ++ vmull.s16 q4, d30, xC7S1 // (ip[7] * C7) << 16 ++ vmull.s16 q5, d31, xC7S1 ++ vmull.s16 q6, d18, xC7S1 // (ip[1] * C7) << 16 ++ vmull.s16 q7, d19, xC7S1 ++ vshrn.s32 d4, q2, #16 ++ vshrn.s32 d5, q3, #16 ++ vshrn.s32 d6, q4, #16 // ip[7] * C7 ++ vshrn.s32 d7, q5, #16 ++ vshrn.s32 d8, q6, #16 // ip[1] * C7 ++ vshrn.s32 d9, q7, #16 ++ vadd.s16 q2, q2, q15 // ip[7] * C1 ++ vadd.s16 q9, q1, q3 // A = ip[1] * C1 + ip[7] * C7 ++ vsub.s16 q15, q4, q2 // B = ip[1] * C7 - ip[7] * C1 ++ ++ vmull.s16 q2, d22, xC5S3 // (ip[3] * C5) << 16 ++ vmull.s16 q3, d23, xC5S3 ++ vmull.s16 q4, d22, xC3S5 // (ip[3] * C3) << 16 ++ vmull.s16 q5, d23, xC3S5 ++ vmull.s16 q6, d26, xC5S3 // (ip[5] * C5) << 16 ++ vmull.s16 q7, d27, xC5S3 ++ vshrn.s32 d4, q2, #16 ++ vshrn.s32 d5, q3, #16 ++ vshrn.s32 d6, q4, #16 ++ vshrn.s32 d7, q5, #16 ++ vshrn.s32 d8, q6, #16 ++ vshrn.s32 d9, q7, #16 ++ vadd.s16 q3, q3, q11 // ip[3] * C3 ++ vadd.s16 q4, q4, q13 // ip[5] * C5 ++ vadd.s16 q1, q2, q11 // ip[3] * C5 ++ vadd.s16 q11, q3, q4 // C = ip[3] * C3 + ip[5] * C5 ++ ++ vmull.s16 q2, d26, xC3S5 // (ip[5] * C3) << 16 ++ vmull.s16 q3, d27, xC3S5 ++ vmull.s16 q4, d20, xC2S6 // (ip[2] * C2) << 16 ++ vmull.s16 q5, d21, xC2S6 ++ vmull.s16 q6, d28, xC6S2 // (ip[6] * C6) << 16 ++ vmull.s16 q7, d29, xC6S2 ++ vshrn.s32 d4, q2, #16 ++ vshrn.s32 d5, q3, #16 ++ vshrn.s32 d6, q4, #16 ++ vshrn.s32 d7, q5, #16 ++ vshrn.s32 d8, q6, #16 // ip[6] * C6 ++ vshrn.s32 d9, q7, #16 ++ vadd.s16 q2, q2, q13 // ip[5] * C3 ++ vadd.s16 q3, q3, q10 // ip[2] * C2 ++ vsub.s16 q13, q2, q1 // D = ip[5] * C3 - ip[3] * C5 ++ vsub.s16 q1, q9, q11 // (A - C) ++ vadd.s16 q11, q9, q11 // Cd = A + C ++ vsub.s16 q9, q15, q13 // (B - D) ++ vadd.s16 q13, q15, q13 // Dd = B + D ++ vadd.s16 q15, q3, q4 // G = ip[2] * C2 + ip[6] * C6 ++ ++ vmull.s16 q2, d2, xC4S4 // ((A - C) * C4) << 16 ++ vmull.s16 q3, d3, xC4S4 ++ vmull.s16 q4, d28, xC2S6 // (ip[6] * C2) << 16 ++ vmull.s16 q5, d29, xC2S6 ++ vmull.s16 q6, d20, xC6S2 // (ip[2] * C6) << 16 ++ vmull.s16 q7, d21, xC6S2 ++ vshrn.s32 d4, q2, #16 ++ vshrn.s32 d5, q3, #16 ++ vshrn.s32 d6, q4, #16 ++ vshrn.s32 d7, q5, #16 ++ vshrn.s32 d8, q6, #16 // ip[2] * C6 ++ vmull.s16 q5, d18, xC4S4 // ((B - D) * C4) << 16 ++ vmull.s16 q6, d19, xC4S4 ++ vshrn.s32 d9, q7, #16 ++ vadd.s16 q3, q3, q14 // ip[6] * C2 ++ vadd.s16 q10, q1, q2 // Ad = (A - C) * C4 ++ vsub.s16 q14, q4, q3 // H = ip[2] * C6 - ip[6] * C2 ++ bx lr ++.endfunc ++ ++.macro VP3_IDCT_END type ++function vp3_idct_end_\type\()_neon ++.ifc \type, col ++ vdup.16 q0, r3 ++ vadd.s16 q12, q12, q0 ++ vadd.s16 q8, q8, q0 ++.endif ++ ++ vshrn.s32 d2, q5, #16 ++ vshrn.s32 d3, q6, #16 ++ vadd.s16 q2, q12, q15 // Gd = E + G ++ vadd.s16 q9, q1, q9 // (B - D) * C4 ++ vsub.s16 q12, q12, q15 // Ed = E - G ++ vsub.s16 q3, q8, q10 // Fd = F - Ad ++ vadd.s16 q10, q8, q10 // Add = F + Ad ++ vadd.s16 q4, q9, q14 // Hd = Bd + H ++ vsub.s16 q14, q9, q14 // Bdd = Bd - H ++ vadd.s16 q8, q2, q11 // [0] = Gd + Cd ++ vsub.s16 q15, q2, q11 // [7] = Gd - Cd ++ vadd.s16 q9, q10, q4 // [1] = Add + Hd ++ vsub.s16 q10, q10, q4 // [2] = Add - Hd ++ vadd.s16 q11, q12, q13 // [3] = Ed + Dd ++ vsub.s16 q12, q12, q13 // [4] = Ed - Dd ++.ifc \type, row ++ vtrn.16 q8, q9 ++.endif ++ vadd.s16 q13, q3, q14 // [5] = Fd + Bdd ++ vsub.s16 q14, q3, q14 // [6] = Fd - Bdd ++ ++.ifc \type, row ++ // 8x8 transpose ++ vtrn.16 q10, q11 ++ vtrn.16 q12, q13 ++ vtrn.16 q14, q15 ++ vtrn.32 q8, q10 ++ vtrn.32 q9, q11 ++ vtrn.32 q12, q14 ++ vtrn.32 q13, q15 ++ vswp d17, d24 ++ vswp d19, d26 ++ vadd.s16 q1, q8, q12 ++ vswp d21, d28 ++ vsub.s16 q8, q8, q12 ++ vswp d23, d30 ++.endif ++ bx lr ++.endfunc ++.endm ++ ++VP3_IDCT_END row ++VP3_IDCT_END col ++ ++function ff_vp3_idct_neon, export=1 ++ mov ip, lr ++ mov r2, r0 ++ bl vp3_idct_start_neon ++ bl vp3_idct_end_row_neon ++ mov r3, #8 ++ bl vp3_idct_core_neon ++ bl vp3_idct_end_col_neon ++ mov lr, ip ++ vpop {d8-d15} ++ ++ vshr.s16 q8, q8, #4 ++ vshr.s16 q9, q9, #4 ++ vshr.s16 q10, q10, #4 ++ vshr.s16 q11, q11, #4 ++ vshr.s16 q12, q12, #4 ++ vst1.64 {d16-d19}, [r0,:128]! ++ vshr.s16 q13, q13, #4 ++ vshr.s16 q14, q14, #4 ++ vst1.64 {d20-d23}, [r0,:128]! ++ vshr.s16 q15, q15, #4 ++ vst1.64 {d24-d27}, [r0,:128]! ++ vst1.64 {d28-d31}, [r0,:128]! ++ bx lr ++.endfunc ++ ++function ff_vp3_idct_put_neon, export=1 ++ mov ip, lr ++ bl vp3_idct_start_neon ++ bl vp3_idct_end_row_neon ++ mov r3, #8 ++ add r3, r3, #2048 // convert signed pixel to unsigned ++ bl vp3_idct_core_neon ++ bl vp3_idct_end_col_neon ++ mov lr, ip ++ vpop {d8-d15} ++ ++ vqshrun.s16 d0, q8, #4 ++ vqshrun.s16 d1, q9, #4 ++ vqshrun.s16 d2, q10, #4 ++ vqshrun.s16 d3, q11, #4 ++ vst1.64 {d0}, [r0,:64], r1 ++ vqshrun.s16 d4, q12, #4 ++ vst1.64 {d1}, [r0,:64], r1 ++ vqshrun.s16 d5, q13, #4 ++ vst1.64 {d2}, [r0,:64], r1 ++ vqshrun.s16 d6, q14, #4 ++ vst1.64 {d3}, [r0,:64], r1 ++ vqshrun.s16 d7, q15, #4 ++ vst1.64 {d4}, [r0,:64], r1 ++ vst1.64 {d5}, [r0,:64], r1 ++ vst1.64 {d6}, [r0,:64], r1 ++ vst1.64 {d7}, [r0,:64], r1 ++ bx lr ++.endfunc ++ ++function ff_vp3_idct_add_neon, export=1 ++ mov ip, lr ++ bl vp3_idct_start_neon ++ bl vp3_idct_end_row_neon ++ mov r3, #8 ++ bl vp3_idct_core_neon ++ bl vp3_idct_end_col_neon ++ mov lr, ip ++ vpop {d8-d15} ++ mov r2, r0 ++ ++ vld1.64 {d0}, [r0,:64], r1 ++ vshr.s16 q8, q8, #4 ++ vld1.64 {d1}, [r0,:64], r1 ++ vshr.s16 q9, q9, #4 ++ vld1.64 {d2}, [r0,:64], r1 ++ vaddw.u8 q8, q8, d0 ++ vld1.64 {d3}, [r0,:64], r1 ++ vaddw.u8 q9, q9, d1 ++ vld1.64 {d4}, [r0,:64], r1 ++ vshr.s16 q10, q10, #4 ++ vld1.64 {d5}, [r0,:64], r1 ++ vshr.s16 q11, q11, #4 ++ vld1.64 {d6}, [r0,:64], r1 ++ vqmovun.s16 d0, q8 ++ vld1.64 {d7}, [r0,:64], r1 ++ vqmovun.s16 d1, q9 ++ vaddw.u8 q10, q10, d2 ++ vaddw.u8 q11, q11, d3 ++ vshr.s16 q12, q12, #4 ++ vshr.s16 q13, q13, #4 ++ vqmovun.s16 d2, q10 ++ vqmovun.s16 d3, q11 ++ vaddw.u8 q12, q12, d4 ++ vaddw.u8 q13, q13, d5 ++ vshr.s16 q14, q14, #4 ++ vshr.s16 q15, q15, #4 ++ vst1.64 {d0}, [r2,:64], r1 ++ vqmovun.s16 d4, q12 ++ vst1.64 {d1}, [r2,:64], r1 ++ vqmovun.s16 d5, q13 ++ vst1.64 {d2}, [r2,:64], r1 ++ vaddw.u8 q14, q14, d6 ++ vst1.64 {d3}, [r2,:64], r1 ++ vaddw.u8 q15, q15, d7 ++ vst1.64 {d4}, [r2,:64], r1 ++ vqmovun.s16 d6, q14 ++ vst1.64 {d5}, [r2,:64], r1 ++ vqmovun.s16 d7, q15 ++ vst1.64 {d6}, [r2,:64], r1 ++ vst1.64 {d7}, [r2,:64], r1 ++ bx lr ++.endfunc +-- +1.6.3.3 + --- ffmpeg-0.5+svn20090706.orig/debian/patches/neon/0008-ARM-NEON-VP3-Loop-Filter.patch +++ ffmpeg-0.5+svn20090706/debian/patches/neon/0008-ARM-NEON-VP3-Loop-Filter.patch @@ -0,0 +1,60 @@ +From 91dafadca2744957e6cc3ae13688c9033ec3c330 Mon Sep 17 00:00:00 2001 +From: conrad +Date: Sat, 23 May 2009 18:36:20 +0000 +Subject: [PATCH 08/27] ARM: NEON VP3 Loop Filter + +git-svn-id: file:///var/local/repositories/ffmpeg/trunk@18916 9553f0bf-9b14-0410-a0b8-cfaf0461ba5b +--- + libavcodec/Makefile | 4 ++++ + libavcodec/arm/dsputil_neon.c | 8 ++++++++ + 2 files changed, 12 insertions(+), 0 deletions(-) + +diff --git a/libavcodec/Makefile b/libavcodec/Makefile +index cf742d1..a213309 100644 +--- a/libavcodec/Makefile ++++ b/libavcodec/Makefile +@@ -479,11 +479,15 @@ OBJS-$(HAVE_ARMVFP) += arm/dsputil_vfp.o \ + OBJS-$(HAVE_IWMMXT) += arm/dsputil_iwmmxt.o \ + arm/mpegvideo_iwmmxt.o \ + ++NEON-OBJS-$(CONFIG_THEORA_DECODER) += arm/vp3dsp_neon.o ++NEON-OBJS-$(CONFIG_VP3_DECODER) += arm/vp3dsp_neon.o ++ + OBJS-$(HAVE_NEON) += arm/dsputil_neon.o \ + arm/dsputil_neon_s.o \ + arm/h264dsp_neon.o \ + arm/h264idct_neon.o \ + arm/simple_idct_neon.o \ ++ $(NEON-OBJS-yes) + + OBJS-$(ARCH_BFIN) += bfin/dsputil_bfin.o \ + bfin/fdct_bfin.o \ +diff --git a/libavcodec/arm/dsputil_neon.c b/libavcodec/arm/dsputil_neon.c +index 9b95130..20425c1 100644 +--- a/libavcodec/arm/dsputil_neon.c ++++ b/libavcodec/arm/dsputil_neon.c +@@ -150,6 +150,9 @@ void ff_h264_idct_add8_neon(uint8_t **dest, const int *block_offset, + DCTELEM *block, int stride, + const uint8_t nnzc[6*8]); + ++void ff_vp3_v_loop_filter_neon(uint8_t *, int, int *); ++void ff_vp3_h_loop_filter_neon(uint8_t *, int, int *); ++ + void ff_vector_fmul_neon(float *dst, const float *src, int len); + void ff_vector_fmul_window_neon(float *dst, const float *src0, + const float *src1, const float *win, +@@ -255,6 +258,11 @@ void ff_dsputil_init_neon(DSPContext *c, AVCodecContext *avctx) + c->h264_idct_add16intra = ff_h264_idct_add16intra_neon; + c->h264_idct_add8 = ff_h264_idct_add8_neon; + ++ if (CONFIG_VP3_DECODER || CONFIG_THEORA_DECODER) { ++ c->vp3_v_loop_filter = ff_vp3_v_loop_filter_neon; ++ c->vp3_h_loop_filter = ff_vp3_h_loop_filter_neon; ++ } ++ + c->vector_fmul = ff_vector_fmul_neon; + c->vector_fmul_window = ff_vector_fmul_window_neon; + +-- +1.6.3.3 + --- ffmpeg-0.5+svn20090706.orig/debian/patches/neon/0005-ARM-asm-for-AV_RN.patch +++ ffmpeg-0.5+svn20090706/debian/patches/neon/0005-ARM-asm-for-AV_RN.patch @@ -0,0 +1,124 @@ +From 8e2336d4b05585ed3a533b388751bff4f3cfef05 Mon Sep 17 00:00:00 2001 +From: mru +Date: Sat, 18 Apr 2009 00:00:28 +0000 +Subject: [PATCH 05/27] ARM asm for AV_RN*() + +ARMv6 and later support unaligned loads and stores for single +word/halfword but not double/multiple. GCC is ignorant of this and +will always use bytewise accesses for unaligned data. Casting to an +int32_t pointer is dangerous since a load/store double or multiple +instruction might be used (this happens with some code in FFmpeg). +Implementing the AV_[RW]* macros with inline asm using only supported +instructions gives fast and safe unaligned accesses. ARM RVCT does +the right thing with generic code. + +This gives an overall speedup of up to 10%. + +git-svn-id: file:///var/local/repositories/ffmpeg/trunk@18601 9553f0bf-9b14-0410-a0b8-cfaf0461ba5b +--- + libavutil/arm/intreadwrite.h | 78 ++++++++++++++++++++++++++++++++++++++++++ + libavutil/intreadwrite.h | 3 ++ + 2 files changed, 81 insertions(+), 0 deletions(-) + create mode 100644 libavutil/arm/intreadwrite.h + +diff --git a/libavutil/arm/intreadwrite.h b/libavutil/arm/intreadwrite.h +new file mode 100644 +index 0000000..de2e553 +--- /dev/null ++++ b/libavutil/arm/intreadwrite.h +@@ -0,0 +1,78 @@ ++/* ++ * This file is part of FFmpeg. ++ * ++ * FFmpeg is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU Lesser General Public ++ * License as published by the Free Software Foundation; either ++ * version 2.1 of the License, or (at your option) any later version. ++ * ++ * FFmpeg is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ * Lesser General Public License for more details. ++ * ++ * You should have received a copy of the GNU Lesser General Public ++ * License along with FFmpeg; if not, write to the Free Software ++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA ++ */ ++ ++#ifndef AVUTIL_ARM_INTREADWRITE_H ++#define AVUTIL_ARM_INTREADWRITE_H ++ ++#include ++#include "config.h" ++ ++#if HAVE_FAST_UNALIGNED && HAVE_INLINE_ASM ++ ++#define AV_RN16 AV_RN16 ++static inline uint16_t AV_RN16(const void *p) ++{ ++ uint16_t v; ++ __asm__ ("ldrh %0, %1" : "=r"(v) : "m"(*(const uint16_t *)p)); ++ return v; ++} ++ ++#define AV_WN16 AV_WN16 ++static inline void AV_WN16(void *p, uint16_t v) ++{ ++ __asm__ ("strh %1, %0" : "=m"(*(uint16_t *)p) : "r"(v)); ++} ++ ++#define AV_RN32 AV_RN32 ++static inline uint32_t AV_RN32(const void *p) ++{ ++ uint32_t v; ++ __asm__ ("ldr %0, %1" : "=r"(v) : "m"(*(const uint32_t *)p)); ++ return v; ++} ++ ++#define AV_WN32 AV_WN32 ++static inline void AV_WN32(void *p, uint32_t v) ++{ ++ __asm__ ("str %1, %0" : "=m"(*(uint32_t *)p) : "r"(v)); ++} ++ ++#define AV_RN64 AV_RN64 ++static inline uint64_t AV_RN64(const void *p) ++{ ++ union { uint64_t v; uint32_t hl[2]; } v; ++ __asm__ ("ldr %0, %2 \n\t" ++ "ldr %1, %3 \n\t" ++ : "=r"(v.hl[0]), "=r"(v.hl[1]) ++ : "m"(*(const uint32_t*)p), "m"(*((const uint32_t*)p+1))); ++ return v.v; ++} ++ ++#define AV_WN64 AV_WN64 ++static inline void AV_WN64(void *p, uint64_t v) ++{ ++ union { uint64_t v; uint32_t hl[2]; } vv = { v }; ++ __asm__ ("str %2, %0 \n\t" ++ "str %3, %1 \n\t" ++ : "=m"(*(uint32_t*)p), "=m"(*((uint32_t*)p+1)) ++ : "r"(vv.hl[0]), "r"(vv.hl[1])); ++} ++ ++#endif /* HAVE_INLINE_ASM */ ++ ++#endif /* AVUTIL_ARM_INTREADWRITE_H */ +diff --git a/libavutil/intreadwrite.h b/libavutil/intreadwrite.h +index b1c5c2a..42fb890 100644 +--- a/libavutil/intreadwrite.h ++++ b/libavutil/intreadwrite.h +@@ -29,6 +29,9 @@ + * defined, even if these are implemented as inline functions. + */ + ++#if ARCH_ARM ++# include "arm/intreadwrite.h" ++#endif + + /* + * Define AV_[RW]N helper macros to simplify definitions not provided +-- +1.6.3.3 + --- ffmpeg-0.5+svn20090706.orig/debian/patches/neon/0018-Prepare-for-optimised-forward-MDCT-implementations.patch +++ ffmpeg-0.5+svn20090706/debian/patches/neon/0018-Prepare-for-optimised-forward-MDCT-implementations.patch @@ -0,0 +1,86 @@ +From 696f65e4e5d92a8777d922269558cc9f03ca1145 Mon Sep 17 00:00:00 2001 +From: mru +Date: Fri, 11 Sep 2009 02:24:19 +0000 +Subject: [PATCH 18/27] Prepare for optimised forward MDCT implementations + +This adds a function pointer for forward MDCT to FFTContext and +initialises it with the existing C function. ff_calc_mdct() is +changed to an inline function calling the selected version as +done for other fft/mdct functions. + +git-svn-id: file:///var/local/repositories/ffmpeg/trunk@19818 9553f0bf-9b14-0410-a0b8-cfaf0461ba5b +--- + libavcodec/dsputil.h | 9 ++++++++- + libavcodec/fft.c | 1 + + libavcodec/mdct.c | 2 +- + 3 files changed, 10 insertions(+), 2 deletions(-) + +diff --git a/libavcodec/dsputil.h b/libavcodec/dsputil.h +index c4abd14..e299ade 100644 +--- a/libavcodec/dsputil.h ++++ b/libavcodec/dsputil.h +@@ -680,6 +680,7 @@ typedef struct FFTContext { + void (*fft_calc)(struct FFTContext *s, FFTComplex *z); + void (*imdct_calc)(struct MDCTContext *s, FFTSample *output, const FFTSample *input); + void (*imdct_half)(struct MDCTContext *s, FFTSample *output, const FFTSample *input); ++ void (*mdct_calc)(struct MDCTContext *s, FFTSample *output, const FFTSample *input); + } FFTContext; + + extern FFTSample* ff_cos_tabs[13]; +@@ -737,6 +738,12 @@ static inline void ff_imdct_half(MDCTContext *s, FFTSample *output, const FFTSam + s->fft.imdct_half(s, output, input); + } + ++static inline void ff_mdct_calc(MDCTContext *s, FFTSample *output, ++ const FFTSample *input) ++{ ++ s->fft.mdct_calc(s, output, input); ++} ++ + /** + * Generate a Kaiser-Bessel Derived Window. + * @param window pointer to half window +@@ -762,6 +769,7 @@ extern float *ff_sine_windows[6]; + int ff_mdct_init(MDCTContext *s, int nbits, int inverse); + void ff_imdct_calc_c(MDCTContext *s, FFTSample *output, const FFTSample *input); + void ff_imdct_half_c(MDCTContext *s, FFTSample *output, const FFTSample *input); ++void ff_mdct_calc_c(MDCTContext *s, FFTSample *output, const FFTSample *input); + void ff_imdct_calc_3dn(MDCTContext *s, FFTSample *output, const FFTSample *input); + void ff_imdct_half_3dn(MDCTContext *s, FFTSample *output, const FFTSample *input); + void ff_imdct_calc_3dn2(MDCTContext *s, FFTSample *output, const FFTSample *input); +@@ -770,7 +778,6 @@ void ff_imdct_calc_sse(MDCTContext *s, FFTSample *output, const FFTSample *input + void ff_imdct_half_sse(MDCTContext *s, FFTSample *output, const FFTSample *input); + void ff_imdct_calc_neon(MDCTContext *s, FFTSample *output, const FFTSample *input); + void ff_imdct_half_neon(MDCTContext *s, FFTSample *output, const FFTSample *input); +-void ff_mdct_calc(MDCTContext *s, FFTSample *out, const FFTSample *input); + void ff_mdct_end(MDCTContext *s); + + /* Real Discrete Fourier Transform */ +diff --git a/libavcodec/fft.c b/libavcodec/fft.c +index b05ddda..655acd3 100644 +--- a/libavcodec/fft.c ++++ b/libavcodec/fft.c +@@ -86,6 +86,7 @@ av_cold int ff_fft_init(FFTContext *s, int nbits, int inverse) + s->fft_calc = ff_fft_calc_c; + s->imdct_calc = ff_imdct_calc_c; + s->imdct_half = ff_imdct_half_c; ++ s->mdct_calc = ff_mdct_calc_c; + s->exptab1 = NULL; + + #if HAVE_MMX && HAVE_YASM +diff --git a/libavcodec/mdct.c b/libavcodec/mdct.c +index cb3388f..b0816b0 100644 +--- a/libavcodec/mdct.c ++++ b/libavcodec/mdct.c +@@ -179,7 +179,7 @@ void ff_imdct_calc_c(MDCTContext *s, FFTSample *output, const FFTSample *input) + * @param input N samples + * @param out N/2 samples + */ +-void ff_mdct_calc(MDCTContext *s, FFTSample *out, const FFTSample *input) ++void ff_mdct_calc_c(MDCTContext *s, FFTSample *out, const FFTSample *input) + { + int i, j, n, n8, n4, n2, n3; + FFTSample re, im; +-- +1.6.3.3 + --- ffmpeg-0.5+svn20090706.orig/debian/patches/neon/0002-ARM-NEON-optimized-put_signed_pixels_clamped.patch +++ ffmpeg-0.5+svn20090706/debian/patches/neon/0002-ARM-NEON-optimized-put_signed_pixels_clamped.patch @@ -0,0 +1,82 @@ +From 5bf2745fa3bdc996f2201c06eeff1d242d81cc2a Mon Sep 17 00:00:00 2001 +From: conrad +Date: Sat, 4 Apr 2009 21:02:48 +0000 +Subject: [PATCH 02/27] ARM: NEON optimized put_signed_pixels_clamped + +git-svn-id: file:///var/local/repositories/ffmpeg/trunk@18333 9553f0bf-9b14-0410-a0b8-cfaf0461ba5b +--- + libavcodec/arm/dsputil_neon.c | 2 ++ + libavcodec/arm/dsputil_neon_s.S | 37 +++++++++++++++++++++++++++++++++++++ + 2 files changed, 39 insertions(+), 0 deletions(-) + +diff --git a/libavcodec/arm/dsputil_neon.c b/libavcodec/arm/dsputil_neon.c +index 2e56308..37425a3 100644 +--- a/libavcodec/arm/dsputil_neon.c ++++ b/libavcodec/arm/dsputil_neon.c +@@ -42,6 +42,7 @@ void ff_put_pixels8_xy2_no_rnd_neon(uint8_t *, const uint8_t *, int, int); + void ff_avg_pixels16_neon(uint8_t *, const uint8_t *, int, int); + + void ff_add_pixels_clamped_neon(const DCTELEM *, uint8_t *, int); ++void ff_put_signed_pixels_clamped_neon(const DCTELEM *, uint8_t *, int); + + void ff_put_h264_qpel16_mc00_neon(uint8_t *, uint8_t *, int); + void ff_put_h264_qpel16_mc10_neon(uint8_t *, uint8_t *, int); +@@ -179,6 +180,7 @@ void ff_dsputil_init_neon(DSPContext *c, AVCodecContext *avctx) + c->avg_pixels_tab[0][0] = ff_avg_pixels16_neon; + + c->add_pixels_clamped = ff_add_pixels_clamped_neon; ++ c->put_signed_pixels_clamped = ff_put_signed_pixels_clamped_neon; + + c->put_h264_chroma_pixels_tab[0] = ff_put_h264_chroma_mc8_neon; + c->put_h264_chroma_pixels_tab[1] = ff_put_h264_chroma_mc4_neon; +diff --git a/libavcodec/arm/dsputil_neon_s.S b/libavcodec/arm/dsputil_neon_s.S +index c305210..5b95717 100644 +--- a/libavcodec/arm/dsputil_neon_s.S ++++ b/libavcodec/arm/dsputil_neon_s.S +@@ -273,6 +273,43 @@ function ff_put_h264_qpel8_mc00_neon, export=1 + pixfunc2 put_ pixels8_y2, _no_rnd, vhadd.u8 + pixfunc2 put_ pixels8_xy2, _no_rnd, vshrn.u16, 1 + ++function ff_put_signed_pixels_clamped_neon, export=1 ++ vmov.u8 d31, #128 ++ vld1.64 {d16-d17}, [r0,:128]! ++ vqmovn.s16 d0, q8 ++ vld1.64 {d18-d19}, [r0,:128]! ++ vqmovn.s16 d1, q9 ++ vld1.64 {d16-d17}, [r0,:128]! ++ vqmovn.s16 d2, q8 ++ vld1.64 {d18-d19}, [r0,:128]! ++ vadd.u8 d0, d0, d31 ++ vld1.64 {d20-d21}, [r0,:128]! ++ vadd.u8 d1, d1, d31 ++ vld1.64 {d22-d23}, [r0,:128]! ++ vadd.u8 d2, d2, d31 ++ vst1.64 {d0}, [r1,:64], r2 ++ vqmovn.s16 d3, q9 ++ vst1.64 {d1}, [r1,:64], r2 ++ vqmovn.s16 d4, q10 ++ vst1.64 {d2}, [r1,:64], r2 ++ vqmovn.s16 d5, q11 ++ vld1.64 {d24-d25}, [r0,:128]! ++ vadd.u8 d3, d3, d31 ++ vld1.64 {d26-d27}, [r0,:128]! ++ vadd.u8 d4, d4, d31 ++ vadd.u8 d5, d5, d31 ++ vst1.64 {d3}, [r1,:64], r2 ++ vqmovn.s16 d6, q12 ++ vst1.64 {d4}, [r1,:64], r2 ++ vqmovn.s16 d7, q13 ++ vst1.64 {d5}, [r1,:64], r2 ++ vadd.u8 d6, d6, d31 ++ vadd.u8 d7, d7, d31 ++ vst1.64 {d6}, [r1,:64], r2 ++ vst1.64 {d7}, [r1,:64], r2 ++ bx lr ++ .endfunc ++ + function ff_add_pixels_clamped_neon, export=1 + mov r3, r1 + vld1.64 {d16}, [r1,:64], r2 +-- +1.6.3.3 + --- ffmpeg-0.5+svn20090706.orig/debian/patches/neon/0003-Add-guaranteed-alignment-for-loading-dest-pixels-in-.patch +++ ffmpeg-0.5+svn20090706/debian/patches/neon/0003-Add-guaranteed-alignment-for-loading-dest-pixels-in-.patch @@ -0,0 +1,35 @@ +From ce7bbcc96ff94b2fdfbcff35f517f03512bc147b Mon Sep 17 00:00:00 2001 +From: conrad +Date: Thu, 16 Apr 2009 08:39:13 +0000 +Subject: [PATCH 03/27] Add guaranteed alignment for loading dest pixels in avg_pixels16_neon + +git-svn-id: file:///var/local/repositories/ffmpeg/trunk@18535 9553f0bf-9b14-0410-a0b8-cfaf0461ba5b +--- + libavcodec/arm/dsputil_neon_s.S | 8 ++++---- + 1 files changed, 4 insertions(+), 4 deletions(-) + +diff --git a/libavcodec/arm/dsputil_neon_s.S b/libavcodec/arm/dsputil_neon_s.S +index 5b95717..f16293d 100644 +--- a/libavcodec/arm/dsputil_neon_s.S ++++ b/libavcodec/arm/dsputil_neon_s.S +@@ -38,13 +38,13 @@ + pld [r1, r2] + pld [r1, r2, lsl #1] + .if \avg +- vld1.64 {d16,d17}, [ip], r2 ++ vld1.64 {d16,d17}, [ip,:128], r2 + vrhadd.u8 q0, q0, q8 +- vld1.64 {d18,d19}, [ip], r2 ++ vld1.64 {d18,d19}, [ip,:128], r2 + vrhadd.u8 q1, q1, q9 +- vld1.64 {d20,d21}, [ip], r2 ++ vld1.64 {d20,d21}, [ip,:128], r2 + vrhadd.u8 q2, q2, q10 +- vld1.64 {d22,d23}, [ip], r2 ++ vld1.64 {d22,d23}, [ip,:128], r2 + vrhadd.u8 q3, q3, q11 + .endif + subs r3, r3, #4 +-- +1.6.3.3 + --- ffmpeg-0.5+svn20090706.orig/debian/patches/neon/0019-ARM-NEON-optimised-MDCT.patch +++ ffmpeg-0.5+svn20090706/debian/patches/neon/0019-ARM-NEON-optimised-MDCT.patch @@ -0,0 +1,207 @@ +From 2b3356ebb1f7b4b69d922e0bdfc9f5e631cf4793 Mon Sep 17 00:00:00 2001 +From: mru +Date: Fri, 11 Sep 2009 02:24:22 +0000 +Subject: [PATCH 19/27] ARM: NEON optimised MDCT + +git-svn-id: file:///var/local/repositories/ffmpeg/trunk@19819 9553f0bf-9b14-0410-a0b8-cfaf0461ba5b +--- + libavcodec/arm/mdct_neon.S | 160 ++++++++++++++++++++++++++++++++++++++++++++ + libavcodec/dsputil.h | 1 + + libavcodec/fft.c | 1 + + 3 files changed, 162 insertions(+), 0 deletions(-) + +diff --git a/libavcodec/arm/mdct_neon.S b/libavcodec/arm/mdct_neon.S +index d84eccd..26ac199 100644 +--- a/libavcodec/arm/mdct_neon.S ++++ b/libavcodec/arm/mdct_neon.S +@@ -164,3 +164,163 @@ function ff_imdct_calc_neon, export=1 + + pop {r4-r6,pc} + .endfunc ++ ++function ff_mdct_calc_neon, export=1 ++ push {r4-r10,lr} ++ ++ mov r12, #1 ++ ldr lr, [r0, #4] @ nbits ++ ldr r4, [r0, #8] @ tcos ++ ldr r5, [r0, #12] @ tsin ++ ldr r3, [r0, #24] @ revtab ++ lsl lr, r12, lr @ n = 1 << nbits ++ add r7, r2, lr @ in4u ++ sub r9, r7, #16 @ in4d ++ add r2, r7, lr, lsl #1 @ in3u ++ add r8, r9, lr, lsl #1 @ in3d ++ mov r12, #-16 ++ ++ vld2.32 {d16,d18},[r9,:128],r12 @ x,x in4d1,in4d0 ++ vld2.32 {d17,d19},[r8,:128],r12 @ x,x in3d1,in3d0 ++ vld2.32 {d20,d21},[r7,:128]! @ in4u0,in4u1 x,x ++ vrev64.32 q9, q9 @ in4d0,in4d1 in3d0,in3d1 ++ vld2.32 {d0, d1}, [r2,:128]! @ in3u0,in3u1 x,x ++ vsub.f32 d20, d18, d20 @ in4d-in4u I ++ vld1.32 {d2}, [r4,:64]! @ c0,c1 ++ vadd.f32 d0, d0, d19 @ in3u+in3d -R ++ vld1.32 {d3}, [r5,:64]! @ s0,s1 ++1: ++ vmul.f32 d7, d20, d3 @ I*s ++ vmul.f32 d6, d0, d2 @ -R*c ++ ldr r6, [r3], #4 ++ vmul.f32 d4, d0, d3 @ -R*s ++ vmul.f32 d5, d20, d2 @ I*c ++ subs lr, lr, #16 ++ vsub.f32 d6, d6, d7 @ -R*c-I*s ++ vadd.f32 d7, d4, d5 @ -R*s+I*c ++ uxtah r10, r1, r6, ror #16 ++ uxtah r6, r1, r6 ++ beq 1f ++ vld2.32 {d16,d18},[r9,:128],r12 @ x,x in4d1,in4d0 ++ vld2.32 {d17,d19},[r8,:128],r12 @ x,x in3d1,in3d0 ++ vneg.f32 d7, d7 @ R*s-I*c ++ vld2.32 {d20,d21},[r7,:128]! @ in4u0,in4u1 x,x ++ vrev64.32 q9, q9 @ in4d0,in4d1 in3d0,in3d1 ++ vld2.32 {d0, d1}, [r2,:128]! @ in3u0,in3u1 x,x ++ vsub.f32 d20, d18, d20 @ in4d-in4u I ++ vld1.32 {d2}, [r4,:64]! @ c0,c1 ++ vadd.f32 d0, d0, d19 @ in3u+in3d -R ++ vld1.32 {d3}, [r5,:64]! @ s0,s1 ++ vst2.32 {d6[0],d7[0]}, [r6,:64] ++ vst2.32 {d6[1],d7[1]}, [r10,:64] ++ b 1b ++1: ++ vneg.f32 d7, d7 @ R*s-I*c ++ vst2.32 {d6[0],d7[0]}, [r6,:64] ++ vst2.32 {d6[1],d7[1]}, [r10,:64] ++ ++ mov r12, #1 ++ ldr lr, [r0, #4] @ nbits ++ lsl lr, r12, lr @ n = 1 << nbits ++ sub r8, r2, #16 @ in1d ++ add r2, r9, #16 @ in0u ++ sub r9, r7, #16 @ in2d ++ mov r12, #-16 ++ ++ vld2.32 {d16,d18},[r9,:128],r12 @ x,x in2d1,in2d0 ++ vld2.32 {d17,d19},[r8,:128],r12 @ x,x in1d1,in1d0 ++ vld2.32 {d20,d21},[r7,:128]! @ in2u0,in2u1 x,x ++ vrev64.32 q9, q9 @ in2d0,in2d1 in1d0,in1d1 ++ vld2.32 {d0, d1}, [r2,:128]! @ in0u0,in0u1 x,x ++ vsub.f32 d0, d0, d18 @ in0u-in2d R ++ vld1.32 {d2}, [r4,:64]! @ c0,c1 ++ vadd.f32 d20, d20, d19 @ in2u+in1d -I ++ vld1.32 {d3}, [r5,:64]! @ s0,s1 ++1: ++ vmul.f32 d6, d0, d2 @ R*c ++ vmul.f32 d7, d20, d3 @ -I*s ++ ldr r6, [r3], #4 ++ vmul.f32 d4, d0, d3 @ R*s ++ vmul.f32 d5, d20, d2 @ I*c ++ subs lr, lr, #16 ++ vsub.f32 d6, d7, d6 @ I*s-R*c ++ vadd.f32 d7, d4, d5 @ R*s-I*c ++ uxtah r10, r1, r6, ror #16 ++ uxtah r6, r1, r6 ++ beq 1f ++ vld2.32 {d16,d18},[r9,:128],r12 @ x,x in2d1,in2d0 ++ vld2.32 {d17,d19},[r8,:128],r12 @ x,x in1d1,in1d0 ++ vld2.32 {d20,d21},[r7,:128]! @ in2u0,in2u1 x,x ++ vrev64.32 q9, q9 @ in2d0,in2d1 in1d0,in1d1 ++ vld2.32 {d0, d1}, [r2,:128]! @ in0u0,in0u1 x,x ++ vsub.f32 d0, d0, d18 @ in0u-in2d R ++ vld1.32 {d2}, [r4,:64]! @ c0,c1 ++ vadd.f32 d20, d20, d19 @ in2u+in1d -I ++ vld1.32 {d3}, [r5,:64]! @ s0,s1 ++ vst2.32 {d6[0],d7[0]}, [r6,:64] ++ vst2.32 {d6[1],d7[1]}, [r10,:64] ++ b 1b ++1: ++ vst2.32 {d6[0],d7[0]}, [r6,:64] ++ vst2.32 {d6[1],d7[1]}, [r10,:64] ++ ++ mov r4, r0 ++ mov r6, r1 ++ add r0, r0, #16 ++ bl ff_fft_calc_neon ++ ++ mov r12, #1 ++ ldr lr, [r4, #4] @ nbits ++ ldr r5, [r4, #12] @ tsin ++ ldr r4, [r4, #8] @ tcos ++ lsl r12, r12, lr @ n = 1 << nbits ++ lsr lr, r12, #3 @ n8 = n >> 3 ++ ++ add r4, r4, lr, lsl #2 ++ add r5, r5, lr, lsl #2 ++ add r6, r6, lr, lsl #3 ++ sub r1, r4, #8 ++ sub r2, r5, #8 ++ sub r3, r6, #16 ++ ++ mov r7, #-16 ++ mov r12, #-8 ++ mov r8, r6 ++ mov r0, r3 ++ ++ vld2.32 {d0-d1}, [r3,:128], r7 @ d0 =r1,i1 d1 =r0,i0 ++ vld2.32 {d20-d21},[r6,:128]! @ d20=r2,i2 d21=r3,i3 ++ vld1.32 {d18}, [r2,:64], r12 @ d18=s1,s0 ++1: ++ subs lr, lr, #2 ++ vmul.f32 d7, d0, d18 @ r1*s1,r0*s0 ++ vld1.32 {d19}, [r5,:64]! @ s2,s3 ++ vmul.f32 d4, d1, d18 @ i1*s1,i0*s0 ++ vld1.32 {d16}, [r1,:64], r12 @ c1,c0 ++ vmul.f32 d5, d21, d19 @ i2*s2,i3*s3 ++ vld1.32 {d17}, [r4,:64]! @ c2,c3 ++ vmul.f32 d6, d20, d19 @ r2*s2,r3*s3 ++ vmul.f32 d24, d0, d16 @ r1*c1,r0*c0 ++ vmul.f32 d25, d20, d17 @ r2*c2,r3*c3 ++ vmul.f32 d22, d21, d17 @ i2*c2,i3*c3 ++ vmul.f32 d23, d1, d16 @ i1*c1,i0*c0 ++ vadd.f32 d4, d4, d24 @ i1*s1+r1*c1,i0*s0+r0*c0 ++ vadd.f32 d5, d5, d25 @ i2*s2+r2*c2,i3*s3+r3*c3 ++ vsub.f32 d6, d22, d6 @ i2*c2-r2*s2,i3*c3-r3*s3 ++ vsub.f32 d7, d23, d7 @ i1*c1-r1*s1,i0*c0-r0*s0 ++ vneg.f32 q2, q2 ++ beq 1f ++ vld2.32 {d0-d1}, [r3,:128], r7 ++ vld2.32 {d20-d21},[r6,:128]! ++ vld1.32 {d18}, [r2,:64], r12 ++ vrev64.32 q3, q3 ++ vst2.32 {d4,d6}, [r0,:128], r7 ++ vst2.32 {d5,d7}, [r8,:128]! ++ b 1b ++1: ++ vrev64.32 q3, q3 ++ vst2.32 {d4,d6}, [r0,:128] ++ vst2.32 {d5,d7}, [r8,:128] ++ ++ pop {r4-r10,pc} ++.endfunc +diff --git a/libavcodec/dsputil.h b/libavcodec/dsputil.h +index e299ade..f89013c 100644 +--- a/libavcodec/dsputil.h ++++ b/libavcodec/dsputil.h +@@ -778,6 +778,7 @@ void ff_imdct_calc_sse(MDCTContext *s, FFTSample *output, const FFTSample *input + void ff_imdct_half_sse(MDCTContext *s, FFTSample *output, const FFTSample *input); + void ff_imdct_calc_neon(MDCTContext *s, FFTSample *output, const FFTSample *input); + void ff_imdct_half_neon(MDCTContext *s, FFTSample *output, const FFTSample *input); ++void ff_mdct_calc_neon(MDCTContext *s, FFTSample *output, const FFTSample *input); + void ff_mdct_end(MDCTContext *s); + + /* Real Discrete Fourier Transform */ +diff --git a/libavcodec/fft.c b/libavcodec/fft.c +index 655acd3..69feb44 100644 +--- a/libavcodec/fft.c ++++ b/libavcodec/fft.c +@@ -119,6 +119,7 @@ av_cold int ff_fft_init(FFTContext *s, int nbits, int inverse) + s->fft_calc = ff_fft_calc_neon; + s->imdct_calc = ff_imdct_calc_neon; + s->imdct_half = ff_imdct_half_neon; ++ s->mdct_calc = ff_mdct_calc_neon; + revtab_shift = 3; + #endif + +-- +1.6.3.3 + --- ffmpeg-0.5+svn20090706.orig/debian/patches/neon/0014-ARM-NEON-optimised-vorbis_inverse_coupling.patch +++ ffmpeg-0.5+svn20090706/debian/patches/neon/0014-ARM-NEON-optimised-vorbis_inverse_coupling.patch @@ -0,0 +1,116 @@ +From d32e115cb8c43fe4531567b1c668dba6dc76274d Mon Sep 17 00:00:00 2001 +From: mru +Date: Fri, 14 Aug 2009 01:02:06 +0000 +Subject: [PATCH 14/27] ARM: NEON optimised vorbis_inverse_coupling + +12% faster Vorbis decoding on Cortex-A8. + +git-svn-id: file:///var/local/repositories/ffmpeg/trunk@19637 9553f0bf-9b14-0410-a0b8-cfaf0461ba5b +--- + libavcodec/arm/dsputil_neon.c | 5 +++ + libavcodec/arm/dsputil_neon_s.S | 64 +++++++++++++++++++++++++++++++++++++++ + 2 files changed, 69 insertions(+), 0 deletions(-) + +diff --git a/libavcodec/arm/dsputil_neon.c b/libavcodec/arm/dsputil_neon.c +index 20425c1..eb9aba1 100644 +--- a/libavcodec/arm/dsputil_neon.c ++++ b/libavcodec/arm/dsputil_neon.c +@@ -161,6 +161,8 @@ void ff_vector_fmul_window_neon(float *dst, const float *src0, + void ff_float_to_int16_neon(int16_t *, const float *, long); + void ff_float_to_int16_interleave_neon(int16_t *, const float **, long, int); + ++void ff_vorbis_inverse_coupling_neon(float *mag, float *ang, int blocksize); ++ + void ff_dsputil_init_neon(DSPContext *c, AVCodecContext *avctx) + { + c->put_pixels_tab[0][0] = ff_put_pixels16_neon; +@@ -270,4 +272,7 @@ void ff_dsputil_init_neon(DSPContext *c, AVCodecContext *avctx) + c->float_to_int16 = ff_float_to_int16_neon; + c->float_to_int16_interleave = ff_float_to_int16_interleave_neon; + } ++ ++ if (CONFIG_VORBIS_DECODER) ++ c->vorbis_inverse_coupling = ff_vorbis_inverse_coupling_neon; + } +diff --git a/libavcodec/arm/dsputil_neon_s.S b/libavcodec/arm/dsputil_neon_s.S +index 303b11c..2bc07fa 100644 +--- a/libavcodec/arm/dsputil_neon_s.S ++++ b/libavcodec/arm/dsputil_neon_s.S +@@ -19,6 +19,7 @@ + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + ++#include "config.h" + #include "asm.S" + + preserve8 +@@ -793,3 +794,66 @@ function ff_vector_fmul_window_neon, export=1 + vst1.64 {d22,d23},[ip,:128], r5 + pop {r4,r5,pc} + .endfunc ++ ++#if CONFIG_VORBIS_DECODER ++function ff_vorbis_inverse_coupling_neon, export=1 ++ vmov.i32 q10, #1<<31 ++ subs r2, r2, #4 ++ tst r2, #4 ++ mov r3, r0 ++ mov r12, r1 ++ beq 3f ++ ++ vld1.32 {d24-d25},[r1,:128]! ++ vld1.32 {d22-d23},[r0,:128]! ++ vcle.s32 q8, q12, #0 ++ vand q9, q11, q10 ++ veor q12, q12, q9 ++ vand q2, q12, q8 ++ vbic q3, q12, q8 ++ vadd.f32 q12, q11, q2 ++ vsub.f32 q11, q11, q3 ++1: vld1.32 {d2-d3}, [r1,:128]! ++ vld1.32 {d0-d1}, [r0,:128]! ++ vcle.s32 q8, q1, #0 ++ vand q9, q0, q10 ++ veor q1, q1, q9 ++ vst1.32 {d24-d25},[r3, :128]! ++ vst1.32 {d22-d23},[r12,:128]! ++ vand q2, q1, q8 ++ vbic q3, q1, q8 ++ vadd.f32 q1, q0, q2 ++ vsub.f32 q0, q0, q3 ++ subs r2, r2, #8 ++ ble 2f ++ vld1.32 {d24-d25},[r1,:128]! ++ vld1.32 {d22-d23},[r0,:128]! ++ vcle.s32 q8, q12, #0 ++ vand q9, q11, q10 ++ veor q12, q12, q9 ++ vst1.32 {d2-d3}, [r3, :128]! ++ vst1.32 {d0-d1}, [r12,:128]! ++ vand q2, q12, q8 ++ vbic q3, q12, q8 ++ vadd.f32 q12, q11, q2 ++ vsub.f32 q11, q11, q3 ++ b 1b ++ ++2: vst1.32 {d2-d3}, [r3, :128]! ++ vst1.32 {d0-d1}, [r12,:128]! ++ bxlt lr ++ ++3: vld1.32 {d2-d3}, [r1,:128] ++ vld1.32 {d0-d1}, [r0,:128] ++ vcle.s32 q8, q1, #0 ++ vand q9, q0, q10 ++ veor q1, q1, q9 ++ vand q2, q1, q8 ++ vbic q3, q1, q8 ++ vadd.f32 q1, q0, q2 ++ vsub.f32 q0, q0, q3 ++ vst1.32 {d2-d3}, [r0,:128]! ++ vst1.32 {d0-d1}, [r1,:128]! ++ bx lr ++ .endfunc ++#endif +-- +1.6.3.3 + --- ffmpeg-0.5+svn20090706.orig/debian/patches/neon/0015-ARM-handle-VFP-register-arguments-in-ff_vector_fmul_.patch +++ ffmpeg-0.5+svn20090706/debian/patches/neon/0015-ARM-handle-VFP-register-arguments-in-ff_vector_fmul_.patch @@ -0,0 +1,31 @@ +From e965241fea3348a8205bd38f91efbfcd13e8cd31 Mon Sep 17 00:00:00 2001 +From: mru +Date: Mon, 20 Jul 2009 22:30:27 +0000 +Subject: [PATCH 15/27] ARM: handle VFP register arguments in ff_vector_fmul_window_neon() + +git-svn-id: file:///var/local/repositories/ffmpeg/trunk@19475 9553f0bf-9b14-0410-a0b8-cfaf0461ba5b +--- + libavcodec/arm/dsputil_neon_s.S | 6 ++++-- + 1 files changed, 4 insertions(+), 2 deletions(-) + +diff --git a/libavcodec/arm/dsputil_neon_s.S b/libavcodec/arm/dsputil_neon_s.S +index 2bc07fa..71d09c6 100644 +--- a/libavcodec/arm/dsputil_neon_s.S ++++ b/libavcodec/arm/dsputil_neon_s.S +@@ -746,9 +746,11 @@ function ff_vector_fmul_neon, export=1 + .endfunc + + function ff_vector_fmul_window_neon, export=1 +- vld1.32 {d16[],d17[]}, [sp,:32] ++VFP vdup.32 q8, d0[0] ++NOVFP vld1.32 {d16[],d17[]}, [sp,:32] + push {r4,r5,lr} +- ldr lr, [sp, #16] ++VFP ldr lr, [sp, #12] ++NOVFP ldr lr, [sp, #16] + sub r2, r2, #8 + sub r5, lr, #2 + add r2, r2, r5, lsl #2 +-- +1.6.3.3 + --- ffmpeg-0.5+svn20090706.orig/debian/patches/neon/0012-ARM-enable-fast_unaligned-when-cpu-armv-67-is-specif.patch +++ ffmpeg-0.5+svn20090706/debian/patches/neon/0012-ARM-enable-fast_unaligned-when-cpu-armv-67-is-specif.patch @@ -0,0 +1,28 @@ +From 8f934d1aa05a5db078dc732b37f2d46faa92e866 Mon Sep 17 00:00:00 2001 +From: mru +Date: Tue, 30 Jun 2009 12:46:09 +0000 +Subject: [PATCH 12/27] ARM: enable fast_unaligned when --cpu=armv[67] is specified + +git-svn-id: file:///var/local/repositories/ffmpeg/trunk@19308 9553f0bf-9b14-0410-a0b8-cfaf0461ba5b +--- + configure | 4 ++++ + 1 files changed, 4 insertions(+), 0 deletions(-) + +diff --git a/configure b/configure +index fd11501..7459215 100755 +--- a/configure ++++ b/configure +@@ -1792,6 +1792,10 @@ if test $cpu != "generic"; then + add_cflags -mcpu=$cpu + enable fast_unaligned + ;; ++ armv[67]*) ++ add_cflags -march=$cpu ++ enable fast_unaligned ++ ;; + armv*) + add_cflags -march=$cpu + ;; +-- +1.6.3.3 + --- ffmpeg-0.5+svn20090706.orig/debian/patches/CVE-2009-46XX/security-issue04.patch +++ ffmpeg-0.5+svn20090706/debian/patches/CVE-2009-46XX/security-issue04.patch @@ -0,0 +1,29 @@ +Description: check submap indexes +Origin: upstream, ffmpeg 0.5.1: r21730 + +diff -Nur ffmpeg-0.5+svn20090706/libavcodec/vorbis_dec.c ffmpeg-0.5+svn20090706.new/libavcodec/vorbis_dec.c +--- ffmpeg-0.5+svn20090706/libavcodec/vorbis_dec.c 2009-01-31 21:00:19.000000000 -0500 ++++ ffmpeg-0.5+svn20090706.new/libavcodec/vorbis_dec.c 2010-04-07 10:15:52.000000000 -0400 +@@ -723,9 +723,20 @@ + } + + for(j=0;jsubmaps;++j) { ++ int bits; + skip_bits(gb, 8); // FIXME check? +- mapping_setup->submap_floor[j]=get_bits(gb, 8); +- mapping_setup->submap_residue[j]=get_bits(gb, 8); ++ bits=get_bits(gb, 8); ++ if (bits>=vc->floor_count) { ++ av_log(vc->avccontext, AV_LOG_ERROR, "submap floor value %d out of range. \n", bits); ++ return -1; ++ } ++ mapping_setup->submap_floor[j]=bits; ++ bits=get_bits(gb, 8); ++ if (bits>=vc->residue_count) { ++ av_log(vc->avccontext, AV_LOG_ERROR, "submap residue value %d out of range. \n", bits); ++ return -1; ++ } ++ mapping_setup->submap_residue[j]=bits; + + AV_DEBUG(" %d mapping %d submap : floor %d, residue %d \n", i, j, mapping_setup->submap_floor[j], mapping_setup->submap_residue[j]); + } --- ffmpeg-0.5+svn20090706.orig/debian/patches/CVE-2009-46XX/security-issue05.patch +++ ffmpeg-0.5+svn20090706/debian/patches/CVE-2009-46XX/security-issue05.patch @@ -0,0 +1,17 @@ +Description: check classbook value +Origin: upstream, ffmpeg 0.5.1: r21725 + +diff -Nur ffmpeg-0.5+svn20090706/libavcodec/vorbis_dec.c ffmpeg-0.5+svn20090706.new/libavcodec/vorbis_dec.c +--- ffmpeg-0.5+svn20090706/libavcodec/vorbis_dec.c 2010-04-07 10:16:01.000000000 -0400 ++++ ffmpeg-0.5+svn20090706.new/libavcodec/vorbis_dec.c 2010-04-07 10:16:05.000000000 -0400 +@@ -636,6 +636,10 @@ + res_setup->partition_size=get_bits(gb, 24)+1; + res_setup->classifications=get_bits(gb, 6)+1; + res_setup->classbook=get_bits(gb, 8); ++ if (res_setup->classbook>=vc->codebook_count) { ++ av_log(vc->avccontext, AV_LOG_ERROR, "classbook value %d out of range. \n", res_setup->classbook); ++ return 1; ++ } + + AV_DEBUG(" begin %d end %d part.size %d classif.s %d classbook %d \n", res_setup->begin, res_setup->end, res_setup->partition_size, + res_setup->classifications, res_setup->classbook); --- ffmpeg-0.5+svn20090706.orig/debian/patches/CVE-2009-46XX/security-issue07.patch +++ ffmpeg-0.5+svn20090706/debian/patches/CVE-2009-46XX/security-issue07.patch @@ -0,0 +1,32 @@ +Description: Check masterbook index and subclass book index. +Origin: upstream, ffmpeg 0.5.1: r21727 + +diff -Nur ffmpeg-0.5+svn20090706/libavcodec/vorbis_dec.c ffmpeg-0.5+svn20090706.new/libavcodec/vorbis_dec.c +--- ffmpeg-0.5+svn20090706/libavcodec/vorbis_dec.c 2010-04-07 10:16:40.000000000 -0400 ++++ ffmpeg-0.5+svn20090706.new/libavcodec/vorbis_dec.c 2010-04-07 10:16:46.000000000 -0400 +@@ -492,13 +492,23 @@ + AV_DEBUG(" %d floor %d class dim: %d subclasses %d \n", i, j, floor_setup->data.t1.class_dimensions[j], floor_setup->data.t1.class_subclasses[j]); + + if (floor_setup->data.t1.class_subclasses[j]) { +- floor_setup->data.t1.class_masterbook[j]=get_bits(gb, 8); ++ int bits=get_bits(gb, 8); ++ if (bits>=vc->codebook_count) { ++ av_log(vc->avccontext, AV_LOG_ERROR, "Masterbook index %d is out of range.\n", bits); ++ return 1; ++ } ++ floor_setup->data.t1.class_masterbook[j]=bits; + + AV_DEBUG(" masterbook: %d \n", floor_setup->data.t1.class_masterbook[j]); + } + + for(k=0;k<(1<data.t1.class_subclasses[j]);++k) { +- floor_setup->data.t1.subclass_books[j][k]=(int16_t)get_bits(gb, 8)-1; ++ int16_t bits=get_bits(gb, 8)-1; ++ if (bits!=-1 && bits>=vc->codebook_count) { ++ av_log(vc->avccontext, AV_LOG_ERROR, "Subclass book index %d is out of range.\n", bits); ++ return 1; ++ } ++ floor_setup->data.t1.subclass_books[j][k]=bits; + + AV_DEBUG(" book %d. : %d \n", k, floor_setup->data.t1.subclass_books[j][k]); + } --- ffmpeg-0.5+svn20090706.orig/debian/patches/CVE-2009-46XX/security-issue14.patch +++ ffmpeg-0.5+svn20090706/debian/patches/CVE-2009-46XX/security-issue14.patch @@ -0,0 +1,17 @@ +Description: Check dimensions against 0 too. +Origin: upstream, ffmpeg 0.5.1: r21721 + +diff -Nur ffmpeg-0.5+svn20090706/libavcodec/vorbis_dec.c ffmpeg-0.5+svn20090706.new/libavcodec/vorbis_dec.c +--- ffmpeg-0.5+svn20090706/libavcodec/vorbis_dec.c 2010-04-07 10:19:40.000000000 -0400 ++++ ffmpeg-0.5+svn20090706.new/libavcodec/vorbis_dec.c 2010-04-07 10:19:44.000000000 -0400 +@@ -250,8 +250,8 @@ + } + + codebook_setup->dimensions=get_bits(gb, 16); +- if (codebook_setup->dimensions>16) { +- av_log(vc->avccontext, AV_LOG_ERROR, " %"PRIdFAST16". Codebook's dimension is too large (%d). \n", cb, codebook_setup->dimensions); ++ if (codebook_setup->dimensions>16||codebook_setup->dimensions==0) { ++ av_log(vc->avccontext, AV_LOG_ERROR, " %"PRIdFAST16". Codebook's dimension is invalid (%d). \n", cb, codebook_setup->dimensions); + goto error; + } + entries=get_bits(gb, 24); --- ffmpeg-0.5+svn20090706.orig/debian/patches/CVE-2009-46XX/security-issue09.patch +++ ffmpeg-0.5+svn20090706/debian/patches/CVE-2009-46XX/security-issue09.patch @@ -0,0 +1,29 @@ +Description: Check begin/end/partition_size. +Origin: upstream, ffmpeg 0.5.1: r21729 + +diff -Nur ffmpeg-0.5+svn20090706/libavcodec/vorbis_dec.c ffmpeg-0.5+svn20090706.new/libavcodec/vorbis_dec.c +--- ffmpeg-0.5+svn20090706/libavcodec/vorbis_dec.c 2010-04-07 10:17:34.000000000 -0400 ++++ ffmpeg-0.5+svn20090706.new/libavcodec/vorbis_dec.c 2010-04-07 10:17:39.000000000 -0400 +@@ -37,6 +37,7 @@ + #define V_NB_BITS 8 + #define V_NB_BITS2 11 + #define V_MAX_VLCS (1<<16) ++#define V_MAX_PARTITIONS (1<<20) + + #ifndef V_DEBUG + #define AV_DEBUG(...) +@@ -644,6 +645,14 @@ + res_setup->begin=get_bits(gb, 24); + res_setup->end=get_bits(gb, 24); + res_setup->partition_size=get_bits(gb, 24)+1; ++ /* Validations to prevent a buffer overflow later. */ ++ if (res_setup->begin>res_setup->end ++ || res_setup->end>vc->blocksize[1]/(res_setup->type==2?1:2) ++ || (res_setup->end-res_setup->begin)/res_setup->partition_size>V_MAX_PARTITIONS) { ++ av_log(vc->avccontext, AV_LOG_ERROR, "partition out of bounds: type, begin, end, size, blocksize: %d, %d, %d, %d, %d\n", res_setup->type, res_setup->begin, res_setup->end, res_setup->partition_size, vc->blocksize[1]/2); ++ return 1; ++ } ++ + res_setup->classifications=get_bits(gb, 6)+1; + res_setup->classbook=get_bits(gb, 8); + if (res_setup->classbook>=vc->codebook_count) { --- ffmpeg-0.5+svn20090706.orig/debian/patches/CVE-2009-46XX/security-issue08.patch +++ ffmpeg-0.5+svn20090706/debian/patches/CVE-2009-46XX/security-issue08.patch @@ -0,0 +1,20 @@ +Description: Check res_setup->books. +Origin: upstream, ffmpeg 0.5.1: r21728 + +diff -Nur ffmpeg-0.5+svn20090706/libavcodec/vorbis_dec.c ffmpeg-0.5+svn20090706.new/libavcodec/vorbis_dec.c +--- ffmpeg-0.5+svn20090706/libavcodec/vorbis_dec.c 2010-04-07 10:17:14.000000000 -0400 ++++ ffmpeg-0.5+svn20090706.new/libavcodec/vorbis_dec.c 2010-04-07 10:17:22.000000000 -0400 +@@ -669,7 +669,12 @@ + for(j=0;jclassifications;++j) { + for(k=0;k<8;++k) { + if (cascade[j]&(1<books[j][k]=get_bits(gb, 8); ++ int bits=get_bits(gb, 8); ++ if (bits>=vc->codebook_count) { ++ av_log(vc->avccontext, AV_LOG_ERROR, "book value %d out of range. \n", bits); ++ return 1; ++ } ++ res_setup->books[j][k]=bits; + + AV_DEBUG(" %d class casscade depth %d book: %d \n", j, k, res_setup->books[j][k]); + --- ffmpeg-0.5+svn20090706.orig/debian/patches/CVE-2009-46XX/security-issue15.patch +++ ffmpeg-0.5+svn20090706/debian/patches/CVE-2009-46XX/security-issue15.patch @@ -0,0 +1,15 @@ +Description: Fix init_get_bits() buffer size. +Origin: upstream, ffmpeg 0.5.1: r21719 + +diff -Nur ffmpeg-0.5+svn20090706/libavcodec/vp3.c ffmpeg-0.5+svn20090706.new/libavcodec/vp3.c +--- ffmpeg-0.5+svn20090706/libavcodec/vp3.c 2009-02-22 08:48:55.000000000 -0500 ++++ ffmpeg-0.5+svn20090706.new/libavcodec/vp3.c 2010-04-07 10:20:02.000000000 -0400 +@@ -2231,7 +2231,7 @@ + } + + for(i=0;i<3;i++) { +- init_get_bits(&gb, header_start[i], header_len[i]); ++ init_get_bits(&gb, header_start[i], header_len[i] * 8); + + ptype = get_bits(&gb, 8); + --- ffmpeg-0.5+svn20090706.orig/debian/patches/CVE-2009-46XX/security-issue17.patch +++ ffmpeg-0.5+svn20090706/debian/patches/CVE-2009-46XX/security-issue17.patch @@ -0,0 +1,39 @@ +Description: Make sure that all memory allocations succeed. +Origin: upstream, ffmpeg 0.5.1: r21720 + +diff -Nur ffmpeg-0.5+svn20090706/libavcodec/vp3.c ffmpeg-0.5+svn20090706.new/libavcodec/vp3.c +--- ffmpeg-0.5+svn20090706/libavcodec/vp3.c 2010-04-07 10:20:41.000000000 -0400 ++++ ffmpeg-0.5+svn20090706.new/libavcodec/vp3.c 2010-04-07 10:20:45.000000000 -0400 +@@ -43,6 +43,8 @@ + + #define FRAGMENT_PIXELS 8 + ++static av_cold int vp3_decode_end(AVCodecContext *avctx); ++ + typedef struct Coeff { + struct Coeff *next; + DCTELEM coeff; +@@ -1684,6 +1686,11 @@ + s->coeffs = av_malloc(s->fragment_count * sizeof(Coeff) * 65); + s->coded_fragment_list = av_malloc(s->fragment_count * sizeof(int)); + s->pixel_addresses_initialized = 0; ++ if (!s->superblock_coding || !s->all_fragments || !s->coeff_counts || ++ !s->coeffs || !s->coded_fragment_list) { ++ vp3_decode_end(avctx); ++ return -1; ++ } + + if (!s->theora_tables) + { +@@ -1784,6 +1791,11 @@ + s->superblock_macroblocks = av_malloc(s->superblock_count * 4 * sizeof(int)); + s->macroblock_fragments = av_malloc(s->macroblock_count * 6 * sizeof(int)); + s->macroblock_coding = av_malloc(s->macroblock_count + 1); ++ if (!s->superblock_fragments || !s->superblock_macroblocks || ++ !s->macroblock_fragments || !s->macroblock_coding) { ++ vp3_decode_end(avctx); ++ return -1; ++ } + init_block_mapping(s); + + for (i = 0; i < 3; i++) { --- ffmpeg-0.5+svn20090706.orig/debian/patches/CVE-2009-46XX/security-issue22.patch +++ ffmpeg-0.5+svn20090706/debian/patches/CVE-2009-46XX/security-issue22.patch @@ -0,0 +1,49 @@ +Description: check codec_id and codec_type, make sure priv_data is freed + and codec is set to NULL +Origin: backport, ffmpeg trunk: 19973, 20002, 20125 + +diff -Nur ffmpeg-0.5+svn20090706/libavcodec/utils.c ffmpeg-0.5+svn20090706.new/libavcodec/utils.c +--- ffmpeg-0.5+svn20090706/libavcodec/utils.c 2009-02-24 13:51:16.000000000 -0500 ++++ ffmpeg-0.5+svn20090706.new/libavcodec/utils.c 2010-04-07 10:32:01.000000000 -0400 +@@ -445,26 +445,35 @@ + avcodec_set_dimensions(avctx, avctx->width, avctx->height); + + if((avctx->coded_width||avctx->coded_height) && avcodec_check_dimensions(avctx,avctx->coded_width,avctx->coded_height)){ +- av_freep(&avctx->priv_data); + ret = AVERROR(EINVAL); +- goto end; ++ goto free_and_end; + } + + avctx->codec = codec; +- avctx->codec_id = codec->id; ++ if ((avctx->codec_type == CODEC_TYPE_UNKNOWN || avctx->codec_type == codec->type) && ++ avctx->codec_id == CODEC_ID_NONE) { ++ avctx->codec_type = codec->type; ++ avctx->codec_id = codec->id; ++ } ++ if(avctx->codec_id != codec->id || avctx->codec_type != codec->type){ ++ av_log(avctx, AV_LOG_ERROR, "codec type or id mismatches\n"); ++ goto free_and_end; ++ } + avctx->frame_number = 0; + if(avctx->codec->init){ + ret = avctx->codec->init(avctx); + if (ret < 0) { +- av_freep(&avctx->priv_data); +- avctx->codec= NULL; +- goto end; ++ goto free_and_end; + } + } + ret=0; + end: + entangled_thread_counter--; + return ret; ++free_and_end: ++ av_freep(&avctx->priv_data); ++ avctx->codec= NULL; ++ goto end; + } + + int attribute_align_arg avcodec_encode_audio(AVCodecContext *avctx, uint8_t *buf, int buf_size, --- ffmpeg-0.5+svn20090706.orig/debian/patches/CVE-2009-46XX/security-issue06.patch +++ ffmpeg-0.5+svn20090706/debian/patches/CVE-2009-46XX/security-issue06.patch @@ -0,0 +1,31 @@ +Description: Add checks for per-packet mode indexes and per-header mode + mapping indexes. +Origin: upstream, ffmpeg 0.5.1: r21726 + +diff -Nur ffmpeg-0.5+svn20090706/libavcodec/vorbis_dec.c ffmpeg-0.5+svn20090706.new/libavcodec/vorbis_dec.c +--- ffmpeg-0.5+svn20090706/libavcodec/vorbis_dec.c 2010-04-07 10:16:13.000000000 -0400 ++++ ffmpeg-0.5+svn20090706.new/libavcodec/vorbis_dec.c 2010-04-07 10:16:17.000000000 -0400 +@@ -803,7 +803,11 @@ + mode_setup->blockflag=get_bits1(gb); + mode_setup->windowtype=get_bits(gb, 16); //FIXME check + mode_setup->transformtype=get_bits(gb, 16); //FIXME check +- mode_setup->mapping=get_bits(gb, 8); //FIXME check ++ mode_setup->mapping=get_bits(gb, 8); ++ if (mode_setup->mapping>=vc->mapping_count) { ++ av_log(vc->avccontext, AV_LOG_ERROR, "mode mapping value %d out of range. \n", mode_setup->mapping); ++ return 1; ++ } + + AV_DEBUG(" %d mode: blockflag %d, windowtype %d, transformtype %d, mapping %d \n", i, mode_setup->blockflag, mode_setup->windowtype, mode_setup->transformtype, mode_setup->mapping); + } +@@ -1463,6 +1467,10 @@ + } else { + mode_number=get_bits(gb, ilog(vc->mode_count-1)); + } ++ if (mode_number>=vc->mode_count) { ++ av_log(vc->avccontext, AV_LOG_ERROR, "mode number %d out of range.\n", mode_number); ++ return -1; ++ } + vc->mode_number=mode_number; + mapping=&vc->mappings[vc->modes[mode_number].mapping]; + --- ffmpeg-0.5+svn20090706.orig/debian/patches/CVE-2009-46XX/security-issue12.patch +++ ffmpeg-0.5+svn20090706/debian/patches/CVE-2009-46XX/security-issue12.patch @@ -0,0 +1,22 @@ +Description: Sanity checks for magnitude and angle. +Origin: upstream, ffmpeg 0.5.1: r21723 + +diff -Nur ffmpeg-0.5+svn20090706/libavcodec/vorbis_dec.c ffmpeg-0.5+svn20090706.new/libavcodec/vorbis_dec.c +--- ffmpeg-0.5+svn20090706/libavcodec/vorbis_dec.c 2010-04-07 10:19:02.000000000 -0400 ++++ ffmpeg-0.5+svn20090706.new/libavcodec/vorbis_dec.c 2010-04-07 10:19:07.000000000 -0400 +@@ -729,7 +729,14 @@ + for(j=0;jcoupling_steps;++j) { + mapping_setup->magnitude[j]=get_bits(gb, ilog(vc->audio_channels-1)); + mapping_setup->angle[j]=get_bits(gb, ilog(vc->audio_channels-1)); +- // FIXME: sanity checks ++ if (mapping_setup->magnitude[j]>=vc->audio_channels) { ++ av_log(vc->avccontext, AV_LOG_ERROR, "magnitude channel %d out of range. \n", mapping_setup->magnitude[j]); ++ return 1; ++ } ++ if (mapping_setup->angle[j]>=vc->audio_channels) { ++ av_log(vc->avccontext, AV_LOG_ERROR, "angle channel %d out of range. \n", mapping_setup->angle[j]); ++ return 1; ++ } + } + } else { + mapping_setup->coupling_steps=0; --- ffmpeg-0.5+svn20090706.orig/debian/patches/CVE-2009-46XX/security-issue10.patch +++ ffmpeg-0.5+svn20090706/debian/patches/CVE-2009-46XX/security-issue10.patch @@ -0,0 +1,25 @@ +Description: Check validity of channels & samplerate. +Origin: upstream, ffmpeg 0.5.1: r22658 + +diff -Nur ffmpeg-0.5+svn20090706/libavcodec/vorbis_dec.c ffmpeg-0.5+svn20090706.new/libavcodec/vorbis_dec.c +--- ffmpeg-0.5+svn20090706/libavcodec/vorbis_dec.c 2010-04-07 10:18:18.000000000 -0400 ++++ ffmpeg-0.5+svn20090706.new/libavcodec/vorbis_dec.c 2010-04-07 10:18:28.000000000 -0400 +@@ -896,8 +896,16 @@ + } + + vc->version=get_bits_long(gb, 32); //FIXME check 0 +- vc->audio_channels=get_bits(gb, 8); //FIXME check >0 +- vc->audio_samplerate=get_bits_long(gb, 32); //FIXME check >0 ++ vc->audio_channels=get_bits(gb, 8); ++ if(vc->audio_channels <= 0){ ++ av_log(vc->avccontext, AV_LOG_ERROR, "Invalid number of channels\n"); ++ return -1; ++ } ++ vc->audio_samplerate=get_bits_long(gb, 32); ++ if(vc->audio_samplerate <= 0){ ++ av_log(vc->avccontext, AV_LOG_ERROR, "Invalid samplerate\n"); ++ return -1; ++ } + vc->bitrate_maximum=get_bits_long(gb, 32); + vc->bitrate_nominal=get_bits_long(gb, 32); + vc->bitrate_minimum=get_bits_long(gb, 32); --- ffmpeg-0.5+svn20090706.orig/debian/patches/CVE-2009-46XX/security-issue19.patch +++ ffmpeg-0.5+svn20090706/debian/patches/CVE-2009-46XX/security-issue19.patch @@ -0,0 +1,15 @@ +Description: Set data_size to 0 to avoid having it uninitialized. +Origin: upstream, ffmpeg 0.5.1: r21718 + +diff -Nur ffmpeg-0.5+svn20090706/libavcodec/mpegaudiodec.c ffmpeg-0.5+svn20090706.new/libavcodec/mpegaudiodec.c +--- ffmpeg-0.5+svn20090706/libavcodec/mpegaudiodec.c 2009-02-22 08:48:55.000000000 -0500 ++++ ffmpeg-0.5+svn20090706.new/libavcodec/mpegaudiodec.c 2010-04-07 10:24:46.000000000 -0400 +@@ -2287,6 +2287,8 @@ + avctx->bit_rate = s->bit_rate; + avctx->sub_id = s->layer; + ++ *data_size = 0; ++ + if(s->frame_size<=0 || s->frame_size > buf_size){ + av_log(avctx, AV_LOG_ERROR, "incomplete frame\n"); + return -1; --- ffmpeg-0.5+svn20090706.orig/debian/patches/CVE-2009-46XX/security-issue18.patch +++ ffmpeg-0.5+svn20090706/debian/patches/CVE-2009-46XX/security-issue18.patch @@ -0,0 +1,39 @@ +Description: Fix possible buffer over-read in vorbis_comment +Origin: upstream, ffmpeg 0.5.1: r21711 + +diff -Nur ffmpeg-0.5+svn20090706/libavformat/oggparsevorbis.c ffmpeg-0.5+svn20090706.new/libavformat/oggparsevorbis.c +--- ffmpeg-0.5+svn20090706/libavformat/oggparsevorbis.c 2009-02-12 16:39:37.000000000 -0500 ++++ ffmpeg-0.5+svn20090706.new/libavformat/oggparsevorbis.c 2010-04-07 10:21:15.000000000 -0400 +@@ -35,27 +35,28 @@ + { + const uint8_t *p = buf; + const uint8_t *end = buf + size; +- unsigned s, n, j; ++ unsigned n, j; ++ int s; + + if (size < 8) /* must have vendor_length and user_comment_list_length */ + return -1; + + s = bytestream_get_le32(&p); + +- if (end - p < s) ++ if (end - p - 4 < s || s < 0) + return -1; + + p += s; + + n = bytestream_get_le32(&p); + +- while (p < end && n > 0) { ++ while (end - p >= 4 && n > 0) { + const char *t, *v; + int tl, vl; + + s = bytestream_get_le32(&p); + +- if (end - p < s) ++ if (end - p < s || s < 0) + break; + + t = p; --- ffmpeg-0.5+svn20090706.orig/debian/patches/CVE-2009-46XX/security-issue11.patch +++ ffmpeg-0.5+svn20090706/debian/patches/CVE-2009-46XX/security-issue11.patch @@ -0,0 +1,21 @@ +Description: Fix book_idx check. +Origin: upstream, ffmpeg 0.5.1: r21724 + +diff -Nur ffmpeg-0.5+svn20090706/libavcodec/vorbis_dec.c ffmpeg-0.5+svn20090706.new/libavcodec/vorbis_dec.c +--- ffmpeg-0.5+svn20090706/libavcodec/vorbis_dec.c 2010-04-07 10:18:42.000000000 -0400 ++++ ffmpeg-0.5+svn20090706.new/libavcodec/vorbis_dec.c 2010-04-07 10:18:47.000000000 -0400 +@@ -569,12 +569,11 @@ + uint_fast8_t book_idx; + for (idx=0;idxdata.t0.num_books;++idx) { + book_idx=get_bits(gb, 8); ++ if (book_idx>=vc->codebook_count) ++ return 1; + floor_setup->data.t0.book_list[idx]=book_idx; + if (vc->codebooks[book_idx].dimensions > max_codebook_dim) + max_codebook_dim=vc->codebooks[book_idx].dimensions; +- +- if (floor_setup->data.t0.book_list[idx]>vc->codebook_count) +- return 1; + } + } + --- ffmpeg-0.5+svn20090706.orig/debian/patches/CVE-2009-46XX/security-issue03.patch +++ ffmpeg-0.5+svn20090706/debian/patches/CVE-2009-46XX/security-issue03.patch @@ -0,0 +1,295 @@ +Description: check stream existence before assignment +Origin: upstream, ffmpeg 0.5: r21709 +Origin: upstream, ffmpeg 0.5: r21710 + +diff -Nur ffmpeg-0.5+svn20090706/libavformat/mov.c ffmpeg-0.5+svn20090706.new/libavformat/mov.c +--- ffmpeg-0.5+svn20090706/libavformat/mov.c 2009-03-01 11:06:26.000000000 -0500 ++++ ffmpeg-0.5+svn20090706.new/libavformat/mov.c 2010-04-07 10:15:36.000000000 -0400 +@@ -238,10 +238,15 @@ + + static int mov_read_dref(MOVContext *c, ByteIOContext *pb, MOVAtom atom) + { +- AVStream *st = c->fc->streams[c->fc->nb_streams-1]; +- MOVStreamContext *sc = st->priv_data; ++ AVStream *st; ++ MOVStreamContext *sc; + int entries, i, j; + ++ if (c->fc->nb_streams < 1) ++ return 0; ++ st = c->fc->streams[c->fc->nb_streams-1]; ++ sc = st->priv_data; ++ + get_be32(pb); // version + flags + entries = get_be32(pb); + if (entries >= UINT_MAX / sizeof(*sc->drefs)) +@@ -381,9 +386,13 @@ + + static int mov_read_esds(MOVContext *c, ByteIOContext *pb, MOVAtom atom) + { +- AVStream *st = c->fc->streams[c->fc->nb_streams-1]; ++ AVStream *st; + int tag, len; + ++ if (c->fc->nb_streams < 1) ++ return 0; ++ st = c->fc->streams[c->fc->nb_streams-1]; ++ + get_be32(pb); /* version + flags */ + len = mp4_read_descr(c, pb, &tag); + if (tag == MP4ESDescrTag) { +@@ -440,7 +449,12 @@ + { + const int num = get_be32(pb); + const int den = get_be32(pb); +- AVStream * const st = c->fc->streams[c->fc->nb_streams-1]; ++ AVStream *st; ++ ++ if (c->fc->nb_streams < 1) ++ return 0; ++ st = c->fc->streams[c->fc->nb_streams-1]; ++ + if (den != 0) { + if ((st->sample_aspect_ratio.den != 1 || st->sample_aspect_ratio.num) && // default + (den != st->sample_aspect_ratio.den || num != st->sample_aspect_ratio.num)) +@@ -494,12 +508,18 @@ + + static int mov_read_mdhd(MOVContext *c, ByteIOContext *pb, MOVAtom atom) + { +- AVStream *st = c->fc->streams[c->fc->nb_streams-1]; +- MOVStreamContext *sc = st->priv_data; +- int version = get_byte(pb); ++ AVStream *st; ++ MOVStreamContext *sc; ++ int version; + char language[4] = {0}; + unsigned lang; + ++ if (c->fc->nb_streams < 1) ++ return 0; ++ st = c->fc->streams[c->fc->nb_streams-1]; ++ sc = st->priv_data; ++ ++ version = get_byte(pb); + if (version > 1) + return -1; /* unsupported */ + +@@ -561,7 +581,11 @@ + + static int mov_read_smi(MOVContext *c, ByteIOContext *pb, MOVAtom atom) + { +- AVStream *st = c->fc->streams[c->fc->nb_streams-1]; ++ AVStream *st; ++ ++ if (c->fc->nb_streams < 1) ++ return 0; ++ st = c->fc->streams[c->fc->nb_streams-1]; + + if((uint64_t)atom.size > (1<<30)) + return -1; +@@ -581,9 +605,14 @@ + + static int mov_read_enda(MOVContext *c, ByteIOContext *pb, MOVAtom atom) + { +- AVStream *st = c->fc->streams[c->fc->nb_streams-1]; +- int little_endian = get_be16(pb); ++ AVStream *st; ++ int little_endian; + ++ if (c->fc->nb_streams < 1) ++ return 0; ++ st = c->fc->streams[c->fc->nb_streams-1]; ++ ++ little_endian = get_be16(pb); + dprintf(c->fc, "enda %d\n", little_endian); + if (little_endian == 1) { + switch (st->codec->codec_id) { +@@ -633,7 +662,11 @@ + + static int mov_read_wave(MOVContext *c, ByteIOContext *pb, MOVAtom atom) + { +- AVStream *st = c->fc->streams[c->fc->nb_streams-1]; ++ AVStream *st; ++ ++ if (c->fc->nb_streams < 1) ++ return 0; ++ st = c->fc->streams[c->fc->nb_streams-1]; + + if((uint64_t)atom.size > (1<<30)) + return -1; +@@ -660,7 +693,11 @@ + */ + static int mov_read_glbl(MOVContext *c, ByteIOContext *pb, MOVAtom atom) + { +- AVStream *st = c->fc->streams[c->fc->nb_streams-1]; ++ AVStream *st; ++ ++ if (c->fc->nb_streams < 1) ++ return 0; ++ st = c->fc->streams[c->fc->nb_streams-1]; + + if((uint64_t)atom.size > (1<<30)) + return -1; +@@ -676,10 +713,15 @@ + + static int mov_read_stco(MOVContext *c, ByteIOContext *pb, MOVAtom atom) + { +- AVStream *st = c->fc->streams[c->fc->nb_streams-1]; +- MOVStreamContext *sc = st->priv_data; ++ AVStream *st; ++ MOVStreamContext *sc; + unsigned int i, entries; + ++ if (c->fc->nb_streams < 1) ++ return 0; ++ st = c->fc->streams[c->fc->nb_streams-1]; ++ sc = st->priv_data; ++ + get_byte(pb); /* version */ + get_be24(pb); /* flags */ + +@@ -742,10 +784,15 @@ + + static int mov_read_stsd(MOVContext *c, ByteIOContext *pb, MOVAtom atom) + { +- AVStream *st = c->fc->streams[c->fc->nb_streams-1]; +- MOVStreamContext *sc = st->priv_data; ++ AVStream *st; ++ MOVStreamContext *sc; + int j, entries, pseudo_stream_id; + ++ if (c->fc->nb_streams < 1) ++ return 0; ++ st = c->fc->streams[c->fc->nb_streams-1]; ++ sc = st->priv_data; ++ + get_byte(pb); /* version */ + get_be24(pb); /* flags */ + +@@ -1064,10 +1111,15 @@ + + static int mov_read_stsc(MOVContext *c, ByteIOContext *pb, MOVAtom atom) + { +- AVStream *st = c->fc->streams[c->fc->nb_streams-1]; +- MOVStreamContext *sc = st->priv_data; ++ AVStream *st; ++ MOVStreamContext *sc; + unsigned int i, entries; + ++ if (c->fc->nb_streams < 1) ++ return 0; ++ st = c->fc->streams[c->fc->nb_streams-1]; ++ sc = st->priv_data; ++ + get_byte(pb); /* version */ + get_be24(pb); /* flags */ + +@@ -1092,10 +1144,15 @@ + + static int mov_read_stss(MOVContext *c, ByteIOContext *pb, MOVAtom atom) + { +- AVStream *st = c->fc->streams[c->fc->nb_streams-1]; +- MOVStreamContext *sc = st->priv_data; ++ AVStream *st; ++ MOVStreamContext *sc; + unsigned int i, entries; + ++ if (c->fc->nb_streams < 1) ++ return 0; ++ st = c->fc->streams[c->fc->nb_streams-1]; ++ sc = st->priv_data; ++ + get_byte(pb); /* version */ + get_be24(pb); /* flags */ + +@@ -1119,10 +1176,15 @@ + + static int mov_read_stsz(MOVContext *c, ByteIOContext *pb, MOVAtom atom) + { +- AVStream *st = c->fc->streams[c->fc->nb_streams-1]; +- MOVStreamContext *sc = st->priv_data; ++ AVStream *st; ++ MOVStreamContext *sc; + unsigned int i, entries, sample_size; + ++ if (c->fc->nb_streams < 1) ++ return 0; ++ st = c->fc->streams[c->fc->nb_streams-1]; ++ sc = st->priv_data; ++ + get_byte(pb); /* version */ + get_be24(pb); /* flags */ + +@@ -1150,12 +1212,17 @@ + + static int mov_read_stts(MOVContext *c, ByteIOContext *pb, MOVAtom atom) + { +- AVStream *st = c->fc->streams[c->fc->nb_streams-1]; +- MOVStreamContext *sc = st->priv_data; ++ AVStream *st; ++ MOVStreamContext *sc; + unsigned int i, entries; + int64_t duration=0; + int64_t total_sample_count=0; + ++ if (c->fc->nb_streams < 1) ++ return 0; ++ st = c->fc->streams[c->fc->nb_streams-1]; ++ sc = st->priv_data; ++ + get_byte(pb); /* version */ + get_be24(pb); /* flags */ + entries = get_be32(pb); +@@ -1194,10 +1261,15 @@ + + static int mov_read_ctts(MOVContext *c, ByteIOContext *pb, MOVAtom atom) + { +- AVStream *st = c->fc->streams[c->fc->nb_streams-1]; +- MOVStreamContext *sc = st->priv_data; ++ AVStream *st; ++ MOVStreamContext *sc; + unsigned int i, entries; + ++ if (c->fc->nb_streams < 1) ++ return 0; ++ st = c->fc->streams[c->fc->nb_streams-1]; ++ sc = st->priv_data; ++ + get_byte(pb); /* version */ + get_be24(pb); /* flags */ + entries = get_be32(pb); +@@ -1504,10 +1576,16 @@ + int height; + int64_t disp_transform[2]; + int display_matrix[3][2]; +- AVStream *st = c->fc->streams[c->fc->nb_streams-1]; +- MOVStreamContext *sc = st->priv_data; +- int version = get_byte(pb); ++ AVStream *st; ++ MOVStreamContext *sc; ++ int version; + ++ if (c->fc->nb_streams < 1) ++ return 0; ++ st = c->fc->streams[c->fc->nb_streams-1]; ++ sc = st->priv_data; ++ ++ version = get_byte(pb); + get_be24(pb); /* flags */ + /* + MOV_TRACK_ENABLED 0x0001 +@@ -1776,9 +1854,13 @@ + /* edit list atom */ + static int mov_read_elst(MOVContext *c, ByteIOContext *pb, MOVAtom atom) + { +- MOVStreamContext *sc = c->fc->streams[c->fc->nb_streams-1]->priv_data; ++ MOVStreamContext *sc; + int i, edit_count; + ++ if (c->fc->nb_streams < 1) ++ return 0; ++ sc = c->fc->streams[c->fc->nb_streams-1]->priv_data; ++ + get_byte(pb); /* version */ + get_be24(pb); /* flags */ + edit_count = get_be32(pb); /* entries */ --- ffmpeg-0.5+svn20090706.orig/debian/patches/CVE-2009-46XX/security-issue20.patch +++ ffmpeg-0.5+svn20090706/debian/patches/CVE-2009-46XX/security-issue20.patch @@ -0,0 +1,24 @@ +Description: Disable parsing for ogg streams where no ogg header was found +Origin: upstream, ffmpeg 0.5.1: r21708 + +diff -Nur ffmpeg-0.5+svn20090706/libavformat/oggdec.c ffmpeg-0.5+svn20090706.new/libavformat/oggdec.c +--- ffmpeg-0.5+svn20090706/libavformat/oggdec.c 2009-02-14 08:44:21.000000000 -0500 ++++ ffmpeg-0.5+svn20090706.new/libavformat/oggdec.c 2010-04-07 10:27:37.000000000 -0400 +@@ -477,12 +477,17 @@ + ogg_read_header (AVFormatContext * s, AVFormatParameters * ap) + { + struct ogg *ogg = s->priv_data; ++ int i; + ogg->curidx = -1; + //linear headers seek from start + if (ogg_get_headers (s) < 0){ + return -1; + } + ++ for (i = 0; i < ogg->nstreams; i++) ++ if (ogg->streams[i].header < 0) ++ ogg->streams[i].codec = NULL; ++ + //linear granulepos seek from end + ogg_get_length (s); + --- ffmpeg-0.5+svn20090706.orig/debian/patches/CVE-2009-46XX/security-issue13.patch +++ ffmpeg-0.5+svn20090706/debian/patches/CVE-2009-46XX/security-issue13.patch @@ -0,0 +1,15 @@ +Description: fix = -> == typo. +Origin: upstream, ffmpeg 0.5.1: r21722 + +diff -Nur ffmpeg-0.5+svn20090706/libavcodec/vorbis_dec.c ffmpeg-0.5+svn20090706.new/libavcodec/vorbis_dec.c +--- ffmpeg-0.5+svn20090706/libavcodec/vorbis_dec.c 2010-04-07 10:19:25.000000000 -0400 ++++ ffmpeg-0.5+svn20090706.new/libavcodec/vorbis_dec.c 2010-04-07 10:19:29.000000000 -0400 +@@ -1553,7 +1553,7 @@ + uint_fast8_t ch=0; + + for(j=0;jaudio_channels;++j) { +- if ((mapping->submaps==1) || (i=mapping->mux[j])) { ++ if ((mapping->submaps==1) || (i==mapping->mux[j])) { + res_chan[j]=res_num; + if (no_residue[j]) { + do_not_decode[ch]=1; --- 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/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 +