Merge branch 'vuplus-1.6' of 192.168.102.66:/var/ikseong/repo/openembedded into test_0921
authorschon <schon@dev03-server>
Thu, 22 Sep 2011 01:10:49 +0000 (10:10 +0900)
committerschon <schon@dev03-server>
Thu, 22 Sep 2011 01:10:49 +0000 (10:10 +0900)
127 files changed:
classes/base.bbclass
classes/gitpkgv.bbclass [new file with mode: 0644]
classes/opendreambox-git.bbclass [new file with mode: 0644]
classes/packaged-staging.bbclass
classes/qmake_base.bbclass
classes/qt4e.bbclass
classes/qt4x11.bbclass
conf/checksums.ini
conf/distro/opendreambox.conf
conf/machine/dm500hd.conf
conf/machine/dm7020hd.conf
conf/machine/dm800.conf
conf/machine/dm800se.conf
recipes/dreambox/dreambox-buildimage-native.bb
recipes/dreambox/dreambox-dvb-modules.bb
recipes/dreambox/dreambox-secondstage.bb
recipes/enigma2/enigma2.bb
recipes/gstreamer/gst-plugins-bad/audioparsers-change-rank.diff
recipes/gstreamer/gst-plugins-bad/mpegtsmux_indexing_alignment.diff [new file with mode: 0644]
recipes/gstreamer/gst-plugins-bad_0.10.21.bb
recipes/gstreamer/gst-plugins-bad_0.10.22.bb [new file with mode: 0644]
recipes/gstreamer/gst-plugins-base/1e0ddb12aa1c2b13c4bc4a13712ebd7f06a6346e.patch [new file with mode: 0644]
recipes/gstreamer/gst-plugins-base/d3a44541749f413343d5717c464083cef22a74f1.patch [new file with mode: 0644]
recipes/gstreamer/gst-plugins-base_0.10.35.bb [new file with mode: 0644]
recipes/gstreamer/gst-plugins-good_0.10.30.bb [new file with mode: 0644]
recipes/gstreamer/gst-plugins-ugly_0.10.18.bb [new file with mode: 0644]
recipes/gstreamer/gstreamer_0.10.35.bb [new file with mode: 0644]
recipes/libpagecache/libpagecache_0.0.1.bb [new file with mode: 0644]
recipes/linux/files/opendreambox/dvb-api-2.6.18-5.3.patch
recipes/linux/files/opendreambox/linux-2.6.18-dvb-core-headers-20100904.patch
recipes/linux/files/opendreambox/stblinux-2.6.18-brcmnand-oob-raw-write-fix.patch [new file with mode: 0644]
recipes/linux/files/opendreambox/stblinux-2.6.18-extra-version-7.4.patch [new file with mode: 0644]
recipes/linux/files/opendreambox/stblinux-2.6.18-hw-ecc-compatibility.patch [new file with mode: 0644]
recipes/linux/files/opendreambox/stblinux-2.6.18-use-default-stack-size.patch [deleted file]
recipes/linux/linux-dm7020hd-2.6.18/defconfig
recipes/linux/linux-dm7020hd-2.6.18/linux-2.6.18-big-summary.patch [deleted file]
recipes/linux/linux-dm7020hd_2.6.18.bb
recipes/linux/linux-dm8000-2.6.18/linux-2.6.18-big-summary.patch [deleted file]
recipes/linux/linux-dm8000_2.6.18.bb
recipes/linux/linux-opendreambox-2.6.18.inc
recipes/mysql/files/gen_lex_hash.patch [deleted file]
recipes/mysql/mysql-5.1.40-have_atomic_pthread_t.patch [deleted file]
recipes/mysql/mysql5-native_5.1.40.bb
recipes/mysql/mysql5/fix-abi-check-gcc45.patch [new file with mode: 0644]
recipes/mysql/mysql5_5.1.40.inc
recipes/mysql/mysql_4.1.22.bb
recipes/python/python-2.6-manifest.inc
recipes/python/python-2.6.7/00-fix-parallel-make.patch [new file with mode: 0644]
recipes/python/python-2.6.7/01-use-proper-tools-for-cross-build.patch [new file with mode: 0644]
recipes/python/python-2.6.7/02-remove-test-for-cross.patch [new file with mode: 0644]
recipes/python/python-2.6.7/03-fix-tkinter-detection.patch [new file with mode: 0644]
recipes/python/python-2.6.7/04-default-is-optimized.patch [new file with mode: 0644]
recipes/python/python-2.6.7/05-enable-ctypes-cross-build.patch [new file with mode: 0644]
recipes/python/python-2.6.7/06-ctypes-libffi-fix-configure.patch [new file with mode: 0644]
recipes/python/python-2.6.7/10-distutils-fix-swig-parameter.patch [new file with mode: 0644]
recipes/python/python-2.6.7/11-distutils-never-modify-shebang-line.patch [new file with mode: 0644]
recipes/python/python-2.6.7/12-distutils-prefix-is-inside-staging-area.patch [new file with mode: 0644]
recipes/python/python-2.6.7/debug.patch [new file with mode: 0644]
recipes/python/python-2.6.7/fix_pthread_site.patch [new file with mode: 0644]
recipes/python/python-2.6.7/forced_largefile_support.patch [new file with mode: 0644]
recipes/python/python-2.6.7/ipv6-cross.patch [new file with mode: 0644]
recipes/python/python-2.6.7/nohostlibs.patch [new file with mode: 0644]
recipes/python/python-2.6.7/python-module-rpath-fix.patch [new file with mode: 0644]
recipes/python/python-2.6.7/sitecustomize.py [new file with mode: 0644]
recipes/python/python-2.6.7/some_configure_fixes.patch [new file with mode: 0644]
recipes/python/python-2.6.7/strict_aliasing_site.patch [new file with mode: 0644]
recipes/python/python-native_2.6.7.bb [new file with mode: 0644]
recipes/python/python_2.6.4.bb
recipes/python/python_2.6.7.bb [new file with mode: 0644]
recipes/qt4/files/0001-wsegl2-support.patch [new file with mode: 0644]
recipes/qt4/files/compile.test-lflags.patch [new file with mode: 0644]
recipes/qt4/qt-4.7.1.inc [deleted file]
recipes/qt4/qt-4.7.1/0001-Added-Openembedded-crossarch-option.patch [deleted file]
recipes/qt4/qt-4.7.1/0010-phonon-gstreamer-rgb-endianess.patch [deleted file]
recipes/qt4/qt-4.7.1/g++.conf [deleted file]
recipes/qt4/qt-4.7.1/hack-out-pg2-4.7.0.patch [deleted file]
recipes/qt4/qt-4.7.1/linux.conf [deleted file]
recipes/qt4/qt-4.7.4.inc [new file with mode: 0644]
recipes/qt4/qt-4.7.4/0001-Added-Openembedded-crossarch-option.patch [new file with mode: 0644]
recipes/qt4/qt-4.7.4/0010-phonon-gstreamer-rgb-endianess.patch [new file with mode: 0644]
recipes/qt4/qt-4.7.4/blacklist-diginotar-certs.diff [new file with mode: 0644]
recipes/qt4/qt-4.7.4/fix-translations.patch [new file with mode: 0644]
recipes/qt4/qt-4.7.4/g++.conf [new file with mode: 0644]
recipes/qt4/qt-4.7.4/hack-out-pg2-4.7.0.patch [new file with mode: 0644]
recipes/qt4/qt-4.7.4/linux.conf [new file with mode: 0644]
recipes/qt4/qt4-embedded-gles_4.7.4.bb [new file with mode: 0644]
recipes/qt4/qt4-embedded.inc
recipes/qt4/qt4-embedded_4.7.1.bb [deleted file]
recipes/qt4/qt4-embedded_4.7.4.bb [new file with mode: 0644]
recipes/qt4/qt4-native.inc [new file with mode: 0644]
recipes/qt4/qt4-native_4.7.4.bb [new file with mode: 0644]
recipes/qt4/qt4-tools-native_4.7.1.bb [deleted file]
recipes/qt4/qt4-tools-sdk.inc [new file with mode: 0644]
recipes/qt4/qt4-tools-sdk_4.7.4.bb [new file with mode: 0644]
recipes/qt4/qt4-x11-free-gles_4.7.4.bb [new file with mode: 0644]
recipes/qt4/qt4-x11-free.inc
recipes/qt4/qt4-x11-free_4.7.4.bb [new file with mode: 0644]
recipes/qt4/qt4.inc
recipes/tasks/task-opendreambox-base.bb
recipes/v4l-dvb/files/backport-1.patch [new file with mode: 0644]
recipes/v4l-dvb/files/backport-2.patch [new file with mode: 0644]
recipes/v4l-dvb/files/backport-3.patch [new file with mode: 0644]
recipes/v4l-dvb/files/backport-4.patch [new file with mode: 0644]
recipes/v4l-dvb/files/backport-5.patch [new file with mode: 0644]
recipes/v4l-dvb/files/backport-6.patch [new file with mode: 0644]
recipes/v4l-dvb/files/backport-7.patch [new file with mode: 0644]
recipes/v4l-dvb/files/backport-8.patch [new file with mode: 0644]
recipes/v4l-dvb/files/backport-9.patch [new file with mode: 0644]
recipes/v4l-dvb/files/backport-a.patch [new file with mode: 0644]
recipes/v4l-dvb/files/backport-b.patch [new file with mode: 0644]
recipes/v4l-dvb/files/backport-c.patch [new file with mode: 0644]
recipes/v4l-dvb/files/backport-d.patch [new file with mode: 0644]
recipes/v4l-dvb/files/backport-e.patch [new file with mode: 0644]
recipes/v4l-dvb/files/backport-f.patch [new file with mode: 0644]
recipes/v4l-dvb/files/backport-g.patch [new file with mode: 0644]
recipes/v4l-dvb/files/backport-h.patch [new file with mode: 0644]
recipes/v4l-dvb/files/backport-i.patch [new file with mode: 0644]
recipes/v4l-dvb/files/backport-j.patch [new file with mode: 0644]
recipes/v4l-dvb/files/backport-k.patch [new file with mode: 0644]
recipes/v4l-dvb/files/basic-dvb-t2-support.patch
recipes/v4l-dvb/files/fix-get-property.patch [deleted file]
recipes/v4l-dvb/v4l-dvb-modules_hg.bb
recipes/vlc/libaacs_git.bb [new file with mode: 0644]
recipes/vlc/libbluray_git.bb [new file with mode: 0644]
recipes/webkit/files/0001-Qt-Fix-build-with-QT_LIBINFIX.patch [new file with mode: 0644]
recipes/webkit/qtwebkit-e_2.2.bb [new file with mode: 0644]
recipes/webkit/qtwebkit.inc [new file with mode: 0644]

index 9a24272..f9e9e27 100644 (file)
@@ -779,7 +779,7 @@ def oe_unpack_file(file, data, url = None):
        if not url:
                url = "file://%s" % file
        dots = file.split(".")
-       if dots[-1] in ['gz', 'bz2', 'Z']:
+       if dots[-1] in ['gz', 'bz2', 'Z', 'xz', 'lz']:
                efile = os.path.join(bb.data.getVar('WORKDIR', data, 1),os.path.basename('.'.join(dots[0:-1])))
        else:
                efile = file
@@ -794,6 +794,14 @@ def oe_unpack_file(file, data, url = None):
                cmd = 'gzip -dc %s > %s' % (file, efile)
        elif file.endswith('.bz2'):
                cmd = 'bzip2 -dc %s > %s' % (file, efile)
+       elif file.endswith('.tar.xz'):
+               cmd = 'xz -dc %s | tar x --no-same-owner -f -' % file
+       elif file.endswith('.xz'):
+               cmd = 'xz -dc %s > %s' % (file, efile)
+       elif file.endswith('.tar.lz'):
+               cmd = 'lzip -dc %s | tar x --no-same-owner -f -' % file
+       elif file.endswith('.lz'):
+               cmd = 'lzip -dc %s > %s' % (file, efile)
        elif file.endswith('.zip') or file.endswith('.jar'):
                cmd = 'unzip -q -o'
                (type, host, path, user, pswd, parm) = bb.decodeurl(url)
diff --git a/classes/gitpkgv.bbclass b/classes/gitpkgv.bbclass
new file mode 100644 (file)
index 0000000..bedceb9
--- /dev/null
@@ -0,0 +1,84 @@
+# gitpkgv.bbclass provides a GITPKGV and GITPKGVTAG variables to be
+# used in PKGV, as described bellow:
+#
+# - GITPKGV which is a sortable version with the format NN+GITHASH, to
+#   be used in PKGV, where
+#
+#   NN equals the total number of revs up to SRCREV
+#   GITHASH is SRCREV's (full) hash
+#
+# - GITPKGVTAG which is the output of 'git describe' allowing for
+#   automatic versioning
+#
+# gitpkgv.bbclass assumes the git repository has been cloned, and
+# contains SRCREV. So ${GITPKGV} and ${GITPKGVTAG} should never be
+# used in PV, only in PKGV.  It can handle SRCREV = ${AUTOREV}, as
+# well as SRCREV = "<some fixed git hash>".
+#
+# WARNING: if upstream repository is always using consistent and
+# sortable tag name scheme you can get sortable version including tag
+# name with ${GITPKGVTAG}, but be aware that ie tag sequence "v1.0,
+# v1.2, xtest, v2.0" will force you to increment PE to get upgradeable
+# path to v2.0 revisions
+#
+# use example:
+#
+# inherit gitpkgv
+#
+# PV = "1.0+gitr${SRCPV}"      # expands to something like 1.0+gitr3+4c1c21d7dbbf93b0df336994524313dfe0d4963b
+# PKGV = "1.0+gitr${GITPKGV}"  # expands also to something like 1.0+gitr31337+4c1c21d7d
+#
+# or
+#
+# inherit gitpkgv
+#
+# PV = "1.0+gitr${SRCPV}" # expands to something like 1.0+gitr3+4c1c21d7dbbf93b0df336994524313dfe0d4963b
+# PKGV = "${GITPKGVTAG}"  # expands to something like 1.0-31337+g4c1c21d
+#                           if there is tag v1.0 before this revision or
+#                           ver1.0-31337+g4c1c21d if there is tag ver1.0
+
+GITPKGV = "${@get_git_pkgv(d, False)}"
+GITPKGVTAG = "${@get_git_pkgv(d, True)}"
+
+def gitpkgv_drop_tag_prefix(version):
+    import re
+    if re.match("v\d", version):
+        return version[1:]
+    else:
+        return version
+
+def get_git_pkgv(d, use_tags):
+       import os
+       import bb
+
+       urls = bb.data.getVar('SRC_URI', d, 1).split()
+
+       for url in urls:
+               (type, host, path, user, pswd, parm) = bb.decodeurl(bb.data.expand(url, d))
+               if type in ['git']:
+
+                       gitsrcname = '%s%s' % (host, path.replace('/', '.'))
+                       repodir = os.path.join(bb.data.expand('${GITDIR}', d), gitsrcname)
+                       if not os.path.exists(repodir):
+                               return None
+
+                       rev = bb.fetch.get_srcrev(d).split('+')[1]
+
+                       cwd = os.getcwd()
+                       os.chdir(repodir)
+
+                       commits = bb.fetch.runfetchcmd("git rev-list %s -- 2> /dev/null | wc -l" % rev, d, quiet=True).strip()
+
+                       if use_tags:
+                               try:
+                                       ver = gitpkgv_drop_tag_prefix(bb.fetch.runfetchcmd("git describe %s 2>/dev/null" % rev, d, quiet=True).strip())
+                               except Exception:
+                                       ver = "0.0-%s-g%s" % (commits, rev[:7])
+                       else:
+                               ver = "%s+%s" % (commits, rev[:7])
+
+                       os.chdir(cwd)
+
+                       return ver
+
+       return "0+0"
diff --git a/classes/opendreambox-git.bbclass b/classes/opendreambox-git.bbclass
new file mode 100644 (file)
index 0000000..773c684
--- /dev/null
@@ -0,0 +1,11 @@
+OPENDREAMBOX_PROJECT ?= "${BPN}"
+
+SRC_URI += "git://git.opendreambox.org/git/${OPENDREAMBOX_PROJECT}.git;protocol=git"
+
+S = "${WORKDIR}/git"
+
+inherit gitpkgv
+
+RECIPE_PV := "${PV}"
+PV = "${RECIPE_PV}+gitr${SRCPV}"
+PKGV = "${RECIPE_PV}+gitr${GITPKGV}"
index 1ede25c..2be0feb 100644 (file)
@@ -382,7 +382,6 @@ python do_package_stage () {
                 if os.path.exists(srcfile):
                     destpath = ipkpath + "/" + arch + "/"
                     bb.mkdirhier(destpath)
-                   print destpath
                     bb.copyfile(srcfile, destpath + srcname)
 
             if bb.data.inherits_class('package_deb', d):
index 4fbe21f..cc3297c 100644 (file)
@@ -1,6 +1,6 @@
 
 OE_QMAKE_PLATFORM = "${TARGET_OS}-oe-g++"
-QMAKESPEC := "${QMAKE_MKSPEC_PATH}/${OE_QMAKE_PLATFORM}"
+QMAKESPEC = "${QMAKE_MKSPEC_PATH}/${OE_QMAKE_PLATFORM}"
 
 # We override this completely to eliminate the -e normally passed in
 EXTRA_OEMAKE = ' MAKEFLAGS= '
@@ -34,9 +34,23 @@ oe_qmake_mkspecs () {
     done
 }
 
+do_generate_qt_config_file() {
+       export QT_CONF_PATH=${WORKDIR}/qt.conf
+       cat > ${WORKDIR}/qt.conf <<EOF
+[Paths]
+Prefix = ${STAGING_DIR}
+Binaries = ${BUILD_SYS}${bindir_native}
+Headers = ${BASEPKG_HOST_SYS}${layout_prefix}/include/qt4
+Plugins = ${BASEPKG_HOST_SYS}${layout_prefix}/lib/qt4/plugins/
+Mkspecs = ${BASEPKG_HOST_SYS}${layout_prefix}/share/qt4/mkspecs/
+EOF
+}
+
+addtask generate_qt_config_file after do_patch before do_configure
+
 qmake_base_do_configure() {
        case ${QMAKESPEC} in
-       *linux-oe-g++|*linux-uclibc-oe-g++|*linux-gnueabi-oe-g++|*linux-uclibceabi-oe-g++)
+       *linux-oe-g++|*linux-uclibc-oe-g++|*linux-gnueabi-oe-g++|*linux-uclibceabi-oe-g++|*linux-gnuspe-oe-g++|*linux-uclibcspe-oe-g++)
                ;;
        *-oe-g++)
                die Unsupported target ${TARGET_OS} for oe-g++ qmake spec
@@ -61,7 +75,7 @@ qmake_base_do_configure() {
        oenote "using qmake spec in ${QMAKESPEC}, using profiles '${QMAKE_PROFILES}'"
 
        if [ -z "${QMAKE_PROFILES}" ]; then 
-               PROFILES="`ls *.pro`"
+               PROFILES="`ls ${S}/*.pro`"
        else
                PROFILES="${QMAKE_PROFILES}"
        fi
index f72e06b..303b79b 100644 (file)
@@ -1,4 +1,4 @@
-DEPENDS_prepend = "${@["qt4-embedded ", ""][(bb.data.getVar('PN', d, 1) == 'qt4-embedded')]}"
+DEPENDS_prepend = "${@["qt4-embedded ", ""][(bb.data.getVar('PN', d, 1)[:12] == 'qt4-embedded')]}"
 inherit qmake2
 
 QT_DIR_NAME = "qtopia"
index 2d56b7e..abb1d9d 100644 (file)
@@ -2,5 +2,8 @@ DEPENDS_prepend = "${@["qt4-x11-free ", ""][(bb.data.getVar('PN', d, 1)[:12] ==
 
 inherit qmake2
 
+QT_DIR_NAME = "qt4"
+QT_LIBINFIX = ""
+
 # Qt4 uses atomic instructions not supported in thumb mode
 ARM_INSTRUCTION_SET = "arm"
index 49cdad9..e6f3e29 100644 (file)
@@ -1070,6 +1070,10 @@ sha256=cf153f10ba6312a8303ceb01bed834a2786d28aa89c7d73dba64714f691628f6
 md5=245db9f1e0f09ab7e0faaa0cf7301011
 sha256=a1cdc4a8f6c1f947ea3b87d097af2db4371019bac941d92c3844124c5694328b
 
+[http://www.python.org/ftp/python/2.6.7/Python-2.6.7.tar.bz2]
+md5=d40ef58ed88438a870bbeb0ac5d4217b
+sha256=4502c1a064ce68416188005662c0269d31175b855502f64c6dfa8f51226a0e5c
+
 [http://jerakeen.org/files/PythonDaap-0.4.tar.gz]
 md5=f7672bfd563787a76fb7e9a43c062f18
 sha256=5318946df77937e0b601c95a198790f9ba52d4afb4eb153480289350182bb739
@@ -6366,6 +6370,14 @@ sha256=ab4e6f4946accc12343d0091e07219eafcfe0b1b906a566cc39dfbb54306536d
 md5=b249f3a0bd1261597365578e324458c8
 sha256=51e03bbeb1bb441ff1581bc300a01c2eb6f03895d238571e88b991df7fdf4a6f
 
+[http://sources.dreamboxupdate.com/snapshots/dreambox-dvb-modules-dm500hd-2.6.18-7.4-dm500hd-20110821.tar.bz2]
+md5=25022de53fb275466eb615cea243b47f
+sha256=cb954cb452e0a9995d7413e241cf3129786c5b094e9af5cd9f0b28d610096013
+
+[http://sources.dreamboxupdate.com/snapshots/dreambox-dvb-modules-dm500hd-2.6.18-7.4-dm500hd-20110902.tar.bz2]
+md5=0f2041f41ddaac8580d9f7a676a53a5a
+sha256=4f7bc7d70f8856183c8c999094c72b52c4158cbbbd7f1c0bffc043348f243b49
+
 [http://sources.dreamboxupdate.com/snapshots/dreambox-dvb-modules-dm500hd-2.6.30-dm500hd-20090727.tar.bz2]
 md5=af8928a01a8f11fa5845821be05774ef
 sha256=be98fe6dab366479f6aefb2bb7c516258cb03e67e718735f2b7787577c7ea188
@@ -6502,6 +6514,14 @@ sha256=39d186c9fe9b44776e9f752d64351c3daeb4335179ec8ec796f19771bb8c8139
 md5=1889035f0b14de94bc39d3703c782cbb
 sha256=e2506a6357f62b9f572cc54377ae1d1db50a94b5569c2c0403daa5a50422664b
 
+[http://sources.dreamboxupdate.com/snapshots/dreambox-dvb-modules-dm800-2.6.18-7.4-dm800-20110821.tar.bz2]
+md5=6fdcf607b8598d4c575141af7e6845e7
+sha256=59324211bfc5c0150902ccb19fb7d7c5be8e06642e2e9dac417d99d098e31279
+
+[http://sources.dreamboxupdate.com/snapshots/dreambox-dvb-modules-dm800-2.6.18-7.4-dm800-20110902.tar.bz2]
+md5=4771de9d533cff7ec56691992ccf6a0c
+sha256=e78d07d2bc3d80d1d5fea9e89899aeae3d53762924e8c5da2444a4e1311ceb57
+
 [http://sources.dreamboxupdate.com/snapshots/dreambox-dvb-modules-dm800-2.6.30-dm800-20090723.tar.bz2]
 md5=41cee549349eb264823d8605525f7d82
 sha256=a7125978936a877238e96683e297da56ebc45bfa91d6a1f6d3ae075fb3cdcff6
@@ -6602,6 +6622,14 @@ sha256=3f48efcf31a9b32f1b792467d0a3760c9be8e822c7c89f0d7327a2984ae288a2
 md5=af2826a9e2e4cfecae056505cfb6ab58
 sha256=0dfe1c9c07b1ceefcf887b7ff077d106d68235e7e0ae4920e1a4de39375ee26f
 
+[http://sources.dreamboxupdate.com/snapshots/dreambox-dvb-modules-dm8000-2.6.18-7.4-dm8000-20110821.tar.bz2]
+md5=1dda405033fe3fe1578b9b67c5826537
+sha256=15de0ecca9eea91ae20d77d2c6f34f4096790c69a4d358b04814735b6d80c2ff
+
+[http://sources.dreamboxupdate.com/snapshots/dreambox-dvb-modules-dm8000-2.6.18-7.4-dm8000-20110902.tar.bz2]
+md5=72c745a6b7861f48205403a14fe8d6a3
+sha256=e7e621c51299b0a3da16e9b06eddfaee7b33f6ef8a971d1f82766004b61358d3
+
 [http://sources.dreamboxupdate.com/snapshots/dreambox-dvb-modules-dm8000-2.6.30-dm8000-20090722.tar.bz2]
 md5=1958814f60d0076b0a6192cffef5a99f
 sha256=40a002f33134c97b19b0430d9bbdf4e1cab854d2075df1f5d9b2f275821552f6
@@ -6666,6 +6694,14 @@ sha256=060ba81617d5d2e7b3df746a4ea4f33ae570991da042c83b6fe5b3acd8048466
 md5=10ac402a8857db8b69a4ad902bde2e3b
 sha256=7048038693c266c0794b0abb1e76ac5cdbb7e63983534b283fcba86c2b11312b
 
+[http://sources.dreamboxupdate.com/snapshots/dreambox-dvb-modules-dm800se-2.6.18-7.4-dm800se-20110821.tar.bz2]
+md5=eab1dd4763dc7dbc3401cd9093df5810
+sha256=482533f2524f6c6090ce5194c13342ebe38a1ff806e684a9d16693ead1c0ae44
+
+[http://sources.dreamboxupdate.com/snapshots/dreambox-dvb-modules-dm800se-2.6.18-7.4-dm800se-20110902.tar.bz2]
+md5=f7053a2553811eca2fc49a993b707f24
+sha256=95901b22179d0b9bfd7c895c2d582b1516811dcd6f895a606cf07dc02d63751b
+
 [http://sources.dreamboxupdate.com/download/opendreambox/dreambox-dvb-tools-1.0.tar.gz]
 md5=df202c4cbf6cc5be5a73c0c13d8c15ee
 sha256=cbc3b5526b531f92873ccfb690cbe6ce3567b1576e4b125413109acf24c09238
@@ -12234,6 +12270,10 @@ sha256=1031dff866df976a957f34039addbab4c0753406299a275f4cf1780e1dbe2a90
 md5=f501336ab1d18d2565f47c36ce653a82
 sha256=422badacbda37ac33cb446c6751dabcd0b223c308dbb01024a34ded682fa47e3
 
+[http://gstreamer.freedesktop.org/src/gst-plugins-bad/gst-plugins-bad-0.10.22.tar.bz2]
+md5=9a2acee1f386f71247003d0d7090fb1c
+sha256=d8f7102f43ffea076646427115ffdccb3975954f1e9367bd304f7ee01e12070c
+
 [http://gstreamer.freedesktop.org/src/gst-plugins-bad/gst-plugins-bad-0.10.3.tar.bz2]
 md5=8545a02c408976c5e9f0c2cf3c6a362e
 sha256=648f1ef813c64c7eedd45d164eb41ba21366bba8ec5fcbff3100458721be489e
@@ -12310,6 +12350,10 @@ sha256=abb006c78222cfb69d31e983268d1d5219e9d4e0da24c6c4cd687968af7a33bd
 md5=2920af2b3162f3d9fbaa7fabc8ed4d38
 sha256=e9aabfac83f6480896da0686e9c911989f896fbad634821b7771ed84a446172b
 
+[http://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-0.10.35.tar.bz2]
+md5=1d300983525f4f09030eb3ba47cb04b0
+sha256=cd24f01bb5258a1f400bc4f2c212bb7cee9ee23c9ffb80d537a24ef366d17103
+
 [http://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-0.10.5.tar.bz2]
 md5=2b5958fb0baaf8d1b4eae18f7b13d49b
 sha256=fe2fb4fe446a1d3f8ccd4284ae7ffd25cb9f1b836b3d0e29d2494d10c1ae3eac
@@ -12374,6 +12418,10 @@ sha256=ceb3bbea5ce18463b8fe470d34786bc846469e800305c436d799af9fe22bdcc4
 md5=c25d6c51916424009dfde4ee42ae1feb
 sha256=a9d801c3d42b456a6ebc0b95f68c44f153f756ec0fbd4877197c469cc67771fa
 
+[http://gstreamer.freedesktop.org/src/gst-plugins-good/gst-plugins-good-0.10.30.tar.bz2]
+md5=62fd7a3ef187c4f99b3d7c352d58dae9
+sha256=b12cba90b27d8423cd0a808939098d19db3996cfb9bf528507c6321782e095f6
+
 [http://gstreamer.freedesktop.org/src/gst-plugins-good/gst-plugins-good-0.10.4.tar.bz2]
 md5=e189496e7987898823d28d26b79f63dc
 sha256=f2b90ef5fb4b2d0b06d5fd8193a7c19b1d08d4f737abeafabf04d39673ea703b
@@ -12426,6 +12474,10 @@ sha256=d7fc7636001e78736540c628ad889888cb85ea722f08d1c6813b16682dd9c09c
 md5=504ed6508c3a8f035a2002ed69d68506
 sha256=0cbd4aa8dceafea21ddd547dfde686a8836f68ba547afa5575a52b64cfa0b369
 
+[http://gstreamer.freedesktop.org/src/gst-plugins-ugly/gst-plugins-ugly-0.10.18.tar.bz2]
+md5=04a7009a4efea2844075949c111f5e4d
+sha256=f9c16748cd9269fae86422d8254a579fa6db073797a5a19a9dc5c72cd66c8e14
+
 [http://gstreamer.freedesktop.org/src/gst-plugins-ugly/gst-plugins-ugly-0.10.2.tar.bz2]
 md5=cf604b6acd80b57dc5173db7e93fc116
 sha256=c882c7485faec9803d2f61efbaedd02742e78d224a7d29d61a0a884cd962a09f
@@ -12538,6 +12590,10 @@ sha256=7f737e6d047c1ebeb4e1e0725fc377c5d9f12ee89186de7960be3cbba709ab84
 md5=442bc3d37b8511a73379143e7531d726
 sha256=3bf4e46a186ee9a1f5e212aaf651d67cffb4f5f05345a7c99ae71d5d992be133
 
+[http://gstreamer.freedesktop.org/src/gstreamer/gstreamer-0.10.35.tar.bz2]
+md5=4a0a00edad7a2c83de5211ca679dfaf9
+sha256=817bfea2cd46e2487b97e2ed9218f0299b32a3de1e5e80b4c7868d17e9089786
+
 [http://gstreamer.freedesktop.org/src/gstreamer/gstreamer-0.10.4.tar.bz2]
 md5=263a7800ecf44d0f38d0cbc80bce65ff
 sha256=7b8add7db1e0b0e3671f374469ef32b151fa96bc9eb2aa265eefd79548752ffc
@@ -18970,10 +19026,18 @@ sha256=0152ebb1b9ceaefdd85c85fd468a2b6506b8b8df9e0bc66c308d3b0feaca4950
 md5=1b7f91c7c520bd073ec7a5487f4c3467
 sha256=4aeb82c5ec8a3b4bead0275fbfaecfdbeda12b01cb6654eec1ce9791b5003807
 
+[http://sources.dreamboxupdate.com/download/kernel-patches/linux-dm500hd-2.6.18-ac6cc9511a5f70eaa584c63fc5c3de33cae1d0e7.patch.bz2]
+md5=d8938aa5b1a5c6928a1fad3c699bd98e
+sha256=faca8966d65932619bf69d034ed892ac9bb5f5c9b57ba50ba8dbe471894105ac
+
 [http://sources.dreamboxupdate.com/download/kernel-patches/linux-dm500hd-2.6.18-c59d7210272be29e3850aca3abbff76443f65d6f-fixed.patch.bz2]
 md5=dc78c09b0f1db77ecfba58617eec178a
 sha256=a62b549563bd9a4d877c64aee36ed9ab2c8c4b4dd9f67d6bcd746eeaef61bb8b
 
+[http://sources.dreamboxupdate.com/download/kernel-patches/linux-dm7020hd-2.6.18-ac6cc9511a5f70eaa584c63fc5c3de33cae1d0e7.patch.bz2]
+md5=d8938aa5b1a5c6928a1fad3c699bd98e
+sha256=faca8966d65932619bf69d034ed892ac9bb5f5c9b57ba50ba8dbe471894105ac
+
 [http://sources.dreamboxupdate.com/download/kernel-patches/linux-dm7020hd-2.6.18-c59d7210272be29e3850aca3abbff76443f65d6f-fixed.patch.bz2]
 md5=dc78c09b0f1db77ecfba58617eec178a
 sha256=a62b549563bd9a4d877c64aee36ed9ab2c8c4b4dd9f67d6bcd746eeaef61bb8b
@@ -18994,6 +19058,10 @@ sha256=0152ebb1b9ceaefdd85c85fd468a2b6506b8b8df9e0bc66c308d3b0feaca4950
 md5=1b7f91c7c520bd073ec7a5487f4c3467
 sha256=4aeb82c5ec8a3b4bead0275fbfaecfdbeda12b01cb6654eec1ce9791b5003807
 
+[http://sources.dreamboxupdate.com/download/kernel-patches/linux-dm800-2.6.18-ac6cc9511a5f70eaa584c63fc5c3de33cae1d0e7.patch.bz2]
+md5=d8938aa5b1a5c6928a1fad3c699bd98e
+sha256=faca8966d65932619bf69d034ed892ac9bb5f5c9b57ba50ba8dbe471894105ac
+
 [http://sources.dreamboxupdate.com/download/kernel-patches/linux-dm800-2.6.18-c59d7210272be29e3850aca3abbff76443f65d6f-fixed.patch.bz2]
 md5=dc78c09b0f1db77ecfba58617eec178a
 sha256=a62b549563bd9a4d877c64aee36ed9ab2c8c4b4dd9f67d6bcd746eeaef61bb8b
@@ -19014,6 +19082,10 @@ sha256=0152ebb1b9ceaefdd85c85fd468a2b6506b8b8df9e0bc66c308d3b0feaca4950
 md5=1b7f91c7c520bd073ec7a5487f4c3467
 sha256=4aeb82c5ec8a3b4bead0275fbfaecfdbeda12b01cb6654eec1ce9791b5003807
 
+[http://sources.dreamboxupdate.com/download/kernel-patches/linux-dm8000-2.6.18-ac6cc9511a5f70eaa584c63fc5c3de33cae1d0e7.patch.bz2]
+md5=d8938aa5b1a5c6928a1fad3c699bd98e
+sha256=faca8966d65932619bf69d034ed892ac9bb5f5c9b57ba50ba8dbe471894105ac
+
 [http://sources.dreamboxupdate.com/download/kernel-patches/linux-dm8000-2.6.18-c59d7210272be29e3850aca3abbff76443f65d6f-fixed.patch.bz2]
 md5=dc78c09b0f1db77ecfba58617eec178a
 sha256=a62b549563bd9a4d877c64aee36ed9ab2c8c4b4dd9f67d6bcd746eeaef61bb8b
@@ -19026,6 +19098,10 @@ sha256=df0d3f72292c01a457b07ca4f1f3e891aceba802a2cdaef0e09d0fce91cb47d1
 md5=a8716935614c6ed3d062f1a12b6c969b
 sha256=0152ebb1b9ceaefdd85c85fd468a2b6506b8b8df9e0bc66c308d3b0feaca4950
 
+[http://sources.dreamboxupdate.com/download/kernel-patches/linux-dm800se-2.6.18-ac6cc9511a5f70eaa584c63fc5c3de33cae1d0e7.patch.bz2]
+md5=d8938aa5b1a5c6928a1fad3c699bd98e
+sha256=faca8966d65932619bf69d034ed892ac9bb5f5c9b57ba50ba8dbe471894105ac
+
 [http://sources.dreamboxupdate.com/download/kernel-patches/linux-dm800se-2.6.18-c59d7210272be29e3850aca3abbff76443f65d6f-fixed.patch.bz2]
 md5=dc78c09b0f1db77ecfba58617eec178a
 sha256=a62b549563bd9a4d877c64aee36ed9ab2c8c4b4dd9f67d6bcd746eeaef61bb8b
@@ -25050,6 +25126,10 @@ sha256=e05256d560ca7d674cd4310bb791748900ad14ad662cbfe22b6d72ada43e7955
 md5=6f88d96507c84e9fea5bf3a71ebeb6d7
 sha256=8cb5277c41f824cfc6dcee0e95e0bf23a9ad2c8d18d245105137481d092b124a
 
+[http://get.qt.nokia.com/qt/source/qt-everywhere-opensource-src-4.7.4.tar.gz]
+md5=9831cf1dfa8d0689a06c2c54c5c65aaf
+sha256=97195ebce8a46f9929fb971d9ae58326d011c4d54425389e6e936514f540221e
+
 [ftp://ftp.trolltech.com/qt/source/qt-x11-free-3.3.5.tar.bz2]
 md5=05d04688c0c0230ed54e89102d689ca4
 sha256=aac89e862c74b2f3ead768e50e9fa7ada1e4225fe9d1d9e05723a3279259eb96
@@ -25138,6 +25218,10 @@ sha256=f364de206e1e0f9b1fe84c22a41ff56ebe80d01f0779da2470bbd3efddb3feec
 md5=0a481885a496092c77eb4017540b5cf6
 sha256=6df317183ff62cc82f3dcf88207a267cd6478cb5147f55d7530c94f1ad5f4132
 
+[http://pkgs.fedoraproject.org/repo/pkgs/qtwebkit/qtwebkit-2.2.0-rc1.tar.xz/5c1581052ad5bb7aed07a1798a340061/qtwebkit-2.2.0-rc1.tar.xz]
+md5=5c1581052ad5bb7aed07a1798a340061
+sha256=fd33bdf565dde335bf0cd686c2513c60305f95a1e4b9a82f6b305cb672985a0b
+
 [http://www.quagga.net/download/quagga-0.99.14.tar.gz]
 md5=3a075fd5e26ec6d52f4a51b14a2d3c2c
 sha256=3f637fa1b49d335c00e78602754977d22455ba6e4a82ce4183c4da50667067e5
@@ -26230,6 +26314,14 @@ sha256=c8490a2c4a645784b58b6693d6e274ef376db301670126ca952b9da7eef0c5c3
 md5=29224516d8486d195f678f22647a85db
 sha256=e352d8e4c7ad44caea2c41b37bf6e62e68e5cd70ab080485cef607587dc32ae7
 
+[http://sources.dreamboxupdate.com/download/7020/secondstage-dm500hd-84.bin]
+md5=d13c2713f4062a7de53f02f6ae8dba48
+sha256=4280e588f85689fca109aeeabd54a98e22674ce0f98fb10c23878d72de54a227
+
+[http://sources.dreamboxupdate.com/download/7020/secondstage-dm500hd-84.nfi]
+md5=6b43dcffad913c6c5d56d05f27ddfcdf
+sha256=6feacb711f2c60bc8bbc93a4b8be3663a8231d6fbadb9197395246fce5d0a23c
+
 [http://sources.dreamboxupdate.com/download/7020/secondstage-dm500plus-66.bin]
 md5=7f39bb5b08a100b5fbb6f157687e2679
 sha256=6d745f4be850cb952b433f70c0ac3ebd5d5ec6a69085259bd7e220d28dbad5c2
@@ -26242,13 +26334,13 @@ sha256=0c9c00b9512571e6c638c56985f9876c76c1ef9689b4a1d139d5bd5b25cf7020
 md5=21ca329e3616694b49135f759aa224e9
 sha256=544ee8d47a33595cfb7a6ace03243babdb7dd7fcfdf6af7f26fb3e7386fbc525
 
-[http://sources.dreamboxupdate.com/download/7020/secondstage-dm7020hd-83.bin]
-md5=455bfd629ddf411554653736c1073c5e
-sha256=2d9a19c94b16334e5e62476d49e8c590add1e24aa9436d52736a1cee7f2a15d9
+[http://sources.dreamboxupdate.com/download/7020/secondstage-dm7020hd-84.bin]
+md5=437871c9b87852cd23ebaaa2c9513f0f
+sha256=5f28f44698f703f417275eabf96c6c515e3121a88a615f7c0b1c72c2166baa7f
 
-[http://sources.dreamboxupdate.com/download/7020/secondstage-dm7020hd-83.nfi]
-md5=8024ebffeb21aee5f14dd0f0accb1c88
-sha256=117ae966b2d71fe1a1a0cd7d5789cf9baad410c12dfc154f1ca93c45564bbd4d
+[http://sources.dreamboxupdate.com/download/7020/secondstage-dm7020hd-84.nfi]
+md5=044aebb90f63c74f965b1071e3264b39
+sha256=92e45ddb90b7b502b64a676c4e6095f7fd19d15eb1f50345c1a655169d137f3e
 
 [http://sources.dreamboxupdate.com/download/7020/secondstage-dm7025-61.bin]
 md5=9c5d56e9cc0f0f8231167f5a25311852
@@ -26322,6 +26414,14 @@ sha256=e1ecbe7f8127ebbce357dab858380ed9908b4e239c1562c02eb04ca6293577b3
 md5=64d0e5c5d90188c8f767d6bdf3f3b0dd
 sha256=40b0e3e8673066162f924af1b34c8c54c453264deba186aab45b94747e5a6851
 
+[http://sources.dreamboxupdate.com/download/7020/secondstage-dm800-84.bin]
+md5=365df746869b1bd3738c705068c6d16c
+sha256=5cddff85d70918805554f72049b105c8d64988ec79815119b5d962f52c17cb32
+
+[http://sources.dreamboxupdate.com/download/7020/secondstage-dm800-84.nfi]
+md5=1a62221ba4e6b1c4bb1ab042f9c2eb55
+sha256=d2850a711347709217ecb9487ae7c82759b5e69b60e77701d88cd69e161776db
+
 [http://sources.dreamboxupdate.com/download/7020/secondstage-dm8000-73.bin]
 md5=51a6aaa258a9684ab5dd64ea16296ebd
 sha256=74cb12156867bddfa110f51e52bfd186686eefb58f150c7c1306d1bce04756a6
@@ -26362,6 +26462,14 @@ sha256=66c6dc6fe5fa965dd7b49a4fc0049d74701955114c312db11a12aa9c3dde7198
 md5=e121b96311910c4d3822012bd65596dc
 sha256=e18b19e32549c15999848ca218ec689bc479c118b30ae3b979cf2204b2e7ce47
 
+[http://sources.dreamboxupdate.com/download/7020/secondstage-dm8000-84.bin]
+md5=8a6d83a266f88ec8fa5d130083f46d25
+sha256=b5dbfe00674e8dea38b5069b1bfde3fe6b4486d4c4556ac775b3127e8454ca98
+
+[http://sources.dreamboxupdate.com/download/7020/secondstage-dm8000-84.nfi]
+md5=0234754870b3eb923b5961b6738d8ec0
+sha256=3a7ad0b8eb796cc67926702dc747a58c3158078f102a80f8c63edb7b977e7a01
+
 [http://sources.dreamboxupdate.com/download/7020/secondstage-dm800se-79.bin]
 md5=7b9914794294d6aae2837ca1f3847f98
 sha256=45884b2fe6a5c54864cce80fc7bca20b611b4d348799807601f2a750b77664e2
@@ -26402,6 +26510,14 @@ sha256=92dd1a6375a3bca94b7264851d8cb114fc5794eee93eab104e10be44f0a7a621
 md5=c7ae93591d9da26317e919a660a0a036
 sha256=dffed373ae5cead1941e295368ea9b5d3592934bb86f905869d580306bf2aac1
 
+[http://sources.dreamboxupdate.com/download/7020/secondstage-dm800se-84.bin]
+md5=3c335e3d1da39b4275ea2489f218f39b
+sha256=a378b1eb56780c0a0d19d9380d359b41556983508da05c4a1617f3c6cf702bd2
+
+[http://sources.dreamboxupdate.com/download/7020/secondstage-dm800se-84.nfi]
+md5=134873f6071a3efddee7ec942bd3a9b8
+sha256=35fb12a2464f78a7c95e509744bd66d63bf1e84501d7a9469db36fd51445a56a
+
 [ftp://ftp.gnu.org/gnu/sed/sed-4.0.8.tar.gz]
 md5=fb7fa2a7336afc358012763b292e2124
 sha256=a02d8c006bc0531bd646cae3082b7db8c7a1969084411cb129ec105fd12c0a13
index f8df57d..606762e 100644 (file)
@@ -33,11 +33,19 @@ PREFERRED_BINUTILS ?= "2.20"
 PREFERRED_GCC_VERSION ?= "4.4.3"
 TARGET_VENDOR ?= ""
 
+OPENDREAMBOX_QT_VERSION = "4.7.4"
+
 PREFERRED_VERSION_automake ?= "1.10.2"
 PREFERRED_VERSION_automake-native ?= "1.10.2"
 PREFERRED_VERSION_busybox ?= "1.15.3"
 PREFERRED_VERSION_libsigc++-1.2 ?= "1.2.5"
 PREFERRED_VERSION_linux-libc-headers ?= "2.6.29"
+PREFERRED_VERSION_qt4-native ?= "${OPENDREAMBOX_QT_VERSION}"
+PREFERRED_VERSION_qt4-tools-sdk ?= "${OPENDREAMBOX_QT_VERSION}"
+PREFERRED_VERSION_qt4-embedded ?= "${OPENDREAMBOX_QT_VERSION}"
+PREFERRED_VERSION_qt4-embedded-gles ?= "${OPENDREAMBOX_QT_VERSION}"
+PREFERRED_VERSION_qt4-x11-free = "${OPENDREAMBOX_QT_VERSION}"
+PREFERRED_VERSION_qt4-x11-free-gles ?= "${OPENDREAMBOX_QT_VERSION}"
 PREFERRED_VERSION_swig-native ?= "1.3.39"
 PREFERRED_VERSION_wpa-supplicant ?= "0.6.9"
 PREFERRED_VERSION_samba = "3.0.37"
@@ -45,6 +53,7 @@ PREFERRED_VERSION_ushare = "1.1a"
 
 PREFERRED_PROVIDER_avahi = "avahi"
 PREFERRED_PROVIDER_opkg = "opkg-nogpg"
+PREFERRED_PROVIDER_qt4-tools-native = "qt4-native"
 PREFERRED_PROVIDER_initscripts = "initscripts-opendreambox"
 PREFERRED_PROVIDER_virtual/db = "db"
 PREFERRED_PROVIDER_virtual/db-native = "db-native"
index 5d4225a..4b63f48 100644 (file)
@@ -69,7 +69,7 @@ IMAGE_CMD_jffs2 = "\
                --compression-mode=size \
                --output=${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.rootfs.jffs2 \
                ${EXTRA_IMAGECMD}; \
-       buildimage --arch ${MACHINE} -e 0x4000 -f 0x4000000 -s 512 \
+       buildimage --brcmnand --arch ${MACHINE} -e 0x4000 -f 0x4000000 -s 512 \
                -b 0x40000:${STAGING_LIBDIR}/dreambox-secondstage/main.bin.gz \
                -d 0x3C0000:${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.boot.jffs2 \
                -d 0x3C00000:${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.rootfs.jffs2 \
index 5c2b1a4..7d35653 100644 (file)
@@ -79,7 +79,7 @@ IMAGE_CMD_jffs2 = "\
                -i ${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.rootfs.jffs2 \
                -o ${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.rootfs.jffs2.sum \
                ${EXTRA_IMAGECMD}; \
-       buildimage --arch ${MACHINE} -e 0x40000 -f 0x10000000 -s 4096 \
+       buildimage --brcmnand --arch ${MACHINE} -e 0x40000 -f 0x10000000 -s 4096 \
                -b 0x100000:${STAGING_LIBDIR}/dreambox-secondstage/main.bin.gz \
                -d 0x700000:${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.boot.jffs2.sum \
                -d 0xF800000:${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.rootfs.jffs2.sum \
index d0c3c1b..ab89add 100644 (file)
@@ -71,7 +71,7 @@ IMAGE_CMD_jffs2 = "\
                --compression-mode=size \
                --output=${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.rootfs.jffs2 \
                ${EXTRA_IMAGECMD}; \
-       buildimage --arch ${MACHINE} -e 0x4000 -f 0x4000000 -s 512 \
+       buildimage --brcmnand --arch ${MACHINE} -e 0x4000 -f 0x4000000 -s 512 \
                -b 0x40000:${STAGING_LIBDIR}/dreambox-secondstage/main.bin.gz \
                -d 0x3C0000:${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.boot.jffs2 \
                -d 0x3C00000:${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.rootfs.jffs2 \
index fd4b2b2..aa63a59 100644 (file)
@@ -71,7 +71,7 @@ IMAGE_CMD_jffs2 = "\
                --compression-mode=size \
                --output=${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.rootfs.jffs2 \
                ${EXTRA_IMAGECMD}; \
-       buildimage --arch ${MACHINE} -e 0x4000 -f 0x4000000 -s 512 \
+       buildimage --brcmnand --arch ${MACHINE} -e 0x4000 -f 0x4000000 -s 512 \
                -b 0x40000:${STAGING_LIBDIR}/dreambox-secondstage/main.bin.gz \
                -d 0x3C0000:${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.boot.jffs2 \
                -d 0x3C00000:${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.rootfs.jffs2 \
index 5d14431..ca08b2c 100644 (file)
@@ -2,10 +2,10 @@ DESCRIPTION = "create Dreambox NAND boot images"
 SECTION = "console/utils"
 LICENSE = "GPL"
 
-PV="1.2"
+PV="1.3"
 SRC_URI = "git://git.opendreambox.org/git/buildimage.git;protocol=git"
 
-SRCREV = "ceb57b73c8025f4caaf0a5ff2294d6c611466b6d"
+SRCREV = "c208f6d5b1fe92de060a94bf327b0d897e64ba93"
 S = "${WORKDIR}/git"
 
 inherit autotools native
index c28c272..69f12bc 100644 (file)
@@ -18,19 +18,19 @@ PV_dm7025 = "${KV}-${@base_contains('PREFERRED_VERSION_linux-dm7025', '2.6.12.6'
 GCC_dm7025 = "${@base_contains('PREFERRED_VERSION_linux-dm7025', '2.6.12.6', '-gcc4.4', '', d)}"
 
 KV_dm500hd = "${@base_contains('PREFERRED_VERSION_linux-dm500hd', '2.6.18', '2.6.18-7.4-dm500hd', '2.6.30-dm500hd', d)}"
-PV_dm500hd = "${KV}-${@base_contains('PREFERRED_VERSION_linux-dm500hd', '2.6.18', '20110506', '20090727', d)}"
+PV_dm500hd = "${KV}-${@base_contains('PREFERRED_VERSION_linux-dm500hd', '2.6.18', '20110902', '20090727', d)}"
 
 KV_dm800 = "${@base_contains('PREFERRED_VERSION_linux-dm800', '2.6.18', '2.6.18-7.4-dm800', '2.6.30-dm800', d)}"
-PV_dm800 = "${KV}-${@base_contains('PREFERRED_VERSION_linux-dm800', '2.6.18', '20110506', '20090723', d)}"
+PV_dm800 = "${KV}-${@base_contains('PREFERRED_VERSION_linux-dm800', '2.6.18', '20110902', '20090723', d)}"
 
 KV_dm800se = "2.6.18-7.4-dm800se"
-PV_dm800se = "${KV}-20110506"
+PV_dm800se = "${KV}-20110902"
 
 KV_dm7020hd = "2.6.18-7.4-dm7020hd"
 PV_dm7020hd = "${KV}-20110506"
 
 KV_dm8000 = "${@base_contains('PREFERRED_VERSION_linux-dm8000', '2.6.18', '2.6.18-7.4-dm8000', '2.6.30-dm8000', d)}"
-PV_dm8000 = "${KV}-${@base_contains('PREFERRED_VERSION_linux-dm8000', '2.6.18', '20110506', '20090820', d)}"
+PV_dm8000 = "${KV}-${@base_contains('PREFERRED_VERSION_linux-dm8000', '2.6.18', '20110902', '20090820', d)}"
 
 RDEPENDS = "kernel (${KV})"
 
index 8c3868e..f5bbf9b 100644 (file)
@@ -2,10 +2,7 @@ DESCRIPTION = "Dreambox second stage bootloader"
 SECTION = "base"
 PRIORITY = "required"
 MAINTAINER = "Felix Domke <tmbinc@elitedvb.net>"
-PV = "82"
-PV_dm8000 = "83"
-PV_dm7020hd = "83"
-PV_dm500hd = "83"
+PV = "84"
 PV_dm7025 = "83"
 PV_dm7020 = "35"
 PV_dm600pvr = "66"
@@ -48,8 +45,18 @@ PACKAGE_ARCH := "${MACHINE_ARCH}"
 pkg_postinst() {
        if [ -d /proc/stb ]; then
                if [ -f /tmp/writenfi ]; then
-                       /tmp/writenfi /tmp/secondstage.nfi;
-                       rm /tmp/writenfi /tmp/secondstage.nfi;
+                       if [ "$(cat /proc/stb/info/model)" = "dm8000" ]; then
+                               /tmp/writenfi /tmp/secondstage.nfi;
+                               rm /tmp/writenfi /tmp/secondstage.nfi;
+                       else
+                               #hack for broken mtd layer in linux kernel 2.6.18-r13.0
+                               mv /tmp/writenfi /usr/bin/writenfi;
+                               mv /tmp/secondstage.nfi /usr/bin/secondstage.nfi;
+                               echo "#!/bin/sh" > /etc/rcS.d/S05UpdateSecondstage;
+                               echo "/usr/bin/writenfi /usr/bin/secondstage.nfi || /bin/true" > /etc/rcS.d/S05UpdateSecondstage;
+                               echo "rm -f /usr/bin/writenfi /usr/bin/secondstage.nfi /etc/rcS.d/S05UpdateSecondstage" >> /etc/rcS.d/S05UpdateSecondstage;
+                               chmod ugo+x /etc/rcS.d/S05UpdateSecondstage;
+                       fi
                fi
        fi
 }
index 0bb95ff..fc989da 100644 (file)
@@ -17,7 +17,7 @@ RDEPENDS = "python-codecs python-core python-lang python-re python-threading \
 
 GST_RTSP_RDEPENDS = "gst-plugin-udp gst-plugin-rtsp gst-plugin-rtp gst-plugin-rtpmanager"
 GST_ALSA_RDEPENDS = "gst-plugin-alsa alsa-conf"
-GST_MISC_RDEPENDS = "gst-plugin-matroska gst-plugin-qtdemux gst-plugin-vorbis gst-plugin-audioparsersbad"
+GST_MISC_RDEPENDS = "gst-plugin-matroska gst-plugin-isomp4 gst-plugin-vorbis gst-plugin-audioparsers"
 GST_DVD_RDEPENDS = "gst-plugin-cdxaparse gst-plugin-cdio gst-plugin-vcdsrc"
 GST_BASE_RDEPENDS = "${GST_ALSA_RDEPENDS} ${GST_MISC_RDEPENDS} ${GST_RTSP_RDEPENDS}"
 
index 49f7ff5..8d95d4c 100644 (file)
@@ -1,5 +1,5 @@
 --- gst-plugins-bad-0.10.21-org/gst/audioparsers/plugin.c      2010-11-29 20:45:46.000000000 +0100
-+++ gst-plugins-bad-0.10.21/gst/audioparsers/plugin.c  2011-03-31 13:29:33.589634720 +0200
++++ gst-plugins-bad-0.10.21/gst/audioparsers/plugin.c  2011-07-18 15:42:24.226174445 +0200
 @@ -34,15 +34,15 @@
    gboolean ret;
  
@@ -13,7 +13,8 @@
 -      GST_RANK_PRIMARY + 1, GST_TYPE_AC3_PARSE);
 +      GST_RANK_PRIMARY + 2, GST_TYPE_AC3_PARSE);
    ret &= gst_element_register (plugin, "dcaparse",
-       GST_RANK_NONE, GST_TYPE_DCA_PARSE);
+-      GST_RANK_NONE, GST_TYPE_DCA_PARSE);
++      GST_RANK_PRIMARY + 2, GST_TYPE_DCA_PARSE);
    ret &= gst_element_register (plugin, "flacparse",
 -      GST_RANK_PRIMARY + 1, GST_TYPE_FLAC_PARSE);
 +      GST_RANK_PRIMARY + 2, GST_TYPE_FLAC_PARSE);
diff --git a/recipes/gstreamer/gst-plugins-bad/mpegtsmux_indexing_alignment.diff b/recipes/gstreamer/gst-plugins-bad/mpegtsmux_indexing_alignment.diff
new file mode 100644 (file)
index 0000000..ace9533
--- /dev/null
@@ -0,0 +1,467 @@
+From: Andreas Frisch <fraxinas@opendreambox.org>
+Date: Sat, 17 Sep 2011 23:29:21 +0200
+Subject: [PATCH] [mpegtsmux] introduce an alignment property which specifies
+ the amount of packets, that buffers must contain before
+ they are pushed. On EOS, dummy packets are generated and
+ used for padding until the final buffer is also aligned.
+ With a value of 32 given, this allows creating blu-ray
+ compliant streams.
+
+From: Andreas Frisch <fraxinas@opendreambox.org>
+Date: Mon, 28 Mar 2011 10:31:23 +0200
+Subject: [PATCH] [mpegtsmux] add indexing capabilities to generate a SPN/PTS map on the fly in m2ts-mode
+
+diff -u a/gst/mpegtsmux/mpegtsmux.c b/gst/mpegtsmux/mpegtsmux.c
+--- a/gst/mpegtsmux/mpegtsmux.c        2011-04-21 15:17:35.000000000 +0200
++++ b/gst/mpegtsmux/mpegtsmux.c        2011-09-17 23:39:08.671044710 +0200
+@@ -102,7 +102,8 @@
+   ARG_PROG_MAP,
+   ARG_M2TS_MODE,
+   ARG_PAT_INTERVAL,
+-  ARG_PMT_INTERVAL
++  ARG_PMT_INTERVAL,
++  ARG_ALIGNMENT
+ };
+ static GstStaticPadTemplate mpegtsmux_sink_factory =
+@@ -151,6 +152,11 @@
+ static GstStateChangeReturn mpegtsmux_change_state (GstElement * element,
+     GstStateChange transition);
+ static void mpegtsdemux_set_header_on_caps (MpegTsMux * mux);
++static void mpegtsmux_set_index (GstElement * element, GstIndex * index);
++static GstIndex *mpegtsmux_get_index (GstElement * element);
++
++static GstFormat pts_format;
++static GstFormat spn_format;
+ GST_BOILERPLATE (MpegTsMux, mpegtsmux, GstElement, GST_TYPE_ELEMENT);
+@@ -169,6 +175,10 @@
+       "MPEG Transport Stream Muxer", "Codec/Muxer",
+       "Multiplexes media streams into an MPEG Transport Stream",
+       "Fluendo <contact@fluendo.com>");
++
++  pts_format =
++      gst_format_register ("PTS", "MPEG System Presentation Time Stamp");
++  spn_format = gst_format_register ("SPN", "Source Packet Number");
+ }
+ static void
+@@ -185,6 +195,9 @@
+   gstelement_class->release_pad = mpegtsmux_release_pad;
+   gstelement_class->change_state = mpegtsmux_change_state;
++  gstelement_class->set_index = GST_DEBUG_FUNCPTR (mpegtsmux_set_index);
++  gstelement_class->get_index = GST_DEBUG_FUNCPTR (mpegtsmux_get_index);
++
+   g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_PROG_MAP,
+       g_param_spec_boxed ("prog-map", "Program map",
+           "A GstStructure specifies the mapping from elementary streams to programs",
+@@ -207,6 +220,12 @@
+           "Set the interval (in ticks of the 90kHz clock) for writing out the PMT table",
+           1, G_MAXUINT, TSMUX_DEFAULT_PMT_INTERVAL,
+           G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
++
++  g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_ALIGNMENT,
++      g_param_spec_uint ("alignment", "packet alignment",
++          "Queue this amount of ts/m2ts packets before pushing buffer. On EOS, pad with dummy packets until aligned. Default: 32 for m2ts streams, else disabled.",
++          0, G_MAXUINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
++
+ }
+ static void
+@@ -238,6 +257,17 @@
+   mux->prog_map = NULL;
+   mux->streamheader = NULL;
+   mux->streamheader_sent = FALSE;
++
++  mux->last_key_ts = 0;
++  mux->last_key_spn = 0;
++  mux->spn_count = 0;
++
++  mux->element_index = NULL;
++  mux->element_index_writer_id = -1;
++
++  mux->arbitrary_align = FALSE;
++  mux->alignment_adapter = gst_adapter_new ();
++  mux->packets_per_buffer = 0;
+ }
+ static void
+@@ -279,6 +309,15 @@
+     g_list_free (mux->streamheader);
+     mux->streamheader = NULL;
+   }
++  if (mux->alignment_adapter) {
++    gst_adapter_clear (mux->alignment_adapter);
++    g_object_unref (mux->alignment_adapter);
++    mux->alignment_adapter = NULL;
++  }
++
++  if (mux->element_index)
++    gst_object_unref (mux->element_index);
++
+   GST_CALL_PARENT (G_OBJECT_CLASS, dispose, (object));
+ }
+@@ -322,12 +361,27 @@
+         walk = g_slist_next (walk);
+       }
+       break;
++    case ARG_ALIGNMENT:
++      mux->packets_per_buffer = g_value_get_uint (value);
++      mux->arbitrary_align = TRUE;
++      break;
+     default:
+       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+       break;
+   }
+ }
++guint
++get_packets_per_buffer (MpegTsMux * mux)
++{
++  if (mux->arbitrary_align == TRUE) {
++    return mux->packets_per_buffer;
++  } else if (mux->m2ts_mode) {
++    return BDMV_PACKETS_PER_BUFFER;
++  }
++  return DEFAULT_PACKETS_PER_BUFFER;
++}
++
+ static void
+ gst_mpegtsmux_get_property (GObject * object, guint prop_id,
+     GValue * value, GParamSpec * pspec)
+@@ -347,6 +401,9 @@
+     case ARG_PMT_INTERVAL:
+       g_value_set_uint (value, mux->pmt_interval);
+       break;
++    case ARG_ALIGNMENT:
++      g_value_set_uint (value, get_packets_per_buffer (mux));
++      break;
+     default:
+       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+       break;
+@@ -354,6 +411,37 @@
+ }
+ static void
++mpegtsmux_set_index (GstElement * element, GstIndex * index)
++{
++  MpegTsMux *mux = GST_MPEG_TSMUX (element);
++
++  GST_OBJECT_LOCK (mux);
++  if (mux->element_index)
++    gst_object_unref (mux->element_index);
++  mux->element_index = index ? gst_object_ref (index) : NULL;
++  GST_OBJECT_UNLOCK (mux);
++  GST_DEBUG_OBJECT (mux, "Set index %" GST_PTR_FORMAT, mux->element_index);
++  gst_index_add_format (index, mux->element_index_writer_id, pts_format);
++  gst_index_add_format (index, mux->element_index_writer_id, spn_format);
++}
++
++static GstIndex *
++mpegtsmux_get_index (GstElement * element)
++{
++  GstIndex *result = NULL;
++  MpegTsMux *mux = GST_MPEG_TSMUX (element);
++
++  GST_OBJECT_LOCK (mux);
++  if (mux->element_index)
++    result = gst_object_ref (mux->element_index);
++  GST_OBJECT_UNLOCK (mux);
++
++  GST_DEBUG_OBJECT (mux, "Returning index %" GST_PTR_FORMAT, result);
++
++  return result;
++}
++
++static void
+ release_buffer_cb (guint8 * data, void *user_data)
+ {
+   GstBuffer *buf = (GstBuffer *) user_data;
+@@ -496,6 +584,24 @@
+     ret = GST_FLOW_OK;
+   }
++  if (mux->element_index) {
++    gboolean parsed = FALSE;
++    if (ts_data->stream->is_video_stream) {
++      if (gst_structure_get_boolean (s, "parsed", &parsed) && parsed) {
++        if (mux->element_index_writer_id == -1) {
++          gst_index_get_writer_id (mux->element_index, GST_OBJECT (mux),
++              &mux->element_index_writer_id);
++          GST_INFO_OBJECT (mux,
++              "created GstIndex writer_id = %d for PID 0x%04x",
++              mux->element_index_writer_id, ts_data->pid);
++        }
++      } else
++        GST_WARNING_OBJECT (pad,
++            "Indexing capability for PID=0x%04x disabled - parsed input stream is required!",
++            ts_data->pid);
++    }
++  }
++
+ beach:
+   gst_caps_unref (caps);
+   return ret;
+@@ -642,12 +748,113 @@
+     }
+   }
+   if (c_best) {
+-    gst_buffer_unref (gst_collect_pads_pop (mux->collect, c_best));
++    GstBuffer *buffer;
++    if ((buffer = gst_collect_pads_pop (mux->collect, c_best)))
++      gst_buffer_unref (buffer);
+   }
+   return best;
+ }
++static GstFlowReturn
++aligned_push (MpegTsMux * mux, GstBuffer * buf)
++{
++  guint accu_bytes, packet_length;
++  GstBuffer *out_buf;
++
++  if (get_packets_per_buffer (mux) == 0) {
++    return gst_pad_push (mux->srcpad, buf);
++  }
++
++  packet_length = mux->m2ts_mode ? M2TS_PACKET_LENGTH : NORMAL_TS_PACKET_LENGTH;
++  gst_adapter_push (mux->alignment_adapter, buf);
++
++  accu_bytes = gst_adapter_available (mux->alignment_adapter);
++  GST_DEBUG_OBJECT (mux,
++      "Accumulating packet in alignment adapter, accu_bytes=%i", accu_bytes);
++
++  if (accu_bytes == get_packets_per_buffer (mux) * packet_length) {
++    out_buf = gst_adapter_take_buffer (mux->alignment_adapter, accu_bytes);
++    gst_buffer_set_caps (out_buf, GST_PAD_CAPS (mux->srcpad));
++    gst_adapter_clear (mux->alignment_adapter);
++    GST_DEBUG_OBJECT (mux,
++        "Accumulated desired amount of packets in alignment unit, handing off %i bytes",
++        accu_bytes);
++    return gst_pad_push (mux->srcpad, out_buf);
++  } else if (accu_bytes > get_packets_per_buffer (mux) * packet_length) {
++    GST_WARNING_OBJECT (mux, "Packet alignment error!");
++    gst_adapter_clear (mux->alignment_adapter);
++    return GST_FLOW_CUSTOM_ERROR;
++  }
++
++  return GST_FLOW_OK;
++}
++
++static void
++mpegtsmux_eos_align (MpegTsMux * mux)
++{
++  guint accu_bytes, packet_length, packets_needed, dummy_packet_count;
++  guint32 m2ts_header;
++  guint continuity_counter;
++  unsigned char header[4];
++  guint p;
++  GstBuffer *buf;
++
++  accu_bytes = gst_adapter_available (mux->alignment_adapter);
++  packet_length = mux->m2ts_mode ? M2TS_PACKET_LENGTH : NORMAL_TS_PACKET_LENGTH;
++  packets_needed = get_packets_per_buffer (mux) - accu_bytes / packet_length;
++
++  if (get_packets_per_buffer (mux) == 0 || accu_bytes == 0) {
++    return;
++  }
++
++  GST_DEBUG_OBJECT (mux,
++      "received EOS - %i bytes accumulated in alignment adapter -> %i dummy packets needed for padding!\n",
++      accu_bytes, packets_needed);
++
++  if (mux->m2ts_mode) {
++    gst_adapter_copy (mux->alignment_adapter, header,
++        accu_bytes - packet_length, 4);
++    m2ts_header = GST_READ_UINT32_BE (header);
++    gst_adapter_copy (mux->alignment_adapter, header,
++        accu_bytes - packet_length + 7, 1);
++  } else {
++    gst_adapter_copy (mux->alignment_adapter, header,
++        accu_bytes - packet_length + 3, 1);
++  }
++
++  continuity_counter = header[0] & 0xF;
++
++  for (dummy_packet_count = 0; dummy_packet_count < packets_needed;
++      dummy_packet_count++) {
++    buf = gst_buffer_new_and_alloc (packet_length);
++    if (mux->m2ts_mode) {
++      // monotonically increase m2ts_header
++      m2ts_header++;
++      GST_WRITE_UINT32_BE (GST_BUFFER_DATA (buf), m2ts_header);
++      p = GST_BUFFER_DATA (buf) + 4;
++    } else {
++      p = GST_BUFFER_DATA (buf);
++    }
++    GST_WRITE_UINT8 (p++, TSMUX_SYNC_BYTE);
++    // dummy PID
++    GST_WRITE_UINT16_BE (p, 0x1FFF);
++    p += 2;
++    // adaptation field exists | no payload exists | continuity counter
++    GST_WRITE_UINT8 (p++, 0x20 + ((++continuity_counter) & 0xF));
++    // adaptation field length | flags
++    GST_WRITE_UINT16_BE (p, 0xB700);
++    p += 2;
++    // adaptation field
++    memset (p, 0xFF, 0xB6);
++
++    aligned_push (mux, buf);
++    GST_LOG_OBJECT (mux,
++        "generated dummy packet %i with m2ts_header=0x%x, contiuity=0x%02x\n",
++        dummy_packet_count, m2ts_header, continuity_counter);
++  }
++}
++
+ #define COLLECT_DATA_PAD(collect_data) (((GstCollectData *)(collect_data))->pad)
+ static GstFlowReturn
+@@ -679,20 +886,19 @@
+     if (prog == NULL) {
+       GST_ELEMENT_ERROR (mux, STREAM, MUX,
+           ("Stream on pad %" GST_PTR_FORMAT
+-              " is not associated with any program", best), (NULL));
++              " is not associated with any program", COLLECT_DATA_PAD (best)),
++          (NULL));
+       return GST_FLOW_ERROR;
+     }
+     if (G_UNLIKELY (prog->pcr_stream == NULL)) {
+-      if (best) {
+-        /* Take the first data stream for the PCR */
+-        GST_DEBUG_OBJECT (COLLECT_DATA_PAD (best),
+-            "Use stream (pid=%d) from pad as PCR for program (prog_id = %d)",
+-            MPEG_TS_PAD_DATA (best)->pid, MPEG_TS_PAD_DATA (best)->prog_id);
++      /* Take the first data stream for the PCR */
++      GST_DEBUG_OBJECT (COLLECT_DATA_PAD (best),
++          "Use stream (pid=%d) from pad as PCR for program (prog_id = %d)",
++          MPEG_TS_PAD_DATA (best)->pid, MPEG_TS_PAD_DATA (best)->prog_id);
+-        /* Set the chosen PCR stream */
+-        tsmux_program_set_pcr_stream (prog, best->stream);
+-      }
++      /* Set the chosen PCR stream */
++      tsmux_program_set_pcr_stream (prog, best->stream);
+     }
+     g_return_val_if_fail (buf != NULL, GST_FLOW_ERROR);
+@@ -709,6 +915,9 @@
+           G_GINT64_FORMAT, GST_TIME_ARGS (best->cur_ts), pts);
+     }
++    if (G_UNLIKELY (!delta))
++      mux->last_key_ts = best->cur_ts;
++
+     tsmux_stream_add_data (best->stream, GST_BUFFER_DATA (buf),
+         GST_BUFFER_SIZE (buf), buf, pts, -1, !delta);
+     best->queued_buf = NULL;
+@@ -730,6 +939,7 @@
+   } else {
+     /* FIXME: Drain all remaining streams */
+     /* At EOS */
++    mpegtsmux_eos_align (mux);
+     gst_pad_push_event (mux->srcpad, gst_event_new_eos ());
+   }
+@@ -839,6 +1049,7 @@
+   } else {
+     GST_DEBUG_OBJECT (mux, "marking as non-delta unit");
+     mux->is_delta = TRUE;
++    mux->last_key_spn = mux->spn_count;
+   }
+ }
+@@ -862,6 +1073,8 @@
+   new_packet_common_init (mux, buf, data, len);
++  mux->spn_count++;
++
+   /* copies the TS data of 188 bytes to the m2ts buffer at an offset
+      of 4 bytes to leave space for writing the timestamp later */
+   memcpy (GST_BUFFER_DATA (buf) + 4, data, len);
+@@ -925,12 +1138,22 @@
+       gst_buffer_set_caps (out_buf, GST_PAD_CAPS (mux->srcpad));
+       GST_BUFFER_TIMESTAMP (out_buf) = MPEG_SYS_TIME_TO_GSTTIME (cur_pcr);
++      if (mux->element_index) {
++        if (!GST_BUFFER_FLAG_IS_SET (out_buf, GST_BUFFER_FLAG_DELTA_UNIT)) {
++          gst_index_add_association (mux->element_index,
++              mux->element_index_writer_id,
++              GST_ASSOCIATION_FLAG_KEY_UNIT, spn_format,
++              mux->last_key_spn, pts_format,
++              GSTTIME_TO_MPEGTIME (mux->last_key_ts), NULL);
++        }
++      }
++
+       /* Write the 4 byte timestamp value, bottom 30 bits only = PCR */
+       GST_WRITE_UINT32_BE (GST_BUFFER_DATA (out_buf), cur_pcr & 0x3FFFFFFF);
+       GST_LOG_OBJECT (mux, "Outputting a packet of length %d PCR %"
+           G_GUINT64_FORMAT, M2TS_PACKET_LENGTH, cur_pcr);
+-      ret = gst_pad_push (mux->srcpad, out_buf);
++      ret = aligned_push (mux, out_buf);
+       if (G_UNLIKELY (ret != GST_FLOW_OK)) {
+         mux->last_flow_ret = ret;
+         return FALSE;
+@@ -946,7 +1169,7 @@
+   GST_LOG_OBJECT (mux, "Outputting a packet of length %d PCR %"
+       G_GUINT64_FORMAT, M2TS_PACKET_LENGTH, new_pcr);
+-  ret = gst_pad_push (mux->srcpad, buf);
++  ret = aligned_push (mux, buf);
+   if (G_UNLIKELY (ret != GST_FLOW_OK)) {
+     mux->last_flow_ret = ret;
+     return FALSE;
+@@ -976,7 +1199,7 @@
+   memcpy (GST_BUFFER_DATA (buf), data, len);
+   GST_BUFFER_TIMESTAMP (buf) = mux->last_ts;
+-  ret = gst_pad_push (mux->srcpad, buf);
++  ret = aligned_push (mux, buf);
+   if (G_UNLIKELY (ret != GST_FLOW_OK)) {
+     mux->last_flow_ret = ret;
+     return FALSE;
+@@ -1074,6 +1297,8 @@
+     case GST_STATE_CHANGE_READY_TO_NULL:
+       if (mux->adapter)
+         gst_adapter_clear (mux->adapter);
++      if (mux->alignment_adapter)
++        gst_adapter_clear (mux->alignment_adapter);
+       break;
+     default:
+       break;
+diff -u gst-original/mpegtsmux/mpegtsmux.h b/gst/mpegtsmux/mpegtsmux.h
+--- gst-original/mpegtsmux/mpegtsmux.h 2011-04-08 01:35:37.000000000 +0200
++++ b/gst/mpegtsmux/mpegtsmux.h        2011-09-17 23:39:06.427894850 +0200
+@@ -128,6 +128,16 @@
+   GList *streamheader;
+   gboolean streamheader_sent;
++
++  guint32 spn_count;
++  guint64 last_key_ts;
++  guint32 last_key_spn;
++  GstIndex *element_index;
++  gint      element_index_writer_id;
++ 
++  gboolean arbitrary_align;
++  guint packets_per_buffer;
++  GstAdapter *alignment_adapter;
+ };
+ struct MpegTsMuxClass  {
+@@ -183,6 +193,9 @@
+ #define MAX_PROG_NUMBER       32
+ #define DEFAULT_PROG_ID       0
++#define DEFAULT_PACKETS_PER_BUFFER 0
++#define BDMV_PACKETS_PER_BUFFER          32
++
+ G_END_DECLS
+ #endif
index 7c06cc2..fb0c958 100644 (file)
@@ -1,6 +1,6 @@
 require gst-plugins.inc
 
-PR = "${INC_PR}.1"
+PR = "${INC_PR}.2"
 
 do_configure_prepend() {
     sed -i -e s:docs::g Makefile.am
diff --git a/recipes/gstreamer/gst-plugins-bad_0.10.22.bb b/recipes/gstreamer/gst-plugins-bad_0.10.22.bb
new file mode 100644 (file)
index 0000000..dae328d
--- /dev/null
@@ -0,0 +1,23 @@
+require gst-plugins.inc
+
+PR = "${INC_PR}.1"
+
+do_configure_prepend() {
+    sed -i -e s:docs::g Makefile.am
+}
+
+DEPENDS += "gst-plugins-base"
+
+EXTRA_OECONF_opendreambox += "--disable-apexsink --disable-dvdnav --disable-cdaudio --disable-mpeg2enc --disable-mplex --disable-librfb"
+EXTRA_OECONF_vuplus += "--disable-apexsink --disable-dvdnav --disable-cdaudio --disable-mpeg2enc --disable-mplex --disable-librfb"
+
+SRC_URI_append_opendreambox += " \
+                                file://mpegtsdemux-fix-bd-streamtype-detection.diff;patch=1;pnum=1 \
+                                file://mpegpsdemux-speedup.diff;patch=1;pnum=0 \
+                                file://mpegtsmux_indexing_alignment.diff;patch=1;pnum=1 \
+"
+SRC_URI_append_vuplus += " \
+                                file://mpegtsdemux-fix-bd-streamtype-detection.diff;patch=1;pnum=1 \
+                                file://mpegpsdemux-speedup.diff;patch=1;pnum=0 \
+                                file://mpegtsmux_indexing_alignment.diff;patch=1;pnum=1 \
+"
diff --git a/recipes/gstreamer/gst-plugins-base/1e0ddb12aa1c2b13c4bc4a13712ebd7f06a6346e.patch b/recipes/gstreamer/gst-plugins-base/1e0ddb12aa1c2b13c4bc4a13712ebd7f06a6346e.patch
new file mode 100644 (file)
index 0000000..f4f9a5f
--- /dev/null
@@ -0,0 +1,1494 @@
+From 1e0ddb12aa1c2b13c4bc4a13712ebd7f06a6346e Mon Sep 17 00:00:00 2001
+From: Sebastian Dröge <sebastian.droege@collabora.co.uk>
+Date: Fri, 25 Mar 2011 07:26:00 +0000
+Subject: playsink: Add audio and video converter convenience bins
+
+These reconfigure based on the caps and plugin in converters if
+necessary. This also makes switching between compressed and raw
+streams work flawlessly without loosing the states of any element
+somewhere or having running time problems.
+---
+diff --git a/gst/playback/Makefile.am b/gst/playback/Makefile.am
+index 3adb56d..2fe90e6 100644
+--- a/gst/playback/Makefile.am
++++ b/gst/playback/Makefile.am
+@@ -18,6 +18,8 @@ libgstplaybin_la_SOURCES = \
+       gststreaminfo.c \
+       gststreamselector.c \
+       gstsubtitleoverlay.c \
++      gstplaysinkvideoconvert.c \
++      gstplaysinkaudioconvert.c \
+       gststreamsynchronizer.c
+ nodist_libgstplaybin_la_SOURCES = $(built_sources)
+@@ -57,6 +59,8 @@ noinst_HEADERS = \
+       gststreamselector.h \
+       gstrawcaps.h \
+       gstsubtitleoverlay.h \
++      gstplaysinkvideoconvert.h \
++      gstplaysinkaudioconvert.h \
+       gststreamsynchronizer.h
+ BUILT_SOURCES = $(built_headers) $(built_sources)
+diff --git a/gst/playback/gstplaysink.c b/gst/playback/gstplaysink.c
+index 3661af3..1449d00 100644
+--- a/gst/playback/gstplaysink.c
++++ b/gst/playback/gstplaysink.c
+@@ -31,6 +31,8 @@
+ #include "gstplaysink.h"
+ #include "gststreamsynchronizer.h"
++#include "gstplaysinkvideoconvert.h"
++#include "gstplaysinkaudioconvert.h"
+ GST_DEBUG_CATEGORY_STATIC (gst_play_sink_debug);
+ #define GST_CAT_DEFAULT gst_play_sink_debug
+@@ -59,7 +61,6 @@ typedef struct
+   GstPad *sinkpad;
+   GstElement *queue;
+   GstElement *conv;
+-  GstElement *resample;
+   GstElement *volume;           /* element with the volume property */
+   gboolean sink_volume;         /* if the volume was provided by the sink */
+   GstElement *mute;             /* element with the mute property */
+@@ -81,7 +82,6 @@ typedef struct
+   GstPad *sinkpad;
+   GstElement *queue;
+   GstElement *conv;
+-  GstElement *scale;
+   GstElement *sink;
+   gboolean async;
+   GstElement *ts_offset;
+@@ -1278,46 +1278,19 @@ gen_video_chain (GstPlaySink * playsink, gboolean raw, gboolean async)
+     head = prev = chain->queue;
+   }
+-  if (raw && !(playsink->flags & GST_PLAY_FLAG_NATIVE_VIDEO)) {
+-    GST_DEBUG_OBJECT (playsink, "creating ffmpegcolorspace");
+-    chain->conv = gst_element_factory_make ("ffmpegcolorspace", "vconv");
+-    if (chain->conv == NULL) {
+-      post_missing_element_message (playsink, "ffmpegcolorspace");
+-      GST_ELEMENT_WARNING (playsink, CORE, MISSING_PLUGIN,
+-          (_("Missing element '%s' - check your GStreamer installation."),
+-              "ffmpegcolorspace"), ("video rendering might fail"));
++  if (!(playsink->flags & GST_PLAY_FLAG_NATIVE_VIDEO)) {
++    GST_DEBUG_OBJECT (playsink, "creating videoconverter");
++    chain->conv =
++        g_object_new (GST_TYPE_PLAY_SINK_VIDEO_CONVERT, "name", "vconv", NULL);
++    gst_bin_add (bin, chain->conv);
++    if (prev) {
++      if (!gst_element_link_pads_full (prev, "src", chain->conv, "sink",
++              GST_PAD_LINK_CHECK_TEMPLATE_CAPS))
++        goto link_failed;
+     } else {
+-      gst_bin_add (bin, chain->conv);
+-      if (prev) {
+-        if (!gst_element_link_pads_full (prev, "src", chain->conv, "sink",
+-                GST_PAD_LINK_CHECK_TEMPLATE_CAPS))
+-          goto link_failed;
+-      } else {
+-        head = chain->conv;
+-      }
+-      prev = chain->conv;
+-    }
+-
+-    GST_DEBUG_OBJECT (playsink, "creating videoscale");
+-    chain->scale = gst_element_factory_make ("videoscale", "vscale");
+-    if (chain->scale == NULL) {
+-      post_missing_element_message (playsink, "videoscale");
+-      GST_ELEMENT_WARNING (playsink, CORE, MISSING_PLUGIN,
+-          (_("Missing element '%s' - check your GStreamer installation."),
+-              "videoscale"), ("possibly a liboil version mismatch?"));
+-    } else {
+-      /* Add black borders if necessary to keep the DAR */
+-      g_object_set (chain->scale, "add-borders", TRUE, NULL);
+-      gst_bin_add (bin, chain->scale);
+-      if (prev) {
+-        if (!gst_element_link_pads_full (prev, "src", chain->scale, "sink",
+-                GST_PAD_LINK_CHECK_TEMPLATE_CAPS))
+-          goto link_failed;
+-      } else {
+-        head = chain->scale;
+-      }
+-      prev = chain->scale;
++      head = chain->conv;
+     }
++    prev = chain->conv;
+   }
+   if (prev) {
+@@ -1388,8 +1361,7 @@ setup_video_chain (GstPlaySink * playsink, gboolean raw, gboolean async)
+   chain = playsink->videochain;
+-  if (chain->chain.raw != raw)
+-    return FALSE;
++  chain->chain.raw = raw;
+   /* if the chain was active we don't do anything */
+   if (GST_PLAY_CHAIN (chain)->activated == TRUE)
+@@ -1768,54 +1740,32 @@ gen_audio_chain (GstPlaySink * playsink, gboolean raw)
+     chain->sink_volume = FALSE;
+   }
+-  if (raw && !(playsink->flags & GST_PLAY_FLAG_NATIVE_AUDIO)) {
++  if (!(playsink->flags & GST_PLAY_FLAG_NATIVE_AUDIO) || (!have_volume
++          && playsink->flags & GST_PLAY_FLAG_SOFT_VOLUME)) {
+     GST_DEBUG_OBJECT (playsink, "creating audioconvert");
+-    chain->conv = gst_element_factory_make ("audioconvert", "aconv");
+-    if (chain->conv == NULL) {
+-      post_missing_element_message (playsink, "audioconvert");
+-      GST_ELEMENT_WARNING (playsink, CORE, MISSING_PLUGIN,
+-          (_("Missing element '%s' - check your GStreamer installation."),
+-              "audioconvert"), ("possibly a liboil version mismatch?"));
++    chain->conv =
++        g_object_new (GST_TYPE_PLAY_SINK_AUDIO_CONVERT, "name", "aconv", NULL);
++    gst_bin_add (bin, chain->conv);
++    if (prev) {
++      if (!gst_element_link_pads_full (prev, "src", chain->conv, "sink",
++              GST_PAD_LINK_CHECK_TEMPLATE_CAPS))
++        goto link_failed;
+     } else {
+-      gst_bin_add (bin, chain->conv);
+-      if (prev) {
+-        if (!gst_element_link_pads_full (prev, "src", chain->conv, "sink",
+-                GST_PAD_LINK_CHECK_TEMPLATE_CAPS))
+-          goto link_failed;
+-      } else {
+-        head = chain->conv;
+-      }
+-      prev = chain->conv;
++      head = chain->conv;
+     }
++    prev = chain->conv;
+-    GST_DEBUG_OBJECT (playsink, "creating audioresample");
+-    chain->resample = gst_element_factory_make ("audioresample", "aresample");
+-    if (chain->resample == NULL) {
+-      post_missing_element_message (playsink, "audioresample");
+-      GST_ELEMENT_WARNING (playsink, CORE, MISSING_PLUGIN,
+-          (_("Missing element '%s' - check your GStreamer installation."),
+-              "audioresample"), ("possibly a liboil version mismatch?"));
+-    } else {
+-      gst_bin_add (bin, chain->resample);
+-      if (prev) {
+-        if (!gst_element_link_pads_full (prev, "src", chain->resample, "sink",
+-                GST_PAD_LINK_CHECK_TEMPLATE_CAPS))
+-          goto link_failed;
+-      } else {
+-        head = chain->resample;
+-      }
+-      prev = chain->resample;
+-    }
++    GST_PLAY_SINK_AUDIO_CONVERT_CAST (chain->conv)->use_converters =
++        !(playsink->flags & GST_PLAY_FLAG_NATIVE_AUDIO);
++    GST_PLAY_SINK_AUDIO_CONVERT_CAST (chain->conv)->use_volume = (!have_volume
++        && playsink->flags & GST_PLAY_FLAG_SOFT_VOLUME);
+     if (!have_volume && playsink->flags & GST_PLAY_FLAG_SOFT_VOLUME) {
+-      GST_DEBUG_OBJECT (playsink, "creating volume");
+-      chain->volume = gst_element_factory_make ("volume", "volume");
+-      if (chain->volume == NULL) {
+-        post_missing_element_message (playsink, "volume");
+-        GST_ELEMENT_WARNING (playsink, CORE, MISSING_PLUGIN,
+-            (_("Missing element '%s' - check your GStreamer installation."),
+-                "volume"), ("possibly a liboil version mismatch?"));
+-      } else {
++      GstPlaySinkAudioConvert *conv =
++          GST_PLAY_SINK_AUDIO_CONVERT_CAST (chain->conv);
++
++      if (conv->volume) {
++        chain->volume = conv->volume;
+         have_volume = TRUE;
+         g_signal_connect (chain->volume, "notify::volume",
+@@ -1830,16 +1780,6 @@ gen_audio_chain (GstPlaySink * playsink, gboolean raw)
+         g_object_set (G_OBJECT (chain->volume), "volume", playsink->volume,
+             NULL);
+         g_object_set (G_OBJECT (chain->mute), "mute", playsink->mute, NULL);
+-        gst_bin_add (bin, chain->volume);
+-
+-        if (prev) {
+-          if (!gst_element_link_pads_full (prev, "src", chain->volume, "sink",
+-                  GST_PAD_LINK_CHECK_TEMPLATE_CAPS))
+-            goto link_failed;
+-        } else {
+-          head = chain->volume;
+-        }
+-        prev = chain->volume;
+       }
+     }
+   }
+@@ -1921,8 +1861,7 @@ setup_audio_chain (GstPlaySink * playsink, gboolean raw)
+   chain = playsink->audiochain;
+-  if (chain->chain.raw != raw)
+-    return FALSE;
++  chain->chain.raw = raw;
+   /* if the chain was active we don't do anything */
+   if (GST_PLAY_CHAIN (chain)->activated == TRUE)
+@@ -1967,29 +1906,35 @@ setup_audio_chain (GstPlaySink * playsink, gboolean raw)
+       g_signal_connect (chain->mute, "notify::mute",
+           G_CALLBACK (notify_mute_cb), playsink);
+     }
++
++    GST_PLAY_SINK_AUDIO_CONVERT_CAST (chain->conv)->use_volume = FALSE;
+   } else {
++    GstPlaySinkAudioConvert *conv =
++        GST_PLAY_SINK_AUDIO_CONVERT_CAST (chain->conv);
++
+     /* no volume, we need to add a volume element when we can */
++    conv->use_volume = TRUE;
+     GST_DEBUG_OBJECT (playsink, "the sink has no volume property");
+-    if (!raw) {
+-      GST_LOG_OBJECT (playsink, "non-raw format, can't do soft volume control");
+-      disconnect_chain (chain, playsink);
+-      chain->volume = NULL;
+-      chain->mute = NULL;
+-    } else {
+-      /* both last and current chain are raw audio, there should be a volume
+-       * element already, unless the sink changed from one with a volume
+-       * property to one that hasn't got a volume property, in which case we
+-       * re-generate the chain */
+-      if (chain->volume == NULL) {
+-        GST_DEBUG_OBJECT (playsink, "no existing volume element to re-use");
+-        /* undo background state change done earlier */
+-        gst_element_set_state (chain->sink, GST_STATE_NULL);
+-        return FALSE;
+-      }
++    /* Disconnect signals */
++    disconnect_chain (chain, playsink);
++
++    if (conv->volume) {
++      chain->volume = conv->volume;
++      chain->mute = chain->volume;
+-      GST_DEBUG_OBJECT (playsink, "reusing existing volume element");
++      g_signal_connect (chain->volume, "notify::volume",
++          G_CALLBACK (notify_volume_cb), playsink);
++
++      g_signal_connect (chain->mute, "notify::mute",
++          G_CALLBACK (notify_mute_cb), playsink);
++
++      /* configure with the latest volume and mute */
++      g_object_set (G_OBJECT (chain->volume), "volume", playsink->volume, NULL);
++      g_object_set (G_OBJECT (chain->mute), "mute", playsink->mute, NULL);
+     }
++
++    GST_DEBUG_OBJECT (playsink, "reusing existing volume element");
+   }
+   return TRUE;
+ }
+diff --git a/gst/playback/gstplaysinkaudioconvert.c b/gst/playback/gstplaysinkaudioconvert.c
+new file mode 100644
+index 0000000..43c5272
+--- a/dev/null
++++ b/gst/playback/gstplaysinkaudioconvert.c
+@@ -0,0 +1,522 @@
++/* GStreamer
++ * Copyright (C) <2011> Sebastian Dröge <sebastian.droege@collabora.co.uk>
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Library General Public
++ * License as published by the Free Software Foundation; either
++ * version 2 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Library General Public License for more details.
++ *
++ * You should have received a copy of the GNU Library General Public
++ * License along with this library; if not, write to the
++ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++ * Boston, MA 02111-1307, USA.
++ */
++
++#ifdef HAVE_CONFIG_H
++#include "config.h"
++#endif
++
++#include "gstplaysinkaudioconvert.h"
++
++#include <gst/pbutils/pbutils.h>
++#include <gst/gst-i18n-plugin.h>
++
++GST_DEBUG_CATEGORY_STATIC (gst_play_sink_audio_convert_debug);
++#define GST_CAT_DEFAULT gst_play_sink_audio_convert_debug
++
++#define parent_class gst_play_sink_audio_convert_parent_class
++
++G_DEFINE_TYPE (GstPlaySinkAudioConvert, gst_play_sink_audio_convert,
++    GST_TYPE_BIN);
++
++static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src",
++    GST_PAD_SRC,
++    GST_PAD_ALWAYS,
++    GST_STATIC_CAPS_ANY);
++
++static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink",
++    GST_PAD_SINK,
++    GST_PAD_ALWAYS,
++    GST_STATIC_CAPS_ANY);
++
++static gboolean
++is_raw_caps (GstCaps * caps)
++{
++  gint i, n;
++  GstStructure *s;
++  const gchar *name;
++
++  n = gst_caps_get_size (caps);
++  for (i = 0; i < n; i++) {
++    s = gst_caps_get_structure (caps, i);
++    name = gst_structure_get_name (s);
++    if (!g_str_has_prefix (name, "audio/x-raw"))
++      return FALSE;
++  }
++
++  return TRUE;
++}
++
++static void
++post_missing_element_message (GstPlaySinkAudioConvert * self,
++    const gchar * name)
++{
++  GstMessage *msg;
++
++  msg = gst_missing_element_message_new (GST_ELEMENT_CAST (self), name);
++  gst_element_post_message (GST_ELEMENT_CAST (self), msg);
++}
++
++static void
++distribute_running_time (GstElement * element, const GstSegment * segment)
++{
++  GstEvent *event;
++  GstPad *pad;
++
++  pad = gst_element_get_static_pad (element, "sink");
++
++  if (segment->accum) {
++    event = gst_event_new_new_segment_full (FALSE, segment->rate,
++        segment->applied_rate, segment->format, 0, segment->accum, 0);
++    gst_pad_push_event (pad, event);
++  }
++
++  event = gst_event_new_new_segment_full (FALSE, segment->rate,
++      segment->applied_rate, segment->format,
++      segment->start, segment->stop, segment->time);
++  gst_pad_push_event (pad, event);
++
++  gst_object_unref (pad);
++}
++
++static void
++pad_blocked_cb (GstPad * pad, gboolean blocked, GstPlaySinkAudioConvert * self)
++{
++  GstPad *peer;
++  GstCaps *caps;
++  gboolean raw;
++
++  GST_PLAY_SINK_AUDIO_CONVERT_LOCK (self);
++  self->sink_proxypad_blocked = blocked;
++  GST_DEBUG_OBJECT (self, "Pad blocked: %d", blocked);
++  if (!blocked)
++    goto done;
++
++  /* There must be a peer at this point */
++  peer = gst_pad_get_peer (self->sinkpad);
++  caps = gst_pad_get_negotiated_caps (peer);
++  if (!caps)
++    caps = gst_pad_get_caps_reffed (peer);
++  gst_object_unref (peer);
++
++  raw = is_raw_caps (caps);
++  GST_DEBUG_OBJECT (self, "Caps %" GST_PTR_FORMAT " are raw: %d", caps, raw);
++  gst_caps_unref (caps);
++
++  if (raw == self->raw)
++    goto unblock;
++  self->raw = raw;
++
++  if (raw) {
++    GstBin *bin = GST_BIN_CAST (self);
++    GstElement *head = NULL, *prev = NULL;
++    GstPad *pad;
++
++    GST_DEBUG_OBJECT (self, "Creating raw conversion pipeline");
++
++    gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (self->sinkpad), NULL);
++    gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (self->srcpad), NULL);
++
++    if (self->use_converters) {
++      self->conv = gst_element_factory_make ("audioconvert", "conv");
++      if (self->conv == NULL) {
++        post_missing_element_message (self, "audioconvert");
++        GST_ELEMENT_WARNING (self, CORE, MISSING_PLUGIN,
++            (_("Missing element '%s' - check your GStreamer installation."),
++                "audioconvert"), ("audio rendering might fail"));
++      } else {
++        gst_bin_add (bin, self->conv);
++        gst_element_sync_state_with_parent (self->conv);
++        distribute_running_time (self->conv, &self->segment);
++        prev = head = self->conv;
++      }
++
++      self->resample = gst_element_factory_make ("audioresample", "resample");
++      if (self->resample == NULL) {
++        post_missing_element_message (self, "audioresample");
++        GST_ELEMENT_WARNING (self, CORE, MISSING_PLUGIN,
++            (_("Missing element '%s' - check your GStreamer installation."),
++                "audioresample"), ("possibly a liboil version mismatch?"));
++      } else {
++        gst_bin_add (bin, self->resample);
++        gst_element_sync_state_with_parent (self->resample);
++        distribute_running_time (self->resample, &self->segment);
++        if (prev) {
++          if (!gst_element_link_pads_full (prev, "src", self->resample, "sink",
++                  GST_PAD_LINK_CHECK_TEMPLATE_CAPS))
++            goto link_failed;
++        } else {
++          head = self->resample;
++        }
++        prev = self->resample;
++      }
++    }
++
++    if (self->use_volume && self->volume) {
++      gst_bin_add (bin, gst_object_ref (self->volume));
++      gst_element_sync_state_with_parent (self->volume);
++      distribute_running_time (self->volume, &self->segment);
++      if (prev) {
++        if (!gst_element_link_pads_full (prev, "src", self->volume, "sink",
++                GST_PAD_LINK_CHECK_TEMPLATE_CAPS))
++          goto link_failed;
++      } else {
++        head = self->volume;
++      }
++      prev = self->volume;
++    }
++
++    if (head) {
++      pad = gst_element_get_static_pad (head, "sink");
++      gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (self->sinkpad), pad);
++      gst_object_unref (pad);
++    }
++
++    if (prev) {
++      pad = gst_element_get_static_pad (prev, "src");
++      gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (self->srcpad), pad);
++      gst_object_unref (pad);
++    }
++
++    if (!head && !prev) {
++      gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (self->srcpad),
++          self->sink_proxypad);
++    }
++
++    GST_DEBUG_OBJECT (self, "Raw conversion pipeline created");
++  } else {
++    GstBin *bin = GST_BIN_CAST (self);
++
++    GST_DEBUG_OBJECT (self, "Removing raw conversion pipeline");
++
++    gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (self->sinkpad), NULL);
++    gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (self->srcpad), NULL);
++
++    if (self->conv) {
++      gst_element_set_state (self->conv, GST_STATE_NULL);
++      gst_bin_remove (bin, self->conv);
++      self->conv = NULL;
++    }
++    if (self->resample) {
++      gst_element_set_state (self->resample, GST_STATE_NULL);
++      gst_bin_remove (bin, self->resample);
++      self->resample = NULL;
++    }
++    if (self->volume) {
++      gst_element_set_state (self->volume, GST_STATE_NULL);
++      if (GST_OBJECT_PARENT (self->volume) == GST_OBJECT_CAST (self)) {
++        gst_bin_remove (GST_BIN_CAST (self), self->volume);
++      }
++    }
++
++    gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (self->srcpad),
++        self->sink_proxypad);
++
++    GST_DEBUG_OBJECT (self, "Raw conversion pipeline removed");
++  }
++
++unblock:
++  gst_pad_set_blocked_async_full (self->sink_proxypad, FALSE,
++      (GstPadBlockCallback) pad_blocked_cb, gst_object_ref (self),
++      (GDestroyNotify) gst_object_unref);
++
++done:
++  GST_PLAY_SINK_AUDIO_CONVERT_UNLOCK (self);
++  return;
++
++link_failed:
++  {
++    GST_ELEMENT_ERROR (self, CORE, PAD,
++        (NULL), ("Failed to configure the audio converter."));
++    gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (self->srcpad),
++        self->sink_proxypad);
++    gst_pad_set_blocked_async_full (self->sink_proxypad, FALSE,
++        (GstPadBlockCallback) pad_blocked_cb, gst_object_ref (self),
++        (GDestroyNotify) gst_object_unref);
++    return;
++  }
++}
++
++static gboolean
++gst_play_sink_audio_convert_sink_event (GstPad * pad, GstEvent * event)
++{
++  GstPlaySinkAudioConvert *self =
++      GST_PLAY_SINK_AUDIO_CONVERT (gst_pad_get_parent (pad));
++  gboolean ret;
++
++  ret = self->sink_event (pad, gst_event_ref (event));
++
++  if (GST_EVENT_TYPE (event) == GST_EVENT_NEWSEGMENT) {
++    gboolean update;
++    gdouble rate, applied_rate;
++    GstFormat format;
++    gint64 start, stop, position;
++
++    GST_PLAY_SINK_AUDIO_CONVERT_LOCK (self);
++    gst_event_parse_new_segment_full (event, &update, &rate, &applied_rate,
++        &format, &start, &stop, &position);
++
++    GST_DEBUG_OBJECT (self, "Segment before %" GST_SEGMENT_FORMAT,
++        &self->segment);
++    gst_segment_set_newsegment_full (&self->segment, update, rate, applied_rate,
++        format, start, stop, position);
++    GST_DEBUG_OBJECT (self, "Segment after %" GST_SEGMENT_FORMAT,
++        &self->segment);
++    GST_PLAY_SINK_AUDIO_CONVERT_UNLOCK (self);
++  } else if (GST_EVENT_TYPE (event) == GST_EVENT_FLUSH_STOP) {
++    GST_PLAY_SINK_AUDIO_CONVERT_LOCK (self);
++    GST_DEBUG_OBJECT (self, "Resetting segment");
++    gst_segment_init (&self->segment, GST_FORMAT_UNDEFINED);
++    GST_PLAY_SINK_AUDIO_CONVERT_UNLOCK (self);
++  }
++
++  gst_event_unref (event);
++  gst_object_unref (self);
++
++  return ret;
++}
++
++static gboolean
++gst_play_sink_audio_convert_sink_setcaps (GstPad * pad, GstCaps * caps)
++{
++  GstPlaySinkAudioConvert *self =
++      GST_PLAY_SINK_AUDIO_CONVERT (gst_pad_get_parent (pad));
++  gboolean ret;
++  GstStructure *s;
++  const gchar *name;
++  gboolean reconfigure = FALSE;
++
++  GST_PLAY_SINK_AUDIO_CONVERT_LOCK (self);
++  s = gst_caps_get_structure (caps, 0);
++  name = gst_structure_get_name (s);
++
++  if (g_str_has_prefix (name, "audio/x-raw-")) {
++    if (!self->raw && !gst_pad_is_blocked (self->sink_proxypad)) {
++      GST_DEBUG_OBJECT (self, "Changing caps from non-raw to raw");
++      reconfigure = TRUE;
++      gst_pad_set_blocked_async_full (self->sink_proxypad, TRUE,
++          (GstPadBlockCallback) pad_blocked_cb, gst_object_ref (self),
++          (GDestroyNotify) gst_object_unref);
++    }
++  } else {
++    if (self->raw && !gst_pad_is_blocked (self->sink_proxypad)) {
++      GST_DEBUG_OBJECT (self, "Changing caps from raw to non-raw");
++      reconfigure = TRUE;
++      gst_pad_set_blocked_async_full (self->sink_proxypad, TRUE,
++          (GstPadBlockCallback) pad_blocked_cb, gst_object_ref (self),
++          (GDestroyNotify) gst_object_unref);
++    }
++  }
++
++  /* Otherwise the setcaps below fails */
++  if (reconfigure) {
++    gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (self->sinkpad), NULL);
++    gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (self->srcpad), NULL);
++  }
++
++  GST_PLAY_SINK_AUDIO_CONVERT_UNLOCK (self);
++  ret = self->sink_setcaps (pad, caps);
++
++  GST_DEBUG_OBJECT (self, "Setting sink caps %" GST_PTR_FORMAT ": %d", caps,
++      ret);
++
++  gst_object_unref (self);
++
++  return ret;
++}
++
++static GstCaps *
++gst_play_sink_audio_convert_getcaps (GstPad * pad)
++{
++  GstPlaySinkAudioConvert *self =
++      GST_PLAY_SINK_AUDIO_CONVERT (gst_pad_get_parent (pad));
++  GstCaps *ret;
++  GstPad *otherpad, *peer;
++
++  GST_PLAY_SINK_AUDIO_CONVERT_LOCK (self);
++  if (pad == self->srcpad)
++    otherpad = gst_object_ref (self->sinkpad);
++  else
++    otherpad = gst_object_ref (self->srcpad);
++  GST_PLAY_SINK_AUDIO_CONVERT_UNLOCK (self);
++
++  peer = gst_pad_get_peer (otherpad);
++  if (peer) {
++    ret = gst_pad_get_caps_reffed (peer);
++    gst_object_unref (peer);
++  } else {
++    ret = gst_caps_new_any ();
++  }
++
++  gst_object_unref (otherpad);
++  gst_object_unref (self);
++
++  return ret;
++}
++
++static void
++gst_play_sink_audio_convert_finalize (GObject * object)
++{
++  GstPlaySinkAudioConvert *self = GST_PLAY_SINK_AUDIO_CONVERT_CAST (object);
++
++  if (self->volume)
++    gst_object_unref (self->volume);
++
++  gst_object_unref (self->sink_proxypad);
++  g_mutex_free (self->lock);
++
++  G_OBJECT_CLASS (parent_class)->finalize (object);
++}
++
++static GstStateChangeReturn
++gst_play_sink_audio_convert_change_state (GstElement * element,
++    GstStateChange transition)
++{
++  GstStateChangeReturn ret;
++  GstPlaySinkAudioConvert *self = GST_PLAY_SINK_AUDIO_CONVERT_CAST (element);
++
++  switch (transition) {
++    case GST_STATE_CHANGE_PAUSED_TO_READY:
++      GST_PLAY_SINK_AUDIO_CONVERT_LOCK (self);
++      if (gst_pad_is_blocked (self->sink_proxypad))
++        gst_pad_set_blocked_async_full (self->sink_proxypad, FALSE,
++            (GstPadBlockCallback) pad_blocked_cb, gst_object_ref (self),
++            (GDestroyNotify) gst_object_unref);
++      GST_PLAY_SINK_AUDIO_CONVERT_UNLOCK (self);
++      break;
++    default:
++      break;
++  }
++
++  ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
++  if (ret == GST_STATE_CHANGE_FAILURE)
++    return ret;
++
++  switch (transition) {
++    case GST_STATE_CHANGE_PAUSED_TO_READY:
++      GST_PLAY_SINK_AUDIO_CONVERT_LOCK (self);
++      gst_segment_init (&self->segment, GST_FORMAT_UNDEFINED);
++      if (self->conv) {
++        gst_element_set_state (self->conv, GST_STATE_NULL);
++        gst_bin_remove (GST_BIN_CAST (self), self->conv);
++        self->conv = NULL;
++      }
++      if (self->resample) {
++        gst_element_set_state (self->resample, GST_STATE_NULL);
++        gst_bin_remove (GST_BIN_CAST (self), self->resample);
++        self->resample = NULL;
++      }
++      if (self->volume) {
++        gst_element_set_state (self->volume, GST_STATE_NULL);
++        if (GST_OBJECT_PARENT (self->volume) == GST_OBJECT_CAST (self)) {
++          gst_bin_remove (GST_BIN_CAST (self), self->volume);
++        }
++      }
++      gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (self->srcpad),
++          self->sink_proxypad);
++      self->raw = FALSE;
++      GST_PLAY_SINK_AUDIO_CONVERT_UNLOCK (self);
++      break;
++    case GST_STATE_CHANGE_READY_TO_PAUSED:
++      GST_PLAY_SINK_AUDIO_CONVERT_LOCK (self);
++      if (!gst_pad_is_blocked (self->sink_proxypad))
++        gst_pad_set_blocked_async_full (self->sink_proxypad, TRUE,
++            (GstPadBlockCallback) pad_blocked_cb, gst_object_ref (self),
++            (GDestroyNotify) gst_object_unref);
++      GST_PLAY_SINK_AUDIO_CONVERT_UNLOCK (self);
++    default:
++      break;
++  }
++
++  return ret;
++}
++
++static void
++gst_play_sink_audio_convert_class_init (GstPlaySinkAudioConvertClass * klass)
++{
++  GObjectClass *gobject_class;
++  GstElementClass *gstelement_class;
++
++  GST_DEBUG_CATEGORY_INIT (gst_play_sink_audio_convert_debug,
++      "playsinkaudioconvert", 0, "play bin");
++
++  gobject_class = (GObjectClass *) klass;
++  gstelement_class = (GstElementClass *) klass;
++
++  gobject_class->finalize = gst_play_sink_audio_convert_finalize;
++
++  gst_element_class_add_pad_template (gstelement_class,
++      gst_static_pad_template_get (&srctemplate));
++  gst_element_class_add_pad_template (gstelement_class,
++      gst_static_pad_template_get (&sinktemplate));
++  gst_element_class_set_details_simple (gstelement_class,
++      "Player Sink Audio Converter", "Audio/Bin/Converter",
++      "Convenience bin for audio conversion",
++      "Sebastian Dröge <sebastian.droege@collabora.co.uk>");
++
++  gstelement_class->change_state =
++      GST_DEBUG_FUNCPTR (gst_play_sink_audio_convert_change_state);
++}
++
++static void
++gst_play_sink_audio_convert_init (GstPlaySinkAudioConvert * self)
++{
++  GstPadTemplate *templ;
++  GstIterator *it;
++
++  self->lock = g_mutex_new ();
++  gst_segment_init (&self->segment, GST_FORMAT_UNDEFINED);
++
++  templ = gst_static_pad_template_get (&sinktemplate);
++  self->sinkpad = gst_ghost_pad_new_no_target_from_template ("sink", templ);
++  self->sink_event = GST_PAD_EVENTFUNC (self->sinkpad);
++  gst_pad_set_event_function (self->sinkpad,
++      GST_DEBUG_FUNCPTR (gst_play_sink_audio_convert_sink_event));
++  self->sink_setcaps = GST_PAD_SETCAPSFUNC (self->sinkpad);
++  gst_pad_set_setcaps_function (self->sinkpad,
++      GST_DEBUG_FUNCPTR (gst_play_sink_audio_convert_sink_setcaps));
++  gst_pad_set_getcaps_function (self->sinkpad,
++      GST_DEBUG_FUNCPTR (gst_play_sink_audio_convert_getcaps));
++
++  it = gst_pad_iterate_internal_links (self->sinkpad);
++  g_assert (it);
++  gst_iterator_next (it, (gpointer *) & self->sink_proxypad);
++  g_assert (self->sink_proxypad);
++  gst_iterator_free (it);
++
++  gst_element_add_pad (GST_ELEMENT_CAST (self), self->sinkpad);
++  gst_object_unref (templ);
++
++  templ = gst_static_pad_template_get (&srctemplate);
++  self->srcpad = gst_ghost_pad_new_no_target_from_template ("src", templ);
++  gst_pad_set_getcaps_function (self->srcpad,
++      GST_DEBUG_FUNCPTR (gst_play_sink_audio_convert_getcaps));
++  gst_element_add_pad (GST_ELEMENT_CAST (self), self->srcpad);
++  gst_object_unref (templ);
++
++  gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (self->srcpad),
++      self->sink_proxypad);
++
++  /* FIXME: Only create this on demand but for now we need
++   * it to always exist because of playsink's volume proxying
++   * logic.
++   */
++  self->volume = gst_element_factory_make ("volume", "volume");
++  if (self->volume)
++    gst_object_ref_sink (self->volume);
++}
+diff --git a/gst/playback/gstplaysinkaudioconvert.h b/gst/playback/gstplaysinkaudioconvert.h
+new file mode 100644
+index 0000000..b0016b9
+--- a/dev/null
++++ b/gst/playback/gstplaysinkaudioconvert.h
+@@ -0,0 +1,91 @@
++/* GStreamer
++ * Copyright (C) <2011> Sebastian Dröge <sebastian.droege@collabora.co.uk>
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Library General Public
++ * License as published by the Free Software Foundation; either
++ * version 2 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Library General Public License for more details.
++ *
++ * You should have received a copy of the GNU Library General Public
++ * License along with this library; if not, write to the
++ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++ * Boston, MA 02111-1307, USA.
++ */
++
++#include <gst/gst.h>
++
++#ifndef __GST_PLAY_SINK_AUDIO_CONVERT_H__
++#define __GST_PLAY_SINK_AUDIO_CONVERT_H__
++
++G_BEGIN_DECLS
++#define GST_TYPE_PLAY_SINK_AUDIO_CONVERT \
++  (gst_play_sink_audio_convert_get_type())
++#define GST_PLAY_SINK_AUDIO_CONVERT(obj) \
++  (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_PLAY_SINK_AUDIO_CONVERT, GstPlaySinkAudioConvert))
++#define GST_PLAY_SINK_AUDIO_CONVERT_CAST(obj) \
++  ((GstPlaySinkAudioConvert *) obj)
++#define GST_PLAY_SINK_AUDIO_CONVERT_CLASS(klass) \
++  (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_PLAY_SINK_AUDIO_CONVERT, GstPlaySinkAudioConvertClass))
++#define GST_IS_PLAY_SINK_AUDIO_CONVERT(obj) \
++  (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_PLAY_SINK_AUDIO_CONVERT))
++#define GST_IS_PLAY_SINK_AUDIO_CONVERT_CLASS(klass) \
++  (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_PLAY_SINK_AUDIO_CONVERT))
++
++#define GST_PLAY_SINK_AUDIO_CONVERT_LOCK(obj) G_STMT_START {                   \
++    GST_LOG_OBJECT (obj,                                                \
++                    "locking from thread %p",                           \
++                    g_thread_self ());                                  \
++    g_mutex_lock (GST_PLAY_SINK_AUDIO_CONVERT_CAST(obj)->lock);                \
++    GST_LOG_OBJECT (obj,                                                \
++                    "locked from thread %p",                            \
++                    g_thread_self ());                                  \
++} G_STMT_END
++
++#define GST_PLAY_SINK_AUDIO_CONVERT_UNLOCK(obj) G_STMT_START {                 \
++    GST_LOG_OBJECT (obj,                                                \
++                    "unlocking from thread %p",                         \
++                    g_thread_self ());                                  \
++    g_mutex_unlock (GST_PLAY_SINK_AUDIO_CONVERT_CAST(obj)->lock);              \
++} G_STMT_END
++
++typedef struct _GstPlaySinkAudioConvert GstPlaySinkAudioConvert;
++typedef struct _GstPlaySinkAudioConvertClass GstPlaySinkAudioConvertClass;
++
++struct _GstPlaySinkAudioConvert
++{
++  GstBin parent;
++
++  /* < private > */
++  GMutex *lock;
++
++  GstPad *sinkpad, *sink_proxypad;
++  GstPadEventFunction sink_event;
++  GstPadSetCapsFunction sink_setcaps;
++  gboolean sink_proxypad_blocked;
++  GstSegment segment;
++
++  GstPad *srcpad;
++
++  gboolean raw;
++  GstElement *conv, *resample;
++
++  /* < pseudo public > */
++  GstElement *volume;
++  gboolean use_volume;
++  gboolean use_converters;
++};
++
++struct _GstPlaySinkAudioConvertClass
++{
++  GstBinClass parent;
++};
++
++GType gst_play_sink_audio_convert_get_type (void);
++
++G_END_DECLS
++#endif /* __GST_PLAY_SINK_AUDIO_CONVERT_H__ */
+diff --git a/gst/playback/gstplaysinkvideoconvert.c b/gst/playback/gstplaysinkvideoconvert.c
+new file mode 100644
+index 0000000..c544462
+--- a/dev/null
++++ b/gst/playback/gstplaysinkvideoconvert.c
+@@ -0,0 +1,485 @@
++/* GStreamer
++ * Copyright (C) <2011> Sebastian Dröge <sebastian.droege@collabora.co.uk>
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Library General Public
++ * License as published by the Free Software Foundation; either
++ * version 2 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Library General Public License for more details.
++ *
++ * You should have received a copy of the GNU Library General Public
++ * License along with this library; if not, write to the
++ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++ * Boston, MA 02111-1307, USA.
++ */
++
++#ifdef HAVE_CONFIG_H
++#include "config.h"
++#endif
++
++#include "gstplaysinkvideoconvert.h"
++
++#include <gst/pbutils/pbutils.h>
++#include <gst/gst-i18n-plugin.h>
++
++GST_DEBUG_CATEGORY_STATIC (gst_play_sink_video_convert_debug);
++#define GST_CAT_DEFAULT gst_play_sink_video_convert_debug
++
++#define parent_class gst_play_sink_video_convert_parent_class
++
++G_DEFINE_TYPE (GstPlaySinkVideoConvert, gst_play_sink_video_convert,
++    GST_TYPE_BIN);
++
++static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src",
++    GST_PAD_SRC,
++    GST_PAD_ALWAYS,
++    GST_STATIC_CAPS_ANY);
++
++static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink",
++    GST_PAD_SINK,
++    GST_PAD_ALWAYS,
++    GST_STATIC_CAPS_ANY);
++
++static gboolean
++is_raw_caps (GstCaps * caps)
++{
++  gint i, n;
++  GstStructure *s;
++  const gchar *name;
++
++  n = gst_caps_get_size (caps);
++  for (i = 0; i < n; i++) {
++    s = gst_caps_get_structure (caps, i);
++    name = gst_structure_get_name (s);
++    if (!g_str_has_prefix (name, "video/x-raw"))
++      return FALSE;
++  }
++
++  return TRUE;
++}
++
++static void
++post_missing_element_message (GstPlaySinkVideoConvert * self,
++    const gchar * name)
++{
++  GstMessage *msg;
++
++  msg = gst_missing_element_message_new (GST_ELEMENT_CAST (self), name);
++  gst_element_post_message (GST_ELEMENT_CAST (self), msg);
++}
++
++static void
++distribute_running_time (GstElement * element, const GstSegment * segment)
++{
++  GstEvent *event;
++  GstPad *pad;
++
++  pad = gst_element_get_static_pad (element, "sink");
++
++  if (segment->accum) {
++    event = gst_event_new_new_segment_full (FALSE, segment->rate,
++        segment->applied_rate, segment->format, 0, segment->accum, 0);
++    gst_pad_push_event (pad, event);
++  }
++
++  event = gst_event_new_new_segment_full (FALSE, segment->rate,
++      segment->applied_rate, segment->format,
++      segment->start, segment->stop, segment->time);
++  gst_pad_push_event (pad, event);
++
++  gst_object_unref (pad);
++}
++
++static void
++pad_blocked_cb (GstPad * pad, gboolean blocked, GstPlaySinkVideoConvert * self)
++{
++  GstPad *peer;
++  GstCaps *caps;
++  gboolean raw;
++
++  GST_PLAY_SINK_VIDEO_CONVERT_LOCK (self);
++  self->sink_proxypad_blocked = blocked;
++  GST_DEBUG_OBJECT (self, "Pad blocked: %d", blocked);
++  if (!blocked)
++    goto done;
++
++  /* There must be a peer at this point */
++  peer = gst_pad_get_peer (self->sinkpad);
++  caps = gst_pad_get_negotiated_caps (peer);
++  if (!caps)
++    caps = gst_pad_get_caps_reffed (peer);
++  gst_object_unref (peer);
++
++  raw = is_raw_caps (caps);
++  GST_DEBUG_OBJECT (self, "Caps %" GST_PTR_FORMAT " are raw: %d", caps, raw);
++  gst_caps_unref (caps);
++
++  if (raw == self->raw)
++    goto unblock;
++  self->raw = raw;
++
++  if (raw) {
++    GstBin *bin = GST_BIN_CAST (self);
++    GstElement *head = NULL, *prev = NULL;
++    GstPad *pad;
++
++    GST_DEBUG_OBJECT (self, "Creating raw conversion pipeline");
++
++    gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (self->sinkpad), NULL);
++    gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (self->srcpad), NULL);
++
++    self->conv = gst_element_factory_make ("ffmpegcolorspace", "conv");
++    if (self->conv == NULL) {
++      post_missing_element_message (self, "ffmpegcolorspace");
++      GST_ELEMENT_WARNING (self, CORE, MISSING_PLUGIN,
++          (_("Missing element '%s' - check your GStreamer installation."),
++              "ffmpegcolorspace"), ("video rendering might fail"));
++    } else {
++      gst_bin_add (bin, self->conv);
++      gst_element_sync_state_with_parent (self->conv);
++      distribute_running_time (self->conv, &self->segment);
++      prev = head = self->conv;
++    }
++
++    self->scale = gst_element_factory_make ("videoscale", "scale");
++    if (self->scale == NULL) {
++      post_missing_element_message (self, "videoscale");
++      GST_ELEMENT_WARNING (self, CORE, MISSING_PLUGIN,
++          (_("Missing element '%s' - check your GStreamer installation."),
++              "videoscale"), ("possibly a liboil version mismatch?"));
++    } else {
++      /* Add black borders if necessary to keep the DAR */
++      g_object_set (self->scale, "add-borders", TRUE, NULL);
++      gst_bin_add (bin, self->scale);
++      gst_element_sync_state_with_parent (self->scale);
++      distribute_running_time (self->scale, &self->segment);
++      if (prev) {
++        if (!gst_element_link_pads_full (prev, "src", self->scale, "sink",
++                GST_PAD_LINK_CHECK_TEMPLATE_CAPS))
++          goto link_failed;
++      } else {
++        head = self->scale;
++      }
++      prev = self->scale;
++    }
++
++    if (head) {
++      pad = gst_element_get_static_pad (head, "sink");
++      gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (self->sinkpad), pad);
++      gst_object_unref (pad);
++    }
++
++    if (prev) {
++      pad = gst_element_get_static_pad (prev, "src");
++      gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (self->srcpad), pad);
++      gst_object_unref (pad);
++    }
++
++    if (!head && !prev) {
++      gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (self->srcpad),
++          self->sink_proxypad);
++    }
++
++    GST_DEBUG_OBJECT (self, "Raw conversion pipeline created");
++  } else {
++    GstBin *bin = GST_BIN_CAST (self);
++
++    GST_DEBUG_OBJECT (self, "Removing raw conversion pipeline");
++
++    gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (self->sinkpad), NULL);
++    gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (self->srcpad), NULL);
++
++    if (self->conv) {
++      gst_element_set_state (self->conv, GST_STATE_NULL);
++      gst_bin_remove (bin, self->conv);
++      self->conv = NULL;
++    }
++    if (self->scale) {
++      gst_element_set_state (self->scale, GST_STATE_NULL);
++      gst_bin_remove (bin, self->scale);
++      self->scale = NULL;
++    }
++
++    gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (self->srcpad),
++        self->sink_proxypad);
++
++    GST_DEBUG_OBJECT (self, "Raw conversion pipeline removed");
++  }
++
++unblock:
++  gst_pad_set_blocked_async_full (self->sink_proxypad, FALSE,
++      (GstPadBlockCallback) pad_blocked_cb, gst_object_ref (self),
++      (GDestroyNotify) gst_object_unref);
++
++done:
++  GST_PLAY_SINK_VIDEO_CONVERT_UNLOCK (self);
++  return;
++
++link_failed:
++  {
++    GST_ELEMENT_ERROR (self, CORE, PAD,
++        (NULL), ("Failed to configure the video converter."));
++    gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (self->srcpad),
++        self->sink_proxypad);
++    gst_pad_set_blocked_async_full (self->sink_proxypad, FALSE,
++        (GstPadBlockCallback) pad_blocked_cb, gst_object_ref (self),
++        (GDestroyNotify) gst_object_unref);
++    return;
++  }
++}
++
++static gboolean
++gst_play_sink_video_convert_sink_event (GstPad * pad, GstEvent * event)
++{
++  GstPlaySinkVideoConvert *self =
++      GST_PLAY_SINK_VIDEO_CONVERT (gst_pad_get_parent (pad));
++  gboolean ret;
++
++  ret = self->sink_event (pad, gst_event_ref (event));
++
++  if (GST_EVENT_TYPE (event) == GST_EVENT_NEWSEGMENT) {
++    gboolean update;
++    gdouble rate, applied_rate;
++    GstFormat format;
++    gint64 start, stop, position;
++
++    GST_PLAY_SINK_VIDEO_CONVERT_LOCK (self);
++    gst_event_parse_new_segment_full (event, &update, &rate, &applied_rate,
++        &format, &start, &stop, &position);
++
++    GST_DEBUG_OBJECT (self, "Segment before %" GST_SEGMENT_FORMAT,
++        &self->segment);
++    gst_segment_set_newsegment_full (&self->segment, update, rate, applied_rate,
++        format, start, stop, position);
++    GST_DEBUG_OBJECT (self, "Segment after %" GST_SEGMENT_FORMAT,
++        &self->segment);
++    GST_PLAY_SINK_VIDEO_CONVERT_UNLOCK (self);
++  } else if (GST_EVENT_TYPE (event) == GST_EVENT_FLUSH_STOP) {
++    GST_PLAY_SINK_VIDEO_CONVERT_LOCK (self);
++    GST_DEBUG_OBJECT (self, "Resetting segment");
++    gst_segment_init (&self->segment, GST_FORMAT_UNDEFINED);
++    GST_PLAY_SINK_VIDEO_CONVERT_UNLOCK (self);
++  }
++
++  gst_event_unref (event);
++  gst_object_unref (self);
++
++  return ret;
++}
++
++static gboolean
++gst_play_sink_video_convert_sink_setcaps (GstPad * pad, GstCaps * caps)
++{
++  GstPlaySinkVideoConvert *self =
++      GST_PLAY_SINK_VIDEO_CONVERT (gst_pad_get_parent (pad));
++  gboolean ret;
++  GstStructure *s;
++  const gchar *name;
++  gboolean reconfigure = FALSE;
++
++  GST_PLAY_SINK_VIDEO_CONVERT_LOCK (self);
++  s = gst_caps_get_structure (caps, 0);
++  name = gst_structure_get_name (s);
++
++  if (g_str_has_prefix (name, "video/x-raw-")) {
++    if (!self->raw && !gst_pad_is_blocked (self->sink_proxypad)) {
++      GST_DEBUG_OBJECT (self, "Changing caps from non-raw to raw");
++      reconfigure = TRUE;
++      gst_pad_set_blocked_async_full (self->sink_proxypad, TRUE,
++          (GstPadBlockCallback) pad_blocked_cb, gst_object_ref (self),
++          (GDestroyNotify) gst_object_unref);
++    }
++  } else {
++    if (self->raw && !gst_pad_is_blocked (self->sink_proxypad)) {
++      GST_DEBUG_OBJECT (self, "Changing caps from raw to non-raw");
++      reconfigure = TRUE;
++      gst_pad_set_blocked_async_full (self->sink_proxypad, TRUE,
++          (GstPadBlockCallback) pad_blocked_cb, gst_object_ref (self),
++          (GDestroyNotify) gst_object_unref);
++    }
++  }
++
++  /* Otherwise the setcaps below fails */
++  if (reconfigure) {
++    gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (self->sinkpad), NULL);
++    gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (self->srcpad), NULL);
++  }
++  GST_PLAY_SINK_VIDEO_CONVERT_UNLOCK (self);
++
++  ret = self->sink_setcaps (pad, caps);
++
++  GST_DEBUG_OBJECT (self, "Setting sink caps %" GST_PTR_FORMAT ": %d", caps,
++      ret);
++
++  gst_object_unref (self);
++
++  return ret;
++}
++
++static GstCaps *
++gst_play_sink_video_convert_getcaps (GstPad * pad)
++{
++  GstPlaySinkVideoConvert *self =
++      GST_PLAY_SINK_VIDEO_CONVERT (gst_pad_get_parent (pad));
++  GstCaps *ret;
++  GstPad *otherpad, *peer;
++
++  GST_PLAY_SINK_VIDEO_CONVERT_LOCK (self);
++  if (pad == self->srcpad)
++    otherpad = gst_object_ref (self->sinkpad);
++  else
++    otherpad = gst_object_ref (self->srcpad);
++  GST_PLAY_SINK_VIDEO_CONVERT_UNLOCK (self);
++
++  peer = gst_pad_get_peer (otherpad);
++  if (peer) {
++    ret = gst_pad_get_caps_reffed (peer);
++    gst_object_unref (peer);
++  } else {
++    ret = gst_caps_new_any ();
++  }
++
++  gst_object_unref (otherpad);
++  gst_object_unref (self);
++
++  return ret;
++}
++
++static void
++gst_play_sink_video_convert_finalize (GObject * object)
++{
++  GstPlaySinkVideoConvert *self = GST_PLAY_SINK_VIDEO_CONVERT_CAST (object);
++
++  gst_object_unref (self->sink_proxypad);
++  g_mutex_free (self->lock);
++
++  G_OBJECT_CLASS (parent_class)->finalize (object);
++}
++
++static GstStateChangeReturn
++gst_play_sink_video_convert_change_state (GstElement * element,
++    GstStateChange transition)
++{
++  GstStateChangeReturn ret;
++  GstPlaySinkVideoConvert *self = GST_PLAY_SINK_VIDEO_CONVERT_CAST (element);
++
++  switch (transition) {
++    case GST_STATE_CHANGE_PAUSED_TO_READY:
++      GST_PLAY_SINK_VIDEO_CONVERT_LOCK (self);
++      if (gst_pad_is_blocked (self->sink_proxypad))
++        gst_pad_set_blocked_async_full (self->sink_proxypad, FALSE,
++            (GstPadBlockCallback) pad_blocked_cb, gst_object_ref (self),
++            (GDestroyNotify) gst_object_unref);
++      GST_PLAY_SINK_VIDEO_CONVERT_UNLOCK (self);
++      break;
++    default:
++      break;
++  }
++
++  ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
++  if (ret == GST_STATE_CHANGE_FAILURE)
++    return ret;
++
++  switch (transition) {
++    case GST_STATE_CHANGE_PAUSED_TO_READY:
++      GST_PLAY_SINK_VIDEO_CONVERT_LOCK (self);
++      gst_segment_init (&self->segment, GST_FORMAT_UNDEFINED);
++      if (self->conv) {
++        gst_element_set_state (self->conv, GST_STATE_NULL);
++        gst_bin_remove (GST_BIN_CAST (self), self->conv);
++        self->conv = NULL;
++      }
++      if (self->scale) {
++        gst_element_set_state (self->scale, GST_STATE_NULL);
++        gst_bin_remove (GST_BIN_CAST (self), self->scale);
++        self->scale = NULL;
++      }
++      gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (self->srcpad),
++          self->sink_proxypad);
++      self->raw = FALSE;
++      GST_PLAY_SINK_VIDEO_CONVERT_UNLOCK (self);
++      break;
++    case GST_STATE_CHANGE_READY_TO_PAUSED:
++      GST_PLAY_SINK_VIDEO_CONVERT_LOCK (self);
++      if (!gst_pad_is_blocked (self->sink_proxypad))
++        gst_pad_set_blocked_async_full (self->sink_proxypad, TRUE,
++            (GstPadBlockCallback) pad_blocked_cb, gst_object_ref (self),
++            (GDestroyNotify) gst_object_unref);
++      GST_PLAY_SINK_VIDEO_CONVERT_UNLOCK (self);
++    default:
++      break;
++  }
++
++  return ret;
++}
++
++static void
++gst_play_sink_video_convert_class_init (GstPlaySinkVideoConvertClass * klass)
++{
++  GObjectClass *gobject_class;
++  GstElementClass *gstelement_class;
++
++  GST_DEBUG_CATEGORY_INIT (gst_play_sink_video_convert_debug,
++      "playsinkvideoconvert", 0, "play bin");
++
++  gobject_class = (GObjectClass *) klass;
++  gstelement_class = (GstElementClass *) klass;
++
++  gobject_class->finalize = gst_play_sink_video_convert_finalize;
++
++  gst_element_class_add_pad_template (gstelement_class,
++      gst_static_pad_template_get (&srctemplate));
++  gst_element_class_add_pad_template (gstelement_class,
++      gst_static_pad_template_get (&sinktemplate));
++  gst_element_class_set_details_simple (gstelement_class,
++      "Player Sink Video Converter", "Video/Bin/Converter",
++      "Convenience bin for video conversion",
++      "Sebastian Dröge <sebastian.droege@collabora.co.uk>");
++
++  gstelement_class->change_state =
++      GST_DEBUG_FUNCPTR (gst_play_sink_video_convert_change_state);
++}
++
++static void
++gst_play_sink_video_convert_init (GstPlaySinkVideoConvert * self)
++{
++  GstPadTemplate *templ;
++  GstIterator *it;
++
++  self->lock = g_mutex_new ();
++  gst_segment_init (&self->segment, GST_FORMAT_UNDEFINED);
++
++  templ = gst_static_pad_template_get (&sinktemplate);
++  self->sinkpad = gst_ghost_pad_new_no_target_from_template ("sink", templ);
++  self->sink_event = GST_PAD_EVENTFUNC (self->sinkpad);
++  gst_pad_set_event_function (self->sinkpad,
++      GST_DEBUG_FUNCPTR (gst_play_sink_video_convert_sink_event));
++  self->sink_setcaps = GST_PAD_SETCAPSFUNC (self->sinkpad);
++  gst_pad_set_setcaps_function (self->sinkpad,
++      GST_DEBUG_FUNCPTR (gst_play_sink_video_convert_sink_setcaps));
++  gst_pad_set_getcaps_function (self->sinkpad,
++      GST_DEBUG_FUNCPTR (gst_play_sink_video_convert_getcaps));
++
++  it = gst_pad_iterate_internal_links (self->sinkpad);
++  g_assert (it);
++  gst_iterator_next (it, (gpointer *) & self->sink_proxypad);
++  g_assert (self->sink_proxypad);
++  gst_iterator_free (it);
++
++  gst_element_add_pad (GST_ELEMENT_CAST (self), self->sinkpad);
++  gst_object_unref (templ);
++
++  templ = gst_static_pad_template_get (&srctemplate);
++  self->srcpad = gst_ghost_pad_new_no_target_from_template ("src", templ);
++  gst_pad_set_getcaps_function (self->srcpad,
++      GST_DEBUG_FUNCPTR (gst_play_sink_video_convert_getcaps));
++  gst_element_add_pad (GST_ELEMENT_CAST (self), self->srcpad);
++  gst_object_unref (templ);
++
++  gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (self->srcpad),
++      self->sink_proxypad);
++}
+diff --git a/gst/playback/gstplaysinkvideoconvert.h b/gst/playback/gstplaysinkvideoconvert.h
+new file mode 100644
+index 0000000..be15dd2
+--- a/dev/null
++++ b/gst/playback/gstplaysinkvideoconvert.h
+@@ -0,0 +1,86 @@
++/* GStreamer
++ * Copyright (C) <2011> Sebastian Dröge <sebastian.droege@collabora.co.uk>
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Library General Public
++ * License as published by the Free Software Foundation; either
++ * version 2 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Library General Public License for more details.
++ *
++ * You should have received a copy of the GNU Library General Public
++ * License along with this library; if not, write to the
++ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++ * Boston, MA 02111-1307, USA.
++ */
++
++#include <gst/gst.h>
++
++#ifndef __GST_PLAY_SINK_VIDEO_CONVERT_H__
++#define __GST_PLAY_SINK_VIDEO_CONVERT_H__
++
++G_BEGIN_DECLS
++#define GST_TYPE_PLAY_SINK_VIDEO_CONVERT \
++  (gst_play_sink_video_convert_get_type())
++#define GST_PLAY_SINK_VIDEO_CONVERT(obj) \
++  (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_PLAY_SINK_VIDEO_CONVERT, GstPlaySinkVideoConvert))
++#define GST_PLAY_SINK_VIDEO_CONVERT_CAST(obj) \
++  ((GstPlaySinkVideoConvert *) obj)
++#define GST_PLAY_SINK_VIDEO_CONVERT_CLASS(klass) \
++  (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_PLAY_SINK_VIDEO_CONVERT, GstPlaySinkVideoConvertClass))
++#define GST_IS_PLAY_SINK_VIDEO_CONVERT(obj) \
++  (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_PLAY_SINK_VIDEO_CONVERT))
++#define GST_IS_PLAY_SINK_VIDEO_CONVERT_CLASS(klass) \
++  (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_PLAY_SINK_VIDEO_CONVERT))
++
++#define GST_PLAY_SINK_VIDEO_CONVERT_LOCK(obj) G_STMT_START {                   \
++    GST_LOG_OBJECT (obj,                                                \
++                    "locking from thread %p",                           \
++                    g_thread_self ());                                  \
++    g_mutex_lock (GST_PLAY_SINK_VIDEO_CONVERT_CAST(obj)->lock);                \
++    GST_LOG_OBJECT (obj,                                                \
++                    "locked from thread %p",                            \
++                    g_thread_self ());                                  \
++} G_STMT_END
++
++#define GST_PLAY_SINK_VIDEO_CONVERT_UNLOCK(obj) G_STMT_START {                 \
++    GST_LOG_OBJECT (obj,                                                \
++                    "unlocking from thread %p",                         \
++                    g_thread_self ());                                  \
++    g_mutex_unlock (GST_PLAY_SINK_VIDEO_CONVERT_CAST(obj)->lock);              \
++} G_STMT_END
++
++typedef struct _GstPlaySinkVideoConvert GstPlaySinkVideoConvert;
++typedef struct _GstPlaySinkVideoConvertClass GstPlaySinkVideoConvertClass;
++
++struct _GstPlaySinkVideoConvert
++{
++  GstBin parent;
++
++  /* < private > */
++  GMutex *lock;
++
++  GstPad *sinkpad, *sink_proxypad;
++  GstPadEventFunction sink_event;
++  GstPadSetCapsFunction sink_setcaps;
++  gboolean sink_proxypad_blocked;
++  GstSegment segment;
++
++  GstPad *srcpad;
++
++  gboolean raw;
++  GstElement *conv, *scale;
++};
++
++struct _GstPlaySinkVideoConvertClass
++{
++  GstBinClass parent;
++};
++
++GType gst_play_sink_video_convert_get_type (void);
++
++G_END_DECLS
++#endif /* __GST_PLAY_SINK_VIDEO_CONVERT_H__ */
+--
+cgit v0.9
diff --git a/recipes/gstreamer/gst-plugins-base/d3a44541749f413343d5717c464083cef22a74f1.patch b/recipes/gstreamer/gst-plugins-base/d3a44541749f413343d5717c464083cef22a74f1.patch
new file mode 100644 (file)
index 0000000..e010b92
--- /dev/null
@@ -0,0 +1,704 @@
+From d3a44541749f413343d5717c464083cef22a74f1 Mon Sep 17 00:00:00 2001
+From: Sebastian Dröge <sebastian.droege@collabora.co.uk>
+Date: Tue, 15 Mar 2011 11:51:04 +0000
+Subject: playbin2/playsink: Decide if A/V caps are raw only inside playsink
+
+Before playbin2 would use different selectors for raw audio and
+compressed audio (and the same for video) and used different
+pads from playsink. This made the involved logic much more
+complex and was not implemented completely in playsink, which
+made it impossible to support files with a compressed and
+uncompressed stream that is support by the sink.
+
+playbin2 handles raw/non-raw streams the same now and the
+decision is left to playsink, which now can also handle
+caps changes from raw to non-raw and the other way around.
+
+Fixes bug #632788.
+---
+diff --git a/gst/playback/gstplaybin2.c b/gst/playback/gstplaybin2.c
+index 5f0f964..c46f110 100644
+--- a/gst/playback/gstplaybin2.c
++++ b/gst/playback/gstplaybin2.c
+@@ -1,5 +1,6 @@
+ /* GStreamer
+  * Copyright (C) <2007> Wim Taymans <wim.taymans@gmail.com>
++ * Copyright (C) <2011> Sebastian Dröge <sebastian.droege@collabora.co.uk>
+  *
+  * This library is free software; you can redistribute it and/or
+  * modify it under the terms of the GNU Library General Public
+@@ -271,6 +272,14 @@ struct _GstSourceSelect
+ #define GST_SOURCE_GROUP_LOCK(group) (g_mutex_lock (GST_SOURCE_GROUP_GET_LOCK(group)))
+ #define GST_SOURCE_GROUP_UNLOCK(group) (g_mutex_unlock (GST_SOURCE_GROUP_GET_LOCK(group)))
++enum
++{
++  PLAYBIN_STREAM_AUDIO = 0,
++  PLAYBIN_STREAM_VIDEO,
++  PLAYBIN_STREAM_TEXT,
++  PLAYBIN_STREAM_LAST
++};
++
+ /* a structure to hold the objects for decoding a uri and the subtitle uri
+  */
+ struct _GstSourceGroup
+@@ -319,7 +328,7 @@ struct _GstSourceGroup
+   GList *stream_changed_pending;
+   /* selectors for different streams */
+-  GstSourceSelect selector[GST_PLAY_SINK_TYPE_LAST];
++  GstSourceSelect selector[PLAYBIN_STREAM_LAST];
+ };
+ #define GST_PLAY_BIN_GET_LOCK(bin) (&((GstPlayBin*)(bin))->lock)
+@@ -1089,30 +1098,25 @@ init_group (GstPlayBin * playbin, GstSourceGroup * group)
+   /* If you add any items to these lists, check that media_list[] is defined
+    * above to be large enough to hold MAX(items)+1, so as to accomodate a
+    * NULL terminator (set when the memory is zeroed on allocation) */
+-  group->selector[0].media_list[0] = "audio/x-raw-";
+-  group->selector[0].type = GST_PLAY_SINK_TYPE_AUDIO_RAW;
+-  group->selector[0].channels = group->audio_channels;
+-  group->selector[1].media_list[0] = "audio/";
+-  group->selector[1].type = GST_PLAY_SINK_TYPE_AUDIO;
+-  group->selector[1].channels = group->audio_channels;
+-  group->selector[2].media_list[0] = "text/";
+-  group->selector[2].media_list[1] = "application/x-subtitle";
+-  group->selector[2].media_list[2] = "application/x-ssa";
+-  group->selector[2].media_list[3] = "application/x-ass";
+-  group->selector[2].media_list[4] = "video/x-dvd-subpicture";
+-  group->selector[2].media_list[5] = "subpicture/";
+-  group->selector[2].media_list[6] = "subtitle/";
+-  group->selector[2].get_media_caps = gst_subtitle_overlay_create_factory_caps;
+-  group->selector[2].type = GST_PLAY_SINK_TYPE_TEXT;
+-  group->selector[2].channels = group->text_channels;
+-  group->selector[3].media_list[0] = "video/x-raw-";
+-  group->selector[3].type = GST_PLAY_SINK_TYPE_VIDEO_RAW;
+-  group->selector[3].channels = group->video_channels;
+-  group->selector[4].media_list[0] = "video/";
+-  group->selector[4].type = GST_PLAY_SINK_TYPE_VIDEO;
+-  group->selector[4].channels = group->video_channels;
+-
+-  for (n = 0; n < GST_PLAY_SINK_TYPE_LAST; n++) {
++  group->selector[PLAYBIN_STREAM_AUDIO].media_list[0] = "audio/";
++  group->selector[PLAYBIN_STREAM_AUDIO].type = GST_PLAY_SINK_TYPE_AUDIO;
++  group->selector[PLAYBIN_STREAM_AUDIO].channels = group->audio_channels;
++  group->selector[PLAYBIN_STREAM_VIDEO].media_list[0] = "video/";
++  group->selector[PLAYBIN_STREAM_VIDEO].type = GST_PLAY_SINK_TYPE_VIDEO;
++  group->selector[PLAYBIN_STREAM_VIDEO].channels = group->video_channels;
++  group->selector[PLAYBIN_STREAM_TEXT].media_list[0] = "text/";
++  group->selector[PLAYBIN_STREAM_TEXT].media_list[1] = "application/x-subtitle";
++  group->selector[PLAYBIN_STREAM_TEXT].media_list[2] = "application/x-ssa";
++  group->selector[PLAYBIN_STREAM_TEXT].media_list[3] = "application/x-ass";
++  group->selector[PLAYBIN_STREAM_TEXT].media_list[4] = "video/x-dvd-subpicture";
++  group->selector[PLAYBIN_STREAM_TEXT].media_list[5] = "subpicture/";
++  group->selector[PLAYBIN_STREAM_TEXT].media_list[6] = "subtitle/";
++  group->selector[PLAYBIN_STREAM_TEXT].get_media_caps =
++      gst_subtitle_overlay_create_factory_caps;
++  group->selector[PLAYBIN_STREAM_TEXT].type = GST_PLAY_SINK_TYPE_TEXT;
++  group->selector[PLAYBIN_STREAM_TEXT].channels = group->text_channels;
++
++  for (n = 0; n < PLAYBIN_STREAM_LAST; n++) {
+     GstSourceSelect *select = &group->selector[n];
+     select->sinkpad_delayed_event = NULL;
+     select->sinkpad_data_probe = 0;
+@@ -1124,7 +1128,7 @@ free_group (GstPlayBin * playbin, GstSourceGroup * group)
+ {
+   int n;
+-  for (n = 0; n < GST_PLAY_SINK_TYPE_LAST; n++) {
++  for (n = 0; n < PLAYBIN_STREAM_LAST; n++) {
+     GstSourceSelect *select = &group->selector[n];
+     if (select->sinkpad && select->sinkpad_data_probe)
+       gst_pad_remove_data_probe (select->sinkpad, select->sinkpad_data_probe);
+@@ -1493,6 +1497,10 @@ gst_play_bin_set_current_video_stream (GstPlayBin * playbin, gint stream)
+   GstPad *sinkpad;
+   GST_PLAY_BIN_LOCK (playbin);
++
++  GST_DEBUG_OBJECT (playbin, "Changing current video stream %d -> %d",
++      playbin->current_video, stream);
++
+   group = get_group (playbin);
+   if (!(channels = group->video_channels))
+     goto no_channels;
+@@ -1536,6 +1544,10 @@ gst_play_bin_set_current_audio_stream (GstPlayBin * playbin, gint stream)
+   GstPad *sinkpad;
+   GST_PLAY_BIN_LOCK (playbin);
++
++  GST_DEBUG_OBJECT (playbin, "Changing current audio stream %d -> %d",
++      playbin->current_audio, stream);
++
+   group = get_group (playbin);
+   if (!(channels = group->audio_channels))
+     goto no_channels;
+@@ -1647,6 +1659,10 @@ gst_play_bin_set_current_text_stream (GstPlayBin * playbin, gint stream)
+   GstPad *sinkpad;
+   GST_PLAY_BIN_LOCK (playbin);
++
++  GST_DEBUG_OBJECT (playbin, "Changing current text stream %d -> %d",
++      playbin->current_text, stream);
++
+   group = get_group (playbin);
+   if (!(channels = group->text_channels))
+     goto no_channels;
+@@ -2306,7 +2322,7 @@ selector_active_pad_changed (GObject * selector, GParamSpec * pspec,
+   GST_PLAY_BIN_LOCK (playbin);
+   group = get_group (playbin);
+-  for (i = 0; i < GST_PLAY_SINK_TYPE_LAST; i++) {
++  for (i = 0; i < PLAYBIN_STREAM_LAST; i++) {
+     if (selector == G_OBJECT (group->selector[i].selector)) {
+       select = &group->selector[i];
+     }
+@@ -2392,7 +2408,7 @@ array_has_value (const gchar * values[], const gchar * value)
+   gint i;
+   for (i = 0; values[i]; i++) {
+-    if (g_str_has_prefix (value, values[i]))
++    if (values[i] && g_str_has_prefix (value, values[i]))
+       return TRUE;
+   }
+   return FALSE;
+@@ -2464,7 +2480,7 @@ pad_added_cb (GstElement * decodebin, GstPad * pad, GstSourceGroup * group)
+       GST_DEBUG_PAD_NAME (pad), caps, group);
+   /* major type of the pad, this determines the selector to use */
+-  for (i = 0; i < GST_PLAY_SINK_TYPE_LAST; i++) {
++  for (i = 0; i < PLAYBIN_STREAM_LAST; i++) {
+     if (array_has_value (group->selector[i].media_list, name)) {
+       select = &group->selector[i];
+       break;
+@@ -2723,7 +2739,7 @@ no_more_pads_cb (GstElement * decodebin, GstSourceGroup * group)
+   GST_PLAY_BIN_SHUTDOWN_LOCK (playbin, shutdown);
+   GST_SOURCE_GROUP_LOCK (group);
+-  for (i = 0; i < GST_PLAY_SINK_TYPE_LAST; i++) {
++  for (i = 0; i < PLAYBIN_STREAM_LAST; i++) {
+     GstSourceSelect *select = &group->selector[i];
+     /* check if the specific media type was detected and thus has a selector
+@@ -2786,14 +2802,10 @@ no_more_pads_cb (GstElement * decodebin, GstSourceGroup * group)
+     GST_SOURCE_GROUP_UNLOCK (group);
+-    GST_LOG_OBJECT (playbin, "reconfigure sink");
+-    /* we configure the modes if we were the last decodebin to complete. */
+-    gst_play_sink_reconfigure (playbin->playsink);
+-
+     /* signal the other decodebins that they can continue now. */
+     GST_SOURCE_GROUP_LOCK (group);
+     /* unblock all selectors */
+-    for (i = 0; i < GST_PLAY_SINK_TYPE_LAST; i++) {
++    for (i = 0; i < PLAYBIN_STREAM_LAST; i++) {
+       GstSourceSelect *select = &group->selector[i];
+       /* All streamsynchronizer streams should see stream-changed message,
+@@ -2859,7 +2871,7 @@ shutdown:
+      * instead of a NOT_LINKED error.
+      */
+     GST_SOURCE_GROUP_LOCK (group);
+-    for (i = 0; i < GST_PLAY_SINK_TYPE_LAST; i++) {
++    for (i = 0; i < PLAYBIN_STREAM_LAST; i++) {
+       GstSourceSelect *select = &group->selector[i];
+       if (select->srcpad) {
+@@ -3457,7 +3469,7 @@ deactivate_group (GstPlayBin * playbin, GstSourceGroup * group)
+   GST_SOURCE_GROUP_LOCK (group);
+   group->active = FALSE;
+-  for (i = 0; i < GST_PLAY_SINK_TYPE_LAST; i++) {
++  for (i = 0; i < PLAYBIN_STREAM_LAST; i++) {
+     GstSourceSelect *select = &group->selector[i];
+     GST_DEBUG_OBJECT (playbin, "unlinking selector %s", select->media_list[0]);
+diff --git a/gst/playback/gstplaysink.c b/gst/playback/gstplaysink.c
+index 326baa6..3661af3 100644
+--- a/gst/playback/gstplaysink.c
++++ b/gst/playback/gstplaysink.c
+@@ -1,5 +1,6 @@
+ /* GStreamer
+  * Copyright (C) <2007> Wim Taymans <wim.taymans@gmail.com>
++ * Copyright (C) <2011> Sebastian Dröge <sebastian.droege@collabora.co.uk>
+  *
+  * This library is free software; you can redistribute it and/or
+  * modify it under the terms of the GNU Library General Public
+@@ -149,6 +150,7 @@ struct _GstPlaySink
+   /* audio */
+   GstPad *audio_pad;
+   gboolean audio_pad_raw;
++  gboolean audio_pad_blocked;
+   GstPad *audio_srcpad_stream_synchronizer;
+   GstPad *audio_sinkpad_stream_synchronizer;
+   /* audio tee */
+@@ -159,10 +161,12 @@ struct _GstPlaySink
+   /* video */
+   GstPad *video_pad;
+   gboolean video_pad_raw;
++  gboolean video_pad_blocked;
+   GstPad *video_srcpad_stream_synchronizer;
+   GstPad *video_sinkpad_stream_synchronizer;
+   /* text */
+   GstPad *text_pad;
++  gboolean text_pad_blocked;
+   GstPad *text_srcpad_stream_synchronizer;
+   GstPad *text_sinkpad_stream_synchronizer;
+@@ -191,31 +195,35 @@ struct _GstPlaySinkClass
+   GstBuffer *(*convert_frame) (GstPlaySink * playsink, GstCaps * caps);
+ };
+-static GstStaticPadTemplate audiorawtemplate =
+-GST_STATIC_PAD_TEMPLATE ("audio_raw_sink",
++
++static GstStaticPadTemplate audiotemplate =
++GST_STATIC_PAD_TEMPLATE ("audio_sink",
+     GST_PAD_SINK,
+     GST_PAD_REQUEST,
+     GST_STATIC_CAPS_ANY);
+-static GstStaticPadTemplate audiotemplate =
+-GST_STATIC_PAD_TEMPLATE ("audio_sink",
++static GstStaticPadTemplate videotemplate =
++GST_STATIC_PAD_TEMPLATE ("video_sink",
+     GST_PAD_SINK,
+     GST_PAD_REQUEST,
+     GST_STATIC_CAPS_ANY);
+-static GstStaticPadTemplate videorawtemplate =
+-GST_STATIC_PAD_TEMPLATE ("video_raw_sink",
++static GstStaticPadTemplate texttemplate = GST_STATIC_PAD_TEMPLATE ("text_sink",
+     GST_PAD_SINK,
+     GST_PAD_REQUEST,
+     GST_STATIC_CAPS_ANY);
+-static GstStaticPadTemplate videotemplate =
+-GST_STATIC_PAD_TEMPLATE ("video_sink",
++
++/* FIXME 0.11: Remove */
++static GstStaticPadTemplate audiorawtemplate =
++GST_STATIC_PAD_TEMPLATE ("audio_raw_sink",
+     GST_PAD_SINK,
+     GST_PAD_REQUEST,
+     GST_STATIC_CAPS_ANY);
+-static GstStaticPadTemplate texttemplate = GST_STATIC_PAD_TEMPLATE ("text_sink",
++static GstStaticPadTemplate videorawtemplate =
++GST_STATIC_PAD_TEMPLATE ("video_raw_sink",
+     GST_PAD_SINK,
+     GST_PAD_REQUEST,
+     GST_STATIC_CAPS_ANY);
++
+ /* props */
+ enum
+ {
+@@ -613,6 +621,7 @@ gst_play_sink_get_sink (GstPlaySink * playsink, GstPlaySinkType type)
+   GST_PLAY_SINK_LOCK (playsink);
+   switch (type) {
+     case GST_PLAY_SINK_TYPE_AUDIO:
++    case GST_PLAY_SINK_TYPE_AUDIO_RAW:
+     {
+       GstPlayAudioChain *chain;
+       if ((chain = (GstPlayAudioChain *) playsink->audiochain))
+@@ -621,6 +630,7 @@ gst_play_sink_get_sink (GstPlaySink * playsink, GstPlaySinkType type)
+       break;
+     }
+     case GST_PLAY_SINK_TYPE_VIDEO:
++    case GST_PLAY_SINK_TYPE_VIDEO_RAW:
+     {
+       GstPlayVideoChain *chain;
+       if ((chain = (GstPlayVideoChain *) playsink->videochain))
+@@ -1077,7 +1087,7 @@ try_element (GstPlaySink * playsink, GstElement * element, gboolean unref)
+ }
+ /* make the element (bin) that contains the elements needed to perform
+- * video display.
++ * video display. Only used for *raw* video streams.
+  *
+  *  +------------------------------------------------------------+
+  *  | vbin                                                       |
+@@ -1378,13 +1388,13 @@ setup_video_chain (GstPlaySink * playsink, gboolean raw, gboolean async)
+   chain = playsink->videochain;
++  if (chain->chain.raw != raw)
++    return FALSE;
++
+   /* if the chain was active we don't do anything */
+   if (GST_PLAY_CHAIN (chain)->activated == TRUE)
+     return TRUE;
+-  if (chain->chain.raw != raw)
+-    return FALSE;
+-
+   /* try to set the sink element to READY again */
+   ret = gst_element_set_state (chain->sink, GST_STATE_READY);
+   if (ret == GST_STATE_CHANGE_FAILURE)
+@@ -1413,6 +1423,7 @@ setup_video_chain (GstPlaySink * playsink, gboolean raw, gboolean async)
+ }
+ /* make an element for playback of video with subtitles embedded.
++ * Only used for *raw* video streams.
+  *
+  *  +--------------------------------------------+
+  *  | tbin                                       |
+@@ -1910,13 +1921,13 @@ setup_audio_chain (GstPlaySink * playsink, gboolean raw)
+   chain = playsink->audiochain;
++  if (chain->chain.raw != raw)
++    return FALSE;
++
+   /* if the chain was active we don't do anything */
+   if (GST_PLAY_CHAIN (chain)->activated == TRUE)
+     return TRUE;
+-  if (chain->chain.raw != raw)
+-    return FALSE;
+-
+   /* try to set the sink element to READY again */
+   ret = gst_element_set_state (chain->sink, GST_STATE_READY);
+   if (ret == GST_STATE_CHANGE_FAILURE)
+@@ -2849,6 +2860,200 @@ gst_play_sink_convert_frame (GstPlaySink * playsink, GstCaps * caps)
+   return result;
+ }
++static gboolean
++is_raw_structure (GstStructure * s)
++{
++  const gchar *name;
++
++  name = gst_structure_get_name (s);
++
++  if (g_str_has_prefix (name, "video/x-raw-") ||
++      g_str_has_prefix (name, "audio/x-raw-"))
++    return TRUE;
++  return FALSE;
++}
++
++static gboolean
++is_raw_pad (GstPad * pad)
++{
++  GstPad *peer = gst_pad_get_peer (pad);
++  GstCaps *caps;
++  gboolean raw = TRUE;
++
++  if (!peer)
++    return raw;
++
++  caps = gst_pad_get_negotiated_caps (peer);
++  if (!caps) {
++    guint i, n;
++
++    caps = gst_pad_get_caps_reffed (peer);
++
++    n = gst_caps_get_size (caps);
++    for (i = 0; i < n; i++) {
++      gboolean r = is_raw_structure (gst_caps_get_structure (caps, i));
++
++      if (i == 0) {
++        raw = r;
++      } else if (raw != r) {
++        GST_ERROR_OBJECT (pad,
++            "Caps contains raw and non-raw structures: %" GST_PTR_FORMAT, caps);
++        raw = FALSE;
++        break;
++      }
++    }
++  } else {
++    raw = is_raw_structure (gst_caps_get_structure (caps, 0));
++  }
++  gst_caps_unref (caps);
++  gst_object_unref (peer);
++
++  return raw;
++}
++
++static GstPad *
++get_internally_linked_pad (GstPad * pad)
++{
++  GstIterator *it;
++  GstPad *res = NULL;
++
++  it = gst_pad_iterate_internal_links (pad);
++  if (!it)
++    return NULL;
++
++  gst_iterator_next (it, (gpointer) & res);
++  gst_iterator_free (it);
++
++  return res;
++}
++
++static void
++sinkpad_blocked_cb (GstPad * blockedpad, gboolean blocked, gpointer user_data)
++{
++  GstPlaySink *playsink = (GstPlaySink *) user_data;
++  GstPad *pad;
++
++  GST_PLAY_SINK_LOCK (playsink);
++
++  pad = get_internally_linked_pad (blockedpad);
++  if (pad == playsink->video_pad) {
++    playsink->video_pad_blocked = blocked;
++    GST_DEBUG_OBJECT (pad, "Video pad blocked: %d", blocked);
++  } else if (pad == playsink->audio_pad) {
++    playsink->audio_pad_blocked = blocked;
++    GST_DEBUG_OBJECT (pad, "Audio pad blocked: %d", blocked);
++  } else if (pad == playsink->text_pad) {
++    playsink->text_pad_blocked = blocked;
++    GST_DEBUG_OBJECT (pad, "Text pad blocked: %d", blocked);
++  }
++
++  if (!blocked) {
++    gst_object_unref (pad);
++    GST_PLAY_SINK_UNLOCK (playsink);
++    return;
++  }
++
++  if ((!playsink->video_pad || playsink->video_pad_blocked) &&
++      (!playsink->audio_pad || playsink->audio_pad_blocked) &&
++      (!playsink->text_pad || playsink->text_pad_blocked)) {
++    GST_DEBUG_OBJECT (playsink, "All pads blocked -- reconfiguring");
++
++    if (playsink->video_pad) {
++      playsink->video_pad_raw = is_raw_pad (playsink->video_pad);
++      GST_DEBUG_OBJECT (playsink, "Video pad is raw: %d",
++          playsink->video_pad_raw);
++    }
++
++    if (playsink->audio_pad) {
++      playsink->audio_pad_raw = is_raw_pad (playsink->audio_pad);
++      GST_DEBUG_OBJECT (playsink, "Audio pad is raw: %d",
++          playsink->audio_pad_raw);
++    }
++
++    gst_play_sink_reconfigure (playsink);
++
++    if (playsink->video_pad) {
++      GstPad *opad = get_internally_linked_pad (playsink->video_pad);
++      gst_pad_set_blocked_async_full (opad, FALSE, sinkpad_blocked_cb,
++          gst_object_ref (playsink), (GDestroyNotify) gst_object_unref);
++      gst_object_unref (opad);
++    }
++
++    if (playsink->audio_pad) {
++      GstPad *opad = get_internally_linked_pad (playsink->audio_pad);
++      gst_pad_set_blocked_async_full (opad, FALSE, sinkpad_blocked_cb,
++          gst_object_ref (playsink), (GDestroyNotify) gst_object_unref);
++      gst_object_unref (opad);
++    }
++
++    if (playsink->text_pad) {
++      GstPad *opad = get_internally_linked_pad (playsink->text_pad);
++      gst_pad_set_blocked_async_full (opad, FALSE, sinkpad_blocked_cb,
++          gst_object_ref (playsink), (GDestroyNotify) gst_object_unref);
++      gst_object_unref (opad);
++    }
++  }
++
++  gst_object_unref (pad);
++
++  GST_PLAY_SINK_UNLOCK (playsink);
++}
++
++static void
++caps_notify_cb (GstPad * pad, GParamSpec * unused, GstPlaySink * playsink)
++{
++  gboolean reconfigure = FALSE;
++  GstCaps *caps;
++  gboolean raw;
++
++  g_object_get (pad, "caps", &caps, NULL);
++  if (!caps)
++    return;
++
++  if (pad == playsink->audio_pad) {
++    raw = is_raw_pad (pad);
++    reconfigure = (! !playsink->audio_pad_raw != ! !raw)
++        && playsink->audiochain;
++    GST_DEBUG_OBJECT (pad,
++        "Audio caps changed: raw %d reconfigure %d caps %" GST_PTR_FORMAT, raw,
++        reconfigure, caps);
++  } else if (pad == playsink->video_pad) {
++    raw = is_raw_pad (pad);
++    reconfigure = (! !playsink->video_pad_raw != ! !raw)
++        && playsink->videochain;
++    GST_DEBUG_OBJECT (pad,
++        "Video caps changed: raw %d reconfigure %d caps %" GST_PTR_FORMAT, raw,
++        reconfigure, caps);
++  }
++
++  gst_caps_unref (caps);
++
++  if (reconfigure) {
++    GST_PLAY_SINK_LOCK (playsink);
++    if (playsink->video_pad) {
++      GstPad *opad = get_internally_linked_pad (playsink->video_pad);
++      gst_pad_set_blocked_async_full (opad, TRUE, sinkpad_blocked_cb,
++          gst_object_ref (playsink), (GDestroyNotify) gst_object_unref);
++      gst_object_unref (opad);
++    }
++
++    if (playsink->audio_pad) {
++      GstPad *opad = get_internally_linked_pad (playsink->audio_pad);
++      gst_pad_set_blocked_async_full (opad, TRUE, sinkpad_blocked_cb,
++          gst_object_ref (playsink), (GDestroyNotify) gst_object_unref);
++      gst_object_unref (opad);
++    }
++
++    if (playsink->text_pad) {
++      GstPad *opad = get_internally_linked_pad (playsink->text_pad);
++      gst_pad_set_blocked_async_full (opad, TRUE, sinkpad_blocked_cb,
++          gst_object_ref (playsink), (GDestroyNotify) gst_object_unref);
++      gst_object_unref (opad);
++    }
++    GST_PLAY_SINK_UNLOCK (playsink);
++  }
++}
++
+ /**
+  * gst_play_sink_request_pad
+  * @playsink: a #GstPlaySink
+@@ -2863,7 +3068,6 @@ gst_play_sink_request_pad (GstPlaySink * playsink, GstPlaySinkType type)
+ {
+   GstPad *res = NULL;
+   gboolean created = FALSE;
+-  gboolean raw = FALSE;
+   gboolean activate = TRUE;
+   const gchar *pad_name = NULL;
+@@ -2872,11 +3076,8 @@ gst_play_sink_request_pad (GstPlaySink * playsink, GstPlaySinkType type)
+   GST_PLAY_SINK_LOCK (playsink);
+   switch (type) {
+     case GST_PLAY_SINK_TYPE_AUDIO_RAW:
+-      pad_name = "audio_raw_sink";
+-      raw = TRUE;
+     case GST_PLAY_SINK_TYPE_AUDIO:
+-      if (pad_name == NULL)
+-        pad_name = "audio_sink";
++      pad_name = "audio_sink";
+       if (!playsink->audio_tee) {
+         GST_LOG_OBJECT (playsink, "creating tee");
+         /* create tee when needed. This element will feed the audio sink chain
+@@ -2902,24 +3103,25 @@ gst_play_sink_request_pad (GstPlaySink * playsink, GstPlaySinkType type)
+         GST_LOG_OBJECT (playsink, "ghosting tee sinkpad");
+         playsink->audio_pad =
+             gst_ghost_pad_new (pad_name, playsink->audio_tee_sink);
++        g_signal_connect (G_OBJECT (playsink->audio_pad), "notify::caps",
++            G_CALLBACK (caps_notify_cb), playsink);
+         created = TRUE;
+       }
+-      playsink->audio_pad_raw = raw;
++      playsink->audio_pad_raw = FALSE;
+       res = playsink->audio_pad;
+       break;
+     case GST_PLAY_SINK_TYPE_VIDEO_RAW:
+-      pad_name = "video_raw_sink";
+-      raw = TRUE;
+     case GST_PLAY_SINK_TYPE_VIDEO:
+-      if (pad_name == NULL)
+-        pad_name = "video_sink";
++      pad_name = "video_sink";
+       if (!playsink->video_pad) {
+         GST_LOG_OBJECT (playsink, "ghosting videosink");
+         playsink->video_pad =
+             gst_ghost_pad_new_no_target (pad_name, GST_PAD_SINK);
++        g_signal_connect (G_OBJECT (playsink->video_pad), "notify::caps",
++            G_CALLBACK (caps_notify_cb), playsink);
+         created = TRUE;
+       }
+-      playsink->video_pad_raw = raw;
++      playsink->video_pad_raw = FALSE;
+       res = playsink->video_pad;
+       break;
+     case GST_PLAY_SINK_TYPE_TEXT:
+@@ -2955,6 +3157,13 @@ gst_play_sink_request_pad (GstPlaySink * playsink, GstPlaySinkType type)
+      * element is 'running' */
+     gst_pad_set_active (res, TRUE);
+     gst_element_add_pad (GST_ELEMENT_CAST (playsink), res);
++    if (type != GST_PLAY_SINK_TYPE_FLUSHING) {
++      GstPad *blockpad = get_internally_linked_pad (res);
++
++      gst_pad_set_blocked_async_full (blockpad, TRUE, sinkpad_blocked_cb,
++          gst_object_ref (playsink), (GDestroyNotify) gst_object_unref);
++      gst_object_unref (blockpad);
++    }
+     if (!activate)
+       gst_pad_set_active (res, activate);
+   }
+@@ -3011,8 +3220,12 @@ gst_play_sink_release_pad (GstPlaySink * playsink, GstPad * pad)
+   GST_PLAY_SINK_LOCK (playsink);
+   if (pad == playsink->video_pad) {
+     res = &playsink->video_pad;
++    g_signal_handlers_disconnect_by_func (playsink->video_pad, caps_notify_cb,
++        playsink);
+   } else if (pad == playsink->audio_pad) {
+     res = &playsink->audio_pad;
++    g_signal_handlers_disconnect_by_func (playsink->audio_pad, caps_notify_cb,
++        playsink);
+   } else if (pad == playsink->text_pad) {
+     res = &playsink->text_pad;
+   } else {
+@@ -3193,6 +3406,40 @@ gst_play_sink_change_state (GstElement * element, GstStateChange transition)
+       ret = GST_STATE_CHANGE_ASYNC;
+       break;
+     case GST_STATE_CHANGE_PAUSED_TO_READY:
++      /* unblock all pads here */
++      GST_PLAY_SINK_LOCK (playsink);
++      if (playsink->video_pad) {
++        GstPad *opad = get_internally_linked_pad (playsink->video_pad);
++        if (gst_pad_is_blocked (opad)) {
++          gst_pad_set_blocked_async_full (opad, FALSE, sinkpad_blocked_cb,
++              gst_object_ref (playsink), (GDestroyNotify) gst_object_unref);
++        }
++        gst_object_unref (opad);
++        playsink->video_pad_blocked = FALSE;
++      }
++
++      if (playsink->audio_pad) {
++        GstPad *opad = get_internally_linked_pad (playsink->audio_pad);
++
++        if (gst_pad_is_blocked (opad)) {
++          gst_pad_set_blocked_async_full (opad, FALSE, sinkpad_blocked_cb,
++              gst_object_ref (playsink), (GDestroyNotify) gst_object_unref);
++        }
++        gst_object_unref (opad);
++        playsink->audio_pad_blocked = FALSE;
++      }
++
++      if (playsink->text_pad) {
++        GstPad *opad = get_internally_linked_pad (playsink->text_pad);
++        if (gst_pad_is_blocked (opad)) {
++          gst_pad_set_blocked_async_full (opad, FALSE, sinkpad_blocked_cb,
++              gst_object_ref (playsink), (GDestroyNotify) gst_object_unref);
++        }
++        gst_object_unref (opad);
++        playsink->text_pad_blocked = FALSE;
++      }
++      GST_PLAY_SINK_UNLOCK (playsink);
++      /* fall through */
+     case GST_STATE_CHANGE_READY_TO_NULL:
+       if (playsink->audiochain && playsink->audiochain->sink_volume) {
+         /* remove our links to the mute and volume elements when they were
+diff --git a/gst/playback/gstplaysink.h b/gst/playback/gstplaysink.h
+index 3ca96d3..6759ea4 100644
+--- a/gst/playback/gstplaysink.h
++++ b/gst/playback/gstplaysink.h
+@@ -41,11 +41,11 @@ G_BEGIN_DECLS
+ /**
+  * GstPlaySinkType:
+- * @GST_PLAY_SINK_TYPE_AUDIO: A non-raw audio pad
+- * @GST_PLAY_SINK_TYPE_AUDIO_RAW: a raw audio pad
+- * @GST_PLAY_SINK_TYPE_VIDEO: a non-raw video pad
+- * @GST_PLAY_SINK_TYPE_VIDEO_RAW: a raw video pad
+- * @GST_PLAY_SINK_TYPE_TEXT: a raw text pad
++ * @GST_PLAY_SINK_TYPE_AUDIO: an audio pad
++ * @GST_PLAY_SINK_TYPE_AUDIO_RAW: a raw audio pad. Deprecated.
++ * @GST_PLAY_SINK_TYPE_VIDEO: a video pad
++ * @GST_PLAY_SINK_TYPE_VIDEO_RAW: a raw video pad. Deprecated.
++ * @GST_PLAY_SINK_TYPE_TEXT: a text pad
+  * @GST_PLAY_SINK_TYPE_LAST: the last type
+  * @GST_PLAY_SINK_TYPE_FLUSHING: a flushing pad, used when shutting down
+  *
+--
+cgit v0.9
diff --git a/recipes/gstreamer/gst-plugins-base_0.10.35.bb b/recipes/gstreamer/gst-plugins-base_0.10.35.bb
new file mode 100644 (file)
index 0000000..1cfd307
--- /dev/null
@@ -0,0 +1,22 @@
+require gst-plugins.inc
+
+SRC_URI_append_opendreambox = " file://samihack.patch;patch=1 \
+file://d3a44541749f413343d5717c464083cef22a74f1.patch;patch=1 \
+file://1e0ddb12aa1c2b13c4bc4a13712ebd7f06a6346e.patch;patch=1 \
+"
+SRC_URI_append_vuplus = " file://samihack.patch;patch=1 \
+file://d3a44541749f413343d5717c464083cef22a74f1.patch;patch=1 \
+file://1e0ddb12aa1c2b13c4bc4a13712ebd7f06a6346e.patch;patch=1 \
+"
+
+PR = "${INC_PR}.0"
+
+PROVIDES += "gst-plugins"
+
+# gst-plugins-base only builds the alsa plugin
+# if alsa has been built and is present.  You will
+# not get an error if this is not present, just 
+# a missing alsa plugin
+DEPENDS += "${@base_contains('DISTRO', 'vuplus', 'alsa-lib', 'cdparanoia pango libtheora alsa-lib libsm virtual/libx11 freetype gnome-vfs libxv', d)}"
+EXTRA_OECONF_vuplus += "--disable-theora --disable-pango --with-audioresample-format=int"
+
diff --git a/recipes/gstreamer/gst-plugins-good_0.10.30.bb b/recipes/gstreamer/gst-plugins-good_0.10.30.bb
new file mode 100644 (file)
index 0000000..9aaed0d
--- /dev/null
@@ -0,0 +1,15 @@
+require gst-plugins.inc
+
+PR = "${INC_PR}.0"
+
+DEPENDS += "gst-plugins-base"
+
+RREPLACES_gst-plugin-audioparsers = "gst-plugin-audioparsersbad"
+RCONFLICTS_gst-plugin-audioparsers = "gst-plugin-audioparsersbad"
+RREPLACES_gst-plugin-isomp4 = "gst-plugin-qtdemux"
+RCONFLICTS_gst-plugin-isomp4 = "gst-plugin-qtdemux"
+
+do_configure_prepend() {
+       sed -i -e s:docs::g Makefile.am
+}
+
diff --git a/recipes/gstreamer/gst-plugins-ugly_0.10.18.bb b/recipes/gstreamer/gst-plugins-ugly_0.10.18.bb
new file mode 100644 (file)
index 0000000..50c348a
--- /dev/null
@@ -0,0 +1,16 @@
+require gst-plugins.inc
+
+SRC_URI_append_opendreambox = " file://dvdsubdec-addproperty-singlebuffer.patch;patch=1"
+SRC_URI_append_vuplus = " file://dvdsubdec-addproperty-singlebuffer.patch;patch=1"
+
+PR = "${INC_PR}.0"
+
+DEPENDS += "gst-plugins-base libsidplay"
+
+python() {
+       # Don't build, if we are building an ENTERPRISE distro
+       enterprise = bb.data.getVar("ENTERPRISE_DISTRO", d, 1)
+       if enterprise == "1":
+               raise bb.parse.SkipPackage("gst-plugins-ugly will only build if ENTERPRISE_DISTRO != 1")
+}
+
diff --git a/recipes/gstreamer/gstreamer_0.10.35.bb b/recipes/gstreamer/gstreamer_0.10.35.bb
new file mode 100644 (file)
index 0000000..5994efe
--- /dev/null
@@ -0,0 +1,10 @@
+require gstreamer.inc
+
+EXTRA_OECONF += "ac_cv_func_register_printf_function=no"
+
+do_configure_prepend() {
+       sed -i -e s:docs::g Makefile.am
+}
+
+RREPLACES_gstreamer = "gst-plugin-queue2 gst-plugin-selector"
+RCONFLICTS_gstreamer = "gst-plugin-queue2 gst-plugin-selector"
diff --git a/recipes/libpagecache/libpagecache_0.0.1.bb b/recipes/libpagecache/libpagecache_0.0.1.bb
new file mode 100644 (file)
index 0000000..9a45cd9
--- /dev/null
@@ -0,0 +1,11 @@
+DESCRIPTION = "Preloadable library to improve large file operations"
+SECTION = "base"
+
+SRCREV = "2beee1fa0a267c0c847bb52af297b9d04a824019"
+
+inherit autotools opendreambox-git lib_package
+
+do_install_append() {
+        install -d ${D}${sysconfdir}
+        echo "libpagecache.so.0.0.0" > ${D}${sysconfdir}/ld.so.preload
+}
index 89eb60d..cd32179 100644 (file)
@@ -175,7 +175,7 @@ diff -Naur linux-2.6.18/include/linux/dvb.orig/frontend.h linux-2.6.18/include/l
  } fe_guard_interval_t;
  
  
-@@ -239,6 +257,137 @@
+@@ -239,6 +257,138 @@
        struct dvb_frontend_parameters parameters;
  };
  
@@ -271,6 +271,7 @@ diff -Naur linux-2.6.18/include/linux/dvb.orig/frontend.h linux-2.6.18/include/l
 +      SYS_CMMB,
 +      SYS_DAB,
 +      SYS_DVBT2,
++      SYS_TURBO,
 +} fe_delivery_system_t;
 +
 +struct dtv_cmds_h {
@@ -334,7 +335,7 @@ diff -Naur linux-2.6.18/include/linux/dvb.orig/version.h linux-2.6.18/include/li
 -#define DVB_API_VERSION 3
 -#define DVB_API_VERSION_MINOR 1
 +#define DVB_API_VERSION 5
-+#define DVB_API_VERSION_MINOR 3
++#define DVB_API_VERSION_MINOR 4
  
  #endif /*_DVBVERSION_H_*/
 diff -Naur linux-2.6.18/include/linux/dvb.orig/video.h linux-2.6.18/include/linux/dvb/video.h
index 10356f3..fa002b7 100644 (file)
@@ -513,7 +513,7 @@ diff -Naur linux-2.6.18/drivers/media/dvb.orig/dvb-core/dvb_frontend.h linux-2.6
  };
  
  #define MAX_EVENT 8
-@@ -138,22 +315,72 @@
+@@ -138,22 +315,75 @@
        int                       eventr;
        int                       overflow;
        wait_queue_head_t         wait_queue;
@@ -562,6 +562,9 @@ diff -Naur linux-2.6.18/drivers/media/dvb.orig/dvb-core/dvb_frontend.h linux-2.6
 +
 +      /* ISDB-T specifics */
 +      u32                     isdbs_ts_id;
++
++      /* DVB-T2 specifics */
++      u32                     dvbt2_plp_id;
  };
  
  struct dvb_frontend {
diff --git a/recipes/linux/files/opendreambox/stblinux-2.6.18-brcmnand-oob-raw-write-fix.patch b/recipes/linux/files/opendreambox/stblinux-2.6.18-brcmnand-oob-raw-write-fix.patch
new file mode 100644 (file)
index 0000000..a5fe250
--- /dev/null
@@ -0,0 +1,36 @@
+commit 4b53f1aca5fb4503460bc398ef40f296fc5c985c
+Author: ghost <andreas.monzner@multimedia-labs.de>
+Date:   Fri Sep 2 23:06:25 2011 +0200
+
+    brcmnand: fixed oob raw write
+
+diff --git a/drivers/mtd/brcmnand/brcmnand_base.c b/drivers/mtd/brcmnand/brcmnand_base.c
+index 7dc1c33..23fc1db 100644
+--- a/drivers/mtd/brcmnand/brcmnand_base.c
++++ b/drivers/mtd/brcmnand/brcmnand_base.c
+@@ -6067,6 +6067,14 @@ brcmnand_do_write_oob(struct mtd_info *mtd, loff_t to, struct mtd_oob_ops *ops)
+       int page, status;
+       struct brcmnand_chip *chip = mtd->priv;
+       int toBeWritten, written;
++      int ooblen;
++
++      if (ops->mode == MTD_OOB_AUTO) {
++              ooblen = mtd->ecclayout->oobavail;
++      }
++      else {
++              ooblen = mtd->oobsize;
++      }
+       DEBUG(MTD_DEBUG_LEVEL3, "%s: to = 0x%08x, len = %i\n", __FUNCTION__,
+             (unsigned int)to, (int)ops->len);
+@@ -6119,8 +6127,8 @@ printk("-->%s, to=%08x, len=%d\n", __FUNCTION__, (uint32_t) to, (int)ops->len);}
+               return status;
+               page++;
+-              written += mtd->ecclayout->oobavail;
+-              toBeWritten -= mtd->ecclayout->oobavail;
++              written += ooblen;
++              toBeWritten -= ooblen;
+       }
diff --git a/recipes/linux/files/opendreambox/stblinux-2.6.18-extra-version-7.4.patch b/recipes/linux/files/opendreambox/stblinux-2.6.18-extra-version-7.4.patch
new file mode 100644 (file)
index 0000000..113301d
--- /dev/null
@@ -0,0 +1,11 @@
+--- linux-2.6.18-org/Makefile  2011-08-12 00:52:01.000000000 +0200
++++ linux-2.6.18/Makefile      2011-08-12 11:20:14.422371100 +0200
+@@ -1,7 +1,7 @@
+ VERSION = 2
+ PATCHLEVEL = 6
+ SUBLEVEL = 18
+-EXTRAVERSION =-7.7
++EXTRAVERSION =-7.4
+ NAME=Avast! A bilge rat!
+ # *DOCUMENTATION*
diff --git a/recipes/linux/files/opendreambox/stblinux-2.6.18-hw-ecc-compatibility.patch b/recipes/linux/files/opendreambox/stblinux-2.6.18-hw-ecc-compatibility.patch
new file mode 100644 (file)
index 0000000..f208613
--- /dev/null
@@ -0,0 +1,263 @@
+--- a/drivers/mtd/brcmnand/brcmnand_base.c
++++ b/drivers/mtd/brcmnand/brcmnand_base.c
+@@ -868,8 +868,10 @@ static void brcmnand_decode_addr(struct brcmnand_chip* chip, loff_t offset,
+  * 
+  * Returns the real ldw of the address w.r.t. the chip.
+  */
+-static uint32_t brcmnand_ctrl_writeAddr(struct brcmnand_chip* chip, loff_t offset, int cmdEndAddr) 
++static uint32_t brcmnand_ctrl_writeAddr(struct mtd_info *mtd, loff_t offset, int cmdEndAddr) 
+ {
++      struct brcmnand_chip* chip = mtd->priv;
++
+ #if CONFIG_MTD_BRCMNAND_VERSION <= CONFIG_MTD_BRCMNAND_VERS_0_1
+       uint32_t pAddr = offset + chip->pbase;
+       uint32_t ldw = 0;
+@@ -891,6 +893,33 @@ if (gdebug > 3) printk("%s: offset=%0llx  cs=%d ldw = %08x, udw = %08x\n", __FUN
+       chip->ctrl_write(BCHP_NAND_CMD_EXT_ADDRESS, udw);
+ #endif
++      {
++              struct mtd_partition **parts = (struct mtd_partition**)(mtd+1);
++              struct mtd_partition *part = *parts;
++              static uint32_t bits_modified;
++
++              part++; // loader partition
++
++              if (unlikely(offset < part->size)) {
++                      uint32_t acc = brcmnand_ctrl_read(BCHP_NAND_ACC_CONTROL);
++                      uint32_t ecc_bits = acc & (BCHP_NAND_ACC_CONTROL_RD_ECC_EN_MASK | BCHP_NAND_ACC_CONTROL_RD_ECC_BLK0_EN_MASK | BCHP_NAND_ACC_CONTROL_WR_ECC_EN_MASK);
++
++                      if ((ecc_bits | bits_modified) != bits_modified) {
++if (gdebug > 3) printk("disable ecc %08x %08x, old %08x\n", ecc_bits, bits_modified, acc);
++                              acc &= ~ecc_bits;
++                              brcmnand_ctrl_write(BCHP_NAND_ACC_CONTROL, acc);
++                              bits_modified |= ecc_bits;
++                      }
++              } else {
++                      if (bits_modified) {
++                              uint32_t acc = brcmnand_ctrl_read(BCHP_NAND_ACC_CONTROL);
++if (gdebug > 3) printk("re-enable ecc %08x %08x, old %08x\n", acc | bits_modified, bits_modified, acc);
++                              brcmnand_ctrl_write(BCHP_NAND_ACC_CONTROL, acc | bits_modified);
++                              bits_modified = 0;
++                      }
++              }
++      }
++
+       return (ldw); //(ldw ^ 0x1FC00000);
+ }
+@@ -2121,7 +2150,7 @@ static int brcmnand_handle_false_read_ecc_unc_errors(
+       /* Disable ECC */
+       acc0 = brcmnand_disable_ecc(chip);
+-      chip->ctrl_writeAddr(chip, offset, 0);
++      chip->ctrl_writeAddr(mtd, offset, 0);
+       PLATFORM_IOFLUSH_WAR();
+       chip->ctrl_write(BCHP_NAND_CMD_START, OP_PAGE_READ);
+@@ -2432,7 +2461,7 @@ printk("%s: before intr_status=%08x\n", __FUNCTION__, intr_status);
+ #endif
+       
+-              chip->ctrl_writeAddr(chip, offset, 0);
++              chip->ctrl_writeAddr(mtd, offset, 0);
+               PLATFORM_IOFLUSH_WAR();
+               chip->ctrl_write(BCHP_NAND_CMD_START, OP_PAGE_READ);
+@@ -2561,7 +2590,7 @@ printk("%s: before intr_status=%08x\n", __FUNCTION__, intr_status);
+               BDEV_WR(BCHP_HIF_INTR2_CPU_STATUS, intr_status);
+ #endif
+-              chip->ctrl_writeAddr(chip, sliceOffset, 0);
++              chip->ctrl_writeAddr(mtd, sliceOffset, 0);
+               PLATFORM_IOFLUSH_WAR();
+               chip->ctrl_write(BCHP_NAND_CMD_START, OP_PAGE_READ);
+@@ -2710,7 +2739,7 @@ static void debug_clear_ctrl_cache(struct mtd_info* mtd)
+       struct brcmnand_chip* chip = mtd->priv;
+       loff_t offset = chip->chipSize-chip->blockSize; // Start of BBT region
+       
+-      chip->ctrl_writeAddr(chip, offset, 0); 
++      chip->ctrl_writeAddr(mtd, offset, 0); 
+       PLATFORM_IOFLUSH_WAR();
+       chip->ctrl_write(BCHP_NAND_CMD_START, OP_PAGE_READ);
+@@ -2942,7 +2971,7 @@ brcmnand_edu_read_completion(struct mtd_info* mtd,
+                                // Use Register Array
+                               // EDU_ldw = BCHP_PHYSICAL_OFFSET + BCHP_NAND_FLASH_CACHEi_ARRAY_BASE;
+-                              lkgs =  chip->ctrl_writeAddr(chip, gLastKnownGoodEcc, 0);
++                              lkgs =  chip->ctrl_writeAddr(mtd, gLastKnownGoodEcc, 0);
+                               PLATFORM_IOFLUSH_WAR(); 
+                               intr_status = EDU_read(buffer, lkgs);
+ #endif
+@@ -3050,7 +3079,7 @@ PRINTK("************* UNCORRECTABLE_ECC (offset=%0llx) ********************\n",
+                        * THT: Since EDU does not handle OOB area, unlike the UNC ERR case of the ctrl read,
+                        * we have to explicitly read the OOB, before calling the WAR routine.
+                        */
+-                      chip->ctrl_writeAddr(chip, offset, 0);
++                      chip->ctrl_writeAddr(mtd, offset, 0);
+                       chip->ctrl_write(BCHP_NAND_CMD_START, OP_SPARE_AREA_READ);
+                       // Wait until spare area is filled up
+@@ -3185,7 +3214,7 @@ if (gdebug>3) printk("++++++++++++++++++++++++ %s: buffer not 32B aligned, tryin
+       intr_status = 0;
+       do {
+-              EDU_ldw =  chip->ctrl_writeAddr(chip, sliceOffset, 0);
++              EDU_ldw =  chip->ctrl_writeAddr(mtd, sliceOffset, 0);
+               PLATFORM_IOFLUSH_WAR(); 
+               if (intr_status & HIF_INTR2_EBI_TIMEOUT) {
+@@ -3288,7 +3317,7 @@ printk("-->%s: offset=%0llx\n", __FUNCTION__,  offset); }
+                       //local_irq_save(irqflags);
+               }
+-              chip->ctrl_writeAddr(chip, sliceOffset, 0);
++              chip->ctrl_writeAddr(mtd, sliceOffset, 0);
+               chip->ctrl_write(BCHP_NAND_CMD_START, OP_SPARE_AREA_READ);
+               // Wait until spare area is filled up
+@@ -3544,7 +3573,7 @@ print_databuf(buffer, 32);}
+               ret =  -EINVAL;
+               goto out;
+       }
+-      chip->ctrl_writeAddr(chip, sliceOffset, 0);
++      chip->ctrl_writeAddr(mtd, sliceOffset, 0);
+       if (buffer) {
+@@ -3786,7 +3815,7 @@ PRINTK("%s: Buffer %p not suitable for EDU at %0llx, trying ctrl read op\n", __F
+       ret = ERESTARTSYS;
+       do {
+-              EDU_ldw = chip->ctrl_writeAddr(chip, sliceOffset, 0);
++              EDU_ldw = chip->ctrl_writeAddr(mtd, sliceOffset, 0);
+ // printk("EDU20\n");
+@@ -3929,7 +3958,7 @@ print_oobbuf(oobarea, 16);
+                       __FUNCTION__, offset);
+       }
+       
+-      chip->ctrl_writeAddr(chip, sliceOffset, 0);
++      chip->ctrl_writeAddr(mtd, sliceOffset, 0);
+ #if 0
+       /* Must write data when NAND_COMPLEX_OOB_WRITE option is set */
+@@ -4383,7 +4412,7 @@ req->buffer, req->edu_ldw, req->physAddr);
+       spin_lock(&req->lock);
+-      req->edu_ldw =  chip->ctrl_writeAddr(chip, req->offset, 0);
++      req->edu_ldw =  chip->ctrl_writeAddr(mtd, req->offset, 0);
+       PLATFORM_IOFLUSH_WAR(); 
+       //req->cmd = EDU_READ;
+@@ -4439,7 +4468,7 @@ int EDU_submit_write(eduIsrNode_t* req)
+       }
+-      req->edu_ldw = chip->ctrl_writeAddr(chip, req->offset, 0);
++      req->edu_ldw = chip->ctrl_writeAddr(mtd, req->offset, 0);
+       if (req->oobarea) {
+@@ -6525,7 +6554,7 @@ static int brcmnand_erase_nolock(struct mtd_info *mtd, struct erase_info *instr,
+                       instr->state = MTD_ERASE_FAILED;
+                       goto erase_one_block;
+               }
+-              chip->ctrl_writeAddr(chip, addr, 0);
++              chip->ctrl_writeAddr(mtd, addr, 0);
+               chip->ctrl_write(BCHP_NAND_CMD_START, OP_BLOCK_ERASE);
+               /* Wait until flash is ready */
+@@ -6663,7 +6692,7 @@ dump_stack();
+               //chip->command(mtd, ONENAND_CMD_ERASE, addr, block_size);
+-              chip->ctrl_writeAddr(chip, addr, 0);
++              chip->ctrl_writeAddr(mtd, addr, 0);
+       
+               chip->ctrl_write(BCHP_NAND_CMD_START, OP_BLOCK_ERASE);
+@@ -6937,9 +6966,9 @@ static int brcmnand_unlock(struct mtd_info *mtd, loff_t llofs, size_t len)
+       for (blkAddr = ofs; blkAddr <  (ofs + len); blkAddr = blkAddr + chip->blockSize) {
+               /* The following 2 commands share the same CMD_EXT_ADDR, as the block never cross a CS boundary */
+-              chip->ctrl_writeAddr(chip, blkAddr, 0); 
++              chip->ctrl_writeAddr(mtd, blkAddr, 0); 
+               /* Set end block address */
+-              chip->ctrl_writeAddr(chip, blkAddr + chip->blockSize - 1, 1);
++              chip->ctrl_writeAddr(mtd, blkAddr + chip->blockSize - 1, 1);
+               /* Write unlock command */
+               chip->ctrl_write(BCHP_NAND_CMD_START, OP_BLOCKS_UNLOCK);
+@@ -6951,7 +6980,7 @@ static int brcmnand_unlock(struct mtd_info *mtd, loff_t llofs, size_t len)
+                       printk(KERN_ERR "block = %0llx, wp status = 0x%x\n", blkAddr, status);
+               /* Check lock status */
+-              chip->ctrl_writeAddr(chip, blkAddr, 0); 
++              chip->ctrl_writeAddr(mtd, blkAddr, 0); 
+               chip->ctrl_write(BCHP_NAND_CMD_START, OP_READ_BLOCKS_LOCK_STATUS);
+               status = chip->ctrl_read(BCHP_NAND_BLOCK_LOCK_STATUS);
+               //status = chip->read_word(chip->base + ONENAND_REG_WP_STATUS);
+--- a/drivers/mtd/brcmnand/brcmnand_bbt.c
++++ b/drivers/mtd/brcmnand/brcmnand_bbt.c
+@@ -1530,7 +1530,7 @@ PRINTK( "-->%s whichBBT=%x\n", __FUNCTION__, whichbbt);
+                               continue;
+                       
+                       PRINTK("Erasing block at %0llx\n",  bOffset);
+-                      this->ctrl_writeAddr(this, bOffset, 0);
++                      this->ctrl_writeAddr(mtd, bOffset, 0);
+                       this->ctrl_write(BCHP_NAND_CMD_START, OP_BLOCK_ERASE);
+                       // Wait until flash is ready
+@@ -1552,7 +1552,7 @@ PRINTK( "-->%s whichBBT=%x\n", __FUNCTION__, whichbbt);
+       acc0 = acc & ~(BCHP_NAND_ACC_CONTROL_RD_ECC_EN_MASK | BCHP_NAND_ACC_CONTROL_RD_ECC_BLK0_EN_MASK);
+       bbt_ctrl_write(BCHP_NAND_ACC_CONTROL, acc0);
+-      chip->ctrl_writeAddr(chip, offset, 0);
++      chip->ctrl_writeAddr(mtd, offset, 0);
+       PLATFORM_IOFLUSH_WAR();
+       chip->ctrl_write(BCHP_NAND_CMD_START, OP_PAGE_PROGRAM);
+@@ -1995,7 +1995,7 @@ printk("%s: gClearBBT=clearbbt, start=%0llx, end=%0llx\n", __FUNCTION__,
+               
+               printk("brcmnand flag=%d: Erasing block at %0llx\n", 
+                       gClearBBT, bOffset);
+-              this->ctrl_writeAddr(this, bOffset, 0);
++              this->ctrl_writeAddr(mtd, bOffset, 0);
+               this->ctrl_write(BCHP_NAND_CMD_START, OP_BLOCK_ERASE);
+               // Wait until flash is ready
+@@ -2180,7 +2180,7 @@ PRINTK("%s: gClearBBT=%d, size=%016llx, erasesize=%08x\n",
+                       }
+                       
+                       //printk("brcmnand flag=%d: Erasing block at %08x\n", gClearBBT, bOffset);
+-                      this->ctrl_writeAddr(this, bOffset, 0);
++                      this->ctrl_writeAddr(mtd, bOffset, 0);
+                       this->ctrl_write(BCHP_NAND_CMD_START, OP_BLOCK_ERASE);
+                       // Wait until flash is ready
+--- a/include/linux/mtd/brcmnand.h
++++ b/include/linux/mtd/brcmnand.h
+@@ -511,7 +511,7 @@ struct brcmnand_chip {
+       uint32_t (*ctrl_read) (uint32_t command);
+       void (*ctrl_write) (uint32_t command, uint32_t val);
+-      uint32_t (*ctrl_writeAddr)(struct brcmnand_chip* chip, loff_t addr, int cmdEndAddr);
++      uint32_t (*ctrl_writeAddr)(struct mtd_info *mtd, loff_t addr, int cmdEndAddr);
+       /*
+        * THT: Private methods exported to BBT, equivalent to the methods defined in struct ecc_nand_ctl
+--- a/drivers/mtd/brcmnand/bcm7xxx-nand.c
++++ b/drivers/mtd/brcmnand/bcm7xxx-nand.c
+@@ -163,6 +163,7 @@
+       info->brcmnand.options |= NAND_USE_FLASH_BBT;
+       
++      info->parts = dreambox_64mb_nand_parts;
+ //printk("brcmnand_scan\n");
+       if (brcmnand_scan(&info->mtd, MAX_NAND_CS)) {
+               err = -ENXIO;
diff --git a/recipes/linux/files/opendreambox/stblinux-2.6.18-use-default-stack-size.patch b/recipes/linux/files/opendreambox/stblinux-2.6.18-use-default-stack-size.patch
deleted file mode 100644 (file)
index 93c35eb..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-diff --git a/include/linux/resource.h b/include/linux/resource.h
-index dfa7a7f..ae13db7 100644
---- a/include/linux/resource.h
-+++ b/include/linux/resource.h
-@@ -1,7 +1,6 @@
- #ifndef _LINUX_RESOURCE_H
- #define _LINUX_RESOURCE_H
--#include <linux/config.h>
- #include <linux/time.h>
- struct task_struct;
-@@ -56,17 +55,7 @@ struct rlimit {
-  * Limit the stack by to some sane default: root can always
-  * increase this limit if needed..  8MB seems reasonable.
-  */
--
--#ifdef CONFIG_MIPS_BRCM97XXX
--/* 
-- * THT: 8MB is unreasonably high for embedded systems,
-- * for which, by default, only 32MB is allocated to the kernel
-- */
--#define _STK_LIM      (1<<20)
--
--#else
- #define _STK_LIM      (8*1024*1024)
--#endif
- /*
-  * GPG wants 32kB of mlocked memory, to make sure pass phrases
index 95cbc70..e5afb1f 100644 (file)
@@ -520,7 +520,7 @@ CONFIG_MTD_CFI_I2=y
 # CONFIG_MTD_NAND is not set
 CONFIG_MTD_BRCMNAND=y
 CONFIG_MTD_BRCMNAND_VERIFY_WRITE=y
-CONFIG_MTD_BRCMNAND_VERSION=5
+CONFIG_MTD_BRCMNAND_VERSION=9
 CONFIG_MTD_BRCMNAND_CORRECTABLE_ERR_HANDLING=y
 # CONFIG_MTD_BRCMNAND_DISABLE_XOR is not set
 
diff --git a/recipes/linux/linux-dm7020hd-2.6.18/linux-2.6.18-big-summary.patch b/recipes/linux/linux-dm7020hd-2.6.18/linux-2.6.18-big-summary.patch
deleted file mode 100644 (file)
index d1522b3..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-diff -Naur linux-2.6.18-org/fs/jffs2/summary.c linux-2.6.18/fs/jffs2/summary.c
---- linux-2.6.18-org/fs/jffs2/summary.c        2011-03-15 16:32:15.374923000 +0100
-+++ linux-2.6.18/fs/jffs2/summary.c    2011-03-15 16:33:05.246923008 +0100
-@@ -37,7 +37,7 @@
-       memset(c->summary, 0, sizeof(struct jffs2_summary));
--      c->summary->sum_buf = kmalloc(sum_size, GFP_KERNEL);
-+      c->summary->sum_buf = vmalloc(c->sector_size);
-       if (!c->summary->sum_buf) {
-               JFFS2_WARNING("Can't allocate buffer for writing out summary information!\n");
-@@ -56,7 +56,7 @@
-       jffs2_sum_disable_collecting(c->summary);
--      kfree(c->summary->sum_buf);
-+      vfree(c->summary->sum_buf);
-       c->summary->sum_buf = NULL;
-       kfree(c->summary);
-@@ -667,7 +667,7 @@
-       int ret;
-       size_t retlen;
--      if (padsize + datasize > MAX_SUMMARY_SIZE) {
-+      if (0 && padsize + datasize > MAX_SUMMARY_SIZE) {
-               /* It won't fit in the buffer. Abort summary for this jeb */
-               jffs2_sum_disable_collecting(c->summary);
index c996d78..0934b9b 100644 (file)
@@ -1,9 +1,8 @@
 require linux-opendreambox-2.6.18.inc
 
-PR="${PR_INC}.1"
+PR="${PR_INC}.0"
 
 SRC_URI += "\
        file://linux-2.6.18-fix-serial.patch;patch=1 \
        file://linux-2.6.18-256MB-nand-support.patch;patch=1 \
-       file://linux-2.6.18-big-summary.patch;patch=1 \
 "
diff --git a/recipes/linux/linux-dm8000-2.6.18/linux-2.6.18-big-summary.patch b/recipes/linux/linux-dm8000-2.6.18/linux-2.6.18-big-summary.patch
deleted file mode 100644 (file)
index d1522b3..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-diff -Naur linux-2.6.18-org/fs/jffs2/summary.c linux-2.6.18/fs/jffs2/summary.c
---- linux-2.6.18-org/fs/jffs2/summary.c        2011-03-15 16:32:15.374923000 +0100
-+++ linux-2.6.18/fs/jffs2/summary.c    2011-03-15 16:33:05.246923008 +0100
-@@ -37,7 +37,7 @@
-       memset(c->summary, 0, sizeof(struct jffs2_summary));
--      c->summary->sum_buf = kmalloc(sum_size, GFP_KERNEL);
-+      c->summary->sum_buf = vmalloc(c->sector_size);
-       if (!c->summary->sum_buf) {
-               JFFS2_WARNING("Can't allocate buffer for writing out summary information!\n");
-@@ -56,7 +56,7 @@
-       jffs2_sum_disable_collecting(c->summary);
--      kfree(c->summary->sum_buf);
-+      vfree(c->summary->sum_buf);
-       c->summary->sum_buf = NULL;
-       kfree(c->summary);
-@@ -667,7 +667,7 @@
-       int ret;
-       size_t retlen;
--      if (padsize + datasize > MAX_SUMMARY_SIZE) {
-+      if (0 && padsize + datasize > MAX_SUMMARY_SIZE) {
-               /* It won't fit in the buffer. Abort summary for this jeb */
-               jffs2_sum_disable_collecting(c->summary);
index 926da10..dafc133 100644 (file)
@@ -6,9 +6,7 @@ RDEPENDS += "dreambox-secondstage (>=83)"
 
 SRC_URI += "\
        file://linux-2.6.18-disable-unneeded-uarts.patch;patch=1 \
-       file://linux-2.6.18-dm8000-nand-smp-fix.patch;patch=1 \
        file://linux-2.6.18-use-full-flash.patch;patch=1 \
-       file://linux-2.6.18-big-summary.patch;patch=1 \
 "
 
 pkg_preinst_kernel-image_dm8000 () {
index 78bf8dd..fabeff1 100644 (file)
@@ -1,7 +1,7 @@
 require linux-opendreambox.inc
 
-SRCREV = "c59d7210272be29e3850aca3abbff76443f65d6f-fixed"
-PR_INC = "r12"
+SRCREV = "ac6cc9511a5f70eaa584c63fc5c3de33cae1d0e7"
+PR_INC = "r14"
 
 RREPLACES_kernel = "kernel-2.6.18-7.1-${MACHINE}"
 RCONFLICTS_kernel = "kernel-2.6.18-7.1-${MACHINE}"
@@ -10,12 +10,14 @@ RCONFLICTS_kernel-image = "kernel-image-2.6.18-7.1-${MACHINE}"
 
 SRC_URI += " http://trappist.elis.ugent.be/~mronsse/cdfs/download/cdfs-2.6.18.tar.bz2 \
        file://stblinux-2.6.18-cdfs.patch \
+       file://stblinux-2.6.18-extra-version-7.4.patch;patch=1 \
+       file://stblinux-2.6.18-brcmnand-oob-raw-write-fix.patch;patch=1 \
        file://linux-2.6.18-fix-mips-crosscompile.patch;patch=1 \
        file://linux-2.6.18-fix-proc-cputype.patch;patch=1 \
        file://dvb-api-2.6.18-5.3.patch;patch=1 \
        file://linux-2.6.18-dvb-core-headers-20100904.patch;patch=1 \
        file://linux-2.6.18-dvb-frontends-headers-20100904.patch;patch=1 \
-       file://stblinux-2.6.18-use-default-stack-size.patch;patch=1 \
+       ${@base_contains('MACHINE', 'dm7020hd', '', 'file://stblinux-2.6.18-hw-ecc-compatibility.patch;patch=1', d)} \
 "
 
 do_configure_prepend() {
diff --git a/recipes/mysql/files/gen_lex_hash.patch b/recipes/mysql/files/gen_lex_hash.patch
deleted file mode 100644 (file)
index c398d04..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-
-#
-# Patch managed by http://www.holgerschurig.de/patcher.html
-#
-
---- mysql-4.1.15/sql/Makefile.am~gen_lexhash
-+++ mysql-4.1.15/sql/Makefile.am
-@@ -137,8 +137,10 @@
-               @echo "If it fails, re-run configure with --with-low-memory"
-               $(CXXCOMPILE) $(LM_CFLAGS) -c $<
-+GEN_LEX_HASH = ./gen_lex_hash$(EXEEXT)
-+
- lex_hash.h:   gen_lex_hash$(EXEEXT)
--              ./gen_lex_hash$(EXEEXT) > $@
-+              $(GEN_LEX_HASH) > $@
- # For testing of udf_example.so;  Works on platforms with gcc
- # (This is not part of our build process but only provided as an example)
diff --git a/recipes/mysql/mysql-5.1.40-have_atomic_pthread_t.patch b/recipes/mysql/mysql-5.1.40-have_atomic_pthread_t.patch
deleted file mode 100644 (file)
index f640179..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-diff -Naur mysql-5.1.40-old/storage/innodb_plugin/plug.in mysql-5.1.40-new/storage/innodb_plugin/plug.in
---- mysql-5.1.40-old/storage/innodb_plugin/plug.in     2009-10-06 10:50:23.000000000 -0700
-+++ mysql-5.1.40-new/storage/innodb_plugin/plug.in     2009-10-21 16:52:45.000000000 -0700
-@@ -63,8 +63,9 @@
-               ;;
-   esac
-   AC_SUBST(INNODB_DYNAMIC_CFLAGS)
--  AC_MSG_CHECKING(whether pthread_t can be used by GCC atomic builtins)
--  AC_TRY_RUN(
-+  AC_CACHE_CHECK([whether pthread_t can be used by GCC atomic builtins],
-+                 [ac_cv_have_decl_HAVE_ATOMIC_PTHREAD_T],
-+  [AC_TRY_RUN(
-     [
-       #include <pthread.h>
-       #include <string.h>
-@@ -84,14 +85,18 @@
-       }
-     ],
-     [
--      AC_DEFINE([HAVE_ATOMIC_PTHREAD_T], [1],
--                [pthread_t can be used by GCC atomic builtins])
-       AC_MSG_RESULT(yes)
-+      ac_cv_have_decl_HAVE_ATOMIC_PTHREAD_T=yes
-     ],
-     [
-       AC_MSG_RESULT(no)
-+      ac_cv_have_decl_HAVE_ATOMIC_PTHREAD_T=no
-     ]
--    )
-+    )])
-+    if test "x$ac_cv_have_decl_HAVE_ATOMIC_PTHREAD"= "xyes" ; then
-+      AC_DEFINE([HAVE_ATOMIC_PTHREAD_T], [1],
-+                [pthread_t can be used by GCC atomic builtins])
-+    fi
-   # Try using solaris atomics on SunOS if GCC atomics are not available
-   AC_CHECK_DECLS(
index 47efbe6..abb9188 100644 (file)
@@ -1,8 +1,9 @@
 require mysql5_${PV}.inc
 inherit native
-PR ="r0"
+PR ="r2"
 
-SRC_URI = "http://downloads.mysql.com/archives/mysql-5.1/mysql-${PV}.tar.gz"
+SRC_URI = "http://downloads.mysql.com/archives/mysql-5.1/mysql-${PV}.tar.gz \
+           file://fix-abi-check-gcc45.patch;patch=1"
 
 RDEPENDS_${PN} = ""
 PACKAGES = ""
@@ -10,16 +11,15 @@ DEPENDS = "ncurses-native"
 EXTRA_OEMAKE = ""
 EXTRA_OECONF = " --with-embedded-server "
 
-do_stage() {
-        install -m 0755 sql/gen_lex_hash ${STAGING_BINDIR}/
-}
-
 do_install() {
-       :
+        oe_runmake 'DESTDIR=${D}' install
+        mv -f ${D}${libdir}/mysql/* ${D}${libdir}
+        rmdir ${D}${libdir}/mysql
+
+        install -d ${D}${bindir}
+        install -m 0755 sql/gen_lex_hash ${D}${bindir}/
 }
 
+NATIVE_INSTALL_WORKS = "1"
 
-# Mysql tries to access the ${WORKDIR} from this build..
-do_rm_work() {
-       :
-}
+PSTAGING_DISABLED = "1"
diff --git a/recipes/mysql/mysql5/fix-abi-check-gcc45.patch b/recipes/mysql/mysql5/fix-abi-check-gcc45.patch
new file mode 100644 (file)
index 0000000..58812c1
--- /dev/null
@@ -0,0 +1,77 @@
+From: Date: July 20 2010 7:44pm
+Subject: bzr commit into mysql-5.1-bugteam branch (davi:3493) Bug#52514
+List-Archive: http://lists.mysql.com/commits/113968
+X-Bug: 52514
+MIME-Version: 1.0
+Content-Type: multipart/mixed; boundary="===============9147207462624717749=="
+
+--===============9147207462624717749==
+MIME-Version: 1.0
+Content-Type: text/plain; charset="us-ascii"
+Content-Transfer-Encoding: 7bit
+Content-Disposition: inline
+
+# At a local mysql-5.1-bugteam repository of davi
+
+ 3493 Davi Arnaut      2010-07-20
+      Bug#52514: mysql 5.1 do_abi_check does not compile w/ gcc4.5
+                 due to GCC preprocessor change
+            
+      The problem is that newer GCC versions treats missing headers
+      as fatal errors. The solution is to use a guard macro to prevent
+      the inclusion of system headers when checking the ABI with the
+      C Preprocessor.
+      
+      Reference: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=15638
+                 http://gcc.gnu.org/bugzilla/show_bug.cgi?id=44836
+     @ Makefile.am
+        Define guard macro.
+     @ configure.in
+        Remove workaround.
+     @ include/mysql.h
+        Guard the header inclusion.
+     @ include/mysql.h.pp
+        Header is not included anymore.
+
+    modified:
+      Makefile.am
+      configure.in
+      include/mysql.h
+      include/mysql.h.pp
+=== modified file 'Makefile.am'
+Index: mysql-5.1.40/Makefile.am
+===================================================================
+--- mysql-5.1.40.orig/Makefile.am      2009-10-07 01:46:13.000000000 +0800
++++ mysql-5.1.40/Makefile.am   2010-08-17 20:07:24.843148001 +0800
+@@ -312,7 +312,7 @@
+ do_abi_check:
+       set -ex; \
+       for file in $(abi_headers); do \
+-               @CC@ -E -nostdinc -dI \
++               @CC@ -E -nostdinc -dI -DMYSQL_ABI_CHECK \
+                         -I$(top_srcdir)/include \
+                         -I$(top_srcdir)/include/mysql \
+                         -I$(top_srcdir)/sql \
+Index: mysql-5.1.40/include/mysql.h
+===================================================================
+--- mysql-5.1.40.orig/include/mysql.h  2009-10-07 01:46:50.000000000 +0800
++++ mysql-5.1.40/include/mysql.h       2010-08-17 20:07:24.843148001 +0800
+@@ -44,7 +44,9 @@
+ #endif
+ #ifndef _global_h                             /* If not standard header */
++#ifndef MYSQL_ABI_CHECK
+ #include <sys/types.h>
++#endif
+ #ifdef __LCC__
+ #include <winsock2.h>                         /* For windows */
+ #endif
+Index: mysql-5.1.40/include/mysql.h.pp
+===================================================================
+--- mysql-5.1.40.orig/include/mysql.h.pp       2009-10-07 01:46:50.000000000 +0800
++++ mysql-5.1.40/include/mysql.h.pp    2010-08-17 20:07:24.843148001 +0800
+@@ -1,4 +1,3 @@
+-#include <sys/types.h>
+ typedef char my_bool;
+ typedef int my_socket;
+ #include "mysql_version.h"
index 2871674..f878efe 100644 (file)
@@ -3,7 +3,7 @@ HOMEPAGE = "http://www.mysql.com/"
 SECTION = "libs"
 LICENSE = "GPL"
 DEPENDS = "ncurses"
-PR = "r2"
+PR = "r5"
 
 SRC_URI = "http://downloads.mysql.com/archives/mysql-5.1/mysql-${PV}.tar.gz \
            file://configure.in.patch;patch=1 \
@@ -12,6 +12,7 @@ SRC_URI = "http://downloads.mysql.com/archives/mysql-5.1/mysql-${PV}.tar.gz \
            file://Makefile.am.patch;patch=1 \
            file://fix_host_path.patch;patch=1 \
           file://configure-ps-cache-check.patch;patch=1 \
+           file://fix-abi-check-gcc45.patch;patch=1 \
            file://my.cnf \
            file://mysqld.sh"
 
@@ -35,18 +36,12 @@ do_configure_append() {
      sed -i /comp_err/d ${S}/sql/share/Makefile
 }
 
-do_stage() {
-       autotools_stage_all
-       oe_libinstall -a -so -C libmysql libmysqlclient ${STAGING_LIBDIR}
-       oe_libinstall -a -C libmysqld libmysqld ${STAGING_LIBDIR}
-}
-
 SYSROOT_PREPROCESS_FUNCS += "mysql5_sysroot_preprocess"
 
 # We need to append this so it runs *after* binconfig's preprocess function
 mysql5_sysroot_preprocess () {
-       sed -i -es,^pkgincludedir=\'/usr/include/mysql\',pkgincludedir=\'${STAGING_INCDIR}\', ${STAGING_BINDIR_CROSS}/mysql_config
-       sed -i -es,^pkglibdir=\'/usr/lib/mysql\',pkglibdir=\'${STAGING_LIBDIR}\', ${STAGING_BINDIR_CROSS}/mysql_config
+       sed -i -es,^pkgincludedir=\'/usr/include/mysql\',pkgincludedir=\'${STAGING_INCDIR}\', ${SYSROOT_DESTDIR}${STAGING_BINDIR_CROSS}/mysql_config
+       sed -i -es,^pkglibdir=\'/usr/lib/mysql\',pkglibdir=\'${STAGING_LIBDIR}\', ${SYSROOT_DESTDIR}${STAGING_BINDIR_CROSS}/mysql_config
 }
 
 do_install() {
index 1dacff6..77d8132 100644 (file)
@@ -3,7 +3,7 @@ HOMEPAGE = "http://www.mysql.com/"
 SECTION = "libs"
 LICENSE = "GPL"
 DEPENDS = "ncurses"
-PR = "r6"
+PR = "r7"
 
 SRC_URI = "http://downloads.mysql.com/archives/mysql-4.1/mysql-${PV}.tar.gz \
            file://autofoo.patch;patch=1 \
index 5297da8..c77e3d7 100755 (executable)
@@ -275,7 +275,7 @@ FILES_python-idle="${bindir}/idle ${libdir}/python2.6/idlelib "
 
 DESCRIPTION_python-lang="Python Low-Level Language Support"
 RDEPENDS_python-lang="python-core"
-FILES_python-lang="${libdir}/python2.6/lib-dynload/_bisect.so ${libdir}/python2.6/lib-dynload/_collections.so ${libdir}/python2.6/lib-dynload/_heapq.so ${libdir}/python2.6/lib-dynload/_weakref.so ${libdir}/python2.6/lib-dynload/_functools.so ${libdir}/python2.6/lib-dynload/array.so ${libdir}/python2.6/lib-dynload/itertools.so ${libdir}/python2.6/lib-dynload/operator.so ${libdir}/python2.6/lib-dynload/parser.so ${libdir}/python2.6/atexit.* ${libdir}/python2.6/bisect.* ${libdir}/python2.6/code.* ${libdir}/python2.6/codeop.* ${libdir}/python2.6/collections.* ${libdir}/python2.6/dis.* ${libdir}/python2.6/functools.* ${libdir}/python2.6/heapq.* ${libdir}/python2.6/inspect.* ${libdir}/python2.6/keyword.* ${libdir}/python2.6/opcode.* ${libdir}/python2.6/symbol.* ${libdir}/python2.6/repr.* ${libdir}/python2.6/token.* ${libdir}/python2.6/tokenize.* ${libdir}/python2.6/traceback.* ${libdir}/python2.6/linecache.* ${libdir}/python2.6/weakref.* "
+FILES_python-lang="${libdir}/python2.6/lib-dynload/_bisect.so ${libdir}/python2.6/lib-dynload/_collections.so ${libdir}/python2.6/lib-dynload/_heapq.so ${libdir}/python2.6/lib-dynload/_weakref.so ${libdir}/python2.6/lib-dynload/_functools.so ${libdir}/python2.6/lib-dynload/array.so ${libdir}/python2.6/lib-dynload/itertools.so ${libdir}/python2.6/lib-dynload/operator.so ${libdir}/python2.6/lib-dynload/parser.so ${libdir}/python2.6/atexit.* ${libdir}/python2.6/bisect.* ${libdir}/python2.6/code.* ${libdir}/python2.6/codeop.* ${libdir}/python2.6/collections.* ${libdir}/python2.6/dis.* ${libdir}/python2.6/functools.* ${libdir}/python2.6/heapq.* ${libdir}/python2.6/inspect.* ${libdir}/python2.6/keyword.* ${libdir}/python2.6/opcode.* ${libdir}/python2.6/symbol.* ${libdir}/python2.6/repr.* ${libdir}/python2.6/token.* ${libdir}/python2.6/tokenize.* ${libdir}/python2.6/traceback.* ${libdir}/python2.6/weakref.* "
 
 DESCRIPTION_python-audio="Python Audio Handling"
 RDEPENDS_python-audio="python-core"
diff --git a/recipes/python/python-2.6.7/00-fix-parallel-make.patch b/recipes/python/python-2.6.7/00-fix-parallel-make.patch
new file mode 100644 (file)
index 0000000..c80ca19
--- /dev/null
@@ -0,0 +1,40 @@
+upstream: <http://bugs.python.org/issue10013>
+comment: As in the comment in the issue tracker this is fixed for py3k a little differently <http://svn.python.org/view?view=rev&revision=84068>. This patch is taken from Fedora.
+
+diff -up Python-2.7/Makefile.pre.in.fix-parallel-make Python-2.7/Makefile.pre.in
+--- Python-2.7/Makefile.pre.in.fix-parallel-make       2010-07-22 15:01:39.567996932 -0400
++++ Python-2.7/Makefile.pre.in 2010-07-22 15:47:02.437998509 -0400
+@@ -197,6 +197,7 @@ SIGNAL_OBJS=       @SIGNAL_OBJS@
+ ##########################################################################
+ # Grammar
++GRAMMAR_STAMP=        $(srcdir)/grammar-stamp
+ GRAMMAR_H=    $(srcdir)/Include/graminit.h
+ GRAMMAR_C=    $(srcdir)/Python/graminit.c
+ GRAMMAR_INPUT=        $(srcdir)/Grammar/Grammar
+@@ -514,10 +515,24 @@ Modules/getpath.o: $(srcdir)/Modules/get
+ Modules/python.o: $(srcdir)/Modules/python.c
+       $(MAINCC) -c $(PY_CFLAGS) -o $@ $(srcdir)/Modules/python.c
++# GNU "make" interprets rules with two dependents as two copies of the rule.
++# 
++# In a parallel build this can lead to pgen being run twice, once for each of
++# GRAMMAR_H and GRAMMAR_C, leading to race conditions in which the compiler
++# reads a partially-overwritten copy of one of these files, leading to syntax
++# errors (or linker errors if the fragment happens to be syntactically valid C)
++#
++# See http://www.gnu.org/software/hello/manual/automake/Multiple-Outputs.html
++# for more information.
++#
++# Introduce ".grammar-stamp" as a contrived single output from PGEN to avoid
++# this:
++$(GRAMMAR_H) $(GRAMMAR_C): $(GRAMMAR_STAMP)
+-$(GRAMMAR_H) $(GRAMMAR_C): $(PGEN) $(GRAMMAR_INPUT)
++$(GRAMMAR_STAMP): $(PGEN) $(GRAMMAR_INPUT)
+               -@$(INSTALL) -d Include
+               -$(PGEN) $(GRAMMAR_INPUT) $(GRAMMAR_H) $(GRAMMAR_C)
++              touch $(GRAMMAR_STAMP)
+ $(PGEN):      $(PGENOBJS)
+               $(CC) $(OPT) $(LDFLAGS) $(PGENOBJS) $(LIBS) -o $(PGEN)
diff --git a/recipes/python/python-2.6.7/01-use-proper-tools-for-cross-build.patch b/recipes/python/python-2.6.7/01-use-proper-tools-for-cross-build.patch
new file mode 100644 (file)
index 0000000..b7467cc
--- /dev/null
@@ -0,0 +1,116 @@
+# We need to ensure our host tools get run during build, not the freshly
+# built cross-tools (this will not work), so we introduce HOSTPYTHON and HOSTPGEN.
+# Signed-Off: Michael 'Mickey' Lauer <mickey@vanille-media.de>
+
+Index: Python-2.6.6/Makefile.pre.in
+===================================================================
+--- Python-2.6.6.orig/Makefile.pre.in
++++ Python-2.6.6/Makefile.pre.in
+@@ -175,6 +175,7 @@ UNICODE_OBJS=   @UNICODE_OBJS@
+ PYTHON=               python$(EXE)
+ BUILDPYTHON=  python$(BUILDEXE)
++HOSTPYTHON=   $(BUILDPYTHON)
+ # The task to run while instrument when building the profile-opt target
+ PROFILE_TASK= $(srcdir)/Tools/pybench/pybench.py -n 2 --with-gc --with-syscheck
+@@ -205,7 +206,7 @@ GRAMMAR_INPUT=     $(srcdir)/Grammar/Grammar
+ ##########################################################################
+ # Parser
+ PGEN=         Parser/pgen$(EXE)
+-
++HOSTPGEN=     $(PGEN)$(EXE)
+ POBJS=                \
+               Parser/acceler.o \
+               Parser/grammar1.o \
+@@ -394,8 +395,8 @@ platform: $(BUILDPYTHON)
+ # Build the shared modules
+ sharedmods: $(BUILDPYTHON)
+       @case $$MAKEFLAGS in \
+-      *s*) $(RUNSHARED) CC='$(CC)' LDSHARED='$(BLDSHARED)' LDFLAGS='$(LDFLAGS)' OPT='$(OPT)' ./$(BUILDPYTHON) -E $(srcdir)/setup.py -q build;; \
+-      *) $(RUNSHARED) CC='$(CC)' LDSHARED='$(BLDSHARED)' LDFLAGS='$(LDFLAGS)' OPT='$(OPT)' ./$(BUILDPYTHON) -E $(srcdir)/setup.py build;; \
++      *s*) $(RUNSHARED) CC='$(CC)' LDSHARED='$(BLDSHARED)' LDFLAGS='$(LDFLAGS)' OPT='$(OPT)' $(HOSTPYTHON) -E $(srcdir)/setup.py -q build;; \
++      *) $(RUNSHARED) CC='$(CC)' LDSHARED='$(BLDSHARED)' LDFLAGS='$(LDFLAGS)' OPT='$(OPT)' $(HOSTPYTHON) -E $(srcdir)/setup.py build;; \
+       esac
+ # Build static library
+@@ -517,7 +518,7 @@ Modules/python.o: $(srcdir)/Modules/pyth
+ $(GRAMMAR_STAMP): $(PGEN) $(GRAMMAR_INPUT)
+               -@$(INSTALL) -d Include
+-              -$(PGEN) $(GRAMMAR_INPUT) $(GRAMMAR_H) $(GRAMMAR_C)
++              -$(HOSTPGEN) $(GRAMMAR_INPUT) $(GRAMMAR_H) $(GRAMMAR_C)
+               touch $(GRAMMAR_STAMP)
+ $(PGEN):      $(PGENOBJS)
+@@ -887,23 +888,23 @@ libinstall:      build_all $(srcdir)/Lib/$(PL
+       done
+       $(INSTALL_DATA) $(srcdir)/LICENSE $(DESTDIR)$(LIBDEST)/LICENSE.txt
+       PYTHONPATH=$(DESTDIR)$(LIBDEST)  $(RUNSHARED) \
+-              ./$(BUILDPYTHON) -Wi -tt $(DESTDIR)$(LIBDEST)/compileall.py \
++              $(HOSTPYTHON) -Wi -tt $(DESTDIR)$(LIBDEST)/compileall.py \
+               -d $(LIBDEST) -f \
+               -x 'bad_coding|badsyntax|site-packages' $(DESTDIR)$(LIBDEST)
+       PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \
+-              ./$(BUILDPYTHON) -Wi -tt -O $(DESTDIR)$(LIBDEST)/compileall.py \
++              $(HOSTPYTHON) -Wi -tt -O $(DESTDIR)$(LIBDEST)/compileall.py \
+               -d $(LIBDEST) -f \
+               -x 'bad_coding|badsyntax|site-packages' $(DESTDIR)$(LIBDEST)
+       -PYTHONPATH=$(DESTDIR)$(LIBDEST)  $(RUNSHARED) \
+-              ./$(BUILDPYTHON) -Wi -t $(DESTDIR)$(LIBDEST)/compileall.py \
++              $(HOSTPYTHON) -Wi -t $(DESTDIR)$(LIBDEST)/compileall.py \
+               -d $(LIBDEST)/site-packages -f \
+               -x badsyntax $(DESTDIR)$(LIBDEST)/site-packages
+       -PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \
+-              ./$(BUILDPYTHON) -Wi -t -O $(DESTDIR)$(LIBDEST)/compileall.py \
++              $(HOSTPYTHON) -Wi -t -O $(DESTDIR)$(LIBDEST)/compileall.py \
+               -d $(LIBDEST)/site-packages -f \
+               -x badsyntax $(DESTDIR)$(LIBDEST)/site-packages
+       -PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \
+-              ./$(BUILDPYTHON) -Wi -t -c "import lib2to3.pygram, lib2to3.patcomp;lib2to3.patcomp.PatternCompiler()"
++              $(HOSTPYTHON) -Wi -t -c "import lib2to3.pygram, lib2to3.patcomp;lib2to3.patcomp.PatternCompiler()"
+ # Create the PLATDIR source directory, if one wasn't distributed..
+ $(srcdir)/Lib/$(PLATDIR):
+@@ -1001,7 +1002,7 @@ libainstall:     all
+ # Install the dynamically loadable modules
+ # This goes into $(exec_prefix)
+ sharedinstall:
+-      $(RUNSHARED) ./$(BUILDPYTHON) -E $(srcdir)/setup.py install \
++      $(RUNSHARED) $(HOSTPYTHON) -E $(srcdir)/setup.py install \
+               --prefix=$(prefix) \
+               --install-scripts=$(BINDIR) \
+               --install-platlib=$(DESTSHARED) \
+Index: Python-2.6.6/setup.py
+===================================================================
+--- Python-2.6.6.orig/setup.py
++++ Python-2.6.6/setup.py
+@@ -322,6 +322,7 @@ class PyBuildExt(build_ext):
+             self.failed.append(ext.name)
+             self.announce('*** WARNING: renaming "%s" since importing it'
+                           ' failed: %s' % (ext.name, why), level=3)
++            return
+             assert not self.inplace
+             basename, tail = os.path.splitext(ext_filename)
+             newname = basename + "_failed" + tail
+@@ -356,8 +357,8 @@ class PyBuildExt(build_ext):
+     def detect_modules(self):
+         # Ensure that /usr/local is always used
+-        add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib')
+-        add_dir_to_list(self.compiler.include_dirs, '/usr/local/include')
++        # add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib')
++        # add_dir_to_list(self.compiler.include_dirs, '/usr/local/include')
+         # Add paths specified in the environment variables LDFLAGS and
+         # CPPFLAGS for header and library files.
+@@ -456,6 +457,9 @@ class PyBuildExt(build_ext):
+         # XXX Omitted modules: gl, pure, dl, SGI-specific modules
++        lib_dirs = [ os.getenv( "STAGING_LIBDIR" ) ]
++        inc_dirs = [ os.getenv( "STAGING_INCDIR" ) ]
++
+         #
+         # The following modules are all pretty straightforward, and compile
+         # on pretty much any POSIXish platform.
diff --git a/recipes/python/python-2.6.7/02-remove-test-for-cross.patch b/recipes/python/python-2.6.7/02-remove-test-for-cross.patch
new file mode 100644 (file)
index 0000000..b1c0bfb
--- /dev/null
@@ -0,0 +1,106 @@
+# OpenEmbedded prepopulates the autotools site cache, so if this
+# would be using AC_TRY_CACHE, we could patch it in a more sane way
+# Alas, I don't have enough autotalent to do that.
+#
+# Signed-Off: Michael 'Mickey' Lauer <mickey@vanille-media.de>
+Index: Python-2.6.1/configure.in
+===================================================================
+--- Python-2.6.5.orig/configure.in     2010-07-06 04:37:09.000000000 -0700
++++ Python-2.6.5/configure.in  2010-07-06 04:40:18.000000000 -0700
+@@ -2697,50 +2697,6 @@
+   AC_CHECK_LIB(resolv, inet_aton)
+ )
+-# On Tru64, chflags seems to be present, but calling it will
+-# exit Python
+-AC_CACHE_CHECK([for chflags], [ac_cv_have_chflags], [dnl
+-AC_TRY_RUN([[
+-#include <sys/stat.h>
+-#include <unistd.h>
+-int main(int argc, char*argv[])
+-{
+-  if(chflags(argv[0], 0) != 0)
+-    return 1;
+-  return 0;
+-}
+-]], ac_cv_have_chflags=yes,
+-   ac_cv_have_chflags=no,
+-   ac_cv_have_chflags=cross)
+-])
+-if test "$ac_cv_have_chflags" = cross ; then
+-  AC_CHECK_FUNC([chflags], [ac_cv_have_chflags="yes"], [ac_cv_have_chflags="no"])
+-fi
+-if test "$ac_cv_have_chflags" = yes ; then
+-  AC_DEFINE(HAVE_CHFLAGS, 1, Define to 1 if you have the `chflags' function.)
+-fi
+-
+-AC_CACHE_CHECK([for lchflags], [ac_cv_have_lchflags], [dnl
+-AC_TRY_RUN([[
+-#include <sys/stat.h>
+-#include <unistd.h>
+-int main(int argc, char*argv[])
+-{
+-  if(lchflags(argv[0], 0) != 0)
+-    return 1;
+-  return 0;
+-}
+-]], ac_cv_have_lchflags=yes,
+-   ac_cv_have_lchflags=no,
+-   ac_cv_have_lchflags=cross)
+-])
+-if test "$ac_cv_have_lchflags" = cross ; then
+-  AC_CHECK_FUNC([lchflags], [ac_cv_have_lchflags="yes"], [ac_cv_have_lchflags="no"])
+-fi
+-if test "$ac_cv_have_lchflags" = yes ; then
+-  AC_DEFINE(HAVE_LCHFLAGS, 1, Define to 1 if you have the `lchflags' function.)
+-fi
+-
+ dnl Check if system zlib has *Copy() functions
+ dnl
+ dnl On MacOSX the linker will search for dylibs on the entire linker path
+@@ -3844,45 +3800,6 @@
+   AC_MSG_RESULT(no)
+ fi
+-AC_MSG_CHECKING(for %zd printf() format support)
+-AC_TRY_RUN([#include <stdio.h>
+-#include <stddef.h>
+-#include <string.h>
+-
+-#ifdef HAVE_SYS_TYPES_H
+-#include <sys/types.h>
+-#endif
+-
+-#ifdef HAVE_SSIZE_T
+-typedef ssize_t Py_ssize_t;
+-#elif SIZEOF_VOID_P == SIZEOF_LONG
+-typedef long Py_ssize_t;
+-#else
+-typedef int Py_ssize_t;
+-#endif
+-
+-int main()
+-{
+-    char buffer[256];
+-
+-    if(sprintf(buffer, "%zd", (size_t)123) < 0)
+-              return 1;
+-
+-    if (strcmp(buffer, "123"))
+-      return 1;
+-
+-    if (sprintf(buffer, "%zd", (Py_ssize_t)-123) < 0)
+-              return 1;
+-
+-    if (strcmp(buffer, "-123"))
+-      return 1;
+-
+-    return 0;
+-}],
+-[AC_MSG_RESULT(yes)
+- AC_DEFINE(PY_FORMAT_SIZE_T, "z", [Define to printf format modifier for Py_ssize_t])],
+- AC_MSG_RESULT(no))
+-
+ AC_CHECK_TYPE(socklen_t,,
+   AC_DEFINE(socklen_t,int,
+             Define to `int' if <sys/socket.h> does not define.),[
diff --git a/recipes/python/python-2.6.7/03-fix-tkinter-detection.patch b/recipes/python/python-2.6.7/03-fix-tkinter-detection.patch
new file mode 100644 (file)
index 0000000..a1a385a
--- /dev/null
@@ -0,0 +1,40 @@
+# We need to supply STAGING_INCDIR here, otherwise the Tk headers
+# will not be found.
+# Signed-Off: Michael 'Mickey' Lauer <mickey@vanille.de>
+
+Index: Python-2.6.1/setup.py
+===================================================================
+--- Python-2.6.1.orig/setup.py
++++ Python-2.6.1/setup.py
+@@ -1543,7 +1543,7 @@ class PyBuildExt(build_ext):
+                 dotversion = dotversion[:-1] + '.' + dotversion[-1]
+             tcl_include_sub = []
+             tk_include_sub = []
+-            for dir in inc_dirs:
++            for dir in [os.getenv("STAGING_INCDIR")]:
+                 tcl_include_sub += [dir + os.sep + "tcl" + dotversion]
+                 tk_include_sub += [dir + os.sep + "tk" + dotversion]
+             tk_include_sub += tcl_include_sub
+@@ -1562,22 +1562,6 @@ class PyBuildExt(build_ext):
+             if dir not in include_dirs:
+                 include_dirs.append(dir)
+-        # Check for various platform-specific directories
+-        if platform == 'sunos5':
+-            include_dirs.append('/usr/openwin/include')
+-            added_lib_dirs.append('/usr/openwin/lib')
+-        elif os.path.exists('/usr/X11R6/include'):
+-            include_dirs.append('/usr/X11R6/include')
+-            added_lib_dirs.append('/usr/X11R6/lib64')
+-            added_lib_dirs.append('/usr/X11R6/lib')
+-        elif os.path.exists('/usr/X11R5/include'):
+-            include_dirs.append('/usr/X11R5/include')
+-            added_lib_dirs.append('/usr/X11R5/lib')
+-        else:
+-            # Assume default location for X11
+-            include_dirs.append('/usr/X11/include')
+-            added_lib_dirs.append('/usr/X11/lib')
+-
+         # If Cygwin, then verify that X is installed before proceeding
+         if platform == 'cygwin':
+             x11_inc = find_file('X11/Xlib.h', [], include_dirs)
diff --git a/recipes/python/python-2.6.7/04-default-is-optimized.patch b/recipes/python/python-2.6.7/04-default-is-optimized.patch
new file mode 100644 (file)
index 0000000..f99ea4c
--- /dev/null
@@ -0,0 +1,19 @@
+# when compiling for an embedded system, we need every bit of
+# performance we can get. default to optimized with the option
+# of opt-out.
+# 
+# Signed-Off: Michael 'Mickey' Lauer <mickey@vanille-media.de>
+
+Index: Python-2.6.6/Python/compile.c
+===================================================================
+--- Python-2.6.6.orig/Python/compile.c
++++ Python-2.6.6/Python/compile.c
+@@ -32,7 +32,7 @@
+ #include "symtable.h"
+ #include "opcode.h"
+-int Py_OptimizeFlag = 0;
++int Py_OptimizeFlag = 1;
+ #define DEFAULT_BLOCK_SIZE 16
+ #define DEFAULT_BLOCKS 8
diff --git a/recipes/python/python-2.6.7/05-enable-ctypes-cross-build.patch b/recipes/python/python-2.6.7/05-enable-ctypes-cross-build.patch
new file mode 100644 (file)
index 0000000..58b8078
--- /dev/null
@@ -0,0 +1,28 @@
+# CTypes need to know the actual host we are building on.
+# Signed-Off: Michael Dietrich <mdt@emdete.de>
+
+Index: Python-2.6.1/setup.py
+===================================================================
+--- Python-2.6.1.orig/setup.py
++++ Python-2.6.1/setup.py
+@@ -1656,16 +1656,16 @@ class PyBuildExt(build_ext):
+                                          ffi_configfile):
+                 from distutils.dir_util import mkpath
+                 mkpath(ffi_builddir)
+-                config_args = []
++                config_args = ['--host=%s' % os.environ["HOST_SYS"], ]
+                 # Pass empty CFLAGS because we'll just append the resulting
+                 # CFLAGS to Python's; -g or -O2 is to be avoided.
+-                cmd = "cd %s && env CFLAGS='' '%s/configure' %s" \
+-                      % (ffi_builddir, ffi_srcdir, " ".join(config_args))
++                cmd = "(cd %s && autoconf -W cross) && (cd %s && env CFLAGS='' '%s/configure' %s)" \
++                      % (ffi_srcdir, ffi_builddir, ffi_srcdir, " ".join(config_args))
+                 res = os.system(cmd)
+                 if res or not os.path.exists(ffi_configfile):
+-                    print "Failed to configure _ctypes module"
++                    print "Failed to configure _ctypes module (res=%d) or missing conffile=%s" % ( res, ffi_configfile )
+                     return False
+             fficonfig = {}
diff --git a/recipes/python/python-2.6.7/06-ctypes-libffi-fix-configure.patch b/recipes/python/python-2.6.7/06-ctypes-libffi-fix-configure.patch
new file mode 100644 (file)
index 0000000..3773791
--- /dev/null
@@ -0,0 +1,51 @@
+This fixes configure issues with recent autoconf, e.g:
+  autoreconf: Entering directory `Modules/_ctypes/libffi'
+  autoreconf: configure.ac: not using Gettext
+  autoreconf: running: aclocal --force
+  configure.ac:26: error: m4_copy: won't overwrite defined macro: _AC_ARG_VAR_PRECIOUS
+  configure.ac:26: the top level
+
+The problem is still present in python-2.6.5 but fixed in python-svn.
+
+diff -pruN Python-2.6.4.orig//Modules/_ctypes/libffi/configure.ac Python-2.6.4/Modules/_ctypes/libffi/configure.ac
+--- Python-2.6.4.orig//Modules/_ctypes/libffi/configure.ac      2009-04-28 22:01:18.000000000 +0200
++++ Python-2.6.4/Modules/_ctypes/libffi/configure.ac    2010-04-20 22:46:02.000000000 +0200
+@@ -23,6 +23,7 @@ AM_INIT_AUTOMAKE
+ m4_rename([_AC_ARG_VAR_PRECIOUS],[real_PRECIOUS])
+ m4_define([_AC_ARG_VAR_PRECIOUS],[])
+ AC_PROG_CC
++m4_undefine([_AC_ARG_VAR_PRECIOUS])
+ m4_rename([real_PRECIOUS],[_AC_ARG_VAR_PRECIOUS])
+ AC_SUBST(CFLAGS)
+@@ -366,7 +367,7 @@ test -d src/$TARGETDIR || mkdir src/$TAR
+ AC_CONFIG_LINKS(include/ffitarget.h:src/$TARGETDIR/ffitarget.h)
+-AC_CONFIG_FILES(include/ffi.h)
++AC_CONFIG_FILES(include/ffi.h include/Makefile Makefile)
+ AC_CONFIG_LINKS(include/ffi_common.h:include/ffi_common.h)
+diff -pruN Python-2.6.4.orig//Modules/_ctypes/libffi/Makefile.am Python-2.6.4/Modules/_ctypes/libffi/Makefile.am
+--- Python-2.6.4.orig//Modules/_ctypes/libffi/Makefile.am       2008-03-04 21:09:11.000000000 +0100
++++ Python-2.6.4/Modules/_ctypes/libffi/Makefile.am     2010-04-20 22:54:03.000000000 +0200
+@@ -2,7 +2,7 @@
+ AUTOMAKE_OPTIONS = foreign subdir-objects
+-SUBDIRS = include testsuite man
++SUBDIRS = include
+ EXTRA_DIST = LICENSE ChangeLog.v1 ChangeLog.libgcj configure.host \
+        src/alpha/ffi.c src/alpha/osf.S src/alpha/ffitarget.h \
+@@ -32,8 +32,6 @@ EXTRA_DIST = LICENSE ChangeLog.v1 Change
+        src/frv/ffi.c src/frv/eabi.S src/frv/ffitarget.h src/dlmalloc.c \
+        libtool-version ChangeLog.libffi
+-info_TEXINFOS = doc/libffi.texi
+-
+ ## ################################################################
+ ##
+
diff --git a/recipes/python/python-2.6.7/10-distutils-fix-swig-parameter.patch b/recipes/python/python-2.6.7/10-distutils-fix-swig-parameter.patch
new file mode 100644 (file)
index 0000000..f5e852a
--- /dev/null
@@ -0,0 +1,16 @@
+# Some versions of SWIG do not use the extension parameter.
+# Make it optional.
+# Signed-Off: Michael 'Mickey' Lauer <mickey@vanille-media.de>
+Index: Python-2.6.1/Lib/distutils/command/build_ext.py
+===================================================================
+--- Python-2.6.1.orig/Lib/distutils/command/build_ext.py
++++ Python-2.6.1/Lib/distutils/command/build_ext.py
+@@ -566,7 +566,7 @@ class build_ext (Command):
+             target_lang=language)
+-    def swig_sources (self, sources, extension):
++    def swig_sources (self, sources, extension=None):
+         """Walk the list of source files in 'sources', looking for SWIG
+         interface (.i) files.  Run SWIG on all that are found, and
diff --git a/recipes/python/python-2.6.7/11-distutils-never-modify-shebang-line.patch b/recipes/python/python-2.6.7/11-distutils-never-modify-shebang-line.patch
new file mode 100644 (file)
index 0000000..8354e26
--- /dev/null
@@ -0,0 +1,18 @@
+# Don't modify the she-bang line for a cross-build.
+# Otherwise it points to our hostpython (which we do not want)
+#
+# Signed-Off: Michael 'Mickey' Lauer <mickey@vanille-media.de>
+
+Index: Python-2.6.1/Lib/distutils/command/build_scripts.py
+===================================================================
+--- Python-2.6.1.orig/Lib/distutils/command/build_scripts.py
++++ Python-2.6.1/Lib/distutils/command/build_scripts.py
+@@ -87,7 +87,7 @@ class build_scripts (Command):
+                     continue
+                 match = first_line_re.match(first_line)
+-                if match:
++                if False: #match:
+                     adjust = 1
+                     post_interp = match.group(1) or ''
diff --git a/recipes/python/python-2.6.7/12-distutils-prefix-is-inside-staging-area.patch b/recipes/python/python-2.6.7/12-distutils-prefix-is-inside-staging-area.patch
new file mode 100644 (file)
index 0000000..bf4366f
--- /dev/null
@@ -0,0 +1,60 @@
+# The proper prefix is inside our staging area.
+# Signed-Off: Michael 'Mickey' Lauer <mickey@vanille-media.de>
+
+Index: Python-2.6.6/Lib/distutils/sysconfig.py
+===================================================================
+--- Python-2.6.6.orig/Lib/distutils/sysconfig.py
++++ Python-2.6.6/Lib/distutils/sysconfig.py
+@@ -19,8 +19,8 @@ import sys
+ from distutils.errors import DistutilsPlatformError
+ # These are needed in a couple of spots, so just compute them once.
+-PREFIX = os.path.normpath(sys.prefix)
+-EXEC_PREFIX = os.path.normpath(sys.exec_prefix)
++PREFIX = os.path.normpath(sys.prefix).replace( os.getenv("BUILD_SYS"), os.getenv("HOST_SYS") )
++EXEC_PREFIX = os.path.normpath(sys.exec_prefix).replace( os.getenv("BUILD_SYS"), os.getenv("HOST_SYS") )
+ # Path to the base directory of the project. On Windows the binary may
+ # live in project/PCBuild9.  If we're dealing with an x64 Windows build,
+@@ -70,7 +70,10 @@ def get_python_inc(plat_specific=0, pref
+     sys.exec_prefix -- i.e., ignore 'plat_specific'.
+     """
+     if prefix is None:
+-        prefix = plat_specific and EXEC_PREFIX or PREFIX
++        if plat_specific:
++            prefix = plat_specific and os.environ['STAGING_INCDIR'].rstrip('include')
++        else:
++            prefix = plat_specific and EXEC_PREFIX or PREFIX
+     if os.name == "posix":
+         if python_build:
+@@ -116,7 +119,10 @@ def get_python_lib(plat_specific=0, stan
+     sys.exec_prefix -- i.e., ignore 'plat_specific'.
+     """
+     if prefix is None:
+-        prefix = plat_specific and EXEC_PREFIX or PREFIX
++        if plat_specific:
++            prefix = plat_specific and os.environ['STAGING_LIBDIR'].rstrip('lib')
++        else:
++            prefix = plat_specific and EXEC_PREFIX or PREFIX
+     if os.name == "posix":
+         libpython = os.path.join(prefix,
+@@ -216,7 +222,7 @@ def get_config_h_filename():
+     else:
+         # The name of the config.h file changed in 2.2
+         config_h = 'pyconfig.h'
+-    return os.path.join(inc_dir, config_h)
++    return os.path.join(inc_dir, config_h).replace( os.getenv("BUILD_SYS"), os.getenv("HOST_SYS") )
+ def get_makefile_filename():
+@@ -225,7 +231,7 @@ def get_makefile_filename():
+         return os.path.join(os.path.dirname(os.path.realpath(sys.executable)),
+                             "Makefile")
+     lib_dir = get_python_lib(plat_specific=1, standard_lib=1)
+-    return os.path.join(lib_dir, "config", "Makefile")
++    return os.path.join(lib_dir, "config", "Makefile").replace( os.getenv("BUILD_SYS"), os.getenv("HOST_SYS") )
+ def parse_config_h(fp, g=None):
diff --git a/recipes/python/python-2.6.7/debug.patch b/recipes/python/python-2.6.7/debug.patch
new file mode 100644 (file)
index 0000000..beb3adc
--- /dev/null
@@ -0,0 +1,27 @@
+Index: Python-2.6.1/Lib/distutils/unixccompiler.py
+===================================================================
+--- Python-2.6.1.orig/Lib/distutils/unixccompiler.py   2009-11-13 16:04:54.000000000 +0000
++++ Python-2.6.1/Lib/distutils/unixccompiler.py        2009-11-13 16:06:27.000000000 +0000
+@@ -300,6 +300,8 @@
+         dylib_f = self.library_filename(lib, lib_type='dylib')
+         static_f = self.library_filename(lib, lib_type='static')
++        print "Looking in %s for %s" % (lib, dirs)
++
+         for dir in dirs:
+             shared = os.path.join(dir, shared_f)
+             dylib = os.path.join(dir, dylib_f)
+@@ -309,10 +311,13 @@
+             # assuming that *all* Unix C compilers do.  And of course I'm
+             # ignoring even GCC's "-static" option.  So sue me.
+             if os.path.exists(dylib):
++                print "Found %s" % (dylib)
+                 return dylib
+             elif os.path.exists(shared):
++                print "Found %s" % (shared)
+                 return shared
+             elif os.path.exists(static):
++                print "Found %s" % (static)
+                 return static
+         # Oops, didn't find it in *any* of 'dirs'
diff --git a/recipes/python/python-2.6.7/fix_pthread_site.patch b/recipes/python/python-2.6.7/fix_pthread_site.patch
new file mode 100644 (file)
index 0000000..d392060
--- /dev/null
@@ -0,0 +1,38 @@
+--- configure.in.org   2008-05-01 12:40:58.000000000 +0200
++++ configure.in       2008-05-01 12:39:39.000000000 +0200
+@@ -998,7 +999,7 @@
+ # so we need to run a program to see whether it really made the
+ # function available.
+ AC_MSG_CHECKING(whether $CC accepts -pthread)
+-AC_CACHE_VAL(ac_cv_thread,
++AC_CACHE_VAL(ac_cv_pthread,
+ [ac_save_cc="$CC"
+ CC="$CC -pthread"
+ AC_TRY_RUN([
+@@ -1023,11 +1024,11 @@
+ # If we have set a CC compiler flag for thread support then
+ # check if it works for CXX, too.
+-ac_cv_cxx_thread=no
+ if test ! -z "$CXX"
+ then
+ AC_MSG_CHECKING(whether $CXX also accepts flags for thread support)
+-ac_save_cxx="$CXX"
++AC_CACHE_VAL(ac_cv_cxx_thread,
++[ac_save_cxx="$CXX"
+ if test "$ac_cv_kpthread" = "yes"
+ then
+@@ -1056,9 +1057,11 @@
+   fi
+   rm -fr conftest*
+ fi
++CXX="$ac_save_cxx"])
+ AC_MSG_RESULT($ac_cv_cxx_thread)
++else
++  ac_cv_cxx_thread=no
+ fi
+-CXX="$ac_save_cxx"
+ dnl # check for ANSI or K&R ("traditional") preprocessor
+ dnl AC_MSG_CHECKING(for C preprocessor type)
diff --git a/recipes/python/python-2.6.7/forced_largefile_support.patch b/recipes/python/python-2.6.7/forced_largefile_support.patch
new file mode 100644 (file)
index 0000000..8ac49ee
--- /dev/null
@@ -0,0 +1,22 @@
+--- Python-2.5.1-org/configure.in      2007-03-12 11:50:51.000000000 +0100
++++ Python-2.5.1/configure.in  2007-07-14 01:29:32.000000000 +0200
+@@ -1223,7 +1223,7 @@
+ }],
+ ac_cv_sizeof_off_t=`cat conftestval`,
+ ac_cv_sizeof_off_t=0,
+-ac_cv_sizeof_off_t=4)
++ac_cv_sizeof_off_t=8)
+ ])
+ AC_MSG_RESULT($ac_cv_sizeof_off_t)
+ AC_DEFINE_UNQUOTED(SIZEOF_OFF_T, $ac_cv_sizeof_off_t,
+--- Python-2.6.7-org/configure 2010-05-25 04:27:03.000000000 +0200
++++ Python-2.6.7/configure     2011-09-09 17:58:21.885690578 +0200
+@@ -6938,7 +6938,7 @@
+   $as_echo_n "(cached) " >&6
+ else
+   if test "$cross_compiling" = yes; then :
+-  ac_cv_sizeof_off_t=4
++  ac_cv_sizeof_off_t=8
+ else
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+ /* end confdefs.h.  */
diff --git a/recipes/python/python-2.6.7/ipv6-cross.patch b/recipes/python/python-2.6.7/ipv6-cross.patch
new file mode 100644 (file)
index 0000000..3d2ac5e
--- /dev/null
@@ -0,0 +1,13 @@
+Index: Python-2.6.5/configure.in
+===================================================================
+--- Python-2.6.5.orig/configure.in     2011-01-15 14:42:42.068656002 -0800
++++ Python-2.6.5/configure.in  2011-01-15 15:18:39.668656002 -0800
+@@ -2951,7 +2951,7 @@
+ buggygetaddrinfo=yes
+ ])
+-if test "$buggygetaddrinfo" = "yes"; then
++if test "$buggygetaddrinfo" = "yes" -a x"$cross_compiling" != "xyes"; then
+       if test "$ipv6" = "yes"; then
+               echo 'Fatal: You must get working getaddrinfo() function.'
+               echo '       or you can specify "--disable-ipv6"'.
diff --git a/recipes/python/python-2.6.7/nohostlibs.patch b/recipes/python/python-2.6.7/nohostlibs.patch
new file mode 100644 (file)
index 0000000..cc9b28c
--- /dev/null
@@ -0,0 +1,57 @@
+Index: Python-2.6.6/setup.py
+===================================================================
+--- Python-2.6.6.orig/setup.py
++++ Python-2.6.6/setup.py
+@@ -356,8 +356,8 @@ class PyBuildExt(build_ext):
+     def detect_modules(self):
+         # Ensure that /usr/local is always used
+-        add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib')
+-        add_dir_to_list(self.compiler.include_dirs, '/usr/local/include')
++        #add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib')
++        #add_dir_to_list(self.compiler.include_dirs, '/usr/local/include')
+         # Add paths specified in the environment variables LDFLAGS and
+         # CPPFLAGS for header and library files.
+@@ -393,10 +393,10 @@ class PyBuildExt(build_ext):
+                     for directory in reversed(options.dirs):
+                         add_dir_to_list(dir_list, directory)
+-        if os.path.normpath(sys.prefix) != '/usr':
+-            add_dir_to_list(self.compiler.library_dirs,
++
++        add_dir_to_list(self.compiler.library_dirs,
+                             sysconfig.get_config_var("LIBDIR"))
+-            add_dir_to_list(self.compiler.include_dirs,
++        add_dir_to_list(self.compiler.include_dirs,
+                             sysconfig.get_config_var("INCLUDEDIR"))
+         try:
+@@ -407,11 +407,8 @@ class PyBuildExt(build_ext):
+         # lib_dirs and inc_dirs are used to search for files;
+         # if a file is found in one of those directories, it can
+         # be assumed that no additional -I,-L directives are needed.
+-        lib_dirs = self.compiler.library_dirs + [
+-            '/lib64', '/usr/lib64',
+-            '/lib', '/usr/lib',
+-            ]
+-        inc_dirs = self.compiler.include_dirs + ['/usr/include']
++        lib_dirs = self.compiler.library_dirs
++        inc_dirs = self.compiler.include_dirs
+         exts = []
+         missing = []
+@@ -661,8 +658,7 @@ class PyBuildExt(build_ext):
+                 pass # Issue 7384: Already linked against curses or tinfo.
+             elif curses_library:
+                 readline_libs.append(curses_library)
+-            elif self.compiler.find_library_file(lib_dirs +
+-                                               ['/usr/lib/termcap'],
++            elif self.compiler.find_library_file(lib_dirs,
+                                                'termcap'):
+                 readline_libs.append('termcap')
+             exts.append( Extension('readline', ['readline.c'],
+-                                   library_dirs=['/usr/lib/termcap'],
+                                    extra_link_args=readline_extra_link_args,
+                                    libraries=readline_libs) )
+         else:
diff --git a/recipes/python/python-2.6.7/python-module-rpath-fix.patch b/recipes/python/python-2.6.7/python-module-rpath-fix.patch
new file mode 100644 (file)
index 0000000..a2c8089
--- /dev/null
@@ -0,0 +1,24 @@
+Index: Python-2.6.5/setup.py
+===================================================================
+--- Python-2.6.5.orig/setup.py
++++ Python-2.6.5/setup.py
+@@ -973,13 +973,18 @@ class PyBuildExt(build_ext):
+                 sqlite_extra_link_args = ('-Wl,-search_paths_first',)
+             else:
+                 sqlite_extra_link_args = ()
++          # Check weather we are cross compiling
++            if (os.environ.get('HOST_SYS') != os.environ.get('BUILD_SYS')):
++                runtime_library_dirs_temp=[os.environ.get('libdir')]
++          else:
++              runtime_library_dirs_temp=sqlite_libdir
+             exts.append(Extension('_sqlite3', sqlite_srcs,
+                                   define_macros=sqlite_defines,
+                                   include_dirs=["Modules/_sqlite",
+                                                 sqlite_incdir],
+                                   library_dirs=sqlite_libdir,
+-                                  runtime_library_dirs=sqlite_libdir,
++                                  runtime_library_dirs=runtime_library_dirs_temp,
+                                   extra_link_args=sqlite_extra_link_args,
+                                   libraries=["sqlite3",]))
+         else:
diff --git a/recipes/python/python-2.6.7/sitecustomize.py b/recipes/python/python-2.6.7/sitecustomize.py
new file mode 100644 (file)
index 0000000..2739018
--- /dev/null
@@ -0,0 +1,45 @@
+# OpenEmbedded sitecustomize.py (C) 2002-2008 Michael 'Mickey' Lauer <mlauer@vanille-media.de>
+# GPLv2 or later
+# Version: 20081123
+# Features:
+# * set proper default encoding
+# * enable readline completion in the interactive interpreter
+# * load command line history on startup
+# * save command line history on exit 
+
+import os
+
+def __exithandler():
+    try:
+        readline.write_history_file( "%s/.python-history" % os.getenv( "HOME", "/tmp" ) )
+    except IOError:
+        pass
+
+def __registerExitHandler():
+    import atexit
+    atexit.register( __exithandler )
+
+def __enableReadlineSupport():
+    readline.set_history_length( 1000 )
+    readline.parse_and_bind( "tab: complete" )
+    try:
+        readline.read_history_file( "%s/.python-history" % os.getenv( "HOME", "/tmp" ) )
+    except IOError:
+        pass
+
+def __enableDefaultEncoding():
+    import sys
+    try:
+        sys.setdefaultencoding( "utf8" )
+    except LookupError:
+        pass
+
+import sys
+try:
+    import rlcompleter, readline
+except ImportError:
+    pass
+else:
+    __enableDefaultEncoding()
+    __registerExitHandler()
+    __enableReadlineSupport()
diff --git a/recipes/python/python-2.6.7/some_configure_fixes.patch b/recipes/python/python-2.6.7/some_configure_fixes.patch
new file mode 100644 (file)
index 0000000..eced413
--- /dev/null
@@ -0,0 +1,32 @@
+--- configure.in       2008-02-13 20:17:17.000000000 +0100
++++ configure.in       2008-10-21 22:45:31.000000000 +0200
+@@ -3369,27 +3369,9 @@
+   AC_MSG_RESULT(no)
+ )
+-AC_MSG_CHECKING(for /dev/ptmx)
++AC_CHECK_FILE(/dev/ptmx, AC_DEFINE(HAVE_DEV_PTMX, 1, [Define if we have /dev/ptmx.]))
+-if test -r /dev/ptmx
+-then
+-  AC_MSG_RESULT(yes)
+-  AC_DEFINE(HAVE_DEV_PTMX, 1,
+-  [Define if we have /dev/ptmx.])
+-else
+-  AC_MSG_RESULT(no)
+-fi
+-
+-AC_MSG_CHECKING(for /dev/ptc)
+-
+-if test -r /dev/ptc
+-then
+-  AC_MSG_RESULT(yes)
+-  AC_DEFINE(HAVE_DEV_PTC, 1,
+-  [Define if we have /dev/ptc.])
+-else
+-  AC_MSG_RESULT(no)
+-fi
++AC_CHECK_FILE(/dev/ptc, AC_DEFINE(HAVE_DEV_PTC, 1, [Define if we have /dev/ptc.]))
+ case $MACHDEP in
+ darwin)       
diff --git a/recipes/python/python-2.6.7/strict_aliasing_site.patch b/recipes/python/python-2.6.7/strict_aliasing_site.patch
new file mode 100644 (file)
index 0000000..12eee32
--- /dev/null
@@ -0,0 +1,19 @@
+--- configure.in.org   2008-05-01 12:40:58.000000000 +0200
++++ configure.in       2008-05-01 12:39:39.000000000 +0200
+@@ -796,13 +796,14 @@
+     # pointer types. GCC may generate bad code as a result of that,
+     # so use -fno-strict-aliasing if supported.
+     AC_MSG_CHECKING(whether $CC accepts -fno-strict-aliasing)
+-     ac_save_cc="$CC"
++    AC_CACHE_VAL(ac_cv_no_strict_aliasing_ok,
++    [ac_save_cc="$CC"
+      CC="$CC -fno-strict-aliasing"
+      AC_TRY_RUN([int main() { return 0; }],
+      ac_cv_no_strict_aliasing_ok=yes,
+      ac_cv_no_strict_aliasing_ok=no,
+      ac_cv_no_strict_aliasing_ok=no)
+-     CC="$ac_save_cc"
++     CC="$ac_save_cc"])
+     AC_MSG_RESULT($ac_cv_no_strict_aliasing_ok)
+     if test $ac_cv_no_strict_aliasing_ok = yes
+     then
diff --git a/recipes/python/python-native_2.6.7.bb b/recipes/python/python-native_2.6.7.bb
new file mode 100644 (file)
index 0000000..d249391
--- /dev/null
@@ -0,0 +1,34 @@
+require python.inc
+DEPENDS = "openssl-native bzip2-full-native zlib-native readline-native"
+PR = "${INC_PR}.0"
+
+SRC_URI = "http://www.python.org/ftp/python/${PV}/Python-${PV}.tar.bz2;name=archive \
+           file://00-fix-parallel-make.patch;patch=1 \
+           file://04-default-is-optimized.patch;patch=1 \
+           file://05-enable-ctypes-cross-build.patch;patch=1 \
+           file://06-ctypes-libffi-fix-configure.patch;patch=1 \
+           file://10-distutils-fix-swig-parameter.patch;patch=1 \
+           file://11-distutils-never-modify-shebang-line.patch;patch=1 \
+           file://12-distutils-prefix-is-inside-staging-area.patch;patch=1 \
+           file://debug.patch;patch=1 \
+           file://nohostlibs.patch;patch=1"
+
+S = "${WORKDIR}/Python-${PV}"
+
+inherit native
+
+EXTRA_OECONF_append = '\
+  --enable-unicode=ucs4 \
+'
+
+EXTRA_OEMAKE = '\
+  BUILD_SYS="" \
+  HOST_SYS="" \
+  LIBC="" \
+  STAGING_LIBDIR=${STAGING_LIBDIR_NATIVE} \
+  STAGING_INCDIR=${STAGING_INCDIR_NATIVE} \
+'
+
+do_stage_append() {
+       install -m 0755 Parser/pgen ${STAGING_BINDIR_NATIVE}/pgen
+}
index 8dcd68e..44f3576 100755 (executable)
@@ -51,6 +51,8 @@ TARGET_CC_ARCH_append_armv6 = " -D__SOFTFP__"
 TARGET_CC_ARCH_append_armv7a = " -D__SOFTFP__"
 
 do_configure_prepend() {
+       rm -R ${S}/Lib/plat-linux3 || /bin/true
+       ln -sf ${S}/Lib/plat-linux2 ${S}/Lib/plat-linux3
        autoreconf -Wcross --verbose --install --force --exclude=autopoint Modules/_ctypes/libffi || oenote "_ctypes failed to autoreconf"
 }
 
diff --git a/recipes/python/python_2.6.7.bb b/recipes/python/python_2.6.7.bb
new file mode 100644 (file)
index 0000000..d6f8694
--- /dev/null
@@ -0,0 +1,152 @@
+require python.inc
+DEPENDS = "python-native db gdbm openssl readline sqlite3 tcl zlib\
+           ${@base_contains('DISTRO_FEATURES', 'tk', 'tk', '', d)}"
+DEPENDS_sharprom = "python-native db readline zlib gdbm openssl"
+DEPENDS_opendreambox = "python-native db gdbm openssl readline sqlite3 zlib"
+DEPENDS_vuplus = "python-native db gdbm openssl readline sqlite3 zlib"
+# set to .0 on every increase of INC_PR
+PR = "${INC_PR}.2"
+
+SRC_URI = "\
+  http://www.python.org/ftp/python/${PV}/Python-${PV}.tar.bz2 \
+  file://00-fix-parallel-make.patch;patch=1 \
+  file://01-use-proper-tools-for-cross-build.patch;patch=1 \
+  file://02-remove-test-for-cross.patch;patch=1 \
+  file://03-fix-tkinter-detection.patch;patch=1 \
+  file://04-default-is-optimized.patch;patch=1 \
+  file://05-enable-ctypes-cross-build.patch;patch=1 \
+  file://06-ctypes-libffi-fix-configure.patch;patch=1 \
+  file://ipv6-cross.patch;patch=1 \
+  file://python-module-rpath-fix.patch;patch=1 \
+  file://sitecustomize.py \
+"
+
+SRC_URI_append_opendreambox = " \
+  file://some_configure_fixes.patch;patch=1;pnum=0 \
+  file://strict_aliasing_site.patch;patch=0;pnum=0 \
+  file://fix_pthread_site.patch;patch=0;pnum=0 \
+  file://forced_largefile_support.patch;patch=1;pnum=1"
+SRC_URI_append_vuplus = " \
+  file://some_configure_fixes.patch;patch=1;pnum=0 \
+  file://strict_aliasing_site.patch;patch=0;pnum=0 \
+  file://fix_pthread_site.patch;patch=0;pnum=0 \
+  file://forced_largefile_support.patch;patch=1;pnum=1"
+
+S = "${WORKDIR}/Python-${PV}"
+
+inherit autotools
+
+# The 3 lines below are copied from the libffi recipe, ctypes ships its own copy of the libffi sources
+#Somehow gcc doesn't set __SOFTFP__ when passing -mfloatabi=softp :(
+TARGET_CC_ARCH_append_armv6 = " -D__SOFTFP__"
+TARGET_CC_ARCH_append_armv7a = " -D__SOFTFP__"
+
+do_configure_prepend() {
+       rm -R ${S}/Lib/plat-linux3 || /bin/true
+       ln -sf ${S}/Lib/plat-linux2 ${S}/Lib/plat-linux3
+       autoreconf -Wcross --verbose --install --force --exclude=autopoint Modules/_ctypes/libffi || oenote "_ctypes failed to autoreconf"
+}
+
+#
+# Copy config.h and an appropriate Makefile for distutils.sysconfig,
+# which laters uses the information out of these to compile extensions
+#
+do_compile_prepend() {
+       install -d ${STAGING_INCDIR}/python${PYTHON_MAJMIN}/
+       install -d ${STAGING_LIBDIR}/python${PYTHON_MAJMIN}/config/
+       install -m 0644 pyconfig.h ${STAGING_INCDIR}/python${PYTHON_MAJMIN}/
+       install -m 0644 Makefile Makefile.orig
+       install -m 0644 Makefile Makefile.backup
+       sed -e 's,${includedir},${STAGING_INCDIR},' < Makefile.backup > Makefile
+       install -m 0644 Makefile Makefile.backup
+       sed -e 's,${libdir},${STAGING_LIBDIR},' < Makefile.backup > Makefile
+       install -m 0644 Makefile ${STAGING_LIBDIR}/python${PYTHON_MAJMIN}/config/
+}
+
+do_compile() {
+       oe_runmake HOSTPGEN=${STAGING_BINDIR_NATIVE}/pgen \
+               HOSTPYTHON=${STAGING_BINDIR_NATIVE}/python \
+               STAGING_LIBDIR=${STAGING_LIBDIR} \
+               STAGING_INCDIR=${STAGING_INCDIR} \
+               BUILD_SYS=${BUILD_SYS} HOST_SYS=${HOST_SYS} \
+               OPT="${CFLAGS}" libpython${PYTHON_MAJMIN}.so
+
+       oe_libinstall -so libpython${PYTHON_MAJMIN} ${STAGING_LIBDIR}
+
+       oe_runmake HOSTPGEN=${STAGING_BINDIR_NATIVE}/pgen \
+               HOSTPYTHON=${STAGING_BINDIR_NATIVE}/python \
+               STAGING_LIBDIR=${STAGING_LIBDIR} \
+               STAGING_INCDIR=${STAGING_INCDIR} \
+               BUILD_SYS=${BUILD_SYS} HOST_SYS=${HOST_SYS} \
+               RUNSHARED= OPT="${CFLAGS}"
+}
+
+do_stage() {
+       install -m 0644 Include/*.h ${STAGING_INCDIR}/python${PYTHON_MAJMIN}/
+       oe_libinstall -a -so libpython${PYTHON_MAJMIN} ${STAGING_LIBDIR}
+}
+
+do_install() {
+       install -m 0644 Makefile.orig Makefile
+       
+       oe_runmake HOSTPGEN=${STAGING_BINDIR_NATIVE}/pgen \
+               HOSTPYTHON=${STAGING_BINDIR_NATIVE}/python \
+               STAGING_LIBDIR=${STAGING_LIBDIR} \
+               STAGING_INCDIR=${STAGING_INCDIR} \
+               BUILD_SYS=${BUILD_SYS} HOST_SYS=${HOST_SYS} \
+               DESTDIR=${D} LIBDIR=${libdir} RUNSHARED= install
+
+       install -m 0644 ${WORKDIR}/sitecustomize.py ${D}/${libdir}/python${PYTHON_MAJMIN}
+
+       # remove hardcoded ccache, see http://bugs.openembedded.net/show_bug.cgi?id=4144
+       sed -i -e s,ccache,'$(CCACHE)', ${D}/${libdir}/python${PYTHON_MAJMIN}/config/Makefile
+}
+
+do_install_append() {
+       # remove unecessary files from python-distutils' packages
+       rm ${D}/${libdir}/python${PYTHON_MAJMIN}/config/libpython2.6.a
+       rm ${D}/${libdir}/python${PYTHON_MAJMIN}/distutils/command/win*
+}
+
+require python-${PYTHON_MAJMIN}-manifest.inc
+
+# manual dependency additions
+RPROVIDES_python-core = "python"
+RRECOMMENDS_python-core = "python-readline"
+RRECOMMENDS_python-crypt = "openssl"
+
+# add sitecustomize
+FILES_python-core += "${libdir}/python${PYTHON_MAJMIN}/sitecustomize.py"
+# ship 2to3
+FILES_python-core += "${bindir}/2to3"
+
+# package libpython2
+PACKAGES =+ "libpython2"
+FILES_libpython2 = "${libdir}/libpython*.so*"
+
+# additional stuff -dev
+
+FILES_${PN}-dev = "\
+  ${includedir} \
+  ${libdir}/lib*${SOLIBSDEV} \
+  ${libdir}/*.la \
+  ${libdir}/*.a \
+  ${libdir}/*.o \
+  ${libdir}/pkgconfig \
+  ${base_libdir}/*.a \
+  ${base_libdir}/*.o \
+  ${datadir}/aclocal \
+  ${datadir}/pkgconfig \
+"
+
+# catch debug extensions (isn't that already in python-core-dbg?)
+FILES_python-dbg += "${libdir}/python${PYTHON_MAJMIN}/lib-dynload/.debug"
+
+# catch all the rest (unsorted)
+PACKAGES += "python-misc"
+FILES_python-misc = "${libdir}/python${PYTHON_MAJMIN}"
+RDEPENDS_python-misc += "python-shell"
+
+# catch manpage
+PACKAGES += "python-man"
+FILES_python-man = "${datadir}/man"
diff --git a/recipes/qt4/files/0001-wsegl2-support.patch b/recipes/qt4/files/0001-wsegl2-support.patch
new file mode 100644 (file)
index 0000000..ad61fe7
--- /dev/null
@@ -0,0 +1,997 @@
+diff -Nurp qt-everywhere-opensource-src-4.6.3-orig//src/3rdparty/powervr/wsegl2/pvr2d.h qt-everywhere-opensource-src-4.6.3/src/3rdparty/powervr/wsegl2/pvr2d.h
+--- qt-everywhere-opensource-src-4.6.3-orig//src/3rdparty/powervr/wsegl2/pvr2d.h       1970-01-01 00:00:00.000000000 +0000
++++ qt-everywhere-opensource-src-4.6.3/src/3rdparty/powervr/wsegl2/pvr2d.h     2011-05-16 22:51:43.158564336 +0000
+@@ -0,0 +1,669 @@
++/**********************************************************************
++*
++* Copyright(c) Imagination Technologies Ltd.
++*
++* The contents of this file are subject to the MIT license as set out below.
++*
++* Permission is hereby granted, free of charge, to any person obtaining a copy
++* of this software and associated documentation files (the "Software"),
++* to deal in the Software without restriction, including without limitation
++* the rights to use, copy, modify, merge, publish, distribute, sublicense,
++* and/or sell copies of the Software, and to permit persons to whom the
++* Software is furnished to do so, subject to the following conditions:
++* 
++* The above copyright notice and this permission notice shall be included
++* in all copies or substantial portions of the Software.
++*
++* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
++* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
++* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
++* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
++* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT
++* OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
++* OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
++* 
++* This License is also included in this distribution in the file called 
++* "COPYING".
++* 
++******************************************************************************/
++
++
++
++/******************************************************************************
++Modifications :-
++$Log: pvr2d.h $
++
++ --- Revision Logs Removed --- 
++******************************************************************************/
++
++#ifndef _PVR2D_H_
++#define _PVR2D_H_
++
++#ifdef __cplusplus
++extern "C" {
++#endif 
++
++/* PVR2D Platform-specific definitions */
++#if defined (__linux__)
++#define PVR2D_EXPORT __attribute__((visibility("default")))
++#define PVR2D_IMPORT
++#else
++#define PVR2D_EXPORT
++#define PVR2D_IMPORT
++#endif
++
++/* PVR2D header revision */
++#define PVR2D_REV_MAJOR               3
++#define PVR2D_REV_MINOR               5
++
++/* Basic types */
++typedef enum
++{
++      PVR2D_FALSE = 0,
++      PVR2D_TRUE
++} PVR2D_BOOL;
++
++typedef void* PVR2D_HANDLE;
++
++typedef char             PVR2D_CHAR,  *PVR2D_PCHAR;
++typedef unsigned char    PVR2D_UCHAR, *PVR2D_PUCHAR;
++typedef int              PVR2D_INT,           *PVR2D_PINT;
++typedef unsigned int     PVR2D_UINT,  *PVR2D_PUINT;
++typedef long             PVR2D_LONG,  *PVR2D_PLONG;
++typedef unsigned long    PVR2D_ULONG, *PVR2D_PULONG;
++
++typedef void             PVR2D_VOID,  *PVR2D_PVOID;
++
++
++/* error codes */
++typedef enum
++{
++      PVR2D_OK = 0,
++      PVR2DERROR_INVALID_PARAMETER = -1,
++      PVR2DERROR_DEVICE_UNAVAILABLE = -2,
++      PVR2DERROR_INVALID_CONTEXT = -3,
++      PVR2DERROR_MEMORY_UNAVAILABLE = -4,
++      PVR2DERROR_DEVICE_NOT_PRESENT = -5,
++      PVR2DERROR_IOCTL_ERROR = -6,
++      PVR2DERROR_GENERIC_ERROR = -7,
++      PVR2DERROR_BLT_NOTCOMPLETE = -8,
++      PVR2DERROR_HW_FEATURE_NOT_SUPPORTED = -9,
++      PVR2DERROR_NOT_YET_IMPLEMENTED = -10,
++      PVR2DERROR_MAPPING_FAILED = -11
++}PVR2DERROR;
++
++/* 32 bit PVR2D pixel format specifier */
++typedef unsigned long PVR2DFORMAT;
++
++/* Standard PVR2D pixel formats */
++#define       PVR2D_1BPP                                              0x00UL // 1bpp mask surface or palletized 1 bit source with 2x32 bit CLUT
++#define       PVR2D_RGB565                                    0x01UL // Common rgb 565 format
++#define       PVR2D_ARGB4444                                  0x02UL // Common argb 4444 format
++#define       PVR2D_RGB888                                    0x03UL // Common rgb 888 format (not supported)
++#define       PVR2D_ARGB8888                                  0x04UL // Common argb 8888 format
++#define       PVR2D_ARGB1555                                  0x05UL // Common argb 1555 format
++#define       PVR2D_ALPHA8                                    0x06UL // Alpha-only 8 bit per pixel (used with a constant fill colour)
++#define       PVR2D_ALPHA4                                    0x07UL // Alpha-only 4 bits per pixel (used with a constant fill colour)
++#define       PVR2D_PAL2                                              0x08UL // Palletized 2 bit format (requires   4x32 bit CLUT)
++#define       PVR2D_PAL4                                              0x09UL // Palletized 4 bit format (requires  16x32 bit CLUT)
++#define       PVR2D_PAL8                                              0x0AUL // Palletized 8 bit format (requires 256x32 bit CLUT)
++#define PVR2D_U8                                              0x10UL // monochrome unsigned 8 bit
++#define PVR2D_U88                                             0x11UL // monochrome unsigned 16 bit
++#define PVR2D_S8                                              0x12UL // signed 8 bit
++#define PVR2D_YUV422_YUYV                             0x13UL // YUV 422 low-high byte order Y0UY1V
++#define PVR2D_YUV422_UYVY                             0x14UL // YUV 422 low-high byte order UY0VY1
++#define PVR2D_YUV422_YVYU                             0x15UL // YUV 422 low-high byte order Y0VY1U
++#define PVR2D_YUV422_VYUY                             0x16UL // YUV 422 low-high byte order VY0UY1
++#define PVR2D_YUV420_2PLANE                           0x17UL // YUV420 2 Plane
++#define PVR2D_YUV420_3PLANE                           0x18UL // YUV420 3 Plane
++#define PVR2D_2101010ARGB                             0x19UL // 32 bit 2 10 10 10 
++#define PVR2D_888RSGSBS                                       0x1AUL
++#define PVR2D_16BPP_RAW                                       0x1BUL // 16 bit raw (no format conversion)
++#define PVR2D_32BPP_RAW                                       0x1CUL // 32 bit raw
++#define PVR2D_64BPP_RAW                                       0x1DUL // 64 bit raw
++#define PVR2D_128BPP_RAW                              0x1EUL // 128 bit raw
++
++#define       PVR2D_NO_OF_FORMATS                             0x1FUL
++
++/* Format modifier bit field (DstFormat and SrcFormat bits 16..23) */
++#define PVR2D_FORMAT_MASK                             0x0000FFFFUL    // PVR2D Format bits
++#define PVR2D_FORMAT_LAYOUT_MASK              0x000F0000UL    // Format layout (strided / twiddled / tiled)
++#define PVR2D_FORMAT_FLAGS_MASK                       0x0FF00000UL    // Surface Flags mask
++
++/* Layout */
++#define PVR2D_FORMAT_LAYOUT_SHIFT             16
++#define PVR2D_FORMAT_LAYOUT_STRIDED           0x00000000UL
++#define PVR2D_FORMAT_LAYOUT_TILED             0x00010000UL
++#define PVR2D_FORMAT_LAYOUT_TWIDDLED  0x00020000UL
++
++/*
++      PVR2D_SURFACE_PDUMP
++      This flag requests a surface pdump, to capture the pixel state after host writes.
++      Not needed if the surface state has resulted from previous SGX 2D/3D core writes.
++*/
++#define PVR2D_SURFACE_PDUMP                           0x00100000UL    // calls PVRSRVPDumpMem to capture the surface (pdump builds only) 
++
++/*
++      Low level 3D format extension - for blts via the 3D core only.
++      If the top bit of the format field is set then PVR2D reads it as a PVRSRV_PIXEL_FORMAT.
++      The outcome is hardware dependant.
++      There is no guarantee that any specific PVRSRV format will be supported.
++*/
++#define PVR2D_FORMAT_PVRSRV                           0x80000000
++
++/* wrap surface type */
++typedef enum
++{
++      PVR2D_WRAPFLAG_NONCONTIGUOUS = 0,
++      PVR2D_WRAPFLAG_CONTIGUOUS = 1,
++
++}PVR2DWRAPFLAGS;
++
++#define       PVR2D_CONTEXT_FLAGS_PRIORITY_MASK                       0x00000003
++
++#define       PVR2D_CONTEXT_FLAGS_LOW_PRIORITY_CONTEXT        1
++#define       PVR2D_CONTEXT_FLAGS_NORMAL_PRIORITY_CONTEXT     0
++#define       PVR2D_CONTEXT_FLAGS_HIGH_PRIORITY_CONTEXT       2
++
++/* flags for control information of additional blits */
++typedef enum
++{
++      PVR2D_BLIT_DISABLE_ALL                                  = 0x00000000,   /* disable all additional controls */
++      PVR2D_BLIT_CK_ENABLE                                    = 0x00000001,   /* enable colour key */
++      PVR2D_BLIT_GLOBAL_ALPHA_ENABLE                  = 0x00000002,   /* enable standard global alpha */
++      PVR2D_BLIT_PERPIXEL_ALPHABLEND_ENABLE   = 0x00000004,   /* enable per-pixel alpha bleding */
++      PVR2D_BLIT_PAT_SURFACE_ENABLE                   = 0x00000008,   /* enable pattern surf (disable fill) */
++      PVR2D_BLIT_FULLY_SPECIFIED_ALPHA_ENABLE = 0x00000010,   /* enable fully specified alpha */
++      PVR2D_BLIT_ROT_90                                               = 0x00000020,   /* apply 90 degree rotation to the blt */
++      PVR2D_BLIT_ROT_180                                              = 0x00000040,   /* apply 180 degree rotation to the blt */
++      PVR2D_BLIT_ROT_270                                              = 0x00000080,   /* apply 270 degree rotation to the blt */
++      PVR2D_BLIT_COPYORDER_TL2BR                              = 0x00000100,   /* copy order overrides */
++      PVR2D_BLIT_COPYORDER_BR2TL                              = 0x00000200,
++      PVR2D_BLIT_COPYORDER_TR2BL                              = 0x00000400,
++      PVR2D_BLIT_COPYORDER_BL2TR                              = 0x00000800,
++      PVR2D_BLIT_COLKEY_SOURCE                                = 0x00001000,   /* Key colour is on the source surface */
++      PVR2D_BLIT_COLKEY_DEST                                  = 0x00002000,   /* Key colour is on the destination surface */
++      PVR2D_BLIT_COLKEY_MASKED                                = 0x00004000,   /* Mask enabled for colour key */
++      PVR2D_BLIT_COLKEY_OP_PASS                               = 0x00008000,   /* Colour key op = pass */
++      PVR2D_BLIT_COLKEY_OP_REJECT                             = 0x00010000,   /* Colour key op = reject */
++      PVR2D_BLIT_PATH_2DCORE                                  = 0x00100000,   /* Blt via dedicated 2D Core or PTLA */
++      PVR2D_BLIT_PATH_3DCORE                                  = 0x00200000,   /* Blt via 3D Core */
++      PVR2D_BLIT_PATH_SWBLT                                   = 0x00400000,   /* Blt via host software */
++      PVR2D_BLIT_NO_SRC_SYNC_INFO                             = 0x00800000,   /* Dont send a source sync info*/
++      PVR2D_BLIT_ISSUE_STATUS_UPDATES                 = 0x01000000,   /* Issue status updates */
++
++} PVR2DBLITFLAGS;
++
++/* standard alpha-blending functions, AlphaBlendingFunc field of PVR2DBLTINFO */
++typedef enum
++{
++      PVR2D_ALPHA_OP_SRC_DSTINV = 1,  /* source alpha : Cdst = Csrc*Asrc + Cdst*(1-Asrc) */
++      PVR2D_ALPHA_OP_SRCP_DSTINV = 2  /* premultiplied source alpha : Cdst = Csrc + Cdst*(1-Asrc) */
++} PVR2D_ALPHABLENDFUNC;
++
++/* blend ops for fully specified alpha (SGX 2D Core only) */
++typedef enum
++{
++      PVR2D_BLEND_OP_ZERO = 0,
++      PVR2D_BLEND_OP_ONE = 1,
++      PVR2D_BLEND_OP_SRC = 2,
++      PVR2D_BLEND_OP_DST = 3,
++      PVR2D_BLEND_OP_GLOBAL = 4,
++      PVR2D_BLEND_OP_SRC_PLUS_GLOBAL = 5,
++      PVR2D_BLEND_OP_DST_PLUS_GLOBAL = 6
++}PVR2D_BLEND_OP;
++
++/* SGX 2D Core Fully specified alpha blend :  pAlpha field of PVR2DBLTINFO structure          */
++/* a fully specified Alpha Blend operation is defined as                                                                      */
++/* DST (ALPHA) = (ALPHA_1 * SRC (ALPHA)) + (ALPHA_3 * DST (ALPHA))                                                    */
++/* DST (RGB)   = (ALPHA_2 * SRC (RGB)) + (ALPHA_4 * DST (RGB))                                                                */
++/* if the pre-multiplication stage is enabled then the equations become the following:                */
++/* PRE_MUL     = ((SRC(A)) * (Global Alpha Value))                                                                                    */
++/* DST (ALPHA) = (ALPHA_1 * SRC (ALPHA)) + (PRE_MUL * DST (ALPHA))                                                    */
++/* DST (RGB)   = (ALPHA_2 * SRC (RGB)) + (PRE_MUL * DST (RGB))                                                                */
++/* if the transparent source alpha stage is enabled then a source alpha of zero forces the    */
++/* source to be transparent for that pixel regardless of the blend equation being used.               */
++typedef struct _PVR2D_ALPHABLT
++{
++      PVR2D_BLEND_OP  eAlpha1;
++      PVR2D_BOOL              bAlpha1Invert;
++      PVR2D_BLEND_OP  eAlpha2;
++      PVR2D_BOOL              bAlpha2Invert;
++      PVR2D_BLEND_OP  eAlpha3;
++      PVR2D_BOOL              bAlpha3Invert;
++      PVR2D_BLEND_OP  eAlpha4;
++      PVR2D_BOOL              bAlpha4Invert;
++      PVR2D_BOOL              bPremulAlpha;                   /* enable pre-multiplication stage */
++      PVR2D_BOOL              bTransAlpha;                    /* enable transparent source alpha stage */
++      PVR2D_BOOL              bUpdateAlphaLookup;             /* enable and update the 1555-Lookup alpha table */
++      PVR2D_UCHAR             uAlphaLookup0;                  /* 8 bit alpha when A=0 in a 1555-Lookup surface */
++      PVR2D_UCHAR             uAlphaLookup1;                  /* 8 bit alpha when A=1 in a 1555-Lookup surface */
++      PVR2D_UCHAR             uGlobalRGB;                             /* Global Alpha Value for RGB, 0=transparent 255=opaque */
++      PVR2D_UCHAR             uGlobalA;                               /* Global Alpha Value for Alpha */
++
++} PVR2D_ALPHABLT, *PPVR2D_ALPHABLT;
++
++
++/* surface memory info structure */
++typedef struct _PVR2DMEMINFO
++{
++      PVR2D_VOID                      *pBase;
++      PVR2D_ULONG                     ui32MemSize;
++      PVR2D_ULONG                     ui32DevAddr;
++      PVR2D_ULONG                     ulFlags;
++      PVR2D_VOID                      *hPrivateData;
++      PVR2D_VOID                      *hPrivateMapData;
++
++}PVR2DMEMINFO, *PPVR2DMEMINFO;
++
++
++#define PVR2D_MAX_DEVICE_NAME 20
++
++typedef struct _PVR2DDEVICEINFO
++{
++      PVR2D_ULONG             ulDevID;
++      PVR2D_CHAR              szDeviceName[PVR2D_MAX_DEVICE_NAME];
++}PVR2DDEVICEINFO;
++
++
++typedef struct _PVR2DISPLAYINFO
++{
++      PVR2D_ULONG     ulMaxFlipChains;
++      PVR2D_ULONG     ulMaxBuffersInChain;
++      PVR2DFORMAT     eFormat;
++      PVR2D_ULONG     ulWidth;
++      PVR2D_ULONG     ulHeight;
++      PVR2D_LONG      lStride;
++      PVR2D_ULONG     ulMinFlipInterval;
++      PVR2D_ULONG     ulMaxFlipInterval;
++
++}PVR2DDISPLAYINFO;
++
++
++typedef struct _PVR2MISCDISPLAYINFO
++{
++      PVR2D_ULONG ulPhysicalWidthmm;
++      PVR2D_ULONG ulPhysicalHeightmm;
++      PVR2D_ULONG ulUnused[10];
++
++}PVR2DMISCDISPLAYINFO;
++
++
++typedef struct _PVR2DBLTINFO
++{
++      PVR2D_ULONG             CopyCode;                       /* rop code  */
++      PVR2D_ULONG             Colour;                         /* fill colour */
++      PVR2D_ULONG             ColourKey;                      /* colour key argb8888 (see CKEY_ defs below) */
++      PVR2D_UCHAR             GlobalAlphaValue;       /* global alpha blending */
++      PVR2D_UCHAR             AlphaBlendingFunc;      /* per-pixel alpha-blending function */
++
++      PVR2DBLITFLAGS  BlitFlags;                      /* additional blit control information */
++
++      PVR2DMEMINFO    *pDstMemInfo;           /* destination memory */
++      PVR2D_ULONG             DstOffset;                      /* byte offset from start of allocation to destination surface pixel 0,0 */
++      PVR2D_LONG              DstStride;                      /* signed stride, the number of bytes from pixel 0,0 to 0,1 */
++      PVR2D_LONG              DstX, DstY;                     /* pixel offset from start of dest surface to start of blt rectangle */
++      PVR2D_LONG              DSizeX,DSizeY;          /* blt size */
++      PVR2DFORMAT             DstFormat;                      /* dest format */
++      PVR2D_ULONG             DstSurfWidth;           /* size of dest surface in pixels */
++      PVR2D_ULONG             DstSurfHeight;          /* size of dest surface in pixels */
++
++      PVR2DMEMINFO    *pSrcMemInfo;           /* source mem, (source fields are also used for patterns) */
++      PVR2D_ULONG             SrcOffset;                      /* byte offset from start of allocation to src/pat surface pixel 0,0 */
++      PVR2D_LONG              SrcStride;                      /* signed stride, the number of bytes from pixel 0,0 to 0,1 */
++      PVR2D_LONG              SrcX, SrcY;                     /* pixel offset from start of surface to start of source rectangle */
++                                                                              /* for patterns this is the start offset within the pattern */
++      PVR2D_LONG              SizeX,SizeY;            /* source rectangle size or pattern size in pixels */
++      PVR2DFORMAT             SrcFormat;                      /* source/pattern format */
++      PVR2DMEMINFO    *pPalMemInfo;           /* source/pattern palette memory containing argb8888 colour table */
++      PVR2D_ULONG             PalOffset;                      /* byte offset from start of allocation to start of palette */
++      PVR2D_ULONG             SrcSurfWidth;           /* size of source surface in pixels */
++      PVR2D_ULONG             SrcSurfHeight;          /* size of source surface in pixels */
++
++      PVR2DMEMINFO    *pMaskMemInfo;          /* mask memory, 1bpp format implied */
++      PVR2D_ULONG             MaskOffset;                     /* byte offset from start of allocation to mask surface pixel 0,0 */
++      PVR2D_LONG              MaskStride;                     /* signed stride, the number of bytes from pixel 0,0 to 0,1 */
++      PVR2D_LONG              MaskX, MaskY;           /* mask rect top left (mask size = blt size) */
++      PVR2D_ULONG             MaskSurfWidth;          /* size of mask surface in pixels */
++      PVR2D_ULONG             MaskSurfHeight;         /* size of mask surface in pixels */
++      
++      PPVR2D_ALPHABLT pAlpha;                         /* fully specified alpha blend (2DCore only) */
++      
++      PVR2D_ULONG             uSrcChromaPlane1;       /* mem offset from start of source alloc to chroma plane 1 */
++      PVR2D_ULONG             uSrcChromaPlane2;       /* mem offset from start of source alloc to chroma plane 2 */
++      PVR2D_ULONG             uDstChromaPlane1;       /* mem offset from start of dest alloc to chroma plane 1 */
++      PVR2D_ULONG             uDstChromaPlane2;       /* mem offset from start of dest alloc to chroma plane 2 */
++      
++      PVR2D_ULONG             ColourKeyMask;          /* 32 bit colour key mask, only valid when PVR2D_BLIT_COLKEY_MASKED is set */
++
++}PVR2DBLTINFO, *PPVR2DBLTINFO;
++
++typedef struct _PVR2DRECT
++{
++      PVR2D_LONG left, top;
++      PVR2D_LONG right, bottom;
++} PVR2DRECT;
++
++typedef struct
++{
++      PVR2DMEMINFO    *pSurfMemInfo;          /* surface memory */
++      PVR2D_ULONG             SurfOffset;                     /* byte offset from start of allocation to destination surface pixel 0,0 */
++      PVR2D_LONG              Stride;                         /* signed stride */
++      PVR2DFORMAT             Format;                         /* format */
++      PVR2D_ULONG             SurfWidth;                      /* surface width in pixels */
++      PVR2D_ULONG             SurfHeight;                     /* surface height in pixels */
++
++} PVR2D_SURFACE, *PPVR2D_SURFACE;
++
++typedef struct
++{
++      PVR2D_ULONG             uChromaPlane1;          /* YUV multiplane - byte offset from start of alloc to chroma plane 1 */
++      PVR2D_ULONG             uChromaPlane2;          /* YUV multiplane - byte offset from start of alloc to chroma plane 2 */
++      PVR2D_LONG              Reserved[2];            /* Reserved, must be zero */
++
++} PVR2D_SURFACE_EXT, *PPVR2D_SURFACE_EXT;
++
++typedef struct
++{
++      PVR2D_ULONG             *pUseCode;                                      /* USSE code */
++      PVR2D_ULONG             UseCodeSize;                            /* usse code size in bytes */
++
++} PVR2D_USECODE, *PPVR2D_USECODE;
++
++typedef struct
++{
++      PVR2D_SURFACE                   sDst;                           /* destination surface */
++      PVR2D_SURFACE                   sSrc;                           /* source surface */
++      PVR2DRECT                               rcDest;                         /* destination rectangle */
++      PVR2DRECT                               rcSource;                       /* source rectangle */
++      PVR2D_HANDLE                    hUseCode;                       /* custom USE code (NULL implies source copy) */
++      PVR2D_ULONG                             UseParams[2];           /* per-blt params for use code */
++
++} PVR2D_3DBLT, *PPVR2D_3DBLT;
++
++typedef struct
++{
++      PVR2D_SURFACE                   sDst;                                           /* destination surface */
++      PVR2DRECT                               rcDest;                                         /* destination rectangle; scaling is supported */
++      PVR2D_SURFACE                   sSrc;                                           /* source surface */
++      PVR2DRECT                               rcSource;                                       /* source rectangle; scaling is supported */
++      PPVR2D_SURFACE                  pSrc2;                                          /* optional second source surface (NULL if not required) */
++      PVR2DRECT*                              prcSource2;                                     /* optional pSrc2 rectangle */
++      PVR2D_HANDLE                    hUseCode;                                       /* custom USSE shader code (NULL implies default source copy) */
++      PVR2D_ULONG                             UseParams[2];                           /* per-blt params for usse code */
++      PVR2D_ULONG                             uiNumTemporaryRegisters;        /* no. of temporary registers used in custom shader code */
++      PVR2D_BOOL                              bDisableDestInput;                      /* set true if the destination is output only */
++      PPVR2D_SURFACE_EXT              pDstExt;                                        /* Extended format params for dest */
++      PPVR2D_SURFACE_EXT              pSrcExt[2];                                     /* Extended format params for source 1 and 2 */
++      PVR2D_LONG                              Reserved[4];                            /* Reserved, must be zero */
++
++} PVR2D_3DBLT_EXT, *PPVR2D_3DBLT_EXT;
++
++
++#define MAKE_COPY_BLIT(src,soff,dest,doff,sx,sy,dx,dy,sz)
++
++typedef void* PVR2DCONTEXTHANDLE;
++typedef void* PVR2DFLIPCHAINHANDLE;
++
++
++// CopyCode field of PVR2DBLTINFO structure:
++// the CopyCode field of the PVR2DBLTINFO structure should contain a rop3 or rop4 code.
++// a rop3 is an 8 bit code that describes a blt with three inputs : source dest and pattern
++// rop4 is a 16 bit code that describes a blt with four inputs : source dest pattern and mask
++// common rop3 codes are defined below
++// a colour fill blt is processed in the pattern channel as a constant colour with a rop code of 0xF0
++// PVR2D_BLIT_PAT_SURFACE_ENABLE defines whether the pattern channel is a surface or a fill colour.
++// a rop4 is defined by two rop3 codes, and the 1 bit-per-pixel mask surface defines which is used.
++// a common rop4 is 0xAAF0 which is the mask copy blt used for text glyphs.
++// CopyCode is taken to be a rop4 when pMaskMemInfo is non zero, otherwise it is assumed to be a rop3
++// use the PVR2DMASKROP4 macro below to construct a rop4 from two rop3's
++// rop3a is the rop used when mask pixel = 1, and rop3b when mask = 0
++#define PVR2DROP4(rop3b, rop3a)                       ((rop3b<<8)|rop3a)
++
++/* common rop codes */
++#define PVR2DROPclear                         0x00       /* 0 (whiteness) */
++#define PVR2DROPset                                   0xFF       /* 1 (blackness) */
++#define PVR2DROPnoop                          0xAA       /* dst (used for masked blts) */
++
++/* source and  dest rop codes */
++#define PVR2DROPand                                   0x88       /* src AND dst */
++#define PVR2DROPandReverse                    0x44       /* src AND NOT dst */
++#define PVR2DROPcopy                          0xCC       /* src (used for source copy and alpha blts) */
++#define PVR2DROPandInverted                   0x22       /* NOT src AND dst */
++#define PVR2DROPxor                                   0x66       /* src XOR dst */
++#define PVR2DROPor                                    0xEE       /* src OR dst */
++#define PVR2DROPnor                                   0x11       /* NOT src AND NOT dst */
++#define PVR2DROPequiv                         0x99       /* NOT src XOR dst */
++#define PVR2DROPinvert                                0x55       /* NOT dst */
++#define PVR2DROPorReverse                     0xDD       /* src OR NOT dst */
++#define PVR2DROPcopyInverted          0x33       /* NOT src */
++#define PVR2DROPorInverted                    0xBB       /* NOT src OR dst */
++#define PVR2DROPnand                          0x77       /* NOT src OR NOT dst */
++
++/* pattern rop codes */
++#define PVR2DPATROPand                                0xA0       /* pat AND dst */
++#define PVR2DPATROPandReverse         0x50       /* pat AND NOT dst */
++#define PVR2DPATROPcopy                               0xF0       /* pat (used for solid color fills and pattern blts) */
++#define PVR2DPATROPandInverted                0x0A       /* NOT pat AND dst */
++#define PVR2DPATROPxor                                0x5A       /* pat XOR dst */
++#define PVR2DPATROPor                         0xFA       /* pat OR dst */
++#define PVR2DPATROPnor                                0x05       /* NOT pat AND NOT dst */
++#define PVR2DPATROPequiv                      0xA5       /* NOT pat XOR dst */
++#define PVR2DPATROPinvert                     0x55       /* NOT dst */
++#define PVR2DPATROPorReverse          0xF5       /* pat OR NOT dst */
++#define PVR2DPATROPcopyInverted               0x0F       /* NOT pat */
++#define PVR2DPATROPorInverted         0xAF       /* NOT pat OR dst */
++#define PVR2DPATROPnand                               0x5F       /* NOT pat OR NOT dst */
++
++/* common rop4 codes */
++#define PVR2DROP4MaskedCopy              PVR2DROP4(PVR2DROPnoop,PVR2DROPcopy)         /* masked source copy blt (used for rounded window corners etc) */
++#define PVR2DROP4MaskedFill              PVR2DROP4(PVR2DROPnoop,PVR2DPATROPcopy)      /* masked colour fill blt (used for text) */
++
++/* Legacy support */
++#define PVR2DROP3_PATMASK                     PVR2DPATROPcopy
++#define PVR2DROP3_SRCMASK                     PVR2DROPcopy
++
++/* pixmap memory alignment */
++#define PVR2D_ALIGNMENT_4                     4                       /* DWORD alignment */
++#define PVR2D_ALIGNMENT_ANY                   0                       /* no alignment    */
++#define PVR2D_ALIGNMENT_PALETTE               16                      /* 16 byte alignment is required for palettes */
++
++/* Heap number for PVR2DGetFrameBuffer */
++#define PVR2D_FB_PRIMARY_SURFACE 0
++
++#define PVR2D_PRESENT_PROPERTY_SRCSTRIDE      (1UL << 0)
++#define PVR2D_PRESENT_PROPERTY_DSTSIZE                (1UL << 1)
++#define PVR2D_PRESENT_PROPERTY_DSTPOS         (1UL << 2)
++#define PVR2D_PRESENT_PROPERTY_CLIPRECTS      (1UL << 3)
++#define PVR2D_PRESENT_PROPERTY_INTERVAL               (1UL << 4)
++
++#define PVR2D_CREATE_FLIPCHAIN_SHARED         (1UL << 0)
++#define PVR2D_CREATE_FLIPCHAIN_QUERY          (1UL << 1)
++#define PVR2D_CREATE_FLIPCHAIN_OEMOVERLAY   (1UL << 2)
++#define PVR2D_CREATE_FLIPCHAIN_AS_BLITCHAIN (1UL << 3)
++
++/* Colour-key colour must be translated into argb8888 format */
++#define CKEY_8888(P)          (P)
++#define CKEY_4444(P)          (((P&0xF000UL)<<16) | ((P&0x0F00UL)<<12) | ((P&0x00F0UL)<<8) | ((P&0x000FUL)<<4))
++#define CKEY_1555(P)          (((P&0x8000UL)<<16) | ((P&0x7C00UL)<<9)  | ((P&0x3E0UL)<<6)  | ((P&0x1FUL)<<3))
++#define CKEY_565(P)                   (((P&0xF800UL)<<8)  | ((P&0x7E0UL)<<5)   | ((P&0x1FUL)<<3))
++#define CKEY_MASK_8888                0x00FFFFFFUL
++#define CKEY_MASK_4444                0x00F0F0F0UL
++#define CKEY_MASK_1555                0x00F8F8F8UL    /* Alpha is not normally included in the key test */
++#define CKEY_MASK_565         0x00F8FCF8UL
++
++/* Fill colours must be translated into argb8888 format */
++#define CFILL_4444(P)         (((P&0xF000UL)<<16) | ((P&0x0F00UL)<<12) | ((P&0x00F0UL)<<8) | ((P&0x000FUL)<<4))
++#define CFILL_1555(P)         (((P&0x8000UL)<<16) | ((P&0x7C00UL)<<9)  | ((P&0x3E0UL)<<6)  | ((P&0x1FUL)<<3))
++#define CFILL_565(P)          (((P&0xF800UL)<<8)  | ((P&0x7E0UL)<<5)   | ((P&0x1FUL)<<3))
++
++/* PVR2DCreateDeviceContext flags */
++#define PVR2D_XSERVER_PROC                    0x00000001UL            /*!< Set for the Xserver connection */
++
++/* PVR2DMemAlloc flags */
++#define PVR2D_MEM_UNCACHED                    0x00000000UL    /* Default */
++#define PVR2D_MEM_CACHED                      0x00000001UL    /* Caller must flush and sync when necessary */
++#define PVR2D_MEM_WRITECOMBINE                0x00000002UL
++
++/* Functions that the library exports */
++
++PVR2D_IMPORT
++int PVR2DEnumerateDevices(PVR2DDEVICEINFO *pDevInfo);
++
++PVR2D_IMPORT
++PVR2DERROR PVR2DCreateDeviceContext(PVR2D_ULONG ulDevID,
++                                                                      PVR2DCONTEXTHANDLE* phContext,
++                                                                      PVR2D_ULONG ulFlags);
++
++PVR2D_IMPORT
++PVR2DERROR PVR2DDestroyDeviceContext(PVR2DCONTEXTHANDLE hContext);
++
++PVR2D_IMPORT
++PVR2DERROR PVR2DGetDeviceInfo(PVR2DCONTEXTHANDLE hContext,
++                                                        PVR2DDISPLAYINFO *pDisplayInfo);
++
++PVR2D_IMPORT
++PVR2DERROR PVR2DGetMiscDisplayInfo(PVR2DCONTEXTHANDLE hContext,
++                                                        PVR2DMISCDISPLAYINFO *pMiscDisplayInfo);
++
++PVR2D_IMPORT
++PVR2DERROR PVR2DGetScreenMode(PVR2DCONTEXTHANDLE hContext,
++                                                        PVR2DFORMAT *pFormat,
++                                                        PVR2D_LONG *plWidth,
++                                                        PVR2D_LONG *plHeight,
++                                                        PVR2D_LONG *plStride,
++                                                        PVR2D_INT *piRefreshRate);
++
++PVR2D_IMPORT
++PVR2DERROR PVR2DGetFrameBuffer(PVR2DCONTEXTHANDLE hContext,
++                                                         PVR2D_INT nHeap,
++                                                         PVR2DMEMINFO **ppsMemInfo);
++
++PVR2D_IMPORT
++PVR2DERROR PVR2DMemAlloc(PVR2DCONTEXTHANDLE hContext,
++                                               PVR2D_ULONG ulBytes,
++                                               PVR2D_ULONG ulAlign,
++                                               PVR2D_ULONG ulFlags,
++                                               PVR2DMEMINFO **ppsMemInfo);
++
++PVR2D_IMPORT
++PVR2DERROR PVR2DMemExport(PVR2DCONTEXTHANDLE hContext,
++                                               PVR2D_ULONG ulFlags,
++                                               PVR2DMEMINFO *psMemInfo,
++                                               PVR2D_HANDLE *phMemHandle);
++
++PVR2D_IMPORT
++PVR2DERROR PVR2DMemWrap(PVR2DCONTEXTHANDLE hContext,
++                                              PVR2D_VOID *pMem,
++                                              PVR2D_ULONG ulFlags,
++                                              PVR2D_ULONG ulBytes,
++                                              PVR2D_ULONG alPageAddress[],
++                                              PVR2DMEMINFO **ppsMemInfo);
++
++PVR2D_IMPORT
++PVR2DERROR PVR2DMemMap(PVR2DCONTEXTHANDLE hContext,
++                                              PVR2D_ULONG ulFlags,
++                                              PVR2D_HANDLE hMemHandle,
++                                              PVR2DMEMINFO **ppsDstMem);
++
++PVR2D_IMPORT
++PVR2DERROR PVR2DMemFree(PVR2DCONTEXTHANDLE hContext,
++                                              PVR2DMEMINFO *psMemInfo);
++
++PVR2D_IMPORT
++PVR2DERROR PVR2DBlt(PVR2DCONTEXTHANDLE hContext,
++                                      PVR2DBLTINFO *pBltInfo);
++
++PVR2D_IMPORT
++PVR2DERROR PVR2DBltClipped(PVR2DCONTEXTHANDLE hContext,
++                                                 PVR2DBLTINFO *pBltInfo,
++                                                 PVR2D_ULONG ulNumClipRects,
++                                                 PVR2DRECT *pClipRects);
++
++PVR2D_EXPORT
++PVR2DERROR PVR2DSet1555Alpha (PVR2DCONTEXTHANDLE hContext,
++                                                        PVR2D_UCHAR Alpha0, PVR2D_UCHAR Alpha1);
++
++PVR2D_IMPORT
++PVR2DERROR PVR2DQueryBlitsComplete(PVR2DCONTEXTHANDLE hContext,
++                                                                 const PVR2DMEMINFO *pMemInfo,
++                                                                 PVR2D_UINT uiWaitForComplete);
++
++PVR2D_IMPORT
++PVR2DERROR PVR2DSetPresentBltProperties(PVR2DCONTEXTHANDLE hContext,
++                                                                              PVR2D_ULONG ulPropertyMask,
++                                                                              PVR2D_LONG lSrcStride,
++                                                                              PVR2D_ULONG ulDstWidth,
++                                                                              PVR2D_ULONG ulDstHeight,
++                                                                              PVR2D_LONG lDstXPos,
++                                                                              PVR2D_LONG lDstYPos,
++                                                                              PVR2D_ULONG ulNumClipRects,
++                                                                              PVR2DRECT *pClipRects,
++                                                                              PVR2D_ULONG ulSwapInterval);
++
++PVR2D_IMPORT
++PVR2DERROR PVR2DPresentBlt(PVR2DCONTEXTHANDLE hContext,
++                                                 PVR2DMEMINFO *pMemInfo,
++                                                 PVR2D_LONG lRenderID);
++
++PVR2D_IMPORT
++PVR2DERROR PVR2DCreateFlipChain(PVR2DCONTEXTHANDLE hContext,
++                                                              PVR2D_ULONG ulFlags,
++                                                              PVR2D_ULONG ulNumBuffers,
++                                                              PVR2D_ULONG ulWidth,
++                                                              PVR2D_ULONG ulHeight,
++                                                              PVR2DFORMAT eFormat,
++                                                              PVR2D_LONG *plStride,
++                                                              PVR2D_ULONG *pulFlipChainID,
++                                                              PVR2DFLIPCHAINHANDLE *phFlipChain);
++
++PVR2D_IMPORT
++PVR2DERROR PVR2DDestroyFlipChain(PVR2DCONTEXTHANDLE hContext,
++                                                               PVR2DFLIPCHAINHANDLE hFlipChain);
++
++PVR2D_IMPORT
++PVR2DERROR PVR2DGetFlipChainBuffers(PVR2DCONTEXTHANDLE hContext,
++                                                                      PVR2DFLIPCHAINHANDLE hFlipChain,
++                                                                      PVR2D_ULONG *pulNumBuffers,
++                                                                      PVR2DMEMINFO *psMemInfo[]);
++
++PVR2D_IMPORT
++PVR2DERROR PVR2DSetPresentFlipProperties(PVR2DCONTEXTHANDLE hContext,
++                                                                               PVR2DFLIPCHAINHANDLE hFlipChain,
++                                                                               PVR2D_ULONG ulPropertyMask,
++                                                                               PVR2D_LONG lDstXPos,
++                                                                               PVR2D_LONG lDstYPos,
++                                                                               PVR2D_ULONG ulNumClipRects, 
++                                                                               PVR2DRECT *pClipRects,
++                                                                               PVR2D_ULONG ulSwapInterval);
++
++PVR2D_IMPORT
++PVR2DERROR PVR2DPresentFlip(PVR2DCONTEXTHANDLE hContext,
++                                                      PVR2DFLIPCHAINHANDLE hFlipChain,
++                                                      PVR2DMEMINFO *psMemInfo,
++                                                      PVR2D_LONG lRenderID);
++
++PVR2D_IMPORT
++PVR2DERROR PVR2DGetAPIRev(PVR2D_LONG *lRevMajor, PVR2D_LONG *lRevMinor);
++
++PVR2D_IMPORT
++PVR2DERROR PVR2DLoadUseCode (const PVR2DCONTEXTHANDLE hContext, const PVR2D_UCHAR     *pUseCode,
++                                                                      const PVR2D_ULONG UseCodeSize, PVR2D_HANDLE *pUseCodeHandle);
++PVR2D_IMPORT
++PVR2DERROR PVR2DFreeUseCode (const PVR2DCONTEXTHANDLE hContext, const PVR2D_HANDLE hUseCodeHandle);
++
++PVR2D_IMPORT
++PVR2DERROR PVR2DBlt3D (const PVR2DCONTEXTHANDLE hContext, const PPVR2D_3DBLT pBlt3D);
++
++PVR2D_IMPORT
++PVR2DERROR PVR2DBlt3DExt (const PVR2DCONTEXTHANDLE hContext, const PPVR2D_3DBLT_EXT pBlt3D);
++
++#ifdef __cplusplus
++}
++#endif 
++
++#endif /* _PVR2D_H_ */
++
++/******************************************************************************
++ End of file (pvr2d.h)
++******************************************************************************/
+diff -Nurp qt-everywhere-opensource-src-4.6.3-orig//src/3rdparty/powervr/wsegl2/wsegl.h qt-everywhere-opensource-src-4.6.3/src/3rdparty/powervr/wsegl2/wsegl.h
+--- qt-everywhere-opensource-src-4.6.3-orig//src/3rdparty/powervr/wsegl2/wsegl.h       1970-01-01 00:00:00.000000000 +0000
++++ qt-everywhere-opensource-src-4.6.3/src/3rdparty/powervr/wsegl2/wsegl.h     2011-05-16 22:51:52.702601769 +0000
+@@ -0,0 +1,285 @@
++/**********************************************************************
++*
++* Copyright(c) Imagination Technologies Ltd.
++*
++* The contents of this file are subject to the MIT license as set out below.
++*
++* Permission is hereby granted, free of charge, to any person obtaining a copy
++* of this software and associated documentation files (the "Software"),
++* to deal in the Software without restriction, including without limitation
++* the rights to use, copy, modify, merge, publish, distribute, sublicense,
++* and/or sell copies of the Software, and to permit persons to whom the
++* Software is furnished to do so, subject to the following conditions:
++* 
++* The above copyright notice and this permission notice shall be included
++* in all copies or substantial portions of the Software.
++*
++* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
++* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
++* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
++* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
++* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT
++* OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
++* OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
++* 
++* This License is also included in this distribution in the file called 
++* "COPYING".
++* 
++******************************************************************************/
++
++
++
++#if !defined(__WSEGL_H__)
++#define __WSEGL_H__
++
++#ifdef __cplusplus
++extern "C" {
++#endif 
++
++/*
++// WSEGL Platform-specific definitions
++*/
++#if defined(__linux__)
++#define WSEGL_EXPORT __attribute__((visibility("default")))
++#define WSEGL_IMPORT
++#else
++#define WSEGL_EXPORT
++#define WSEGL_IMPORT
++#endif
++
++/*
++// WSEGL API Version Number
++*/
++
++#define WSEGL_VERSION 2
++#define WSEGL_DEFAULT_DISPLAY 0
++#define WSEGL_DEFAULT_NATIVE_ENGINE 0
++
++#define WSEGL_FALSE           0
++#define WSEGL_TRUE            1
++#define WSEGL_NULL            0
++
++#define       WSEGL_UNREFERENCED_PARAMETER(param) (param) = (param)
++
++/*
++// WSEGL handles
++*/
++typedef void *WSEGLDisplayHandle;
++typedef void *WSEGLDrawableHandle;
++
++/*
++// Display capability type
++*/
++typedef enum WSEGLCapsType_TAG
++{
++      WSEGL_NO_CAPS = 0,
++      WSEGL_CAP_MIN_SWAP_INTERVAL = 1, /* System default value = 1 */
++      WSEGL_CAP_MAX_SWAP_INTERVAL = 2, /* System default value = 1 */
++      WSEGL_CAP_WINDOWS_USE_HW_SYNC = 3, /* System default value = 0 (FALSE) */
++      WSEGL_CAP_PIXMAPS_USE_HW_SYNC = 4, /* System default value = 0 (FALSE) */
++
++} WSEGLCapsType;
++
++/*
++// Display capability
++*/
++typedef struct WSEGLCaps_TAG
++{
++      WSEGLCapsType eCapsType;
++      unsigned long ui32CapsValue;
++
++} WSEGLCaps;
++
++/*
++// Drawable type
++*/
++#define WSEGL_NO_DRAWABLE                     0x0
++#define WSEGL_DRAWABLE_WINDOW         0x1
++#define WSEGL_DRAWABLE_PIXMAP         0x2
++
++
++/*
++// Pixel format of display/drawable
++*/
++typedef enum WSEGLPixelFormat_TAG
++{
++      /* These must not be re-ordered */
++      WSEGL_PIXELFORMAT_RGB565        = 0,
++      WSEGL_PIXELFORMAT_ARGB4444      = 1,
++      WSEGL_PIXELFORMAT_ARGB8888      = 2,
++      WSEGL_PIXELFORMAT_ARGB1555      = 3,
++      WSEGL_PIXELFORMAT_ABGR8888      = 4,
++      WSEGL_PIXELFORMAT_XBGR8888      = 5,
++
++      /* These are compatibility names only; new WSEGL
++       * modules should not use them.
++       */
++      WSEGL_PIXELFORMAT_565           = WSEGL_PIXELFORMAT_RGB565,
++      WSEGL_PIXELFORMAT_4444          = WSEGL_PIXELFORMAT_ARGB4444,
++      WSEGL_PIXELFORMAT_8888          = WSEGL_PIXELFORMAT_ARGB8888,
++      WSEGL_PIXELFORMAT_1555          = WSEGL_PIXELFORMAT_ARGB1555,
++
++} WSEGLPixelFormat;
++
++/*
++// Transparent of display/drawable
++*/
++typedef enum WSEGLTransparentType_TAG
++{
++      WSEGL_OPAQUE = 0,
++      WSEGL_COLOR_KEY = 1,
++
++} WSEGLTransparentType;
++
++/*
++// Display/drawable configuration
++*/
++typedef struct WSEGLConfig_TAG
++{
++      /*
++      // Type of drawables this configuration applies to -
++      // OR'd values of drawable types. 
++      */
++      unsigned long ui32DrawableType;
++
++      /* Pixel format */
++      WSEGLPixelFormat ePixelFormat;
++
++      /* Native Renderable  - set to WSEGL_TRUE if native renderable */
++      unsigned long ulNativeRenderable;
++
++      /* FrameBuffer Level Parameter */
++      unsigned long ulFrameBufferLevel;
++
++      /* Native Visual ID */
++      unsigned long ulNativeVisualID;
++
++      /* Native Visual */
++      void *hNativeVisual;
++
++      /* Transparent Type */
++      WSEGLTransparentType eTransparentType;
++
++      /* Transparent Color - only used if transparent type is COLOR_KEY */
++      unsigned long ulTransparentColor; /* packed as 0x00RRGGBB */
++
++
++} WSEGLConfig;
++
++/*
++// WSEGL errors
++*/
++typedef enum WSEGLError_TAG
++{
++      WSEGL_SUCCESS = 0,
++      WSEGL_CANNOT_INITIALISE = 1,
++      WSEGL_BAD_NATIVE_DISPLAY = 2,
++      WSEGL_BAD_NATIVE_WINDOW = 3,
++      WSEGL_BAD_NATIVE_PIXMAP = 4,
++      WSEGL_BAD_NATIVE_ENGINE = 5,
++      WSEGL_BAD_DRAWABLE = 6,
++      WSEGL_BAD_MATCH = 7,
++      WSEGL_OUT_OF_MEMORY = 8,
++
++      /* These are compatibility names only; new WSEGL
++       * modules should not use them.
++       */
++      WSEGL_BAD_CONFIG = WSEGL_BAD_MATCH,
++
++} WSEGLError; 
++
++/*
++// Drawable orientation (in degrees anti-clockwise)
++*/
++typedef enum WSEGLRotationAngle_TAG
++{
++      WSEGL_ROTATE_0 = 0,
++      WSEGL_ROTATE_90 = 1,
++      WSEGL_ROTATE_180 = 2,
++      WSEGL_ROTATE_270 = 3
++
++} WSEGLRotationAngle; 
++
++/*
++// Drawable information required by OpenGL-ES driver
++*/
++typedef struct WSEGLDrawableParams_TAG
++{
++      /* Width in pixels of the drawable */
++      unsigned long   ui32Width;
++
++      /* Height in pixels of the drawable */
++      unsigned long   ui32Height;
++
++      /* Stride in pixels of the drawable */
++      unsigned long   ui32Stride;
++
++      /* Pixel format of the drawable */
++      WSEGLPixelFormat        ePixelFormat;
++
++      /* User space cpu virtual address of the drawable */
++      void                    *pvLinearAddress;
++
++      /* HW address of the drawable */
++      unsigned long   ui32HWAddress;
++
++      /* Private data for the drawable */
++      void                    *hPrivateData;
++
++
++} WSEGLDrawableParams;
++
++
++/*
++// Table of function pointers that is returned by WSEGL_GetFunctionTablePointer()
++//
++// The first entry in the table is the version number of the wsegl.h header file that
++// the module has been written against, and should therefore be set to WSEGL_VERSION
++*/
++typedef struct WSEGL_FunctionTable_TAG
++{
++      unsigned long ui32WSEGLVersion;
++
++      WSEGLError (*pfnWSEGL_IsDisplayValid)(NativeDisplayType);
++
++      WSEGLError (*pfnWSEGL_InitialiseDisplay)(NativeDisplayType, WSEGLDisplayHandle *, const WSEGLCaps **, WSEGLConfig **);
++
++      WSEGLError (*pfnWSEGL_CloseDisplay)(WSEGLDisplayHandle);
++
++      WSEGLError (*pfnWSEGL_CreateWindowDrawable)(WSEGLDisplayHandle, WSEGLConfig *, WSEGLDrawableHandle *, NativeWindowType, WSEGLRotationAngle *);
++
++      WSEGLError (*pfnWSEGL_CreatePixmapDrawable)(WSEGLDisplayHandle, WSEGLConfig *, WSEGLDrawableHandle *, NativePixmapType, WSEGLRotationAngle *);
++
++      WSEGLError (*pfnWSEGL_DeleteDrawable)(WSEGLDrawableHandle);
++
++      WSEGLError (*pfnWSEGL_SwapDrawable)(WSEGLDrawableHandle, unsigned long);
++
++      WSEGLError (*pfnWSEGL_SwapControlInterval)(WSEGLDrawableHandle, unsigned long);
++
++      WSEGLError (*pfnWSEGL_WaitNative)(WSEGLDrawableHandle, unsigned long);
++
++      WSEGLError (*pfnWSEGL_CopyFromDrawable)(WSEGLDrawableHandle, NativePixmapType);
++
++      WSEGLError (*pfnWSEGL_CopyFromPBuffer)(void *, unsigned long, unsigned long, unsigned long, WSEGLPixelFormat, NativePixmapType);
++
++      WSEGLError (*pfnWSEGL_GetDrawableParameters)(WSEGLDrawableHandle, WSEGLDrawableParams *, WSEGLDrawableParams *);
++
++      WSEGLError (*pfnWSEGL_ConnectDrawable)(WSEGLDrawableHandle);
++
++      WSEGLError (*pfnWSEGL_DisconnectDrawable)(WSEGLDrawableHandle);
++
++
++} WSEGL_FunctionTable;
++
++
++WSEGL_IMPORT const WSEGL_FunctionTable *WSEGL_GetFunctionTablePointer(void);
++
++#ifdef __cplusplus
++}
++#endif 
++
++#endif /* __WSEGL_H__ */
++
++/******************************************************************************
++ End of file (wsegl.h)
++******************************************************************************/
+diff -Nurp qt-everywhere-opensource-src-4.6.3-orig//src/plugins/gfxdrivers/powervr/QWSWSEGL/pvrqwswsegl.c qt-everywhere-opensource-src-4.6.3/src/plugins/gfxdrivers/powervr/QWSWSEGL/pvrqwswsegl.c
+--- qt-everywhere-opensource-src-4.6.3-orig//src/plugins/gfxdrivers/powervr/QWSWSEGL/pvrqwswsegl.c     2010-06-02 02:03:17.000000000 +0000
++++ qt-everywhere-opensource-src-4.6.3/src/plugins/gfxdrivers/powervr/QWSWSEGL/pvrqwswsegl.c   2011-05-16 23:08:51.618597097 +0000
+@@ -378,6 +378,20 @@ static WSEGLError wseglGetDrawableParame
+     return WSEGL_SUCCESS;
+ }
++/* Function stub for ConnectDrawable() */
++static WSEGLError wseglConnectDrawable(WSEGLDrawableHandle hDrawable)
++{
++    WSEGL_UNREFERENCED_PARAMETER(hDrawable);
++    return WSEGL_SUCCESS;
++}
++
++/* Function stub for DisconnectDrawable() */
++static WSEGLError wseglDisconnectDrawable(WSEGLDrawableHandle hDrawable)
++{
++    WSEGL_UNREFERENCED_PARAMETER(hDrawable);
++    return WSEGL_SUCCESS;
++}
++
+ static WSEGL_FunctionTable const wseglFunctions = {
+     WSEGL_VERSION,
+     wseglIsDisplayValid,
+@@ -391,7 +405,9 @@ static WSEGL_FunctionTable const wseglFu
+     wseglWaitNative,
+     wseglCopyFromDrawable,
+     wseglCopyFromPBuffer,
+-    wseglGetDrawableParameters
++    wseglGetDrawableParameters,
++    wseglConnectDrawable,
++    wseglDisconnectDrawable
+ };
+ /* Return the table of WSEGL functions to the EGL implementation */
diff --git a/recipes/qt4/files/compile.test-lflags.patch b/recipes/qt4/files/compile.test-lflags.patch
new file mode 100644 (file)
index 0000000..e4b256b
--- /dev/null
@@ -0,0 +1,13 @@
+Index: qt-everywhere-opensource-src-4.6.3/config.tests/unix/compile.test
+===================================================================
+--- qt-everywhere-opensource-src-4.6.3.orig/config.tests/unix/compile.test     2010-06-02 06:03:18.000000000 +0400
++++ qt-everywhere-opensource-src-4.6.3/config.tests/unix/compile.test  2010-10-04 17:35:07.587783460 +0400
+@@ -11,7 +11,7 @@
+ EXE=`basename "$6"`
+ DESCRIPTION=$7
+ shift 7
+-LFLAGS=""
++LFLAGS="$LDFLAGS"
+ INCLUDEPATH=""
+ CXXFLAGS=""
+ MAC_ARCH_CXXFLAGS=""
diff --git a/recipes/qt4/qt-4.7.1.inc b/recipes/qt4/qt-4.7.1.inc
deleted file mode 100644 (file)
index ce6b925..0000000
+++ /dev/null
@@ -1,74 +0,0 @@
-DEFAULT_PREFERENCE = "-1"
-DEFAULT_PREFERENCE_opendreambox = "1"
-DEFAULT_PREFERENCE_vuplus = "1"
-LICENSE = "LGPLv2.1 GPLv3"
-
-FILESPATHPKG =. "qt-${PV}:"
-
-SRC_URI = "\
-       ftp://ftp.trolltech.com/qt/source/qt-everywhere-opensource-src-${PV}.tar.gz \
-       file://blacklist-fraudulent-comodo-certificates-patch.diff;patch=1 \
-       file://0004-no-qmake.patch;patch=1 \
-       file://hack-out-pg2-4.7.0.patch;patch=1 \
-       file://0006-freetype-host-includes.patch;patch=1 \
-       file://0001-Added-Openembedded-crossarch-option.patch;patch=1 \
-       file://0010-phonon-gstreamer-rgb-endianess.patch;patch=1 \
-       file://webkit_r82142.patch;patch=1 \
-       file://g++.conf \
-       file://linux.conf \
-           "
-# Set necessary variables in the profile
-SRC_URI += "file://qte.sh"
-
-S = "${WORKDIR}/qt-everywhere-opensource-src-${PV}"
-
-FILES_${QT_BASE_NAME}-tools                += "${bindir}/qml"
-
-do_configure_prepend() {
-    for pro in $(find ${S} -name "*.pro") ; do
-        sed -i 's:$$QT_BUILD_TREE/bin/lrelease:${OE_QMAKE_LRELEASE}:g' $pro
-    done
-
-    sed -i s:SEDME:${S}: ${WORKDIR}/linux.conf
-    sed -i \
-    -e /QMAKE_MOC\ /d \
-    -e /QMAKE_UIC\ /d \
-    -e /QMAKE_UIC3\ /d \
-    -e /QMAKE_RCC\ /d \
-    ${S}/configure
-}
-
-do_configure_append() {
-    sed -e '/QMAKE_TARGET /d' -e '/TARGET /d' -i ${S}/translations/Makefile
-}
-
-QT_GLFLAGS ?= ""
-QT_CONFIG_FLAGS += " -xmlpatterns -no-rpath -qt3support -reduce-relocations -silent ${QT_GLFLAGS}"
-
-do_compile() {
-    # Fixup missing wsegl header in some SGX SDKs
-    if ! [ -e ${STAGING_INCDIR}/wsegl.h ] ; then
-        cp src/3rdparty/powervr/wsegl.h src/plugins/gfxdrivers/powervr/QWSWSEGL/
-    fi
-
-    unset CFLAGS CXXFLAGS
-    install -m 0755 ${STAGING_BINDIR_NATIVE}/rcc4 ${S}/bin/rcc
-    install -m 0755 ${STAGING_BINDIR_NATIVE}/moc4 ${S}/bin/moc
-    install -m 0755 ${STAGING_BINDIR_NATIVE}/uic4 ${S}/bin/uic
-    install -m 0755 ${STAGING_BINDIR_NATIVE}/lrelease4 ${S}/bin/lrelease
-
-    oe_runmake ${EXTRA_ENV}
-}
-
-do_install_append() {
-       install -d ${D}${bindir}
-       for i in rcc uic moc ; do
-               install -m 0755 ${S}/bin/$i ${D}${bindir}/
-       done
-
-        #Append an E to the qtdemo file
-        if [ -n "${QT_LIBINFIX}" ] ; then
-                mv ${D}${bindir}/qtdemo ${D}${bindir}/qtdemo${QT_LIBINFIX}
-        fi
-}
-
diff --git a/recipes/qt4/qt-4.7.1/0001-Added-Openembedded-crossarch-option.patch b/recipes/qt4/qt-4.7.1/0001-Added-Openembedded-crossarch-option.patch
deleted file mode 100644 (file)
index 71a04a5..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-From b1ba119f6a824dc01bd42ee00dba4a1653867b72 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Matthias=20G=C3=BCnther?= <matgnt@gmail.com>
-Date: Wed, 12 May 2010 16:52:45 +0200
-Subject: [PATCH 1/9] Added Openembedded "-crossarch" option
-
----
- configure |    7 ++++++-
- 1 files changed, 6 insertions(+), 1 deletions(-)
-
-diff --git a/configure b/configure
-index facd192..9d15136 100755
---- a/configure
-+++ b/configure
-@@ -954,7 +954,7 @@ while [ "$#" -gt 0 ]; do
-         shift
-         VAL=$1
-         ;;
--    -prefix|-docdir|-headerdir|-plugindir|-importdir|-datadir|-libdir|-bindir|-translationdir|-sysconfdir|-examplesdir|-demosdir|-depths|-make|-nomake|-platform|-xplatform|-buildkey|-sdk|-arch|-host-arch|-mysql_config)
-+    -prefix|-docdir|-headerdir|-plugindir|-importdir|-datadir|-libdir|-bindir|-translationdir|-sysconfdir|-examplesdir|-demosdir|-depths|-make|-nomake|-platform|-xplatform|-buildkey|-sdk|-arch|-host-arch|-mysql_config|-crossarch)
-         VAR=`echo $1 | sed "s,^-\(.*\),\1,"`
-         shift
-         VAL="$1"
-@@ -1443,6 +1443,9 @@ while [ "$#" -gt 0 ]; do
-     xplatform)
-         XPLATFORM="$VAL"
-         ;;
-+      crossarch)
-+              CROSSARCH="$VAL"
-+              ;;
-     debug-and-release)
-         if [ "$VAL" = "yes" ] || [ "$VAL" = "no" ]; then
-             CFG_DEBUG_RELEASE="$VAL"
-@@ -2918,6 +2921,8 @@ elif [ "$PLATFORM_MAC" = "yes" ] || [ -z "$CFG_ARCH" ]; then
-     CFG_ARCH=$CFG_HOST_ARCH
- fi
-+CFG_ARCH="$CROSSARCH"
-+
- if [ -d "$relpath/src/corelib/arch/$CFG_ARCH" ]; then
-     if [ "$OPT_VERBOSE" = "yes" ]; then
-         echo "    '$CFG_ARCH' is supported"
--- 
-1.7.0.4
-
diff --git a/recipes/qt4/qt-4.7.1/0010-phonon-gstreamer-rgb-endianess.patch b/recipes/qt4/qt-4.7.1/0010-phonon-gstreamer-rgb-endianess.patch
deleted file mode 100644 (file)
index d43366c..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
---- a/src/3rdparty/phonon/gstreamer/qwidgetvideosink.cpp
-+++ b/src/3rdparty/phonon/gstreamer/qwidgetvideosink.cpp
-@@ -18,6 +18,7 @@
- #include <QApplication>
- #include "videowidget.h"
- #include "qwidgetvideosink.h"
-+#include <gst/video/video.h>
- QT_BEGIN_NAMESPACE
-@@ -106,11 +107,7 @@ static GstStaticPadTemplate template_factory_rgb =
-     GST_STATIC_PAD_TEMPLATE("sink",
-                             GST_PAD_SINK,
-                             GST_PAD_ALWAYS,
--                            GST_STATIC_CAPS("video/x-raw-rgb, "
--                                            "framerate = (fraction) [ 0, MAX ], "
--                                            "width = (int) [ 1, MAX ], "
--                                            "height = (int) [ 1, MAX ],"
--                                            "bpp = (int) 32"));
-+                            GST_STATIC_CAPS(GST_VIDEO_CAPS_xRGB_HOST_ENDIAN));
- template <VideoFormat FMT>
- struct template_factory; 
diff --git a/recipes/qt4/qt-4.7.1/g++.conf b/recipes/qt4/qt-4.7.1/g++.conf
deleted file mode 100644 (file)
index 80f925c..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-#
-# qmake configuration for common gcc
-#
-
-QMAKE_CC       = $(OE_QMAKE_CC)
-QMAKE_CFLAGS       += -pipe $(OE_QMAKE_CFLAGS)
-QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += $(OE_QMAKE_CFLAGS)
-QMAKE_CFLAGS_DEPS      += -M
-QMAKE_CFLAGS_WARN_ON   += -Wall -W
-QMAKE_CFLAGS_WARN_OFF  += -w
-QMAKE_CFLAGS_RELEASE   +=
-QMAKE_CFLAGS_DEBUG     += -g
-QMAKE_CFLAGS_SHLIB     += -fPIC
-QMAKE_CFLAGS_STATIC_LIB        += -fPIC
-QMAKE_CFLAGS_YACC      += -Wno-unused -Wno-parentheses
-QMAKE_CFLAGS_HIDESYMS   += -fvisibility=hidden
-QMAKE_CFLAGS_PRECOMPILE += -x c-header -c ${QMAKE_PCH_INPUT} -o ${QMAKE_PCH_OUTPUT}
-QMAKE_CFLAGS_USE_PRECOMPILE += -include ${QMAKE_PCH_OUTPUT_BASE}
-
-QMAKE_CXX      = $(OE_QMAKE_CXX)
-QMAKE_CXXFLAGS     += $$QMAKE_CFLAGS $(OE_QMAKE_CXXFLAGS)
-QMAKE_CXXFLAGS_DEPS    += $$QMAKE_CFLAGS_DEPS
-QMAKE_CXXFLAGS_WARN_ON += $$QMAKE_CFLAGS_WARN_ON
-QMAKE_CXXFLAGS_WARN_OFF        += $$QMAKE_CFLAGS_WARN_OFF
-QMAKE_CXXFLAGS_RELEASE += $$QMAKE_CFLAGS_RELEASE
-QMAKE_CXXFLAGS_RELEASE_WITH_DEBUGINFO += $$QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO
-QMAKE_CXXFLAGS_DEBUG   += $$QMAKE_CFLAGS_DEBUG
-QMAKE_CXXFLAGS_SHLIB   += $$QMAKE_CFLAGS_SHLIB
-QMAKE_CXXFLAGS_STATIC_LIB += $$QMAKE_CFLAGS_STATIC_LIB
-QMAKE_CXXFLAGS_YACC    += $$QMAKE_CFLAGS_YACC
-QMAKE_CXXFLAGS_HIDESYMS += $$QMAKE_CFLAGS_HIDESYMS -fvisibility-inlines-hidden
-QMAKE_CXXFLAGS_PRECOMPILE += -x c++-header -c ${QMAKE_PCH_INPUT} -o ${QMAKE_PCH_OUTPUT}
-QMAKE_CXXFLAGS_USE_PRECOMPILE = $$QMAKE_CFLAGS_USE_PRECOMPILE
-
-QMAKE_LINK     = $(OE_QMAKE_LINK)
-QMAKE_LINK_SHLIB   = $(OE_QMAKE_LINK)
-QMAKE_LINK_C           = $(OE_QMAKE_LINK)
-QMAKE_LINK_C_SHLIB     = $(OE_QMAKE_LINK)
-QMAKE_LFLAGS       += $(OE_QMAKE_LDFLAGS)
-QMAKE_LFLAGS_RELEASE   +=
-QMAKE_LFLAGS_DEBUG     +=
-QMAKE_LFLAGS_APP       +=
-QMAKE_LFLAGS_SHLIB     += -shared
-QMAKE_LFLAGS_PLUGIN    += $$QMAKE_LFLAGS_SHLIB
-QMAKE_LFLAGS_SONAME    += -Wl,-soname,
-QMAKE_LFLAGS_THREAD    +=
-QMAKE_LFLAGS_NOUNDEF   += -Wl,--no-undefined
-QMAKE_LFLAGS_RPATH        = -Wl,-rpath-link,
-
-QMAKE_PCH_OUTPUT_EXT    = .gch
-
-# -Bsymbolic-functions (ld) support
-QMAKE_LFLAGS_BSYMBOLIC_FUNC = -Wl,-Bsymbolic-functions
-QMAKE_LFLAGS_DYNAMIC_LIST = -Wl,--dynamic-list,
-
-# some linking helper...
-CONFIG += rpath_libdirs
-
-# for the SDK
-isEmpty(QMAKE_QT_CONFIG):QMAKE_QT_CONFIG = $(OE_QMAKE_QT_CONFIG)
diff --git a/recipes/qt4/qt-4.7.1/hack-out-pg2-4.7.0.patch b/recipes/qt4/qt-4.7.1/hack-out-pg2-4.7.0.patch
deleted file mode 100644 (file)
index 5c588ff..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-Index: qt-everywhere-opensource-src-4.7.0/configure
-===================================================================
---- qt-everywhere-opensource-src-4.7.0.orig/configure  2010-09-22 15:43:51.191162141 -0400
-+++ qt-everywhere-opensource-src-4.7.0/configure       2010-09-22 15:44:35.179981232 -0400
-@@ -4921,10 +4921,10 @@
-         psql)
-             if [ "$CFG_SQL_psql" != "no" ]; then
-                 # Be careful not to use native pg_config when cross building.
--                if [ "$XPLATFORM_MINGW" != "yes" ] && "$WHICH" pg_config >/dev/null 2>&1; then
--                    QT_CFLAGS_PSQL=`pg_config --includedir 2>/dev/null`
--                    QT_LFLAGS_PSQL=`pg_config --libdir 2>/dev/null`
--                fi
-+#                if [ "$XPLATFORM_MINGW" != "yes" ] && "$WHICH" pg_config >/dev/null 2>&1; then
-+#                    QT_CFLAGS_PSQL=`pg_config --includedir 2>/dev/null`
-+#                    QT_LFLAGS_PSQL=`pg_config --libdir 2>/dev/null`
-+#                fi
-                 [ -z "$QT_CFLAGS_PSQL" ] || QT_CFLAGS_PSQL="-I$QT_CFLAGS_PSQL"
-                 [ -z "$QT_LFLAGS_PSQL" ] || QT_LFLAGS_PSQL="-L$QT_LFLAGS_PSQL"
-                 # But, respect PSQL_LIBS if set
diff --git a/recipes/qt4/qt-4.7.1/linux.conf b/recipes/qt4/qt-4.7.1/linux.conf
deleted file mode 100644 (file)
index a541355..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-#
-# qmake configuration for common linux
-#
-
-QMAKE_CFLAGS_THREAD    += -D_REENTRANT
-QMAKE_CXXFLAGS_THREAD  += $$QMAKE_CFLAGS_THREAD
-
-QMAKE_INCDIR          =
-QMAKE_LIBDIR          =
-QMAKE_INCDIR_X11      =
-QMAKE_LIBDIR_X11      =
-QMAKE_INCDIR_QT       = $(OE_QMAKE_INCDIR_QT)
-QMAKE_LIBDIR_QT       = $(OE_QMAKE_LIBDIR_QT)
-QMAKE_INCDIR_OPENGL   =
-QMAKE_LIBDIR_OPENGL   =
-QMAKE_INCDIR_OPENGL_ES1 = $$QMAKE_INCDIR_OPENGL
-QMAKE_LIBDIR_OPENGL_ES1 = $$QMAKE_LIBDIR_OPENGL
-QMAKE_INCDIR_OPENGL_ES2 = $$QMAKE_INCDIR_OPENGL
-QMAKE_LIBDIR_OPENGL_ES2 = $$QMAKE_LIBDIR_OPENGL
-QMAKE_INCDIR_EGL      =
-QMAKE_LIBDIR_EGL      =
-QMAKE_INCDIR_OPENVG   =
-QMAKE_LIBDIR_OPENVG   =
-
-
-QMAKE_LIBS            =
-QMAKE_LIBS_DYNLOAD    = -ldl
-QMAKE_LIBS_X11        = $(OE_QMAKE_LIBS_X11)
-QMAKE_LIBS_X11SM      = $(OE_QMAKE_LIBS_X11SM)
-QMAKE_LIBS_NIS        = -lnsl
-QMAKE_LIBS_EGL        = -lEGL
-QMAKE_LIBS_OPENGL     = -lGLU -lGL
-QMAKE_LIBS_OPENGL_QT  = -lGL
-QMAKE_LIBS_OPENGL_ES1 = -lGLES_CM
-QMAKE_LIBS_OPENGL_ES2 = -lGLESv2
-QMAKE_LIBS_OPENVG     = -lOpenVG
-QMAKE_LIBS_THREAD     = -lpthread
-
-QMAKE_MOC             = $(OE_QMAKE_MOC)
-QMAKE_UIC             = $(OE_QMAKE_UIC)
-QMAKE_UIC3            = $(OE_QMAKE_UIC3)
-QMAKE_RCC             = $(OE_QMAKE_RCC)
-QMAKE_QDBUSCPP2XML    = $(OE_QMAKE_QDBUSCPP2XML)
-QMAKE_QDBUSXML2CPP    = $(OE_QMAKE_QDBUSXML2CPP)
-
-QMAKE_AR              = $(OE_QMAKE_AR) cqs
-QMAKE_OBJCOPY         = objcopy
-QMAKE_RANLIB          =
-
-QMAKE_TAR             = tar -cf
-QMAKE_GZIP            = gzip -9f
-
-QMAKE_COPY            = cp -f
-QMAKE_COPY_FILE       = $(COPY)
-QMAKE_COPY_DIR        = $(COPY) -r
-QMAKE_MOVE            = mv -f
-QMAKE_DEL_FILE        = rm -f
-QMAKE_DEL_DIR         = rmdir
-QMAKE_STRIP           = $(OE_QMAKE_STRIP)
-QMAKE_STRIPFLAGS_LIB += --strip-unneeded
-QMAKE_CHK_DIR_EXISTS  = test -d
-QMAKE_MKDIR           = mkdir -p
-QMAKE_INSTALL_FILE    = install -m 644 -p
-QMAKE_INSTALL_PROGRAM = install -m 755 -p
-
-include(unix.conf)
diff --git a/recipes/qt4/qt-4.7.4.inc b/recipes/qt4/qt-4.7.4.inc
new file mode 100644 (file)
index 0000000..3d549d3
--- /dev/null
@@ -0,0 +1,58 @@
+DEFAULT_PREFERENCE = "-1"
+LICENSE = "LGPLv2.1 GPLv3"
+
+FILESPATHPKG =. "qt-${PV}:"
+
+SRC_URI = "\
+       http://get.qt.nokia.com/qt/source/qt-everywhere-opensource-src-${PV}.tar.gz \
+       file://0004-no-qmake.patch;patch=1 \
+       file://hack-out-pg2-4.7.0.patch;patch=1 \
+       file://0006-freetype-host-includes.patch;patch=1 \
+       file://0001-Added-Openembedded-crossarch-option.patch;patch=1 \
+       file://0010-phonon-gstreamer-rgb-endianess.patch;patch=1 \
+       file://fix-translations.patch;patch=1 \
+       file://0001-wsegl2-support.patch;patch=1 \
+       file://g++.conf \
+       file://linux.conf \
+       file://blacklist-diginotar-certs.diff;patch=1 \
+       "
+
+S = "${WORKDIR}/qt-everywhere-opensource-src-${PV}"
+
+FILES_${QT_BASE_NAME}-tools                += "${bindir}/qml"
+
+do_configure_prepend() {
+    for pro in $(find ${S} -name "*.pro") ; do
+        sed -i 's:$$LRELEASE:${STAGING_BINDIR_NATIVE}/lrelease4:g' $pro
+    done
+
+    sed -i s:SEDME:${S}: ${WORKDIR}/linux.conf
+    sed -i \
+    -e /QMAKE_MOC\ /d \
+    -e /QMAKE_UIC\ /d \
+    -e /QMAKE_UIC3\ /d \
+    -e /QMAKE_RCC\ /d \
+    ${S}/configure
+}
+
+QT_GLFLAGS ?= ""
+QT_CONFIG_FLAGS += " -script -scripttools -declarative -xmlpatterns -no-rpath -qt3support -reduce-relocations -silent ${QT_GLFLAGS}"
+
+do_compile() {
+    unset CFLAGS CXXFLAGS
+
+    oe_runmake ${EXTRA_ENV}
+}
+
+do_install_append() {
+       install -d ${D}${bindir}
+       for i in rcc uic moc ; do
+               install -m 0755 ${S}/bin/$i ${D}${bindir}/
+       done
+
+        #Append an E to the qtdemo file
+        if [ -n "${QT_LIBINFIX}" ] ; then
+                mv ${D}${bindir}/qtdemo ${D}${bindir}/qtdemo${QT_LIBINFIX}
+        fi
+}
+
diff --git a/recipes/qt4/qt-4.7.4/0001-Added-Openembedded-crossarch-option.patch b/recipes/qt4/qt-4.7.4/0001-Added-Openembedded-crossarch-option.patch
new file mode 100644 (file)
index 0000000..71a04a5
--- /dev/null
@@ -0,0 +1,44 @@
+From b1ba119f6a824dc01bd42ee00dba4a1653867b72 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Matthias=20G=C3=BCnther?= <matgnt@gmail.com>
+Date: Wed, 12 May 2010 16:52:45 +0200
+Subject: [PATCH 1/9] Added Openembedded "-crossarch" option
+
+---
+ configure |    7 ++++++-
+ 1 files changed, 6 insertions(+), 1 deletions(-)
+
+diff --git a/configure b/configure
+index facd192..9d15136 100755
+--- a/configure
++++ b/configure
+@@ -954,7 +954,7 @@ while [ "$#" -gt 0 ]; do
+         shift
+         VAL=$1
+         ;;
+-    -prefix|-docdir|-headerdir|-plugindir|-importdir|-datadir|-libdir|-bindir|-translationdir|-sysconfdir|-examplesdir|-demosdir|-depths|-make|-nomake|-platform|-xplatform|-buildkey|-sdk|-arch|-host-arch|-mysql_config)
++    -prefix|-docdir|-headerdir|-plugindir|-importdir|-datadir|-libdir|-bindir|-translationdir|-sysconfdir|-examplesdir|-demosdir|-depths|-make|-nomake|-platform|-xplatform|-buildkey|-sdk|-arch|-host-arch|-mysql_config|-crossarch)
+         VAR=`echo $1 | sed "s,^-\(.*\),\1,"`
+         shift
+         VAL="$1"
+@@ -1443,6 +1443,9 @@ while [ "$#" -gt 0 ]; do
+     xplatform)
+         XPLATFORM="$VAL"
+         ;;
++      crossarch)
++              CROSSARCH="$VAL"
++              ;;
+     debug-and-release)
+         if [ "$VAL" = "yes" ] || [ "$VAL" = "no" ]; then
+             CFG_DEBUG_RELEASE="$VAL"
+@@ -2918,6 +2921,8 @@ elif [ "$PLATFORM_MAC" = "yes" ] || [ -z "$CFG_ARCH" ]; then
+     CFG_ARCH=$CFG_HOST_ARCH
+ fi
++CFG_ARCH="$CROSSARCH"
++
+ if [ -d "$relpath/src/corelib/arch/$CFG_ARCH" ]; then
+     if [ "$OPT_VERBOSE" = "yes" ]; then
+         echo "    '$CFG_ARCH' is supported"
+-- 
+1.7.0.4
+
diff --git a/recipes/qt4/qt-4.7.4/0010-phonon-gstreamer-rgb-endianess.patch b/recipes/qt4/qt-4.7.4/0010-phonon-gstreamer-rgb-endianess.patch
new file mode 100644 (file)
index 0000000..d43366c
--- /dev/null
@@ -0,0 +1,23 @@
+--- a/src/3rdparty/phonon/gstreamer/qwidgetvideosink.cpp
++++ b/src/3rdparty/phonon/gstreamer/qwidgetvideosink.cpp
+@@ -18,6 +18,7 @@
+ #include <QApplication>
+ #include "videowidget.h"
+ #include "qwidgetvideosink.h"
++#include <gst/video/video.h>
+ QT_BEGIN_NAMESPACE
+@@ -106,11 +107,7 @@ static GstStaticPadTemplate template_factory_rgb =
+     GST_STATIC_PAD_TEMPLATE("sink",
+                             GST_PAD_SINK,
+                             GST_PAD_ALWAYS,
+-                            GST_STATIC_CAPS("video/x-raw-rgb, "
+-                                            "framerate = (fraction) [ 0, MAX ], "
+-                                            "width = (int) [ 1, MAX ], "
+-                                            "height = (int) [ 1, MAX ],"
+-                                            "bpp = (int) 32"));
++                            GST_STATIC_CAPS(GST_VIDEO_CAPS_xRGB_HOST_ENDIAN));
+ template <VideoFormat FMT>
+ struct template_factory; 
diff --git a/recipes/qt4/qt-4.7.4/blacklist-diginotar-certs.diff b/recipes/qt4/qt-4.7.4/blacklist-diginotar-certs.diff
new file mode 100644 (file)
index 0000000..4a50f3b
--- /dev/null
@@ -0,0 +1,89 @@
+diff --git a/src/network/ssl/qsslcertificate.cpp b/src/network/ssl/qsslcertificate.cpp\r
+index 328c5c2..1ae98f4 100644\r
+--- a/src/network/ssl/qsslcertificate.cpp\r
++++ b/src/network/ssl/qsslcertificate.cpp\r
+@@ -803,22 +803,47 @@ QList<QSslCertificate> QSslCertificatePrivate::certificatesFromDer(const QByteAr\r
+ // These certificates are known to be fraudulent and were created during the comodo\r
+ // compromise. See http://www.comodo.com/Comodo-Fraud-Incident-2011-03-23.html\r
+ static const char *certificate_blacklist[] = {\r
+-    "04:7e:cb:e9:fc:a5:5f:7b:d0:9e:ae:36:e1:0c:ae:1e",\r
+-    "f5:c8:6a:f3:61:62:f1:3a:64:f5:4f:6d:c9:58:7c:06",\r
+-    "d7:55:8f:da:f5:f1:10:5b:b2:13:28:2b:70:77:29:a3",\r
+-    "39:2a:43:4f:0e:07:df:1f:8a:a3:05:de:34:e0:c2:29",\r
+-    "3e:75:ce:d4:6b:69:30:21:21:88:30:ae:86:a8:2a:71",\r
+-    "e9:02:8b:95:78:e4:15:dc:1a:71:0a:2b:88:15:44:47",\r
+-    "92:39:d5:34:8f:40:d1:69:5a:74:54:70:e1:f2:3f:43",\r
+-    "b0:b7:13:3e:d0:96:f9:b5:6f:ae:91:c8:74:bd:3a:c0",\r
+-    "d8:f3:5f:4e:b7:87:2b:2d:ab:06:92:e3:15:38:2f:b0",\r
++    "04:7e:cb:e9:fc:a5:5f:7b:d0:9e:ae:36:e1:0c:ae:1e", "mail.google.com", // Comodo\r
++    "f5:c8:6a:f3:61:62:f1:3a:64:f5:4f:6d:c9:58:7c:06", "www.google.com", // Comodo\r
++    "d7:55:8f:da:f5:f1:10:5b:b2:13:28:2b:70:77:29:a3", "login.yahoo.com", // Comodo\r
++    "39:2a:43:4f:0e:07:df:1f:8a:a3:05:de:34:e0:c2:29", "login.yahoo.com", // Comodo\r
++    "3e:75:ce:d4:6b:69:30:21:21:88:30:ae:86:a8:2a:71", "login.yahoo.com", // Comodo\r
++    "e9:02:8b:95:78:e4:15:dc:1a:71:0a:2b:88:15:44:47", "login.skype.com", // Comodo\r
++    "92:39:d5:34:8f:40:d1:69:5a:74:54:70:e1:f2:3f:43", "addons.mozilla.org", // Comodo\r
++    "b0:b7:13:3e:d0:96:f9:b5:6f:ae:91:c8:74:bd:3a:c0", "login.live.com", // Comodo\r
++    "d8:f3:5f:4e:b7:87:2b:2d:ab:06:92:e3:15:38:2f:b0", "global trustee", // Comodo\r
++\r
++    "05:e2:e6:a4:cd:09:ea:54:d6:65:b0:75:fe:22:a2:56", "*.google.com", // leaf certificate issued by DigiNotar\r
++    "0c:76:da:9c:91:0c:4e:2c:9e:fe:15:d0:58:93:3c:4c", "DigiNotar Root CA", // DigiNotar root\r
++    "f1:4a:13:f4:87:2b:56:dc:39:df:84:ca:7a:a1:06:49", "DigiNotar Services CA", // DigiNotar intermediate signed by DigiNotar Root\r
++    "36:16:71:55:43:42:1b:9d:e6:cb:a3:64:41:df:24:38", "DigiNotar Services 1024 CA", // DigiNotar intermediate signed by DigiNotar Root\r
++    "0a:82:bd:1e:14:4e:88:14:d7:5b:1a:55:27:be:bf:3e", "DigiNotar Root CA G2", // other DigiNotar Root CA\r
++    "a4:b6:ce:e3:2e:d3:35:46:26:3c:b3:55:3a:a8:92:21", "CertiID Enterprise Certificate Authority", // DigiNotar intermediate signed by "DigiNotar Root CA G2"\r
++    "5b:d5:60:9c:64:17:68:cf:21:0e:35:fd:fb:05:ad:41", "DigiNotar Qualified CA", // DigiNotar intermediate signed by DigiNotar Root\r
++\r
++    "1184640176",                                      "DigiNotar Services 1024 CA", // DigiNotar intermediate cross-signed by Entrust\r
++    "120000525",                                       "DigiNotar Cyber CA", // DigiNotar intermediate cross-signed by CyberTrust\r
++    "120000505",                                       "DigiNotar Cyber CA", // DigiNotar intermediate cross-signed by CyberTrust\r
++    "120000515",                                       "DigiNotar Cyber CA", // DigiNotar intermediate cross-signed by CyberTrust\r
++    "20015536",                                        "DigiNotar PKIoverheid CA Overheid en Bedrijven", // DigiNotar intermediate cross-signed by the Dutch government\r
++    "20001983",                                        "DigiNotar PKIoverheid CA Organisatie - G2", // DigiNotar intermediate cross-signed by the Dutch government\r
++    "d6:d0:29:77:f1:49:fd:1a:83:f2:b9:ea:94:8c:5c:b4", "DigiNotar Extended Validation CA", // DigiNotar intermediate signed by DigiNotar EV Root\r
++    "1e:7d:7a:53:3d:45:30:41:96:40:0f:71:48:1f:45:04", "DigiNotar Public CA 2025", // DigiNotar intermediate\r
++//    "(has not been seen in the wild so far)", "DigiNotar Public CA - G2", // DigiNotar intermediate\r
++//    "(has not been seen in the wild so far)", "Koninklijke Notariele Beroepsorganisatie CA", // compromised during DigiNotar breach\r
++//    "(has not been seen in the wild so far)", "Stichting TTP Infos CA," // compromised during DigiNotar breach\r
++    "1184640175", "DigiNotar Root CA", // DigiNotar intermediate cross-signed by Entrust\r
++    "1184644297", "DigiNotar Root CA", // DigiNotar intermediate cross-signed by Entrust\r
+     0\r
+ };\r
\r
+ bool QSslCertificatePrivate::isBlacklisted(const QSslCertificate &certificate)\r
+ {\r
+     for (int a = 0; certificate_blacklist[a] != 0; a++) {\r
+-        if (certificate.serialNumber() == certificate_blacklist[a])\r
++        QString blacklistedCommonName = QString::fromUtf8(certificate_blacklist[(a+1)]);\r
++        if (certificate.serialNumber() == certificate_blacklist[a++] &&\r
++            (certificate.subjectInfo(QSslCertificate::CommonName) == blacklistedCommonName ||\r
++             certificate.issuerInfo(QSslCertificate::CommonName) == blacklistedCommonName))\r
+             return true;\r
+     }\r
+     return false;\r
+diff --git a/src/network/ssl/qsslsocket_openssl.cpp b/src/network/ssl/qsslsocket_openssl.cpp\r
+index 141d80a..b8e6c4c 100644\r
+--- a/src/network/ssl/qsslsocket_openssl.cpp\r
++++ b/src/network/ssl/qsslsocket_openssl.cpp\r
+@@ -1193,12 +1193,16 @@ bool QSslSocketBackendPrivate::startHandshake()\r
+     X509 *x509 = q_SSL_get_peer_certificate(ssl);\r
+     configuration.peerCertificate = QSslCertificatePrivate::QSslCertificate_from_X509(x509);\r
+     q_X509_free(x509);\r
+-    if (QSslCertificatePrivate::isBlacklisted(configuration.peerCertificate)) {\r
+-        q->setErrorString(QSslSocket::tr("The peer certificate is blacklisted"));\r
+-        q->setSocketError(QAbstractSocket::SslHandshakeFailedError);\r
+-        emit q->error(QAbstractSocket::SslHandshakeFailedError);\r
+-        plainSocket->disconnectFromHost();\r
+-        return false;\r
++\r
++    // check the whole chain for blacklisting (including root, as we check for subjectInfo and issuer)\r
++    foreach (const QSslCertificate &cert, configuration.peerCertificateChain) {\r
++        if (QSslCertificatePrivate::isBlacklisted(cert)) {\r
++            q->setErrorString(QSslSocket::tr("The peer certificate is blacklisted"));\r
++            q->setSocketError(QAbstractSocket::SslHandshakeFailedError);\r
++            emit q->error(QAbstractSocket::SslHandshakeFailedError);\r
++            plainSocket->disconnectFromHost();\r
++            return false;\r
++        }\r
+     }\r
\r
+     // Start translating errors.\r
diff --git a/recipes/qt4/qt-4.7.4/fix-translations.patch b/recipes/qt4/qt-4.7.4/fix-translations.patch
new file mode 100644 (file)
index 0000000..fe20b5b
--- /dev/null
@@ -0,0 +1,22 @@
+diff --git a/translations/translations.pro b/translations/translations.pro
+index cdaf04a..24fa668 100644
+--- a/translations/translations.pro
++++ b/translations/translations.pro
+@@ -20,7 +20,7 @@ updateqm.name = LRELEASE ${QMAKE_FILE_IN}
+ updateqm.CONFIG += no_link
+ QMAKE_EXTRA_COMPILERS += updateqm
+-isEmpty(vcproj) {
++!isEmpty(vcproj) {
+     QMAKE_LINK = @: IGNORE THIS LINE
+     OBJECTS_DIR =
+     win32:CONFIG -= embed_manifest_exe
+@@ -30,7 +30,7 @@ isEmpty(vcproj) {
+     phony_src.input = PHONY_DEPS
+     phony_src.output = phony.c
+     phony_src.variable_out = GENERATED_SOURCES
+-    phony_src.commands = echo int main() { return 0; } > phony.c
++    phony_src.commands = echo \"int main() { return 0; }\" > phony.c
+     phony_src.name = CREATE phony.c
+     phony_src.CONFIG += combine
+     QMAKE_EXTRA_COMPILERS += phony_src
diff --git a/recipes/qt4/qt-4.7.4/g++.conf b/recipes/qt4/qt-4.7.4/g++.conf
new file mode 100644 (file)
index 0000000..80f925c
--- /dev/null
@@ -0,0 +1,60 @@
+#
+# qmake configuration for common gcc
+#
+
+QMAKE_CC       = $(OE_QMAKE_CC)
+QMAKE_CFLAGS       += -pipe $(OE_QMAKE_CFLAGS)
+QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += $(OE_QMAKE_CFLAGS)
+QMAKE_CFLAGS_DEPS      += -M
+QMAKE_CFLAGS_WARN_ON   += -Wall -W
+QMAKE_CFLAGS_WARN_OFF  += -w
+QMAKE_CFLAGS_RELEASE   +=
+QMAKE_CFLAGS_DEBUG     += -g
+QMAKE_CFLAGS_SHLIB     += -fPIC
+QMAKE_CFLAGS_STATIC_LIB        += -fPIC
+QMAKE_CFLAGS_YACC      += -Wno-unused -Wno-parentheses
+QMAKE_CFLAGS_HIDESYMS   += -fvisibility=hidden
+QMAKE_CFLAGS_PRECOMPILE += -x c-header -c ${QMAKE_PCH_INPUT} -o ${QMAKE_PCH_OUTPUT}
+QMAKE_CFLAGS_USE_PRECOMPILE += -include ${QMAKE_PCH_OUTPUT_BASE}
+
+QMAKE_CXX      = $(OE_QMAKE_CXX)
+QMAKE_CXXFLAGS     += $$QMAKE_CFLAGS $(OE_QMAKE_CXXFLAGS)
+QMAKE_CXXFLAGS_DEPS    += $$QMAKE_CFLAGS_DEPS
+QMAKE_CXXFLAGS_WARN_ON += $$QMAKE_CFLAGS_WARN_ON
+QMAKE_CXXFLAGS_WARN_OFF        += $$QMAKE_CFLAGS_WARN_OFF
+QMAKE_CXXFLAGS_RELEASE += $$QMAKE_CFLAGS_RELEASE
+QMAKE_CXXFLAGS_RELEASE_WITH_DEBUGINFO += $$QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO
+QMAKE_CXXFLAGS_DEBUG   += $$QMAKE_CFLAGS_DEBUG
+QMAKE_CXXFLAGS_SHLIB   += $$QMAKE_CFLAGS_SHLIB
+QMAKE_CXXFLAGS_STATIC_LIB += $$QMAKE_CFLAGS_STATIC_LIB
+QMAKE_CXXFLAGS_YACC    += $$QMAKE_CFLAGS_YACC
+QMAKE_CXXFLAGS_HIDESYMS += $$QMAKE_CFLAGS_HIDESYMS -fvisibility-inlines-hidden
+QMAKE_CXXFLAGS_PRECOMPILE += -x c++-header -c ${QMAKE_PCH_INPUT} -o ${QMAKE_PCH_OUTPUT}
+QMAKE_CXXFLAGS_USE_PRECOMPILE = $$QMAKE_CFLAGS_USE_PRECOMPILE
+
+QMAKE_LINK     = $(OE_QMAKE_LINK)
+QMAKE_LINK_SHLIB   = $(OE_QMAKE_LINK)
+QMAKE_LINK_C           = $(OE_QMAKE_LINK)
+QMAKE_LINK_C_SHLIB     = $(OE_QMAKE_LINK)
+QMAKE_LFLAGS       += $(OE_QMAKE_LDFLAGS)
+QMAKE_LFLAGS_RELEASE   +=
+QMAKE_LFLAGS_DEBUG     +=
+QMAKE_LFLAGS_APP       +=
+QMAKE_LFLAGS_SHLIB     += -shared
+QMAKE_LFLAGS_PLUGIN    += $$QMAKE_LFLAGS_SHLIB
+QMAKE_LFLAGS_SONAME    += -Wl,-soname,
+QMAKE_LFLAGS_THREAD    +=
+QMAKE_LFLAGS_NOUNDEF   += -Wl,--no-undefined
+QMAKE_LFLAGS_RPATH        = -Wl,-rpath-link,
+
+QMAKE_PCH_OUTPUT_EXT    = .gch
+
+# -Bsymbolic-functions (ld) support
+QMAKE_LFLAGS_BSYMBOLIC_FUNC = -Wl,-Bsymbolic-functions
+QMAKE_LFLAGS_DYNAMIC_LIST = -Wl,--dynamic-list,
+
+# some linking helper...
+CONFIG += rpath_libdirs
+
+# for the SDK
+isEmpty(QMAKE_QT_CONFIG):QMAKE_QT_CONFIG = $(OE_QMAKE_QT_CONFIG)
diff --git a/recipes/qt4/qt-4.7.4/hack-out-pg2-4.7.0.patch b/recipes/qt4/qt-4.7.4/hack-out-pg2-4.7.0.patch
new file mode 100644 (file)
index 0000000..5c588ff
--- /dev/null
@@ -0,0 +1,19 @@
+Index: qt-everywhere-opensource-src-4.7.0/configure
+===================================================================
+--- qt-everywhere-opensource-src-4.7.0.orig/configure  2010-09-22 15:43:51.191162141 -0400
++++ qt-everywhere-opensource-src-4.7.0/configure       2010-09-22 15:44:35.179981232 -0400
+@@ -4921,10 +4921,10 @@
+         psql)
+             if [ "$CFG_SQL_psql" != "no" ]; then
+                 # Be careful not to use native pg_config when cross building.
+-                if [ "$XPLATFORM_MINGW" != "yes" ] && "$WHICH" pg_config >/dev/null 2>&1; then
+-                    QT_CFLAGS_PSQL=`pg_config --includedir 2>/dev/null`
+-                    QT_LFLAGS_PSQL=`pg_config --libdir 2>/dev/null`
+-                fi
++#                if [ "$XPLATFORM_MINGW" != "yes" ] && "$WHICH" pg_config >/dev/null 2>&1; then
++#                    QT_CFLAGS_PSQL=`pg_config --includedir 2>/dev/null`
++#                    QT_LFLAGS_PSQL=`pg_config --libdir 2>/dev/null`
++#                fi
+                 [ -z "$QT_CFLAGS_PSQL" ] || QT_CFLAGS_PSQL="-I$QT_CFLAGS_PSQL"
+                 [ -z "$QT_LFLAGS_PSQL" ] || QT_LFLAGS_PSQL="-L$QT_LFLAGS_PSQL"
+                 # But, respect PSQL_LIBS if set
diff --git a/recipes/qt4/qt-4.7.4/linux.conf b/recipes/qt4/qt-4.7.4/linux.conf
new file mode 100644 (file)
index 0000000..a541355
--- /dev/null
@@ -0,0 +1,66 @@
+#
+# qmake configuration for common linux
+#
+
+QMAKE_CFLAGS_THREAD    += -D_REENTRANT
+QMAKE_CXXFLAGS_THREAD  += $$QMAKE_CFLAGS_THREAD
+
+QMAKE_INCDIR          =
+QMAKE_LIBDIR          =
+QMAKE_INCDIR_X11      =
+QMAKE_LIBDIR_X11      =
+QMAKE_INCDIR_QT       = $(OE_QMAKE_INCDIR_QT)
+QMAKE_LIBDIR_QT       = $(OE_QMAKE_LIBDIR_QT)
+QMAKE_INCDIR_OPENGL   =
+QMAKE_LIBDIR_OPENGL   =
+QMAKE_INCDIR_OPENGL_ES1 = $$QMAKE_INCDIR_OPENGL
+QMAKE_LIBDIR_OPENGL_ES1 = $$QMAKE_LIBDIR_OPENGL
+QMAKE_INCDIR_OPENGL_ES2 = $$QMAKE_INCDIR_OPENGL
+QMAKE_LIBDIR_OPENGL_ES2 = $$QMAKE_LIBDIR_OPENGL
+QMAKE_INCDIR_EGL      =
+QMAKE_LIBDIR_EGL      =
+QMAKE_INCDIR_OPENVG   =
+QMAKE_LIBDIR_OPENVG   =
+
+
+QMAKE_LIBS            =
+QMAKE_LIBS_DYNLOAD    = -ldl
+QMAKE_LIBS_X11        = $(OE_QMAKE_LIBS_X11)
+QMAKE_LIBS_X11SM      = $(OE_QMAKE_LIBS_X11SM)
+QMAKE_LIBS_NIS        = -lnsl
+QMAKE_LIBS_EGL        = -lEGL
+QMAKE_LIBS_OPENGL     = -lGLU -lGL
+QMAKE_LIBS_OPENGL_QT  = -lGL
+QMAKE_LIBS_OPENGL_ES1 = -lGLES_CM
+QMAKE_LIBS_OPENGL_ES2 = -lGLESv2
+QMAKE_LIBS_OPENVG     = -lOpenVG
+QMAKE_LIBS_THREAD     = -lpthread
+
+QMAKE_MOC             = $(OE_QMAKE_MOC)
+QMAKE_UIC             = $(OE_QMAKE_UIC)
+QMAKE_UIC3            = $(OE_QMAKE_UIC3)
+QMAKE_RCC             = $(OE_QMAKE_RCC)
+QMAKE_QDBUSCPP2XML    = $(OE_QMAKE_QDBUSCPP2XML)
+QMAKE_QDBUSXML2CPP    = $(OE_QMAKE_QDBUSXML2CPP)
+
+QMAKE_AR              = $(OE_QMAKE_AR) cqs
+QMAKE_OBJCOPY         = objcopy
+QMAKE_RANLIB          =
+
+QMAKE_TAR             = tar -cf
+QMAKE_GZIP            = gzip -9f
+
+QMAKE_COPY            = cp -f
+QMAKE_COPY_FILE       = $(COPY)
+QMAKE_COPY_DIR        = $(COPY) -r
+QMAKE_MOVE            = mv -f
+QMAKE_DEL_FILE        = rm -f
+QMAKE_DEL_DIR         = rmdir
+QMAKE_STRIP           = $(OE_QMAKE_STRIP)
+QMAKE_STRIPFLAGS_LIB += --strip-unneeded
+QMAKE_CHK_DIR_EXISTS  = test -d
+QMAKE_MKDIR           = mkdir -p
+QMAKE_INSTALL_FILE    = install -m 644 -p
+QMAKE_INSTALL_PROGRAM = install -m 755 -p
+
+include(unix.conf)
diff --git a/recipes/qt4/qt4-embedded-gles_4.7.4.bb b/recipes/qt4/qt4-embedded-gles_4.7.4.bb
new file mode 100644 (file)
index 0000000..8ab5a6c
--- /dev/null
@@ -0,0 +1,19 @@
+DEFAULT_PREFERENCE = "-1"
+
+require qt4-embedded.inc
+
+PR = "${INC_PR}.10"
+
+QT_CONFIG_FLAGS_append_armv6 = " -no-neon "
+
+PROVIDES += "qt4-embedded"
+QT_GLFLAGS = "-opengl es2 -depths 16,24,32  -plugin-gfx-powervr"
+FILESPATHPKG .= ":qt4-embedded-${PV}:qt4-embedded"
+
+require qt-${PV}.inc
+
+QT_CONFIG_FLAGS += " \
+ -exceptions \
+"
+
index a2134c0..3388035 100644 (file)
@@ -1,17 +1,17 @@
 SUMMARY = "Qt is a versatile cross-platform application framework -- this is the embedded version."
 SECTION = "libs"
-LICENSE = "GPL QPL"
+LICENSE = "LGPLv2.1 GPLv3"
 PRIORITY = "optional"
-HOMEPAGE = "http://www.trolltech.com"
+HOMEPAGE = "https://qt.nokia.com/"
 DEPENDS += "directfb tslib"
-INC_PR = "r29"
+INC_PR = "r33"
 
 QT_BASE_NAME ?= "qt4-embedded"
 QT_BASE_LIB  ?= "libqt-embedded"
 QT_DIR_NAME = "qtopia"
 QT_LIBINFIX = "E"
 
-SRC_URI = "ftp://ftp.trolltech.com/qt/source/qt-embedded-linux-opensource-src-${PV}.tar.bz2 \
+SRC_URI = "http://get.qt.nokia.com/qt/source/qt-embedded-linux-opensource-src-${PV}.tar.bz2 \
            file://0001-cross-compile.patch;patch=1 \
            file://0002-fix-resinit-declaration.patch;patch=1 \
            file://0003-no-tools.patch;patch=1 \
diff --git a/recipes/qt4/qt4-embedded_4.7.1.bb b/recipes/qt4/qt4-embedded_4.7.1.bb
deleted file mode 100644 (file)
index edae353..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-DEFAULT_PREFERENCE = "-1"
-DEFAULT_PREFERENCE_opendreambox = "1"
-
-require qt4-embedded.inc
-
-PR = "${INC_PR}.1"
-
-QT_CONFIG_FLAGS_append_armv6 = " -no-neon "
-
-require qt-${PV}.inc
-
-QT_CONFIG_FLAGS += " \
- -exceptions \
-"
-
diff --git a/recipes/qt4/qt4-embedded_4.7.4.bb b/recipes/qt4/qt4-embedded_4.7.4.bb
new file mode 100644 (file)
index 0000000..047ac97
--- /dev/null
@@ -0,0 +1,21 @@
+DEFAULT_PREFERENCE = "-1"
+
+require qt4-embedded.inc
+
+PR = "${INC_PR}.1"
+
+QT_CONFIG_FLAGS_append_armv6 = " -no-neon "
+
+require qt-${PV}.inc
+
+# SRC_URI from qt4-embedded.inc was replaced in .inc above and qte.sh lost
+# Set necessary variables in the profile
+SRC_URI += "file://qte.sh"
+
+QT_CONFIG_FLAGS += " \
+ -exceptions \
+"
+
+PR .= "-dream2"
+
+QT_CONFIG_FLAGS := "${@oe_filter_out('^(-webkit)$', '${QT_CONFIG_FLAGS}', d)} -no-webkit"
diff --git a/recipes/qt4/qt4-native.inc b/recipes/qt4/qt4-native.inc
new file mode 100644 (file)
index 0000000..278e93e
--- /dev/null
@@ -0,0 +1,84 @@
+DESCRIPTION = "Native version Qt/[X11|Mac|Embedded]"
+DEPENDS = "zlib-native dbus-native"
+SECTION = "libs"
+HOMEPAGE = "https://qt.nokia.com/"
+PRIORITY = "optional"
+LICENSE = "LGPLv2.1 GPLv3"
+PROVIDES = "qt4-tools-native"
+
+INC_PR = "r1"
+
+inherit native
+
+SRC_URI = "http://get.qt.nokia.com/qt/source/qt-everywhere-opensource-src-${PV}.tar.gz \
+           file://qt-config.patch \
+           file://g++.conf \
+           file://linux.conf"
+S = "${WORKDIR}/qt-everywhere-opensource-src-${PV}"
+
+EXTRA_OECONF = "-prefix ${prefix} \
+                -L ${STAGING_LIBDIR_NATIVE} \
+                -I ${STAGING_INCDIR_NATIVE} \
+                -qt-libjpeg -qt-gif -system-zlib \
+                -no-libjpeg -no-libpng -no-libmng -no-libtiff \
+                -no-accessibility \
+                -no-cups \
+                -no-nas-sound \
+                -no-nis -no-openssl \
+                -verbose -release \
+                -embedded -no-freetype -no-glib -no-iconv \
+                -exceptions -xmlpatterns \
+                -qt3support"
+
+# yank default -e, otherwise we get the following error:
+# moc_qbuffer.cpp: No such file or directory
+EXTRA_OEMAKE = " "
+
+do_configure() {
+   (echo o; echo yes) | ./configure ${EXTRA_OECONF} || die "Configuring qt failed. EXTRA_OECONF was ${EXTRA_OECONF}"
+}
+
+TOBUILD = "\
+  src/tools/moc \
+  src/corelib \
+  src/sql \
+  src/xml \
+  src/network \
+  src/tools/uic \
+  src/tools/rcc \
+  src/xmlpatterns \
+  src/dbus \
+  src/gui \
+  src/testlib \
+  src/qt3support \
+  src/tools/uic3 \
+  tools/linguist/lrelease \
+  tools/linguist/lupdate \
+  tools/qdbus \
+"
+
+do_compile() {
+    for i in ${TOBUILD}; do
+        cd ${S}/$i && oe_runmake CC="${CC}" CXX="${CXX}"
+    done
+}
+
+NATIVE_INSTALL_WORKS = "1"
+
+do_install() {
+    install -d ${D}${bindir}/
+    install -m 0755 bin/qmake ${D}${bindir}/qmake2
+    for i in moc uic uic3 rcc lrelease lupdate qdbuscpp2xml qdbusxml2cpp; do
+        install -m 0755 bin/${i} ${D}${bindir}/${i}4
+    done
+
+    install -d ${D}${datadir}/qt4/
+    cp -PfR mkspecs ${D}${datadir}/qt4/
+    ln -sf linux-g++ ${D}${datadir}/qt4/mkspecs/${BUILD_OS}-oe-g++
+    cp -f ${WORKDIR}/g++.conf ${WORKDIR}/linux.conf ${D}${datadir}/qt4/mkspecs/common/
+    install -m 0644 tools/porting/src/q3porting.xml ${D}${datadir}/qt4/
+
+    for i in ${TOBUILD}; do
+        cd ${S}/$i && oe_runmake install INSTALL_ROOT=${D}
+    done
+}
diff --git a/recipes/qt4/qt4-native_4.7.4.bb b/recipes/qt4/qt4-native_4.7.4.bb
new file mode 100644 (file)
index 0000000..e826ba6
--- /dev/null
@@ -0,0 +1,16 @@
+require qt4-native.inc
+LICENSE = "LGPLv2.1 GPLv3"
+
+PR = "${INC_PR}.0"
+
+# Find the g++.conf/linux.conf in the right directory.
+FILESPATHPKG =. "qt-${PV}:"
+SRC_URI = "http://get.qt.nokia.com/qt/source/qt-everywhere-opensource-src-${PV}.tar.gz \
+           file://qt-config.patch;patch=1 \
+           file://g++.conf \
+           file://linux.conf"
+S = "${WORKDIR}/qt-everywhere-opensource-src-${PV}"
+
+EXTRA_OECONF += " -no-fast -silent -no-rpath"
+
+TOBUILD := "src/tools/bootstrap ${TOBUILD}"
diff --git a/recipes/qt4/qt4-tools-native_4.7.1.bb b/recipes/qt4/qt4-tools-native_4.7.1.bb
deleted file mode 100644 (file)
index 8df7640..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-DEFAULT_PREFERENCE = "-1"
-DEFAULT_PREFERENCE_opendreambox = "1"
-DEFAULT_PREFERENCE_vuplus = "1"
-
-require qt4-tools-native.inc
-LICENSE = "LGPLv2.1 GPLv3"
-
-PR = "${INC_PR}.0"
-
-# Find the g++.conf/linux.conf in the right directory.
-FILESPATHPKG =. "qt-${PV}:"
-SRC_URI = "ftp://ftp.trolltech.com/qt/source/qt-everywhere-opensource-src-${PV}.tar.gz \
-           file://qt-config.patch;patch=1 \
-           file://g++.conf \
-           file://linux.conf"
-S = "${WORKDIR}/qt-everywhere-opensource-src-${PV}"
-
-EXTRA_OECONF += " -no-fast -silent -no-rpath"
-
-TOBUILD := "src/tools/bootstrap ${TOBUILD}"
diff --git a/recipes/qt4/qt4-tools-sdk.inc b/recipes/qt4/qt4-tools-sdk.inc
new file mode 100644 (file)
index 0000000..66e99ad
--- /dev/null
@@ -0,0 +1,88 @@
+DESCRIPTION = "SDK tools for Qt/[X11|Mac|Embedded] version 4.x"
+DEPENDS = "zlib-native dbus-native"
+SECTION = "libs"
+HOMEPAGE = "https://qt.nokia.com/"
+PRIORITY = "optional"
+LICENSE = "LGPLv2.1 GPLv3"
+
+INC_PR = "r3"
+
+FILESPATHPKG =. "qt-${PV}:"
+inherit sdk
+
+SRC_URI = "http://get.qt.nokia.com/qt/source/qt-everywhere-opensource-src-${PV}.tar.gz \
+           file://configure-lflags.patch;patch=1 \
+           file://compile.test-lflags.patch;patch=1 \
+           file://qt-config.patch;patch=1 \
+           file://g++.conf \
+           file://linux.conf"
+
+S = "${WORKDIR}/qt-everywhere-opensource-src-${PV}"
+
+
+# FIXME: make it work with "${STAGING_BINDIR_NATIVE}/pkg-config --cflags dbus-1"
+EXTRA_OECONF = "-prefix ${prefix} \
+                -qt-libjpeg -qt-gif -system-zlib \
+                -no-libjpeg -no-libpng -no-libmng -no-libtiff \
+                -no-accessibility \
+                -no-cups \
+                -no-exceptions  \
+                -no-nas-sound \
+                -no-nis -no-openssl \
+                -verbose -release -fast -static \
+                -embedded -no-freetype -no-glib -no-iconv \
+                -qt3support \
+                -I${STAGING_DIR}/${HOST_SYS}${target_includedir} \
+                -I${STAGING_DIR}/${HOST_SYS}${target_includedir}/dbus-1.0 \
+                -I${STAGING_DIR}/${HOST_SYS}${target_libdir}/dbus-1.0/include"
+
+# yank default -e, otherwise we get the following error:
+# moc_qbuffer.cpp: No such file or directory
+EXTRA_OEMAKE = " "
+
+do_configure() {
+   (echo o; echo yes) | ./configure ${EXTRA_OECONF} || die "Configuring qt failed. EXTRA_OECONF was ${EXTRA_OECONF}"
+}
+
+TOBUILD = "\
+  src/tools/bootstrap \
+  src/tools/moc \
+  src/corelib \
+  src/sql \
+  src/dbus \
+  src/qt3support \
+  src/xml \
+  src/tools/uic \
+  src/tools/rcc \
+  src/network \
+  src/gui \
+  src/tools/uic3 \
+  tools/linguist/lrelease \
+  tools/linguist/lupdate \
+  tools/qdbus \
+"
+
+do_compile() {
+    for i in ${TOBUILD}; do
+        cd ${S}/$i && oe_runmake CC="${CC}" CXX="${CXX}"
+    done
+}
+
+do_install() {
+    install -d ${D}${bindir}
+    install -m 0755 bin/qmake ${D}${bindir}/qmake2
+    for i in moc uic uic3 rcc lrelease lupdate qdbuscpp2xml qdbusxml2cpp; do
+        install -m 0755 bin/${i} ${D}${bindir}/${i}4
+    done
+
+       (cd ${D}${bindir}; \
+       ln -s qmake2 qmake; \
+       for i in moc uic uic3 rcc lrelease lupdate qdbuscpp2xml qdbusxml2cpp; do \
+               ln -s ${i}4 ${i}; \
+       done)
+
+       # make a symbolic link to mkspecs for compatibility with Nokia's SDK
+       # and QTCreator
+       (cd ${D}${bindir}/..; ln -s ${TARGET_SYS}/usr/share/qtopia/mkspecs mkspecs;)
+}
+
diff --git a/recipes/qt4/qt4-tools-sdk_4.7.4.bb b/recipes/qt4/qt4-tools-sdk_4.7.4.bb
new file mode 100644 (file)
index 0000000..ea5c802
--- /dev/null
@@ -0,0 +1,5 @@
+require qt4-tools-sdk.inc
+
+PR = "${INC_PR}.0"
+
+DEFAULT_PREFERENCE = "-1"
diff --git a/recipes/qt4/qt4-x11-free-gles_4.7.4.bb b/recipes/qt4/qt4-x11-free-gles_4.7.4.bb
new file mode 100644 (file)
index 0000000..bc4d7e4
--- /dev/null
@@ -0,0 +1,18 @@
+DEFAULT_PREFERENCE = "-1"
+
+require qt4-x11-free.inc
+PR = "${INC_PR}.7"
+
+QT_GLFLAGS = "-opengl es2 -depths 16,24,32 "
+
+require qt-${PV}.inc
+
+QT_CONFIG_FLAGS += " \
+ -no-embedded \
+ -xrandr \
+ -x11"
+
+FILESPATHPKG .= ":qt4-x11-free-${PV}:qt4-x11-free"
+
+DEPENDS += "virtual/egl"
+PROVIDES += "qt4-x11-free"
index 14bf6d8..f666aec 100644 (file)
@@ -1,13 +1,13 @@
 DESCRIPTION = "Qt is a versatile cross-platform application framework -- this is the X11 version."
 SECTION = "x11/libs"
 PRIORITY = "optional"
-HOMEPAGE = "http://www.trolltech.com"
-LICENSE = "GPL QPL"
+HOMEPAGE = "https://qt.nokia.com/"
+LICENSE = "LGPLv2.1 GPLv3"
 DEPENDS += "virtual/libx11 fontconfig libxft libxext libxrender libxrandr libxcursor"
 
-INC_PR = "r25"
+INC_PR = "r28"
 
-SRC_URI = "ftp://ftp.trolltech.com/qt/source/qt-x11-opensource-src-${PV}.tar.gz \
+SRC_URI = "http://get.qt.nokia.com/qt/source/qt-x11-opensource-src-${PV}.tar.gz \
            file://0001-cross-compile.patch;patch=1 \
            file://0002-fix-resinit-declaration.patch;patch=1 \
            file://0003-no-tools.patch;patch=1 \
diff --git a/recipes/qt4/qt4-x11-free_4.7.4.bb b/recipes/qt4/qt4-x11-free_4.7.4.bb
new file mode 100644 (file)
index 0000000..79a765e
--- /dev/null
@@ -0,0 +1,15 @@
+DEFAULT_PREFERENCE = "-1"
+
+require qt4-x11-free.inc
+
+PR = "${INC_PR}.0"
+
+QT_CONFIG_FLAGS_append_armv6 = " -no-neon "
+
+require qt-${PV}.inc
+
+QT_CONFIG_FLAGS += " \
+ -no-embedded \
+ -xrandr \
+ -x11"
+
index 1807497..b37e7ff 100644 (file)
@@ -1,6 +1,6 @@
 inherit qmake_base
 
-DEPENDS += "qt4-tools-native freetype jpeg libpng zlib dbus openssl glib-2.0 gstreamer gst-plugins-base mysql postgresql sqlite sqlite3"
+DEPENDS += "qt4-tools-native freetype jpeg libpng zlib dbus openssl glib-2.0 gstreamer gst-plugins-base mysql5 postgresql sqlite sqlite3"
 
 require qt4_arch.inc
 QT_ARCH := "${@qt_arch(d)}"
@@ -17,8 +17,9 @@ EXTRA_OEMAKE = "-e"
 EXTRA_ENV = 'QMAKE="${STAGING_BINDIR_NATIVE}/qmake2 -after \
              INCPATH+=${STAGING_INCDIR}/freetype2 LIBS+=-L${STAGING_LIBDIR}" \
              QMAKESPEC="${QMAKESPEC}" LINK="${CXX} -Wl,-rpath-link,${STAGING_LIBDIR}" \
-             AR="${TARGET_PREFIX}ar cqs" \
-             MOC="${STAGING_BINDIR_NATIVE}/moc4" UIC="${STAGING_BINDIR_NATIVE}/uic4" MAKE="make -e"'
+             AR="${TARGET_PREFIX}ar cqs" QMAKE_LRELEASE="${STAGING_BINDIR_NATIVE}/lrelease4" \
+             QMAKE_RCC="${STAGING_BINDIR_NATIVE}/rcc4" QMAKE_MOC="${STAGING_BINDIR_NATIVE}/moc4" \
+             QMAKE_UIC="${STAGING_BINDIR_NATIVE}/uic4" MAKE="make -e"'
 
 export QT_CONF_PATH="${WORKDIR}/qt.conf"
 
@@ -90,7 +91,8 @@ OTHER_PACKAGES = "\
              ${QT_BASE_NAME}-pixeltool \
              ${QT_BASE_NAME}-qmlviewer \
              ${QT_BASE_NAME}-xmlpatterns \
-             ${QT_BASE_NAME}-qt3to4"
+             ${QT_BASE_NAME}-qt3to4 \
+             ${QT_BASE_NAME}-qml-plugins"
 
 PACKAGES += "${LIB_PACKAGES} ${DEV_PACKAGES} ${DBG_PACKAGES} ${OTHER_PACKAGES}"
 PACKAGES_DYNAMIC = "${QT_BASE_NAME}-plugin-* ${QT_BASE_NAME}-translation-* ${QT_BASE_NAME}-fonts-*"
@@ -142,7 +144,8 @@ FILES_${QT_BASE_NAME}-makeqpf-dbg          = "${bindir}/.debug/makeqpf"
 FILES_${QT_BASE_NAME}-mkspecs              = "${datadir}/${QT_DIR_NAME}/mkspecs/*"
 FILES_${QT_BASE_NAME}-xmlpatterns          = "${bindir}/xmlpatterns*"
 FILES_${QT_BASE_NAME}-xmlpatterns-dbg      = "${bindir}/.debug/xmlpatterns*"
-
+FILES_${QT_BASE_NAME}-qml-plugins          = "${libdir}/${QT_DIR_NAME}/imports/*"
+FILES_${QT_BASE_NAME}-qml-plugins-dbg      = "${libdir}/${QT_DIR_NAME}/imports/*/*/*/.debug/* ${libdir}/${QT_DIR_NAME}/imports/*/.debug"
 
 do_configure() {
     unset QMAKESPEC
@@ -165,6 +168,7 @@ do_configure() {
     echo "Libraries=${libdir}"                    >> $QT_CONF_PATH
     echo "Binaries=${bindir}"                     >> $QT_CONF_PATH
     echo "Plugins=${libdir}/${QT_DIR_NAME}/plugins" >> $QT_CONF_PATH
+    echo "Imports=${libdir}/${QT_DIR_NAME}/imports" >> $QT_CONF_PATH
     echo "Data=${datadir}/${QT_DIR_NAME}"         >> $QT_CONF_PATH
     echo "Translations=${datadir}/${QT_DIR_NAME}/translations" >> $QT_CONF_PATH
     echo "Settings=${sysconfdir}/${QT_DIR_NAME}"  >> $QT_CONF_PATH
@@ -182,6 +186,7 @@ do_configure() {
             -docdir ${docdir}/${QT_DIR_NAME} \
             -headerdir ${includedir}/${QT_DIR_NAME} \
             -plugindir ${libdir}/${QT_DIR_NAME}/plugins \
+            -importdir ${libdir}/${QT_DIR_NAME}/imports \
             -translationdir ${datadir}/${QT_DIR_NAME}/translations \
             -examplesdir ${bindir}/${QT_DIR_NAME}/examples \
             -demosdir ${bindir}/${QT_DIR_NAME}/demos \
index 8044b1a..4ac741d 100644 (file)
@@ -1,7 +1,7 @@
 DESCRIPTION = "OpenDreambox: Base Task for the OpenDreambox Distribution"
 SECTION = "opendreambox/base"
 LICENSE = "MIT"
-PR = "r6"
+PR = "r7"
 
 inherit task
 
@@ -46,6 +46,7 @@ OPENDREAMBOX_BASE_OPTIONAL_RECOMMENDS = "\
   ppp \
   smartmontools \
   avahi-daemon \
+  kernel-module-usbhid \
 "
 
 RDEPENDS_${PN} = "\
diff --git a/recipes/v4l-dvb/files/backport-1.patch b/recipes/v4l-dvb/files/backport-1.patch
new file mode 100644 (file)
index 0000000..a5db033
--- /dev/null
@@ -0,0 +1,89 @@
+commit 6456850a46ab40923206cc3952d29ab375361604
+Author: Andreas Oberritter <obi@linuxtv.org>
+Date:   Mon May 9 00:03:34 2011 +0100
+
+    [media] DVB: return meaningful error codes in dvb_frontend
+    
+    - Return values should not be ORed. Abort early instead.
+    - Return -EINVAL instead of -1.
+    
+    Signed-off-by: Andreas Oberritter <obi@linuxtv.org>
+    Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
+
+--- a/drivers/media/dvb/dvb-core/dvb_frontend.c        2011-08-09 18:26:58.288244025 +0200
++++ b/drivers/media/dvb/dvb-core/dvb_frontend.c        2011-08-09 18:41:03.576233778 +0200
+@@ -1337,12 +1337,12 @@
+               tvp->u.data = fe->dtv_property_cache.isdbs_ts_id;
+               break;
+       default:
+-              r = -1;
++              return -EINVAL;
+       }
+       dtv_property_dump(tvp);
+-      return r;
++      return 0;
+ }
+ static int dtv_property_process_set(struct dvb_frontend *fe,
+@@ -1355,11 +1355,11 @@
+       dtv_property_dump(tvp);
+       /* Allow the frontend to validate incoming properties */
+-      if (fe->ops.set_property)
++      if (fe->ops.set_property) {
+               r = fe->ops.set_property(fe, tvp);
+-
+-      if (r < 0)
+-              return r;
++              if (r < 0)
++                      return r;
++      }
+       switch(tvp->cmd) {
+       case DTV_CLEAR:
+@@ -1378,7 +1378,7 @@
+               dprintk("%s() Finalised property cache\n", __func__);
+               dtv_property_cache_submit(fe);
+-              r |= dvb_frontend_ioctl_legacy(inode, file, FE_SET_FRONTEND,
++              r = dvb_frontend_ioctl_legacy(inode, file, FE_SET_FRONTEND,
+                       &fepriv->parameters);
+               break;
+       case DTV_FREQUENCY:
+@@ -1493,7 +1493,7 @@
+               fe->dtv_property_cache.isdbs_ts_id = tvp->u.data;
+               break;
+       default:
+-              r = -1;
++              return -EINVAL;
+       }
+       return r;
+@@ -1567,8 +1567,10 @@
+               }
+               for (i = 0; i < tvps->num; i++) {
+-                      (tvp + i)->result = dtv_property_process_set(fe, tvp + i, inode, file);
+-                      err |= (tvp + i)->result;
++                      err = dtv_property_process_set(fe, tvp + i, inode, file);
++                      if (err < 0)
++                              goto out;
++                      (tvp+i)->result = err;
+               }
+               if(fe->dtv_property_cache.state == DTV_TUNE)
+@@ -1599,8 +1601,10 @@
+               }
+               for (i = 0; i < tvps->num; i++) {
+-                      (tvp + i)->result = dtv_property_process_get(fe, tvp + i, inode, file);
+-                      err |= (tvp + i)->result;
++                      err = dtv_property_process_get(fe, tvp + i, inode, file);
++                      if (err < 0)
++                              goto out;
++                      (tvp + i)->result = err;
+               }
+               if (copy_to_user(tvps->props, tvp, tvps->num * sizeof(struct dtv_property))) {
diff --git a/recipes/v4l-dvb/files/backport-2.patch b/recipes/v4l-dvb/files/backport-2.patch
new file mode 100644 (file)
index 0000000..c87a336
--- /dev/null
@@ -0,0 +1,74 @@
+commit 2f0c73d58ed8e1b8c8b6ba8f9e2c4fefd5e05b04
+Author: Andreas Oberritter <obi@linuxtv.org>
+Date:   Sun May 8 20:03:35 2011 -0300
+
+    [media] DVB: dtv_property_cache_submit shouldn't modifiy the cache
+    
+    - Use const pointers and remove assignments.
+    - delivery_system already gets assigned by DTV_DELIVERY_SYSTEM
+      and dtv_property_cache_sync.
+    
+    Signed-off-by: Andreas Oberritter <obi@linuxtv.org>
+    Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
+
+diff -Naur a/drivers/media/dvb/dvb-core/dvb_frontend.c b/drivers/media/dvb/dvb-core/dvb_frontend.c
+--- a/drivers/media/dvb/dvb-core/dvb_frontend.c        2011-08-09 18:41:03.000000000 +0200
++++ b/drivers/media/dvb/dvb-core/dvb_frontend.c        2011-08-09 18:44:24.680231340 +0200
+@@ -1087,7 +1087,7 @@
+  */
+ static void dtv_property_legacy_params_sync(struct dvb_frontend *fe)
+ {
+-      struct dtv_frontend_properties *c = &fe->dtv_property_cache;
++      const struct dtv_frontend_properties *c = &fe->dtv_property_cache;
+       struct dvb_frontend_private *fepriv = fe->frontend_priv;
+       struct dvb_frontend_parameters *p = &fepriv->parameters;
+@@ -1099,14 +1099,12 @@
+               dprintk("%s() Preparing QPSK req\n", __func__);
+               p->u.qpsk.symbol_rate = c->symbol_rate;
+               p->u.qpsk.fec_inner = c->fec_inner;
+-              c->delivery_system = SYS_DVBS;
+               break;
+       case FE_QAM:
+               dprintk("%s() Preparing QAM req\n", __func__);
+               p->u.qam.symbol_rate = c->symbol_rate;
+               p->u.qam.fec_inner = c->fec_inner;
+               p->u.qam.modulation = c->modulation;
+-              c->delivery_system = SYS_DVBC_ANNEX_AC;
+               break;
+       case FE_OFDM:
+               dprintk("%s() Preparing OFDM req\n", __func__);
+@@ -1124,15 +1122,10 @@
+               p->u.ofdm.transmission_mode = c->transmission_mode;
+               p->u.ofdm.guard_interval = c->guard_interval;
+               p->u.ofdm.hierarchy_information = c->hierarchy;
+-              c->delivery_system = SYS_DVBT;
+               break;
+       case FE_ATSC:
+               dprintk("%s() Preparing VSB req\n", __func__);
+               p->u.vsb.modulation = c->modulation;
+-              if ((c->modulation == VSB_8) || (c->modulation == VSB_16))
+-                      c->delivery_system = SYS_ATSC;
+-              else
+-                      c->delivery_system = SYS_DVBC_ANNEX_B;
+               break;
+       }
+ }
+@@ -1142,7 +1135,7 @@
+  */
+ static void dtv_property_adv_params_sync(struct dvb_frontend *fe)
+ {
+-      struct dtv_frontend_properties *c = &fe->dtv_property_cache;
++      const struct dtv_frontend_properties *c = &fe->dtv_property_cache;
+       struct dvb_frontend_private *fepriv = fe->frontend_priv;
+       struct dvb_frontend_parameters *p = &fepriv->parameters;
+@@ -1183,7 +1176,7 @@
+ static void dtv_property_cache_submit(struct dvb_frontend *fe)
+ {
+-      struct dtv_frontend_properties *c = &fe->dtv_property_cache;
++      const struct dtv_frontend_properties *c = &fe->dtv_property_cache;
+       /* For legacy delivery systems we don't need the delivery_system to
+        * be specified, but we populate the older structures from the cache
diff --git a/recipes/v4l-dvb/files/backport-3.patch b/recipes/v4l-dvb/files/backport-3.patch
new file mode 100644 (file)
index 0000000..5138ecd
--- /dev/null
@@ -0,0 +1,45 @@
+commit 062fefd89c64f2cdb7b249653b7279384b4ed293
+Author: Andreas Oberritter <obi@linuxtv.org>
+Date:   Sun May 8 20:03:36 2011 -0300
+
+    [media] DVB: call get_property at the end of dtv_property_process_get
+    
+    - Drivers should be able to override properties returned to the user.
+    - The default values get prefilled from the cache.
+    
+    Signed-off-by: Andreas Oberritter <obi@linuxtv.org>
+    Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
+
+diff -Naur a/drivers/media/dvb/dvb-core/dvb_frontend.c b/drivers/media/dvb/dvb-core/dvb_frontend.c
+--- a/drivers/media/dvb/dvb-core/dvb_frontend.c        2011-08-09 18:49:55.528227327 +0200
++++ b/drivers/media/dvb/dvb-core/dvb_frontend.c        2011-08-09 18:50:17.336227064 +0200
+@@ -1209,14 +1209,7 @@
+                                   struct dtv_property *tvp,
+                                   struct inode *inode, struct file *file)
+ {
+-      int r = 0;
+-
+-      /* Allow the frontend to validate incoming properties */
+-      if (fe->ops.get_property)
+-              r = fe->ops.get_property(fe, tvp);
+-
+-      if (r < 0)
+-              return r;
++      int r;
+       switch(tvp->cmd) {
+       case DTV_FREQUENCY:
+@@ -1333,6 +1326,13 @@
+               return -EINVAL;
+       }
++      /* Allow the frontend to override outgoing properties */
++      if (fe->ops.get_property) {
++              r = fe->ops.get_property(fe, tvp);
++              if (r < 0)
++                      return r;
++      }
++
+       dtv_property_dump(tvp);
+       return 0;
diff --git a/recipes/v4l-dvb/files/backport-4.patch b/recipes/v4l-dvb/files/backport-4.patch
new file mode 100644 (file)
index 0000000..2af7486
--- /dev/null
@@ -0,0 +1,216 @@
+commit 96186d136da7f713a4f3b1b9eea1275ff29daf15
+Author: Andreas Oberritter <obi@linuxtv.org>
+Date:   Sun May 8 20:03:37 2011 -0300
+
+    [media] DVB: dvb_frontend: rename parameters to parameters_in
+    
+    - Preparation to distinguish input parameters from output parameters.
+    
+    Signed-off-by: Andreas Oberritter <obi@linuxtv.org>
+    Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
+
+diff -Naur a/drivers/media/dvb/dvb-core/dvb_frontend.c b/drivers/media/dvb/dvb-core/dvb_frontend.c
+--- a/drivers/media/dvb/dvb-core/dvb_frontend.c        2011-08-09 18:51:54.432225885 +0200
++++ b/drivers/media/dvb/dvb-core/dvb_frontend.c        2011-08-09 18:53:00.416225085 +0200
+@@ -112,7 +112,7 @@
+       /* thread/frontend values */
+       struct dvb_device *dvbdev;
+-      struct dvb_frontend_parameters parameters;
++      struct dvb_frontend_parameters parameters_in;
+       struct dvb_fe_events events;
+       struct semaphore sem;
+       struct list_head list_head;
+@@ -167,7 +167,7 @@
+       e = &events->events[events->eventw];
+-      memcpy (&e->parameters, &fepriv->parameters,
++      memcpy (&e->parameters, &fepriv->parameters_in,
+               sizeof (struct dvb_frontend_parameters));
+       if (status & FE_HAS_LOCK)
+@@ -284,12 +284,12 @@
+       int ready = 0;
+       int fe_set_err = 0;
+       struct dvb_frontend_private *fepriv = fe->frontend_priv;
+-      int original_inversion = fepriv->parameters.inversion;
+-      u32 original_frequency = fepriv->parameters.frequency;
++      int original_inversion = fepriv->parameters_in.inversion;
++      u32 original_frequency = fepriv->parameters_in.frequency;
+       /* are we using autoinversion? */
+       autoinversion = ((!(fe->ops.info.caps & FE_CAN_INVERSION_AUTO)) &&
+-                       (fepriv->parameters.inversion == INVERSION_AUTO));
++                       (fepriv->parameters_in.inversion == INVERSION_AUTO));
+       /* setup parameters correctly */
+       while(!ready) {
+@@ -355,18 +355,18 @@
+               fepriv->auto_step, fepriv->auto_sub_step, fepriv->started_auto_step);
+       /* set the frontend itself */
+-      fepriv->parameters.frequency += fepriv->lnb_drift;
++      fepriv->parameters_in.frequency += fepriv->lnb_drift;
+       if (autoinversion)
+-              fepriv->parameters.inversion = fepriv->inversion;
++              fepriv->parameters_in.inversion = fepriv->inversion;
+       if (fe->ops.set_frontend)
+-              fe_set_err = fe->ops.set_frontend(fe, &fepriv->parameters);
++              fe_set_err = fe->ops.set_frontend(fe, &fepriv->parameters_in);
+       if (fe_set_err < 0) {
+               fepriv->state = FESTATE_ERROR;
+               return fe_set_err;
+       }
+-      fepriv->parameters.frequency = original_frequency;
+-      fepriv->parameters.inversion = original_inversion;
++      fepriv->parameters_in.frequency = original_frequency;
++      fepriv->parameters_in.inversion = original_inversion;
+       fepriv->auto_sub_step++;
+       return 0;
+@@ -390,7 +390,7 @@
+               if (fepriv->state & FESTATE_RETUNE) {
+                       if (fe->ops.set_frontend)
+                               retval = fe->ops.set_frontend(fe,
+-                                                      &fepriv->parameters);
++                                                      &fepriv->parameters_in);
+                       if (retval < 0)
+                               fepriv->state = FESTATE_ERROR;
+                       else
+@@ -420,8 +420,8 @@
+               /* if we're tuned, then we have determined the correct inversion */
+               if ((!(fe->ops.info.caps & FE_CAN_INVERSION_AUTO)) &&
+-                  (fepriv->parameters.inversion == INVERSION_AUTO)) {
+-                      fepriv->parameters.inversion = fepriv->inversion;
++                  (fepriv->parameters_in.inversion == INVERSION_AUTO)) {
++                      fepriv->parameters_in.inversion = fepriv->inversion;
+               }
+               return;
+       }
+@@ -607,7 +607,7 @@
+                               if (fepriv->state & FESTATE_RETUNE) {
+                                       dprintk("%s: Retune requested, FESTATE_RETUNE\n", __func__);
+-                                      params = &fepriv->parameters;
++                                      params = &fepriv->parameters_in;
+                                       fepriv->state = FESTATE_TUNED;
+                               }
+@@ -629,7 +629,7 @@
+                               dprintk("%s: Frontend ALGO = DVBFE_ALGO_CUSTOM, state=%d\n", __func__, fepriv->state);
+                               if (fepriv->state & FESTATE_RETUNE) {
+                                       dprintk("%s: Retune requested, FESTAT_RETUNE\n", __func__);
+-                                      params = &fepriv->parameters;
++                                      params = &fepriv->parameters_in;
+                                       fepriv->state = FESTATE_TUNED;
+                               }
+                               /* Case where we are going to search for a carrier
+@@ -638,7 +638,7 @@
+                                */
+                               if (fepriv->algo_status & DVBFE_ALGO_SEARCH_AGAIN) {
+                                       if (fe->ops.search) {
+-                                              fepriv->algo_status = fe->ops.search(fe, &fepriv->parameters);
++                                              fepriv->algo_status = fe->ops.search(fe, &fepriv->parameters_in);
+                                               /* We did do a search as was requested, the flags are
+                                                * now unset as well and has the flags wrt to search.
+                                                */
+@@ -649,7 +649,7 @@
+                               /* Track the carrier if the search was successful */
+                               if (fepriv->algo_status == DVBFE_ALGO_SEARCH_SUCCESS) {
+                                       if (fe->ops.track)
+-                                              fe->ops.track(fe, &fepriv->parameters);
++                                              fe->ops.track(fe, &fepriv->parameters_in);
+                               } else {
+                                       fepriv->algo_status |= DVBFE_ALGO_SEARCH_AGAIN;
+                                       fepriv->delay = HZ / 2;
+@@ -1089,7 +1089,7 @@
+ {
+       const struct dtv_frontend_properties *c = &fe->dtv_property_cache;
+       struct dvb_frontend_private *fepriv = fe->frontend_priv;
+-      struct dvb_frontend_parameters *p = &fepriv->parameters;
++      struct dvb_frontend_parameters *p = &fepriv->parameters_in;
+       p->frequency = c->frequency;
+       p->inversion = c->inversion;
+@@ -1137,7 +1137,7 @@
+ {
+       const struct dtv_frontend_properties *c = &fe->dtv_property_cache;
+       struct dvb_frontend_private *fepriv = fe->frontend_priv;
+-      struct dvb_frontend_parameters *p = &fepriv->parameters;
++      struct dvb_frontend_parameters *p = &fepriv->parameters_in;
+       p->frequency = c->frequency;
+       p->inversion = c->inversion;
+@@ -1372,7 +1372,7 @@
+               dtv_property_cache_submit(fe);
+               r = dvb_frontend_ioctl_legacy(inode, file, FE_SET_FRONTEND,
+-                      &fepriv->parameters);
++                      &fepriv->parameters_in);
+               break;
+       case DTV_FREQUENCY:
+               fe->dtv_property_cache.frequency = tvp->u.data;
+@@ -1800,7 +1800,7 @@
+               struct dvb_frontend_tune_settings fetunesettings;
+               if(fe->dtv_property_cache.state == DTV_TUNE) {
+-                      if (dvb_frontend_check_parameters(fe, &fepriv->parameters) < 0) {
++                      if (dvb_frontend_check_parameters(fe, &fepriv->parameters_in) < 0) {
+                               err = -EINVAL;
+                               break;
+                       }
+@@ -1810,9 +1810,9 @@
+                               break;
+                       }
+-                      memcpy (&fepriv->parameters, parg,
++                      memcpy (&fepriv->parameters_in, parg,
+                               sizeof (struct dvb_frontend_parameters));
+-                      dtv_property_cache_sync(fe, &fepriv->parameters);
++                      dtv_property_cache_sync(fe, &fepriv->parameters_in);
+               }
+               memset(&fetunesettings, 0, sizeof(struct dvb_frontend_tune_settings));
+@@ -1821,15 +1821,15 @@
+               /* force auto frequency inversion if requested */
+               if (dvb_force_auto_inversion) {
+-                      fepriv->parameters.inversion = INVERSION_AUTO;
++                      fepriv->parameters_in.inversion = INVERSION_AUTO;
+                       fetunesettings.parameters.inversion = INVERSION_AUTO;
+               }
+               if (fe->ops.info.type == FE_OFDM) {
+                       /* without hierarchical coding code_rate_LP is irrelevant,
+                        * so we tolerate the otherwise invalid FEC_NONE setting */
+-                      if (fepriv->parameters.u.ofdm.hierarchy_information == HIERARCHY_NONE &&
+-                          fepriv->parameters.u.ofdm.code_rate_LP == FEC_NONE)
+-                              fepriv->parameters.u.ofdm.code_rate_LP = FEC_AUTO;
++                      if (fepriv->parameters_in.u.ofdm.hierarchy_information == HIERARCHY_NONE &&
++                          fepriv->parameters_in.u.ofdm.code_rate_LP == FEC_NONE)
++                              fepriv->parameters_in.u.ofdm.code_rate_LP = FEC_AUTO;
+               }
+               /* get frontend-specific tuning settings */
+@@ -1842,8 +1842,8 @@
+                       switch(fe->ops.info.type) {
+                       case FE_QPSK:
+                               fepriv->min_delay = HZ/20;
+-                              fepriv->step_size = fepriv->parameters.u.qpsk.symbol_rate / 16000;
+-                              fepriv->max_drift = fepriv->parameters.u.qpsk.symbol_rate / 2000;
++                              fepriv->step_size = fepriv->parameters_in.u.qpsk.symbol_rate / 16000;
++                              fepriv->max_drift = fepriv->parameters_in.u.qpsk.symbol_rate / 2000;
+                               break;
+                       case FE_QAM:
+@@ -1885,7 +1885,7 @@
+       case FE_GET_FRONTEND:
+               if (fe->ops.get_frontend) {
+-                      memcpy (parg, &fepriv->parameters, sizeof (struct dvb_frontend_parameters));
++                      memcpy (parg, &fepriv->parameters_in, sizeof (struct dvb_frontend_parameters));
+                       err = fe->ops.get_frontend(fe, (struct dvb_frontend_parameters*) parg);
+               }
+               break;
diff --git a/recipes/v4l-dvb/files/backport-5.patch b/recipes/v4l-dvb/files/backport-5.patch
new file mode 100644 (file)
index 0000000..f3da78a
--- /dev/null
@@ -0,0 +1,24 @@
+commit 8a1147ee8a19ec6e2437bbb73d549ce8670a38e5
+Author: Andreas Oberritter <obi@linuxtv.org>
+Date:   Sun May 8 20:03:38 2011 -0300
+
+    [media] DVB: dvb_frontend: remove unused assignments
+    
+    Signed-off-by: Andreas Oberritter <obi@linuxtv.org>
+    Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
+
+diff -Naur a/drivers/media/dvb/dvb-core/dvb_frontend.c b/drivers/media/dvb/dvb-core/dvb_frontend.c
+--- a/drivers/media/dvb/dvb-core/dvb_frontend.c        2011-08-09 18:54:28.720224016 +0200
++++ b/drivers/media/dvb/dvb-core/dvb_frontend.c        2011-08-09 18:54:36.168223926 +0200
+@@ -625,11 +625,9 @@
+                               dvb_frontend_swzigzag(fe);
+                               break;
+                       case DVBFE_ALGO_CUSTOM:
+-                              params = NULL; /* have we been asked to RETUNE ?        */
+                               dprintk("%s: Frontend ALGO = DVBFE_ALGO_CUSTOM, state=%d\n", __func__, fepriv->state);
+                               if (fepriv->state & FESTATE_RETUNE) {
+                                       dprintk("%s: Retune requested, FESTAT_RETUNE\n", __func__);
+-                                      params = &fepriv->parameters_in;
+                                       fepriv->state = FESTATE_TUNED;
+                               }
+                               /* Case where we are going to search for a carrier
diff --git a/recipes/v4l-dvb/files/backport-6.patch b/recipes/v4l-dvb/files/backport-6.patch
new file mode 100644 (file)
index 0000000..de35682
--- /dev/null
@@ -0,0 +1,446 @@
+commit 9e332f6087c1bac263298afc3ef96c368131cbc1
+Author: Andreas Oberritter <obi@linuxtv.org>
+Date:   Sun May 8 20:03:39 2011 -0300
+
+    [media] DVB: dvb_frontend: use shortcut to access fe->dtv_property_cache
+    
+    Signed-off-by: Andreas Oberritter <obi@linuxtv.org>
+    Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
+    
+    Conflicts:
+    
+       drivers/media/dvb/dvb-core/dvb_frontend.c
+
+diff -Naur a/drivers/media/dvb/dvb-core/dvb_frontend.c b/drivers/media/dvb/dvb-core/dvb_frontend.c
+--- a/drivers/media/dvb/dvb-core/dvb_frontend.c        2011-08-09 18:55:42.736223117 +0200
++++ b/drivers/media/dvb/dvb-core/dvb_frontend.c        2011-08-09 18:57:42.520221665 +0200
+@@ -871,34 +871,34 @@
+ static int dvb_frontend_clear_cache(struct dvb_frontend *fe)
+ {
++      struct dtv_frontend_properties *c = &fe->dtv_property_cache;
+       int i;
+-      memset(&(fe->dtv_property_cache), 0,
+-                      sizeof(struct dtv_frontend_properties));
++      memset(c, 0, sizeof(struct dtv_frontend_properties));
+-      fe->dtv_property_cache.state = DTV_CLEAR;
+-      fe->dtv_property_cache.delivery_system = SYS_UNDEFINED;
+-      fe->dtv_property_cache.inversion = INVERSION_AUTO;
+-      fe->dtv_property_cache.fec_inner = FEC_AUTO;
+-      fe->dtv_property_cache.transmission_mode = TRANSMISSION_MODE_AUTO;
+-      fe->dtv_property_cache.bandwidth_hz = BANDWIDTH_AUTO;
+-      fe->dtv_property_cache.guard_interval = GUARD_INTERVAL_AUTO;
+-      fe->dtv_property_cache.hierarchy = HIERARCHY_AUTO;
+-      fe->dtv_property_cache.symbol_rate = QAM_AUTO;
+-      fe->dtv_property_cache.code_rate_HP = FEC_AUTO;
+-      fe->dtv_property_cache.code_rate_LP = FEC_AUTO;
+-
+-      fe->dtv_property_cache.isdbt_partial_reception = -1;
+-      fe->dtv_property_cache.isdbt_sb_mode = -1;
+-      fe->dtv_property_cache.isdbt_sb_subchannel = -1;
+-      fe->dtv_property_cache.isdbt_sb_segment_idx = -1;
+-      fe->dtv_property_cache.isdbt_sb_segment_count = -1;
+-      fe->dtv_property_cache.isdbt_layer_enabled = 0x7;
++      c->state = DTV_CLEAR;
++      c->delivery_system = SYS_UNDEFINED;
++      c->inversion = INVERSION_AUTO;
++      c->fec_inner = FEC_AUTO;
++      c->transmission_mode = TRANSMISSION_MODE_AUTO;
++      c->bandwidth_hz = BANDWIDTH_AUTO;
++      c->guard_interval = GUARD_INTERVAL_AUTO;
++      c->hierarchy = HIERARCHY_AUTO;
++      c->symbol_rate = QAM_AUTO;
++      c->code_rate_HP = FEC_AUTO;
++      c->code_rate_LP = FEC_AUTO;
++
++      c->isdbt_partial_reception = -1;
++      c->isdbt_sb_mode = -1;
++      c->isdbt_sb_subchannel = -1;
++      c->isdbt_sb_segment_idx = -1;
++      c->isdbt_sb_segment_count = -1;
++      c->isdbt_layer_enabled = 0x7;
+       for (i = 0; i < 3; i++) {
+-              fe->dtv_property_cache.layer[i].fec = FEC_AUTO;
+-              fe->dtv_property_cache.layer[i].modulation = QAM_AUTO;
+-              fe->dtv_property_cache.layer[i].interleaving = -1;
+-              fe->dtv_property_cache.layer[i].segment_count = -1;
++              c->layer[i].fec = FEC_AUTO;
++              c->layer[i].modulation = QAM_AUTO;
++              c->layer[i].interleaving = -1;
++              c->layer[i].segment_count = -1;
+       }
+       return 0;
+@@ -1207,118 +1207,119 @@
+                                   struct dtv_property *tvp,
+                                   struct inode *inode, struct file *file)
+ {
++      const struct dtv_frontend_properties *c = &fe->dtv_property_cache;
+       int r;
+       switch(tvp->cmd) {
+       case DTV_FREQUENCY:
+-              tvp->u.data = fe->dtv_property_cache.frequency;
++              tvp->u.data = c->frequency;
+               break;
+       case DTV_MODULATION:
+-              tvp->u.data = fe->dtv_property_cache.modulation;
++              tvp->u.data = c->modulation;
+               break;
+       case DTV_BANDWIDTH_HZ:
+-              tvp->u.data = fe->dtv_property_cache.bandwidth_hz;
++              tvp->u.data = c->bandwidth_hz;
+               break;
+       case DTV_INVERSION:
+-              tvp->u.data = fe->dtv_property_cache.inversion;
++              tvp->u.data = c->inversion;
+               break;
+       case DTV_SYMBOL_RATE:
+-              tvp->u.data = fe->dtv_property_cache.symbol_rate;
++              tvp->u.data = c->symbol_rate;
+               break;
+       case DTV_INNER_FEC:
+-              tvp->u.data = fe->dtv_property_cache.fec_inner;
++              tvp->u.data = c->fec_inner;
+               break;
+       case DTV_PILOT:
+-              tvp->u.data = fe->dtv_property_cache.pilot;
++              tvp->u.data = c->pilot;
+               break;
+       case DTV_ROLLOFF:
+-              tvp->u.data = fe->dtv_property_cache.rolloff;
++              tvp->u.data = c->rolloff;
+               break;
+       case DTV_DELIVERY_SYSTEM:
+-              tvp->u.data = fe->dtv_property_cache.delivery_system;
++              tvp->u.data = c->delivery_system;
+               break;
+       case DTV_VOLTAGE:
+-              tvp->u.data = fe->dtv_property_cache.voltage;
++              tvp->u.data = c->voltage;
+               break;
+       case DTV_TONE:
+-              tvp->u.data = fe->dtv_property_cache.sectone;
++              tvp->u.data = c->sectone;
+               break;
+       case DTV_API_VERSION:
+               tvp->u.data = (DVB_API_VERSION << 8) | DVB_API_VERSION_MINOR;
+               break;
+       case DTV_CODE_RATE_HP:
+-              tvp->u.data = fe->dtv_property_cache.code_rate_HP;
++              tvp->u.data = c->code_rate_HP;
+               break;
+       case DTV_CODE_RATE_LP:
+-              tvp->u.data = fe->dtv_property_cache.code_rate_LP;
++              tvp->u.data = c->code_rate_LP;
+               break;
+       case DTV_GUARD_INTERVAL:
+-              tvp->u.data = fe->dtv_property_cache.guard_interval;
++              tvp->u.data = c->guard_interval;
+               break;
+       case DTV_TRANSMISSION_MODE:
+-              tvp->u.data = fe->dtv_property_cache.transmission_mode;
++              tvp->u.data = c->transmission_mode;
+               break;
+       case DTV_HIERARCHY:
+-              tvp->u.data = fe->dtv_property_cache.hierarchy;
++              tvp->u.data = c->hierarchy;
+               break;
+       /* ISDB-T Support here */
+       case DTV_ISDBT_PARTIAL_RECEPTION:
+-              tvp->u.data = fe->dtv_property_cache.isdbt_partial_reception;
++              tvp->u.data = c->isdbt_partial_reception;
+               break;
+       case DTV_ISDBT_SOUND_BROADCASTING:
+-              tvp->u.data = fe->dtv_property_cache.isdbt_sb_mode;
++              tvp->u.data = c->isdbt_sb_mode;
+               break;
+       case DTV_ISDBT_SB_SUBCHANNEL_ID:
+-              tvp->u.data = fe->dtv_property_cache.isdbt_sb_subchannel;
++              tvp->u.data = c->isdbt_sb_subchannel;
+               break;
+       case DTV_ISDBT_SB_SEGMENT_IDX:
+-              tvp->u.data = fe->dtv_property_cache.isdbt_sb_segment_idx;
++              tvp->u.data = c->isdbt_sb_segment_idx;
+               break;
+       case DTV_ISDBT_SB_SEGMENT_COUNT:
+-              tvp->u.data = fe->dtv_property_cache.isdbt_sb_segment_count;
++              tvp->u.data = c->isdbt_sb_segment_count;
+               break;
+       case DTV_ISDBT_LAYER_ENABLED:
+-              tvp->u.data = fe->dtv_property_cache.isdbt_layer_enabled;
++              tvp->u.data = c->isdbt_layer_enabled;
+               break;
+       case DTV_ISDBT_LAYERA_FEC:
+-              tvp->u.data = fe->dtv_property_cache.layer[0].fec;
++              tvp->u.data = c->layer[0].fec;
+               break;
+       case DTV_ISDBT_LAYERA_MODULATION:
+-              tvp->u.data = fe->dtv_property_cache.layer[0].modulation;
++              tvp->u.data = c->layer[0].modulation;
+               break;
+       case DTV_ISDBT_LAYERA_SEGMENT_COUNT:
+-              tvp->u.data = fe->dtv_property_cache.layer[0].segment_count;
++              tvp->u.data = c->layer[0].segment_count;
+               break;
+       case DTV_ISDBT_LAYERA_TIME_INTERLEAVING:
+-              tvp->u.data = fe->dtv_property_cache.layer[0].interleaving;
++              tvp->u.data = c->layer[0].interleaving;
+               break;
+       case DTV_ISDBT_LAYERB_FEC:
+-              tvp->u.data = fe->dtv_property_cache.layer[1].fec;
++              tvp->u.data = c->layer[1].fec;
+               break;
+       case DTV_ISDBT_LAYERB_MODULATION:
+-              tvp->u.data = fe->dtv_property_cache.layer[1].modulation;
++              tvp->u.data = c->layer[1].modulation;
+               break;
+       case DTV_ISDBT_LAYERB_SEGMENT_COUNT:
+-              tvp->u.data = fe->dtv_property_cache.layer[1].segment_count;
++              tvp->u.data = c->layer[1].segment_count;
+               break;
+       case DTV_ISDBT_LAYERB_TIME_INTERLEAVING:
+-              tvp->u.data = fe->dtv_property_cache.layer[1].interleaving;
++              tvp->u.data = c->layer[1].interleaving;
+               break;
+       case DTV_ISDBT_LAYERC_FEC:
+-              tvp->u.data = fe->dtv_property_cache.layer[2].fec;
++              tvp->u.data = c->layer[2].fec;
+               break;
+       case DTV_ISDBT_LAYERC_MODULATION:
+-              tvp->u.data = fe->dtv_property_cache.layer[2].modulation;
++              tvp->u.data = c->layer[2].modulation;
+               break;
+       case DTV_ISDBT_LAYERC_SEGMENT_COUNT:
+-              tvp->u.data = fe->dtv_property_cache.layer[2].segment_count;
++              tvp->u.data = c->layer[2].segment_count;
+               break;
+       case DTV_ISDBT_LAYERC_TIME_INTERLEAVING:
+-              tvp->u.data = fe->dtv_property_cache.layer[2].interleaving;
++              tvp->u.data = c->layer[2].interleaving;
+               break;
+       case DTV_ISDBS_TS_ID:
+-              tvp->u.data = fe->dtv_property_cache.isdbs_ts_id;
++              tvp->u.data = c->isdbs_ts_id;
+               break;
+       default:
+               return -EINVAL;
+@@ -1342,6 +1343,7 @@
+                                   struct file *file)
+ {
+       int r = 0;
++      struct dtv_frontend_properties *c = &fe->dtv_property_cache;
+       struct dvb_frontend_private *fepriv = fe->frontend_priv;
+       dtv_property_dump(tvp);
+@@ -1365,7 +1367,7 @@
+                * tunerequest so we can pass validation in the FE_SET_FRONTEND
+                * ioctl.
+                */
+-              fe->dtv_property_cache.state = tvp->cmd;
++              c->state = tvp->cmd;
+               dprintk("%s() Finalised property cache\n", __func__);
+               dtv_property_cache_submit(fe);
+@@ -1373,115 +1375,115 @@
+                       &fepriv->parameters_in);
+               break;
+       case DTV_FREQUENCY:
+-              fe->dtv_property_cache.frequency = tvp->u.data;
++              c->frequency = tvp->u.data;
+               break;
+       case DTV_MODULATION:
+-              fe->dtv_property_cache.modulation = tvp->u.data;
++              c->modulation = tvp->u.data;
+               break;
+       case DTV_BANDWIDTH_HZ:
+-              fe->dtv_property_cache.bandwidth_hz = tvp->u.data;
++              c->bandwidth_hz = tvp->u.data;
+               break;
+       case DTV_INVERSION:
+-              fe->dtv_property_cache.inversion = tvp->u.data;
++              c->inversion = tvp->u.data;
+               break;
+       case DTV_SYMBOL_RATE:
+-              fe->dtv_property_cache.symbol_rate = tvp->u.data;
++              c->symbol_rate = tvp->u.data;
+               break;
+       case DTV_INNER_FEC:
+-              fe->dtv_property_cache.fec_inner = tvp->u.data;
++              c->fec_inner = tvp->u.data;
+               break;
+       case DTV_PILOT:
+-              fe->dtv_property_cache.pilot = tvp->u.data;
++              c->pilot = tvp->u.data;
+               break;
+       case DTV_ROLLOFF:
+-              fe->dtv_property_cache.rolloff = tvp->u.data;
++              c->rolloff = tvp->u.data;
+               break;
+       case DTV_DELIVERY_SYSTEM:
+-              fe->dtv_property_cache.delivery_system = tvp->u.data;
++              c->delivery_system = tvp->u.data;
+               break;
+       case DTV_VOLTAGE:
+-              fe->dtv_property_cache.voltage = tvp->u.data;
++              c->voltage = tvp->u.data;
+               r = dvb_frontend_ioctl_legacy(inode, file, FE_SET_VOLTAGE,
+-                      (void *)fe->dtv_property_cache.voltage);
++                      (void *)c->voltage);
+               break;
+       case DTV_TONE:
+-              fe->dtv_property_cache.sectone = tvp->u.data;
++              c->sectone = tvp->u.data;
+               r = dvb_frontend_ioctl_legacy(inode, file, FE_SET_TONE,
+-                      (void *)fe->dtv_property_cache.sectone);
++                      (void *)c->sectone);
+               break;
+       case DTV_CODE_RATE_HP:
+-              fe->dtv_property_cache.code_rate_HP = tvp->u.data;
++              c->code_rate_HP = tvp->u.data;
+               break;
+       case DTV_CODE_RATE_LP:
+-              fe->dtv_property_cache.code_rate_LP = tvp->u.data;
++              c->code_rate_LP = tvp->u.data;
+               break;
+       case DTV_GUARD_INTERVAL:
+-              fe->dtv_property_cache.guard_interval = tvp->u.data;
++              c->guard_interval = tvp->u.data;
+               break;
+       case DTV_TRANSMISSION_MODE:
+-              fe->dtv_property_cache.transmission_mode = tvp->u.data;
++              c->transmission_mode = tvp->u.data;
+               break;
+       case DTV_HIERARCHY:
+-              fe->dtv_property_cache.hierarchy = tvp->u.data;
++              c->hierarchy = tvp->u.data;
+               break;
+       /* ISDB-T Support here */
+       case DTV_ISDBT_PARTIAL_RECEPTION:
+-              fe->dtv_property_cache.isdbt_partial_reception = tvp->u.data;
++              c->isdbt_partial_reception = tvp->u.data;
+               break;
+       case DTV_ISDBT_SOUND_BROADCASTING:
+-              fe->dtv_property_cache.isdbt_sb_mode = tvp->u.data;
++              c->isdbt_sb_mode = tvp->u.data;
+               break;
+       case DTV_ISDBT_SB_SUBCHANNEL_ID:
+-              fe->dtv_property_cache.isdbt_sb_subchannel = tvp->u.data;
++              c->isdbt_sb_subchannel = tvp->u.data;
+               break;
+       case DTV_ISDBT_SB_SEGMENT_IDX:
+-              fe->dtv_property_cache.isdbt_sb_segment_idx = tvp->u.data;
++              c->isdbt_sb_segment_idx = tvp->u.data;
+               break;
+       case DTV_ISDBT_SB_SEGMENT_COUNT:
+-              fe->dtv_property_cache.isdbt_sb_segment_count = tvp->u.data;
++              c->isdbt_sb_segment_count = tvp->u.data;
+               break;
+       case DTV_ISDBT_LAYER_ENABLED:
+-              fe->dtv_property_cache.isdbt_layer_enabled = tvp->u.data;
++              c->isdbt_layer_enabled = tvp->u.data;
+               break;
+       case DTV_ISDBT_LAYERA_FEC:
+-              fe->dtv_property_cache.layer[0].fec = tvp->u.data;
++              c->layer[0].fec = tvp->u.data;
+               break;
+       case DTV_ISDBT_LAYERA_MODULATION:
+-              fe->dtv_property_cache.layer[0].modulation = tvp->u.data;
++              c->layer[0].modulation = tvp->u.data;
+               break;
+       case DTV_ISDBT_LAYERA_SEGMENT_COUNT:
+-              fe->dtv_property_cache.layer[0].segment_count = tvp->u.data;
++              c->layer[0].segment_count = tvp->u.data;
+               break;
+       case DTV_ISDBT_LAYERA_TIME_INTERLEAVING:
+-              fe->dtv_property_cache.layer[0].interleaving = tvp->u.data;
++              c->layer[0].interleaving = tvp->u.data;
+               break;
+       case DTV_ISDBT_LAYERB_FEC:
+-              fe->dtv_property_cache.layer[1].fec = tvp->u.data;
++              c->layer[1].fec = tvp->u.data;
+               break;
+       case DTV_ISDBT_LAYERB_MODULATION:
+-              fe->dtv_property_cache.layer[1].modulation = tvp->u.data;
++              c->layer[1].modulation = tvp->u.data;
+               break;
+       case DTV_ISDBT_LAYERB_SEGMENT_COUNT:
+-              fe->dtv_property_cache.layer[1].segment_count = tvp->u.data;
++              c->layer[1].segment_count = tvp->u.data;
+               break;
+       case DTV_ISDBT_LAYERB_TIME_INTERLEAVING:
+-              fe->dtv_property_cache.layer[1].interleaving = tvp->u.data;
++              c->layer[1].interleaving = tvp->u.data;
+               break;
+       case DTV_ISDBT_LAYERC_FEC:
+-              fe->dtv_property_cache.layer[2].fec = tvp->u.data;
++              c->layer[2].fec = tvp->u.data;
+               break;
+       case DTV_ISDBT_LAYERC_MODULATION:
+-              fe->dtv_property_cache.layer[2].modulation = tvp->u.data;
++              c->layer[2].modulation = tvp->u.data;
+               break;
+       case DTV_ISDBT_LAYERC_SEGMENT_COUNT:
+-              fe->dtv_property_cache.layer[2].segment_count = tvp->u.data;
++              c->layer[2].segment_count = tvp->u.data;
+               break;
+       case DTV_ISDBT_LAYERC_TIME_INTERLEAVING:
+-              fe->dtv_property_cache.layer[2].interleaving = tvp->u.data;
++              c->layer[2].interleaving = tvp->u.data;
+               break;
+       case DTV_ISDBS_TS_ID:
+-              fe->dtv_property_cache.isdbs_ts_id = tvp->u.data;
++              c->isdbs_ts_id = tvp->u.data;
+               break;
+       default:
+               return -EINVAL;
+@@ -1495,6 +1497,7 @@
+ {
+       struct dvb_device *dvbdev = file->private_data;
+       struct dvb_frontend *fe = dvbdev->priv;
++      struct dtv_frontend_properties *c = &fe->dtv_property_cache;
+       struct dvb_frontend_private *fepriv = fe->frontend_priv;
+       int err = -EOPNOTSUPP;
+@@ -1514,7 +1517,7 @@
+       if ((cmd == FE_SET_PROPERTY) || (cmd == FE_GET_PROPERTY))
+               err = dvb_frontend_ioctl_properties(inode, file, cmd, parg);
+       else {
+-              fe->dtv_property_cache.state = DTV_UNDEFINED;
++              c->state = DTV_UNDEFINED;
+               err = dvb_frontend_ioctl_legacy(inode, file, cmd, parg);
+       }
+@@ -1527,6 +1530,7 @@
+ {
+       struct dvb_device *dvbdev = file->private_data;
+       struct dvb_frontend *fe = dvbdev->priv;
++      struct dtv_frontend_properties *c = &fe->dtv_property_cache;
+       int err = 0;
+       struct dtv_properties *tvps = NULL;
+@@ -1564,7 +1568,7 @@
+                       (tvp+i)->result = err;
+               }
+-              if(fe->dtv_property_cache.state == DTV_TUNE)
++              if (c->state == DTV_TUNE)
+                       dprintk("%s() Property cache is full, tuning\n", __func__);
+       } else
+@@ -1795,9 +1799,10 @@
+               break;
+       case FE_SET_FRONTEND: {
++              struct dtv_frontend_properties *c = &fe->dtv_property_cache;
+               struct dvb_frontend_tune_settings fetunesettings;
+-              if(fe->dtv_property_cache.state == DTV_TUNE) {
++              if (c->state == DTV_TUNE) {
+                       if (dvb_frontend_check_parameters(fe, &fepriv->parameters_in) < 0) {
+                               err = -EINVAL;
+                               break;
diff --git a/recipes/v4l-dvb/files/backport-7.patch b/recipes/v4l-dvb/files/backport-7.patch
new file mode 100644 (file)
index 0000000..e0eb5cc
--- /dev/null
@@ -0,0 +1,86 @@
+commit 6e7d9834a19c2925a237ed01eabe8dc42304df7d
+Author: Andreas Oberritter <obi@linuxtv.org>
+Date:   Sun May 8 20:03:40 2011 -0300
+
+    [media] DVB: dvb_frontend: add parameters_out
+    
+    - Holds the parameters detected by the demod.
+    - Updated on every call to get_frontend, either through ioctl or when
+      a frontend event occurs.
+    - Reset to input parameters after every call to set_frontend, tune or
+      search/track.
+    
+    Signed-off-by: Andreas Oberritter <obi@linuxtv.org>
+    Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
+
+diff -Naur a/drivers/media/dvb/dvb-core/dvb_frontend.c b/drivers/media/dvb/dvb-core/dvb_frontend.c
+--- a/drivers/media/dvb/dvb-core/dvb_frontend.c        2011-08-09 19:00:23.208219717 +0200
++++ b/drivers/media/dvb/dvb-core/dvb_frontend.c        2011-08-09 19:00:30.096219633 +0200
+@@ -113,6 +113,7 @@
+       /* thread/frontend values */
+       struct dvb_device *dvbdev;
+       struct dvb_frontend_parameters parameters_in;
++      struct dvb_frontend_parameters parameters_out;
+       struct dvb_fe_events events;
+       struct semaphore sem;
+       struct list_head list_head;
+@@ -167,12 +168,11 @@
+       e = &events->events[events->eventw];
+-      memcpy (&e->parameters, &fepriv->parameters_in,
+-              sizeof (struct dvb_frontend_parameters));
+-
+       if (status & FE_HAS_LOCK)
+               if (fe->ops.get_frontend)
+-                      fe->ops.get_frontend(fe, &e->parameters);
++                      fe->ops.get_frontend(fe, &fepriv->parameters_out);
++
++      e->parameters = fepriv->parameters_out;
+       events->eventw = wp;
+@@ -360,6 +360,7 @@
+               fepriv->parameters_in.inversion = fepriv->inversion;
+       if (fe->ops.set_frontend)
+               fe_set_err = fe->ops.set_frontend(fe, &fepriv->parameters_in);
++      fepriv->parameters_out = fepriv->parameters_in;
+       if (fe_set_err < 0) {
+               fepriv->state = FESTATE_ERROR;
+               return fe_set_err;
+@@ -391,6 +392,7 @@
+                       if (fe->ops.set_frontend)
+                               retval = fe->ops.set_frontend(fe,
+                                                       &fepriv->parameters_in);
++                      fepriv->parameters_out = fepriv->parameters_in;
+                       if (retval < 0)
+                               fepriv->state = FESTATE_ERROR;
+                       else
+@@ -613,6 +615,8 @@
+                               if (fe->ops.tune)
+                                       fe->ops.tune(fe, params, fepriv->tune_mode_flags, &fepriv->delay, &s);
++                              if (params)
++                                      fepriv->parameters_out = *params;
+                               if (s != fepriv->status && !(fepriv->tune_mode_flags & FE_TUNE_MODE_ONESHOT)) {
+                                       dprintk("%s: state changed, adding current state\n", __func__);
+@@ -652,6 +656,7 @@
+                                       fepriv->algo_status |= DVBFE_ALGO_SEARCH_AGAIN;
+                                       fepriv->delay = HZ / 2;
+                               }
++                              fepriv->parameters_out = fepriv->parameters_in;
+                               fe->ops.read_status(fe, &s);
+                               if (s != fepriv->status) {
+                                       dvb_frontend_add_event(fe, s); /* update event list */
+@@ -1888,8 +1893,8 @@
+       case FE_GET_FRONTEND:
+               if (fe->ops.get_frontend) {
+-                      memcpy (parg, &fepriv->parameters_in, sizeof (struct dvb_frontend_parameters));
+-                      err = fe->ops.get_frontend(fe, (struct dvb_frontend_parameters*) parg);
++                      err = fe->ops.get_frontend(fe, &fepriv->parameters_out);
++                      memcpy(parg, &fepriv->parameters_out, sizeof(struct dvb_frontend_parameters));
+               }
+               break;
diff --git a/recipes/v4l-dvb/files/backport-8.patch b/recipes/v4l-dvb/files/backport-8.patch
new file mode 100644 (file)
index 0000000..2db2aaf
--- /dev/null
@@ -0,0 +1,55 @@
+commit 35075fcffd4dfa8accdb8959fbbabdd3191a3577
+Author: Andreas Oberritter <obi@linuxtv.org>
+Date:   Sun May 8 20:03:41 2011 -0300
+
+    [media] DVB: allow to read back of detected parameters through S2API
+    
+    Signed-off-by: Andreas Oberritter <obi@linuxtv.org>
+    Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
+
+diff -Naur a/drivers/media/dvb/dvb-core/dvb_frontend.c b/drivers/media/dvb/dvb-core/dvb_frontend.c
+--- a/drivers/media/dvb/dvb-core/dvb_frontend.c        2011-08-09 19:01:32.088218884 +0200
++++ b/drivers/media/dvb/dvb-core/dvb_frontend.c        2011-08-09 19:02:11.280218408 +0200
+@@ -1036,10 +1036,9 @@
+  * it's being used for the legacy or new API, reducing code and complexity.
+  */
+ static void dtv_property_cache_sync(struct dvb_frontend *fe,
+-                                  struct dvb_frontend_parameters *p)
++                                  struct dtv_frontend_properties *c,
++                                  const struct dvb_frontend_parameters *p)
+ {
+-      struct dtv_frontend_properties *c = &fe->dtv_property_cache;
+-
+       c->frequency = p->frequency;
+       c->inversion = p->inversion;
+@@ -1213,8 +1212,20 @@
+                                   struct inode *inode, struct file *file)
+ {
+       const struct dtv_frontend_properties *c = &fe->dtv_property_cache;
++      struct dvb_frontend_private *fepriv = fe->frontend_priv;
++      struct dtv_frontend_properties cdetected;
+       int r;
++      /*
++       * If the driver implements a get_frontend function, then convert
++       * detected parameters to S2API properties.
++       */
++      if (fe->ops.get_frontend) {
++              cdetected = *c;
++              dtv_property_cache_sync(fe, &cdetected, &fepriv->parameters_out);
++              c = &cdetected;
++      }
++
+       switch(tvp->cmd) {
+       case DTV_FREQUENCY:
+               tvp->u.data = c->frequency;
+@@ -1820,7 +1831,7 @@
+                       memcpy (&fepriv->parameters_in, parg,
+                               sizeof (struct dvb_frontend_parameters));
+-                      dtv_property_cache_sync(fe, &fepriv->parameters_in);
++                      dtv_property_cache_sync(fe, c, &fepriv->parameters_in);
+               }
+               memset(&fetunesettings, 0, sizeof(struct dvb_frontend_tune_settings));
diff --git a/recipes/v4l-dvb/files/backport-9.patch b/recipes/v4l-dvb/files/backport-9.patch
new file mode 100644 (file)
index 0000000..c4d768a
--- /dev/null
@@ -0,0 +1,31 @@
+commit b0db82d74acaf2a8a22ac58b0b614378526af620
+Author: Andreas Oberritter <obi@linuxtv.org>
+Date:   Thu Aug 4 11:27:37 2011 +0000
+
+    DVB: dvb_frontend: fix stale parameters on initial frontend event
+    
+    - FE_SET_FRONTEND triggers a frontend event, which uses stale data.
+      Modify it to use the data given by the user.
+    
+    - Fixes a regression caused by a5959dbea37973a2440eeba39fba32c79d862ec2.
+    
+    Signed-off-by: Andreas Oberritter <obi@linuxtv.org>
+    Signed-off-by: ghost <andreas.monzner@multimedia-labs.de>
+
+diff -Naur a/drivers/media/dvb/dvb-core/dvb_frontend.c b/drivers/media/dvb/dvb-core/dvb_frontend.c
+--- a/drivers/media/dvb/dvb-core/dvb_frontend.c        2011-08-09 19:03:24.704217518 +0200
++++ b/drivers/media/dvb/dvb-core/dvb_frontend.c        2011-08-09 19:03:35.744217384 +0200
+@@ -1834,6 +1834,13 @@
+                       dtv_property_cache_sync(fe, c, &fepriv->parameters_in);
+               }
++              /*
++               * Initialize output parameters to match the values given by
++               * the user. FE_SET_FRONTEND triggers an initial frontend event
++               * with status = 0, which copies output parameters to userspace.
++               */
++              fepriv->parameters_out = fepriv->parameters_in;
++
+               memset(&fetunesettings, 0, sizeof(struct dvb_frontend_tune_settings));
+               memcpy(&fetunesettings.parameters, parg,
+                      sizeof (struct dvb_frontend_parameters));
diff --git a/recipes/v4l-dvb/files/backport-a.patch b/recipes/v4l-dvb/files/backport-a.patch
new file mode 100644 (file)
index 0000000..a178081
--- /dev/null
@@ -0,0 +1,26 @@
+commit bf2cc354668cd307cde6911bca31928a505f2b41
+Author: Andreas Oberritter <obi@linuxtv.org>
+Date:   Thu Aug 4 13:07:12 2011 +0000
+
+    DVB: dvb_frontend: avoid possible race condition on first event
+    
+    - Make sure the initial frontend event on FE_SET_FRONTEND gets
+      enqueued before the frontend thread wakes up.
+    
+    Signed-off-by: Andreas Oberritter <obi@linuxtv.org>
+    Signed-off-by: ghost <andreas.monzner@multimedia-labs.de>
+
+diff --git a/drivers/media/dvb/dvb-core/dvb_frontend.c b/drivers/media/dvb/dvb-core/dvb_frontend.c
+index b6904ed..7553358 100644
+--- a/drivers/media/dvb/dvb-core/dvb_frontend.c
++++ b/drivers/media/dvb/dvb-core/dvb_frontend.c
+@@ -1898,8 +1898,8 @@ static int dvb_frontend_ioctl_legacy(struct file *file,
+               /* Request the search algorithm to search */
+               fepriv->algo_status |= DVBFE_ALGO_SEARCH_AGAIN;
+-              dvb_frontend_wakeup(fe);
+               dvb_frontend_add_event(fe, 0);
++              dvb_frontend_wakeup(fe);
+               fepriv->status = 0;
+               err = 0;
+               break;
diff --git a/recipes/v4l-dvb/files/backport-b.patch b/recipes/v4l-dvb/files/backport-b.patch
new file mode 100644 (file)
index 0000000..0c9182f
--- /dev/null
@@ -0,0 +1,41 @@
+commit 77b78eb0d4d21e70b09983aded1c4c0079705a57
+Author: Andreas Oberritter <obi@linuxtv.org>
+Date:   Thu Aug 4 13:10:27 2011 +0000
+
+    DVB: dvb_frontend: clear stale events on FE_SET_FRONTEND
+    
+    - Old events aren't very useful, so clear them before adding
+      the first event after an attempt to tune.
+    
+    Signed-off-by: Andreas Oberritter <obi@linuxtv.org>
+    Signed-off-by: ghost <andreas.monzner@multimedia-labs.de>
+
+diff --git a/drivers/media/dvb/dvb-core/dvb_frontend.c b/drivers/media/dvb/dvb-core/dvb_frontend.c
+index 7553358..9f39581 100644
+--- a/drivers/media/dvb/dvb-core/dvb_frontend.c
++++ b/drivers/media/dvb/dvb-core/dvb_frontend.c
+@@ -227,6 +227,16 @@ static int dvb_frontend_get_event(struct dvb_frontend *fe,
+       return 0;
+ }
++static void dvb_frontend_clear_events(struct dvb_frontend *fe)
++{
++      struct dvb_frontend_private *fepriv = fe->frontend_priv;
++      struct dvb_fe_events *events = &fepriv->events;
++
++      mutex_lock(&events->mtx);
++      events->eventr = events->eventw;
++      mutex_unlock(&events->mtx);
++}
++
+ static void dvb_frontend_init(struct dvb_frontend *fe)
+ {
+       dprintk ("DVB: initialising adapter %i frontend %i (%s)...\n",
+@@ -1908,6 +1908,7 @@ static int dvb_frontend_ioctl_legacy(struct file *file,
+               /* Request the search algorithm to search */
+               fepriv->algo_status |= DVBFE_ALGO_SEARCH_AGAIN;
++              dvb_frontend_clear_events(fe);
+               dvb_frontend_add_event(fe, 0);
+               dvb_frontend_wakeup(fe);
+               fepriv->status = 0;
diff --git a/recipes/v4l-dvb/files/backport-c.patch b/recipes/v4l-dvb/files/backport-c.patch
new file mode 100644 (file)
index 0000000..92e3ebc
--- /dev/null
@@ -0,0 +1,78 @@
+commit 94ba346ef539ded9c717cabd05d1b482673da0be
+Author: Andreas Oberritter <obi@linuxtv.org>
+Date:   Thu Aug 4 13:24:28 2011 +0000
+
+    DVB: dvb_frontend: update locking in dvb_frontend_{add,get_event}
+    
+    - dvb_frontend_add_event:
+      - fepriv->parameters_out isn't protected by events->mtx, so
+        move the call to fe->ops.get_frontend out of the locked area.
+      - move the assignment of e->status into the locked area.
+    
+    - dvb_frontend_get_event:
+      - use direct assignment instead of memcpy.
+    
+    - dvb_frontend_add_event and dvb_frontend_get_event:
+      - use mutex_lock instead of mutex_lock_interruptible, because
+        all code paths protected by this mutex won't block.
+    
+    Signed-off-by: Andreas Oberritter <obi@linuxtv.org>
+    Signed-off-by: ghost <andreas.monzner@multimedia-labs.de>
+
+diff --git a/drivers/media/dvb/dvb-core/dvb_frontend.c b/drivers/media/dvb/dvb-core/dvb_frontend.c
+index 9f39581..c03acdb 100644
+--- a/drivers/media/dvb/dvb-core/dvb_frontend.c
++++ b/drivers/media/dvb/dvb-core/dvb_frontend.c
+@@ -156,30 +156,25 @@ static void dvb_frontend_add_event(struct dvb_frontend *fe, fe_status_t status)
+       dprintk ("%s\n", __func__);
+-      if (mutex_lock_interruptible (&events->mtx))
+-              return;
++      if ((status & FE_HAS_LOCK) && fe->ops.get_frontend)
++              fe->ops.get_frontend(fe, &fepriv->parameters_out);
+-      wp = (events->eventw + 1) % MAX_EVENT;
++      mutex_lock(&events->mtx);
++      wp = (events->eventw + 1) % MAX_EVENT;
+       if (wp == events->eventr) {
+               events->overflow = 1;
+               events->eventr = (events->eventr + 1) % MAX_EVENT;
+       }
+       e = &events->events[events->eventw];
+-
+-      if (status & FE_HAS_LOCK)
+-              if (fe->ops.get_frontend)
+-                      fe->ops.get_frontend(fe, &fepriv->parameters_out);
+-
++      e->status = status;
+       e->parameters = fepriv->parameters_out;
+       events->eventw = wp;
+       mutex_unlock(&events->mtx);
+-      e->status = status;
+-
+       wake_up_interruptible (&events->wait_queue);
+ }
+@@ -209,14 +209,9 @@ static int dvb_frontend_get_event(struct dvb_frontend *fe,
+                       return ret;
+       }
+-      if (mutex_lock_interruptible (&events->mtx))
+-              return -ERESTARTSYS;
+-
+-      memcpy (event, &events->events[events->eventr],
+-              sizeof(struct dvb_frontend_event));
+-
++      mutex_lock(&events->mtx);
++      *event = events->events[events->eventr];
+       events->eventr = (events->eventr + 1) % MAX_EVENT;
+-
+       mutex_unlock(&events->mtx);
+       return 0;
diff --git a/recipes/v4l-dvb/files/backport-d.patch b/recipes/v4l-dvb/files/backport-d.patch
new file mode 100644 (file)
index 0000000..6a358e1
--- /dev/null
@@ -0,0 +1,41 @@
+From b7f85bc0d54bcd7fd86168cfcd4e039249e20c3d Mon Sep 17 00:00:00 2001
+From: Andreas Oberritter <obi@linuxtv.org>
+Date: Mon, 8 Aug 2011 14:29:50 +0000
+Subject: [PATCH 1/3] DVB: Add SYS_TURBO for north american turbo code FEC
+Cc: user.vdr@gmail.com,
+    alannisota@gmail.com
+
+- Allow to distinguish turbo code from DVB-S
+
+Signed-off-by: Andreas Oberritter <obi@linuxtv.org>
+---
+ Documentation/DocBook/media/dvb/dvbproperty.xml |    1 +
+ include/linux/dvb/frontend.h                    |    1 +
+ 2 files changed, 2 insertions(+), 0 deletions(-)
+
+diff --git a/include/linux/dvb/frontend.h b/include/linux/dvb/frontend.h
+index 36a3ed6..1b1094c 100644
+--- a/include/linux/dvb/frontend.h
++++ b/include/linux/dvb/frontend.h
+@@ -349,6 +349,7 @@ typedef enum fe_delivery_system {
+       SYS_CMMB,
+       SYS_DAB,
+       SYS_DVBT2,
++      SYS_TURBO,
+ } fe_delivery_system_t;
+ struct dtv_cmds_h {
+diff --git a/include/linux/dvb/version.h b/include/linux/dvb/version.h
+--- a/include/linux/dvb/version.h
++++ b/include/linux/dvb/version.h
+@@ -24,6 +24,6 @@
+ #define _DVBVERSION_H_
+ #define DVB_API_VERSION 5
+-#define DVB_API_VERSION_MINOR 3
++#define DVB_API_VERSION_MINOR 4
+ #endif /*_DVBVERSION_H_*/
+-- 
+1.7.2.5
+
diff --git a/recipes/v4l-dvb/files/backport-e.patch b/recipes/v4l-dvb/files/backport-e.patch
new file mode 100644 (file)
index 0000000..e7fc6b4
--- /dev/null
@@ -0,0 +1,41 @@
+From 4c4e24eb2549c1e48af535b143653458ed6d6f86 Mon Sep 17 00:00:00 2001
+From: Andreas Oberritter <obi@linuxtv.org>
+Date: Mon, 8 Aug 2011 14:35:01 +0000
+Subject: [PATCH 2/3] DVB: dvb_frontend: Fix compatibility criteria for satellite receivers
+Cc: user.vdr@gmail.com,
+    alannisota@gmail.com
+
+- When converting satellite receiver parameters from S2API to legacy,
+  identify a satellite receiver by its 'delivery_system' instead of
+  'modulation', which may overlap between different delivery systems.
+
+Signed-off-by: Andreas Oberritter <obi@linuxtv.org>
+---
+ drivers/media/dvb/dvb-core/dvb_frontend.c |   13 +++++--------
+ 1 files changed, 5 insertions(+), 8 deletions(-)
+
+diff -Naur a/drivers/media/dvb/dvb-core/dvb_frontend.c b/drivers/media/dvb/dvb-core/dvb_frontend.c
+--- a/drivers/media/dvb/dvb-core/dvb_frontend.c        2011-08-09 19:03:35.000000000 +0200
++++ b/drivers/media/dvb/dvb-core/dvb_frontend.c        2011-08-09 19:13:06.288210465 +0200
+@@ -1144,16 +1144,13 @@
+       p->frequency = c->frequency;
+       p->inversion = c->inversion;
+-      switch(c->modulation) {
+-      case PSK_8:
+-      case APSK_16:
+-      case APSK_32:
+-      case QPSK:
++      if (c->delivery_system == SYS_DSS ||
++          c->delivery_system == SYS_DVBS ||
++          c->delivery_system == SYS_DVBS2 ||
++          c->delivery_system == SYS_ISDBS ||
++          c->delivery_system == SYS_TURBO) {
+               p->u.qpsk.symbol_rate = c->symbol_rate;
+               p->u.qpsk.fec_inner = c->fec_inner;
+-              break;
+-      default:
+-              break;
+       }
+       /* Fake out a generic DVB-T request so we pass validation in the ioctl */
diff --git a/recipes/v4l-dvb/files/backport-f.patch b/recipes/v4l-dvb/files/backport-f.patch
new file mode 100644 (file)
index 0000000..90c7b28
--- /dev/null
@@ -0,0 +1,62 @@
+From 1ec819fb0b8786c16ed49615035894d0e946a79e Mon Sep 17 00:00:00 2001
+From: Andreas Oberritter <obi@linuxtv.org>
+Date: Mon, 8 Aug 2011 14:45:02 +0000
+Subject: [PATCH 3/3] DVB: gp8psk-fe: use SYS_TURBO
+Cc: user.vdr@gmail.com,
+    alannisota@gmail.com
+
+- Allows to select Turbo QPSK (SYS_TURBO + QPSK)
+
+Signed-off-by: Andreas Oberritter <obi@linuxtv.org>
+---
+ drivers/media/dvb/dvb-usb/gp8psk-fe.c |   17 +++++++++++++----
+ 1 files changed, 13 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/media/dvb/dvb-usb/gp8psk-fe.c b/drivers/media/dvb/dvb-usb/gp8psk-fe.c
+index 60d11e5..5426267 100644
+--- a/drivers/media/dvb/dvb-usb/gp8psk-fe.c
++++ b/drivers/media/dvb/dvb-usb/gp8psk-fe.c
+@@ -144,19 +144,25 @@ static int gp8psk_fe_set_frontend(struct dvb_frontend* fe,
+       cmd[6] = (freq >> 16) & 0xff;
+       cmd[7] = (freq >> 24) & 0xff;
++      /* backwards compatibility: DVB-S + 8-PSK were used for Turbo-FEC */
++      if (c->delivery_system == SYS_DVBS && c->modulation == PSK_8)
++              c->delivery_system = SYS_TURBO;
++
+       switch (c->delivery_system) {
+       case SYS_DVBS:
+-              /* Allow QPSK and 8PSK (even for DVB-S) */
+-              if (c->modulation != QPSK && c->modulation != PSK_8) {
++              if (c->modulation != QPSK) {
+                       deb_fe("%s: unsupported modulation selected (%d)\n",
+                               __func__, c->modulation);
+                       return -EOPNOTSUPP;
+               }
+               c->fec_inner = FEC_AUTO;
+               break;
+-      case SYS_DVBS2:
++      case SYS_DVBS2: /* kept for backwards compatibility */
+               deb_fe("%s: DVB-S2 delivery system selected\n", __func__);
+               break;
++      case SYS_TURBO:
++              deb_fe("%s: Turbo-FEC delivery system selected\n", __func__);
++              break;
+       default:
+               deb_fe("%s: unsupported delivery system selected (%d)\n",
+@@ -189,7 +195,10 @@ static int gp8psk_fe_set_frontend(struct dvb_frontend* fe,
+               default:
+                       cmd[9] = 5; break;
+               }
+-              cmd[8] = ADV_MOD_DVB_QPSK;
++              if (c->delivery_system == SYS_TURBO)
++                      cmd[8] = ADV_MOD_TURBO_QPSK;
++              else
++                      cmd[8] = ADV_MOD_DVB_QPSK;
+               break;
+       case PSK_8: /* PSK_8 is for compatibility with DN */
+               cmd[8] = ADV_MOD_TURBO_8PSK;
+-- 
+1.7.2.5
+
diff --git a/recipes/v4l-dvb/files/backport-g.patch b/recipes/v4l-dvb/files/backport-g.patch
new file mode 100644 (file)
index 0000000..89efefa
--- /dev/null
@@ -0,0 +1,89 @@
+From 7e0e6a8d2215827532f25161a2dca9f8961c9746 Mon Sep 17 00:00:00 2001
+From: Andreas Oberritter <obi@linuxtv.org>
+Date: Tue, 16 Aug 2011 11:41:53 +0000
+Subject: [PATCH] DVB: dvb_frontend: remove static assignments from dtv_property_cache_sync()
+
+- Move all static assignments to a new function
+  dtv_property_cache_init().
+- Call dtv_property_cache_init() from FE_SET_FRONTEND, but not from
+  dtv_property_process_get().
+- This fixes a problem where 2G delivery system parameters would get
+  overwritten with invalid values, leading to partially incorrect
+  results when calling FE_GET_PROPERTY.
+
+Signed-off-by: Andreas Oberritter <obi@linuxtv.org>
+---
+ drivers/media/dvb/dvb-core/dvb_frontend.c |   29 ++++++++++++++++++++++++-----
+ 1 files changed, 24 insertions(+), 5 deletions(-)
+
+diff --git a/drivers/media/dvb/dvb-core/dvb_frontend.c b/drivers/media/dvb/dvb-core/dvb_frontend.c
+index d218fe2..a716627 100644
+--- a/drivers/media/dvb/dvb-core/dvb_frontend.c
++++ b/drivers/media/dvb/dvb-core/dvb_frontend.c
+@@ -1019,6 +1019,29 @@ static int is_legacy_delivery_system(fe_delivery_system_t s)
+       return 0;
+ }
++/* Initialize the cache with some default values derived from the
++ * legacy frontend_info structure.
++ */
++static void dtv_property_cache_init(struct dvb_frontend *fe,
++                                  struct dtv_frontend_properties *c)
++{
++      switch (fe->ops.info.type) {
++      case FE_QPSK:
++              c->modulation = QPSK;   /* implied for DVB-S in legacy API */
++              c->rolloff = ROLLOFF_35;/* implied for DVB-S */
++              c->delivery_system = SYS_DVBS;
++              break;
++      case FE_QAM:
++              c->delivery_system = SYS_DVBC_ANNEX_AC;
++              break;
++      case FE_OFDM:
++              c->delivery_system = SYS_DVBT;
++              break;
++      case FE_ATSC:
++              break;
++      }
++}
++
+ /* Synchronise the legacy tuning parameters into the cache, so that demodulator
+  * drivers can use a single set_frontend tuning function, regardless of whether
+  * it's being used for the legacy or new API, reducing code and complexity.
+@@ -1032,17 +1055,13 @@ static void dtv_property_cache_sync(struct dvb_frontend *fe,
+       switch (fe->ops.info.type) {
+       case FE_QPSK:
+-              c->modulation = QPSK;   /* implied for DVB-S in legacy API */
+-              c->rolloff = ROLLOFF_35;/* implied for DVB-S */
+               c->symbol_rate = p->u.qpsk.symbol_rate;
+               c->fec_inner = p->u.qpsk.fec_inner;
+-              c->delivery_system = SYS_DVBS;
+               break;
+       case FE_QAM:
+               c->symbol_rate = p->u.qam.symbol_rate;
+               c->fec_inner = p->u.qam.fec_inner;
+               c->modulation = p->u.qam.modulation;
+-              c->delivery_system = SYS_DVBC_ANNEX_AC;
+               break;
+       case FE_OFDM:
+               if (p->u.ofdm.bandwidth == BANDWIDTH_6_MHZ)
+@@ -1060,7 +1079,6 @@ static void dtv_property_cache_sync(struct dvb_frontend *fe,
+               c->transmission_mode = p->u.ofdm.transmission_mode;
+               c->guard_interval = p->u.ofdm.guard_interval;
+               c->hierarchy = p->u.ofdm.hierarchy_information;
+-              c->delivery_system = SYS_DVBT;
+               break;
+       case FE_ATSC:
+               c->modulation = p->u.vsb.modulation;
+@@ -1821,6 +1839,7 @@ static int dvb_frontend_ioctl_legacy(struct file *file,
+                       memcpy (&fepriv->parameters_in, parg,
+                               sizeof (struct dvb_frontend_parameters));
++                      dtv_property_cache_init(fe, c);
+                       dtv_property_cache_sync(fe, c, &fepriv->parameters_in);
+               }
+-- 
+1.7.2.5
+
diff --git a/recipes/v4l-dvb/files/backport-h.patch b/recipes/v4l-dvb/files/backport-h.patch
new file mode 100644 (file)
index 0000000..ed1f027
--- /dev/null
@@ -0,0 +1,108 @@
+From a5d426b76cadcf99363d481e11da320fc33786d7 Mon Sep 17 00:00:00 2001
+From: Andreas Oberritter <obi@linuxtv.org>
+Date: Wed, 24 Aug 2011 13:18:25 +0000
+Subject: [PATCH 1/2] DVB: dvb_frontend: convert semaphore to mutex
+
+Signed-off-by: Andreas Oberritter <obi@linuxtv.org>
+---
+ drivers/media/dvb/dvb-core/dvb_frontend.c |   23 +++++++++++------------
+ 1 files changed, 11 insertions(+), 12 deletions(-)
+
+--- a/drivers/media/dvb/dvb-core/dvb_frontend.c        2011-08-24 16:21:05.000000000 +0200
++++ b/drivers/media/dvb/dvb-core/dvb_frontend.c        2011-08-24 16:24:55.900270220 +0200
+@@ -115,7 +115,7 @@
+       struct dvb_frontend_parameters parameters_in;
+       struct dvb_frontend_parameters parameters_out;
+       struct dvb_fe_events events;
+-      struct semaphore sem;
++      struct mutex lock;
+       struct list_head list_head;
+       wait_queue_head_t wait_queue;
+       struct task_struct *thread;
+@@ -197,12 +197,12 @@
+               if (flags & O_NONBLOCK)
+                       return -EWOULDBLOCK;
+-              up(&fepriv->sem);
++              mutex_unlock(&fepriv->lock);
+               ret = wait_event_interruptible (events->wait_queue,
+                                               events->eventw != events->eventr);
+-              if (down_interruptible (&fepriv->sem))
++              if (mutex_lock_interruptible(&fepriv->lock))
+                       return -ERESTARTSYS;
+               if (ret < 0)
+@@ -563,7 +563,7 @@
+       set_freezable();
+       while (1) {
+-              up(&fepriv->sem);           /* is locked when we enter the thread... */
++              mutex_unlock(&fepriv->lock);        /* is locked when we enter the thread... */
+ restart:
+ #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)
+               timeout = wait_event_interruptible_timeout(fepriv->wait_queue,
+@@ -585,7 +585,7 @@
+               if (try_to_freeze())
+                       goto restart;
+-              if (down_interruptible(&fepriv->sem))
++              if (mutex_lock_interruptible(&fepriv->lock))
+                       break;
+               if (fepriv->reinitialise) {
+@@ -717,7 +717,7 @@
+       kthread_stop(fepriv->thread);
+-      init_MUTEX (&fepriv->sem);
++      mutex_init (&fepriv->lock);
+       fepriv->state = FESTATE_IDLE;
+       /* paranoia check in case a signal arrived */
+@@ -786,7 +786,7 @@
+       if (signal_pending(current))
+               return -EINTR;
+-      if (down_interruptible (&fepriv->sem))
++      if (mutex_lock_interruptible(&fepriv->lock))
+               return -EINTR;
+       fepriv->state = FESTATE_IDLE;
+@@ -799,7 +799,7 @@
+       if (IS_ERR(fe_thread)) {
+               ret = PTR_ERR(fe_thread);
+               printk("dvb_frontend_start: failed to start kthread (%d)\n", ret);
+-              up(&fepriv->sem);
++              mutex_unlock(&fepriv->lock);
+               return ret;
+       }
+       fepriv->thread = fe_thread;
+@@ -1549,7 +1549,7 @@
+            cmd == FE_DISEQC_RECV_SLAVE_REPLY))
+               return -EPERM;
+-      if (down_interruptible (&fepriv->sem))
++      if (mutex_lock_interruptible(&fepriv->lock))
+               return -ERESTARTSYS;
+       if ((cmd == FE_SET_PROPERTY) || (cmd == FE_GET_PROPERTY))
+@@ -1559,7 +1559,7 @@
+               err = dvb_frontend_ioctl_legacy(inode, file, cmd, parg);
+       }
+-      up(&fepriv->sem);
++      mutex_unlock(&fepriv->lock);
+       return err;
+ }
+@@ -2120,7 +2120,7 @@
+       }
+       fepriv = fe->frontend_priv;
+-      init_MUTEX (&fepriv->sem);
++      mutex_init (&fepriv->lock);
+       init_waitqueue_head (&fepriv->wait_queue);
+       init_waitqueue_head (&fepriv->events.wait_queue);
+       mutex_init(&fepriv->events.mtx);
diff --git a/recipes/v4l-dvb/files/backport-i.patch b/recipes/v4l-dvb/files/backport-i.patch
new file mode 100644 (file)
index 0000000..1e3742f
--- /dev/null
@@ -0,0 +1,27 @@
+From 825726e9eba24dbfaf5ebb6be966b65436aa11e3 Mon Sep 17 00:00:00 2001
+From: Andreas Oberritter <obi@linuxtv.org>
+Date: Wed, 24 Aug 2011 14:10:35 +0000
+Subject: [PATCH 2/2] DVB: dvb_frontend: check function pointers on reinitialize
+
+Signed-off-by: Andreas Oberritter <obi@linuxtv.org>
+---
+ drivers/media/dvb/dvb-core/dvb_frontend.c |    6 ++----
+ 1 files changed, 2 insertions(+), 4 deletions(-)
+
+--- a/drivers/media/dvb/dvb-core/dvb_frontend.c        2011-08-24 16:24:55.000000000 +0200
++++ b/drivers/media/dvb/dvb-core/dvb_frontend.c        2011-08-24 16:28:12.540275301 +0200
+@@ -590,12 +590,10 @@
+               if (fepriv->reinitialise) {
+                       dvb_frontend_init(fe);
+-                      if (fepriv->tone != -1) {
++                      if (fe->ops.set_tone && fepriv->tone != -1)
+                               fe->ops.set_tone(fe, fepriv->tone);
+-                      }
+-                      if (fepriv->voltage != -1) {
++                      if (fe->ops.set_voltage && fepriv->voltage != -1)
+                               fe->ops.set_voltage(fe, fepriv->voltage);
+-                      }
+                       fepriv->reinitialise = 0;
+               }
diff --git a/recipes/v4l-dvb/files/backport-j.patch b/recipes/v4l-dvb/files/backport-j.patch
new file mode 100644 (file)
index 0000000..93fe26b
--- /dev/null
@@ -0,0 +1,84 @@
+commit 8fa1e238728f28fe47fb36b963f85fb77305a109
+Author: Andreas Oberritter <obi@linuxtv.org>
+Date:   Fri Aug 26 11:01:48 2011 +0000
+
+    fixup! DVB: dvb_frontend: convert semaphore to mutex
+    
+    Signed-off-by: ghost <andreas.monzner@multimedia-labs.de>
+
+diff --git a/drivers/media/dvb/dvb-core/dvb_frontend.c b/drivers/media/dvb/dvb-core/dvb_frontend.c
+index 326518f..7784d74 100644
+--- a/drivers/media/dvb/dvb-core/dvb_frontend.c
++++ b/drivers/media/dvb/dvb-core/dvb_frontend.c
+@@ -552,19 +552,8 @@
+       dprintk("%s\n", __func__);
+-      fepriv->check_wrapped = 0;
+-      fepriv->quality = 0;
+-      fepriv->delay = 3*HZ;
+-      fepriv->status = 0;
+-      fepriv->wakeup = 0;
+-      fepriv->reinitialise = 0;
+-
+-      dvb_frontend_init(fe);
+-
+       set_freezable();
+       while (1) {
+-              mutex_unlock(&fepriv->lock);        /* is locked when we enter the thread... */
+-restart:
+ #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)
+               timeout = wait_event_interruptible_timeout(fepriv->wait_queue,
+                       dvb_frontend_should_wakeup(fe) || kthread_should_stop(),
+@@ -583,7 +572,7 @@
+               }
+               if (try_to_freeze())
+-                      goto restart;
++                      continue;
+               if (mutex_lock_interruptible(&fepriv->lock))
+                       break;
+@@ -674,6 +663,8 @@
+               } else {
+                       dvb_frontend_swzigzag(fe);
+               }
++
++              mutex_unlock(&fepriv->lock);
+       }
+       if (dvb_powerdown_on_sleep) {
+@@ -790,6 +781,16 @@
+       fepriv->state = FESTATE_IDLE;
+       fepriv->exit = DVB_FE_NO_EXIT;
+       fepriv->thread = NULL;
++
++      fepriv->check_wrapped = 0;
++      fepriv->quality = 0;
++      fepriv->delay = 3*HZ;
++      fepriv->status = 0;
++      fepriv->wakeup = 0;
++      fepriv->reinitialise = 0;
++
++      dvb_frontend_init(fe);
++
+       mb();
+       fe_thread = kthread_run(dvb_frontend_thread, fe,
+@@ -797,11 +798,12 @@
+       if (IS_ERR(fe_thread)) {
+               ret = PTR_ERR(fe_thread);
+               printk("dvb_frontend_start: failed to start kthread (%d)\n", ret);
+-              mutex_unlock(&fepriv->lock);
+-              return ret;
++      } else {
++              fepriv->thread = fe_thread;
++              ret = 0;
+       }
+-      fepriv->thread = fe_thread;
+-      return 0;
++      mutex_unlock(&fepriv->lock);
++      return ret;
+ }
+ static void dvb_frontend_get_frequeny_limits(struct dvb_frontend *fe,
diff --git a/recipes/v4l-dvb/files/backport-k.patch b/recipes/v4l-dvb/files/backport-k.patch
new file mode 100644 (file)
index 0000000..d23bae4
--- /dev/null
@@ -0,0 +1,36 @@
+commit 8c577726896d50db622d56a06920d19645e5aed8
+Author: ghost <andreas.monzner@multimedia-labs.de>
+Date:   Tue Sep 13 15:59:07 2011 +0200
+
+    DVB: dvb_frontend: fixed (slow) frontend thread shutdown on device close
+
+diff --git a/drivers/media/dvb/dvb-core/dvb_frontend.c b/drivers/media/dvb/dvb-core/dvb_frontend.c
+index 7784d74..6823c2b 100644
+--- a/drivers/media/dvb/dvb-core/dvb_frontend.c        2011-09-07 12:32:24.000000000 +0200
++++ a/drivers/media/dvb/dvb-core/dvb_frontend.c        2011-09-13 15:55:48.865742791 +0200
+@@ -514,7 +514,7 @@
+               return 1;
+       if (fepriv->dvbdev->writers == 1)
+-              if (time_after(jiffies, fepriv->release_jiffies +
++              if (time_after_eq(jiffies, fepriv->release_jiffies +
+                                 dvb_shutdown_timeout * HZ))
+                       return 1;
+@@ -2070,12 +2070,15 @@
+       dprintk ("%s\n", __func__);
+-      if ((file->f_flags & O_ACCMODE) != O_RDONLY)
++      if ((file->f_flags & O_ACCMODE) != O_RDONLY) {
+               fepriv->release_jiffies = jiffies;
++              mb();
++      }
+       ret = dvb_generic_release (inode, file);
+       if (dvbdev->users == -1) {
++              wake_up(&fepriv->wait_queue);
+               if (fepriv->exit != DVB_FE_NO_EXIT) {
+                       fops_put(file->f_op);
+                       file->f_op = NULL;
index ffeb101..f11ad36 100644 (file)
@@ -90,3 +90,54 @@ diff --git a/linux/include/linux/dvb/version.h b/linux/include/linux/dvb/version
 +#define DVB_API_VERSION_MINOR 3
  
  #endif /*_DVBVERSION_H_*/
+--- v4l-dvb-org/linux/drivers/media/dvb/dvb-core/dvb_frontend.c        2011-08-13 18:16:51.000000000 +0200
++++ v4l-dvb/linux/drivers/media/dvb/dvb-core/dvb_frontend.c    2011-08-13 18:21:12.953703247 +0200
+@@ -917,7 +917,7 @@
+       .buffer = b \
+ }
+-static struct dtv_cmds_h dtv_cmds[] = {
++static struct dtv_cmds_h dtv_cmds[DTV_MAX_COMMAND + 1] = {
+       _DTV_CMD(DTV_TUNE, 1, 0),
+       _DTV_CMD(DTV_CLEAR, 1, 0),
+@@ -979,6 +979,7 @@
+       _DTV_CMD(DTV_ISDBT_LAYERC_TIME_INTERLEAVING, 0, 0),
+       _DTV_CMD(DTV_ISDBS_TS_ID, 1, 0),
++      _DTV_CMD(DTV_DVBT2_PLP_ID, 1, 0),
+       /* Get */
+       _DTV_CMD(DTV_DISEQC_SLAVE_REPLY, 0, 1),
+@@ -1334,6 +1335,9 @@
+       case DTV_ISDBS_TS_ID:
+               tvp->u.data = c->isdbs_ts_id;
+               break;
++      case DTV_DVBT2_PLP_ID:
++              tvp->u.data = fe->dtv_property_cache.dvbt2_plp_id;
++              break;
+       default:
+               return -EINVAL;
+       }
+@@ -1498,6 +1502,9 @@
+       case DTV_ISDBS_TS_ID:
+               c->isdbs_ts_id = tvp->u.data;
+               break;
++      case DTV_DVBT2_PLP_ID:
++              fe->dtv_property_cache.dvbt2_plp_id = tvp->u.data;
++              break;
+       default:
+               return -EINVAL;
+       }
+--- v4l-dvb-org/linux/drivers/media/dvb/dvb-core/dvb_frontend.h        2011-04-13 01:43:27.000000000 +0200
++++ v4l-dvb/linux/drivers/media/dvb/dvb-core/dvb_frontend.h    2011-08-13 18:21:12.973703248 +0200
+@@ -359,6 +359,9 @@
+       /* ISDB-T specifics */
+       u32                     isdbs_ts_id;
++
++      /* DVB-T2 specifics */
++      u32                     dvbt2_plp_id;
+ };
+ struct dvb_frontend {
diff --git a/recipes/v4l-dvb/files/fix-get-property.patch b/recipes/v4l-dvb/files/fix-get-property.patch
deleted file mode 100644 (file)
index 3529c9d..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
---- v4l-dvb-org/linux/drivers/media/dvb/dvb-core/dvb_frontend.c        2010-11-05 18:00:34.000000000 +0100
-+++ v4l-dvb/linux/drivers/media/dvb/dvb-core/dvb_frontend.c    2011-04-04 14:32:50.867986700 +0200
-@@ -1218,13 +1218,6 @@
- {
-       int r = 0;
--      /* Allow the frontend to validate incoming properties */
--      if (fe->ops.get_property)
--              r = fe->ops.get_property(fe, tvp);
--
--      if (r < 0)
--              return r;
--
-       switch(tvp->cmd) {
-       case DTV_FREQUENCY:
-               tvp->u.data = fe->dtv_property_cache.frequency;
-@@ -1340,6 +1333,14 @@
-               r = -1;
-       }
-+      /* Allow the frontend to override outgoing properties */
-+      if (!r && fe->ops.get_property) {
-+              r = fe->ops.get_property(fe, tvp);
-+
-+              if (r < 0)
-+                      return r;
-+      }
-+
-       dtv_property_dump(tvp);
-       return r;
index 16382aa..1aecd94 100644 (file)
@@ -5,7 +5,7 @@ DEPENDS += " mercurial-native"
 SRCDATE = "20100904"
 SRCREV = "6e0befab696a"
 PV = "0.0+hg${SRCDATE}"
-PR = "r2"
+PR = "r5"
 
 SRC_URI = "hg://linuxtv.org/hg/;module=v4l-dvb;rev=${SRCREV} \
            file://defconfig \
@@ -16,8 +16,21 @@ SRC_URI = "hg://linuxtv.org/hg/;module=v4l-dvb;rev=${SRCREV} \
            file://localversion.patch;patch=1 \
            file://fix-strip.patch;patch=1 \
            file://build-fix.patch;patch=1 \
-           file://fix-get-property.patch;patch=1 \
+           file://backport-*.patch \
 "
 
 S = "${WORKDIR}/v4l-dvb"
 
+do_munge() {
+       CUR=`pwd`
+       cd ${S}/linux
+       oenote "cd to '${S}/linux'";
+       for i in `ls ${WORKDIR}/backport-*.patch | sort -n | xargs`; do
+               oenote "Applying v4l-dvb backport patch '$i'";
+               patch -p1 < $i;
+       done;
+       cd $CUR
+}
+
+addtask munge before do_compile after do_patch
+
diff --git a/recipes/vlc/libaacs_git.bb b/recipes/vlc/libaacs_git.bb
new file mode 100644 (file)
index 0000000..a8190f8
--- /dev/null
@@ -0,0 +1,17 @@
+DESCRIPTION = "Open implementation of the AACS specification"
+SECTION = "libs/multimedia"
+PRIORITY = "optional"
+LICENSE = "LGPLv2.1"
+DEPENDS = "libgcrypt"
+PV = "0.0.0+${PR}+gitr${SRCREV}"
+
+SRC_URI = "git://git.videolan.org/${PN}.git;branch=master;protocol=git"
+
+SRCREV = "00b2df2bb7598262da44683509b50a7a983026fd"
+S = "${WORKDIR}/git"
+
+inherit autotools lib_package pkgconfig
+
+do_stage() {
+        autotools_stage_all
+}
diff --git a/recipes/vlc/libbluray_git.bb b/recipes/vlc/libbluray_git.bb
new file mode 100644 (file)
index 0000000..32240e3
--- /dev/null
@@ -0,0 +1,17 @@
+DESCRIPTION = "Library to access Blu-Ray disks"
+SECTION = "libs/multimedia"
+PRIORITY = "optional"
+LICENSE = "LGPLv2.1"
+PV = "0.0.0+${PR}+gitr${SRCREV}"
+PR = "r1"
+
+SRC_URI = "git://git.videolan.org/${PN}.git;branch=master;protocol=git"
+
+SRCREV = "8e5d241ea1ebb131941c3279b2363d4eb2479eca"
+S = "${WORKDIR}/git"
+
+inherit autotools lib_package pkgconfig
+
+do_stage() {
+        autotools_stage_all
+}
diff --git a/recipes/webkit/files/0001-Qt-Fix-build-with-QT_LIBINFIX.patch b/recipes/webkit/files/0001-Qt-Fix-build-with-QT_LIBINFIX.patch
new file mode 100644 (file)
index 0000000..a7645be
--- /dev/null
@@ -0,0 +1,48 @@
+From d428adaf3bb444d8f004b344f472a89ec2db75a4 Mon Sep 17 00:00:00 2001
+From: Andreas Oberritter <obi@opendreambox.org>
+Date: Wed, 14 Sep 2011 15:34:34 +0200
+Subject: [PATCH] [Qt] Fix build with QT_LIBINFIX
+
+---
+ Source/WebKit.pri             |    4 ++--
+ Source/WebKit/qt/QtWebKit.pro |    2 +-
+ 2 files changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/Source/WebKit.pri b/Source/WebKit.pri
+index 5bd9577..f449308 100644
+--- a/Source/WebKit.pri
++++ b/Source/WebKit.pri
+@@ -35,7 +35,7 @@ building-libs {
+         QT += webkit
+     } else {
+         QMAKE_LIBDIR = $$OUTPUT_DIR/lib $$QMAKE_LIBDIR
+-        QTWEBKITLIBNAME = QtWebKit
++        QTWEBKITLIBNAME = QtWebKit$$QT_LIBINFIX
+         mac:!static:contains(QT_CONFIG, qt_framework):!CONFIG(webkit_no_framework) {
+             LIBS += -framework $$QTWEBKITLIBNAME
+             QMAKE_FRAMEWORKPATH = $$OUTPUT_DIR/lib $$QMAKE_FRAMEWORKPATH
+@@ -46,7 +46,7 @@ building-libs {
+                 win32-g++*: LIBS += -l$$QTWEBKITLIBNAME
+                 else: LIBS += $${QTWEBKITLIBNAME}.lib
+             } else {
+-                LIBS += -lQtWebKit
++                LIBS += -l$$QTWEBKITLIBNAME
+                 symbian {
+                     TARGET.EPOCSTACKSIZE = 0x14000 // 80 kB
+                     # For EXEs only: set heap to usable value
+diff --git a/Source/WebKit/qt/QtWebKit.pro b/Source/WebKit/qt/QtWebKit.pro
+index 41b0d39..f2bf2da 100644
+--- a/Source/WebKit/qt/QtWebKit.pro
++++ b/Source/WebKit/qt/QtWebKit.pro
+@@ -2,7 +2,7 @@
+ CONFIG += building-libs
+ CONFIG += depend_includepath
+-TARGET = QtWebKit
++TARGET = QtWebKit$$QT_LIBINFIX
+ TEMPLATE = lib
+ DEFINES += BUILDING_WEBKIT
+-- 
+1.7.4.1
+
diff --git a/recipes/webkit/qtwebkit-e_2.2.bb b/recipes/webkit/qtwebkit-e_2.2.bb
new file mode 100644 (file)
index 0000000..02aa860
--- /dev/null
@@ -0,0 +1,11 @@
+inherit qt4e
+require qtwebkit.inc
+
+PR = "${INC_PR}.0"
+
+SRC_URI = " \
+        http://pkgs.fedoraproject.org/repo/pkgs/qtwebkit/qtwebkit-2.2.0-rc1.tar.xz/5c1581052ad5bb7aed07a1798a340061/qtwebkit-2.2.0-rc1.tar.xz \
+        file://0001-Qt-Fix-build-with-QT_LIBINFIX.patch;patch=1 \
+"
+
+S = "${WORKDIR}/webkit-qtwebkit"
diff --git a/recipes/webkit/qtwebkit.inc b/recipes/webkit/qtwebkit.inc
new file mode 100644 (file)
index 0000000..961a4b0
--- /dev/null
@@ -0,0 +1,47 @@
+DESCRIPTION = "Qt port of WebKit"
+HOMEPAGE = "http://trac.webkit.org/wiki/QtWebKit"
+LICENSE = "LGPLv2.1"
+DEPENDS += "fontconfig sqlite3"
+INC_PR = "r0"
+
+inherit lib_package pkgconfig
+
+export WEBKITOUTPUTDIR = "${WORKDIR}/qtbuild"
+
+PKGCONFIG_FILE = "${libdir}/pkgconfig/QtWebKit${QT_LIBINFIX}.pc"
+PRL_FILE = "${libdir}/libQtWebKit${QT_LIBINFIX}.prl"
+QMAKEARG = " \
+        INSTALL_HEADERS=${includedir}/${QT_DIR_NAME} \
+        INSTALL_LIBS=${libdir} \
+        QT_LIBINFIX=${QT_LIBINFIX} \
+"
+
+do_configure() {
+}
+do_compile() {
+    ${S}/Tools/Scripts/build-webkit --qt --qmake=${OE_QMAKE_QMAKE} --no-netscape-plugin --qmakearg="${QMAKEARG}"
+}
+do_install() {
+    oe_runmake -C ${WEBKITOUTPUTDIR}/Release install INSTALL_ROOT=${D}
+    # fix pkgconfig and prl files
+    sed -i -e s#-L${S}/lib##g \
+           -e s#-L${STAGING_LIBDIR}##g \
+           -e 's#STAGING_LIBDIR}#libdir}'#g \
+           -e s#-L${libdir}##g \
+           -e s#'$(OE_QMAKE_LIBS_X11)'#"${OE_QMAKE_LIBS_X11}"#g \
+           -e s#" -Wl,-rpath-link,${S}/lib"##g \
+           -e s#" -Wl,-rpath-link,${libdir}"##g \
+           -e 's#I/usr/include#Iincludedir}#g' \
+           -e 's#Iin#I${in#g' \
+           ${D}${PRL_FILE} ${D}${PKGCONFIG_FILE}
+    # fix pkgconfig files
+    sed -i -e 's:^prefix=.*:prefix=${prefix}:' \
+           -e 's:-L$(OE_QMAKE_LIBDIR_QT)::g' \
+           -e '/^Cflags:/s#{includedir}#{includedir} -I${includedir}/${QT_DIR_NAME} -DQT_SHARED#' \
+           ${D}${PKGCONFIG_FILE}
+    for name in QtCore QtGui QtNetwork; do
+           sed -i -e /Requires/s#"${name}"#"${name}${QT_LIBINFIX}"#g ${D}${PKGCONFIG_FILE}
+    done
+}
+
+FILES_${PN}-dev += "${PRL_FILE}"