From 26f5ba92fdc5af292f474e01f63b91671f2902dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Wed, 21 May 2014 12:59:42 +0200 Subject: Imported Upstream version 1.3.2 --- ChangeLog | 68 +++++++- NEWS | 18 +- config.guess | 192 +++------------------ config.sub | 23 +-- configure | 38 ++-- configure.ac | 8 +- docs/plugins/gst-libav-plugins.args | 80 +++++++++ .../html/gst-libav-plugins-plugin-libav.html | 2 +- docs/plugins/html/index.html | 2 +- docs/plugins/inspect/plugin-libav.xml | 2 +- ext/libav/gstavviddec.c | 85 ++++----- ext/libav/gstavvidenc.c | 29 +++- ext/libav/gstavvidenc.h | 1 + gst-libav.doap | 10 ++ gst-libav.spec | 2 +- gst-libs/ext/libav/Changelog | 25 +++ gst-libs/ext/libav/RELEASE | 2 +- gst-libs/ext/libav/libavcodec/dcadec.c | 20 ++- gst-libs/ext/libav/libavcodec/golomb.h | 4 +- gst-libs/ext/libav/libavcodec/pcm-dvd.c | 8 +- gst-libs/ext/libav/libavcodec/vp9.c | 4 +- gst-libs/ext/libav/libavfilter/af_volume.c | 2 + gst-libs/ext/libav/libavfilter/vf_gradfun.c | 1 + gst-libs/ext/libav/libavfilter/vf_hqdn3d.c | 1 + gst-libs/ext/libav/libavformat/avidec.c | 70 +++++++- gst-libs/ext/libav/libavformat/matroska.c | 1 + gst-libs/ext/libav/libavformat/matroska.h | 1 + gst-libs/ext/libav/libavformat/matroskadec.c | 10 +- gst-libs/ext/libav/libavformat/mp3enc.c | 46 ++++- gst-libs/ext/libav/libavformat/rtmpproto.c | 6 +- gst-libs/ext/libav/libavresample/utils.c | 2 +- gst-libs/ext/libav/libswscale/utils.c | 2 +- 32 files changed, 478 insertions(+), 287 deletions(-) diff --git a/ChangeLog b/ChangeLog index 3632606..8d4cb05 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,9 +1,73 @@ +=== release 1.3.2 === + +2014-05-21 Sebastian Dröge + + * configure.ac: + releasing 1.3.2 + +2014-05-21 10:53:31 +0200 Sebastian Dröge + + * common: + Automatic update of common submodule + From 211fa5f to 1f5d3c3 + +2014-03-17 22:26:52 -0700 Gavin Hurlbut + + * ext/libav/gstavvidenc.c: + * ext/libav/gstavvidenc.h: + avvidenc: Add thread-count parameter for libav encoders + As some libav encoders (such as MPEG2) use a thread_count parameter to control + how many threads to use, and since it was always being set to 0 (which uses + the default), suboptimal threading can sometimes be chosen. This extends the + libav encoders to allow for a max-threads parameter which is passed into + the internal structure to control this knob if applicable to the encoder. + https://bugzilla.gnome.org/show_bug.cgi?id=726612 + +2014-05-13 20:17:17 +0200 Mathieu Duponchelle + + * ext/libav/gstavviddec.c: + gstavviddec: Sanitize and fix qos handling. + gst_video_decoder_get_max_decding_time doesn't return a GstClockTime + but a GstClockTimeDiff, and thus one needs to compare it against + G_MAXINT_64. + The returning of a boolean and the extra subsequent code in _video_frame + was uselessly complicated. + The previous behaviour led to artefacts when the decoder tried to + hurry up. + https://bugzilla.gnome.org/show_bug.cgi?id=730075 + +2014-05-14 10:19:44 +0200 Sebastian Dröge + + * gst-libs/ext/libav: + Update to libav 10.1 + +2014-03-27 18:53:53 -0400 Nicolas Dufresne + + * ext/libav/gstavviddec.c: + videodec: Don't use non-growable pool + As we don't know how many output buffers we need to operate, we need to + avoid pool that can't grow. Otherwise the pipeline may stall, waiting + for buffers. For now, we require it to be able to grow to at least + 32 buffers, which I think is a fair amount of buffers for decoders. + https://bugzilla.gnome.org/show_bug.cgi?id=726299 + +2014-05-03 20:48:40 +0200 Sebastian Dröge + + * configure.ac: + Back to development + === release 1.3.1 === -2014-05-03 Sebastian Dröge +2014-05-03 18:34:52 +0200 Sebastian Dröge + * ChangeLog: + * NEWS: + * RELEASE: * configure.ac: - releasing 1.3.1 + * docs/plugins/gst-libav-plugins.hierarchy: + * docs/plugins/inspect/plugin-libav.xml: + * gst-libav.doap: + Release 1.3.1 2014-05-03 10:17:23 +0200 Sebastian Dröge diff --git a/NEWS b/NEWS index b0f9a64..dc015a8 100644 --- a/NEWS +++ b/NEWS @@ -1,4 +1,4 @@ -This is GStreamer Libav Plugins 1.3.1 +This is GStreamer Libav Plugins 1.3.2 Changes since 1.2: @@ -45,6 +45,8 @@ New API: events and merge custom tags into them consistently. • playbin/playsink has support for application provided audio and video filters. + • GstDiscoverer has new and simplified API to get details about missing + plugins and information to pass to the plugin installer. • The GL library was merged from gst-plugins-gl to gst-plugins-bad, providing a generic infrastructure for handling GL inside GStreamer pipelines and a plugin with some elements using these, especially @@ -62,6 +64,14 @@ Major changes: of the existing V4L2 elements and the corresponding infrastructure. The v4l2videodec element replaces the mfcdec element. + ∘ New downloadbuffer element that replaces the download + buffering feature of queue2. Compared to queue2's code + it is much simpler and only for this single use case. + A noteworthy new feature is that it's downloading gaps + in the already downloaded stream parts when nothing else + is to be downloaded. + This is now used by playbin when download buffering is + enabled. ∘ rtpstreampay and rtpstreamdepay elements for transmitting RTP packets over a stream API (e.g. TCP) according to RFC 4571. @@ -78,7 +88,7 @@ Major changes: are available on OS X and iOS now. • Other changes: - ∘ gst-libav now uses libav 10, and gained support for H265/HEVC. + ∘ gst-libav now uses libav 10.1, and gained support for H265/HEVC. ∘ Support for hardware codecs and special memory types has been improved with bugfixes and feature additions in various plugins and base classes. @@ -95,6 +105,9 @@ Major changes: reliable now and supports more HLS features like trick modes. Also fragments are pushed downstream while they're downloaded now instead of waiting for each fragment to finish. + ∘ dashdemux and mssdemux are now also pushing fragments downstream + while they're downloaded instead of waiting for each fragment to + finish. ∘ videoflip can automatically flip based on the orientation tag. ∘ openjpeg supports the OpenJPEG2 API. ∘ gst-rtsp-server supports SRTP and MIKEY now. @@ -107,4 +120,3 @@ Things to look out for: element. • The mfcdec element was removed and replaced by v4l2videodec. • osxvideosink is only available in OS X 10.6 or newer. - diff --git a/config.guess b/config.guess index b79252d..1f5c50c 100755 --- a/config.guess +++ b/config.guess @@ -1,8 +1,8 @@ #! /bin/sh # Attempt to guess a canonical system name. -# Copyright 1992-2013 Free Software Foundation, Inc. +# Copyright 1992-2014 Free Software Foundation, Inc. -timestamp='2013-06-10' +timestamp='2014-03-23' # 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 @@ -50,7 +50,7 @@ version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. -Copyright 1992-2013 Free Software Foundation, Inc. +Copyright 1992-2014 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." @@ -149,7 +149,7 @@ Linux|GNU|GNU/*) LIBC=gnu #endif EOF - eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC' | sed 's, ,,g'` ;; esac @@ -826,7 +826,7 @@ EOF *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; - i*:MSYS*:*) + *:MSYS*:*) echo ${UNAME_MACHINE}-pc-msys exit ;; i*:windows32*:*) @@ -969,10 +969,10 @@ EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; } ;; - or1k:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + openrisc*:Linux:*:*) + echo or1k-unknown-linux-${LIBC} exit ;; - or32:Linux:*:*) + or32:Linux:*:* | or1k*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; padre:Linux:*:*) @@ -1260,16 +1260,26 @@ EOF if test "$UNAME_PROCESSOR" = unknown ; then UNAME_PROCESSOR=powerpc fi - 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) | \ - grep IS_64BIT_ARCH >/dev/null - then - case $UNAME_PROCESSOR in - i386) UNAME_PROCESSOR=x86_64 ;; - powerpc) UNAME_PROCESSOR=powerpc64 ;; - esac + if test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; 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) | \ + grep IS_64BIT_ARCH >/dev/null + then + case $UNAME_PROCESSOR in + i386) UNAME_PROCESSOR=x86_64 ;; + powerpc) UNAME_PROCESSOR=powerpc64 ;; + esac + fi fi + elif test "$UNAME_PROCESSOR" = i386 ; then + # Avoid executing cc on OS X 10.9, as it ships with a stub + # that puts up a graphical alert prompting to install + # developer tools. Any system running Mac OS X 10.7 or + # later (Darwin 11 and later) is required to have a 64-bit + # processor. This is not true of the ARM version of Darwin + # that Apple uses in portable devices. + UNAME_PROCESSOR=x86_64 fi echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; @@ -1361,154 +1371,6 @@ EOF exit ;; esac -eval $set_cc_for_build -cat >$dummy.c < -# include -#endif -main () -{ -#if defined (sony) -#if defined (MIPSEB) - /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, - I don't know.... */ - printf ("mips-sony-bsd\n"); exit (0); -#else -#include - printf ("m68k-sony-newsos%s\n", -#ifdef NEWSOS4 - "4" -#else - "" -#endif - ); exit (0); -#endif -#endif - -#if defined (__arm) && defined (__acorn) && defined (__unix) - printf ("arm-acorn-riscix\n"); exit (0); -#endif - -#if defined (hp300) && !defined (hpux) - printf ("m68k-hp-bsd\n"); exit (0); -#endif - -#if defined (NeXT) -#if !defined (__ARCHITECTURE__) -#define __ARCHITECTURE__ "m68k" -#endif - int version; - version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; - if (version < 4) - printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); - else - printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); - exit (0); -#endif - -#if defined (MULTIMAX) || defined (n16) -#if defined (UMAXV) - printf ("ns32k-encore-sysv\n"); exit (0); -#else -#if defined (CMU) - printf ("ns32k-encore-mach\n"); exit (0); -#else - printf ("ns32k-encore-bsd\n"); exit (0); -#endif -#endif -#endif - -#if defined (__386BSD__) - printf ("i386-pc-bsd\n"); exit (0); -#endif - -#if defined (sequent) -#if defined (i386) - printf ("i386-sequent-dynix\n"); exit (0); -#endif -#if defined (ns32000) - printf ("ns32k-sequent-dynix\n"); exit (0); -#endif -#endif - -#if defined (_SEQUENT_) - struct utsname un; - - uname(&un); - - if (strncmp(un.version, "V2", 2) == 0) { - printf ("i386-sequent-ptx2\n"); exit (0); - } - if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ - printf ("i386-sequent-ptx1\n"); exit (0); - } - printf ("i386-sequent-ptx\n"); exit (0); - -#endif - -#if defined (vax) -# if !defined (ultrix) -# include -# if defined (BSD) -# if BSD == 43 - printf ("vax-dec-bsd4.3\n"); exit (0); -# else -# if BSD == 199006 - printf ("vax-dec-bsd4.3reno\n"); exit (0); -# else - printf ("vax-dec-bsd\n"); exit (0); -# endif -# endif -# else - printf ("vax-dec-bsd\n"); exit (0); -# endif -# else - printf ("vax-dec-ultrix\n"); exit (0); -# endif -#endif - -#if defined (alliant) && defined (i860) - printf ("i860-alliant-bsd\n"); exit (0); -#endif - - exit (1); -} -EOF - -$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && - { echo "$SYSTEM_NAME"; exit; } - -# Apollos put the system type in the environment. - -test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } - -# Convex versions that predate uname can use getsysinfo(1) - -if [ -x /usr/convex/getsysinfo ] -then - case `getsysinfo -f cpu_type` in - c1*) - echo c1-convex-bsd - exit ;; - c2*) - if getsysinfo -f scalar_acc - then echo c32-convex-bsd - else echo c2-convex-bsd - fi - exit ;; - c34*) - echo c34-convex-bsd - exit ;; - c38*) - echo c38-convex-bsd - exit ;; - c4*) - echo c4-convex-bsd - exit ;; - esac -fi - cat >&2 <." version="\ GNU config.sub ($timestamp) -Copyright 1992-2013 Free Software Foundation, Inc. +Copyright 1992-2014 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." @@ -265,6 +265,7 @@ case $basic_machine in | hexagon \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ + | k1om \ | le32 | le64 \ | lm32 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ @@ -282,8 +283,10 @@ case $basic_machine in | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ + | mipsisa32r6 | mipsisa32r6el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ + | mipsisa64r6 | mipsisa64r6el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipsr5900 | mipsr5900el \ @@ -295,8 +298,7 @@ case $basic_machine in | nds32 | nds32le | nds32be \ | nios | nios2 | nios2eb | nios2el \ | ns16k | ns32k \ - | open8 \ - | or1k | or32 \ + | open8 | or1k | or1knd | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle \ | pyramid \ @@ -324,7 +326,7 @@ case $basic_machine in c6x) basic_machine=tic6x-unknown ;; - m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip) + m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip) basic_machine=$basic_machine-unknown os=-none ;; @@ -381,6 +383,7 @@ case $basic_machine in | hexagon-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ + | k1om-* \ | le32-* | le64-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ @@ -400,8 +403,10 @@ case $basic_machine in | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ + | mipsisa32r6-* | mipsisa32r6el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ + | mipsisa64r6-* | mipsisa64r6el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipsr5900-* | mipsr5900el-* \ @@ -413,6 +418,7 @@ case $basic_machine in | nios-* | nios2-* | nios2eb-* | nios2el-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | open8-* \ + | or1k*-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ @@ -1374,7 +1380,7 @@ case $os in | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ - | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) + | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* | -tirtos*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) @@ -1592,9 +1598,6 @@ case $basic_machine in mips*-*) os=-elf ;; - or1k-*) - os=-elf - ;; or32-*) os=-coff ;; diff --git a/configure b/configure index e9d7ce2..d337b55 100755 --- a/configure +++ b/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for GStreamer libav 1.3.1. +# Generated by GNU Autoconf 2.69 for GStreamer libav 1.3.2. # # Report bugs to . # @@ -591,8 +591,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='GStreamer libav' PACKAGE_TARNAME='gst-libav' -PACKAGE_VERSION='1.3.1' -PACKAGE_STRING='GStreamer libav 1.3.1' +PACKAGE_VERSION='1.3.2' +PACKAGE_STRING='GStreamer libav 1.3.2' PACKAGE_BUGREPORT='http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer' PACKAGE_URL='' @@ -1495,7 +1495,7 @@ if test "$ac_init_help" = "long"; then # 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 libav 1.3.1 to adapt to many kinds of systems. +\`configure' configures GStreamer libav 1.3.2 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1566,7 +1566,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of GStreamer libav 1.3.1:";; + short | recursive ) echo "Configuration of GStreamer libav 1.3.2:";; esac cat <<\_ACEOF @@ -1734,7 +1734,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -GStreamer libav configure 1.3.1 +GStreamer libav configure 1.3.2 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -2149,7 +2149,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by GStreamer libav $as_me 1.3.1, which was +It was created by GStreamer libav $as_me 1.3.2, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -3127,7 +3127,7 @@ fi # Define the identity of the package. PACKAGE='gst-libav' - VERSION='1.3.1' + VERSION='1.3.2' cat >>confdefs.h <<_ACEOF @@ -3338,9 +3338,9 @@ fi - PACKAGE_VERSION_MAJOR=$(echo 1.3.1 | cut -d'.' -f1) - PACKAGE_VERSION_MINOR=$(echo 1.3.1 | cut -d'.' -f2) - PACKAGE_VERSION_MICRO=$(echo 1.3.1 | cut -d'.' -f3) + PACKAGE_VERSION_MAJOR=$(echo 1.3.2 | cut -d'.' -f1) + PACKAGE_VERSION_MINOR=$(echo 1.3.2 | cut -d'.' -f2) + PACKAGE_VERSION_MICRO=$(echo 1.3.2 | cut -d'.' -f3) @@ -3351,7 +3351,7 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking nano version" >&5 $as_echo_n "checking nano version... " >&6; } - NANO=$(echo 1.3.1 | cut -d'.' -f4) + NANO=$(echo 1.3.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 @@ -8003,10 +8003,10 @@ fi done - GST_CURRENT=301 + GST_CURRENT=302 GST_REVISION=0 - GST_AGE=301 - GST_LIBVERSION=301:0:301 + GST_AGE=302 + GST_LIBVERSION=302:0:302 @@ -12331,8 +12331,8 @@ CC="$lt_save_CC" -GST_REQ=1.3.1 -GST_PBREQ=1.3.1 +GST_REQ=1.3.2 +GST_PBREQ=1.3.2 ORC_REQ=0.4.16 @@ -17461,7 +17461,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by GStreamer libav $as_me 1.3.1, which was +This file was extended by GStreamer libav $as_me 1.3.2, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -17527,7 +17527,7 @@ _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -GStreamer libav config.status 1.3.1 +GStreamer libav config.status 1.3.2 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" diff --git a/configure.ac b/configure.ac index c7bacdc..7355af5 100644 --- a/configure.ac +++ b/configure.ac @@ -3,7 +3,7 @@ AC_PREREQ(2.62) 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 libav, 1.3.1, +AC_INIT(GStreamer libav, 1.3.2, http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer, gst-libav) @@ -42,11 +42,11 @@ GST_API_VERSION=1.0 AC_SUBST(GST_API_VERSION) AG_GST_LIBTOOL_PREPARE -AS_LIBTOOL(GST, 301, 0, 301) +AS_LIBTOOL(GST, 302, 0, 302) dnl *** required versions of GStreamer stuff *** -GST_REQ=1.3.1 -GST_PBREQ=1.3.1 +GST_REQ=1.3.2 +GST_PBREQ=1.3.2 ORC_REQ=0.4.16 ORC_CHECK([$ORC_REQ]) diff --git a/docs/plugins/gst-libav-plugins.args b/docs/plugins/gst-libav-plugins.args index faf6c86..f5fcb47 100644 --- a/docs/plugins/gst-libav-plugins.args +++ b/docs/plugins/gst-libav-plugins.args @@ -14408,6 +14408,16 @@ 0 + +avenc_prores::max-threads +gint +>= 0 +rw +Maximum encode threads +Maximum number of worker threads to spawn. (0 = auto). +0 + + avenc_ppm::bitrate gint @@ -16618,6 +16628,16 @@ 1 + +avenc_mpeg4::max-threads +gint +>= 0 +rw +Maximum encode threads +Maximum number of worker threads to spawn. (0 = auto). +0 + + avenc_mpeg2video::b-quant-factor gfloat @@ -17208,6 +17228,16 @@ 1 + +avenc_mpeg2video::max-threads +gint +>= 0 +rw +Maximum encode threads +Maximum number of worker threads to spawn. (0 = auto). +0 + + avenc_mpeg1video::b-quant-factor gfloat @@ -17798,6 +17828,16 @@ 1 + +avenc_mpeg1video::max-threads +gint +>= 0 +rw +Maximum encode threads +Maximum number of worker threads to spawn. (0 = auto). +0 + + avenc_mp2::bitrate gint @@ -18658,6 +18698,16 @@ 1 + +avenc_h263p::max-threads +gint +>= 0 +rw +Maximum encode threads +Maximum number of worker threads to spawn. (0 = auto). +0 + + avenc_h263::b-quant-factor gfloat @@ -20128,6 +20178,16 @@ 0 + +avenc_ffv1::max-threads +gint +>= 0 +rw +Maximum encode threads +Maximum number of worker threads to spawn. (0 = auto). +0 + + avenc_eac3::bitrate gint @@ -20208,6 +20268,16 @@ 0 + +avenc_dvvideo::max-threads +gint +>= 0 +rw +Maximum encode threads +Maximum number of worker threads to spawn. (0 = auto). +0 + + avenc_dpx::bitrate gint @@ -20328,6 +20398,16 @@ 0 + +avenc_dnxhd::max-threads +gint +>= 0 +rw +Maximum encode threads +Maximum number of worker threads to spawn. (0 = auto). +0 + + avenc_comfortnoise::bitrate gint diff --git a/docs/plugins/html/gst-libav-plugins-plugin-libav.html b/docs/plugins/html/gst-libav-plugins-plugin-libav.html index 20eb261..a6939b9 100644 --- a/docs/plugins/html/gst-libav-plugins-plugin-libav.html +++ b/docs/plugins/html/gst-libav-plugins-plugin-libav.html @@ -42,7 +42,7 @@

