From db79c75633528e54ef5c853c23c52a684eb06dcf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Sun, 22 Jun 2014 19:23:12 +0200 Subject: Imported Upstream version 1.3.3 --- ChangeLog | 127 ++++++++++++++++++++- NEWS | 25 +++- configure | 38 +++--- configure.ac | 8 +- .../html/gst-libav-plugins-plugin-libav.html | 2 +- docs/plugins/html/index.html | 2 +- docs/plugins/inspect/plugin-libav.xml | 22 ++-- ext/libav/gstavaudenc.c | 5 +- ext/libav/gstavcodecmap.c | 46 +++++--- ext/libav/gstavdemux.c | 65 +++-------- ext/libav/gstavvidenc.c | 82 ++++++------- gst-libav.doap | 10 ++ gst-libav.spec | 2 +- 13 files changed, 284 insertions(+), 150 deletions(-) diff --git a/ChangeLog b/ChangeLog index 8d4cb05..af11b3d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,9 +1,132 @@ +=== release 1.3.3 === + +2014-06-22 Sebastian Dröge + + * configure.ac: + releasing 1.3.3 + +2014-06-21 18:29:32 +0200 Sebastian Dröge + + * ext/libav/gstavvidenc.c: + avvidenc: Make sure to fixate caps before setting them on the pad + After the recent addition of negotiation support for MPEG4 part 2 + profiles via caps it can happen that the generated caps at this + point still contain multiple profiles. For example if downstream + does not care. Just fixate anything here and use those caps. + +2014-06-06 16:52:28 +0200 Wim Taymans + + * ext/libav/gstavcodecmap.c: + avcodecmap: place supported profiles in mpeg4 caps + Place the supported profiles in the srcpad caps of the mpeg4 encoder. + +2014-06-06 16:25:43 +0200 Wim Taymans + + * ext/libav/gstavcodecmap.c: + avcodecmap: remove deprecated media types + Remove x-xvid and x-3ivx. The last place where they were used are + in the srcpad caps of the decoder but since the decoder will never + actually output those caps we can safely remove them. + +2014-06-06 16:19:07 +0200 Wim Taymans + + * ext/libav/gstavcodecmap.c: + codecmap: don't expose more deprecated media types + x-xvid is deprecated, we don't want to expose it on the encoder, just + leave it only exposed on the decoder. + +2014-06-06 16:16:27 +0200 Wim Taymans + + * ext/libav/gstavcodecmap.c: + Revert "avcodecmap: do more reverse mapping of MPEG4" + This reverts commit e066785ad05f9119e3c1eded46260bcabd556b4d. + x-xvid and x-3ivx are removed, we don't want to expose them again. + +2014-06-06 12:40:57 +0100 Vincent Penquerc'h + + * ext/libav/gstavaudenc.c: + avaudenc: add a comment about using -1 in _finish_frame + See https://bugzilla.gnome.org/show_bug.cgi?id=729268 + +2014-04-30 15:30:45 +0100 Vincent Penquerc'h + + * ext/libav/gstavaudenc.c: + avaudenc: avoid using wrong number of samples + If audio_in is NULL, we'll send a NULL frame to libav, to flush + the codec. In that case, we won't know how many samples the codec + will have used, so we use -1 (for don't know) when letting the + base class know about the buffer. + Coverity 1195177 + +2014-06-02 09:27:17 +0200 Sebastian Dröge + + * ext/libav/gstavvidenc.c: + avvidenc: Fix indention and "bracketing" of goto labels + Should fix CID 1219865, which looks like the code analysis + algorithm was just confused. + +2014-05-29 18:24:20 +0200 Wim Taymans + + * ext/libav/gstavcodecmap.c: + avcodecmap: handle simple and advanced-simple profile in MPEG4 + Always enable 4MV flag for MPEG4 + Pare the profile property and enable more features for advanced-simple + profile. + video/x-xvid is advanced-simple profile so enable more features. + We now also support encoding of video/x-xvid so add this to the caps. + Fixes https://bugzilla.gnome.org/show_bug.cgi?id=651320 + +2014-05-29 18:16:42 +0200 Wim Taymans + + * ext/libav/gstavvidenc.c: + avvidenc: do all negotiation before opening the decoder + We first want to complete negotiation before opening the encoder. + Negotiation might configure flags and other things that might be needed + when opening the encoder. + +2014-05-29 17:00:23 +0200 Wim Taymans + + * ext/libav/gstavcodecmap.c: + avcodecmap: do more reverse mapping of MPEG4 + We previously mapped some caps to MPEG4 and codec_tag so we can use the + codec_tag again to map to the original caps. + +2014-05-26 16:04:50 -0300 Thiago Santos + + * ext/libav/gstavdemux.c: + avdemux: use GstFlowCombiner + To remove replicated code from all demuxers to a single standard way + of aggregating flow returns + +2014-05-26 16:02:11 -0300 Thiago Santos + + * ext/libav/gstavdemux.c: + avdemux: remove legacy check from pad-alloc times + The 'no_buffer' error case is from the 0.10 era when a pad_alloc was + made before decoding the data and avdemuxer could check again the + flow returns for a not-linked. This isn't a valid use case anymore in + 1.0 + +2014-05-21 13:23:36 +0200 Sebastian Dröge + + * configure.ac: + Back to development + === release 1.3.2 === -2014-05-21 Sebastian Dröge +2014-05-21 13:06:36 +0200 Sebastian Dröge + * ChangeLog: + * NEWS: + * RELEASE: + * common: * configure.ac: - releasing 1.3.2 + * docs/plugins/gst-libav-plugins.args: + * docs/plugins/inspect-build.stamp: + * docs/plugins/inspect.stamp: + * docs/plugins/inspect/plugin-libav.xml: + * gst-libav.doap: + Release 1.3.2 2014-05-21 10:53:31 +0200 Sebastian Dröge diff --git a/NEWS b/NEWS index dc015a8..5d90b41 100644 --- a/NEWS +++ b/NEWS @@ -1,4 +1,4 @@ -This is GStreamer Libav Plugins 1.3.2 +This is GStreamer Libav Plugins 1.3.3 Changes since 1.2: @@ -30,6 +30,10 @@ New API: caps. • GstCollectPads has support for flushing and a default handler for SEEK events now. + • New GstFlowAggregator helper object that simplifies handling of + flow returns in elements with multiple source pads. Additionally + GstPad now always stores the last flow return and provides an + API to retrieve it. • GstSegment has new API to offset the running time by a specific value and this is used in GstPad to allow positive and negative offsets in gst_pad_set_offset() in all situations. @@ -43,6 +47,7 @@ New API: • Support for tiled, raw video formats has been added. • GstVideoDecoder and GstAudioDecoder have API to help aggregating tag events and merge custom tags into them consistently. + • GstBufferPool has support for flushing now. • playbin/playsink has support for application provided audio and video filters. • GstDiscoverer has new and simplified API to get details about missing @@ -54,6 +59,10 @@ New API: DispManX (Raspberry Pi), EAGL (iOS), WGL (Windows) and generic X11, Wayland and EGL platforms. This replaces eglglessink and also is supposed to replace osxvideosink. + • New GstAggregator base class in gst-plugins-bad. This is supposed to + replace GstCollectPads in the future and fix long-known shortcomings + in its API. Together with the base class some elements are provided + already, like a videomixer (compositor). Major changes: @@ -97,7 +106,8 @@ Major changes: ∘ dvbsrc supports more delivery mechanisms and other features now, including DVB S2 and T2 support. ∘ The MPEGTS library has support for many more descriptors. - ∘ Major improvements to tsdemux, especially time related. + ∘ Major improvements to tsdemux and tsparse, especially time and + seeking related. ∘ souphttpsrc now has support for keep-alive connections, compression, configurable number of retries and configuration for SSL certificate validation. @@ -110,9 +120,16 @@ Major changes: finish. ∘ videoflip can automatically flip based on the orientation tag. ∘ openjpeg supports the OpenJPEG2 API. + ∘ waylandsink was refactored and should be more useful now. It also + includes a small library which most likely is going to be removed + in the future and will result in extensions to the GstVideoOverlay + interface. ∘ gst-rtsp-server supports SRTP and MIKEY now. + ∘ gst-libav encoders are now negotiating any profile/level settings + with downstream via caps. ∘ Lots of fixes for coverity warnings all over the place. - ∘ 400+ fixed bug reports, and many other bug fixes and other + ∘ Negotiation related performance improvements. + ∘ 500+ fixed bug reports, and many other bug fixes and other improvements everywhere that had no bug report. Things to look out for: @@ -120,3 +137,5 @@ 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. + • The GstDeviceMonitor API will likely change slightly before the + 1.4.0 release. diff --git a/configure b/configure index d337b55..fb5eb42 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.2. +# Generated by GNU Autoconf 2.69 for GStreamer libav 1.3.3. # # Report bugs to . # @@ -591,8 +591,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='GStreamer libav' PACKAGE_TARNAME='gst-libav' -PACKAGE_VERSION='1.3.2' -PACKAGE_STRING='GStreamer libav 1.3.2' +PACKAGE_VERSION='1.3.3' +PACKAGE_STRING='GStreamer libav 1.3.3' 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.2 to adapt to many kinds of systems. +\`configure' configures GStreamer libav 1.3.3 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.2:";; + short | recursive ) echo "Configuration of GStreamer libav 1.3.3:";; 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.2 +GStreamer libav configure 1.3.3 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.2, which was +It was created by GStreamer libav $as_me 1.3.3, 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.2' + VERSION='1.3.3' cat >>confdefs.h <<_ACEOF @@ -3338,9 +3338,9 @@ fi - 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) + PACKAGE_VERSION_MAJOR=$(echo 1.3.3 | cut -d'.' -f1) + PACKAGE_VERSION_MINOR=$(echo 1.3.3 | cut -d'.' -f2) + PACKAGE_VERSION_MICRO=$(echo 1.3.3 | 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.2 | cut -d'.' -f4) + NANO=$(echo 1.3.3 | 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=302 + GST_CURRENT=303 GST_REVISION=0 - GST_AGE=302 - GST_LIBVERSION=302:0:302 + GST_AGE=303 + GST_LIBVERSION=303:0:303 @@ -12331,8 +12331,8 @@ CC="$lt_save_CC" -GST_REQ=1.3.2 -GST_PBREQ=1.3.2 +GST_REQ=1.3.3 +GST_PBREQ=1.3.3 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.2, which was +This file was extended by GStreamer libav $as_me 1.3.3, 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.2 +GStreamer libav config.status 1.3.3 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" diff --git a/configure.ac b/configure.ac index 7355af5..4e37db2 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.2, +AC_INIT(GStreamer libav, 1.3.3, 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, 302, 0, 302) +AS_LIBTOOL(GST, 303, 0, 303) dnl *** required versions of GStreamer stuff *** -GST_REQ=1.3.2 -GST_PBREQ=1.3.2 +GST_REQ=1.3.3 +GST_PBREQ=1.3.3 ORC_REQ=0.4.16 ORC_CHECK([$ORC_REQ]) diff --git a/docs/plugins/html/gst-libav-plugins-plugin-libav.html b/docs/plugins/html/gst-libav-plugins-plugin-libav.html index a6939b9..17c09ea 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.2 +1.3.3

