diff options
author | Brad Bishop <bradleyb@fuzziesquirrel.com> | 2018-02-01 18:27:11 +0300 |
---|---|---|
committer | Brad Bishop <bradleyb@fuzziesquirrel.com> | 2018-03-13 05:51:39 +0300 |
commit | 6e60e8b2b2bab889379b380a28a167a0edd9d1d3 (patch) | |
tree | f12f54d5ba8e74e67e5fad3651a1e125bb8f4191 /import-layers/yocto-poky/meta/recipes-multimedia | |
parent | 509842add85b53e13164c1569a1fd43d5b8d91c5 (diff) | |
download | openbmc-6e60e8b2b2bab889379b380a28a167a0edd9d1d3.tar.xz |
Yocto 2.3
Move OpenBMC to Yocto 2.3(pyro).
Tested: Built and verified Witherspoon and Palmetto images
Change-Id: I50744030e771f4850afc2a93a10d3507e76d36bc
Signed-off-by: Brad Bishop <bradleyb@fuzziesquirrel.com>
Resolves: openbmc/openbmc#2461
Diffstat (limited to 'import-layers/yocto-poky/meta/recipes-multimedia')
108 files changed, 4004 insertions, 3014 deletions
diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/alsa/alsa-fpu.inc b/import-layers/yocto-poky/meta/recipes-multimedia/alsa/alsa-fpu.inc index 50402307c5..355a9dfcd1 100644 --- a/import-layers/yocto-poky/meta/recipes-multimedia/alsa/alsa-fpu.inc +++ b/import-layers/yocto-poky/meta/recipes-multimedia/alsa/alsa-fpu.inc @@ -1,6 +1,4 @@ - def get_alsa_fpu_setting(bb, d): - if d.getVar('TARGET_FPU', True) in [ 'soft' ]: - return "--with-softfloat" - return "" - + if d.getVar('TARGET_FPU') in [ 'soft' ]: + return "--with-softfloat" + return "" diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/alsa/alsa-lib/0001-ucm-parser-needs-limits.h.patch b/import-layers/yocto-poky/meta/recipes-multimedia/alsa/alsa-lib/0001-ucm-parser-needs-limits.h.patch new file mode 100644 index 0000000000..4edaf4d961 --- /dev/null +++ b/import-layers/yocto-poky/meta/recipes-multimedia/alsa/alsa-lib/0001-ucm-parser-needs-limits.h.patch @@ -0,0 +1,33 @@ +From 005ac9d2fa000912c8fb8257020a0471b1c6176c Mon Sep 17 00:00:00 2001 +From: Gustavo Zacarias <gustavo@zacarias.com.ar> +Date: Wed, 21 Dec 2016 19:46:34 -0300 +Subject: [PATCH] ucm: parser needs limits.h + +It's using PATH_MAX which is defined there, otherwise the build fails on +musl libc. + +Signed-off-by: Gustavo Zacarias <gustavo@zacarias.com.ar> +Signed-off-by: Takashi Iwai <tiwai@suse.de> + +Upstream-Status: Accepted [expected in 1.1.4] + +Signed-off-by: Tanu Kaskinen <tanuk@iki.fi> +--- + src/ucm/parser.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/src/ucm/parser.c b/src/ucm/parser.c +index c98373a9..f520abc5 100644 +--- a/src/ucm/parser.c ++++ b/src/ucm/parser.c +@@ -32,6 +32,7 @@ + + #include "ucm_local.h" + #include <dirent.h> ++#include <limits.h> + + /** The name of the environment variable containing the UCM directory */ + #define ALSA_CONFIG_UCM_VAR "ALSA_CONFIG_UCM" +-- +2.11.0 + diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/alsa/alsa-lib_1.1.2.bb b/import-layers/yocto-poky/meta/recipes-multimedia/alsa/alsa-lib_1.1.3.bb index e313da78e4..191a0367de 100644 --- a/import-layers/yocto-poky/meta/recipes-multimedia/alsa/alsa-lib_1.1.2.bb +++ b/import-layers/yocto-poky/meta/recipes-multimedia/alsa/alsa-lib_1.1.3.bb @@ -11,34 +11,36 @@ BBCLASSEXTEND = "native nativesdk" SRC_URI = "ftp://ftp.alsa-project.org/pub/lib/${BP}.tar.bz2 \ file://Check-if-wordexp-function-is-supported.patch \ file://avoid-including-sys-poll.h-directly.patch \ + file://0001-ucm-parser-needs-limits.h.patch \ " -SRC_URI[md5sum] = "1946e6438b8262a7b8fdadacd0e06ba7" -SRC_URI[sha256sum] = "d38dacd9892b06b8bff04923c380b38fb2e379ee5538935ff37e45b395d861d6" +SRC_URI[md5sum] = "eefe5992567ba00d6110a540657aaf5c" +SRC_URI[sha256sum] = "71282502184c592c1a008e256c22ed0ba5728ca65e05273ceb480c70f515969c" inherit autotools pkgconfig require alsa-fpu.inc EXTRA_OECONF += "${@get_alsa_fpu_setting(bb, d)} " -EXTRA_OECONF = "--disable-python" +EXTRA_OECONF += "--disable-python" EXTRA_OECONF_append_libc-uclibc = " --with-versioned=no " -PACKAGES =+ "alsa-server libasound alsa-conf-base alsa-conf alsa-doc" -FILES_${PN} += "${libdir}/${BPN}/smixer/*.so" -FILES_${PN}-dev += "${libdir}/${BPN}/smixer/*.la" +PACKAGES =+ "alsa-server libasound alsa-conf alsa-doc" FILES_libasound = "${libdir}/libasound.so.*" FILES_alsa-server = "${bindir}/*" FILES_alsa-conf = "${datadir}/alsa/" -FILES_alsa-conf-base = "\ -${datadir}/alsa/alsa.conf \ -${datadir}/alsa/cards/aliases.conf \ -${datadir}/alsa/pcm/default.conf \ -${datadir}/alsa/pcm/dmix.conf \ -${datadir}/alsa/pcm/dsnoop.conf" - -RDEPENDS_libasound = "alsa-conf-base alsa-conf" + +RDEPENDS_libasound = "alsa-conf" + +# alsa-lib gets automatically added to alsa-lib-dev dependencies, but the +# alsa-lib package doesn't exist. libasound is the real library package. +RDEPENDS_${PN}-dev = "libasound" + # upgrade path RPROVIDES_${PN}-dev = "alsa-dev" RREPLACES_${PN}-dev = "alsa-dev" RCONFLICTS_${PN}-dev = "alsa-dev" + +RPROVIDES_alsa-conf = "alsa-conf-base" +RREPLACES_alsa-conf = "alsa-conf-base" +RCONFLICTS_alsa-conf = "alsa-conf-base" diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/alsa/alsa-plugins_1.1.1.bb b/import-layers/yocto-poky/meta/recipes-multimedia/alsa/alsa-plugins_1.1.1.bb index c95ea54160..16686a0445 100644 --- a/import-layers/yocto-poky/meta/recipes-multimedia/alsa/alsa-plugins_1.1.1.bb +++ b/import-layers/yocto-poky/meta/recipes-multimedia/alsa/alsa-plugins_1.1.1.bb @@ -31,7 +31,7 @@ inherit autotools pkgconfig PACKAGECONFIG ??= "\ samplerate \ speexdsp \ - ${@bb.utils.contains('DISTRO_FEATURES', 'pulseaudio', 'pulseaudio', '', d)} \ + ${@bb.utils.filter('DISTRO_FEATURES', 'pulseaudio', d)} \ " PACKAGECONFIG[avcodec] = "--enable-avcodec,--disable-avcodec,libav" PACKAGECONFIG[jack] = "--enable-jack,--disable-jack,jack" @@ -59,7 +59,7 @@ do_install_append() { } python populate_packages_prepend() { - plugindir = bb.data.expand('${libdir}/alsa-lib/', d) + plugindir = d.expand('${libdir}/alsa-lib/') packages = " ".join(do_split_packages(d, plugindir, '^libasound_module_(.*)\.so$', 'libasound-module-%s', 'Alsa plugin for %s', extra_depends='')) d.setVar("RDEPENDS_alsa-plugins", packages) } diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/alsa/alsa-tools/0001-Cus428Midi-Explicitly-cast-constant-to-char-type.patch b/import-layers/yocto-poky/meta/recipes-multimedia/alsa/alsa-tools/0001-Cus428Midi-Explicitly-cast-constant-to-char-type.patch deleted file mode 100644 index bf95cac440..0000000000 --- a/import-layers/yocto-poky/meta/recipes-multimedia/alsa/alsa-tools/0001-Cus428Midi-Explicitly-cast-constant-to-char-type.patch +++ /dev/null @@ -1,75 +0,0 @@ -From 1cc0aa4dbd3c7f1267809e0e1ca57d46f4803bfd Mon Sep 17 00:00:00 2001 -From: Khem Raj <raj.khem@gmail.com> -Date: Sun, 17 Apr 2016 23:25:18 +0000 -Subject: [PATCH] Cus428Midi: Explicitly cast constant to char type - -This is flagged by gcc6 -Cus428Midi.cc:83:1: error: narrowing conversion of '-1' from 'int' to 'char' inside { } [-Wnarrowing] - -Signed-off-by: Khem Raj <raj.khem@gmail.com> ---- -Upstream-Status: Pending - - us428control/Cus428Midi.cc | 30 +++++++++++++++--------------- - 1 file changed, 15 insertions(+), 15 deletions(-) - -diff --git a/us428control/Cus428Midi.cc b/us428control/Cus428Midi.cc -index b9e6783..bef7bb1 100644 ---- a/us428control/Cus428Midi.cc -+++ b/us428control/Cus428Midi.cc -@@ -32,22 +32,22 @@ char Cus428Midi::KnobParam[] = { - 0x2A, - 0x29, - 0x28, -- -1, -+ static_cast<char>(-1), - 0x10, - 0x11, - 0x18, - 0x19, - 0x1A, -- -1, -- -1, -- -1, -- -1, -+ static_cast<char>(-1), -+ static_cast<char>(-1), -+ static_cast<char>(-1), -+ static_cast<char>(-1), - 0x2C, - 0x2D, - 0x2E, - 0x2F, -- -1, -- -1, -+ static_cast<char>(-1), -+ static_cast<char>(-1), - 0x20, - 0x21, - 0x22, -@@ -64,14 +64,14 @@ char Cus428Midi::KnobParam[] = { - 5, - 6, - 7, -- -1, -- -1, -- -1, -- -1, -- -1, -- -1, -- -1, -- -1, -+ static_cast<char>(-1), -+ static_cast<char>(-1), -+ static_cast<char>(-1), -+ static_cast<char>(-1), -+ static_cast<char>(-1), -+ static_cast<char>(-1), -+ static_cast<char>(-1), -+ static_cast<char>(-1), - 0x30, - 0x31, - 0x32, --- -1.9.1 - diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/alsa/alsa-tools_1.1.0.bb b/import-layers/yocto-poky/meta/recipes-multimedia/alsa/alsa-tools_1.1.3.bb index 8d4a146580..9e97c0e969 100644 --- a/import-layers/yocto-poky/meta/recipes-multimedia/alsa/alsa-tools_1.1.0.bb +++ b/import-layers/yocto-poky/meta/recipes-multimedia/alsa/alsa-tools_1.1.3.bb @@ -13,11 +13,10 @@ SRC_URI = "ftp://ftp.alsa-project.org/pub/tools/${BP}.tar.bz2 \ ${@bb.utils.contains('DISTRO_FEATURES', 'x11', '', 'file://makefile_no_gtk.patch', d)} \ file://gitcompile_hdajacksensetest \ file://0001-as10k1-Make-output_tram_line-static-inline.patch \ - file://0001-Cus428Midi-Explicitly-cast-constant-to-char-type.patch \ " -SRC_URI[md5sum] = "b476a5afaa3ea3230855553ad59d259d" -SRC_URI[sha256sum] = "7d34558c590a50294b36576d257316a1ac5cd951eb8cd7d330e09f8cc757ab51" +SRC_URI[md5sum] = "b23eaae687d55410b92587c2053b301f" +SRC_URI[sha256sum] = "d88f1dcd6872121383eded5fa24e328e68c54e527db4547e1435d5eabc2b6709" inherit autotools-brokensep pkgconfig @@ -34,7 +33,7 @@ AUTOTOOLS_COPYACLOCAL = "1" do_compile_prepend () { #Automake dir is not correctly detected in cross compilation case export AUTOMAKE_DIR="$(automake --print-libdir)" - export ACLOCAL_FLAGS="--system-acdir=${ACLOCALDIR}/" + export ACLOCAL_FLAGS="--system-acdir=${ACLOCALDIR}/ ${ACLOCALEXTRAPATH}" cp ${WORKDIR}/gitcompile_hdajacksensetest ${S}/hdajacksensetest/gitcompile } diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/alsa/alsa-utils-scripts_1.1.2.bb b/import-layers/yocto-poky/meta/recipes-multimedia/alsa/alsa-utils-scripts_1.1.3.bb index fef79d9c9c..fef79d9c9c 100644 --- a/import-layers/yocto-poky/meta/recipes-multimedia/alsa/alsa-utils-scripts_1.1.2.bb +++ b/import-layers/yocto-poky/meta/recipes-multimedia/alsa/alsa-utils-scripts_1.1.3.bb diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/alsa/alsa-utils_1.1.2.bb b/import-layers/yocto-poky/meta/recipes-multimedia/alsa/alsa-utils_1.1.3.bb index a22d999fb0..f374a17411 100644 --- a/import-layers/yocto-poky/meta/recipes-multimedia/alsa/alsa-utils_1.1.2.bb +++ b/import-layers/yocto-poky/meta/recipes-multimedia/alsa/alsa-utils_1.1.3.bb @@ -17,14 +17,20 @@ PACKAGECONFIG ??= "udev" PACKAGECONFIG[bat] = "--enable-bat,--disable-bat,fftwf" PACKAGECONFIG[udev] = "--with-udev-rules-dir=`pkg-config --variable=udevdir udev`/rules.d,,udev" -PACKAGECONFIG[xmlto] = "--enable-xmlto, --disable-xmlto, xmlto-native docbook-xml-dtd4-native docbook-xsl-stylesheets-native" +PACKAGECONFIG[manpages] = "--enable-xmlto, --disable-xmlto, xmlto-native docbook-xml-dtd4-native docbook-xsl-stylesheets-native" SRC_URI = "ftp://ftp.alsa-project.org/pub/utils/alsa-utils-${PV}.tar.bz2 \ file://0001-alsactl-don-t-let-systemd-unit-restore-the-volume-wh.patch \ " -SRC_URI[md5sum] = "38ac7c781f80c41c02b4664d8cbafa87" -SRC_URI[sha256sum] = "7af603c0877d1251599d65b4fbc372e63a54371b888f5c26c6a86ac1d0519071" +SRC_URI[md5sum] = "2bf94d3e3410dcc74bb0dae10d46a979" +SRC_URI[sha256sum] = "127217a54eea0f9a49700a2f239a2d4f5384aa094d68df04a8eb80132eb6167c" + +# On build machines with python-docutils (not python3-docutils !!) installed +# rst2man (not rst2man.py) is detected and compile fails with +# | make[1]: *** No rule to make target 'alsaucm.1', needed by 'all-am'. Stop. +# Avoid this by disabling expicitly +EXTRA_OECONF = "--disable-rst2man" # lazy hack. needs proper fixing in gettext.m4, see # http://bugs.openembedded.org/show_bug.cgi?id=2348 @@ -32,7 +38,7 @@ SRC_URI[sha256sum] = "7af603c0877d1251599d65b4fbc372e63a54371b888f5c26c6a86ac1d0 # EXTRA_OECONF_append_libc-uclibc = " --disable-nls" -inherit autotools gettext pkgconfig +inherit autotools gettext pkgconfig manpages # This are all packages that we need to make. Also, the now empty alsa-utils # ipk depends on them. @@ -103,7 +109,7 @@ do_install() { if ${@bb.utils.contains('PACKAGECONFIG', 'udev', 'false', 'true', d)}; then # This is where alsa-utils will install its rules if we don't tell it anything else. - rm -rf ${D}/lib/udev - rmdir --ignore-fail-on-non-empty ${D}/lib + rm -rf ${D}${nonarch_base_libdir}/udev + rmdir --ignore-fail-on-non-empty ${D}${nonarch_base_libdir} fi } diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/ffmpeg/ffmpeg_3.1.3.bb b/import-layers/yocto-poky/meta/recipes-multimedia/ffmpeg/ffmpeg_3.2.4.bb index 050f1eefa7..3216f8eb00 100644 --- a/import-layers/yocto-poky/meta/recipes-multimedia/ffmpeg/ffmpeg_3.1.3.bb +++ b/import-layers/yocto-poky/meta/recipes-multimedia/ffmpeg/ffmpeg_3.2.4.bb @@ -5,7 +5,17 @@ DESCRIPTION = "FFmpeg is the leading multimedia framework, able to decode, encod HOMEPAGE = "https://www.ffmpeg.org/" SECTION = "libs" -LICENSE = "GPLv2+" +LICENSE = "BSD & GPLv2+ & LGPLv2.1+ & MIT" +LICENSE_${PN} = "GPLv2+" +LICENSE_libavcodec = "${@bb.utils.contains('PACKAGECONFIG', 'gpl', 'GPLv2+', 'LGPLv2.1+', d)}" +LICENSE_libavdevice = "${@bb.utils.contains('PACKAGECONFIG', 'gpl', 'GPLv2+', 'LGPLv2.1+', d)}" +LICENSE_libavfilter = "${@bb.utils.contains('PACKAGECONFIG', 'gpl', 'GPLv2+', 'LGPLv2.1+', d)}" +LICENSE_libavformat = "${@bb.utils.contains('PACKAGECONFIG', 'gpl', 'GPLv2+', 'LGPLv2.1+', d)}" +LICENSE_libavresample = "${@bb.utils.contains('PACKAGECONFIG', 'gpl', 'GPLv2+', 'LGPLv2.1+', d)}" +LICENSE_libavutil = "${@bb.utils.contains('PACKAGECONFIG', 'gpl', 'GPLv2+', 'LGPLv2.1+', d)}" +LICENSE_libpostproc = "GPLv2+" +LICENSE_libswresample = "${@bb.utils.contains('PACKAGECONFIG', 'gpl', 'GPLv2+', 'LGPLv2.1+', d)}" +LICENSE_libswscale = "${@bb.utils.contains('PACKAGECONFIG', 'gpl', 'GPLv2+', 'LGPLv2.1+', d)}" LICENSE_FLAGS = "commercial" LIC_FILES_CHKSUM = "file://COPYING.GPLv2;md5=b234ee4d69f5fce4486a80fdaf4a4263 \ @@ -16,8 +26,8 @@ LIC_FILES_CHKSUM = "file://COPYING.GPLv2;md5=b234ee4d69f5fce4486a80fdaf4a4263 \ SRC_URI = "https://www.ffmpeg.org/releases/${BP}.tar.xz \ file://mips64_cpu_detection.patch \ " -SRC_URI[md5sum] = "72769316a4b2b8809c7f6d5a8b6766f4" -SRC_URI[sha256sum] = "f8575c071e2a64437aeb70c8c030b385cddbe0b5cde20c9b18a6def840128822" +SRC_URI[md5sum] = "39fd71024ac76ba35f04397021af5606" +SRC_URI[sha256sum] = "6e38ff14f080c98b58cf5967573501b8cb586e3a173b591f3807d8f0660daf7a" # Build fails when thumb is enabled: https://bugzilla.yoctoproject.org/show_bug.cgi?id=7717 ARM_INSTRUCTION_SET = "arm" @@ -46,7 +56,6 @@ PACKAGECONFIG[avresample] = "--enable-avresample,--disable-avresample" # features to support PACKAGECONFIG[bzlib] = "--enable-bzlib,--disable-bzlib,bzip2" -PACKAGECONFIG[faac] = "--enable-libfaac,--disable-libfaac,faac" PACKAGECONFIG[gpl] = "--enable-gpl,--disable-gpl" PACKAGECONFIG[gsm] = "--enable-libgsm,--disable-libgsm,libgsm" PACKAGECONFIG[jack] = "--enable-indev=jack,--disable-indev=jack,jack" @@ -58,13 +67,20 @@ PACKAGECONFIG[schroedinger] = "--enable-libschroedinger,--disable-libschroedinge PACKAGECONFIG[speex] = "--enable-libspeex,--disable-libspeex,speex" PACKAGECONFIG[theora] = "--enable-libtheora,--disable-libtheora,libtheora" PACKAGECONFIG[vaapi] = "--enable-vaapi,--disable-vaapi,libva" +PACKAGECONFIG[vdpau] = "--enable-vdpau,--disable-vdpau,libvdpau" PACKAGECONFIG[vpx] = "--enable-libvpx,--disable-libvpx,libvpx" PACKAGECONFIG[x11] = "--enable-x11grab,--disable-x11grab,virtual/libx11 libxfixes libxext xproto virtual/libsdl" PACKAGECONFIG[x264] = "--enable-libx264,--disable-libx264,x264" PACKAGECONFIG[xv] = "--enable-outdev=xv,--disable-outdev=xv,libxv" # Check codecs that require --enable-nonfree -USE_NONFREE = "${@bb.utils.contains_any('PACKAGECONFIG', [ 'faac', 'openssl' ], 'yes', '', d)}" +USE_NONFREE = "${@bb.utils.contains_any('PACKAGECONFIG', [ 'openssl' ], 'yes', '', d)}" + +def cpu(d): + for arg in (d.getVar('TUNE_CCARGS') or '').split(): + if arg.startswith('-mcpu='): + return arg[6:] + return 'generic' EXTRA_OECONF = " \ --disable-stripping \ @@ -89,13 +105,35 @@ EXTRA_OECONF = " \ --libdir=${libdir} \ --shlibdir=${libdir} \ --datadir=${datadir}/ffmpeg \ + ${@bb.utils.contains('AVAILTUNES', 'mips32r2', '', '--disable-mipsdsp --disable-mipsdspr2', d)} \ + --cpu=${@cpu(d)} \ " +EXTRA_OECONF_append_linux-gnux32 = " --disable-asm" + do_configure() { ${S}/configure ${EXTRA_OECONF} } -PACKAGES_DYNAMIC += "^lib(av(codec|device|filter|format|util|resample)|swscale|swresample|postproc).*" +PACKAGES =+ "libavcodec \ + libavdevice \ + libavfilter \ + libavformat \ + libavresample \ + libavutil \ + libpostproc \ + libswresample \ + libswscale" + +FILES_libavcodec = "${libdir}/libavcodec${SOLIBS}" +FILES_libavdevice = "${libdir}/libavdevice${SOLIBS}" +FILES_libavfilter = "${libdir}/libavfilter${SOLIBS}" +FILES_libavformat = "${libdir}/libavformat${SOLIBS}" +FILES_libavresample = "${libdir}/libavresample${SOLIBS}" +FILES_libavutil = "${libdir}/libavutil${SOLIBS}" +FILES_libpostproc = "${libdir}/libpostproc${SOLIBS}" +FILES_libswresample = "${libdir}/libswresample${SOLIBS}" +FILES_libswscale = "${libdir}/libswscale${SOLIBS}" # ffmpeg disables PIC on some platforms (e.g. x86-32) INSANE_SKIP_${MLPREFIX}libavcodec = "textrel" @@ -107,36 +145,3 @@ INSANE_SKIP_${MLPREFIX}libavresample = "textrel" INSANE_SKIP_${MLPREFIX}libswscale = "textrel" INSANE_SKIP_${MLPREFIX}libswresample = "textrel" INSANE_SKIP_${MLPREFIX}libpostproc = "textrel" - -python populate_packages_prepend() { - av_libdir = d.expand('${libdir}') - av_pkgconfig = d.expand('${libdir}/pkgconfig') - - # Runtime package - do_split_packages(d, av_libdir, '^lib(.*)\.so\..*', - output_pattern='lib%s', - description='libav %s library', - extra_depends='', - prepend=True, - allow_links=True) - - # Development packages (-dev, -staticdev) - do_split_packages(d, av_libdir, '^lib(.*)\.so$', - output_pattern='lib%s-dev', - description='libav %s development package', - extra_depends='${PN}-dev', - prepend=True, - allow_links=True) - do_split_packages(d, av_pkgconfig, '^lib(.*)\.pc$', - output_pattern='lib%s-dev', - description='libav %s development package', - extra_depends='${PN}-dev', - prepend=True) - do_split_packages(d, av_libdir, '^lib(.*)\.a$', - output_pattern='lib%s-staticdev', - description='libav %s development package - static library', - extra_depends='${PN}-dev', - prepend=True, - allow_links=True) - -} diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/flac/flac_1.3.1.bb b/import-layers/yocto-poky/meta/recipes-multimedia/flac/flac_1.3.2.bb index f25271f879..8315ab5a2f 100644 --- a/import-layers/yocto-poky/meta/recipes-multimedia/flac/flac_1.3.1.bb +++ b/import-layers/yocto-poky/meta/recipes-multimedia/flac/flac_1.3.2.bb @@ -5,19 +5,21 @@ BUGTRACKER = "http://sourceforge.net/p/flac/bugs/" SECTION = "libs" LICENSE = "GFDL-1.2 & GPLv2+ & LGPLv2.1+ & BSD" LIC_FILES_CHKSUM = "file://COPYING.FDL;md5=ad1419ecc56e060eccf8184a87c4285f \ - file://src/Makefile.am;beginline=1;endline=17;md5=0a853b81d9d43d8aad3b53b05cfcc37e \ + file://src/Makefile.am;beginline=1;endline=17;md5=09501c864f89dfc7ead65553129817ca \ file://COPYING.GPL;md5=b234ee4d69f5fce4486a80fdaf4a4263 \ - file://src/flac/main.c;beginline=1;endline=18;md5=d03a766558d233f9cc3ac5dfafd49deb \ + file://src/flac/main.c;beginline=1;endline=18;md5=09777e2934947a36f13568d0beb81199 \ file://COPYING.LGPL;md5=fbc093901857fcd118f065f900982c24 \ - file://src/plugin_common/all.h;beginline=1;endline=18;md5=7c8a3b9e1e66ed0aba765bc6f35da85d \ - file://COPYING.Xiph;md5=a2c4b71c0198682376d483eb5bcc9197 \ + file://src/plugin_common/all.h;beginline=1;endline=18;md5=f56cb4ba9a3bc9ec6102e8df03215271 \ + file://COPYING.Xiph;md5=b59c1b6d7fc0fb7965f821a3d36505e3 \ file://include/FLAC/all.h;beginline=65;endline=70;md5=64474f2b22e9e77b28d8b8b25c983a48" DEPENDS = "libogg" SRC_URI = "http://downloads.xiph.org/releases/flac/${BP}.tar.xz" -SRC_URI[md5sum] = "b9922c9a0378c88d3e901b234f852698" -SRC_URI[sha256sum] = "4773c0099dba767d963fd92143263be338c48702172e8754b9bc5103efe1c56c" +SRC_URI[md5sum] = "454f1bfa3f93cc708098d7890d0499bd" +SRC_URI[sha256sum] = "91cfc3ed61dc40f47f050a109b08610667d73477af6ef36dcad31c31a4a8d53f" + +CVE_PRODUCT = "libflac" inherit autotools gettext diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gst-player/0001-gtk-play-Disable-visualizations.patch b/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gst-player/0001-gtk-play-Disable-visualizations.patch new file mode 100644 index 0000000000..ea88120074 --- /dev/null +++ b/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gst-player/0001-gtk-play-Disable-visualizations.patch @@ -0,0 +1,59 @@ +From 6cf42c468e93b0aaa171961e059bc3e2fb915889 Mon Sep 17 00:00:00 2001 +From: Jussi Kukkonen <jussi.kukkonen@intel.com> +Date: Fri, 28 Apr 2017 14:35:19 +0300 +Subject: [PATCH] gtk-play: Disable visualizations + +This is a workaround for [YOCTO #11410] (audio playback is broken in +mediaplayer if vaapi is used). It disables visualizations and makes +sure we clear the window (otherwise nothing does that and result is +very ugly). + +This patch should be removed when 11410 is fixed. + +Upstream-Status: Inappropriate [bug workaround] +Signed-off-by: Jussi Kukkonen <jussi.kukkonen@intel.com> +--- + gtk/gtk-play.c | 13 ++++++++++++- + 1 file changed, 12 insertions(+), 1 deletion(-) + +diff --git a/gtk/gtk-play.c b/gtk/gtk-play.c +index 8ae0fea..63b9bb0 100644 +--- a/gtk/gtk-play.c ++++ b/gtk/gtk-play.c +@@ -1401,6 +1401,15 @@ get_child_position (GtkOverlay * overlay, GtkWidget * widget, + return TRUE; + } + ++/* Hack to make sure something gets drawn if visualizations are disabled */ ++static gboolean ++draw_cb (GtkWidget *widget, cairo_t *cr, gpointer data) ++{ ++ cairo_set_source_rgb (cr, 0, 0, 0); ++ cairo_paint (cr); ++ return FALSE; ++} ++ + static void + create_ui (GtkPlay * play) + { +@@ -1431,6 +1440,8 @@ create_ui (GtkPlay * play) + play->video_area = gtk_drawing_area_new (); + g_signal_connect (play->video_area, "realize", + G_CALLBACK (video_area_realize_cb), play); ++ g_signal_connect (play->video_area, "draw", ++ G_CALLBACK (draw_cb), NULL); + } + gtk_widget_set_events (play->video_area, GDK_EXPOSURE_MASK + | GDK_LEAVE_NOTIFY_MASK +@@ -1753,7 +1764,7 @@ gtk_play_constructor (GType type, guint n_construct_params, + + /* enable visualization (by default playbin uses goom) */ + /* if visualization is enabled then use the first element */ +- gst_player_set_visualization_enabled (self->player, TRUE); ++ gst_player_set_visualization_enabled (self->player, FALSE); + + g_signal_connect (G_OBJECT (self), "show", G_CALLBACK (show_cb), NULL); + +-- +2.1.4 + diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gst-player/0001-gtk-play-provide-similar-behaviour-for-quit-and-clos.patch b/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gst-player/0001-gtk-play-provide-similar-behaviour-for-quit-and-clos.patch deleted file mode 100644 index e3f1c4f749..0000000000 --- a/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gst-player/0001-gtk-play-provide-similar-behaviour-for-quit-and-clos.patch +++ /dev/null @@ -1,32 +0,0 @@ -From 220c2659a45dd354270a465c45197970dae5f548 Mon Sep 17 00:00:00 2001 -From: "Maxin B. John" <maxin.john@intel.com> -Date: Fri, 5 Aug 2016 17:52:18 +0300 -Subject: [PATCH] gtk-play: provide similar behaviour for quit and close - -In x86 targets, gtk-play just pause rather than quitting the application -when we click the close button (delete-event). Change the callback function -to get similar behaviour when we click on "Quit" menu option. - -Upstream-Status: Accepted - -Signed-off-by: Maxin B. John <maxin.john@intel.com> ---- - gtk/gtk-play.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/gtk/gtk-play.c b/gtk/gtk-play.c -index a520bef..16afc6b 100644 ---- a/gtk/gtk-play.c -+++ b/gtk/gtk-play.c -@@ -177,7 +177,7 @@ load_from_builder (const gchar * filename, gboolean register_sig_handler, - static void - delete_event_cb (GtkWidget * widget, GdkEvent * event, GtkPlay * play) - { -- gst_player_stop (play->player); -+ gtk_widget_destroy (GTK_WIDGET (play)); - } - - static void --- -2.4.0 - diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gst-player_git.bb b/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gst-player_git.bb index 2a4c9dcfbf..cb12a464a4 100644 --- a/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gst-player_git.bb +++ b/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gst-player_git.bb @@ -2,16 +2,16 @@ SUMMARY = "GStreamer playback helper library and examples" LICENSE = "LGPL-2.0+" LIC_FILES_CHKSUM = "file://gtk/gtk-play.c;beginline=1;endline=20;md5=f8c72dae3d36823ec716a9ebcae593b9" -DEPENDS = "glib-2.0 gstreamer1.0 gstreamer1.0-plugins-base gstreamer1.0-plugins-bad gtk+3" +DEPENDS = "glib-2.0 gstreamer1.0 gstreamer1.0-plugins-base gstreamer1.0-plugins-bad gtk+3 glib-2.0-native" SRC_URI = "git://github.com/sdroege/gst-player.git \ file://filechooser.patch;apply=0 \ file://Fix-pause-play.patch;apply=0 \ file://Add-error-signal-emission-for-missing-plugins.patch;apply=0 \ - file://0001-gtk-play-provide-similar-behaviour-for-quit-and-clos.patch \ + file://0001-gtk-play-Disable-visualizations.patch \ file://gst-player.desktop" -SRCREV = "ea90e63c1064503f9ba5d59aa4ca604f13ca5def" +SRCREV = "ee3c226c82767a089743e4e06058743e67f73cdb" PV = "0.0.1+git${SRCPV}" S = "${WORKDIR}/git" diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gst-plugins-package.inc b/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gst-plugins-package.inc index c24493e1e8..3fdb10e404 100644 --- a/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gst-plugins-package.inc +++ b/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gst-plugins-package.inc @@ -3,8 +3,8 @@ PACKAGESPLITFUNCS_append = " set_metapkg_rdepends " python split_gstreamer10_packages () { gst_libdir = d.expand('${libdir}/gstreamer-${LIBV}') - postinst = d.getVar('plugin_postinst', True) - glibdir = d.getVar('libdir', True) + postinst = d.getVar('plugin_postinst') + glibdir = d.getVar('libdir') do_split_packages(d, glibdir, '^lib(.*)\.so\.*', 'lib%s', 'gstreamer %s library', extra_depends='', allow_links=True) do_split_packages(d, gst_libdir, 'libgst(.*)\.so$', d.expand('${PN}-%s'), 'GStreamer plugin for %s', postinst=postinst, extra_depends='') @@ -16,14 +16,14 @@ python split_gstreamer10_packages () { python set_metapkg_rdepends () { import os - pn = d.getVar('PN', True) + pn = d.getVar('PN') metapkg = pn + '-meta' d.setVar('ALLOW_EMPTY_' + metapkg, "1") d.setVar('FILES_' + metapkg, "") blacklist = [ pn, pn + '-locale', pn + '-dev', pn + '-dbg', pn + '-doc', pn + '-meta' ] metapkg_rdepends = [] - packages = d.getVar('PACKAGES', True).split() - pkgdest = d.getVar('PKGDEST', True) + packages = d.getVar('PACKAGES').split() + pkgdest = d.getVar('PKGDEST') for pkg in packages[1:]: if not pkg in blacklist and not pkg in metapkg_rdepends and not pkg.endswith('-dev') and not pkg.endswith('-dbg') and not pkg.count('locale') and not pkg.count('-staticdev'): # See if the package is empty by looking at the contents of its PKGDEST subdirectory. diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer-vaapi/vaapivideobufferpool-create-allocator-if-needed.patch b/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer-vaapi/vaapivideobufferpool-create-allocator-if-needed.patch new file mode 100644 index 0000000000..f666adc819 --- /dev/null +++ b/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer-vaapi/vaapivideobufferpool-create-allocator-if-needed.patch @@ -0,0 +1,61 @@ +Signed-off-by: Jussi Kukkonen <jussi.kukkonen@intel.com> +Upstream-Status: Backport [commit 59a731be6b in '1.10' branch] + + +From 02a6002c3a80b3a5301c0943b1a1518bbdf439fc Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?V=C3=ADctor=20Manuel=20J=C3=A1quez=20Leal?= + <vjaquez@igalia.com> +Date: Fri, 21 Apr 2017 19:07:18 +0200 +Subject: [PATCH] vaapivideobufferpool: create allocator if needed + +Backport to branch 1.10 + +Sometimes a video decoder could set different buffer pool +configurations, because their frame size changes. In this case we +did not reconfigure the allocator. + +This patch enables this use case, creating a new allocator inside +the VAAPI buffer pool if the caps changed, if it is not dmabuf-based. +If so, it is just reconfigured, since it doesn't have a surface pool. + +https://bugzilla.gnome.org/show_bug.cgi?id=781577 +--- + gst/vaapi/gstvaapivideobufferpool.c | 21 +++++++++++++++++++++ + 1 file changed, 21 insertions(+) + +diff --git a/gst/vaapi/gstvaapivideobufferpool.c b/gst/vaapi/gstvaapivideobufferpool.c +index a3b9223f..9a50614b 100644 +--- a/gst/vaapi/gstvaapivideobufferpool.c ++++ b/gst/vaapi/gstvaapivideobufferpool.c +@@ -159,6 +159,27 @@ gst_vaapi_video_buffer_pool_set_config (GstBufferPool * pool, + gst_object_replace ((GstObject **) & priv->allocator, NULL); + priv->video_info = new_vip; + ++ { ++ guint surface_alloc_flags; ++ gboolean vinfo_changed = FALSE; ++ ++ if (allocator) { ++ const GstVideoInfo *alloc_vinfo = ++ gst_allocator_get_vaapi_video_info (allocator, &surface_alloc_flags); ++ vinfo_changed = gst_video_info_changed (alloc_vinfo, &new_vip); ++ } ++ ++ if (vinfo_changed && allocator && priv->use_dmabuf_memory) { ++ gst_allocator_set_vaapi_video_info (allocator, &new_vip, ++ surface_alloc_flags); ++ } else if (!priv->use_dmabuf_memory && (vinfo_changed || !allocator)) { ++ /* let's destroy the other allocator and create a new one */ ++ allocator = gst_vaapi_video_allocator_new (priv->display, &new_vip, ++ surface_alloc_flags); ++ gst_buffer_pool_config_set_allocator (config, allocator, NULL); ++ } ++ } ++ + if (!gst_buffer_pool_config_has_option (config, + GST_BUFFER_POOL_OPTION_VAAPI_VIDEO_META)) + goto error_no_vaapi_video_meta_option; +-- +2.11.0 + + diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-libav.inc b/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-libav.inc index ea011637c2..c2283061cc 100644 --- a/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-libav.inc +++ b/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-libav.inc @@ -30,6 +30,10 @@ LIBAV_EXTRA_CONFIGURE_COMMON_ARG = "--target-os=linux \ ${GSTREAMER_1_0_DEBUG} \ --cross-prefix='${HOST_PREFIX}'" +# Disable assembly optimizations for X32, as this libav lacks the support +PACKAGECONFIG_remove_linux-gnux32 = "yasm" +LIBAV_EXTRA_CONFIGURE_COMMON_ARG_append_linux-gnux32 = " --disable-asm" + LIBAV_EXTRA_CONFIGURE_COMMON = \ '${LIBAV_EXTRA_CONFIGURE}="${LIBAV_EXTRA_CONFIGURE_COMMON_ARG}"' diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-libav/mips64_cpu_detection.patch b/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-libav/mips64_cpu_detection.patch new file mode 100644 index 0000000000..7a0b448888 --- /dev/null +++ b/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-libav/mips64_cpu_detection.patch @@ -0,0 +1,32 @@ +It will add -mips64r6 and -mips64r2 to cmdline which will +cause conflicts + +in OE we user mips32r2 and mips64r2 for mips arch versions +so there is no benefit of detecting it automatically by +poking at tools especially in cross env + +Fixes errors like + +linking -mnan=2008 module with previous -mnan=legacy modules +failed to merge target specific data of file + +-Khem +Upstream-Status: Inappropriate [OE-Specific] + +Index: gst-libav-1.10.1/gst-libs/ext/libav/configure +=================================================================== +--- gst-libav-1.10.1.orig/gst-libs/ext/libav/configure ++++ gst-libav-1.10.1/gst-libs/ext/libav/configure +@@ -5269,12 +5269,9 @@ elif enabled mips; then + + # Enable minimum ISA based on selected options + if enabled mips64; then +- enabled mips64r6 && check_inline_asm_flags mips64r6 '"dlsa $0, $0, $0, 1"' '-mips64r6' + enabled mips64r2 && check_inline_asm_flags mips64r2 '"dext $0, $0, 0, 1"' '-mips64r2' + disabled mips64r6 && disabled mips64r2 && check_inline_asm_flags mips64r1 '"daddi $0, $0, 0"' '-mips64' + else +- enabled mips32r6 && check_inline_asm_flags mips32r6 '"aui $0, $0, 0"' '-mips32r6' +- enabled mips32r5 && check_inline_asm_flags mips32r5 '"eretnc"' '-mips32r5' + enabled mips32r2 && check_inline_asm_flags mips32r2 '"ext $0, $0, 0, 1"' '-mips32r2' + disabled mips32r6 && disabled mips32r5 && disabled mips32r2 && check_inline_asm_flags mips32r1 '"addi $0, $0, 0"' '-mips32' + fi diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-libav_1.8.3.bb b/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-libav_1.10.4.bb index 3d86221d22..59d81db03a 100644 --- a/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-libav_1.8.3.bb +++ b/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-libav_1.10.4.bb @@ -1,4 +1,4 @@ -include gstreamer1.0-libav.inc +require gstreamer1.0-libav.inc LIC_FILES_CHKSUM = "file://COPYING;md5=b234ee4d69f5fce4486a80fdaf4a4263 \ file://COPYING.LIB;md5=6762ed442b3822387a51c92d928ead0d \ @@ -12,9 +12,9 @@ SRC_URI = " \ http://gstreamer.freedesktop.org/src/gst-libav/gst-libav-${PV}.tar.xz \ file://0001-Disable-yasm-for-libav-when-disable-yasm.patch \ file://workaround-to-build-gst-libav-for-i586-with-gcc.patch \ + file://mips64_cpu_detection.patch \ " - -SRC_URI[md5sum] = "b51a736147bacb40f85827a4e0ae0d2c" -SRC_URI[sha256sum] = "9006a05990089f7155ee0e848042f6bb24e52ab1d0a59ff8d1b5d7e33001a495" +SRC_URI[md5sum] = "e2bdd9fde6ca3ff7efffb93df121f4fd" +SRC_URI[sha256sum] = "6ca0feca75e3d48315e07f20ec37cf6260ed1e9dde58df355febd5016246268b" S = "${WORKDIR}/gst-libav-${PV}" diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-libav_git.bb b/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-libav_git.bb deleted file mode 100644 index f4604a34c8..0000000000 --- a/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-libav_git.bb +++ /dev/null @@ -1,38 +0,0 @@ -DEFAULT_PREFERENCE = "-1" - -include gstreamer1.0-libav.inc - -LIC_FILES_CHKSUM = "file://COPYING;md5=b234ee4d69f5fce4486a80fdaf4a4263 \ - file://COPYING.LIB;md5=6762ed442b3822387a51c92d928ead0d \ - file://ext/libav/gstav.h;beginline=1;endline=18;md5=a752c35267d8276fd9ca3db6994fca9c \ - file://gst-libs/ext/libav/LICENSE.md;md5=acda96fe91ccaabc9cd9d541806a0d37 \ - file://gst-libs/ext/libav/COPYING.GPLv2;md5=b234ee4d69f5fce4486a80fdaf4a4263 \ - file://gst-libs/ext/libav/COPYING.GPLv3;md5=d32239bcb673463ab874e80d47fae504 \ - file://gst-libs/ext/libav/COPYING.LGPLv2.1;md5=bd7a443320af8c812e4c18d1b79df004 \ - file://gst-libs/ext/libav/COPYING.LGPLv3;md5=e6a600fd5e1d9cbde2d983680233ad02" - -# To build using the system libav/ffmpeg, append "libav" to PACKAGECONFIG -# and remove the ffmpeg sources from SRC_URI below. However, first note the -# warnings in gstreamer1.0-libav.inc -SRC_URI = " \ - git://anongit.freedesktop.org/gstreamer/gst-libav;branch=1.8;name=base \ - git://anongit.freedesktop.org/gstreamer/common;destsuffix=git/common;name=common \ - git://source.ffmpeg.org/ffmpeg;destsuffix=git/gst-libs/ext/libav;name=ffmpeg;branch=release/3.0 \ - file://0001-Disable-yasm-for-libav-when-disable-yasm.patch \ - file://workaround-to-build-gst-libav-for-i586-with-gcc.patch \ -" - -PV = "1.8.2+git${SRCPV}" - -UPSTREAM_CHECK_GITTAGREGEX = "(?P<pver>(\d+(\.\d+)+))" - -SRCREV_base = "f285cf0fd799cc3b46b5cecaaa439d5a2a38a9b7" -SRCREV_common = "f363b3205658a38e84fa77f19dee218cd4445275" -SRCREV_ffmpeg = "c66f4d1ae64dffaf456d05cbdade02054446f499" -SRCREV_FORMAT = "base" - -S = "${WORKDIR}/git" - -do_configure_prepend() { - ${S}/autogen.sh --noconfigure -} diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-omx.inc b/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-omx.inc index 07e5b7db5e..05562b11a7 100644 --- a/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-omx.inc +++ b/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-omx.inc @@ -18,7 +18,7 @@ GSTREAMER_1_0_OMX_CORE_NAME ?= "${libdir}/libomxil-bellagio.so.0" EXTRA_OECONF += "--disable-valgrind --with-omx-target=${GSTREAMER_1_0_OMX_TARGET}" python __anonymous () { - omx_target = d.getVar("GSTREAMER_1_0_OMX_TARGET", True) + omx_target = d.getVar("GSTREAMER_1_0_OMX_TARGET") if omx_target in ['generic', 'bellagio']: # Bellagio headers are incomplete (they are missing the OMX_VERSION_MAJOR,# # OMX_VERSION_MINOR, OMX_VERSION_REVISION, and OMX_VERSION_STEP macros); @@ -26,7 +26,7 @@ python __anonymous () { d.appendVar("CFLAGS", " -I${S}/omx/openmax") elif omx_target == "rpi": # Dedicated Raspberry Pi OpenMAX IL support makes this package machine specific - d.setVar("PACKAGE_ARCH", d.getVar("MACHINE_ARCH", True)) + d.setVar("PACKAGE_ARCH", d.getVar("MACHINE_ARCH")) } set_omx_core_name() { diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-omx/0001-omx-fixed-type-error-in-printf-call.patch b/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-omx/0001-omx-fixed-type-error-in-printf-call.patch deleted file mode 100644 index a428ac9c91..0000000000 --- a/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-omx/0001-omx-fixed-type-error-in-printf-call.patch +++ /dev/null @@ -1,30 +0,0 @@ -From f629e041e9f678fcd86ad764a15117dff63c271c Mon Sep 17 00:00:00 2001 -From: Carlos Rafael Giani <dv@pseudoterminal.org> -Date: Sat, 27 Apr 2013 02:50:25 +0200 -Subject: [PATCH] omx: fixed type error in printf call - -%zu expects size_t - -Upstream-Status: Submitted [https://bugzilla.gnome.org/show_bug.cgi?id=699008] - -Signed-off-by: Carlos Rafael Giani <dv@pseudoterminal.org> ---- - omx/gstomx.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/omx/gstomx.c b/omx/gstomx.c -index a2945ed..1eca7cc 100644 ---- a/omx/gstomx.c -+++ b/omx/gstomx.c -@@ -1630,7 +1630,7 @@ gst_omx_port_allocate_buffers_unlocked (GstOMXPort * port, - - GST_INFO_OBJECT (comp->parent, - "Allocating %d buffers of size %zu for %s port %u", n, -- port->port_def.nBufferSize, comp->name, (guint) port->index); -+ (size_t) (port->port_def.nBufferSize), comp->name, (guint) port->index); - - if (!port->buffers) - port->buffers = g_ptr_array_sized_new (n); --- -1.7.9.5 - diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-omx_1.2.0.bb b/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-omx_1.10.4.bb index 74358a7245..dfeefa5579 100644 --- a/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-omx_1.2.0.bb +++ b/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-omx_1.10.4.bb @@ -5,7 +5,7 @@ LIC_FILES_CHKSUM = "file://COPYING;md5=4fbd65380cdd255951079008b364516c \ SRC_URI = "http://gstreamer.freedesktop.org/src/gst-omx/gst-omx-${PV}.tar.xz" -SRC_URI[md5sum] = "d24e8c0153c35dfefee3e26b1c2c35f8" -SRC_URI[sha256sum] = "0b4874961e6488ad9e5808114bd486ea981c540907262caab1419355fd82d745" +SRC_URI[md5sum] = "cedb230f1c47d0cf4b575d70dff66ff2" +SRC_URI[sha256sum] = "45072925cf262f0fd528fab78f0de52734e46a5a88aa802fae51c67c09c81aa2" S = "${WORKDIR}/gst-omx-${PV}" diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-omx_git.bb b/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-omx_git.bb deleted file mode 100644 index 9705543529..0000000000 --- a/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-omx_git.bb +++ /dev/null @@ -1,25 +0,0 @@ -DEFAULT_PREFERENCE = "-1" - -include gstreamer1.0-omx.inc - -LIC_FILES_CHKSUM = "file://COPYING;md5=4fbd65380cdd255951079008b364516c \ - file://omx/gstomx.h;beginline=1;endline=21;md5=5c8e1fca32704488e76d2ba9ddfa935f" - -SRC_URI = " \ - git://anongit.freedesktop.org/gstreamer/gst-omx;branch=master;name=gst-omx \ - git://anongit.freedesktop.org/gstreamer/common;destsuffix=git/common;branch=master;name=common \ - file://0001-omx-fixed-type-error-in-printf-call.patch \ -" - -SRCREV_gst-omx = "a2db76b048db278ef0aa798e106b7594264e06c0" -SRCREV_common = "5edcd857b2107cd8b78c16232dd10877513ec157" - -SRCREV_FORMAT = "gst-omx" - -S = "${WORKDIR}/git" - -do_configure_prepend() { - cd ${S} - ./autogen.sh --noconfigure - cd ${B} -} diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad.inc b/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad.inc index 0fe5564b53..0ccfc89a2e 100644 --- a/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad.inc +++ b/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad.inc @@ -12,7 +12,7 @@ SRC_URI_append = " \ # opengl packageconfig factored out to make it easy for distros # and BSP layers to pick either (desktop) opengl, gles2, or no GL -PACKAGECONFIG_GL ?= "${@bb.utils.contains('DISTRO_FEATURES', 'opengl', 'gles2', '', d)}" +PACKAGECONFIG_GL ?= "${@bb.utils.contains('DISTRO_FEATURES', 'opengl', 'gles2 egl', '', d)}" # gtk is not in the PACKAGECONFIG variable by default until # the transition to gtk+3 is finished @@ -20,7 +20,7 @@ PACKAGECONFIG ??= " \ ${GSTREAMER_ORC} \ ${PACKAGECONFIG_GL} \ ${@bb.utils.contains('DISTRO_FEATURES', 'bluetooth', 'bluez', '', d)} \ - ${@bb.utils.contains('DISTRO_FEATURES', 'directfb', 'directfb', '', d)} \ + ${@bb.utils.filter('DISTRO_FEATURES', 'directfb', d)} \ ${@bb.utils.contains('DISTRO_FEATURES', 'wayland', 'wayland egl', '', d)} \ bz2 curl dash dtls hls neon rsvg sbc smoothstreaming sndfile uvch264 webp \ " @@ -30,6 +30,7 @@ PACKAGECONFIG[bluez] = "--enable-bluez,--disable-bluez,${BLUEZ}" PACKAGECONFIG[bz2] = "--enable-bz2,--disable-bz2,bzip2" PACKAGECONFIG[curl] = "--enable-curl,--disable-curl,curl" PACKAGECONFIG[dash] = "--enable-dash,--disable-dash,libxml2" +PACKAGECONFIG[dc1394] = "--enable-dc1394,--disable-dc1394,libdc1394" PACKAGECONFIG[directfb] = "--enable-directfb,--disable-directfb,directfb" PACKAGECONFIG[dtls] = "--enable-dtls,--disable-dtls,openssl" PACKAGECONFIG[egl] = "--enable-egl,--disable-egl,virtual/egl" @@ -42,6 +43,7 @@ PACKAGECONFIG[gtk] = "--enable-gtk3,--disable-gtk3,gtk+3" # ensure OpenSSL is used for HLS AES description instead of nettle # (OpenSSL is a shared dependency with dtls) PACKAGECONFIG[hls] = "--enable-hls --with-hls-crypto=openssl,--disable-hls,openssl" +PACKAGECONFIG[kms] = "--enable-kms,--disable-kms,libdrm" PACKAGECONFIG[libmms] = "--enable-libmms,--disable-libmms,libmms" PACKAGECONFIG[libssh2] = "--enable-libssh2,--disable-libssh2,libssh2" PACKAGECONFIG[modplug] = "--enable-modplug,--disable-modplug,libmodplug" @@ -49,6 +51,7 @@ PACKAGECONFIG[neon] = "--enable-neon,--disable-neon,neon" PACKAGECONFIG[openal] = "--enable-openal,--disable-openal,openal-soft" PACKAGECONFIG[opencv] = "--enable-opencv,--disable-opencv,opencv" PACKAGECONFIG[opengl] = "--enable-opengl,--disable-opengl,virtual/libgl libglu" +PACKAGECONFIG[openjpeg] = "--enable-openjpeg,--disable-openjpeg,openjpeg" # the opus encoder/decoder elements are now in the -base package, # but the opus parser remains in -bad PACKAGECONFIG[opusparse] = "--enable-opus,--disable-opus,libopus" @@ -63,18 +66,18 @@ PACKAGECONFIG[srtp] = "--enable-srtp,--disable-srtp,libsrtp" PACKAGECONFIG[uvch264] = "--enable-uvch264,--disable-uvch264,libusb1 libgudev" PACKAGECONFIG[voaacenc] = "--enable-voaacenc,--disable-voaacenc,vo-aacenc" PACKAGECONFIG[voamrwbenc] = "--enable-voamrwbenc,--disable-voamrwbenc,vo-amrwbenc" -PACKAGECONFIG[wayland] = "--enable-wayland,--disable-wayland,wayland-native wayland" +PACKAGECONFIG[wayland] = "--enable-wayland,--disable-wayland,wayland-native wayland wayland-protocols" PACKAGECONFIG[webp] = "--enable-webp,--disable-webp,libwebp" # these plugins have not been ported to 1.0 (yet): -# apexsink dc1394 lv2 linsys musepack nas timidity sdl xvid wininet +# apexsink linsys nas timidity sdl xvid wininet # sndio cdxaparse dccp faceoverlay hdvparse tta mve nuvdemux # patchdetect sdi videomeasure # these plugins have no corresponding library in OE-core or meta-openembedded: -# openni2 winks direct3d directsound winscreencap acm -# apple_media android_media avc bs2b chromaprint daala dts gme gsm kate ladspa -# libde265 mimic mpeg2enc mplex nvenc ofa openh264 opensles pvr soundtouch spandsp +# openni2 winks direct3d directsound winscreencap acm apple_media +# android_media avc bs2b chromaprint daala dts fdkaac gme gsm kate ladspa libde265 +# lv2 mimic mpeg2enc mplex musepack nvenc ofa openh264 opensles pvr soundtouch spandsp # spc teletextdec tinyalsa vdpau vulkan wasapi x265 zbar # qt5 support is disabled, because it is not present in OE core, and requires more work than @@ -98,10 +101,10 @@ EXTRA_OECONF += " \ --disable-chromaprint \ --disable-cocoa \ --disable-daala \ - --disable-dc1394 \ --disable-direct3d \ --disable-directsound \ --disable-dts \ + --disable-fdk_aac \ --disable-gme \ --disable-gsm \ --disable-kate \ @@ -119,7 +122,6 @@ EXTRA_OECONF += " \ --disable-ofa \ --disable-openexr \ --disable-openh264 \ - --disable-openjpeg \ --disable-openni2 \ --disable-opensles \ --disable-pvr \ diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0001-Makefile.am-don-t-hardcode-libtool-name-when-running.patch b/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0001-Makefile.am-don-t-hardcode-libtool-name-when-running.patch index 33efc503eb..43f1ee0d23 100644 --- a/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0001-Makefile.am-don-t-hardcode-libtool-name-when-running.patch +++ b/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0001-Makefile.am-don-t-hardcode-libtool-name-when-running.patch @@ -13,24 +13,24 @@ Signed-off-by: Alexander Kanavin <alex.kanavin@gmail.com> gst-libs/gst/mpegts/Makefile.am | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) -diff --git a/gst-libs/gst/gl/Makefile.am b/gst-libs/gst/gl/Makefile.am -index f968357..7cc2c7a 100644 ---- a/gst-libs/gst/gl/Makefile.am -+++ b/gst-libs/gst/gl/Makefile.am -@@ -167,7 +167,7 @@ GstGL-@GST_API_VERSION@.gir: $(INTROSPECTION_SCANNER) libgstgl-@GST_API_VERSION@ - --library=libgstgl-@GST_API_VERSION@.la \ +Index: gst-plugins-bad-1.10.1/gst-libs/gst/gl/Makefile.am +=================================================================== +--- gst-plugins-bad-1.10.1.orig/gst-libs/gst/gl/Makefile.am ++++ gst-plugins-bad-1.10.1/gst-libs/gst/gl/Makefile.am +@@ -171,7 +171,7 @@ GstGL-@GST_API_VERSION@.gir: $(INTROSPEC --include=Gst-@GST_API_VERSION@ \ --include=GstBase-@GST_API_VERSION@ \ + --include=GstVideo-@GST_API_VERSION@ \ - --libtool="$(top_builddir)/libtool" \ + --libtool="$(LIBTOOL)" \ --pkg gstreamer-@GST_API_VERSION@ \ --pkg gstreamer-base-@GST_API_VERSION@ \ --pkg gstreamer-video-@GST_API_VERSION@ \ -diff --git a/gst-libs/gst/insertbin/Makefile.am b/gst-libs/gst/insertbin/Makefile.am -index 09eb97c..b746885 100644 ---- a/gst-libs/gst/insertbin/Makefile.am -+++ b/gst-libs/gst/insertbin/Makefile.am -@@ -44,7 +44,7 @@ GstInsertBin-@GST_API_VERSION@.gir: $(INTROSPECTION_SCANNER) libgstinsertbin-@GS +Index: gst-plugins-bad-1.10.1/gst-libs/gst/insertbin/Makefile.am +=================================================================== +--- gst-plugins-bad-1.10.1.orig/gst-libs/gst/insertbin/Makefile.am ++++ gst-plugins-bad-1.10.1/gst-libs/gst/insertbin/Makefile.am +@@ -45,7 +45,7 @@ GstInsertBin-@GST_API_VERSION@.gir: $(IN --library=libgstinsertbin-@GST_API_VERSION@.la \ --include=Gst-@GST_API_VERSION@ \ --include=GstBase-@GST_API_VERSION@ \ @@ -39,11 +39,11 @@ index 09eb97c..b746885 100644 --pkg gstreamer-@GST_API_VERSION@ \ --pkg gstreamer-base-@GST_API_VERSION@ \ --pkg-export gstreamer-insertbin-@GST_API_VERSION@ \ -diff --git a/gst-libs/gst/mpegts/Makefile.am b/gst-libs/gst/mpegts/Makefile.am -index 2511d49..c1cbce6 100644 ---- a/gst-libs/gst/mpegts/Makefile.am -+++ b/gst-libs/gst/mpegts/Makefile.am -@@ -78,7 +78,7 @@ GstMpegts-@GST_API_VERSION@.gir: $(INTROSPECTION_SCANNER) libgstmpegts-@GST_API_ +Index: gst-plugins-bad-1.10.1/gst-libs/gst/mpegts/Makefile.am +=================================================================== +--- gst-plugins-bad-1.10.1.orig/gst-libs/gst/mpegts/Makefile.am ++++ gst-plugins-bad-1.10.1/gst-libs/gst/mpegts/Makefile.am +@@ -79,7 +79,7 @@ GstMpegts-@GST_API_VERSION@.gir: $(INTRO --add-include-path=`PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" $(PKG_CONFIG) --variable=girdir gstreamer-video-@GST_API_VERSION@` \ --library=libgstmpegts-@GST_API_VERSION@.la \ --include=Gst-@GST_API_VERSION@ \ @@ -52,6 +52,3 @@ index 2511d49..c1cbce6 100644 --pkg gstreamer-@GST_API_VERSION@ \ --pkg gstreamer-video-@GST_API_VERSION@ \ --pkg-export gstreamer-mpegts-@GST_API_VERSION@ \ --- -2.6.2 - diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0001-Prepend-PKG_CONFIG_SYSROOT_DIR-to-pkg-config-output.patch b/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0001-Prepend-PKG_CONFIG_SYSROOT_DIR-to-pkg-config-output.patch new file mode 100644 index 0000000000..86a4495a85 --- /dev/null +++ b/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0001-Prepend-PKG_CONFIG_SYSROOT_DIR-to-pkg-config-output.patch @@ -0,0 +1,34 @@ +From c271503d7e233428ac0323c51d6517113e26bef7 Mon Sep 17 00:00:00 2001 +From: Khem Raj <raj.khem@gmail.com> +Date: Thu, 1 Dec 2016 00:27:13 -0800 +Subject: [PATCH] Prepend PKG_CONFIG_SYSROOT_DIR to pkg-config output + +In cross environment we have to prepend the sysroot to the path found by +pkgconfig since the path returned from pkgconfig does not have sysroot prefixed +it ends up using the files from host system. If build host has wayland installed +the build will succeed but if you dont have wayland-protocols installed on build host then +it wont find the files on build host + +This should work ok with non sysrooted builds too since in those cases PKG_CONFIG_SYSROOT_DIR +will be empty + +Upstream-Status: Pending + +Signed-off-by: Khem Raj <raj.khem@gmail.com> +--- + configure.ac | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +Index: gst-plugins-bad-1.10.1/configure.ac +=================================================================== +--- gst-plugins-bad-1.10.1.orig/configure.ac ++++ gst-plugins-bad-1.10.1/configure.ac +@@ -2233,7 +2233,7 @@ AG_GST_CHECK_FEATURE(WAYLAND, [wayland s + PKG_CHECK_MODULES(WAYLAND_PROTOCOLS, wayland-protocols >= 1.4, [ + if test "x$wayland_scanner" != "x"; then + HAVE_WAYLAND="yes" +- AC_SUBST(WAYLAND_PROTOCOLS_DATADIR, `$PKG_CONFIG --variable=pkgdatadir wayland-protocols`) ++ AC_SUBST(WAYLAND_PROTOCOLS_DATADIR, ${WAYLAND_PROTOCOLS_SYSROOT_DIR}`$PKG_CONFIG --variable=pkgdatadir wayland-protocols`) + else + AC_MSG_RESULT([wayland-scanner is required to build the wayland plugin]) + HAVE_WAYLAND="no" diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0001-gstreamer-gl.pc.in-don-t-append-GL_CFLAGS-to-CFLAGS.patch b/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0001-gstreamer-gl.pc.in-don-t-append-GL_CFLAGS-to-CFLAGS.patch index e81b065705..9fc91d8fc4 100644 --- a/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0001-gstreamer-gl.pc.in-don-t-append-GL_CFLAGS-to-CFLAGS.patch +++ b/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0001-gstreamer-gl.pc.in-don-t-append-GL_CFLAGS-to-CFLAGS.patch @@ -12,16 +12,13 @@ Signed-off-by: Alexander Kanavin <alex.kanavin@gmail.com> pkgconfig/gstreamer-gl.pc.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) -diff --git a/pkgconfig/gstreamer-gl.pc.in b/pkgconfig/gstreamer-gl.pc.in -index 5589e2a..b986450 100644 ---- a/pkgconfig/gstreamer-gl.pc.in -+++ b/pkgconfig/gstreamer-gl.pc.in +Index: gst-plugins-bad-1.10.1/pkgconfig/gstreamer-gl.pc.in +=================================================================== +--- gst-plugins-bad-1.10.1.orig/pkgconfig/gstreamer-gl.pc.in ++++ gst-plugins-bad-1.10.1/pkgconfig/gstreamer-gl.pc.in @@ -10,4 +10,4 @@ Version: @VERSION@ Requires: gstreamer-base-@GST_API_VERSION@ gstreamer-@GST_API_VERSION@ Libs: -L${libdir} -lgstgl-@GST_API_VERSION@ @GL_LIBS@ --Cflags: -I${includedir} @GL_CFLAGS@ -+Cflags: -I${includedir} --- -2.7.0 - +-Cflags: -I${includedir} -I${libdir}/gstreamer-@GST_API_VERSION@/include @GL_CFLAGS@ ++Cflags: -I${includedir} -I${libdir}/gstreamer-@GST_API_VERSION@/include diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0001-mssdemux-improved-live-playback-support.patch b/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0001-mssdemux-improved-live-playback-support.patch new file mode 100644 index 0000000000..4832c18e78 --- /dev/null +++ b/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0001-mssdemux-improved-live-playback-support.patch @@ -0,0 +1,929 @@ +From 73721ad4e9e2d32e1c8b6a3b4aaa98401530e58a Mon Sep 17 00:00:00 2001 +From: Philippe Normand <philn@igalia.com> +Date: Tue, 29 Nov 2016 14:43:41 +0100 +Subject: [PATCH] mssdemux: improved live playback support + +When a MSS server hosts a live stream the fragments listed in the +manifest usually don't have accurate timestamps and duration, except +for the first fragment, which additionally stores timing information +for the few upcoming fragments. In this scenario it is useless to +periodically fetch and update the manifest and the fragments list can +be incrementally built by parsing the first/current fragment. + +https://bugzilla.gnome.org/show_bug.cgi?id=755036 +--- +Upstream-Status: Backport +Signed-off-by: Khem Raj <raj.khem@gmail.com> + + ext/smoothstreaming/Makefile.am | 2 + + ext/smoothstreaming/gstmssdemux.c | 60 ++++++ + ext/smoothstreaming/gstmssfragmentparser.c | 266 ++++++++++++++++++++++++++ + ext/smoothstreaming/gstmssfragmentparser.h | 84 ++++++++ + ext/smoothstreaming/gstmssmanifest.c | 158 ++++++++++++++- + ext/smoothstreaming/gstmssmanifest.h | 7 + + gst-libs/gst/adaptivedemux/gstadaptivedemux.c | 27 ++- + gst-libs/gst/adaptivedemux/gstadaptivedemux.h | 14 ++ + 8 files changed, 606 insertions(+), 12 deletions(-) + create mode 100644 ext/smoothstreaming/gstmssfragmentparser.c + create mode 100644 ext/smoothstreaming/gstmssfragmentparser.h + +diff --git a/ext/smoothstreaming/Makefile.am b/ext/smoothstreaming/Makefile.am +index 4faf9df9f..a5e1ad6ae 100644 +--- a/ext/smoothstreaming/Makefile.am ++++ b/ext/smoothstreaming/Makefile.am +@@ -13,8 +13,10 @@ libgstsmoothstreaming_la_LIBADD = \ + libgstsmoothstreaming_la_LDFLAGS = ${GST_PLUGIN_LDFLAGS} + libgstsmoothstreaming_la_SOURCES = gstsmoothstreaming-plugin.c \ + gstmssdemux.c \ ++ gstmssfragmentparser.c \ + gstmssmanifest.c + libgstsmoothstreaming_la_LIBTOOLFLAGS = --tag=disable-static + + noinst_HEADERS = gstmssdemux.h \ ++ gstmssfragmentparser.h \ + gstmssmanifest.h +diff --git a/ext/smoothstreaming/gstmssdemux.c b/ext/smoothstreaming/gstmssdemux.c +index 12fb40497..120d9c22b 100644 +--- a/ext/smoothstreaming/gstmssdemux.c ++++ b/ext/smoothstreaming/gstmssdemux.c +@@ -135,11 +135,18 @@ gst_mss_demux_stream_update_fragment_info (GstAdaptiveDemuxStream * stream); + static gboolean gst_mss_demux_seek (GstAdaptiveDemux * demux, GstEvent * seek); + static gint64 + gst_mss_demux_get_manifest_update_interval (GstAdaptiveDemux * demux); ++static gint64 ++gst_mss_demux_stream_get_fragment_waiting_time (GstAdaptiveDemuxStream * ++ stream); + static GstFlowReturn + gst_mss_demux_update_manifest_data (GstAdaptiveDemux * demux, + GstBuffer * buffer); + static gboolean gst_mss_demux_get_live_seek_range (GstAdaptiveDemux * demux, + gint64 * start, gint64 * stop); ++static GstFlowReturn gst_mss_demux_data_received (GstAdaptiveDemux * demux, ++ GstAdaptiveDemuxStream * stream, GstBuffer * buffer); ++static gboolean ++gst_mss_demux_requires_periodical_playlist_update (GstAdaptiveDemux * demux); + + static void + gst_mss_demux_class_init (GstMssDemuxClass * klass) +@@ -192,10 +199,15 @@ gst_mss_demux_class_init (GstMssDemuxClass * klass) + gst_mss_demux_stream_select_bitrate; + gstadaptivedemux_class->stream_update_fragment_info = + gst_mss_demux_stream_update_fragment_info; ++ gstadaptivedemux_class->stream_get_fragment_waiting_time = ++ gst_mss_demux_stream_get_fragment_waiting_time; + gstadaptivedemux_class->update_manifest_data = + gst_mss_demux_update_manifest_data; + gstadaptivedemux_class->get_live_seek_range = + gst_mss_demux_get_live_seek_range; ++ gstadaptivedemux_class->data_received = gst_mss_demux_data_received; ++ gstadaptivedemux_class->requires_periodical_playlist_update = ++ gst_mss_demux_requires_periodical_playlist_update; + + GST_DEBUG_CATEGORY_INIT (mssdemux_debug, "mssdemux", 0, "mssdemux plugin"); + } +@@ -650,6 +662,13 @@ gst_mss_demux_get_manifest_update_interval (GstAdaptiveDemux * demux) + return interval; + } + ++static gint64 ++gst_mss_demux_stream_get_fragment_waiting_time (GstAdaptiveDemuxStream * stream) ++{ ++ /* Wait a second for live streams so we don't try premature fragments downloading */ ++ return GST_SECOND; ++} ++ + static GstFlowReturn + gst_mss_demux_update_manifest_data (GstAdaptiveDemux * demux, + GstBuffer * buffer) +@@ -670,3 +689,44 @@ gst_mss_demux_get_live_seek_range (GstAdaptiveDemux * demux, gint64 * start, + + return gst_mss_manifest_get_live_seek_range (mssdemux->manifest, start, stop); + } ++ ++static GstFlowReturn ++gst_mss_demux_data_received (GstAdaptiveDemux * demux, ++ GstAdaptiveDemuxStream * stream, GstBuffer * buffer) ++{ ++ GstMssDemux *mssdemux = GST_MSS_DEMUX_CAST (demux); ++ GstMssDemuxStream *mssstream = (GstMssDemuxStream *) stream; ++ gsize available; ++ ++ if (!gst_mss_manifest_is_live (mssdemux->manifest)) { ++ return GST_ADAPTIVE_DEMUX_CLASS (parent_class)->data_received (demux, ++ stream, buffer); ++ } ++ ++ if (gst_mss_stream_fragment_parsing_needed (mssstream->manifest_stream)) { ++ gst_mss_manifest_live_adapter_push (mssstream->manifest_stream, buffer); ++ available = ++ gst_mss_manifest_live_adapter_available (mssstream->manifest_stream); ++ // FIXME: try to reduce this minimal size. ++ if (available < 4096) { ++ return GST_FLOW_OK; ++ } else { ++ GST_LOG_OBJECT (stream->pad, "enough data, parsing fragment."); ++ buffer = ++ gst_mss_manifest_live_adapter_take_buffer (mssstream->manifest_stream, ++ available); ++ gst_mss_stream_parse_fragment (mssstream->manifest_stream, buffer); ++ } ++ } ++ ++ return GST_ADAPTIVE_DEMUX_CLASS (parent_class)->data_received (demux, stream, ++ buffer); ++} ++ ++static gboolean ++gst_mss_demux_requires_periodical_playlist_update (GstAdaptiveDemux * demux) ++{ ++ GstMssDemux *mssdemux = GST_MSS_DEMUX_CAST (demux); ++ ++ return (!gst_mss_manifest_is_live (mssdemux->manifest)); ++} +diff --git a/ext/smoothstreaming/gstmssfragmentparser.c b/ext/smoothstreaming/gstmssfragmentparser.c +new file mode 100644 +index 000000000..b554d4f31 +--- /dev/null ++++ b/ext/smoothstreaming/gstmssfragmentparser.c +@@ -0,0 +1,266 @@ ++/* ++ * Microsoft Smooth-Streaming fragment parsing library ++ * ++ * gstmssfragmentparser.h ++ * ++ * Copyright (C) 2016 Igalia S.L ++ * Copyright (C) 2016 Metrological ++ * Author: Philippe Normand <philn@igalia.com> ++ * ++ * 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.1 of the License, or (at your option) any later version. ++ * ++ * This library is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ * Library General Public License for more details. ++ * ++ * You should have received a copy of the GNU Library General Public ++ * License along with this library (COPYING); if not, write to the ++ * Free Software Foundation, Inc., 59 Temple Place - Suite 330, ++ * Boston, MA 02111-1307, USA. ++ */ ++ ++#include "gstmssfragmentparser.h" ++#include <gst/base/gstbytereader.h> ++#include <string.h> ++ ++GST_DEBUG_CATEGORY_EXTERN (mssdemux_debug); ++#define GST_CAT_DEFAULT mssdemux_debug ++ ++void ++gst_mss_fragment_parser_init (GstMssFragmentParser * parser) ++{ ++ parser->status = GST_MSS_FRAGMENT_HEADER_PARSER_INIT; ++ parser->tfrf.entries_count = 0; ++} ++ ++void ++gst_mss_fragment_parser_clear (GstMssFragmentParser * parser) ++{ ++ parser->tfrf.entries_count = 0; ++ if (parser->tfrf.entries) { ++ g_free (parser->tfrf.entries); ++ parser->tfrf.entries = 0; ++ } ++} ++ ++static gboolean ++_parse_tfrf_box (GstMssFragmentParser * parser, GstByteReader * reader) ++{ ++ guint8 version; ++ guint32 flags = 0; ++ guint8 fragment_count = 0; ++ guint8 index = 0; ++ ++ if (!gst_byte_reader_get_uint8 (reader, &version)) { ++ GST_ERROR ("Error getting box's version field"); ++ return FALSE; ++ } ++ ++ if (!gst_byte_reader_get_uint24_be (reader, &flags)) { ++ GST_ERROR ("Error getting box's flags field"); ++ return FALSE; ++ } ++ ++ gst_byte_reader_get_uint8 (reader, &fragment_count); ++ parser->tfrf.entries_count = fragment_count; ++ parser->tfrf.entries = ++ g_malloc (sizeof (GstTfrfBoxEntry) * parser->tfrf.entries_count); ++ for (index = 0; index < fragment_count; index++) { ++ guint64 absolute_time = 0; ++ guint64 absolute_duration = 0; ++ if (version & 0x01) { ++ gst_byte_reader_get_uint64_be (reader, &absolute_time); ++ gst_byte_reader_get_uint64_be (reader, &absolute_duration); ++ } else { ++ guint32 time = 0; ++ guint32 duration = 0; ++ gst_byte_reader_get_uint32_be (reader, &time); ++ gst_byte_reader_get_uint32_be (reader, &duration); ++ time = ~time; ++ duration = ~duration; ++ absolute_time = ~time; ++ absolute_duration = ~duration; ++ } ++ parser->tfrf.entries[index].time = absolute_time; ++ parser->tfrf.entries[index].duration = absolute_duration; ++ } ++ ++ GST_LOG ("tfrf box parsed"); ++ return TRUE; ++} ++ ++static gboolean ++_parse_tfxd_box (GstMssFragmentParser * parser, GstByteReader * reader) ++{ ++ guint8 version; ++ guint32 flags = 0; ++ guint64 absolute_time = 0; ++ guint64 absolute_duration = 0; ++ ++ if (!gst_byte_reader_get_uint8 (reader, &version)) { ++ GST_ERROR ("Error getting box's version field"); ++ return FALSE; ++ } ++ ++ if (!gst_byte_reader_get_uint24_be (reader, &flags)) { ++ GST_ERROR ("Error getting box's flags field"); ++ return FALSE; ++ } ++ ++ if (version & 0x01) { ++ gst_byte_reader_get_uint64_be (reader, &absolute_time); ++ gst_byte_reader_get_uint64_be (reader, &absolute_duration); ++ } else { ++ guint32 time = 0; ++ guint32 duration = 0; ++ gst_byte_reader_get_uint32_be (reader, &time); ++ gst_byte_reader_get_uint32_be (reader, &duration); ++ time = ~time; ++ duration = ~duration; ++ absolute_time = ~time; ++ absolute_duration = ~duration; ++ } ++ ++ parser->tfxd.time = absolute_time; ++ parser->tfxd.duration = absolute_duration; ++ GST_LOG ("tfxd box parsed"); ++ return TRUE; ++} ++ ++gboolean ++gst_mss_fragment_parser_add_buffer (GstMssFragmentParser * parser, ++ GstBuffer * buffer) ++{ ++ GstByteReader reader; ++ GstMapInfo info; ++ guint32 size; ++ guint32 fourcc; ++ const guint8 *uuid; ++ gboolean error = FALSE; ++ gboolean mdat_box_found = FALSE; ++ ++ static const guint8 tfrf_uuid[] = { ++ 0xd4, 0x80, 0x7e, 0xf2, 0xca, 0x39, 0x46, 0x95, ++ 0x8e, 0x54, 0x26, 0xcb, 0x9e, 0x46, 0xa7, 0x9f ++ }; ++ ++ static const guint8 tfxd_uuid[] = { ++ 0x6d, 0x1d, 0x9b, 0x05, 0x42, 0xd5, 0x44, 0xe6, ++ 0x80, 0xe2, 0x14, 0x1d, 0xaf, 0xf7, 0x57, 0xb2 ++ }; ++ ++ static const guint8 piff_uuid[] = { ++ 0xa2, 0x39, 0x4f, 0x52, 0x5a, 0x9b, 0x4f, 0x14, ++ 0xa2, 0x44, 0x6c, 0x42, 0x7c, 0x64, 0x8d, 0xf4 ++ }; ++ ++ if (!gst_buffer_map (buffer, &info, GST_MAP_READ)) { ++ return FALSE; ++ } ++ ++ gst_byte_reader_init (&reader, info.data, info.size); ++ GST_TRACE ("Total buffer size: %u", gst_byte_reader_get_size (&reader)); ++ ++ size = gst_byte_reader_get_uint32_be_unchecked (&reader); ++ fourcc = gst_byte_reader_get_uint32_le_unchecked (&reader); ++ if (fourcc == GST_MSS_FRAGMENT_FOURCC_MOOF) { ++ GST_TRACE ("moof box found"); ++ size = gst_byte_reader_get_uint32_be_unchecked (&reader); ++ fourcc = gst_byte_reader_get_uint32_le_unchecked (&reader); ++ if (fourcc == GST_MSS_FRAGMENT_FOURCC_MFHD) { ++ gst_byte_reader_skip_unchecked (&reader, size - 8); ++ ++ size = gst_byte_reader_get_uint32_be_unchecked (&reader); ++ fourcc = gst_byte_reader_get_uint32_le_unchecked (&reader); ++ if (fourcc == GST_MSS_FRAGMENT_FOURCC_TRAF) { ++ size = gst_byte_reader_get_uint32_be_unchecked (&reader); ++ fourcc = gst_byte_reader_get_uint32_le_unchecked (&reader); ++ if (fourcc == GST_MSS_FRAGMENT_FOURCC_TFHD) { ++ gst_byte_reader_skip_unchecked (&reader, size - 8); ++ ++ size = gst_byte_reader_get_uint32_be_unchecked (&reader); ++ fourcc = gst_byte_reader_get_uint32_le_unchecked (&reader); ++ if (fourcc == GST_MSS_FRAGMENT_FOURCC_TRUN) { ++ GST_TRACE ("trun box found, size: %" G_GUINT32_FORMAT, size); ++ if (!gst_byte_reader_skip (&reader, size - 8)) { ++ GST_WARNING ("Failed to skip trun box, enough data?"); ++ error = TRUE; ++ goto beach; ++ } ++ } ++ } ++ } ++ } ++ } ++ ++ while (!mdat_box_found) { ++ GST_TRACE ("remaining data: %u", gst_byte_reader_get_remaining (&reader)); ++ if (!gst_byte_reader_get_uint32_be (&reader, &size)) { ++ GST_WARNING ("Failed to get box size, enough data?"); ++ error = TRUE; ++ break; ++ } ++ ++ GST_TRACE ("box size: %" G_GUINT32_FORMAT, size); ++ if (!gst_byte_reader_get_uint32_le (&reader, &fourcc)) { ++ GST_WARNING ("Failed to get fourcc, enough data?"); ++ error = TRUE; ++ break; ++ } ++ ++ if (fourcc == GST_MSS_FRAGMENT_FOURCC_MDAT) { ++ GST_LOG ("mdat box found"); ++ mdat_box_found = TRUE; ++ break; ++ } ++ ++ if (fourcc != GST_MSS_FRAGMENT_FOURCC_UUID) { ++ GST_ERROR ("invalid UUID fourcc: %" GST_FOURCC_FORMAT, ++ GST_FOURCC_ARGS (fourcc)); ++ error = TRUE; ++ break; ++ } ++ ++ if (!gst_byte_reader_peek_data (&reader, 16, &uuid)) { ++ GST_ERROR ("not enough data in UUID box"); ++ error = TRUE; ++ break; ++ } ++ ++ if (memcmp (uuid, piff_uuid, 16) == 0) { ++ gst_byte_reader_skip_unchecked (&reader, size - 8); ++ GST_LOG ("piff box detected"); ++ } ++ ++ if (memcmp (uuid, tfrf_uuid, 16) == 0) { ++ gst_byte_reader_get_data (&reader, 16, &uuid); ++ if (!_parse_tfrf_box (parser, &reader)) { ++ GST_ERROR ("txrf box parsing error"); ++ error = TRUE; ++ break; ++ } ++ } ++ ++ if (memcmp (uuid, tfxd_uuid, 16) == 0) { ++ gst_byte_reader_get_data (&reader, 16, &uuid); ++ if (!_parse_tfxd_box (parser, &reader)) { ++ GST_ERROR ("tfrf box parsing error"); ++ error = TRUE; ++ break; ++ } ++ } ++ } ++ ++beach: ++ ++ if (!error) ++ parser->status = GST_MSS_FRAGMENT_HEADER_PARSER_FINISHED; ++ ++ GST_LOG ("Fragment parsing successful: %s", error ? "no" : "yes"); ++ gst_buffer_unmap (buffer, &info); ++ return !error; ++} +diff --git a/ext/smoothstreaming/gstmssfragmentparser.h b/ext/smoothstreaming/gstmssfragmentparser.h +new file mode 100644 +index 000000000..cf4711865 +--- /dev/null ++++ b/ext/smoothstreaming/gstmssfragmentparser.h +@@ -0,0 +1,84 @@ ++/* ++ * Microsoft Smooth-Streaming fragment parsing library ++ * ++ * gstmssfragmentparser.h ++ * ++ * Copyright (C) 2016 Igalia S.L ++ * Copyright (C) 2016 Metrological ++ * Author: Philippe Normand <philn@igalia.com> ++ * ++ * 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.1 of the License, or (at your option) any later version. ++ * ++ * This library is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ * Library General Public License for more details. ++ * ++ * You should have received a copy of the GNU Library General Public ++ * License along with this library (COPYING); if not, write to the ++ * Free Software Foundation, Inc., 59 Temple Place - Suite 330, ++ * Boston, MA 02111-1307, USA. ++ */ ++ ++#ifndef __GST_MSS_FRAGMENT_PARSER_H__ ++#define __GST_MSS_FRAGMENT_PARSER_H__ ++ ++#include <gst/gst.h> ++ ++G_BEGIN_DECLS ++ ++#define GST_MSS_FRAGMENT_FOURCC_MOOF GST_MAKE_FOURCC('m','o','o','f') ++#define GST_MSS_FRAGMENT_FOURCC_MFHD GST_MAKE_FOURCC('m','f','h','d') ++#define GST_MSS_FRAGMENT_FOURCC_TRAF GST_MAKE_FOURCC('t','r','a','f') ++#define GST_MSS_FRAGMENT_FOURCC_TFHD GST_MAKE_FOURCC('t','f','h','d') ++#define GST_MSS_FRAGMENT_FOURCC_TRUN GST_MAKE_FOURCC('t','r','u','n') ++#define GST_MSS_FRAGMENT_FOURCC_UUID GST_MAKE_FOURCC('u','u','i','d') ++#define GST_MSS_FRAGMENT_FOURCC_MDAT GST_MAKE_FOURCC('m','d','a','t') ++ ++typedef struct _GstTfxdBox ++{ ++ guint8 version; ++ guint32 flags; ++ ++ guint64 time; ++ guint64 duration; ++} GstTfxdBox; ++ ++typedef struct _GstTfrfBoxEntry ++{ ++ guint64 time; ++ guint64 duration; ++} GstTfrfBoxEntry; ++ ++typedef struct _GstTfrfBox ++{ ++ guint8 version; ++ guint32 flags; ++ ++ gint entries_count; ++ GstTfrfBoxEntry *entries; ++} GstTfrfBox; ++ ++typedef enum _GstFragmentHeaderParserStatus ++{ ++ GST_MSS_FRAGMENT_HEADER_PARSER_INIT, ++ GST_MSS_FRAGMENT_HEADER_PARSER_FINISHED ++} GstFragmentHeaderParserStatus; ++ ++typedef struct _GstMssFragmentParser ++{ ++ GstFragmentHeaderParserStatus status; ++ GstTfxdBox tfxd; ++ GstTfrfBox tfrf; ++} GstMssFragmentParser; ++ ++void gst_mss_fragment_parser_init (GstMssFragmentParser * parser); ++void gst_mss_fragment_parser_clear (GstMssFragmentParser * parser); ++gboolean gst_mss_fragment_parser_add_buffer (GstMssFragmentParser * parser, GstBuffer * buf); ++ ++G_END_DECLS ++ ++#endif /* __GST_MSS_FRAGMENT_PARSER_H__ */ +diff --git a/ext/smoothstreaming/gstmssmanifest.c b/ext/smoothstreaming/gstmssmanifest.c +index 144bbb42d..e1031ba55 100644 +--- a/ext/smoothstreaming/gstmssmanifest.c ++++ b/ext/smoothstreaming/gstmssmanifest.c +@@ -1,5 +1,7 @@ + /* GStreamer + * Copyright (C) 2012 Smart TV Alliance ++ * Copyright (C) 2016 Igalia S.L ++ * Copyright (C) 2016 Metrological + * Author: Thiago Sousa Santos <thiago.sousa.santos@collabora.com>, Collabora Ltd. + * + * gstmssmanifest.c: +@@ -31,6 +33,7 @@ + #include <gst/codecparsers/gsth264parser.h> + + #include "gstmssmanifest.h" ++#include "gstmssfragmentparser.h" + + GST_DEBUG_CATEGORY_EXTERN (mssdemux_debug); + #define GST_CAT_DEFAULT mssdemux_debug +@@ -74,12 +77,17 @@ struct _GstMssStream + gboolean active; /* if the stream is currently being used */ + gint selectedQualityIndex; + ++ gboolean has_live_fragments; ++ GstAdapter *live_adapter; ++ + GList *fragments; + GList *qualities; + + gchar *url; + gchar *lang; + ++ GstMssFragmentParser fragment_parser; ++ + guint fragment_repetition_index; + GList *current_fragment; + GList *current_quality; +@@ -96,6 +104,7 @@ struct _GstMssManifest + + gboolean is_live; + gint64 dvr_window; ++ guint64 look_ahead_fragment_count; + + GString *protection_system_id; + gchar *protection_data; +@@ -235,7 +244,8 @@ compare_bitrate (GstMssStreamQuality * a, GstMssStreamQuality * b) + } + + static void +-_gst_mss_stream_init (GstMssStream * stream, xmlNodePtr node) ++_gst_mss_stream_init (GstMssManifest * manifest, GstMssStream * stream, ++ xmlNodePtr node) + { + xmlNodePtr iter; + GstMssFragmentListBuilder builder; +@@ -248,9 +258,21 @@ _gst_mss_stream_init (GstMssStream * stream, xmlNodePtr node) + stream->url = (gchar *) xmlGetProp (node, (xmlChar *) MSS_PROP_URL); + stream->lang = (gchar *) xmlGetProp (node, (xmlChar *) MSS_PROP_LANGUAGE); + ++ /* for live playback each fragment usually has timing ++ * information for the few next look-ahead fragments so the ++ * playlist can be built incrementally from the first fragment ++ * of the manifest. ++ */ ++ ++ GST_DEBUG ("Live stream: %s, look-ahead fragments: %" G_GUINT64_FORMAT, ++ manifest->is_live ? "yes" : "no", manifest->look_ahead_fragment_count); ++ stream->has_live_fragments = manifest->is_live ++ && manifest->look_ahead_fragment_count; ++ + for (iter = node->children; iter; iter = iter->next) { + if (node_has_type (iter, MSS_NODE_STREAM_FRAGMENT)) { +- gst_mss_fragment_list_builder_add (&builder, iter); ++ if (!stream->has_live_fragments || !builder.fragments) ++ gst_mss_fragment_list_builder_add (&builder, iter); + } else if (node_has_type (iter, MSS_NODE_STREAM_QUALITY)) { + GstMssStreamQuality *quality = gst_mss_stream_quality_new (iter); + stream->qualities = g_list_prepend (stream->qualities, quality); +@@ -259,17 +281,24 @@ _gst_mss_stream_init (GstMssStream * stream, xmlNodePtr node) + } + } + +- stream->fragments = g_list_reverse (builder.fragments); ++ if (stream->has_live_fragments) { ++ stream->live_adapter = gst_adapter_new (); ++ } ++ ++ if (builder.fragments) { ++ stream->fragments = g_list_reverse (builder.fragments); ++ stream->current_fragment = stream->fragments; ++ } + + /* order them from smaller to bigger based on bitrates */ + stream->qualities = + g_list_sort (stream->qualities, (GCompareFunc) compare_bitrate); +- +- stream->current_fragment = stream->fragments; + stream->current_quality = stream->qualities; + + stream->regex_bitrate = g_regex_new ("\\{[Bb]itrate\\}", 0, 0, NULL); + stream->regex_position = g_regex_new ("\\{start[ _]time\\}", 0, 0, NULL); ++ ++ gst_mss_fragment_parser_init (&stream->fragment_parser); + } + + +@@ -315,6 +344,7 @@ gst_mss_manifest_new (GstBuffer * data) + xmlNodePtr nodeiter; + gchar *live_str; + GstMapInfo mapinfo; ++ gchar *look_ahead_fragment_count_str; + + if (!gst_buffer_map (data, &mapinfo, GST_MAP_READ)) { + return NULL; +@@ -335,6 +365,7 @@ gst_mss_manifest_new (GstBuffer * data) + /* the entire file is always available for non-live streams */ + if (!manifest->is_live) { + manifest->dvr_window = 0; ++ manifest->look_ahead_fragment_count = 0; + } else { + /* if 0, or non-existent, the length is infinite */ + gchar *dvr_window_str = (gchar *) xmlGetProp (root, +@@ -346,6 +377,17 @@ gst_mss_manifest_new (GstBuffer * data) + manifest->dvr_window = 0; + } + } ++ ++ look_ahead_fragment_count_str = ++ (gchar *) xmlGetProp (root, (xmlChar *) "LookAheadFragmentCount"); ++ if (look_ahead_fragment_count_str) { ++ manifest->look_ahead_fragment_count = ++ g_ascii_strtoull (look_ahead_fragment_count_str, NULL, 10); ++ xmlFree (look_ahead_fragment_count_str); ++ if (manifest->look_ahead_fragment_count <= 0) { ++ manifest->look_ahead_fragment_count = 0; ++ } ++ } + } + + for (nodeiter = root->children; nodeiter; nodeiter = nodeiter->next) { +@@ -354,7 +396,7 @@ gst_mss_manifest_new (GstBuffer * data) + GstMssStream *stream = g_new0 (GstMssStream, 1); + + manifest->streams = g_slist_append (manifest->streams, stream); +- _gst_mss_stream_init (stream, nodeiter); ++ _gst_mss_stream_init (manifest, stream, nodeiter); + } + + if (nodeiter->type == XML_ELEMENT_NODE +@@ -371,6 +413,11 @@ gst_mss_manifest_new (GstBuffer * data) + static void + gst_mss_stream_free (GstMssStream * stream) + { ++ if (stream->live_adapter) { ++ gst_adapter_clear (stream->live_adapter); ++ g_object_unref (stream->live_adapter); ++ } ++ + g_list_free_full (stream->fragments, g_free); + g_list_free_full (stream->qualities, + (GDestroyNotify) gst_mss_stream_quality_free); +@@ -379,6 +426,7 @@ gst_mss_stream_free (GstMssStream * stream) + g_regex_unref (stream->regex_position); + g_regex_unref (stream->regex_bitrate); + g_free (stream); ++ gst_mss_fragment_parser_clear (&stream->fragment_parser); + } + + void +@@ -1079,6 +1127,9 @@ GstFlowReturn + gst_mss_stream_advance_fragment (GstMssStream * stream) + { + GstMssStreamFragment *fragment; ++ const gchar *stream_type_name = ++ gst_mss_stream_type_name (gst_mss_stream_get_type (stream)); ++ + g_return_val_if_fail (stream->active, GST_FLOW_ERROR); + + if (stream->current_fragment == NULL) +@@ -1086,14 +1137,20 @@ gst_mss_stream_advance_fragment (GstMssStream * stream) + + fragment = stream->current_fragment->data; + stream->fragment_repetition_index++; +- if (stream->fragment_repetition_index < fragment->repetitions) { +- return GST_FLOW_OK; +- } ++ if (stream->fragment_repetition_index < fragment->repetitions) ++ goto beach; + + stream->fragment_repetition_index = 0; + stream->current_fragment = g_list_next (stream->current_fragment); ++ ++ GST_DEBUG ("Advanced to fragment #%d on %s stream", fragment->number, ++ stream_type_name); + if (stream->current_fragment == NULL) + return GST_FLOW_EOS; ++ ++beach: ++ gst_mss_fragment_parser_clear (&stream->fragment_parser); ++ gst_mss_fragment_parser_init (&stream->fragment_parser); + return GST_FLOW_OK; + } + +@@ -1173,6 +1230,11 @@ gst_mss_stream_seek (GstMssStream * stream, gboolean forward, + GST_DEBUG ("Stream %s seeking to %" G_GUINT64_FORMAT, stream->url, time); + for (iter = stream->fragments; iter; iter = g_list_next (iter)) { + fragment = iter->data; ++ if (stream->has_live_fragments) { ++ if (fragment->time + fragment->repetitions * fragment->duration > time) ++ stream->current_fragment = iter; ++ break; ++ } + if (fragment->time + fragment->repetitions * fragment->duration > time) { + stream->current_fragment = iter; + stream->fragment_repetition_index = +@@ -1256,9 +1318,14 @@ static void + gst_mss_stream_reload_fragments (GstMssStream * stream, xmlNodePtr streamIndex) + { + xmlNodePtr iter; +- guint64 current_gst_time = gst_mss_stream_get_fragment_gst_timestamp (stream); ++ guint64 current_gst_time; + GstMssFragmentListBuilder builder; + ++ if (stream->has_live_fragments) ++ return; ++ ++ current_gst_time = gst_mss_stream_get_fragment_gst_timestamp (stream); ++ + gst_mss_fragment_list_builder_init (&builder); + + GST_DEBUG ("Current position: %" GST_TIME_FORMAT, +@@ -1514,3 +1581,74 @@ gst_mss_manifest_get_live_seek_range (GstMssManifest * manifest, gint64 * start, + + return ret; + } ++ ++void ++gst_mss_manifest_live_adapter_push (GstMssStream * stream, GstBuffer * buffer) ++{ ++ gst_adapter_push (stream->live_adapter, buffer); ++} ++ ++gsize ++gst_mss_manifest_live_adapter_available (GstMssStream * stream) ++{ ++ return gst_adapter_available (stream->live_adapter); ++} ++ ++GstBuffer * ++gst_mss_manifest_live_adapter_take_buffer (GstMssStream * stream, gsize nbytes) ++{ ++ return gst_adapter_take_buffer (stream->live_adapter, nbytes); ++} ++ ++gboolean ++gst_mss_stream_fragment_parsing_needed (GstMssStream * stream) ++{ ++ return stream->fragment_parser.status == GST_MSS_FRAGMENT_HEADER_PARSER_INIT; ++} ++ ++void ++gst_mss_stream_parse_fragment (GstMssStream * stream, GstBuffer * buffer) ++{ ++ GstMssStreamFragment *current_fragment = NULL; ++ const gchar *stream_type_name; ++ guint8 index; ++ ++ if (!stream->has_live_fragments) ++ return; ++ ++ if (!gst_mss_fragment_parser_add_buffer (&stream->fragment_parser, buffer)) ++ return; ++ ++ current_fragment = stream->current_fragment->data; ++ current_fragment->time = stream->fragment_parser.tfxd.time; ++ current_fragment->duration = stream->fragment_parser.tfxd.duration; ++ ++ stream_type_name = ++ gst_mss_stream_type_name (gst_mss_stream_get_type (stream)); ++ ++ for (index = 0; index < stream->fragment_parser.tfrf.entries_count; index++) { ++ GList *l = g_list_last (stream->fragments); ++ GstMssStreamFragment *last; ++ GstMssStreamFragment *fragment; ++ ++ if (l == NULL) ++ break; ++ ++ last = (GstMssStreamFragment *) l->data; ++ ++ if (last->time == stream->fragment_parser.tfrf.entries[index].time) ++ continue; ++ ++ fragment = g_new (GstMssStreamFragment, 1); ++ fragment->number = last->number + 1; ++ fragment->repetitions = 1; ++ fragment->time = stream->fragment_parser.tfrf.entries[index].time; ++ fragment->duration = stream->fragment_parser.tfrf.entries[index].duration; ++ ++ stream->fragments = g_list_append (stream->fragments, fragment); ++ GST_LOG ("Adding fragment number: %u to %s stream, time: %" G_GUINT64_FORMAT ++ ", duration: %" G_GUINT64_FORMAT ", repetitions: %u", ++ fragment->number, stream_type_name, ++ fragment->time, fragment->duration, fragment->repetitions); ++ } ++} +diff --git a/ext/smoothstreaming/gstmssmanifest.h b/ext/smoothstreaming/gstmssmanifest.h +index 6b7b1f971..03b066ae5 100644 +--- a/ext/smoothstreaming/gstmssmanifest.h ++++ b/ext/smoothstreaming/gstmssmanifest.h +@@ -26,6 +26,7 @@ + #include <glib.h> + #include <gio/gio.h> + #include <gst/gst.h> ++#include <gst/base/gstadapter.h> + + G_BEGIN_DECLS + +@@ -73,5 +74,11 @@ const gchar * gst_mss_stream_get_lang (GstMssStream * stream); + + const gchar * gst_mss_stream_type_name (GstMssStreamType streamtype); + ++void gst_mss_manifest_live_adapter_push(GstMssStream * stream, GstBuffer * buffer); ++gsize gst_mss_manifest_live_adapter_available(GstMssStream * stream); ++GstBuffer * gst_mss_manifest_live_adapter_take_buffer(GstMssStream * stream, gsize nbytes); ++gboolean gst_mss_stream_fragment_parsing_needed(GstMssStream * stream); ++void gst_mss_stream_parse_fragment(GstMssStream * stream, GstBuffer * buffer); ++ + G_END_DECLS + #endif /* __GST_MSS_MANIFEST_H__ */ +diff --git a/gst-libs/gst/adaptivedemux/gstadaptivedemux.c b/gst-libs/gst/adaptivedemux/gstadaptivedemux.c +index 634e4f388..ddca726b6 100644 +--- a/gst-libs/gst/adaptivedemux/gstadaptivedemux.c ++++ b/gst-libs/gst/adaptivedemux/gstadaptivedemux.c +@@ -291,6 +291,9 @@ gst_adaptive_demux_wait_until (GstClock * clock, GCond * cond, GMutex * mutex, + GstClockTime end_time); + static gboolean gst_adaptive_demux_clock_callback (GstClock * clock, + GstClockTime time, GstClockID id, gpointer user_data); ++static gboolean ++gst_adaptive_demux_requires_periodical_playlist_update_default (GstAdaptiveDemux ++ * demux); + + /* we can't use G_DEFINE_ABSTRACT_TYPE because we need the klass in the _init + * method to get to the padtemplates */ +@@ -412,6 +415,9 @@ gst_adaptive_demux_class_init (GstAdaptiveDemuxClass * klass) + klass->data_received = gst_adaptive_demux_stream_data_received_default; + klass->finish_fragment = gst_adaptive_demux_stream_finish_fragment_default; + klass->update_manifest = gst_adaptive_demux_update_manifest_default; ++ klass->requires_periodical_playlist_update = ++ gst_adaptive_demux_requires_periodical_playlist_update_default; ++ + } + + static void +@@ -686,7 +692,9 @@ gst_adaptive_demux_sink_event (GstPad * pad, GstObject * parent, + demux->priv->stop_updates_task = FALSE; + g_mutex_unlock (&demux->priv->updates_timed_lock); + /* Task to periodically update the manifest */ +- gst_task_start (demux->priv->updates_task); ++ if (demux_class->requires_periodical_playlist_update (demux)) { ++ gst_task_start (demux->priv->updates_task); ++ } + } + } else { + /* no streams */ +@@ -2125,6 +2133,13 @@ gst_adaptive_demux_stream_data_received_default (GstAdaptiveDemux * demux, + return gst_adaptive_demux_stream_push_buffer (stream, buffer); + } + ++static gboolean ++gst_adaptive_demux_requires_periodical_playlist_update_default (GstAdaptiveDemux ++ * demux) ++{ ++ return TRUE; ++} ++ + static GstFlowReturn + _src_chain (GstPad * pad, GstObject * parent, GstBuffer * buffer) + { +@@ -3338,7 +3353,15 @@ gst_adaptive_demux_stream_download_loop (GstAdaptiveDemuxStream * stream) + GST_DEBUG_OBJECT (stream->pad, "EOS, checking to stop download loop"); + /* we push the EOS after releasing the object lock */ + if (gst_adaptive_demux_is_live (demux)) { +- if (gst_adaptive_demux_stream_wait_manifest_update (demux, stream)) { ++ GstAdaptiveDemuxClass *demux_class = ++ GST_ADAPTIVE_DEMUX_GET_CLASS (demux); ++ ++ /* this might be a fragment download error, refresh the manifest, just in case */ ++ if (!demux_class->requires_periodical_playlist_update (demux)) { ++ ret = gst_adaptive_demux_update_manifest (demux); ++ break; ++ } else if (gst_adaptive_demux_stream_wait_manifest_update (demux, ++ stream)) { + goto end; + } + gst_task_stop (stream->download_task); +diff --git a/gst-libs/gst/adaptivedemux/gstadaptivedemux.h b/gst-libs/gst/adaptivedemux/gstadaptivedemux.h +index 780f4d93f..9a1a1b7d1 100644 +--- a/gst-libs/gst/adaptivedemux/gstadaptivedemux.h ++++ b/gst-libs/gst/adaptivedemux/gstadaptivedemux.h +@@ -459,6 +459,20 @@ struct _GstAdaptiveDemuxClass + * selected period. + */ + GstClockTime (*get_period_start_time) (GstAdaptiveDemux *demux); ++ ++ /** ++ * requires_periodical_playlist_update: ++ * @demux: #GstAdaptiveDemux ++ * ++ * Some adaptive streaming protocols allow the client to download ++ * the playlist once and build up the fragment list based on the ++ * current fragment metadata. For those protocols the demuxer ++ * doesn't need to periodically refresh the playlist. This vfunc ++ * is relevant only for live playback scenarios. ++ * ++ * Return: %TRUE if the playlist needs to be refreshed periodically by the demuxer. ++ */ ++ gboolean (*requires_periodical_playlist_update) (GstAdaptiveDemux * demux); + }; + + GType gst_adaptive_demux_get_type (void); +-- +2.11.0 + diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0001-smoothstreaming-implement-adaptivedemux-s-get_live_s.patch b/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0001-smoothstreaming-implement-adaptivedemux-s-get_live_s.patch new file mode 100644 index 0000000000..76d29e151b --- /dev/null +++ b/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0001-smoothstreaming-implement-adaptivedemux-s-get_live_s.patch @@ -0,0 +1,183 @@ +From e9178fa082116d4bf733b184a8b6951112c17900 Mon Sep 17 00:00:00 2001 +From: Matthew Waters <matthew@centricular.com> +Date: Thu, 10 Nov 2016 17:18:36 +1100 +Subject: [PATCH] smoothstreaming: implement adaptivedemux's + get_live_seek_range() + +Allows seeking through the available fragments that are still available +on the server as specified by the DVRWindowLength attribute in the +manifest. + +https://bugzilla.gnome.org/show_bug.cgi?id=774178 +--- +Upstream-Status: Backport +Signed-off-by: Khem Raj <raj.khem@gmail.com> + + ext/smoothstreaming/gstmssdemux.c | 13 ++++++ + ext/smoothstreaming/gstmssmanifest.c | 84 ++++++++++++++++++++++++++++++++++++ + ext/smoothstreaming/gstmssmanifest.h | 1 + + 3 files changed, 98 insertions(+) + +diff --git a/ext/smoothstreaming/gstmssdemux.c b/ext/smoothstreaming/gstmssdemux.c +index 9d0aece2b..b66e19514 100644 +--- a/ext/smoothstreaming/gstmssdemux.c ++++ b/ext/smoothstreaming/gstmssdemux.c +@@ -138,6 +138,8 @@ gst_mss_demux_get_manifest_update_interval (GstAdaptiveDemux * demux); + static GstFlowReturn + gst_mss_demux_update_manifest_data (GstAdaptiveDemux * demux, + GstBuffer * buffer); ++static gboolean gst_mss_demux_get_live_seek_range (GstAdaptiveDemux * demux, ++ gint64 * start, gint64 * stop); + + static void + gst_mss_demux_class_init (GstMssDemuxClass * klass) +@@ -192,6 +194,8 @@ gst_mss_demux_class_init (GstMssDemuxClass * klass) + gst_mss_demux_stream_update_fragment_info; + gstadaptivedemux_class->update_manifest_data = + gst_mss_demux_update_manifest_data; ++ gstadaptivedemux_class->get_live_seek_range = ++ gst_mss_demux_get_live_seek_range; + + GST_DEBUG_CATEGORY_INIT (mssdemux_debug, "mssdemux", 0, "mssdemux plugin"); + } +@@ -659,3 +663,12 @@ gst_mss_demux_update_manifest_data (GstAdaptiveDemux * demux, + gst_mss_manifest_reload_fragments (mssdemux->manifest, buffer); + return GST_FLOW_OK; + } ++ ++static gboolean ++gst_mss_demux_get_live_seek_range (GstAdaptiveDemux * demux, gint64 * start, ++ gint64 * stop) ++{ ++ GstMssDemux *mssdemux = GST_MSS_DEMUX_CAST (demux); ++ ++ return gst_mss_manifest_get_live_seek_range (mssdemux->manifest, start, stop); ++} +diff --git a/ext/smoothstreaming/gstmssmanifest.c b/ext/smoothstreaming/gstmssmanifest.c +index 1b72e8de1..317b3cef9 100644 +--- a/ext/smoothstreaming/gstmssmanifest.c ++++ b/ext/smoothstreaming/gstmssmanifest.c +@@ -42,6 +42,7 @@ GST_DEBUG_CATEGORY_EXTERN (mssdemux_debug); + + #define MSS_PROP_BITRATE "Bitrate" + #define MSS_PROP_DURATION "d" ++#define MSS_PROP_DVR_WINDOW_LENGTH "DVRWindowLength" + #define MSS_PROP_LANGUAGE "Language" + #define MSS_PROP_NUMBER "n" + #define MSS_PROP_REPETITIONS "r" +@@ -94,6 +95,7 @@ struct _GstMssManifest + xmlNodePtr xmlrootnode; + + gboolean is_live; ++ gint64 dvr_window; + + GString *protection_system_id; + gchar *protection_data; +@@ -330,6 +332,22 @@ gst_mss_manifest_new (GstBuffer * data) + xmlFree (live_str); + } + ++ /* the entire file is always available for non-live streams */ ++ if (!manifest->is_live) { ++ manifest->dvr_window = 0; ++ } else { ++ /* if 0, or non-existent, the length is infinite */ ++ gchar *dvr_window_str = (gchar *) xmlGetProp (root, ++ (xmlChar *) MSS_PROP_DVR_WINDOW_LENGTH); ++ if (dvr_window_str) { ++ manifest->dvr_window = g_ascii_strtoull (dvr_window_str, NULL, 10); ++ xmlFree (dvr_window_str); ++ if (manifest->dvr_window <= 0) { ++ manifest->dvr_window = 0; ++ } ++ } ++ } ++ + for (nodeiter = root->children; nodeiter; nodeiter = nodeiter->next) { + if (nodeiter->type == XML_ELEMENT_NODE + && (strcmp ((const char *) nodeiter->name, "StreamIndex") == 0)) { +@@ -1406,3 +1424,69 @@ gst_mss_stream_get_lang (GstMssStream * stream) + { + return stream->lang; + } ++ ++static GstClockTime ++gst_mss_manifest_get_dvr_window_length_clock_time (GstMssManifest * manifest) ++{ ++ gint64 timescale; ++ ++ /* the entire file is always available for non-live streams */ ++ if (manifest->dvr_window == 0) ++ return GST_CLOCK_TIME_NONE; ++ ++ timescale = gst_mss_manifest_get_timescale (manifest); ++ return (GstClockTime) gst_util_uint64_scale_round (manifest->dvr_window, ++ GST_SECOND, timescale); ++} ++ ++static gboolean ++gst_mss_stream_get_live_seek_range (GstMssStream * stream, gint64 * start, ++ gint64 * stop) ++{ ++ GList *l; ++ GstMssStreamFragment *fragment; ++ guint64 timescale = gst_mss_stream_get_timescale (stream); ++ ++ g_return_val_if_fail (stream->active, FALSE); ++ ++ /* XXX: assumes all the data in the stream is still available */ ++ l = g_list_first (stream->fragments); ++ fragment = (GstMssStreamFragment *) l->data; ++ *start = gst_util_uint64_scale_round (fragment->time, GST_SECOND, timescale); ++ ++ l = g_list_last (stream->fragments); ++ fragment = (GstMssStreamFragment *) l->data; ++ *stop = gst_util_uint64_scale_round (fragment->time + fragment->duration * ++ fragment->repetitions, GST_SECOND, timescale); ++ ++ return TRUE; ++} ++ ++gboolean ++gst_mss_manifest_get_live_seek_range (GstMssManifest * manifest, gint64 * start, ++ gint64 * stop) ++{ ++ GSList *iter; ++ gboolean ret = FALSE; ++ ++ for (iter = manifest->streams; iter; iter = g_slist_next (iter)) { ++ GstMssStream *stream = iter->data; ++ ++ if (stream->active) { ++ /* FIXME: bound this correctly for multiple streams */ ++ if (!(ret = gst_mss_stream_get_live_seek_range (stream, start, stop))) ++ break; ++ } ++ } ++ ++ if (ret && gst_mss_manifest_is_live (manifest)) { ++ GstClockTime dvr_window = ++ gst_mss_manifest_get_dvr_window_length_clock_time (manifest); ++ ++ if (GST_CLOCK_TIME_IS_VALID (dvr_window) && *stop - *start > dvr_window) { ++ *start = *stop - dvr_window; ++ } ++ } ++ ++ return ret; ++} +diff --git a/ext/smoothstreaming/gstmssmanifest.h b/ext/smoothstreaming/gstmssmanifest.h +index af7419c23..6b7b1f971 100644 +--- a/ext/smoothstreaming/gstmssmanifest.h ++++ b/ext/smoothstreaming/gstmssmanifest.h +@@ -54,6 +54,7 @@ void gst_mss_manifest_reload_fragments (GstMssManifest * manifest, GstBuffer * d + GstClockTime gst_mss_manifest_get_min_fragment_duration (GstMssManifest * manifest); + const gchar * gst_mss_manifest_get_protection_system_id (GstMssManifest * manifest); + const gchar * gst_mss_manifest_get_protection_data (GstMssManifest * manifest); ++gboolean gst_mss_manifest_get_live_seek_range (GstMssManifest * manifest, gint64 * start, gint64 * stop); + + GstMssStreamType gst_mss_stream_get_type (GstMssStream *stream); + GstCaps * gst_mss_stream_get_caps (GstMssStream * stream); +-- +2.11.0 + diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0001-smoothstreaming-use-the-duration-from-the-list-of-fr.patch b/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0001-smoothstreaming-use-the-duration-from-the-list-of-fr.patch new file mode 100644 index 0000000000..4e51040863 --- /dev/null +++ b/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0001-smoothstreaming-use-the-duration-from-the-list-of-fr.patch @@ -0,0 +1,62 @@ +From 0fbee8f37427b88339194b22ba9aa210772a8613 Mon Sep 17 00:00:00 2001 +From: Matthew Waters <matthew@centricular.com> +Date: Thu, 10 Nov 2016 17:20:27 +1100 +Subject: [PATCH] smoothstreaming: use the duration from the list of fragments + if not present in the manifest + +Provides a more accurate duration for live streams that may be minutes +or hours in front of the earliest fragment. + +https://bugzilla.gnome.org/show_bug.cgi?id=774178 +--- +Upstream-Status: Backport +Signed-off-by: Khem Raj <raj.khem@gmail.com> + + ext/smoothstreaming/gstmssmanifest.c | 24 ++++++++++++++++++++++++ + 1 file changed, 24 insertions(+) + +diff --git a/ext/smoothstreaming/gstmssmanifest.c b/ext/smoothstreaming/gstmssmanifest.c +index 317b3cef9..144bbb42d 100644 +--- a/ext/smoothstreaming/gstmssmanifest.c ++++ b/ext/smoothstreaming/gstmssmanifest.c +@@ -888,6 +888,7 @@ gst_mss_manifest_get_duration (GstMssManifest * manifest) + gchar *duration; + guint64 dur = -1; + ++ /* try the property */ + duration = + (gchar *) xmlGetProp (manifest->xmlrootnode, + (xmlChar *) MSS_PROP_STREAM_DURATION); +@@ -895,6 +896,29 @@ gst_mss_manifest_get_duration (GstMssManifest * manifest) + dur = g_ascii_strtoull (duration, NULL, 10); + xmlFree (duration); + } ++ /* else use the fragment list */ ++ if (dur <= 0) { ++ guint64 max_dur = 0; ++ GSList *iter; ++ ++ for (iter = manifest->streams; iter; iter = g_slist_next (iter)) { ++ GstMssStream *stream = iter->data; ++ ++ if (stream->active) { ++ if (stream->fragments) { ++ GList *l = g_list_last (stream->fragments); ++ GstMssStreamFragment *fragment = (GstMssStreamFragment *) l->data; ++ guint64 frag_dur = ++ fragment->time + fragment->duration * fragment->repetitions; ++ max_dur = MAX (frag_dur, max_dur); ++ } ++ } ++ } ++ ++ if (max_dur != 0) ++ dur = max_dur; ++ } ++ + return dur; + } + +-- +2.11.0 + diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0002-glplugin-enable-gldeinterlace-on-OpenGL-ES.patch b/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0002-glplugin-enable-gldeinterlace-on-OpenGL-ES.patch deleted file mode 100755 index 51f4eb4b39..0000000000 --- a/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0002-glplugin-enable-gldeinterlace-on-OpenGL-ES.patch +++ /dev/null @@ -1,634 +0,0 @@ -From 8a0e97f7e672301cc76e394855e8c7a3448b0249 Mon Sep 17 00:00:00 2001 -From: Haihua Hu <jared.hu@nxp.com> -Date: Fri, 8 Apr 2016 16:47:15 +0800 -Subject: [PATCH 4/6] [glplugin] enable gldeinterlace on OpenGL ES -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -1.Porting the exist deinterlace shader and OpenGL callback - to be compatible with OpenGL ES. -2.Add a our blur vertical shader to gldeinterlace. -3.Add a property named “method” to let user choose which - deinterlace function to use. Default to choose blur vertical - method for better performance. - -Upstream-Status: Backport [1.9.1] - -https://bugzilla.gnome.org/show_bug.cgi?id=764873 - -Signed-off-by: Haihua Hu <jared.hu@nxp.com> ---- - ext/gl/Makefile.am | 4 +- - ext/gl/gstgldeinterlace.c | 344 +++++++++++++++++++++++++++++++++++----------- - ext/gl/gstgldeinterlace.h | 6 +- - ext/gl/gstopengl.c | 13 +- - 4 files changed, 275 insertions(+), 92 deletions(-) - -diff --git a/ext/gl/Makefile.am b/ext/gl/Makefile.am -index 5d55f54..46419a7 100644 ---- a/ext/gl/Makefile.am -+++ b/ext/gl/Makefile.am -@@ -40,6 +40,7 @@ libgstopengl_la_SOURCES = \ - gstglfilterapp.c \ - gstglviewconvert.c \ - gstglstereosplit.c \ -+ gstgldeinterlace.c \ - gstglstereomix.c - - noinst_HEADERS = \ -@@ -63,20 +64,19 @@ noinst_HEADERS = \ - gstglfilterapp.h \ - gstglstereosplit.h \ - gstglstereomix.h \ -+ gstgldeinterlace.h \ - gstglviewconvert.h - - # full opengl required - if USE_OPENGL - libgstopengl_la_SOURCES += \ - gstglfilterglass.c \ -- gstgldeinterlace.c \ - gltestsrc.c \ - gstgltestsrc.c \ - gstglmosaic.c - - noinst_HEADERS += \ - gstglfilterglass.h \ -- gstgldeinterlace.h \ - gltestsrc.h \ - gstgltestsrc.h \ - gstglmosaic.h \ -diff --git a/ext/gl/gstgldeinterlace.c b/ext/gl/gstgldeinterlace.c -index bd0eff0..c1250dc 100644 ---- a/ext/gl/gstgldeinterlace.c -+++ b/ext/gl/gstgldeinterlace.c -@@ -43,7 +43,8 @@ GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT); - - enum - { -- PROP_0 -+ PROP_0, -+ PROP_METHOD - }; - - #define DEBUG_INIT \ -@@ -57,17 +58,23 @@ static void gst_gl_deinterlace_set_property (GObject * object, - static void gst_gl_deinterlace_get_property (GObject * object, - guint prop_id, GValue * value, GParamSpec * pspec); - -+static gboolean gst_gl_deinterlace_start (GstBaseTransform * trans); - static gboolean gst_gl_deinterlace_reset (GstBaseTransform * trans); --static gboolean gst_gl_deinterlace_init_shader (GstGLFilter * filter); -+static gboolean gst_gl_deinterlace_init_fbo (GstGLFilter * filter); - static gboolean gst_gl_deinterlace_filter (GstGLFilter * filter, - GstBuffer * inbuf, GstBuffer * outbuf); - static gboolean gst_gl_deinterlace_filter_texture (GstGLFilter * filter, - guint in_tex, guint out_tex); --static void gst_gl_deinterlace_callback (gint width, gint height, -+static void gst_gl_deinterlace_vfir_callback (gint width, gint height, -+ guint texture, gpointer stuff); -+static void gst_gl_deinterlace_greedyh_callback (gint width, gint height, - guint texture, gpointer stuff); - - /* *INDENT-OFF* */ - static const gchar *greedyh_fragment_source = -+ "#ifdef GL_ES\n" -+ "precision mediump float;\n" -+ "#endif\n" - "uniform sampler2D tex;\n" - "uniform sampler2D tex_prev;\n" - "uniform float max_comb;\n" -@@ -75,35 +82,35 @@ static const gchar *greedyh_fragment_source = - "uniform float motion_sense;\n" - "uniform float width;\n" - "uniform float height;\n" -+ "varying vec2 v_texcoord;\n" - - "void main () {\n" -- " vec2 texcoord = gl_TexCoord[0].xy;\n" -- " if (int(mod(texcoord.y * height, 2.0)) == 0) {\n" -- " gl_FragColor = vec4(texture2D(tex_prev, texcoord).rgb, 1.0);\n" -+ " if (int(mod(v_texcoord.y * height, 2.0)) == 0) {\n" -+ " gl_FragColor = vec4(texture2D(tex_prev, v_texcoord).rgb, 1.0);\n" - " } else {\n" - " vec2 texcoord_L1_a1, texcoord_L3_a1, texcoord_L1, texcoord_L3, texcoord_L1_1, texcoord_L3_1;\n" - " vec3 L1_a1, L3_a1, L1, L3, L1_1, L3_1;\n" - -- " texcoord_L1 = vec2(texcoord.x, texcoord.y - 1.0 / height);\n" -- " texcoord_L3 = vec2(texcoord.x, texcoord.y + 1.0 / height);\n" -+ " texcoord_L1 = vec2(v_texcoord.x, v_texcoord.y - 1.0 / height);\n" -+ " texcoord_L3 = vec2(v_texcoord.x, v_texcoord.y + 1.0 / height);\n" - " L1 = texture2D(tex_prev, texcoord_L1).rgb;\n" - " L3 = texture2D(tex_prev, texcoord_L3).rgb;\n" -- " if (texcoord.x == 1.0 && texcoord.y == 1.0) {\n" -+ " if (v_texcoord.x == 1.0 && v_texcoord.y == 1.0) {\n" - " L1_1 = L1;\n" - " L3_1 = L3;\n" - " } else {\n" -- " texcoord_L1_1 = vec2(texcoord.x + 1.0 / width, texcoord.y - 1.0 / height);\n" -- " texcoord_L3_1 = vec2(texcoord.x + 1.0 / width, texcoord.y + 1.0 / height);\n" -+ " texcoord_L1_1 = vec2(v_texcoord.x + 1.0 / width, v_texcoord.y - 1.0 / height);\n" -+ " texcoord_L3_1 = vec2(v_texcoord.x + 1.0 / width, v_texcoord.y + 1.0 / height);\n" - " L1_1 = texture2D(tex_prev, texcoord_L1_1).rgb;\n" - " L3_1 = texture2D(tex_prev, texcoord_L3_1).rgb;\n" - " }\n" - -- " if (int(ceil(texcoord.x + texcoord.y)) == 0) {\n" -+ " if (int(ceil(v_texcoord.x + v_texcoord.y)) == 0) {\n" - " L1_a1 = L1;\n" - " L3_a1 = L3;\n" - " } else {\n" -- " texcoord_L1_a1 = vec2(texcoord.x - 1.0 / width, texcoord.y - 1.0 / height);\n" -- " texcoord_L3_a1 = vec2(texcoord.x - 1.0 / width, texcoord.y + 1.0 / height);\n" -+ " texcoord_L1_a1 = vec2(v_texcoord.x - 1.0 / width, v_texcoord.y - 1.0 / height);\n" -+ " texcoord_L3_a1 = vec2(v_texcoord.x - 1.0 / width, v_texcoord.y + 1.0 / height);\n" - " L1_a1 = texture2D(tex_prev, texcoord_L1_a1).rgb;\n" - " L3_a1 = texture2D(tex_prev, texcoord_L3_a1).rgb;\n" - " }\n" -@@ -113,8 +120,8 @@ static const gchar *greedyh_fragment_source = - " vec3 avg_1 = (L1_1 + L3_1) / 2.0;\n" - " vec3 avg_s = (avg_a1 + avg_1) / 2.0;\n" - " vec3 avg_sc = (avg_s + avg) / 2.0;\n" -- " vec3 L2 = texture2D(tex, texcoord).rgb;\n" -- " vec3 LP2 = texture2D(tex_prev, texcoord).rgb;\n" -+ " vec3 L2 = texture2D(tex, v_texcoord).rgb;\n" -+ " vec3 LP2 = texture2D(tex_prev, v_texcoord).rgb;\n" - " vec3 best;\n" - " if (abs(L2.r - avg_sc.r) < abs(LP2.r - avg_sc.r)) {\n" - " best.r = L2.r;\n" " } else {\n" -@@ -144,8 +151,87 @@ static const gchar *greedyh_fragment_source = - " gl_FragColor = vec4(last, 1.0);\n" - " }\n" - "}\n"; -+ -+const gchar *vfir_fragment_source = -+ "#ifdef GL_ES\n" -+ "precision mediump float;\n" -+ "#endif\n" -+ "uniform sampler2D tex;\n" -+ "uniform float width;\n" -+ "uniform float height;\n" -+ "varying vec2 v_texcoord;\n" -+ "void main()\n" -+ "{\n" -+ " vec2 topcoord, botcoord;\n" -+ " vec4 cur_color, top_color, bot_color;\n" -+ " topcoord.x = v_texcoord.x;\n" -+ " botcoord.x = v_texcoord.x;\n" -+ " if (v_texcoord.y == 0.0 || v_texcoord.y == 1.0) {\n" -+ " topcoord.y = v_texcoord.y ;\n" -+ " botcoord.y = v_texcoord.y ;\n" -+ " }\n" -+ " else {\n" -+ " topcoord.y = v_texcoord.y - 1.0/height;\n" -+ " botcoord.y = v_texcoord.y + 1.0/height;\n" -+ " }\n" -+ " cur_color = texture2D(tex, v_texcoord);\n" -+ " top_color = texture2D(tex, topcoord);\n" -+ " bot_color = texture2D(tex, botcoord);\n" -+ " gl_FragColor = 0.5*cur_color + 0.25*top_color + 0.25*bot_color;\n" -+ "}"; - /* *INDENT-ON* */ - -+/* dont' forget to edit the following when a new method is added */ -+typedef enum -+{ -+ GST_GL_DEINTERLACE_VFIR, -+ GST_GL_DEINTERLACE_GREEDYH -+} GstGLDeinterlaceMethod; -+ -+static const GEnumValue * -+gst_gl_deinterlace_get_methods (void) -+{ -+ static const GEnumValue method_types[] = { -+ {GST_GL_DEINTERLACE_VFIR, "Blur Vertical", "vfir"}, -+ {GST_GL_DEINTERLACE_GREEDYH, "Motion Adaptive: Advanced Detection", -+ "greedhy"}, -+ {0, NULL, NULL} -+ }; -+ return method_types; -+} -+ -+#define GST_TYPE_GL_DEINTERLACE_METHODS (gst_gl_deinterlace_method_get_type ()) -+static GType -+gst_gl_deinterlace_method_get_type (void) -+{ -+ static GType gl_deinterlace_method_type = 0; -+ if (!gl_deinterlace_method_type) { -+ gl_deinterlace_method_type = -+ g_enum_register_static ("GstGLDeinterlaceMethod", -+ gst_gl_deinterlace_get_methods ()); -+ } -+ return gl_deinterlace_method_type; -+} -+ -+static void -+gst_gl_deinterlace_set_method (GstGLDeinterlace * deinterlace, -+ guint method_types) -+{ -+ switch (method_types) { -+ case GST_GL_DEINTERLACE_VFIR: -+ deinterlace->deinterlacefunc = gst_gl_deinterlace_vfir_callback; -+ deinterlace->current_method = method_types; -+ break; -+ case GST_GL_DEINTERLACE_GREEDYH: -+ deinterlace->deinterlacefunc = gst_gl_deinterlace_greedyh_callback; -+ deinterlace->current_method = method_types; -+ break; -+ default: -+ g_assert_not_reached (); -+ break; -+ } -+} -+ - static void - gst_gl_deinterlace_class_init (GstGLDeinterlaceClass * klass) - { -@@ -163,25 +249,60 @@ gst_gl_deinterlace_class_init (GstGLDeinterlaceClass * klass) - "Deinterlacing based on fragment shaders", - "Julien Isorce <julien.isorce@mail.com>"); - -+ g_object_class_install_property (gobject_class, -+ PROP_METHOD, -+ g_param_spec_enum ("method", -+ "Deinterlace Method", -+ "Select which deinterlace method apply to GL video texture", -+ GST_TYPE_GL_DEINTERLACE_METHODS, -+ GST_GL_DEINTERLACE_VFIR, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); -+ -+ GST_BASE_TRANSFORM_CLASS (klass)->start = gst_gl_deinterlace_start; - GST_BASE_TRANSFORM_CLASS (klass)->stop = gst_gl_deinterlace_reset; - - GST_GL_FILTER_CLASS (klass)->filter = gst_gl_deinterlace_filter; - GST_GL_FILTER_CLASS (klass)->filter_texture = - gst_gl_deinterlace_filter_texture; -- GST_GL_FILTER_CLASS (klass)->init_fbo = gst_gl_deinterlace_init_shader; -+ GST_GL_FILTER_CLASS (klass)->init_fbo = gst_gl_deinterlace_init_fbo; - -- GST_GL_BASE_FILTER_CLASS (klass)->supported_gl_api = GST_GL_API_OPENGL; -+ GST_GL_BASE_FILTER_CLASS (klass)->supported_gl_api = -+ GST_GL_API_OPENGL | GST_GL_API_GLES2 | GST_GL_API_OPENGL3; - } - - static void - gst_gl_deinterlace_init (GstGLDeinterlace * filter) - { -- filter->shader = NULL; -+ filter->shaderstable = NULL; -+ filter->deinterlacefunc = gst_gl_deinterlace_vfir_callback; -+ filter->current_method = GST_GL_DEINTERLACE_VFIR; - filter->prev_buffer = NULL; - filter->prev_tex = 0; - } - - static gboolean -+gst_gl_deinterlace_start (GstBaseTransform * trans) -+{ -+ GstGLDeinterlace *deinterlace_filter = GST_GL_DEINTERLACE (trans); -+ -+ deinterlace_filter->shaderstable = g_hash_table_new (g_str_hash, g_str_equal); -+ -+ return GST_BASE_TRANSFORM_CLASS (parent_class)->start (trans); -+} -+ -+static void -+gst_gl_deinterlace_ghash_func_clean (gpointer key, gpointer value, -+ gpointer data) -+{ -+ GstGLShader *shader = (GstGLShader *) value; -+ GstGLFilter *filter = (GstGLFilter *) data; -+ -+ //blocking call, wait the opengl thread has destroyed the shader -+ gst_gl_context_del_shader (GST_GL_BASE_FILTER (filter)->context, shader); -+ -+ value = NULL; -+} -+ -+static gboolean - gst_gl_deinterlace_reset (GstBaseTransform * trans) - { - GstGLDeinterlace *deinterlace_filter = GST_GL_DEINTERLACE (trans); -@@ -189,10 +310,17 @@ gst_gl_deinterlace_reset (GstBaseTransform * trans) - gst_buffer_replace (&deinterlace_filter->prev_buffer, NULL); - - //blocking call, wait the opengl thread has destroyed the shader -- if (deinterlace_filter->shader) -- gst_gl_context_del_shader (GST_GL_BASE_FILTER (trans)->context, -- deinterlace_filter->shader); -- deinterlace_filter->shader = NULL; -+ if (deinterlace_filter->shaderstable) { -+ /* release shaders in the gl thread */ -+ g_hash_table_foreach (deinterlace_filter->shaderstable, -+ gst_gl_deinterlace_ghash_func_clean, deinterlace_filter); -+ -+ /* clean the htable without calling values destructors -+ * because shaders have been released in the glthread -+ * through the foreach func */ -+ g_hash_table_unref (deinterlace_filter->shaderstable); -+ deinterlace_filter->shaderstable = NULL; -+ } - - return GST_BASE_TRANSFORM_CLASS (parent_class)->stop (trans); - } -@@ -201,9 +329,12 @@ static void - gst_gl_deinterlace_set_property (GObject * object, guint prop_id, - const GValue * value, GParamSpec * pspec) - { -- //GstGLDeinterlace *filter = GST_GL_DEINTERLACE (object); -+ GstGLDeinterlace *filter = GST_GL_DEINTERLACE (object); - - switch (prop_id) { -+ case PROP_METHOD: -+ gst_gl_deinterlace_set_method (filter, g_value_get_enum (value)); -+ break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; -@@ -214,9 +345,12 @@ static void - gst_gl_deinterlace_get_property (GObject * object, guint prop_id, - GValue * value, GParamSpec * pspec) - { -- //GstGLDeinterlace *filter = GST_GL_DEINTERLACE (object); -+ GstGLDeinterlace *filter = GST_GL_DEINTERLACE (object); - - switch (prop_id) { -+ case PROP_METHOD: -+ g_value_set_enum (value, filter->current_method); -+ break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; -@@ -224,13 +358,9 @@ gst_gl_deinterlace_get_property (GObject * object, guint prop_id, - } - - static gboolean --gst_gl_deinterlace_init_shader (GstGLFilter * filter) -+gst_gl_deinterlace_init_fbo (GstGLFilter * filter) - { -- GstGLDeinterlace *deinterlace_filter = GST_GL_DEINTERLACE (filter); -- -- //blocking call, wait the opengl thread has compiled the shader -- return gst_gl_context_gen_shader (GST_GL_BASE_FILTER (filter)->context, 0, -- greedyh_fragment_source, &deinterlace_filter->shader); -+ return TRUE; - } - - static gboolean -@@ -241,7 +371,7 @@ gst_gl_deinterlace_filter_texture (GstGLFilter * filter, guint in_tex, - - //blocking call, use a FBO - gst_gl_filter_render_to_target (filter, TRUE, in_tex, out_tex, -- gst_gl_deinterlace_callback, deinterlace_filter); -+ deinterlace_filter->deinterlacefunc, deinterlace_filter); - - return TRUE; - } -@@ -259,36 +389,104 @@ gst_gl_deinterlace_filter (GstGLFilter * filter, GstBuffer * inbuf, - return TRUE; - } - --//opengl scene, params: input texture (not the output filter->texture) -+static GstGLShader * -+gst_gl_deinterlace_get_fragment_shader (GstGLFilter * filter, -+ const gchar * shader_name, const gchar * shader_source) -+{ -+ GstGLShader *shader = NULL; -+ GstGLDeinterlace *deinterlace_filter = GST_GL_DEINTERLACE (filter); -+ GstGLContext *context = GST_GL_BASE_FILTER (filter)->context; -+ -+ shader = g_hash_table_lookup (deinterlace_filter->shaderstable, shader_name); -+ -+ if (!shader) { -+ GError *error = NULL; -+ -+ if (!(shader = gst_gl_shader_new_link_with_stages (context, &error, -+ gst_glsl_stage_new_default_vertex (context), -+ gst_glsl_stage_new_with_string (context, GL_FRAGMENT_SHADER, -+ GST_GLSL_VERSION_NONE, -+ GST_GLSL_PROFILE_ES | GST_GLSL_PROFILE_COMPATIBILITY, -+ shader_source), NULL))) { -+ GST_ELEMENT_ERROR (deinterlace_filter, RESOURCE, NOT_FOUND, -+ ("Failed to initialize %s shader", shader_name), (NULL)); -+ } -+ -+ filter->draw_attr_position_loc = -+ gst_gl_shader_get_attribute_location (shader, "a_position"); -+ filter->draw_attr_texture_loc = -+ gst_gl_shader_get_attribute_location (shader, "a_texcoord"); -+ } -+ -+ g_hash_table_insert (deinterlace_filter->shaderstable, (gchar *) shader_name, -+ shader); -+ -+ return shader; -+} -+ - static void --gst_gl_deinterlace_callback (gint width, gint height, guint texture, -+gst_gl_deinterlace_vfir_callback (gint width, gint height, guint texture, - gpointer stuff) - { -- GstGLDeinterlace *deinterlace_filter = GST_GL_DEINTERLACE (stuff); -+ GstGLShader *shader; - GstGLFilter *filter = GST_GL_FILTER (stuff); -- GstGLFuncs *gl = GST_GL_BASE_FILTER (filter)->context->gl_vtable; -+ GstGLDeinterlace *deinterlace_filter = GST_GL_DEINTERLACE (filter); -+ GstGLContext *context = GST_GL_BASE_FILTER (filter)->context; -+ GstGLFuncs *gl = context->gl_vtable; -+ -+ shader = gst_gl_deinterlace_get_fragment_shader (deinterlace_filter, "vfir", -+ vfir_fragment_source); -+ -+ if (!shader) -+ return; -+ -+#if GST_GL_HAVE_OPENGL -+ if (USING_OPENGL (context)) { -+ gl->MatrixMode (GL_PROJECTION); -+ gl->LoadIdentity (); -+ } -+#endif -+ -+ gst_gl_shader_use (shader); -+ -+ gl->ActiveTexture (GL_TEXTURE0); -+ gl->BindTexture (GL_TEXTURE_2D, texture); -+ -+ gst_gl_shader_set_uniform_1i (shader, "tex", 0); -+ gst_gl_shader_set_uniform_1f (shader, "width", -+ GST_VIDEO_INFO_WIDTH (&filter->out_info)); -+ gst_gl_shader_set_uniform_1f (shader, "height", -+ GST_VIDEO_INFO_HEIGHT (&filter->out_info)); -+ -+ gst_gl_filter_draw_texture (filter, texture, width, height); -+} -+ -+static void -+gst_gl_deinterlace_greedyh_callback (gint width, gint height, guint texture, -+ gpointer stuff) -+{ -+ GstGLShader *shader; -+ GstGLFilter *filter = GST_GL_FILTER (stuff); -+ GstGLDeinterlace *deinterlace_filter = GST_GL_DEINTERLACE (filter); -+ GstGLContext *context = GST_GL_BASE_FILTER (filter)->context; -+ GstGLFuncs *gl = context->gl_vtable; - guint temp; - -- GLfloat verts[] = { -1.0, -1.0, -- 1.0, -1.0, -- 1.0, 1.0, -- -1.0, 1.0 -- }; -- GLfloat texcoords0[] = { 0.0f, 0.0f, -- 1.0f, 0.0f, -- 1.0f, 1.0f, -- 0.0f, 1.0f -- }; -- GLfloat texcoords1[] = { 0.0f, 0.0f, -- 1.0f, 0.0f, -- 1.0f, 1.0f, -- 0.0f, 1.0f -- }; -+ shader = -+ gst_gl_deinterlace_get_fragment_shader (deinterlace_filter, "greedhy", -+ greedyh_fragment_source); - -- gl->MatrixMode (GL_PROJECTION); -- gl->LoadIdentity (); -+ if (!shader) -+ return; - -- gst_gl_shader_use (deinterlace_filter->shader); -+#if GST_GL_HAVE_OPENGL -+ if (USING_OPENGL (context)) { -+ gl->MatrixMode (GL_PROJECTION); -+ gl->LoadIdentity (); -+ } -+#endif -+ -+ gst_gl_shader_use (shader); - - if (G_UNLIKELY (deinterlace_filter->prev_tex == 0)) { - gst_gl_context_gen_texture (GST_GL_BASE_FILTER (filter)->context, -@@ -298,44 +496,24 @@ gst_gl_deinterlace_callback (gint width, gint height, guint texture, - GST_VIDEO_INFO_HEIGHT (&filter->out_info)); - } else { - gl->ActiveTexture (GL_TEXTURE1); -- gst_gl_shader_set_uniform_1i (deinterlace_filter->shader, "tex_prev", 1); -+ gst_gl_shader_set_uniform_1i (shader, "tex_prev", 1); - gl->BindTexture (GL_TEXTURE_2D, deinterlace_filter->prev_tex); - } - - gl->ActiveTexture (GL_TEXTURE0); -- gst_gl_shader_set_uniform_1i (deinterlace_filter->shader, "tex", 0); -+ gl->BindTexture (GL_TEXTURE_2D, texture); - -- gst_gl_shader_set_uniform_1f (deinterlace_filter->shader, "max_comb", -- 5.0f / 255.0f); -- gst_gl_shader_set_uniform_1f (deinterlace_filter->shader, "motion_threshold", -- 25.0f / 255.0f); -- gst_gl_shader_set_uniform_1f (deinterlace_filter->shader, "motion_sense", -- 30.0f / 255.0f); -+ gst_gl_shader_set_uniform_1i (shader, "tex", 0); -+ gst_gl_shader_set_uniform_1f (shader, "max_comb", 5.0f / 255.0f); -+ gst_gl_shader_set_uniform_1f (shader, "motion_threshold", 25.0f / 255.0f); -+ gst_gl_shader_set_uniform_1f (shader, "motion_sense", 30.0f / 255.0f); - -- gst_gl_shader_set_uniform_1f (deinterlace_filter->shader, "width", -+ gst_gl_shader_set_uniform_1f (shader, "width", - GST_VIDEO_INFO_WIDTH (&filter->out_info)); -- gst_gl_shader_set_uniform_1f (deinterlace_filter->shader, "height", -+ gst_gl_shader_set_uniform_1f (shader, "height", - GST_VIDEO_INFO_HEIGHT (&filter->out_info)); - -- gl->ClientActiveTexture (GL_TEXTURE0); -- -- gl->EnableClientState (GL_TEXTURE_COORD_ARRAY); -- gl->EnableClientState (GL_VERTEX_ARRAY); -- -- gl->VertexPointer (2, GL_FLOAT, 0, &verts); -- gl->TexCoordPointer (2, GL_FLOAT, 0, &texcoords0); -- -- gl->ClientActiveTexture (GL_TEXTURE1); -- gl->EnableClientState (GL_TEXTURE_COORD_ARRAY); -- gl->TexCoordPointer (2, GL_FLOAT, 0, &texcoords1); -- -- gl->DrawArrays (GL_TRIANGLE_FAN, 0, 4); -- -- gl->DisableClientState (GL_VERTEX_ARRAY); -- gl->DisableClientState (GL_TEXTURE_COORD_ARRAY); -- -- gl->ClientActiveTexture (GL_TEXTURE0); -- gl->DisableClientState (GL_TEXTURE_COORD_ARRAY); -+ gst_gl_filter_draw_texture (filter, texture, width, height); - - if (texture == filter->in_tex_id) { - temp = filter->in_tex_id; -diff --git a/ext/gl/gstgldeinterlace.h b/ext/gl/gstgldeinterlace.h -index a81a2e7..58a9c0c 100644 ---- a/ext/gl/gstgldeinterlace.h -+++ b/ext/gl/gstgldeinterlace.h -@@ -38,9 +38,13 @@ typedef struct _GstGLDeinterlaceClass GstGLDeinterlaceClass; - struct _GstGLDeinterlace - { - GstGLFilter filter; -- GstGLShader *shader; -+ -+ GLCB deinterlacefunc; -+ GHashTable *shaderstable; - GstBuffer *prev_buffer; - guint prev_tex; -+ -+ gint current_method; - }; - - struct _GstGLDeinterlaceClass -diff --git a/ext/gl/gstopengl.c b/ext/gl/gstopengl.c -index 50676c4..135862a 100644 ---- a/ext/gl/gstopengl.c -+++ b/ext/gl/gstopengl.c -@@ -62,6 +62,7 @@ - #include "gstglstereosplit.h" - #include "gstglstereomix.h" - #include "gstglviewconvert.h" -+#include "gstgldeinterlace.h" - - #if HAVE_GRAPHENE - #include "gstgltransformation.h" -@@ -77,7 +78,6 @@ - #include "gstgltestsrc.h" - #include "gstglfilterglass.h" - /* #include "gstglfilterreflectedscreen.h" */ --#include "gstgldeinterlace.h" - #include "gstglmosaic.h" - #if HAVE_PNG - #include "gstgldifferencematte.h" -@@ -226,6 +226,12 @@ plugin_init (GstPlugin * plugin) - GST_RANK_NONE, GST_TYPE_GL_STEREO_MIX)) { - return FALSE; - } -+ -+ if (!gst_element_register (plugin, "gldeinterlace", -+ GST_RANK_NONE, GST_TYPE_GL_DEINTERLACE)) { -+ return FALSE; -+ } -+ - #if HAVE_JPEG - #if HAVE_PNG - if (!gst_element_register (plugin, "gloverlay", -@@ -250,11 +256,6 @@ plugin_init (GstPlugin * plugin) - return FALSE; - } - #endif -- if (!gst_element_register (plugin, "gldeinterlace", -- GST_RANK_NONE, GST_TYPE_GL_DEINTERLACE)) { -- return FALSE; -- } -- - if (!gst_element_register (plugin, "glmosaic", - GST_RANK_NONE, GST_TYPE_GL_MOSAIC)) { - return FALSE; --- -1.9.1 - diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0003-glcolorconvert-implement-multiple-render-targets-for.patch b/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0003-glcolorconvert-implement-multiple-render-targets-for.patch deleted file mode 100755 index 31d8e052fd..0000000000 --- a/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0003-glcolorconvert-implement-multiple-render-targets-for.patch +++ /dev/null @@ -1,244 +0,0 @@ -From 127e517568490fc147211d8b2fb4da01cecbbeb5 Mon Sep 17 00:00:00 2001 -From: Matthew Waters <matthew@centricular.com> -Date: Thu, 31 Mar 2016 19:50:28 +1100 -Subject: [PATCH 5/6] glcolorconvert: implement multiple render targets for - GLES3 - -There are numerous slight differences required between Desktop GL and GLES3 for -multiple render targets. - -1. gl_FragData doesn't exist at all and one is required to use - 'layout (location = ?) out ...' instead. -2. gl_FragColor doesn't exist, same as 1 -3. texture2D() has been deprecated - -Fortunately most of these have been taken care of with GL3 and the shader -mangling already exists so just expand the conditions they are used in. The -gl_FragData issue requires a new mangle pass though. We also use this new -pass on desktop GL for consistency. - -Upstream-Status: Backport [1.9.1] - ---- - gst-libs/gst/gl/gstglcolorconvert.c | 125 ++++++++++++++++++++++++++++-------- - 1 file changed, 99 insertions(+), 26 deletions(-) - -diff --git a/gst-libs/gst/gl/gstglcolorconvert.c b/gst-libs/gst/gl/gstglcolorconvert.c -index 490ec54..f478faa 100644 ---- a/gst-libs/gst/gl/gstglcolorconvert.c -+++ b/gst-libs/gst/gl/gstglcolorconvert.c -@@ -1802,10 +1802,11 @@ _mangle_sampler_type (const gchar * str, GstGLTextureTarget from, - - static gchar * - _mangle_varying_attribute (const gchar * str, guint shader_type, -- GstGLAPI gl_api) -+ GstGLAPI gl_api, guint gl_major, guint gl_minor) - { -- if (gl_api & GST_GL_API_OPENGL3) { -- if (shader_type == GL_VERTEX_SHADER) { -+ if (shader_type == GL_VERTEX_SHADER) { -+ if ((gl_api & GST_GL_API_OPENGL3) || (gl_api & GST_GL_API_GLES2 -+ && gl_major >= 3)) { - gchar *tmp, *tmp2; - GRegex *regex; - -@@ -1821,7 +1822,10 @@ _mangle_varying_attribute (const gchar * str, guint shader_type, - - g_free (tmp); - return tmp2; -- } else if (shader_type == GL_FRAGMENT_SHADER) { -+ } -+ } else if (shader_type == GL_FRAGMENT_SHADER) { -+ if ((gl_api & GST_GL_API_OPENGL3) || (gl_api & GST_GL_API_GLES2 -+ && gl_major > 3)) { - gchar *tmp; - GRegex *regex; - -@@ -1837,28 +1841,48 @@ _mangle_varying_attribute (const gchar * str, guint shader_type, - } - - static gchar * --_mangle_frag_color (const gchar * str) -+_mangle_frag_color_data (const gchar * str) - { - GRegex *regex; -- gchar *ret; -+ gchar *ret, *tmp; - - regex = g_regex_new ("gl_FragColor", 0, 0, NULL); - ret = g_regex_replace_literal (regex, str, -1, 0, "fragColor", 0, NULL); - g_regex_unref (regex); - -+ tmp = ret; -+ /* search and replace 'gl_FragData[NUM]' into fragColor_NUM */ -+ regex = g_regex_new ("gl_FragData\\[(\\d+)\\]", 0, 0, NULL); -+ ret = g_regex_replace (regex, tmp, -1, 0, "fragColor_\\1", 0, NULL); -+ g_regex_unref (regex); -+ g_free (tmp); -+ - return ret; - } - - static void --_mangle_version_profile_from_gl_api (GstGLAPI gl_api, GstGLSLVersion * version, -- GstGLSLProfile * profile) -+_mangle_version_profile_from_gl_api (GstGLAPI gl_api, gint gl_major, -+ gint gl_minor, GstGLSLVersion * version, GstGLSLProfile * profile) - { -+ *version = GST_GLSL_VERSION_NONE; -+ *profile = GST_GLSL_PROFILE_NONE; -+ - if (gl_api & GST_GL_API_OPENGL3) { -- *version = GST_GLSL_VERSION_150; -- *profile = GST_GLSL_PROFILE_NONE; -+ if (gl_major > 3 || gl_minor >= 3) { -+ *version = GST_GLSL_VERSION_330; -+ *profile = GST_GLSL_PROFILE_CORE; -+ } else { -+ *version = GST_GLSL_VERSION_150; -+ *profile = GST_GLSL_PROFILE_NONE; -+ } - } else if (gl_api & GST_GL_API_GLES2) { -- *version = GST_GLSL_VERSION_100; -- *profile = GST_GLSL_PROFILE_ES; -+ if (gl_major >= 3) { -+ *version = GST_GLSL_VERSION_300; -+ *profile = GST_GLSL_PROFILE_ES; -+ } else if (gl_major >= 2) { -+ *version = GST_GLSL_VERSION_100; -+ *profile = GST_GLSL_PROFILE_ES; -+ } - } else if (gl_api & GST_GL_API_OPENGL) { - *version = GST_GLSL_VERSION_110; - *profile = GST_GLSL_PROFILE_COMPATIBILITY; -@@ -1867,22 +1891,28 @@ _mangle_version_profile_from_gl_api (GstGLAPI gl_api, GstGLSLVersion * version, - - static gchar * - _mangle_shader (const gchar * str, guint shader_type, GstGLTextureTarget from, -- GstGLTextureTarget to, GstGLAPI gl_api, GstGLSLVersion * version, -- GstGLSLProfile * profile) -+ GstGLTextureTarget to, GstGLAPI gl_api, gint gl_major, gint gl_minor, -+ GstGLSLVersion * version, GstGLSLProfile * profile) - { - gchar *tmp, *tmp2; - -+ _mangle_version_profile_from_gl_api (gl_api, gl_major, gl_minor, version, -+ profile); - tmp = _mangle_texture_access (str, from, to, gl_api); - tmp2 = _mangle_sampler_type (tmp, from, to); - g_free (tmp); -- tmp = _mangle_varying_attribute (tmp2, shader_type, gl_api); -+ tmp = -+ _mangle_varying_attribute (tmp2, shader_type, gl_api, gl_major, gl_minor); - g_free (tmp2); -- if (shader_type == GL_FRAGMENT_SHADER && gl_api & GST_GL_API_OPENGL3) { -- tmp2 = _mangle_frag_color (tmp); -- g_free (tmp); -- tmp = tmp2; -+ if (shader_type == GL_FRAGMENT_SHADER) { -+ if ((*profile == GST_GLSL_PROFILE_ES && *version >= GST_GLSL_VERSION_300) -+ || (*profile == GST_GLSL_PROFILE_CORE -+ && *version >= GST_GLSL_VERSION_150)) { -+ tmp2 = _mangle_frag_color_data (tmp); -+ g_free (tmp); -+ tmp = tmp2; -+ } - } -- _mangle_version_profile_from_gl_api (gl_api, version, profile); - return tmp; - } - -@@ -1899,15 +1929,18 @@ _create_shader (GstGLColorConvert * convert) - const gchar *strings[2]; - GError *error = NULL; - GstGLAPI gl_api; -+ gint gl_major, gl_minor; - int i; - - gl_api = gst_gl_context_get_gl_api (convert->context); -+ gst_gl_context_get_gl_version (convert->context, &gl_major, &gl_minor); - - ret = gst_gl_shader_new (convert->context); - - tmp = - _mangle_shader (text_vertex_shader, GL_VERTEX_SHADER, info->templ->target, -- convert->priv->from_texture_target, gl_api, &version, &profile); -+ convert->priv->from_texture_target, gl_api, gl_major, gl_minor, &version, -+ &profile); - - tmp1 = gst_glsl_version_profile_to_string (version, profile); - version_str = g_strdup_printf ("#version %s\n", tmp1); -@@ -1945,9 +1978,37 @@ _create_shader (GstGLColorConvert * convert) - if (info->templ->uniforms) - g_string_append (str, info->templ->uniforms); - -- if (gl_api & GST_GL_API_OPENGL3) { -- g_string_append_c (str, '\n'); -- g_string_append (str, "out vec4 fragColor;\n"); -+ g_string_append_c (str, '\n'); -+ -+ /* GL 3.3+ and GL ES 3.x */ -+ if ((profile == GST_GLSL_PROFILE_CORE && version >= GST_GLSL_VERSION_330) -+ || (profile == GST_GLSL_PROFILE_ES && version >= GST_GLSL_VERSION_300)) { -+ if (info->out_n_textures > 1) { -+ gint i; -+ -+ for (i = 0; i < info->out_n_textures; i++) { -+ g_string_append_printf (str, -+ "layout(location = %d) out vec4 fragColor_%d;\n", i, i); -+ } -+ } else { -+ g_string_append (str, "layout (location = 0) out vec4 fragColor;\n"); -+ } -+ } else if (profile == GST_GLSL_PROFILE_CORE -+ && version >= GST_GLSL_VERSION_150) { -+ /* no layout specifiers, use glBindFragDataLocation instead */ -+ if (info->out_n_textures > 1) { -+ gint i; -+ -+ for (i = 0; i < info->out_n_textures; i++) { -+ gchar *var_name = g_strdup_printf ("fragColor_%d", i); -+ g_string_append_printf (str, "out vec4 %s;\n", var_name); -+ gst_gl_shader_bind_frag_data_location (ret, i, var_name); -+ g_free (var_name); -+ } -+ } else { -+ g_string_append (str, "out vec4 fragColor;\n"); -+ gst_gl_shader_bind_frag_data_location (ret, 0, "fragColor"); -+ } - } - - for (i = 0; i < MAX_FUNCTIONS; i++) { -@@ -1959,7 +2020,19 @@ _create_shader (GstGLColorConvert * convert) - g_string_append_c (str, '\n'); - } - -- g_string_append (str, "\nvarying vec2 v_texcoord;\nvoid main (void) {\n"); -+ { -+ const gchar *varying = NULL; -+ -+ if ((profile == GST_GLSL_PROFILE_ES && version >= GST_GLSL_VERSION_300) -+ || (profile == GST_GLSL_PROFILE_CORE -+ && version >= GST_GLSL_VERSION_150)) { -+ varying = "in"; -+ } else { -+ varying = "varying"; -+ } -+ g_string_append_printf (str, "\n%s vec2 v_texcoord;\nvoid main (void) {\n", -+ varying); -+ } - if (info->frag_body) { - g_string_append (str, "vec2 texcoord;\n"); - if (convert->priv->from_texture_target == GST_GL_TEXTURE_TARGET_RECTANGLE -@@ -1975,7 +2048,7 @@ _create_shader (GstGLColorConvert * convert) - tmp = g_string_free (str, FALSE); - info->frag_prog = _mangle_shader (tmp, GL_FRAGMENT_SHADER, - info->templ->target, convert->priv->from_texture_target, gl_api, -- &version, &profile); -+ gl_major, gl_minor, &version, &profile); - g_free (tmp); - - strings[1] = info->frag_prog; --- -1.9.1 - diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0004-glcolorconvert-don-t-use-the-predefined-variable-nam.patch b/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0004-glcolorconvert-don-t-use-the-predefined-variable-nam.patch deleted file mode 100755 index b75f402d82..0000000000 --- a/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0004-glcolorconvert-don-t-use-the-predefined-variable-nam.patch +++ /dev/null @@ -1,32 +0,0 @@ -From b069672ace2b762f400ca6d318571cbedf5141f2 Mon Sep 17 00:00:00 2001 -From: Matthew Waters <matthew@centricular.com> -Date: Thu, 31 Mar 2016 20:00:37 +1100 -Subject: [PATCH 1/3] glcolorconvert: don't use the predefined variable name - sample - -Using 'sample' as a variable name is an error in GLES3 - -Upstream-Status: Backport [1.9.1] ---- - gst-libs/gst/gl/gstglcolorconvert.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/gst-libs/gst/gl/gstglcolorconvert.c b/gst-libs/gst/gl/gstglcolorconvert.c -index f478faa..c23624f 100644 ---- a/gst-libs/gst/gl/gstglcolorconvert.c -+++ b/gst-libs/gst/gl/gstglcolorconvert.c -@@ -261,9 +261,9 @@ static const struct shader_templ templ_RGB_to_PLANAR_YUV = - " for (int j = 0; j < int(chroma_sampling.y); j++) {\n" - " int n = (i+1)*(j+1);\n" - " delta.y = float(j);\n" -- " vec4 sample = texture2D(tex, (chroma_pos + delta) / unnormalization).%c%c%c%c;\n" -+ " vec4 s = texture2D(tex, (chroma_pos + delta) / unnormalization).%c%c%c%c;\n" - /* rolling average */ -- " uv_texel = (float(n-1) * uv_texel + sample) / float(n);\n" -+ " uv_texel = (float(n-1) * uv_texel + s) / float(n);\n" - " }\n" - " }\n" - "}\n" --- -1.9.1 - diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0005-glshader-add-glBindFragDataLocation.patch b/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0005-glshader-add-glBindFragDataLocation.patch deleted file mode 100755 index 57e9d1a46e..0000000000 --- a/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0005-glshader-add-glBindFragDataLocation.patch +++ /dev/null @@ -1,77 +0,0 @@ -From 38221080181229d520522a20bcb1663ca19f7aff Mon Sep 17 00:00:00 2001 -From: Matthew Waters <matthew@centricular.com> -Date: Thu, 31 Mar 2016 19:25:32 +1100 -Subject: [PATCH 2/3] glshader: add glBindFragDataLocation - -There are some cases where it's needed for binding in/out variables in shaders. -e.g. glsl 150 (gl 3.2) doesn't support the 'layout (location = ?)' specifiers in -the shader source so we have to bind them ourselves. - -Upstream-Status: Backport [1.9.1] ---- - gst-libs/gst/gl/glprototypes/shaders.h | 10 ++++++++++ - gst-libs/gst/gl/gstglshader.c | 20 ++++++++++++++++++++ - gst-libs/gst/gl/gstglshader.h | 1 + - 3 files changed, 31 insertions(+) - -diff --git a/gst-libs/gst/gl/glprototypes/shaders.h b/gst-libs/gst/gl/glprototypes/shaders.h -index 817e479..6d828db 100644 ---- a/gst-libs/gst/gl/glprototypes/shaders.h -+++ b/gst-libs/gst/gl/glprototypes/shaders.h -@@ -362,3 +362,13 @@ GST_GL_EXT_FUNCTION (void, UniformMatrix3x4fv, - GST_GL_EXT_FUNCTION (void, UniformMatrix4x3fv, - (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)) - GST_GL_EXT_END () -+ -+GST_GL_EXT_BEGIN (bind_frag_data, -+ GST_GL_API_OPENGL | GST_GL_API_OPENGL3, -+ 3, 0, -+ 255, 255, -+ "\0", -+ "\0") -+GST_GL_EXT_FUNCTION (void, BindFragDataLocation, -+ (GLuint program, GLuint index, const GLchar * name)) -+GST_GL_EXT_END () -diff --git a/gst-libs/gst/gl/gstglshader.c b/gst-libs/gst/gl/gstglshader.c -index 9d96784..9f09236 100644 ---- a/gst-libs/gst/gl/gstglshader.c -+++ b/gst-libs/gst/gl/gstglshader.c -@@ -1306,3 +1306,23 @@ gst_gl_shader_bind_attribute_location (GstGLShader * shader, GLuint index, - - gl->BindAttribLocation (priv->program_handle, index, name); - } -+ -+void -+gst_gl_shader_bind_frag_data_location (GstGLShader * shader, -+ guint index, const gchar * name) -+{ -+ GstGLShaderPrivate *priv; -+ GstGLFuncs *gl; -+ -+ g_return_if_fail (shader != NULL); -+ if (!_ensure_program (shader)) -+ g_return_if_fail (shader->priv->program_handle); -+ priv = shader->priv; -+ gl = shader->context->gl_vtable; -+ g_return_if_fail (gl->BindFragDataLocation); -+ -+ GST_TRACE_OBJECT (shader, "binding program %i frag data \'%s\' location %i", -+ (int) priv->program_handle, name, index); -+ -+ gl->BindFragDataLocation (priv->program_handle, index, name); -+} -diff --git a/gst-libs/gst/gl/gstglshader.h b/gst-libs/gst/gl/gstglshader.h -index 21410e2..2200b89 100644 ---- a/gst-libs/gst/gl/gstglshader.h -+++ b/gst-libs/gst/gl/gstglshader.h -@@ -104,6 +104,7 @@ void gst_gl_shader_set_uniform_matrix_4x3fv (GstGLShader *shader, const gchar *n - - gint gst_gl_shader_get_attribute_location (GstGLShader *shader, const gchar *name); - void gst_gl_shader_bind_attribute_location (GstGLShader * shader, guint index, const gchar * name); -+void gst_gl_shader_bind_frag_data_location (GstGLShader * shader, guint index, const gchar * name); - - G_END_DECLS - --- -1.9.1 - diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0006-glcolorconvert-GLES3-deprecates-texture2D-and-it-doe.patch b/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0006-glcolorconvert-GLES3-deprecates-texture2D-and-it-doe.patch deleted file mode 100755 index 79ef4c81ab..0000000000 --- a/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0006-glcolorconvert-GLES3-deprecates-texture2D-and-it-doe.patch +++ /dev/null @@ -1,51 +0,0 @@ -From 764fd69f8482eca9f925cefe72ebae090ae59d43 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= <sebastian@centricular.com> -Date: Tue, 19 Apr 2016 19:27:33 +0300 -Subject: [PATCH 3/3] glcolorconvert: GLES3 deprecates texture2D() and it does - not work at all in newer versions than 3.3 - -Use the newer texture() function instead. This fixes glimagesink and other -things on various Android devices. - -Upstream-Status: Backport [1.9.1] - -https://bugzilla.gnome.org/show_bug.cgi?id=765266 ---- - gst-libs/gst/gl/gstglcolorconvert.c | 7 ++++--- - 1 file changed, 4 insertions(+), 3 deletions(-) - -diff --git a/gst-libs/gst/gl/gstglcolorconvert.c b/gst-libs/gst/gl/gstglcolorconvert.c -index c23624f..f472d5d 100644 ---- a/gst-libs/gst/gl/gstglcolorconvert.c -+++ b/gst-libs/gst/gl/gstglcolorconvert.c -@@ -1716,7 +1716,7 @@ _unbind_buffer (GstGLColorConvert * convert) - - static gchar * - _mangle_texture_access (const gchar * str, GstGLTextureTarget from, -- GstGLTextureTarget to, GstGLAPI gl_api) -+ GstGLTextureTarget to, GstGLAPI gl_api, guint gl_major, guint gl_minor) - { - const gchar *from_str = NULL, *to_str = NULL; - gchar *ret, *tmp; -@@ -1730,7 +1730,8 @@ _mangle_texture_access (const gchar * str, GstGLTextureTarget from, - if (from == GST_GL_TEXTURE_TARGET_EXTERNAL_OES) - from_str = "texture2D"; - -- if (gl_api & GST_GL_API_OPENGL3) { -+ if ((gl_api & GST_GL_API_OPENGL3) || (gl_api & GST_GL_API_GLES2 -+ && gl_major >= 3)) { - to_str = "texture"; - } else { - if (to == GST_GL_TEXTURE_TARGET_2D) -@@ -1898,7 +1899,7 @@ _mangle_shader (const gchar * str, guint shader_type, GstGLTextureTarget from, - - _mangle_version_profile_from_gl_api (gl_api, gl_major, gl_minor, version, - profile); -- tmp = _mangle_texture_access (str, from, to, gl_api); -+ tmp = _mangle_texture_access (str, from, to, gl_api, gl_major, gl_minor); - tmp2 = _mangle_sampler_type (tmp, from, to); - g_free (tmp); - tmp = --- -1.9.1 - diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0008-gl-implement-GstGLMemoryEGL.patch b/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0008-gl-implement-GstGLMemoryEGL.patch deleted file mode 100644 index a67381cfef..0000000000 --- a/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0008-gl-implement-GstGLMemoryEGL.patch +++ /dev/null @@ -1,495 +0,0 @@ -From 806bbe75b0b6947f589bce3960c28fee51b5c6c2 Mon Sep 17 00:00:00 2001 -From: Gwang Yoon Hwang <yoon@igalia.com> -Date: Thu, 21 Jan 2016 22:18:17 +0900 -Subject: [PATCH] gl: implement GstGLMemoryEGL - -Because current GstEGLImageMemory does not inherit GstGLMemory, GLUpload -allocates additional GLMemory and upload the decoded contents from the decoder -which uses EGLImage (e.g. gst-omx in RPi). - -This work adds GstGLMemoryEGL to avoid this overhead. Decoders allocate -GstGLMemoryEGL and decode its contents to the EGLImage of GstGLMemoryEGL. And -GLUpload uses this memory without allocation of additional textures and blit -operations. - -https://bugzilla.gnome.org/show_bug.cgi?id=760916 ---- -Upstream-Status: Backport -Signed-off-by: Khem Raj <raj.khem@gmail.com> - - gst-libs/gst/gl/egl/Makefile.am | 2 + - gst-libs/gst/gl/egl/gstgldisplay_egl.c | 2 + - gst-libs/gst/gl/egl/gstglmemoryegl.c | 241 +++++++++++++++++++++++++++++++++ - gst-libs/gst/gl/egl/gstglmemoryegl.h | 108 +++++++++++++++ - gst-libs/gst/gl/gstgl_fwd.h | 4 + - gst-libs/gst/gl/gstgldisplay.c | 2 + - gst-libs/gst/gl/gstglupload.c | 8 ++ - 7 files changed, 367 insertions(+) - create mode 100644 gst-libs/gst/gl/egl/gstglmemoryegl.c - create mode 100644 gst-libs/gst/gl/egl/gstglmemoryegl.h - -diff --git a/gst-libs/gst/gl/egl/Makefile.am b/gst-libs/gst/gl/egl/Makefile.am -index b808178..878f16c 100644 ---- a/gst-libs/gst/gl/egl/Makefile.am -+++ b/gst-libs/gst/gl/egl/Makefile.am -@@ -5,6 +5,7 @@ noinst_LTLIBRARIES = libgstgl-egl.la - libgstgl_egl_la_SOURCES = \ - gstgldisplay_egl.c \ - gstglcontext_egl.c \ -+ gstglmemoryegl.c \ - gsteglimagememory.c - - noinst_HEADERS = -@@ -13,6 +14,7 @@ libgstgl_eglincludedir = $(includedir)/gstreamer-@GST_API_VERSION@/gst/gl/egl - libgstgl_eglinclude_HEADERS = \ - gstgldisplay_egl.h \ - gstglcontext_egl.h \ -+ gstglmemoryegl.h \ - gsteglimagememory.h \ - gstegl.h - -diff --git a/gst-libs/gst/gl/egl/gstgldisplay_egl.c b/gst-libs/gst/gl/egl/gstgldisplay_egl.c -index 9acf4f0..20816c2 100644 ---- a/gst-libs/gst/gl/egl/gstgldisplay_egl.c -+++ b/gst-libs/gst/gl/egl/gstgldisplay_egl.c -@@ -24,6 +24,7 @@ - - #include <gst/gl/egl/gstgldisplay_egl.h> - #include <gst/gl/egl/gsteglimagememory.h> -+#include <gst/gl/egl/gstglmemoryegl.h> - - GST_DEBUG_CATEGORY_STATIC (gst_gl_display_debug); - #define GST_CAT_DEFAULT gst_gl_display_debug -@@ -51,6 +52,7 @@ gst_gl_display_egl_init (GstGLDisplayEGL * display_egl) - display_egl->foreign_display = FALSE; - - gst_egl_image_memory_init (); -+ gst_gl_memory_egl_init_once (); - } - - static void -diff --git a/gst-libs/gst/gl/egl/gstglmemoryegl.c b/gst-libs/gst/gl/egl/gstglmemoryegl.c -new file mode 100644 -index 0000000..03cf432 ---- /dev/null -+++ b/gst-libs/gst/gl/egl/gstglmemoryegl.c -@@ -0,0 +1,241 @@ -+/* -+ * GStreamer -+ * Copyright (C) 2012 Collabora Ltd. -+ * @author: Sebastian Dröge <sebastian.droege@collabora.co.uk> -+ * Copyright (C) 2014 Julien Isorce <julien.isorce@gmail.com> -+ * Copyright (C) 2015 Igalia -+ * Author: Gwang Yoon Hwang <yoon@igalia.com> -+ * -+ * 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., 51 Franklin St, Fifth Floor, -+ * Boston, MA 02110-1301, USA. -+ */ -+ -+#ifdef HAVE_CONFIG_H -+#include "config.h" -+#endif -+ -+#include <string.h> -+ -+#include <gst/gl/egl/gstglmemoryegl.h> -+ -+static GstAllocator *_gl_memory_egl_allocator; -+ -+GST_DEBUG_CATEGORY_STATIC (GST_CAT_GL_MEMORY); -+#define GST_CAT_DEFAULT GST_CAT_GL_MEMORY -+ -+#define parent_class gst_gl_memory_egl_allocator_parent_class -+G_DEFINE_TYPE (GstGLMemoryEGLAllocator, gst_gl_memory_egl_allocator, -+ GST_TYPE_GL_MEMORY_ALLOCATOR); -+ -+gboolean -+gst_is_gl_memory_egl (GstMemory * mem) -+{ -+ return mem != NULL && mem->allocator != NULL -+ && g_type_is_a (G_OBJECT_TYPE (mem->allocator), -+ GST_TYPE_GL_MEMORY_EGL_ALLOCATOR); -+} -+ -+static GstGLMemoryEGL * -+_gl_mem_get_parent (GstGLMemoryEGL * gl_mem) -+{ -+ GstGLMemoryEGL *parent = (GstGLMemoryEGL *)gl_mem->mem.mem.mem.parent; -+ return parent ? parent : gl_mem; -+} -+ -+EGLImageKHR -+gst_gl_memory_egl_get_image (GstGLMemoryEGL * mem) -+{ -+ g_return_val_if_fail (gst_is_gl_memory_egl (GST_MEMORY_CAST (mem)), -+ EGL_NO_IMAGE_KHR); -+ return _gl_mem_get_parent(mem)->image; -+} -+ -+EGLDisplay -+gst_gl_memory_egl_get_display (GstGLMemoryEGL * mem) -+{ -+ g_return_val_if_fail (gst_is_gl_memory_egl (GST_MEMORY_CAST (mem)), NULL); -+ return GST_GL_CONTEXT_EGL(_gl_mem_get_parent(mem))->egl_display; -+} -+ -+GstVideoGLTextureOrientation -+gst_gl_memory_egl_get_orientation (GstGLMemoryEGL * mem) -+{ -+ g_return_val_if_fail (gst_is_gl_memory_egl (GST_MEMORY_CAST (mem)), -+ GST_VIDEO_GL_TEXTURE_ORIENTATION_X_NORMAL_Y_NORMAL); -+ -+ return _gl_mem_get_parent(mem)->orientation; -+} -+ -+void -+gst_gl_memory_egl_set_orientation (GstGLMemoryEGL * mem, -+ GstVideoGLTextureOrientation orientation) -+{ -+ g_return_if_fail (gst_is_gl_memory_egl (GST_MEMORY_CAST (mem))); -+ -+ _gl_mem_get_parent(mem)->orientation = orientation; -+} -+ -+static GstMemory * -+_gl_mem_alloc (GstAllocator * allocator, gsize size, -+ GstAllocationParams * params) -+{ -+ g_warning ("Use gst_gl_base_memory_allocator_alloc() to allocate from this " -+ "GstGLMemoryEGL allocator"); -+ -+ return NULL; -+} -+ -+static void -+_gl_mem_destroy (GstGLMemoryEGL * mem) -+{ -+ /* Shared memory should not destroy all the data */ -+ if (!mem->mem.mem.mem.parent) { -+ GstGLContextEGL *context = GST_GL_CONTEXT_EGL(mem->mem.mem.context); -+ context->eglDestroyImage (context->egl_display, mem->image); -+ } -+ -+ GST_GL_BASE_MEMORY_ALLOCATOR_CLASS (parent_class)->destroy ((GstGLBaseMemory -+ *) mem); -+} -+ -+static void -+_gl_mem_init (GstGLMemoryEGL * mem, GstAllocator * allocator, -+ GstMemory * parent, GstGLContext * context, GstGLTextureTarget target, -+ GstAllocationParams * params, GstVideoInfo * info, -+ guint plane, GstVideoAlignment * valign, gpointer user_data, -+ GDestroyNotify notify) -+{ -+ gst_gl_memory_init ((GstGLMemory *) mem, allocator, parent, -+ context, target, params, info, plane, valign, user_data, notify); -+} -+ -+static GstGLMemoryEGL * -+_gl_mem_egl_alloc (GstGLBaseMemoryAllocator * allocator, -+ GstGLVideoAllocationParams * params) -+{ -+ guint alloc_flags = params->parent.alloc_flags; -+ GstGLMemoryEGL *mem; -+ -+ g_return_val_if_fail (alloc_flags & GST_GL_ALLOCATION_PARAMS_ALLOC_FLAG_VIDEO, -+ NULL); -+ g_return_val_if_fail ((alloc_flags & -+ GST_GL_ALLOCATION_PARAMS_ALLOC_FLAG_WRAP_GPU_HANDLE) == 0, NULL); -+ g_return_val_if_fail ((alloc_flags & -+ GST_GL_ALLOCATION_PARAMS_ALLOC_FLAG_WRAP_SYSMEM) == 0, NULL); -+ -+ mem = g_new0 (GstGLMemoryEGL, 1); -+ mem->image = EGL_NO_IMAGE_KHR; -+ -+ _gl_mem_init (mem, GST_ALLOCATOR_CAST (allocator), NULL, -+ params->parent.context, params->target, params->parent.alloc_params, -+ params->v_info, params->plane, params->valign, params->parent.user_data, -+ params->parent.notify); -+ -+ return mem; -+} -+ -+static gboolean -+_gl_mem_create (GstGLMemoryEGL * gl_mem, GError ** error) -+{ -+ GstGLContextEGL *context = GST_GL_CONTEXT_EGL (gl_mem->mem.mem.context); -+ GstGLBaseMemoryAllocatorClass *alloc_class; -+ -+ if (!gst_gl_context_check_feature (GST_GL_CONTEXT (context), -+ "EGL_KHR_image_base")) { -+ g_set_error (error, GST_GL_CONTEXT_ERROR, GST_GL_CONTEXT_ERROR_WRONG_API, -+ "EGL_KHR_image_base is not supported"); -+ return FALSE; -+ } -+ -+ alloc_class = GST_GL_BASE_MEMORY_ALLOCATOR_CLASS (parent_class); -+ if (!alloc_class->create ((GstGLBaseMemory *) gl_mem, error)) -+ return FALSE; -+ -+ gl_mem->image = context->eglCreateImage (context->egl_display, -+ context->egl_context, EGL_GL_TEXTURE_2D_KHR, -+ (EGLClientBuffer) GSIZE_TO_POINTER (gl_mem->mem.tex_id), NULL); -+ -+ GST_TRACE ("Generating EGLImage handle:%p from a texture:%u", -+ gl_mem->image, gl_mem->mem.tex_id); -+ -+ if (eglGetError () != EGL_SUCCESS) { -+ g_set_error (error, GST_GL_CONTEXT_ERROR, GST_GL_CONTEXT_ERROR_FAILED, -+ "Failed to create EGLImage"); -+ return FALSE; -+ } -+ -+ return TRUE; -+} -+ -+static GstMemory * -+_gl_mem_copy (GstGLMemoryEGL * src, gssize offset, gssize size) -+{ -+ GST_CAT_ERROR (GST_CAT_GL_MEMORY, "GstGLMemoryEGL does not support copy"); -+ return NULL; -+} -+ -+static void -+gst_gl_memory_egl_allocator_class_init (GstGLMemoryEGLAllocatorClass * klass) -+{ -+ GstGLBaseMemoryAllocatorClass *gl_base; -+ GstGLMemoryAllocatorClass *gl_tex; -+ GstAllocatorClass *allocator_class; -+ -+ gl_tex = (GstGLMemoryAllocatorClass *) klass; -+ gl_base = (GstGLBaseMemoryAllocatorClass *) klass; -+ allocator_class = (GstAllocatorClass *) klass; -+ -+ gl_base->alloc = (GstGLBaseMemoryAllocatorAllocFunction) _gl_mem_egl_alloc; -+ gl_base->create = (GstGLBaseMemoryAllocatorCreateFunction) _gl_mem_create; -+ gl_base->destroy = (GstGLBaseMemoryAllocatorDestroyFunction) _gl_mem_destroy; -+ gl_tex->copy = (GstGLBaseMemoryAllocatorCopyFunction) _gl_mem_copy; -+ -+ allocator_class->alloc = _gl_mem_alloc; -+} -+ -+static void -+gst_gl_memory_egl_allocator_init (GstGLMemoryEGLAllocator * allocator) -+{ -+ GstAllocator *alloc = GST_ALLOCATOR_CAST (allocator); -+ -+ alloc->mem_type = GST_GL_MEMORY_EGL_ALLOCATOR_NAME; -+ -+ GST_OBJECT_FLAG_SET (allocator, GST_ALLOCATOR_FLAG_CUSTOM_ALLOC); -+} -+ -+/** -+ * gst_gl_memory_egl_init_once: -+ * -+ * Initializes the GL Memory allocator. It is safe to call this function -+ * multiple times. This must be called before any other GstGLMemoryEGL operation. -+ */ -+void -+gst_gl_memory_egl_init_once (void) -+{ -+ static volatile gsize _init = 0; -+ -+ if (g_once_init_enter (&_init)) { -+ gst_gl_memory_init_once (); -+ -+ GST_DEBUG_CATEGORY_INIT (GST_CAT_GL_MEMORY, "glmemory", 0, -+ "OpenGL Texture with EGLImage memory"); -+ -+ _gl_memory_egl_allocator = g_object_new (GST_TYPE_GL_MEMORY_EGL_ALLOCATOR, NULL); -+ -+ gst_allocator_register (GST_GL_MEMORY_EGL_ALLOCATOR_NAME, -+ gst_object_ref (_gl_memory_egl_allocator)); -+ g_once_init_leave (&_init, 1); -+ } -+} -diff --git a/gst-libs/gst/gl/egl/gstglmemoryegl.h b/gst-libs/gst/gl/egl/gstglmemoryegl.h -new file mode 100644 -index 0000000..7256d33 ---- /dev/null -+++ b/gst-libs/gst/gl/egl/gstglmemoryegl.h -@@ -0,0 +1,108 @@ -+/* -+ * GStreamer -+ * Copyright (C) 2012 Collabora Ltd. -+ * @author: Sebastian Dröge <sebastian.droege@collabora.co.uk> -+ * Copyright (C) 2014 Julien Isorce <julien.isorce@gmail.com> -+ * -+ * 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., 51 Franklin St, Fifth Floor, -+ * Boston, MA 02110-1301, USA. -+ */ -+ -+#ifndef _GST_GL_MEMORY_EGL_H_ -+#define _GST_GL_MEMORY_EGL_H_ -+ -+#include <gst/gst.h> -+#include <gst/gstallocator.h> -+#include <gst/gstmemory.h> -+#include <gst/video/video.h> -+ -+#include <gst/gl/gl.h> -+#include "gstglcontext_egl.h" -+ -+#include <gst/gl/gstglmemory.h> -+ -+G_BEGIN_DECLS -+ -+#define GST_TYPE_GL_MEMORY_EGL_ALLOCATOR (gst_gl_memory_egl_allocator_get_type()) -+GType gst_gl_memory_egl_allocator_get_type(void); -+ -+#define GST_IS_GL_MEMORY_EGL_ALLOCATOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_GL_MEMORY_EGL_ALLOCATOR)) -+#define GST_IS_GL_MEMORY_EGL_ALLOCATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_GL_MEMORY_EGL_ALLOCATOR)) -+#define GST_GL_MEMORY_EGL_ALLOCATOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_GL_MEMORY_EGL_ALLOCATOR, GstGLMemoryEGLAllocatorClass)) -+#define GST_GL_MEMORY_EGL_ALLOCATOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_GL_MEMORY_EGL_ALLOCATOR, GstGLMemoryEGLAllocator)) -+#define GST_GL_MEMORY_EGL_ALLOCATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_GL_MEMORY_EGL_ALLOCATOR, GstGLAllocatorClass)) -+#define GST_GL_MEMORY_EGL_ALLOCATOR_CAST(obj) ((GstGLMemoryEGLAllocator *)(obj)) -+ -+typedef void (*GstEGLImageDestroyNotify) (GstGLContextEGL * context, -+ gpointer data); -+ -+typedef struct _GstEGLImageMemory GstEGLImageMemory; -+ -+ -+/** -+ * GstGLMemoryEGL: -+ * -+ * Private instance -+ */ -+struct _GstGLMemoryEGL -+{ -+ GstGLMemory mem; -+ -+ EGLImageKHR image; -+ GstVideoGLTextureOrientation orientation; -+}; -+ -+/** -+ * GST_GL_MEMORY_EGL_ALLOCATOR: -+ * -+ * The name of the GL Memory EGL allocator -+ */ -+#define GST_GL_MEMORY_EGL_ALLOCATOR_NAME "GLMemoryEGL" -+ -+void gst_gl_memory_egl_init_once (void); -+gboolean gst_is_gl_memory_egl (GstMemory * mem); -+ -+EGLImageKHR gst_gl_memory_egl_get_image (GstGLMemoryEGL * mem); -+EGLDisplay gst_gl_memory_egl_get_display (GstGLMemoryEGL * mem); -+ -+GstVideoGLTextureOrientation gst_gl_memory_egl_get_orientation -+ (GstGLMemoryEGL * mem); -+ -+void gst_gl_memory_egl_set_orientation (GstGLMemoryEGL * mem, -+ GstVideoGLTextureOrientation orientation); -+ -+/** -+ * GstGLAllocator -+ * -+ * Opaque #GstGLAllocator struct -+ */ -+struct _GstGLMemoryEGLAllocator -+{ -+ GstGLMemoryAllocator parent; -+}; -+ -+/** -+ * GstGLAllocatorClass: -+ * -+ * The #GstGLAllocatorClass only contains private data -+ */ -+struct _GstGLMemoryEGLAllocatorClass -+{ -+ GstGLMemoryAllocatorClass parent_class; -+}; -+ -+G_END_DECLS -+ -+#endif /* _GST_GL_MEMORY_EGL_H_ */ -diff --git a/gst-libs/gst/gl/gstgl_fwd.h b/gst-libs/gst/gl/gstgl_fwd.h -index fb64ff6..73e17bd 100644 ---- a/gst-libs/gst/gl/gstgl_fwd.h -+++ b/gst-libs/gst/gl/gstgl_fwd.h -@@ -55,6 +55,10 @@ typedef struct _GstGLMemoryPBO GstGLMemoryPBO; - typedef struct _GstGLMemoryPBOAllocator GstGLMemoryPBOAllocator; - typedef struct _GstGLMemoryPBOAllocatorClass GstGLMemoryPBOAllocatorClass; - -+typedef struct _GstGLMemoryEGL GstGLMemoryEGL; -+typedef struct _GstGLMemoryEGLAllocator GstGLMemoryEGLAllocator; -+typedef struct _GstGLMemoryEGLAllocatorClass GstGLMemoryEGLAllocatorClass; -+ - typedef struct _GstGLSLStage GstGLSLStage; - typedef struct _GstGLSLStagePrivate GstGLSLStagePrivate; - typedef struct _GstGLSLStageClass GstGLSLStageClass; -diff --git a/gst-libs/gst/gl/gstgldisplay.c b/gst-libs/gst/gl/gstgldisplay.c -index 60dec6a..34770d0 100644 ---- a/gst-libs/gst/gl/gstgldisplay.c -+++ b/gst-libs/gst/gl/gstgldisplay.c -@@ -68,6 +68,7 @@ - #if GST_GL_HAVE_PLATFORM_EGL - #include <gst/gl/egl/gstgldisplay_egl.h> - #include <gst/gl/egl/gsteglimagememory.h> -+#include <gst/gl/egl/gstglmemoryegl.h> - #endif - - GST_DEBUG_CATEGORY_STATIC (gst_context); -@@ -144,6 +145,7 @@ gst_gl_display_init (GstGLDisplay * display) - - #if GST_GL_HAVE_PLATFORM_EGL - gst_egl_image_memory_init (); -+ gst_gl_memory_egl_init_once (); - #endif - } - -diff --git a/gst-libs/gst/gl/gstglupload.c b/gst-libs/gst/gl/gstglupload.c -index 16ed5ea..73a9029 100644 ---- a/gst-libs/gst/gl/gstglupload.c -+++ b/gst-libs/gst/gl/gstglupload.c -@@ -29,6 +29,7 @@ - - #if GST_GL_HAVE_PLATFORM_EGL - #include "egl/gsteglimagememory.h" -+#include "egl/gstglmemoryegl.h" - #endif - - #if GST_GL_HAVE_DMABUF -@@ -301,6 +302,13 @@ _gl_memory_upload_propose_allocation (gpointer impl, GstQuery * decide_query, - context)); - gst_query_add_allocation_param (query, allocator, ¶ms); - gst_object_unref (allocator); -+ -+#if GST_GL_HAVE_PLATFORM_EGL -+ allocator = -+ GST_ALLOCATOR (gst_allocator_find (GST_GL_MEMORY_EGL_ALLOCATOR_NAME)); -+ gst_query_add_allocation_param (query, allocator, ¶ms); -+ gst_object_unref (allocator); -+#endif - } - - n_pools = gst_query_get_n_allocation_pools (query); --- -2.5.0 - diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/ensure-valid-sentinels-for-gst_structure_get-etc.patch b/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/ensure-valid-sentinels-for-gst_structure_get-etc.patch index 369ff93ac1..20c9ffcd84 100644 --- a/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/ensure-valid-sentinels-for-gst_structure_get-etc.patch +++ b/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/ensure-valid-sentinels-for-gst_structure_get-etc.patch @@ -23,43 +23,45 @@ Signed-off-by: Andre McCurdy <armccurdy@gmail.com> sys/decklink/gstdecklinkvideosink.cpp | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) -diff --git a/sys/decklink/gstdecklink.cpp b/sys/decklink/gstdecklink.cpp -index 64637f1..bac956f 100644 ---- a/sys/decklink/gstdecklink.cpp -+++ b/sys/decklink/gstdecklink.cpp -@@ -324,22 +324,22 @@ gst_decklink_mode_get_structure (GstDecklinkModeEnum e, BMDPixelFormat f) - "height", G_TYPE_INT, mode->height, +Index: gst-plugins-bad-1.10.2/sys/decklink/gstdecklink.cpp +=================================================================== +--- gst-plugins-bad-1.10.2.orig/sys/decklink/gstdecklink.cpp ++++ gst-plugins-bad-1.10.2/sys/decklink/gstdecklink.cpp +@@ -476,7 +476,7 @@ gst_decklink_mode_get_structure (GstDeck "pixel-aspect-ratio", GST_TYPE_FRACTION, mode->par_n, mode->par_d, - "interlace-mode", G_TYPE_STRING, mode->interlaced ? "interleaved" : "progressive", + "interlace-mode", G_TYPE_STRING, + mode->interlaced ? "interleaved" : "progressive", - "framerate", GST_TYPE_FRACTION, mode->fps_n, mode->fps_d, NULL); -+ "framerate", GST_TYPE_FRACTION, mode->fps_n, mode->fps_d, (void *) NULL); ++ "framerate", GST_TYPE_FRACTION, mode->fps_n, mode->fps_d, (void*)NULL); - switch (f) { - case bmdFormat8BitYUV: /* '2vuy' */ + if (input && mode->interlaced) { + if (mode->tff) +@@ -489,16 +489,16 @@ gst_decklink_mode_get_structure (GstDeck + case bmdFormat8BitYUV: /* '2vuy' */ gst_structure_set (s, "format", G_TYPE_STRING, "UYVY", "colorimetry", G_TYPE_STRING, mode->colorimetry, - "chroma-site", G_TYPE_STRING, "mpeg2", NULL); -+ "chroma-site", G_TYPE_STRING, "mpeg2", (void *) NULL); ++ "chroma-site", G_TYPE_STRING, "mpeg2", (void*)NULL); break; - case bmdFormat10BitYUV: /* 'v210' */ + case bmdFormat10BitYUV: /* 'v210' */ - gst_structure_set (s, "format", G_TYPE_STRING, "v210", NULL); -+ gst_structure_set (s, "format", G_TYPE_STRING, "v210", (void *) NULL); ++ gst_structure_set (s, "format", G_TYPE_STRING, "v210", (void*)NULL); break; - case bmdFormat8BitARGB: /* 'ARGB' */ + case bmdFormat8BitARGB: /* 'ARGB' */ - gst_structure_set (s, "format", G_TYPE_STRING, "ARGB", NULL); -+ gst_structure_set (s, "format", G_TYPE_STRING, "ARGB", (void *) NULL); ++ gst_structure_set (s, "format", G_TYPE_STRING, "ARGB", (void*)NULL); break; - case bmdFormat8BitBGRA: /* 'BGRA' */ + case bmdFormat8BitBGRA: /* 'BGRA' */ - gst_structure_set (s, "format", G_TYPE_STRING, "BGRA", NULL); -+ gst_structure_set (s, "format", G_TYPE_STRING, "BGRA", (void *) NULL); ++ gst_structure_set (s, "format", G_TYPE_STRING, "BGRA", (void*)NULL); break; - case bmdFormat10BitRGB: /* 'r210' Big-endian RGB 10-bit per component with SMPTE video levels (64-960). Packed as 2:10:10:10 */ - case bmdFormat12BitRGB: /* 'R12B' Big-endian RGB 12-bit per component with full range (0-4095). Packed as 12-bit per component */ -diff --git a/sys/decklink/gstdecklinkaudiosrc.cpp b/sys/decklink/gstdecklinkaudiosrc.cpp -index 9a701ee..26fb7ec 100644 ---- a/sys/decklink/gstdecklinkaudiosrc.cpp -+++ b/sys/decklink/gstdecklinkaudiosrc.cpp -@@ -312,7 +312,7 @@ gst_decklink_audio_src_set_caps (GstBaseSrc * bsrc, GstCaps * caps) + case bmdFormat10BitRGB: /* 'r210' Big-endian RGB 10-bit per component with SMPTE video levels (64-960). Packed as 2:10:10:10 */ + case bmdFormat12BitRGB: /* 'R12B' Big-endian RGB 12-bit per component with full range (0-4095). Packed as 12-bit per component */ +Index: gst-plugins-bad-1.10.2/sys/decklink/gstdecklinkaudiosrc.cpp +=================================================================== +--- gst-plugins-bad-1.10.2.orig/sys/decklink/gstdecklinkaudiosrc.cpp ++++ gst-plugins-bad-1.10.2/sys/decklink/gstdecklinkaudiosrc.cpp +@@ -322,7 +322,7 @@ gst_decklink_audio_src_set_caps (GstBase g_mutex_unlock (&self->input->lock); if (videosrc) { @@ -68,11 +70,11 @@ index 9a701ee..26fb7ec 100644 gst_object_unref (videosrc); switch (vconn) { -diff --git a/sys/decklink/gstdecklinkvideosink.cpp b/sys/decklink/gstdecklinkvideosink.cpp -index eebeff3..da6e486 100644 ---- a/sys/decklink/gstdecklinkvideosink.cpp -+++ b/sys/decklink/gstdecklinkvideosink.cpp -@@ -158,7 +158,7 @@ reset_framerate (GstCapsFeatures * features, GstStructure * structure, +Index: gst-plugins-bad-1.10.2/sys/decklink/gstdecklinkvideosink.cpp +=================================================================== +--- gst-plugins-bad-1.10.2.orig/sys/decklink/gstdecklinkvideosink.cpp ++++ gst-plugins-bad-1.10.2/sys/decklink/gstdecklinkvideosink.cpp +@@ -163,7 +163,7 @@ reset_framerate (GstCapsFeatures * featu gpointer user_data) { gst_structure_set (structure, "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, @@ -81,6 +83,3 @@ index eebeff3..da6e486 100644 return TRUE; } --- -1.9.1 - diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_1.8.3.bb b/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_1.10.4.bb index 108f4db10e..0bb4053e43 100644 --- a/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_1.8.3.bb +++ b/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_1.10.4.bb @@ -1,4 +1,4 @@ -include gstreamer1.0-plugins-bad.inc +require gstreamer1.0-plugins-bad.inc LIC_FILES_CHKSUM = "file://COPYING;md5=73a5855a8119deb017f5f13cf327095d \ file://COPYING.LIB;md5=21682e4e8fea52413fd26c60acb907e5 \ @@ -12,15 +12,17 @@ SRC_URI = " \ file://avoid-including-sys-poll.h-directly.patch \ file://ensure-valid-sentinels-for-gst_structure_get-etc.patch \ file://0001-gstreamer-gl.pc.in-don-t-append-GL_CFLAGS-to-CFLAGS.patch \ - file://0002-glplugin-enable-gldeinterlace-on-OpenGL-ES.patch \ - file://0003-glcolorconvert-implement-multiple-render-targets-for.patch \ - file://0004-glcolorconvert-don-t-use-the-predefined-variable-nam.patch \ - file://0005-glshader-add-glBindFragDataLocation.patch \ - file://0006-glcolorconvert-GLES3-deprecates-texture2D-and-it-doe.patch \ - file://0008-gl-implement-GstGLMemoryEGL.patch \ file://0009-glimagesink-Downrank-to-marginal.patch \ + file://0001-introspection.m4-prefix-pkgconfig-paths-with-PKG_CON.patch \ + file://0001-Prepend-PKG_CONFIG_SYSROOT_DIR-to-pkg-config-output.patch \ + file://0001-smoothstreaming-implement-adaptivedemux-s-get_live_s.patch \ + file://0001-smoothstreaming-use-the-duration-from-the-list-of-fr.patch \ + file://0001-mssdemux-improved-live-playback-support.patch \ " -SRC_URI[md5sum] = "955281a43e98c5464563fa049e0a0911" -SRC_URI[sha256sum] = "7899fcb18e6a1af2888b19c90213af018a57d741c6e72ec56b133bc73ec8509b" +SRC_URI[md5sum] = "2757103e57a096a1a05b3ab85b8381af" +SRC_URI[sha256sum] = "23ddae506b3a223b94869a0d3eea3e9a12e847f94d2d0e0b97102ce13ecd6966" S = "${WORKDIR}/gst-plugins-bad-${PV}" + +EXTRA_OECONF += "WAYLAND_PROTOCOLS_SYSROOT_DIR=${RECIPE_SYSROOT}" + diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_git.bb b/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_git.bb deleted file mode 100644 index 1370380b94..0000000000 --- a/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_git.bb +++ /dev/null @@ -1,45 +0,0 @@ -DEFAULT_PREFERENCE = "-1" - -include gstreamer1.0-plugins-bad.inc - -LIC_FILES_CHKSUM = "file://COPYING;md5=73a5855a8119deb017f5f13cf327095d \ - file://COPYING.LIB;md5=21682e4e8fea52413fd26c60acb907e5 \ - file://gst/tta/crc32.h;beginline=12;endline=29;md5=27db269c575d1e5317fffca2d33b3b50 \ - file://gst/tta/filters.h;beginline=12;endline=29;md5=8a08270656f2f8ad7bb3655b83138e5a" - -SRC_URI = " \ - git://anongit.freedesktop.org/gstreamer/gst-plugins-bad;branch=1.8;name=base \ - git://anongit.freedesktop.org/gstreamer/common;destsuffix=git/common;name=common \ - file://configure-allow-to-disable-libssh2.patch \ - file://fix-maybe-uninitialized-warnings-when-compiling-with-Os.patch \ - file://avoid-including-sys-poll.h-directly.patch \ - file://ensure-valid-sentinels-for-gst_structure_get-etc.patch \ - file://0001-gstreamer-gl.pc.in-don-t-append-GL_CFLAGS-to-CFLAGS.patch \ -" - -PV = "1.8.2+git${SRCPV}" - -UPSTREAM_CHECK_GITTAGREGEX = "(?P<pver>(\d+(\.\d+)+))" - -SRCREV_base = "5e73b5a4843d9675246f4efec158624475ed9586" -SRCREV_common = "f363b3205658a38e84fa77f19dee218cd4445275" -SRCREV_FORMAT = "base" - -S = "${WORKDIR}/git" - -do_configure_prepend() { - ${S}/autogen.sh --noconfigure -} - -# In 1.6.2, the "--enable-hls" configure option generated an installable package -# called "gstreamer1.0-plugins-bad-fragmented". In 1.7.1 that HLS plugin package -# has become "gstreamer1.0-plugins-bad-hls". See: -# http://cgit.freedesktop.org/gstreamer/gst-plugins-bad/commit/?id=efe62292a3d045126654d93239fdf4cc8e48ae08 - -PACKAGESPLITFUNCS_append = " handle_hls_rename " - -python handle_hls_rename () { - d.setVar('RPROVIDES_gstreamer1.0-plugins-bad-hls', 'gstreamer1.0-plugins-bad-fragmented') - d.setVar('RREPLACES_gstreamer1.0-plugins-bad-hls', 'gstreamer1.0-plugins-bad-fragmented') - d.setVar('RCONFLICTS_gstreamer1.0-plugins-bad-hls', 'gstreamer1.0-plugins-bad-fragmented') -} diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base.inc b/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base.inc index a04f155dc4..08130c1da4 100644 --- a/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base.inc +++ b/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base.inc @@ -17,9 +17,8 @@ PACKAGES_DYNAMIC =+ "^libgst.*" PACKAGECONFIG ??= " \ ${GSTREAMER_ORC} \ - ${@bb.utils.contains('DISTRO_FEATURES', 'alsa', 'alsa', '', d)} \ - ${@bb.utils.contains('DISTRO_FEATURES', 'x11', 'x11', '', d)} \ - gio-unix-2.0 ivorbis ogg pango theora vorbis \ + ${@bb.utils.filter('DISTRO_FEATURES', 'alsa x11', d)} \ + gio-unix-2.0 ogg pango theora vorbis \ " X11DEPENDS = "virtual/libx11 libsm libxrender libxv" diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base_1.8.3.bb b/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base_1.10.4.bb index 986b5ac606..7c81670932 100644 --- a/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base_1.8.3.bb +++ b/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base_1.10.4.bb @@ -1,4 +1,4 @@ -include gstreamer1.0-plugins-base.inc +require gstreamer1.0-plugins-base.inc LIC_FILES_CHKSUM = "file://COPYING;md5=c54ce9345727175ff66d17b67ff51f58 \ file://COPYING.LIB;md5=6762ed442b3822387a51c92d928ead0d \ @@ -11,9 +11,9 @@ SRC_URI = " \ file://0004-subparse-set-need_segment-after-sink-pad-received-GS.patch \ file://encodebin-Need-more-buffers-in-output-queue-for-bett.patch \ file://make-gio_unix_2_0-dependency-configurable.patch \ + file://0001-introspection.m4-prefix-pkgconfig-paths-with-PKG_CON.patch \ " - -SRC_URI[md5sum] = "4d03dd81828ea6b98a44c8f1ab7f4976" -SRC_URI[sha256sum] = "114871d4d63606b4af424a8433cd923e4ff66896b244bb7ac97b9da47f71e79e" +SRC_URI[md5sum] = "f6b46f8fac01eb773d556e3efc369e86" +SRC_URI[sha256sum] = "f6d245b6b3d4cb733f81ebb021074c525ece83db0c10e932794b339b8d935eb7" S = "${WORKDIR}/gst-plugins-base-${PV}" diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base_git.bb b/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base_git.bb deleted file mode 100644 index 3c2b504003..0000000000 --- a/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base_git.bb +++ /dev/null @@ -1,31 +0,0 @@ -DEFAULT_PREFERENCE = "-1" - -include gstreamer1.0-plugins-base.inc - -LIC_FILES_CHKSUM = "file://COPYING;md5=c54ce9345727175ff66d17b67ff51f58 \ - file://COPYING.LIB;md5=6762ed442b3822387a51c92d928ead0d \ - file://common/coverage/coverage-report.pl;beginline=2;endline=17;md5=a4e1830fce078028c8f0974161272607" - -SRC_URI = " \ - git://anongit.freedesktop.org/gstreamer/gst-plugins-base;branch=1.8;name=base \ - git://anongit.freedesktop.org/gstreamer/common;destsuffix=git/common;name=common \ - file://get-caps-from-src-pad-when-query-caps.patch \ - file://0003-ssaparse-enhance-SSA-text-lines-parsing.patch \ - file://0004-subparse-set-need_segment-after-sink-pad-received-GS.patch \ - file://encodebin-Need-more-buffers-in-output-queue-for-bett.patch \ - file://make-gio_unix_2_0-dependency-configurable.patch \ -" - -PV = "1.8.2+git${SRCPV}" - -UPSTREAM_CHECK_GITTAGREGEX = "(?P<pver>(\d+(\.\d+)+))" - -SRCREV_base = "70f3750773bf5dba4098f6d72d63aa6c84f1f539" -SRCREV_common = "f363b3205658a38e84fa77f19dee218cd4445275" -SRCREV_FORMAT = "base" - -S = "${WORKDIR}/git" - -do_configure_prepend() { - ${S}/autogen.sh --noconfigure -} diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good.inc b/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good.inc index f1e30aba55..14c3d61848 100644 --- a/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good.inc +++ b/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good.inc @@ -8,8 +8,7 @@ inherit gettext PACKAGECONFIG ??= " \ ${GSTREAMER_ORC} \ - ${@bb.utils.contains('DISTRO_FEATURES', 'pulseaudio', 'pulseaudio', '', d)} \ - ${@bb.utils.contains('DISTRO_FEATURES', 'x11', 'x11', '', d)} \ + ${@bb.utils.filter('DISTRO_FEATURES', 'pulseaudio x11', d)} \ cairo flac gdk-pixbuf gudev jpeg libpng soup speex taglib v4l2 \ " diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good/0001-v4l2object-Also-add-videometa-if-there-is-padding-to.patch b/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good/0001-v4l2object-Also-add-videometa-if-there-is-padding-to.patch new file mode 100644 index 0000000000..2a9a23e15d --- /dev/null +++ b/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good/0001-v4l2object-Also-add-videometa-if-there-is-padding-to.patch @@ -0,0 +1,35 @@ +From 22be02612adc757f6a43cefc6ee65ecaef68f0d9 Mon Sep 17 00:00:00 2001 +From: Carlos Rafael Giani <dv@pseudoterminal.org> +Date: Thu, 23 Mar 2017 22:13:05 +0100 +Subject: [PATCH] v4l2object: Also add videometa if there is padding to the + right and bottom + +https://bugzilla.gnome.org/show_bug.cgi?id=780478 + +Upstream-Status: Backport [1.10.5] + +Signed-off-by: Carlos Rafael Giani <dv@pseudoterminal.org> +--- + sys/v4l2/gstv4l2object.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +diff --git a/sys/v4l2/gstv4l2object.c b/sys/v4l2/gstv4l2object.c +index 91c8ff0..ed4654e 100644 +--- a/sys/v4l2/gstv4l2object.c ++++ b/sys/v4l2/gstv4l2object.c +@@ -3070,9 +3070,10 @@ store_info: + GST_DEBUG_OBJECT (v4l2object->element, "Got sizeimage %" G_GSIZE_FORMAT, + info->size); + +- /* to avoid copies we need video meta if top or left padding */ ++ /* to avoid copies we need video meta if there is padding */ + v4l2object->need_video_meta = +- ((align->padding_top + align->padding_left) != 0); ++ ((align->padding_top + align->padding_left + align->padding_right + ++ align->padding_bottom) != 0); + + /* ... or if stride is non "standard" */ + if (!standard_stride) +-- +2.7.4 + diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good_1.8.3.bb b/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good_1.10.4.bb index 5cc6578b77..57447bffba 100644 --- a/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good_1.8.3.bb +++ b/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good_1.10.4.bb @@ -1,4 +1,4 @@ -include gstreamer1.0-plugins-good.inc +require gstreamer1.0-plugins-good.inc LIC_FILES_CHKSUM = "file://COPYING;md5=a6f89e2100d9b6cdffcea4f398e37343 \ file://common/coverage/coverage-report.pl;beginline=2;endline=17;md5=a4e1830fce078028c8f0974161272607 \ @@ -9,9 +9,10 @@ SRC_URI = " \ file://0001-gstrtpmp4gpay-set-dafault-value-for-MPEG4-without-co.patch \ file://avoid-including-sys-poll.h-directly.patch \ file://ensure-valid-sentinel-for-gst_structure_get.patch \ + file://0001-introspection.m4-prefix-pkgconfig-paths-with-PKG_CON.patch \ + file://0001-v4l2object-Also-add-videometa-if-there-is-padding-to.patch \ " - -SRC_URI[md5sum] = "473ebb1f15c67de99ddb6e4d027c0876" -SRC_URI[sha256sum] = "a1d6579ba203a7734927c24b90bf6590d846c5a5fcec01a48201018c8ad2827a" +SRC_URI[md5sum] = "cc0cc13cdb07d4237600b6886b81f31d" +SRC_URI[sha256sum] = "8a86c61434a8c44665365bd0b3557a040937d1f44bf69caee4e9ea816ce74d7e" S = "${WORKDIR}/gst-plugins-good-${PV}" diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good_git.bb b/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good_git.bb deleted file mode 100644 index 9b79af2a9a..0000000000 --- a/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good_git.bb +++ /dev/null @@ -1,29 +0,0 @@ -DEFAULT_PREFERENCE = "-1" - -include gstreamer1.0-plugins-good.inc - -LIC_FILES_CHKSUM = "file://COPYING;md5=a6f89e2100d9b6cdffcea4f398e37343 \ - file://common/coverage/coverage-report.pl;beginline=2;endline=17;md5=a4e1830fce078028c8f0974161272607 \ - file://gst/replaygain/rganalysis.c;beginline=1;endline=23;md5=b60ebefd5b2f5a8e0cab6bfee391a5fe" - -SRC_URI = " \ - git://anongit.freedesktop.org/gstreamer/gst-plugins-good;branch=1.8;name=base \ - git://anongit.freedesktop.org/gstreamer/common;destsuffix=git/common;name=common \ - file://avoid-including-sys-poll.h-directly.patch \ - file://ensure-valid-sentinel-for-gst_structure_get.patch \ - file://0001-gstrtpmp4gpay-set-dafault-value-for-MPEG4-without-co.patch \ -" - -PV = "1.8.2+git${SRCPV}" - -UPSTREAM_CHECK_GITTAGREGEX = "(?P<pver>(\d+(\.\d+)+))" - -SRCREV_base = "9f73b5818f98cd045e7049bb313da1c943635109" -SRCREV_common = "f363b3205658a38e84fa77f19dee218cd4445275" -SRCREV_FORMAT = "base" - -S = "${WORKDIR}/git" - -do_configure_prepend() { - ${S}/autogen.sh --noconfigure -} diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-ugly_1.8.3.bb b/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-ugly_1.10.4.bb index 2745937961..92a2caa2c2 100644 --- a/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-ugly_1.8.3.bb +++ b/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-ugly_1.10.4.bb @@ -1,13 +1,13 @@ -include gstreamer1.0-plugins-ugly.inc +require gstreamer1.0-plugins-ugly.inc LIC_FILES_CHKSUM = "file://COPYING;md5=a6f89e2100d9b6cdffcea4f398e37343 \ file://tests/check/elements/xingmux.c;beginline=1;endline=21;md5=4c771b8af188724855cb99cadd390068" SRC_URI = " \ http://gstreamer.freedesktop.org/src/gst-plugins-ugly/gst-plugins-ugly-${PV}.tar.xz \ + file://0001-introspection.m4-prefix-pkgconfig-paths-with-PKG_CON.patch \ " - -SRC_URI[md5sum] = "4fc66c77253b0ad5ce224bda654b2e7d" -SRC_URI[sha256sum] = "6fa2599fdd072d31fbaf50c34af406e2be944a010b1f4eab67a5fe32a0310693" +SRC_URI[md5sum] = "c68d0509c9980b0b70a4b836ff73fff1" +SRC_URI[sha256sum] = "6386c77ca8459cba431ed0b63da780c7062c7cc48055d222024d8eaf198ffa59" S = "${WORKDIR}/gst-plugins-ugly-${PV}" diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-ugly_git.bb b/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-ugly_git.bb deleted file mode 100644 index 22cca3a8df..0000000000 --- a/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-ugly_git.bb +++ /dev/null @@ -1,37 +0,0 @@ -DEFAULT_PREFERENCE = "-1" - -include gstreamer1.0-plugins-ugly.inc - -LIC_FILES_CHKSUM = "file://COPYING;md5=a6f89e2100d9b6cdffcea4f398e37343 \ - file://tests/check/elements/xingmux.c;beginline=1;endline=21;md5=4c771b8af188724855cb99cadd390068" - -SRC_URI = " \ - git://anongit.freedesktop.org/gstreamer/gst-plugins-ugly;branch=1.8;name=base \ - git://anongit.freedesktop.org/gstreamer/common;destsuffix=git/common;name=common \ -" - -PV = "1.8.2+git${SRCPV}" - -UPSTREAM_CHECK_GITTAGREGEX = "(?P<pver>(\d+(\.\d+)+))" - -SRCREV_base = "79fe43c00925455a37fab6fc428e7f08655a9bbd" -SRCREV_common = "f363b3205658a38e84fa77f19dee218cd4445275" -SRCREV_FORMAT = "base" - -S = "${WORKDIR}/git" - -do_configure_prepend() { - ${S}/autogen.sh --noconfigure -} - -# In 1.7.2, the mpg123 plugin was moved from -bad to -ugly -# https://cgit.freedesktop.org/gstreamer/gst-plugins-bad/commit/?id=08d8aefcdaaf89ecb6dd53ec1e4f95cd42d01664 -# https://cgit.freedesktop.org/gstreamer/gst-plugins-ugly/commit/?id=43bd45ba991ef3247957ca37cdcb52f4b8c0acb1 - -PACKAGESPLITFUNCS_append = " handle_mpg123_rename " - -python handle_mpg123_rename () { - d.setVar('RPROVIDES_gstreamer1.0-plugins-ugly-mpg123', 'gstreamer1.0-plugins-bad-mpg123') - d.setVar('RREPLACES_gstreamer1.0-plugins-ugly-mpg123', 'gstreamer1.0-plugins-bad-mpg123') - d.setVar('RCONFLICTS_gstreamer1.0-plugins-ugly-mpg123', 'gstreamer1.0-plugins-bad-mpg123') -} diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins.inc b/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins.inc index 9cfcec3ca5..3f6d4c3703 100644 --- a/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins.inc +++ b/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins.inc @@ -28,8 +28,6 @@ EXTRA_OECONF = " \ --disable-examples \ " -SRC_URI_append = " file://0001-introspection.m4-prefix-pkgconfig-paths-with-PKG_CON.patch" - delete_pkg_m4_file() { # This m4 file is out of date and is missing PKG_CONFIG_SYSROOT_PATH tweaks which we need for introspection rm "${S}/common/m4/pkg.m4" || true diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-rtsp-server.inc b/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-rtsp-server.inc index 13ba40d3da..7191f9892d 100644 --- a/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-rtsp-server.inc +++ b/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-rtsp-server.inc @@ -3,7 +3,7 @@ HOMEPAGE = "http://cgit.freedesktop.org/gstreamer/gst-rtsp-server/" SECTION = "multimedia" LICENSE = "LGPLv2" -DEPENDS = "gstreamer1.0 libcgroup gstreamer1.0-plugins-base" +DEPENDS = "gstreamer1.0 libcgroup gstreamer1.0-plugins-base libcheck" PNREAL = "gst-rtsp-server" diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-rtsp-server_1.10.4.bb b/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-rtsp-server_1.10.4.bb new file mode 100644 index 0000000000..6aa9a53cca --- /dev/null +++ b/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-rtsp-server_1.10.4.bb @@ -0,0 +1,6 @@ +require gstreamer1.0-rtsp-server.inc + +SRC_URI[md5sum] = "ef587fa6393e09bc26f884510596e305" +SRC_URI[sha256sum] = "2f6e12fd4e3568ee190dc24e57e4c3a878971c3a3fb6904a9674404fac256de6" + +LIC_FILES_CHKSUM = "file://COPYING;md5=6762ed442b3822387a51c92d928ead0d" diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-rtsp-server_1.8.3.bb b/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-rtsp-server_1.8.3.bb deleted file mode 100644 index 17059d0703..0000000000 --- a/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-rtsp-server_1.8.3.bb +++ /dev/null @@ -1,6 +0,0 @@ -include gstreamer1.0-rtsp-server.inc - -LIC_FILES_CHKSUM = "file://COPYING;md5=6762ed442b3822387a51c92d928ead0d" - -SRC_URI[md5sum] = "e4b07b10dd65b6c26c9ca5f72e59297b" -SRC_URI[sha256sum] = "010f06800c1c957851d1352e5ec7a8ba3ce6a857fec1b8afc7d1a9e5f53288bf" diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-vaapi.inc b/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-vaapi.inc new file mode 100644 index 0000000000..ef0734ba93 --- /dev/null +++ b/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-vaapi.inc @@ -0,0 +1,37 @@ +SUMMARY = "VA-API support to GStreamer" +DESCRIPTION = "gstreamer-vaapi consists of a collection of VA-API \ +based plugins for GStreamer and helper libraries: `vaapidecode', \ +`vaapiconvert', and `vaapisink'." + +REALPN = "gstreamer-vaapi" +FILESPATH = "${@base_set_filespath(["${FILE_DIRNAME}/${REALPN}", "${FILE_DIRNAME}/${REALPN}"], d)}" + +LICENSE = "LGPLv2.1+" +LIC_FILES_CHKSUM = "file://COPYING.LIB;md5=4fbd65380cdd255951079008b364516c" + +DEPENDS = "libva" + +SRC_URI = "https://gstreamer.freedesktop.org/src/${REALPN}/${REALPN}-${PV}.tar.xz \ + " + +S = "${WORKDIR}/${REALPN}-${PV}" + +inherit autotools pkgconfig gtk-doc distro_features_check upstream-version-is-even + +REQUIRED_DISTRO_FEATURES ?= "opengl" + +PACKAGES =+ "${PN}-tests" + +PACKAGECONFIG ??= "drm \ + ${@bb.utils.contains('DISTRO_FEATURES', 'opengl x11', 'glx', '', d)} \ + ${@bb.utils.filter('DISTRO_FEATURES', 'wayland x11', d)}" + +PACKAGECONFIG[drm] = "--enable-drm,--disable-drm,udev libdrm" +PACKAGECONFIG[glx] = "--enable-glx,--disable-glx,virtual/mesa" +PACKAGECONFIG[wayland] = "--enable-wayland,--disable-wayland,wayland" +PACKAGECONFIG[x11] = "--enable-x11,--disable-x11,virtual/libx11 libxrandr libxrender" + +FILES_${PN} += "${libdir}/gstreamer-*/*.so" +FILES_${PN}-dbg += "${libdir}/gstreamer-*/.debug" +FILES_${PN}-dev += "${libdir}/gstreamer-*/*.la ${libdir}/gstreamer-*/*.a" +FILES_${PN}-tests = "${bindir}/*" diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-vaapi_1.10.4.bb b/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-vaapi_1.10.4.bb new file mode 100644 index 0000000000..44c66de442 --- /dev/null +++ b/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0-vaapi_1.10.4.bb @@ -0,0 +1,7 @@ +require gstreamer1.0-vaapi.inc +SRC_URI[md5sum] = "318af17f906637570b61dd7be9b5581d" +SRC_URI[sha256sum] = "03e690621594d9f9495d86c7dac8b8590b3a150462770ed070dc76f66a70de75" + +SRC_URI += "file://vaapivideobufferpool-create-allocator-if-needed.patch" + +DEPENDS += "gstreamer1.0 gstreamer1.0-plugins-base gstreamer1.0-plugins-bad" diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0.inc b/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0.inc index cb0bd82f23..72d7ce68d0 100644 --- a/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0.inc +++ b/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0.inc @@ -24,7 +24,7 @@ PACKAGECONFIG[debug] = "--enable-debug,--disable-debug" PACKAGECONFIG[tests] = "--enable-tests,--disable-tests" PACKAGECONFIG[valgrind] = "--enable-valgrind,--disable-valgrind,valgrind," PACKAGECONFIG[gst-tracer-hooks] = "--enable-gst-tracer-hooks,--disable-gst-tracer-hooks," -PACKAGECONFIG[trace-historic] = "--enable-trace,--disable-trace," +PACKAGECONFIG[unwind] = "--with-unwind,--without-unwind,libunwind" EXTRA_OECONF = " \ --disable-dependency-tracking \ diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0/deterministic-unwind.patch b/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0/deterministic-unwind.patch new file mode 100644 index 0000000000..e39e6cad09 --- /dev/null +++ b/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0/deterministic-unwind.patch @@ -0,0 +1,24 @@ +Make the detection of libunwind deterministic. + +Upstream-Status: Pending +Signed-off-by: Ross Burton <ross.burton@intel.com> + +diff --git a/configure.ac b/configure.ac +index ac88fb2..182c19a 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -829,3 +828,0 @@ AM_CONDITIONAL(HAVE_GTK, test "x$HAVE_GTK" = "xyes") +-dnl libunwind is optionally used by the leaks tracer +-PKG_CHECK_MODULES(UNWIND, libunwind, HAVE_UNWIND=yes, HAVE_UNWIND=no) +- +@@ -839,3 +836,7 @@ AC_CHECK_FUNC(backtrace, [ +-if test "x$HAVE_UNWIND" = "xyes"; then +- AC_DEFINE(HAVE_UNWIND, 1, [libunwind available]) +-fi ++dnl libunwind is optionally used by the leaks tracer ++AC_ARG_WITH([unwind],[AS_HELP_STRING([--with-unwind],[use libunwind])], ++ [], [with_unwind=yes]) ++AS_IF([test "$with_unwind" = yes], ++ [PKG_CHECK_MODULES(UNWIND, libunwind) ++ AC_DEFINE(HAVE_UNWIND, 1, [libunwind available])] ++) diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0_1.8.3.bb b/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0_1.10.4.bb index d3561ebbde..2a6799345f 100644 --- a/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0_1.8.3.bb +++ b/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0_1.10.4.bb @@ -1,13 +1,13 @@ -include gstreamer1.0.inc +require gstreamer1.0.inc LIC_FILES_CHKSUM = "file://COPYING;md5=6762ed442b3822387a51c92d928ead0d \ file://gst/gst.h;beginline=1;endline=21;md5=e059138481205ee2c6fc1c079c016d0d" SRC_URI = " \ http://gstreamer.freedesktop.org/src/gstreamer/gstreamer-${PV}.tar.xz \ + file://deterministic-unwind.patch \ " - -SRC_URI[md5sum] = "e88dad542df9d986822e982105d2b530" -SRC_URI[sha256sum] = "66b37762d4fdcd63bce5a2bec57e055f92420e95037361609900278c0db7c53f" +SRC_URI[md5sum] = "7c91a97e4a2dc81eafd59d0a2f8b0d6e" +SRC_URI[sha256sum] = "50c2f5af50a6cc6c0a3f3ed43bdd8b5e2bff00bacfb766d4be139ec06d8b5218" S = "${WORKDIR}/gstreamer-${PV}" diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0_git.bb b/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0_git.bb deleted file mode 100644 index 6112f2a892..0000000000 --- a/import-layers/yocto-poky/meta/recipes-multimedia/gstreamer/gstreamer1.0_git.bb +++ /dev/null @@ -1,25 +0,0 @@ -DEFAULT_PREFERENCE = "-1" - -include gstreamer1.0.inc - -LIC_FILES_CHKSUM = "file://COPYING;md5=6762ed442b3822387a51c92d928ead0d \ - file://gst/gst.h;beginline=1;endline=21;md5=e059138481205ee2c6fc1c079c016d0d" - -SRC_URI = " \ - git://anongit.freedesktop.org/gstreamer/gstreamer;branch=1.8;name=base \ - git://anongit.freedesktop.org/gstreamer/common;destsuffix=git/common;name=common \ -" - -PV = "1.8.2+git${SRCPV}" - -UPSTREAM_CHECK_GITTAGREGEX = "(?P<pver>(\d+(\.\d+)+))" - -SRCREV_base = "3de8a4f728a7194a12b784ec4085f6a8e7d9b5bd" -SRCREV_common = "f363b3205658a38e84fa77f19dee218cd4445275" -SRCREV_FORMAT = "base" - -S = "${WORKDIR}/git" - -do_configure_prepend() { - ${S}/autogen.sh --noconfigure -} diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/libpng/libpng_1.6.24.bb b/import-layers/yocto-poky/meta/recipes-multimedia/libpng/libpng_1.6.28.bb index f91ab7ffc4..9cb2967fe6 100644 --- a/import-layers/yocto-poky/meta/recipes-multimedia/libpng/libpng_1.6.24.bb +++ b/import-layers/yocto-poky/meta/recipes-multimedia/libpng/libpng_1.6.28.bb @@ -2,14 +2,14 @@ SUMMARY = "PNG image format decoding library" HOMEPAGE = "http://www.libpng.org/" SECTION = "libs" LICENSE = "Libpng" -LIC_FILES_CHKSUM = "file://LICENSE;md5=5089214833586ba444048fd1dbbc76a4 \ - file://png.h;endline=149;md5=376d8ff7f69b7c4ad3a09f4672cec696" +LIC_FILES_CHKSUM = "file://LICENSE;md5=67d8837410863f9821bbd606536f0329 \ + file://png.h;endline=144;md5=abfa0497feb393b5842d3d82c1009520" DEPENDS = "zlib" SRC_URI = "${GENTOO_MIRROR}/libpng-${PV}.tar.xz \ " -SRC_URI[md5sum] = "ffcdbd549814787fa8010c372e35ff25" -SRC_URI[sha256sum] = "7932dc9e5e45d55ece9d204e90196bbb5f2c82741ccb0f7e10d07d364a6fd6dd" +SRC_URI[md5sum] = "425354f86c392318d31aedca71019372" +SRC_URI[sha256sum] = "d8d3ec9de6b5db740fefac702c37ffcf96ae46cb17c18c1544635a3852f78f7a" BINCONFIG = "${bindir}/libpng-config ${bindir}/libpng16-config" diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/libsamplerate/libsamplerate0/0001-configure.ac-improve-alsa-handling.patch b/import-layers/yocto-poky/meta/recipes-multimedia/libsamplerate/libsamplerate0/0001-configure.ac-improve-alsa-handling.patch new file mode 100644 index 0000000000..d19b514e6b --- /dev/null +++ b/import-layers/yocto-poky/meta/recipes-multimedia/libsamplerate/libsamplerate0/0001-configure.ac-improve-alsa-handling.patch @@ -0,0 +1,62 @@ +From 957ebce3837588f71016e37ffaf9aad0a9d41cec Mon Sep 17 00:00:00 2001 +From: Tanu Kaskinen <tanuk@iki.fi> +Date: Fri, 23 Sep 2016 12:02:06 +0300 +Subject: [PATCH] configure.ac: improve alsa handling + +Three improvements: + +1) "--enable-alsa" or "--disable-alsa" caused a warning about an +unsupported configure option, because AC_ARG_ENABLE was not used. + +2) If alsa was disabled, the "Have ALSA" item in the summary would print +an empty string instead of "no". + +3) If "--enable-alsa" was passed to configure, but the headers were not +found, configure would still succeed (with alsa disabled). It's better +to fail and abort configure if a feature that was explicitly requested +can't be enabled. + +Upstream-Status: Submitted [sent to src@mega-nerd.com] + +Signed-off-by: Tanu Kaskinen <tanuk@iki.fi> +--- + configure.ac | 9 ++++++++- + 1 file changed, 8 insertions(+), 1 deletion(-) + +diff --git a/configure.ac b/configure.ac +index 474c6ab..bad597e 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -101,6 +101,9 @@ AC_ARG_ENABLE(cpu-clip, + AC_HELP_STRING([--disable-cpu-clip], [disable tricky cpu specific clipper]), + ac_arg_cpu_clip="N", ac_arg_cpu_clip="Y") + ++AC_ARG_ENABLE(alsa, ++ AC_HELP_STRING([--disable-alsa], [disable ALSA support in the varispeed-play example program])) ++ + #==================================================================================== + # Check types and their sizes. + +@@ -194,6 +197,10 @@ if test x$enable_alsa != xno ; then + if test x$ac_cv_header_alsa_asoundlib_h = xyes ; then + ALSA_LIBS="-lasound" + enable_alsa=yes ++ elif test x$enable_alsa = xyes ; then ++ AC_MSG_ERROR(["ALSA headers not found"]) ++ else ++ enable_alsa=no + fi + fi + +@@ -340,7 +347,7 @@ AC_MSG_RESULT([ + Have FFTW : ................... ${ac_cv_fftw3}]) + + AC_MSG_RESULT([ Have libsndfile : ............. ${ac_cv_sndfile}]) +-AC_MSG_RESULT([ Have ALSA : ................... ${ac_cv_header_alsa_asoundlib_h} ++AC_MSG_RESULT([ Have ALSA : ................... ${enable_alsa} + ]) + + AC_MSG_RESULT([ Installation directories : +-- +2.9.3 + diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/libsamplerate/libsamplerate0_0.1.8.bb b/import-layers/yocto-poky/meta/recipes-multimedia/libsamplerate/libsamplerate0_0.1.8.bb deleted file mode 100644 index 1c37681963..0000000000 --- a/import-layers/yocto-poky/meta/recipes-multimedia/libsamplerate/libsamplerate0_0.1.8.bb +++ /dev/null @@ -1,21 +0,0 @@ -SUMMARY = "Audio Sample Rate Conversion library" -HOMEPAGE = "http://www.mega-nerd.com/SRC/" -SECTION = "libs" -LICENSE = "GPLv2+" -LIC_FILES_CHKSUM = "file://COPYING;md5=94d55d512a9ba36caa9b7df079bae19f \ - file://src/samplerate.c;beginline=1;endline=17;md5=d0807c35fc906466d24a50463534815a" -DEPENDS = "flac libsndfile1" -PR = "r1" - -SRC_URI = "http://www.mega-nerd.com/SRC/libsamplerate-${PV}.tar.gz" - -SRC_URI[md5sum] = "1c7fb25191b4e6e3628d198a66a84f47" -SRC_URI[sha256sum] = "93b54bdf46d5e6d2354b7034395fe329c222a966790de34520702bb9642f1c06" - -UPSTREAM_CHECK_URI = "http://www.mega-nerd.com/SRC/download.html" - -S = "${WORKDIR}/libsamplerate-${PV}" - -inherit autotools pkgconfig - -PACKAGECONFIG[fftw] = ",--disable-fftw,fftw" diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/libsamplerate/libsamplerate0_0.1.9.bb b/import-layers/yocto-poky/meta/recipes-multimedia/libsamplerate/libsamplerate0_0.1.9.bb new file mode 100644 index 0000000000..ae08189441 --- /dev/null +++ b/import-layers/yocto-poky/meta/recipes-multimedia/libsamplerate/libsamplerate0_0.1.9.bb @@ -0,0 +1,28 @@ +SUMMARY = "Audio Sample Rate Conversion library" +HOMEPAGE = "http://www.mega-nerd.com/SRC/" +SECTION = "libs" +LICENSE = "BSD-2-Clause" +LIC_FILES_CHKSUM = "file://COPYING;md5=336d6faf40fb600bafb0061f4052f1f4 \ + file://src/samplerate.c;beginline=1;endline=7;md5=5b6982a8c2811c7312c13cccbf55f55e" +DEPENDS = "libsndfile1" +PR = "r1" + +SRC_URI = "http://www.mega-nerd.com/SRC/libsamplerate-${PV}.tar.gz \ + file://0001-configure.ac-improve-alsa-handling.patch \ +" + +SRC_URI[md5sum] = "2b78ae9fe63b36b9fbb6267fad93f259" +SRC_URI[sha256sum] = "0a7eb168e2f21353fb6d84da152e4512126f7dc48ccb0be80578c565413444c1" + +CVE_PRODUCT = "libsamplerate" + +UPSTREAM_CHECK_URI = "http://www.mega-nerd.com/SRC/download.html" + +S = "${WORKDIR}/libsamplerate-${PV}" + +inherit autotools pkgconfig + +# FFTW and ALSA are only used in tests and examples, so they don't affect +# normal builds. It should be safe to ignore these, but explicitly disabling +# them adds some extra certainty that builds are deterministic. +EXTRA_OECONF = "--disable-fftw --disable-alsa" diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/libsndfile/libsndfile1/CVE-2017-6892.patch b/import-layers/yocto-poky/meta/recipes-multimedia/libsndfile/libsndfile1/CVE-2017-6892.patch new file mode 100644 index 0000000000..89552ac2d9 --- /dev/null +++ b/import-layers/yocto-poky/meta/recipes-multimedia/libsndfile/libsndfile1/CVE-2017-6892.patch @@ -0,0 +1,34 @@ +From f833c53cb596e9e1792949f762e0b33661822748 Mon Sep 17 00:00:00 2001 +From: Erik de Castro Lopo <erikd@mega-nerd.com> +Date: Tue, 23 May 2017 20:15:24 +1000 +Subject: [PATCH] src/aiff.c: Fix a buffer read overflow + +Secunia Advisory SA76717. + +Found by: Laurent Delosieres, Secunia Research at Flexera Software + +CVE: CVE-2017-6892 +Upstream-Status: Backport + +Signed-off-by: Fan Xin <fan.xin@jp.fujitsu.com> + +--- + src/aiff.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/aiff.c b/src/aiff.c +index 5b5f9f5..45864b7 100644 +--- a/src/aiff.c ++++ b/src/aiff.c +@@ -1759,7 +1759,7 @@ aiff_read_chanmap (SF_PRIVATE * psf, unsigned dword) + psf_binheader_readf (psf, "j", dword - bytesread) ; + + if (map_info->channel_map != NULL) +- { size_t chanmap_size = psf->sf.channels * sizeof (psf->channel_map [0]) ; ++ { size_t chanmap_size = SF_MIN (psf->sf.channels, layout_tag & 0xffff) * sizeof (psf->channel_map [0]) ; + + free (psf->channel_map) ; + +-- +1.9.1 + diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/libsndfile/libsndfile1/CVE-2017-8361-8365.patch b/import-layers/yocto-poky/meta/recipes-multimedia/libsndfile/libsndfile1/CVE-2017-8361-8365.patch new file mode 100644 index 0000000000..ac99516bb3 --- /dev/null +++ b/import-layers/yocto-poky/meta/recipes-multimedia/libsndfile/libsndfile1/CVE-2017-8361-8365.patch @@ -0,0 +1,73 @@ +From fd0484aba8e51d16af1e3a880f9b8b857b385eb3 Mon Sep 17 00:00:00 2001 +From: Erik de Castro Lopo <erikd@mega-nerd.com> +Date: Wed, 12 Apr 2017 19:45:30 +1000 +Subject: [PATCH] FLAC: Fix a buffer read overrun + +Buffer read overrun occurs when reading a FLAC file that switches +from 2 channels to one channel mid-stream. Only option is to +abort the read. + +Closes: https://github.com/erikd/libsndfile/issues/230 + +CVE: CVE-2017-8361 CVE-2017-8365 + +Upstream-Status: Backport [https://github.com/erikd/libsndfile/commit/fd0484aba8e51d16af1e3a880f9b8b857b385eb3] + +Signed-off-by: Jackie Huang <jackie.huang@windriver.com> +--- + src/common.h | 1 + + src/flac.c | 13 +++++++++++++ + src/sndfile.c | 1 + + 3 files changed, 15 insertions(+) + +diff --git a/src/common.h b/src/common.h +index 0bd810c..e2669b6 100644 +--- a/src/common.h ++++ b/src/common.h +@@ -725,6 +725,7 @@ enum + SFE_FLAC_INIT_DECODER, + SFE_FLAC_LOST_SYNC, + SFE_FLAC_BAD_SAMPLE_RATE, ++ SFE_FLAC_CHANNEL_COUNT_CHANGED, + SFE_FLAC_UNKOWN_ERROR, + + SFE_WVE_NOT_WVE, +diff --git a/src/flac.c b/src/flac.c +index 84de0e2..986a7b8 100644 +--- a/src/flac.c ++++ b/src/flac.c +@@ -434,6 +434,19 @@ sf_flac_meta_callback (const FLAC__StreamDecoder * UNUSED (decoder), const FLAC_ + + switch (metadata->type) + { case FLAC__METADATA_TYPE_STREAMINFO : ++ if (psf->sf.channels > 0 && psf->sf.channels != (int) metadata->data.stream_info.channels) ++ { psf_log_printf (psf, "Error: FLAC stream changed from %d to %d channels\n" ++ "Nothing to be but to error out.\n" , ++ psf->sf.channels, metadata->data.stream_info.channels) ; ++ psf->error = SFE_FLAC_CHANNEL_COUNT_CHANGED ; ++ return ; ++ } ; ++ ++ if (psf->sf.channels > 0 && psf->sf.samplerate != (int) metadata->data.stream_info.sample_rate) ++ { psf_log_printf (psf, "Warning: FLAC stream changed sample rates from %d to %d.\n" ++ "Carrying on as if nothing happened.", ++ psf->sf.samplerate, metadata->data.stream_info.sample_rate) ; ++ } ; + psf->sf.channels = metadata->data.stream_info.channels ; + psf->sf.samplerate = metadata->data.stream_info.sample_rate ; + psf->sf.frames = metadata->data.stream_info.total_samples ; +diff --git a/src/sndfile.c b/src/sndfile.c +index 4187561..e2a87be 100644 +--- a/src/sndfile.c ++++ b/src/sndfile.c +@@ -245,6 +245,7 @@ ErrorStruct SndfileErrors [] = + { SFE_FLAC_INIT_DECODER , "Error : problem with initialization of the flac decoder." }, + { SFE_FLAC_LOST_SYNC , "Error : flac decoder lost sync." }, + { SFE_FLAC_BAD_SAMPLE_RATE, "Error : flac does not support this sample rate." }, ++ { SFE_FLAC_CHANNEL_COUNT_CHANGED, "Error : flac channel changed mid stream." }, + { SFE_FLAC_UNKOWN_ERROR , "Error : unknown error in flac decoder." }, + + { SFE_WVE_NOT_WVE , "Error : not a WVE file." }, +-- +2.7.4 + diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/libsndfile/libsndfile1/CVE-2017-8362.patch b/import-layers/yocto-poky/meta/recipes-multimedia/libsndfile/libsndfile1/CVE-2017-8362.patch new file mode 100644 index 0000000000..771ec92908 --- /dev/null +++ b/import-layers/yocto-poky/meta/recipes-multimedia/libsndfile/libsndfile1/CVE-2017-8362.patch @@ -0,0 +1,51 @@ +From ef1dbb2df1c0e741486646de40bd638a9c4cd808 Mon Sep 17 00:00:00 2001 +From: Erik de Castro Lopo <erikd@mega-nerd.com> +Date: Fri, 14 Apr 2017 15:19:16 +1000 +Subject: [PATCH] src/flac.c: Fix a buffer read overflow + +A file (generated by a fuzzer) which increased the number of channels +from one frame to the next could cause a read beyond the end of the +buffer provided by libFLAC. Only option is to abort the read. + +Closes: https://github.com/erikd/libsndfile/issues/231 + +CVE: CVE-2017-8362 + +Upstream-Status: Backport [https://github.com/erikd/libsndfile/commit/ef1dbb2df1c0e741486646de40bd638a9c4cd808] + +Signed-off-by: Jackie Huang <jackie.huang@windriver.com> + +removed hunk #2 as it was only cosmentic and caused a merge conflict. +signef-off-by: Armin Kuster <akuster808@gmail.com> +--- + src/flac.c | 11 +++++++++-- + 1 file changed, 9 insertions(+), 2 deletions(-) + +Index: libsndfile-1.0.27/src/flac.c +=================================================================== +--- libsndfile-1.0.27.orig/src/flac.c ++++ libsndfile-1.0.27/src/flac.c +@@ -169,6 +169,14 @@ flac_buffer_copy (SF_PRIVATE *psf) + const FLAC__int32* const *buffer = pflac->wbuffer ; + unsigned i = 0, j, offset ; + ++ if (psf->sf.channels != (int) frame->header.channels) ++ { psf_log_printf (psf, "Error: FLAC frame changed from %d to %d channels\n" ++ "Nothing to do but to error out.\n" , ++ psf->sf.channels, frame->header.channels) ; ++ psf->error = SFE_FLAC_CHANNEL_COUNT_CHANGED ; ++ return 0 ; ++ } ; ++ + /* + ** frame->header.blocksize is variable and we're using a constant blocksize + ** of FLAC__MAX_BLOCK_SIZE. +@@ -410,7 +418,7 @@ sf_flac_meta_callback (const FLAC__Strea + { case FLAC__METADATA_TYPE_STREAMINFO : + if (psf->sf.channels > 0 && psf->sf.channels != (int) metadata->data.stream_info.channels) + { psf_log_printf (psf, "Error: FLAC stream changed from %d to %d channels\n" +- "Nothing to be but to error out.\n" , ++ "Nothing to do but to error out.\n" , + psf->sf.channels, metadata->data.stream_info.channels) ; + psf->error = SFE_FLAC_CHANNEL_COUNT_CHANGED ; + return ; diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/libsndfile/libsndfile1/CVE-2017-8363.patch b/import-layers/yocto-poky/meta/recipes-multimedia/libsndfile/libsndfile1/CVE-2017-8363.patch new file mode 100644 index 0000000000..e526e5a346 --- /dev/null +++ b/import-layers/yocto-poky/meta/recipes-multimedia/libsndfile/libsndfile1/CVE-2017-8363.patch @@ -0,0 +1,37 @@ +From cd7da8dbf6ee4310d21d9e44b385d6797160d9e8 Mon Sep 17 00:00:00 2001 +From: Erik de Castro Lopo <erikd@mega-nerd.com> +Date: Wed, 12 Apr 2017 20:19:34 +1000 +Subject: [PATCH] src/flac.c: Fix another memory leak + +When the FLAC decoder was passed a malformed file, the associated +`FLAC__StreamDecoder` object was not getting released. + +Closes: https://github.com/erikd/libsndfile/issues/233 + +CVE: CVE-2017-8363 + +Upstream-Status: Backport [https://github.com/erikd/libsndfile/commit/cd7da8dbf6ee4310d21d9e44b385d6797160d9e8] + +Signed-off-by: Jackie Huang <jackie.huang@windriver.com> +--- + src/flac.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/src/flac.c b/src/flac.c +index 986a7b8..5a4f8c2 100644 +--- a/src/flac.c ++++ b/src/flac.c +@@ -841,7 +841,9 @@ flac_read_header (SF_PRIVATE *psf) + + psf_log_printf (psf, "End\n") ; + +- if (psf->error == 0) ++ if (psf->error != 0) ++ FLAC__stream_decoder_delete (pflac->fsd) ; ++ else + { FLAC__uint64 position ; + + FLAC__stream_decoder_get_decode_position (pflac->fsd, &position) ; +-- +2.7.4 + diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/libsndfile/libsndfile1_1.0.27.bb b/import-layers/yocto-poky/meta/recipes-multimedia/libsndfile/libsndfile1_1.0.27.bb index ec41719439..c6df4e9527 100644 --- a/import-layers/yocto-poky/meta/recipes-multimedia/libsndfile/libsndfile1_1.0.27.bb +++ b/import-layers/yocto-poky/meta/recipes-multimedia/libsndfile/libsndfile1_1.0.27.bb @@ -5,16 +5,23 @@ DEPENDS = "flac libogg libvorbis sqlite3" SECTION = "libs/multimedia" LICENSE = "LGPLv2.1" -SRC_URI = "http://www.mega-nerd.com/libsndfile/files/libsndfile-${PV}.tar.gz" +SRC_URI = "http://www.mega-nerd.com/libsndfile/files/libsndfile-${PV}.tar.gz \ + file://CVE-2017-6892.patch \ + file://CVE-2017-8361-8365.patch \ + file://CVE-2017-8362.patch \ + file://CVE-2017-8363.patch \ + " SRC_URI[md5sum] = "fd1d97c6077f03b5d984d7956ffedb7a" SRC_URI[sha256sum] = "a391952f27f4a92ceb2b4c06493ac107896ed6c76be9a613a4731f076d30fac0" LIC_FILES_CHKSUM = "file://COPYING;md5=e77fe93202736b47c07035910f47974a" +CVE_PRODUCT = "libsndfile" + S = "${WORKDIR}/libsndfile-${PV}" -PACKAGECONFIG ??= "${@bb.utils.contains('DISTRO_FEATURES', 'alsa', 'alsa', '', d)}" +PACKAGECONFIG ??= "${@bb.utils.filter('DISTRO_FEATURES', 'alsa', d)}" PACKAGECONFIG[alsa] = "--enable-alsa,--disable-alsa,alsa-lib" inherit autotools lib_package pkgconfig diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/libtiff/files/CVE-2016-10093.patch b/import-layers/yocto-poky/meta/recipes-multimedia/libtiff/files/CVE-2016-10093.patch new file mode 100644 index 0000000000..e09bb7fd21 --- /dev/null +++ b/import-layers/yocto-poky/meta/recipes-multimedia/libtiff/files/CVE-2016-10093.patch @@ -0,0 +1,47 @@ +From 787c0ee906430b772f33ca50b97b8b5ca070faec Mon Sep 17 00:00:00 2001 +From: erouault <erouault> +Date: Sat, 3 Dec 2016 16:40:01 +0000 +Subject: [PATCH] * tools/tiffcp.c: fix uint32 underflow/overflow that can + cause heap-based buffer overflow. Reported by Agostino Sarubbo. Fixes + http://bugzilla.maptools.org/show_bug.cgi?id=2610 + +Upstream-Status: Backport +CVE: CVE-2016-10093 +Signed-off-by: Rajkumar Veer <rveer@mvista.com> + +--- + ChangeLog | 7 +++++++ + tools/tiffcp.c | 6 +++--- + 2 files changed, 10 insertions(+), 3 deletions(-) + +Index: tiff-4.0.7/tools/tiffcp.c +=================================================================== +--- tiff-4.0.7.orig/tools/tiffcp.c ++++ tiff-4.0.7/tools/tiffcp.c +@@ -1163,7 +1163,7 @@ bad: + + static void + cpStripToTile(uint8* out, uint8* in, +- uint32 rows, uint32 cols, int outskew, int inskew) ++ uint32 rows, uint32 cols, int outskew, int64 inskew) + { + while (rows-- > 0) { + uint32 j = cols; +@@ -1320,7 +1320,7 @@ DECLAREreadFunc(readContigTilesIntoBuffe + tdata_t tilebuf; + uint32 imagew = TIFFScanlineSize(in); + uint32 tilew = TIFFTileRowSize(in); +- int iskew = imagew - tilew; ++ int64 iskew = (int64)imagew - (int64)tilew; + uint8* bufp = (uint8*) buf; + uint32 tw, tl; + uint32 row; +@@ -1348,7 +1348,7 @@ DECLAREreadFunc(readContigTilesIntoBuffe + status = 0; + goto done; + } +- if (colb + tilew > imagew) { ++ if (colb > iskew) { + uint32 width = imagew - colb; + uint32 oskew = tilew - width; + cpStripToTile(bufp + colb, diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/libtiff/files/CVE-2016-10266.patch b/import-layers/yocto-poky/meta/recipes-multimedia/libtiff/files/CVE-2016-10266.patch new file mode 100644 index 0000000000..e1c90c630c --- /dev/null +++ b/import-layers/yocto-poky/meta/recipes-multimedia/libtiff/files/CVE-2016-10266.patch @@ -0,0 +1,60 @@ +From 1855407c4e5a27ade006b26c2dec8a31745c356e Mon Sep 17 00:00:00 2001 +From: erouault <erouault> +Date: Fri, 2 Dec 2016 21:56:56 +0000 +Subject: [PATCH] * libtiff/tif_read.c, libtiff/tiffiop.h: fix uint32 overflow + in TIFFReadEncodedStrip() that caused an integer division by zero. Reported + by Agostino Sarubbo. Fixes http://bugzilla.maptools.org/show_bug.cgi?id=2596 + +Upstream-Status: Backport + +CVE: CVE-2016-10266 +Signed-off-by: Rajkumar Veer <rveer@mvista.com> +--- + ChangeLog | 7 +++++++ + libtiff/tif_read.c | 2 +- + libtiff/tiffiop.h | 4 ++++ + 3 files changed, 12 insertions(+), 1 deletion(-) + +Index: tiff-4.0.7/ChangeLog +=================================================================== +--- tiff-4.0.7.orig/ChangeLog ++++ tiff-4.0.7/ChangeLog +@@ -1,3 +1,10 @@ ++2016-12-02 Even Rouault <even.rouault at spatialys.com> ++ ++ * libtiff/tif_read.c, libtiff/tiffiop.h: fix uint32 overflow in ++ TIFFReadEncodedStrip() that caused an integer division by zero. ++ Reported by Agostino Sarubbo. ++ Fixes http://bugzilla.maptools.org/show_bug.cgi?id=2596 ++ + 2017-07-15 Even Rouault <even.rouault at spatialys.com> + + * tools/tiff2pdf.c: prevent heap buffer overflow write in "Raw" +Index: tiff-4.0.7/libtiff/tif_read.c +=================================================================== +--- tiff-4.0.7.orig/libtiff/tif_read.c ++++ tiff-4.0.7/libtiff/tif_read.c +@@ -346,7 +346,7 @@ TIFFReadEncodedStrip(TIFF* tif, uint32 s + rowsperstrip=td->td_rowsperstrip; + if (rowsperstrip>td->td_imagelength) + rowsperstrip=td->td_imagelength; +- stripsperplane=((td->td_imagelength+rowsperstrip-1)/rowsperstrip); ++ stripsperplane= TIFFhowmany_32_maxuint_compat(td->td_imagelength, rowsperstrip); + stripinplane=(strip%stripsperplane); + plane=(uint16)(strip/stripsperplane); + rows=td->td_imagelength-stripinplane*rowsperstrip; +Index: tiff-4.0.7/libtiff/tiffiop.h +=================================================================== +--- tiff-4.0.7.orig/libtiff/tiffiop.h ++++ tiff-4.0.7/libtiff/tiffiop.h +@@ -250,6 +250,10 @@ struct tiff { + #define TIFFhowmany_32(x, y) (((uint32)x < (0xffffffff - (uint32)(y-1))) ? \ + ((((uint32)(x))+(((uint32)(y))-1))/((uint32)(y))) : \ + 0U) ++/* Variant of TIFFhowmany_32() that doesn't return 0 if x close to MAXUINT. */ ++/* Caution: TIFFhowmany_32_maxuint_compat(x,y)*y might overflow */ ++#define TIFFhowmany_32_maxuint_compat(x, y) \ ++ (((uint32)(x) / (uint32)(y)) + ((((uint32)(x) % (uint32)(y)) != 0) ? 1 : 0)) + #define TIFFhowmany8_32(x) (((x)&0x07)?((uint32)(x)>>3)+1:(uint32)(x)>>3) + #define TIFFroundup_32(x, y) (TIFFhowmany_32(x,y)*(y)) + #define TIFFhowmany_64(x, y) ((((uint64)(x))+(((uint64)(y))-1))/((uint64)(y))) diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/libtiff/files/CVE-2016-10267.patch b/import-layers/yocto-poky/meta/recipes-multimedia/libtiff/files/CVE-2016-10267.patch new file mode 100644 index 0000000000..f4c57917d8 --- /dev/null +++ b/import-layers/yocto-poky/meta/recipes-multimedia/libtiff/files/CVE-2016-10267.patch @@ -0,0 +1,70 @@ +From f8203c7ab1dbd7b5c59158576bec7da90191f42f Mon Sep 17 00:00:00 2001 +From: erouault <erouault> +Date: Sat, 3 Dec 2016 11:15:18 +0000 +Subject: [PATCH] * libtiff/tif_ojpeg.c: make OJPEGDecode() early exit in case + of failure in OJPEGPreDecode(). This will avoid a divide by zero, and + potential other issues. Reported by Agostino Sarubbo. Fixes + http://bugzilla.maptools.org/show_bug.cgi?id=2611 + +Upstream-Status: Backport + +CVE: CVE-2016-10267 +Signed-off-by: Rajkumar Veer <rveer@mvista.com> +--- + ChangeLog | 7 +++++++ + libtiff/tif_ojpeg.c | 8 ++++++++ + 2 files changed, 15 insertions(+) + +diff --git a/ChangeLog b/ChangeLog +index 7339c1a..66fbcdc 100644 +--- a/ChangeLog ++++ b/ChangeLog +@@ -1,3 +1,10 @@ ++2016-12-03 Even Rouault <even.rouault at spatialys.com> ++ ++ * libtiff/tif_ojpeg.c: make OJPEGDecode() early exit in case of failure in ++ OJPEGPreDecode(). This will avoid a divide by zero, and potential other issues. ++ Reported by Agostino Sarubbo. ++ Fixes http://bugzilla.maptools.org/show_bug.cgi?id=2611 ++ + 2016-12-02 Even Rouault <even.rouault at spatialys.com> + + * libtiff/tif_read.c, libtiff/tiffiop.h: fix uint32 overflow in +diff --git a/libtiff/tif_ojpeg.c b/libtiff/tif_ojpeg.c +index 1ccc3f9..f19e8fd 100644 +--- a/libtiff/tif_ojpeg.c ++++ b/libtiff/tif_ojpeg.c +@@ -244,6 +244,7 @@ typedef enum { + + typedef struct { + TIFF* tif; ++ int decoder_ok; + #ifndef LIBJPEG_ENCAP_EXTERNAL + JMP_BUF exit_jmpbuf; + #endif +@@ -722,6 +723,7 @@ OJPEGPreDecode(TIFF* tif, uint16 s) + } + sp->write_curstrile++; + } ++ sp->decoder_ok = 1; + return(1); + } + +@@ -784,8 +786,14 @@ OJPEGPreDecodeSkipScanlines(TIFF* tif) + static int + OJPEGDecode(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s) + { ++ static const char module[]="OJPEGDecode"; + OJPEGState* sp=(OJPEGState*)tif->tif_data; + (void)s; ++ if( !sp->decoder_ok ) ++ { ++ TIFFErrorExt(tif->tif_clientdata,module,"Cannot decode: decoder not correctly initialized"); ++ return 0; ++ } + if (sp->libjpeg_jpeg_query_style==0) + { + if (OJPEGDecodeRaw(tif,buf,cc)==0) +-- +1.9.1 + diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/libtiff/files/CVE-2016-10268.patch b/import-layers/yocto-poky/meta/recipes-multimedia/libtiff/files/CVE-2016-10268.patch new file mode 100644 index 0000000000..03b982a1d9 --- /dev/null +++ b/import-layers/yocto-poky/meta/recipes-multimedia/libtiff/files/CVE-2016-10268.patch @@ -0,0 +1,30 @@ +From 5397a417e61258c69209904e652a1f409ec3b9df Mon Sep 17 00:00:00 2001 +From: erouault <erouault> +Date: Fri, 2 Dec 2016 22:13:32 +0000 +Subject: [PATCH] * tools/tiffcp.c: avoid uint32 underflow in cpDecodedStrips + that can cause various issues, such as buffer overflows in the library. + Reported by Agostino Sarubbo. Fixes + http://bugzilla.maptools.org/show_bug.cgi?id=2598 + +Upstream-Status: Backport +CVE: CVE-2016-10268 +Signed-off-by: Rajkumar Veer <rveer@mvista.com> + +--- + ChangeLog | 7 +++++++ + tools/tiffcp.c | 2 +- + 2 files changed, 8 insertions(+), 1 deletion(-) + +Index: tiff-4.0.7/tools/tiffcp.c +=================================================================== +--- tiff-4.0.7.orig/tools/tiffcp.c ++++ tiff-4.0.7/tools/tiffcp.c +@@ -985,7 +985,7 @@ DECLAREcpFunc(cpDecodedStrips) + tstrip_t s, ns = TIFFNumberOfStrips(in); + uint32 row = 0; + _TIFFmemset(buf, 0, stripsize); +- for (s = 0; s < ns; s++) { ++ for (s = 0; s < ns && row < imagelength; s++) { + tsize_t cc = (row + rowsperstrip > imagelength) ? + TIFFVStripSize(in, imagelength - row) : stripsize; + if (TIFFReadEncodedStrip(in, s, buf, cc) < 0 diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/libtiff/files/CVE-2016-10269.patch b/import-layers/yocto-poky/meta/recipes-multimedia/libtiff/files/CVE-2016-10269.patch new file mode 100644 index 0000000000..d9f4a15022 --- /dev/null +++ b/import-layers/yocto-poky/meta/recipes-multimedia/libtiff/files/CVE-2016-10269.patch @@ -0,0 +1,131 @@ +From 10f72dd232849d0142a0688bcc9aa71025f120a3 Mon Sep 17 00:00:00 2001 +From: erouault <erouault> +Date: Fri, 2 Dec 2016 23:05:51 +0000 +Subject: [PATCH 2/4] * libtiff/tif_pixarlog.c, libtiff/tif_luv.c: fix + heap-based buffer overflow on generation of PixarLog / LUV compressed files, + with ColorMap, TransferFunction attached and nasty plays with bitspersample. + The fix for LUV has not been tested, but suffers from the same kind of issue + of PixarLog. Reported by Agostino Sarubbo. Fixes + http://bugzilla.maptools.org/show_bug.cgi?id=2604 + +Upstream-Status: Backport + +CVE: CVE-2016-10269 +Signed-off-by: Rajkumar Veer <rveer@mvista.com> +--- + ChangeLog | 10 ++++++++++ + libtiff/tif_luv.c | 18 ++++++++++++++---- + libtiff/tif_pixarlog.c | 17 +++++++++++++++-- + 3 files changed, 39 insertions(+), 6 deletions(-) + +diff --git a/ChangeLog b/ChangeLog +index 2e913b6..0a2c2a7 100644 +--- a/ChangeLog ++++ b/ChangeLog +@@ -1,4 +1,14 @@ + 2016-12-03 Even Rouault <even.rouault at spatialys.com> ++ ++ * libtiff/tif_pixarlog.c, libtiff/tif_luv.c: fix heap-based buffer ++ overflow on generation of PixarLog / LUV compressed files, with ++ ColorMap, TransferFunction attached and nasty plays with bitspersample. ++ The fix for LUV has not been tested, but suffers from the same kind ++ of issue of PixarLog. ++ Reported by Agostino Sarubbo. ++ Fixes http://bugzilla.maptools.org/show_bug.cgi?id=2604 ++ ++2016-12-03 Even Rouault <even.rouault at spatialys.com> + + * libtiff/tif_ojpeg.c: make OJPEGDecode() early exit in case of failure in + OJPEGPreDecode(). This will avoid a divide by zero, and potential other issues. +diff --git a/libtiff/tif_luv.c b/libtiff/tif_luv.c +index f68a9b1..e6783db 100644 +--- a/libtiff/tif_luv.c ++++ b/libtiff/tif_luv.c +@@ -158,6 +158,7 @@ + typedef struct logLuvState LogLuvState; + + struct logLuvState { ++ int encoder_state; /* 1 if encoder correctly initialized */ + int user_datafmt; /* user data format */ + int encode_meth; /* encoding method */ + int pixel_size; /* bytes per pixel */ +@@ -1552,6 +1553,7 @@ LogLuvSetupEncode(TIFF* tif) + td->td_photometric, "must be either LogLUV or LogL"); + break; + } ++ sp->encoder_state = 1; + return (1); + notsupported: + TIFFErrorExt(tif->tif_clientdata, module, +@@ -1563,19 +1565,27 @@ notsupported: + static void + LogLuvClose(TIFF* tif) + { ++ LogLuvState* sp = (LogLuvState*) tif->tif_data; + TIFFDirectory *td = &tif->tif_dir; + ++ assert(sp != 0); + /* + * For consistency, we always want to write out the same + * bitspersample and sampleformat for our TIFF file, + * regardless of the data format being used by the application. + * Since this routine is called after tags have been set but + * before they have been recorded in the file, we reset them here. ++ * Note: this is really a nasty approach. See PixarLogClose + */ +- td->td_samplesperpixel = +- (td->td_photometric == PHOTOMETRIC_LOGL) ? 1 : 3; +- td->td_bitspersample = 16; +- td->td_sampleformat = SAMPLEFORMAT_INT; ++ if( sp->encoder_state ) ++ { ++ /* See PixarLogClose. Might avoid issues with tags whose size depends ++ * on those below, but not completely sure this is enough. */ ++ td->td_samplesperpixel = ++ (td->td_photometric == PHOTOMETRIC_LOGL) ? 1 : 3; ++ td->td_bitspersample = 16; ++ td->td_sampleformat = SAMPLEFORMAT_INT; ++ } + } + + static void +diff --git a/libtiff/tif_pixarlog.c b/libtiff/tif_pixarlog.c +index d1246c3..aa99bc9 100644 +--- a/libtiff/tif_pixarlog.c ++++ b/libtiff/tif_pixarlog.c +@@ -1233,8 +1233,10 @@ PixarLogPostEncode(TIFF* tif) + static void + PixarLogClose(TIFF* tif) + { ++ PixarLogState* sp = (PixarLogState*) tif->tif_data; + TIFFDirectory *td = &tif->tif_dir; + ++ assert(sp != 0); + /* In a really sneaky (and really incorrect, and untruthful, and + * troublesome, and error-prone) maneuver that completely goes against + * the spirit of TIFF, and breaks TIFF, on close, we covertly +@@ -1243,8 +1245,19 @@ PixarLogClose(TIFF* tif) + * readers that don't know about PixarLog, or how to set + * the PIXARLOGDATFMT pseudo-tag. + */ +- td->td_bitspersample = 8; +- td->td_sampleformat = SAMPLEFORMAT_UINT; ++ ++ if (sp->state&PLSTATE_INIT) { ++ /* We test the state to avoid an issue such as in ++ * http://bugzilla.maptools.org/show_bug.cgi?id=2604 ++ * What appends in that case is that the bitspersample is 1 and ++ * a TransferFunction is set. The size of the TransferFunction ++ * depends on 1<<bitspersample. So if we increase it, an access ++ * out of the buffer will happen at directory flushing. ++ * Another option would be to clear those targs. ++ */ ++ td->td_bitspersample = 8; ++ td->td_sampleformat = SAMPLEFORMAT_UINT; ++ } + } + + static void +-- +1.9.1 + diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/libtiff/files/CVE-2016-10270.patch b/import-layers/yocto-poky/meta/recipes-multimedia/libtiff/files/CVE-2016-10270.patch new file mode 100644 index 0000000000..43ad6eda9f --- /dev/null +++ b/import-layers/yocto-poky/meta/recipes-multimedia/libtiff/files/CVE-2016-10270.patch @@ -0,0 +1,134 @@ +From 6e7042c61e300cf9971c645c79d05de974b24308 Mon Sep 17 00:00:00 2001 +From: erouault <erouault> +Date: Sat, 3 Dec 2016 11:02:15 +0000 +Subject: [PATCH 3/4] * libtiff/tif_dirread.c: modify + ChopUpSingleUncompressedStrip() to instanciate compute ntrips as + TIFFhowmany_32(td->td_imagelength, rowsperstrip), instead of a logic based on + the total size of data. Which is faulty is the total size of data is not + sufficient to fill the whole image, and thus results in reading outside of + the StripByCounts/StripOffsets arrays when using TIFFReadScanline(). Reported + by Agostino Sarubbo. Fixes http://bugzilla.maptools.org/show_bug.cgi?id=2608. + +* libtiff/tif_strip.c: revert the change in TIFFNumberOfStrips() done +for http://bugzilla.maptools.org/show_bug.cgi?id=2587 / CVE-2016-9273 since +the above change is a better fix that makes it unnecessary. + +Upstream-Status: Backport + +CVE: CVE-2016-10270 +Signed-off-by: Rajkumar Veer <rveer@mvista.com> +--- + ChangeLog | 15 +++++++++++++++ + libtiff/tif_dirread.c | 22 ++++++++++------------ + libtiff/tif_strip.c | 9 --------- + 3 files changed, 25 insertions(+), 21 deletions(-) + +diff --git a/ChangeLog b/ChangeLog +index 0a2c2a7..6e30e41 100644 +--- a/ChangeLog ++++ b/ChangeLog +@@ -1,5 +1,20 @@ + 2016-12-03 Even Rouault <even.rouault at spatialys.com> + ++ * libtiff/tif_dirread.c: modify ChopUpSingleUncompressedStrip() to ++ instanciate compute ntrips as TIFFhowmany_32(td->td_imagelength, rowsperstrip), ++ instead of a logic based on the total size of data. Which is faulty is ++ the total size of data is not sufficient to fill the whole image, and thus ++ results in reading outside of the StripByCounts/StripOffsets arrays when ++ using TIFFReadScanline(). ++ Reported by Agostino Sarubbo. ++ Fixes http://bugzilla.maptools.org/show_bug.cgi?id=2608. ++ ++ * libtiff/tif_strip.c: revert the change in TIFFNumberOfStrips() done ++ for http://bugzilla.maptools.org/show_bug.cgi?id=2587 / CVE-2016-9273 since ++ the above change is a better fix that makes it unnecessary. ++ ++2016-12-03 Even Rouault <even.rouault at spatialys.com> ++ + * libtiff/tif_pixarlog.c, libtiff/tif_luv.c: fix heap-based buffer + overflow on generation of PixarLog / LUV compressed files, with + ColorMap, TransferFunction attached and nasty plays with bitspersample. +diff --git a/libtiff/tif_dirread.c b/libtiff/tif_dirread.c +index 3eec79c..570d0c3 100644 +--- a/libtiff/tif_dirread.c ++++ b/libtiff/tif_dirread.c +@@ -5502,8 +5502,7 @@ ChopUpSingleUncompressedStrip(TIFF* tif) + uint64 rowblockbytes; + uint64 stripbytes; + uint32 strip; +- uint64 nstrips64; +- uint32 nstrips32; ++ uint32 nstrips; + uint32 rowsperstrip; + uint64* newcounts; + uint64* newoffsets; +@@ -5534,18 +5533,17 @@ ChopUpSingleUncompressedStrip(TIFF* tif) + return; + + /* +- * never increase the number of strips in an image ++ * never increase the number of rows per strip + */ + if (rowsperstrip >= td->td_rowsperstrip) + return; +- nstrips64 = TIFFhowmany_64(bytecount, stripbytes); +- if ((nstrips64==0)||(nstrips64>0xFFFFFFFF)) /* something is wonky, do nothing. */ +- return; +- nstrips32 = (uint32)nstrips64; ++ nstrips = TIFFhowmany_32(td->td_imagelength, rowsperstrip); ++ if( nstrips == 0 ) ++ return; + +- newcounts = (uint64*) _TIFFCheckMalloc(tif, nstrips32, sizeof (uint64), ++ newcounts = (uint64*) _TIFFCheckMalloc(tif, nstrips, sizeof (uint64), + "for chopped \"StripByteCounts\" array"); +- newoffsets = (uint64*) _TIFFCheckMalloc(tif, nstrips32, sizeof (uint64), ++ newoffsets = (uint64*) _TIFFCheckMalloc(tif, nstrips, sizeof (uint64), + "for chopped \"StripOffsets\" array"); + if (newcounts == NULL || newoffsets == NULL) { + /* +@@ -5562,18 +5560,18 @@ ChopUpSingleUncompressedStrip(TIFF* tif) + * Fill the strip information arrays with new bytecounts and offsets + * that reflect the broken-up format. + */ +- for (strip = 0; strip < nstrips32; strip++) { ++ for (strip = 0; strip < nstrips; strip++) { + if (stripbytes > bytecount) + stripbytes = bytecount; + newcounts[strip] = stripbytes; +- newoffsets[strip] = offset; ++ newoffsets[strip] = stripbytes ? offset : 0; + offset += stripbytes; + bytecount -= stripbytes; + } + /* + * Replace old single strip info with multi-strip info. + */ +- td->td_stripsperimage = td->td_nstrips = nstrips32; ++ td->td_stripsperimage = td->td_nstrips = nstrips; + TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP, rowsperstrip); + + _TIFFfree(td->td_stripbytecount); +diff --git a/libtiff/tif_strip.c b/libtiff/tif_strip.c +index 4c46ecf..1676e47 100644 +--- a/libtiff/tif_strip.c ++++ b/libtiff/tif_strip.c +@@ -63,15 +63,6 @@ TIFFNumberOfStrips(TIFF* tif) + TIFFDirectory *td = &tif->tif_dir; + uint32 nstrips; + +- /* If the value was already computed and store in td_nstrips, then return it, +- since ChopUpSingleUncompressedStrip might have altered and resized the +- since the td_stripbytecount and td_stripoffset arrays to the new value +- after the initial affectation of td_nstrips = TIFFNumberOfStrips() in +- tif_dirread.c ~line 3612. +- See http://bugzilla.maptools.org/show_bug.cgi?id=2587 */ +- if( td->td_nstrips ) +- return td->td_nstrips; +- + nstrips = (td->td_rowsperstrip == (uint32) -1 ? 1 : + TIFFhowmany_32(td->td_imagelength, td->td_rowsperstrip)); + if (td->td_planarconfig == PLANARCONFIG_SEPARATE) +-- +1.9.1 + diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/libtiff/files/CVE-2016-10271.patch b/import-layers/yocto-poky/meta/recipes-multimedia/libtiff/files/CVE-2016-10271.patch new file mode 100644 index 0000000000..4fe5bcd6c7 --- /dev/null +++ b/import-layers/yocto-poky/meta/recipes-multimedia/libtiff/files/CVE-2016-10271.patch @@ -0,0 +1,30 @@ +From 9657bbe3cdce4aaa90e07d50c1c70ae52da0ba6a Mon Sep 17 00:00:00 2001 +From: erouault <erouault> +Date: Sat, 3 Dec 2016 11:35:56 +0000 +Subject: [PATCH] * tools/tiffcrop.c: fix readContigStripsIntoBuffer() in -i + (ignore) mode so that the output buffer is correctly incremented to avoid + write outside bounds. Reported by Agostino Sarubbo. Fixes + http://bugzilla.maptools.org/show_bug.cgi?id=2620 + +Upstream-Status: Backport +CVE: CVE-2016-10271 +Signed-off-by: Rajkumar Veer <rveer@mvista.com> + +--- + ChangeLog | 7 +++++++ + tools/tiffcrop.c | 2 +- + 2 files changed, 8 insertions(+), 1 deletion(-) + +Index: tiff-4.0.7/tools/tiffcrop.c +=================================================================== +--- tiff-4.0.7.orig/tools/tiffcrop.c ++++ tiff-4.0.7/tools/tiffcrop.c +@@ -3698,7 +3698,7 @@ static int readContigStripsIntoBuffer (T + (unsigned long) strip, (unsigned long)rows); + return 0; + } +- bufp += bytes_read; ++ bufp += stripsize; + } + + return 1; diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/libtiff/files/CVE-2017-10688.patch b/import-layers/yocto-poky/meta/recipes-multimedia/libtiff/files/CVE-2017-10688.patch new file mode 100644 index 0000000000..ed9c0f50f9 --- /dev/null +++ b/import-layers/yocto-poky/meta/recipes-multimedia/libtiff/files/CVE-2017-10688.patch @@ -0,0 +1,88 @@ +From 333ba5599e87bd7747516d7863d61764e4ca2d92 Mon Sep 17 00:00:00 2001 +From: Even Rouault <even.rouault@spatialys.com> +Date: Fri, 30 Jun 2017 17:29:44 +0000 +Subject: [PATCH] * libtiff/tif_dirwrite.c: in + TIFFWriteDirectoryTagCheckedXXXX() functions associated with LONG8/SLONG8 + data type, replace assertion that the file is BigTIFF, by a non-fatal error. + Fixes http://bugzilla.maptools.org/show_bug.cgi?id=2712 Reported by team + OWL337 + +Upstream-Status: Backport +[https://github.com/vadz/libtiff/commit/6173a57d39e04d68b139f8c1aa499a24dbe74ba1] + +CVE: CVE-2017-10688 + +Signed-off-by: Yi Zhao <yi.zhao@windriver.com> +--- + ChangeLog | 8 ++++++++ + libtiff/tif_dirwrite.c | 20 ++++++++++++++++---- + 2 files changed, 24 insertions(+), 4 deletions(-) + +Index: tiff-4.0.7/ChangeLog +=================================================================== +--- tiff-4.0.7.orig/ChangeLog ++++ tiff-4.0.7/ChangeLog +@@ -1,3 +1,11 @@ ++2017-06-30 Even Rouault <even.rouault at spatialys.com> ++ ++ * libtiff/tif_dirwrite.c: in TIFFWriteDirectoryTagCheckedXXXX() ++ functions associated with LONG8/SLONG8 data type, replace assertion that ++ the file is BigTIFF, by a non-fatal error. ++ Fixes http://bugzilla.maptools.org/show_bug.cgi?id=2712 ++ Reported by team OWL337 ++ + 2017-06-26 Even Rouault <even.rouault at spatialys.com> + + * libtiff/tif_jbig.c: fix memory leak in error code path of JBIGDecode() +Index: tiff-4.0.7/libtiff/tif_dirwrite.c +=================================================================== +--- tiff-4.0.7.orig/libtiff/tif_dirwrite.c ++++ tiff-4.0.7/libtiff/tif_dirwrite.c +@@ -2047,7 +2047,10 @@ TIFFWriteDirectoryTagCheckedLong8(TIFF* + { + uint64 m; + assert(sizeof(uint64)==8); +- assert(tif->tif_flags&TIFF_BIGTIFF); ++ if( !(tif->tif_flags&TIFF_BIGTIFF) ) { ++ TIFFErrorExt(tif->tif_clientdata,"TIFFWriteDirectoryTagCheckedLong8","LONG8 not allowed for ClassicTIFF"); ++ return(0); ++ } + m=value; + if (tif->tif_flags&TIFF_SWAB) + TIFFSwabLong8(&m); +@@ -2060,7 +2063,10 @@ TIFFWriteDirectoryTagCheckedLong8Array(T + { + assert(count<0x20000000); + assert(sizeof(uint64)==8); +- assert(tif->tif_flags&TIFF_BIGTIFF); ++ if( !(tif->tif_flags&TIFF_BIGTIFF) ) { ++ TIFFErrorExt(tif->tif_clientdata,"TIFFWriteDirectoryTagCheckedLong8","LONG8 not allowed for ClassicTIFF"); ++ return(0); ++ } + if (tif->tif_flags&TIFF_SWAB) + TIFFSwabArrayOfLong8(value,count); + return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_LONG8,count,count*8,value)); +@@ -2072,7 +2078,10 @@ TIFFWriteDirectoryTagCheckedSlong8(TIFF* + { + int64 m; + assert(sizeof(int64)==8); +- assert(tif->tif_flags&TIFF_BIGTIFF); ++ if( !(tif->tif_flags&TIFF_BIGTIFF) ) { ++ TIFFErrorExt(tif->tif_clientdata,"TIFFWriteDirectoryTagCheckedLong8","SLONG8 not allowed for ClassicTIFF"); ++ return(0); ++ } + m=value; + if (tif->tif_flags&TIFF_SWAB) + TIFFSwabLong8((uint64*)(&m)); +@@ -2085,7 +2094,10 @@ TIFFWriteDirectoryTagCheckedSlong8Array( + { + assert(count<0x20000000); + assert(sizeof(int64)==8); +- assert(tif->tif_flags&TIFF_BIGTIFF); ++ if( !(tif->tif_flags&TIFF_BIGTIFF) ) { ++ TIFFErrorExt(tif->tif_clientdata,"TIFFWriteDirectoryTagCheckedLong8","SLONG8 not allowed for ClassicTIFF"); ++ return(0); ++ } + if (tif->tif_flags&TIFF_SWAB) + TIFFSwabArrayOfLong8((uint64*)value,count); + return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_SLONG8,count,count*8,value)); diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/libtiff/files/CVE-2017-11335.patch b/import-layers/yocto-poky/meta/recipes-multimedia/libtiff/files/CVE-2017-11335.patch new file mode 100644 index 0000000000..d08e7612b7 --- /dev/null +++ b/import-layers/yocto-poky/meta/recipes-multimedia/libtiff/files/CVE-2017-11335.patch @@ -0,0 +1,54 @@ +From e8b15ccf8c9c593000f8202cf34cc6c4b936d01e Mon Sep 17 00:00:00 2001 +From: Even Rouault <even.rouault@spatialys.com> +Date: Sat, 15 Jul 2017 11:13:46 +0000 +Subject: [PATCH] * tools/tiff2pdf.c: prevent heap buffer overflow write in + "Raw" mode on PlanarConfig=Contig input images. Fixes + http://bugzilla.maptools.org/show_bug.cgi?id=2715 Reported by team OWL337 + +Upstream-Status: Backport +[https://github.com/vadz/libtiff/commit/69bfeec247899776b1b396651adb47436e5f1556] + +CVE: CVE-2017-11355 + +Signed-off-by: Yi Zhao <yi.zhao@windriver.com> +--- + ChangeLog | 7 +++++++ + tools/tiff2pdf.c | 7 ++++++- + 2 files changed, 13 insertions(+), 1 deletion(-) + +diff --git a/ChangeLog b/ChangeLog +index 42eaeb7..6980da8 100644 +--- a/ChangeLog ++++ b/ChangeLog +@@ -1,3 +1,10 @@ ++2017-07-15 Even Rouault <even.rouault at spatialys.com> ++ ++ * tools/tiff2pdf.c: prevent heap buffer overflow write in "Raw" ++ mode on PlanarConfig=Contig input images. ++ Fixes http://bugzilla.maptools.org/show_bug.cgi?id=2715 ++ Reported by team OWL337 ++ + 2017-06-30 Even Rouault <even.rouault at spatialys.com> + + * libtiff/tif_dirwrite.c: in TIFFWriteDirectoryTagCheckedXXXX() +diff --git a/tools/tiff2pdf.c b/tools/tiff2pdf.c +index db196e0..cd1e235 100644 +--- a/tools/tiff2pdf.c ++++ b/tools/tiff2pdf.c +@@ -1737,7 +1737,12 @@ void t2p_read_tiff_data(T2P* t2p, TIFF* input){ + return; + + t2p->pdf_transcode = T2P_TRANSCODE_ENCODE; +- if(t2p->pdf_nopassthrough==0){ ++ /* It seems that T2P_TRANSCODE_RAW mode doesn't support separate->contig */ ++ /* conversion. At least t2p_read_tiff_size and t2p_read_tiff_size_tile */ ++ /* do not take into account the number of samples, and thus */ ++ /* that can cause heap buffer overflows such as in */ ++ /* http://bugzilla.maptools.org/show_bug.cgi?id=2715 */ ++ if(t2p->pdf_nopassthrough==0 && t2p->tiff_planar!=PLANARCONFIG_SEPARATE){ + #ifdef CCITT_SUPPORT + if(t2p->tiff_compression==COMPRESSION_CCITTFAX4 + ){ +-- +2.7.4 + diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/libtiff/files/CVE-2017-7592.patch b/import-layers/yocto-poky/meta/recipes-multimedia/libtiff/files/CVE-2017-7592.patch new file mode 100644 index 0000000000..5b80445f31 --- /dev/null +++ b/import-layers/yocto-poky/meta/recipes-multimedia/libtiff/files/CVE-2017-7592.patch @@ -0,0 +1,40 @@ +From 48780b4fcc425cddc4ef8ffdf536f96a0d1b313b Mon Sep 17 00:00:00 2001 +From: erouault <erouault> +Date: Wed, 11 Jan 2017 16:38:26 +0000 +Subject: [PATCH] * libtiff/tif_getimage.c: add explicit uint32 cast in putagreytile to +avoid UndefinedBehaviorSanitizer warning. +Patch by Nicolas Pena. +Fixes http://bugzilla.maptools.org/show_bug.cgi?id=2658 + +Upstream-Status: Backport +CVE: CVE-2017-7592 +Signed-off-by: Rajkumar Veer <rveer@mvista.com> + +Index: tiff-4.0.7/ChangeLog +=================================================================== +--- tiff-4.0.7.orig/ChangeLog 2017-04-24 14:25:10.143926025 +0530 ++++ tiff-4.0.7/ChangeLog 2017-04-24 15:20:21.291839230 +0530 +@@ -1,3 +1,10 @@ ++2017-01-11 Even Rouault <even.rouault at spatialys.com> ++ ++ * libtiff/tif_getimage.c: add explicit uint32 cast in putagreytile to ++ avoid UndefinedBehaviorSanitizer warning. ++ Patch by Nicolas Pena. ++ Fixes http://bugzilla.maptools.org/show_bug.cgi?id=2658 ++ + 2016-12-03 Even Rouault <even.rouault at spatialys.com> + + * libtiff/tif_dirread.c: modify ChopUpSingleUncompressedStrip() to +Index: tiff-4.0.7/libtiff/tif_getimage.c +=================================================================== +--- tiff-4.0.7.orig/libtiff/tif_getimage.c 2016-11-18 08:17:45.000000000 +0530 ++++ tiff-4.0.7/libtiff/tif_getimage.c 2017-04-24 15:17:46.671843283 +0530 +@@ -1305,7 +1305,7 @@ + while (h-- > 0) { + for (x = w; x-- > 0;) + { +- *cp++ = BWmap[*pp][0] & (*(pp+1) << 24 | ~A1); ++ *cp++ = BWmap[*pp][0] & ((uint32)*(pp+1) << 24 | ~A1); + pp += samplesperpixel; + } + cp += toskew; diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/libtiff/files/CVE-2017-7593.patch b/import-layers/yocto-poky/meta/recipes-multimedia/libtiff/files/CVE-2017-7593.patch new file mode 100644 index 0000000000..380dfcbbba --- /dev/null +++ b/import-layers/yocto-poky/meta/recipes-multimedia/libtiff/files/CVE-2017-7593.patch @@ -0,0 +1,98 @@ +From d60332057b9575ada4f264489582b13e30137be1 Mon Sep 17 00:00:00 2001 +From: erouault <erouault> +Date: Wed, 11 Jan 2017 19:02:49 +0000 +Subject: [PATCH] * libtiff/tiffiop.h, tif_unix.c, tif_win32.c, tif_vms.c: add + _TIFFcalloc() + +* libtiff/tif_read.c: TIFFReadBufferSetup(): use _TIFFcalloc() to zero +initialize tif_rawdata. +Fixes http://bugzilla.maptools.org/show_bug.cgi?id=2651 + +Upstream-Status: Backport + +CVE: CVE-2017-7593 +Signed-off-by: Rajkumar Veer <rveer@mvista.com> +Index: tiff-4.0.7/ChangeLog +=================================================================== +--- tiff-4.0.7.orig/ChangeLog 2017-04-25 19:03:20.584155452 +0530 ++++ tiff-4.0.7/ChangeLog 2017-04-26 12:09:41.986866896 +0530 +@@ -44,6 +44,14 @@ + + 2017-01-11 Even Rouault <even.rouault at spatialys.com> + ++ * libtiff/tiffiop.h, tif_unix.c, tif_win32.c : add _TIFFcalloc() ++ ++ * libtiff/tif_read.c: TIFFReadBufferSetup(): use _TIFFcalloc() to zero ++ initialize tif_rawdata. ++ Fixes http://bugzilla.maptools.org/show_bug.cgi?id=2651 ++ ++2017-01-11 Even Rouault <even.rouault at spatialys.com> ++ + * libtiff/tif_getimage.c: add explicit uint32 cast in putagreytile to + avoid UndefinedBehaviorSanitizer warning. + Patch by Nicolas Pena. +Index: tiff-4.0.7/libtiff/tif_read.c +=================================================================== +--- tiff-4.0.7.orig/libtiff/tif_read.c 2017-04-25 19:03:20.584155452 +0530 ++++ tiff-4.0.7/libtiff/tif_read.c 2017-04-26 12:11:42.814863729 +0530 +@@ -986,7 +986,9 @@ + "Invalid buffer size"); + return (0); + } +- tif->tif_rawdata = (uint8*) _TIFFmalloc(tif->tif_rawdatasize); ++ /* Initialize to zero to avoid uninitialized buffers in case of */ ++ /* short reads (http://bugzilla.maptools.org/show_bug.cgi?id=2651) */ ++ tif->tif_rawdata = (uint8*) _TIFFcalloc(1, tif->tif_rawdatasize); + tif->tif_flags |= TIFF_MYBUFFER; + } + if (tif->tif_rawdata == NULL) { +Index: tiff-4.0.7/libtiff/tif_unix.c +=================================================================== +--- tiff-4.0.7.orig/libtiff/tif_unix.c 2015-08-29 03:46:22.707817041 +0530 ++++ tiff-4.0.7/libtiff/tif_unix.c 2017-04-26 12:13:07.442861510 +0530 +@@ -316,6 +316,14 @@ + return (malloc((size_t) s)); + } + ++void* _TIFFcalloc(tmsize_t nmemb, tmsize_t siz) ++{ ++ if( nmemb == 0 || siz == 0 ) ++ return ((void *) NULL); ++ ++ return calloc((size_t) nmemb, (size_t)siz); ++} ++ + void + _TIFFfree(void* p) + { +Index: tiff-4.0.7/libtiff/tif_win32.c +=================================================================== +--- tiff-4.0.7.orig/libtiff/tif_win32.c 2015-08-29 03:46:22.730570169 +0530 ++++ tiff-4.0.7/libtiff/tif_win32.c 2017-04-26 12:14:12.918859794 +0530 +@@ -360,6 +360,14 @@ + return (malloc((size_t) s)); + } + ++void* _TIFFcalloc(tmsize_t nmemb, tmsize_t siz) ++{ ++ if( nmemb == 0 || siz == 0 ) ++ return ((void *) NULL); ++ ++ return calloc((size_t) nmemb, (size_t)siz); ++} ++ + void + _TIFFfree(void* p) + { +Index: tiff-4.0.7/libtiff/tiffio.h +=================================================================== +--- tiff-4.0.7.orig/libtiff/tiffio.h 2016-01-24 21:09:51.894442042 +0530 ++++ tiff-4.0.7/libtiff/tiffio.h 2017-04-26 12:15:55.034857117 +0530 +@@ -293,6 +293,7 @@ + */ + + extern void* _TIFFmalloc(tmsize_t s); ++extern void* _TIFFcalloc(tmsize_t nmemb, tmsize_t siz); + extern void* _TIFFrealloc(void* p, tmsize_t s); + extern void _TIFFmemset(void* p, int v, tmsize_t c); + extern void _TIFFmemcpy(void* d, const void* s, tmsize_t c); diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/libtiff/files/CVE-2017-7594-p1.patch b/import-layers/yocto-poky/meta/recipes-multimedia/libtiff/files/CVE-2017-7594-p1.patch new file mode 100644 index 0000000000..5c7e4603cc --- /dev/null +++ b/import-layers/yocto-poky/meta/recipes-multimedia/libtiff/files/CVE-2017-7594-p1.patch @@ -0,0 +1,43 @@ +rom 8283e4d1b7e53340684d12932880cbcbaf23a8c1 Mon Sep 17 00:00:00 2001 +From: erouault <erouault> +Date: Thu, 12 Jan 2017 17:43:25 +0000 + +* libtiff/tif_ojpeg.c: fix leak in OJPEGReadHeaderInfoSecTablesAcTable + when read fails. + Patch by Nicolas Pena. + Fixes http://bugzilla.maptools.org/show_bug.cgi?id=2659 + +Upstream-Status: Backport + +CVE: CVE-2017-7594 #patch1 +Signed-off-by: Rajkumar Veer <rveer@mvista.com> +Index: tiff-4.0.7/ChangeLog +=================================================================== +--- tiff-4.0.7.orig/ChangeLog 2017-04-24 16:13:15.000000000 +0530 ++++ tiff-4.0.7/ChangeLog 2017-04-24 16:50:26.465897646 +0530 +@@ -1,3 +1,10 @@ ++2017-01-12 Even Rouault <even.rouault at spatialys.com> ++ ++ * libtiff/tif_ojpeg.c: fix leak in OJPEGReadHeaderInfoSecTablesAcTable ++ when read fails. ++ Patch by Nicolás Peña. ++ Fixes http://bugzilla.maptools.org/show_bug.cgi?id=2659 ++ + 2017-01-11 Even Rouault <even.rouault at spatialys.com> + + * libtiff/tif_getimage.c: add explicit uint32 cast in putagreytile to +Index: tiff-4.0.7/libtiff/tif_ojpeg.c +=================================================================== +--- tiff-4.0.7.orig/libtiff/tif_ojpeg.c 2017-04-24 16:02:29.817973051 +0530 ++++ tiff-4.0.7/libtiff/tif_ojpeg.c 2017-04-24 16:52:27.349894477 +0530 +@@ -1918,7 +1918,10 @@ + rb[sizeof(uint32)+5+n]=o[n]; + p=(uint32)TIFFReadFile(tif,&(rb[sizeof(uint32)+21]),q); + if (p!=q) ++ { ++ _TIFFfree(rb); + return(0); ++ } + sp->actable[m]=rb; + sp->sos_tda[m]=(sp->sos_tda[m]|m); + } diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/libtiff/files/CVE-2017-7594-p2.patch b/import-layers/yocto-poky/meta/recipes-multimedia/libtiff/files/CVE-2017-7594-p2.patch new file mode 100644 index 0000000000..82a19c6810 --- /dev/null +++ b/import-layers/yocto-poky/meta/recipes-multimedia/libtiff/files/CVE-2017-7594-p2.patch @@ -0,0 +1,50 @@ +From 2ea32f7372b65c24b2816f11c04bf59b5090d05b Mon Sep 17 00:00:00 2001 +From: erouault <erouault> +Date: Thu, 12 Jan 2017 19:23:20 +0000 +Subject: [PATCH 2/2] * libtiff/tif_ojpeg.c: fix leak in + OJPEGReadHeaderInfoSecTablesQTable, OJPEGReadHeaderInfoSecTablesDcTable and + OJPEGReadHeaderInfoSecTablesAcTable + +Upstream-status: Backport + +CVE: CVE-2017-7594 #patch2 +Signed-off-by: Rajkumar Veer <rveer@mvista.com> +Index: tiff-4.0.7/ChangeLog +=================================================================== +--- tiff-4.0.7.orig/ChangeLog 2017-04-24 16:50:26.465897646 +0530 ++++ tiff-4.0.7/ChangeLog 2017-04-24 16:56:20.685888360 +0530 +@@ -1,6 +1,7 @@ + 2017-01-12 Even Rouault <even.rouault at spatialys.com> + +- * libtiff/tif_ojpeg.c: fix leak in OJPEGReadHeaderInfoSecTablesAcTable ++ * libtiff/tif_ojpeg.c: fix leak in OJPEGReadHeaderInfoSecTablesQTable, ++ OJPEGReadHeaderInfoSecTablesDcTable and OJPEGReadHeaderInfoSecTablesAcTable + when read fails. + Patch by Nicolás Peña. + Fixes http://bugzilla.maptools.org/show_bug.cgi?id=2659 +Index: tiff-4.0.7/libtiff/tif_ojpeg.c +=================================================================== +--- tiff-4.0.7.orig/libtiff/tif_ojpeg.c 2017-04-24 16:52:27.349894477 +0530 ++++ tiff-4.0.7/libtiff/tif_ojpeg.c 2017-04-24 16:59:20.001883660 +0530 +@@ -1790,7 +1790,10 @@ + TIFFSeekFile(tif,sp->qtable_offset[m],SEEK_SET); + p=(uint32)TIFFReadFile(tif,&ob[sizeof(uint32)+5],64); + if (p!=64) ++ { ++ _TIFFfree(ob); + return(0); ++ } + sp->qtable[m]=ob; + sp->sof_tq[m]=m; + } +@@ -1854,7 +1857,10 @@ + rb[sizeof(uint32)+5+n]=o[n]; + p=(uint32)TIFFReadFile(tif,&(rb[sizeof(uint32)+21]),q); + if (p!=q) ++ { ++ _TIFFfree(rb); + return(0); ++ } + sp->dctable[m]=rb; + sp->sos_tda[m]=(m<<4); + } diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/libtiff/files/CVE-2017-7595.patch b/import-layers/yocto-poky/meta/recipes-multimedia/libtiff/files/CVE-2017-7595.patch new file mode 100644 index 0000000000..851a37fc74 --- /dev/null +++ b/import-layers/yocto-poky/meta/recipes-multimedia/libtiff/files/CVE-2017-7595.patch @@ -0,0 +1,48 @@ +commit 618d490090bfd10e613ac574ecff31a293904b44 +Author: erouault <erouault> +Date: Wed Jan 11 12:15:01 2017 +0000 + + * libtiff/tif_jpeg.c: avoid integer division by zero + in JPEGSetupEncode() when horizontal or vertical sampling is set to 0. + Fixes http://bugzilla.maptools.org/show_bug.cgi?id=2653 + +Upstream-Status: Backport + +CVE: CVE-2017-7595 +Signed-off-by: Rajkumar Veer <rveer@mvista.com> + +Index: tiff-4.0.7/ChangeLog +=================================================================== +--- tiff-4.0.7.orig/ChangeLog 2017-04-24 17:31:40.013832807 +0530 ++++ tiff-4.0.7/ChangeLog 2017-04-24 18:03:34.769782616 +0530 +@@ -8,6 +8,12 @@ + + 2017-01-11 Even Rouault <even.rouault at spatialys.com> + ++ * libtiff/tif_jpeg.c: avoid integer division by zero in ++ JPEGSetupEncode() when horizontal or vertical sampling is set to 0. ++ Fixes http://bugzilla.maptools.org/show_bug.cgi?id=2653 ++ ++2017-01-11 Even Rouault <even.rouault at spatialys.com> ++ + * libtiff/tif_getimage.c: add explicit uint32 cast in putagreytile to + avoid UndefinedBehaviorSanitizer warning. + Patch by Nicolas Pena. +Index: tiff-4.0.7/libtiff/tif_jpeg.c +=================================================================== +--- tiff-4.0.7.orig/libtiff/tif_jpeg.c 2016-01-24 21:09:51.781641625 +0530 ++++ tiff-4.0.7/libtiff/tif_jpeg.c 2017-04-24 18:05:59.777778815 +0530 +@@ -1626,6 +1626,13 @@ + case PHOTOMETRIC_YCBCR: + sp->h_sampling = td->td_ycbcrsubsampling[0]; + sp->v_sampling = td->td_ycbcrsubsampling[1]; ++ if( sp->h_sampling == 0 || sp->v_sampling == 0 ) ++ { ++ TIFFErrorExt(tif->tif_clientdata, module, ++ "Invalig horizontal/vertical sampling value"); ++ return (0); ++ } ++ + /* + * A ReferenceBlackWhite field *must* be present since the + * default value is inappropriate for YCbCr. Fill in the diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/libtiff/files/CVE-2017-7596.patch b/import-layers/yocto-poky/meta/recipes-multimedia/libtiff/files/CVE-2017-7596.patch new file mode 100644 index 0000000000..1945c3d316 --- /dev/null +++ b/import-layers/yocto-poky/meta/recipes-multimedia/libtiff/files/CVE-2017-7596.patch @@ -0,0 +1,308 @@ +From 3144e57770c1e4d26520d8abee750f8ac8b75490 Mon Sep 17 00:00:00 2001 +From: erouault <erouault> +Date: Wed, 11 Jan 2017 16:09:02 +0000 +Subject: [PATCH] * libtiff/tif_dir.c, tif_dirread.c, tif_dirwrite.c: implement + various clampings of double to other data types to avoid undefined behaviour + if the output range isn't big enough to hold the input value. Fixes + http://bugzilla.maptools.org/show_bug.cgi?id=2643 + http://bugzilla.maptools.org/show_bug.cgi?id=2642 + http://bugzilla.maptools.org/show_bug.cgi?id=2646 + http://bugzilla.maptools.org/show_bug.cgi?id=2647 + +Upstream-Status: Backport + +CVE: CVE-2017-7596 +Signed-off-by: Rajkumar Veer <rveer@mvista.com> + +Index: tiff-4.0.7/ChangeLog +=================================================================== +--- tiff-4.0.7.orig/ChangeLog 2017-04-25 15:53:40.294592812 +0530 ++++ tiff-4.0.7/ChangeLog 2017-04-25 16:02:03.238600641 +0530 +@@ -6,6 +6,16 @@ + Patch by Nicolás Peña. + Fixes http://bugzilla.maptools.org/show_bug.cgi?id=2659 + ++2017-01-11 Even Rouault <even.rouault at spatialys.com> ++ ++ * libtiff/tif_dir.c, tif_dirread.c, tif_dirwrite.c: implement various clampings ++ of double to other data types to avoid undefined behaviour if the output range ++ isn't big enough to hold the input value. ++ Fixes http://bugzilla.maptools.org/show_bug.cgi?id=2643 ++ http://bugzilla.maptools.org/show_bug.cgi?id=2642 ++ http://bugzilla.maptools.org/show_bug.cgi?id=2646 ++ http://bugzilla.maptools.org/show_bug.cgi?id=2647 ++ + 2017-01-11 Even Rouault <even.rouault at spatialys.com> + + * libtiff/tif_jpeg.c: avoid integer division by zero in +Index: tiff-4.0.7/libtiff/tif_dir.c +=================================================================== +--- tiff-4.0.7.orig/libtiff/tif_dir.c 2016-10-30 04:33:18.856598072 +0530 ++++ tiff-4.0.7/libtiff/tif_dir.c 2017-04-25 16:02:03.238600641 +0530 +@@ -31,6 +31,7 @@ + * (and also some miscellaneous stuff) + */ + #include "tiffiop.h" ++#include <float.h> + + /* + * These are used in the backwards compatibility code... +@@ -154,6 +155,15 @@ + return (0); + } + ++static float TIFFClampDoubleToFloat( double val ) ++{ ++ if( val > FLT_MAX ) ++ return FLT_MAX; ++ if( val < -FLT_MAX ) ++ return -FLT_MAX; ++ return (float)val; ++} ++ + static int + _TIFFVSetField(TIFF* tif, uint32 tag, va_list ap) + { +@@ -312,13 +322,13 @@ + dblval = va_arg(ap, double); + if( dblval < 0 ) + goto badvaluedouble; +- td->td_xresolution = (float) dblval; ++ td->td_xresolution = TIFFClampDoubleToFloat( dblval ); + break; + case TIFFTAG_YRESOLUTION: + dblval = va_arg(ap, double); + if( dblval < 0 ) + goto badvaluedouble; +- td->td_yresolution = (float) dblval; ++ td->td_yresolution = TIFFClampDoubleToFloat( dblval ); + break; + case TIFFTAG_PLANARCONFIG: + v = (uint16) va_arg(ap, uint16_vap); +@@ -327,10 +337,10 @@ + td->td_planarconfig = (uint16) v; + break; + case TIFFTAG_XPOSITION: +- td->td_xposition = (float) va_arg(ap, double); ++ td->td_xposition = TIFFClampDoubleToFloat( va_arg(ap, double) ); + break; + case TIFFTAG_YPOSITION: +- td->td_yposition = (float) va_arg(ap, double); ++ td->td_yposition = TIFFClampDoubleToFloat( va_arg(ap, double) ); + break; + case TIFFTAG_RESOLUTIONUNIT: + v = (uint16) va_arg(ap, uint16_vap); +Index: tiff-4.0.7/libtiff/tif_dirread.c +=================================================================== +--- tiff-4.0.7.orig/libtiff/tif_dirread.c 2017-04-25 15:53:40.134592810 +0530 ++++ tiff-4.0.7/libtiff/tif_dirread.c 2017-04-25 16:02:03.242600641 +0530 +@@ -40,6 +40,7 @@ + */ + + #include "tiffiop.h" ++#include <float.h> + + #define IGNORE 0 /* tag placeholder used below */ + #define FAILED_FII ((uint32) -1) +@@ -2406,7 +2407,14 @@ + ma=(double*)origdata; + mb=data; + for (n=0; n<count; n++) +- *mb++=(float)(*ma++); ++ { ++ double val = *ma++; ++ if( val > FLT_MAX ) ++ val = FLT_MAX; ++ else if( val < -FLT_MAX ) ++ val = -FLT_MAX; ++ *mb++=(float)val; ++ } + } + break; + } +Index: tiff-4.0.7/libtiff/tif_dirwrite.c +=================================================================== +--- tiff-4.0.7.orig/libtiff/tif_dirwrite.c 2016-10-30 04:33:18.876854501 +0530 ++++ tiff-4.0.7/libtiff/tif_dirwrite.c 2017-04-25 16:07:48.670606018 +0530 +@@ -30,6 +30,7 @@ + * Directory Write Support Routines. + */ + #include "tiffiop.h" ++#include <float.h> + + #ifdef HAVE_IEEEFP + #define TIFFCvtNativeToIEEEFloat(tif, n, fp) +@@ -939,6 +940,69 @@ + return(0); + } + ++static float TIFFClampDoubleToFloat( double val ) ++{ ++ if( val > FLT_MAX ) ++ return FLT_MAX; ++ if( val < -FLT_MAX ) ++ return -FLT_MAX; ++ return (float)val; ++} ++ ++static int8 TIFFClampDoubleToInt8( double val ) ++{ ++ if( val > 127 ) ++ return 127; ++ if( val < -128 || val != val ) ++ return -128; ++ return (int8)val; ++} ++ ++static int16 TIFFClampDoubleToInt16( double val ) ++{ ++ if( val > 32767 ) ++ return 32767; ++ if( val < -32768 || val != val ) ++ return -32768; ++ return (int16)val; ++} ++ ++static int32 TIFFClampDoubleToInt32( double val ) ++{ ++ if( val > 0x7FFFFFFF ) ++ return 0x7FFFFFFF; ++ if( val < -0x7FFFFFFF-1 || val != val ) ++ return -0x7FFFFFFF-1; ++ return (int32)val; ++} ++ ++static uint8 TIFFClampDoubleToUInt8( double val ) ++{ ++ if( val < 0 ) ++ return 0; ++ if( val > 255 || val != val ) ++ return 255; ++ return (uint8)val; ++} ++ ++static uint16 TIFFClampDoubleToUInt16( double val ) ++{ ++ if( val < 0 ) ++ return 0; ++ if( val > 65535 || val != val ) ++ return 65535; ++ return (uint16)val; ++} ++ ++static uint32 TIFFClampDoubleToUInt32( double val ) ++{ ++ if( val < 0 ) ++ return 0; ++ if( val > 0xFFFFFFFFU || val != val ) ++ return 0xFFFFFFFFU; ++ return (uint32)val; ++} ++ + static int + TIFFWriteDirectoryTagSampleformatArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, double* value) + { +@@ -959,7 +1023,7 @@ + if (tif->tif_dir.td_bitspersample<=32) + { + for (i = 0; i < count; ++i) +- ((float*)conv)[i] = (float)value[i]; ++ ((float*)conv)[i] = TIFFClampDoubleToFloat(value[i]); + ok = TIFFWriteDirectoryTagFloatArray(tif,ndir,dir,tag,count,(float*)conv); + } + else +@@ -971,19 +1035,19 @@ + if (tif->tif_dir.td_bitspersample<=8) + { + for (i = 0; i < count; ++i) +- ((int8*)conv)[i] = (int8)value[i]; ++ ((int8*)conv)[i] = TIFFClampDoubleToInt8(value[i]); + ok = TIFFWriteDirectoryTagSbyteArray(tif,ndir,dir,tag,count,(int8*)conv); + } + else if (tif->tif_dir.td_bitspersample<=16) + { + for (i = 0; i < count; ++i) +- ((int16*)conv)[i] = (int16)value[i]; ++ ((int16*)conv)[i] = TIFFClampDoubleToInt16(value[i]); + ok = TIFFWriteDirectoryTagSshortArray(tif,ndir,dir,tag,count,(int16*)conv); + } + else + { + for (i = 0; i < count; ++i) +- ((int32*)conv)[i] = (int32)value[i]; ++ ((int32*)conv)[i] = TIFFClampDoubleToInt32(value[i]); + ok = TIFFWriteDirectoryTagSlongArray(tif,ndir,dir,tag,count,(int32*)conv); + } + break; +@@ -991,19 +1055,19 @@ + if (tif->tif_dir.td_bitspersample<=8) + { + for (i = 0; i < count; ++i) +- ((uint8*)conv)[i] = (uint8)value[i]; ++ ((uint8*)conv)[i] = TIFFClampDoubleToUInt8(value[i]); + ok = TIFFWriteDirectoryTagByteArray(tif,ndir,dir,tag,count,(uint8*)conv); + } + else if (tif->tif_dir.td_bitspersample<=16) + { + for (i = 0; i < count; ++i) +- ((uint16*)conv)[i] = (uint16)value[i]; ++ ((uint16*)conv)[i] = TIFFClampDoubleToUInt16(value[i]); + ok = TIFFWriteDirectoryTagShortArray(tif,ndir,dir,tag,count,(uint16*)conv); + } + else + { + for (i = 0; i < count; ++i) +- ((uint32*)conv)[i] = (uint32)value[i]; ++ ((uint32*)conv)[i] = TIFFClampDoubleToUInt32(value[i]); + ok = TIFFWriteDirectoryTagLongArray(tif,ndir,dir,tag,count,(uint32*)conv); + } + break; +@@ -2094,15 +2158,25 @@ + static int + TIFFWriteDirectoryTagCheckedRational(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, double value) + { ++ static const char module[] = "TIFFWriteDirectoryTagCheckedRational"; + uint32 m[2]; +- assert(value>=0.0); + assert(sizeof(uint32)==4); +- if (value<=0.0) ++ if (value<0) ++ { ++ TIFFErrorExt(tif->tif_clientdata,module,"Negative value is illegal"); ++ return 0; ++ } ++ else if( value != value ) ++ { ++ TIFFErrorExt(tif->tif_clientdata,module,"Not-a-number value is illegal"); ++ return 0; ++ } ++ else if (value==0.0) + { + m[0]=0; + m[1]=1; +- } +- else if (value==(double)(uint32)value) ++ } ++ else if (value <= 0xFFFFFFFFU && value==(double)(uint32)value) + { + m[0]=(uint32)value; + m[1]=1; +@@ -2143,7 +2217,7 @@ + } + for (na=value, nb=m, nc=0; nc<count; na++, nb+=2, nc++) + { +- if (*na<=0.0) ++ if (*na<=0.0 || *na != *na) + { + nb[0]=0; + nb[1]=1; +@@ -2153,7 +2227,8 @@ + nb[0]=(uint32)(*na); + nb[1]=1; + } +- else if (*na<1.0) ++ else if (*na >= 0 && *na <= (float)0xFFFFFFFFU && ++ *na==(float)(uint32)(*na)) + { + nb[0]=(uint32)((double)(*na)*0xFFFFFFFF); + nb[1]=0xFFFFFFFF; diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/libtiff/files/CVE-2017-7598.patch b/import-layers/yocto-poky/meta/recipes-multimedia/libtiff/files/CVE-2017-7598.patch new file mode 100644 index 0000000000..6d082bb613 --- /dev/null +++ b/import-layers/yocto-poky/meta/recipes-multimedia/libtiff/files/CVE-2017-7598.patch @@ -0,0 +1,65 @@ +From 3cfd62d77c2a7e147a05bd678524c345fa9c2bb8 Mon Sep 17 00:00:00 2001 +From: erouault <erouault> +Date: Wed, 11 Jan 2017 13:28:01 +0000 +Subject: [PATCH] * libtiff/tif_dirread.c: avoid division by floating point 0 + in TIFFReadDirEntryCheckedRational() and TIFFReadDirEntryCheckedSrational(), + and return 0 in that case (instead of infinity as before presumably) + Apparently some sanitizers do not like those divisions by zero. Fixes + http://bugzilla.maptools.org/show_bug.cgi?id=2644 + +Upstream-Status: Backport + +CVE: CVE-2017-7598 +Signed-off-by: Rajkumar Veer <rveer@mvista.com> +Index: tiff-4.0.7/ChangeLog +=================================================================== +--- tiff-4.0.7.orig/ChangeLog 2017-04-25 16:14:59.858612730 +0530 ++++ tiff-4.0.7/ChangeLog 2017-04-25 18:11:36.048107127 +0530 +@@ -1,3 +1,4 @@ ++ + 2017-01-12 Even Rouault <even.rouault at spatialys.com> + + * libtiff/tif_ojpeg.c: fix leak in OJPEGReadHeaderInfoSecTablesQTable, +@@ -8,6 +9,14 @@ + + 2017-01-11 Even Rouault <even.rouault at spatialys.com> + ++ * libtiff/tif_dirread.c: avoid division by floating point 0 in ++ TIFFReadDirEntryCheckedRational() and TIFFReadDirEntryCheckedSrational(), ++ and return 0 in that case (instead of infinity as before presumably) ++ Apparently some sanitizers do not like those divisions by zero. ++ Fixes http://bugzilla.maptools.org/show_bug.cgi?id=2644 ++ ++2017-01-11 Even Rouault <even.rouault at spatialys.com> ++ + * libtiff/tif_dir.c, tif_dirread.c, tif_dirwrite.c: implement various clampings + of double to other data types to avoid undefined behaviour if the output range + isn't big enough to hold the input value. +Index: tiff-4.0.7/libtiff/tif_dirread.c +=================================================================== +--- tiff-4.0.7.orig/libtiff/tif_dirread.c 2017-04-25 16:14:59.858612730 +0530 ++++ tiff-4.0.7/libtiff/tif_dirread.c 2017-04-25 18:16:21.836111576 +0530 +@@ -2880,7 +2880,10 @@ + m.l = direntry->tdir_offset.toff_long8; + if (tif->tif_flags&TIFF_SWAB) + TIFFSwabArrayOfLong(m.i,2); +- if (m.i[0]==0) ++ /* Not completely sure what we should do when m.i[1]==0, but some */ ++ /* sanitizers do not like division by 0.0: */ ++ /* http://bugzilla.maptools.org/show_bug.cgi?id=2644 */ ++ if (m.i[0]==0 || m.i[1]==0) + *value=0.0; + else + *value=(double)m.i[0]/(double)m.i[1]; +@@ -2908,7 +2911,10 @@ + m.l=direntry->tdir_offset.toff_long8; + if (tif->tif_flags&TIFF_SWAB) + TIFFSwabArrayOfLong(m.i,2); +- if ((int32)m.i[0]==0) ++ /* Not completely sure what we should do when m.i[1]==0, but some */ ++ /* sanitizers do not like division by 0.0: */ ++ /* http://bugzilla.maptools.org/show_bug.cgi?id=2644 */ ++ if ((int32)m.i[0]==0 || m.i[1]==0) + *value=0.0; + else + *value=(double)((int32)m.i[0])/(double)m.i[1]; diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/libtiff/files/CVE-2017-7601.patch b/import-layers/yocto-poky/meta/recipes-multimedia/libtiff/files/CVE-2017-7601.patch new file mode 100644 index 0000000000..1b3c6c879f --- /dev/null +++ b/import-layers/yocto-poky/meta/recipes-multimedia/libtiff/files/CVE-2017-7601.patch @@ -0,0 +1,52 @@ +From 0a76a8c765c7b8327c59646284fa78c3c27e5490 Mon Sep 17 00:00:00 2001 +From: erouault <erouault> +Date: Wed, 11 Jan 2017 16:13:50 +0000 +Subject: [PATCH] * libtiff/tif_jpeg.c: validate BitsPerSample in + JPEGSetupEncode() to avoid undefined behaviour caused by invalid shift + exponent. Fixes http://bugzilla.maptools.org/show_bug.cgi?id=2648 + +Upstream-Status: Backport + +CVE: CVE-2017-7601 +Signed-off-by: Rajkumar Veer <rveer@mvista.com> +Index: tiff-4.0.7/ChangeLog +=================================================================== +--- tiff-4.0.7.orig/ChangeLog 2017-04-25 18:21:32.856116417 +0530 ++++ tiff-4.0.7/ChangeLog 2017-04-25 18:35:31.904129477 +0530 +@@ -1,4 +1,3 @@ +- + 2017-01-12 Even Rouault <even.rouault at spatialys.com> + + * libtiff/tif_ojpeg.c: fix leak in OJPEGReadHeaderInfoSecTablesQTable, +@@ -9,6 +8,12 @@ + + 2017-01-11 Even Rouault <even.rouault at spatialys.com> + ++ * libtiff/tif_jpeg.c: validate BitsPerSample in JPEGSetupEncode() to avoid ++ undefined behaviour caused by invalid shift exponent. ++ Fixes http://bugzilla.maptools.org/show_bug.cgi?id=2648 ++ ++2017-01-11 Even Rouault <even.rouault at spatialys.com> ++ + * libtiff/tif_dirread.c: avoid division by floating point 0 in + TIFFReadDirEntryCheckedRational() and TIFFReadDirEntryCheckedSrational(), + and return 0 in that case (instead of infinity as before presumably) +Index: tiff-4.0.7/libtiff/tif_jpeg.c +=================================================================== +--- tiff-4.0.7.orig/libtiff/tif_jpeg.c 2017-04-25 18:21:32.744116415 +0530 ++++ tiff-4.0.7/libtiff/tif_jpeg.c 2017-04-25 18:38:02.200131817 +0530 +@@ -1632,7 +1632,13 @@ + "Invalig horizontal/vertical sampling value"); + return (0); + } +- ++ if( td->td_bitspersample > 16 ) ++ { ++ TIFFErrorExt(tif->tif_clientdata, module, ++ "BitsPerSample %d not allowed for JPEG", ++ td->td_bitspersample); ++ return (0); ++ } + /* + * A ReferenceBlackWhite field *must* be present since the + * default value is inappropriate for YCbCr. Fill in the diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/libtiff/files/CVE-2017-7602.patch b/import-layers/yocto-poky/meta/recipes-multimedia/libtiff/files/CVE-2017-7602.patch new file mode 100644 index 0000000000..9ed97e2467 --- /dev/null +++ b/import-layers/yocto-poky/meta/recipes-multimedia/libtiff/files/CVE-2017-7602.patch @@ -0,0 +1,69 @@ +From 66e7bd59520996740e4df5495a830b42fae48bc4 Mon Sep 17 00:00:00 2001 +From: erouault <erouault> +Date: Wed, 11 Jan 2017 16:33:34 +0000 +Subject: [PATCH] * libtiff/tif_read.c: avoid potential undefined behaviour on + signed integer addition in TIFFReadRawStrip1() in isMapped() case. Fixes + http://bugzilla.maptools.org/show_bug.cgi?id=2650 + +Upstream-Status: Backport + +CVE: CVE-2017-7602 +Signed-off-by: Rajkumar Veer <rveer@mvista.com> + +Index: tiff-4.0.7/ChangeLog +=================================================================== +--- tiff-4.0.7.orig/ChangeLog 2017-04-25 18:42:07.656135638 +0530 ++++ tiff-4.0.7/ChangeLog 2017-04-25 18:54:36.812147299 +0530 +@@ -8,6 +8,12 @@ + + 2017-01-11 Even Rouault <even.rouault at spatialys.com> + ++ * libtiff/tif_read.c: avoid potential undefined behaviour on signed integer ++ addition in TIFFReadRawStrip1() in isMapped() case. ++ Fixes http://bugzilla.maptools.org/show_bug.cgi?id=2650 ++ ++2017-01-11 Even Rouault <even.rouault at spatialys.com> ++ + * libtiff/tif_jpeg.c: validate BitsPerSample in JPEGSetupEncode() to avoid + undefined behaviour caused by invalid shift exponent. + Fixes http://bugzilla.maptools.org/show_bug.cgi?id=2648 +Index: tiff-4.0.7/libtiff/tif_read.c +=================================================================== +--- tiff-4.0.7.orig/libtiff/tif_read.c 2017-04-25 18:42:07.132135629 +0530 ++++ tiff-4.0.7/libtiff/tif_read.c 2017-04-25 18:58:25.272150855 +0530 +@@ -420,16 +420,26 @@ + return ((tmsize_t)(-1)); + } + } else { +- tmsize_t ma,mb; ++ tmsize_t ma; + tmsize_t n; +- ma=(tmsize_t)td->td_stripoffset[strip]; +- mb=ma+size; +- if ((td->td_stripoffset[strip] > (uint64)TIFF_TMSIZE_T_MAX)||(ma>tif->tif_size)) +- n=0; +- else if ((mb<ma)||(mb<size)||(mb>tif->tif_size)) +- n=tif->tif_size-ma; +- else +- n=size; ++ if ((td->td_stripoffset[strip] > (uint64)TIFF_TMSIZE_T_MAX)|| ++ ((ma=(tmsize_t)td->td_stripoffset[strip])>tif->tif_size)) ++ { ++ n=0; ++ } ++ else if( ma > TIFF_TMSIZE_T_MAX - size ) ++ { ++ n=0; ++ } ++ else ++ { ++ tmsize_t mb=ma+size; ++ if (mb>tif->tif_size) ++ n=tif->tif_size-ma; ++ else ++ n=size; ++ } ++ + if (n!=size) { + #if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__)) + TIFFErrorExt(tif->tif_clientdata, module, diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/libtiff/files/CVE-2017-9147.patch b/import-layers/yocto-poky/meta/recipes-multimedia/libtiff/files/CVE-2017-9147.patch new file mode 100644 index 0000000000..94f33900a5 --- /dev/null +++ b/import-layers/yocto-poky/meta/recipes-multimedia/libtiff/files/CVE-2017-9147.patch @@ -0,0 +1,203 @@ +From 0acf01fea714af573b814e10cf105c3359a236c3 Mon Sep 17 00:00:00 2001 +From: erouault <erouault> +Date: Thu, 1 Jun 2017 12:44:04 +0000 +Subject: [PATCH] * libtiff/tif_dirinfo.c, tif_dirread.c: add _TIFFCheckFieldIsValidForCodec(), +and use it in TIFFReadDirectory() so as to ignore fields whose tag is a +codec-specified tag but this codec is not enabled. This avoids TIFFGetField() +to behave differently depending on whether the codec is enabled or not, and +thus can avoid stack based buffer overflows in a number of TIFF utilities +such as tiffsplit, tiffcmp, thumbnail, etc. +Patch derived from 0063-Handle-properly-CODEC-specific-tags.patch +(http://bugzilla.maptools.org/show_bug.cgi?id=2580) by Raphaël Hertzog. +Fixes: +http://bugzilla.maptools.org/show_bug.cgi?id=2580 +http://bugzilla.maptools.org/show_bug.cgi?id=2693 +http://bugzilla.maptools.org/show_bug.cgi?id=2625 (CVE-2016-10095) +http://bugzilla.maptools.org/show_bug.cgi?id=2564 (CVE-2015-7554) +http://bugzilla.maptools.org/show_bug.cgi?id=2561 (CVE-2016-5318) +http://bugzilla.maptools.org/show_bug.cgi?id=2499 (CVE-2014-8128) +http://bugzilla.maptools.org/show_bug.cgi?id=2441 +http://bugzilla.maptools.org/show_bug.cgi?id=2433 + +Upstream-Status: Backport +[https://github.com/vadz/libtiff/commit/4d4fa0b68ae9ae038959ee4f69ebe288ec892f06] + +CVE: CVE-2017-9147 + +Signed-off-by: Yi Zhao <yi.zhao@windriver.com> +--- + ChangeLog | 20 ++++++++++ + libtiff/tif_dir.h | 1 + + libtiff/tif_dirinfo.c | 103 ++++++++++++++++++++++++++++++++++++++++++++++++++ + libtiff/tif_dirread.c | 4 ++ + 4 files changed, 128 insertions(+) + +Index: tiff-4.0.7/ChangeLog +=================================================================== +--- tiff-4.0.7.orig/ChangeLog ++++ tiff-4.0.7/ChangeLog +@@ -1,3 +1,23 @@ ++2017-06-01 Even Rouault <even.rouault at spatialys.com> ++ ++ * libtiff/tif_dirinfo.c, tif_dirread.c: add _TIFFCheckFieldIsValidForCodec(), ++ and use it in TIFFReadDirectory() so as to ignore fields whose tag is a ++ codec-specified tag but this codec is not enabled. This avoids TIFFGetField() ++ to behave differently depending on whether the codec is enabled or not, and ++ thus can avoid stack based buffer overflows in a number of TIFF utilities ++ such as tiffsplit, tiffcmp, thumbnail, etc. ++ Patch derived from 0063-Handle-properly-CODEC-specific-tags.patch ++ (http://bugzilla.maptools.org/show_bug.cgi?id=2580) by Raphaël Hertzog. ++ Fixes: ++ http://bugzilla.maptools.org/show_bug.cgi?id=2580 ++ http://bugzilla.maptools.org/show_bug.cgi?id=2693 ++ http://bugzilla.maptools.org/show_bug.cgi?id=2625 (CVE-2016-10095) ++ http://bugzilla.maptools.org/show_bug.cgi?id=2564 (CVE-2015-7554) ++ http://bugzilla.maptools.org/show_bug.cgi?id=2561 (CVE-2016-5318) ++ http://bugzilla.maptools.org/show_bug.cgi?id=2499 (CVE-2014-8128) ++ http://bugzilla.maptools.org/show_bug.cgi?id=2441 ++ http://bugzilla.maptools.org/show_bug.cgi?id=2433 ++ + 2017-01-11 Even Rouault <even.rouault at spatialys.com> + + * tools/tiffcp.c: error out cleanly in cpContig2SeparateByRow and +Index: tiff-4.0.7/libtiff/tif_dir.h +=================================================================== +--- tiff-4.0.7.orig/libtiff/tif_dir.h ++++ tiff-4.0.7/libtiff/tif_dir.h +@@ -291,6 +291,7 @@ struct _TIFFField { + extern int _TIFFMergeFields(TIFF*, const TIFFField[], uint32); + extern const TIFFField* _TIFFFindOrRegisterField(TIFF *, uint32, TIFFDataType); + extern TIFFField* _TIFFCreateAnonField(TIFF *, uint32, TIFFDataType); ++extern int _TIFFCheckFieldIsValidForCodec(TIFF *tif, ttag_t tag); + + #if defined(__cplusplus) + } +Index: tiff-4.0.7/libtiff/tif_dirinfo.c +=================================================================== +--- tiff-4.0.7.orig/libtiff/tif_dirinfo.c ++++ tiff-4.0.7/libtiff/tif_dirinfo.c +@@ -956,6 +956,109 @@ TIFFMergeFieldInfo(TIFF* tif, const TIFF + return 0; + } + ++int ++_TIFFCheckFieldIsValidForCodec(TIFF *tif, ttag_t tag) ++{ ++ /* Filter out non-codec specific tags */ ++ switch (tag) { ++ /* Shared tags */ ++ case TIFFTAG_PREDICTOR: ++ /* JPEG tags */ ++ case TIFFTAG_JPEGTABLES: ++ /* OJPEG tags */ ++ case TIFFTAG_JPEGIFOFFSET: ++ case TIFFTAG_JPEGIFBYTECOUNT: ++ case TIFFTAG_JPEGQTABLES: ++ case TIFFTAG_JPEGDCTABLES: ++ case TIFFTAG_JPEGACTABLES: ++ case TIFFTAG_JPEGPROC: ++ case TIFFTAG_JPEGRESTARTINTERVAL: ++ /* CCITT* */ ++ case TIFFTAG_BADFAXLINES: ++ case TIFFTAG_CLEANFAXDATA: ++ case TIFFTAG_CONSECUTIVEBADFAXLINES: ++ case TIFFTAG_GROUP3OPTIONS: ++ case TIFFTAG_GROUP4OPTIONS: ++ break; ++ default: ++ return 1; ++ } ++ /* Check if codec specific tags are allowed for the current ++ * compression scheme (codec) */ ++ switch (tif->tif_dir.td_compression) { ++ case COMPRESSION_LZW: ++ if (tag == TIFFTAG_PREDICTOR) ++ return 1; ++ break; ++ case COMPRESSION_PACKBITS: ++ /* No codec-specific tags */ ++ break; ++ case COMPRESSION_THUNDERSCAN: ++ /* No codec-specific tags */ ++ break; ++ case COMPRESSION_NEXT: ++ /* No codec-specific tags */ ++ break; ++ case COMPRESSION_JPEG: ++ if (tag == TIFFTAG_JPEGTABLES) ++ return 1; ++ break; ++ case COMPRESSION_OJPEG: ++ switch (tag) { ++ case TIFFTAG_JPEGIFOFFSET: ++ case TIFFTAG_JPEGIFBYTECOUNT: ++ case TIFFTAG_JPEGQTABLES: ++ case TIFFTAG_JPEGDCTABLES: ++ case TIFFTAG_JPEGACTABLES: ++ case TIFFTAG_JPEGPROC: ++ case TIFFTAG_JPEGRESTARTINTERVAL: ++ return 1; ++ } ++ break; ++ case COMPRESSION_CCITTRLE: ++ case COMPRESSION_CCITTRLEW: ++ case COMPRESSION_CCITTFAX3: ++ case COMPRESSION_CCITTFAX4: ++ switch (tag) { ++ case TIFFTAG_BADFAXLINES: ++ case TIFFTAG_CLEANFAXDATA: ++ case TIFFTAG_CONSECUTIVEBADFAXLINES: ++ return 1; ++ case TIFFTAG_GROUP3OPTIONS: ++ if (tif->tif_dir.td_compression == COMPRESSION_CCITTFAX3) ++ return 1; ++ break; ++ case TIFFTAG_GROUP4OPTIONS: ++ if (tif->tif_dir.td_compression == COMPRESSION_CCITTFAX4) ++ return 1; ++ break; ++ } ++ break; ++ case COMPRESSION_JBIG: ++ /* No codec-specific tags */ ++ break; ++ case COMPRESSION_DEFLATE: ++ case COMPRESSION_ADOBE_DEFLATE: ++ if (tag == TIFFTAG_PREDICTOR) ++ return 1; ++ break; ++ case COMPRESSION_PIXARLOG: ++ if (tag == TIFFTAG_PREDICTOR) ++ return 1; ++ break; ++ case COMPRESSION_SGILOG: ++ case COMPRESSION_SGILOG24: ++ /* No codec-specific tags */ ++ break; ++ case COMPRESSION_LZMA: ++ if (tag == TIFFTAG_PREDICTOR) ++ return 1; ++ break; ++ ++ } ++ return 0; ++} ++ + /* vim: set ts=8 sts=8 sw=8 noet: */ + + /* +Index: tiff-4.0.7/libtiff/tif_dirread.c +=================================================================== +--- tiff-4.0.7.orig/libtiff/tif_dirread.c ++++ tiff-4.0.7/libtiff/tif_dirread.c +@@ -3566,6 +3566,10 @@ TIFFReadDirectory(TIFF* tif) + goto bad; + dp->tdir_tag=IGNORE; + break; ++ default: ++ if( !_TIFFCheckFieldIsValidForCodec(tif, dp->tdir_tag) ) ++ dp->tdir_tag=IGNORE; ++ break; + } + } + } diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/libtiff/files/CVE-2017-9936.patch b/import-layers/yocto-poky/meta/recipes-multimedia/libtiff/files/CVE-2017-9936.patch new file mode 100644 index 0000000000..204949bfc6 --- /dev/null +++ b/import-layers/yocto-poky/meta/recipes-multimedia/libtiff/files/CVE-2017-9936.patch @@ -0,0 +1,46 @@ +From 62efea76592647426deec5592fd7274d5c950646 Mon Sep 17 00:00:00 2001 +From: Even Rouault <even.rouault@spatialys.com> +Date: Mon, 26 Jun 2017 15:19:59 +0000 +Subject: [PATCH] * libtiff/tif_jbig.c: fix memory leak in error code path of + JBIGDecode() Fixes http://bugzilla.maptools.org/show_bug.cgi?id=2706 Reported + by team OWL337 + +* libtiff/tif_jpeg.c: error out at decoding time if anticipated libjpeg + +Upstream-Status: Backport +[https://github.com/vadz/libtiff/commit/fe8d7165956b88df4837034a9161dc5fd20cf67a] + +CVE: CVE-2017-9936 + +Signed-off-by: Yi Zhao <yi.zhao@windriver.com> +--- + ChangeLog | 6 ++++++ + libtiff/tif_jbig.c | 1 + + 2 files changed, 7 insertions(+) + +Index: tiff-4.0.7/ChangeLog +=================================================================== +--- tiff-4.0.7.orig/ChangeLog ++++ tiff-4.0.7/ChangeLog +@@ -1,3 +1,9 @@ ++2017-06-26 Even Rouault <even.rouault at spatialys.com> ++ ++ * libtiff/tif_jbig.c: fix memory leak in error code path of JBIGDecode() ++ Fixes http://bugzilla.maptools.org/show_bug.cgi?id=2706 ++ Reported by team OWL337 ++ + 2017-06-01 Even Rouault <even.rouault at spatialys.com> + + * libtiff/tif_dirinfo.c, tif_dirread.c: add _TIFFCheckFieldIsValidForCodec(), +Index: tiff-4.0.7/libtiff/tif_jbig.c +=================================================================== +--- tiff-4.0.7.orig/libtiff/tif_jbig.c ++++ tiff-4.0.7/libtiff/tif_jbig.c +@@ -94,6 +94,7 @@ static int JBIGDecode(TIFF* tif, uint8* + jbg_strerror(decodeStatus) + #endif + ); ++ jbg_dec_free(&decoder); + return 0; + } + diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/libtiff/files/libtiff-CVE-2017-5225.patch b/import-layers/yocto-poky/meta/recipes-multimedia/libtiff/files/libtiff-CVE-2017-5225.patch new file mode 100644 index 0000000000..3263353a75 --- /dev/null +++ b/import-layers/yocto-poky/meta/recipes-multimedia/libtiff/files/libtiff-CVE-2017-5225.patch @@ -0,0 +1,92 @@ +From a24df1e93833dfeaa69bf4d510518dc4684db64d Mon Sep 17 00:00:00 2001 +From: Li Zhou <li.zhou@windriver.com> +Date: Wed, 25 Jan 2017 17:07:21 +0800 +Subject: [PATCH] libtiff: fix CVE-2017-5225 + +tools/tiffcp.c: error out cleanly in cpContig2SeparateByRow +and cpSeparate2ContigByRow if BitsPerSample != 8 to avoid heap based +overflow. Fixes http://bugzilla.maptools.org/show_bug.cgi?id=2656 and +http://bugzilla.maptools.org/show_bug.cgi?id=2657 + +Upstream-Status: Backport +CVE: CVE-2017-5225 +Signed-off-by: Li Zhou <li.zhou@windriver.com> +--- + ChangeLog | 7 +++++++ + tools/tiffcp.c | 24 ++++++++++++++++++++++-- + 2 files changed, 29 insertions(+), 2 deletions(-) + +diff --git a/ChangeLog b/ChangeLog +index 9b9d397..7e82795 100644 +--- a/ChangeLog ++++ b/ChangeLog +@@ -1,3 +1,10 @@ ++2017-01-11 Even Rouault <even.rouault at spatialys.com> ++ ++ * tools/tiffcp.c: error out cleanly in cpContig2SeparateByRow and ++ cpSeparate2ContigByRow if BitsPerSample != 8 to avoid heap based overflow. ++ Fixes http://bugzilla.maptools.org/show_bug.cgi?id=2656 and ++ http://bugzilla.maptools.org/show_bug.cgi?id=2657 ++ + 2016-11-19 Bob Friesenhahn <bfriesen@simple.dallas.tx.us> + + * libtiff 4.0.7 released. +diff --git a/tools/tiffcp.c b/tools/tiffcp.c +index 338a3d1..2e84577 100644 +--- a/tools/tiffcp.c ++++ b/tools/tiffcp.c +@@ -592,7 +592,7 @@ static copyFunc pickCopyFunc(TIFF*, TIFF*, uint16, uint16); + static int + tiffcp(TIFF* in, TIFF* out) + { +- uint16 bitspersample, samplesperpixel = 1; ++ uint16 bitspersample = 1, samplesperpixel = 1; + uint16 input_compression, input_photometric = PHOTOMETRIC_MINISBLACK; + copyFunc cf; + uint32 width, length; +@@ -1068,6 +1068,16 @@ DECLAREcpFunc(cpContig2SeparateByRow) + register uint32 n; + uint32 row; + tsample_t s; ++ uint16 bps = 0; ++ ++ (void) TIFFGetField(in, TIFFTAG_BITSPERSAMPLE, &bps); ++ if( bps != 8 ) ++ { ++ TIFFError(TIFFFileName(in), ++ "Error, can only handle BitsPerSample=8 in %s", ++ "cpContig2SeparateByRow"); ++ return 0; ++ } + + inbuf = _TIFFmalloc(scanlinesizein); + outbuf = _TIFFmalloc(scanlinesizeout); +@@ -1121,6 +1131,16 @@ DECLAREcpFunc(cpSeparate2ContigByRow) + register uint32 n; + uint32 row; + tsample_t s; ++ uint16 bps = 0; ++ ++ (void) TIFFGetField(in, TIFFTAG_BITSPERSAMPLE, &bps); ++ if( bps != 8 ) ++ { ++ TIFFError(TIFFFileName(in), ++ "Error, can only handle BitsPerSample=8 in %s", ++ "cpSeparate2ContigByRow"); ++ return 0; ++ } + + inbuf = _TIFFmalloc(scanlinesizein); + outbuf = _TIFFmalloc(scanlinesizeout); +@@ -1763,7 +1783,7 @@ pickCopyFunc(TIFF* in, TIFF* out, uint16 bitspersample, uint16 samplesperpixel) + uint32 w, l, tw, tl; + int bychunk; + +- (void) TIFFGetField(in, TIFFTAG_PLANARCONFIG, &shortv); ++ (void) TIFFGetFieldDefaulted(in, TIFFTAG_PLANARCONFIG, &shortv); + if (shortv != config && bitspersample != 8 && samplesperpixel > 1) { + fprintf(stderr, + "%s: Cannot handle different planar configuration w/ bits/sample != 8\n", +-- +1.9.1 + diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/libtiff/tiff_4.0.7.bb b/import-layers/yocto-poky/meta/recipes-multimedia/libtiff/tiff_4.0.7.bb index 729678208f..866e8526ec 100644 --- a/import-layers/yocto-poky/meta/recipes-multimedia/libtiff/tiff_4.0.7.bb +++ b/import-layers/yocto-poky/meta/recipes-multimedia/libtiff/tiff_4.0.7.bb @@ -6,7 +6,28 @@ CVE_PRODUCT = "libtiff" SRC_URI = "http://download.osgeo.org/libtiff/tiff-${PV}.tar.gz \ file://libtool2.patch \ - " + file://libtiff-CVE-2017-5225.patch \ + file://CVE-2017-9147.patch \ + file://CVE-2017-9936.patch \ + file://CVE-2017-10688.patch \ + file://CVE-2017-11335.patch \ + file://CVE-2016-10271.patch \ + file://CVE-2016-10093.patch \ + file://CVE-2016-10268.patch \ + file://CVE-2016-10266.patch \ + file://CVE-2016-10267.patch \ + file://CVE-2016-10269.patch \ + file://CVE-2016-10270.patch \ + file://CVE-2017-7592.patch \ + file://CVE-2017-7594-p1.patch \ + file://CVE-2017-7594-p2.patch \ + file://CVE-2017-7595.patch \ + file://CVE-2017-7596.patch \ + file://CVE-2017-7598.patch \ + file://CVE-2017-7601.patch \ + file://CVE-2017-7602.patch \ + file://CVE-2017-7593.patch \ + " SRC_URI[md5sum] = "77ae928d2c6b7fb46a21c3a29325157b" SRC_URI[sha256sum] = "9f43a2cfb9589e5cecaa66e16bf87f814c945f22df7ba600d63aac4632c4f019" diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/libvorbis/libvorbis/0001-configure-Check-for-clang.patch b/import-layers/yocto-poky/meta/recipes-multimedia/libvorbis/libvorbis/0001-configure-Check-for-clang.patch new file mode 100644 index 0000000000..7dad0cd8a5 --- /dev/null +++ b/import-layers/yocto-poky/meta/recipes-multimedia/libvorbis/libvorbis/0001-configure-Check-for-clang.patch @@ -0,0 +1,56 @@ +From 44b4511784f9b51c514dff4ceb3cbeaf9c374d08 Mon Sep 17 00:00:00 2001 +From: Khem Raj <raj.khem@gmail.com> +Date: Wed, 22 Mar 2017 16:06:55 +0000 +Subject: [PATCH] configure: Check for clang + +Disable gcc specific options if using clang + +Signed-off-by: Khem Raj <raj.khem@gmail.com> +--- +Upstream-Status: Pending + + configure.ac | 19 +++++++++++++++++-- + 1 file changed, 17 insertions(+), 2 deletions(-) + +diff --git a/configure.ac b/configure.ac +index eddd02d..00ecba5 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -93,6 +93,16 @@ AC_ARG_ENABLE(examples, + + AM_CONDITIONAL(BUILD_EXAMPLES, [test "x$enable_examples" = xyes]) + ++AC_MSG_CHECKING([whether C compiler is clang]) ++$CC -x c /dev/null -dM -E > conftest.txt 2>&1 ++if grep "__clang__" conftest.txt >/dev/null 2>&1; then ++ AC_SUBST([CC_CLANG], [1]) ++ AC_MSG_RESULT([yes]) ++ else ++ AC_SUBST([CC_CLANG], [0]) ++ AC_MSG_RESULT([no]) ++fi ++ + dnl -------------------------------------------------- + dnl Set build flags based on environment + dnl -------------------------------------------------- +@@ -127,10 +137,15 @@ else + AC_MSG_RESULT([$GCC_VERSION]) + case $host in + *86-*-linux*) ++ if test "$CC_CLANG" = "1"; then ++ ieeefp="" ++ else ++ ieefp="-mno-ieee-fp" ++ fi + DEBUG="-g -Wall -Wextra -D_REENTRANT -D__NO_MATH_INLINES -fsigned-char" +- CFLAGS="-O3 -ffast-math -mno-ieee-fp -D_REENTRANT -fsigned-char" ++ CFLAGS="-O3 -ffast-math -D_REENTRANT -fsigned-char ${ieefp}" + # PROFILE="-Wall -Wextra -pg -g -O3 -ffast-math -D_REENTRANT -fsigned-char -fno-inline -static" +- PROFILE="-Wall -Wextra -pg -g -O3 -ffast-math -mno-ieee-fp -D_REENTRANT -fsigned-char -fno-inline" ++ PROFILE="-Wall -Wextra -pg -g -O3 -ffast-math ${ieefp} -D_REENTRANT -fsigned-char -fno-inline" + + # glibc < 2.1.3 has a serious FP bug in the math inline header + # that will cripple Vorbis. Look to see if the magic FP stack +-- +1.8.3.1 + diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/libvorbis/libvorbis_1.3.5.bb b/import-layers/yocto-poky/meta/recipes-multimedia/libvorbis/libvorbis_1.3.5.bb index 636e0f307b..56c5b0a9cb 100644 --- a/import-layers/yocto-poky/meta/recipes-multimedia/libvorbis/libvorbis_1.3.5.bb +++ b/import-layers/yocto-poky/meta/recipes-multimedia/libvorbis/libvorbis_1.3.5.bb @@ -10,7 +10,9 @@ LIC_FILES_CHKSUM = "file://COPYING;md5=7d2c487d2fc7dd3e3c7c465a5b7f6217 \ file://include/vorbis/vorbisenc.h;beginline=1;endline=11;md5=d1c1d138863d6315131193d4046d81cb" DEPENDS = "libogg" -SRC_URI = "http://downloads.xiph.org/releases/vorbis/${BP}.tar.xz" +SRC_URI = "http://downloads.xiph.org/releases/vorbis/${BP}.tar.xz \ + file://0001-configure-Check-for-clang.patch \ + " SRC_URI[md5sum] = "28cb28097c07a735d6af56e598e1c90f" SRC_URI[sha256sum] = "54f94a9527ff0a88477be0a71c0bab09a4c3febe0ed878b24824906cd4b0e1d1" diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/mpeg2dec/mpeg2dec_0.4.1.bb b/import-layers/yocto-poky/meta/recipes-multimedia/mpeg2dec/mpeg2dec_0.4.1.bb index 16669947f9..fe765da193 100644 --- a/import-layers/yocto-poky/meta/recipes-multimedia/mpeg2dec/mpeg2dec_0.4.1.bb +++ b/import-layers/yocto-poky/meta/recipes-multimedia/mpeg2dec/mpeg2dec_0.4.1.bb @@ -20,7 +20,7 @@ inherit autotools pkgconfig EXTRA_OECONF = "--enable-shared --disable-sdl" -PACKAGECONFIG ?= "${@bb.utils.contains('DISTRO_FEATURES', 'x11', 'x11', '', d)}" +PACKAGECONFIG ?= "${@bb.utils.filter('DISTRO_FEATURES', 'x11', d)}" PACKAGECONFIG[x11] = "--with-x,--without-x,virtual/libx11 libxext libxv" PACKAGES = "mpeg2dec-dbg mpeg2dec mpeg2dec-doc libmpeg2 libmpeg2-dev libmpeg2convert libmpeg2convert-dev libmpeg2-staticdev libmpeg2convert-staticdev" diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/mpg123/mpg123_1.23.6.bb b/import-layers/yocto-poky/meta/recipes-multimedia/mpg123/mpg123_1.23.8.bb index 6ee457d048..e0a70380ea 100644 --- a/import-layers/yocto-poky/meta/recipes-multimedia/mpg123/mpg123_1.23.6.bb +++ b/import-layers/yocto-poky/meta/recipes-multimedia/mpg123/mpg123_1.23.8.bb @@ -12,15 +12,15 @@ LIC_FILES_CHKSUM = "file://COPYING;md5=1e86753638d3cf2512528b99079bc4f3" SRC_URI = "https://www.mpg123.de/download/${BP}.tar.bz2" -SRC_URI[md5sum] = "ed22a3e664f076fa05131a3454ef8166" -SRC_URI[sha256sum] = "4073d9c60a43872f6f5a3a322f5ea21ab7f0869d2ed25e79c3eb8521fa3c32d4" +SRC_URI[md5sum] = "4dde045123a2ad1e385a0a82c0ef9268" +SRC_URI[sha256sum] = "de2303c8ecb65593e39815c0a2f2f2d91f708c43b85a55fdd1934c82e677cf8e" inherit autotools pkgconfig # The options should be mutually exclusive for configuration script. # If both alsa and pulseaudio are specified (as in the default distro features) # pulseaudio takes precedence. -PACKAGECONFIG_ALSA = "${@bb.utils.contains('DISTRO_FEATURES', 'alsa', 'alsa', '', d)}" +PACKAGECONFIG_ALSA = "${@bb.utils.filter('DISTRO_FEATURES', 'alsa', d)}" PACKAGECONFIG ??= "${@bb.utils.contains('DISTRO_FEATURES', 'pulseaudio', 'pulseaudio', '${PACKAGECONFIG_ALSA}', d)}" PACKAGECONFIG[alsa] = "--with-default-audio=alsa,,alsa-lib" @@ -33,13 +33,8 @@ PACKAGECONFIG[sdl] = ",,libsdl" # Following are possible sound output modules: # alsa arts coreaudio dummy esd jack nas openal os2 oss portaudio pulse sdl sndio sun tinyalsa win32 win32_wasapi -AUDIOMODS += "${@bb.utils.contains('PACKAGECONFIG', 'alsa', 'alsa', '', d)}" -AUDIOMODS += "${@bb.utils.contains('PACKAGECONFIG', 'esd', 'esd', '', d)}" -AUDIOMODS += "${@bb.utils.contains('PACKAGECONFIG', 'jack', 'jack', '', d)}" -AUDIOMODS += "${@bb.utils.contains('PACKAGECONFIG', 'openal', 'openal', '', d)}" -AUDIOMODS += "${@bb.utils.contains('PACKAGECONFIG', 'portaudio', 'portaudio', '', d)}" +AUDIOMODS += "${@bb.utils.filter('PACKAGECONFIG', 'alsa esd jack openal portaudio sdl', d)}" AUDIOMODS += "${@bb.utils.contains('PACKAGECONFIG', 'pulseaudio', 'pulse', '', d)}" -AUDIOMODS += "${@bb.utils.contains('PACKAGECONFIG', 'sdl', 'sdl', '', d)}" EXTRA_OECONF = " \ --enable-shared \ diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/pulseaudio/pulseaudio.inc b/import-layers/yocto-poky/meta/recipes-multimedia/pulseaudio/pulseaudio.inc index 7e54ad4b55..fdbf5abc16 100644 --- a/import-layers/yocto-poky/meta/recipes-multimedia/pulseaudio/pulseaudio.inc +++ b/import-layers/yocto-poky/meta/recipes-multimedia/pulseaudio/pulseaudio.inc @@ -2,18 +2,71 @@ SUMMARY = "Sound server for Linux and Unix-like operating systems" HOMEPAGE = "http://www.pulseaudio.org" AUTHOR = "Lennart Poettering" SECTION = "libs/multimedia" -LICENSE = "GPLv2+ & LGPLv2.1" -LIC_FILES_CHKSUM = "file://LICENSE;md5=d9ae089c8dc5339f8ac9d8563038a29f \ + +# Most of PulseAudio code is under LGPLv2.1+. There are a few exceptions: +# +# The "adrian" echo canceller variant has code under a non-standard permissive +# license. See src/modules/echo-cancel/adrian-license.txt for details. This +# recipe disables the adrian echo canceller to avoid hassle with the unusual +# license. +# +# The src/modules/reserve* and src/pulsecore/rtkit* files are under the MIT +# license. +# +# The src/pulsecore/filter/ directory contains code under the 3-clause BSD +# license. +# +# src/utils/qpaeq is licensed under AGPL. qpaeq is not installed by this +# recipe, however, which is why AGPL is not mentioned in LICENSE. +# +# People who distribute PulseAudio binaries need to also consider that there +# are some dependencies to GPL libraries. LGPL code that depends on GPL +# libraries probably becomes effectively GPL-licensed (at compile-time? or at +# at link-time?). I'm not a lawyer, though, so I'm not sure of the exact +# implications. The GPL dependencies only affect the server, not the client +# library, with the exception of libdbus that affects both. These are the GPL +# library dependencies: +# +# One of the resampler implementations uses libsamplerate. This recipe doesn't +# enable that resampler, however. +# +# One of the database implementations uses gdbm. This recipe doesn't enable +# that database implementation, however. +# +# module-lirc (enabled by PACKAGECONFIG[lirc]) uses LIRC. +# +# module-equalizer-sink uses FFTW. This recipe disables that, however. +# +# The dependency with the most complicated licensing considerations is libdbus. +# When PACKAGECONFIG[dbus] is enabled (like it is by default), libdbus will be +# used by both the server and the client library (libpulse). Does this affect +# applications that use libpulse? It should be also noted that libdbus is +# dual-licensed: either GPLv2+ or AFL-2 terms apply. Whose decision is it which +# of the licenses apply? What a mess. Some people hold the view that libdbus is +# a system library that is covered by the "special exception" in GPLv2's +# section 3, and therefore libdbus's GPL license doesn't affect PulseAudio. +LICENSE = "LGPLv2.1+ & MIT & BSD-3-Clause" + +LIC_FILES_CHKSUM = "file://LICENSE;md5=a848e8d03f04976778eab2348b59ed2b \ file://GPL;md5=4325afd396febcb659c36b49533135d4 \ file://LGPL;md5=2d5025d4aa3495befef8f17206a5b0a1 \ - file://src/pulsecore/resampler.h;beginline=4;endline=21;md5=09794012ae16912c0270f3280cc8ff84" + file://AGPL;md5=73f1eb20517c55bf9493b7dd6e480788 \ + file://src/modules/echo-cancel/adrian-license.txt;md5=abbab006a561fbffccedf1c3531f34ab \ + file://src/pulsecore/filter/LICENSE.WEBKIT;md5=49defbaffddf8c51faf606ff7fc3b1f7 \ + file://src/pulsecore/resampler.h;beginline=4;endline=21;md5=09794012ae16912c0270f3280cc8ff84 \ + file://src/modules/reserve.h;beginline=6;endline=28;md5=0e23094760367d51b6609750e9b31fbb \ + file://src/pulsecore/rtkit.h;beginline=6;endline=29;md5=3f00ff966716ae0817c31576d1473528 \ + file://src/utils/qpaeq;beginline=2;endline=16;md5=7f62515a4762f0c3fc3d4201858bb964 \ + file://src/modules/echo-cancel/adrian-aec.h;beginline=3;endline=12;md5=d3ed4fad1c073f8b06f37495dc5d1026 \ + file://src/pulsecore/filter/biquad.h;beginline=1;endline=4;md5=6d46d1365206528a20137355924233c1 \ +" DEPENDS = "libatomic-ops libsndfile1 libtool intltool-native" # optional DEPENDS += "udev alsa-lib glib-2.0 gconf" -DEPENDS += "json-c gdbm speexdsp libxml-parser-perl-native libcap" +DEPENDS += "speexdsp libxml-parser-perl-native libcap" -inherit autotools bash-completion pkgconfig useradd gettext perlnative bluetooth systemd +inherit autotools bash-completion pkgconfig useradd gettext perlnative bluetooth systemd manpages # *.desktop rules wont be generated during configure and build will fail # if using --disable-nls @@ -25,9 +78,7 @@ EXTRA_OECONF = "\ --enable-tcpwrap=no \ --with-access-group=audio \ --disable-openssl \ - --disable-xen \ --with-database=simple \ - --without-fftw \ --without-zsh-completion-dir \ --with-udev-rules-dir=`pkg-config --variable=udevdir udev`/rules.d \ ac_cv_header_valgrind_memcheck_h=no \ @@ -38,12 +89,27 @@ EXTRA_OECONF = "\ # oe-core nor meta-oe, so let's not add a PACKAGECONFIG entry for it for now. EXTRA_OECONF += "--without-soxr" +# The FFTW dependency (for module-equalizer-sink) was removed in commit +# ddbd713293 without explaining why it was not made a PACKAGECONFIG item +# instead. Oh well, let's keep it disabled until someone expresses some +# interest in having it enabled. +# +# One nice thing about disabling this is that it also prevents qpaeq from +# being installed, so we avoid adding AGPL to the list of licenses (nothing +# else in PulseAudio is licensed under AGPL). +EXTRA_OECONF += "--without-fftw" + +# The "adrian" echo canceller implementation has a non-standard license +# (src/modules/echo-cancel/adrian-license.txt). It's a permissive license, so +# the licensing terms are probably not problematic, but it would be an extra +# hassle to add the license to OE-Core's set of licenses. The canceller isn't +# very good anyway, better alternatives exist (such as the webrtc canceller). +EXTRA_OECONF += "--disable-adrian-aec" + PACKAGECONFIG ??= "${@bb.utils.contains('DISTRO_FEATURES', 'bluetooth', '${BLUEZ}', '', d)} \ ${@bb.utils.contains('DISTRO_FEATURES', 'zeroconf', 'avahi', '', d)} \ - ${@bb.utils.contains('DISTRO_FEATURES', 'x11', 'x11', '', d)} \ ${@bb.utils.contains('DISTRO_FEATURES', '3g', 'ofono', '', d)} \ - ${@bb.utils.contains('DISTRO_FEATURES', 'systemd', 'systemd', '', d)} \ - ${@bb.utils.contains('DISTRO_FEATURES', 'ipv6', 'ipv6', '', d)} \ + ${@bb.utils.filter('DISTRO_FEATURES', 'ipv6 systemd x11', d)} \ dbus \ " @@ -62,6 +128,7 @@ PACKAGECONFIG[autospawn-for-root] = ",,," PACKAGECONFIG[lirc] = "--enable-lirc,--disable-lirc,lirc" PACKAGECONFIG[webrtc] = "--enable-webrtc-aec,--disable-webrtc-aec,webrtc-audio-processing" PACKAGECONFIG[ipv6] = "--enable-ipv6,--disable-ipv6," +PACKAGECONFIG[manpages] = "--enable-manpages, --disable-manpages, " EXTRA_OECONF_append_arm = "${@bb.utils.contains("TUNE_FEATURES", "neon", "", " --enable-neon-opt=no", d)}" EXTRA_OECONF_append_armeb = "${@bb.utils.contains("TUNE_FEATURES", "neon", "", " --enable-neon-opt=no", d)}" diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/pulseaudio/pulseaudio/0001-alsa-bluetooth-fail-if-user-requested-profile-doesn-.patch b/import-layers/yocto-poky/meta/recipes-multimedia/pulseaudio/pulseaudio/0001-alsa-bluetooth-fail-if-user-requested-profile-doesn-.patch deleted file mode 100644 index 2f72ceb33b..0000000000 --- a/import-layers/yocto-poky/meta/recipes-multimedia/pulseaudio/pulseaudio/0001-alsa-bluetooth-fail-if-user-requested-profile-doesn-.patch +++ /dev/null @@ -1,61 +0,0 @@ -From 9c3cdfcd198ef9727ea542f284ac6d8c1bcd7a3a Mon Sep 17 00:00:00 2001 -From: Tanu Kaskinen <tanuk@iki.fi> -Date: Fri, 23 Oct 2015 12:36:34 +0300 -Subject: [PATCH 1/5] alsa, bluetooth: fail if user-requested profile doesn't - exist - -If we can't fulfill the user request fully, I think we shouldn't -fulfill it at all, to make it clear that the requested operation -didn't succeed. - -Upstream-Status: Accepted [expected in 10.0] - -Signed-off-by: Tanu Kaskinen <tanuk@iki.fi> ---- - src/modules/alsa/module-alsa-card.c | 11 +++++++++-- - src/modules/bluetooth/module-bluez4-device.c | 7 +++++-- - 2 files changed, 14 insertions(+), 4 deletions(-) - -diff --git a/src/modules/alsa/module-alsa-card.c b/src/modules/alsa/module-alsa-card.c -index e5cc4ae..d761683 100644 ---- a/src/modules/alsa/module-alsa-card.c -+++ b/src/modules/alsa/module-alsa-card.c -@@ -799,8 +799,15 @@ int pa__init(pa_module *m) { - goto fail; - } - -- if ((profile = pa_modargs_get_value(u->modargs, "profile", NULL))) -- pa_card_new_data_set_profile(&data, profile); -+ if ((profile = pa_modargs_get_value(u->modargs, "profile", NULL))) { -+ if (pa_hashmap_get(data.profiles, profile)) -+ pa_card_new_data_set_profile(&data, profile); -+ else { -+ pa_log("No such profile: %s", profile); -+ pa_card_new_data_done(&data); -+ goto fail; -+ } -+ } - - u->card = pa_card_new(m->core, &data); - pa_card_new_data_done(&data); -diff --git a/src/modules/bluetooth/module-bluez4-device.c b/src/modules/bluetooth/module-bluez4-device.c -index 9a921a5..a2de525 100644 ---- a/src/modules/bluetooth/module-bluez4-device.c -+++ b/src/modules/bluetooth/module-bluez4-device.c -@@ -2301,8 +2301,11 @@ static int add_card(struct userdata *u) { - if ((default_profile = pa_modargs_get_value(u->modargs, "profile", NULL))) { - if (pa_hashmap_get(data.profiles, default_profile)) - pa_card_new_data_set_profile(&data, default_profile); -- else -- pa_log_warn("Profile '%s' not valid or not supported by device.", default_profile); -+ else { -+ pa_log("Profile '%s' not valid or not supported by device.", default_profile); -+ pa_card_new_data_done(&data); -+ return -1; -+ } - } - - u->card = pa_card_new(u->core, &data); --- -2.8.1 - diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/pulseaudio/pulseaudio/0002-card-don-t-allow-the-CARD_NEW-hook-to-fail.patch b/import-layers/yocto-poky/meta/recipes-multimedia/pulseaudio/pulseaudio/0002-card-don-t-allow-the-CARD_NEW-hook-to-fail.patch deleted file mode 100644 index 80c291f821..0000000000 --- a/import-layers/yocto-poky/meta/recipes-multimedia/pulseaudio/pulseaudio/0002-card-don-t-allow-the-CARD_NEW-hook-to-fail.patch +++ /dev/null @@ -1,37 +0,0 @@ -From d4e6d07fef28d1bd8bfbceab4cc196ef54c23dd8 Mon Sep 17 00:00:00 2001 -From: Tanu Kaskinen <tanuk@iki.fi> -Date: Tue, 7 Jun 2016 16:51:00 +0300 -Subject: [PATCH 2/5] card: don't allow the CARD_NEW hook to fail - -There is currently no use for allowing modules to cancel card creation, -and I don't see need for that in the future either. Let's simplify -things by removing the failure handling code. - -Upstream-Status: Accepted [expected in 10.0] - -Signed-off-by: Tanu Kaskinen <tanuk@iki.fi> ---- - src/pulsecore/card.c | 7 +------ - 1 file changed, 1 insertion(+), 6 deletions(-) - -diff --git a/src/pulsecore/card.c b/src/pulsecore/card.c -index 410746b..0ac70b9 100644 ---- a/src/pulsecore/card.c -+++ b/src/pulsecore/card.c -@@ -149,12 +149,7 @@ pa_card *pa_card_new(pa_core *core, pa_card_new_data *data) { - } - - pa_card_new_data_set_name(data, name); -- -- if (pa_hook_fire(&core->hooks[PA_CORE_HOOK_CARD_NEW], data) < 0) { -- pa_xfree(c); -- pa_namereg_unregister(core, name); -- return NULL; -- } -+ pa_hook_fire(&core->hooks[PA_CORE_HOOK_CARD_NEW], data); - - c->core = core; - c->name = pa_xstrdup(data->name); --- -2.8.1 - diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/pulseaudio/pulseaudio/0003-card-move-profile-selection-after-pa_card_new.patch b/import-layers/yocto-poky/meta/recipes-multimedia/pulseaudio/pulseaudio/0003-card-move-profile-selection-after-pa_card_new.patch deleted file mode 100644 index e0f424bbcc..0000000000 --- a/import-layers/yocto-poky/meta/recipes-multimedia/pulseaudio/pulseaudio/0003-card-move-profile-selection-after-pa_card_new.patch +++ /dev/null @@ -1,429 +0,0 @@ -From 0b98309fdbcd36fa92ab53e33c51b485b905e294 Mon Sep 17 00:00:00 2001 -From: Tanu Kaskinen <tanuk@iki.fi> -Date: Fri, 23 Oct 2015 12:59:53 +0300 -Subject: [PATCH 3/5] card: move profile selection after pa_card_new() - -I want module-alsa-card to set the availability of unavailable -profiles before the initial card profile gets selected, so that the -selection logic can use correct availability information. -module-alsa-card initializes the jack state after calling -pa_card_new(), however, and the profile selection happens in -pa_card_new(). This patch solves that by moving parts of pa_card_new() -to pa_card_choose_initial_profile() and pa_card_put(). - -pa_card_choose_initial_profile() applies the profile selection policy, -so module-alsa-card can first call pa_card_new(), then initialize the -jack state, and then call pa_card_choose_initial_profile(). After that -module-alsa-card can still override the profile selection policy, in -case module-alsa-card was loaded with the "profile" argument. Finally, -pa_card_put() finalizes the card creation. - -An alternative solution would have been to move the jack -initialization to happen before pa_card_new() and use pa_card_new_data -instead of pa_card in the jack initialization code, but I disliked -that idea (I want to get rid of the "new data" pattern eventually). - -The order in which the initial profile policy is applied is reversed -in this patch. Previously the first one to set it won, now the last -one to set it wins. I think this is better, because if you have N -parties that want to set the profile, we avoid checking N times -whether someone else has already set the profile. - -Upstream-Status: Accepted [expected in 10.0] - -Signed-off-by: Tanu Kaskinen <tanuk@iki.fi> ---- - src/modules/alsa/module-alsa-card.c | 32 +++++---- - src/modules/bluetooth/module-bluez4-device.c | 31 +++++---- - src/modules/bluetooth/module-bluez5-device.c | 2 + - src/modules/macosx/module-coreaudio-device.c | 2 + - src/modules/module-card-restore.c | 36 +++++++--- - src/pulsecore/card.c | 99 +++++++++++++++++----------- - src/pulsecore/card.h | 9 +++ - src/pulsecore/core.h | 1 + - 8 files changed, 143 insertions(+), 69 deletions(-) - -diff --git a/src/modules/alsa/module-alsa-card.c b/src/modules/alsa/module-alsa-card.c -index d761683..1976230 100644 ---- a/src/modules/alsa/module-alsa-card.c -+++ b/src/modules/alsa/module-alsa-card.c -@@ -671,7 +671,7 @@ int pa__init(pa_module *m) { - struct userdata *u; - pa_reserve_wrapper *reserve = NULL; - const char *description; -- const char *profile = NULL; -+ const char *profile_str = NULL; - char *fn = NULL; - bool namereg_fail = false; - -@@ -799,16 +799,6 @@ int pa__init(pa_module *m) { - goto fail; - } - -- if ((profile = pa_modargs_get_value(u->modargs, "profile", NULL))) { -- if (pa_hashmap_get(data.profiles, profile)) -- pa_card_new_data_set_profile(&data, profile); -- else { -- pa_log("No such profile: %s", profile); -- pa_card_new_data_done(&data); -- goto fail; -- } -- } -- - u->card = pa_card_new(m->core, &data); - pa_card_new_data_done(&data); - -@@ -822,6 +812,26 @@ int pa__init(pa_module *m) { - (pa_hook_cb_t) card_suspend_changed, u); - - init_jacks(u); -+ -+ pa_card_choose_initial_profile(u->card); -+ -+ /* If the "profile" modarg is given, we have to override whatever the usual -+ * policy chose in pa_card_choose_initial_profile(). */ -+ profile_str = pa_modargs_get_value(u->modargs, "profile", NULL); -+ if (profile_str) { -+ pa_card_profile *profile; -+ -+ profile = pa_hashmap_get(u->card->profiles, profile_str); -+ if (!profile) { -+ pa_log("No such profile: %s", profile_str); -+ goto fail; -+ } -+ -+ pa_card_set_profile(u->card, profile, false); -+ } -+ -+ pa_card_put(u->card); -+ - init_profile(u); - init_eld_ctls(u); - -diff --git a/src/modules/bluetooth/module-bluez4-device.c b/src/modules/bluetooth/module-bluez4-device.c -index a2de525..13fb7ab 100644 ---- a/src/modules/bluetooth/module-bluez4-device.c -+++ b/src/modules/bluetooth/module-bluez4-device.c -@@ -2238,7 +2238,7 @@ static int add_card(struct userdata *u) { - pa_bluez4_profile_t *d; - pa_bluez4_form_factor_t ff; - char *n; -- const char *default_profile; -+ const char *profile_str; - const pa_bluez4_device *device; - const pa_bluez4_uuid *uuid; - -@@ -2298,16 +2298,6 @@ static int add_card(struct userdata *u) { - *d = PA_BLUEZ4_PROFILE_OFF; - pa_hashmap_put(data.profiles, p->name, p); - -- if ((default_profile = pa_modargs_get_value(u->modargs, "profile", NULL))) { -- if (pa_hashmap_get(data.profiles, default_profile)) -- pa_card_new_data_set_profile(&data, default_profile); -- else { -- pa_log("Profile '%s' not valid or not supported by device.", default_profile); -- pa_card_new_data_done(&data); -- return -1; -- } -- } -- - u->card = pa_card_new(u->core, &data); - pa_card_new_data_done(&data); - -@@ -2319,6 +2309,25 @@ static int add_card(struct userdata *u) { - u->card->userdata = u; - u->card->set_profile = card_set_profile; - -+ pa_card_choose_initial_profile(u->card); -+ -+ /* If the "profile" modarg is given, we have to override whatever the usual -+ * policy chose in pa_card_choose_initial_profile(). */ -+ profile_str = pa_modargs_get_value(u->modargs, "profile", NULL); -+ if (profile_str) { -+ pa_card_profile *profile; -+ -+ profile = pa_hashmap_get(u->card->profiles, profile_str); -+ if (!profile) { -+ pa_log("No such profile: %s", profile_str); -+ return -1; -+ } -+ -+ pa_card_set_profile(u->card, profile, false); -+ } -+ -+ pa_card_put(u->card); -+ - d = PA_CARD_PROFILE_DATA(u->card->active_profile); - - if (*d != PA_BLUEZ4_PROFILE_OFF && (!device->transports[*d] || -diff --git a/src/modules/bluetooth/module-bluez5-device.c b/src/modules/bluetooth/module-bluez5-device.c -index 84e6d55..498d0e1 100644 ---- a/src/modules/bluetooth/module-bluez5-device.c -+++ b/src/modules/bluetooth/module-bluez5-device.c -@@ -1953,6 +1953,8 @@ static int add_card(struct userdata *u) { - - u->card->userdata = u; - u->card->set_profile = set_profile_cb; -+ pa_card_choose_initial_profile(u->card); -+ pa_card_put(u->card); - - p = PA_CARD_PROFILE_DATA(u->card->active_profile); - u->profile = *p; -diff --git a/src/modules/macosx/module-coreaudio-device.c b/src/modules/macosx/module-coreaudio-device.c -index 6c9e55d..d91c656 100644 ---- a/src/modules/macosx/module-coreaudio-device.c -+++ b/src/modules/macosx/module-coreaudio-device.c -@@ -821,6 +821,8 @@ int pa__init(pa_module *m) { - pa_card_new_data_done(&card_new_data); - u->card->userdata = u; - u->card->set_profile = card_set_profile; -+ pa_card_choose_initial_profile(u->card); -+ pa_card_put(u->card); - - u->rtpoll = pa_rtpoll_new(); - pa_thread_mq_init(&u->thread_mq, m->core->mainloop, u->rtpoll); -diff --git a/src/modules/module-card-restore.c b/src/modules/module-card-restore.c -index 7545aa5..718a0dd 100644 ---- a/src/modules/module-card-restore.c -+++ b/src/modules/module-card-restore.c -@@ -551,16 +551,6 @@ static pa_hook_result_t card_new_hook_callback(pa_core *c, pa_card_new_data *new - if (!(e = entry_read(u, new_data->name))) - return PA_HOOK_OK; - -- if (e->profile[0]) { -- if (!new_data->active_profile) { -- pa_card_new_data_set_profile(new_data, e->profile); -- pa_log_info("Restored profile '%s' for card %s.", new_data->active_profile, new_data->name); -- new_data->save_profile = true; -- -- } else -- pa_log_debug("Not restoring profile for card %s, because already set.", new_data->name); -- } -- - /* Always restore the latency offsets because their - * initial value is always 0 */ - -@@ -590,6 +580,30 @@ static pa_hook_result_t card_new_hook_callback(pa_core *c, pa_card_new_data *new - return PA_HOOK_OK; - } - -+static pa_hook_result_t card_choose_initial_profile_callback(pa_core *core, pa_card *card, struct userdata *u) { -+ struct entry *e; -+ -+ if (!(e = entry_read(u, card->name))) -+ return PA_HOOK_OK; -+ -+ if (e->profile[0]) { -+ pa_card_profile *profile; -+ -+ profile = pa_hashmap_get(card->profiles, e->profile); -+ if (profile) { -+ pa_log_info("Restoring profile '%s' for card %s.", card->active_profile->name, card->name); -+ pa_card_set_profile(card, profile, true); -+ } else { -+ pa_log_debug("Tried to restore profile %s for card %s, but the card doesn't have such profile.", -+ e->profile, card->name); -+ } -+ } -+ -+ entry_free(e); -+ -+ return PA_HOOK_OK; -+} -+ - static pa_hook_result_t card_preferred_port_changed_callback(pa_core *core, pa_card_preferred_port_changed_hook_data *data, - struct userdata *u) { - struct entry *e; -@@ -634,6 +648,8 @@ int pa__init(pa_module*m) { - u->module = m; - - pa_module_hook_connect(m, &m->core->hooks[PA_CORE_HOOK_CARD_NEW], PA_HOOK_EARLY, (pa_hook_cb_t) card_new_hook_callback, u); -+ pa_module_hook_connect(m, &m->core->hooks[PA_CORE_HOOK_CARD_CHOOSE_INITIAL_PROFILE], PA_HOOK_NORMAL, -+ (pa_hook_cb_t) card_choose_initial_profile_callback, u); - pa_module_hook_connect(m, &m->core->hooks[PA_CORE_HOOK_CARD_PUT], PA_HOOK_NORMAL, (pa_hook_cb_t) card_put_hook_callback, u); - pa_module_hook_connect(m, &m->core->hooks[PA_CORE_HOOK_CARD_PREFERRED_PORT_CHANGED], PA_HOOK_NORMAL, (pa_hook_cb_t) card_preferred_port_changed_callback, u); - pa_module_hook_connect(m, &m->core->hooks[PA_CORE_HOOK_CARD_PROFILE_CHANGED], PA_HOOK_NORMAL, (pa_hook_cb_t) card_profile_changed_callback, u); -diff --git a/src/pulsecore/card.c b/src/pulsecore/card.c -index 0ac70b9..a0c3d93 100644 ---- a/src/pulsecore/card.c -+++ b/src/pulsecore/card.c -@@ -176,38 +176,56 @@ pa_card *pa_card_new(pa_core *core, pa_card_new_data *data) { - c->preferred_input_port = data->preferred_input_port; - c->preferred_output_port = data->preferred_output_port; - -- if (data->active_profile) -- if ((c->active_profile = pa_hashmap_get(c->profiles, data->active_profile))) -- c->save_profile = data->save_profile; -+ pa_device_init_description(c->proplist, c); -+ pa_device_init_icon(c->proplist, true); -+ pa_device_init_intended_roles(c->proplist); - -- if (!c->active_profile) { -- PA_HASHMAP_FOREACH(profile, c->profiles, state) { -- if (profile->available == PA_AVAILABLE_NO) -- continue; -+ return c; -+} - -- if (!c->active_profile || profile->priority > c->active_profile->priority) -- c->active_profile = profile; -- } -- /* If all profiles are not available, then we still need to pick one */ -- if (!c->active_profile) { -- PA_HASHMAP_FOREACH(profile, c->profiles, state) -- if (!c->active_profile || profile->priority > c->active_profile->priority) -- c->active_profile = profile; -+void pa_card_choose_initial_profile(pa_card *card) { -+ pa_card_profile *profile; -+ void *state; -+ pa_card_profile *best = NULL; -+ -+ pa_assert(card); -+ -+ /* By default, pick the highest priority profile that is not unavailable, -+ * or if all profiles are unavailable, pick the profile with the highest -+ * priority regardless of its availability. */ -+ -+ PA_HASHMAP_FOREACH(profile, card->profiles, state) { -+ if (profile->available == PA_AVAILABLE_NO) -+ continue; -+ -+ if (!best || profile->priority > best->priority) -+ best = profile; -+ } -+ -+ if (!best) { -+ PA_HASHMAP_FOREACH(profile, card->profiles, state) { -+ if (!best || profile->priority > best->priority) -+ best = profile; - } -- pa_assert(c->active_profile); - } -+ pa_assert(best); - -- pa_device_init_description(c->proplist, c); -- pa_device_init_icon(c->proplist, true); -- pa_device_init_intended_roles(c->proplist); -+ card->active_profile = best; -+ card->save_profile = false; - -- pa_assert_se(pa_idxset_put(core->cards, c, &c->index) >= 0); -+ /* Let policy modules override the default. */ -+ pa_hook_fire(&card->core->hooks[PA_CORE_HOOK_CARD_CHOOSE_INITIAL_PROFILE], card); -+} - -- pa_log_info("Created %u \"%s\"", c->index, c->name); -- pa_subscription_post(core, PA_SUBSCRIPTION_EVENT_CARD|PA_SUBSCRIPTION_EVENT_NEW, c->index); -+void pa_card_put(pa_card *card) { -+ pa_assert(card); - -- pa_hook_fire(&core->hooks[PA_CORE_HOOK_CARD_PUT], c); -- return c; -+ pa_assert_se(pa_idxset_put(card->core->cards, card, &card->index) >= 0); -+ card->linked = true; -+ -+ pa_log_info("Created %u \"%s\"", card->index, card->name); -+ pa_hook_fire(&card->core->hooks[PA_CORE_HOOK_CARD_PUT], card); -+ pa_subscription_post(card->core, PA_SUBSCRIPTION_EVENT_CARD|PA_SUBSCRIPTION_EVENT_NEW, card->index); - } - - void pa_card_free(pa_card *c) { -@@ -218,15 +236,15 @@ void pa_card_free(pa_card *c) { - - core = c->core; - -- pa_hook_fire(&core->hooks[PA_CORE_HOOK_CARD_UNLINK], c); -- -- pa_namereg_unregister(core, c->name); -- -- pa_idxset_remove_by_data(c->core->cards, c, NULL); -+ if (c->linked) { -+ pa_hook_fire(&core->hooks[PA_CORE_HOOK_CARD_UNLINK], c); - -- pa_log_info("Freed %u \"%s\"", c->index, c->name); -+ pa_idxset_remove_by_data(c->core->cards, c, NULL); -+ pa_log_info("Freed %u \"%s\"", c->index, c->name); -+ pa_subscription_post(c->core, PA_SUBSCRIPTION_EVENT_CARD|PA_SUBSCRIPTION_EVENT_REMOVE, c->index); -+ } - -- pa_subscription_post(c->core, PA_SUBSCRIPTION_EVENT_CARD|PA_SUBSCRIPTION_EVENT_REMOVE, c->index); -+ pa_namereg_unregister(core, c->name); - - pa_assert(pa_idxset_isempty(c->sinks)); - pa_idxset_free(c->sinks, NULL); -@@ -298,20 +316,27 @@ int pa_card_set_profile(pa_card *c, pa_card_profile *profile, bool save) { - return 0; - } - -- if ((r = c->set_profile(c, profile)) < 0) -+ /* If we're setting the initial profile, we shouldn't call set_profile(), -+ * because the implementations don't expect that (for historical reasons). -+ * We should just set c->active_profile, and the implementations will -+ * properly set up that profile after pa_card_put() has returned. It would -+ * be probably good to change this so that also the initial profile can be -+ * set up in set_profile(), but if set_profile() fails, that would need -+ * some better handling than what we do here currently. */ -+ if (c->linked && (r = c->set_profile(c, profile)) < 0) - return r; - -- pa_subscription_post(c->core, PA_SUBSCRIPTION_EVENT_CARD|PA_SUBSCRIPTION_EVENT_CHANGE, c->index); -- -- pa_log_info("Changed profile of card %u \"%s\" to %s", c->index, c->name, profile->name); -- - c->active_profile = profile; - c->save_profile = save; - - if (save) - update_port_preferred_profile(c); - -- pa_hook_fire(&c->core->hooks[PA_CORE_HOOK_CARD_PROFILE_CHANGED], c); -+ if (c->linked) { -+ pa_log_info("Changed profile of card %u \"%s\" to %s", c->index, c->name, profile->name); -+ pa_hook_fire(&c->core->hooks[PA_CORE_HOOK_CARD_PROFILE_CHANGED], c); -+ pa_subscription_post(c->core, PA_SUBSCRIPTION_EVENT_CARD|PA_SUBSCRIPTION_EVENT_CHANGE, c->index); -+ } - - return 0; - } -diff --git a/src/pulsecore/card.h b/src/pulsecore/card.h -index d4970e3..fd1fe0a 100644 ---- a/src/pulsecore/card.h -+++ b/src/pulsecore/card.h -@@ -86,6 +86,8 @@ struct pa_card { - - pa_suspend_cause_t suspend_cause; - -+ bool linked; -+ - void *userdata; - - int (*set_profile)(pa_card *c, pa_card_profile *profile); -@@ -128,6 +130,13 @@ void pa_card_new_data_set_preferred_port(pa_card_new_data *data, pa_direction_t - void pa_card_new_data_done(pa_card_new_data *data); - - pa_card *pa_card_new(pa_core *c, pa_card_new_data *data); -+ -+/* Select the initial card profile according to the configured policies. This -+ * must be called between pa_card_new() and pa_card_put(), after the port and -+ * profile availablities have been initialized. */ -+void pa_card_choose_initial_profile(pa_card *card); -+ -+void pa_card_put(pa_card *c); - void pa_card_free(pa_card *c); - - void pa_card_add_profile(pa_card *c, pa_card_profile *profile); -diff --git a/src/pulsecore/core.h b/src/pulsecore/core.h -index 00d7f2f..802111b 100644 ---- a/src/pulsecore/core.h -+++ b/src/pulsecore/core.h -@@ -118,6 +118,7 @@ typedef enum pa_core_hook { - PA_CORE_HOOK_CLIENT_PROPLIST_CHANGED, - PA_CORE_HOOK_CLIENT_SEND_EVENT, - PA_CORE_HOOK_CARD_NEW, -+ PA_CORE_HOOK_CARD_CHOOSE_INITIAL_PROFILE, - PA_CORE_HOOK_CARD_PUT, - PA_CORE_HOOK_CARD_UNLINK, - PA_CORE_HOOK_CARD_PREFERRED_PORT_CHANGED, --- -2.8.1 - diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/pulseaudio/pulseaudio/0004-card-remove-pa_card_new_data.active_profile.patch b/import-layers/yocto-poky/meta/recipes-multimedia/pulseaudio/pulseaudio/0004-card-remove-pa_card_new_data.active_profile.patch deleted file mode 100644 index 480f2cea41..0000000000 --- a/import-layers/yocto-poky/meta/recipes-multimedia/pulseaudio/pulseaudio/0004-card-remove-pa_card_new_data.active_profile.patch +++ /dev/null @@ -1,72 +0,0 @@ -From 375bc56fd3d66f40a9650224e5bfea4002494ade Mon Sep 17 00:00:00 2001 -From: Tanu Kaskinen <tanuk@iki.fi> -Date: Fri, 23 Oct 2015 13:50:35 +0300 -Subject: [PATCH 4/5] card: remove pa_card_new_data.active_profile - -It's not being used any more. - -Upstream-Status: Accepted [expected in 10.0] - -Signed-off-by: Tanu Kaskinen <tanuk@iki.fi> ---- - src/pulsecore/card.c | 8 -------- - src/pulsecore/card.h | 5 ----- - 2 files changed, 13 deletions(-) - -diff --git a/src/pulsecore/card.c b/src/pulsecore/card.c -index a0c3d93..bc5b75b 100644 ---- a/src/pulsecore/card.c -+++ b/src/pulsecore/card.c -@@ -96,13 +96,6 @@ void pa_card_new_data_set_name(pa_card_new_data *data, const char *name) { - data->name = pa_xstrdup(name); - } - --void pa_card_new_data_set_profile(pa_card_new_data *data, const char *profile) { -- pa_assert(data); -- -- pa_xfree(data->active_profile); -- data->active_profile = pa_xstrdup(profile); --} -- - void pa_card_new_data_set_preferred_port(pa_card_new_data *data, pa_direction_t direction, pa_device_port *port) { - pa_assert(data); - -@@ -125,7 +118,6 @@ void pa_card_new_data_done(pa_card_new_data *data) { - pa_hashmap_free(data->ports); - - pa_xfree(data->name); -- pa_xfree(data->active_profile); - } - - pa_card *pa_card_new(pa_core *core, pa_card_new_data *data) { -diff --git a/src/pulsecore/card.h b/src/pulsecore/card.h -index fd1fe0a..5699475 100644 ---- a/src/pulsecore/card.h -+++ b/src/pulsecore/card.h -@@ -101,15 +101,11 @@ typedef struct pa_card_new_data { - pa_module *module; - - pa_hashmap *profiles; -- char *active_profile; -- - pa_hashmap *ports; - pa_device_port *preferred_input_port; - pa_device_port *preferred_output_port; - - bool namereg_fail:1; -- -- bool save_profile:1; - } pa_card_new_data; - - typedef struct { -@@ -125,7 +121,6 @@ void pa_card_profile_set_available(pa_card_profile *c, pa_available_t available) - - pa_card_new_data *pa_card_new_data_init(pa_card_new_data *data); - void pa_card_new_data_set_name(pa_card_new_data *data, const char *name); --void pa_card_new_data_set_profile(pa_card_new_data *data, const char *profile); - void pa_card_new_data_set_preferred_port(pa_card_new_data *data, pa_direction_t direction, pa_device_port *port); - void pa_card_new_data_done(pa_card_new_data *data); - --- -2.8.1 - diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/pulseaudio/pulseaudio/0005-alsa-set-availability-for-some-unavailable-profiles.patch b/import-layers/yocto-poky/meta/recipes-multimedia/pulseaudio/pulseaudio/0005-alsa-set-availability-for-some-unavailable-profiles.patch deleted file mode 100644 index 5563d2c352..0000000000 --- a/import-layers/yocto-poky/meta/recipes-multimedia/pulseaudio/pulseaudio/0005-alsa-set-availability-for-some-unavailable-profiles.patch +++ /dev/null @@ -1,79 +0,0 @@ -From ae6a01ba204b480bda6a5b4431be3d22e53a7006 Mon Sep 17 00:00:00 2001 -From: Tanu Kaskinen <tanuk@iki.fi> -Date: Fri, 23 Oct 2015 13:37:11 +0300 -Subject: [PATCH 5/5] alsa: set availability for (some) unavailable profiles - -The alsa card hasn't so far set any availability for profiles. That -caused an issue with some HDMI hardware: the sound card has two HDMI -outputs, but only the second of them is actually usable. The -unavailable port is marked as unavailable and the available port is -marked as available, but this information isn't propagated to the -profile availability. Without profile availability information, the -initial profile policy picks the unavailable one, since it has a -higher priority value. - -This patch adds simple logic for marking some profiles unavailable: -if the profile only contains unavailable ports, the profile is -unavailable too. This can be improved in the future so that if a -profile contains sinks or sources that only contain unavailable ports, -the profile should be marked as unavailable. Implementing that -requires adding more information about the sinks and sources to -pa_card_profile, however. - -BugLink: https://bugzilla.yoctoproject.org/show_bug.cgi?id=8448 - -Upstream-Status: Accepted [expected in 10.0] - -Signed-off-by: Tanu Kaskinen <tanuk@iki.fi> ---- - src/modules/alsa/module-alsa-card.c | 27 +++++++++++++++++++++++++++ - 1 file changed, 27 insertions(+) - -diff --git a/src/modules/alsa/module-alsa-card.c b/src/modules/alsa/module-alsa-card.c -index 1976230..323e08a 100644 ---- a/src/modules/alsa/module-alsa-card.c -+++ b/src/modules/alsa/module-alsa-card.c -@@ -366,6 +366,7 @@ static int report_jack_state(snd_mixer_elem_t *melem, unsigned int mask) { - void *state; - pa_alsa_jack *jack; - struct temp_port_avail *tp, *tports; -+ pa_card_profile *profile; - - pa_assert(u); - -@@ -426,6 +427,32 @@ static int report_jack_state(snd_mixer_elem_t *melem, unsigned int mask) { - if (tp->avail == PA_AVAILABLE_NO) - pa_device_port_set_available(tp->port, tp->avail); - -+ /* Update profile availabilities. The logic could be improved; for now we -+ * only set obviously unavailable profiles (those that contain only -+ * unavailable ports) to PA_AVAILABLE_NO and all others to -+ * PA_AVAILABLE_UNKNOWN. */ -+ PA_HASHMAP_FOREACH(profile, u->card->profiles, state) { -+ pa_device_port *port; -+ void *state2; -+ pa_available_t available = PA_AVAILABLE_NO; -+ -+ /* Don't touch the "off" profile. */ -+ if (profile->n_sources == 0 && profile->n_sinks == 0) -+ continue; -+ -+ PA_HASHMAP_FOREACH(port, u->card->ports, state2) { -+ if (!pa_hashmap_get(port->profiles, profile->name)) -+ continue; -+ -+ if (port->available != PA_AVAILABLE_NO) { -+ available = PA_AVAILABLE_UNKNOWN; -+ break; -+ } -+ } -+ -+ pa_card_profile_set_available(profile, available); -+ } -+ - pa_xfree(tports); - return 0; - } --- -2.8.1 - diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/pulseaudio/pulseaudio_10.0.bb b/import-layers/yocto-poky/meta/recipes-multimedia/pulseaudio/pulseaudio_10.0.bb new file mode 100644 index 0000000000..f3a85737fc --- /dev/null +++ b/import-layers/yocto-poky/meta/recipes-multimedia/pulseaudio/pulseaudio_10.0.bb @@ -0,0 +1,14 @@ +require pulseaudio.inc + +SRC_URI = "http://freedesktop.org/software/pulseaudio/releases/${BP}.tar.xz \ + file://0001-padsp-Make-it-compile-on-musl.patch \ + file://0001-client-conf-Add-allow-autospawn-for-root.patch \ + file://volatiles.04_pulse \ +" +SRC_URI[md5sum] = "4950d2799bf55ab91f6b7f990b7f0971" +SRC_URI[sha256sum] = "a3186824de9f0d2095ded5d0d0db0405dc73133983c2fbb37291547e37462f57" + +do_compile_prepend() { + mkdir -p ${S}/libltdl + cp ${STAGING_LIBDIR}/libltdl* ${S}/libltdl +} diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/pulseaudio/pulseaudio_9.0.bb b/import-layers/yocto-poky/meta/recipes-multimedia/pulseaudio/pulseaudio_9.0.bb deleted file mode 100644 index 00f5442b85..0000000000 --- a/import-layers/yocto-poky/meta/recipes-multimedia/pulseaudio/pulseaudio_9.0.bb +++ /dev/null @@ -1,19 +0,0 @@ -require pulseaudio.inc - -SRC_URI = "http://freedesktop.org/software/pulseaudio/releases/${BP}.tar.xz \ - file://0001-padsp-Make-it-compile-on-musl.patch \ - file://0001-client-conf-Add-allow-autospawn-for-root.patch \ - file://0001-alsa-bluetooth-fail-if-user-requested-profile-doesn-.patch \ - file://0002-card-don-t-allow-the-CARD_NEW-hook-to-fail.patch \ - file://0003-card-move-profile-selection-after-pa_card_new.patch \ - file://0004-card-remove-pa_card_new_data.active_profile.patch \ - file://0005-alsa-set-availability-for-some-unavailable-profiles.patch \ - file://volatiles.04_pulse \ -" -SRC_URI[md5sum] = "da7162541b3a9bc20576dbd0d7d1489a" -SRC_URI[sha256sum] = "c3d3d66b827f18fbe903fe3df647013f09fc1e2191c035be1ee2d82a9e404686" - -do_compile_prepend() { - mkdir -p ${S}/libltdl - cp ${STAGING_LIBDIR}/libltdl* ${S}/libltdl -} diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/tremor/tremor/obsolete_automake_macros.patch b/import-layers/yocto-poky/meta/recipes-multimedia/tremor/tremor/obsolete_automake_macros.patch deleted file mode 100644 index 7e5102903b..0000000000 --- a/import-layers/yocto-poky/meta/recipes-multimedia/tremor/tremor/obsolete_automake_macros.patch +++ /dev/null @@ -1,15 +0,0 @@ -Upstream-Status: Submitted [https://trac.xiph.org/ticket/1922] - -Signed-off-by: Marko Lindqvist <cazfi74@gmail.com> -Index: configure.in -=================================================================== ---- configure.in (revision 18764) -+++ configure.in (working copy) -@@ -9,7 +9,7 @@ - AC_CANONICAL_HOST - AC_CANONICAL_TARGET - --AM_CONFIG_HEADER([config.h]) -+AC_CONFIG_HEADERS([config.h]) - - AM_INIT_AUTOMAKE(libvorbisidec,1.2.1) diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/tremor/tremor/tremor-arm-thumb2.patch b/import-layers/yocto-poky/meta/recipes-multimedia/tremor/tremor/tremor-arm-thumb2.patch deleted file mode 100644 index 2049542227..0000000000 --- a/import-layers/yocto-poky/meta/recipes-multimedia/tremor/tremor/tremor-arm-thumb2.patch +++ /dev/null @@ -1,104 +0,0 @@ -From: Xin Ouyang <Xin.Ouyang@windriver.com> -Date: Mon, 16 Jul 2012 13:29:34 +0800 -Subject: [PATCH] tremor: add IT instructions for arm thumb2 tune flags. - -Upstream-Status: Pending - -In Thumb-2, most instructions do not have a built in condition code (except for -conditional branches). Instead, short sequences of instructions which are to be -executed conditionally can be preceded by a special "IT instruction" which -describes the condition and which of the following instructions should be -executed if the condition is false respectively. - -For the ARM/Thumb IT(If-Then) instruction: -http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0489c/Cjabicci.html - -Signed-off-by: Xin Ouyang <Xin.Ouyang@windriver.com> ---- - asm_arm.h | 14 ++++++++++++++ - 1 file changed, 14 insertions(+) - -diff --git a/asm_arm.h b/asm_arm.h -index c3bda00..823c54f 100755 ---- a/asm_arm.h -+++ b/asm_arm.h -@@ -108,9 +108,11 @@ static inline void XNPROD31(ogg_int32_t a, ogg_int32_t b, - static inline ogg_int32_t CLIP_TO_15(ogg_int32_t x) { - int tmp; - asm volatile("subs %1, %0, #32768\n\t" -+ "itt pl\n\t" - "movpl %0, #0x7f00\n\t" - "orrpl %0, %0, #0xff\n" - "adds %1, %0, #32768\n\t" -+ "it mi\n\t" - "movmi %0, #0x8000" - : "+r"(x),"=r"(tmp) - : -@@ -139,10 +141,12 @@ static inline void lsp_loop_asm(ogg_uint32_t *qip,ogg_uint32_t *pip, - - "ldmdb r0!,{r1,r3};" - "subs r1,r1,%4;" //ilsp[j]-wi -+ "it mi;" - "rsbmi r1,r1,#0;" //labs(ilsp[j]-wi) - "umull %0,r2,r1,%0;" //qi*=labs(ilsp[j]-wi) - - "subs r1,r3,%4;" //ilsp[j+1]-wi -+ "it mi;" - "rsbmi r1,r1,#0;" //labs(ilsp[j+1]-wi) - "umull %1,r3,r1,%1;" //pi*=labs(ilsp[j+1]-wi) - -@@ -167,6 +171,7 @@ static inline void lsp_loop_asm(ogg_uint32_t *qip,ogg_uint32_t *pip, - "mov r0,#0x4000;\n" - - "subs r1,r1,%4;\n" //ilsp[j]-wi -+ "it mi;\n" - "rsbmi r1,r1,#0;\n" //labs(ilsp[j]-wi) - "umull %0,r2,r1,%0;\n" //qi*=labs(ilsp[j]-wi) - "umull %1,r3,r0,%1;\n" //pi*=labs(ilsp[j+1]-wi) -@@ -190,18 +195,23 @@ static inline void lsp_loop_asm(ogg_uint32_t *qip,ogg_uint32_t *pip, - "mov r2,#0;" - "orr r1,%0,%1;" - "tst r1,#0xff000000;" -+ "itt ne;" - "addne r2,r2,#8;" - "movne r1,r1,lsr #8;" - "tst r1,#0x00f00000;" -+ "itt ne;" - "addne r2,r2,#4;" - "movne r1,r1,lsr #4;" - "tst r1,#0x000c0000;" -+ "itt ne;" - "addne r2,r2,#2;" - "movne r1,r1,lsr #2;" - "tst r1,#0x00020000;" -+ "itt ne;" - "addne r2,r2,#1;" - "movne r1,r1,lsr #1;" - "tst r1,#0x00010000;" -+ "it ne;" - "addne r2,r2,#1;" - "mov %0,%0,lsr r2;" - "mov %1,%1,lsr r2;" -@@ -222,15 +232,19 @@ static inline void lsp_norm_asm(ogg_uint32_t *qip,ogg_int32_t *qexpp){ - ogg_int32_t qexp=*qexpp; - - asm("tst %0,#0x0000ff00;" -+ "itt eq;" - "moveq %0,%0,lsl #8;" - "subeq %1,%1,#8;" - "tst %0,#0x0000f000;" -+ "itt eq;" - "moveq %0,%0,lsl #4;" - "subeq %1,%1,#4;" - "tst %0,#0x0000c000;" -+ "itt eq;" - "moveq %0,%0,lsl #2;" - "subeq %1,%1,#2;" - "tst %0,#0x00008000;" -+ "itt eq;" - "moveq %0,%0,lsl #1;" - "subeq %1,%1,#1;" - : "+r"(qi),"+r"(qexp) --- -1.7.9.5 - diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/tremor/tremor_20150107.bb b/import-layers/yocto-poky/meta/recipes-multimedia/tremor/tremor_20150107.bb deleted file mode 100644 index 937894a73a..0000000000 --- a/import-layers/yocto-poky/meta/recipes-multimedia/tremor/tremor_20150107.bb +++ /dev/null @@ -1,27 +0,0 @@ -SUMMARY = "Fixed-point decoder" -DESCRIPTION = "tremor is a fixed point implementation of the vorbis codec." -SECTION = "libs" -LICENSE = "BSD" -LIC_FILES_CHKSUM = "file://COPYING;md5=db1b7a668b2a6f47b2af88fb008ad555 \ - file://os.h;beginline=3;endline=14;md5=5c0af5e1bedef3ce8178c89f48cd6f1f" -DEPENDS = "libogg" -SRCDATE = "${PV}" -PR = "r1" - -# SVN support for upstream version check isn't implemented yet -RECIPE_UPSTREAM_VERSION = "20150107" -RECIPE_UPSTREAM_DATE = "Jan 07, 2015" -CHECK_DATE = "Aug 12, 2015" - -SRC_URI = "svn://svn.xiph.org/trunk;module=Tremor;rev=19427;protocol=http \ - file://obsolete_automake_macros.patch;striplevel=0 \ - file://tremor-arm-thumb2.patch \ -" - -S = "${WORKDIR}/Tremor" - -inherit autotools pkgconfig - -EXTRA_OECONF = "--enable-shared" - -ARM_INSTRUCTION_SET = "arm" diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/webp/libwebp_0.5.1.bb b/import-layers/yocto-poky/meta/recipes-multimedia/webp/libwebp_0.6.0.bb index b882db75b6..bc565e9019 100644 --- a/import-layers/yocto-poky/meta/recipes-multimedia/webp/libwebp_0.5.1.bb +++ b/import-layers/yocto-poky/meta/recipes-multimedia/webp/libwebp_0.6.0.bb @@ -14,8 +14,8 @@ LIC_FILES_CHKSUM = "file://COPYING;md5=6e8dee932c26f2dab503abf70c96d8bb \ file://PATENTS;md5=c6926d0cb07d296f886ab6e0cc5a85b7" SRC_URI = "http://downloads.webmproject.org/releases/webp/${BP}.tar.gz" -SRC_URI[md5sum] = "3d7db92ebba5b4f679413d25c6040881" -SRC_URI[sha256sum] = "6ad66c6fcd60a023de20b6856b03da8c7d347269d76b1fd9c3287e8b5e8813df" +SRC_URI[md5sum] = "19a6e926ab1721268df03161b84bb4a0" +SRC_URI[sha256sum] = "c928119229d4f8f35e20113ffb61f281eda267634a8dc2285af4b0ee27cf2b40" UPSTREAM_CHECK_URI = "http://downloads.webmproject.org/releases/webp/index.html" diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/x264/x264/Fix-X32-build-by-disabling-asm.patch b/import-layers/yocto-poky/meta/recipes-multimedia/x264/x264/Fix-X32-build-by-disabling-asm.patch new file mode 100644 index 0000000000..087a448eec --- /dev/null +++ b/import-layers/yocto-poky/meta/recipes-multimedia/x264/x264/Fix-X32-build-by-disabling-asm.patch @@ -0,0 +1,53 @@ +From 66b120079fb21ed38cab0900c63360b0a7853eaa Mon Sep 17 00:00:00 2001 +From: Christopher Larson <chris_larson@mentor.com> +Date: Tue, 13 Dec 2016 14:22:32 -0700 +Subject: [PATCH] Fix X32 build by disabling asm + +This applies gentoo's x32 patch, adjusted slightly, which disables asm support +for x32 as well as correcting -m. + +Debian has a different patch which does the same, and there's a superior yet +out of date patch series on the x264 list which keeps asm support enabled, but +doesn't successfully build at this time, and my assembly is very rusty. + +Upstream-Status: Pending +Signed-off-by: Christopher Larson <chris_larson@mentor.com> +--- + configure | 14 ++++++++++++-- + 1 file changed, 12 insertions(+), 2 deletions(-) + +diff --git a/configure b/configure +index 3109ec4..844aeae 100755 +--- a/configure ++++ b/configure +@@ -703,7 +703,13 @@ case $host_cpu in + AS_EXT=".asm" + ASFLAGS="$ASFLAGS -DARCH_X86_64=1 -I\$(SRCPATH)/common/x86/" + stack_alignment=16 +- [ $compiler = GNU ] && CFLAGS="-m64 $CFLAGS" && LDFLAGS="-m64 $LDFLAGS" ++ if [ $compiler = GNU ]; then ++ if cpp_check "" "" "__ILP32__" ; then ++ CFLAGS="-mx32 $CFLAGS" && LDFLAGS="-mx32 $LDFLAGS" ++ else ++ CFLAGS="-m64 $CFLAGS" && LDFLAGS="-m64 $LDFLAGS" ++ fi ++ fi + if [ "$SYS" = MACOSX ]; then + ASFLAGS="$ASFLAGS -f macho64 -DPIC -DPREFIX" + if cc_check '' "-arch x86_64"; then +@@ -722,7 +728,11 @@ case $host_cpu in + RCFLAGS="--target=pe-x86-64 $RCFLAGS" + fi + else +- ASFLAGS="$ASFLAGS -f elf64" ++ if cpp_check "" "" "__ILP32__" ; then ++ asm=no ++ else ++ ASFLAGS="$ASFLAGS -f elf64" ++ fi + fi + ;; + powerpc*) +-- +2.8.0 + diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/x264/x264/don-t-default-to-cortex-a9-with-neon.patch b/import-layers/yocto-poky/meta/recipes-multimedia/x264/x264/don-t-default-to-cortex-a9-with-neon.patch index bf72fca682..73f2aac613 100644 --- a/import-layers/yocto-poky/meta/recipes-multimedia/x264/x264/don-t-default-to-cortex-a9-with-neon.patch +++ b/import-layers/yocto-poky/meta/recipes-multimedia/x264/x264/don-t-default-to-cortex-a9-with-neon.patch @@ -5,10 +5,10 @@ Upstream-Status: Pending Signed-off-by: Andrei Gherzan <andrei@gherzan.ro> diff --git a/configure b/configure -index 2916036..f4ece40 100755 +index 9d1586c..3109ec4 100755 --- a/configure +++ b/configure -@@ -773,9 +773,6 @@ if [ $asm = auto -a \( $ARCH = X86 -o $ARCH = X86_64 \) ] ; then +@@ -874,9 +874,6 @@ if [ $asm = auto -a \( $ARCH = X86 -o $ARCH = X86_64 \) ] ; then fi if [ $asm = auto -a $ARCH = ARM ] ; then @@ -18,12 +18,3 @@ index 2916036..f4ece40 100755 if cc_check '' '' '__asm__("rev ip, ip");' ; then define HAVE_ARMV6 cc_check '' '' '__asm__("movt r0, #0");' && define HAVE_ARMV6T2 cc_check '' '' '__asm__("vadd.i16 q0, q0, q0");' && define HAVE_NEON -@@ -788,8 +785,6 @@ if [ $asm = auto -a $ARCH = ARM ] ; then - fi - - if [ $asm = auto -a $ARCH = AARCH64 ] ; then -- # set flags so neon is built by default -- echo $CFLAGS | grep -Eq '(-mcpu|-march|-mfpu|-arch)' || CFLAGS="$CFLAGS -arch arm64 -mfpu=neon" - - if cc_check '' '' '__asm__("cmeq v0.8h, v0.8h, #0");' ; then define HAVE_NEON - ASFLAGS="$ASFLAGS -c" diff --git a/import-layers/yocto-poky/meta/recipes-multimedia/x264/x264_git.bb b/import-layers/yocto-poky/meta/recipes-multimedia/x264/x264_git.bb index 393310f684..69f52c2b36 100644 --- a/import-layers/yocto-poky/meta/recipes-multimedia/x264/x264_git.bb +++ b/import-layers/yocto-poky/meta/recipes-multimedia/x264/x264_git.bb @@ -8,13 +8,14 @@ LIC_FILES_CHKSUM = "file://COPYING;md5=94d55d512a9ba36caa9b7df079bae19f" DEPENDS = "yasm-native" -SRC_URI = "git://git.videolan.org/x264.git \ +SRC_URI = "git://github.com/mirror/x264;branch=stable \ file://don-t-default-to-cortex-a9-with-neon.patch \ + file://Fix-X32-build-by-disabling-asm.patch \ " -SRCREV = "c8a773ebfca148ef04f5a60d42cbd7336af0baf6" +SRCREV = "2b741f81e51f92d053d87a49f59ff1026553a0f6" -PV = "r2491+git${SRCPV}" +PV = "r2731+git${SRCPV}" S = "${WORKDIR}/git" @@ -24,6 +25,7 @@ X264_DISABLE_ASM = "" X264_DISABLE_ASM_armv4 = "--disable-asm" X264_DISABLE_ASM_armv5 = "--disable-asm" X264_DISABLE_ASM_powerpc = "${@bb.utils.contains("TUNE_FEATURES", "spe", "--disable-asm", "", d)}" +X264_DISABLE_ASM_mipsarch = "${@bb.utils.contains("TUNE_FEATURES", "r6", "", "--disable-asm", d)}" EXTRA_OECONF = '--prefix=${prefix} \ --host=${HOST_SYS} \ @@ -34,6 +36,7 @@ EXTRA_OECONF = '--prefix=${prefix} \ --enable-static \ --disable-lavf \ --disable-swscale \ + --disable-opencl \ --enable-pic \ ${X264_DISABLE_ASM} \ ' @@ -42,12 +45,8 @@ do_configure() { ./configure ${EXTRA_OECONF} } -AS = "${TARGET_PREFIX}gcc" - do_install() { oe_runmake install DESTDIR=${D} } -# PIC can't be enabled for few BSP's -INSANE_SKIP_${PN}_append = " textrel" - +AS[unexport] = "1" |