Hello community, here is the log from the commit of package gst-rtsp-server for openSUSE:Factory checked in at 2016-06-19 10:49:39 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/gst-rtsp-server (Old) and /work/SRC/openSUSE:Factory/.gst-rtsp-server.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "gst-rtsp-server" Changes: -------- --- /work/SRC/openSUSE:Factory/gst-rtsp-server/gst-rtsp-server.changes 2016-05-03 10:16:46.000000000 +0200 +++ /work/SRC/openSUSE:Factory/.gst-rtsp-server.new/gst-rtsp-server.changes 2016-06-19 10:49:41.000000000 +0200 @@ -1,0 +2,9 @@ +Wed Jun 15 14:27:03 UTC 2016 - zai...@opensuse.org + +- Update to version 1.8.1: + + bgo#764744: Crashes when multiple udpsrc are created for each + client on a shared media, misses tracking and cleanup. + + bgo#766619: Space between ; and timeout= in session header is + not RFC2326 compliant. + +------------------------------------------------------------------- Old: ---- gst-rtsp-server-1.8.1.tar.xz New: ---- gst-rtsp-server-1.8.2.tar.xz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ gst-rtsp-server.spec ++++++ --- /var/tmp/diff_new_pack.7oaZYQ/_old 2016-06-19 10:49:42.000000000 +0200 +++ /var/tmp/diff_new_pack.7oaZYQ/_new 2016-06-19 10:49:42.000000000 +0200 @@ -17,7 +17,7 @@ Name: gst-rtsp-server -Version: 1.8.1 +Version: 1.8.2 Release: 0 Summary: GStreamer based RTSP server library License: LGPL-2.0+ ++++++ gst-rtsp-server-1.8.1.tar.xz -> gst-rtsp-server-1.8.2.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gst-rtsp-server-1.8.1/ChangeLog new/gst-rtsp-server-1.8.2/ChangeLog --- old/gst-rtsp-server-1.8.1/ChangeLog 2016-04-20 17:16:52.000000000 +0200 +++ new/gst-rtsp-server-1.8.2/ChangeLog 2016-06-09 10:27:42.000000000 +0200 @@ -1,9 +1,46 @@ +=== release 1.8.2 === + +2016-06-09 Sebastian Dröge <sl...@coaxion.net> + + * configure.ac: + releasing 1.8.2 + +2016-05-18 16:48:44 +0100 Ian <ian.arkver....@gmail.com> + + * gst/rtsp-server/rtsp-session.c: + rtsp-session: RFC2326 does not allow a space between ; and timeout in the Session header + This works with rtspsrc and live555, but fails with e.g. ffmpeg. + https://bugzilla.gnome.org/show_bug.cgi?id=766619 + +2016-04-25 08:55:25 -0400 Jake Foytik <jake.foy...@ipconfigure.com> + + * gst/rtsp-server/rtsp-stream.c: + * tests/check/gst/rtspserver.c: + * tests/check/gst/stream.c: + rtsp-stream: Fix crash on cleanup with shared media and multiple udpsrc + - Unicast udpsrcs are now managed in a hash table. This allows for proper cleanup in with shared streams and fixes a memory leak. + - Unicast udpsrcs are now properly cleaned up when shared connections exit. See the update_transport() function. + - Create unit test for shared media. + https://bugzilla.gnome.org/show_bug.cgi?id=764744 + +2016-04-11 10:55:23 +0300 Sebastian Dröge <sebast...@centricular.com> + + * gst/rtsp-server/rtsp-stream.c: + rtsp-stream: Always bind to ANY when address is a multicast address and not only on Windows + For IPv6 addresses, binding to a multicast group does not work on Linux + either. Always bind to ANY and then later join the multicast group. + https://bugzilla.gnome.org/show_bug.cgi?id=764679 + === release 1.8.1 === -2016-04-20 Sebastian Dröge <sl...@coaxion.net> +2016-04-20 18:33:39 +0300 Sebastian Dröge <sebast...@centricular.com> + * ChangeLog: + * NEWS: + * RELEASE: * configure.ac: - releasing 1.8.1 + * gst-rtsp-server.doap: + Release 1.8.1 === release 1.8.0 === diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gst-rtsp-server-1.8.1/NEWS new/gst-rtsp-server-1.8.2/NEWS --- old/gst-rtsp-server-1.8.1/NEWS 2016-04-20 17:17:47.000000000 +0200 +++ new/gst-rtsp-server-1.8.2/NEWS 2016-06-09 10:28:27.000000000 +0200 @@ -1,25 +1,27 @@ -### 1.8.1 +### 1.8.2 -The first 1.8 bug-fix release (1.8.1) was released on 20 April 2016. +The first 1.8 bug-fix release (1.8.2) was released on 9 June 2016. This release only contains bugfixes and it should be safe to update from 1.8.0. -#### Major bugfixes in 1.8.1 +#### Major bugfixes in 1.8.2 - - Fix app compilation with Android NDK r11 and newer - - Fix compilation of nvenc plugin against latest NVIDIA SDK 6.0 - - Fix regression in avdeinterlace - - Fix memory corruption in scaletempo element with S16 input - - Fix regression in qtdemux with MSE streams - - Fix glitches at the start with all audio sinks except for pulsesink - - Fix regression with encrypted HLS streams - - Fix automatic multithreaded decoding of VP8/9 video - - Fix deadlock in HTTP adaptive streams when scrub-seeking - - Fix regression in RTSP source with SRTP - - Add support for SRTP rollover counters in the RTSP source - - Add support for HiDPI ("Retina") screens in caopengllayersink - - ... and many more! + - Fix vp8enc and flacenc segmentation faults on Windows + - Fix Android build failure due to BSD sed on OS X + - Fix Android build failure with applications targetting API > 20 + - Fix playback of live MS SmoothStreaming streams + - Fix various issues with vtdec and caopengllayersink on OS X + - Fix severe performance degradation in various image decoders + - Fix sample rate negotiation in opusdec + - Fix regression in typefind, causing deadlocks in some situations + - Fix mpegtsmux to set PTS on all output buffers again + - Fix extraction of frame dimensions from SDP in RTP JPEG depayloader + - Fix failure in v4l2videodec when setting of format fails after starting + - ... and many, many more! + +For a full list of bugfixes see [Bugzilla][buglist-1.8.2]. Note that this is +not the full list of changes. For the full list of changes please refer to the +GIT logs or ChangeLogs of the particular modules. -For a full list of bugfixes see [Bugzilla][buglist-1.8.1]. +[buglist-1.8.2]: https://bugzilla.gnome.org/buglist.cgi?bug_status=RESOLVED&bug_status=VERIFIED&classification=Platform&limit=0&list_id=130196&order=bug_id&product=GStreamer&query_format=advanced&resolution=FIXED&target_milestone=1.8.2 -[buglist-1.8.1]: https://bugzilla.gnome.org/buglist.cgi?bug_status=RESOLVED&bug_status=VERIFIED&classification=Platform&limit=0&list_id=117422&order=bug_id&product=GStreamer&query_format=advanced&resolution=FIXED&target_milestone=1.8.1 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gst-rtsp-server-1.8.1/RELEASE new/gst-rtsp-server-1.8.2/RELEASE --- old/gst-rtsp-server-1.8.1/RELEASE 2016-04-20 17:17:20.000000000 +0200 +++ new/gst-rtsp-server-1.8.2/RELEASE 2016-06-09 10:28:10.000000000 +0200 @@ -1,11 +1,11 @@ -Release notes for GStreamer RTSP Server Library 1.8.1 +Release notes for GStreamer RTSP Server Library 1.8.2 -The GStreamer team is proud to announce the first bugfix release in the stable +The GStreamer team is proud to announce the second bugfix release in the stable 1.8 release series of your favourite cross-platform multimedia framework! -This release only contains bugfixes and it is safe to update from 1.8.0. For a +This release only contains bugfixes and it is safe to update from 1.8.1. For a full list of bugfixes see Bugzilla. @@ -13,6 +13,11 @@ +Bugs fixed in this release + + * 764744 : Crashes when multiple udpsrc are created for each client on a shared media, misses tracking and cleanup + * 766619 : Space between ; and timeout= in session header is not RFC2326 compliant. + ==== Download ==== You can find source releases of gst-rtsp-server in the download @@ -48,5 +53,7 @@ Contributors to this release + * Ian + * Jake Foytik * Sebastian Dröge \ No newline at end of file diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gst-rtsp-server-1.8.1/config.guess new/gst-rtsp-server-1.8.2/config.guess --- old/gst-rtsp-server-1.8.1/config.guess 2016-04-20 14:16:57.000000000 +0200 +++ new/gst-rtsp-server-1.8.2/config.guess 2016-06-09 09:23:34.000000000 +0200 @@ -1,8 +1,8 @@ #! /bin/sh # Attempt to guess a canonical system name. -# Copyright 1992-2015 Free Software Foundation, Inc. +# Copyright 1992-2016 Free Software Foundation, Inc. -timestamp='2015-08-20' +timestamp='2016-04-02' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by @@ -27,7 +27,7 @@ # Originally written by Per Bothner; maintained since 2000 by Ben Elliston. # # You can get the latest version of this script from: -# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD +# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess # # Please send patches to <config-patc...@gnu.org>. @@ -50,7 +50,7 @@ GNU config.guess ($timestamp) Originally written by Per Bothner. -Copyright 1992-2015 Free Software Foundation, Inc. +Copyright 1992-2016 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." @@ -237,6 +237,10 @@ UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; + *:LibertyBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'` + echo ${UNAME_MACHINE_ARCH}-unknown-libertybsd${UNAME_RELEASE} + exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; @@ -268,42 +272,42 @@ ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") - UNAME_MACHINE="alpha" ;; + UNAME_MACHINE=alpha ;; "EV4.5 (21064)") - UNAME_MACHINE="alpha" ;; + UNAME_MACHINE=alpha ;; "LCA4 (21066/21068)") - UNAME_MACHINE="alpha" ;; + UNAME_MACHINE=alpha ;; "EV5 (21164)") - UNAME_MACHINE="alphaev5" ;; + UNAME_MACHINE=alphaev5 ;; "EV5.6 (21164A)") - UNAME_MACHINE="alphaev56" ;; + UNAME_MACHINE=alphaev56 ;; "EV5.6 (21164PC)") - UNAME_MACHINE="alphapca56" ;; + UNAME_MACHINE=alphapca56 ;; "EV5.7 (21164PC)") - UNAME_MACHINE="alphapca57" ;; + UNAME_MACHINE=alphapca57 ;; "EV6 (21264)") - UNAME_MACHINE="alphaev6" ;; + UNAME_MACHINE=alphaev6 ;; "EV6.7 (21264A)") - UNAME_MACHINE="alphaev67" ;; + UNAME_MACHINE=alphaev67 ;; "EV6.8CB (21264C)") - UNAME_MACHINE="alphaev68" ;; + UNAME_MACHINE=alphaev68 ;; "EV6.8AL (21264B)") - UNAME_MACHINE="alphaev68" ;; + UNAME_MACHINE=alphaev68 ;; "EV6.8CX (21264D)") - UNAME_MACHINE="alphaev68" ;; + UNAME_MACHINE=alphaev68 ;; "EV6.9A (21264/EV69A)") - UNAME_MACHINE="alphaev69" ;; + UNAME_MACHINE=alphaev69 ;; "EV7 (21364)") - UNAME_MACHINE="alphaev7" ;; + UNAME_MACHINE=alphaev7 ;; "EV7.9 (21364A)") - UNAME_MACHINE="alphaev79" ;; + UNAME_MACHINE=alphaev79 ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. - echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` # Reset EXIT trap before exiting to avoid spurious non-zero exit code. exitcode=$? trap '' 0 @@ -376,16 +380,16 @@ exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) eval $set_cc_for_build - SUN_ARCH="i386" + SUN_ARCH=i386 # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. - if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then + if [ "$CC_FOR_BUILD" != no_compiler_found ]; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ - (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then - SUN_ARCH="x86_64" + SUN_ARCH=x86_64 fi fi echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` @@ -410,7 +414,7 @@ exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` - test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 + test "x${UNAME_RELEASE}" = x && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} @@ -635,13 +639,13 @@ sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in - 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 - 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 + 523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0 + 528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in - 32) HP_ARCH="hppa2.0n" ;; - 64) HP_ARCH="hppa2.0w" ;; - '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 + 32) HP_ARCH=hppa2.0n ;; + 64) HP_ARCH=hppa2.0w ;; + '') HP_ARCH=hppa2.0 ;; # HP-UX 10.20 esac ;; esac fi @@ -680,11 +684,11 @@ exit (0); } EOF - (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` + (CCOPTS="" $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac - if [ ${HP_ARCH} = "hppa2.0w" ] + if [ ${HP_ARCH} = hppa2.0w ] then eval $set_cc_for_build @@ -697,12 +701,12 @@ # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 - if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | + if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then - HP_ARCH="hppa2.0w" + HP_ARCH=hppa2.0w else - HP_ARCH="hppa64" + HP_ARCH=hppa64 fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} @@ -807,14 +811,14 @@ echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) - FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` - FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` + FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) - FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` - FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` + FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) @@ -896,7 +900,7 @@ exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland - echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC} + echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC} exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix @@ -919,7 +923,7 @@ EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 - if test "$?" = 0 ; then LIBC="gnulibc1" ; fi + if test "$?" = 0 ; then LIBC=gnulibc1 ; fi echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; arc:Linux:*:* | arceb:Linux:*:*) @@ -965,6 +969,9 @@ ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; + k1om:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; @@ -1120,7 +1127,7 @@ # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub - # prints for the "djgpp" host, or else GDB configury will decide that + # prints for the "djgpp" host, or else GDB configure will decide that # this is a cross-build. echo i586-pc-msdosdjgpp exit ;; @@ -1269,6 +1276,9 @@ SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux${UNAME_RELEASE} exit ;; + SX-ACE:SUPER-UX:*:*) + echo sxace-nec-superux${UNAME_RELEASE} + exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; @@ -1282,9 +1292,9 @@ UNAME_PROCESSOR=powerpc fi if test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; then - if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then + if [ "$CC_FOR_BUILD" != no_compiler_found ]; then if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ - (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then case $UNAME_PROCESSOR in @@ -1306,7 +1316,7 @@ exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` - if test "$UNAME_PROCESSOR" = "x86"; then + if test "$UNAME_PROCESSOR" = x86; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi @@ -1337,7 +1347,7 @@ # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. - if test "$cputype" = "386"; then + if test "$cputype" = 386; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" @@ -1379,7 +1389,7 @@ echo i386-pc-xenix exit ;; i*86:skyos:*:*) - echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' + echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE} | sed -e 's/ .*$//'` exit ;; i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos @@ -1390,6 +1400,9 @@ x86_64:VMkernel:*:*) echo ${UNAME_MACHINE}-unknown-esx exit ;; + amd64:Isilon\ OneFS:*:*) + echo x86_64-unknown-onefs + exit ;; esac cat >&2 <<EOF @@ -1399,9 +1412,9 @@ the operating system you are using. It is advised that you download the most up to date version of the config scripts from - http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD + http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess and - http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD + http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub If the version you run ($0) is already up to date, please send the following data and any information you think might be diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gst-rtsp-server-1.8.1/config.sub new/gst-rtsp-server-1.8.2/config.sub --- old/gst-rtsp-server-1.8.1/config.sub 2016-04-20 14:16:57.000000000 +0200 +++ new/gst-rtsp-server-1.8.2/config.sub 2016-06-09 09:23:34.000000000 +0200 @@ -1,8 +1,8 @@ #! /bin/sh # Configuration validation subroutine script. -# Copyright 1992-2015 Free Software Foundation, Inc. +# Copyright 1992-2016 Free Software Foundation, Inc. -timestamp='2015-08-20' +timestamp='2016-03-30' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by @@ -33,7 +33,7 @@ # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: -# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD +# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases @@ -53,8 +53,7 @@ me=`echo "$0" | sed -e 's,.*/,,'` usage="\ -Usage: $0 [OPTION] CPU-MFR-OPSYS - $0 [OPTION] ALIAS +Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS Canonicalize a configuration name. @@ -68,7 +67,7 @@ version="\ GNU config.sub ($timestamp) -Copyright 1992-2015 Free Software Foundation, Inc. +Copyright 1992-2016 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." @@ -521,7 +520,7 @@ basic_machine=i386-pc os=-aros ;; - asmjs) + asmjs) basic_machine=asmjs-unknown ;; aux) @@ -1383,7 +1382,7 @@ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ - | -bitrig* | -openbsd* | -solidbsd* \ + | -bitrig* | -openbsd* | -solidbsd* | -libertybsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ @@ -1399,7 +1398,8 @@ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ - | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* | -tirtos*) + | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* \ + | -onefs* | -tirtos*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) @@ -1531,6 +1531,8 @@ ;; -nacl*) ;; + -ios) + ;; -none) ;; *) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gst-rtsp-server-1.8.1/configure new/gst-rtsp-server-1.8.2/configure --- old/gst-rtsp-server-1.8.1/configure 2016-04-20 14:16:56.000000000 +0200 +++ new/gst-rtsp-server-1.8.2/configure 2016-06-09 09:23:33.000000000 +0200 @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for GStreamer RTSP Server Library 1.8.1. +# Generated by GNU Autoconf 2.69 for GStreamer RTSP Server Library 1.8.2. # # Report bugs to <http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer>. # @@ -591,8 +591,8 @@ # Identity of this package. PACKAGE_NAME='GStreamer RTSP Server Library' PACKAGE_TARNAME='gst-rtsp-server' -PACKAGE_VERSION='1.8.1' -PACKAGE_STRING='GStreamer RTSP Server Library 1.8.1' +PACKAGE_VERSION='1.8.2' +PACKAGE_STRING='GStreamer RTSP Server Library 1.8.2' PACKAGE_BUGREPORT='http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer' PACKAGE_URL='' @@ -1536,7 +1536,7 @@ # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures GStreamer RTSP Server Library 1.8.1 to adapt to many kinds of systems. +\`configure' configures GStreamer RTSP Server Library 1.8.2 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1608,7 +1608,7 @@ if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of GStreamer RTSP Server Library 1.8.1:";; + short | recursive ) echo "Configuration of GStreamer RTSP Server Library 1.8.2:";; esac cat <<\_ACEOF @@ -1807,7 +1807,7 @@ test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -GStreamer RTSP Server Library configure 1.8.1 +GStreamer RTSP Server Library configure 1.8.2 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -2085,7 +2085,7 @@ This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by GStreamer RTSP Server Library $as_me 1.8.1, which was +It was created by GStreamer RTSP Server Library $as_me 1.8.2, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -3062,7 +3062,7 @@ # Define the identity of the package. PACKAGE='gst-rtsp-server' - VERSION='1.8.1' + VERSION='1.8.2' cat >>confdefs.h <<_ACEOF @@ -3273,9 +3273,9 @@ - PACKAGE_VERSION_MAJOR=$(echo 1.8.1 | cut -d'.' -f1) - PACKAGE_VERSION_MINOR=$(echo 1.8.1 | cut -d'.' -f2) - PACKAGE_VERSION_MICRO=$(echo 1.8.1 | cut -d'.' -f3) + PACKAGE_VERSION_MAJOR=$(echo 1.8.2 | cut -d'.' -f1) + PACKAGE_VERSION_MINOR=$(echo 1.8.2 | cut -d'.' -f2) + PACKAGE_VERSION_MICRO=$(echo 1.8.2 | cut -d'.' -f3) @@ -3286,7 +3286,7 @@ { $as_echo "$as_me:${as_lineno-$LINENO}: checking nano version" >&5 $as_echo_n "checking nano version... " >&6; } - NANO=$(echo 1.8.1 | cut -d'.' -f4) + NANO=$(echo 1.8.2 | cut -d'.' -f4) if test x"$NANO" = x || test "x$NANO" = "x0" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: 0 (release)" >&5 @@ -8115,10 +8115,10 @@ done - GST_CURRENT=801 + GST_CURRENT=802 GST_REVISION=0 - GST_AGE=801 - GST_LIBVERSION=801:0:801 + GST_AGE=802 + GST_LIBVERSION=802:0:802 @@ -18239,7 +18239,7 @@ # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by GStreamer RTSP Server Library $as_me 1.8.1, which was +This file was extended by GStreamer RTSP Server Library $as_me 1.8.2, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -18305,7 +18305,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -GStreamer RTSP Server Library config.status 1.8.1 +GStreamer RTSP Server Library config.status 1.8.2 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gst-rtsp-server-1.8.1/configure.ac new/gst-rtsp-server-1.8.2/configure.ac --- old/gst-rtsp-server-1.8.1/configure.ac 2016-04-20 14:16:43.000000000 +0200 +++ new/gst-rtsp-server-1.8.2/configure.ac 2016-06-09 09:09:40.000000000 +0200 @@ -2,7 +2,7 @@ dnl initialize autoconf dnl when going to/from release please set the nano (fourth number) right ! dnl releases only do Wall, cvs and prerelease does Werror too -AC_INIT([GStreamer RTSP Server Library], [1.8.1], +AC_INIT([GStreamer RTSP Server Library], [1.8.2], [http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer], [gst-rtsp-server]) AG_GST_INIT @@ -53,7 +53,7 @@ dnl 1.10.9 (who knows) => 1009 dnl dnl sets GST_LT_LDFLAGS -AS_LIBTOOL(GST, 801, 0, 801) +AS_LIBTOOL(GST, 802, 0, 802) dnl *** required versions of GStreamer stuff *** GST_REQ=1.8.0 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gst-rtsp-server-1.8.1/docs/libs/html/index.html new/gst-rtsp-server-1.8.2/docs/libs/html/index.html --- old/gst-rtsp-server-1.8.1/docs/libs/html/index.html 2016-04-20 17:17:54.000000000 +0200 +++ new/gst-rtsp-server-1.8.2/docs/libs/html/index.html 2016-06-09 10:28:41.000000000 +0200 @@ -15,7 +15,7 @@ <div> <div><table class="navigation" id="top" width="100%" cellpadding="2" cellspacing="0"><tr><th valign="middle"><p class="title">GStreamer RTSP Server Reference Manual</p></th></tr></table></div> <div><p class="releaseinfo"> - for GStreamer RTSP Server 1.8.1 + for GStreamer RTSP Server 1.8.2 </p></div> </div> <hr> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gst-rtsp-server-1.8.1/gst/rtsp-server/rtsp-session.c new/gst-rtsp-server-1.8.2/gst/rtsp-server/rtsp-session.c --- old/gst-rtsp-server-1.8.1/gst/rtsp-server/rtsp-session.c 2016-03-24 12:36:50.000000000 +0100 +++ new/gst-rtsp-server-1.8.2/gst/rtsp-server/rtsp-session.c 2016-05-20 08:07:18.000000000 +0200 @@ -488,7 +488,7 @@ g_mutex_lock (&priv->lock); if (priv->timeout_always_visible || priv->timeout != 60) - result = g_strdup_printf ("%s; timeout=%d", priv->sessionid, priv->timeout); + result = g_strdup_printf ("%s;timeout=%d", priv->sessionid, priv->timeout); else result = g_strdup (priv->sessionid); g_mutex_unlock (&priv->lock); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gst-rtsp-server-1.8.1/gst/rtsp-server/rtsp-stream.c new/gst-rtsp-server-1.8.2/gst/rtsp-server/rtsp-stream.c --- old/gst-rtsp-server-1.8.1/gst/rtsp-server/rtsp-stream.c 2016-03-24 12:36:50.000000000 +0100 +++ new/gst-rtsp-server-1.8.2/gst/rtsp-server/rtsp-stream.c 2016-05-04 09:21:55.000000000 +0200 @@ -62,6 +62,18 @@ #define GST_RTSP_STREAM_GET_PRIVATE(obj) \ (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GST_TYPE_RTSP_STREAM, GstRTSPStreamPrivate)) +/* Container for udpsrc elements created for a specific RTSPTransport. */ +typedef struct +{ + GstElement *udpsrc[2]; +} GstRTSPStreamUDPSrcs; + +static void +destroy_udp_srcs_func (gpointer data) +{ + g_slice_free (GstRTSPStreamUDPSrcs, (GstRTSPStreamUDPSrcs *) data); +} + struct _GstRTSPStreamPrivate { GMutex lock; @@ -94,16 +106,11 @@ GstElement *srtpdec; GHashTable *keys; - /* sinks used for sending and receiving RTP and RTCP over ipv4, they share - * sockets */ - GstElement *udpsrc_v4[2]; - /* UDP sources for UDP multicast transports */ - GstElement *udpsrc_mcast_v4[2]; + /* Unicast UDP sources associated with RTSPTransports */ + GHashTable *udpsrcs; - /* sinks used for sending and receiving RTP and RTCP over ipv6, they share - * sockets */ - GstElement *udpsrc_v6[2]; - /* UDP sources for UDP multicast transports */ + /* Only allow one set of IPV4 and IPV6 multicast udpsrcs */ + GstElement *udpsrc_mcast_v4[2]; GstElement *udpsrc_mcast_v6[2]; GstElement *udpqueue[2]; @@ -126,12 +133,10 @@ /* server ports for sending/receiving over ipv4 */ GstRTSPRange server_port_v4; GstRTSPAddress *server_addr_v4; - gboolean have_ipv4; /* server ports for sending/receiving over ipv6 */ GstRTSPRange server_port_v6; GstRTSPAddress *server_addr_v6; - gboolean have_ipv6; /* multicast addresses */ GstRTSPAddressPool *pool; @@ -264,6 +269,8 @@ NULL, (GDestroyNotify) gst_caps_unref); priv->ptmap = g_hash_table_new_full (NULL, NULL, NULL, (GDestroyNotify) gst_caps_unref); + priv->udpsrcs = g_hash_table_new_full (g_direct_hash, g_direct_equal, + NULL, (GDestroyNotify) destroy_udp_srcs_func); } static void @@ -304,6 +311,11 @@ g_hash_table_unref (priv->keys); g_hash_table_destroy (priv->ptmap); + /* We expect all udpsrcs to be cleaned up by this point. */ + if (g_hash_table_size (priv->udpsrcs) > 0) + g_critical ("Unreffing udpsrcs hash table that contains elements."); + g_hash_table_unref (priv->udpsrcs); + G_OBJECT_CLASS (gst_rtsp_stream_parent_class)->finalize (obj); } @@ -1270,21 +1282,13 @@ g_clear_object (&inetaddr); inetaddr = g_inet_address_new_from_string (addr->address); - /* On Windows it's not possible to bind to a multicast address - * but the OS will make sure to filter out all packets that - * arrive not for the multicast address the socket joined. - * - * On Linux and others it is necessary to bind to a multicast - * address to let the OS filter out all packets that are received - * on the same port but for different addresses than the multicast - * address + /* If we're supposed to bind to a multicast address, instead bind + * to ANY and let udpsrc later join the relevant multicast group */ -#ifdef G_OS_WIN32 if (g_inet_address_get_is_multicast (inetaddr)) { g_object_unref (inetaddr); inetaddr = g_inet_address_new_any (family); } -#endif } else { if (tmp_rtp != 0) { tmp_rtp += 2; @@ -1428,42 +1432,63 @@ g_mutex_lock (&priv->lock); - if (family == G_SOCKET_FAMILY_IPV4) { - if (transport == GST_RTSP_LOWER_TRANS_UDP_MCAST) { - if (priv->have_ipv4_mcast) + if (transport == GST_RTSP_LOWER_TRANS_UDP_MCAST) { + if (family == G_SOCKET_FAMILY_IPV4) { + /* Multicast IPV4 */ + if (priv->have_ipv4_mcast) { + result = TRUE; goto done; + } + priv->have_ipv4_mcast = alloc_ports_one_family (stream, G_SOCKET_FAMILY_IPV4, priv->udpsrc_mcast_v4, &priv->server_port_v4, ct, &priv->addr_v4, use_client_settings); + result = priv->have_ipv4_mcast; + } else { - priv->have_ipv4 = - alloc_ports_one_family (stream, G_SOCKET_FAMILY_IPV4, priv->udpsrc_v4, - &priv->server_port_v4, ct, &priv->server_addr_v4, - use_client_settings); - } - } else { - if (transport == GST_RTSP_LOWER_TRANS_UDP_MCAST) { - if (priv->have_ipv6_mcast) + /* Multicast IPV6 */ + if (priv->have_ipv6_mcast) { + result = TRUE; goto done; + } + priv->have_ipv6_mcast = alloc_ports_one_family (stream, G_SOCKET_FAMILY_IPV6, priv->udpsrc_mcast_v6, &priv->server_port_v6, ct, &priv->addr_v6, use_client_settings); + result = priv->have_ipv6_mcast; + } + } else { + /* We allow multiple unicast transports, so we must maintain a table of the + * udpsrcs created for them. */ + GstRTSPStreamUDPSrcs *transport_udpsrcs = + g_slice_new0 (GstRTSPStreamUDPSrcs); + + if (family == G_SOCKET_FAMILY_IPV4) { + /* Unicast IPV4 */ + result = + alloc_ports_one_family (stream, G_SOCKET_FAMILY_IPV4, + transport_udpsrcs->udpsrc, &priv->server_port_v4, ct, + &priv->server_addr_v4, use_client_settings); } else { - if (priv->have_ipv6) - goto done; - priv->have_ipv6 = - alloc_ports_one_family (stream, G_SOCKET_FAMILY_IPV6, priv->udpsrc_v6, - &priv->server_port_v6, ct, &priv->server_addr_v6, - use_client_settings); + /* Unicast IPV6 */ + result = + alloc_ports_one_family (stream, G_SOCKET_FAMILY_IPV6, + transport_udpsrcs->udpsrc, &priv->server_port_v6, ct, + &priv->server_addr_v6, use_client_settings); } + + /* If we didn't create any unicast udpsrcs, free the transport_udpsrcs struct. + * Otherwise, add it to the hash table */ + if (transport_udpsrcs->udpsrc[0] == NULL + && transport_udpsrcs->udpsrc[1] == NULL) + g_slice_free (GstRTSPStreamUDPSrcs, transport_udpsrcs); + else + g_hash_table_insert (priv->udpsrcs, ct, transport_udpsrcs); } done: - result = priv->have_ipv4 || priv->have_ipv4_mcast || priv->have_ipv6 || - priv->have_ipv6_mcast; - g_mutex_unlock (&priv->lock); return result; @@ -2476,39 +2501,6 @@ gst_pad_link (pad, priv->recv_sink[i]); gst_object_unref (pad); - if (priv->udpsrc_v4[i]) { - if (priv->srcpad) { - /* we set and keep these to playing so that they don't cause NO_PREROLL return - * values. This is only relevant for PLAY pipelines */ - gst_element_set_state (priv->udpsrc_v4[i], GST_STATE_PLAYING); - gst_element_set_locked_state (priv->udpsrc_v4[i], TRUE); - } - /* add udpsrc */ - gst_bin_add (bin, priv->udpsrc_v4[i]); - - /* and link to the funnel v4 */ - selpad = gst_element_get_request_pad (priv->funnel[i], "sink_%u"); - pad = gst_element_get_static_pad (priv->udpsrc_v4[i], "src"); - gst_pad_link (pad, selpad); - gst_object_unref (pad); - gst_object_unref (selpad); - } - - if (priv->udpsrc_v6[i]) { - if (priv->srcpad) { - gst_element_set_state (priv->udpsrc_v6[i], GST_STATE_PLAYING); - gst_element_set_locked_state (priv->udpsrc_v6[i], TRUE); - } - gst_bin_add (bin, priv->udpsrc_v6[i]); - - /* and link to the funnel v6 */ - selpad = gst_element_get_request_pad (priv->funnel[i], "sink_%u"); - pad = gst_element_get_static_pad (priv->udpsrc_v6[i], "src"); - gst_pad_link (pad, selpad); - gst_object_unref (pad); - gst_object_unref (selpad); - } - if (is_tcp) { /* make and add appsrc */ priv->appsrc[i] = gst_element_factory_make ("appsrc", NULL); @@ -2697,51 +2689,50 @@ gst_element_set_state (priv->udpsink[0], GST_STATE_NULL); if (priv->udpsink[1]) gst_element_set_state (priv->udpsink[1], GST_STATE_NULL); - if (priv->udpsrc_v4[0]) { - gst_element_set_state (priv->udpsrc_v4[0], GST_STATE_NULL); - gst_object_unref (priv->udpsrc_v4[0]); - priv->udpsrc_v4[0] = NULL; - } - if (priv->udpsrc_v4[1]) { - gst_element_set_state (priv->udpsrc_v4[1], GST_STATE_NULL); - gst_object_unref (priv->udpsrc_v4[1]); - priv->udpsrc_v4[1] = NULL; - } - if (priv->udpsrc_mcast_v4[0]) { - gst_element_set_state (priv->udpsrc_mcast_v4[0], GST_STATE_NULL); - gst_object_unref (priv->udpsrc_mcast_v4[0]); - priv->udpsrc_mcast_v4[0] = NULL; - } - if (priv->udpsrc_mcast_v4[1]) { - gst_element_set_state (priv->udpsrc_mcast_v4[1], GST_STATE_NULL); - gst_object_unref (priv->udpsrc_mcast_v4[1]); - priv->udpsrc_mcast_v4[1] = NULL; - } - if (priv->udpsrc_v6[0]) { - gst_element_set_state (priv->udpsrc_v6[0], GST_STATE_NULL); - gst_object_unref (priv->udpsrc_v6[0]); - priv->udpsrc_v6[0] = NULL; - } - if (priv->udpsrc_v6[1]) { - gst_element_set_state (priv->udpsrc_v6[1], GST_STATE_NULL); - gst_object_unref (priv->udpsrc_v6[1]); - priv->udpsrc_v6[1] = NULL; - } - if (priv->udpsrc_mcast_v6[0]) { - gst_element_set_state (priv->udpsrc_mcast_v6[0], GST_STATE_NULL); - gst_object_unref (priv->udpsrc_mcast_v6[0]); - priv->udpsrc_mcast_v6[0] = NULL; - } - if (priv->udpsrc_mcast_v6[1]) { - gst_element_set_state (priv->udpsrc_mcast_v6[1], GST_STATE_NULL); - gst_object_unref (priv->udpsrc_mcast_v6[1]); - priv->udpsrc_mcast_v6[1] = NULL; - } + g_mutex_unlock (&priv->lock); return FALSE; } } +/* Must be called with priv->lock. */ +static void +remove_all_unicast_udpsrcs (GstRTSPStream * stream, GstBin * bin) +{ + GstRTSPStreamPrivate *priv; + GHashTableIter iter; + gpointer iter_key, iter_value; + + priv = stream->priv; + + /* Remove all of the unicast udpsrcs */ + g_hash_table_iter_init (&iter, priv->udpsrcs); + while (g_hash_table_iter_next (&iter, &iter_key, &iter_value)) { + GstRTSPStreamUDPSrcs *transport_udpsrcs = + (GstRTSPStreamUDPSrcs *) iter_value; + + for (int i = 0; i < 2; i++) { + if (transport_udpsrcs->udpsrc[i]) { + if (priv->sinkpad || i == 1) { + /* Set udpsrc to NULL now before removing */ + gst_element_set_locked_state (transport_udpsrcs->udpsrc[i], FALSE); + gst_element_set_state (transport_udpsrcs->udpsrc[i], GST_STATE_NULL); + + /* removing them should also nicely release the request + * pads when they finalize */ + gst_bin_remove (bin, transport_udpsrcs->udpsrc[i]); + } else { + /* we need to set the state to NULL before unref */ + gst_element_set_state (transport_udpsrcs->udpsrc[i], GST_STATE_NULL); + gst_object_unref (transport_udpsrcs->udpsrc[i]); + } + } + } + } + + g_hash_table_remove_all (priv->udpsrcs); +} + /** * gst_rtsp_stream_leave_bin: * @stream: a #GstRTSPStream @@ -2797,6 +2788,7 @@ is_udp = ((priv->protocols & GST_RTSP_LOWER_TRANS_UDP) || (priv->protocols & GST_RTSP_LOWER_TRANS_UDP_MCAST)); + remove_all_unicast_udpsrcs (stream, bin); for (i = 0; i < 2; i++) { if (priv->udpsink[i]) @@ -2814,21 +2806,6 @@ if (priv->appsrc[i]) gst_element_set_state (priv->appsrc[i], GST_STATE_NULL); - if (priv->udpsrc_v4[i]) { - if (priv->sinkpad || i == 1) { - /* and set udpsrc to NULL now before removing */ - gst_element_set_locked_state (priv->udpsrc_v4[i], FALSE); - gst_element_set_state (priv->udpsrc_v4[i], GST_STATE_NULL); - /* removing them should also nicely release the request - * pads when they finalize */ - gst_bin_remove (bin, priv->udpsrc_v4[i]); - } else { - /* we need to set the state to NULL before unref */ - gst_element_set_state (priv->udpsrc_v4[i], GST_STATE_NULL); - gst_object_unref (priv->udpsrc_v4[i]); - } - } - if (priv->udpsrc_mcast_v4[i]) { if (priv->sinkpad || i == 1) { /* and set udpsrc to NULL now before removing */ @@ -2843,16 +2820,6 @@ } } - if (priv->udpsrc_v6[i]) { - if (priv->sinkpad || i == 1) { - gst_element_set_locked_state (priv->udpsrc_v6[i], FALSE); - gst_element_set_state (priv->udpsrc_v6[i], GST_STATE_NULL); - gst_bin_remove (bin, priv->udpsrc_v6[i]); - } else { - gst_element_set_state (priv->udpsrc_v6[i], GST_STATE_NULL); - gst_object_unref (priv->udpsrc_v6[i]); - } - } if (priv->udpsrc_mcast_v6[i]) { if (priv->sinkpad || i == 1) { gst_element_set_locked_state (priv->udpsrc_mcast_v6[i], FALSE); @@ -2893,8 +2860,6 @@ priv->recv_sink[i] = NULL; } - priv->udpsrc_v4[i] = NULL; - priv->udpsrc_v6[i] = NULL; priv->udpsrc_mcast_v4[i] = NULL; priv->udpsrc_mcast_v6[i] = NULL; priv->udpsink[i] = NULL; @@ -3240,6 +3205,68 @@ return ret; } +/* Properly dispose udpsrcs that were created for a given transport. */ +/* Must be called with priv->lock. */ +static void +remove_transport_udpsrcs (GstRTSPStreamPrivate * priv, + const GstRTSPTransport * tr) +{ + /* Remove the udpsrcs associated with this transport. */ + GstRTSPStreamUDPSrcs *transport_udpsrcs = + g_hash_table_lookup (priv->udpsrcs, tr); + if (transport_udpsrcs != NULL) { + for (int i = 0; i < 2; i++) { + if (transport_udpsrcs->udpsrc[i]) { + if (priv->sinkpad || i == 1) { + GstBin *bin; + GstPad *udpsrc_srcpad, *funnel_sinkpad; + + /* We know these udpsrcs are all linked to funnels. Explicitely + * get the funnel src pads so we can properly release them. */ + udpsrc_srcpad = + gst_element_get_static_pad (transport_udpsrcs->udpsrc[i], "src"); + funnel_sinkpad = gst_pad_get_peer (udpsrc_srcpad); + + if (funnel_sinkpad != NULL) { + /* Unlink pads and release funnel's request pad. */ + gst_pad_unlink (udpsrc_srcpad, funnel_sinkpad); + gst_element_release_request_pad (priv->funnel[i], funnel_sinkpad); + gst_object_unref (funnel_sinkpad); + } + gst_object_unref (udpsrc_srcpad); + + /* Set udpsrc to NULL now before removing */ + gst_element_set_locked_state (transport_udpsrcs->udpsrc[i], FALSE); + gst_element_set_state (transport_udpsrcs->udpsrc[i], GST_STATE_NULL); + + /* This udpsrc is expected to be owned by a bin. Get the bin and + * remove our element. */ + bin = GST_BIN (gst_element_get_parent (transport_udpsrcs->udpsrc[i])); + if (bin != NULL) { + gst_bin_remove (bin, transport_udpsrcs->udpsrc[i]); + gst_object_unref (bin); + } else { + GST_ERROR ("Expected this udpsrc element to be part of a bin."); + gst_object_unref (transport_udpsrcs->udpsrc[i]); + } + + } else { + /* we need to set the state to NULL before unref */ + gst_element_set_state (transport_udpsrcs->udpsrc[i], GST_STATE_NULL); + gst_object_unref (transport_udpsrcs->udpsrc[i]); + } + } + } + + /* The udpsrcs are now properly cleaned up. Remove them from the table */ + g_hash_table_remove (priv->udpsrcs, tr); + + } else { + /* This can happen if we're dealing with a multicast transport. */ + GST_INFO ("Could not find udpsrcs associated with this transport."); + } +} + /* must be called with lock */ static gboolean update_transport (GstRTSPStream * stream, GstRTSPStreamTransport * trans, @@ -3288,6 +3315,8 @@ g_signal_emit_by_name (priv->udpsink[0], "remove", dest, min, NULL); g_signal_emit_by_name (priv->udpsink[1], "remove", dest, max, NULL); priv->transports = g_list_remove (priv->transports, trans); + + remove_transport_udpsrcs (priv, tr); } priv->transports_cookie++; break; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gst-rtsp-server-1.8.1/gst-rtsp-server.doap new/gst-rtsp-server-1.8.2/gst-rtsp-server.doap --- old/gst-rtsp-server-1.8.1/gst-rtsp-server.doap 2016-04-20 14:16:43.000000000 +0200 +++ new/gst-rtsp-server-1.8.2/gst-rtsp-server.doap 2016-06-09 09:12:50.000000000 +0200 @@ -32,6 +32,16 @@ <release> <Version> + <revision>1.8.2</revision> + <branch>1.8</branch> + <name></name> + <created>2016-06-09</created> + <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gst-rtsp-server/gst-rtsp-server-1.8.2.tar.xz" /> + </Version> + </release> + + <release> + <Version> <revision>1.8.1</revision> <branch>1.8</branch> <name></name> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gst-rtsp-server-1.8.1/gst-rtsp.spec new/gst-rtsp-server-1.8.2/gst-rtsp.spec --- old/gst-rtsp-server-1.8.1/gst-rtsp.spec 2016-04-20 14:16:59.000000000 +0200 +++ new/gst-rtsp-server-1.8.2/gst-rtsp.spec 2016-06-09 09:23:36.000000000 +0200 @@ -1,7 +1,7 @@ %define gst_majorminor 1.0 Name: gstreamer-rtsp-server -Version: 1.8.1 +Version: 1.8.2 Release: 1%{?dist} Summary: GStreamer based RTSP server Vendor: Collabora Multimedia diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gst-rtsp-server-1.8.1/tests/check/gst/rtspserver.c new/gst-rtsp-server-1.8.2/tests/check/gst/rtspserver.c --- old/gst-rtsp-server-1.8.1/tests/check/gst/rtspserver.c 2016-03-24 12:36:50.000000000 +0100 +++ new/gst-rtsp-server-1.8.2/tests/check/gst/rtspserver.c 2016-05-04 09:21:55.000000000 +0200 @@ -149,7 +149,7 @@ /* start the tested rtsp server */ static void -start_server (void) +start_server (gboolean set_shared_factory) { GstRTSPMountPoints *mounts; gchar *service; @@ -172,6 +172,7 @@ gst_rtsp_address_pool_add_range (pool, GST_RTSP_ADDRESS_POOL_ANY_IPV4, GST_RTSP_ADDRESS_POOL_ANY_IPV4, 6000, 6010, 0); gst_rtsp_media_factory_set_address_pool (factory, pool); + gst_rtsp_media_factory_set_shared (factory, set_shared_factory); gst_object_unref (pool); /* set port to any */ @@ -571,7 +572,7 @@ { GstRTSPConnection *conn; - start_server (); + start_server (FALSE); /* connect to server */ conn = connect_to_server (test_port, TEST_MOUNT_POINT); @@ -597,7 +598,7 @@ const gchar *control_video; const gchar *control_audio; - start_server (); + start_server (FALSE); conn = connect_to_server (test_port, TEST_MOUNT_POINT); @@ -668,7 +669,7 @@ { GstRTSPConnection *conn; - start_server (); + start_server (FALSE); /* send DESCRIBE request for a non-existing mount point * and check that we get a 404 Not Found */ @@ -697,7 +698,7 @@ GstRTSPTransport *video_transport = NULL; GstRTSPTransport *audio_transport = NULL; - start_server (); + start_server (FALSE); conn = connect_to_server (test_port, TEST_MOUNT_POINT); @@ -782,7 +783,7 @@ gchar *session1 = NULL; gchar *session2 = NULL; - start_server (); + start_server (FALSE); conn = connect_to_server (test_port, TEST_MOUNT_POINT); @@ -854,7 +855,7 @@ gchar *unsupported = NULL; GstRTSPTransport *video_transport = NULL; - start_server (); + start_server (FALSE); conn = connect_to_server (test_port, TEST_MOUNT_POINT); @@ -916,7 +917,7 @@ GstRTSPConnection *conn; GstRTSPRange client_ports; - start_server (); + start_server (FALSE); conn = connect_to_server (test_port, TEST_MOUNT_POINT); @@ -1009,7 +1010,8 @@ } static void -do_test_play_full (const gchar * range, GstRTSPLowerTrans lower_transport) +do_test_play_full (const gchar * range, GstRTSPLowerTrans lower_transport, + GMutex * lock) { GstRTSPConnection *conn; GstSDPMessage *sdp_message = NULL; @@ -1051,8 +1053,20 @@ fail_unless_equals_string (range, range_out); g_free (range_out); - receive_rtp (rtp_socket, NULL); - receive_rtcp (rtcp_socket, NULL, 0); + for (;;) { + receive_rtp (rtp_socket, NULL); + receive_rtcp (rtcp_socket, NULL, 0); + + if (lock != NULL) { + if (g_mutex_trylock (lock) == TRUE) { + g_mutex_unlock (lock); + break; + } + } else { + break; + } + + } /* send TEARDOWN request and check that we get 200 OK */ fail_unless (do_simple_request (conn, GST_RTSP_TEARDOWN, @@ -1076,12 +1090,12 @@ static void do_test_play (const gchar * range) { - do_test_play_full (range, GST_RTSP_LOWER_TRANS_UDP); + do_test_play_full (range, GST_RTSP_LOWER_TRANS_UDP, NULL); } GST_START_TEST (test_play) { - start_server (); + start_server (FALSE); do_test_play (NULL); @@ -1095,7 +1109,7 @@ { GstRTSPConnection *conn; - start_server (); + start_server (FALSE); conn = connect_to_server (test_port, TEST_MOUNT_POINT); @@ -1155,7 +1169,7 @@ gst_rtsp_thread_pool_set_max_threads (pool, 2); g_object_unref (pool); - start_server (); + start_server (FALSE); do_test_play (NULL); @@ -1215,7 +1229,7 @@ gst_rtsp_mount_points_add_factory (mounts, TEST_MOUNT_POINT "2", factory); g_object_unref (mounts); - start_server (); + start_server (FALSE); conn = connect_to_server (test_port, TEST_MOUNT_POINT "2"); iterate (); @@ -1294,7 +1308,7 @@ g_signal_connect (server, "client-connected", G_CALLBACK (session_connected_new_session_cb), new_session_timeout_one); - start_server (); + start_server (FALSE); conn = connect_to_server (test_port, TEST_MOUNT_POINT); @@ -1367,7 +1381,7 @@ g_signal_connect (server, "client-connected", G_CALLBACK (session_connected_new_session_cb), new_session_timeout_one); - start_server (); + start_server (FALSE); conn = connect_to_server (test_port, TEST_MOUNT_POINT); @@ -1443,7 +1457,7 @@ g_signal_connect (server, "client-connected", G_CALLBACK (session_connected_new_session_cb), new_session_timeout_one); - start_server (); + start_server (FALSE); conn = connect_to_server (test_port, TEST_MOUNT_POINT); @@ -1515,7 +1529,8 @@ factory = gst_rtsp_media_factory_new (); /* we have to suspend media after SDP in order to make sure that * we can reconfigure UDP sink with new UDP ports */ - gst_rtsp_media_factory_set_suspend_mode (factory, GST_RTSP_SUSPEND_MODE_RESET); + gst_rtsp_media_factory_set_suspend_mode (factory, + GST_RTSP_SUSPEND_MODE_RESET); pool = gst_rtsp_address_pool_new (); gst_rtsp_address_pool_add_range (pool, GST_RTSP_ADDRESS_POOL_ANY_IPV4, GST_RTSP_ADDRESS_POOL_ANY_IPV4, 7770, 7780, 0); @@ -1603,7 +1618,7 @@ GST_START_TEST (test_play_smpte_range) { - start_server (); + start_server (FALSE); do_test_play ("npt=5-"); do_test_play ("smpte=0:00:00-"); @@ -1617,6 +1632,65 @@ GST_END_TEST; +static gpointer +thread_func (gpointer data) +{ + do_test_play_full (NULL, GST_RTSP_LOWER_TRANS_UDP, (GMutex *) data); + return NULL; +} + +/* Test adding and removing clients to a 'Shared' media. */ +GST_START_TEST (test_shared) +{ + GMutex lock1, lock2, lock3, lock4; + GThread *thread1, *thread2, *thread3, *thread4; + + /* Locks for each thread. Each thread will keep reading data as long as the + * thread is locked. */ + g_mutex_init (&lock1); + g_mutex_init (&lock2); + g_mutex_init (&lock3); + g_mutex_init (&lock4); + + start_server (TRUE); + + /* Start the first receiver thread. */ + g_mutex_lock (&lock1); + thread1 = g_thread_new ("thread1", thread_func, &lock1); + + /* Connect and disconnect another client. */ + g_mutex_lock (&lock2); + thread2 = g_thread_new ("thread2", thread_func, &lock2); + g_mutex_unlock (&lock2); + g_mutex_clear (&lock2); + g_thread_join (thread2); + + /* Do it again. */ + g_mutex_lock (&lock3); + thread3 = g_thread_new ("thread3", thread_func, &lock3); + g_mutex_unlock (&lock3); + g_mutex_clear (&lock3); + g_thread_join (thread3); + + /* Disconnect the last client. This will clean up the media. */ + g_mutex_unlock (&lock1); + g_mutex_clear (&lock1); + g_thread_join (thread1); + + /* Connect and disconnect another client. This will create and clean up the + * media. */ + g_mutex_lock (&lock4); + thread4 = g_thread_new ("thread4", thread_func, &lock4); + g_mutex_unlock (&lock4); + g_mutex_clear (&lock4); + g_thread_join (thread4); + + stop_server (); + iterate (); +} + +GST_END_TEST; + GST_START_TEST (test_announce_without_sdp) { GstRTSPConnection *conn; @@ -1749,7 +1823,8 @@ gint i; mfactory = - start_record_server ("( rtppcmadepay name=depay0 ! appsink name=sink async=false )"); + start_record_server + ("( rtppcmadepay name=depay0 ! appsink name=sink async=false )"); g_signal_connect (mfactory, "media-constructed", G_CALLBACK (media_constructed_cb), &server_sink); @@ -1926,6 +2001,7 @@ tcase_add_test (tc, test_play_disconnect); tcase_add_test (tc, test_play_specific_server_port); tcase_add_test (tc, test_play_smpte_range); + tcase_add_test (tc, test_shared); tcase_add_test (tc, test_announce_without_sdp); tcase_add_test (tc, test_record_tcp); return s; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gst-rtsp-server-1.8.1/tests/check/gst/stream.c new/gst-rtsp-server-1.8.2/tests/check/gst/stream.c --- old/gst-rtsp-server-1.8.1/tests/check/gst/stream.c 2016-03-24 12:36:50.000000000 +0100 +++ new/gst-rtsp-server-1.8.2/tests/check/gst/stream.c 2016-05-04 09:21:55.000000000 +0200 @@ -52,18 +52,20 @@ /* configure address pool for IPv4 and IPv6 unicast addresses */ pool = gst_rtsp_address_pool_new (); - fail_unless (gst_rtsp_address_pool_add_range (pool, GST_RTSP_ADDRESS_POOL_ANY_IPV4, - GST_RTSP_ADDRESS_POOL_ANY_IPV4, 50000, 60000, 0)); - fail_unless (gst_rtsp_address_pool_add_range (pool, GST_RTSP_ADDRESS_POOL_ANY_IPV6, - GST_RTSP_ADDRESS_POOL_ANY_IPV6, 50000, 60000, 0)); + fail_unless (gst_rtsp_address_pool_add_range (pool, + GST_RTSP_ADDRESS_POOL_ANY_IPV4, GST_RTSP_ADDRESS_POOL_ANY_IPV4, 50000, + 60000, 0)); + fail_unless (gst_rtsp_address_pool_add_range (pool, + GST_RTSP_ADDRESS_POOL_ANY_IPV6, GST_RTSP_ADDRESS_POOL_ANY_IPV6, 50000, + 60000, 0)); gst_rtsp_stream_set_address_pool (stream, pool); fail_unless (gst_rtsp_stream_join_bin (stream, bin, rtpbin, GST_STATE_NULL)); gst_rtsp_transport_new (&tr); tr->lower_transport = GST_RTSP_LOWER_TRANS_UDP; - fail_unless (gst_rtsp_stream_allocate_udp_sockets (stream, G_SOCKET_FAMILY_IPV4, - tr, FALSE)); + fail_unless (gst_rtsp_stream_allocate_udp_sockets (stream, + G_SOCKET_FAMILY_IPV4, tr, FALSE)); socket = gst_rtsp_stream_get_rtp_socket (stream, G_SOCKET_FAMILY_IPV4); have_ipv4 = (socket != NULL); @@ -138,7 +140,7 @@ pool = gst_rtsp_address_pool_new (); fail_unless (gst_rtsp_address_pool_add_range (pool, "192.168.1.1", - "192.168.1.1", 6000, 6001, 0)); + "192.168.1.1", 6000, 6001, 0)); gst_rtsp_stream_set_address_pool (stream, pool); fail_unless (gst_rtsp_stream_join_bin (stream, bin, rtpbin, GST_STATE_NULL)); @@ -146,7 +148,7 @@ gst_rtsp_transport_new (&tr); tr->lower_transport = GST_RTSP_LOWER_TRANS_UDP; fail_if (gst_rtsp_stream_allocate_udp_sockets (stream, G_SOCKET_FAMILY_IPV4, - tr, FALSE)); + tr, FALSE)); gst_rtsp_transport_free (tr); g_object_unref (pool); @@ -258,8 +260,8 @@ gst_rtsp_transport_new (&tr); /* unicast udp */ tr->lower_transport = GST_RTSP_LOWER_TRANS_UDP; - fail_unless (gst_rtsp_stream_allocate_udp_sockets (stream, G_SOCKET_FAMILY_IPV4, - tr, FALSE)); + fail_unless (gst_rtsp_stream_allocate_udp_sockets (stream, + G_SOCKET_FAMILY_IPV4, tr, FALSE)); gst_rtsp_transport_free (tr); g_object_unref (pool); @@ -309,8 +311,8 @@ /* allocate udp multicast ports for IPv4 */ gst_rtsp_transport_new (&tr); tr->lower_transport = GST_RTSP_LOWER_TRANS_UDP_MCAST; - fail_unless (gst_rtsp_stream_allocate_udp_sockets (stream, G_SOCKET_FAMILY_IPV4, - tr, FALSE)); + fail_unless (gst_rtsp_stream_allocate_udp_sockets (stream, + G_SOCKET_FAMILY_IPV4, tr, FALSE)); /* check the multicast address and ports for IPv4 */ addr = gst_rtsp_stream_get_multicast_address (stream, G_SOCKET_FAMILY_IPV4); @@ -320,9 +322,9 @@ fail_unless_equals_int (addr->n_ports, 2); gst_rtsp_address_free (addr); - /* allocate upd multicast ports for IPv6 */ - fail_unless (gst_rtsp_stream_allocate_udp_sockets (stream, G_SOCKET_FAMILY_IPV6, - tr, FALSE)); + /* allocate udp multicast ports for IPv6 */ + fail_unless (gst_rtsp_stream_allocate_udp_sockets (stream, + G_SOCKET_FAMILY_IPV6, tr, FALSE)); /* check the multicast address and ports for IPv6 */ addr = gst_rtsp_stream_get_multicast_address (stream, G_SOCKET_FAMILY_IPV6); @@ -388,8 +390,8 @@ tr->port.min = 6002; tr->port.max = 6003; tr->lower_transport = GST_RTSP_LOWER_TRANS_UDP_MCAST; - fail_unless (gst_rtsp_stream_allocate_udp_sockets (stream, G_SOCKET_FAMILY_IPV4, - tr, FALSE)); + fail_unless (gst_rtsp_stream_allocate_udp_sockets (stream, + G_SOCKET_FAMILY_IPV4, tr, FALSE)); /* verify that the multicast address and ports correspond to the requested client * transport information for IPv4 */ @@ -405,8 +407,8 @@ tr->destination = g_strdup ("FF11:DB8::1"); tr->port.min = 6006; tr->port.max = 6007; - fail_unless (gst_rtsp_stream_allocate_udp_sockets (stream, G_SOCKET_FAMILY_IPV6, - tr, FALSE)); + fail_unless (gst_rtsp_stream_allocate_udp_sockets (stream, + G_SOCKET_FAMILY_IPV6, tr, FALSE)); /* verify that the multicast address and ports correspond to the requested client * transport information for IPv6 */