version

-1.3.1 +1.3.2

run-time license

diff --git a/docs/plugins/html/index.html b/docs/plugins/html/index.html index 85d5f48..57c2239 100644 --- a/docs/plugins/html/index.html +++ b/docs/plugins/html/index.html @@ -15,7 +15,7 @@

- for GStreamer libav Plugins 1.0 (1.3.1) + for GStreamer libav Plugins 1.0 (1.3.2) The latest version of this documentation can be found on-line at http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-ffmpeg-plugins/html/.

diff --git a/docs/plugins/inspect/plugin-libav.xml b/docs/plugins/inspect/plugin-libav.xml index cb01229..3e9dfae 100644 --- a/docs/plugins/inspect/plugin-libav.xml +++ b/docs/plugins/inspect/plugin-libav.xml @@ -3,7 +3,7 @@ All libav codecs and formats (local snapshot) ../../ext/libav/.libs/libgstlibav.so libgstlibav.so - 1.3.1 + 1.3.2 GPL gst-libav libav diff --git a/ext/libav/gstavviddec.c b/ext/libav/gstavviddec.c index b3ba5c0..94dfa58 100644 --- a/ext/libav/gstavviddec.c +++ b/ext/libav/gstavviddec.c @@ -47,6 +47,7 @@ GST_DEBUG_CATEGORY_EXTERN (GST_CAT_PERFORMANCE); #define DEFAULT_DEBUG_MV FALSE #define DEFAULT_MAX_THREADS 0 #define DEFAULT_OUTPUT_CORRUPT TRUE +#define REQUIRED_POOL_MAX_BUFFERS 32 enum { @@ -1065,10 +1066,8 @@ negotiate_failed: * Sets the skip_frame flag and if things are really bad, skips to the next * keyframe. * - * Returns TRUE if the frame should be decoded, FALSE if the frame can be dropped - * entirely. */ -static gboolean +static void gst_ffmpegviddec_do_qos (GstFFMpegVidDec * ffmpegdec, GstVideoCodecFrame * frame, gboolean * mode_switch) { @@ -1077,47 +1076,29 @@ gst_ffmpegviddec_do_qos (GstFFMpegVidDec * ffmpegdec, *mode_switch = FALSE; if (frame == NULL) - goto no_qos; + return; diff = gst_video_decoder_get_max_decode_time (GST_VIDEO_DECODER (ffmpegdec), frame); /* if we don't have timing info, then we don't do QoS */ - if (G_UNLIKELY (!GST_CLOCK_TIME_IS_VALID (diff))) - goto no_qos; - - GST_DEBUG_OBJECT (ffmpegdec, "decoding time %" GST_TIME_FORMAT, - GST_TIME_ARGS (diff)); + if (G_UNLIKELY(diff == G_MAXINT64)) + return; - if (diff > 0) - goto normal_mode; + GST_DEBUG_OBJECT (ffmpegdec, "decoding time %" G_GINT64_FORMAT, diff); - if (diff <= 0) { - goto skip_frame; + if (diff > 0 && ffmpegdec->context->skip_frame != AVDISCARD_DEFAULT) { + ffmpegdec->context->skip_frame = AVDISCARD_DEFAULT; + *mode_switch = TRUE; + GST_DEBUG_OBJECT (ffmpegdec, "QOS: normal mode"); } -no_qos: - return TRUE; - -normal_mode: - { - if (ffmpegdec->context->skip_frame != AVDISCARD_DEFAULT) { - ffmpegdec->context->skip_frame = AVDISCARD_DEFAULT; - *mode_switch = TRUE; - GST_DEBUG_OBJECT (ffmpegdec, "QOS: normal mode"); - } - return TRUE; - } -skip_frame: - { - if (ffmpegdec->context->skip_frame != AVDISCARD_NONREF) { - ffmpegdec->context->skip_frame = AVDISCARD_NONREF; - *mode_switch = TRUE; - GST_DEBUG_OBJECT (ffmpegdec, - "QOS: hurry up, diff %" G_GINT64_FORMAT " >= 0", diff); - } - return FALSE; + else if (diff <= 0 && ffmpegdec->context->skip_frame != AVDISCARD_NONREF) { + ffmpegdec->context->skip_frame = AVDISCARD_NONREF; + *mode_switch = TRUE; + GST_DEBUG_OBJECT (ffmpegdec, + "QOS: hurry up, diff %" G_GINT64_FORMAT " >= 0", diff); } } @@ -1205,8 +1186,6 @@ gst_ffmpegviddec_video_frame (GstFFMpegVidDec * ffmpegdec, gint len = -1; gint have_data; gboolean mode_switch; - gboolean decode; - gint skip_frame = AVDISCARD_DEFAULT; GstVideoCodecFrame *out_frame; GstFFMpegVidDecVideoFrame *out_dframe; AVPacket packet; @@ -1218,7 +1197,7 @@ gst_ffmpegviddec_video_frame (GstFFMpegVidDec * ffmpegdec, /* run QoS code, we don't stop decoding the frame when we are late because * else we might skip a reference frame */ - decode = gst_ffmpegviddec_do_qos (ffmpegdec, frame, &mode_switch); + gst_ffmpegviddec_do_qos (ffmpegdec, frame, &mode_switch); if (ffmpegdec->is_realvideo && data != NULL) { gint slice_count; @@ -1238,13 +1217,6 @@ gst_ffmpegviddec_video_frame (GstFFMpegVidDec * ffmpegdec, } } - if (!decode) { - /* no decoding needed, save previous skip_frame value and brutely skip - * decoding everything */ - skip_frame = ffmpegdec->context->skip_frame; - ffmpegdec->context->skip_frame = AVDISCARD_NONREF; - } - if (frame) { /* save reference to the timing info */ ffmpegdec->context->reordered_opaque = (gint64) frame->system_frame_number; @@ -1269,10 +1241,6 @@ gst_ffmpegviddec_video_frame (GstFFMpegVidDec * ffmpegdec, len = avcodec_decode_video2 (ffmpegdec->context, ffmpegdec->picture, &have_data, &packet); - /* restore previous state */ - if (!decode) - ffmpegdec->context->skip_frame = skip_frame; - GST_DEBUG_OBJECT (ffmpegdec, "after decode: len %d, have_data %d", len, have_data); @@ -1693,7 +1661,7 @@ gst_ffmpegviddec_decide_allocation (GstVideoDecoder * decoder, GstQuery * query) GstBufferPool *pool; guint size, min, max; GstStructure *config; - gboolean have_videometa, have_alignment; + gboolean have_videometa, have_alignment, update_pool; GstAllocator *allocator = NULL; GstAllocationParams params = { 0, 15, 0, 0, }; @@ -1712,6 +1680,22 @@ gst_ffmpegviddec_decide_allocation (GstVideoDecoder * decoder, GstQuery * query) gst_query_parse_nth_allocation_pool (query, 0, &pool, &size, &min, &max); + /* Don't use pool that can't grow, as we don't know how many buffer we'll + * need, otherwise we may stall */ + if (max != 0 && max < REQUIRED_POOL_MAX_BUFFERS) { + gst_object_unref (pool); + pool = gst_video_buffer_pool_new (); + max = 0; + update_pool = TRUE; + + /* if there is an allocator, also drop it, as it might be the reason we + * have this limit. Default will be used */ + if (allocator) { + gst_object_unref (allocator); + allocator = NULL; + } + } + config = gst_buffer_pool_get_config (pool); gst_buffer_pool_config_set_params (config, state->caps, size, min, max); /* we are happy with the default allocator but we would like to have 16 bytes @@ -1799,6 +1783,9 @@ gst_ffmpegviddec_decide_allocation (GstVideoDecoder * decoder, GstQuery * query) /* and store */ gst_buffer_pool_set_config (pool, config); + if (update_pool) + gst_query_set_nth_allocation_pool (query, 0, pool, size, min, max); + gst_object_unref (pool); if (allocator) gst_object_unref (allocator); diff --git a/ext/libav/gstavvidenc.c b/ext/libav/gstavvidenc.c index c01efaf..97680db 100644 --- a/ext/libav/gstavvidenc.c +++ b/ext/libav/gstavvidenc.c @@ -62,6 +62,7 @@ enum PROP_ME_METHOD, PROP_BUFSIZE, PROP_RTP_PAYLOAD_SIZE, + PROP_MAX_THREADS, PROP_COMPLIANCE, PROP_CFG_BASE, }; @@ -174,6 +175,7 @@ gst_ffmpegvidenc_class_init (GstFFMpegVidEncClass * klass) { GObjectClass *gobject_class; GstVideoEncoderClass *venc_class; + int caps; gobject_class = (GObjectClass *) klass; venc_class = (GstVideoEncoderClass *) klass; @@ -207,6 +209,14 @@ gst_ffmpegvidenc_class_init (GstFFMpegVidEncClass * klass) "RTP Payload Size", "Target GOB length", 0, G_MAXINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + caps = klass->in_plugin->capabilities; + if (caps & (CODEC_CAP_FRAME_THREADS | CODEC_CAP_SLICE_THREADS)) { + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_MAX_THREADS, + g_param_spec_int ("max-threads", "Maximum encode threads", + "Maximum number of worker threads to spawn. (0 = auto)", + 0, G_MAXINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + } + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_COMPLIANCE, g_param_spec_enum ("compliance", "Compliance", "Adherence of the encoder to the specifications", @@ -247,6 +257,7 @@ gst_ffmpegvidenc_init (GstFFMpegVidEnc * ffmpegenc) ffmpegenc->gop_size = DEFAULT_VIDEO_GOP_SIZE; ffmpegenc->rtp_payload_size = 0; ffmpegenc->compliance = FFMPEG_DEFAULT_COMPLIANCE; + ffmpegenc->max_threads = 0; ffmpegenc->lmin = 2; ffmpegenc->lmax = 31; @@ -320,6 +331,14 @@ gst_ffmpegvidenc_set_format (GstVideoEncoder * encoder, GST_DEBUG_OBJECT (ffmpegenc, "Setting avcontext to bitrate %d, gop_size %d", ffmpegenc->bitrate, ffmpegenc->gop_size); + if (ffmpegenc->max_threads == 0) { + if (!(oclass->in_plugin->capabilities & CODEC_CAP_AUTO_THREADS)) + ffmpegenc->context->thread_count = gst_ffmpeg_auto_max_threads (); + else + ffmpegenc->context->thread_count = 0; + } else + ffmpegenc->context->thread_count = ffmpegenc->max_threads; + /* RTP payload used for GOB production (for Asterisk) */ if (ffmpegenc->rtp_payload_size) { ffmpegenc->context->rtp_payload_size = ffmpegenc->rtp_payload_size; @@ -557,7 +576,7 @@ gst_ffmpegvidenc_propose_allocation (GstVideoEncoder * encoder, static void gst_ffmpegvidenc_free_avpacket (gpointer pkt) { - av_packet_unref ((AVPacket *)pkt); + av_packet_unref ((AVPacket *) pkt); g_slice_free (AVPacket, pkt); } @@ -570,7 +589,7 @@ gst_ffmpegvidenc_handle_frame (GstVideoEncoder * encoder, gint ret = 0, c; GstVideoInfo *info = &ffmpegenc->input_state->info; GstVideoFrame vframe; - AVPacket * pkt; + AVPacket *pkt; int have_data = 0; if (GST_VIDEO_CODEC_FRAME_IS_FORCE_KEYFRAME (frame)) @@ -757,6 +776,9 @@ gst_ffmpegvidenc_set_property (GObject * object, case PROP_COMPLIANCE: ffmpegenc->compliance = g_value_get_enum (value); break; + case PROP_MAX_THREADS: + ffmpegenc->max_threads = g_value_get_int (value); + break; default: if (!gst_ffmpeg_cfg_set_property (object, value, pspec)) G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); @@ -793,6 +815,9 @@ gst_ffmpegvidenc_get_property (GObject * object, case PROP_COMPLIANCE: g_value_set_enum (value, ffmpegenc->compliance); break; + case PROP_MAX_THREADS: + g_value_set_int (value, ffmpegenc->max_threads); + break; default: if (!gst_ffmpeg_cfg_get_property (object, value, pspec)) G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); diff --git a/ext/libav/gstavvidenc.h b/ext/libav/gstavvidenc.h index e841d6c..be7b832 100644 --- a/ext/libav/gstavvidenc.h +++ b/ext/libav/gstavvidenc.h @@ -50,6 +50,7 @@ struct _GstFFMpegVidEnc gint buffer_size; gint rtp_payload_size; gint compliance; + gint max_threads; guint8 *working_buf; gsize working_buf_size; diff --git a/gst-libav.doap b/gst-libav.doap index cc74136..073f402 100644 --- a/gst-libav.doap +++ b/gst-libav.doap @@ -32,6 +32,16 @@ colorspace conversion elements. + + + 1.3.2 + 1.3 + + 2014-05-21 + + + + 1.3.1 diff --git a/gst-libav.spec b/gst-libav.spec index b982edc..05c4a00 100644 --- a/gst-libav.spec +++ b/gst-libav.spec @@ -4,7 +4,7 @@ %define gst_majorminor 1.0 Name: %{gstreamer}-libav -Version: 1.3.1 +Version: 1.3.2 Release: 1 Summary: GStreamer Streaming-media framework plug-in using libav (FFmpeg). Group: Libraries/Multimedia diff --git a/gst-libs/ext/libav/Changelog b/gst-libs/ext/libav/Changelog index 29902f4..30e63c9 100644 --- a/gst-libs/ext/libav/Changelog +++ b/gst-libs/ext/libav/Changelog @@ -1,6 +1,31 @@ Entries are sorted chronologically from oldest to youngest within each release, releases are sorted from youngest to oldest. +version 10.1: +- pcm-dvd: Fix 20bit decoding (bug/592) +- avi: Improve non-interleaved detection (bug/666) +- arm: hpeldsp: fix put_pixels8_y2_{,no_rnd_}armv6 +- arm: hpeldsp: prevent overreads in armv6 asm (bug/646) +- avfilter: Add missing emms_c when needed +- rtmpproto: Check the buffer sizes when copying app/playpath strings +- swscale: Fix an undefined behaviour +- vp9: Read the frame size as unsigned +- dcadec: Use correct channel count in stereo downmix check +- dcadec: Do not decode the XCh extension when downmixing to stereo +- matroska: add the Opus mapping +- matroskadec: read the CodecDelay element +- rtmpproto: Make sure to pass on the error code if read_connect failed +- lavr: allocate the resampling buffer with a positive size +- mp3enc: Properly write bitrate value in XING header (debian/736088) +- golomb: Fix the implementation of get_se_golomb_long + +version 10: +- af_channelmap: fix ONE_STR mapping mode +- matroskaenc: HEVC fixeswrite private data in hvcC format for HEVC. +- doc: Point to the correct, actually maintained gas-preprocessor repo +- http: Add support reading ICY metadata +- configure: Support older version of openjpeg1 + version 10~beta2: - compand audio filter - and many various smaller fixes, for a full changelog, please refer to: diff --git a/gst-libs/ext/libav/RELEASE b/gst-libs/ext/libav/RELEASE index f599e28..ae425d6 100644 --- a/gst-libs/ext/libav/RELEASE +++ b/gst-libs/ext/libav/RELEASE @@ -1 +1 @@ -10 +10.1 diff --git a/gst-libs/ext/libav/libavcodec/dcadec.c b/gst-libs/ext/libav/libavcodec/dcadec.c index 6c240ee..ce8660d 100644 --- a/gst-libs/ext/libav/libavcodec/dcadec.c +++ b/gst-libs/ext/libav/libavcodec/dcadec.c @@ -1856,6 +1856,16 @@ static int dca_decode_frame(AVCodecContext *avctx, void *data, if (s->amode < 16) { avctx->channel_layout = dca_core_channel_layout[s->amode]; + if (s->prim_channels + !!s->lfe > 2 && + avctx->request_channel_layout == AV_CH_LAYOUT_STEREO) { + /* + * Neither the core's auxiliary data nor our default tables contain + * downmix coefficients for the additional channel coded in the XCh + * extension, so when we're doing a Stereo downmix, don't decode it. + */ + s->xch_disable = 1; + } + #if FF_API_REQUEST_CHANNELS FF_DISABLE_DEPRECATION_WARNINGS if (s->xch_present && !s->xch_disable && @@ -1886,7 +1896,7 @@ FF_ENABLE_DEPRECATION_WARNINGS s->channel_order_tab[channels - 1 - !!s->lfe] < 0) return AVERROR_INVALIDDATA; - if (s->prim_channels + !!s->lfe > 2 && + if (num_core_channels + !!s->lfe > 2 && avctx->request_channel_layout == AV_CH_LAYOUT_STEREO) { channels = 2; s->output = s->prim_channels == 2 ? s->amode : DCA_STEREO; @@ -1900,7 +1910,7 @@ FF_ENABLE_DEPRECATION_WARNINGS if (s->core_downmix && (s->core_downmix_amode == DCA_STEREO || s->core_downmix_amode == DCA_STEREO_TOTAL)) { int sign, code; - for (i = 0; i < s->prim_channels + !!s->lfe; i++) { + for (i = 0; i < num_core_channels + !!s->lfe; i++) { sign = s->core_downmix_codes[i][0] & 0x100 ? 1 : -1; code = s->core_downmix_codes[i][0] & 0x0FF; s->downmix_coef[i][0] = (!code ? 0.0f : @@ -1918,19 +1928,19 @@ FF_ENABLE_DEPRECATION_WARNINGS "Invalid channel mode %d\n", am); return AVERROR_INVALIDDATA; } - if (s->prim_channels + !!s->lfe > + if (num_core_channels + !!s->lfe > FF_ARRAY_ELEMS(dca_default_coeffs[0])) { avpriv_request_sample(s->avctx, "Downmixing %d channels", s->prim_channels + !!s->lfe); return AVERROR_PATCHWELCOME; } - for (i = 0; i < s->prim_channels + !!s->lfe; i++) { + for (i = 0; i < num_core_channels + !!s->lfe; i++) { s->downmix_coef[i][0] = dca_default_coeffs[am][i][0]; s->downmix_coef[i][1] = dca_default_coeffs[am][i][1]; } } av_dlog(s->avctx, "Stereo downmix coeffs:\n"); - for (i = 0; i < s->prim_channels + !!s->lfe; i++) { + for (i = 0; i < num_core_channels + !!s->lfe; i++) { av_dlog(s->avctx, "L, input channel %d = %f\n", i, s->downmix_coef[i][0]); av_dlog(s->avctx, "R, input channel %d = %f\n", i, diff --git a/gst-libs/ext/libav/libavcodec/golomb.h b/gst-libs/ext/libav/libavcodec/golomb.h index ce3500f..1754706 100644 --- a/gst-libs/ext/libav/libavcodec/golomb.h +++ b/gst-libs/ext/libav/libavcodec/golomb.h @@ -211,9 +211,9 @@ static inline int get_se_golomb_long(GetBitContext *gb) unsigned int buf = get_ue_golomb_long(gb); if (buf & 1) - buf = -(buf >> 1); + buf = (buf + 1) >> 1; else - buf = (buf >> 1); + buf = -(buf >> 1); return buf; } diff --git a/gst-libs/ext/libav/libavcodec/pcm-dvd.c b/gst-libs/ext/libav/libavcodec/pcm-dvd.c index 172e93a..0872d29 100644 --- a/gst-libs/ext/libav/libavcodec/pcm-dvd.c +++ b/gst-libs/ext/libav/libavcodec/pcm-dvd.c @@ -177,11 +177,11 @@ static void *pcm_dvd_decode_samples(AVCodecContext *avctx, const uint8_t *src, dst32[2] = bytestream2_get_be16u(&gb) << 16; dst32[3] = bytestream2_get_be16u(&gb) << 16; t = bytestream2_get_byteu(&gb); - *dst32 += (t & 0xf0) << 8; - *dst32 += (t & 0x0f) << 12; + *dst32++ += (t & 0xf0) << 8; + *dst32++ += (t & 0x0f) << 12; t = bytestream2_get_byteu(&gb); - *dst32 += (t & 0xf0) << 8; - *dst32 += (t & 0x0f) << 12; + *dst32++ += (t & 0xf0) << 8; + *dst32++ += (t & 0x0f) << 12; } } while (--blocks); return dst32; diff --git a/gst-libs/ext/libav/libavcodec/vp9.c b/gst-libs/ext/libav/libavcodec/vp9.c index c04a3b8..2a6a138 100644 --- a/gst-libs/ext/libav/libavcodec/vp9.c +++ b/gst-libs/ext/libav/libavcodec/vp9.c @@ -1198,7 +1198,7 @@ static int vp9_decode_packet(AVCodecContext *avctx, void *frame, const uint8_t *idx = data + size + 1 - idx_sz; while (n_frames--) { - int sz = AV_RL32(idx); + unsigned sz = AV_RL32(idx); if (nbytes < 4) sz &= (1 << (8 * nbytes)) - 1; @@ -1206,7 +1206,7 @@ static int vp9_decode_packet(AVCodecContext *avctx, void *frame, if (sz > size) { av_log(avctx, AV_LOG_ERROR, - "Superframe packet size too big: %d > %d\n", + "Superframe packet size too big: %u > %d\n", sz, size); return AVERROR_INVALIDDATA; } diff --git a/gst-libs/ext/libav/libavfilter/af_volume.c b/gst-libs/ext/libav/libavfilter/af_volume.c index 12d496e..59223e5 100644 --- a/gst-libs/ext/libav/libavfilter/af_volume.c +++ b/gst-libs/ext/libav/libavfilter/af_volume.c @@ -278,6 +278,8 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *buf) } } + emms_c(); + if (buf != out_buf) av_frame_free(&buf); diff --git a/gst-libs/ext/libav/libavfilter/vf_gradfun.c b/gst-libs/ext/libav/libavfilter/vf_gradfun.c index 79f6790..f7c4372 100644 --- a/gst-libs/ext/libav/libavfilter/vf_gradfun.c +++ b/gst-libs/ext/libav/libavfilter/vf_gradfun.c @@ -118,6 +118,7 @@ static void filter(GradFunContext *ctx, uint8_t *dst, uint8_t *src, int width, i ctx->filter_line(dst + y * dst_linesize, src + y * src_linesize, dc - r / 2, width, thresh, dither[y & 7]); if (++y >= height) break; } + emms_c(); } static av_cold int init(AVFilterContext *ctx) diff --git a/gst-libs/ext/libav/libavfilter/vf_hqdn3d.c b/gst-libs/ext/libav/libavfilter/vf_hqdn3d.c index cd9f0d2..be6b761 100644 --- a/gst-libs/ext/libav/libavfilter/vf_hqdn3d.c +++ b/gst-libs/ext/libav/libavfilter/vf_hqdn3d.c @@ -147,6 +147,7 @@ static void denoise_depth(HQDN3DContext *s, else denoise_temporal(src, dst, frame_ant, w, h, sstride, dstride, temporal, depth); + emms_c(); } #define denoise(...) \ diff --git a/gst-libs/ext/libav/libavformat/avidec.c b/gst-libs/ext/libav/libavformat/avidec.c index 6f80d21..e851f0b 100644 --- a/gst-libs/ext/libav/libavformat/avidec.c +++ b/gst-libs/ext/libav/libavformat/avidec.c @@ -795,7 +795,11 @@ fail: if (!avi->index_loaded && pb->seekable) avi_load_index(s); avi->index_loaded = 1; - avi->non_interleaved |= guess_ni_flag(s); + + if ((ret = guess_ni_flag(s)) < 0) + return ret; + + avi->non_interleaved |= ret; for (i = 0; i < s->nb_streams; i++) { AVStream *st = s->streams[i]; if (st->nb_index_entries) @@ -1307,6 +1311,64 @@ static int avi_read_idx1(AVFormatContext *s, int size) return 0; } +/* Scan the index and consider any file with streams more than + * 2 seconds or 64MB apart non-interleaved. */ +static int check_stream_max_drift(AVFormatContext *s) +{ + int64_t min_pos, pos; + int i; + int *idx = av_mallocz_array(s->nb_streams, sizeof(*idx)); + if (!idx) + return AVERROR(ENOMEM); + + for (min_pos = pos = 0; min_pos != INT64_MAX; pos = min_pos + 1LU) { + int64_t max_dts = INT64_MIN / 2; + int64_t min_dts = INT64_MAX / 2; + int64_t max_buffer = 0; + + min_pos = INT64_MAX; + + for (i = 0; i < s->nb_streams; i++) { + AVStream *st = s->streams[i]; + AVIStream *ast = st->priv_data; + int n = st->nb_index_entries; + while (idx[i] < n && st->index_entries[idx[i]].pos < pos) + idx[i]++; + if (idx[i] < n) { + int64_t dts; + dts = av_rescale_q(st->index_entries[idx[i]].timestamp / + FFMAX(ast->sample_size, 1), + st->time_base, AV_TIME_BASE_Q); + min_dts = FFMIN(min_dts, dts); + min_pos = FFMIN(min_pos, st->index_entries[idx[i]].pos); + } + } + for (i = 0; i < s->nb_streams; i++) { + AVStream *st = s->streams[i]; + AVIStream *ast = st->priv_data; + + if (idx[i] && min_dts != INT64_MAX / 2) { + int64_t dts; + dts = av_rescale_q(st->index_entries[idx[i] - 1].timestamp / + FFMAX(ast->sample_size, 1), + st->time_base, AV_TIME_BASE_Q); + max_dts = FFMAX(max_dts, dts); + max_buffer = FFMAX(max_buffer, + av_rescale(dts - min_dts, + st->codec->bit_rate, + AV_TIME_BASE)); + } + } + if (max_dts - min_dts > 2 * AV_TIME_BASE || + max_buffer > 1024 * 1024 * 8 * 8) { + av_free(idx); + return 1; + } + } + av_free(idx); + return 0; +} + static int guess_ni_flag(AVFormatContext *s) { int i; @@ -1336,7 +1398,11 @@ static int guess_ni_flag(AVFormatContext *s) first_end = st->index_entries[n - 1].pos; } avio_seek(s->pb, oldpos, SEEK_SET); - return last_start > first_end; + + if (last_start > first_end) + return 1; + + return check_stream_max_drift(s); } static int avi_load_index(AVFormatContext *s) diff --git a/gst-libs/ext/libav/libavformat/matroska.c b/gst-libs/ext/libav/libavformat/matroska.c index 410e2f4..9628abc 100644 --- a/gst-libs/ext/libav/libavformat/matroska.c +++ b/gst-libs/ext/libav/libavformat/matroska.c @@ -32,6 +32,7 @@ const CodecTags ff_mkv_codec_tags[]={ {"A_MPEG/L2" , AV_CODEC_ID_MP2}, {"A_MPEG/L1" , AV_CODEC_ID_MP2}, {"A_MPEG/L3" , AV_CODEC_ID_MP3}, + {"A_OPUS" , AV_CODEC_ID_OPUS}, {"A_PCM/FLOAT/IEEE" , AV_CODEC_ID_PCM_F32LE}, {"A_PCM/FLOAT/IEEE" , AV_CODEC_ID_PCM_F64LE}, {"A_PCM/INT/BIG" , AV_CODEC_ID_PCM_S16BE}, diff --git a/gst-libs/ext/libav/libavformat/matroska.h b/gst-libs/ext/libav/libavformat/matroska.h index 0dbc724..667f92a 100644 --- a/gst-libs/ext/libav/libavformat/matroska.h +++ b/gst-libs/ext/libav/libavformat/matroska.h @@ -86,6 +86,7 @@ #define MATROSKA_ID_CODECINFOURL 0x3B4040 #define MATROSKA_ID_CODECDOWNLOADURL 0x26B240 #define MATROSKA_ID_CODECDECODEALL 0xAA +#define MATROSKA_ID_CODECDELAY 0x56AA #define MATROSKA_ID_TRACKNAME 0x536E #define MATROSKA_ID_TRACKLANGUAGE 0x22B59C #define MATROSKA_ID_TRACKFLAGENABLED 0xB9 diff --git a/gst-libs/ext/libav/libavformat/matroskadec.c b/gst-libs/ext/libav/libavformat/matroskadec.c index bcd7d1a..8aae26c 100644 --- a/gst-libs/ext/libav/libavformat/matroskadec.c +++ b/gst-libs/ext/libav/libavformat/matroskadec.c @@ -44,6 +44,7 @@ #include "libavutil/avstring.h" #include "libavutil/lzo.h" #include "libavutil/dict.h" +#include "libavutil/mathematics.h" #if CONFIG_ZLIB #include #endif @@ -148,6 +149,7 @@ typedef struct { MatroskaTrackVideo video; MatroskaTrackAudio audio; EbmlList encodings; + uint64_t codec_delay; AVStream *stream; int64_t end_timecode; @@ -348,6 +350,7 @@ static EbmlSyntax matroska_track[] = { { MATROSKA_ID_TRACKTYPE, EBML_UINT, 0, offsetof(MatroskaTrack,type) }, { MATROSKA_ID_CODECID, EBML_STR, 0, offsetof(MatroskaTrack,codec_id) }, { MATROSKA_ID_CODECPRIVATE, EBML_BIN, 0, offsetof(MatroskaTrack,codec_priv) }, + { MATROSKA_ID_CODECDELAY, EBML_UINT, 0, offsetof(MatroskaTrack, codec_delay) }, { MATROSKA_ID_TRACKLANGUAGE, EBML_UTF8, 0, offsetof(MatroskaTrack,language), {.s="eng"} }, { MATROSKA_ID_TRACKDEFAULTDURATION, EBML_UINT, 0, offsetof(MatroskaTrack,default_duration) }, { MATROSKA_ID_TRACKTIMECODESCALE, EBML_FLOAT,0, offsetof(MatroskaTrack,time_scale), {.f=1.0} }, @@ -1658,6 +1661,11 @@ static int matroska_read_header(AVFormatContext *s) track->time_scale = 1.0; avpriv_set_pts_info(st, 64, matroska->time_scale*track->time_scale, 1000*1000*1000); /* 64 bit pts in ns */ + /* convert the delay from ns to the track timebase */ + track->codec_delay = av_rescale_q(track->codec_delay, + (AVRational){ 1, 1000000000 }, + st->time_base); + st->codec->codec_id = codec_id; st->start_time = 0; if (strcmp(track->language, "und")) @@ -2190,7 +2198,7 @@ static int matroska_parse_block(MatroskaDemuxContext *matroska, uint8_t *data, if (cluster_time != (uint64_t)-1 && (block_time >= 0 || cluster_time >= -block_time)) { - timecode = cluster_time + block_time; + timecode = cluster_time + block_time - track->codec_delay; if (track->type == MATROSKA_TRACK_TYPE_SUBTITLE && timecode < track->end_timecode) is_keyframe = 0; /* overlapping subtitles are not key frame */ diff --git a/gst-libs/ext/libav/libavformat/mp3enc.c b/gst-libs/ext/libav/libavformat/mp3enc.c index 46889fc..9326258 100644 --- a/gst-libs/ext/libav/libavformat/mp3enc.c +++ b/gst-libs/ext/libav/libavformat/mp3enc.c @@ -119,8 +119,11 @@ static void mp3_write_xing(AVFormatContext *s) MPADecodeHeader mpah; int srate_idx, i, channels; int bitrate_idx; + int best_bitrate_idx; + int best_bitrate_error = INT_MAX; int xing_offset; int ver = 0; + int lsf, bytes_needed; if (!s->pb->seekable || !mp3->write_xing) return; @@ -150,21 +153,51 @@ static void mp3_write_xing(AVFormatContext *s) return; } - /* 64 kbps frame, should be large enough */ - bitrate_idx = (ver == 3) ? 5 : 8; - /* dummy MPEG audio header */ header = 0xff << 24; // sync header |= (0x7 << 5 | ver << 3 | 0x1 << 1 | 0x1) << 16; // sync/audio-version/layer 3/no crc*/ - header |= (bitrate_idx << 4 | srate_idx << 2) << 8; + header |= (srate_idx << 2) << 8; header |= channels << 6; + + lsf = !((header & (1 << 20) && header & (1 << 19))); + + xing_offset = xing_offtbl[ver != 3][channels == 1]; + bytes_needed = 4 // header + + xing_offset + + 4 // xing tag + + 4 // frames/size/toc flags + + 4 // frames + + 4 // size + + XING_TOC_SIZE; // toc + + for (bitrate_idx = 1; bitrate_idx < 15; bitrate_idx++) { + int bit_rate = 1000 * avpriv_mpa_bitrate_tab[lsf][3 - 1][bitrate_idx]; + int error = FFABS(bit_rate - codec->bit_rate); + + if (error < best_bitrate_error){ + best_bitrate_error = error; + best_bitrate_idx = bitrate_idx; + } + } + + for (bitrate_idx = best_bitrate_idx; bitrate_idx < 15; bitrate_idx++) { + int32_t mask = bitrate_idx << (4 + 8); + header |= mask; + + avpriv_mpegaudio_decode_header(&mpah, header); + + if (bytes_needed <= mpah.frame_size) + break; + + header &= ~mask; + } + avio_wb32(s->pb, header); avpriv_mpegaudio_decode_header(&mpah, header); av_assert0(mpah.frame_size >= XING_MAX_SIZE); - xing_offset = xing_offtbl[ver != 3][codec->channels == 1]; ffio_fill(s->pb, 0, xing_offset); mp3->xing_offset = avio_tell(s->pb); ffio_wfourcc(s->pb, "Xing"); @@ -180,8 +213,7 @@ static void mp3_write_xing(AVFormatContext *s) for (i = 0; i < XING_TOC_SIZE; i++) avio_w8(s->pb, 255 * i / XING_TOC_SIZE); - mpah.frame_size -= 4 + xing_offset + 4 + 4 + 4 + 4 + XING_TOC_SIZE; - ffio_fill(s->pb, 0, mpah.frame_size); + ffio_fill(s->pb, 0, mpah.frame_size - bytes_needed); } /* diff --git a/gst-libs/ext/libav/libavformat/rtmpproto.c b/gst-libs/ext/libav/libavformat/rtmpproto.c index 51381a4..ead5ccd 100644 --- a/gst-libs/ext/libav/libavformat/rtmpproto.c +++ b/gst-libs/ext/libav/libavformat/rtmpproto.c @@ -2483,10 +2483,10 @@ reconnect: fname = strchr(p + 1, '/'); if (!fname || (c && c < fname)) { fname = p + 1; - av_strlcpy(rt->app, path + 1, p - path); + av_strlcpy(rt->app, path + 1, FFMIN(p - path, APP_MAX_LENGTH)); } else { fname++; - av_strlcpy(rt->app, path + 1, fname - path - 1); + av_strlcpy(rt->app, path + 1, FFMIN(fname - path - 1, APP_MAX_LENGTH)); } } } @@ -2555,7 +2555,7 @@ reconnect: if ((ret = gen_connect(s, rt)) < 0) goto fail; } else { - if (read_connect(s, s->priv_data) < 0) + if ((ret = read_connect(s, s->priv_data)) < 0) goto fail; } diff --git a/gst-libs/ext/libav/libavresample/utils.c b/gst-libs/ext/libav/libavresample/utils.c index 2dd3d06..bc295d6 100644 --- a/gst-libs/ext/libav/libavresample/utils.c +++ b/gst-libs/ext/libav/libavresample/utils.c @@ -184,7 +184,7 @@ int avresample_open(AVAudioResampleContext *avr) } if (avr->resample_needed) { avr->resample_out_buffer = ff_audio_data_alloc(avr->out_channels, - 0, avr->internal_sample_fmt, + 1024, avr->internal_sample_fmt, "resample_out_buffer"); if (!avr->resample_out_buffer) { ret = AVERROR(EINVAL); diff --git a/gst-libs/ext/libav/libswscale/utils.c b/gst-libs/ext/libav/libswscale/utils.c index 2111fc2..ea5f368 100644 --- a/gst-libs/ext/libav/libswscale/utils.c +++ b/gst-libs/ext/libav/libswscale/utils.c @@ -326,7 +326,7 @@ static av_cold int initFilter(int16_t **outFilter, int32_t **filterPos, xDstInSrc = xInc - 0x10000; for (i = 0; i < dstW; i++) { - int xx = (xDstInSrc - ((filterSize - 2) << 16)) / (1 << 17); + int xx = (xDstInSrc - ((int64_t)(filterSize - 2) << 16)) / (1 << 17); int j; (*filterPos)[i] = xx; for (j = 0; j < filterSize; j++) { -- cgit v1.2.3