diff options
author | Olivier Huber <huber@crans.org> | 2010-04-24 17:27:00 -0400 |
---|---|---|
committer | Olivier Huber <huber@crans.org> | 2010-04-24 17:27:00 -0400 |
commit | bd1c4e26a2c6ca07657bca598cc458301b4d8a1e (patch) | |
tree | e4c1377710eab84a22c029503fd455b0cf0168e4 | |
download | xhub-bd1c4e26a2c6ca07657bca598cc458301b4d8a1e.tar.gz xhub-bd1c4e26a2c6ca07657bca598cc458301b4d8a1e.tar.bz2 xhub-bd1c4e26a2c6ca07657bca598cc458301b4d8a1e.zip |
Initial import
35 files changed, 7919 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b25c15b --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*~ diff --git a/dev-python/mechanize/Manifest b/dev-python/mechanize/Manifest new file mode 100644 index 0000000..b430b30 --- /dev/null +++ b/dev-python/mechanize/Manifest @@ -0,0 +1,3 @@ +DIST mechanize-0.2.0.tar.gz 378487 RMD160 21fb32522945e9380b36de8fb7b472fe05bd2caa SHA1 d95456ba625c8a152a1e01ddfb7d3570d62a53af SHA256 af26a30f16d9f7d53ef9b000ca0bcf173ba5ba1c108f7fdd218f1e90fedc6221 +EBUILD mechanize-0.2.0.ebuild 1469 RMD160 1e113776e6321a00f0736507ea17d6cb0cb4b80d SHA1 433017a6d3995f4444fccb2942cdaea35b9ab12c SHA256 2860054094a8283fab8f2f90e280ccb388d0a0916ea2129dc4074478ca6ea3ce +MISC metadata.xml 791 RMD160 cf985c27f79156886aa162185fd8aac175639a4b SHA1 093dcb8ca0afca8a49df42e9c6b5be710a58a0f8 SHA256 8a1186c5e48058b31202900e47ed5e2938f5e53d3a419828a9049e6cb9d3b87f diff --git a/dev-python/mechanize/mechanize-0.2.0.ebuild b/dev-python/mechanize/mechanize-0.2.0.ebuild new file mode 100644 index 0000000..4668534 --- /dev/null +++ b/dev-python/mechanize/mechanize-0.2.0.ebuild @@ -0,0 +1,49 @@ +# Copyright 1999-2010 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header: /var/cvsroot/gentoo-x86/dev-python/mechanize/mechanize-0.2.0.ebuild,v 1.1 2010/04/24 10:33:34 djc Exp $ + +EAPI="2" +SUPPORT_PYTHON_ABIS="1" + +inherit distutils eutils + +DESCRIPTION="Stateful programmatic web browsing in Python" +HOMEPAGE="http://wwwsearch.sourceforge.net/mechanize/ http://pypi.python.org/pypi/mechanize" +SRC_URI="http://wwwsearch.sourceforge.net/${PN}/src/${P}.tar.gz" + +LICENSE="|| ( BSD ZPL )" +SLOT="0" +KEYWORDS="~alpha ~amd64 ~ia64 ~ppc ~sparc ~x86 ~amd64-linux ~ia64-linux ~x86-linux ~x86-macos" +IUSE="" + +DEPEND="" +RDEPEND="" +RESTRICT_PYTHON_ABIS="3.*" + +DOCS="docs/*.txt" + +src_prepare() { + # Use distutils instead of setuptools. + # (This can't be removed in the same ${PV} due to file->directory replacement.) + sed -e 's/not hasattr(sys, "version_info")/True/' -i setup.py || die "sed in setup.py failed" + + # We don't run coverage tests or functional_tests + # which access the network, just doctests and unit tests + sed -e '/import coverage/d' -i test.py || die "sed in test.py failed" +} + +src_test() { + testing() { + # ignore warnings http://github.com/jjlee/mechanize/issues/issue/13 + PYTHONPATH="build-${PYTHON_ABI}/lib" "$(PYTHON)" -Wignore test.py + } + python_execute_function testing +} + +src_install() { + # Fix some paths. + sed -i -e 's:../styles/:styles/:g' docs/html/* + dohtml -r docs/html/ docs/styles + + distutils_src_install +} diff --git a/dev-python/mechanize/metadata.xml b/dev-python/mechanize/metadata.xml new file mode 100644 index 0000000..0a3f10c --- /dev/null +++ b/dev-python/mechanize/metadata.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE pkgmetadata SYSTEM "http://www.gentoo.org/dtd/metadata.dtd"> +<pkgmetadata> + <herd>python</herd> + <longdescription lang="en"> + mechanize is a Python module for static programmatic web browsing in + Python, after Andy Lester's Perl module WWW::Mechanize. With the Browser + subclass any url can be opened - not just http - and UserAgentBase + offers easy dynamic configuration of user-agent features like protocol, + cookie, redirection and robots.txt handling. Other functionalities + include easy HTML form filling using ClientForm interface, convenient + link parsing and following, browser history with .back() and .reload() + methods and automatic handling of HTTP-Equiv and Refresh. + </longdescription> +</pkgmetadata> diff --git a/dev-tex/tkz-berge/Manifest b/dev-tex/tkz-berge/Manifest new file mode 100644 index 0000000..d1297b7 --- /dev/null +++ b/dev-tex/tkz-berge/Manifest @@ -0,0 +1,3 @@ +DIST tkz-arith.sty 10317 RMD160 4001e1d8b12f22152629dd0b90e059db97454153 SHA1 1b1eeda635a29307b7b550423df01a8384dfe09f SHA256 117bc99116eff00a4ab0cbcafa6f2caf5a6b4e5e7b63dcc2013d2ddf713d17a2 +DIST tkz-berge.sty 78194 RMD160 1910b787ee89222cdb936dda4420095482de04a7 SHA1 aa509422f4069917e5a55439a46d32acb33e99ad SHA256 2b1179596307dc173f954bfff52bcff1f798bfeaf6acbe3eefa036637f7264d9 +EBUILD tkz-berge-2.8.ebuild 767 RMD160 e7055e0bbdb747b39b704c1ce972a0fc419bb241 SHA1 79f66a14b5b24e949451074aa9367ab73ccb52b4 SHA256 eb45b9c46472ee6373c6c1c88c4f22b08eaf6247f3a6ece00fdb3ee9740906e3 diff --git a/dev-tex/tkz-berge/tkz-berge-2.8.ebuild b/dev-tex/tkz-berge/tkz-berge-2.8.ebuild new file mode 100644 index 0000000..bcadb1f --- /dev/null +++ b/dev-tex/tkz-berge/tkz-berge-2.8.ebuild @@ -0,0 +1,36 @@ +# Copyright 1999-2010 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header: $ + +inherit latex-package + +DESCRIPTION="This is a sample skeleton ebuild file" +HOMEPAGE="http://altermundus.com/pages/graphtheory.html" +SRC_URI="http://altermundus.com/downloads/packages/tkz-arith.sty + http://altermundus.com/downloads/packages/${PN}.sty" + +# TODO: no license found + +LICENSE="" +SLOT="0" +KEYWORDS="~amd64 ~ppc ~x86" +IUSE="" + +# TODO: examples + +RESTRICT="mirror" + +# TODO: check dependencies + +DEPEND=">=dev-tex/tkz-graph-2.7d" +RDEPEND="${DEPEND}" + +# TODO: is there a more convenient way to do the following ? + +src_unpack() { + mkdir "${S}" || die "mkdir failed" + + for i in ${A} ; do + cp "${DISTDIR}"/${i} "${S}" || die "cp failed" + done +} diff --git a/dev-tex/tkz-graph/Manifest b/dev-tex/tkz-graph/Manifest new file mode 100644 index 0000000..2b13456 --- /dev/null +++ b/dev-tex/tkz-graph/Manifest @@ -0,0 +1,2 @@ +DIST tkz-graph.sty 43480 RMD160 41d2a4379a90dd233243e3d0b625018e0989d774 SHA1 f731af8bc47435d779f45918a049dbb39f6e0f78 SHA256 38e499f1b59452f9d93d7c6f3f2499050da4d929e9b8479e7ec6c9066bfe9c68 +EBUILD tkz-graph-2.7d.ebuild 681 RMD160 6ec4e57f71d298e3dd55463acc8a4433b515bc23 SHA1 61053b7769ef66d413a9436670a4318bb5b71faf SHA256 2396b84a3bef38f4ba977d1b35f09458bc855eaf27dc0d6eee320856880d3550 diff --git a/dev-tex/tkz-graph/tkz-graph-2.7d.ebuild b/dev-tex/tkz-graph/tkz-graph-2.7d.ebuild new file mode 100644 index 0000000..e237e2e --- /dev/null +++ b/dev-tex/tkz-graph/tkz-graph-2.7d.ebuild @@ -0,0 +1,32 @@ +# Copyright 1999-2010 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header: $ + +inherit latex-package + +DESCRIPTION="tkz-graph is a set of convenient macros for drawing graphs" +HOMEPAGE="http://altermundus.com/pages/graph.html" +SRC_URI="http://altermundus.com/downloads/packages/${PN}.sty" + +# TODO: could not find a license + +LICENSE="" +SLOT="0" +KEYWORDS="~amd64 ~ppc ~x86" +IUSE="" + +# TODO: examples + +RESTRICT="mirror" + +# TODO: check dependencies + +DEPEND="" +RDEPEND="${DEPEND}" + +# TODO: is there a more convenient way to do the following ? + +src_unpack() { + mkdir "${S}" || die "mkdir failed" + cp "${DISTDIR}"/${A} "${S}" || die "cp failed" +} diff --git a/kde-misc/basket/Manifest b/kde-misc/basket/Manifest new file mode 100644 index 0000000..669bbb5 --- /dev/null +++ b/kde-misc/basket/Manifest @@ -0,0 +1,3 @@ +AUX basket-1.80-crypt.patch 878 RMD160 28873c7d93f53a8a775cc92705f8141c14d8baa6 SHA1 df119c18f39830cb42b2f0c8ba1ae77009800c4e SHA256 fede246f73c51eccc72347f652e9bf52b6de14126663844d21c96f51bc363d8f +DIST basket-1.80.tar.bz2 4167408 RMD160 410bfdf64486ad01c459438fb29fc60b09b3fc40 SHA1 ffc3cadee631240e10f03c870de1fd1a10a8149c SHA256 7358dfb9722c38e98369d5ef783f684dc4f9179ddb157d65bd348648b071016f +EBUILD basket-1.80.ebuild 629 RMD160 876d54e946406e0b5bb2f4c6e2eeca209c479474 SHA1 81b4af796f23318b9779cb2f297f0f664602cbc4 SHA256 650e5be5e9a428c6887c694e816b0c766e3ebfe272cb0f4f541629f949c8da62 diff --git a/kde-misc/basket/basket-1.80.ebuild b/kde-misc/basket/basket-1.80.ebuild new file mode 100644 index 0000000..82c4c3a --- /dev/null +++ b/kde-misc/basket/basket-1.80.ebuild @@ -0,0 +1,33 @@ +# Copyright 1999-2010 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header: $ + +EAPI="2" + +inherit kde4-base + +DESCRIPTION="A DropDrawers clone. Multiple information organizer" +HOMEPAGE="http://basket.kde.org/" +SRC_URI="http://${PN}.kde.org/downloads/${P}.tar.bz2" + +LICENSE="GPL-2" +KEYWORDS="~amd64" +SLOT="4" + +IUSE="debug crypt" + +DEPEND=" + >=kde-base/kdelibs-4.4.0 + >=kde-base/kdepimlibs-4.4.0 + crypt? ( >=app-crypt/gpgme-1.0 ) +" +RDEPEND=${DEPEND} + +PATCHES=( "${FILESDIR}/${P}-crypt.patch" ) + +src_configure() { + mycmakeargs=( + $(cmake-utils_use_enable crypt) + ) + kde4-base_src_configure +} diff --git a/kde-misc/basket/files/basket-1.80-crypt.patch b/kde-misc/basket/files/basket-1.80-crypt.patch new file mode 100644 index 0000000..dc8aa68 --- /dev/null +++ b/kde-misc/basket/files/basket-1.80-crypt.patch @@ -0,0 +1,30 @@ +diff -r -u basket-1.80-vanilla/CMakeLists.txt basket-1.80/CMakeLists.txt +--- basket-1.80-vanilla/CMakeLists.txt 2010-03-20 21:20:57.000000000 +0100 ++++ basket-1.80/CMakeLists.txt 2010-03-28 22:04:43.000000000 +0200 +@@ -1,5 +1,7 @@ + cmake_minimum_required(VERSION 2.4) + ++OPTION(ENABLE_CRYPT "build encryption support" ON) ++ + find_package(KDE4 REQUIRED) + find_package(QImageBlitz REQUIRED) + find_package(Gpgme) +@@ -15,13 +17,14 @@ + + include(MacroLibrary) + +-IF(GPGME_FOUND) ++IF(GPGME_FOUND AND ENABLE_CRYPT) + SET(HAVE_LIBGPGME 1) + SET(LARGEFILE_SOURCE_1) + ADD_DEFINITIONS(-D_FILE_OFFSET_BITS=64) +-ELSE(GPGME_FOUND) +- MESSAGE("GPG not found, configuring without") +-ENDIF(GPGME_FOUND) ++ MESSAGE("Configuring with GPG support") ++ELSE(GPGME_FOUND AND ENABLE_CRYPT) ++ MESSAGE("Configuring without GPG support") ++ENDIF(GPGME_FOUND AND ENABLE_CRYPT) + + #TODO: find meinproc + diff --git a/media-tv/v4l2ucp/Manifest b/media-tv/v4l2ucp/Manifest new file mode 100644 index 0000000..42a36f1 --- /dev/null +++ b/media-tv/v4l2ucp/Manifest @@ -0,0 +1,2 @@ +DIST v4l2ucp-2.0.2.tar.bz2 41380 RMD160 c82e139f5733843087832968a8c11df64ab93a1b SHA1 12960ae7b8bceaff017ac26d377fe4ef13628289 SHA256 e525add8788fa9ce613705a2a88947d4d1ef1c2bde8aa9f3e8ef19207271c1be +EBUILD v4l2ucp-2.0.2.ebuild 423 RMD160 0928c2743a7ae76136cf7d7da89f9f6bec6198c2 SHA1 b77a2e7f45ae41c6b480bd5b01bc1ae9a96d8e68 SHA256 4f84dda44c6c8c828d0b395517f9a3dd4c3cf9f798a5d065fa4097765cf15091 diff --git a/media-tv/v4l2ucp/v4l2ucp-2.0.2.ebuild b/media-tv/v4l2ucp/v4l2ucp-2.0.2.ebuild new file mode 100644 index 0000000..98ebcb0 --- /dev/null +++ b/media-tv/v4l2ucp/v4l2ucp-2.0.2.ebuild @@ -0,0 +1,19 @@ +# Copyright 1999-2010 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header: $ + +EAPI=2 +inherit cmake-utils + +DESCRIPTION="A universal control panel for all Video for Linux Two (V4L2) +devices" +HOMEPAGE="http://v4l2ucp.sf.net/" +SRC_URI="mirror://sourceforge/v4l2ucp/${P}.tar.bz2" + +LICENSE="GPL-2" +SLOT="0" +KEYWORDS="~amd64 ~x86" +IUSE="" + +DEPEND="x11-libs/qt-gui:4 + media-libs/libv4l" diff --git a/media-video/ffmpeg/Manifest b/media-video/ffmpeg/Manifest new file mode 100644 index 0000000..c8db9da --- /dev/null +++ b/media-video/ffmpeg/Manifest @@ -0,0 +1,3 @@ +DIST ffmpeg-0.5_p22846.tar.bz2 3675057 RMD160 3ebd997321d59fa0baf87329518e925ccbed3cf8 SHA1 d207570ed009b63c94485ccc64439107cf700f39 SHA256 a52d82476afa7c8ed62c1a52760e49907947c1ef1ecfc3e9022fa713e9783f2f +EBUILD ffmpeg-0.5_p22846.ebuild 7655 RMD160 76a3dbc9ba1f52d8f8aa8d1aac3ce5bd16d359d3 SHA1 7e20bdff4d08f92ee407f6f96db9876d32c023e2 SHA256 85e5cc2848fcbabfd3bc3d585bd58536044847b34af63ffaeb4f061a08d2bcc0 +MISC metadata.xml 1876 RMD160 3fed4cfedd4cd693c1053bd4ea90c75260aa2815 SHA1 827e1fc2f346f5c8695d45c4697dbcd4fbc47462 SHA256 a2b6f4fce6ae13c3cdc007124cea38857942efeb7fac9779487d087b6068ca52 diff --git a/media-video/ffmpeg/ffmpeg-0.5_p22846.ebuild b/media-video/ffmpeg/ffmpeg-0.5_p22846.ebuild new file mode 100644 index 0000000..4d36b2f --- /dev/null +++ b/media-video/ffmpeg/ffmpeg-0.5_p22846.ebuild @@ -0,0 +1,248 @@ +# Copyright 1999-2010 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header: /var/cvsroot/gentoo-x86/media-video/ffmpeg/ffmpeg-0.5_p22846.ebuild,v 1.2 2010/04/23 12:53:48 ssuominen Exp $ + +EAPI=2 +SCM="" +if [ "${PV#9999}" != "${PV}" ] ; then + SCM=subversion + ESVN_REPO_URI="svn://svn.ffmpeg.org/ffmpeg/trunk" +fi + +inherit eutils flag-o-matic multilib toolchain-funcs ${SCM} + +DESCRIPTION="Complete solution to record, convert and stream audio and video. Includes libavcodec." +HOMEPAGE="http://ffmpeg.org/" +if [ "${PV#9999}" != "${PV}" ] ; then + SRC_URI="" +elif [ "${PV%_p*}" != "${PV}" ] ; then # Snapshot + SRC_URI="mirror://gentoo/${P}.tar.bz2" +else # Release + SRC_URI="http://ffmpeg.org/releases/${P}.tar.bz2" +fi +FFMPEG_REVISION="${PV#*_p}" + +LICENSE="GPL-3" +SLOT="0" +KEYWORDS="~alpha ~amd64 ~arm ~hppa ~ia64 ~ppc ~ppc64 ~sparc ~x86 ~x86-fbsd" +IUSE="+3dnow +3dnowext alsa altivec cpudetection custom-cflags debug dirac + doc ieee1394 +encode faac faad gsm jack +mmx +mmxext vorbis test + theora threads x264 xvid network zlib sdl X mp3 amr + oss pic schroedinger +hardcoded-tables bindist v4l v4l2 + speex +ssse3 jpeg2k vdpau vaapi" + +VIDEO_CARDS="nvidia" + +for x in ${VIDEO_CARDS}; do + IUSE="${IUSE} video_cards_${x}" +done + +RDEPEND="sdl? ( >=media-libs/libsdl-1.2.10 ) + alsa? ( media-libs/alsa-lib ) + encode? ( + faac? ( media-libs/faac ) + mp3? ( media-sound/lame ) + vorbis? ( media-libs/libvorbis media-libs/libogg ) + theora? ( >=media-libs/libtheora-1.1.1[encode] media-libs/libogg ) + x264? ( >=media-libs/x264-0.0.20100118 ) + xvid? ( >=media-libs/xvid-1.1.0 ) ) + faad? ( >=media-libs/faad2-2.6.1 ) + zlib? ( sys-libs/zlib ) + ieee1394? ( media-libs/libdc1394 + sys-libs/libraw1394 ) + dirac? ( media-video/dirac ) + gsm? ( >=media-sound/gsm-1.0.12-r1 ) + jpeg2k? ( >=media-libs/openjpeg-1.3-r2 ) + amr? ( media-libs/opencore-amr ) + schroedinger? ( media-libs/schroedinger ) + speex? ( >=media-libs/speex-1.2_beta3 ) + jack? ( media-sound/jack-audio-connection-kit ) + vaapi? ( x11-libs/libva ) + X? ( x11-libs/libX11 x11-libs/libXext ) + video_cards_nvidia? ( + vdpau? ( x11-libs/libvdpau ) + )" + +DEPEND="${RDEPEND} + >=sys-devel/make-3.81 + dirac? ( dev-util/pkgconfig ) + schroedinger? ( dev-util/pkgconfig ) + mmx? ( dev-lang/yasm ) + doc? ( app-text/texi2html ) + test? ( net-misc/wget ) + v4l? ( sys-kernel/linux-headers ) + v4l2? ( sys-kernel/linux-headers )" + +src_prepare() { + if [[ ${PV} = *9999* ]]; then + # Set SVN version manually + subversion_wc_info + sed -i s/UNKNOWN/SVN-r${ESVN_WC_REVISION}/ "${S}/version.sh" + elif [ "${PV%_p*}" != "${PV}" ] ; then # Snapshot + sed -i s/UNKNOWN/SVN-r${FFMPEG_REVISION}/ "${S}/version.sh" + fi +} + +src_configure() { + local myconf="${EXTRA_FFMPEG_CONF}" + + # enabled by default + use debug || myconf="${myconf} --disable-debug" + use zlib || myconf="${myconf} --disable-zlib" + use sdl || myconf="${myconf} --disable-ffplay" + use network || myconf="${myconf} --disable-network" + + use custom-cflags && myconf="${myconf} --disable-optimizations" + use cpudetection && myconf="${myconf} --enable-runtime-cpudetect" + + # enabled by default + if use encode + then + use mp3 && myconf="${myconf} --enable-libmp3lame" + use vorbis && myconf="${myconf} --enable-libvorbis" + use theora && myconf="${myconf} --enable-libtheora" + use x264 && myconf="${myconf} --enable-libx264" + use xvid && myconf="${myconf} --enable-libxvid" + if use bindist + then + use faac && ewarn "faac is nonfree and cannot be distributed; + disabling faac support." + else + use faac && myconf="${myconf} --enable-libfaac --enable-nonfree" + fi + else + myconf="${myconf} --disable-encoders" + fi + + # libavdevice options + use ieee1394 && myconf="${myconf} --enable-libdc1394" + # Indevs + for i in v4l v4l2 alsa oss jack ; do + use $i || myconf="${myconf} --disable-indev=$i" + done + # Outdevs + for i in alsa oss ; do + use $i || myconf="${myconf} --disable-outdev=$i" + done + use X && myconf="${myconf} --enable-x11grab" + + # Threads; we only support pthread for now but ffmpeg supports more + use threads && myconf="${myconf} --enable-pthreads" + + # Decoders + use amr && myconf="${myconf} --enable-libopencore-amrwb + --enable-libopencore-amrnb" + for i in gsm faad dirac schroedinger speex; do + use $i && myconf="${myconf} --enable-lib$i" + done + use jpeg2k && myconf="${myconf} --enable-libopenjpeg" + + #for i in h264_vdpau mpeg1_vdpau mpeg_vdpau vc1_vdpau wmv3_vdpau; do + # use video_cards_nvidia || myconf="${myconf} --disable-decoder=$i" + # use vdpau || myconf="${myconf} --disable-decoder=$i" + #done + use video_cards_nvidia || myconf="${myconf} --disable-vdpau" + use vdpau || myconf="${myconf} --disable-vdpau" + use vaapi || myconf="${myconf} --disable-vaapi" + + # CPU features + for i in mmx ssse3 altivec ; do + use $i || myconf="${myconf} --disable-$i" + done + use mmxext || myconf="${myconf} --disable-mmx2" + use 3dnow || myconf="${myconf} --disable-amd3dnow" + use 3dnowext || myconf="${myconf} --disable-amd3dnowext" + # disable mmx accelerated code if PIC is required + # as the provided asm decidedly is not PIC. + if gcc-specs-pie ; then + myconf="${myconf} --disable-mmx --disable-mmx2" + fi + + # Option to force building pic + use pic && myconf="${myconf} --enable-pic" + + # Try to get cpu type based on CFLAGS. + # Bug #172723 + # We need to do this so that features of that CPU will be better used + # If they contain an unknown CPU it will not hurt since ffmpeg's configure + # will just ignore it. + for i in $(get-flag march) $(get-flag mcpu) $(get-flag mtune) ; do + [ "${i}" = "native" ] && i="host" # bug #273421 + [[ ${i} = *-sse3 ]] && i="${i%-sse3}" # bug 283968 + myconf="${myconf} --cpu=$i" + break + done + + # Mandatory configuration + myconf="${myconf} --enable-gpl --enable-version3 --enable-postproc \ + --enable-avfilter --enable-avfilter-lavf \ + --disable-stripping" + + # cross compile support + if tc-is-cross-compiler ; then + myconf="${myconf} --enable-cross-compile --arch=$(tc-arch-kernel) --cross-prefix=${CHOST}-" + case ${CHOST} in + *freebsd*) + myconf="${myconf} --target-os=freebsd" + ;; + mingw32*) + myconf="${myconf} --target-os=mingw32" + ;; + *linux*) + myconf="${myconf} --target-os=linux" + ;; + esac + fi + + # Misc stuff + use hardcoded-tables && myconf="${myconf} --enable-hardcoded-tables" + use doc || myconf="${myconf} --disable-doc" + + # Specific workarounds for too-few-registers arch... + if [[ $(tc-arch) == "x86" ]]; then + filter-flags -fforce-addr -momit-leaf-frame-pointer + append-flags -fomit-frame-pointer + is-flag -O? || append-flags -O2 + if (use debug); then + # no need to warn about debug if not using debug flag + ewarn "" + ewarn "Debug information will be almost useless as the frame pointer is omitted." + ewarn "This makes debugging harder, so crashes that has no fixed behavior are" + ewarn "difficult to fix. Please have that in mind." + ewarn "" + fi + fi + + cd "${S}" + ./configure \ + --prefix=/usr \ + --libdir=/usr/$(get_libdir) \ + --shlibdir=/usr/$(get_libdir) \ + --mandir=/usr/share/man \ + --enable-static --enable-shared \ + --cc="$(tc-getCC)" \ + ${myconf} || die "configure failed" +} + +src_compile() { + emake version.h || die #252269 + emake || die "make failed" +} + +src_install() { + emake DESTDIR="${D}" install install-man || die "Install Failed" + + dodoc Changelog README INSTALL + dodoc doc/* +} + +src_test() { + if use encode ; then + for t in codectest lavftest seektest ; do + LD_LIBRARY_PATH="${S}/libpostproc:${S}/libswscale:${S}/libavcodec:${S}/libavdevice:${S}/libavfilter:${S}/libavformat:${S}/libavutil" \ + emake ${t} || die "Some tests in ${t} failed" + done + else + ewarn "Tests fail without USE=encode, skipping" + fi +} diff --git a/media-video/ffmpeg/metadata.xml b/media-video/ffmpeg/metadata.xml new file mode 100644 index 0000000..95a667d --- /dev/null +++ b/media-video/ffmpeg/metadata.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE pkgmetadata SYSTEM "http://www.gentoo.org/dtd/metadata.dtd"> +<pkgmetadata> + <herd>video</herd> + <maintainer> + <email>media-video@gentoo.org</email> + </maintainer> + <use> + <flag name="3dnowext"> + Enable manually-optimised routines using the AMD 3DNow!Ex SIMD + instruction set, present in modern AMD CPUs. (Check for + 3dnowext in /proc/cpuinfo to know whehter you support it). + </flag> + <flag name="amr">Enables Adaptive Multi-Rate Audio support</flag> + <flag name="cpudetection">Enables runtime cpudetection (useful for bindist, compatability on other CPUs)</flag> + <flag name="dirac">Enable Dirac video support (an advanced royalty-free video compression format) via the reference library: dirac.</flag> + <flag name="faac">Use external faac library for AAC encoding</flag> + <flag name="faad">Use external faad library for AAC decoding (instead of internal libavcodec support)</flag> + <flag name="hardcoded-tables">Use pre-calculated tables rather than calculating them on the fly.</flag> + <flag name="mmxext">Enables mmx2 support</flag> + <flag name="network">Enables network streaming support</flag> + <flag name="opencore-amr">Enables Adaptive Multi-Rate format support</flag> + <flag name="pic">Force shared libraries to be built as PIC (this is slower)</flag> + <flag name="schroedinger">Enable Dirac video support (an advanced royalty-free video compression format) via libschroedinger (high-speed implementation in C of the Dirac codec).</flag> + <flag name="ssse3">faster floating point optimization for SSSE3 capable chips (Intel Core 2 and later chips)</flag> + <flag name="vdpau">Enables VDPAU decoders (requires nVidia video cards to offload CPU processing to video card</flag> + <flag name="vhook">Enables video hooking support.</flag> + </use> +</pkgmetadata> diff --git a/media-video/mplayer/Manifest b/media-video/mplayer/Manifest new file mode 100644 index 0000000..9e2858c --- /dev/null +++ b/media-video/mplayer/Manifest @@ -0,0 +1,12 @@ +AUX vaapi/01-mplayer-vaapi.patch 108582 RMD160 b3303e75660ac6ed77ee6f849cc572a88d76322c SHA1 8525c1f682cc98db3f8cdeeeaf8030e7212d17f9 SHA256 800f9e83c9249f69ebf7ba328a5dcfc295af4c7b355a49763a4d7f0d28642699 +AUX vaapi/02-mplayer-vaapi-gma500-workaround.patch 2994 RMD160 cc3911d951c42ec1468eae4b8976697f47df050a SHA1 408c6783aae243fdb60fa7ea851cb5ec6184d4f4 SHA256 c145b2f8523bc99340d097f17c57538197b9c49175fce0b38d6eced3e06828a5 +AUX vaapi/03-mplayer-vaapi-0.29.patch 46225 RMD160 0b8ee4f9eddc9114ebc913e0e15034582bb530cb SHA1 ae12d2f93ba22c5a31145c2a06961837bdaca753 SHA256 2dbcfb4b8d83f2901a879176d82a7bcb494974d50505c701019365e17da9b307 +AUX vaapi/04-mplayer-vdpau.patch 42951 RMD160 4345ce35262156f4fd1f50164bfff7fe8856d87d SHA1 f1726ec589f50bc1d9055cd4414dc5a475ac495c SHA256 98aa3f7e5cc094b74cbcfc03104cfee4fb1b347f163a9ceca81c44f83fa0ee3f +DIST Blue-1.7.tar.bz2 222567 RMD160 1f8c539ccadc54eea5e6678839bcc8ae1e16e6eb SHA1 45e5ee7a5541a5f1cfd2678a6c9b5911ca473cb9 SHA256 8bcd39a5755c44df778ebca3119c922347abfdadb101dcef011ce2566c1fb1d8 +DIST font-arial-cp1250.tar.bz2 249705 RMD160 a2fc7ae07b0d80936ea58e168e1047efccb9eb91 SHA1 ccf11dce5d0fb72fd3af97f788b7471cd0cd0b68 SHA256 423a07e780bb130cd8e4730715545c5d919c248dda595aab7a0a01de3c83fd12 +DIST font-arial-iso-8859-1.tar.bz2 234242 RMD160 666697cd5efd9387057a898c714175e7c2aacbcd SHA1 152c40bf20de34aa8802d7f80d34d673b0b67212 SHA256 9730f481764f367c9089d0166fb6ccf9148808ffbbfeca635cf0e6db75765d29 +DIST font-arial-iso-8859-2.tar.bz2 222208 RMD160 562d4d92c4f5f3d537340fde3ad8d1495ac41acb SHA1 7b99bbe0e9ba89a57eccbea8f93c453c4f268181 SHA256 71debfc960007c2f6242dfc91e8b1c005b30a99e129aeb00ab8c03f4371b41c1 +DIST mplayer-1.0_rc4_p20100213.tbz2 8811960 RMD160 b6991ef2dde9497bcffa32687f484598956db983 SHA1 350d39f2b42f5c5065abe7d64a4d759a9efa56f4 SHA256 59c09f6388ad15d12f74ae18ebe07945392e40d9096d5598bd496f857722bcb0 +DIST svgalib_helper-1.9.17-mplayer.tar.gz 7583 RMD160 927ff34f187e4fa9528e2e48208173d98b3d1d1b SHA1 bf789706d1d79c695f781644c7ea6d57c3eed4c3 SHA256 a6f803f3df4cd4544751d3a3ee936a8bf0e20e32a452639b3f7c7d9e73e65938 +EBUILD mplayer-1.0_rc4_p20100213-r50.ebuild 19997 RMD160 62eb81a0e2d191ea8f9b1885c41713dccfab64d9 SHA1 dccd864a627578c99771854b3e2658cbf051ff8d SHA256 33b92a21393826a39e4438af0df8a3153cd03b84ba5c3571425a43c7b454b185 +MISC metadata.xml 3591 RMD160 883e9161526d98f546d5b790a76da78ae6b03b94 SHA1 bf3ab6509cfa4a72a088ba005c9a92e44bac6df1 SHA256 956383713923533a4caa6e39fbe8067b2afa7c7aecc3e52c9dd0715435226ef8 diff --git a/media-video/mplayer/files/vaapi/01-mplayer-vaapi.patch b/media-video/mplayer/files/vaapi/01-mplayer-vaapi.patch new file mode 100644 index 0000000..f75e945 --- /dev/null +++ b/media-video/mplayer/files/vaapi/01-mplayer-vaapi.patch @@ -0,0 +1,3368 @@ +diff --git a/Makefile b/Makefile +index 49de59b..da1a2a4 100644 +--- a/Makefile ++++ b/Makefile +@@ -631,6 +631,7 @@ SRCS_MPLAYER-$(TDFXVID) += libvo/vo_tdfx_vid.c + SRCS_MPLAYER-$(TGA) += libvo/vo_tga.c + SRCS_MPLAYER-$(V4L2) += libvo/vo_v4l2.c + SRCS_MPLAYER-$(V4L2) += libao2/ao_v4l2.c ++SRCS_MPLAYER-$(VAAPI) += libvo/vo_vaapi.c + SRCS_MPLAYER-$(VDPAU) += libvo/vo_vdpau.c + SRCS_MPLAYER-$(VESA) += libvo/gtf.c libvo/vo_vesa.c libvo/vesa_lvo.c + SRCS_MPLAYER-$(VIDIX) += libvo/vo_cvidix.c \ +@@ -684,6 +685,7 @@ SRCS_MPLAYER = command.c \ + libvo/aspect.c \ + libvo/geometry.c \ + libvo/spuenc.c \ ++ libvo/stats.c \ + libvo/video_out.c \ + libvo/vo_mpegpes.c \ + libvo/vo_null.c \ +diff --git a/cfg-common-opts.h b/cfg-common-opts.h +index dd9b691..2e30132 100644 +--- a/cfg-common-opts.h ++++ b/cfg-common-opts.h +@@ -246,6 +246,7 @@ + // {"ac", &audio_codec, CONF_TYPE_STRING, 0, 0, 0, NULL}, + {"ac", &audio_codec_list, CONF_TYPE_STRING_LIST, 0, 0, 0, NULL}, + {"vc", &video_codec_list, CONF_TYPE_STRING_LIST, 0, 0, 0, NULL}, ++ {"va", &video_hwaccel_name, CONF_TYPE_STRING, 0, 0, 0, NULL}, + + // postprocessing: + #ifdef CONFIG_LIBAVCODEC +diff --git a/codec-cfg.c b/codec-cfg.c +index 5d79627..692258e 100644 +--- a/codec-cfg.c ++++ b/codec-cfg.c +@@ -214,6 +214,13 @@ static int add_to_format(char *s, char *alias,unsigned int *fourcc, unsigned int + {"IDCT_MPEG2",IMGFMT_XVMC_IDCT_MPEG2}, + {"MOCO_MPEG2",IMGFMT_XVMC_MOCO_MPEG2}, + ++ {"VAAPI_MPEG2", IMGFMT_VAAPI_MPEG2}, ++ {"VAAPI_MPEG4", IMGFMT_VAAPI_MPEG4}, ++ {"VAAPI_H263", IMGFMT_VAAPI_H263}, ++ {"VAAPI_H264", IMGFMT_VAAPI_H264}, ++ {"VAAPI_WMV3", IMGFMT_VAAPI_WMV3}, ++ {"VAAPI_VC1", IMGFMT_VAAPI_VC1}, ++ + {"VDPAU_MPEG1",IMGFMT_VDPAU_MPEG1}, + {"VDPAU_MPEG2",IMGFMT_VDPAU_MPEG2}, + {"VDPAU_H264",IMGFMT_VDPAU_H264}, +diff --git a/configure b/configure +index ab3a347..8a3c7ba 100755 +--- a/configure ++++ b/configure +@@ -357,6 +357,9 @@ Codecs: + --disable-muxer=MUXER disable specified FFmpeg muxer + --enable-muxer=MUXER enable specified FFmpeg muxer + ++Hardware acceleration: ++ --enable-vaapi enable VA API acceleration [disable] ++ + Video output: + --disable-vidix disable VIDIX [for x86 *nix] + --with-vidix-drivers[=*] list of VIDIX drivers to be compiled in +@@ -556,8 +559,7 @@ _libavparsers=$_libavparsers_all + _libavbsfs_all=$(sed -n 's/^[^#]*BSF.*(.*, *\(.*\)).*/\1_bsf/p' libavcodec/allcodecs.c | tr '[a-z]' '[A-Z]') + _libavbsfs=$_libavbsfs_all + _libavhwaccels_all=$(sed -n 's/^[^#]*HWACCEL.*(.*, *\(.*\)).*/\1_hwaccel/p' libavcodec/allcodecs.c | tr '[a-z]' '[A-Z]') +-# Disable all hardware accelerators for now. +-_libavhwaccels= ++_libavhwaccels=$(for h in $_libavhwaccels_all; do case $h in (*_VAAPI_HWACCEL) echo $h;; esac; done) + _libavdemuxers_all=$(sed -n 's/^[^#]*DEMUX.*(.*, *\(.*\)).*/\1_demuxer/p' libavformat/allformats.c | tr '[a-z]' '[A-Z]') + _libavdemuxers=$(echo $_libavdemuxers_all | sed -e 's/ LIB[A-Z0-9_]*_DEMUXER//g' -e s/REDIR_DEMUXER// -e s/AVISYNTH_DEMUXER//) + _libavmuxers_all=$(sed -n 's/^[^#]*_MUX.*(.*, *\(.*\)).*/\1_muxer/p' libavformat/allformats.c | tr '[a-z]' '[A-Z]') +@@ -574,6 +576,9 @@ _libswscale_so=auto + _libavcodec_mpegaudio_hp=yes + _mencoder=yes + _mplayer=yes ++_vaapi=auto ++_vaapi_glx=no ++_libgtop=auto + _x11=auto + _xshape=auto + _xss=auto +@@ -932,6 +937,8 @@ for ac_option do + --disable-xv) _xv=no ;; + --enable-xvmc) _xvmc=yes ;; + --disable-xvmc) _xvmc=no ;; ++ --enable-vaapi) _vaapi=yes ;; ++ --disable-vaapi) _vaapi=no ;; + --enable-vdpau) _vdpau=yes ;; + --disable-vdpau) _vdpau=no ;; + --enable-sdl) _sdl=yes ;; +@@ -4012,6 +4019,28 @@ fi + echores "$_gettimeofday" + + ++echocheck "clock_gettime()" ++cat > $TMPC << EOF ++#include <time.h> ++int main(void) { ++ struct timespec t; ++ clock_gettime(CLOCK_REALTIME, &t); ++ return 0; ++} ++EOF ++_clock_gettime=no ++cc_check -lrt && _clock_gettime=yes ++if test "$_clock_gettime" = yes ; then ++ def_clock_gettime='#define HAVE_CLOCK_GETTIME 1' ++ extra_ldflags="$extra_ldflags -lrt" ++ _need_clock_gettime=no ++else ++ def_clock_gettime='#undef HAVE_CLOCK_GETTIME' ++ _need_clock_gettime=yes ++fi ++echores "$_clock_gettime" ++ ++ + echocheck "glob()" + cat > $TMPC << EOF + #include <stdio.h> +@@ -4440,7 +4469,7 @@ else + _novomodules="x11 $_novomodules" + _res_comment="check if the dev(el) packages are installed" + # disable stuff that depends on X +- _xv=no ; _xvmc=no ; _xinerama=no ; _vm=no ; _xf86keysym=no ; _vdpau=no ++ _xv=no ; _xvmc=no ; _xinerama=no ; _vm=no ; _xf86keysym=no ; _vaapi=no ; _vdpau=no + fi + echores "$_x11" + +@@ -4571,7 +4600,7 @@ if test "$_vdpau" = yes ; then + else + def_vdpau='#define CONFIG_VDPAU 0' + _novomodules="vdpau $_novomodules" +- _libavdecoders=$(echo $_libavdecoders | sed -e s/MPEG_VDPAU_DECODER// -e s/MPEG1_VDPAU_DECODER// -e s/H264_VDPAU_DECODER// -e s/WMV3_VDPAU_DECODER// -e s/VC1_VDPAU_DECODER// -e s/MPEG4_VDPAU_DECODER//) ++ _libavdecoders=$(echo $_libavdecoders | sed -e "s/\(MPEG\|MPEG[124]\|H26[34]\|WMV3\|VC1\)_VDPAU_DECODER//g") + fi + echores "$_vdpau" + +@@ -5159,6 +5188,65 @@ else + fi + echores "$_gl" + ++echocheck "OpenGL utilities (GLU)" ++_glu=no ++if test "$_gl" = yes; then ++ cat > $TMPC << EOF ++#include <GL/glu.h> ++int main(void) { ++ gluPerspective(0.0, 0.0, 0.0, 0.0); ++ return 0; ++} ++EOF ++ cc_check -lGLU && _glu=yes ++fi ++if test "$_glu" = yes; then ++ libs_mplayer="$libs_mplayer -lGLU" ++fi ++echores "$_glu" ++ ++ ++echocheck "VA API" ++if test "$_vaapi" = yes -o "$_vaapi" = auto; then ++ _vaapi=no ++ cat > $TMPC <<EOF ++#include <va/va_x11.h> ++int main(void) { (void) vaGetDisplay(0); return 0; } ++EOF ++ cc_check -lva-x11 && _vaapi=yes ++fi ++ ++if test "$_vaapi" = yes ; then ++ def_vaapi='#define CONFIG_VAAPI 1' ++ libs_mencoder="$libs_mencoder -lva" ++ libs_mplayer="$libs_mplayer -lva-x11" ++ _vomodules="vaapi $_vomodules" ++else ++ def_vaapi='#define CONFIG_VAAPI 0' ++ _novomodules="vaapi $_novomodules" ++ _libavhwaccels=`echo $_libavhwaccels | sed -e "s/\(MPEG[124]\|H26[34]\|WMV3\|VC1\)_VAAPI_HWACCEL//g"` ++fi ++echores "$_vaapi" ++ ++echocheck "VA API (with GLX support)" ++if test "$_vaapi" = yes; then ++ _vaapi_glx=no ++ if test "$_gl" = "yes" -a "$_glu" = yes; then ++ cat > $TMPC <<EOF ++#include <va/va_glx.h> ++int main(void) { (void) vaGetDisplayGLX(0); return 0; } ++EOF ++ cc_check -lva-glx && _vaapi_glx=yes ++ fi ++fi ++if test "$_vaapi_glx" = yes; then ++ def_vaapi_glx='#define CONFIG_VAAPI_GLX 1' ++ libs_mplayer="$libs_mplayer -lva-glx" ++else ++ def_vaapi_glx='#define CONFIG_VAAPI_GLX 0' ++fi ++echores "$_vaapi_glx" ++ + + echocheck "MatrixView" + if test "$_gl" = no ; then +@@ -5174,6 +5262,31 @@ fi + echores "$matrixview" + + ++echocheck "libgtop" ++if test "$_libgtop" = auto ; then ++ _libgtop=no ++ if $_pkg_config --exists 'libgtop-2.0' ; then ++ ++cat > $TMPC << EOF ++#include <glibtop/cpu.h> ++#include <glibtop/proctime.h> ++int main(void) { return 0; } ++EOF ++cc_check $($_pkg_config --libs --cflags libgtop-2.0) && tmp_run && _libgtop=yes ++ ++ fi ++fi ++echores "$_libgtop" ++ ++if test "$_libgtop" = yes ; then ++ def_libgtop='#define CONFIG_LIBGTOP 1' ++ libs_mplayer="$libs_mplayer $($_pkg_config --libs libgtop-2.0)" ++ extra_cflags="$extra_cflags $($_pkg_config --cflags libgtop-2.0)" ++else ++ def_libgtop='#define CONFIG_LIBGTOP 0' ++fi ++ ++ + echocheck "PNG support" + if test "$_png" = auto ; then + _png=no +@@ -8676,6 +8789,7 @@ TV_V4L2 = $_tv_v4l2 + TWOLAME=$_twolame + UNRAR_EXEC = $_unrar_exec + V4L2 = $_v4l2 ++VAAPI = $_vaapi + VCD = $_vcd + VDPAU = $_vdpau + VESA = $_vesa +@@ -8761,6 +8875,7 @@ CONFIG_GPL=yes + CONFIG_LIBDIRAC_DECODER=$_libdirac_lavc + CONFIG_LIBDIRAC_ENCODER=$_libdirac_lavc + CONFIG_LIBFAAC_ENCODER=$_faac_lavc ++CONFIG_LIBGTOP=$_libgtop + CONFIG_LIBMP3LAME_ENCODER=$_mp3lame_lavc + CONFIG_LIBOPENCORE_AMRNB_DECODER=$_libopencore_amrnb + CONFIG_LIBOPENCORE_AMRNB_ENCODER=$_libopencore_amrnb +@@ -8777,6 +8892,7 @@ CONFIG_MUXERS=$_mencoder + CONFIG_POSTPROC = yes + # Prevent building libavcodec/imgresample.c with conflicting symbols + CONFIG_SWSCALE=yes ++CONFIG_VAAPI=$_vaapi + CONFIG_VDPAU=$_vdpau + CONFIG_XVMC=$_xvmc + CONFIG_ZLIB=$_zlib +@@ -8893,6 +9009,7 @@ $def_winsock2_h + + + /* system functions */ ++$def_clock_gettime + $def_gethostbyname2 + $def_gettimeofday + $def_glob +@@ -8923,6 +9040,7 @@ $def_extern_asm + $def_extern_prefix + $def_iconv + $def_kstat ++$def_libgtop + $def_macosx_bundle + $def_macosx_finder + $def_maemo +@@ -9153,6 +9271,8 @@ $def_tdfxfb + $def_tdfxvid + $def_tga + $def_v4l2 ++$def_vaapi ++$def_vaapi_glx + $def_vdpau + $def_vesa + $def_vidix +diff --git a/etc/codecs.conf b/etc/codecs.conf +index 26a0529..615f069 100644 +--- a/etc/codecs.conf ++++ b/etc/codecs.conf +@@ -190,6 +190,7 @@ videocodec ffmpeg2 + fourcc slif ; SoftLab MPEG-2 I-frames Codec + driver ffmpeg + dll "mpeg2video" ++ out VAAPI_MPEG2 + out YV12,I420,IYUV + out 422P,444P + +@@ -888,6 +889,7 @@ videocodec ffwmv3 + fourcc WMV3,wmv3 + driver ffmpeg + dll wmv3 ++ out VAAPI_WMV3 + out YV12,I420,IYUV + + videocodec ffwmv3vdpau +@@ -905,6 +907,7 @@ videocodec ffvc1 + fourcc vc-1,VC-1 + driver ffmpeg + dll vc1 ++ out VAAPI_VC1 + out YV12,I420,IYUV + + videocodec ffvc1vdpau +@@ -926,6 +929,7 @@ videocodec ffh264 + format 0x10000005 + driver ffmpeg + dll h264 ++ out VAAPI_H264 + out YV12,I420,IYUV + + videocodec ffh264vdpau +@@ -994,6 +998,7 @@ videocodec ffodivx + fourcc uldx,ULDX,VSPX + driver ffmpeg + dll mpeg4 ;opendivx ++ out VAAPI_MPEG4 + out YV12,I420,IYUV + + videocodec ffodivxvdpau +@@ -1561,6 +1566,7 @@ videocodec ffh263 + fourcc VX1K ; Agora Labs VX1000S H263 + driver ffmpeg + dll h263 ++ out VAAPI_H263 + out YV12,I420,IYUV + + videocodec ffzygo +diff --git a/fmt-conversion.c b/fmt-conversion.c +index 013e3fe..f053dc8 100644 +--- a/fmt-conversion.c ++++ b/fmt-conversion.c +@@ -18,12 +18,14 @@ + + #include "mp_msg.h" + #include "libavutil/avutil.h" ++#include "libavcodec/avcodec.h" + #include "libmpcodecs/img_format.h" + #include "fmt-conversion.h" + + static const struct { + int fmt; + enum PixelFormat pix_fmt; ++ enum CodecID codec_id; + } conversion_map[] = { + {IMGFMT_ARGB, PIX_FMT_ARGB}, + {IMGFMT_BGRA, PIX_FMT_BGRA}, +@@ -91,6 +93,17 @@ static const struct { + {IMGFMT_VDPAU_WMV3, PIX_FMT_VDPAU_WMV3}, + {IMGFMT_VDPAU_VC1, PIX_FMT_VDPAU_VC1}, + {IMGFMT_VDPAU_MPEG4, PIX_FMT_VDPAU_MPEG4}, ++ ++ /* VA API formats */ ++ {IMGFMT_VAAPI_MPEG2, PIX_FMT_VAAPI_VLD, CODEC_ID_MPEG2VIDEO}, ++ {IMGFMT_VAAPI_MPEG2_IDCT,PIX_FMT_VAAPI_IDCT, CODEC_ID_MPEG2VIDEO}, ++ {IMGFMT_VAAPI_MPEG2_MOCO,PIX_FMT_VAAPI_MOCO, CODEC_ID_MPEG2VIDEO}, ++ {IMGFMT_VAAPI_MPEG4, PIX_FMT_VAAPI_VLD, CODEC_ID_MPEG4}, ++ {IMGFMT_VAAPI_H263, PIX_FMT_VAAPI_VLD, CODEC_ID_H263}, ++ {IMGFMT_VAAPI_H264, PIX_FMT_VAAPI_VLD, CODEC_ID_H264}, ++ {IMGFMT_VAAPI_WMV3, PIX_FMT_VAAPI_VLD, CODEC_ID_WMV3}, ++ {IMGFMT_VAAPI_VC1, PIX_FMT_VAAPI_VLD, CODEC_ID_VC1}, ++ + {0, PIX_FMT_NONE} + }; + +@@ -107,12 +120,14 @@ enum PixelFormat imgfmt2pixfmt(int fmt) + return pix_fmt; + } + +-int pixfmt2imgfmt(enum PixelFormat pix_fmt) ++int pixfmt2imgfmt(enum PixelFormat pix_fmt, int codec_id) + { + int i; + int fmt; + for (i = 0; conversion_map[i].pix_fmt != PIX_FMT_NONE; i++) +- if (conversion_map[i].pix_fmt == pix_fmt) ++ if (conversion_map[i].pix_fmt == pix_fmt && ++ (conversion_map[i].codec_id == 0 || ++ conversion_map[i].codec_id == codec_id)) + break; + fmt = conversion_map[i].fmt; + if (!fmt) +diff --git a/fmt-conversion.h b/fmt-conversion.h +index 9e133a8..962ca4e 100644 +--- a/fmt-conversion.h ++++ b/fmt-conversion.h +@@ -23,6 +23,6 @@ + #include "libavutil/avutil.h" + + enum PixelFormat imgfmt2pixfmt(int fmt); +-int pixfmt2imgfmt(enum PixelFormat pix_fmt); ++int pixfmt2imgfmt(enum PixelFormat pix_fmt, int codec_id); + + #endif /* MPLAYER_FMT_CONVERSION_H */ +diff --git a/gui/mplayer/gtk/opts.c b/gui/mplayer/gtk/opts.c +index f086819..3a02a9f 100644 +--- a/gui/mplayer/gtk/opts.c ++++ b/gui/mplayer/gtk/opts.c +@@ -64,9 +64,11 @@ static GtkWidget * CLVDrivers; + GtkWidget * prEFontName; + GtkWidget * prEDVDDevice; + GtkWidget * prECDRomDevice; ++static GtkWidget * EVHW; + static GtkWidget * EVFM; + static GtkWidget * EAFM; + ++static GtkWidget * CBVHW; + static GtkWidget * CBVFM; + static GtkWidget * CBAFM; + static GtkWidget * CBAudioEqualizer; +@@ -354,6 +356,26 @@ void ShowPreferences( void ) + // -- 5. page + gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( CBNonInterlaved ),force_ni ); + if ( index_mode == 1 ) gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( CBIndex ),1 ); ++ ++ { ++ int i; ++ GList * Items = NULL; ++ char * name = NULL; ++ ++ Items = g_list_append(Items, MSGTR_PREFERENCES_None); ++ for (i = 0; i < HWACCEL_COUNT; i++) { ++ const char *hwaccel_name = get_video_hwaccel_name(i); ++ if (!hwaccel_name) ++ continue; ++ Items = g_list_append(Items, hwaccel_name); ++ if (video_hwaccel_name && !gstrcmp(video_hwaccel_name, get_video_hwaccel_short_name(i) ) ) name = hwaccel_name; ++ } ++ gtk_combo_set_popdown_strings(GTK_COMBO(CBVHW), Items); ++ g_list_free(Items); ++ if (name) ++ gtk_entry_set_text(GTK_ENTRY(EVHW), name); ++ } ++ + { + int i; + GList * Items = NULL; +@@ -600,6 +622,17 @@ static void prButton( GtkButton * button, gpointer user_data ) + if ( gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( CBIndex ) ) ) index_mode=1; + + { ++ int i; ++ const char *tmp = gtk_entry_get_text(GTK_ENTRY(EVHW)); ++ for (i = 0; i < HWACCEL_COUNT; i++) { ++ if (!gstrcmp(tmp, get_video_hwaccel_name(i))) { ++ video_hwaccel_name = get_video_hwaccel_short_name(i); ++ break; ++ } ++ } ++ } ++ ++ { + int i; + const char * tmp = gtk_entry_get_text( GTK_ENTRY( EVFM ) ); + for( i=0;mpcodecs_vd_drivers[i];i++ ) +@@ -1199,6 +1232,20 @@ GtkWidget * create_Preferences( void ) + + hbox5=AddHBox( vbox602,1 ); + ++ AddLabel( MSGTR_PREFERENCES_VideoHardwareAcceleration,hbox5 ); ++ ++ CBVHW=gtk_combo_new(); ++ gtk_widget_set_name( CBVHW,"CBVHW" ); ++ gtk_widget_show( CBVHW ); ++ gtk_box_pack_start( GTK_BOX( hbox5 ),CBVHW,TRUE,TRUE,0 ); ++ ++ EVHW=GTK_COMBO( CBVHW )->entry; ++ gtk_widget_set_name( EVHW,"CEVHW" ); ++ gtk_entry_set_editable( GTK_ENTRY( EVHW ),FALSE ); ++ gtk_widget_show( EVHW ); ++ ++ hbox5=AddHBox( vbox602,1 ); ++ + AddLabel( MSGTR_PREFERENCES_VideoCodecFamily,hbox5 ); + + CBVFM=gtk_combo_new(); +diff --git a/help/help_mp-en.h b/help/help_mp-en.h +index 3b8cbd8..162d6cb 100644 +--- a/help/help_mp-en.h ++++ b/help/help_mp-en.h +@@ -719,6 +719,7 @@ static const char help_text[]= + #define MSGTR_PREFERENCES_IDX "Rebuild index table, if needed" + #define MSGTR_PREFERENCES_VideoCodecFamily "Video codec family:" + #define MSGTR_PREFERENCES_AudioCodecFamily "Audio codec family:" ++#define MSGTR_PREFERENCES_VideoHardwareAcceleration "Video hardware acceleration:" + #define MSGTR_PREFERENCES_FRAME_OSD_Level "OSD level" + #define MSGTR_PREFERENCES_FRAME_Subtitle "Subtitle" + #define MSGTR_PREFERENCES_FRAME_Font "Font" +@@ -1659,6 +1660,7 @@ static const char help_text[]= + #define MSGTR_MPCODECS_UnexpectedInitVoError "[VD_FFMPEG] Unexpected init_vo error.\n" + #define MSGTR_MPCODECS_UnrecoverableErrorRenderBuffersNotTaken "[VD_FFMPEG] Unrecoverable error, render buffers not taken.\n" + #define MSGTR_MPCODECS_OnlyBuffersAllocatedByVoXvmcAllowed "[VD_FFMPEG] Only buffers allocated by vo_xvmc allowed.\n" ++#define MSGTR_MPCODECS_VAAPIAcceleratedCodec "[VD_FFMPEG] VA API accelerated codec.\n" + + // libmpcodecs/ve_lavc.c + #define MSGTR_MPCODECS_HighQualityEncodingSelected "[VE_LAVC] High quality encoding selected (non-realtime)!\n" +diff --git a/libmpcodecs/dec_video.c b/libmpcodecs/dec_video.c +index 3572565..aef04d2 100644 +--- a/libmpcodecs/dec_video.c ++++ b/libmpcodecs/dec_video.c +@@ -56,9 +56,47 @@ extern double vout_time_usage; + int field_dominance=-1; + + int divx_quality=0; ++char *video_hwaccel_name=NULL; + + vd_functions_t* mpvdec=NULL; + ++int get_video_hwaccel(void) ++{ ++ static int video_hwaccel = -1; ++ if (video_hwaccel < 0) { ++ video_hwaccel = HWACCEL_NONE; ++ if (video_hwaccel_name) { ++ if (!strcmp(video_hwaccel_name,"xvmc")) ++ video_hwaccel = HWACCEL_XVMC; ++ else if (!strcmp(video_hwaccel_name,"vaapi")) ++ video_hwaccel = HWACCEL_VAAPI; ++ else if (!strcmp(video_hwaccel_name,"vdpau")) ++ video_hwaccel = HWACCEL_VDPAU; ++ } ++ } ++ return video_hwaccel; ++} ++ ++const char *get_video_hwaccel_name(int hwaccel) ++{ ++ switch (hwaccel) { ++ case HWACCEL_XVMC: return "XvMC"; ++ case HWACCEL_VAAPI: return "VA API"; ++ case HWACCEL_VDPAU: return "VDPAU"; ++ } ++ return NULL; ++} ++ ++const char *get_video_hwaccel_short_name(int hwaccel) ++{ ++ switch (hwaccel) { ++ case HWACCEL_XVMC: return "xvmc"; ++ case HWACCEL_VAAPI: return "vaapi"; ++ case HWACCEL_VDPAU: return "vdpau"; ++ } ++ return NULL; ++} ++ + int get_video_quality_max(sh_video_t *sh_video){ + vf_instance_t* vf=sh_video->vfilter; + if(vf){ +diff --git a/libmpcodecs/dec_video.h b/libmpcodecs/dec_video.h +index 8b28202..bf727cd 100644 +--- a/libmpcodecs/dec_video.h ++++ b/libmpcodecs/dec_video.h +@@ -21,6 +21,14 @@ + + #include "libmpdemux/stheader.h" + ++enum { ++ HWACCEL_NONE = 0, ++ HWACCEL_XVMC, ++ HWACCEL_VAAPI, ++ HWACCEL_VDPAU, ++ HWACCEL_COUNT ++}; ++ + // dec_video.c: + void vfm_help(void); + +@@ -39,6 +47,11 @@ int set_rectangle(sh_video_t *sh_video, int param, int value); + void resync_video_stream(sh_video_t *sh_video); + int get_current_video_decoder_lag(sh_video_t *sh_video); + ++int get_video_hwaccel(void); ++const char *get_video_hwaccel_name(int hwaccel); ++const char *get_video_hwaccel_short_name(int hwaccel); ++ + extern int divx_quality; ++extern char *video_hwaccel_name; + + #endif /* MPLAYER_DEC_VIDEO_H */ +diff --git a/libmpcodecs/img_format.c b/libmpcodecs/img_format.c +index 5b858fa..d3b158b 100644 +--- a/libmpcodecs/img_format.c ++++ b/libmpcodecs/img_format.c +@@ -94,6 +94,14 @@ const char *vo_format_name(int format) + case IMGFMT_ZRMJPEGIB: return "Zoran MJPEG bottom field first"; + case IMGFMT_XVMC_MOCO_MPEG2: return "MPEG1/2 Motion Compensation"; + case IMGFMT_XVMC_IDCT_MPEG2: return "MPEG1/2 Motion Compensation and IDCT"; ++ case IMGFMT_VAAPI_MPEG2: return "MPEG-2 VA API Acceleration"; ++ case IMGFMT_VAAPI_MPEG2_IDCT: return "MPEG-2 VA API Acceleration (Motion Compensation and IDCT)"; ++ case IMGFMT_VAAPI_MPEG2_MOCO: return "MPEG-2 VA API Acceleration (Motion Compensation)"; ++ case IMGFMT_VAAPI_MPEG4: return "MPEG-4 VA API Acceleration"; ++ case IMGFMT_VAAPI_H263: return "H.263 VA API Acceleration"; ++ case IMGFMT_VAAPI_H264: return "H.264 VA API Acceleration"; ++ case IMGFMT_VAAPI_WMV3: return "WMV3 VA API Acceleration"; ++ case IMGFMT_VAAPI_VC1: return "VC-1 VA API Acceleration"; + case IMGFMT_VDPAU_MPEG1: return "MPEG1 VDPAU acceleration"; + case IMGFMT_VDPAU_MPEG2: return "MPEG2 VDPAU acceleration"; + case IMGFMT_VDPAU_H264: return "H.264 VDPAU acceleration"; +diff --git a/libmpcodecs/img_format.h b/libmpcodecs/img_format.h +index 2c4db36..37b0132 100644 +--- a/libmpcodecs/img_format.h ++++ b/libmpcodecs/img_format.h +@@ -172,6 +172,26 @@ + #define IMGFMT_XVMC_MOCO_MPEG2 (IMGFMT_XVMC|0x02) + #define IMGFMT_XVMC_IDCT_MPEG2 (IMGFMT_XVMC|0x82) + ++/* VA API Formats */ ++ ++#define IMGFMT_VAAPI 0x56410000 /* 'VA'00 */ ++#define IMGFMT_VAAPI_MASK 0xFFFF0000 ++#define IMGFMT_IS_VAAPI(fmt) (((fmt) & IMGFMT_VAAPI_MASK) == IMGFMT_VAAPI) ++#define IMGFMT_VAAPI_CODEC_MASK 0x000000F0 ++#define IMGFMT_VAAPI_CODEC(fmt) ((fmt) & IMGFMT_VAAPI_CODEC_MASK) ++#define IMGFMT_VAAPI_CODEC_MPEG2 (0x10) ++#define IMGFMT_VAAPI_CODEC_MPEG4 (0x20) ++#define IMGFMT_VAAPI_CODEC_H264 (0x30) ++#define IMGFMT_VAAPI_CODEC_VC1 (0x40) ++#define IMGFMT_VAAPI_MPEG2 (IMGFMT_VAAPI|IMGFMT_VAAPI_CODEC_MPEG2) ++#define IMGFMT_VAAPI_MPEG2_IDCT (IMGFMT_VAAPI|IMGFMT_VAAPI_CODEC_MPEG2|1) ++#define IMGFMT_VAAPI_MPEG2_MOCO (IMGFMT_VAAPI|IMGFMT_VAAPI_CODEC_MPEG2|2) ++#define IMGFMT_VAAPI_MPEG4 (IMGFMT_VAAPI|IMGFMT_VAAPI_CODEC_MPEG4) ++#define IMGFMT_VAAPI_H263 (IMGFMT_VAAPI|IMGFMT_VAAPI_CODEC_MPEG4|1) ++#define IMGFMT_VAAPI_H264 (IMGFMT_VAAPI|IMGFMT_VAAPI_CODEC_H264) ++#define IMGFMT_VAAPI_VC1 (IMGFMT_VAAPI|IMGFMT_VAAPI_CODEC_VC1) ++#define IMGFMT_VAAPI_WMV3 (IMGFMT_VAAPI|IMGFMT_VAAPI_CODEC_VC1|1) ++ + // VDPAU specific format. + #define IMGFMT_VDPAU 0x1DC80000 + #define IMGFMT_VDPAU_MASK 0xFFFF0000 +diff --git a/libmpcodecs/mp_image.h b/libmpcodecs/mp_image.h +index ba69e72..86ace62 100644 +--- a/libmpcodecs/mp_image.h ++++ b/libmpcodecs/mp_image.h +@@ -129,6 +129,7 @@ static inline void mp_image_setfmt(mp_image_t* mpi,unsigned int out_fmt){ + // compressed formats + if(out_fmt == IMGFMT_MPEGPES || + out_fmt == IMGFMT_ZRMJPEGNI || out_fmt == IMGFMT_ZRMJPEGIT || out_fmt == IMGFMT_ZRMJPEGIB || ++ IMGFMT_IS_VAAPI(out_fmt) || + IMGFMT_IS_VDPAU(out_fmt) || IMGFMT_IS_XVMC(out_fmt)){ + mpi->bpp=0; + return; +diff --git a/libmpcodecs/vd.c b/libmpcodecs/vd.c +index 6f18ed3..4bbd3cd 100644 +--- a/libmpcodecs/vd.c ++++ b/libmpcodecs/vd.c +@@ -373,3 +373,12 @@ void mpcodecs_draw_slice(sh_video_t *sh, unsigned char** src, int* stride, int w + if(vf->draw_slice) + vf->draw_slice(vf,src,stride,w,h,x,y); + } ++ ++void *mpcodecs_get_hwaccel_context(sh_video_t *sh) ++{ ++ void *ctx = NULL; ++ struct vf_instance_s *vf = sh->vfilter; ++ if (vf->control(vf, VFCTRL_GET_HWACCEL_CONTEXT, &ctx) == CONTROL_TRUE) ++ return ctx; ++ return NULL; ++} +diff --git a/libmpcodecs/vd.h b/libmpcodecs/vd.h +index 33d9ec5..63e0b8a 100644 +--- a/libmpcodecs/vd.h ++++ b/libmpcodecs/vd.h +@@ -53,6 +53,7 @@ extern float movie_aspect; + int mpcodecs_config_vo(sh_video_t *sh, int w, int h, unsigned int preferred_outfmt); + mp_image_t* mpcodecs_get_image(sh_video_t *sh, int mp_imgtype, int mp_imgflag, int w, int h); + void mpcodecs_draw_slice(sh_video_t *sh, unsigned char** src, int* stride, int w,int h, int x, int y); ++void *mpcodecs_get_hwaccel_context(sh_video_t *sh); + + #define VDFLAGS_DROPFRAME 3 + +diff --git a/libmpcodecs/vd_ffmpeg.c b/libmpcodecs/vd_ffmpeg.c +index 8c1e9ae..7a42160 100644 +--- a/libmpcodecs/vd_ffmpeg.c ++++ b/libmpcodecs/vd_ffmpeg.c +@@ -32,6 +32,7 @@ + #include "fmt-conversion.h" + + #include "vd_internal.h" ++#include "dec_video.h" + + static const vd_info_t info = { + "FFmpeg's libavcodec codec family", +@@ -227,8 +228,8 @@ static void set_format_params(struct AVCodecContext *avctx, enum PixelFormat fmt + int imgfmt; + if (fmt == PIX_FMT_NONE) + return; +- imgfmt = pixfmt2imgfmt(fmt); +- if (IMGFMT_IS_XVMC(imgfmt) || IMGFMT_IS_VDPAU(imgfmt)) { ++ imgfmt = pixfmt2imgfmt(fmt, avctx->codec_id); ++ if (IMGFMT_IS_XVMC(imgfmt) || IMGFMT_IS_VDPAU(imgfmt) || IMGFMT_IS_VAAPI(imgfmt)) { + sh_video_t *sh = avctx->opaque; + vd_ffmpeg_ctx *ctx = sh->context; + ctx->do_dr1 = 1; +@@ -285,6 +286,12 @@ static int init(sh_video_t *sh){ + avctx->codec_type = CODEC_TYPE_VIDEO; + avctx->codec_id = lavc_codec->id; + ++#if CONFIG_VAAPI ++ if(get_video_hwaccel() == HWACCEL_VAAPI){ ++ mp_msg(MSGT_DECVIDEO, MSGL_INFO, MSGTR_MPCODECS_VAAPIAcceleratedCodec); ++ avctx->get_format = get_format; ++ } ++#endif /* CONFIG_VAAPI */ + #if CONFIG_VDPAU + if(lavc_codec->capabilities & CODEC_CAP_HWACCEL_VDPAU){ + avctx->get_format = get_format; +@@ -478,7 +485,7 @@ static void draw_slice(struct AVCodecContext *s, + const AVFrame *src, int offset[4], + int y, int type, int height){ + sh_video_t *sh = s->opaque; +- uint8_t *source[MP_MAX_PLANES]= {src->data[0] + offset[0], src->data[1] + offset[1], src->data[2] + offset[2]}; ++ uint8_t *source[MP_MAX_PLANES]= {src->data[0] + offset[0], src->data[1] + offset[1], src->data[2] + offset[2], src->data[3] + offset[3]}; + #if 0 + int start=0, i; + int width= s->width; +@@ -544,9 +551,10 @@ static int init_vo(sh_video_t *sh, enum PixelFormat pix_fmt){ + sh->disp_w = width; + sh->disp_h = height; + ctx->pix_fmt = pix_fmt; +- ctx->best_csp = pixfmt2imgfmt(pix_fmt); ++ ctx->best_csp = pixfmt2imgfmt(pix_fmt, avctx->codec_id); + if (!mpcodecs_config_vo(sh, sh->disp_w, sh->disp_h, ctx->best_csp)) + return -1; ++ avctx->hwaccel_context = mpcodecs_get_hwaccel_context(sh); + ctx->vo_initialized = 1; + } + return 0; +@@ -597,7 +605,9 @@ static int get_buffer(AVCodecContext *avctx, AVFrame *pic){ + return avctx->get_buffer(avctx, pic); + } + +- if (IMGFMT_IS_XVMC(ctx->best_csp) || IMGFMT_IS_VDPAU(ctx->best_csp)) { ++ if (IMGFMT_IS_XVMC(ctx->best_csp) || ++ IMGFMT_IS_VAAPI(ctx->best_csp) || ++ IMGFMT_IS_VDPAU(ctx->best_csp)) { + type = MP_IMGTYPE_NUMBERED | (0xffff << 16); + } else + if (!pic->buffer_hints) { +@@ -629,6 +639,11 @@ static int get_buffer(AVCodecContext *avctx, AVFrame *pic){ + avctx->draw_horiz_band= draw_slice; + } else + avctx->draw_horiz_band= NULL; ++#if CONFIG_VAAPI ++ if(IMGFMT_IS_VAAPI(mpi->imgfmt)) { ++ avctx->draw_horiz_band= draw_slice; ++ } ++#endif + if(IMGFMT_IS_VDPAU(mpi->imgfmt)) { + avctx->draw_horiz_band= draw_slice; + } +@@ -940,24 +955,62 @@ static mp_image_t *decode(sh_video_t *sh, void *data, int len, int flags){ + return mpi; + } + +-#if CONFIG_XVMC || CONFIG_VDPAU ++#if CONFIG_XVMC || CONFIG_VAAPI || CONFIG_VDPAU ++static inline int is_hwaccel_format(int imgfmt) ++{ ++ switch (get_video_hwaccel()) { ++ case HWACCEL_VAAPI: return IMGFMT_IS_VAAPI(imgfmt) != 0; ++ case HWACCEL_VDPAU: return IMGFMT_IS_VDPAU(imgfmt) != 0; ++ case HWACCEL_XVMC: return IMGFMT_IS_XVMC(imgfmt) != 0; ++ } ++ return 0; ++} ++ ++static int query_format(sh_video_t *sh, int fmt) ++{ ++ vd_ffmpeg_ctx * const ctx = sh->context; ++ AVCodecContext * const avctx = ctx->avctx; ++ int r, width, height; ++ /* XXX: some codecs have not initialized width and height yet at ++ this point, so we are faking the dimensions so that init_vo() ++ doesn't fail because of 0x0 size */ ++ if ((width = avctx->width) == 0) ++ avctx->width = 64; ++ if ((height = avctx->height) == 0) ++ avctx->height = 64; ++ r = init_vo(sh, fmt); ++ avctx->width = width; ++ avctx->height = height; ++ return r; ++} ++ + static enum PixelFormat get_format(struct AVCodecContext *avctx, +- const enum PixelFormat *fmt){ +- enum PixelFormat selected_format; ++ const enum PixelFormat *fmt){ ++ enum PixelFormat selected_format = PIX_FMT_NONE; + int imgfmt; + sh_video_t *sh = avctx->opaque; +- int i; +- +- for(i=0;fmt[i]!=PIX_FMT_NONE;i++){ +- imgfmt = pixfmt2imgfmt(fmt[i]); +- if(!IMGFMT_IS_XVMC(imgfmt) && !IMGFMT_IS_VDPAU(imgfmt)) continue; +- mp_msg(MSGT_DECVIDEO, MSGL_INFO, MSGTR_MPCODECS_TryingPixfmt, i); +- if(init_vo(sh, fmt[i]) >= 0) { +- break; ++ int i, try_hwaccel; ++ ++ for (try_hwaccel = 1; try_hwaccel >= 0; --try_hwaccel) { ++ for (i = 0; fmt[i] != PIX_FMT_NONE; i++){ ++ imgfmt = pixfmt2imgfmt(fmt[i], avctx->codec_id); ++ if ((try_hwaccel ^ is_hwaccel_format(imgfmt)) != 0) ++ continue; ++ mp_msg(MSGT_DECVIDEO, MSGL_INFO, MSGTR_MPCODECS_TryingPixfmt, i); ++ if (query_format(sh, fmt[i]) >= 0) { ++ if (try_hwaccel) { ++ /* don't allow format conversion for HW acceleration */ ++ if (sh->codec->outfmt[sh->outfmtidx] != imgfmt) ++ continue; ++ } ++ selected_format = fmt[i]; ++ break; ++ } + } ++ if (selected_format != PIX_FMT_NONE) ++ break; + } +- selected_format = fmt[i]; + set_format_params(avctx, selected_format); + return selected_format; + } +-#endif /* CONFIG_XVMC || CONFIG_VDPAU */ ++#endif /* CONFIG_XVMC || CONFIG_VAAPI || CONFIG_VDPAU */ +diff --git a/libmpcodecs/vf.h b/libmpcodecs/vf.h +index 91a57f2..00de007 100644 +--- a/libmpcodecs/vf.h ++++ b/libmpcodecs/vf.h +@@ -107,6 +107,7 @@ typedef struct vf_seteq_s + #define VFCTRL_GET_PTS 17 /* Return last pts value that reached vf_vo*/ + #define VFCTRL_SET_DEINTERLACE 18 /* Set deinterlacing status */ + #define VFCTRL_GET_DEINTERLACE 19 /* Get deinterlacing status */ ++#define VFCTRL_GET_HWACCEL_CONTEXT 20 /* Get HW accelerator context */ + + #include "vfcap.h" + +diff --git a/libmpcodecs/vf_vo.c b/libmpcodecs/vf_vo.c +index fafdc1b..c75cace 100644 +--- a/libmpcodecs/vf_vo.c ++++ b/libmpcodecs/vf_vo.c +@@ -173,6 +173,12 @@ static int control(struct vf_instance_s* vf, int request, void* data) + *(double *)data = vf->priv->pts; + return CONTROL_TRUE; + } ++ case VFCTRL_GET_HWACCEL_CONTEXT: ++ { ++ if(!video_out) return CONTROL_FALSE; // vo not configured? ++ return(video_out->control(VOCTRL_GET_HWACCEL_CONTEXT, data) ++ == VO_TRUE) ? CONTROL_TRUE : CONTROL_FALSE; ++ } + } + // return video_out->control(request,data); + return CONTROL_UNKNOWN; +@@ -192,6 +198,7 @@ static void get_image(struct vf_instance_s* vf, + if(!vo_config_count) return; + // GET_IMAGE is required for hardware-accelerated formats + if(vo_directrendering || ++ IMGFMT_IS_VAAPI(mpi->imgfmt) || + IMGFMT_IS_XVMC(mpi->imgfmt) || IMGFMT_IS_VDPAU(mpi->imgfmt)) + video_out->control(VOCTRL_GET_IMAGE,mpi); + } +diff --git a/libvo/stats.c b/libvo/stats.c +new file mode 100644 +index 0000000..c4ff0ca +--- /dev/null ++++ b/libvo/stats.c +@@ -0,0 +1,217 @@ ++#include "config.h" ++#include "stats.h" ++#include <time.h> ++#include <stdio.h> ++#include <string.h> ++#include <unistd.h> ++#include <locale.h> ++#include <inttypes.h> ++ ++#if CONFIG_LIBGTOP ++#include <glibtop/cpu.h> ++#include <glibtop/proctime.h> ++#include <glibtop/procstate.h> ++#endif ++ ++// Process statistics ++struct proc_stats { ++ uint64_t utime; ++ uint64_t stime; ++ uint64_t cutime; ++ uint64_t cstime; ++ uint64_t frequency; ++ uint64_t cpu_time; ++ uint64_t start_time; ++ uint64_t current_time; ++}; ++ ++// Get current process stats ++static int get_proc_stats(struct proc_stats *pstats); ++ ++void stats_init(void) ++{ ++#if CONFIG_LIBGTOP ++ glibtop_init(); ++#endif ++} ++ ++void stats_exit(void) ++{ ++#if CONFIG_LIBGTOP ++ glibtop_close(); ++#endif ++} ++ ++// Get CPU frequency ++unsigned int get_cpu_frequency(void) ++{ ++ unsigned int freq = 0; ++#if defined __linux__ ++ { ++ FILE *proc_file = fopen("/proc/cpuinfo", "r"); ++ if (proc_file) { ++ char line[256]; ++ char *old_locale = setlocale(LC_NUMERIC, NULL); ++ setlocale(LC_NUMERIC, "C"); ++ while(fgets(line, sizeof(line), proc_file)) { ++ float f; ++ int len = strlen(line); ++ if (len == 0) ++ continue; ++ line[len - 1] = 0; ++ if (sscanf(line, "cpu MHz : %f", &f) == 1) ++ freq = (unsigned int)f; ++ } ++ setlocale(LC_NUMERIC, old_locale); ++ fclose(proc_file); ++ } ++ } ++#endif ++ return freq; ++} ++ ++// Get CPU usage in percent ++static float get_cpu_usage_1(void) ++{ ++ static struct proc_stats prev_stats; ++ struct proc_stats curr_stats; ++ uint64_t prev_proc_time = 0, curr_proc_time = 0; ++ float pcpu = 0.0f; ++ ++ if (get_proc_stats(&curr_stats) == 0) { ++ prev_proc_time += prev_stats.utime; ++ prev_proc_time += prev_stats.stime; ++ prev_proc_time += prev_stats.cutime; ++ prev_proc_time += prev_stats.cstime; ++ curr_proc_time += curr_stats.utime; ++ curr_proc_time += curr_stats.stime; ++ curr_proc_time += curr_stats.cutime; ++ curr_proc_time += curr_stats.cstime; ++ if (prev_stats.start_time > 0) ++ pcpu = 100.0 * ((float)(curr_proc_time - prev_proc_time) / ++ (float)(curr_stats.cpu_time - prev_stats.cpu_time)); ++ prev_stats = curr_stats; ++ } ++ return pcpu; ++} ++ ++float get_cpu_usage(enum CpuUsageType type) ++{ ++ static float pcpu_total = 0.0; ++ static unsigned int n_samples; ++ float pcpu; ++ ++ pcpu = get_cpu_usage_1(); ++ pcpu_total += pcpu / 100.0; ++ ++n_samples; ++ ++ if (type == CPU_USAGE_AVERAGE) ++ pcpu = 100.0 * (pcpu_total / n_samples); ++ return pcpu; ++} ++ ++// For ELF executable, notes are pushed before environment and args ++static int find_elf_note(unsigned long match, unsigned long *pval) ++{ ++ unsigned long *ep = (unsigned long *)__environ; ++ while (*ep++); ++ for (; *ep != 0; ep += 2) { ++ if (ep[0] == match) { ++ *pval = ep[1]; ++ return 0; ++ } ++ } ++ return -1; ++} ++ ++#ifndef AT_CLKTCK ++#define AT_CLKTCK 17 ++#endif ++ ++// Get current process stats ++int get_proc_stats(struct proc_stats *pstats) ++{ ++ int error = -1; ++ char line[256], *str, *end; ++ char vc; ++ int vi; ++ unsigned long vul; ++ unsigned long long vull; ++ float vf; ++#if defined __linux__ ++ { ++ FILE *proc_file = fopen("/proc/self/stat", "r"); ++ if (proc_file) { ++ if (fgets(line, sizeof(line), proc_file)) { ++ unsigned long utime, stime, cutime, cstime, start_time; ++ str = strrchr(line, ')'); ++ if (str && sscanf(str + 2, ++ "%c " ++ "%d %d %d %d %d " ++ "%lu %lu %lu %lu %lu %lu %lu " ++ "%ld %ld %ld %ld %ld %ld " ++ "%lu %lu ", ++ &vc, ++ &vi, &vi, &vi, &vi, &vi, ++ &vul, &vul, &vul, &vul, &vul, &utime, &stime, ++ &cutime, &cstime, &vul, &vul, &vul, &vul, ++ &start_time, &vul) == 21) { ++ pstats->utime = utime; ++ pstats->stime = stime; ++ pstats->cutime = cutime; ++ pstats->cstime = cstime; ++ pstats->start_time = start_time; ++ error = 0; ++ } ++ } ++ fclose(proc_file); ++ } ++ if (error) ++ return error; ++ error = -1; ++ ++ if (find_elf_note(AT_CLKTCK, &vul) == 0) { ++ pstats->frequency = vul; ++ error = 0; ++ } ++ if (error) ++ return error; ++ error = -1; ++ ++ proc_file = fopen("/proc/uptime", "r"); ++ if (proc_file) { ++ if (fgets(line, sizeof(line), proc_file)) { ++ char *old_locale = setlocale(LC_NUMERIC, NULL); ++ setlocale(LC_NUMERIC, "C"); ++ if (sscanf(line, "%f", &vf) == 1) { ++ pstats->cpu_time = (uint64_t)(vf * (float)pstats->frequency); ++ error = 0; ++ } ++ setlocale(LC_NUMERIC, old_locale); ++ } ++ fclose(proc_file); ++ } ++ } ++#elif CONFIG_LIBGTOP ++ { ++ glibtop_cpu cpu; ++ glibtop_proc_time proc_time; ++ glibtop_proc_state proc_state; ++ ++ glibtop_get_cpu(&cpu); ++ glibtop_get_proc_state(&proc_state, getpid()); ++ pstats->cpu_time = cpu.xcpu_total[proc_state.processor]; ++ ++ glibtop_get_proc_time(&proc_time, getpid()); ++ pstats->utime = proc_time.utime; ++ pstats->stime = proc_time.stime; ++ pstats->cutime = proc_time.cutime; ++ pstats->cstime = proc_time.cstime; ++ pstats->start_time = proc_time.start_time; ++ pstats->frequency = proc_time.frequency; ++ ++ error = 0; ++ } ++#endif ++ return error; ++} +diff --git a/libvo/stats.h b/libvo/stats.h +new file mode 100644 +index 0000000..62e7412 +--- /dev/null ++++ b/libvo/stats.h +@@ -0,0 +1,21 @@ ++#ifndef MPLAYER_STATS_H ++#define MPLAYER_STATS_H ++ ++#include <stdint.h> ++ ++void stats_init(void); ++void stats_exit(void); ++ ++/// CPU usage model ++enum CpuUsageType { ++ CPU_USAGE_QUANTUM = 1, ///< CPU usage since the last call to cpu_get_usage() ++ CPU_USAGE_AVERAGE ///< CPU usage average'd since program start ++}; ++ ++/// Get CPU frequency ++unsigned int get_cpu_frequency(void); ++ ++/// Get CPU usage in percent ++float get_cpu_usage(enum CpuUsageType type); ++ ++#endif /* MPLAYER_STATS_H */ +diff --git a/libvo/video_out.c b/libvo/video_out.c +index 6db664a..8259927 100644 +--- a/libvo/video_out.c ++++ b/libvo/video_out.c +@@ -138,6 +138,7 @@ extern vo_functions_t video_out_corevideo; + extern vo_functions_t video_out_quartz; + extern vo_functions_t video_out_pnm; + extern vo_functions_t video_out_md5sum; ++extern vo_functions_t video_out_vaapi; + + const vo_functions_t* const video_out_drivers[] = + { +@@ -283,6 +284,9 @@ const vo_functions_t* const video_out_drivers[] = + #ifdef CONFIG_MD5SUM + &video_out_md5sum, + #endif ++#if CONFIG_VAAPI ++ &video_out_vaapi, ++#endif + NULL + }; + +diff --git a/libvo/video_out.h b/libvo/video_out.h +index 1fce2c2..0d3f00a 100644 +--- a/libvo/video_out.h ++++ b/libvo/video_out.h +@@ -98,6 +98,10 @@ typedef struct { + int w,h; + } mp_win_t; + ++// Return current HW acceleration context ++// void *get_hwaccel_context(void); ++#define VOCTRL_GET_HWACCEL_CONTEXT 33 ++ + #define VO_TRUE 1 + #define VO_FALSE 0 + #define VO_ERROR -1 +diff --git a/libvo/vo_vaapi.c b/libvo/vo_vaapi.c +new file mode 100644 +index 0000000..ddc9eac +--- /dev/null ++++ b/libvo/vo_vaapi.c +@@ -0,0 +1,2201 @@ ++/* ++ * VA API output module ++ * ++ * Copyright (C) 2008-2009 Splitted-Desktop Systems ++ * ++ * This file is part of MPlayer. ++ * ++ * MPlayer 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. ++ * ++ * MPlayer 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 MPlayer; if not, write to the Free Software Foundation, Inc., ++ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. ++ */ ++ ++#include "config.h" ++#include "mp_msg.h" ++#include "help_mp.h" ++#include "subopt-helper.h" ++#include "video_out.h" ++#include "video_out_internal.h" ++#include "fastmemcpy.h" ++#include "sub.h" ++#include "x11_common.h" ++#include "libavutil/common.h" ++#include "libavcodec/vaapi.h" ++#include "gui/interface.h" ++#include "stats.h" ++#include "libass/ass_mp.h" ++#include <stdarg.h> ++ ++#if CONFIG_GL ++#include "gl_common.h" ++#include <GL/glu.h> ++#include <GL/glx.h> ++#endif ++ ++#include <assert.h> ++#include <X11/Xlib.h> ++#include <X11/Xutil.h> ++#include <va/va_x11.h> ++#if CONFIG_VAAPI_GLX ++#include <va/va_glx.h> ++#endif ++ ++/* Compatibility glue with VA-API >= 0.30 */ ++#ifndef VA_INVALID_ID ++#define VA_INVALID_ID 0xffffffff ++#endif ++#ifndef VA_FOURCC ++#define VA_FOURCC(ch0, ch1, ch2, ch3) \ ++ ((uint32_t)(uint8_t)(ch0) | \ ++ ((uint32_t)(uint8_t)(ch1) << 8) | \ ++ ((uint32_t)(uint8_t)(ch2) << 16) | \ ++ ((uint32_t)(uint8_t)(ch3) << 24 )) ++#endif ++#if defined VA_SRC_BT601 && defined VA_SRC_BT709 ++#define USE_VAAPI_COLORSPACE 1 ++#else ++#define USE_VAAPI_COLORSPACE 0 ++#endif ++ ++/* Defined to 1 if VA/GLX 'bind' API is available */ ++#define USE_VAAPI_GLX_BIND \ ++ (VA_MAJOR_VERSION == 0 && \ ++ ((VA_MINOR_VERSION == 30 && \ ++ VA_MICRO_VERSION == 4 && VA_SDS_VERSION >= 5) || \ ++ (VA_MINOR_VERSION == 31 && \ ++ VA_MICRO_VERSION == 0 && VA_SDS_VERSION < 5))) ++ ++/* Compatibility glue with VA-API >= 0.31 */ ++#if defined VA_CHECK_VERSION ++#if VA_CHECK_VERSION(0,31,0) ++#define vaPutImage2 vaPutImage ++#define vaAssociateSubpicture2 vaAssociateSubpicture ++#endif ++#endif ++ ++static vo_info_t info = { ++ "VA API with X11", ++ "vaapi", ++ "Gwenole Beauchesne <gbeauchesne@splitted-desktop.com>", ++ "" ++}; ++ ++LIBVO_EXTERN(vaapi) ++ ++/* Numbers of video surfaces */ ++#define MAX_OUTPUT_SURFACES 2 /* Maintain synchronisation points in flip_page() */ ++#define MAX_VIDEO_SURFACES 21 /* Maintain free surfaces in a queue (use least-recently-used) */ ++#define NUM_VIDEO_SURFACES_MPEG2 3 /* 1 decode frame, up to 2 references */ ++#define NUM_VIDEO_SURFACES_MPEG4 3 /* 1 decode frame, up to 2 references */ ++#define NUM_VIDEO_SURFACES_H264 21 /* 1 decode frame, up to 20 references */ ++#define NUM_VIDEO_SURFACES_VC1 3 /* 1 decode frame, up to 2 references */ ++ ++typedef void (*draw_alpha_func)(int x0, int y0, int w, int h, ++ unsigned char *src, unsigned char *srca, ++ int stride); ++ ++typedef void (*eosd_draw_alpha_func)(unsigned char *src, ++ int src_w, int src_h, int src_stride, ++ int dst_x, int dst_y, ++ uint32_t color); ++ ++struct vaapi_surface { ++ VASurfaceID id; ++ VAImage image; ++}; ++ ++struct vaapi_equalizer { ++ VADisplayAttribute brightness; ++ VADisplayAttribute contrast; ++ VADisplayAttribute hue; ++ VADisplayAttribute saturation; ++}; ++ ++static int g_is_paused; ++static uint32_t g_image_width; ++static uint32_t g_image_height; ++static uint32_t g_image_format; ++static struct vo_rect g_output_rect; ++static struct vaapi_surface *g_output_surfaces[MAX_OUTPUT_SURFACES]; ++static unsigned int g_output_surface; ++static int g_top_field_first; ++static int g_deint; ++static int g_deint_type; ++static int g_colorspace; ++ ++#if CONFIG_GL ++static MPGLContext gl_context; ++static int gl_enabled; ++static int gl_binding; ++static int gl_reflect; ++static GLuint gl_texture; ++static GLuint gl_font_base; ++#endif ++ ++#if CONFIG_VAAPI_GLX ++static int gl_visual_attr[] = { ++ GLX_RGBA, ++ GLX_RED_SIZE, 1, ++ GLX_GREEN_SIZE, 1, ++ GLX_BLUE_SIZE, 1, ++ GLX_DOUBLEBUFFER, ++ GL_NONE ++}; ++static void *gl_surface; ++#endif ++ ++static struct vaapi_context *va_context; ++static VAProfile *va_profiles; ++static int va_num_profiles; ++static VAEntrypoint *va_entrypoints; ++static int va_num_entrypoints; ++static VASurfaceID *va_surface_ids; ++static int va_num_surfaces; ++static struct vaapi_surface **va_free_surfaces; ++static int va_free_surfaces_head_index; ++static int va_free_surfaces_tail_index; ++static VAImageFormat *va_image_formats; ++static int va_num_image_formats; ++static VAImageFormat *va_subpic_formats; ++static unsigned int *va_subpic_flags; ++static int va_num_subpic_formats; ++static VAImage va_osd_image; ++static uint8_t *va_osd_image_data; ++static struct vo_rect va_osd_image_dirty_rect; ++static VASubpictureID va_osd_subpicture; ++static int va_osd_associated; ++static draw_alpha_func va_osd_draw_alpha; ++static uint8_t *va_osd_palette; ++static struct vaapi_equalizer va_equalizer; ++static VAImage va_eosd_image; ++static uint8_t *va_eosd_image_data; ++static VASubpictureID va_eosd_subpicture; ++static int va_eosd_associated; ++static eosd_draw_alpha_func va_eosd_draw_alpha; ++ ++///< Flag: direct surface mapping: use mpi->number to select free VA surface? ++static int va_dm; ++ ++///< Flag: gather run-time statistics (CPU usage, frequency) ++static int cpu_stats; ++static unsigned int cpu_frequency; ++static float cpu_usage; ++ ++static int check_status(VAStatus status, const char *msg) ++{ ++ if (status != VA_STATUS_SUCCESS) { ++ mp_msg(MSGT_VO, MSGL_ERR, "[vo_vaapi] %s: %s\n", msg, vaErrorStr(status)); ++ return 0; ++ } ++ return 1; ++} ++ ++static const char *string_of_VAImageFormat(VAImageFormat *imgfmt) ++{ ++ static char str[5]; ++ str[0] = imgfmt->fourcc; ++ str[1] = imgfmt->fourcc >> 8; ++ str[2] = imgfmt->fourcc >> 16; ++ str[3] = imgfmt->fourcc >> 24; ++ str[4] = '\0'; ++ return str; ++} ++ ++static const char *string_of_VAProfile(VAProfile profile) ++{ ++ switch (profile) { ++#define PROFILE(profile) \ ++ case VAProfile##profile: return "VAProfile" #profile ++ PROFILE(MPEG2Simple); ++ PROFILE(MPEG2Main); ++ PROFILE(MPEG4Simple); ++ PROFILE(MPEG4AdvancedSimple); ++ PROFILE(MPEG4Main); ++ PROFILE(H264Baseline); ++ PROFILE(H264Main); ++ PROFILE(H264High); ++ PROFILE(VC1Simple); ++ PROFILE(VC1Main); ++ PROFILE(VC1Advanced); ++#undef PROFILE ++ } ++ return "<unknown>"; ++} ++ ++static const char *string_of_VAEntrypoint(VAEntrypoint entrypoint) ++{ ++ switch (entrypoint) { ++#define ENTRYPOINT(entrypoint) \ ++ case VAEntrypoint##entrypoint: return "VAEntrypoint" #entrypoint ++ ENTRYPOINT(VLD); ++ ENTRYPOINT(IZZ); ++ ENTRYPOINT(IDCT); ++ ENTRYPOINT(MoComp); ++ ENTRYPOINT(Deblocking); ++#undef ENTRYPOINT ++ } ++ return "<unknown>"; ++} ++ ++static int has_profile(VAProfile profile) ++{ ++ if (va_profiles && va_num_profiles > 0) { ++ int i; ++ for (i = 0; i < va_num_profiles; i++) { ++ if (va_profiles[i] == profile) ++ return 1; ++ } ++ } ++ return 0; ++} ++ ++static int VAProfile_from_imgfmt(uint32_t format) ++{ ++ static const int mpeg2_profiles[] = ++ { VAProfileMPEG2Main, VAProfileMPEG2Simple, -1 }; ++ static const int mpeg4_profiles[] = ++ { VAProfileMPEG4Main, VAProfileMPEG4AdvancedSimple, VAProfileMPEG4Simple, -1 }; ++ static const int h264_profiles[] = ++ { VAProfileH264High, VAProfileH264Main, VAProfileH264Baseline, -1 }; ++ static const int wmv3_profiles[] = ++ { VAProfileVC1Main, VAProfileVC1Simple, -1 }; ++ static const int vc1_profiles[] = ++ { VAProfileVC1Advanced, -1 }; ++ ++ const int *profiles = NULL; ++ switch (IMGFMT_VAAPI_CODEC(format)) { ++ case IMGFMT_VAAPI_CODEC_MPEG2: ++ profiles = mpeg2_profiles; ++ break; ++ case IMGFMT_VAAPI_CODEC_MPEG4: ++ profiles = mpeg4_profiles; ++ break; ++ case IMGFMT_VAAPI_CODEC_H264: ++ profiles = h264_profiles; ++ break; ++ case IMGFMT_VAAPI_CODEC_VC1: ++ switch (format) { ++ case IMGFMT_VAAPI_WMV3: ++ profiles = wmv3_profiles; ++ break; ++ case IMGFMT_VAAPI_VC1: ++ profiles = vc1_profiles; ++ break; ++ } ++ break; ++ } ++ ++ if (profiles) { ++ for (int i = 0; profiles[i] != -1; i++) { ++ if (has_profile(profiles[i])) ++ return profiles[i]; ++ } ++ } ++ return -1; ++} ++ ++static int has_entrypoint(VAEntrypoint entrypoint) ++{ ++ if (va_entrypoints && va_num_entrypoints > 0) { ++ int i; ++ for (i = 0; i < va_num_entrypoints; i++) { ++ if (va_entrypoints[i] == entrypoint) ++ return 1; ++ } ++ } ++ return 0; ++} ++ ++static int VAEntrypoint_from_imgfmt(uint32_t format) ++{ ++ int entrypoint = 0; ++ switch (format) { ++ case IMGFMT_VAAPI_MPEG2: ++ case IMGFMT_VAAPI_MPEG4: ++ case IMGFMT_VAAPI_H263: ++ case IMGFMT_VAAPI_H264: ++ case IMGFMT_VAAPI_WMV3: ++ case IMGFMT_VAAPI_VC1: ++ entrypoint = VAEntrypointVLD; ++ break; ++ case IMGFMT_VAAPI_MPEG2_IDCT: ++ entrypoint = VAEntrypointIDCT; ++ break; ++ case IMGFMT_VAAPI_MPEG2_MOCO: ++ entrypoint = VAEntrypointMoComp; ++ break; ++ } ++ ++ if (entrypoint) ++ return has_entrypoint(entrypoint); ++ ++ return -1; ++} ++ ++static VAImageFormat *find_image_format(uint32_t fourcc) ++{ ++ if (va_image_formats && va_num_image_formats > 0) { ++ int i; ++ for (i = 0; i < va_num_image_formats; i++) { ++ if (va_image_formats[i].fourcc == fourcc) ++ return &va_image_formats[i]; ++ } ++ } ++ return NULL; ++} ++ ++static VAImageFormat *VAImageFormat_from_imgfmt(uint32_t format) ++{ ++ uint32_t fourcc = 0; ++ ++ switch (format) { ++ case IMGFMT_NV12: fourcc = VA_FOURCC('N','V','1','2'); break; ++ case IMGFMT_YV12: fourcc = VA_FOURCC('Y','V','1','2'); break; ++ case IMGFMT_I420: fourcc = VA_FOURCC('I','4','2','0'); break; ++ case IMGFMT_IYUV: fourcc = VA_FOURCC('I','Y','U','V'); break; ++ } ++ ++ if (fourcc) ++ return find_image_format(fourcc); ++ ++ return NULL; ++} ++ ++static struct vaapi_surface *alloc_vaapi_surface(unsigned int width, ++ unsigned int height, ++ unsigned int format) ++{ ++ struct vaapi_surface *surface = NULL; ++ struct vaapi_surface **surfaces; ++ VASurfaceID *surface_ids; ++ VAStatus status; ++ ++ surface = malloc(sizeof(*surface)); ++ if (!surface) ++ goto error; ++ ++ surfaces = realloc(va_free_surfaces, ++ (1 + va_num_surfaces) * sizeof(surfaces[0])); ++ if (!surfaces) ++ goto error; ++ ++ surface_ids = realloc(va_surface_ids, ++ (1 + va_num_surfaces) * sizeof(surface_ids[0])); ++ if (!surface_ids) ++ goto error; ++ ++ status = vaCreateSurfaces(va_context->display, width, height, format, ++ 1, &surface->id); ++ if (!check_status(status, "vaCreateSurfaces()")) ++ goto error; ++ ++ va_surface_ids = surface_ids; ++ va_surface_ids[va_num_surfaces] = surface->id; ++ va_free_surfaces = surfaces; ++ va_free_surfaces[va_num_surfaces] = surface; ++ surface->image.image_id = VA_INVALID_ID; ++ surface->image.buf = VA_INVALID_ID; ++ ++va_num_surfaces; ++ return surface; ++error: ++ free(surface); ++ return NULL; ++} ++ ++static void resize(void) ++{ ++ struct vo_rect src; ++ ++ calc_src_dst_rects(g_image_width, g_image_height, ++ &src, &g_output_rect, NULL, NULL); ++ ++ vo_x11_clearwindow(mDisplay, vo_window); ++ ++#if CONFIG_GL ++#define FOVY 60.0f ++#define ASPECT 1.0f ++#define Z_NEAR 0.1f ++#define Z_FAR 100.0f ++#define Z_CAMERA 0.869f ++ ++ if (gl_enabled) { ++ glViewport(0, 0, vo_dwidth, vo_dheight); ++ glMatrixMode(GL_PROJECTION); ++ glLoadIdentity(); ++ gluPerspective(FOVY, ASPECT, Z_NEAR, Z_FAR); ++ glMatrixMode(GL_MODELVIEW); ++ glLoadIdentity(); ++ ++ glTranslatef(-0.5f, -0.5f, -Z_CAMERA); ++ glScalef(1.0f / (GLfloat)vo_dwidth, ++ -1.0f / (GLfloat)vo_dheight, ++ 1.0f / (GLfloat)vo_dwidth); ++ glTranslatef(0.0f, -1.0f * (GLfloat)vo_dheight, 0.0f); ++ } ++#endif ++ ++ flip_page(); ++} ++ ++#if CONFIG_GL ++static int gl_build_font(void) ++{ ++ XFontStruct *fi; ++ ++ gl_font_base = glGenLists(96); ++ ++ fi = XLoadQueryFont(mDisplay, "-adobe-helvetica-medium-r-normal--16-*-*-*-p-*-iso8859-1" ); ++ if (!fi) { ++ fi = XLoadQueryFont(mDisplay, "fixed"); ++ if (!fi) ++ return -1; ++ } ++ ++ glXUseXFont(fi->fid, 32, 96, gl_font_base); ++ XFreeFont(mDisplay, fi); ++ return 0; ++} ++ ++static void gl_printf(const char *format, ...) ++{ ++ va_list args; ++ char *text; ++ int textlen; ++ ++ va_start(args, format); ++ textlen = vsnprintf(NULL, 0, format, args); ++ va_end(args); ++ ++ text = malloc(textlen + 1); ++ if (!text) ++ return; ++ ++ va_start(args, format); ++ vsprintf(text, format, args); ++ va_end(args); ++ ++ glPushAttrib(GL_LIST_BIT); ++ glListBase(gl_font_base - 32); ++ glCallLists(textlen, GL_UNSIGNED_BYTE, text); ++ glPopAttrib(); ++ free(text); ++} ++ ++static void gl_draw_rectangle(int x, int y, int w, int h, unsigned int rgba) ++{ ++ glColor4f((GLfloat)((rgba >> 24) & 0xff) / 255.0, ++ (GLfloat)((rgba >> 16) & 0xff) / 255.0, ++ (GLfloat)((rgba >> 8) & 0xff) / 255.0, ++ (GLfloat)(rgba & 0xff) / 255.0); ++ ++ glTranslatef((GLfloat)x, (GLfloat)y, 0.0f); ++ glBegin(GL_QUADS); ++ { ++ glVertex2i(0, 0); ++ glVertex2i(w, 0); ++ glVertex2i(w, h); ++ glVertex2i(0, h); ++ } ++ glEnd(); ++} ++#endif ++ ++static inline unsigned char *get_osd_image_data(int x0, int y0) ++{ ++ return (va_osd_image_data + ++ va_osd_image.offsets[0] + ++ va_osd_image.pitches[0] * y0 + ++ x0 * ((va_osd_image.format.bits_per_pixel + 7) / 8)); ++} ++ ++static inline void set_osd_image_dirty_rect(int x, int y, int w, int h) ++{ ++ struct vo_rect * const dirty_rect = &va_osd_image_dirty_rect; ++ dirty_rect->left = x + w; ++ dirty_rect->top = y + h; ++ dirty_rect->right = x; ++ dirty_rect->bottom = y; ++ dirty_rect->width = w; ++ dirty_rect->height = h; ++} ++ ++static inline void update_osd_image_dirty_rect(int x, int y, int w, int h) ++{ ++ struct vo_rect * const dirty_rect = &va_osd_image_dirty_rect; ++ dirty_rect->left = FFMIN(dirty_rect->left, x); ++ dirty_rect->top = FFMIN(dirty_rect->top, y); ++ dirty_rect->right = FFMAX(dirty_rect->right, x + w); ++ dirty_rect->bottom = FFMAX(dirty_rect->bottom, y + h); ++ dirty_rect->width = dirty_rect->right - dirty_rect->left; ++ dirty_rect->height = dirty_rect->bottom - dirty_rect->top; ++} ++ ++static void draw_alpha_rgb32(int x0, int y0, int w, int h, ++ unsigned char *src, unsigned char *srca, ++ int stride) ++{ ++ int x, y; ++ const unsigned int dststride = va_osd_image.pitches[0]; ++ unsigned char *dst = get_osd_image_data(x0, y0); ++ ++ update_osd_image_dirty_rect(x0, y0, w, h); ++ ++ for (y = 0; y < h; y++, dst += dststride, src += stride, srca += stride) ++ for (x = 0; x < w; x++) { ++ const unsigned char c = src[x]; ++ dst[4*x + 0] = c; ++ dst[4*x + 1] = c; ++ dst[4*x + 2] = c; ++ dst[4*x + 3] = -srca[x]; ++ } ++} ++ ++static void draw_alpha_IA44(int x0, int y0, int w, int h, ++ unsigned char *src, unsigned char *srca, ++ int stride) ++{ ++ int x, y; ++ const unsigned int dststride = va_osd_image.pitches[0]; ++ unsigned char *dst = get_osd_image_data(x0, y0); ++ ++ update_osd_image_dirty_rect(x0, y0, w, h); ++ ++ for (y = 0; y < h; y++, dst += dststride) ++ for (x = 0; x < w; x++) ++ dst[x] = (src[y*stride + x] & 0xf0) | (-srca[y*stride + x] >> 4); ++} ++ ++static void draw_alpha_AI44(int x0, int y0, int w, int h, ++ unsigned char *src, unsigned char *srca, ++ int stride) ++{ ++ int x, y; ++ const unsigned int dststride = va_osd_image.pitches[0]; ++ unsigned char *dst = get_osd_image_data(x0, y0); ++ ++ update_osd_image_dirty_rect(x0, y0, w, h); ++ ++ for (y = 0; y < h; y++, dst += dststride) ++ for (x = 0; x < w; x++) ++ dst[x] = (src[y*stride + x] >> 4) | (-srca[y*stride + x] & 0xf0); ++} ++ ++static void draw_alpha_IA88(int x0, int y0, int w, int h, ++ unsigned char *src, unsigned char *srca, ++ int stride) ++{ ++ int x, y; ++ const unsigned int dststride = va_osd_image.pitches[0]; ++ unsigned char *dst = get_osd_image_data(x0, y0); ++ ++ update_osd_image_dirty_rect(x0, y0, w, h); ++ ++ for (y = 0; y < h; y++, dst += dststride) ++ for (x = 0; x < w; x++) { ++ dst[2*x + 0] = src [y*stride + x]; ++ dst[2*x + 1] = -srca[y*stride + x]; ++ } ++} ++ ++static void draw_alpha_AI88(int x0, int y0, int w, int h, ++ unsigned char *src, unsigned char *srca, ++ int stride) ++{ ++ int x, y; ++ const unsigned int dststride = va_osd_image.pitches[0]; ++ unsigned char *dst = get_osd_image_data(x0, y0); ++ ++ update_osd_image_dirty_rect(x0, y0, w, h); ++ ++ for (y = 0; y < h; y++, dst += dststride) ++ for (x = 0; x < w; x++) { ++ dst[2*x + 0] = -srca[y*stride + x]; ++ dst[2*x + 1] = src [y*stride + x]; ++ } ++} ++ ++///< List of subpicture formats in preferred order ++static const struct { ++ uint32_t format; ++ draw_alpha_func draw_alpha; ++} ++va_osd_info[] = { ++ { VA_FOURCC('I','A','4','4'), draw_alpha_IA44 }, ++ { VA_FOURCC('A','I','4','4'), draw_alpha_AI44 }, ++ { VA_FOURCC('I','A','8','8'), draw_alpha_IA88 }, ++ { VA_FOURCC('A','I','8','8'), draw_alpha_AI88 }, ++ { VA_FOURCC('B','G','R','A'), draw_alpha_rgb32 }, ++ { VA_FOURCC('R','G','B','A'), draw_alpha_rgb32 }, ++ { 0, NULL } ++}; ++ ++static uint8_t *gen_osd_palette(const VAImage *image) ++{ ++ uint8_t *palette; ++ int i, is_rgb; ++ int r_idx = -1, g_idx = -1, b_idx = -1; ++ int y_idx = -1, u_idx = -1, v_idx = -1; ++ int i_idx = -1, a_idx = -1; ++ ++ if (image->num_palette_entries < 1) ++ return NULL; ++ ++ palette = malloc(image->num_palette_entries * image->entry_bytes); ++ if (!palette) ++ return NULL; ++ ++ for (i = 0; i < image->entry_bytes; i++) { ++ switch (image->component_order[i]) { ++ case 'R': r_idx = i; is_rgb = 1; break; ++ case 'G': g_idx = i; is_rgb = 1; break; ++ case 'B': b_idx = i; is_rgb = 1; break; ++ case 'Y': y_idx = i; is_rgb = 0; break; ++ case 'U': u_idx = i; is_rgb = 0; break; ++ case 'V': v_idx = i; is_rgb = 0; break; ++ case 'I': i_idx = i; break; ++ case 'A': a_idx = i; break; ++ } ++ } ++ ++ if (r_idx != -1 && g_idx != -1 && b_idx != -1) { /* RGB format */ ++ for (i = 0; i < image->num_palette_entries; i++) { ++ const int n = i * image->entry_bytes; ++ palette[n + r_idx] = i * 0xff / (image->num_palette_entries - 1); ++ palette[n + g_idx] = i * 0xff / (image->num_palette_entries - 1); ++ palette[n + b_idx] = i * 0xff / (image->num_palette_entries - 1); ++ } ++ } ++ else if (y_idx != -1 && u_idx != -1 && v_idx != -1) { /* YUV format */ ++ for (i = 0; i < image->num_palette_entries; i++) { ++ const int n = i * image->entry_bytes; ++ palette[n + y_idx] = i * 0xff / (image->num_palette_entries - 1); ++ palette[n + u_idx] = 0x80; ++ palette[n + v_idx] = 0x80; ++ } ++ } ++ else if (i_idx != -1 && a_idx != -1) {/* AYUV format (GMA500 "psb" bug) */ ++ for (i = 0; i < image->num_palette_entries; i++) { ++ const int n = i * image->entry_bytes; ++ palette[n + 0] = 0x80; ++ palette[n + 1] = 0x80; ++ palette[n + 2] = 16 + i * 220 / (image->num_palette_entries - 1); ++ palette[n + 3] = 0; ++ } ++ } ++ else { ++ mp_msg(MSGT_VO, MSGL_ERR, "[vo_vaapi] Could not set up subpicture palette\n"); ++ free(palette); ++ palette = NULL; ++ } ++ return palette; ++} ++ ++static void disable_osd(void) ++{ ++ if (!va_osd_associated) ++ return; ++ ++ vaDeassociateSubpicture(va_context->display, ++ va_osd_subpicture, ++ va_surface_ids, va_num_surfaces); ++ ++ va_osd_associated = 0; ++} ++ ++static int enable_osd(const struct vo_rect *src_rect, ++ const struct vo_rect *dst_rect) ++{ ++ VAStatus status; ++ ++ disable_osd(); ++ ++ status = vaAssociateSubpicture2(va_context->display, ++ va_osd_subpicture, ++ va_surface_ids, va_num_surfaces, ++ src_rect->left, ++ src_rect->top, ++ src_rect->right - src_rect->left, ++ src_rect->bottom - src_rect->top, ++ dst_rect->left, ++ dst_rect->top, ++ dst_rect->right - dst_rect->left, ++ dst_rect->bottom - dst_rect->top, ++ 0); ++ if (!check_status(status, "vaAssociateSubpicture()")) ++ return -1; ++ ++ va_osd_associated = 1; ++ return 0; ++} ++ ++static inline unsigned char *get_eosd_image_data(int x0, int y0) ++{ ++ return (va_eosd_image_data + ++ va_eosd_image.offsets[0] + ++ va_eosd_image.pitches[0] * y0 + ++ x0 * ((va_eosd_image.format.bits_per_pixel + 7) / 8)); ++} ++ ++static void eosd_draw_alpha_bgra(unsigned char *src, ++ int src_w, int src_h, int src_stride, ++ int dst_x, int dst_y, ++ uint32_t color) ++{ ++ int x, y; ++ const unsigned int dst_stride = va_eosd_image.pitches[0]; ++ unsigned char *dst = get_eosd_image_data(dst_x, dst_y); ++ const unsigned int r = (color >> 24) & 0xff; ++ const unsigned int g = (color >> 16) & 0xff; ++ const unsigned int b = (color >> 8) & 0xff; ++ const unsigned int a = 0xff - (color & 0xff); ++ ++ for (y = 0; y < src_h; y++, dst += dst_stride, src += src_stride) ++ for (x = 0; x < src_w; x++) { ++ const unsigned int v = src[x]; ++ dst[4*x + 0] = (b * v + dst[4*x + 0] * (0xff - v)) / 255; ++ dst[4*x + 1] = (g * v + dst[4*x + 1] * (0xff - v)) / 255; ++ dst[4*x + 2] = (r * v + dst[4*x + 2] * (0xff - v)) / 255; ++ dst[4*x + 3] = (a * v + dst[4*x + 3] * (0xff - v)) / 255; ++ } ++} ++ ++static void eosd_draw_alpha_rgba(unsigned char *src, ++ int src_w, int src_h, int src_stride, ++ int dst_x, int dst_y, ++ uint32_t color) ++{ ++ int x, y; ++ const unsigned int dst_stride = va_eosd_image.pitches[0]; ++ unsigned char *dst = get_eosd_image_data(dst_x, dst_y); ++ const unsigned int r = (color >> 24) & 0xff; ++ const unsigned int g = (color >> 16) & 0xff; ++ const unsigned int b = (color >> 8) & 0xff; ++ const unsigned int a = 0xff - (color & 0xff); ++ ++ for (y = 0; y < src_h; y++, dst += dst_stride, src += src_stride) ++ for (x = 0; x < src_w; x++) { ++ const unsigned int v = src[x]; ++ dst[4*x + 0] = (r * v + dst[4*x + 0] * (0xff - v)) / 255; ++ dst[4*x + 1] = (g * v + dst[4*x + 1] * (0xff - v)) / 255; ++ dst[4*x + 2] = (b * v + dst[4*x + 2] * (0xff - v)) / 255; ++ dst[4*x + 3] = (a * v + dst[4*x + 3] * (0xff - v)) / 255; ++ } ++} ++ ++static void disable_eosd(void) ++{ ++ if (!va_eosd_associated) ++ return; ++ ++ vaDeassociateSubpicture(va_context->display, ++ va_eosd_subpicture, ++ va_surface_ids, va_num_surfaces); ++ ++ va_eosd_associated = 0; ++} ++ ++static int enable_eosd(void) ++{ ++ VAStatus status; ++ ++ if (va_eosd_associated) ++ return 0; ++ ++ status = vaAssociateSubpicture2(va_context->display, ++ va_eosd_subpicture, ++ va_surface_ids, va_num_surfaces, ++ 0, 0, g_image_width, g_image_height, ++ 0, 0, g_image_width, g_image_height, ++ 0); ++ if (!check_status(status, "vaAssociateSubpicture()")) ++ return -1; ++ ++ va_eosd_associated = 1; ++ return 0; ++} ++ ++///< List of subpicture formats in preferred order ++static const struct { ++ uint32_t format; ++ eosd_draw_alpha_func draw_alpha; ++} ++va_eosd_info[] = { ++ { VA_FOURCC('B','G','R','A'), eosd_draw_alpha_bgra }, ++ { VA_FOURCC('R','G','B','A'), eosd_draw_alpha_rgba }, ++ { 0, NULL } ++}; ++ ++static int is_direct_mapping_init(void) ++{ ++ VADisplayAttribute attr; ++ VAStatus status; ++ ++ if (va_dm < 2) ++ return va_dm; ++ ++ /* If the driver doesn't make a copy of the VA surface for ++ display, then we have to retain it until it's no longer the ++ visible surface. In other words, if the driver is using ++ DirectSurface mode, we don't want to decode the new surface ++ into the previous one that was used for display. */ ++ attr.type = VADisplayAttribDirectSurface; ++ attr.flags = VA_DISPLAY_ATTRIB_GETTABLE; ++ ++ status = vaGetDisplayAttributes(va_context->display, &attr, 1); ++ if (status == VA_STATUS_SUCCESS) ++ return !attr.value; ++ return 0; ++} ++ ++static inline int is_direct_mapping(void) ++{ ++ static int dm = -1; ++ if (dm < 0) { ++ dm = is_direct_mapping_init(); ++ if (dm) ++ mp_msg(MSGT_VO, MSGL_INFO, ++ "[vo_vaapi] Using 1:1 VA surface mapping\n"); ++ } ++ return dm; ++} ++ ++static int int_012(int *n) ++{ ++ return *n >= 0 && *n <= 2; ++} ++ ++static const opt_t subopts[] = { ++ { "dm", OPT_ARG_INT, &va_dm, (opt_test_f)int_012 }, ++ { "stats", OPT_ARG_BOOL, &cpu_stats, NULL }, ++ { "deint", OPT_ARG_INT, &g_deint, (opt_test_f)int_012 }, ++#if USE_VAAPI_COLORSPACE ++ { "colorspace", OPT_ARG_INT, &g_colorspace, (opt_test_f)int_012 }, ++#endif ++#if CONFIG_GL ++ { "gl", OPT_ARG_BOOL, &gl_enabled, NULL }, ++#if USE_VAAPI_GLX_BIND ++ { "bind", OPT_ARG_BOOL, &gl_binding, NULL }, ++#endif ++ { "reflect", OPT_ARG_BOOL, &gl_reflect, NULL }, ++#endif ++ { NULL, } ++}; ++ ++static int preinit(const char *arg) ++{ ++ VADisplayAttribute *display_attrs; ++ VAStatus status; ++ int va_major_version, va_minor_version; ++ int i, max_image_formats, max_subpic_formats, max_profiles; ++ int num_display_attrs, max_display_attrs; ++ ++ va_dm = 2; ++ g_deint = 0; ++ g_deint_type = 2; ++ g_colorspace = 1; ++ if (subopt_parse(arg, subopts) != 0) { ++ mp_msg(MSGT_VO, MSGL_FATAL, ++ "\n-vo vaapi command line help:\n" ++ "Example: mplayer -vo vaapi:gl\n" ++ "\nOptions:\n" ++ " dm\n" ++ " 0: use least-recently-used VA surface\n" ++ " 1: identify VA surface with MPI index\n" ++ " 2: auto-detect use of direct surface mapping (default)\n" ++ " deint (all modes > 0 respect -field-dominance)\n" ++ " 0: no deinterlacing (default)\n" ++ " 1: only show first field\n" ++ " 2: bob deinterlacing\n" ++ " colorspace\n" ++ " 0: guess based on video resolution\n" ++ " 1: ITU-R BT.601 (default)\n" ++ " 2: ITU-R BT.709\n" ++#if CONFIG_GL ++ " gl\n" ++ " Enable OpenGL rendering\n" ++#if USE_VAAPI_GLX_BIND ++ " bind\n" ++ " Use VA surface binding instead of copy\n" ++#endif ++ " reflect\n" ++ " Enable OpenGL reflection effects\n" ++#endif ++ "\n" ); ++ return -1; ++ } ++ if (g_deint) ++ g_deint_type = g_deint; ++#if CONFIG_GL ++ if (gl_enabled) ++ mp_msg(MSGT_VO, MSGL_INFO, "[vo_vaapi] Using OpenGL rendering%s\n", ++ gl_reflect ? ", with reflection effects" : ""); ++#endif ++ ++ stats_init(); ++ ++#if CONFIG_GL ++ if (gl_enabled && !init_mpglcontext(&gl_context, GLTYPE_X11)) ++ return -1; ++ else ++#endif ++ if (!vo_init()) ++ return -1; ++ ++ va_context = calloc(1, sizeof(*va_context)); ++ if (!va_context) ++ return -1; ++ ++#if CONFIG_VAAPI_GLX ++ if (gl_enabled) ++ va_context->display = vaGetDisplayGLX(mDisplay); ++ else ++#endif ++ va_context->display = vaGetDisplay(mDisplay); ++ if (!va_context->display) ++ return -1; ++ mp_msg(MSGT_VO, MSGL_DBG2, "[vo_vaapi] preinit(): VA display %p\n", va_context->display); ++ ++ status = vaInitialize(va_context->display, &va_major_version, &va_minor_version); ++ if (!check_status(status, "vaInitialize()")) ++ return -1; ++ mp_msg(MSGT_VO, MSGL_DBG2, "[vo_vaapi] preinit(): VA API version %d.%d\n", ++ va_major_version, va_minor_version); ++ ++ max_image_formats = vaMaxNumImageFormats(va_context->display); ++ va_image_formats = calloc(max_image_formats, sizeof(*va_image_formats)); ++ if (!va_image_formats) ++ return -1; ++ status = vaQueryImageFormats(va_context->display, va_image_formats, &va_num_image_formats); ++ if (!check_status(status, "vaQueryImageFormats()")) ++ return -1; ++ mp_msg(MSGT_VO, MSGL_DBG2, "[vo_vaapi] preinit(): %d image formats available\n", ++ va_num_image_formats); ++ for (i = 0; i < va_num_image_formats; i++) ++ mp_msg(MSGT_VO, MSGL_DBG2, " %s\n", string_of_VAImageFormat(&va_image_formats[i])); ++ ++ max_subpic_formats = vaMaxNumSubpictureFormats(va_context->display); ++ va_subpic_formats = calloc(max_subpic_formats, sizeof(*va_subpic_formats)); ++ if (!va_subpic_formats) ++ return -1; ++ va_subpic_flags = calloc(max_subpic_formats, sizeof(*va_subpic_flags)); ++ if (!va_subpic_flags) ++ return -1; ++ status = vaQuerySubpictureFormats(va_context->display, va_subpic_formats, va_subpic_flags, &va_num_subpic_formats); ++ if (!check_status(status, "vaQuerySubpictureFormats()")) ++ va_num_subpic_formats = 0; /* XXX: don't error out for IEGD */ ++ mp_msg(MSGT_VO, MSGL_DBG2, "[vo_vaapi] preinit(): %d subpicture formats available\n", ++ va_num_subpic_formats); ++ for (i = 0; i < va_num_subpic_formats; i++) ++ mp_msg(MSGT_VO, MSGL_DBG2, " %s, flags 0x%x\n", string_of_VAImageFormat(&va_subpic_formats[i]), va_subpic_flags[i]); ++ ++ max_profiles = vaMaxNumProfiles(va_context->display); ++ va_profiles = calloc(max_profiles, sizeof(*va_profiles)); ++ if (!va_profiles) ++ return -1; ++ status = vaQueryConfigProfiles(va_context->display, va_profiles, &va_num_profiles); ++ if (!check_status(status, "vaQueryConfigProfiles()")) ++ return -1; ++ mp_msg(MSGT_VO, MSGL_DBG2, "[vo_vaapi] preinit(): %d profiles available\n", ++ va_num_profiles); ++ for (i = 0; i < va_num_profiles; i++) ++ mp_msg(MSGT_VO, MSGL_DBG2, " %s\n", string_of_VAProfile(va_profiles[i])); ++ ++ va_osd_subpicture = VA_INVALID_ID; ++ va_osd_image.image_id = VA_INVALID_ID; ++ va_eosd_subpicture = VA_INVALID_ID; ++ va_eosd_image.image_id = VA_INVALID_ID; ++ ++ max_display_attrs = vaMaxNumDisplayAttributes(va_context->display); ++ display_attrs = calloc(max_display_attrs, sizeof(*display_attrs)); ++ if (display_attrs) { ++ num_display_attrs = 0; ++ status = vaQueryDisplayAttributes(va_context->display, ++ display_attrs, &num_display_attrs); ++ if (check_status(status, "vaQueryDisplayAttributes()")) { ++ for (i = 0; i < num_display_attrs; i++) { ++ VADisplayAttribute *attr; ++ switch (display_attrs[i].type) { ++ case VADisplayAttribBrightness: ++ attr = &va_equalizer.brightness; ++ break; ++ case VADisplayAttribContrast: ++ attr = &va_equalizer.contrast; ++ break; ++ case VADisplayAttribHue: ++ attr = &va_equalizer.hue; ++ break; ++ case VADisplayAttribSaturation: ++ attr = &va_equalizer.saturation; ++ break; ++ default: ++ attr = NULL; ++ break; ++ } ++ if (attr) ++ *attr = display_attrs[i]; ++ } ++ } ++ free(display_attrs); ++ } ++ return 0; ++} ++ ++static void free_video_specific(void) ++{ ++ int i; ++ ++#if CONFIG_VAAPI_GLX ++ if (gl_surface) { ++ VAStatus status; ++ status = vaDestroySurfaceGLX(va_context->display, gl_surface); ++ check_status(status, "vaDestroySurfaceGLX()"); ++ gl_surface = NULL; ++ } ++#endif ++ ++ if (va_context && va_context->context_id) { ++ vaDestroyContext(va_context->display, va_context->context_id); ++ va_context->context_id = 0; ++ } ++ ++ if (va_free_surfaces) { ++ for (i = 0; i < va_num_surfaces; i++) { ++ if (!va_free_surfaces[i]) ++ continue; ++ if (va_free_surfaces[i]->image.image_id != VA_INVALID_ID) { ++ vaDestroyImage(va_context->display, ++ va_free_surfaces[i]->image.image_id); ++ va_free_surfaces[i]->image.image_id = VA_INVALID_ID; ++ } ++ free(va_free_surfaces[i]); ++ va_free_surfaces[i] = NULL; ++ } ++ free(va_free_surfaces); ++ va_free_surfaces = NULL; ++ va_free_surfaces_head_index = 0; ++ va_free_surfaces_tail_index = 0; ++ } ++ ++ g_output_surface = 0; ++ memset(g_output_surfaces, 0, sizeof(g_output_surfaces)); ++ ++ if (va_osd_palette) { ++ free(va_osd_palette); ++ va_osd_palette = NULL; ++ } ++ ++ disable_eosd(); ++ disable_osd(); ++ ++ if (va_eosd_subpicture != VA_INVALID_ID) { ++ vaDestroySubpicture(va_context->display, va_eosd_subpicture); ++ va_eosd_subpicture = VA_INVALID_ID; ++ } ++ ++ if (va_eosd_image.image_id != VA_INVALID_ID) { ++ vaDestroyImage(va_context->display, va_eosd_image.image_id); ++ va_eosd_image.image_id = VA_INVALID_ID; ++ } ++ ++ if (va_osd_subpicture != VA_INVALID_ID) { ++ vaDestroySubpicture(va_context->display, va_osd_subpicture); ++ va_osd_subpicture = VA_INVALID_ID; ++ } ++ ++ if (va_osd_image.image_id != VA_INVALID_ID) { ++ vaDestroyImage(va_context->display, va_osd_image.image_id); ++ va_osd_image.image_id = VA_INVALID_ID; ++ } ++ ++ if (va_surface_ids) { ++ vaDestroySurfaces(va_context->display, va_surface_ids, va_num_surfaces); ++ free(va_surface_ids); ++ va_surface_ids = NULL; ++ va_num_surfaces = 0; ++ } ++ ++ if (va_context && va_context->config_id) { ++ vaDestroyConfig(va_context->display, va_context->config_id); ++ va_context->config_id = 0; ++ } ++ ++ if (va_entrypoints) { ++ free(va_entrypoints); ++ va_entrypoints = NULL; ++ } ++ ++#if CONFIG_GL ++ if (gl_texture) { ++ glDeleteTextures(1, &gl_texture); ++ gl_texture = GL_NONE; ++ } ++#endif ++} ++ ++static void uninit(void) ++{ ++ if (!vo_config_count) ++ return; ++ ++ free_video_specific(); ++ ++ if (va_profiles) { ++ free(va_profiles); ++ va_profiles = NULL; ++ } ++ ++ if (va_subpic_flags) { ++ free(va_subpic_flags); ++ va_subpic_flags = NULL; ++ } ++ ++ if (va_subpic_formats) { ++ free(va_subpic_formats); ++ va_subpic_formats = NULL; ++ } ++ ++ if (va_image_formats) { ++ free(va_image_formats); ++ va_image_formats = NULL; ++ } ++ ++ if (va_context && va_context->display) { ++ vaTerminate(va_context->display); ++ va_context->display = NULL; ++ } ++ ++ if (va_context) { ++ free(va_context); ++ va_context = NULL; ++ } ++ ++#ifdef CONFIG_XF86VM ++ vo_vm_close(); ++#endif ++#if CONFIG_GL ++ if (gl_enabled) ++ uninit_mpglcontext(&gl_context); ++ else ++#endif ++ vo_x11_uninit(); ++ ++ stats_exit(); ++} ++ ++static int config_x11(uint32_t width, uint32_t height, ++ uint32_t display_width, uint32_t display_height, ++ uint32_t flags, char *title) ++{ ++ Colormap cmap; ++ XVisualInfo visualInfo; ++ XVisualInfo *vi; ++ XSetWindowAttributes xswa; ++ unsigned long xswa_mask; ++ XWindowAttributes wattr; ++ int depth; ++ ++#ifdef CONFIG_GUI ++ if (use_gui) ++ guiGetEvent(guiSetShVideo, 0); // the GUI will set up / resize our window ++ else ++#endif ++ { ++#ifdef CONFIG_XF86VM ++ if (flags & VOFLAG_MODESWITCHING) ++ vo_vm_switch(); ++#endif ++ XGetWindowAttributes(mDisplay, DefaultRootWindow(mDisplay), &wattr); ++ depth = wattr.depth; ++ if (depth != 15 && depth != 16 && depth != 24 && depth != 32) ++ depth = 24; ++ XMatchVisualInfo(mDisplay, mScreen, depth, TrueColor, &visualInfo); ++ ++#if CONFIG_VAAPI_GLX ++ if (gl_enabled) { ++ vi = glXChooseVisual(mDisplay, mScreen, gl_visual_attr); ++ if (!vi) ++ return -1; ++ cmap = XCreateColormap(mDisplay, mRootWin, vi->visual, AllocNone); ++ if (cmap == None) ++ return -1; ++ } ++ else ++#endif ++ { ++ vi = &visualInfo; ++ XMatchVisualInfo(mDisplay, mScreen, depth, TrueColor, vi); ++ cmap = CopyFromParent; ++ } ++ ++ vo_x11_create_vo_window(vi, ++ vo_dx, vo_dy, display_width, display_height, ++ flags, cmap, "vaapi", title); ++ ++ if (vi != &visualInfo) ++ XFree(vi); ++ ++ xswa_mask = CWBorderPixel | CWBackPixel; ++ xswa.border_pixel = 0; ++ xswa.background_pixel = 0; ++ XChangeWindowAttributes(mDisplay, vo_window, xswa_mask, &xswa); ++ ++#ifdef CONFIG_XF86VM ++ if (flags & VOFLAG_MODESWITCHING) { ++ /* Grab the mouse pointer in our window */ ++ if (vo_grabpointer) ++ XGrabPointer(mDisplay, vo_window, True, 0, ++ GrabModeAsync, GrabModeAsync, ++ vo_window, None, CurrentTime); ++ XSetInputFocus(mDisplay, vo_window, RevertToNone, CurrentTime); ++ } ++#endif ++ } ++ ++ if ((flags & VOFLAG_FULLSCREEN) && WinID <= 0) ++ vo_fs = VO_TRUE; ++ return 0; ++} ++ ++#if CONFIG_VAAPI_GLX ++static int config_glx(unsigned int width, unsigned int height) ++{ ++ if (gl_context.setGlWindow(&gl_context) == SET_WINDOW_FAILED) ++ return -1; ++ ++ glDisable(GL_DEPTH_TEST); ++ glDepthMask(GL_FALSE); ++ glDisable(GL_CULL_FACE); ++ glEnable(GL_TEXTURE_2D); ++ glDrawBuffer(vo_doublebuffering ? GL_BACK : GL_FRONT); ++ glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); ++ glEnable(GL_BLEND); ++ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); ++ ++ /* Create OpenGL texture */ ++ /* XXX: assume GL_ARB_texture_non_power_of_two is available */ ++ glEnable(GL_TEXTURE_2D); ++ glGenTextures(1, &gl_texture); ++ BindTexture(GL_TEXTURE_2D, gl_texture); ++ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); ++ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); ++ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); ++ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); ++ glPixelStorei(GL_UNPACK_ALIGNMENT, 4); ++ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, ++ GL_BGRA, GL_UNSIGNED_BYTE, NULL); ++ BindTexture(GL_TEXTURE_2D, 0); ++ glDisable(GL_TEXTURE_2D); ++ ++ glClearColor(0.0, 0.0, 0.0, 1.0); ++ glClear(GL_COLOR_BUFFER_BIT); ++ ++ if (gl_build_font() < 0) ++ return -1; ++ return 0; ++} ++#endif ++ ++static int config_vaapi(uint32_t width, uint32_t height, uint32_t format) ++{ ++ VAConfigAttrib attrib; ++ VAStatus status; ++ int i, j, profile, entrypoint, max_entrypoints, num_surfaces; ++ ++ /* Create video surfaces */ ++ if (!IMGFMT_IS_VAAPI(format)) ++ num_surfaces = MAX_OUTPUT_SURFACES; ++ else { ++ switch (IMGFMT_VAAPI_CODEC(format)) { ++ case IMGFMT_VAAPI_CODEC_MPEG2: ++ num_surfaces = NUM_VIDEO_SURFACES_MPEG2; ++ break; ++ case IMGFMT_VAAPI_CODEC_MPEG4: ++ num_surfaces = NUM_VIDEO_SURFACES_MPEG4; ++ break; ++ case IMGFMT_VAAPI_CODEC_H264: ++ num_surfaces = NUM_VIDEO_SURFACES_H264; ++ break; ++ case IMGFMT_VAAPI_CODEC_VC1: ++ num_surfaces = NUM_VIDEO_SURFACES_VC1; ++ break; ++ default: ++ num_surfaces = 0; ++ break; ++ } ++ if (num_surfaces == 0) ++ return -1; ++ if (!is_direct_mapping()) ++ num_surfaces = FFMIN(2 * num_surfaces, MAX_VIDEO_SURFACES); ++ } ++ for (i = 0; i < num_surfaces; i++) { ++ struct vaapi_surface *surface; ++ surface = alloc_vaapi_surface(width, height, VA_RT_FORMAT_YUV420); ++ if (!surface) ++ return -1; ++ } ++ assert(va_num_surfaces == num_surfaces); ++ ++#if CONFIG_VAAPI_GLX ++ /* Create GLX surfaces */ ++ if (gl_enabled) { ++ status = vaCreateSurfaceGLX(va_context->display, ++ GL_TEXTURE_2D, gl_texture, ++ &gl_surface); ++ if (!check_status(status, "vaCreateSurfaceGLX()")) ++ return -1; ++ } ++#endif ++ ++ /* Create OSD data */ ++ va_osd_draw_alpha = NULL; ++ va_osd_image.image_id = VA_INVALID_ID; ++ va_osd_image.buf = VA_INVALID_ID; ++ va_osd_subpicture = VA_INVALID_ID; ++ for (i = 0; va_osd_info[i].format; i++) { ++ for (j = 0; j < va_num_subpic_formats; j++) ++ if (va_subpic_formats[j].fourcc == va_osd_info[i].format) ++ break; ++ if (j < va_num_subpic_formats && ++ vaCreateImage(va_context->display, &va_subpic_formats[j], ++ width, height, &va_osd_image) == VA_STATUS_SUCCESS) { ++ va_osd_palette = gen_osd_palette(&va_osd_image); ++ if (((!va_osd_image.num_palette_entries) ^ (!va_osd_palette)) == 0) ++ break; ++ } ++ } ++ if (va_osd_info[i].format && ++ vaCreateSubpicture(va_context->display, va_osd_image.image_id, ++ &va_osd_subpicture) == VA_STATUS_SUCCESS) { ++ va_osd_draw_alpha = va_osd_info[i].draw_alpha; ++ if (va_osd_palette) { ++ status = vaSetImagePalette(va_context->display, ++ va_osd_image.image_id, va_osd_palette); ++ check_status(status, "vaSetImagePalette()"); ++ } ++ mp_msg(MSGT_VO, MSGL_DBG2, "[vo_vaapi] Using %s surface for OSD\n", ++ string_of_VAImageFormat(&va_osd_image.format)); ++ } ++ ++ /* Create EOSD data */ ++ va_eosd_draw_alpha = NULL; ++ va_eosd_image.image_id = VA_INVALID_ID; ++ va_eosd_image.buf = VA_INVALID_ID; ++ va_eosd_subpicture = VA_INVALID_ID; ++ for (i = 0; va_eosd_info[i].format; i++) { ++ for (j = 0; j < va_num_subpic_formats; j++) ++ if (va_subpic_formats[j].fourcc == va_eosd_info[i].format) ++ break; ++ if (j < va_num_subpic_formats && ++ vaCreateImage(va_context->display, &va_subpic_formats[j], ++ width, height, &va_eosd_image) == VA_STATUS_SUCCESS) ++ break; ++ } ++ if (va_eosd_info[i].format && ++ vaCreateSubpicture(va_context->display, va_eosd_image.image_id, ++ &va_eosd_subpicture) == VA_STATUS_SUCCESS) { ++ va_eosd_draw_alpha = va_eosd_info[i].draw_alpha; ++ mp_msg(MSGT_VO, MSGL_DBG2, "[vo_vaapi] Using %s surface for EOSD\n", ++ string_of_VAImageFormat(&va_eosd_image.format)); ++ } ++ ++ /* Allocate VA images */ ++ if (!IMGFMT_IS_VAAPI(format)) { ++ VAImageFormat *image_format = VAImageFormat_from_imgfmt(format); ++ if (!image_format) ++ return -1; ++ for (i = 0; i < va_num_surfaces; i++) { ++ status = vaCreateImage(va_context->display, image_format, ++ width, height, &va_free_surfaces[i]->image); ++ if (!check_status(status, "vaCreateImage()")) ++ return -1; ++ } ++ return 0; ++ } ++ ++ /* Check profile */ ++ profile = VAProfile_from_imgfmt(format); ++ if (profile < 0) ++ return -1; ++ ++ /* Check entry-point (only VLD for now) */ ++ max_entrypoints = vaMaxNumEntrypoints(va_context->display); ++ va_entrypoints = calloc(max_entrypoints, sizeof(*va_entrypoints)); ++ if (!va_entrypoints) ++ return -1; ++ ++ status = vaQueryConfigEntrypoints(va_context->display, profile, ++ va_entrypoints, &va_num_entrypoints); ++ if (!check_status(status, "vaQueryConfigEntrypoints()")) ++ return -1; ++ ++ mp_msg(MSGT_VO, MSGL_DBG2, "[vo_vaapi] config_vaapi(%s): %d entrypoints available\n", ++ string_of_VAProfile(profile), va_num_entrypoints); ++ for (i = 0; i < va_num_entrypoints; i++) ++ mp_msg(MSGT_VO, MSGL_DBG2, " %s\n", string_of_VAEntrypoint(va_entrypoints[i])); ++ ++ entrypoint = VAEntrypoint_from_imgfmt(format); ++ if (entrypoint != VAEntrypointVLD) ++ return -1; ++ ++ /* Check chroma format (only 4:2:0 for now) */ ++ attrib.type = VAConfigAttribRTFormat; ++ status = vaGetConfigAttributes(va_context->display, profile, entrypoint, &attrib, 1); ++ if (!check_status(status, "vaGetConfigAttributes()")) ++ return -1; ++ if ((attrib.value & VA_RT_FORMAT_YUV420) == 0) ++ return -1; ++ ++ /* Create a configuration for the decode pipeline */ ++ status = vaCreateConfig(va_context->display, profile, entrypoint, &attrib, 1, &va_context->config_id); ++ if (!check_status(status, "vaCreateConfig()")) ++ return -1; ++ ++ /* Create a context for the decode pipeline */ ++ status = vaCreateContext(va_context->display, va_context->config_id, ++ width, height, VA_PROGRESSIVE, ++ va_surface_ids, va_num_surfaces, ++ &va_context->context_id); ++ if (!check_status(status, "vaCreateContext()")) ++ return -1; ++ return 0; ++} ++ ++static int config(uint32_t width, uint32_t height, ++ uint32_t display_width, uint32_t display_height, ++ uint32_t flags, char *title, uint32_t format) ++{ ++ mp_msg(MSGT_VO, MSGL_DBG2, "[vo_vaapi] config(): size %dx%d, display size %dx%d, flags %x, title '%s', format %x (%s)\n", ++ width, height, display_width, display_height, flags, title, format, vo_format_name(format)); ++ ++ free_video_specific(); ++ ++ if (config_x11(width, height, display_width, display_height, flags, title) < 0) ++ return -1; ++ ++#if CONFIG_VAAPI_GLX ++ if (gl_enabled && config_glx(width, height) < 0) ++ return -1; ++#endif ++ ++ if (config_vaapi(width, height, format) < 0) ++ return -1; ++ ++ g_is_paused = 0; ++ g_image_width = width; ++ g_image_height = height; ++ g_image_format = format; ++ resize(); ++ return 0; ++} ++ ++static int query_format(uint32_t format) ++{ ++ const int default_caps = (VFCAP_CSP_SUPPORTED | ++ VFCAP_CSP_SUPPORTED_BY_HW | ++ VFCAP_HWSCALE_UP | ++ VFCAP_HWSCALE_DOWN | ++ VFCAP_OSD | ++ VFCAP_EOSD); ++ ++ mp_msg(MSGT_VO, MSGL_DBG2, "[vo_vaapi] query_format(): format %x (%s)\n", ++ format, vo_format_name(format)); ++ ++ switch (format) { ++ case IMGFMT_VAAPI_MPEG2: ++ case IMGFMT_VAAPI_MPEG4: ++ case IMGFMT_VAAPI_H263: ++ case IMGFMT_VAAPI_H264: ++ case IMGFMT_VAAPI_WMV3: ++ case IMGFMT_VAAPI_VC1: ++ return default_caps | VOCAP_NOSLICES; ++ case IMGFMT_NV12: ++ case IMGFMT_YV12: ++ case IMGFMT_I420: ++ case IMGFMT_IYUV: ++ if (VAImageFormat_from_imgfmt(format)) ++ return default_caps; ++ break; ++ } ++ return 0; ++} ++ ++static inline int get_field_flags(int i) ++{ ++ return (g_deint ? ++ ((g_top_field_first ^ i) == 0 ? ++ VA_BOTTOM_FIELD : VA_TOP_FIELD) : VA_FRAME_PICTURE); ++} ++ ++static inline int get_colorspace_flags(void) ++{ ++ int csp = 0; ++#if USE_VAAPI_COLORSPACE ++ switch (g_colorspace) { ++ case 0: ++ csp = ((g_image_width >= 1280 || g_image_height > 576) ? ++ VA_SRC_BT709 : VA_SRC_BT601); ++ break; ++ case 1: ++ csp = VA_SRC_BT601; ++ break; ++ case 2: ++ csp = VA_SRC_BT709; ++ break; ++ default: ++ assert(0); ++ break; ++ } ++#endif ++ return csp; ++} ++ ++static void put_surface_x11(struct vaapi_surface *surface) ++{ ++ VAStatus status; ++ int i; ++ ++ for (i = 0; i <= !!(g_deint > 1); i++) { ++ status = vaPutSurface(va_context->display, ++ surface->id, ++ vo_window, ++ 0, 0, g_image_width, g_image_height, ++ g_output_rect.left, ++ g_output_rect.top, ++ g_output_rect.width, ++ g_output_rect.height, ++ NULL, 0, ++ get_field_flags(i) | get_colorspace_flags()); ++ if (!check_status(status, "vaPutSurface()")) ++ return; ++ } ++} ++ ++#if CONFIG_VAAPI_GLX ++static void put_surface_glx(struct vaapi_surface *surface) ++{ ++ VAStatus status; ++ int i; ++ ++ if (gl_binding) { ++#if USE_VAAPI_GLX_BIND ++ for (i = 0; i <= !!(g_deint > 1); i++) { ++ status = vaAssociateSurfaceGLX(va_context->display, ++ gl_surface, ++ surface->id, ++ get_field_flags(i) | get_colorspace_flags()); ++ if (!check_status(status, "vaAssociateSurfaceGLX()")) ++ return; ++ } ++#else ++ mp_msg(MSGT_VO, MSGL_WARN, "vaAssociateSurfaceGLX() is not implemented\n"); ++ gl_binding = 0; ++#endif ++ } ++ ++ if (!gl_binding) { ++ for (i = 0; i <= !!(g_deint > 1); i++) { ++ status = vaCopySurfaceGLX(va_context->display, ++ gl_surface, ++ surface->id, ++ get_field_flags(i) | get_colorspace_flags()); ++ ++ if (status == VA_STATUS_ERROR_UNIMPLEMENTED) { ++ mp_msg(MSGT_VO, MSGL_WARN, ++ "[vo_vaapi] vaCopySurfaceGLX() is not implemented\n"); ++ gl_binding = 1; ++ } ++ else { ++ if (!check_status(status, "vaCopySurfaceGLX()")) ++ return; ++ } ++ } ++ } ++ g_output_surfaces[g_output_surface] = surface; ++} ++ ++static int glx_bind_texture(void) ++{ ++ VAStatus status; ++ ++ glEnable(GL_TEXTURE_2D); ++ BindTexture(GL_TEXTURE_2D, gl_texture); ++ ++#if USE_VAAPI_GLX_BIND ++ if (gl_binding) { ++ status = vaBeginRenderSurfaceGLX(va_context->display, gl_surface); ++ if (!check_status(status, "vaBeginRenderSurfaceGLX()")) ++ return -1; ++ } ++#endif ++ return 0; ++} ++ ++static int glx_unbind_texture(void) ++{ ++ VAStatus status; ++ ++#if USE_VAAPI_GLX_BIND ++ if (gl_binding) { ++ status = vaEndRenderSurfaceGLX(va_context->display, gl_surface); ++ if (!check_status(status, "vaEndRenderSurfaceGLX()")) ++ return -1; ++ } ++#endif ++ ++ BindTexture(GL_TEXTURE_2D, 0); ++ glDisable(GL_TEXTURE_2D); ++ return 0; ++} ++ ++static void render_background(void) ++{ ++ /* Original code from Mirco Muller (MacSlow): ++ <http://cgit.freedesktop.org/~macslow/gl-gst-player/> */ ++ GLfloat fStartX = 0.0f; ++ GLfloat fStartY = 0.0f; ++ GLfloat fWidth = (GLfloat)vo_dwidth; ++ GLfloat fHeight = (GLfloat)vo_dheight; ++ ++ glBegin(GL_QUADS); ++ { ++ /* top third, darker grey to white */ ++ glColor3f(0.85f, 0.85f, 0.85f); ++ glVertex3f(fStartX, fStartY, 0.0f); ++ glColor3f(0.85f, 0.85f, 0.85f); ++ glVertex3f(fStartX + fWidth, fStartY, 0.0f); ++ glColor3f(1.0f, 1.0f, 1.0f); ++ glVertex3f(fStartX + fWidth, fStartY + fHeight / 3.0f, 0.0f); ++ glColor3f(1.0f, 1.0f, 1.0f); ++ glVertex3f(fStartX, fStartY + fHeight / 3.0f, 0.0f); ++ ++ /* middle third, just plain white */ ++ glColor3f(1.0f, 1.0f, 1.0f); ++ glVertex3f(fStartX, fStartY + fHeight / 3.0f, 0.0f); ++ glVertex3f(fStartX + fWidth, fStartY + fHeight / 3.0f, 0.0f); ++ glVertex3f(fStartX + fWidth, fStartY + 2.0f * fHeight / 3.0f, 0.0f); ++ glVertex3f(fStartX, fStartY + 2.0f * fHeight / 3.0f, 0.0f); ++ ++ /* bottom third, white to lighter grey */ ++ glColor3f(1.0f, 1.0f, 1.0f); ++ glVertex3f(fStartX, fStartY + 2.0f * fHeight / 3.0f, 0.0f); ++ glColor3f(1.0f, 1.0f, 1.0f); ++ glVertex3f(fStartX + fWidth, fStartY + 2.0f * fHeight / 3.0f, 0.0f); ++ glColor3f(0.62f, 0.66f, 0.69f); ++ glVertex3f(fStartX + fWidth, fStartY + fHeight, 0.0f); ++ glColor3f(0.62f, 0.66f, 0.69f); ++ glVertex3f(fStartX, fStartY + fHeight, 0.0f); ++ } ++ glEnd(); ++} ++ ++static void render_frame(void) ++{ ++ struct vo_rect * const r = &g_output_rect; ++ ++ if (glx_bind_texture() < 0) ++ return; ++ glColor4f(1.0f, 1.0f, 1.0f, 1.0f); ++ glBegin(GL_QUADS); ++ { ++ glTexCoord2f(0.0f, 0.0f); glVertex2i(r->left, r->top); ++ glTexCoord2f(0.0f, 1.0f); glVertex2i(r->left, r->bottom); ++ glTexCoord2f(1.0f, 1.0f); glVertex2i(r->right, r->bottom); ++ glTexCoord2f(1.0f, 0.0f); glVertex2i(r->right, r->top); ++ } ++ glEnd(); ++ if (glx_unbind_texture() < 0) ++ return; ++} ++ ++static void render_reflection(void) ++{ ++ struct vo_rect * const r = &g_output_rect; ++ const unsigned int rh = g_output_rect.height / 5; ++ GLfloat ry = 1.0f - (GLfloat)rh / (GLfloat)r->height; ++ ++ if (glx_bind_texture() < 0) ++ return; ++ glBegin(GL_QUADS); ++ { ++ glColor4f(1.0f, 1.0f, 1.0f, 1.0f); ++ glTexCoord2f(0.0f, 1.0f); glVertex2i(r->left, r->top); ++ glTexCoord2f(1.0f, 1.0f); glVertex2i(r->right, r->top); ++ ++ glColor4f(1.0f, 1.0f, 1.0f, 0.0f); ++ glTexCoord2f(1.0f, ry); glVertex2i(r->right, r->top + rh); ++ glTexCoord2f(0.0f, ry); glVertex2i(r->left, r->top + rh); ++ } ++ glEnd(); ++ if (glx_unbind_texture() < 0) ++ return; ++} ++ ++static void flip_page_glx(void) ++{ ++ glClear(GL_COLOR_BUFFER_BIT); ++ ++ if (gl_reflect) { ++ render_background(); ++ ++ glPushMatrix(); ++ glRotatef(20.0f, 0.0f, 1.0f, 0.0f); ++ glTranslatef(50.0f, 0.0f, 0.0f); ++ } ++ ++ render_frame(); ++ ++ if (gl_reflect) { ++ glPushMatrix(); ++ glTranslatef(0.0, (GLfloat)g_output_rect.height + 5.0f, 0.0f); ++ render_reflection(); ++ glPopMatrix(); ++ glPopMatrix(); ++ } ++ ++ if (cpu_stats) { ++ gl_draw_rectangle(0, 0, vo_dwidth, 32, 0x000000ff); ++ glColor3f(1.0f, 1.0f, 1.0f); ++ glRasterPos2i(16, 20); ++ gl_printf("MPlayer: %.1f%% of CPU @ %u MHz", cpu_usage, cpu_frequency); ++ } ++ ++ gl_context.swapGlBuffers(&gl_context); ++ ++ if (vo_fs) /* avoid flickering borders in fullscreen mode */ ++ glClear(GL_COLOR_BUFFER_BIT); ++} ++#endif ++ ++static void put_surface(struct vaapi_surface *surface) ++{ ++ if (!surface || surface->id == VA_INVALID_SURFACE) ++ return; ++ ++#if CONFIG_VAAPI_GLX ++ if (gl_enabled) ++ put_surface_glx(surface); ++ else ++#endif ++ put_surface_x11(surface); ++} ++ ++static int draw_slice(uint8_t * image[], int stride[], ++ int w, int h, int x, int y) ++{ ++ struct vaapi_surface * const surface = va_free_surfaces[g_output_surface]; ++ VAImage * const va_image = &surface->image; ++ VAStatus status; ++ uint8_t *image_data = NULL; ++ uint8_t *dst[3] = { 0, }; ++ unsigned int dst_stride[3]; ++ ++ mp_msg(MSGT_VO, MSGL_DBG2, "[vo_vaapi] draw_slice(): location (%d,%d), size %dx%d\n", x, y, w, h); ++ ++ status = vaMapBuffer(va_context->display, va_image->buf, &image_data); ++ if (!check_status(status, "vaMapBuffer()")) ++ return VO_FALSE; ++ ++ dst_stride[0] = va_image->pitches[0]; ++ dst[0] = image_data + va_image->offsets[0] + y * dst_stride[0] + x; ++ ++ memcpy_pic(dst[0], image[0], w, h, dst_stride[0], stride[0]); ++ ++ x /= 2; ++ y /= 2; ++ w /= 2; ++ h /= 2; ++ ++ if (g_image_format == IMGFMT_YV12) { ++ /* MPlayer's YV12 is actually I420, so swap U/V components */ ++ dst_stride[1] = va_image->pitches[2]; ++ dst[1] = image_data + va_image->offsets[2] + y * dst_stride[1] + x; ++ dst_stride[2] = va_image->pitches[1]; ++ dst[2] = image_data + va_image->offsets[1] + y * dst_stride[2] + x; ++ } ++ else { ++ if (image[1]) { ++ dst_stride[1] = va_image->pitches[1]; ++ dst[1] = image_data + va_image->offsets[1] + y * dst_stride[1] + x; ++ } ++ if (image[2]) { ++ dst_stride[2] = va_image->pitches[2]; ++ dst[2] = image_data + va_image->offsets[2] + y * dst_stride[2] + x; ++ } ++ } ++ ++ if (image[1]) /* RGBA only has a single plane */ ++ memcpy_pic(dst[1], image[1], w, h, dst_stride[1], stride[1]); ++ ++ if (image[2]) /* NV12 only has two planes */ ++ memcpy_pic(dst[2], image[2], w, h, dst_stride[2], stride[2]); ++ ++ status = vaUnmapBuffer(va_context->display, surface->image.buf); ++ if (!check_status(status, "vaUnmapBuffer()")) ++ return VO_FALSE; ++ ++ return VO_TRUE; ++} ++ ++static int draw_frame(uint8_t * src[]) ++{ ++ mp_msg(MSGT_VO,MSGL_INFO, MSGTR_LIBVO_X11_DrawFrameCalled); ++ ++ return -1; ++} ++ ++static void draw_osd(void) ++{ ++ VAStatus status; ++ ++ if (!va_osd_draw_alpha) ++ return; ++ ++ if (!vo_update_osd(g_image_width, g_image_height)) ++ return; ++ ++ if (!vo_osd_check_range_update(0, 0, g_image_width, g_image_height)) { ++ disable_osd(); ++ return; ++ } ++ ++ status = vaMapBuffer(va_context->display, va_osd_image.buf, ++ &va_osd_image_data); ++ if (!check_status(status, "vaMapBuffer()")) ++ return; ++ ++ memset(va_osd_image_data, 0, va_osd_image.data_size); ++ ++ set_osd_image_dirty_rect(0, 0, g_image_width, g_image_height); ++ vo_draw_text(g_image_width, g_image_height, va_osd_draw_alpha); ++ ++ status = vaUnmapBuffer(va_context->display, va_osd_image.buf); ++ if (!check_status(status, "vaUnmapBuffer()")) ++ return; ++ va_osd_image_data = NULL; ++ ++ enable_osd(&va_osd_image_dirty_rect, &va_osd_image_dirty_rect); ++} ++ ++static void draw_eosd(mp_eosd_images_t *imgs) ++{ ++ ass_image_t *img = imgs->imgs; ++ ass_image_t *i; ++ VAStatus status; ++ ++ if (!va_eosd_draw_alpha) ++ return; ++ ++ // Nothing changed, no need to redraw ++ if (imgs->changed == 0) ++ return; ++ ++ // There's nothing to render! ++ if (!img) { ++ disable_eosd(); ++ return; ++ } ++ ++ if (imgs->changed == 1) ++ goto eosd_skip_upload; ++ ++ status = vaMapBuffer(va_context->display, va_eosd_image.buf, ++ &va_eosd_image_data); ++ if (!check_status(status, "vaMapBuffer()")) ++ return; ++ ++ memset(va_eosd_image_data, 0, va_eosd_image.data_size); ++ ++ for (i = img; i; i = i->next) ++ va_eosd_draw_alpha(i->bitmap, i->w, i->h, i->stride, ++ i->dst_x, i->dst_y, i->color); ++ ++ status = vaUnmapBuffer(va_context->display, va_eosd_image.buf); ++ if (!check_status(status, "vaUnmapBuffer()")) ++ return; ++ va_eosd_image_data = NULL; ++ ++eosd_skip_upload: ++ enable_eosd(); ++} ++ ++static void flip_page(void) ++{ ++ struct vaapi_surface *surface; ++ ++ mp_msg(MSGT_VO, MSGL_DBG2, "[vo_vaapi] flip_page()\n"); ++ ++ surface = g_output_surfaces[g_output_surface]; ++ if (surface) ++ put_surface(surface); ++ g_output_surface = (g_output_surface + 1) % MAX_OUTPUT_SURFACES; ++ ++#if CONFIG_VAAPI_GLX ++ if (gl_enabled && surface) ++ flip_page_glx(); ++#endif ++} ++ ++static struct vaapi_surface *get_surface(mp_image_t *mpi) ++{ ++ struct vaapi_surface *surface; ++ ++ if (mpi->type == MP_IMGTYPE_NUMBERED && is_direct_mapping()) { ++ assert(mpi->number < va_num_surfaces); ++ surface = va_free_surfaces[mpi->number]; ++ return surface; ++ } ++ ++ /* Push current surface to a free slot */ ++ if (mpi->priv) { ++ assert(!va_free_surfaces[va_free_surfaces_tail_index]); ++ va_free_surfaces[va_free_surfaces_tail_index] = mpi->priv; ++ va_free_surfaces_tail_index = (va_free_surfaces_tail_index + 1) % va_num_surfaces; ++ } ++ ++ /* Pop the least recently used free surface */ ++ assert(va_free_surfaces[va_free_surfaces_head_index]); ++ surface = va_free_surfaces[va_free_surfaces_head_index]; ++ va_free_surfaces[va_free_surfaces_head_index] = NULL; ++ va_free_surfaces_head_index = (va_free_surfaces_head_index + 1) % va_num_surfaces; ++ return surface; ++} ++ ++static uint32_t get_image(mp_image_t *mpi) ++{ ++ struct vaapi_surface *surface; ++ ++ if (mpi->type != MP_IMGTYPE_NUMBERED) ++ return VO_FALSE; ++ ++ if (!IMGFMT_IS_VAAPI(g_image_format)) ++ return VO_FALSE; ++ ++ surface = get_surface(mpi); ++ if (!surface) ++ return VO_FALSE; ++ ++ mpi->flags |= MP_IMGFLAG_DIRECT; ++ mpi->stride[0] = mpi->stride[1] = mpi->stride[2] = mpi->stride[3] = 0; ++ mpi->planes[0] = mpi->planes[1] = mpi->planes[2] = mpi->planes[3] = NULL; ++ mpi->planes[0] = (char *)surface; ++ mpi->planes[3] = (char *)(uintptr_t)surface->id; ++ mpi->num_planes = 1; ++ mpi->priv = surface; ++ ++ mp_msg(MSGT_VO, MSGL_DBG2, "[vo_vaapi] get_image(): surface 0x%08x\n", surface->id); ++ ++ return VO_TRUE; ++} ++ ++static int put_image(mp_image_t *mpi, struct vaapi_surface *surface) ++{ ++ VAStatus status; ++ ++ if ((mpi->flags & (MP_IMGFLAG_PLANAR|MP_IMGFLAG_YUV)) != (MP_IMGFLAG_PLANAR|MP_IMGFLAG_YUV)) ++ return VO_FALSE; ++ ++ if (!(mpi->flags & MP_IMGFLAG_DRAW_CALLBACK)) { ++ if (!draw_slice(mpi->planes, mpi->stride, mpi->w, mpi->h, 0, 0)) ++ return VO_FALSE; ++ } ++ ++ status = vaPutImage2(va_context->display, ++ surface->id, ++ surface->image.image_id, ++ mpi->x, mpi->y, mpi->w, mpi->h, ++ mpi->x, mpi->y, mpi->w, mpi->h); ++ if (!check_status(status, "vaPutImage()")) ++ return VO_FALSE; ++ ++ return VO_TRUE; ++} ++ ++static uint32_t draw_image(mp_image_t *mpi) ++{ ++ struct vaapi_surface *surface = (struct vaapi_surface *)mpi->priv; ++ ++ if (!IMGFMT_IS_VAAPI(mpi->imgfmt)) { ++ /* XXX: no direct rendering in non-accelerated mode */ ++ surface = va_free_surfaces[g_output_surface]; ++ if (!put_image(mpi, surface)) ++ return VO_FALSE; ++ } ++ ++ mp_msg(MSGT_VO, MSGL_DBG2, "[vo_vaapi] draw_image(): surface 0x%08x\n", surface->id); ++ ++ g_output_surfaces[g_output_surface] = surface; ++ ++ if (mpi->fields & MP_IMGFIELD_ORDERED) ++ g_top_field_first = !!(mpi->fields & MP_IMGFIELD_TOP_FIRST); ++ else ++ g_top_field_first = 1; ++ ++ if (cpu_stats) { ++ static uint64_t ticks; ++ if ((ticks++ % 30) == 0) { ++ cpu_frequency = get_cpu_frequency(); ++ cpu_usage = get_cpu_usage(CPU_USAGE_QUANTUM); ++ } ++ } ++ return VO_TRUE; ++} ++ ++static void check_events(void) ++{ ++ int events = vo_x11_check_events(mDisplay); ++ ++ if (events & VO_EVENT_RESIZE) ++ resize(); ++ ++ if ((events & (VO_EVENT_EXPOSE|VO_EVENT_RESIZE)) && g_is_paused) { ++ struct vaapi_surface *surface = g_output_surfaces[g_output_surface]; ++ if (surface) ++ put_surface(surface); ++ } ++} ++ ++static VADisplayAttribute *get_display_attribute(const char *name) ++{ ++ VADisplayAttribute *attr; ++ if (!strcasecmp(name, "brightness")) ++ attr = &va_equalizer.brightness; ++ else if (!strcasecmp(name, "contrast")) ++ attr = &va_equalizer.contrast; ++ else if (!strcasecmp(name, "saturation")) ++ attr = &va_equalizer.saturation; ++ else if (!strcasecmp(name, "hue")) ++ attr = &va_equalizer.hue; ++ else ++ attr = NULL; ++ return attr; ++} ++ ++static int get_equalizer(const char *name, int *value) ++{ ++ VADisplayAttribute * const attr = get_display_attribute(name); ++ int r; ++ ++ if (!attr || !(attr->flags & VA_DISPLAY_ATTRIB_GETTABLE)) ++ return VO_NOTIMPL; ++ ++ /* normalize to -100 .. 100 range */ ++ r = attr->max_value - attr->min_value; ++ if (r == 0) ++ return VO_NOTIMPL; ++ *value = ((attr->value - attr->min_value) * 200) / r - 100; ++ return VO_TRUE; ++} ++ ++static int set_equalizer(const char *name, int value) ++{ ++ VADisplayAttribute * const attr = get_display_attribute(name); ++ VAStatus status; ++ int r; ++ ++ if (!attr || !(attr->flags & VA_DISPLAY_ATTRIB_SETTABLE)) ++ return VO_NOTIMPL; ++ ++ /* normalize to attribute value range */ ++ r = attr->max_value - attr->min_value; ++ if (r == 0) ++ return VO_NOTIMPL; ++ attr->value = ((value + 100) * r) / 200 + attr->min_value; ++ ++ status = vaSetDisplayAttributes(va_context->display, attr, 1); ++ if (!check_status(status, "vaSetDisplayAttributes()")) ++ return VO_FALSE; ++ return VO_TRUE; ++} ++ ++static int control(uint32_t request, void *data, ...) ++{ ++ switch (request) { ++ case VOCTRL_GET_DEINTERLACE: ++ *(int*)data = g_deint; ++ return VO_TRUE; ++ case VOCTRL_SET_DEINTERLACE: ++ g_deint = *(int*)data; ++ if (g_deint) ++ g_deint = g_deint_type; ++ return VO_TRUE; ++ case VOCTRL_PAUSE: ++ return (g_is_paused = 1); ++ case VOCTRL_RESUME: ++ return (g_is_paused = 0); ++ case VOCTRL_QUERY_FORMAT: ++ return query_format(*((uint32_t *)data)); ++ case VOCTRL_GET_IMAGE: ++ return get_image(data); ++ case VOCTRL_DRAW_IMAGE: ++ return draw_image(data); ++ case VOCTRL_GUISUPPORT: ++ return VO_TRUE; ++ case VOCTRL_BORDER: ++ vo_x11_border(); ++ resize(); ++ return VO_TRUE; ++ case VOCTRL_FULLSCREEN: ++ vo_x11_fullscreen(); ++ resize(); ++ return VO_TRUE; ++ case VOCTRL_SET_EQUALIZER: { ++ va_list ap; ++ int value; ++ ++ va_start(ap, data); ++ value = va_arg(ap, int); ++ ++ va_end(ap); ++ return set_equalizer(data, value); ++ } ++ case VOCTRL_GET_EQUALIZER: { ++ va_list ap; ++ int *value; ++ ++ va_start(ap, data); ++ value = va_arg(ap, int *); ++ ++ va_end(ap); ++ return get_equalizer(data, value); ++ } ++ case VOCTRL_ONTOP: ++ vo_x11_ontop(); ++ return VO_TRUE; ++ case VOCTRL_UPDATE_SCREENINFO: ++ update_xinerama_info(); ++ return VO_TRUE; ++ case VOCTRL_GET_PANSCAN: ++ return VO_TRUE; ++ case VOCTRL_SET_PANSCAN: ++ resize(); ++ return VO_TRUE; ++ case VOCTRL_GET_HWACCEL_CONTEXT: ++ *((void **)data) = va_context; ++ return VO_TRUE; ++ case VOCTRL_DRAW_EOSD: ++ if (!data) ++ return VO_FALSE; ++ draw_eosd(data); ++ return VO_TRUE; ++ case VOCTRL_GET_EOSD_RES: { ++ mp_eosd_res_t *r = data; ++ r->mt = r->mb = r->ml = r->mr = 0; ++ r->srcw = g_image_width; ++ r->srch = g_image_height; ++ r->w = g_image_width; ++ r->h = g_image_height; ++ return VO_TRUE; ++ } ++ } ++ return VO_NOTIMPL; ++} diff --git a/media-video/mplayer/files/vaapi/02-mplayer-vaapi-gma500-workaround.patch b/media-video/mplayer/files/vaapi/02-mplayer-vaapi-gma500-workaround.patch new file mode 100644 index 0000000..88ca8da --- /dev/null +++ b/media-video/mplayer/files/vaapi/02-mplayer-vaapi-gma500-workaround.patch @@ -0,0 +1,97 @@ +commit 7d70d28f190e37cfa3a9a827877ddd6bb81408d3 +Author: Gwenole Beauchesne <gbeauchesne@splitted-desktop.com> +Date: Mon Dec 28 08:52:56 2009 +0000 + + Add GMA500 workaround for H.264 DPB. This is disabled by default. Enable with GMA500_WORKAROUND=yes environment variable. + +diff --git a/libavcodec/vaapi_h264.c b/libavcodec/vaapi_h264.c +index 9f440c0..0139d64 100644 +--- a/libavcodec/vaapi_h264.c ++++ b/libavcodec/vaapi_h264.c +@@ -28,6 +28,60 @@ + * structures for H.264 decoding. + */ + ++/** Parses ENV environment variable expecting "yes" | "no" values. */ ++static int getenv_yesno(const char *env, int *pval) ++{ ++ int val; ++ const char *env_str; ++ ++ env_str = getenv(env); ++ if (!env_str) ++ return -1; ++ ++ if (strcmp(env_str, "1") == 0 || strcmp(env_str, "yes") == 0) ++ val = 1; ++ else if (strcmp(env_str, "0") == 0 || strcmp(env_str, "no") == 0) ++ val = 0; ++ else ++ return -1; ++ ++ if (pval) ++ *pval = val; ++ return 0; ++} ++ ++/** ++ * Use old GMA500 workaround for DPB. It requires other pictures than ++ * those marked as "used for reference". ++ */ ++static int get_use_gma500_workaround(struct vaapi_context *vactx) ++{ ++ int gma500_workaround_env; ++ const char *vendor_string; ++ ++ if (getenv_yesno("GMA500_WORKAROUND", &gma500_workaround_env) < 0) ++ return 0; ++ if (!gma500_workaround_env) ++ return 0; ++ ++ vendor_string = vaQueryVendorString(vactx->display); ++ if (vendor_string && strstr(vendor_string, "Intel")) { ++ if (strstr(vendor_string, "GMA500")) ++ return 1; ++ if (strstr(vendor_string, "Embedded Graphics Driver")) ++ return 1; ++ } ++ return 0; ++} ++ ++static inline int use_gma500_workaround(struct vaapi_context *vactx) ++{ ++ static int gma500_workaround = -1; ++ if (gma500_workaround < 0) ++ gma500_workaround = get_use_gma500_workaround(vactx); ++ return gma500_workaround; ++} ++ + /** + * Initializes an empty VA API picture. + * +@@ -123,6 +177,7 @@ static int fill_vaapi_ReferenceFrames(VAPictureParameterBufferH264 *pic_param, + { + DPB dpb; + int i; ++ unsigned int list; + + dpb.size = 0; + dpb.max_size = FF_ARRAY_ELEMS(pic_param->ReferenceFrames); +@@ -130,6 +185,17 @@ static int fill_vaapi_ReferenceFrames(VAPictureParameterBufferH264 *pic_param, + for (i = 0; i < dpb.max_size; i++) + init_vaapi_pic(&dpb.va_pics[i]); + ++ if (use_gma500_workaround(h->s.avctx->hwaccel_context)) { ++ /* XXX: this is really wrong */ ++ for (list = 0; list < h->list_count; list++) ++ for (i = 0; i < (int)h->ref_count[list]; i++) { ++ Picture * const pic = &h->ref_list[list][i]; ++ if (pic->reference && dpb_add(&dpb, pic) < 0) ++ return -1; ++ } ++ return 0; ++ } ++ + for (i = 0; i < h->short_ref_count; i++) { + Picture * const pic = h->short_ref[i]; + if (pic && pic->reference && dpb_add(&dpb, pic) < 0) diff --git a/media-video/mplayer/files/vaapi/03-mplayer-vaapi-0.29.patch b/media-video/mplayer/files/vaapi/03-mplayer-vaapi-0.29.patch new file mode 100644 index 0000000..d2f7bba --- /dev/null +++ b/media-video/mplayer/files/vaapi/03-mplayer-vaapi-0.29.patch @@ -0,0 +1,675 @@ +commit ea392cb5fb1265c433b530535108ad8a441b61f6 +Author: Gwenole Beauchesne <gbeauchesne@splitted-desktop.com> +Date: Fri Feb 12 11:03:00 2010 +0000 + + Add compatibility with original VA-API 0.29. + +diff --git a/configure b/configure +index 39fef26..f2f9f2e 100755 +--- a/configure ++++ b/configure +@@ -5109,20 +5109,35 @@ echores "$_glu" + echocheck "VA API" + if test "$_vaapi" = yes -o "$_vaapi" = auto; then + _vaapi=no ++ _vaapi_old=no + cat > $TMPC <<EOF + #include <va/va_x11.h> + int main(void) { (void) vaGetDisplay(0); return 0; } + EOF +- cc_check -lva-x11 && _vaapi=yes ++ cc_check -lva-x11 && _vaapi=yes || { ++ cat > $TMPC <<EOF ++#include <va_x11.h> ++int main(void) { (void) vaGetDisplay(0); return 0; } ++EOF ++ cc_check -lva && _vaapi=yes _vaapi_old=yes ++ } + fi + + if test "$_vaapi" = yes ; then + def_vaapi='#define CONFIG_VAAPI 1' +- libs_mencoder="$libs_mencoder -lva" +- libs_mplayer="$libs_mplayer -lva-x11" ++ if test "$_vaapi_old" = no ; then ++ def_vaapi_old='#define CONFIG_VAAPI_OLD 0' ++ libs_mencoder="$libs_mencoder -lva" ++ libs_mplayer="$libs_mplayer -lva-x11 -lva" ++ else ++ def_vaapi_old='#define CONFIG_VAAPI_OLD 1' ++ _mencoder="no" ++ libs_mplayer="$libs_mplayer -lva" ++ fi + _vomodules="vaapi $_vomodules" + else + def_vaapi='#define CONFIG_VAAPI 0' ++ def_vaapi_old='#define CONFIG_VAAPI_OLD 0' + _novomodules="vaapi $_novomodules" + _libavhwaccels=`echo $_libavhwaccels | sed -e "s/\(MPEG[124]\|H26[34]\|WMV3\|VC1\)_VAAPI_HWACCEL//g"` + fi +@@ -8759,6 +8774,7 @@ CONFIG_POSTPROC = yes + # Prevent building libavcodec/imgresample.c with conflicting symbols + CONFIG_SWSCALE=yes + CONFIG_VAAPI=$_vaapi ++CONFIG_VAAPI_OLD=$_vaapi_old + CONFIG_VDPAU=$_vdpau + CONFIG_XVMC=$_xvmc + CONFIG_ZLIB=$_zlib +@@ -9143,6 +9159,7 @@ $def_tdfxvid + $def_tga + $def_v4l2 + $def_vaapi ++$def_vaapi_old + $def_vaapi_glx + $def_vdpau + $def_vesa +diff --git a/libavcodec/vaapi_compat.h b/libavcodec/vaapi_compat.h +new file mode 100644 +index 0000000..f463118 +--- /dev/null ++++ b/libavcodec/vaapi_compat.h +@@ -0,0 +1,92 @@ ++/* ++ * Video Acceleration API (video decoding) ++ * HW decode acceleration for MPEG-2, MPEG-4, H.264 and VC-1 ++ * ++ * Copyright (C) 2008-2009 Splitted-Desktop Systems ++ * ++ * 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 AVCODEC_VAAPI_COMPAT_H ++#define AVCODEC_VAAPI_COMPAT_H ++ ++/* Compatibility glue with original VA-API 0.29 */ ++#if CONFIG_VAAPI_OLD ++typedef struct _VASliceParameterBufferBase { ++ unsigned int slice_data_size; ++ unsigned int slice_data_offset; ++ unsigned int slice_data_flag; ++} VASliceParameterBufferBase; ++#endif ++ ++#ifndef VA_CHECK_VERSION ++#define VA_MAJOR_VERSION 0 ++#define VA_MINOR_VERSION 29 ++#define VA_CHECK_VERSION(major,minor,micro) \ ++ (VA_MAJOR_VERSION > (major) || \ ++ (VA_MAJOR_VERSION == (major) && VA_MINOR_VERSION > (minor)) || \ ++ (VA_MAJOR_VERSION == (major) && VA_MINOR_VERSION == (minor) && VA_MICRO_VERSION >= (micro))) ++#endif ++ ++#ifndef VA_FOURCC ++#define VA_FOURCC(ch0, ch1, ch2, ch3) \ ++ ((uint32_t)(uint8_t)(ch0) | \ ++ ((uint32_t)(uint8_t)(ch1) << 8) | \ ++ ((uint32_t)(uint8_t)(ch2) << 16) | \ ++ ((uint32_t)(uint8_t)(ch3) << 24 )) ++#endif ++ ++#ifndef VA_INVALID_ID ++#define VA_INVALID_ID 0xffffffff ++#endif ++#ifndef VA_INVALID_SURFACE ++#define VA_INVALID_SURFACE VA_INVALID_ID ++#endif ++ ++/* Compatibility glue with VA-API >= 0.31 */ ++#if VA_CHECK_VERSION(0,31,0) ++#define vaSyncSurface(dpy, context, surface) (vaSyncSurface)((dpy), (surface)) ++#define vaPutImage2 vaPutImage ++#define vaAssociateSubpicture2 vaAssociateSubpicture ++#endif ++ ++/* Used in codec implementation to set up the right bit-fields */ ++#if CONFIG_VAAPI_OLD ++# define BFV(a, b) a ++# define BFM(a, b, c) c ++# define BFMP(p, a, b, c) p##_##c ++# define NEW(x) /* nothing */ ++#else ++# define BFV(a, b) a.b ++# define BFM(a, b, c) a.b.c ++# define BFMP(p, a, b, c) a.b.c ++# define NEW(x) x ++#endif ++ ++#if CONFIG_VAAPI_OLD ++# define V_raw_coding raw_coding_flag ++# define M_raw_coding raw_coding ++# define V_bitplane_present bitplane_present_flag ++# define M_bitplane_present bitplane_present ++#else ++# define V_raw_coding raw_coding ++# define M_raw_coding raw_coding ++# define V_bitplane_present bitplane_present ++# define M_bitplane_present bitplane_present ++#endif ++ ++#endif /* AVCODEC_VAAPI_COMPAT_H */ +diff --git a/libavcodec/vaapi_h264.c b/libavcodec/vaapi_h264.c +index a365428..efe92b8 100644 +--- a/libavcodec/vaapi_h264.c ++++ b/libavcodec/vaapi_h264.c +@@ -123,8 +123,8 @@ static void fill_vaapi_pic(VAPictureH264 *va_pic, + if (pic_structure == 0) + pic_structure = pic->reference; + +- va_pic->picture_id = ff_vaapi_get_surface_id(pic); +- va_pic->frame_idx = pic->long_ref ? pic->pic_id : pic->frame_num; ++ va_pic->picture_id = ff_vaapi_get_surface_id(pic); ++ NEW(va_pic->frame_idx = pic->long_ref ? pic->pic_id : pic->frame_num); + + va_pic->flags = 0; + if (pic_structure != PICT_FRAME) +@@ -317,42 +317,42 @@ static int start_frame(AVCodecContext *avctx, + fill_vaapi_pic(&pic_param->CurrPic, s->current_picture_ptr, s->picture_structure); + if (fill_vaapi_ReferenceFrames(pic_param, h) < 0) + return -1; +- pic_param->picture_width_in_mbs_minus1 = s->mb_width - 1; +- pic_param->picture_height_in_mbs_minus1 = s->mb_height - 1; +- pic_param->bit_depth_luma_minus8 = h->sps.bit_depth_luma - 8; +- pic_param->bit_depth_chroma_minus8 = h->sps.bit_depth_chroma - 8; +- pic_param->num_ref_frames = h->sps.ref_frame_count; +- pic_param->seq_fields.value = 0; /* reset all bits */ +- pic_param->seq_fields.bits.chroma_format_idc = h->sps.chroma_format_idc; +- pic_param->seq_fields.bits.residual_colour_transform_flag = h->sps.residual_color_transform_flag; /* XXX: only for 4:4:4 high profile? */ +- pic_param->seq_fields.bits.gaps_in_frame_num_value_allowed_flag = h->sps.gaps_in_frame_num_allowed_flag; +- pic_param->seq_fields.bits.frame_mbs_only_flag = h->sps.frame_mbs_only_flag; +- pic_param->seq_fields.bits.mb_adaptive_frame_field_flag = h->sps.mb_aff; +- pic_param->seq_fields.bits.direct_8x8_inference_flag = h->sps.direct_8x8_inference_flag; +- pic_param->seq_fields.bits.MinLumaBiPredSize8x8 = h->sps.level_idc >= 31; /* A.3.3.2 */ +- pic_param->seq_fields.bits.log2_max_frame_num_minus4 = h->sps.log2_max_frame_num - 4; +- pic_param->seq_fields.bits.pic_order_cnt_type = h->sps.poc_type; +- pic_param->seq_fields.bits.log2_max_pic_order_cnt_lsb_minus4 = h->sps.log2_max_poc_lsb - 4; +- pic_param->seq_fields.bits.delta_pic_order_always_zero_flag = h->sps.delta_pic_order_always_zero_flag; +- pic_param->num_slice_groups_minus1 = h->pps.slice_group_count - 1; +- pic_param->slice_group_map_type = h->pps.mb_slice_group_map_type; +- pic_param->slice_group_change_rate_minus1 = 0; /* XXX: unimplemented in FFmpeg */ +- pic_param->pic_init_qp_minus26 = h->pps.init_qp - 26; +- pic_param->pic_init_qs_minus26 = h->pps.init_qs - 26; +- pic_param->chroma_qp_index_offset = h->pps.chroma_qp_index_offset[0]; +- pic_param->second_chroma_qp_index_offset = h->pps.chroma_qp_index_offset[1]; +- pic_param->pic_fields.value = 0; /* reset all bits */ +- pic_param->pic_fields.bits.entropy_coding_mode_flag = h->pps.cabac; +- pic_param->pic_fields.bits.weighted_pred_flag = h->pps.weighted_pred; +- pic_param->pic_fields.bits.weighted_bipred_idc = h->pps.weighted_bipred_idc; +- pic_param->pic_fields.bits.transform_8x8_mode_flag = h->pps.transform_8x8_mode; +- pic_param->pic_fields.bits.field_pic_flag = s->picture_structure != PICT_FRAME; +- pic_param->pic_fields.bits.constrained_intra_pred_flag = h->pps.constrained_intra_pred; +- pic_param->pic_fields.bits.pic_order_present_flag = h->pps.pic_order_present; +- pic_param->pic_fields.bits.deblocking_filter_control_present_flag = h->pps.deblocking_filter_parameters_present; +- pic_param->pic_fields.bits.redundant_pic_cnt_present_flag = h->pps.redundant_pic_cnt_present; +- pic_param->pic_fields.bits.reference_pic_flag = h->nal_ref_idc != 0; +- pic_param->frame_num = h->frame_num; ++ pic_param->picture_width_in_mbs_minus1 = s->mb_width - 1; ++ pic_param->picture_height_in_mbs_minus1 = s->mb_height - 1; ++ pic_param->bit_depth_luma_minus8 = h->sps.bit_depth_luma - 8; ++ pic_param->bit_depth_chroma_minus8 = h->sps.bit_depth_chroma - 8; ++ pic_param->num_ref_frames = h->sps.ref_frame_count; ++ pic_param->BFV(seq_fields,value) = 0; /* reset all bits */ ++ pic_param->BFM(seq_fields,bits,chroma_format_idc) = h->sps.chroma_format_idc; ++ pic_param->BFM(seq_fields,bits,residual_colour_transform_flag) = h->sps.residual_color_transform_flag; /* XXX: only for 4:4:4 high profile? */ ++ NEW(pic_param->BFM(seq_fields,bits,gaps_in_frame_num_value_allowed_flag) = h->sps.gaps_in_frame_num_allowed_flag); ++ pic_param->BFM(seq_fields,bits,frame_mbs_only_flag) = h->sps.frame_mbs_only_flag; ++ pic_param->BFM(seq_fields,bits,mb_adaptive_frame_field_flag) = h->sps.mb_aff; ++ pic_param->BFM(seq_fields,bits,direct_8x8_inference_flag) = h->sps.direct_8x8_inference_flag; ++ pic_param->BFM(seq_fields,bits,MinLumaBiPredSize8x8) = h->sps.level_idc >= 31; /* A.3.3.2 */ ++ NEW(pic_param->BFM(seq_fields,bits,log2_max_frame_num_minus4) = h->sps.log2_max_frame_num - 4); ++ NEW(pic_param->BFM(seq_fields,bits,pic_order_cnt_type) = h->sps.poc_type); ++ NEW(pic_param->BFM(seq_fields,bits,log2_max_pic_order_cnt_lsb_minus4) = h->sps.log2_max_poc_lsb - 4); ++ NEW(pic_param->BFM(seq_fields,bits,delta_pic_order_always_zero_flag) = h->sps.delta_pic_order_always_zero_flag); ++ pic_param->num_slice_groups_minus1 = h->pps.slice_group_count - 1; ++ pic_param->slice_group_map_type = h->pps.mb_slice_group_map_type; ++ NEW(pic_param->slice_group_change_rate_minus1 = 0); /* XXX: unimplemented in FFmpeg */ ++ pic_param->pic_init_qp_minus26 = h->pps.init_qp - 26; ++ NEW(pic_param->pic_init_qs_minus26 = h->pps.init_qs - 26); ++ pic_param->chroma_qp_index_offset = h->pps.chroma_qp_index_offset[0]; ++ pic_param->second_chroma_qp_index_offset = h->pps.chroma_qp_index_offset[1]; ++ pic_param->BFV(pic_fields,value) = 0; /* reset all bits */ ++ pic_param->BFM(pic_fields,bits,entropy_coding_mode_flag) = h->pps.cabac; ++ pic_param->BFM(pic_fields,bits,weighted_pred_flag) = h->pps.weighted_pred; ++ pic_param->BFM(pic_fields,bits,weighted_bipred_idc) = h->pps.weighted_bipred_idc; ++ pic_param->BFM(pic_fields,bits,transform_8x8_mode_flag) = h->pps.transform_8x8_mode; ++ pic_param->BFM(pic_fields,bits,field_pic_flag) = s->picture_structure != PICT_FRAME; ++ pic_param->BFM(pic_fields,bits,constrained_intra_pred_flag) = h->pps.constrained_intra_pred; ++ NEW(pic_param->BFM(pic_fields,bits,pic_order_present_flag) = h->pps.pic_order_present); ++ NEW(pic_param->BFM(pic_fields,bits,deblocking_filter_control_present_flag) = h->pps.deblocking_filter_parameters_present); ++ NEW(pic_param->BFM(pic_fields,bits,redundant_pic_cnt_present_flag) = h->pps.redundant_pic_cnt_present); ++ NEW(pic_param->BFM(pic_fields,bits,reference_pic_flag) = h->nal_ref_idc != 0); ++ pic_param->frame_num = h->frame_num; + + /* Fill in VAIQMatrixBufferH264. */ + iq_matrix = ff_vaapi_alloc_iq_matrix(vactx, sizeof(VAIQMatrixBufferH264)); +diff --git a/libavcodec/vaapi_internal.h b/libavcodec/vaapi_internal.h +index 2c0fdf9..ff83b96 100644 +--- a/libavcodec/vaapi_internal.h ++++ b/libavcodec/vaapi_internal.h +@@ -24,8 +24,14 @@ + #ifndef AVCODEC_VAAPI_INTERNAL_H + #define AVCODEC_VAAPI_INTERNAL_H + ++#include "config.h" ++#if CONFIG_VAAPI_OLD ++#include <va.h> ++#else + #include <va/va.h> ++#endif + #include "vaapi.h" ++#include "vaapi_compat.h" + #include "avcodec.h" + #include "mpegvideo.h" + +diff --git a/libavcodec/vaapi_mpeg2.c b/libavcodec/vaapi_mpeg2.c +index 21bc778..8961e9e 100644 +--- a/libavcodec/vaapi_mpeg2.c ++++ b/libavcodec/vaapi_mpeg2.c +@@ -52,24 +52,24 @@ static int vaapi_mpeg2_start_frame(AVCodecContext *avctx, av_unused const uint8_ + pic_param = ff_vaapi_alloc_pic_param(vactx, sizeof(VAPictureParameterBufferMPEG2)); + if (!pic_param) + return -1; +- pic_param->horizontal_size = s->width; +- pic_param->vertical_size = s->height; +- pic_param->forward_reference_picture = VA_INVALID_ID; +- pic_param->backward_reference_picture = VA_INVALID_ID; +- pic_param->picture_coding_type = s->pict_type; +- pic_param->f_code = mpeg2_get_f_code(s); +- pic_param->picture_coding_extension.value = 0; /* reset all bits */ +- pic_param->picture_coding_extension.bits.intra_dc_precision = s->intra_dc_precision; +- pic_param->picture_coding_extension.bits.picture_structure = s->picture_structure; +- pic_param->picture_coding_extension.bits.top_field_first = s->top_field_first; +- pic_param->picture_coding_extension.bits.frame_pred_frame_dct = s->frame_pred_frame_dct; +- pic_param->picture_coding_extension.bits.concealment_motion_vectors = s->concealment_motion_vectors; +- pic_param->picture_coding_extension.bits.q_scale_type = s->q_scale_type; +- pic_param->picture_coding_extension.bits.intra_vlc_format = s->intra_vlc_format; +- pic_param->picture_coding_extension.bits.alternate_scan = s->alternate_scan; +- pic_param->picture_coding_extension.bits.repeat_first_field = s->repeat_first_field; +- pic_param->picture_coding_extension.bits.progressive_frame = s->progressive_frame; +- pic_param->picture_coding_extension.bits.is_first_field = mpeg2_get_is_frame_start(s); ++ pic_param->horizontal_size = s->width; ++ pic_param->vertical_size = s->height; ++ pic_param->forward_reference_picture = VA_INVALID_ID; ++ pic_param->backward_reference_picture = VA_INVALID_ID; ++ pic_param->picture_coding_type = s->pict_type; ++ pic_param->f_code = mpeg2_get_f_code(s); ++ pic_param->BFV(picture_coding_extension,value) = 0; /* reset all bits */ ++ pic_param->BFM(picture_coding_extension,bits,intra_dc_precision) = s->intra_dc_precision; ++ pic_param->BFM(picture_coding_extension,bits,picture_structure) = s->picture_structure; ++ pic_param->BFM(picture_coding_extension,bits,top_field_first) = s->top_field_first; ++ pic_param->BFM(picture_coding_extension,bits,frame_pred_frame_dct) = s->frame_pred_frame_dct; ++ pic_param->BFM(picture_coding_extension,bits,concealment_motion_vectors) = s->concealment_motion_vectors; ++ pic_param->BFM(picture_coding_extension,bits,q_scale_type) = s->q_scale_type; ++ pic_param->BFM(picture_coding_extension,bits,intra_vlc_format) = s->intra_vlc_format; ++ pic_param->BFM(picture_coding_extension,bits,alternate_scan) = s->alternate_scan; ++ pic_param->BFM(picture_coding_extension,bits,repeat_first_field) = s->repeat_first_field; ++ pic_param->BFM(picture_coding_extension,bits,progressive_frame) = s->progressive_frame; ++ pic_param->BFM(picture_coding_extension,bits,is_first_field) = mpeg2_get_is_frame_start(s); + + switch (s->pict_type) { + case FF_B_TYPE: +@@ -131,7 +131,7 @@ static int vaapi_mpeg2_decode_slice(AVCodecContext *avctx, const uint8_t *buffer + if (!slice_param) + return -1; + slice_param->macroblock_offset = macroblock_offset; +- slice_param->slice_horizontal_position = s->mb_x; ++ NEW(slice_param->slice_horizontal_position = s->mb_x); + slice_param->slice_vertical_position = s->mb_y; + slice_param->quantiser_scale_code = quantiser_scale_code; + slice_param->intra_slice_flag = intra_slice_flag; +diff --git a/libavcodec/vaapi_mpeg4.c b/libavcodec/vaapi_mpeg4.c +index 4e606f0..5a9a48e 100644 +--- a/libavcodec/vaapi_mpeg4.c ++++ b/libavcodec/vaapi_mpeg4.c +@@ -54,42 +54,42 @@ static int vaapi_mpeg4_start_frame(AVCodecContext *avctx, av_unused const uint8_ + pic_param = ff_vaapi_alloc_pic_param(vactx, sizeof(VAPictureParameterBufferMPEG4)); + if (!pic_param) + return -1; +- pic_param->vop_width = s->width; +- pic_param->vop_height = s->height; +- pic_param->forward_reference_picture = VA_INVALID_ID; +- pic_param->backward_reference_picture = VA_INVALID_ID; +- pic_param->vol_fields.value = 0; /* reset all bits */ +- pic_param->vol_fields.bits.short_video_header = avctx->codec->id == CODEC_ID_H263; +- pic_param->vol_fields.bits.chroma_format = CHROMA_420; +- pic_param->vol_fields.bits.interlaced = !s->progressive_sequence; +- pic_param->vol_fields.bits.obmc_disable = 1; +- pic_param->vol_fields.bits.sprite_enable = s->vol_sprite_usage; +- pic_param->vol_fields.bits.sprite_warping_accuracy = s->sprite_warping_accuracy; +- pic_param->vol_fields.bits.quant_type = s->mpeg_quant; +- pic_param->vol_fields.bits.quarter_sample = s->quarter_sample; +- pic_param->vol_fields.bits.data_partitioned = s->data_partitioning; +- pic_param->vol_fields.bits.reversible_vlc = s->rvlc; +- pic_param->vol_fields.bits.resync_marker_disable = !s->resync_marker; +- pic_param->no_of_sprite_warping_points = s->num_sprite_warping_points; ++ pic_param->vop_width = s->width; ++ pic_param->vop_height = s->height; ++ pic_param->forward_reference_picture = VA_INVALID_ID; ++ pic_param->backward_reference_picture = VA_INVALID_ID; ++ pic_param->BFV(vol_fields,value) = 0; /* reset all bits */ ++ pic_param->BFM(vol_fields,bits,short_video_header) = avctx->codec->id == CODEC_ID_H263; ++ pic_param->BFM(vol_fields,bits,chroma_format) = CHROMA_420; ++ pic_param->BFM(vol_fields,bits,interlaced) = !s->progressive_sequence; ++ pic_param->BFM(vol_fields,bits,obmc_disable) = 1; ++ pic_param->BFM(vol_fields,bits,sprite_enable) = s->vol_sprite_usage; ++ pic_param->BFM(vol_fields,bits,sprite_warping_accuracy) = s->sprite_warping_accuracy; ++ pic_param->BFM(vol_fields,bits,quant_type) = s->mpeg_quant; ++ pic_param->BFM(vol_fields,bits,quarter_sample) = s->quarter_sample; ++ pic_param->BFM(vol_fields,bits,data_partitioned) = s->data_partitioning; ++ pic_param->BFM(vol_fields,bits,reversible_vlc) = s->rvlc; ++ NEW(pic_param->BFM(vol_fields,bits,resync_marker_disable) = !s->resync_marker); ++ pic_param->no_of_sprite_warping_points = s->num_sprite_warping_points; + for (i = 0; i < s->num_sprite_warping_points && i < 3; i++) { +- pic_param->sprite_trajectory_du[i] = s->sprite_traj[i][0]; +- pic_param->sprite_trajectory_dv[i] = s->sprite_traj[i][1]; ++ pic_param->sprite_trajectory_du[i] = s->sprite_traj[i][0]; ++ pic_param->sprite_trajectory_dv[i] = s->sprite_traj[i][1]; + } +- pic_param->quant_precision = s->quant_precision; +- pic_param->vop_fields.value = 0; /* reset all bits */ +- pic_param->vop_fields.bits.vop_coding_type = s->pict_type - FF_I_TYPE; +- pic_param->vop_fields.bits.backward_reference_vop_coding_type = s->pict_type == FF_B_TYPE ? s->next_picture.pict_type - FF_I_TYPE : 0; +- pic_param->vop_fields.bits.vop_rounding_type = s->no_rounding; +- pic_param->vop_fields.bits.intra_dc_vlc_thr = mpeg4_get_intra_dc_vlc_thr(s); +- pic_param->vop_fields.bits.top_field_first = s->top_field_first; +- pic_param->vop_fields.bits.alternate_vertical_scan_flag = s->alternate_scan; +- pic_param->vop_fcode_forward = s->f_code; +- pic_param->vop_fcode_backward = s->b_code; +- pic_param->vop_time_increment_resolution = avctx->time_base.den; +- pic_param->num_macroblocks_in_gob = s->mb_width * ff_h263_get_gob_height(s); +- pic_param->num_gobs_in_vop = (s->mb_width * s->mb_height) / pic_param->num_macroblocks_in_gob; +- pic_param->TRB = s->pb_time; +- pic_param->TRD = s->pp_time; ++ pic_param->quant_precision = s->quant_precision; ++ pic_param->BFV(vop_fields,value) = 0; /* reset all bits */ ++ pic_param->BFM(vop_fields,bits,vop_coding_type) = s->pict_type - FF_I_TYPE; ++ pic_param->BFM(vop_fields,bits,backward_reference_vop_coding_type) = s->pict_type == FF_B_TYPE ? s->next_picture.pict_type - FF_I_TYPE : 0; ++ pic_param->BFM(vop_fields,bits,vop_rounding_type) = s->no_rounding; ++ pic_param->BFM(vop_fields,bits,intra_dc_vlc_thr) = mpeg4_get_intra_dc_vlc_thr(s); ++ pic_param->BFM(vop_fields,bits,top_field_first) = s->top_field_first; ++ pic_param->BFM(vop_fields,bits,alternate_vertical_scan_flag) = s->alternate_scan; ++ pic_param->vop_fcode_forward = s->f_code; ++ pic_param->vop_fcode_backward = s->b_code; ++ NEW(pic_param->vop_time_increment_resolution = avctx->time_base.den); ++ pic_param->num_macroblocks_in_gob = s->mb_width * ff_h263_get_gob_height(s); ++ pic_param->num_gobs_in_vop = (s->mb_width * s->mb_height) / pic_param->num_macroblocks_in_gob; ++ pic_param->TRB = s->pb_time; ++ pic_param->TRD = s->pp_time; + + if (s->pict_type == FF_B_TYPE) + pic_param->backward_reference_picture = ff_vaapi_get_surface_id(&s->next_picture); +@@ -98,7 +98,7 @@ static int vaapi_mpeg4_start_frame(AVCodecContext *avctx, av_unused const uint8_ + + /* Fill in VAIQMatrixBufferMPEG4 */ + /* Only the first inverse quantisation method uses the weighthing matrices */ +- if (pic_param->vol_fields.bits.quant_type) { ++ if (pic_param->BFM(vol_fields,bits,quant_type)) { + iq_matrix = ff_vaapi_alloc_iq_matrix(vactx, sizeof(VAIQMatrixBufferMPEG4)); + if (!iq_matrix) + return -1; +diff --git a/libavcodec/vaapi_vc1.c b/libavcodec/vaapi_vc1.c +index 50a4ba2..6e319fc 100644 +--- a/libavcodec/vaapi_vc1.c ++++ b/libavcodec/vaapi_vc1.c +@@ -146,100 +146,100 @@ static int vaapi_vc1_start_frame(AVCodecContext *avctx, av_unused const uint8_t + pic_param = ff_vaapi_alloc_pic_param(vactx, sizeof(VAPictureParameterBufferVC1)); + if (!pic_param) + return -1; +- pic_param->forward_reference_picture = VA_INVALID_ID; +- pic_param->backward_reference_picture = VA_INVALID_ID; +- pic_param->inloop_decoded_picture = VA_INVALID_ID; +- pic_param->sequence_fields.value = 0; /* reset all bits */ +- pic_param->sequence_fields.bits.pulldown = v->broadcast; +- pic_param->sequence_fields.bits.interlace = v->interlace; +- pic_param->sequence_fields.bits.tfcntrflag = v->tfcntrflag; +- pic_param->sequence_fields.bits.finterpflag = v->finterpflag; +- pic_param->sequence_fields.bits.psf = v->psf; +- pic_param->sequence_fields.bits.multires = v->multires; +- pic_param->sequence_fields.bits.overlap = v->overlap; +- pic_param->sequence_fields.bits.syncmarker = s->resync_marker; +- pic_param->sequence_fields.bits.rangered = v->rangered; +- pic_param->sequence_fields.bits.max_b_frames = s->avctx->max_b_frames; +- pic_param->coded_width = s->avctx->coded_width; +- pic_param->coded_height = s->avctx->coded_height; +- pic_param->entrypoint_fields.value = 0; /* reset all bits */ +- pic_param->entrypoint_fields.bits.broken_link = v->broken_link; +- pic_param->entrypoint_fields.bits.closed_entry = v->closed_entry; +- pic_param->entrypoint_fields.bits.panscan_flag = v->panscanflag; +- pic_param->entrypoint_fields.bits.loopfilter = s->loop_filter; +- pic_param->conditional_overlap_flag = v->condover; +- pic_param->fast_uvmc_flag = v->fastuvmc; +- pic_param->range_mapping_fields.value = 0; /* reset all bits */ +- pic_param->range_mapping_fields.bits.luma_flag = v->range_mapy_flag; +- pic_param->range_mapping_fields.bits.luma = v->range_mapy; +- pic_param->range_mapping_fields.bits.chroma_flag = v->range_mapuv_flag; +- pic_param->range_mapping_fields.bits.chroma = v->range_mapuv; +- pic_param->b_picture_fraction = v->bfraction_lut_index; +- pic_param->cbp_table = v->cbpcy_vlc ? v->cbpcy_vlc - ff_vc1_cbpcy_p_vlc : 0; +- pic_param->mb_mode_table = 0; /* XXX: interlaced frame */ +- pic_param->range_reduction_frame = v->rangeredfrm; +- pic_param->rounding_control = v->rnd; +- pic_param->post_processing = v->postproc; +- pic_param->picture_resolution_index = v->respic; +- pic_param->luma_scale = v->lumscale; +- pic_param->luma_shift = v->lumshift; +- pic_param->picture_fields.value = 0; /* reset all bits */ +- pic_param->picture_fields.bits.picture_type = vc1_get_PTYPE(v); +- pic_param->picture_fields.bits.frame_coding_mode = v->fcm; +- pic_param->picture_fields.bits.top_field_first = v->tff; +- pic_param->picture_fields.bits.is_first_field = v->fcm == 0; /* XXX: interlaced frame */ +- pic_param->picture_fields.bits.intensity_compensation = v->mv_mode == MV_PMODE_INTENSITY_COMP; +- pic_param->raw_coding.value = 0; /* reset all bits */ +- pic_param->raw_coding.flags.mv_type_mb = v->mv_type_is_raw; +- pic_param->raw_coding.flags.direct_mb = v->dmb_is_raw; +- pic_param->raw_coding.flags.skip_mb = v->skip_is_raw; +- pic_param->raw_coding.flags.field_tx = 0; /* XXX: interlaced frame */ +- pic_param->raw_coding.flags.forward_mb = 0; /* XXX: interlaced frame */ +- pic_param->raw_coding.flags.ac_pred = v->acpred_is_raw; +- pic_param->raw_coding.flags.overflags = v->overflg_is_raw; +- pic_param->bitplane_present.value = 0; /* reset all bits */ +- pic_param->bitplane_present.flags.bp_mv_type_mb = vc1_has_MVTYPEMB_bitplane(v); +- pic_param->bitplane_present.flags.bp_direct_mb = vc1_has_DIRECTMB_bitplane(v); +- pic_param->bitplane_present.flags.bp_skip_mb = vc1_has_SKIPMB_bitplane(v); +- pic_param->bitplane_present.flags.bp_field_tx = 0; /* XXX: interlaced frame */ +- pic_param->bitplane_present.flags.bp_forward_mb = 0; /* XXX: interlaced frame */ +- pic_param->bitplane_present.flags.bp_ac_pred = vc1_has_ACPRED_bitplane(v); +- pic_param->bitplane_present.flags.bp_overflags = vc1_has_OVERFLAGS_bitplane(v); +- pic_param->reference_fields.value = 0; /* reset all bits */ +- pic_param->reference_fields.bits.reference_distance_flag = v->refdist_flag; +- pic_param->reference_fields.bits.reference_distance = 0; /* XXX: interlaced frame */ +- pic_param->reference_fields.bits.num_reference_pictures = 0; /* XXX: interlaced frame */ +- pic_param->reference_fields.bits.reference_field_pic_indicator = 0; /* XXX: interlaced frame */ +- pic_param->mv_fields.value = 0; /* reset all bits */ +- pic_param->mv_fields.bits.mv_mode = vc1_get_MVMODE(v); +- pic_param->mv_fields.bits.mv_mode2 = vc1_get_MVMODE2(v); +- pic_param->mv_fields.bits.mv_table = s->mv_table_index; +- pic_param->mv_fields.bits.two_mv_block_pattern_table = 0; /* XXX: interlaced frame */ +- pic_param->mv_fields.bits.four_mv_switch = 0; /* XXX: interlaced frame */ +- pic_param->mv_fields.bits.four_mv_block_pattern_table = 0; /* XXX: interlaced frame */ +- pic_param->mv_fields.bits.extended_mv_flag = v->extended_mv; +- pic_param->mv_fields.bits.extended_mv_range = v->mvrange; +- pic_param->mv_fields.bits.extended_dmv_flag = v->extended_dmv; +- pic_param->mv_fields.bits.extended_dmv_range = 0; /* XXX: interlaced frame */ +- pic_param->pic_quantizer_fields.value = 0; /* reset all bits */ +- pic_param->pic_quantizer_fields.bits.dquant = v->dquant; +- pic_param->pic_quantizer_fields.bits.quantizer = v->quantizer_mode; +- pic_param->pic_quantizer_fields.bits.half_qp = v->halfpq; +- pic_param->pic_quantizer_fields.bits.pic_quantizer_scale = v->pq; +- pic_param->pic_quantizer_fields.bits.pic_quantizer_type = v->pquantizer; +- pic_param->pic_quantizer_fields.bits.dq_frame = v->dquantfrm; +- pic_param->pic_quantizer_fields.bits.dq_profile = v->dqprofile; +- pic_param->pic_quantizer_fields.bits.dq_sb_edge = v->dqprofile == DQPROFILE_SINGLE_EDGE ? v->dqsbedge : 0; +- pic_param->pic_quantizer_fields.bits.dq_db_edge = v->dqprofile == DQPROFILE_DOUBLE_EDGES ? v->dqsbedge : 0; +- pic_param->pic_quantizer_fields.bits.dq_binary_level = v->dqbilevel; +- pic_param->pic_quantizer_fields.bits.alt_pic_quantizer = v->altpq; +- pic_param->transform_fields.value = 0; /* reset all bits */ +- pic_param->transform_fields.bits.variable_sized_transform_flag = v->vstransform; +- pic_param->transform_fields.bits.mb_level_transform_type_flag = v->ttmbf; +- pic_param->transform_fields.bits.frame_level_transform_type = v->ttfrm; +- pic_param->transform_fields.bits.transform_ac_codingset_idx1 = v->c_ac_table_index; +- pic_param->transform_fields.bits.transform_ac_codingset_idx2 = v->y_ac_table_index; +- pic_param->transform_fields.bits.intra_transform_dc_table = v->s.dc_table_index; ++ pic_param->forward_reference_picture = VA_INVALID_ID; ++ pic_param->backward_reference_picture = VA_INVALID_ID; ++ pic_param->inloop_decoded_picture = VA_INVALID_ID; ++ pic_param->BFV(sequence_fields,value) = 0; /* reset all bits */ ++ NEW(pic_param->BFM(sequence_fields,bits,pulldown) = v->broadcast); ++ pic_param->BFM(sequence_fields,bits,interlace) = v->interlace; ++ NEW(pic_param->BFM(sequence_fields,bits,tfcntrflag) = v->tfcntrflag); ++ NEW(pic_param->BFM(sequence_fields,bits,finterpflag) = v->finterpflag); ++ NEW(pic_param->BFM(sequence_fields,bits,psf) = v->psf); ++ NEW(pic_param->BFM(sequence_fields,bits,multires) = v->multires); ++ pic_param->BFM(sequence_fields,bits,overlap) = v->overlap; ++ pic_param->BFM(sequence_fields,bits,syncmarker) = s->resync_marker; ++ NEW(pic_param->BFM(sequence_fields,bits,rangered) = v->rangered); ++ NEW(pic_param->BFM(sequence_fields,bits,max_b_frames) = s->avctx->max_b_frames); ++ pic_param->coded_width = s->avctx->coded_width; ++ pic_param->coded_height = s->avctx->coded_height; ++ NEW(pic_param->BFV(entrypoint_fields,value) = 0); /* reset all bits */ ++ pic_param->BFM(entrypoint_fields,bits,broken_link) = v->broken_link; ++ pic_param->BFM(entrypoint_fields,bits,closed_entry) = v->closed_entry; ++ NEW(pic_param->BFM(entrypoint_fields,bits,panscan_flag) = v->panscanflag); ++ pic_param->BFM(entrypoint_fields,bits,loopfilter) = s->loop_filter; ++ pic_param->conditional_overlap_flag = v->condover; ++ pic_param->fast_uvmc_flag = v->fastuvmc; ++ pic_param->BFV(range_mapping_fields,value) = 0; /* reset all bits */ ++ pic_param->BFMP(range_mapping,range_mapping_fields,bits,luma_flag) = v->range_mapy_flag; ++ pic_param->BFMP(range_mapping,range_mapping_fields,bits,luma) = v->range_mapy; ++ pic_param->BFMP(range_mapping,range_mapping_fields,bits,chroma_flag) = v->range_mapuv_flag; ++ pic_param->BFMP(range_mapping,range_mapping_fields,bits,chroma) = v->range_mapuv; ++ pic_param->b_picture_fraction = v->bfraction_lut_index; ++ pic_param->cbp_table = v->cbpcy_vlc ? v->cbpcy_vlc - ff_vc1_cbpcy_p_vlc : 0; ++ pic_param->mb_mode_table = 0; /* XXX: interlaced frame */ ++ pic_param->range_reduction_frame = v->rangeredfrm; ++ pic_param->rounding_control = v->rnd; ++ pic_param->post_processing = v->postproc; ++ pic_param->picture_resolution_index = v->respic; ++ pic_param->luma_scale = v->lumscale; ++ pic_param->luma_shift = v->lumshift; ++ pic_param->BFV(picture_fields,value) = 0; /* reset all bits */ ++ pic_param->BFM(picture_fields,bits,picture_type) = vc1_get_PTYPE(v); ++ pic_param->BFM(picture_fields,bits,frame_coding_mode) = v->fcm; ++ pic_param->BFM(picture_fields,bits,top_field_first) = v->tff; ++ pic_param->BFM(picture_fields,bits,is_first_field) = v->fcm == 0; /* XXX: interlaced frame */ ++ pic_param->BFM(picture_fields,bits,intensity_compensation) = v->mv_mode == MV_PMODE_INTENSITY_COMP; ++ pic_param->BFV(V_raw_coding,value) = 0; /* reset all bits */ ++ pic_param->BFM(M_raw_coding,flags,mv_type_mb) = v->mv_type_is_raw; ++ pic_param->BFM(M_raw_coding,flags,direct_mb) = v->dmb_is_raw; ++ pic_param->BFM(M_raw_coding,flags,skip_mb) = v->skip_is_raw; ++ pic_param->BFM(M_raw_coding,flags,field_tx) = 0; /* XXX: interlaced frame */ ++ pic_param->BFM(M_raw_coding,flags,forward_mb) = 0; /* XXX: interlaced frame */ ++ pic_param->BFM(M_raw_coding,flags,ac_pred) = v->acpred_is_raw; ++ pic_param->BFM(M_raw_coding,flags,overflags) = v->overflg_is_raw; ++ pic_param->BFV(V_bitplane_present,value) = 0; /* reset all bits */ ++ pic_param->BFM(M_bitplane_present,flags,bp_mv_type_mb) = vc1_has_MVTYPEMB_bitplane(v); ++ pic_param->BFM(M_bitplane_present,flags,bp_direct_mb) = vc1_has_DIRECTMB_bitplane(v); ++ pic_param->BFM(M_bitplane_present,flags,bp_skip_mb) = vc1_has_SKIPMB_bitplane(v); ++ pic_param->BFM(M_bitplane_present,flags,bp_field_tx) = 0; /* XXX: interlaced frame */ ++ pic_param->BFM(M_bitplane_present,flags,bp_forward_mb) = 0; /* XXX: interlaced frame */ ++ pic_param->BFM(M_bitplane_present,flags,bp_ac_pred) = vc1_has_ACPRED_bitplane(v); ++ pic_param->BFM(M_bitplane_present,flags,bp_overflags) = vc1_has_OVERFLAGS_bitplane(v); ++ pic_param->BFV(reference_fields,value) = 0; /* reset all bits */ ++ pic_param->BFM(reference_fields,bits,reference_distance_flag) = v->refdist_flag; ++ pic_param->BFM(reference_fields,bits,reference_distance) = 0; /* XXX: interlaced frame */ ++ pic_param->BFM(reference_fields,bits,num_reference_pictures) = 0; /* XXX: interlaced frame */ ++ pic_param->BFM(reference_fields,bits,reference_field_pic_indicator) = 0; /* XXX: interlaced frame */ ++ pic_param->BFV(mv_fields,value) = 0; /* reset all bits */ ++ pic_param->BFM(mv_fields,bits,mv_mode) = vc1_get_MVMODE(v); ++ pic_param->BFM(mv_fields,bits,mv_mode2) = vc1_get_MVMODE2(v); ++ pic_param->BFM(mv_fields,bits,mv_table) = s->mv_table_index; ++ pic_param->BFM(mv_fields,bits,two_mv_block_pattern_table) = 0; /* XXX: interlaced frame */ ++ pic_param->BFM(mv_fields,bits,four_mv_switch) = 0; /* XXX: interlaced frame */ ++ pic_param->BFM(mv_fields,bits,four_mv_block_pattern_table) = 0; /* XXX: interlaced frame */ ++ pic_param->BFM(mv_fields,bits,extended_mv_flag) = v->extended_mv; ++ pic_param->BFM(mv_fields,bits,extended_mv_range) = v->mvrange; ++ pic_param->BFM(mv_fields,bits,extended_dmv_flag) = v->extended_dmv; ++ pic_param->BFM(mv_fields,bits,extended_dmv_range) = 0; /* XXX: interlaced frame */ ++ pic_param->BFV(pic_quantizer_fields,value) = 0; /* reset all bits */ ++ pic_param->BFM(pic_quantizer_fields,bits,dquant) = v->dquant; ++ pic_param->BFM(pic_quantizer_fields,bits,quantizer) = v->quantizer_mode; ++ pic_param->BFM(pic_quantizer_fields,bits,half_qp) = v->halfpq; ++ pic_param->BFM(pic_quantizer_fields,bits,pic_quantizer_scale) = v->pq; ++ pic_param->BFM(pic_quantizer_fields,bits,pic_quantizer_type) = v->pquantizer; ++ pic_param->BFM(pic_quantizer_fields,bits,dq_frame) = v->dquantfrm; ++ pic_param->BFM(pic_quantizer_fields,bits,dq_profile) = v->dqprofile; ++ pic_param->BFM(pic_quantizer_fields,bits,dq_sb_edge) = v->dqprofile == DQPROFILE_SINGLE_EDGE ? v->dqsbedge : 0; ++ pic_param->BFM(pic_quantizer_fields,bits,dq_db_edge) = v->dqprofile == DQPROFILE_DOUBLE_EDGES ? v->dqsbedge : 0; ++ pic_param->BFM(pic_quantizer_fields,bits,dq_binary_level) = v->dqbilevel; ++ pic_param->BFM(pic_quantizer_fields,bits,alt_pic_quantizer) = v->altpq; ++ pic_param->BFV(transform_fields,value) = 0; /* reset all bits */ ++ pic_param->BFM(transform_fields,bits,variable_sized_transform_flag) = v->vstransform; ++ pic_param->BFM(transform_fields,bits,mb_level_transform_type_flag) = v->ttmbf; ++ pic_param->BFM(transform_fields,bits,frame_level_transform_type) = v->ttfrm; ++ pic_param->BFM(transform_fields,bits,transform_ac_codingset_idx1) = v->c_ac_table_index; ++ pic_param->BFM(transform_fields,bits,transform_ac_codingset_idx2) = v->y_ac_table_index; ++ pic_param->BFM(transform_fields,bits,intra_transform_dc_table) = v->s.dc_table_index; + + switch (s->pict_type) { + case FF_B_TYPE: +@@ -250,29 +250,29 @@ static int vaapi_vc1_start_frame(AVCodecContext *avctx, av_unused const uint8_t + break; + } + +- if (pic_param->bitplane_present.value) { ++ if (pic_param->BFV(V_bitplane_present,value)) { + uint8_t *bitplane; + const uint8_t *ff_bp[3]; + int x, y, n; + + switch (s->pict_type) { + case FF_P_TYPE: +- ff_bp[0] = pic_param->bitplane_present.flags.bp_direct_mb ? v->direct_mb_plane : NULL; +- ff_bp[1] = pic_param->bitplane_present.flags.bp_skip_mb ? s->mbskip_table : NULL; +- ff_bp[2] = pic_param->bitplane_present.flags.bp_mv_type_mb ? v->mv_type_mb_plane : NULL; ++ ff_bp[0] = pic_param->BFM(M_bitplane_present,flags,bp_direct_mb) ? v->direct_mb_plane : NULL; ++ ff_bp[1] = pic_param->BFM(M_bitplane_present,flags,bp_skip_mb) ? s->mbskip_table : NULL; ++ ff_bp[2] = pic_param->BFM(M_bitplane_present,flags,bp_mv_type_mb) ? v->mv_type_mb_plane : NULL; + break; + case FF_B_TYPE: + if (!v->bi_type) { +- ff_bp[0] = pic_param->bitplane_present.flags.bp_direct_mb ? v->direct_mb_plane : NULL; +- ff_bp[1] = pic_param->bitplane_present.flags.bp_skip_mb ? s->mbskip_table : NULL; ++ ff_bp[0] = pic_param->BFM(M_bitplane_present,flags,bp_direct_mb) ? v->direct_mb_plane : NULL; ++ ff_bp[1] = pic_param->BFM(M_bitplane_present,flags,bp_skip_mb) ? s->mbskip_table : NULL; + ff_bp[2] = NULL; /* XXX: interlaced frame (FORWARD plane) */ + break; + } + /* fall-through (BI-type) */ + case FF_I_TYPE: + ff_bp[0] = NULL; /* XXX: interlaced frame (FIELDTX plane) */ +- ff_bp[1] = pic_param->bitplane_present.flags.bp_ac_pred ? v->acpred_plane : NULL; +- ff_bp[2] = pic_param->bitplane_present.flags.bp_overflags ? v->over_flags_plane : NULL; ++ ff_bp[1] = pic_param->BFM(M_bitplane_present,flags,bp_ac_pred) ? v->acpred_plane : NULL; ++ ff_bp[2] = pic_param->BFM(M_bitplane_present,flags,bp_overflags) ? v->over_flags_plane : NULL; + break; + default: + ff_bp[0] = NULL; +diff --git a/libvo/vo_vaapi.c b/libvo/vo_vaapi.c +index 3fe563a..d653b53 100644 +--- a/libvo/vo_vaapi.c ++++ b/libvo/vo_vaapi.c +@@ -45,7 +45,11 @@ + #include <assert.h> + #include <X11/Xlib.h> + #include <X11/Xutil.h> ++#if CONFIG_VAAPI_OLD ++#include <va_x11.h> ++#else + #include <va/va_x11.h> ++#endif + #if CONFIG_VAAPI_GLX + #include <va/va_glx.h> + #endif diff --git a/media-video/mplayer/files/vaapi/04-mplayer-vdpau.patch b/media-video/mplayer/files/vaapi/04-mplayer-vdpau.patch new file mode 100644 index 0000000..c721609 --- /dev/null +++ b/media-video/mplayer/files/vaapi/04-mplayer-vdpau.patch @@ -0,0 +1,1199 @@ +diff --git a/configure b/configure +index 39fef26..3a97c6e 100755 +--- a/configure ++++ b/configure +@@ -549,7 +549,7 @@ _libopencore_amrnb=auto + _libavbsfs_all=$(sed -n 's/^[^#]*BSF.*(.*, *\(.*\)).*/\1_bsf/p' libavcodec/allcodecs.c | tr '[a-z]' '[A-Z]') + _libavbsfs=$_libavbsfs_all + _libavhwaccels_all=$(sed -n 's/^[^#]*HWACCEL.*(.*, *\(.*\)).*/\1_hwaccel/p' libavcodec/allcodecs.c | tr '[a-z]' '[A-Z]') +-_libavhwaccels=$(for h in $_libavhwaccels_all; do case $h in (*_VAAPI_HWACCEL) echo $h;; esac; done) ++_libavhwaccels=$(for h in $_libavhwaccels_all; do case $h in (*_VDPAU_HWACCEL|*_VAAPI_HWACCEL) echo $h;; esac; done) + _libavdemuxers_all=$(sed -n 's/^[^#]*DEMUX.*(.*, *\(.*\)).*/\1_demuxer/p' libavformat/allformats.c | tr '[a-z]' '[A-Z]') + _libavdemuxers=$(echo $_libavdemuxers_all | sed -e 's/ LIB[A-Z0-9_]*_DEMUXER//g' -e s/REDIR_DEMUXER// -e s/AVISYNTH_DEMUXER//) + _libavmuxers_all=$(sed -n 's/^[^#]*_MUX.*(.*, *\(.*\)).*/\1_muxer/p' libavformat/allformats.c | tr '[a-z]' '[A-Z]') +@@ -4500,7 +4500,7 @@ if test "$_vdpau" = yes ; then + else + def_vdpau='#define CONFIG_VDPAU 0' + _novomodules="vdpau $_novomodules" +- _libavdecoders=$(echo $_libavdecoders | sed -e "s/\(MPEG\|MPEG[124]\|H26[34]\|WMV3\|VC1\)_VDPAU_DECODER//g") ++ _libavhwaccels=$(echo $_libavhwaccels | sed -e "s/\(MPEG[124]\|H26[34]\|WMV3\|VC1\)_VDPAU_HWACCEL//g") + fi + echores "$_vdpau" + +diff --git a/etc/codecs.conf b/etc/codecs.conf +index 15c6e8d..8f6a122 100644 +--- a/etc/codecs.conf ++++ b/etc/codecs.conf +@@ -146,6 +146,7 @@ videocodec ffmpeg1 + fourcc m1v1 + driver ffmpeg + dll "mpeg1video" ++ out VDPAU_MPEG1 + out YV12,I420,IYUV + + videocodec ffmpeg2 +@@ -182,6 +183,7 @@ videocodec ffmpeg2 + driver ffmpeg + dll "mpeg2video" + out VAAPI_MPEG2 ++ out VDPAU_MPEG2 + out YV12,I420,IYUV + out 422P,444P + +@@ -221,6 +223,7 @@ videocodec ffmpeg12 + fourcc slif ; SoftLab MPEG-2 I-frames Codec + driver ffmpeg + dll "mpegvideo" ++ out VDPAU_MPEG1,VDPAU_MPEG2 + out YV12,I420,IYUV + out 422P,444P + +@@ -307,44 +310,6 @@ videocodec ffmpeg12mc + out IDCT_MPEG2 + out MOCO_MPEG2 + +-videocodec ffmpeg12vdpau +- info "FFmpeg MPEG-1/2 (VDPAU)" +- status working +- format 0x10000001 ; MPEG-1 +- format 0x10000002 ; MPEG-2 +- fourcc mpg1,mpg2,MPG2 +- fourcc PIM1 ; Pinnacle hardware-MPEG-1 +- fourcc PIM2 ; Pinnacle hardware-MPEG-2 +- fourcc "DVR " +- fourcc hdv2 +- fourcc MPEG +- fourcc hdv1 +- fourcc hdv3 ; HDV 1080i50 +- fourcc hdv5 ; HDV 720p25 +- fourcc mx5p ; MPEG IMX 625/50 (50 Mb/s) +- fourcc MMES,mmes ; matrox mpeg2 in avi +- fourcc hdv6,hdv7,hdv8 +- fourcc xdv1,xdv2,xdv3 +- fourcc xdv4,xdv5,xdv6 +- fourcc xdv7,xdv8,xdv9 +- fourcc xdva,xdvb,xdvc +- fourcc xdvd,xdve,xdvf +- fourcc xd5a,xd5b,xd5c +- fourcc xd5d,xd5e,xd5f +- fourcc xd59 +- fourcc mx5n,mx4n,mx4p +- fourcc mx3n,mx3p +- fourcc AVmp +- fourcc mp2v,mpgv +- fourcc LMP2 ; Lead mpeg2 in avi +- fourcc m2v1,m1v1 +- driver ffmpeg +- dll "mpegvideo_vdpau" +- out VDPAU_MPEG1 +- out VDPAU_MPEG2 +- +-; we have only native open source codecs for these: +- + videocodec ffnuv + info "NuppelVideo" + status working +@@ -883,15 +849,8 @@ videocodec ffwmv3 + driver ffmpeg + dll wmv3 + out VAAPI_WMV3 +- out YV12,I420,IYUV +- +-videocodec ffwmv3vdpau +- info "FFmpeg WMV3/WMV9 (VDPAU)" +- status buggy +- fourcc WMV3,wmv3 +- driver ffmpeg +- dll wmv3_vdpau + out VDPAU_WMV3 ++ out YV12,I420,IYUV + + videocodec ffvc1 + info "FFmpeg WVC1" +@@ -901,16 +860,8 @@ videocodec ffvc1 + driver ffmpeg + dll vc1 + out VAAPI_VC1 +- out YV12,I420,IYUV +- +-videocodec ffvc1vdpau +- info "FFmpeg WVC1 (VDPAU)" +- status buggy +- fourcc WVC1,wvc1,WMVA +- fourcc vc-1,VC-1 +- driver ffmpeg +- dll vc1_vdpau + out VDPAU_VC1 ++ out YV12,I420,IYUV + + videocodec ffh264 + info "FFmpeg H.264" +@@ -923,19 +874,8 @@ videocodec ffh264 + driver ffmpeg + dll h264 + out VAAPI_H264 +- out YV12,I420,IYUV +- +-videocodec ffh264vdpau +- info "FFmpeg H.264 (VDPAU)" +- status working +- fourcc H264,h264 +- fourcc X264,x264 +- fourcc avc1,AVC1 +- fourcc davc,DAVC +- format 0x10000005 +- driver ffmpeg +- dll h264_vdpau + out VDPAU_H264 ++ out YV12,I420,IYUV + + videocodec coreavcwindows + info "CoreAVC H.264 for x86 - http://corecodec.org/" +@@ -994,39 +933,8 @@ videocodec ffodivx + driver ffmpeg + dll mpeg4 ;opendivx + out VAAPI_MPEG4 +- out YV12,I420,IYUV +- +-videocodec ffodivxvdpau +- info "FFmpeg MPEG-4,DIVX-4/5 (VDPAU)" +- status working +- fourcc FMP4,fmp4 +- fourcc DIVX,divx +- fourcc DIV1,div1 divx +- fourcc MP4S,mp4s ; ISO MPEG-4 Video V1 +- fourcc M4S2,m4s2 +- fourcc xvid,XVID,XviD,XVIX +- fourcc DX50,dx50,BLZ0 DX50 +- fourcc mp4v,MP4V +- format 0x4 +- fourcc UMP4 +- fourcc RMP4 +- fourcc 3IV2,3iv2 ; 3ivx Delta 4 +- fourcc DXGM +- fourcc SEDG ; diskless camcorder Samsung Miniket VP-M110 +- fourcc SMP4,smp4 ; Samsung SMP4 video codec +- fourcc VIDM ; vidm 4.01 codec +- format 0x10000004 ; mpeg 4 es +- fourcc m4cc,M4CC +- fourcc hdx4,HDX4 +- fourcc FVFW,fvfw +- fourcc FFDS +- fourcc DCOD,MVXM,EM4A,PM4V +- fourcc M4T3,DMK2,DIGI,INMC +- fourcc EPHV,SN40 +- fourcc uldx,ULDX,VSPX +- driver ffmpeg +- dll mpeg4_vdpau + out VDPAU_MPEG4 ++ out YV12,I420,IYUV + + videocodec ffwv1f + info "WV1F MPEG-4" +diff --git a/fmt-conversion.c b/fmt-conversion.c +index a9ba43d..cf5566d 100644 +--- a/fmt-conversion.c ++++ b/fmt-conversion.c +@@ -81,12 +81,6 @@ static const struct { + + {IMGFMT_XVMC_MOCO_MPEG2, PIX_FMT_XVMC_MPEG2_MC}, + {IMGFMT_XVMC_IDCT_MPEG2, PIX_FMT_XVMC_MPEG2_IDCT}, +- {IMGFMT_VDPAU_MPEG1, PIX_FMT_VDPAU_MPEG1}, +- {IMGFMT_VDPAU_MPEG2, PIX_FMT_VDPAU_MPEG2}, +- {IMGFMT_VDPAU_H264, PIX_FMT_VDPAU_H264}, +- {IMGFMT_VDPAU_WMV3, PIX_FMT_VDPAU_WMV3}, +- {IMGFMT_VDPAU_VC1, PIX_FMT_VDPAU_VC1}, +- {IMGFMT_VDPAU_MPEG4, PIX_FMT_VDPAU_MPEG4}, + + /* VA API formats */ + {IMGFMT_VAAPI_MPEG2, PIX_FMT_VAAPI_VLD, CODEC_ID_MPEG2VIDEO}, +@@ -98,6 +92,14 @@ static const struct { + {IMGFMT_VAAPI_WMV3, PIX_FMT_VAAPI_VLD, CODEC_ID_WMV3}, + {IMGFMT_VAAPI_VC1, PIX_FMT_VAAPI_VLD, CODEC_ID_VC1}, + ++ /* VDPAU formats */ ++ {IMGFMT_VDPAU_MPEG1, PIX_FMT_VDPAU, CODEC_ID_MPEG1VIDEO}, ++ {IMGFMT_VDPAU_MPEG2, PIX_FMT_VDPAU, CODEC_ID_MPEG2VIDEO}, ++ {IMGFMT_VDPAU_MPEG4, PIX_FMT_VDPAU, CODEC_ID_MPEG4}, ++ {IMGFMT_VDPAU_H264, PIX_FMT_VDPAU, CODEC_ID_H264}, ++ {IMGFMT_VDPAU_WMV3, PIX_FMT_VDPAU, CODEC_ID_WMV3}, ++ {IMGFMT_VDPAU_VC1, PIX_FMT_VDPAU, CODEC_ID_VC1}, ++ + {0, PIX_FMT_NONE} + }; + +diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c +index 43e49d1..646c590 100644 +--- a/libavcodec/allcodecs.c ++++ b/libavcodec/allcodecs.c +@@ -61,6 +61,13 @@ void avcodec_register_all(void) + REGISTER_HWACCEL (VC1_VAAPI, vc1_vaapi); + REGISTER_HWACCEL (WMV3_VAAPI, wmv3_vaapi); + ++ REGISTER_HWACCEL (H264_VDPAU, h264_vdpau); ++ REGISTER_HWACCEL (MPEG1_VDPAU, mpeg1_vdpau); ++ REGISTER_HWACCEL (MPEG2_VDPAU, mpeg2_vdpau); ++ REGISTER_HWACCEL (MPEG4_VDPAU, mpeg4_vdpau); ++ REGISTER_HWACCEL (VC1_VDPAU, vc1_vdpau); ++ REGISTER_HWACCEL (WMV3_VDPAU, wmv3_vdpau); ++ + /* video codecs */ + REGISTER_DECODER (AASC, aasc); + REGISTER_DECODER (AMV, amv); +@@ -108,7 +115,6 @@ void avcodec_register_all(void) + REGISTER_DECODER (H263I, h263i); + REGISTER_ENCODER (H263P, h263p); + REGISTER_DECODER (H264, h264); +- REGISTER_DECODER (H264_VDPAU, h264_vdpau); + REGISTER_ENCDEC (HUFFYUV, huffyuv); + REGISTER_DECODER (IDCIN, idcin); + REGISTER_DECODER (INDEO2, indeo2); +@@ -128,10 +134,7 @@ void avcodec_register_all(void) + REGISTER_ENCDEC (MPEG1VIDEO, mpeg1video); + REGISTER_ENCDEC (MPEG2VIDEO, mpeg2video); + REGISTER_ENCDEC (MPEG4, mpeg4); +- REGISTER_DECODER (MPEG4_VDPAU, mpeg4_vdpau); + REGISTER_DECODER (MPEGVIDEO, mpegvideo); +- REGISTER_DECODER (MPEG_VDPAU, mpeg_vdpau); +- REGISTER_DECODER (MPEG1_VDPAU, mpeg1_vdpau); + REGISTER_ENCDEC (MSMPEG4V1, msmpeg4v1); + REGISTER_ENCDEC (MSMPEG4V2, msmpeg4v2); + REGISTER_ENCDEC (MSMPEG4V3, msmpeg4v3); +@@ -182,7 +185,6 @@ void avcodec_register_all(void) + REGISTER_DECODER (V210X, v210x); + REGISTER_DECODER (VB, vb); + REGISTER_DECODER (VC1, vc1); +- REGISTER_DECODER (VC1_VDPAU, vc1_vdpau); + REGISTER_DECODER (VCR1, vcr1); + REGISTER_DECODER (VMDVIDEO, vmdvideo); + REGISTER_DECODER (VMNC, vmnc); +@@ -195,7 +197,6 @@ void avcodec_register_all(void) + REGISTER_ENCDEC (WMV1, wmv1); + REGISTER_ENCDEC (WMV2, wmv2); + REGISTER_DECODER (WMV3, wmv3); +- REGISTER_DECODER (WMV3_VDPAU, wmv3_vdpau); + REGISTER_DECODER (WNV1, wnv1); + REGISTER_DECODER (XAN_WC3, xan_wc3); + REGISTER_DECODER (XL, xl); +diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h +index 81f9d98..d63f5f3 100644 +--- a/libavcodec/avcodec.h ++++ b/libavcodec/avcodec.h +@@ -614,10 +614,6 @@ typedef struct RcOverride{ + */ + #define CODEC_CAP_SMALL_LAST_FRAME 0x0040 + /** +- * Codec can export data for HW decoding (VDPAU). +- */ +-#define CODEC_CAP_HWACCEL_VDPAU 0x0080 +-/** + * Codec can output multiple frames per AVPacket + */ + #define CODEC_CAP_SUBFRAMES 0x0100 +diff --git a/libavcodec/error_resilience.c b/libavcodec/error_resilience.c +index 8c6ac9d..2f08ddb 100644 +--- a/libavcodec/error_resilience.c ++++ b/libavcodec/error_resilience.c +@@ -684,7 +684,6 @@ void ff_er_frame_end(MpegEncContext *s){ + + if(!s->error_recognition || s->error_count==0 || s->avctx->lowres || + s->avctx->hwaccel || +- s->avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU || + s->picture_structure != PICT_FRAME || // we dont support ER of field pictures yet, though it should not crash if enabled + s->error_count==3*s->mb_width*(s->avctx->skip_top + s->avctx->skip_bottom)) return; + +diff --git a/libavcodec/h263dec.c b/libavcodec/h263dec.c +index a4d9532..d35bd26 100644 +--- a/libavcodec/h263dec.c ++++ b/libavcodec/h263dec.c +@@ -33,7 +33,6 @@ + #include "h263_parser.h" + #include "mpeg4video_parser.h" + #include "msmpeg4.h" +-#include "vdpau_internal.h" + #include "flv.h" + #include "mpeg4video.h" + +@@ -617,11 +616,6 @@ retry: + if(MPV_frame_start(s, avctx) < 0) + return -1; + +- if (CONFIG_MPEG4_VDPAU_DECODER && (s->avctx->codec->capabilities & CODEC_CAP_HWACCEL_VDPAU)) { +- ff_vdpau_mpeg4_decode_picture(s, buf, buf_size); +- goto frame_end; +- } +- + if (avctx->hwaccel) { + if (avctx->hwaccel->start_frame(avctx, buf, buf_size) < 0) + return -1; +diff --git a/libavcodec/h264.c b/libavcodec/h264.c +index 6056497..493bdf5 100644 +--- a/libavcodec/h264.c ++++ b/libavcodec/h264.c +@@ -36,7 +36,6 @@ + #include "golomb.h" + #include "mathops.h" + #include "rectangle.h" +-#include "vdpau_internal.h" + + #include "cabac.h" + #if ARCH_X86 +@@ -1626,9 +1625,6 @@ static void field_end(H264Context *h){ + s->current_picture_ptr->qscale_type= FF_QSCALE_TYPE_H264; + s->current_picture_ptr->pict_type= s->pict_type; + +- if (CONFIG_H264_VDPAU_DECODER && s->avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU) +- ff_vdpau_h264_set_reference_frames(s); +- + if(!s->dropable) { + ff_h264_execute_ref_pic_marking(h, h->mmco, h->mmco_index); + h->prev_poc_msb= h->poc_msb; +@@ -1642,9 +1638,6 @@ static void field_end(H264Context *h){ + av_log(avctx, AV_LOG_ERROR, "hardware accelerator failed to decode picture\n"); + } + +- if (CONFIG_H264_VDPAU_DECODER && s->avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU) +- ff_vdpau_h264_picture_complete(s); +- + /* + * FIXME: Error handling code does not seem to support interlaced + * when slices span multiple rows +@@ -2355,8 +2348,6 @@ static void execute_decode_slices(H264Context *h, int context_count){ + + if (s->avctx->hwaccel) + return; +- if(s->avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU) +- return; + if(context_count == 1) { + decode_slice(avctx, &h); + } else { +@@ -2499,11 +2490,6 @@ static int decode_nal_units(H264Context *h, const uint8_t *buf, int buf_size){ + if (avctx->hwaccel->decode_slice(avctx, &buf[buf_index - consumed], consumed) < 0) + return -1; + }else +- if(CONFIG_H264_VDPAU_DECODER && s->avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU){ +- static const uint8_t start_code[] = {0x00, 0x00, 0x01}; +- ff_vdpau_add_data_chunk(s, start_code, sizeof(start_code)); +- ff_vdpau_add_data_chunk(s, &buf[buf_index - consumed], consumed ); +- }else + context_count++; + } + break; +@@ -3080,20 +3066,3 @@ AVCodec h264_decoder = { + .long_name = NULL_IF_CONFIG_SMALL("H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10"), + .pix_fmts= ff_hwaccel_pixfmt_list_420, + }; +- +-#if CONFIG_H264_VDPAU_DECODER +-AVCodec h264_vdpau_decoder = { +- "h264_vdpau", +- CODEC_TYPE_VIDEO, +- CODEC_ID_H264, +- sizeof(H264Context), +- ff_h264_decode_init, +- NULL, +- ff_h264_decode_end, +- decode_frame, +- CODEC_CAP_DR1 | CODEC_CAP_DELAY | CODEC_CAP_HWACCEL_VDPAU, +- .flush= flush_dpb, +- .long_name = NULL_IF_CONFIG_SMALL("H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (VDPAU acceleration)"), +- .pix_fmts = (const enum PixelFormat[]){PIX_FMT_VDPAU_H264, PIX_FMT_NONE}, +-}; +-#endif +diff --git a/libavcodec/mpeg12.c b/libavcodec/mpeg12.c +index 636ae06..be32e8d 100644 +--- a/libavcodec/mpeg12.c ++++ b/libavcodec/mpeg12.c +@@ -35,7 +35,6 @@ + #include "mpeg12data.h" + #include "mpeg12decdata.h" + #include "bytestream.h" +-#include "vdpau_internal.h" + #include "xvmc_internal.h" + + //#undef NDEBUG +@@ -1226,12 +1225,7 @@ static enum PixelFormat mpeg_get_pixelformat(AVCodecContext *avctx){ + + if(avctx->xvmc_acceleration) + return avctx->get_format(avctx,pixfmt_xvmc_mpg2_420); +- else if(avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU){ +- if(avctx->codec_id == CODEC_ID_MPEG1VIDEO) +- return PIX_FMT_VDPAU_MPEG1; +- else +- return PIX_FMT_VDPAU_MPEG2; +- }else{ ++ else{ + if(s->chroma_format < 2) + return avctx->get_format(avctx,ff_hwaccel_pixfmt_list_420); + else if(s->chroma_format == 2) +@@ -1324,9 +1318,7 @@ static int mpeg_decode_postinit(AVCodecContext *avctx){ + avctx->pix_fmt = mpeg_get_pixelformat(avctx); + avctx->hwaccel = ff_find_hwaccel(avctx->codec->id, avctx->pix_fmt); + //until then pix_fmt may be changed right after codec init +- if( avctx->pix_fmt == PIX_FMT_XVMC_MPEG2_IDCT || +- avctx->hwaccel || +- s->avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU ) ++ if( avctx->pix_fmt == PIX_FMT_XVMC_MPEG2_IDCT || avctx->hwaccel ) + if( avctx->idct_algo == FF_IDCT_AUTO ) + avctx->idct_algo = FF_IDCT_SIMPLE; + +@@ -2063,8 +2055,7 @@ static int vcr2_init_sequence(AVCodecContext *avctx) + avctx->pix_fmt = mpeg_get_pixelformat(avctx); + avctx->hwaccel = ff_find_hwaccel(avctx->codec->id, avctx->pix_fmt); + +- if( avctx->pix_fmt == PIX_FMT_XVMC_MPEG2_IDCT || avctx->hwaccel || +- s->avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU ) ++ if( avctx->pix_fmt == PIX_FMT_XVMC_MPEG2_IDCT || avctx->hwaccel ) + if( avctx->idct_algo == FF_IDCT_AUTO ) + avctx->idct_algo = FF_IDCT_SIMPLE; + +@@ -2292,9 +2283,6 @@ static int decode_chunks(AVCodecContext *avctx, + s2->error_count += s2->thread_context[i]->error_count; + } + +- if (CONFIG_MPEG_VDPAU_DECODER && avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU) +- ff_vdpau_mpeg_picture_complete(s2, buf, buf_size, s->slice_count); +- + if (slice_end(avctx, picture)) { + if(s2->last_picture_ptr || s2->low_delay) //FIXME merge with the stuff in mpeg_decode_slice + *data_size = sizeof(AVPicture); +@@ -2441,11 +2429,6 @@ static int decode_chunks(AVCodecContext *avctx, + return -1; + } + +- if (avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU) { +- s->slice_count++; +- break; +- } +- + if(avctx->thread_count > 1){ + int threshold= (s2->mb_height*s->slice_count + avctx->thread_count/2) / avctx->thread_count; + if(threshold <= mb_y){ +@@ -2570,36 +2553,3 @@ AVCodec mpeg_xvmc_decoder = { + }; + + #endif +- +-#if CONFIG_MPEG_VDPAU_DECODER +-AVCodec mpeg_vdpau_decoder = { +- "mpegvideo_vdpau", +- CODEC_TYPE_VIDEO, +- CODEC_ID_MPEG2VIDEO, +- sizeof(Mpeg1Context), +- mpeg_decode_init, +- NULL, +- mpeg_decode_end, +- mpeg_decode_frame, +- CODEC_CAP_DR1 | CODEC_CAP_TRUNCATED | CODEC_CAP_HWACCEL_VDPAU | CODEC_CAP_DELAY, +- .flush= flush, +- .long_name = NULL_IF_CONFIG_SMALL("MPEG-1/2 video (VDPAU acceleration)"), +-}; +-#endif +- +-#if CONFIG_MPEG1_VDPAU_DECODER +-AVCodec mpeg1_vdpau_decoder = { +- "mpeg1video_vdpau", +- CODEC_TYPE_VIDEO, +- CODEC_ID_MPEG1VIDEO, +- sizeof(Mpeg1Context), +- mpeg_decode_init, +- NULL, +- mpeg_decode_end, +- mpeg_decode_frame, +- CODEC_CAP_DR1 | CODEC_CAP_TRUNCATED | CODEC_CAP_HWACCEL_VDPAU | CODEC_CAP_DELAY, +- .flush= flush, +- .long_name = NULL_IF_CONFIG_SMALL("MPEG-1 video (VDPAU acceleration)"), +-}; +-#endif +- +diff --git a/libavcodec/mpeg4videodec.c b/libavcodec/mpeg4videodec.c +index a1786e8..757df3d 100644 +--- a/libavcodec/mpeg4videodec.c ++++ b/libavcodec/mpeg4videodec.c +@@ -2243,20 +2243,3 @@ AVCodec mpeg4_decoder = { + .long_name= NULL_IF_CONFIG_SMALL("MPEG-4 part 2"), + .pix_fmts= ff_hwaccel_pixfmt_list_420, + }; +- +- +-#if CONFIG_MPEG4_VDPAU_DECODER +-AVCodec mpeg4_vdpau_decoder = { +- "mpeg4_vdpau", +- CODEC_TYPE_VIDEO, +- CODEC_ID_MPEG4, +- sizeof(MpegEncContext), +- decode_init, +- NULL, +- ff_h263_decode_end, +- ff_h263_decode_frame, +- CODEC_CAP_DR1 | CODEC_CAP_TRUNCATED | CODEC_CAP_DELAY | CODEC_CAP_HWACCEL_VDPAU, +- .long_name= NULL_IF_CONFIG_SMALL("MPEG-4 part 2 (VDPAU)"), +- .pix_fmts= (const enum PixelFormat[]){PIX_FMT_VDPAU_MPEG4, PIX_FMT_NONE}, +-}; +-#endif +diff --git a/libavcodec/mpegvideo.c b/libavcodec/mpegvideo.c +index ea96cbe..8dd5ac1 100644 +--- a/libavcodec/mpegvideo.c ++++ b/libavcodec/mpegvideo.c +@@ -82,6 +82,7 @@ const enum PixelFormat ff_pixfmt_list_420[] = { + + const enum PixelFormat ff_hwaccel_pixfmt_list_420[] = { + PIX_FMT_VAAPI_VLD, ++ PIX_FMT_VDPAU, + PIX_FMT_YUV420P, + PIX_FMT_NONE + }; +@@ -1018,7 +1019,6 @@ void MPV_frame_end(MpegEncContext *s) + if(CONFIG_MPEG_XVMC_DECODER && s->avctx->xvmc_acceleration){ + ff_xvmc_field_end(s); + }else if(!s->avctx->hwaccel +- && !(s->avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU) + && s->unrestricted_mv + && s->current_picture.reference + && !s->intra_only +diff --git a/libavcodec/vc1dec.c b/libavcodec/vc1dec.c +index d2a50a3..8770756 100644 +--- a/libavcodec/vc1dec.c ++++ b/libavcodec/vc1dec.c +@@ -36,7 +36,6 @@ + #include "unary.h" + #include "simple_idct.h" + #include "mathops.h" +-#include "vdpau_internal.h" + + #undef NDEBUG + #include <assert.h> +@@ -3140,13 +3139,6 @@ static int vc1_decode_frame(AVCodecContext *avctx, + s->current_picture_ptr= &s->picture[i]; + } + +- if (s->avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU){ +- if (v->profile < PROFILE_ADVANCED) +- avctx->pix_fmt = PIX_FMT_VDPAU_WMV3; +- else +- avctx->pix_fmt = PIX_FMT_VDPAU_VC1; +- } +- + //for advanced profile we may need to parse and unescape data + if (avctx->codec_id == CODEC_ID_VC1) { + int buf_size2 = 0; +@@ -3163,8 +3155,7 @@ static int vc1_decode_frame(AVCodecContext *avctx, + if(size <= 0) continue; + switch(AV_RB32(start)){ + case VC1_CODE_FRAME: +- if (avctx->hwaccel || +- s->avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU) ++ if (avctx->hwaccel) + buf_start = start; + buf_size2 = vc1_unescape_buffer(start + 4, size, buf2); + break; +@@ -3256,10 +3247,7 @@ static int vc1_decode_frame(AVCodecContext *avctx, + s->me.qpel_put= s->dsp.put_qpel_pixels_tab; + s->me.qpel_avg= s->dsp.avg_qpel_pixels_tab; + +- if ((CONFIG_VC1_VDPAU_DECODER) +- &&s->avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU) +- ff_vdpau_vc1_decode_picture(s, buf_start, (buf + buf_size) - buf_start); +- else if (avctx->hwaccel) { ++ if (avctx->hwaccel) { + if (avctx->hwaccel->start_frame(avctx, buf, buf_size) < 0) + return -1; + if (avctx->hwaccel->decode_slice(avctx, buf_start, (buf + buf_size) - buf_start) < 0) +@@ -3349,37 +3337,3 @@ AVCodec wmv3_decoder = { + .pix_fmts = ff_hwaccel_pixfmt_list_420 + }; + #endif +- +-#if CONFIG_WMV3_VDPAU_DECODER +-AVCodec wmv3_vdpau_decoder = { +- "wmv3_vdpau", +- CODEC_TYPE_VIDEO, +- CODEC_ID_WMV3, +- sizeof(VC1Context), +- vc1_decode_init, +- NULL, +- vc1_decode_end, +- vc1_decode_frame, +- CODEC_CAP_DR1 | CODEC_CAP_DELAY | CODEC_CAP_HWACCEL_VDPAU, +- NULL, +- .long_name = NULL_IF_CONFIG_SMALL("Windows Media Video 9 VDPAU"), +- .pix_fmts = (const enum PixelFormat[]){PIX_FMT_VDPAU_WMV3, PIX_FMT_NONE} +-}; +-#endif +- +-#if CONFIG_VC1_VDPAU_DECODER +-AVCodec vc1_vdpau_decoder = { +- "vc1_vdpau", +- CODEC_TYPE_VIDEO, +- CODEC_ID_VC1, +- sizeof(VC1Context), +- vc1_decode_init, +- NULL, +- vc1_decode_end, +- vc1_decode_frame, +- CODEC_CAP_DR1 | CODEC_CAP_DELAY | CODEC_CAP_HWACCEL_VDPAU, +- NULL, +- .long_name = NULL_IF_CONFIG_SMALL("SMPTE VC-1 VDPAU"), +- .pix_fmts = (const enum PixelFormat[]){PIX_FMT_VDPAU_VC1, PIX_FMT_NONE} +-}; +-#endif +diff --git a/libavcodec/vdpau.c b/libavcodec/vdpau.c +index 7cc8ad1..c60b1e7 100644 +--- a/libavcodec/vdpau.c ++++ b/libavcodec/vdpau.c +@@ -30,7 +30,6 @@ + #include <assert.h> + + #include "vdpau.h" +-#include "vdpau_internal.h" + + /** + * \addtogroup VDPAU_Decoding +@@ -38,15 +37,57 @@ + * @{ + */ + +-void ff_vdpau_h264_set_reference_frames(MpegEncContext *s) ++static void vdpau_h264_fill_field_order_cnt(int32_t field_order_cnt[2], Picture *pic, int pic_structure) + { +- H264Context *h = s->avctx->priv_data; ++ int i; ++ for (i = 0; i < 2; i++) { ++ const int poc = pic->field_poc[i]; ++ field_order_cnt[i] = poc != INT_MAX ? poc : 0; ++ } ++} ++ ++static void vdpau_h264_init_picture(VdpReferenceFrameH264 *rf) ++{ ++ rf->surface = VDP_INVALID_HANDLE; ++ rf->is_long_term = 0; ++ rf->top_is_reference = 0; ++ rf->bottom_is_reference = 0; ++ rf->field_order_cnt[0] = 0; ++ rf->field_order_cnt[1] = 0; ++ rf->frame_idx = 0; ++} ++ ++static void vdpau_h264_fill_picture(VdpReferenceFrameH264 *rf, Picture *pic, int pic_structure) ++{ ++ struct vdpau_render_state *render; ++ ++ assert(rf); ++ assert(pic); ++ ++ if (pic_structure == 0) ++ pic_structure = pic->reference; ++ ++ render = (struct vdpau_render_state *)pic->data[3]; ++ assert(render); ++ ++ rf->surface = render->surface; ++ rf->is_long_term = pic->reference && pic->long_ref; ++ rf->top_is_reference = (pic_structure & PICT_TOP_FIELD) != 0; ++ rf->bottom_is_reference = (pic_structure & PICT_BOTTOM_FIELD) != 0; ++ rf->frame_idx = pic->long_ref ? pic->pic_id : pic->frame_num; ++ ++ vdpau_h264_fill_field_order_cnt(rf->field_order_cnt, pic, pic_structure); ++} ++ ++static void vdpau_h264_set_reference_frames(H264Context *h) ++{ ++ MpegEncContext * const s = &h->s; + struct vdpau_render_state *render, *render_ref; + VdpReferenceFrameH264 *rf, *rf2; + Picture *pic; + int i, list, pic_frame_idx; + +- render = (struct vdpau_render_state *)s->current_picture_ptr->data[0]; ++ render = (struct vdpau_render_state *)s->current_picture_ptr->data[3]; + assert(render); + + rf = &render->info.h264.referenceFrames[0]; +@@ -62,7 +103,7 @@ void ff_vdpau_h264_set_reference_frames(MpegEncContext *s) + continue; + pic_frame_idx = pic->long_ref ? pic->pic_id : pic->frame_num; + +- render_ref = (struct vdpau_render_state *)pic->data[0]; ++ render_ref = (struct vdpau_render_state *)pic->data[3]; + assert(render_ref); + + rf2 = &render->info.h264.referenceFrames[0]; +@@ -84,70 +125,92 @@ void ff_vdpau_h264_set_reference_frames(MpegEncContext *s) + if (rf >= &render->info.h264.referenceFrames[H264_RF_COUNT]) + continue; + +- rf->surface = render_ref->surface; +- rf->is_long_term = pic->long_ref; +- rf->top_is_reference = (pic->reference & PICT_TOP_FIELD) ? VDP_TRUE : VDP_FALSE; +- rf->bottom_is_reference = (pic->reference & PICT_BOTTOM_FIELD) ? VDP_TRUE : VDP_FALSE; +- rf->field_order_cnt[0] = pic->field_poc[0]; +- rf->field_order_cnt[1] = pic->field_poc[1]; +- rf->frame_idx = pic_frame_idx; ++ vdpau_h264_fill_picture(rf, pic, pic->reference); + + ++rf; + } + } + +- for (; rf < &render->info.h264.referenceFrames[H264_RF_COUNT]; ++rf) { +- rf->surface = VDP_INVALID_HANDLE; +- rf->is_long_term = 0; +- rf->top_is_reference = 0; +- rf->bottom_is_reference = 0; +- rf->field_order_cnt[0] = 0; +- rf->field_order_cnt[1] = 0; +- rf->frame_idx = 0; +- } ++ for (; rf < &render->info.h264.referenceFrames[H264_RF_COUNT]; ++rf) ++ vdpau_h264_init_picture(rf); + } + +-void ff_vdpau_add_data_chunk(MpegEncContext *s, +- const uint8_t *buf, int buf_size) ++static int vdpau_ensure_bitstream_buffers(struct vdpau_render_state *render) + { +- struct vdpau_render_state *render; +- +- render = (struct vdpau_render_state *)s->current_picture_ptr->data[0]; +- assert(render); +- + render->bitstream_buffers= av_fast_realloc( + render->bitstream_buffers, + &render->bitstream_buffers_allocated, + sizeof(*render->bitstream_buffers)*(render->bitstream_buffers_used + 1) + ); + ++ if (!render->bitstream_buffers) ++ return -1; ++ ++ return 0; ++} ++ ++static int vdpau_common_start_frame(AVCodecContext *avctx, av_unused const uint8_t *buffer, av_unused uint32_t size) ++{ ++ MpegEncContext * const s = avctx->priv_data; ++ struct vdpau_render_state *render; ++ ++ render = (struct vdpau_render_state *)s->current_picture_ptr->data[3]; ++ assert(render); ++ ++ render->bitstream_buffers_used = 0; ++ return 0; ++} ++ ++static int vdpau_common_end_frame(AVCodecContext *avctx) ++{ ++ MpegEncContext * const s = avctx->priv_data; ++ struct vdpau_render_state *render; ++ ++ render = (struct vdpau_render_state *)s->current_picture_ptr->data[3]; ++ assert(render); ++ ++ if (render->bitstream_buffers_used) { ++ ff_draw_horiz_band(s, 0, s->avctx->height); ++ render->bitstream_buffers_used = 0; ++ } ++ return 0; ++} ++ ++static int vdpau_common_decode_slice(AVCodecContext *avctx, const uint8_t *buf, uint32_t buf_size) ++{ ++ MpegEncContext * const s = avctx->priv_data; ++ struct vdpau_render_state *render; ++ ++ render = (struct vdpau_render_state *)s->current_picture_ptr->data[3]; ++ assert(render); ++ ++ if (vdpau_ensure_bitstream_buffers(render) < 0) ++ return -1; ++ + render->bitstream_buffers[render->bitstream_buffers_used].struct_version = VDP_BITSTREAM_BUFFER_VERSION; + render->bitstream_buffers[render->bitstream_buffers_used].bitstream = buf; + render->bitstream_buffers[render->bitstream_buffers_used].bitstream_bytes = buf_size; + render->bitstream_buffers_used++; ++ return 0; + } + +-void ff_vdpau_h264_picture_complete(MpegEncContext *s) ++static int vdpau_h264_start_frame(AVCodecContext *avctx, const uint8_t *buffer, uint32_t size) + { +- H264Context *h = s->avctx->priv_data; ++ H264Context * const h = avctx->priv_data; ++ MpegEncContext * const s = &h->s; + struct vdpau_render_state *render; +- int i; + +- render = (struct vdpau_render_state *)s->current_picture_ptr->data[0]; ++ render = (struct vdpau_render_state *)s->current_picture_ptr->data[3]; + assert(render); + +- render->info.h264.slice_count = h->slice_num; +- if (render->info.h264.slice_count < 1) +- return; ++ vdpau_h264_set_reference_frames(h); + +- for (i = 0; i < 2; ++i) { +- int foc = s->current_picture_ptr->field_poc[i]; +- if (foc == INT_MAX) +- foc = 0; +- render->info.h264.field_order_cnt[i] = foc; +- } ++ vdpau_h264_fill_field_order_cnt(render->info.h264.field_order_cnt, ++ s->current_picture_ptr, ++ s->picture_structure); + +- render->info.h264.is_reference = (s->current_picture_ptr->reference & 3) ? VDP_TRUE : VDP_FALSE; ++ /* fill VdpPictureInfoH264 struct */ ++ render->info.h264.is_reference = h->nal_ref_idc != 0; + render->info.h264.frame_num = h->frame_num; + render->info.h264.field_pic_flag = s->picture_structure != PICT_FRAME; + render->info.h264.bottom_field_flag = s->picture_structure == PICT_BOTTOM_FIELD; +@@ -175,19 +238,44 @@ void ff_vdpau_h264_picture_complete(MpegEncContext *s) + memcpy(render->info.h264.scaling_lists_4x4, h->pps.scaling_matrix4, sizeof(render->info.h264.scaling_lists_4x4)); + memcpy(render->info.h264.scaling_lists_8x8, h->pps.scaling_matrix8, sizeof(render->info.h264.scaling_lists_8x8)); + +- ff_draw_horiz_band(s, 0, s->avctx->height); +- render->bitstream_buffers_used = 0; ++ render->info.h264.slice_count = 0; ++ ++ return vdpau_common_start_frame(avctx, buffer, size); ++} ++ ++static int vdpau_h264_decode_slice(AVCodecContext *avctx, const uint8_t *buffer, uint32_t size) ++{ ++ MpegEncContext * const s = avctx->priv_data; ++ struct vdpau_render_state *render; ++ static const uint8_t start_code_prefix_one_3byte[3] = { 0x00, 0x00, 0x01 }; ++ ++ render = (struct vdpau_render_state *)s->current_picture_ptr->data[3]; ++ assert(render); ++ ++ if (vdpau_ensure_bitstream_buffers(render) < 0) ++ return -1; ++ ++ render->bitstream_buffers[render->bitstream_buffers_used].struct_version = VDP_BITSTREAM_BUFFER_VERSION; ++ render->bitstream_buffers[render->bitstream_buffers_used].bitstream = start_code_prefix_one_3byte; ++ render->bitstream_buffers[render->bitstream_buffers_used].bitstream_bytes = sizeof(start_code_prefix_one_3byte); ++ render->bitstream_buffers_used++; ++ ++ if (vdpau_common_decode_slice(avctx, buffer, size) < 0) ++ return -1; ++ ++ ++render->info.h264.slice_count; ++ return 0; + } + +-void ff_vdpau_mpeg_picture_complete(MpegEncContext *s, const uint8_t *buf, +- int buf_size, int slice_count) ++static int vdpau_mpeg2_start_frame(AVCodecContext *avctx, const uint8_t *buffer, uint32_t size) + { ++ MpegEncContext * const s = avctx->priv_data; + struct vdpau_render_state *render, *last, *next; + int i; + +- if (!s->current_picture_ptr) return; ++ if (!s->current_picture_ptr) return 0; + +- render = (struct vdpau_render_state *)s->current_picture_ptr->data[0]; ++ render = (struct vdpau_render_state *)s->current_picture_ptr->data[3]; + assert(render); + + /* fill VdpPictureInfoMPEG1Or2 struct */ +@@ -216,36 +304,47 @@ void ff_vdpau_mpeg_picture_complete(MpegEncContext *s, const uint8_t *buf, + + switch(s->pict_type){ + case FF_B_TYPE: +- next = (struct vdpau_render_state *)s->next_picture.data[0]; ++ next = (struct vdpau_render_state *)s->next_picture.data[3]; + assert(next); + render->info.mpeg.backward_reference = next->surface; + // no return here, going to set forward prediction + case FF_P_TYPE: +- last = (struct vdpau_render_state *)s->last_picture.data[0]; ++ last = (struct vdpau_render_state *)s->last_picture.data[3]; + if (!last) // FIXME: Does this test make sense? + last = render; // predict second field from the first + render->info.mpeg.forward_reference = last->surface; + } + +- ff_vdpau_add_data_chunk(s, buf, buf_size); ++ render->info.mpeg.slice_count = 0; + +- render->info.mpeg.slice_count = slice_count; ++ return vdpau_common_start_frame(avctx, buffer, size); ++} + +- if (slice_count) +- ff_draw_horiz_band(s, 0, s->avctx->height); +- render->bitstream_buffers_used = 0; ++static int vdpau_mpeg2_decode_slice(AVCodecContext *avctx, const uint8_t *buffer, uint32_t size) ++{ ++ MpegEncContext * const s = avctx->priv_data; ++ struct vdpau_render_state *render; ++ ++ render = (struct vdpau_render_state *)s->current_picture_ptr->data[3]; ++ assert(render); ++ ++ if (vdpau_common_decode_slice(avctx, buffer, size) < 0) ++ return -1; ++ ++ ++render->info.mpeg.slice_count; ++ return 0; + } + +-void ff_vdpau_vc1_decode_picture(MpegEncContext *s, const uint8_t *buf, +- int buf_size) ++static int vdpau_vc1_start_frame(AVCodecContext *avctx, const uint8_t *buffer, uint32_t size) + { +- VC1Context *v = s->avctx->priv_data; ++ VC1Context * const v = avctx->priv_data; ++ MpegEncContext * const s = &v->s; + struct vdpau_render_state *render, *last, *next; + +- render = (struct vdpau_render_state *)s->current_picture.data[0]; ++ render = (struct vdpau_render_state *)s->current_picture_ptr->data[3]; + assert(render); + +- /* fill LvPictureInfoVC1 struct */ ++ /* fill VdpPictureInfoVC1 struct */ + render->info.vc1.frame_coding_mode = v->fcm; + render->info.vc1.postprocflag = v->postprocflag; + render->info.vc1.pulldown = v->broadcast; +@@ -286,34 +385,47 @@ void ff_vdpau_vc1_decode_picture(MpegEncContext *s, const uint8_t *buf, + + switch(s->pict_type){ + case FF_B_TYPE: +- next = (struct vdpau_render_state *)s->next_picture.data[0]; ++ next = (struct vdpau_render_state *)s->next_picture.data[3]; + assert(next); + render->info.vc1.backward_reference = next->surface; + // no break here, going to set forward prediction + case FF_P_TYPE: +- last = (struct vdpau_render_state *)s->last_picture.data[0]; ++ last = (struct vdpau_render_state *)s->last_picture.data[3]; + if (!last) // FIXME: Does this test make sense? + last = render; // predict second field from the first + render->info.vc1.forward_reference = last->surface; + } + +- ff_vdpau_add_data_chunk(s, buf, buf_size); ++ render->info.vc1.slice_count = 0; + +- render->info.vc1.slice_count = 1; ++ return vdpau_common_start_frame(avctx, buffer, size); ++} + +- ff_draw_horiz_band(s, 0, s->avctx->height); +- render->bitstream_buffers_used = 0; ++static int vdpau_vc1_decode_slice(AVCodecContext *avctx, const uint8_t *buffer, uint32_t size) ++{ ++ VC1Context * const v = avctx->priv_data; ++ MpegEncContext * const s = &v->s; ++ struct vdpau_render_state *render; ++ ++ render = (struct vdpau_render_state *)s->current_picture_ptr->data[3]; ++ assert(render); ++ ++ if (vdpau_common_decode_slice(avctx, buffer, size) < 0) ++ return -1; ++ ++ ++render->info.vc1.slice_count; ++ return 0; + } + +-void ff_vdpau_mpeg4_decode_picture(MpegEncContext *s, const uint8_t *buf, +- int buf_size) ++static int vdpau_mpeg4_start_frame(AVCodecContext *avctx, const uint8_t *buffer, uint32_t size) + { ++ MpegEncContext * const s = avctx->priv_data; + struct vdpau_render_state *render, *last, *next; + int i; + +- if (!s->current_picture_ptr) return; ++ if (!s->current_picture_ptr) return 0; + +- render = (struct vdpau_render_state *)s->current_picture_ptr->data[0]; ++ render = (struct vdpau_render_state *)s->current_picture_ptr->data[3]; + assert(render); + + /* fill VdpPictureInfoMPEG4Part2 struct */ +@@ -338,21 +450,104 @@ void ff_vdpau_mpeg4_decode_picture(MpegEncContext *s, const uint8_t *buf, + + switch (s->pict_type) { + case FF_B_TYPE: +- next = (struct vdpau_render_state *)s->next_picture.data[0]; ++ next = (struct vdpau_render_state *)s->next_picture.data[3]; + assert(next); + render->info.mpeg4.backward_reference = next->surface; + render->info.mpeg4.vop_coding_type = 2; + // no break here, going to set forward prediction + case FF_P_TYPE: +- last = (struct vdpau_render_state *)s->last_picture.data[0]; ++ last = (struct vdpau_render_state *)s->last_picture.data[3]; + assert(last); + render->info.mpeg4.forward_reference = last->surface; + } + +- ff_vdpau_add_data_chunk(s, buf, buf_size); ++ if (vdpau_common_start_frame(avctx, buffer, size) < 0) ++ return -1; + +- ff_draw_horiz_band(s, 0, s->avctx->height); +- render->bitstream_buffers_used = 0; ++ return vdpau_common_decode_slice(avctx, buffer, size); + } + ++static int vdpau_mpeg4_decode_slice(av_unused AVCodecContext *avctx, av_unused const uint8_t *buffer, av_unused uint32_t size) ++{ ++ return 0; ++} ++ ++#if CONFIG_MPEG1_VDPAU_HWACCEL ++AVHWAccel mpeg1_vdpau_hwaccel = { ++ .name = "mpeg1_vdpau", ++ .type = CODEC_TYPE_VIDEO, ++ .id = CODEC_ID_MPEG1VIDEO, ++ .pix_fmt = PIX_FMT_VDPAU, ++ .capabilities = 0, ++ .start_frame = vdpau_mpeg2_start_frame, ++ .end_frame = vdpau_common_end_frame, ++ .decode_slice = vdpau_mpeg2_decode_slice, ++}; ++#endif ++ ++#if CONFIG_MPEG2_VDPAU_HWACCEL ++AVHWAccel mpeg2_vdpau_hwaccel = { ++ .name = "mpeg2_vdpau", ++ .type = CODEC_TYPE_VIDEO, ++ .id = CODEC_ID_MPEG2VIDEO, ++ .pix_fmt = PIX_FMT_VDPAU, ++ .capabilities = 0, ++ .start_frame = vdpau_mpeg2_start_frame, ++ .end_frame = vdpau_common_end_frame, ++ .decode_slice = vdpau_mpeg2_decode_slice, ++}; ++#endif ++ ++#if CONFIG_H264_VDPAU_HWACCEL ++AVHWAccel h264_vdpau_hwaccel = { ++ .name = "h264_vdpau", ++ .type = CODEC_TYPE_VIDEO, ++ .id = CODEC_ID_H264, ++ .pix_fmt = PIX_FMT_VDPAU, ++ .capabilities = 0, ++ .start_frame = vdpau_h264_start_frame, ++ .end_frame = vdpau_common_end_frame, ++ .decode_slice = vdpau_h264_decode_slice, ++}; ++#endif ++ ++#if CONFIG_WMV3_VDPAU_HWACCEL ++AVHWAccel wmv3_vdpau_hwaccel = { ++ .name = "wmv3_vdpau", ++ .type = CODEC_TYPE_VIDEO, ++ .id = CODEC_ID_WMV3, ++ .pix_fmt = PIX_FMT_VDPAU, ++ .capabilities = 0, ++ .start_frame = vdpau_vc1_start_frame, ++ .end_frame = vdpau_common_end_frame, ++ .decode_slice = vdpau_vc1_decode_slice, ++}; ++#endif ++ ++#if CONFIG_VC1_VDPAU_HWACCEL ++AVHWAccel vc1_vdpau_hwaccel = { ++ .name = "vc1_vdpau", ++ .type = CODEC_TYPE_VIDEO, ++ .id = CODEC_ID_VC1, ++ .pix_fmt = PIX_FMT_VDPAU, ++ .capabilities = 0, ++ .start_frame = vdpau_vc1_start_frame, ++ .end_frame = vdpau_common_end_frame, ++ .decode_slice = vdpau_vc1_decode_slice, ++}; ++#endif ++ ++#if CONFIG_MPEG4_VDPAU_HWACCEL ++AVHWAccel mpeg4_vdpau_hwaccel = { ++ .name = "mpeg4_vdpau", ++ .type = CODEC_TYPE_VIDEO, ++ .id = CODEC_ID_MPEG4, ++ .pix_fmt = PIX_FMT_VDPAU, ++ .capabilities = 0, ++ .start_frame = vdpau_mpeg4_start_frame, ++ .end_frame = vdpau_common_end_frame, ++ .decode_slice = vdpau_mpeg4_decode_slice, ++}; ++#endif ++ + /* @}*/ +diff --git a/libavutil/pixdesc.c b/libavutil/pixdesc.c +index b689519..217c49f 100644 +--- a/libavutil/pixdesc.c ++++ b/libavutil/pixdesc.c +@@ -646,6 +646,12 @@ const AVPixFmtDescriptor av_pix_fmt_descriptors[PIX_FMT_NB] = { + }, + .flags = PIX_FMT_BE, + }, ++ [PIX_FMT_VDPAU] = { ++ .name = "vdpau", ++ .log2_chroma_w = 1, ++ .log2_chroma_h = 1, ++ .flags = PIX_FMT_HWACCEL, ++ }, + }; + + int av_get_bits_per_pixel(const AVPixFmtDescriptor *pixdesc) +diff --git a/libavutil/pixfmt.h b/libavutil/pixfmt.h +index ddd17fb..1f17073 100644 +--- a/libavutil/pixfmt.h ++++ b/libavutil/pixfmt.h +@@ -127,6 +127,7 @@ enum PixelFormat { + PIX_FMT_YUV444P16BE, ///< planar YUV 4:4:4, 48bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian + PIX_FMT_VDPAU_MPEG4, ///< MPEG4 HW decoding with VDPAU, data[0] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers + PIX_FMT_DXVA2_VLD, ///< HW decoding through DXVA2, Picture.data[3] contains a LPDIRECT3DSURFACE9 pointer ++ PIX_FMT_VDPAU, ///< HW decoding with VDPAU, Picture.data[3] contains a vdpau_render_state struct which contains the bitstream of the slices as well as various fields extracted from headers + PIX_FMT_NB, ///< number of pixel formats, DO NOT USE THIS if you want to link with shared libav* because the number of formats might differ between versions + }; + +diff --git a/libmpcodecs/vd_ffmpeg.c b/libmpcodecs/vd_ffmpeg.c +index 1e8e71f..d49d009 100644 +--- a/libmpcodecs/vd_ffmpeg.c ++++ b/libmpcodecs/vd_ffmpeg.c +@@ -275,7 +275,7 @@ static int init(sh_video_t *sh){ + } + #endif /* CONFIG_VAAPI */ + #if CONFIG_VDPAU +- if(lavc_codec->capabilities & CODEC_CAP_HWACCEL_VDPAU){ ++ if(get_video_hwaccel() == HWACCEL_VDPAU){ + avctx->get_format = get_format; + } + #endif /* CONFIG_VDPAU */ +diff --git a/libvo/vo_vdpau.c b/libvo/vo_vdpau.c +index 2ee7ccc..e728aff 100644 +--- a/libvo/vo_vdpau.c ++++ b/libvo/vo_vdpau.c +@@ -977,7 +977,7 @@ static int draw_slice(uint8_t *image[], int stride[], int w, int h, + int x, int y) + { + VdpStatus vdp_st; +- struct vdpau_render_state *rndr = (struct vdpau_render_state *)image[0]; ++ struct vdpau_render_state *rndr = (struct vdpau_render_state *)image[3]; + int max_refs = image_format == IMGFMT_VDPAU_H264 ? rndr->info.h264.num_ref_frames : 2; + + if (handle_preemption() < 0) +@@ -1080,10 +1080,10 @@ static uint32_t get_image(mp_image_t *mpi) + return VO_FALSE; + } + mpi->flags |= MP_IMGFLAG_DIRECT; +- mpi->stride[0] = mpi->stride[1] = mpi->stride[2] = 0; +- mpi->planes[0] = mpi->planes[1] = mpi->planes[2] = NULL; ++ mpi->stride[0] = mpi->stride[1] = mpi->stride[2] = mpi->stride[3] = 0; ++ mpi->planes[0] = mpi->planes[1] = mpi->planes[2] = mpi->planes[3] = NULL; + // hack to get around a check and to avoid a special-case in vd_ffmpeg.c +- mpi->planes[0] = (void *)rndr; ++ mpi->planes[0] = mpi->planes[3] = (void *)rndr; + mpi->num_planes = 1; + mpi->priv = rndr; + return VO_TRUE; diff --git a/media-video/mplayer/metadata.xml b/media-video/mplayer/metadata.xml new file mode 100644 index 0000000..a9f41f0 --- /dev/null +++ b/media-video/mplayer/metadata.xml @@ -0,0 +1,52 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE pkgmetadata SYSTEM "http://www.gentoo.org/dtd/metadata.dtd"> +<pkgmetadata> + <herd>video</herd> + <maintainer> + <email>media-video@gentoo.org</email> + </maintainer> + <use> + <flag name="3dnowext">Enable 3dnowext cpu instructions</flag> + <flag name="ass">Internal SRT/SSA/ASS (SubRip / SubStation Alpha) subtitle support</flag> + <flag name="bl">Blinkenlights video output</flag> + <flag name="bs2b">Enable Bauer stereophonic-to-binaural headphone filter</flag> + <flag name="cdio">Use libcdio for CD support (instead of cdparanoia)</flag> + <flag name="cpudetection">Enables runtime cpudetection (useful for bindist, compatability on other CPUs)</flag> + <flag name="custom-cpuopts">Fine-tune custom CPU optimizations (UNSUPPORTED)</flag> + <flag name="dirac">Enable Dirac video support (an advanced royalty-free video compression format) via the reference library: dirac.</flag> + <flag name="dvdnav">Use forked libdvdnav, navigate menus in GUIs</flag> + <flag name="dxr3">Enable DXR3/H+ video output</flag> + <flag name="enca">Enables support for charset discovery and conversion</flag> + <flag name="external-ffmpeg">Use shared FFmpeg libraries instead of static bundled ones. Discouraged by upstream.</flag> + <flag name="faac">Use external faac library for AAC encoding</flag> + <flag name="faad">Use external faad library for AAC decoding</flag> + <flag name="gmplayer">Build gmplayer, a GTK+ MPlayer gui (UNSUPPORTED)</flag> + <flag name="live">Enables live.com streaming media support</flag> + <flag name="md5sum">Enables md5sum video output</flag> + <flag name="mmxext">Enables mmx2 support</flag> + <flag name="mng">MNG input support</flag> + <flag name="network">Enables network streaming support</flag> + <flag name="nut">Enables support for the NUT container format</flag> + <flag name="opencore-amr">Enables Adaptive Multi-Rate format support</flag> + <flag name="osdmenu">Enables support for on-screen display (OSD) menus</flag> + <flag name="pnm">Add PNM video output option, to create PPM/PGM/PGMYUV images</flag> + <flag name="pvr">Enable Video4Linux2 MPEG PVR</flag> + <flag name="radio">Enable V4L2 radio interface and support</flag> + <flag name="rar">Enable Unique RAR File Library</flag> + <flag name="real">Adds real audo/video support</flag> + <flag name="rtc">Enables usage of the linux real time clock. The alternative is software emulation of rtc</flag> + <flag name="schroedinger">Enable Dirac video support (an advanced royalty-free video compression format) via libschroedinger (high-speed implementation in C of the Dirac codec).</flag> + <flag name="shm">Enable support for shm</flag> + <flag name="ssse3">faster floating point optimization for SSSE3 capable chips (Intel Core 2 and later chips)</flag> + <flag name="teletext">Support for TV teletext interface</flag> + <flag name="tga">Enables Targa video output</flag> + <flag name="toolame">Enable toolame MPEG-2 encoding</flag> + <flag name="tremor">Enable internal support for Vorbis</flag> + <flag name="twolame">Enable twolame MPEG-2 encoding</flag> + <flag name="vdpau">Enables experimental VDPAU support (requires nVidia video cards) to offload MPEG2/MPEG4/VC1/WMV CPU processing to video card</flag> + <flag name="vidix">Support for vidix video output</flag> + <flag name="xanim">Enables support for xanim based codecs</flag> + <flag name="xvmc">Enables X-Video Motion Compensation support</flag> + <flag name="zoran">Enables ZR360[56]7/ZR36060 video output</flag> + </use> +</pkgmetadata> diff --git a/media-video/mplayer/mplayer-1.0_rc4_p20100213-r50.ebuild b/media-video/mplayer/mplayer-1.0_rc4_p20100213-r50.ebuild new file mode 100644 index 0000000..1085db2 --- /dev/null +++ b/media-video/mplayer/mplayer-1.0_rc4_p20100213-r50.ebuild @@ -0,0 +1,743 @@ +# Copyright 1999-2010 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header: /var/cvsroot/gentoo-x86/media-video/mplayer/mplayer-1.0_rc4_p20100213-r1.ebuild,v 1.9 2010/04/23 13:04:43 ssuominen Exp $ + +EAPI="2" + +ESVN_REPO_URI="svn://svn.mplayerhq.hu/mplayer/trunk" +[[ ${PV} = *9999* ]] && SVN_ECLASS="subversion" || SVN_ECLASS="" + +inherit eutils flag-o-matic multilib base ${SVN_ECLASS} + +[[ ${PV} != *9999* ]] && MPLAYER_REVISION=SVN-r30554 + +IUSE="3dnow 3dnowext +a52 +aac aalib +alsa altivec +ass bidi bindist bl bs2b ++cddb +cdio cdparanoia cpudetection custom-cpuopts debug dga +dirac directfb +doc +dts +dv dvb +dvd +dvdnav dxr3 +enca +encode esd +faac +faad fbcon ftp +gif ggi -gmplayer +iconv ipv6 jack joystick jpeg jpeg2k kernel_linux ladspa +libcaca lirc +live lzo mad md5sum +mmx mmxext mng +mp3 nas +network nut openal +amr +opengl +osdmenu oss png pnm pulseaudio pvr +quicktime radio +rar +real +rtc +samba +shm +schroedinger sdl +speex sse sse2 ssse3 svga tga +theora +tremor ++truetype +toolame +twolame +unicode v4l v4l2 vaapi vdpau vidix +vorbis win32codecs ++X +x264 xanim xinerama +xscreensaver +xv +xvid xvmc zoran" +[[ ${PV} == *9999* ]] && IUSE+=" external-ffmpeg" + +VIDEO_CARDS="s3virge mga tdfx nvidia vesa" +for x in ${VIDEO_CARDS}; do + IUSE+=" video_cards_${x}" +done + +BLUV="1.7" +SVGV="1.9.17" +AMR_URI="http://www.3gpp.org/ftp/Specs/archive" +FONT_URI=" + mirror://mplayer/releases/fonts/font-arial-iso-8859-1.tar.bz2 + mirror://mplayer/releases/fonts/font-arial-iso-8859-2.tar.bz2 + mirror://mplayer/releases/fonts/font-arial-cp1250.tar.bz2 +" +if [[ ${PV} == *9999* ]]; then + RELEASE_URI="" +else + RELEASE_URI="mirror://gentoo/${P}.tbz2" +fi +SRC_URI="${RELEASE_URI} + !truetype? ( ${FONT_URI} ) + gmplayer? ( mirror://mplayer/skins/Blue-${BLUV}.tar.bz2 ) + svga? ( mirror://gentoo/svgalib_helper-${SVGV}-mplayer.tar.gz )" +# svga? ( http://mplayerhq.hu/~alex/svgalib_helper-${SVGV}-mplayer.tar.bz2 ) + +DESCRIPTION="Media Player for Linux" +HOMEPAGE="http://www.mplayerhq.hu/" + +FONT_RDEPS=" + virtual/ttf-fonts + media-libs/fontconfig + media-libs/freetype:2 +" +X_RDEPS=" + x11-libs/libXext + x11-libs/libXxf86vm +" +[[ ${PV} == *9999* ]] && RDEPEND+=" external-ffmpeg? ( media-video/ffmpeg )" +# Rar: althrought -gpl version is nice, it cant do most functions normal rars can +# nemesi? ( net-libs/libnemesi ) +RDEPEND+=" + sys-libs/ncurses + !bindist? ( + x86? ( + win32codecs? ( media-libs/win32codecs ) + ) + ) + X? ( + ${X_RDEPS} + ass? ( ${FONT_RDEPS} ) + dga? ( x11-libs/libXxf86dga ) + ggi? ( + media-libs/libggi + media-libs/libggiwmh + ) + gmplayer? ( + media-libs/libpng + x11-libs/gtk+:2 + x11-libs/libXi + ) + opengl? ( virtual/opengl ) + truetype? ( ${FONT_RDEPS} ) + video_cards_nvidia? ( + vdpau? ( >=x11-drivers/nvidia-drivers-180.60 ) + ) + xinerama? ( x11-libs/libXinerama ) + xscreensaver? ( x11-libs/libXScrnSaver ) + xv? ( + x11-libs/libXv + xvmc? ( x11-libs/libXvMC ) + ) + ) + aalib? ( media-libs/aalib ) + alsa? ( media-libs/alsa-lib ) + bidi? ( dev-libs/fribidi ) + bs2b? ( media-libs/libbs2b ) + cdio? ( dev-libs/libcdio ) + cdparanoia? ( media-sound/cdparanoia ) + dirac? ( media-video/dirac ) + directfb? ( dev-libs/DirectFB ) + dts? ( media-libs/libdca ) + dv? ( media-libs/libdv ) + dvb? ( media-tv/linuxtv-dvb-headers ) + encode? ( + !twolame? ( toolame? ( media-sound/toolame ) ) + twolame? ( media-sound/twolame ) + faac? ( media-libs/faac ) + mp3? ( media-sound/lame ) + x264? ( >=media-libs/x264-0.0.20091124 ) + xvid? ( media-libs/xvid ) + ) + esd? ( media-sound/esound ) + enca? ( app-i18n/enca ) + faad? ( !aac? ( media-libs/faad2 ) ) + gif? ( media-libs/giflib ) + jack? ( media-sound/jack-audio-connection-kit ) + jpeg? ( media-libs/jpeg ) + ladspa? ( media-libs/ladspa-sdk ) + libcaca? ( media-libs/libcaca ) + lirc? ( app-misc/lirc ) + live? ( media-plugins/live ) + lzo? ( >=dev-libs/lzo-2 ) + mad? ( media-libs/libmad ) + mng? ( media-libs/libmng ) + nas? ( media-libs/nas ) + nut? ( >=media-libs/libnut-661 ) + openal? ( media-libs/openal ) + amr? ( media-libs/opencore-amr ) + jpeg2k? ( media-libs/openjpeg ) + png? ( media-libs/libpng ) + pnm? ( media-libs/netpbm ) + pulseaudio? ( media-sound/pulseaudio ) + rar? ( + || ( + app-arch/unrar + app-arch/rar + ) + ) + samba? ( net-fs/samba ) + schroedinger? ( media-libs/schroedinger ) + sdl? ( media-libs/libsdl ) + speex? ( media-libs/speex ) + svga? ( media-libs/svgalib ) + theora? ( media-libs/libtheora ) + vaapi? ( x11-libs/libva ) + vorbis? ( media-libs/libvorbis ) + xanim? ( media-video/xanim ) +" + +X_DEPS=" + x11-proto/videoproto + x11-proto/xf86vidmodeproto +" +ASM_DEP="dev-lang/yasm" +DEPEND="${RDEPEND} + dev-util/pkgconfig + X? ( + ${X_DEPS} + dga? ( x11-proto/xf86dgaproto ) + dxr3? ( media-video/em8300-libraries ) + gmplayer? ( x11-proto/xextproto ) + xinerama? ( x11-proto/xineramaproto ) + xscreensaver? ( x11-proto/scrnsaverproto ) + ) + amd64? ( ${ASM_DEP} ) + doc? ( dev-libs/libxslt ) + iconv? ( virtual/libiconv ) + x86? ( ${ASM_DEP} ) + x86-fbsd? ( ${ASM_DEP} ) +" + +SLOT="0" +LICENSE="GPL-2" +if [[ ${PV} != *9999* ]]; then + KEYWORDS="~alpha ~amd64 ~arm ~hppa ~ia64 ~ppc ~ppc64 ~sparc ~x86 ~x86-fbsd" +else + KEYWORDS="" +fi + +PATCHES=( "${FILESDIR}"/vaapi/*.patch ) + +pkg_setup() { + if [[ ${PV} == *9999* ]]; then + elog "" + elog "This is a live ebuild which installs the latest from upstream's" + elog "subversion repository, and is unsupported by Gentoo." + elog "Everything but bugs in the ebuild itself will be ignored." + elog "" + fi + + if use gmplayer; then + ewarn "" + ewarn "GMPlayer is no longer actively developed upstream" + ewarn "and is not supported by Gentoo. There are alternatives" + ewarn "for a GUI frontend: smplayer, gnome-mplayer or kmplayer." + fi + + if use cpudetection; then + ewarn "" + ewarn "You've enabled the cpudetection flag. This feature is" + ewarn "included mainly for people who want to use the same" + ewarn "binary on another system with a different CPU architecture." + ewarn "MPlayer will already detect your CPU settings by default at" + ewarn "buildtime; this flag is used for runtime detection." + ewarn "You won't need this turned on if you are only building" + ewarn "mplayer for this system. Also, if your compile fails, try" + ewarn "disabling this use flag." + fi + + if use custom-cpuopts; then + ewarn "" + ewarn "You are using the custom-cpuopts flag which will" + ewarn "specifically allow you to enable / disable certain" + ewarn "CPU optimizations." + ewarn "" + ewarn "Most desktop users won't need this functionality, but it" + ewarn "is included for corner cases like cross-compiling and" + ewarn "certain profiles. If unsure, disable this flag and MPlayer" + ewarn "will automatically detect and use your available CPU" + ewarn "optimizations." + ewarn "" + ewarn "Using this flag means your build is unsupported, so" + ewarn "please make sure your CPU optimization use flags (3dnow" + ewarn "3dnowext mmx mmxext sse sse2 ssse3) are properly set." + fi +} + +src_unpack() { + [[ ${PV} = *9999* ]] && subversion_src_unpack || unpack ${A} + + if ! use truetype; then + unpack font-arial-iso-8859-1.tar.bz2 \ + font-arial-iso-8859-2.tar.bz2 \ + font-arial-cp1250.tar.bz2 + fi + + use gmplayer && unpack "Blue-${BLUV}.tar.bz2" + use svga && unpack "svgalib_helper-${SVGV}-mplayer.tar.gz" +} + +src_prepare() { + if [[ ${PV} = *9999* ]]; then + # Set SVN version manually + subversion_wc_info + sed -i s/UNKNOWN/${ESVN_WC_REVISION}/ "${S}/version.sh" + else + # Set version # + sed -i s/UNKNOWN/${MPLAYER_REVISION}/ "${S}/version.sh" + fi + + if use svga; then + echo + einfo "Enabling vidix non-root mode." + einfo "(You need a proper svgalib_helper.o module for your kernel" + einfo "to actually use this)" + echo + + mv "${WORKDIR}/svgalib_helper" "${S}/libdha" + fi + + base_src_prepare +} + +src_configure() { + local myconf="" + local uses i + + # set LINGUAS + [[ -n $LINGUAS ]] && LINGUAS="${LINGUAS/da/dk}" + + # mplayer ebuild uses "use foo || --disable-foo" to forcibly disable + # compilation in almost every situation. The reason for this is + # because if --enable is used, it will force the build of that option, + # regardless of whether the dependency is available or not. + + ################### + #Optional features# + ################### + myconf+=" + --disable-arts + --disable-kai + $(use_enable network) + $(use_enable joystick) + " + uses="bl enca ftp rtc" # nemesi <- not working with in-tree ebuild + myconf+=" --disable-nemesi" # nemesi automagic disable + for i in ${uses}; do + use ${i} || myconf+=" --disable-${i}" + done + use ass || myconf+=" --disable-ass --disable-ass-internal" + use bidi || myconf+=" --disable-fribidi" + use encode || myconf+=" --disable-mencoder" + use ipv6 || myconf+=" --disable-inet6" + use nut || myconf+=" --disable-libnut" + use rar || myconf+=" --disable-unrarexec" + use samba || myconf+=" --disable-smb" + if ! use lirc; then + myconf+=" + --disable-lirc + --disable-lircc + --disable-apple-ir + " + fi + + # libcdio support: prefer libcdio over cdparanoia + # don't check for cddb w/cdio + if use cdio; then + myconf+=" --disable-cdparanoia" + else + myconf+=" --disable-libcdio" + use cdparanoia || myconf+=" --disable-cdparanoia" + use cddb || myconf+=" --disable-cddb" + fi + + ################################ + # DVD read, navigation support # + ################################ + # + # dvdread - accessing a DVD + # dvdnav - navigation of menus + # + # internal dvdread and dvdnav use flags enable internal + # versions of the libraries, which are snapshots of the fork. + # + # Only check for disabled a52 use flag inside the DVD check, + # since many users were getting confused why there was no + # audio stream. + + if use dvd; then + use dvdnav || myconf+=" --disable-dvdnav" + else + myconf+=" + --disable-dvdnav + --disable-dvdread + --disable-dvdread-internal + --disable-libdvdcss-internal + " + use a52 || myconf+=" --disable-liba52-internal" + fi + + ############# + # Subtitles # + ############# + # + # SRT/ASS/SSA (subtitles) requires freetype support + # freetype support requires iconv + # iconv optionally can use unicode + + if ! use ass; then + if ! use truetype; then + myconf+=" --disable-freetype" + if ! use iconv; then + myconf+=" + --disable-iconv + --charset=noconv + " + fi + fi + fi + use iconv && use unicode && myconf+=" --charset=UTF-8" + + ##################################### + # DVB / Video4Linux / Radio support # + ##################################### + myconf+=" --disable-tv-bsdbt848" + # broken upstream, won't work with recent kernels + myconf+=" --disable-ivtv" + if { use dvb || use v4l || use v4l2 || use pvr || use radio; }; then + use dvb || myconf+=" --disable-dvb --disable-dvbhead" + use pvr || myconf+=" --disable-pvr" + use v4l || myconf+=" --disable-tv-v4l1" + use v4l2 || myconf+=" --disable-tv-v4l2" + if use radio && { use dvb || use v4l || use v4l2; }; then + myconf+=" + --enable-radio + $(use_enable encode radio-capture) + " + else + myconf+=" + --disable-radio-v4l2 + --disable-radio-bsdbt848 + " + fi + else + myconf+=" + --disable-tv + --disable-tv-v4l1 + --disable-tv-v4l2 + --disable-radio + --disable-radio-v4l2 + --disable-radio-bsdbt848 + --disable-dvb + --disable-dvbhead + --disable-v4l2 + --disable-pvr" + fi + + ########## + # Codecs # + ########## + # Won't work with external liba52 + myconf+=" --disable-liba52" + # Use internal musepack codecs for SV7 and SV8 support + myconf+=" --disable-musepack" + + use aac || myconf+=" --disable-faad-internal" + use dirac || myconf+=" --disable-libdirac-lavc" + use dts || myconf+=" --disable-libdca" + use dv || myconf+=" --disable-libdv" + use faad || myconf+=" --disable-faad" + use lzo || myconf+=" --disable-liblzo" + if ! use mp3; then + myconf+=" + --disable-mp3lame + --disable-mp3lame-lavc + --disable-mp3lib + " + fi + use bs2b || myconf+=" --disable-libbs2b" + use schroedinger || myconf+=" --disable-libschroedinger-lavc" + use xanim && myconf+=" --xanimcodecsdir=/usr/lib/xanim/mods" + if ! use png && ! use gmplayer; then + myconf+=" --disable-png" + fi + + uses="gif jpeg live mad mng pnm speex tga theora xanim" + for i in ${uses}; do + use ${i} || myconf+=" --disable-${i}" + done + use jpeg2k || myconf+=" --disable-libopenjpeg" + if use vorbis || use tremor; then + use tremor || myconf+=" --disable-tremor-internal" + use vorbis || myconf+=" --disable-libvorbis" + else + myconf+=" + --disable-tremor-internal + --disable-tremor + --disable-libvorbis + " + fi + # Encoding + if use encode; then + uses="faac x264 xvid toolame twolame" + for i in ${uses}; do + use ${i} || myconf+=" --disable-${i}" + done + use aac || myconf+=" --disable-faac-lavc" + else + myconf+=" + --disable-faac-lavc + --disable-faac + --disable-x264 + --disable-xvid + --disable-x264-lavc + --disable-xvid-lavc + --disable-twolame + --disable-toolame + " + uses="aac faac x264 xvid toolame twolame" + for i in ${uses}; do + use ${i} && elog "Useflag \"${i}\" require \"encode\" useflag enabled to work." + done + fi + + ################# + # Binary codecs # + ################# + # bug 213836 + if ! use x86 || ! use win32codecs; then + use quicktime || myconf+=" --disable-qtx" + fi + + ###################### + # RealPlayer support # + ###################### + # Realplayer support shows up in four places: + # - libavcodec (internal) + # - win32codecs + # - realcodecs (win32codecs libs) + # - realcodecs (realplayer libs) + + # internal + use real || myconf+=" --disable-real" + + # Real binary codec support only available on x86, amd64 + if use real; then + use x86 && myconf+=" --realcodecsdir=/opt/RealPlayer/codecs" + use amd64 && myconf+=" --realcodecsdir=/usr/$(get_libdir)/codecs" + elif ! use bindist; then + myconf+=" $(use_enable win32codecs win32dll)" + fi + + ################ + # Video Output # + ################ + uses="directfb md5sum sdl" + for i in ${uses}; do + use ${i} || myconf+=" --disable-${i}" + done + use aalib || myconf+=" --disable-aa" + use fbcon || myconf+=" --disable-fbdev" + use fbcon && use video_cards_s3virge && myconf+=" --enable-s3fb" + use libcaca || myconf+=" --disable-caca" + use zoran || myconf+=" --disable-zr" + + if ! use kernel_linux && ! use video_cards_mga; then + myconf+=" --disable-mga --disable-xmga" + fi + + if use video_cards_tdfx; then + myconf+=" + $(use_enable video_cards_tdfx tdfxvid) + $(use_enable fbcon tdfxfb) + " + else + myconf+=" + --disable-3dfx + --disable-tdfxvid + --disable-tdfxfb + " + fi + + ################ + # Audio Output # + ################ + uses="alsa esd jack ladspa nas openal" + for i in ${uses}; do + use ${i} || myconf+=" --disable-${i}" + done + use pulseaudio || myconf+=" --disable-pulse" + if ! use radio; then + use oss || myconf+=" --disable-ossaudio" + fi + + #################### + # Advanced Options # + #################### + # Platform specific flags, hardcoded on amd64 (see below) + if use cpudetection; then + myconf+=" --enable-runtime-cpudetection" + fi + + # Turning off CPU optimizations usually will break the build. + # However, this use flag, if enabled, will allow users to completely + # specify which ones to use. If disabled, mplayer will automatically + # enable all CPU optimizations that the host build supports. + if use custom-cpuopts; then + uses="3dnow 3dnowext altivec mmx mmxext shm sse sse2 ssse3" + for i in ${uses}; do + myconf+=" $(use_enable ${i})" + done + fi + + use debug && myconf+=" --enable-debug=3" + + if use x86; then + filter-flags -fPIC -fPIE + append-ldflags -nopie + fi + + append-flags -D__STDC_LIMIT_MACROS + is-flag -O? || append-flags -O2 + if use x86 || use x86-fbsd; then + use debug || append-flags -fomit-frame-pointer + fi + + ########################### + # X enabled configuration # + ########################### + if use X; then + uses="dxr3 ggi xinerama" + for i in ${uses}; do + use ${i} || myconf+=" --disable-${i}" + done + use dga || myconf+=" --disable-dga1 --disable-dga2" + use opengl || myconf+=" --disable-gl" + use osdmenu && myconf+=" --enable-menu" + use video_cards_nvidia && use vdpau || myconf+=" --disable-vdpau" + use video_cards_vesa || myconf+=" --disable-vesa" + use vidix || myconf+=" --disable-vidix --disable-vidix-pcidb" + use xscreensaver || myconf+=" --disable-xss" + use vaapi && myconf+=" --enable-vaapi" + + # GTK gmplayer gui + # Unsupported by Gentoo, upstream has dropped development + myconf+=" $(use_enable gmplayer gui)" + + if use xv; then + if use xvmc; then + myconf+=" --enable-xvmc --with-xvmclib=XvMCW" + else + myconf+=" --disable-xvmc" + fi + else + myconf+=" + --disable-xv + --disable-xvmc + " + use xvmc && elog "Disabling xvmc because it requires \"xv\" useflag enabled." + fi + else + myconf+=" + --disable-dga1 + --disable-dga2 + --disable-dxr3 + --disable-ggi + --disable-gl + --disable-vdpau + --disable-vidix + --disable-vidix-pcidb + --disable-xinerama + --disable-xss + --disable-xv + --disable-xvmc + " + uses="dga dxr3 ggi opengl osdmenu vdpau vidix xinerama xscreensaver xv" + for i in ${uses}; do + use ${i} && elog "Useflag \"${i}\" require \"X\" useflag enabled to work." + done + fi + + if [[ ${PV} == *9999* ]]; then + ################### + # External FFmpeg # + ################### + use external-ffmpeg && myconf+=" --disable-libavutil_a --disable-libavcodec_a --disable-libavformat_a --disable-libpostproc_a --disable-libswscale_a" + fi + + myconf="--cc=$(tc-getCC) \ + --host-cc=$(tc-getBUILD_CC) \ + --prefix=/usr \ + --confdir=/etc/mplayer \ + --datadir=/usr/share/mplayer \ + --libdir=/usr/$(get_libdir) \ + ${myconf}" + + CFLAGS="${CFLAGS}" ./configure ${myconf} || die "configure died" +} + +src_compile() { + base_src_compile + emake || die "Failed to build MPlayer!" + use doc && make -C DOCS/xml html-chunked +} + +src_install() { + local i + + emake prefix="${D}/usr" \ + BINDIR="${D}/usr/bin" \ + LIBDIR="${D}/usr/$(get_libdir)" \ + CONFDIR="${D}/etc/mplayer" \ + DATADIR="${D}/usr/share/mplayer" \ + MANDIR="${D}/usr/share/man" \ + INSTALLSTRIP="" \ + install || die "emake install failed" + + dodoc AUTHORS Changelog Copyright README etc/codecs.conf || die + + docinto tech/ + dodoc DOCS/tech/{*.txt,MAINTAINERS,mpsub.sub,playtree,TODO,wishlist} || die + docinto TOOLS/ + dodoc TOOLS/* || die + if use real; then + docinto tech/realcodecs/ + dodoc DOCS/tech/realcodecs/* || die + docinto TOOLS/realcodecs/ + dodoc TOOLS/realcodecs/* || die + fi + docinto tech/mirrors/ + dodoc DOCS/tech/mirrors/* || die + + if use doc; then + dohtml -r "${S}"/DOCS/HTML/* || die + fi + + # Install the default Skin and Gnome menu entry + if use gmplayer; then + dodir /usr/share/mplayer/skins + cp -r "${WORKDIR}/Blue" \ + "${D}/usr/share/mplayer/skins/default" || die "cp skins died" + + # Fix the symlink + rm -rf "${D}/usr/bin/gmplayer" + dosym mplayer /usr/bin/gmplayer + fi + + if ! use ass && ! use truetype; then + dodir /usr/share/mplayer/fonts + # Do this generic, as the mplayer people like to change the structure + # of their zips ... + for i in $(find "${WORKDIR}/" -type d -name 'font-arial-*'); do + cp -pPR "${i}" "${D}/usr/share/mplayer/fonts" + done + # Fix the font symlink ... + rm -rf "${D}/usr/share/mplayer/font" + dosym fonts/font-arial-14-iso-8859-1 /usr/share/mplayer/font + fi + + insinto /etc/mplayer + newins "${S}/etc/example.conf" mplayer.conf || die + doins "${S}/etc/input.conf" || die + if use osdmenu; then + doins "${S}/etc/menu.conf" || die + fi + + if use ass || use truetype; then + cat >> "${D}/etc/mplayer/mplayer.conf" << _EOF_ +fontconfig=1 +subfont-osd-scale=4 +subfont-text-scale=3 +_EOF_ + fi + + # bug 256203 + if use rar; then + cat >> "${D}/etc/mplayer/mplayer.conf" << _EOF_ +unrarexec=/usr/bin/unrar +_EOF_ + fi + + dosym ../../../etc/mplayer/mplayer.conf /usr/share/mplayer/mplayer.conf + newbin "${S}/TOOLS/midentify.sh" midentify || die +} + +pkg_preinst() { + [[ -d ${ROOT}/usr/share/mplayer/Skin/default ]] && \ + rm -rf "${ROOT}/usr/share/mplayer/Skin/default" +} + +pkg_postrm() { + # Cleanup stale symlinks + [ -L "${ROOT}/usr/share/mplayer/font" -a \ + ! -e "${ROOT}/usr/share/mplayer/font" ] && \ + rm -f "${ROOT}/usr/share/mplayer/font" + + [ -L "${ROOT}/usr/share/mplayer/subfont.ttf" -a \ + ! -e "${ROOT}/usr/share/mplayer/subfont.ttf" ] && \ + rm -f "${ROOT}/usr/share/mplayer/subfont.ttf" +} diff --git a/net-misc/mimms/Manifest b/net-misc/mimms/Manifest new file mode 100644 index 0000000..83f7ebf --- /dev/null +++ b/net-misc/mimms/Manifest @@ -0,0 +1,2 @@ +DIST mimms-3.2.1.tar.bz2 18224 RMD160 669d5d80ae9bd318bf98c032197fa6980622182e SHA1 279eee76dd4032cd2c1dddf1d49292a952c57b80 SHA256 92cd3e1800d8bd637268274196f6baec0d95aa8e709714093dd96ba8893c2354 +EBUILD mimms-3.2.1.ebuild 560 RMD160 cc60c30e0eccb128a9b8029cdc0680eee0084bfa SHA1 dc55dde5b493c3b9895b0fd373938c20b40fd7e6 SHA256 8abb64c05636a2c6c1884a4d3838ed8b89d7e4496026209db5d134157927d4e8 diff --git a/net-misc/mimms/mimms-3.2.1.ebuild b/net-misc/mimms/mimms-3.2.1.ebuild new file mode 100644 index 0000000..b54f45a --- /dev/null +++ b/net-misc/mimms/mimms-3.2.1.ebuild @@ -0,0 +1,25 @@ +# Copyright 1999-2010 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header: $ + +EAPI="2" +SUPPORT_PYTHON_ABIS="1" + +NEED_PYTHON="2.5" +inherit distutils + +DESCRIPTION="mms stream downloader that uses libmms" +HOMEPAGE="http://savannah.nongnu.org/projects/mimms/" +SRC_URI="http://savannah.nongnu.org/download/${PN}/${P}.tar.bz2" + +LICENSE="GPL-3" +SLOT="0" +KEYWORDS="~amd64 ~x86" +IUSE="" + +DEPEND="media-libs/libmms <dev-lang/python-3" +RDEPEND="${DEPEND}" + +RESTRICT_PYTHON_ABIS="3*" + +DOCS="AUTHORS NEWS README teststreams.list" diff --git a/net-misc/ndisc6/Manifest b/net-misc/ndisc6/Manifest new file mode 100644 index 0000000..be80868 --- /dev/null +++ b/net-misc/ndisc6/Manifest @@ -0,0 +1,2 @@ +DIST ndisc6-0.9.9.tar.bz2 233493 RMD160 19f9f9dbd5f072a57ccffe8acad2f3fb8a06eb87 SHA1 9abca715b07b5aab6aa95335aad1bffa4edc6916 SHA256 fbc5909f9509082bf235c040071b3c2ff9f58af48b4e39c4c6bf706690c9cc44 +EBUILD ndisc6-0.9.9.ebuild 710 RMD160 d57f6e4e2b0bbfd9449f4d0d33d5e3e181c2af74 SHA1 d48e417f421ca395a226eba62cfb0da1fc54f688 SHA256 a2b2642c46dddf0f554f94602158d33152f23af98a9edd2b929f2441ce8c2881 diff --git a/net-misc/ndisc6/ndisc6-0.9.9.ebuild b/net-misc/ndisc6/ndisc6-0.9.9.ebuild new file mode 100644 index 0000000..fd7a486 --- /dev/null +++ b/net-misc/ndisc6/ndisc6-0.9.9.ebuild @@ -0,0 +1,27 @@ +# Copyright 1999-2008 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header$ + +DESCRIPTION="Tools for IPv6 networking" +HOMEPAGE="http://www.remlab.net/ndisc6/" +SRC_URI="http://www.remlab.net/files/ndisc6/${P}.tar.bz2" + +LICENSE="GPL-2" +SLOT="0" +KEYWORDS="~amd64 ~x86" + +DEPEND="dev-lang/perl sys-devel/gettext" + +src_compile() { + econf --localstatedir=/var || die "econf failed" + emake || die "emake failed" +} + +src_install() { + make DESTDIR="${D}" install || die "make install failed" + dodoc README ChangeLog NEWS AUTHORS INSTALL +# newinitd "${FILESDIR}"/rdnssd.rc rdnssd +# newconfd "${FILESDIR}"/rdnssd.conf rdnssd +# exeinto /etc/rdnssd +# doexe "${FILESDIR}"/resolvconf +} diff --git a/profiles/repo_name b/profiles/repo_name new file mode 100644 index 0000000..d125f84 --- /dev/null +++ b/profiles/repo_name @@ -0,0 +1 @@ +xhub diff --git a/sys-apps/v86d/Manifest b/sys-apps/v86d/Manifest new file mode 100644 index 0000000..b56bd4f --- /dev/null +++ b/sys-apps/v86d/Manifest @@ -0,0 +1,4 @@ +AUX v86d-0.1.9-915resolution.patch 27936 RMD160 69114c1f02a7fe98744df4361fc4f8850c766f7e SHA1 7df9358d5db2d2739b40026d765988d441673d8f SHA256 b08df989846d6647ad6040594c9891be38ca3c170e7229f37293e7415d5a2417 +AUX v86d-0.1.9-prot_write.patch 1020 RMD160 5cd1a337dbd5316e6ef1e7cb14c024f051bb3272 SHA1 fe63622120c164e5b95d37f347d234bfb5ed28a9 SHA256 faaf65c087887e1c78f6c8c92eed6fa89d87128d5cdff462fbb00081f0a3e4fb +DIST v86d-0.1.9.tar.bz2 69752 RMD160 e2d9cda4e8b40a5002c8448d1954a06c5fddb3bf SHA1 ca16ae61329847955ca65da3222131866703a02a SHA256 8167dec4ff919cfd73f854bbd3244f05c2b867e014fa8298044ea7cfd66d18a8 +EBUILD v86d-0.1.9.ebuild 1595 RMD160 98250c756f07939a6060648a1bec833179b6fd62 SHA1 f4b72891c046c9c939795dd3b2b6f402aa886f70 SHA256 5b1157c607b0f7d60afbde75339e7791b351522457e52020ec4b5d080236eedf diff --git a/sys-apps/v86d/files/v86d-0.1.9-915resolution.patch b/sys-apps/v86d/files/v86d-0.1.9-915resolution.patch new file mode 100644 index 0000000..9f8c16b --- /dev/null +++ b/sys-apps/v86d/files/v86d-0.1.9-915resolution.patch @@ -0,0 +1,1005 @@ +diff -Naur v86d-0.1.9.orig/915resolution.c v86d-0.1.9/915resolution.c +--- v86d-0.1.9.orig/915resolution.c 1970-01-01 01:00:00.000000000 +0100 ++++ v86d-0.1.9/915resolution.c 2008-10-04 15:53:23.155038024 +0200 +@@ -0,0 +1,964 @@ ++/* 915 resolution by steve tomljenovic ++ * ++ * This was tested only on Sony VGN-FS550. Use at your own risk ++ * ++ * This code is based on the techniques used in : ++ * ++ * - 855patch. Many thanks to Christian Zietz (czietz gmx net) ++ * for demonstrating how to shadow the VBIOS into system RAM ++ * and then modify it. ++ * ++ * - 1280patch by Andrew Tipton (andrewtipton null li). ++ * ++ * - 855resolution by Alain Poirier ++ * ++ * This source code is into the public domain. ++ */ ++ ++#include <stdio.h> ++#include <stdlib.h> ++#include <unistd.h> ++#define __USE_GNU ++#include <string.h> ++#include <sys/mman.h> ++#include <fcntl.h> ++ ++#if defined(__NetBSD__) ++#include <sys/types.h> ++#include <machine/sysarch.h> ++#include "bsd_io.h" ++#elif defined(__FreeBSD__) ++#include "bsd_io.h" ++#elif defined(linux) ++#include <sys/io.h> ++#endif ++ ++#include <unistd.h> ++#include <assert.h> ++ ++ ++ ++#define NEW(a) ((a *)(calloc(1, sizeof(a)))) ++#define FREE(a) (free(a)) ++ ++#define VBIOS_START 0xc0000 ++#define VBIOS_SIZE 0x10000 ++ ++#define VBIOS_FILE "/dev/mem" ++ ++#define FALSE 0 ++#define TRUE 1 ++ ++#define MODE_TABLE_OFFSET_845G 617 ++ ++#define VERSION "0.5.3" ++ ++#define ATI_SIGNATURE1 "ATI MOBILITY RADEON" ++#define ATI_SIGNATURE2 "ATI Technologies Inc" ++#define NVIDIA_SIGNATURE "NVIDIA Corp" ++#define INTEL_SIGNATURE "Intel Corp" ++ ++typedef unsigned char * address; ++typedef unsigned char byte; ++typedef unsigned short word; ++typedef unsigned char boolean; ++typedef unsigned int cardinal; ++ ++typedef enum { ++ CT_UNKWN, CT_830, CT_845G, CT_855GM, CT_865G, CT_915G, CT_915GM, CT_945G, CT_945GM, ++ CT_946GZ, CT_G965, CT_Q965, CT_965GM ++} chipset_type; ++ ++char * chipset_type_names[] = { ++ "UNKNOWN", "830", "845G", "855GM", "865G", "915G", "915GM", "945G", "945GM", ++ "946GZ", "G965", "Q965", "965GM" ++}; ++ ++typedef enum { ++ BT_UNKWN, BT_1, BT_2, BT_3 ++} bios_type; ++ ++char * bios_type_names[] = {"UNKNOWN", "TYPE 1", "TYPE 2", "TYPE 3"}; ++ ++int freqs[] = { 60, 75, 85 }; ++ ++typedef struct { ++ byte mode; ++ byte bits_per_pixel; ++ word resolution; ++ byte unknown; ++} __attribute__((packed)) vbios_mode; ++ ++typedef struct { ++ byte unknow1[2]; ++ byte x1; ++ byte x_total; ++ byte x2; ++ byte y1; ++ byte y_total; ++ byte y2; ++} __attribute__((packed)) vbios_resolution_type1; ++ ++typedef struct { ++ unsigned long clock; ++ ++ word x1; ++ word htotal; ++ word x2; ++ word hblank; ++ word hsyncstart; ++ word hsyncend; ++ ++ word y1; ++ word vtotal; ++ word y2; ++ word vblank; ++ word vsyncstart; ++ word vsyncend; ++} __attribute__((packed)) vbios_modeline_type2; ++ ++typedef struct { ++ byte xchars; ++ byte ychars; ++ byte unknown[4]; ++ ++ vbios_modeline_type2 modelines[]; ++} __attribute__((packed)) vbios_resolution_type2; ++ ++typedef struct { ++ unsigned long clock; ++ ++ word x1; ++ word htotal; ++ word x2; ++ word hblank; ++ word hsyncstart; ++ word hsyncend; ++ ++ word y1; ++ word vtotal; ++ word y2; ++ word vblank; ++ word vsyncstart; ++ word vsyncend; ++ ++ word timing_h; ++ word timing_v; ++ ++ byte unknown[6]; ++} __attribute__((packed)) vbios_modeline_type3; ++ ++typedef struct { ++ unsigned char unknown[6]; ++ ++ vbios_modeline_type3 modelines[]; ++} __attribute__((packed)) vbios_resolution_type3; ++ ++ ++typedef struct { ++ cardinal chipset_id; ++ chipset_type chipset; ++ bios_type bios; ++ ++ int bios_fd; ++ address bios_ptr; ++ ++ vbios_mode * mode_table; ++ cardinal mode_table_size; ++ ++ byte b1, b2; ++ ++ boolean unlocked; ++} vbios_map; ++ ++ ++void initialize_system(char * filename) { ++ if (!filename) { ++#if defined(__FreeBSD__) ++ int iofd = open("/dev/io", O_RDONLY); ++ if (iofd == -1) { ++ perror("Unable to obtain the proper IO permissions"); ++ exit(2); ++ } ++#elif defined(__NetBSD__) ++ if (i386_iopl(3) < 0) { ++ perror("Unable to obtain the proper IO permissions"); ++ exit(2); ++ } ++#elif defined(linux) ++ if (iopl(3) < 0) { ++ perror("Unable to obtain the proper IO permissions"); ++ exit(2); ++ } ++#else ++#error Not ported to this operating system ++#endif ++ } ++} ++ ++cardinal get_chipset_id(void) { ++ outl(0x80000000, 0xcf8); ++ return inl(0xcfc); ++} ++ ++chipset_type get_chipset(cardinal id) { ++ chipset_type type; ++ ++ switch (id) { ++ case 0x35758086: ++ type = CT_830; ++ break; ++ ++ case 0x25608086: ++ type = CT_845G; ++ break; ++ ++ case 0x35808086: ++ type = CT_855GM; ++ break; ++ ++ case 0x25708086: ++ type = CT_865G; ++ break; ++ ++ case 0x25808086: ++ type = CT_915G; ++ break; ++ ++ case 0x25908086: ++ type = CT_915GM; ++ break; ++ ++ case 0x27708086: ++ type = CT_945G; ++ break; ++ ++ case 0x27a08086: ++ type = CT_945GM; ++ break; ++ ++ case 0x29708086: ++ type = CT_946GZ; ++ break; ++ ++ case 0x29a08086: ++ type = CT_G965; ++ break; ++ ++ case 0x29908086: ++ type = CT_Q965; ++ break; ++ ++ case 0x2a008086: ++ type = CT_965GM; ++ break; ++ ++ default: ++ type = CT_UNKWN; ++ break; ++ } ++ ++ return type; ++} ++ ++ ++vbios_resolution_type1 * map_type1_resolution(vbios_map * map, word res) { ++ vbios_resolution_type1 * ptr = ((vbios_resolution_type1*)(map->bios_ptr + res)); ++ return ptr; ++} ++ ++vbios_resolution_type2 * map_type2_resolution(vbios_map * map, word res) { ++ vbios_resolution_type2 * ptr = ((vbios_resolution_type2*)(map->bios_ptr + res)); ++ return ptr; ++} ++ ++vbios_resolution_type3 * map_type3_resolution(vbios_map * map, word res) { ++ vbios_resolution_type3 * ptr = ((vbios_resolution_type3*)(map->bios_ptr + res)); ++ return ptr; ++} ++ ++ ++boolean detect_bios_type(vbios_map * map, boolean modeline, int entry_size) { ++ int i; ++ short int r1, r2; ++ float f; ++ ++ r1 = r2 = 32000; ++ ++ for (i=0; i < map->mode_table_size; i++) { ++ if (map->mode_table[i].resolution <= r1) { ++ r1 = map->mode_table[i].resolution; ++ } ++ else { ++ if (map->mode_table[i].resolution <= r2) { ++ r2 = map->mode_table[i].resolution; ++ } ++ } ++ ++ /*printf("r1 = %d r2 = %d\n", r1, r2);*/ ++ } ++ ++ ++ f = ((float) (r2-r1-6)) / entry_size; ++ ++ return f == (int) f; ++} ++ ++ ++void close_vbios(vbios_map * map); ++ ++ ++vbios_map * open_vbios(char * filename, chipset_type forced_chipset) { ++ vbios_map * map = NEW(vbios_map); ++ ++ /* ++ * Determine chipset ++ */ ++ ++ if (!filename && forced_chipset == CT_UNKWN) { ++ map->chipset_id = get_chipset_id(); ++ ++ map->chipset = get_chipset(map->chipset_id); ++ } ++ else if (forced_chipset != CT_UNKWN) { ++ map->chipset = forced_chipset; ++ } ++ else { ++ map->chipset = CT_915GM; ++ } ++ ++ /* ++ * Map the video bios to memory ++ */ ++ ++ if (!filename) { ++ map->bios_fd = open(VBIOS_FILE, O_RDWR); ++ if(map->bios_fd < 0) { ++ if (map->chipset == CT_UNKWN) { ++ fprintf(stderr, "Invalid chipset detected: %x\n", map->chipset_id); ++ } ++ perror("Unable to open the BIOS file"); ++ exit(2); ++ } ++ ++ map->bios_ptr = mmap(0, VBIOS_SIZE, ++ PROT_READ | PROT_WRITE, MAP_SHARED, ++ map->bios_fd, VBIOS_START); ++ ++ if (map->bios_ptr == MAP_FAILED) { ++ if (map->chipset == CT_UNKWN) { ++ fprintf(stderr, "Invalid chipset detected: %x\n", map->chipset_id); ++ } ++ perror("Cannot mmap() the video BIOS\n"); ++ close(map->bios_fd); ++ exit(2); ++ } ++ } ++ else { ++ map->bios_fd = open(filename, O_RDWR); ++ if(map->bios_fd < 0) { ++ if (map->chipset == CT_UNKWN) { ++ fprintf(stderr, "Invalid chipset detected: %x\n", map->chipset_id); ++ } ++ perror("Unable to open the BIOS file"); ++ exit(2); ++ } ++ ++ map->bios_ptr = mmap(0, VBIOS_SIZE, ++ PROT_READ | PROT_WRITE, MAP_SHARED, ++ map->bios_fd, 0); ++ ++ if (map->bios_ptr == MAP_FAILED) { ++ if (map->chipset == CT_UNKWN) { ++ fprintf(stderr, "Invalid chipset detected: %x\n", map->chipset_id); ++ } ++ perror("Cannot mmap() the BIOS file\n"); ++ close(map->bios_fd); ++ exit(2); ++ } ++ } ++ ++ /* ++ * check if we have ATI Radeon ++ */ ++ ++ if (memmem(map->bios_ptr, VBIOS_SIZE, ATI_SIGNATURE1, strlen(ATI_SIGNATURE1)) || ++ memmem(map->bios_ptr, VBIOS_SIZE, ATI_SIGNATURE2, strlen(ATI_SIGNATURE2)) ) { ++ fprintf(stderr, "ATI chipset detected. 915resolution only works with Intel 800/900 series graphic chipsets.\n"); ++ close(map->bios_fd); ++ exit(2); ++ } ++ ++ /* ++ * check if we have NVIDIA ++ */ ++ ++ if (memmem(map->bios_ptr, VBIOS_SIZE, NVIDIA_SIGNATURE, strlen(NVIDIA_SIGNATURE))) { ++ fprintf(stderr, "NVIDIA chipset detected. 915resolution only works with Intel 800/900 series graphic chipsets.\n"); ++ close(map->bios_fd); ++ exit(2); ++ } ++ ++ /* ++ * check if we have Intel ++ */ ++ ++ if (map->chipset == CT_UNKWN && memmem(map->bios_ptr, VBIOS_SIZE, INTEL_SIGNATURE, strlen(INTEL_SIGNATURE))) { ++ fprintf(stderr, "Intel chipset detected. However, 915resolution was unable to determine the chipset type.\n"); ++ ++ fprintf(stderr, "Chipset Id: %x\n", map->chipset_id); ++ ++ fprintf(stderr, "Please report this problem to stomljen@yahoo.com\n"); ++ ++ close_vbios(map); ++ exit(2); ++ } ++ ++ /* ++ * check for others ++ */ ++ ++ if (map->chipset == CT_UNKWN) { ++ fprintf(stderr, "Unknown chipset type and unrecognized bios.\n"); ++ fprintf(stderr, "915resolution only works with Intel 800/900 series graphic chipsets.\n"); ++ ++ fprintf(stderr, "Chipset Id: %x\n", map->chipset_id); ++ close_vbios(map); ++ exit(2); ++ } ++ ++ /* ++ * Figure out where the mode table is ++ */ ++ ++ { ++ address p = map->bios_ptr + 16; ++ address limit = map->bios_ptr + VBIOS_SIZE - (3 * sizeof(vbios_mode)); ++ ++ while (p < limit && map->mode_table == 0) { ++ vbios_mode * mode_ptr = (vbios_mode *) p; ++ ++ if (((mode_ptr[0].mode & 0xf0) == 0x30) && ((mode_ptr[1].mode & 0xf0) == 0x30) && ++ ((mode_ptr[2].mode & 0xf0) == 0x30) && ((mode_ptr[3].mode & 0xf0) == 0x30)) { ++ ++ map->mode_table = mode_ptr; ++ } ++ ++ p++; ++ } ++ ++ if (map->mode_table == 0) { ++ fprintf(stderr, "Unable to locate the mode table.\n"); ++ fprintf(stderr, "Please run the program 'dump_bios' as root and\n"); ++ fprintf(stderr, "email the file 'vbios.dmp' to stomljen@yahoo.com.\n"); ++ ++ fprintf(stderr, "Chipset: %s\n", chipset_type_names[map->chipset]); ++ close_vbios(map); ++ exit(2); ++ } ++ } ++ ++ /* ++ * Determine size of mode table ++ */ ++ ++ { ++ vbios_mode * mode_ptr = map->mode_table; ++ ++ while (mode_ptr->mode != 0xff) { ++ map->mode_table_size++; ++ mode_ptr++; ++ } ++ } ++ ++ /* ++ * Figure out what type of bios we have ++ * order of detection is important ++ */ ++ ++ if (detect_bios_type(map, TRUE, sizeof(vbios_modeline_type3))) { ++ map->bios = BT_3; ++ } ++ else if (detect_bios_type(map, TRUE, sizeof(vbios_modeline_type2))) { ++ map->bios = BT_2; ++ } ++ else if (detect_bios_type(map, FALSE, sizeof(vbios_resolution_type1))) { ++ map->bios = BT_1; ++ } ++ else { ++ fprintf(stderr, "Unable to determine bios type.\n"); ++ fprintf(stderr, "Please run the program 'dump_bios' as root and\n"); ++ fprintf(stderr, "email the file 'vbios.dmp' to stomljen@yahoo.com.\n"); ++ ++ fprintf(stderr, "Chipset: %s\n", chipset_type_names[map->chipset]); ++ fprintf(stderr, "Mode Table Offset: $C0000 + $%x\n", ((cardinal)map->mode_table) - ((cardinal)map->bios_ptr)); ++ fprintf(stderr, "Mode Table Entries: %u\n", map->mode_table_size); ++ exit(2); ++ } ++ ++ return map; ++} ++ ++void close_vbios(vbios_map * map) { ++ assert(!map->unlocked); ++ ++ if(map->bios_ptr == MAP_FAILED) { ++ fprintf(stderr, "BIOS should be open already!\n"); ++ exit(2); ++ } ++ ++ munmap(map->bios_ptr, VBIOS_SIZE); ++ close(map->bios_fd); ++ ++ FREE(map); ++} ++ ++void unlock_vbios(vbios_map * map) { ++ ++ assert(!map->unlocked); ++ ++ map->unlocked = TRUE; ++ ++ switch (map->chipset) { ++ case CT_UNKWN: ++ break; ++ case CT_830: ++ case CT_855GM: ++ outl(0x8000005a, 0xcf8); ++ map->b1 = inb(0xcfe); ++ ++ outl(0x8000005a, 0xcf8); ++ outb(0x33, 0xcfe); ++ break; ++ case CT_845G: ++ case CT_865G: ++ case CT_915G: ++ case CT_915GM: ++ case CT_945G: ++ case CT_945GM: ++ case CT_946GZ: ++ case CT_G965: ++ case CT_Q965: ++ case CT_965GM: ++ outl(0x80000090, 0xcf8); ++ map->b1 = inb(0xcfd); ++ map->b2 = inb(0xcfe); ++ ++ outl(0x80000090, 0xcf8); ++ outb(0x33, 0xcfd); ++ outb(0x33, 0xcfe); ++ break; ++ } ++ ++#if DEBUG ++ { ++ cardinal t = inl(0xcfc); ++ printf("unlock PAM: (0x%08x)\n", t); ++ } ++#endif ++} ++ ++void relock_vbios(vbios_map * map) { ++ ++ assert(map->unlocked); ++ map->unlocked = FALSE; ++ ++ switch (map->chipset) { ++ case CT_UNKWN: ++ break; ++ case CT_830: ++ case CT_855GM: ++ outl(0x8000005a, 0xcf8); ++ outb(map->b1, 0xcfe); ++ break; ++ case CT_845G: ++ case CT_865G: ++ case CT_915G: ++ case CT_915GM: ++ case CT_945G: ++ case CT_945GM: ++ case CT_946GZ: ++ case CT_G965: ++ case CT_Q965: ++ case CT_965GM: ++ outl(0x80000090, 0xcf8); ++ outb(map->b1, 0xcfd); ++ outb(map->b2, 0xcfe); ++ break; ++ } ++ ++#if DEBUG ++ { ++ cardinal t = inl(0xcfc); ++ printf("relock PAM: (0x%08x)\n", t); ++ } ++#endif ++} ++ ++ ++void list_modes(vbios_map *map, cardinal raw) { ++ cardinal i, x, y; ++ ++ for (i=0; i < map->mode_table_size; i++) { ++ switch(map->bios) { ++ case BT_1: ++ { ++ vbios_resolution_type1 * res = map_type1_resolution(map, map->mode_table[i].resolution); ++ ++ x = ((((cardinal) res->x2) & 0xf0) << 4) | res->x1; ++ y = ((((cardinal) res->y2) & 0xf0) << 4) | res->y1; ++ ++ if (x != 0 && y != 0) { ++ printf("Mode %02x : %dx%d, %d bits/pixel\n", map->mode_table[i].mode, x, y, map->mode_table[i].bits_per_pixel); ++ } ++ ++ if (raw) ++ { ++ printf("Mode %02x (raw) :\n\t%02x %02x\n\t%02x\n\t%02x\n\t%02x\n\t%02x\n\t%02x\n\t%02x\n", map->mode_table[i].mode, res->unknow1[0],res->unknow1[1], res->x1,res->x_total,res->x2,res->y1,res->y_total,res->y2); ++ } ++ ++ } ++ break; ++ case BT_2: ++ { ++ vbios_resolution_type2 * res = map_type2_resolution(map, map->mode_table[i].resolution); ++ ++ x = res->modelines[0].x1+1; ++ y = res->modelines[0].y1+1; ++ ++ if (x != 0 && y != 0) { ++ printf("Mode %02x : %dx%d, %d bits/pixel\n", map->mode_table[i].mode, x, y, map->mode_table[i].bits_per_pixel); ++ } ++ } ++ break; ++ case BT_3: ++ { ++ vbios_resolution_type3 * res = map_type3_resolution(map, map->mode_table[i].resolution); ++ ++ x = res->modelines[0].x1+1; ++ y = res->modelines[0].y1+1; ++ ++ if (x != 0 && y != 0) { ++ printf("Mode %02x : %dx%d, %d bits/pixel\n", map->mode_table[i].mode, x, y, map->mode_table[i].bits_per_pixel); ++ } ++ } ++ break; ++ case BT_UNKWN: ++ break; ++ } ++ } ++} ++ ++static void gtf_timings(int x, int y, int freq, ++ unsigned long *clock, ++ word *hsyncstart, word *hsyncend, word *hblank, ++ word *vsyncstart, word *vsyncend, word *vblank) ++{ ++ int hbl, vbl, vfreq; ++ ++ vbl = y + (y+1)/(20000.0/(11*freq) - 1) + 1.5; ++ vfreq = vbl * freq; ++ hbl = 16 * (int)(x * (30.0 - 300000.0 / vfreq) / ++ (70.0 + 300000.0 / vfreq) / 16.0 + 0.5); ++ ++ *vsyncstart = y; ++ *vsyncend = y + 3; ++ *vblank = vbl - 1; ++ *hsyncstart = x + hbl / 2 - (x + hbl + 50) / 100 * 8 - 1; ++ *hsyncend = x + hbl / 2 - 1; ++ *hblank = x + hbl - 1; ++ *clock = (x + hbl) * vfreq / 1000; ++} ++ ++void set_mode(vbios_map * map, cardinal mode, cardinal x, cardinal y, cardinal bp, cardinal htotal, cardinal vtotal) { ++ int xprev, yprev; ++ cardinal i, j; ++ ++ for (i=0; i < map->mode_table_size; i++) { ++ if (map->mode_table[i].mode == mode) { ++ switch(map->bios) { ++ case BT_1: ++ { ++ vbios_resolution_type1 * res = map_type1_resolution(map, map->mode_table[i].resolution); ++ ++ if (bp) { ++ map->mode_table[i].bits_per_pixel = bp; ++ } ++ ++ res->x2 = (htotal?(((htotal-x) >> 8) & 0x0f) : (res->x2 & 0x0f)) | ((x >> 4) & 0xf0); ++ res->x1 = (x & 0xff); ++ ++ res->y2 = (vtotal?(((vtotal-y) >> 8) & 0x0f) : (res->y2 & 0x0f)) | ((y >> 4) & 0xf0); ++ res->y1 = (y & 0xff); ++ if (htotal) ++ res->x_total = ((htotal-x) & 0xff); ++ ++ if (vtotal) ++ res->y_total = ((vtotal-y) & 0xff); ++ } ++ break; ++ case BT_2: ++ { ++ vbios_resolution_type2 * res = map_type2_resolution(map, map->mode_table[i].resolution); ++ ++ res->xchars = x / 8; ++ res->ychars = y / 16 - 1; ++ xprev = res->modelines[0].x1; ++ yprev = res->modelines[0].y1; ++ ++ for(j=0; j < 3; j++) { ++ vbios_modeline_type2 * modeline = &res->modelines[j]; ++ ++ if (modeline->x1 == xprev && modeline->y1 == yprev) { ++ modeline->x1 = modeline->x2 = x-1; ++ modeline->y1 = modeline->y2 = y-1; ++ ++ gtf_timings(x, y, freqs[j], &modeline->clock, ++ &modeline->hsyncstart, &modeline->hsyncend, ++ &modeline->hblank, &modeline->vsyncstart, ++ &modeline->vsyncend, &modeline->vblank); ++ ++ if (htotal) ++ modeline->htotal = htotal; ++ else ++ modeline->htotal = modeline->hblank; ++ ++ if (vtotal) ++ modeline->vtotal = vtotal; ++ else ++ modeline->vtotal = modeline->vblank; ++ } ++ } ++ } ++ break; ++ case BT_3: ++ { ++ vbios_resolution_type3 * res = map_type3_resolution(map, map->mode_table[i].resolution); ++ ++ xprev = res->modelines[0].x1; ++ yprev = res->modelines[0].y1; ++ ++ for (j=0; j < 3; j++) { ++ vbios_modeline_type3 * modeline = &res->modelines[j]; ++ ++ if (modeline->x1 == xprev && modeline->y1 == yprev) { ++ modeline->x1 = modeline->x2 = x-1; ++ modeline->y1 = modeline->y2 = y-1; ++ ++ gtf_timings(x, y, freqs[j], &modeline->clock, ++ &modeline->hsyncstart, &modeline->hsyncend, ++ &modeline->hblank, &modeline->vsyncstart, ++ &modeline->vsyncend, &modeline->vblank); ++ if (htotal) ++ modeline->htotal = htotal; ++ else ++ modeline->htotal = modeline->hblank; ++ if (vtotal) ++ modeline->vtotal = vtotal; ++ else ++ modeline->vtotal = modeline->vblank; ++ ++ modeline->timing_h = y-1; ++ modeline->timing_v = x-1; ++ } ++ } ++ } ++ break; ++ case BT_UNKWN: ++ break; ++ } ++ } ++ } ++} ++ ++void display_map_info(vbios_map * map) { ++ printf("Chipset: %s\n", chipset_type_names[map->chipset]); ++ printf("BIOS: %s\n", bios_type_names[map->bios]); ++ ++ printf("Mode Table Offset: $C0000 + $%x\n", ((cardinal)map->mode_table) - ((cardinal)map->bios_ptr)); ++ printf("Mode Table Entries: %u\n", map->mode_table_size); ++} ++ ++ ++int parse_args(int argc, char *argv[], char ** filename, chipset_type *forced_chipset, cardinal *list, cardinal *mode, cardinal *x, cardinal *y, cardinal *bp, cardinal *raw, cardinal *htotal, cardinal *vtotal) { ++ cardinal index = 1; ++ ++ *list = *mode = *x = *y = *raw = *htotal = *vtotal = 0; ++ ++ *forced_chipset = CT_UNKWN; ++ ++ *filename = NULL; ++ ++ if ((argc > index) && !strcmp(argv[index], "-f")) { ++ index++; ++ ++ if(argc<=index) { ++ return 0; ++ } ++ ++ *filename = argv[index]; ++ ++ index++; ++ ++ if(argc<=index) { ++ return 0; ++ } ++ } ++ ++ if ((argc > index) && !strcmp(argv[index], "-c")) { ++ index++; ++ ++ if(argc<=index) { ++ return 0; ++ } ++ ++ if (!strcmp(argv[index], "845")) { ++ *forced_chipset = CT_845G; ++ } ++ else if (!strcmp(argv[index], "855")) { ++ *forced_chipset = CT_855GM; ++ } ++ else if (!strcmp(argv[index], "865")) { ++ *forced_chipset = CT_865G; ++ } ++ else if (!strcmp(argv[index], "915G")) { ++ *forced_chipset = CT_915G; ++ } ++ else if (!strcmp(argv[index], "915GM")) { ++ *forced_chipset = CT_915GM; ++ } ++ else if (!strcmp(argv[index], "945G")) { ++ *forced_chipset = CT_945G; ++ } ++ else if (!strcmp(argv[index], "945GM")) { ++ *forced_chipset = CT_945GM; ++ } ++ else if (!strcmp(argv[index], "946GZ")) { ++ *forced_chipset = CT_946GZ; ++ } ++ else if (!strcmp(argv[index], "G965")) { ++ *forced_chipset = CT_G965; ++ } ++ else if (!strcmp(argv[index], "965GM")) { ++ *forced_chipset = CT_965GM; ++ } ++ else if (!strcmp(argv[index], "Q965")) { ++ *forced_chipset = CT_Q965; ++ } ++ else { ++ *forced_chipset = CT_UNKWN; ++ } ++ ++ index++; ++ ++ if (argc<=index) { ++ return 0; ++ } ++ } ++ ++ if ((argc > index) && !strcmp(argv[index], "-l")) { ++ *list = 1; ++ index++; ++ ++ if(argc<=index) { ++ return 0; ++ } ++ } ++ ++ if ((argc > index) && !strcmp(argv[index], "-r")) { ++ *raw = 1; ++ index++; ++ ++ if(argc<=index) { ++ return 0; ++ } ++ } ++ ++ if (argc-index < 3 || argc-index > 6) { ++ return -1; ++ } ++ ++ *mode = (cardinal) strtol(argv[index], NULL, 16); ++ *x = (cardinal)atoi(argv[index+1]); ++ *y = (cardinal)atoi(argv[index+2]); ++ ++ ++ if (argc-index > 3) { ++ *bp = (cardinal)atoi(argv[index+3]); ++ } ++ else { ++ *bp = 0; ++ } ++ ++ if (argc-index > 4) { ++ *htotal = (cardinal)atoi(argv[index+4]); ++ } ++ else { ++ *htotal = 0; ++ } ++ ++ if (argc-index > 5) { ++ *vtotal = (cardinal)atoi(argv[index+5]); ++ } ++ else { ++ *vtotal = 0; ++ } ++ ++ return 0; ++} ++ ++void usage(char *name) { ++ printf("Usage: %s [-f file] [-c chipset] [-l] [mode X Y] [bits/pixel] [htotal] [vtotal]\n", name); ++ printf(" Set the resolution to XxY for a video mode\n"); ++ printf(" Bits per pixel are optional. htotal/vtotal settings are additionally optional.\n"); ++ printf(" Options:\n"); ++ printf(" -f use an alternate file (THIS IS USED FOR DEBUG PURPOSES)\n"); ++ printf(" -c force chipset type (THIS IS USED FOR DEBUG PURPOSES)\n"); ++ printf(" -l display the modes found in the video BIOS\n"); ++ printf(" -r display the modes found in the video BIOS in raw mode (THIS IS USED FOR DEBUG PURPOSES)\n"); ++} ++ ++int main_915 (int argc, char *argv[]) { ++ vbios_map * map; ++ cardinal list, mode, x, y, bp, raw, htotal, vtotal; ++ char * filename; ++ chipset_type forced_chipset; ++ ++ printf("Intel 800/900 Series VBIOS Hack : version %s\n\n", VERSION); ++ ++ if (parse_args(argc, argv, &filename, &forced_chipset, &list, &mode, &x, &y, &bp, &raw, &htotal, &vtotal) == -1) { ++ usage(argv[0]); ++ return 2; ++ } ++ ++ initialize_system(filename); ++ ++ map = open_vbios(filename, forced_chipset); ++ display_map_info(map); ++ ++ printf("\n"); ++ ++ if (list) { ++ list_modes(map, raw); ++ } ++ ++ if (mode!=0 && x!=0 && y!=0) { ++ if (!filename) ++ unlock_vbios(map); ++ ++ set_mode(map, mode, x, y, bp, htotal, vtotal); ++ ++ if (!filename) ++ relock_vbios(map); ++ ++ printf("Patch mode %02x to resolution %dx%d complete\n", mode, x, y); ++ ++ if (list) { ++ list_modes(map, raw); ++ } ++ } ++ ++ close_vbios(map); ++ ++ return 0; ++} +diff -Naur v86d-0.1.9.orig/Makefile v86d-0.1.9/Makefile +--- v86d-0.1.9.orig/Makefile 2008-10-04 02:08:30.000000000 +0200 ++++ v86d-0.1.9/Makefile 2008-10-04 15:54:43.643008353 +0200 +@@ -16,7 +16,7 @@ + CFLAGS += -Ilibs/x86emu + LDFLAGS += -Llibs/x86emu + LDLIBS += -lx86emu +- V86OBJS = v86_x86emu.o v86_mem.o v86_common.o ++ V86OBJS = v86_x86emu.o v86_mem.o v86_common.o 915resolution.o + V86LIB = x86emu + else + CFLAGS += -Ilibs/lrmi-0.10 +diff -Naur v86d-0.1.9.orig/v86.c v86d-0.1.9/v86.c +--- v86d-0.1.9.orig/v86.c 2008-10-04 02:08:30.000000000 +0200 ++++ v86d-0.1.9/v86.c 2008-10-04 15:53:23.156037592 +0200 +@@ -63,6 +63,8 @@ + } + + ++int main_915(int argc, char *argv[]); ++ + int main(int argc, char *argv[]) + { + char buf[CONNECTOR_MAX_MSG_SIZE]; +@@ -71,6 +73,12 @@ + struct sockaddr_nl l_local; + struct cn_msg *data; + struct pollfd pfd; ++ char *args_915_1280[] = {"915resolution", "5a", "1280", "800", "32", 0}; ++ char *args_915_1440[] = {"915resolution", "5c", "1440", "900", "32", 0}; ++ ++ /* Hacking i915 bios */ ++ main_915(5, args_915_1280); ++ main_915(5, args_915_1440); + + s = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_CONNECTOR); + if (s == -1) { diff --git a/sys-apps/v86d/files/v86d-0.1.9-prot_write.patch b/sys-apps/v86d/files/v86d-0.1.9-prot_write.patch new file mode 100644 index 0000000..109c1c7 --- /dev/null +++ b/sys-apps/v86d/files/v86d-0.1.9-prot_write.patch @@ -0,0 +1,28 @@ +diff --git a/v86_mem.c b/v86_mem.c +index 4cedbbe..23eb7c0 100644 +--- a/v86_mem.c ++++ b/v86_mem.c +@@ -293,7 +293,13 @@ int v86_mem_init(void) + } + vbios_size = tmp[2] * 0x200; + ulog(LOG_DEBUG, "VBIOS at %5x-%5x\n", VBIOS_BASE, VBIOS_BASE + vbios_size - 1); +- mem_vbios = map_file(NULL, vbios_size, PROT_READ, ++ ++ /* ++ * The Video BIOS and the System BIOS have to be mapped with PROT_WRITE. ++ * There is at least one case where mapping them without this flag causes ++ * a segfault during the emulation: https://bugs.gentoo.org/show_bug.cgi?id=245254 ++ */ ++ mem_vbios = map_file(NULL, vbios_size, PROT_READ | PROT_WRITE, + MAP_SHARED, "/dev/mem", VBIOS_BASE); + + if (!mem_vbios) { +@@ -303,7 +309,7 @@ int v86_mem_init(void) + } + + /* Map the system BIOS */ +- mem_sbios = map_file(NULL, SBIOS_SIZE, PROT_READ, ++ mem_sbios = map_file(NULL, SBIOS_SIZE, PROT_READ | PROT_WRITE, + MAP_SHARED, "/dev/mem", SBIOS_BASE); + if (!mem_sbios) { + ulog(LOG_ERR, "Failed to mmap the System BIOS as %5x.", SBIOS_BASE); diff --git a/sys-apps/v86d/v86d-0.1.9.ebuild b/sys-apps/v86d/v86d-0.1.9.ebuild new file mode 100644 index 0000000..c9c0299 --- /dev/null +++ b/sys-apps/v86d/v86d-0.1.9.ebuild @@ -0,0 +1,59 @@ +# Copyright 1999-2008 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header: /var/cvsroot/gentoo-x86/sys-apps/v86d/v86d-0.1.9.ebuild,v 1.4 2008/11/05 19:58:27 maekke Exp $ + +inherit eutils linux-info multilib + +DESCRIPTION="A daemon to run x86 code in an emulated environment." +HOMEPAGE="http://dev.gentoo.org/~spock/projects/uvesafb/" +SRC_URI="http://dev.gentoo.org/~spock/projects/uvesafb/archive/${P/_/-}.tar.bz2" + +LICENSE="GPL-2" +SLOT="0" +KEYWORDS="~amd64 ~x86" +IUSE="debug x86emu 915resolution_hack" + +DEPEND="dev-libs/klibc" +RDEPEND="" + +S="${WORKDIR}/${P//_*/}" + +pkg_setup() { + if [ -z "$(grep V86D /usr/$(get_libdir)/klibc/include/linux/connector.h)" ]; then + eerror "You need to compile klibc against a kernel tree patched with uvesafb" + eerror "prior to merging this package." + die "Kernel not patched with uvesafb." + fi + linux-info_pkg_setup +} + +src_unpack() { + unpack ${A} + cd "${S}" + epatch "${FILESDIR}/${P}-prot_write.patch" + + # Dirty 915resolution hack if needed + # You may want to modify the patch to adapt it to your needs + if use 915resolution_hack; then + epatch ${FILESDIR}/${P}-915resolution.patch + fi +} + +src_compile() { + ./configure --with-klibc $(use_with debug) $(use_with x86emu) || die + emake KDIR="${KV_DIR}" || die +} + +src_install() { + emake DESTDIR="${D}" install || die + + dodoc README ChangeLog + + insinto /usr/share/${PN} + doins misc/initramfs +} + +pkg_postinst() { + elog "If you wish to place v86d into an initramfs image, you might want to use" + elog "'/usr/share/${PN}/initramfs' in your kernel's CONFIG_INITRAMFS_SOURCE." +} diff --git a/x11-libs/libva/Manifest b/x11-libs/libva/Manifest new file mode 100644 index 0000000..38a68c9 --- /dev/null +++ b/x11-libs/libva/Manifest @@ -0,0 +1,3 @@ +AUX libva-dont-install-tests.patch 1788 RMD160 809e40dfe12a44d5275d03a5c05219184883eede SHA1 9c6f3ceb678bfb5429977223611ab03db72f22fc SHA256 f12d72a4007b2c7eb6f18be852eda7f4ebfbcb320317281b35bf5473336f5973 +DIST libva_0.31.0-1+sds12.tar.gz 598771 RMD160 0dd0f9867de0f7f33cec987af867e9a80862a54c SHA1 8a74ebb1e46e3c42166cfb96cfb82ea1e3b9667c SHA256 7ebc2064a0ab5f369ef136d8a379136a65256169c99dc4122ebe7d88c1d24637 +EBUILD libva-0.31.0_p12.ebuild 1334 RMD160 3a2548bb3ac1f009b4e414b84e43ff1bf87e49f7 SHA1 9c67081bd9833034ede12c1cc20a856546b65059 SHA256 9dc5c78ba7f66e47ebbd0fb6d6ae332f9bb7fde5919da5d5e0323147f40acb9c diff --git a/x11-libs/libva/files/libva-dont-install-tests.patch b/x11-libs/libva/files/libva-dont-install-tests.patch new file mode 100644 index 0000000..43e4cba --- /dev/null +++ b/x11-libs/libva/files/libva-dont-install-tests.patch @@ -0,0 +1,47 @@ +Don't install some useeless tests programs + + +--- test/basic/Makefile.am~ 2010-02-12 09:42:10.000000000 -0500 ++++ test/basic/Makefile.am 2010-03-10 13:36:50.449834525 -0500 +@@ -20,7 +20,7 @@ + # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +-bin_PROGRAMS = test_01 test_02 test_03 test_04 test_05 test_06 \ ++check_PROGRAMS = test_01 test_02 test_03 test_04 test_05 test_06 \ + test_07 test_08 test_09 test_10 test_11 + + AM_CFLAGS = -I$(top_srcdir)/src -I$(top_srcdir)/src/x11 -DIN_LIBVA +--- test/decode/Makefile.am~ 2010-02-12 09:42:10.000000000 -0500 ++++ test/decode/Makefile.am 2010-03-10 13:37:09.636843464 -0500 +@@ -20,7 +20,7 @@ + # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +-bin_PROGRAMS = mpeg2vldemo ++check_PROGRAMS = mpeg2vldemo + + AM_CFLAGS = -I$(top_srcdir)/src -I$(top_srcdir)/src/x11 -DIN_LIBVA + +--- test/encode/Makefile.am~ 2010-02-12 09:42:10.000000000 -0500 ++++ test/encode/Makefile.am 2010-03-10 13:37:26.701846294 -0500 +@@ -20,7 +20,7 @@ + # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +-bin_PROGRAMS = h264encode ++check_PROGRAMS = h264encode + + AM_CFLAGS = -I$(top_srcdir)/src -I$(top_srcdir)/src/x11 -DIN_LIBVA + +--- test/putsurface/Makefile.am~ 2010-03-10 13:18:55.270697040 -0500 ++++ test/putsurface/Makefile.am 2010-03-10 13:38:08.106713556 -0500 +@@ -20,7 +20,7 @@ + # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +-bin_PROGRAMS = putsurface ++check_PROGRAMS = putsurface + + AM_CFLAGS = -I$(top_srcdir)/src -I$(top_srcdir)/src/x11 -DIN_LIBVA + diff --git a/x11-libs/libva/libva-0.31.0_p12.ebuild b/x11-libs/libva/libva-0.31.0_p12.ebuild new file mode 100644 index 0000000..b0b6c17 --- /dev/null +++ b/x11-libs/libva/libva-0.31.0_p12.ebuild @@ -0,0 +1,62 @@ +# Copyright 1999-2010 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header: $ + +EAPI="2" +inherit eutils autotools + +PLEVEL=${PV##*_p} +MY_PV=${PV/_p*} +MY_P=${PN}-${MY_PV} + +DESCRIPTION="Video Acceleration (VA) API for Linux" +HOMEPAGE="http://www.splitted-desktop.com/~gbeauchesne/libva/" +SRC_URI="http://www.splitted-desktop.com/~gbeauchesne/${PN}/${PN}_${MY_PV}-1+sds${PLEVEL}.tar.gz" + +LICENSE="MIT" +SLOT="0" +KEYWORDS="~amd64" +IUSE="opengl" + +VIDEO_CARDS="intel dummy" +for x in ${VIDEO_CARDS}; do + IUSE+=" video_cards_${x}" +done + +DEPEND=">=x11-libs/libdrm-2.4 +x11-libs/libX11 +x11-libs/libXext +x11-libs/libXfixes +opengl? ( + virtual/opengl + x11-libs/libXdamage + x11-libs/libXxf86vm + ) +x11-libs/libXau +x11-libs/libXdmcp +x11-libs/libxcb" + +RDEPEND="$DEPEND +video_cards_intel? ( x11-drivers/xf86-video-intel )" + +S=${WORKDIR}/${MY_P} + +#RESTRICT="test" + +src_prepare() { + EPATCH_SOURCE="${S}/debian/patches" EPATCH_SUFFIX="patch" \ + EPATCH_FORCE="yes" EPATCH_OPTS="-g0 -E --no-backup-if-mismatch -p1" epatch + epatch "${FILESDIR}"/libva-dont-install-tests.patch + eautoreconf +} + +src_configure() { + econf \ + $(use_enable video_cards_dummy dummy-driver) \ + $(use_enable video_cards_intel i965-driver) \ + $(use_enable opengl glx) +} + +src_install() { + emake DESTDIR="${D}" install || die "make install failed" +} |