run-time license

diff --git a/docs/plugins/html/index.html b/docs/plugins/html/index.html index 57c2239..c17f315 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.2) + for GStreamer libav Plugins 1.0 (1.3.3) 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 3e9dfae..e844f47 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.2 + 1.3.3 GPL gst-libav libav @@ -3191,7 +3191,7 @@ sink sink always -
video/mpeg, mpegversion=(int)4, systemstream=(boolean)false; video/x-divx, divxversion=(int)[ 4, 5 ]; video/x-xvid; video/x-3ivx
+
video/mpeg, mpegversion=(int)4, systemstream=(boolean)false; video/x-divx, divxversion=(int)[ 4, 5 ]
src @@ -7109,7 +7109,7 @@ src source always -
video/mpeg, mpegversion=(int)4, systemstream=(boolean)false; video/x-divx, divxversion=(int)5
+
video/mpeg, mpegversion=(int)4, systemstream=(boolean)false, profile=(string){ simple, advanced-simple }; video/x-divx, divxversion=(int)5
@@ -7781,7 +7781,7 @@ video_%u sink request -
video/mpeg, mpegversion=(int)4, systemstream=(boolean)false; video/x-divx, divxversion=(int)5; video/x-h263, width=(int)352, height=(int)288, framerate=(fraction)[ 0/1, 2147483647/1 ], variant=(string)itu, h263version=(string)h263; video/x-h263, width=(int)704, height=(int)576, framerate=(fraction)[ 0/1, 2147483647/1 ], variant=(string)itu, h263version=(string)h263; video/x-h263, width=(int)176, height=(int)144, framerate=(fraction)[ 0/1, 2147483647/1 ], variant=(string)itu, h263version=(string)h263; video/x-h263, width=(int)1408, height=(int)1152, framerate=(fraction)[ 0/1, 2147483647/1 ], variant=(string)itu, h263version=(string)h263; video/x-h263, width=(int)128, height=(int)96, framerate=(fraction)[ 0/1, 2147483647/1 ], variant=(string)itu, h263version=(string)h263; video/x-h263, variant=(string)itu, h263version=(string)h263p; video/x-h264, alignment=(string)au
+
video/mpeg, mpegversion=(int)4, systemstream=(boolean)false, profile=(string){ simple, advanced-simple }; video/x-divx, divxversion=(int)5; video/x-h263, width=(int)352, height=(int)288, framerate=(fraction)[ 0/1, 2147483647/1 ], variant=(string)itu, h263version=(string)h263; video/x-h263, width=(int)704, height=(int)576, framerate=(fraction)[ 0/1, 2147483647/1 ], variant=(string)itu, h263version=(string)h263; video/x-h263, width=(int)176, height=(int)144, framerate=(fraction)[ 0/1, 2147483647/1 ], variant=(string)itu, h263version=(string)h263; video/x-h263, width=(int)1408, height=(int)1152, framerate=(fraction)[ 0/1, 2147483647/1 ], variant=(string)itu, h263version=(string)h263; video/x-h263, width=(int)128, height=(int)96, framerate=(fraction)[ 0/1, 2147483647/1 ], variant=(string)itu, h263version=(string)h263; video/x-h263, variant=(string)itu, h263version=(string)h263p; video/x-h264, alignment=(string)au
src @@ -7808,7 +7808,7 @@ video_%u sink request -
video/mpeg, mpegversion=(int)4, systemstream=(boolean)false; video/x-divx, divxversion=(int)5; video/x-h263, width=(int)352, height=(int)288, framerate=(fraction)[ 0/1, 2147483647/1 ], variant=(string)itu, h263version=(string)h263; video/x-h263, width=(int)704, height=(int)576, framerate=(fraction)[ 0/1, 2147483647/1 ], variant=(string)itu, h263version=(string)h263; video/x-h263, width=(int)176, height=(int)144, framerate=(fraction)[ 0/1, 2147483647/1 ], variant=(string)itu, h263version=(string)h263; video/x-h263, width=(int)1408, height=(int)1152, framerate=(fraction)[ 0/1, 2147483647/1 ], variant=(string)itu, h263version=(string)h263; video/x-h263, width=(int)128, height=(int)96, framerate=(fraction)[ 0/1, 2147483647/1 ], variant=(string)itu, h263version=(string)h263; video/x-h263, variant=(string)itu, h263version=(string)h263p; video/x-h264, alignment=(string)au
+
video/mpeg, mpegversion=(int)4, systemstream=(boolean)false, profile=(string){ simple, advanced-simple }; video/x-divx, divxversion=(int)5; video/x-h263, width=(int)352, height=(int)288, framerate=(fraction)[ 0/1, 2147483647/1 ], variant=(string)itu, h263version=(string)h263; video/x-h263, width=(int)704, height=(int)576, framerate=(fraction)[ 0/1, 2147483647/1 ], variant=(string)itu, h263version=(string)h263; video/x-h263, width=(int)176, height=(int)144, framerate=(fraction)[ 0/1, 2147483647/1 ], variant=(string)itu, h263version=(string)h263; video/x-h263, width=(int)1408, height=(int)1152, framerate=(fraction)[ 0/1, 2147483647/1 ], variant=(string)itu, h263version=(string)h263; video/x-h263, width=(int)128, height=(int)96, framerate=(fraction)[ 0/1, 2147483647/1 ], variant=(string)itu, h263version=(string)h263; video/x-h263, variant=(string)itu, h263version=(string)h263p; video/x-h264, alignment=(string)au
src @@ -8009,7 +8009,7 @@ video_%u sink request -
video/mpeg, mpegversion=(int)4, systemstream=(boolean)false; video/x-divx, divxversion=(int)5
+
video/mpeg, mpegversion=(int)4, systemstream=(boolean)false, profile=(string){ simple, advanced-simple }; video/x-divx, divxversion=(int)5
src @@ -8426,7 +8426,7 @@ video_%u sink request -
video/mpeg, mpegversion=(int)4, systemstream=(boolean)false; video/x-divx, divxversion=(int)5
+
video/mpeg, mpegversion=(int)4, systemstream=(boolean)false, profile=(string){ simple, advanced-simple }; video/x-divx, divxversion=(int)5
src @@ -8501,7 +8501,7 @@ video_%u sink request -
video/x-svq, svqversion=(int)1; video/x-svq, svqversion=(int)3; video/mpeg, mpegversion=(int)4, systemstream=(boolean)false; video/x-divx, divxversion=(int)5; video/x-h263, width=(int)352, height=(int)288, framerate=(fraction)[ 0/1, 2147483647/1 ], variant=(string)itu, h263version=(string)h263; video/x-h263, width=(int)704, height=(int)576, framerate=(fraction)[ 0/1, 2147483647/1 ], variant=(string)itu, h263version=(string)h263; video/x-h263, width=(int)176, height=(int)144, framerate=(fraction)[ 0/1, 2147483647/1 ], variant=(string)itu, h263version=(string)h263; video/x-h263, width=(int)1408, height=(int)1152, framerate=(fraction)[ 0/1, 2147483647/1 ], variant=(string)itu, h263version=(string)h263; video/x-h263, width=(int)128, height=(int)96, framerate=(fraction)[ 0/1, 2147483647/1 ], variant=(string)itu, h263version=(string)h263; video/x-h263, variant=(string)itu, h263version=(string)h263p; video/x-h264, alignment=(string)au; video/x-dv, width=(int)720, height=(int)480, framerate=(fraction)30000/1001, pixel-aspect-ratio=(fraction)8/9, systemstream=(boolean)false; video/x-dv, width=(int)720, height=(int)480, framerate=(fraction)30000/1001, pixel-aspect-ratio=(fraction)32/27, systemstream=(boolean)false; video/x-dv, width=(int)720, height=(int)480, framerate=(fraction)30000/1001, pixel-aspect-ratio=(fraction)8/9, systemstream=(boolean)false; video/x-dv, width=(int)720, height=(int)480, framerate=(fraction)30000/1001, pixel-aspect-ratio=(fraction)32/27, systemstream=(boolean)false; video/x-dv, width=(int)720, height=(int)576, framerate=(fraction)25/1, pixel-aspect-ratio=(fraction)16/15, systemstream=(boolean)false; video/x-dv, width=(int)720, height=(int)576, framerate=(fraction)25/1, pixel-aspect-ratio=(fraction)64/45, systemstream=(boolean)false; video/x-dv, width=(int)720, height=(int)576, framerate=(fraction)25/1, pixel-aspect-ratio=(fraction)16/15, systemstream=(boolean)false; video/x-dv, width=(int)720, height=(int)576, framerate=(fraction)25/1, pixel-aspect-ratio=(fraction)64/45, systemstream=(boolean)false; video/x-dv, width=(int)720, height=(int)576, framerate=(fraction)25/1, pixel-aspect-ratio=(fraction)16/15, systemstream=(boolean)false; video/x-dv, width=(int)720, height=(int)576, framerate=(fraction)25/1, pixel-aspect-ratio=(fraction)64/45, systemstream=(boolean)false; video/x-dv, width=(int)1280, height=(int)1080, framerate=(fraction)30000/1001, pixel-aspect-ratio=(fraction)1/1, systemstream=(boolean)false; video/x-dv, width=(int)1280, height=(int)1080, framerate=(fraction)30000/1001, pixel-aspect-ratio=(fraction)3/2, systemstream=(boolean)false; video/x-dv, width=(int)1440, height=(int)1080, framerate=(fraction)25/1, pixel-aspect-ratio=(fraction)1/1, systemstream=(boolean)false; video/x-dv, width=(int)1440, height=(int)1080, framerate=(fraction)25/1, pixel-aspect-ratio=(fraction)4/3, systemstream=(boolean)false; video/x-dv, width=(int)960, height=(int)720, framerate=(fraction)60000/1001, pixel-aspect-ratio=(fraction)1/1, systemstream=(boolean)false; video/x-dv, width=(int)960, height=(int)720, framerate=(fraction)60000/1001, pixel-aspect-ratio=(fraction)4/3, systemstream=(boolean)false; video/x-dv, width=(int)960, height=(int)720, framerate=(fraction)50/1, pixel-aspect-ratio=(fraction)1/1, systemstream=(boolean)false; video/x-dv, width=(int)960, height=(int)720, framerate=(fraction)50/1, pixel-aspect-ratio=(fraction)4/3, systemstream=(boolean)false; image/jpeg, parsed=(boolean)true
+
video/x-svq, svqversion=(int)1; video/x-svq, svqversion=(int)3; video/mpeg, mpegversion=(int)4, systemstream=(boolean)false, profile=(string){ simple, advanced-simple }; video/x-divx, divxversion=(int)5; video/x-h263, width=(int)352, height=(int)288, framerate=(fraction)[ 0/1, 2147483647/1 ], variant=(string)itu, h263version=(string)h263; video/x-h263, width=(int)704, height=(int)576, framerate=(fraction)[ 0/1, 2147483647/1 ], variant=(string)itu, h263version=(string)h263; video/x-h263, width=(int)176, height=(int)144, framerate=(fraction)[ 0/1, 2147483647/1 ], variant=(string)itu, h263version=(string)h263; video/x-h263, width=(int)1408, height=(int)1152, framerate=(fraction)[ 0/1, 2147483647/1 ], variant=(string)itu, h263version=(string)h263; video/x-h263, width=(int)128, height=(int)96, framerate=(fraction)[ 0/1, 2147483647/1 ], variant=(string)itu, h263version=(string)h263; video/x-h263, variant=(string)itu, h263version=(string)h263p; video/x-h264, alignment=(string)au; video/x-dv, width=(int)720, height=(int)480, framerate=(fraction)30000/1001, pixel-aspect-ratio=(fraction)8/9, systemstream=(boolean)false; video/x-dv, width=(int)720, height=(int)480, framerate=(fraction)30000/1001, pixel-aspect-ratio=(fraction)32/27, systemstream=(boolean)false; video/x-dv, width=(int)720, height=(int)480, framerate=(fraction)30000/1001, pixel-aspect-ratio=(fraction)8/9, systemstream=(boolean)false; video/x-dv, width=(int)720, height=(int)480, framerate=(fraction)30000/1001, pixel-aspect-ratio=(fraction)32/27, systemstream=(boolean)false; video/x-dv, width=(int)720, height=(int)576, framerate=(fraction)25/1, pixel-aspect-ratio=(fraction)16/15, systemstream=(boolean)false; video/x-dv, width=(int)720, height=(int)576, framerate=(fraction)25/1, pixel-aspect-ratio=(fraction)64/45, systemstream=(boolean)false; video/x-dv, width=(int)720, height=(int)576, framerate=(fraction)25/1, pixel-aspect-ratio=(fraction)16/15, systemstream=(boolean)false; video/x-dv, width=(int)720, height=(int)576, framerate=(fraction)25/1, pixel-aspect-ratio=(fraction)64/45, systemstream=(boolean)false; video/x-dv, width=(int)720, height=(int)576, framerate=(fraction)25/1, pixel-aspect-ratio=(fraction)16/15, systemstream=(boolean)false; video/x-dv, width=(int)720, height=(int)576, framerate=(fraction)25/1, pixel-aspect-ratio=(fraction)64/45, systemstream=(boolean)false; video/x-dv, width=(int)1280, height=(int)1080, framerate=(fraction)30000/1001, pixel-aspect-ratio=(fraction)1/1, systemstream=(boolean)false; video/x-dv, width=(int)1280, height=(int)1080, framerate=(fraction)30000/1001, pixel-aspect-ratio=(fraction)3/2, systemstream=(boolean)false; video/x-dv, width=(int)1440, height=(int)1080, framerate=(fraction)25/1, pixel-aspect-ratio=(fraction)1/1, systemstream=(boolean)false; video/x-dv, width=(int)1440, height=(int)1080, framerate=(fraction)25/1, pixel-aspect-ratio=(fraction)4/3, systemstream=(boolean)false; video/x-dv, width=(int)960, height=(int)720, framerate=(fraction)60000/1001, pixel-aspect-ratio=(fraction)1/1, systemstream=(boolean)false; video/x-dv, width=(int)960, height=(int)720, framerate=(fraction)60000/1001, pixel-aspect-ratio=(fraction)4/3, systemstream=(boolean)false; video/x-dv, width=(int)960, height=(int)720, framerate=(fraction)50/1, pixel-aspect-ratio=(fraction)1/1, systemstream=(boolean)false; video/x-dv, width=(int)960, height=(int)720, framerate=(fraction)50/1, pixel-aspect-ratio=(fraction)4/3, systemstream=(boolean)false; image/jpeg, parsed=(boolean)true
src @@ -8576,7 +8576,7 @@ video_%u sink request -
video/mpeg, mpegversion=(int)4, systemstream=(boolean)false; video/x-divx, divxversion=(int)5; video/x-h264, alignment=(string)au; image/jpeg, parsed=(boolean)true
+
video/mpeg, mpegversion=(int)4, systemstream=(boolean)false, profile=(string){ simple, advanced-simple }; video/x-divx, divxversion=(int)5; video/x-h264, alignment=(string)au; image/jpeg, parsed=(boolean)true
src @@ -8732,7 +8732,7 @@ video_%u sink request -
video/mpeg, mpegversion=(int)4, systemstream=(boolean)false; video/x-divx, divxversion=(int)5
+
video/mpeg, mpegversion=(int)4, systemstream=(boolean)false, profile=(string){ simple, advanced-simple }; video/x-divx, divxversion=(int)5
src @@ -8801,7 +8801,7 @@ video_%u sink request -
video/mpeg, mpegversion=(int)4, systemstream=(boolean)false; video/x-divx, divxversion=(int)5
+
video/mpeg, mpegversion=(int)4, systemstream=(boolean)false, profile=(string){ simple, advanced-simple }; video/x-divx, divxversion=(int)5
src diff --git a/ext/libav/gstavaudenc.c b/ext/libav/gstavaudenc.c index fcb176d..0408104 100644 --- a/ext/libav/gstavaudenc.c +++ b/ext/libav/gstavaudenc.c @@ -553,7 +553,10 @@ gst_ffmpegaudenc_encode_audio (GstFFMpegAudEnc * ffmpegaudenc, pkt, gst_ffmpegaudenc_free_avpacket); codec = ffmpegaudenc->context->codec; - if ((codec->capabilities & CODEC_CAP_VARIABLE_FRAME_SIZE)) { + if ((codec->capabilities & CODEC_CAP_VARIABLE_FRAME_SIZE) || !audio_in) { + /* FIXME: Not really correct, as -1 means "all the samples we got + given so far", which may not be true depending on the codec, + but we have no way to know AFAICT */ ret = gst_audio_encoder_finish_frame (enc, outbuf, -1); } else { ret = gst_audio_encoder_finish_frame (enc, outbuf, frame.nb_samples); diff --git a/ext/libav/gstavcodecmap.c b/ext/libav/gstavcodecmap.c index 11fb40a..0c53d10 100644 --- a/ext/libav/gstavcodecmap.c +++ b/ext/libav/gstavcodecmap.c @@ -978,7 +978,7 @@ gst_ffmpeg_codecid_to_caps (enum AVCodecID codec_id, break; case GST_MAKE_FOURCC ('m', 'p', '4', 'v'): default: - /* FIXME: bitrate */ + /* FIXME: bitrate. libav doesn't expose the used profile and level */ caps = gst_ff_vid_caps_new (context, NULL, codec_id, encode, "video/mpeg", "systemstream", G_TYPE_BOOLEAN, FALSE, @@ -991,17 +991,28 @@ gst_ffmpeg_codecid_to_caps (enum AVCodecID codec_id, gst_ff_vid_caps_new (context, NULL, codec_id, encode, "video/mpeg", "mpegversion", G_TYPE_INT, 4, "systemstream", G_TYPE_BOOLEAN, FALSE, NULL); + if (encode) { + GValue arr = { 0, }; + GValue item = { 0, }; + + g_value_init (&arr, GST_TYPE_LIST); + g_value_init (&item, G_TYPE_STRING); + g_value_set_string (&item, "simple"); + gst_value_list_append_value (&arr, &item); + g_value_set_string (&item, "advanced-simple"); + gst_value_list_append_value (&arr, &item); + g_value_unset (&item); + + gst_caps_set_value (caps, "profile", &arr); + g_value_unset (&arr); + gst_caps_append (caps, gst_ff_vid_caps_new (context, NULL, codec_id, encode, "video/x-divx", "divxversion", G_TYPE_INT, 5, NULL)); } else { gst_caps_append (caps, gst_ff_vid_caps_new (context, NULL, codec_id, encode, "video/x-divx", "divxversion", GST_TYPE_INT_RANGE, 4, 5, NULL)); - gst_caps_append (caps, gst_ff_vid_caps_new (context, NULL, codec_id, - encode, "video/x-xvid", NULL)); - gst_caps_append (caps, gst_ff_vid_caps_new (context, NULL, codec_id, - encode, "video/x-3ivx", NULL)); } } break; @@ -2934,16 +2945,23 @@ gst_ffmpeg_caps_with_codecid (enum AVCodecID codec_id, { const gchar *mime = gst_structure_get_name (str); + context->flags |= CODEC_FLAG_4MV; + if (!strcmp (mime, "video/x-divx")) context->codec_tag = GST_MAKE_FOURCC ('D', 'I', 'V', 'X'); - else if (!strcmp (mime, "video/x-xvid")) - context->codec_tag = GST_MAKE_FOURCC ('X', 'V', 'I', 'D'); - else if (!strcmp (mime, "video/x-3ivx")) - context->codec_tag = GST_MAKE_FOURCC ('3', 'I', 'V', '1'); - else if (!strcmp (mime, "video/mpeg")) + else if (!strcmp (mime, "video/mpeg")) { + const gchar *profile; + context->codec_tag = GST_MAKE_FOURCC ('m', 'p', '4', 'v'); - } + + profile = gst_structure_get_string (str, "profile"); + if (profile) { + if (g_strcmp0 (profile, "advanced-simple") == 0) + context->flags |= CODEC_FLAG_GMC | CODEC_FLAG_QPEL; + } + } break; + } case AV_CODEC_ID_SVQ3: /* FIXME: this is a workaround for older gst-plugins releases @@ -3734,12 +3752,6 @@ gst_ffmpeg_caps_to_codecid (const GstCaps * caps, AVCodecContext * context) } if (id != AV_CODEC_ID_NONE) video = TRUE; - } else if (!strcmp (mimetype, "video/x-3ivx")) { - id = AV_CODEC_ID_MPEG4; - video = TRUE; - } else if (!strcmp (mimetype, "video/x-xvid")) { - id = AV_CODEC_ID_MPEG4; - video = TRUE; } else if (!strcmp (mimetype, "video/x-ffv")) { gint ffvversion = 0; diff --git a/ext/libav/gstavdemux.c b/ext/libav/gstavdemux.c index c645069..917838c 100644 --- a/ext/libav/gstavdemux.c +++ b/ext/libav/gstavdemux.c @@ -28,6 +28,7 @@ #include /* #include */ #include +#include #include "gstav.h" #include "gstavcodecmap.h" @@ -49,7 +50,6 @@ struct _GstFFStream GstClockTime last_ts; gboolean discont; gboolean eos; - GstFlowReturn last_flow; GstTagList *tags; /* stream tags */ }; @@ -69,6 +69,8 @@ struct _GstFFMpegDemux GstFFStream *streams[MAX_STREAMS]; + GstFlowCombiner *flowcombiner; + gint videopads, audiopads; GstClockTime start_time; @@ -282,6 +284,8 @@ gst_ffmpegdemux_init (GstFFMpegDemux * demux) demux->seek_event = NULL; gst_segment_init (&demux->segment, GST_FORMAT_TIME); + demux->flowcombiner = gst_flow_combiner_new (); + /* push based data */ g_mutex_init (&demux->ffpipe.tlock); g_cond_init (&demux->ffpipe.cond); @@ -301,6 +305,8 @@ gst_ffmpegdemux_finalize (GObject * object) demux = (GstFFMpegDemux *) object; + gst_flow_combiner_free (demux->flowcombiner); + g_mutex_clear (&demux->ffpipe.tlock); g_cond_clear (&demux->ffpipe.cond); gst_object_unref (demux->ffpipe.adapter); @@ -326,8 +332,10 @@ gst_ffmpegdemux_close (GstFFMpegDemux * demux) stream = demux->streams[n]; if (stream) { - if (stream->pad) + if (stream->pad) { + gst_flow_combiner_remove_pad (demux->flowcombiner, stream->pad); gst_element_remove_pad (GST_ELEMENT (demux), stream->pad); + } if (stream->tags) gst_tag_list_unref (stream->tags); g_free (stream); @@ -602,15 +610,9 @@ gst_ffmpegdemux_perform_seek (GstFFMpegDemux * demux, GstEvent * event) /* and prepare to continue streaming */ if (flush) { - gint n; - /* send flush stop, peer will accept data and events again. We * are not yet providing data as we still have the STREAM_LOCK. */ gst_ffmpegdemux_push_event (demux, gst_event_new_flush_stop (TRUE)); - for (n = 0; n < MAX_STREAMS; ++n) { - if (demux->streams[n]) - demux->streams[n]->last_flow = GST_FLOW_OK; - } } /* if successfull seek, we update our real segment and push * out the new segment. */ @@ -890,34 +892,6 @@ gst_ffmpegdemux_src_convert (GstPad * pad, } #endif -static GstFlowReturn -gst_ffmpegdemux_aggregated_flow (GstFFMpegDemux * demux) -{ - gint n; - GstFlowReturn res = GST_FLOW_OK; - gboolean have_ok = FALSE; - - for (n = 0; n < MAX_STREAMS; n++) { - GstFFStream *s = demux->streams[n]; - - if (s) { - res = MIN (res, s->last_flow); - - if (s->last_flow == GST_FLOW_OK) - have_ok = TRUE; - } - } - - /* NOT_LINKED is OK, if at least one pad is linked */ - if (res == GST_FLOW_NOT_LINKED && have_ok) - res = GST_FLOW_OK; - - GST_DEBUG_OBJECT (demux, "Returning aggregated value of %s", - gst_flow_get_name (res)); - - return res; -} - static gchar * gst_ffmpegdemux_create_padname (const gchar * templ, gint n) { @@ -964,7 +938,6 @@ gst_ffmpegdemux_get_stream (GstFFMpegDemux * demux, AVStream * avstream) stream->discont = TRUE; stream->avstream = avstream; stream->last_ts = GST_CLOCK_TIME_NONE; - stream->last_flow = GST_FLOW_OK; stream->tags = NULL; switch (ctx->codec_type) { @@ -1050,6 +1023,7 @@ gst_ffmpegdemux_get_stream (GstFFMpegDemux * demux, AVStream * avstream) /* activate and add */ gst_element_add_pad (GST_ELEMENT (demux), pad); + gst_flow_combiner_add_pad (demux->flowcombiner, pad); /* metadata */ if ((codec = gst_ffmpeg_get_codecid_longname (ctx->codec_id))) { @@ -1359,6 +1333,7 @@ gst_ffmpegdemux_loop (GstFFMpegDemux * demux) GstClockTime timestamp, duration; gint outsize; gboolean rawvideo; + GstFlowReturn stream_last_flow; /* open file if we didn't so already */ if (!demux->opened) @@ -1430,9 +1405,6 @@ gst_ffmpegdemux_loop (GstFFMpegDemux * demux) outbuf = gst_buffer_new_and_alloc (outsize); - if ((ret = gst_ffmpegdemux_aggregated_flow (demux)) != GST_FLOW_OK) - goto no_buffer; - /* copy the data from packet into the target buffer * and do conversions for raw video packets */ if (rawvideo) { @@ -1484,13 +1456,13 @@ gst_ffmpegdemux_loop (GstFFMpegDemux * demux) "Sending out buffer time:%" GST_TIME_FORMAT " size:%" G_GSIZE_FORMAT, GST_TIME_ARGS (timestamp), gst_buffer_get_size (outbuf)); - ret = stream->last_flow = gst_pad_push (srcpad, outbuf); + ret = stream_last_flow = gst_pad_push (srcpad, outbuf); /* if a pad is in e.g. WRONG_STATE, we want to pause to unlock the STREAM_LOCK */ - if ((ret != GST_FLOW_OK) - && ((ret = gst_ffmpegdemux_aggregated_flow (demux)) != GST_FLOW_OK)) { + if (((ret = gst_flow_combiner_update_flow (demux->flowcombiner, + ret)) != GST_FLOW_OK)) { GST_WARNING_OBJECT (demux, "stream_movi flow: %s / %s", - gst_flow_get_name (stream->last_flow), gst_flow_get_name (ret)); + gst_flow_get_name (stream_last_flow), gst_flow_get_name (ret)); goto pause; } @@ -1582,11 +1554,6 @@ drop: goto done; } } -no_buffer: - { - av_free_packet (&pkt); - goto pause; - } } diff --git a/ext/libav/gstavvidenc.c b/ext/libav/gstavvidenc.c index 97680db..95b0a0a 100644 --- a/ext/libav/gstavvidenc.c +++ b/ext/libav/gstavvidenc.c @@ -433,24 +433,6 @@ gst_ffmpegvidenc_set_format (GstVideoEncoder * encoder, : ffmpegenc->max_key_interval; } - /* open codec */ - if (gst_ffmpeg_avcodec_open (ffmpegenc->context, oclass->in_plugin) < 0) - goto open_codec_fail; - - /* second pass stats buffer no longer needed */ - if (ffmpegenc->context->stats_in) - g_free (ffmpegenc->context->stats_in); - - /* is the colourspace correct? */ - if (pix_fmt != ffmpegenc->context->pix_fmt) - goto pix_fmt_err; - - /* we may have failed mapping caps to a pixfmt, - * and quite some codecs do not make up their own mind about that - * in any case, _NONE can never work out later on */ - if (pix_fmt == PIX_FMT_NONE) - goto bad_input_fmt; - /* some codecs support more than one format, first auto-choose one */ GST_DEBUG_OBJECT (ffmpegenc, "picking an output format ..."); allowed_caps = gst_pad_get_allowed_caps (GST_VIDEO_ENCODER_SRC_PAD (encoder)); @@ -479,9 +461,29 @@ gst_ffmpegvidenc_set_format (GstVideoEncoder * encoder, gst_caps_unref (other_caps); if (gst_caps_is_empty (icaps)) { gst_caps_unref (icaps); - return FALSE; + goto unsupported_codec; } - icaps = gst_caps_truncate (icaps); + icaps = gst_caps_fixate (icaps); + + GST_DEBUG_OBJECT (ffmpegenc, "codec flags 0x%08x", ffmpegenc->context->flags); + + /* open codec */ + if (gst_ffmpeg_avcodec_open (ffmpegenc->context, oclass->in_plugin) < 0) + goto open_codec_fail; + + /* is the colourspace correct? */ + if (pix_fmt != ffmpegenc->context->pix_fmt) + goto pix_fmt_err; + + /* we may have failed mapping caps to a pixfmt, + * and quite some codecs do not make up their own mind about that + * in any case, _NONE can never work out later on */ + if (pix_fmt == PIX_FMT_NONE) + goto bad_input_fmt; + + /* second pass stats buffer no longer needed */ + if (ffmpegenc->context->stats_in) + g_free (ffmpegenc->context->stats_in); /* Store input state and set output state */ if (ffmpegenc->input_state) @@ -512,52 +514,50 @@ file_read_err: return FALSE; } +insane_timebase: + { + GST_ERROR_OBJECT (ffmpegenc, "Rejecting time base %d/%d", + ffmpegenc->context->time_base.den, ffmpegenc->context->time_base.num); + goto cleanup_stats_in; + } +unsupported_codec: + { + GST_DEBUG ("Unsupported codec - no caps found"); + goto cleanup_stats_in; + } open_codec_fail: { - gst_ffmpeg_avcodec_close (ffmpegenc->context); - if (avcodec_get_context_defaults3 (ffmpegenc->context, - oclass->in_plugin) < 0) - GST_DEBUG_OBJECT (ffmpegenc, "Failed to set context defaults"); - if (ffmpegenc->context->stats_in) - g_free (ffmpegenc->context->stats_in); GST_DEBUG_OBJECT (ffmpegenc, "avenc_%s: Failed to open libav codec", oclass->in_plugin->name); - return FALSE; + goto close_codec; } pix_fmt_err: { - gst_ffmpeg_avcodec_close (ffmpegenc->context); - if (avcodec_get_context_defaults3 (ffmpegenc->context, - oclass->in_plugin) < 0) - GST_DEBUG_OBJECT (ffmpegenc, "Failed to set context defaults"); GST_DEBUG_OBJECT (ffmpegenc, "avenc_%s: AV wants different colourspace (%d given, %d wanted)", oclass->in_plugin->name, pix_fmt, ffmpegenc->context->pix_fmt); - return FALSE; + goto close_codec; } bad_input_fmt: { GST_DEBUG_OBJECT (ffmpegenc, "avenc_%s: Failed to determine input format", oclass->in_plugin->name); - return FALSE; + goto close_codec; } - -unsupported_codec: +close_codec: { gst_ffmpeg_avcodec_close (ffmpegenc->context); if (avcodec_get_context_defaults3 (ffmpegenc->context, oclass->in_plugin) < 0) GST_DEBUG_OBJECT (ffmpegenc, "Failed to set context defaults"); - GST_DEBUG ("Unsupported codec - no caps found"); - return FALSE; + goto cleanup_stats_in; } - -insane_timebase: +cleanup_stats_in: { - GST_ERROR_OBJECT (ffmpegenc, "Rejecting time base %d/%d", - ffmpegenc->context->time_base.den, ffmpegenc->context->time_base.num); + if (ffmpegenc->context->stats_in) + g_free (ffmpegenc->context->stats_in); return FALSE; } } diff --git a/gst-libav.doap b/gst-libav.doap index 073f402..b4c24b7 100644 --- a/gst-libav.doap +++ b/gst-libav.doap @@ -32,6 +32,16 @@ colorspace conversion elements. + + + 1.3.3 + 1.3 + + 2014-06-22 + + + + 1.3.2 diff --git a/gst-libav.spec b/gst-libav.spec index 05c4a00..35a5503 100644 --- a/gst-libav.spec +++ b/gst-libav.spec @@ -4,7 +4,7 @@ %define gst_majorminor 1.0 Name: %{gstreamer}-libav -Version: 1.3.2 +Version: 1.3.3 Release: 1 Summary: GStreamer Streaming-media framework plug-in using libav (FFmpeg). Group: Libraries/Multimedia -- cgit v1.2.3