diff options
author | Sebastian Dröge <sebastian@centricular.com> | 2014-02-09 11:06:52 +0100 |
---|---|---|
committer | Sebastian Dröge <sebastian@centricular.com> | 2014-02-09 11:06:52 +0100 |
commit | 54ba965e6376891d6d7e580732f2ab2de3d4a9cc (patch) | |
tree | 5f5c2d3ca58c0833fdae43f4e686f5bddd87d5e3 | |
parent | c05f749f91dae26d011bfd0e78ac7b99c2faf663 (diff) |
Imported Upstream version 1.2.3upstream/1.2.3
172 files changed, 3694 insertions, 476 deletions
@@ -1,9 +1,302 @@ +=== release 1.2.3 === + +2014-02-08 Sebastian Dröge <slomo@coaxion.net> + + * configure.ac: + releasing 1.2.3 + +2014-01-24 19:19:08 +0100 Arnaud Vrac <avrac@freebox.fr> + + * plugins/elements/gstmultiqueue.c: + multiqueue: do not reduce single queue below current level + When the single queue size was just bumped by 1 to allow more buffers to + be added, the buffers limit could be reduced to the current level when + setting the max-size-buffers property. This would result in a stall + since the queue would not grow anymore at this point. + Prevent this by not reducing a single queue size below the current + number of buffers + 1. + https://bugzilla.gnome.org/show_bug.cgi?id=712597 + +2014-02-04 16:20:08 +0100 Sebastian Dröge <sebastian@centricular.com> + + * po/id.po: + * po/nl.po: + * po/pt_BR.po: + * po/sk.po: + * po/sr.po: + po: Update translations + +2014-01-17 22:53:01 -0300 Thiago Santos <ts.santos@sisa.samsung.com> + + * gst/gstpad.c: + pad: fix sticky event leak after sticky_events_foreach + events_foreach adds an extra ref when giving the event to the + user function. In case it was unrefed by the user, this extra ref + disappeared, but events_foreach still should unref again to + lose its own ref before removing the event from the array. + https://bugzilla.gnome.org/show_bug.cgi?id=722467 + +2014-01-15 00:12:26 -0300 Thiago Santos <ts.santos@sisa.samsung.com> + + * plugins/elements/gstmultiqueue.c: + multiqueue: prevent buffering forever with playbin + When prerolling/buffering, multiqueue has its buffers limit set + to 0, this means it can take an infinite amount of buffers. + When prerolling/buffering finishes, its limit is set back to 5, but + only if the current level is lower than 5. It should (almost) never be + and this will cause prerolling/buffering to need to wait to reach the + hard bytes and time limits, which are much higher. + This can lead to a very long startup time. This patch fixes this + by setting the single queues to the max(current, new_value) instead + of simply ignoring the new value and letting it as infinite(0) + https://bugzilla.gnome.org/show_bug.cgi?id=712597 + +2014-01-15 11:12:08 +0100 Sebastian Dröge <sebastian@centricular.com> + + * gst/gstsegment.c: + segment: gst_segment_offset_running_time() will be available in 1.2.3 + +2014-01-08 15:47:10 +0100 Wim Taymans <wtaymans@redhat.com> + + * tests/check/gst/gstsegment.c: + tests: improve check, also check stream-time + +2014-01-08 15:31:28 +0100 Wim Taymans <wtaymans@redhat.com> + + * tests/check/gst/gstsegment.c: + tests: add unit test for segment _offset_running_time() + Add a unit test to check that positive and negative offsets are applied + correctly in various cases. + +2014-01-08 14:57:04 +0100 Wim Taymans <wtaymans@redhat.com> + + * gst/gstpad.c: + pad: use new segment offset method to apply the offset + Fixes https://bugzilla.gnome.org/show_bug.cgi?id=721422 + +2014-01-08 14:54:47 +0100 Wim Taymans <wtaymans@redhat.com> + + * gst/gstsegment.c: + * gst/gstsegment.h: + * win32/common/libgstreamer.def: + segment: add method to offset the segment running-time + Add a method that can apply an offset to the calculated running-time of + a segment. + +2014-01-08 16:28:54 -0300 Thiago Santos <ts.santos@sisa.samsung.com> + + * libs/gst/base/gstbaseparse.c: + baseparse: do not ignore TIME segments + TIME segments are being ignored and a standard initialized + segment is used instead. This causes issues as not properly detecting + reverse playback or not cliping output based on the segment. + This seems to be a regression from one of the GstSegment/GstEvent + redesigns on the 0.10 -> 1.0 transition + +2014-01-08 15:23:00 +0100 Wim Taymans <wtaymans@redhat.com> + + * gst/gstsegment.c: + segment: take offset into account in _to_position() + Take the offset into account when converting between running-time and + segment positions. + +2014-01-08 14:52:04 +0100 Wim Taymans <wtaymans@redhat.com> + + * libs/gst/base/gstcollectpads.c: + collectpads: take offset into account for expected segment position + The firt valid segment position is start + offset. + Also add some more debug and a FIXME + +2014-01-13 08:37:37 -0300 Thiago Santos <ts.santos@sisa.samsung.com> + + * tests/check/libs/baseparse.c: + tests: baseparse: add test for reverse playback on passthrough + Baseparse stores buffers for reverse playback to push on the next + DISCONT, the issue was that it wouldn't ever check for a discont + on passthrough mode as it skips all real parsing. This test + was create to verify this issue and prevent it from happening again + https://bugzilla.gnome.org/show_bug.cgi?id=721941 + +2014-01-11 10:49:17 -0300 Thiago Santos <ts.santos@sisa.samsung.com> + + * tests/check/Makefile.am: + * tests/check/libs/.gitignore: + * tests/check/libs/baseparse.c: + tests: baseparse: add basic test for baseparse + Just a small test to check that basic playback works + +2014-01-10 09:10:06 -0300 Thiago Santos <ts.santos@sisa.samsung.com> + + * libs/gst/base/gstbaseparse.c: + baseparse: do not accumulate buffers on passthrough mode + If on passthrough during reverse playback, do not accumulate buffers as + baseparse will never check for DISCONT flag to push those buffers. + So just push buffers downstream as if it was forward playback. + https://bugzilla.gnome.org/show_bug.cgi?id=721941 + +2014-01-02 16:22:37 -0300 Thiago Santos <ts.santos@sisa.samsung.com> + + * libs/gst/base/gstbaseparse.c: + baseparse: remove pending_segment as it was being misused + It wasn't required, instead baseparse was using it to check the media + caps to identify if it was handling audio or video. + The pending_segment was removed and a checked_media boolean + replaced it for a more accurate naming. + https://bugzilla.gnome.org/show_bug.cgi?id=721350 + +2014-01-02 13:43:54 -0300 Thiago Santos <ts.santos@sisa.samsung.com> + + * libs/gst/base/gstbaseparse.c: + baseparse: push pending events before GAP event + A GAP event is handled as an empty buffer by sinks and they expect + to receive start up events before GAP events (like a segment). + This is important specially if there is a GAP at the beginning of + a stream (before any buffers) so that the segment event can be + pushed downstream before the GAP + https://bugzilla.gnome.org/show_bug.cgi?id=721350 + +2014-01-02 13:41:25 -0300 Thiago Santos <ts.santos@sisa.samsung.com> + + * libs/gst/base/gstbaseparse.c: + baseparse: refactor pending events pushing + Refactor code repeated 3 times to a common function + https://bugzilla.gnome.org/show_bug.cgi?id=721350 + +2013-12-04 00:10:36 +0100 Sebastian Rasmussen <sebras@hotmail.com> + + * docs/Makefile.am: + * docs/design/Makefile.am: + docs: add missing files for distribution + * add some documentation files in docs/design + * add docs/list-ulink.xsl so check in docs/manual works + Fixes https://bugzilla.gnome.org/show_bug.cgi?id=719814 + +2014-01-03 11:47:23 +0800 YanpingZhang <zhangyanping210@163.com> + + * plugins/elements/gstmultiqueue.c: + multiqueue: Fix hanging if shut down while handling a serialized query + https://bugzilla.gnome.org/show_bug.cgi?id=721253 + +2014-01-02 13:34:52 +0100 Sebastian Dröge <sebastian@centricular.com> + + * tests/check/gst/gstpad.c: + pad: Add unit test for adding/removing blocking probes while a pad is blocked + And make sure that these new probes are actually called if they should + instead of silently blocking the pad forever. + https://bugzilla.gnome.org/show_bug.cgi?id=721289 + +2014-01-02 13:33:20 +0100 Sebastian Dröge <sebastian@centricular.com> + + * gst/gstpad.c: + pad: Check if new probes need to be called when adding/removing some + This allows blocking a pad, add a new blocking probe, removing + the first probe and then having the second probe called. Which + could then decide that data-flow should actually continue + instead of blocking now. + https://bugzilla.gnome.org/show_bug.cgi?id=721289 + +2014-01-02 11:13:27 +0100 Sebastian Dröge <sebastian@centricular.com> + + * plugins/elements/gsttee.c: + * plugins/elements/gsttee.h: + tee: Remove dyn lock + It was used for pad-alloc in 0.10 but currently is completely unused + and not necessary. All pad access is protected by the tee object lock + and keeping another reference to the current pad. + +2014-01-02 11:09:59 +0100 Sebastian Dröge <sebastian@centricular.com> + + * plugins/elements/gsttee.c: + tee: Keep another ref to our one and only srcpad around while pushing + A pad probe on that pad might otherwise just release the pad, drop + the last reference and cause great misery. + https://bugzilla.gnome.org/show_bug.cgi?id=721300 + +2013-12-30 19:03:22 +0100 Sebastian Dröge <sebastian@centricular.com> + + * gst/gstpad.c: + pad: Keep an extra ref of the pad when calling an IDLE probe immediately + The callback might destroy the pad. + +2013-12-30 18:44:24 +0100 Sebastian Dröge <sebastian@centricular.com> + + * gst/gstpad.c: + pad: Only call IDLE probes if we are actually idle + Also only check the data types for non-IDLE probes. When we + are idle, we have no data type obviously. + Previously we were calling IDLE probes during data flow whenever + a non-blocking probe would be called. The pad was usually not idle + at that time. + +2013-12-30 10:01:39 +0100 Sebastian Dröge <sebastian@centricular.com> + + * gst/gstpad.c: + pad: Don't ignore probe callback return value when immediately calling IDLE probe + https://bugzilla.gnome.org/show_bug.cgi?id=721096 + +2013-12-29 14:06:55 +0000 Pedro Côrte-Real <pedro@pedrocr.net> + + * scripts/git-update.sh: + scripts: git-update.sh: fix for non-master branches + Pull from tracking branch instead of origin/master, so + that this works with e.g. 1.2 as well. + === release 1.2.2 === -2013-12-26 Sebastian Dröge <slomo@coaxion.net> +2013-12-26 17:34:18 +0100 Sebastian Dröge <sebastian@centricular.com> + * ChangeLog: + * NEWS: + * RELEASE: * configure.ac: - releasing 1.2.2 + * docs/plugins/inspect/plugin-coreelements.xml: + * gstreamer.doap: + * win32/common/config.h: + * win32/common/gstversion.h: + Release 1.2.2 + +2013-12-26 17:31:38 +0100 Sebastian Dröge <sebastian@centricular.com> + + * po/af.po: + * po/az.po: + * po/be.po: + * po/bg.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/de.po: + * po/el.po: + * po/en_GB.po: + * po/eo.po: + * po/es.po: + * po/eu.po: + * po/fi.po: + * po/fr.po: + * po/gl.po: + * po/hr.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.po: + * po/lt.po: + * po/nb.po: + * po/nl.po: + * po/pl.po: + * po/pt_BR.po: + * po/ro.po: + * po/ru.po: + * po/rw.po: + * po/sk.po: + * po/sl.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/tr.po: + * po/uk.po: + * po/vi.po: + * po/zh_CN.po: + * po/zh_TW.po: + Update .po files 2013-12-26 16:44:57 +0100 Sebastian Dröge <sebastian@centricular.com> diff --git a/Makefile.in b/Makefile.in index a867bef..000ddda 100644 --- a/Makefile.in +++ b/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.14 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. @@ -969,9 +969,10 @@ distcheck: dist && $(MAKE) $(AM_MAKEFLAGS) distcheck-hook \ && am__cwd=`pwd` \ && $(am__cd) $(distdir)/_build \ - && ../configure --srcdir=.. --prefix="$$dc_install_base" \ + && ../configure \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ + --srcdir=.. --prefix="$$dc_install_base" \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ @@ -1,2 +1,2 @@ -This is GStreamer 1.2.2 +This is GStreamer 1.2.3 @@ -1,5 +1,5 @@ -Release notes for GStreamer 1.2.2 +Release notes for GStreamer 1.2.3 The GStreamer team is proud to announce a new bug-fix release @@ -42,12 +42,15 @@ contains a set of codecs plugins based on libav (formerly gst-ffmpeg) Bugs fixed in this release - * 712597 : regression: playbin: buffering of live radio stream never finishes - * 719437 : ghostpad: Clearing ghostpad sticky events when switching targets causes regressions - * 707230 : flacparse: disregards container timestamps - * 712300 : gst-launch: exits with 0 error code even after an error occurred - * 714989 : docs/gst-utils: Fix escaping of stream id format - * 719575 : multiqueue: improve for adaptive scenario + * 712597 : multiqueue: regression: buffering of live radio stream never finishes + * 719814 : docs: add missing files for distribution + * 721253 : multiqueue: May cause hanging if shut down while handling a serialized query + * 721289 : pad: using multiple blocking probes doesn't work as expected + * 721300 : tee: Does not protect pad from being destroyed from pad probe during gst_pad_push() + * 721350 : baseparse: push pending events before GAP + * 721422 : Negative pad offsets don't work + * 721941 : baseparse: do not accumulate buffers on passthrough mode + * 722467 : pad: Leaks events when iterating sticky events and callback drops event ==== Download ==== @@ -84,12 +87,11 @@ subscribe to the gstreamer-devel list. Contributors to this release - * Mark Nauwelaerts - * Olivier Crête - * Philippe Normand + * Arnaud Vrac + * Pedro Côrte-Real * Sebastian Dröge * Sebastian Rasmussen * Thiago Santos - * Tim-Philipp Müller * Wim Taymans + * YanpingZhang
\ No newline at end of file @@ -1,4 +1,4 @@ -# generated automatically by aclocal 1.14 -*- Autoconf -*- +# generated automatically by aclocal 1.14.1 -*- Autoconf -*- # Copyright (C) 1996-2013 Free Software Foundation, Inc. @@ -35,7 +35,7 @@ AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.14' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. -m4_if([$1], [1.14], [], +m4_if([$1], [1.14.1], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) @@ -51,7 +51,7 @@ m4_define([_AM_AUTOCONF_VERSION], []) # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], -[AM_AUTOMAKE_VERSION([1.14])dnl +[AM_AUTOMAKE_VERSION([1.14.1])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) diff --git a/common/Makefile.in b/common/Makefile.in index 609765d..6b5b556 100644 --- a/common/Makefile.in +++ b/common/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.14 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. diff --git a/common/m4/Makefile.in b/common/m4/Makefile.in index 40efca5..0cd954e 100644 --- a/common/m4/Makefile.in +++ b/common/m4/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.14 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for GStreamer 1.2.2. +# Generated by GNU Autoconf 2.69 for GStreamer 1.2.3. # # Report bugs to <http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer>. # @@ -591,8 +591,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='GStreamer' PACKAGE_TARNAME='gstreamer' -PACKAGE_VERSION='1.2.2' -PACKAGE_STRING='GStreamer 1.2.2' +PACKAGE_VERSION='1.2.3' +PACKAGE_STRING='GStreamer 1.2.3' PACKAGE_BUGREPORT='http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer' PACKAGE_URL='' @@ -1638,7 +1638,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 1.2.2 to adapt to many kinds of systems. +\`configure' configures GStreamer 1.2.3 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1709,7 +1709,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of GStreamer 1.2.2:";; + short | recursive ) echo "Configuration of GStreamer 1.2.3:";; esac cat <<\_ACEOF @@ -1891,7 +1891,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -GStreamer configure 1.2.2 +GStreamer configure 1.2.3 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -2664,7 +2664,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 $as_me 1.2.2, which was +It was created by GStreamer $as_me 1.2.3, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -3645,7 +3645,7 @@ fi # Define the identity of the package. PACKAGE='gstreamer' - VERSION='1.2.2' + VERSION='1.2.3' cat >>confdefs.h <<_ACEOF @@ -3855,9 +3855,9 @@ END fi - PACKAGE_VERSION_MAJOR=$(echo 1.2.2 | cut -d'.' -f1) - PACKAGE_VERSION_MINOR=$(echo 1.2.2 | cut -d'.' -f2) - PACKAGE_VERSION_MICRO=$(echo 1.2.2 | cut -d'.' -f3) + PACKAGE_VERSION_MAJOR=$(echo 1.2.3 | cut -d'.' -f1) + PACKAGE_VERSION_MINOR=$(echo 1.2.3 | cut -d'.' -f2) + PACKAGE_VERSION_MICRO=$(echo 1.2.3 | cut -d'.' -f3) @@ -3868,7 +3868,7 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking nano version" >&5 $as_echo_n "checking nano version... " >&6; } - NANO=$(echo 1.2.2 | cut -d'.' -f4) + NANO=$(echo 1.2.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 @@ -8520,10 +8520,10 @@ fi done - GST_CURRENT=202 + GST_CURRENT=203 GST_REVISION=0 - GST_AGE=202 - GST_LIBVERSION=202:0:202 + GST_AGE=203 + GST_LIBVERSION=203:0:203 @@ -27562,7 +27562,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 $as_me 1.2.2, which was +This file was extended by GStreamer $as_me 1.2.3, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -27628,7 +27628,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 config.status 1.2.2 +GStreamer config.status 1.2.3 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" diff --git a/configure.ac b/configure.ac index b0fea85..0a42d62 100644 --- a/configure.ac +++ b/configure.ac @@ -4,7 +4,7 @@ dnl initialize autoconf dnl when going to/from release please set the nano (fourth number) right ! dnl releases only do Wall, git and prerelease does Werror too dnl -AC_INIT([GStreamer],[1.2.2],[http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer],[gstreamer]) +AC_INIT([GStreamer],[1.2.3],[http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer],[gstreamer]) AG_GST_INIT dnl initialize automake (we require GNU make) @@ -64,7 +64,7 @@ dnl 1.2.5 => 205 dnl 1.10.9 (who knows) => 1009 dnl dnl sets GST_LT_LDFLAGS -AS_LIBTOOL(GST, 202, 0, 202) +AS_LIBTOOL(GST, 203, 0, 203) dnl *** autotools stuff **** diff --git a/docs/Makefile.am b/docs/Makefile.am index 27583ad..3f07d58 100644 --- a/docs/Makefile.am +++ b/docs/Makefile.am @@ -21,7 +21,7 @@ DIST_SUBDIRS = design gst libs plugins faq manual pwg slides xsl EXTRA_DIST = \ manuals.mak htmlinstall.mak \ - image-png image-pdf image-eps url.entities version.entities.in + image-png image-pdf image-eps url.entities version.entities.in list-ulink.xsl upload: @if test "x$(SUBDIRS)" != x; then for a in $(SUBDIRS); do cd $$a; make upload; cd ..; done; fi diff --git a/docs/Makefile.in b/docs/Makefile.in index 8068cfb..d44c5ef 100644 --- a/docs/Makefile.in +++ b/docs/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.14 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. @@ -490,7 +490,7 @@ SUBDIRS = design gst libs $(PLUGIN_DOCS_DIRS) $(SUBDIRS_DOCBOOK) DIST_SUBDIRS = design gst libs plugins faq manual pwg slides xsl EXTRA_DIST = \ manuals.mak htmlinstall.mak \ - image-png image-pdf image-eps url.entities version.entities.in + image-png image-pdf image-eps url.entities version.entities.in list-ulink.xsl all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-recursive diff --git a/docs/design/Makefile.am b/docs/design/Makefile.am index 5a0eda0..cb62c49 100644 --- a/docs/design/Makefile.am +++ b/docs/design/Makefile.am @@ -1,13 +1,18 @@ EXTRA_DIST = \ draft-klass.txt \ + draft-metadata.txt \ draft-push-pull.txt \ draft-tagreading.txt \ + draft-tracing.txt \ part-activation.txt \ part-buffering.txt \ + part-bufferpool.txt \ + part-buffer.txt \ part-caps.txt \ part-clocks.txt \ part-context.txt \ + part-controller.txt \ part-conventions.txt \ part-dynamic.txt \ part-element-sink.txt \ @@ -23,12 +28,17 @@ EXTRA_DIST = \ part-gstpipeline.txt \ part-latency.txt \ part-live-source.txt \ + part-memory.txt \ part-messages.txt \ + part-meta.txt \ + part-miniobject.txt \ part-missing-plugins.txt \ part-MT-refcounting.txt \ part-negotiation.txt \ part-overview.txt \ part-preroll.txt \ + part-probes.txt \ + part-progress.txt \ part-push-pull.txt \ part-qos.txt \ part-query.txt \ diff --git a/docs/design/Makefile.in b/docs/design/Makefile.in index 2c23947..fe17f8d 100644 --- a/docs/design/Makefile.in +++ b/docs/design/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.14 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. @@ -422,13 +422,18 @@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = \ draft-klass.txt \ + draft-metadata.txt \ draft-push-pull.txt \ draft-tagreading.txt \ + draft-tracing.txt \ part-activation.txt \ part-buffering.txt \ + part-bufferpool.txt \ + part-buffer.txt \ part-caps.txt \ part-clocks.txt \ part-context.txt \ + part-controller.txt \ part-conventions.txt \ part-dynamic.txt \ part-element-sink.txt \ @@ -444,12 +449,17 @@ EXTRA_DIST = \ part-gstpipeline.txt \ part-latency.txt \ part-live-source.txt \ + part-memory.txt \ part-messages.txt \ + part-meta.txt \ + part-miniobject.txt \ part-missing-plugins.txt \ part-MT-refcounting.txt \ part-negotiation.txt \ part-overview.txt \ part-preroll.txt \ + part-probes.txt \ + part-progress.txt \ part-push-pull.txt \ part-qos.txt \ part-query.txt \ diff --git a/docs/design/draft-metadata.txt b/docs/design/draft-metadata.txt new file mode 100644 index 0000000..aa84075 --- /dev/null +++ b/docs/design/draft-metadata.txt @@ -0,0 +1,201 @@ +Metadata +-------- + +This draft recaps the current metadata handling in GStreamer and proposes some +additions. + + +Supported Metadata standards +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The paragraphs below list supported native metadata standards sorted by type and +then in alphabetical order. Some standards have been extended to support +additional metadata. GStreamer already supports all of those to some extend. +This is showns in the table below as either [--], [r-], [-w] or [rw] depending on +read/write support (08.Feb.2010). + +Audio +- mp3 + ID3v2: [rw] + http://www.id3.org/Developer_Information + ID3v1: [rw] + http://www.id3.org/ID3v1 + XMP: [--] (inside ID3v2 PRIV tag of owner XMP) + http://www.adobe.com/devnet/xmp/ +- ogg/vorbis + vorbiscomment: [rw] + http://www.xiph.org/vorbis/doc/v-comment.html + http://wiki.xiph.org/VorbisComment +- wav + LIST/INFO chunk: [rw] + http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/RIFF.html#Info + http://www.kk.iij4u.or.jp/~kondo/wave/mpidata.txt + XMP: [--] + http://www.adobe.com/devnet/xmp/ + +Video +- 3gp + {moov,trak}.udta: [rw] + http://www.3gpp.org/ftp/Specs/html-info/26244.htm + ID3V2: [--] + http://www.3gpp.org/ftp/Specs/html-info/26244.htm + http://www.mp4ra.org/specs.html#id3v2 +- avi + LIST/INFO chunk: [rw] + http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/RIFF.html#Info + http://www.kk.iij4u.or.jp/~kondo/wave/mpidata.txt + XMP: [--] (inside "_PMX" chunk) + http://www.adobe.com/devnet/xmp/ +- asf + ??: + XMP: [--] + http://www.adobe.com/devnet/xmp/ +- flv [--] + XMP: (inside onXMPData script data tag) + http://www.adobe.com/devnet/xmp/ +- mkv + tags: [rw] + http://www.matroska.org/technical/specs/tagging/index.html +- mov + XMP: [--] (inside moov.udta.XMP_ box) + http://www.adobe.com/devnet/xmp/ +- mp4 + {moov,trak}.udta: [rw] + http://standards.iso.org/ittf/PubliclyAvailableStandards/c051533_ISO_IEC_14496-12_2008.zip + moov.udta.meta.ilst: [rw] + http://atomicparsley.sourceforge.net/ + http://atomicparsley.sourceforge.net/mpeg-4files.html + ID3v2: [--] + http://www.mp4ra.org/specs.html#id3v2 + XMP: [--] (inside UUID box) + http://www.adobe.com/devnet/xmp/ +- mxf + ?? + +Images +- gif + XMP: [--] + http://www.adobe.com/devnet/xmp/ +- jpg + jif: [rw] (only comments) + EXIF: [rw] (via metadata plugin) + http://www.exif.org/specifications.html + IPTC: [rw] (via metadata plugin) + http://www.iptc.org/IPTC4XMP/ + XMP: [rw] (via metadata plugin) + http://www.adobe.com/devnet/xmp/ +- png + XMP: [--] + http://www.adobe.com/devnet/xmp/ + +further Links: +http://age.hobba.nl/audio/tag_frame_reference.html +http://wiki.creativecommons.org/Tracker_CC_Indexing + + +Current Metadata handling +~~~~~~~~~~~~~~~~~~~~~~~~~ + +When reading files, demuxers or parsers extract the metadata. It will be sent +a GST_EVENT_TAG to downstream elements. When a sink element receives a tag +event, it will post a GST_MESSAGE_TAG message on the bus with the contents of +the tag event. + +Elements receiving GST_EVENT_TAG events can mangle them, mux them into the +buffers they send or just pass them through. Usually is muxers that will format +the tag data into the form required by the format they mux. Such elements would +also implement the GstTagSetter interface to receive tags from the application. + + +----------+ + | demux | + sink src --> GstEvent(tag) over GstPad to downstream element + +----------+ + + method call over GstTagSetter interface from application + | + v + +----------+ + | mux | +GstEvent(tag) over GstPad from upstream element --> sink src + +----------+ + +The data used in all those interfaces is GstTagList. It is based on a +GstStructure which is like a hash table with differently typed entries. The key +is always a string/GQuark. Many keys are predefined in GStreamer core. More keys +are defined in gst-plugins-base/gst-libs/gst/tag/tag.h. +If elements and applications use predefined types, it is possible to transcode a +file from one format into another while preserving all known and mapped +metadata. + + +Issues +~~~~~~ + +Unknown/Unmapped metadata +^^^^^^^^^^^^^^^^^^^^^^^^^ + +Right now GStreamer can lose metadata when transcoding, remuxing content. This +can happend as we don't map all metadata fields to generic ones. + +We should probably also add the whole metadata blob to the GstTagList. We would +need a GST_TAG_SYSTEM_xxx define (e.g. GST_TAG_SYSTEM_ID3V2) for each standard. +The content is not printable and should be treated as binary if not known. The +tag is not mergeable - call gst_tag_register() with GstTagMergeFunc=NULL. Also +the tag data is only useful for upstream elements, not for the application. + +A muxer would first scan a taglist for known system tags. Unknown tags are +ignored as already. It would first populate its own metadata store with the +entries from the system tag and the update the entries with the data in normal +tags. + +Below is an initial list of tag systems: +ID3V1 - GST_TAG_SYSTEM_ID3V1 +ID3V2 - GST_TAG_SYSTEM_ID3V2 +RIFF_INFO - GST_TAG_SYSTEM_RIFF_INFO +XMP - GST_TAG_SYSTEM_XMP + +We would basically need this for each container format. + +See also https://bugzilla.gnome.org/show_bug.cgi?id=345352 + +Lost metadata +^^^^^^^^^^^^^ + +A case slighly different from the previous is that when an application sets a +GstTagList on a pipeline. Right elements consuming tags do not report which tags +have been consumed. Especially when using elements that make metadata +persistent, we have no means of knowing which of the tags made it into the +target stream and which were not serialized. Ideally the application would like +to know which kind of metadata is accepted by a pipleine to reflect that in the +UI. + +Although it is in practise so that elements implementing GstTagSetter are the +ones that serialize, this does not have to be so. Otherwise we could add a +means to that interface, where elements add the tags they have serialized. The +application could build one list from all the tag messages and then query all +the serialized tags from tag-setters. The delta tells what has not been +serialized. + +A different approach would be to query the list of supported tags in advance. +This could be a query (GST_QUERY_TAG_SUPPORT). The query result could be a list +of elements and their tags. As a convenience we could flatten the list of tags +for the top-level element (if the query was sent to a bin) and add that. + +Tags are per Element +^^^^^^^^^^^^^^^^^^^^ + +In many cases we want tags per stream. Even metadata standards like mp4/3gp +metadata supports that. Right now GST_MESSAGE_SRC(tags) is the element. We tried +changing that to the pad, but that broke applications. +Also we miss the symmetric functionality in GstTagSetter. This interface is +usually implemented by elements. + +Open bugs +^^^^^^^^^ + +https://bugzilla.gnome.org/buglist.cgi?query_format=advanced;short_desc=tag;bug_status=UNCONFIRMED;bug_status=NEW;bug_status=ASSIGNED;bug_status=REOPENED;bug_status=NEEDINFO;short_desc_type=allwordssubstr;product=GStreamer + +Add GST_TAG_MERGE_REMOVE +https://bugzilla.gnome.org/show_bug.cgi?id=560302 + + diff --git a/docs/design/draft-tracing.txt b/docs/design/draft-tracing.txt new file mode 100644 index 0000000..39c20fb --- /dev/null +++ b/docs/design/draft-tracing.txt @@ -0,0 +1,96 @@ +Tracing +======= + +This subsystem will provide a mechanism to get structured tracing info from GStreamer +applications. This can be used for post-run analysis as well as for live +introspection. + +We are going to introduce a GstTracer object. There will be only a single instance +per process or none if tracing is off (not enabled via envvar or compiled out). + +Certain GStreamer core function (such as gst_pad_push or gst_element_add_pad) will +call into the tracer. The tracer will dispatch into loaded tracing plugins. +Developers will be able to select a list of plugins by setting an environment +variable, such as GST_TRACE="meminfo,dbus". When then plugins are loaded, they will +add them to certain hooks. Another env var GST_TRACE_CHANNEL can be used to send +the tracing to a file or a socket (Do the same for GST_DEBUG_CHANNEL). The syntax +could be GST_XXX_CHANNEL=file:///path/to/file or GST_XXX_CHANNEL=tcp://<ip>:<port>. +If no channel is set, the tracing goes to stderr like the debug logging. + +TODO(ensonic): we might want to have GST_{DEBUG|TRACE)_FORMAT envars as well. These +could be raw, ansi-color, binary, ... + +Hooks +----- +e.g. gst_pad_push() will do add this line: +GST_TRACER_PUSH_BUFFER (pad, buffer) + +If tracing is disable at compile time the macro will evaluate to nothing. Otherwise +it will become something along the lines of: +if (__tracer) { + gst_tracer_push_buffer (pad, buffer); +} + +In addition to api hooks we should also provide timer hooks. Interval timers are +useful to get e.g. resource usage snapshots. Also absolute timers might make sense. + +Plugins can attach handlers to one or more hooks. When a hook such as +gst_tracer_push_buffer () is called it will take a timestamp and call all attached +handlers. Hooks will be called from misc threads. The trace plugins should only +consume the provided data. Most trace plugins will log data to a trace channel. + + +TODO(ensonic): use GSignal for the hooks? + +Plugins +======= + +meminfo +------- +- register to an interval-timer hook. +- call mallinfo() and log memory usage + +rusage +------ +- register to an interval-timer hook. +- call getrusage() and log resource usage + +dbus +---- +- provide a dbus iface to announce applications that are traced +- tracing UIs can use the dbus iface to find the channels where logging and tracing + is getting logged to, one would start the tracing UI first and when the + application is started with tracing activated, the dbus plugin will announce the + new application, upon which the tracing UI can start reading from the log channels + +topology +-------- +- register to pipeline topology hooks +- tracing UIs can show a live pipeline graph + +communication +------------- +- register to buffer, event, message and query flow +- tracing apps can do e.g. statistics + +UI +== + +gst-debug-viewer +---------------- +gst-debug-viewer could be given the tracelog in addition to the debug log. +Alternatively it would show a dialog that shows all local apps (if the dbus plugin +is loaded) and read the log streams from the sockets/files that are configured for +the app. + +gst-trace-stats +--------------- +Such a tool could read a trace and summarize the content like gst-tracelib did for +stats in 0.10. + + +Problems / Open items +===================== +- when connecting to a running app, we cant easily get the 'current' state if logging +is using a socket, as past events are not stored + diff --git a/docs/design/part-buffer.txt b/docs/design/part-buffer.txt new file mode 100644 index 0000000..6df980d --- /dev/null +++ b/docs/design/part-buffer.txt @@ -0,0 +1,160 @@ +GstBuffer +--------- + +This document describes the design for buffers. + +A GstBuffer is the object that is passed from an upstream element to a +downstream element and contains memory and metadata information. + +Requirements +~~~~~~~~~~~~ + + - It must be fast + * allocation, free, low fragmentation + - Must be able to attach multiple memory blocks to the buffer + - Must be able to attach artibtrary metadata to buffers + - efficient handling of subbuffer, copy, span, trim + +Lifecycle +~~~~~~~~~ + +GstMemory extends from GstMiniObject and therefore uses its lifecycle +management (See part-miniobject.txt). + +Writability +~~~~~~~~~~~ + +When a Buffers is writable as returned from gst_buffer_is_writable(): + + - metadata can be added/removed and the metadata can be changed + - GstMemory blocks can be added/removed + +The individual memory blocks have their own locking and READONLY flags +that might influence their writability. + +Buffers can be made writable with gst_buffer_make_writable(). This will copy the +buffer with the metadata and will ref the memory in the buffer. This means that +the memory is not automatically copied when copying buffers. + + +Managing GstMemory +------------------ + +A GstBuffer contains an array of pointers to GstMemory objects. + +When the buffer is writable, gst_buffer_insert_memory() can be used to add a +new GstMemory object to the buffer. When the array of memory is full, memory +will be merged to make room for the new memory object. + +gst_buffer_n_memory() is used to get the amount of memory blocks on the +GstBuffer. + +With gst_buffer_peek_memory(), memory can be retrieved from the memory array. +The desired access pattern for the memory block should be specified so that +appropriate checks can be made and, in case of GST_MAP_WRITE, a writable copy +can be constructed when needed. + +gst_buffer_remove_memory_range() and gst_buffer_remove_memory() can be used to +remove memory from the GstBuffer. + + +Subbuffers +---------- + +Subbuffers are made by copying only a region of the memory blocks and copying +all of the metadata. + + +Span +---- + +Spanning will merge together the data of 2 buffers into a new buffer + + +Data access +----------- + + Accessing the data of the buffer can happen by retrieving the individual + GstMemory objects in the GstBuffer or my using the gst_buffer_map() and + gst_buffer_unmap() function. + + The _map and _unmap function will always return the memory of all blocks as one + large contiguous region of memory. Using the _map and _unmap function might be + more convenient than accessing the individual memory blocks at the expense of + being more expensive because it might perform memcpy operations. + + For buffers with only one GstMemory object (the most common case), _map and + _unmap have no performance penalty at all. + + +* Read access with 1 memory block + + The memory block is accessed and mapped for read access. + The memory block is unmapped after usage + +* write access with 1 memory block + + The buffer should be writable or this operation will fail.. + The memory block is accessed. If the memory block is readonly, a copy is made + and the original memory block is replaced with this copy. then the memory + block is mapped in write mode. + The memory block is unmapped after usage. + +* Read access with multiple memory blocks + + The memory blocks are combined into one large memory block. If the buffer is + writable, The memory blocks are replace with this new memory block. If the + buffer is not writable, the memory is returned as is. + The memory block is then mapped in read mode. + + When the memory is unmapped after usage and the buffer has multiple memory + blocks, this means that the map operation was not able to store the combined + buffer and it thus returned memory that should be freed. Otherwise, the memory + is unmapped. + +* Write access with multiple memory blocks + + The buffer should be writable or the operation fails. The memory blocks are + combined into one large memory block and the existing blocks are replaced with + this new block. The memory is then mapped in write mode. + The memory is unmapped after usage. + + +Use cases +--------- + +Generating RTP packets from h264 video +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +We receive as input a GstBuffer with an encoded h264 image and we need to +create RTP packets containing this h264 data as the payload. We typically need +to fragment the h264 data into multiple packets, each with their own RTP and +payload specific header. + + +-------+-------+---------------------------+--------+ + input H264 buffer: | NALU1 | NALU2 | ..... | NALUx | + +-------+-------+---------------------------+--------+ + | + V + array of +-+ +-------+ +-+ +-------+ +-+ +-------+ + output buffers: | | | NALU1 | | | | NALU2 | .... | | | NALUx | + +-+ +-------+ +-+ +-------+ +-+ +-------+ + : : : : + \-----------/ \-----------/ + buffer 1 buffer 2 + +The output buffer array consists of x buffers consisting of an RTP payload header +and a subbuffer of the original input H264 buffer. Since the rtp headers and +the h264 data don't need to be contiguous in memory, they are added to the buffer +as separate GstMemory blocks and we can avoid to memcpy the h264 data into +contiguous memory. + +A typical udpsink will then use something like sendmsg to send the memory regions +on the network inside one UDP packet. This will further avoid having to memcpy +data into contiguous memory. + +Using bufferlists, the complete array of output buffers can be pushed in one +operation to the peer element. + + + diff --git a/docs/design/part-bufferpool.txt b/docs/design/part-bufferpool.txt new file mode 100644 index 0000000..46b1a34 --- /dev/null +++ b/docs/design/part-bufferpool.txt @@ -0,0 +1,377 @@ +Bufferpool +---------- + +This document details the design of how buffers are be allocated and +managed in pools. + +Bufferpools increases performance by reducing allocation overhead and +improving possibilities to implement zero-copy memory transfer. + +Together with the ALLOCATION query, elements can negotiate allocation properties +and bufferpools between themselves. This also allows elements to negotiate +buffer metadata between themselves. + +Requirements +------------ + + - Provide a GstBufferPool base class to help the efficient implementation of a + list of reusable GstBuffer objects. + + - Let upstream elements initiate the negotiation of a bufferpool and its + configuration. Allow downstream elements provide bufferpool properties and/or + a bufferpool. This includes the following properties: + + * have minimum and maximum amount of buffers with the option of + preallocating buffers. + * allocator, alignment and padding support + * buffer metadata + * arbitrary extra options + + - Integrate with dynamic caps renegotiation. + + - Notify upstream element of new bufferpool availability. This is important + when a new element, that can provide a bufferpool, is dynamically linked + downstream. + + +GstBufferPool +------------- + + The bufferpool object manages a list of buffers with the same properties such + as size, padding and alignment. + + The bufferpool has two states: active and inactive. In the in-active + state, the bufferpool can be configured with the required allocation + preferences. In the active state, buffers can be retrieved from and + returned to the pool. + + The default implementation of the bufferpool is able to allocate buffers + from any allocator with arbitrary alignment and padding/prefix. + + Custom implementations of the bufferpool can override the allocation and + free algorithms of the buffers from the pool. This should allow for + different allocation strategies such as using shared memory or hardware + mapped memory. + + +Negotiation +----------- + + After a particular media format has been negotiated between two pads (using the + CAPS event), they must agree on how to allocate buffers. + + The srcpad will always take the initiative to negotiate the allocation + properties. It starts with creating a GST_QUERY_ALLOCATION with the negotiated + caps. + + The srcpad can set the need-pool flag to TRUE in the query to optionally make the + peer pad allocate a bufferpool. It should only do this if it is able to use + the peer provided bufferpool. + + It will then inspect the returned results and configure the returned pool or + create a new pool with the returned properties when needed. + + Buffers are then allocated by the srcpad from the negotiated pool and pushed to + the peer pad as usual. + + The allocation query can also return an allocator object when the buffers are of + different sizes and can't be allocated from a pool. + + +Allocation query +---------------- + + The allocation query has the following fields: + + (in) "caps", GST_TYPE_CAPS + - the caps that was negotiated + + (in) "need-pool", G_TYPE_BOOLEAN + - if a GstBufferPool is requested + + (out) "pool", G_TYPE_ARRAY of structure + - an array of pool configurations. + + struct { + GstBufferPool *pool; + guint size; + guint min_buffers; + guint max_buffers; + } + + use gst_query_parse_nth_allocation_pool() to get the values. + + The allocator can contain multiple pool configurations. If need-pool + was TRUE, the pool member might contain a GstBufferPool when the + downstream element can provide one. + + Size contains the size of the bufferpool buffers and is never 0. + + min_buffers and max_buffers contain the suggested min and max amount of + buffers that should be managed by the pool. + + The upstream element can choose to use the provided pool or make its own + pool when none was provided or when the suggested pool was not + acceptable. + + The pool can then be configured with the suggested min and max amount of + buffers or a downstream element might choose different values. + + (out) "allocator", G_TYPE_ARRAY of structure + - an array of allocator parameters that can be used. + + struct { + GstAllocator *allocator; + GstAllocationParams params; + } + + use gst_query_parse_nth_allocation_param() to get the values + + The element performing the query can use the allocators and its + parameters to allocate memory for the downstream element. + + It is also possible to configure the allocator in a provided pool. + + (out) "metadata", G_TYPE_ARRAY of structure + - an array of metadata params that can be accepted. + + struct { + GType api; + GstStructure *params; + } + + Use gst_query_parse_nth_allocation_meta() to get the values. + + These metadata items can be accepted by the downstream element when + placed on buffers. There is also an arbitrary GstStructure associated + with the metadata that contains metadata specific options. + + Some bufferpools have options to enable metadata on the buffers + allocated by the pool. + + +Allocating from pool +-------------------- + + Buffers are allocated from the pool of a pad: + + res = gst_buffer_pool_acquire_buffer (pool, &buffer, ¶ms); + + A GstBuffer that is allocated from the pool will always be writable (have a + refcount of 1) and it will also have its pool member point to the GstBufferPool + that created the buffer. + + Buffers are refcounted in the usual way. When the refcount of the buffer + reaches 0, the buffer is automatically returned to the pool. + + Since all the buffers allocated from the pool keep a reference to the pool, + when nothing else is holding a refcount to the pool, it will be finalized + when all the buffers from the pool are unreffed. By setting the pool to + the inactive state we can drain all buffers from the pool. + + When the pool is in the inactive state, gst_buffer_pool_acquire_buffer() will + return GST_FLOW_FLUSHING immediately. + + Extra parameters can be given to the gst_buffer_pool_acquire_buffer() method to + influence the allocation decision. GST_BUFFER_POOL_FLAG_KEY_UNIT and + GST_BUFFER_POOL_FLAG_DISCONT serve as hints. + + When the bufferpool is configured with a maximum number of buffers, allocation + will block when all buffers are outstanding until a buffer is returned to the + pool. This behaviour can be changed by specifying the + GST_BUFFER_POOL_FLAG_DONTWAIT flag in the parameters. With this flag set, + allocation will return GST_FLOW_EOS when the pool is empty. + + +Renegotiation +------------- + +Renegotiation of the bufferpool might need to be performed when the +configuration of the pool changes. Changes can be in the buffer size (because +of a caps change), alignment or number of buffers. + +* downstream + + When the upstream element wants to negotiate a new format, it might need + to renegotiate a new bufferpool configuration with the downstream element. + This can, for example, happen when the buffer size changes. + + We can not just reconfigure the existing bufferpool because there might + still be outstanding buffers from the pool in the pipeline. Therefore we + need to create a new bufferpool for the new configuration while we let the + old pool drain. + + Implementations can choose to reuse the same bufferpool object and wait for + the drain to finish before reconfiguring the pool. + + The element that wants to renegotiate a new bufferpool uses exactly the same + algorithm as when it first started. It will negotiate caps first then use the + ALLOCATION query to get and configure the new pool. + +* upstream + + When a downstream element wants to negotiate a new format, it will send a + RECONFIGURE event upstream. This instructs upstream to renegotiate both + the format and the bufferpool when needed. + + A pipeline reconfiguration is when new elements are added or removed from + the pipeline or when the topology of the pipeline changes. Pipeline + reconfiguration also triggers possible renegotiation of the bufferpool and + caps. + + A RECONFIGURE event tags each pad it travels on as needing reconfiguration. + The next buffer allocation will then require the renegotiation or + reconfiguration of a pool. + + +Shutting down +------------- + + In push mode, a source pad is responsible for setting the pool to the + inactive state when streaming stops. The inactive state will unblock any pending + allocations so that the element can shut down. + + In pull mode, the sink element should set the pool to the inactive state when + shutting down so that the peer _get_range() function can unblock. + + In the inactive state, all the buffers that are returned to the pool will + automatically be freed by the pool and new allocations will fail. + + +Use cases +--------- + +1) videotestsrc ! xvimagesink + + Before videotestsrc can output a buffer, it needs to negotiate caps and + a bufferpool with the downstream peer pad. + + First it will negotiate a suitable format with downstream according to the + normal rules. It will send a CAPS event downstream with the negotiated + configuration. + + Then it does an ALLOCATION query. It will use the returned bufferpool or + configures its own bufferpool with the returned parameters. The bufferpool is + initially in the inactive state. + + The ALLOCATION query lists the desired configuration of the downstream + xvimagesink, which can have specific alignment and/or min/max amount of + buffers. + + videotestsrc updates the configuration of the bufferpool, it will likely + set the min buffers to 1 and the size of the desired buffers. It then + updates the bufferpool configuration with the new properties. + + When the configuration is successfully updated, videotestsrc sets the + bufferpool to the active state. This preallocates the buffers in the pool + (if needed). This operation can fail when there is not enough memory + available. Since the bufferpool is provided by xvimagesink, it will allocate + buffers backed by an XvImage and pointing to shared memory with the X server. + + If the bufferpool is successfully activated, videotestsrc can acquire a + buffer from the pool, fill in the data and push it out to xvimagesink. + + xvimagesink can know that the buffer originated from its pool by following + the pool member. + + when shutting down, videotestsrc will set the pool to the inactive state, + this will cause further allocations to fail and currently allocated buffers + to be freed. videotestsrc will then free the pool and stop streaming. + + +2) videotestsrc ! queue ! myvideosink + + In this second use case we have a videosink that can at most allocate + 3 video buffers. + + Again videotestsrc will have to negotiate a bufferpool with the peer + element. For this it will perform the ALLOCATION query which + queue will proxy to its downstream peer element. + + The bufferpool returned from myvideosink will have a max_buffers set to 3. + queue and videotestsrc can operate with this upper limit because none of + those elements require more than that amount of buffers for temporary + storage. + + The bufferpool of myvideosink will then be configured with the size of the + buffers for the negotiated format and according to the padding and alignment + rules. When videotestsrc sets the pool to active, the 3 video + buffers will be preallocated in the pool. + + videotestsrc acquires a buffer from the configured pool on its srcpad and + pushes this into the queue. When the videotestsrc has acquired and pushed + 3 frames, the next call to gst_buffer_pool_acquire_buffer() will block + (assuming the GST_BUFFER_POOL_FLAG_DONTWAIT is not specified). + + When the queue has pushed out a buffer and the sink has rendered it, the + refcount of the buffer reaches 0 and the buffer is recycled in the pool. + This will wake up the videotestsrc that was blocked, waiting for more + buffers and will make it produce the next buffer. + + In this setup, there are at most 3 buffers active in the pipeline and + the videotestsrc is rate limited by the rate at which buffers are recycled + in the bufferpool. + + When shutting down, videotestsrc will first set the bufferpool on the srcpad + to inactive. This causes any pending (blocked) acquire to return with a + FLUSHING result and causes the streaming thread to pause. + + +3) .. ! myvideodecoder ! queue ! fakesink + + In this case, the myvideodecoder requires buffers to be aligned to 128 + bytes and padded with 4096 bytes. The pipeline starts out with the + decoder linked to a fakesink but we will then dynamically change the + sink to one that can provide a bufferpool. + + When it negotiates the size with the downstream element fakesink, it will + receive a NULL bufferpool because fakesink does not provide a bufferpool. + It will then select its own custom bufferpool to start the datatransfer. + + At some point we block the queue srcpad, unlink the queue from the + fakesink, link a new sink and set the new sink to the PLAYING state. + Linking the new sink would automatically send a RECONFIGURE event upstream + and, through queue, inform myvideodecoder that it should renegotiate its + bufferpool because downstream has been reconfigured. + + Before pushing the next buffer, myvideodecoder would renegotiate a new + bufferpool. To do this, it performs the usual bufferpool negotiation + algorithm. If it can obtain and configure a new bufferpool from downstream, + it sets its own (old) pool to inactive and unrefs it. This will eventually + drain and unref the old bufferpool. + + The new bufferpool is set as the new bufferpool for the srcpad and sinkpad + of the queue and set to the active state. + + +4) .. ! myvideodecoder ! queue ! myvideosink + + myvideodecoder has negotiated a bufferpool with the downstream myvideosink + to handle buffers of size 320x240. It has now detected a change in the + video format and need to renegotiate to a resolution of 640x480. This + requires it to negotiate a new bufferpool with a larger buffersize. + + When myvideodecoder needs to get the bigger buffer, it starts the + negotiation of a new bufferpool. It queries a bufferpool from downstream, + reconfigures it with the new configuration (which includes the bigger buffer + size) and it then sets the bufferpool to active. The old pool is inactivated + and unreffed, which causes the old format to drain. + + It then uses the new bufferpool for allocating new buffers of the new + dimension. + + If at some point, the decoder wants to switch to a lower resolution again, + it can choose to use the current pool (which has buffers that are larger + than the required size) or it can choose to renegotiate a new bufferpool. + + +5) .. ! myvideodecoder ! videoscale ! myvideosink + + myvideosink is providing a bufferpool for upstream elements and wants to + change the resolution. + + myvideosink sends a RECONFIGURE event upstream to notify upstream that a + new format is desirable. upstream elements try to negotiate a new format + and bufferpool before pushing out a new buffer. The old bufferpools are + drained in the regular way. + diff --git a/docs/design/part-controller.txt b/docs/design/part-controller.txt new file mode 100644 index 0000000..9476092 --- /dev/null +++ b/docs/design/part-controller.txt @@ -0,0 +1,67 @@ +Controller +---------- + +The controller subsystem allows to automate element property changes. It works +so that all parameter changes are time based and elements request property +updates at processing time. + +Element view +~~~~~~~~~~~~ +Elements don't need to do much. They need to: +- mark object properties that can be changed while processing with + GST_PARAM_CONTROLLABLE +- call gst_object_sync_values (self, timestamp) in the processing function + before accessing the parameters. + +All ordered property types can be automated (int, double, boolean, enum). Other +property types can be automates as well by using special control bindings. One can +e.g. write a control-binding that updates a text property based on timestamps. + +Application view +~~~~~~~~~~~~~~~~ +Applications need to setup the property automation. For that they need to create +a GstControlSource and attach it to a property using GstControlBinding. Various +control-sources and control-bindings exist. All control sources produce control +value sequences in the form of gdouble values. The control bindings map them to +the value range and type of the bound property. + +One control-source can be attached to one or more properties at the same time. +If it is attached multiple times, then each control-binding will scale and +convert the control values to the target property type and range. + +One can create complex control-curves by using a GstInterpolationControlSource. +This allows the classic user editable control-curve (often seen in audio/video +editors). Another way is to use computed control curves. GstLFOControlSource can +generate various repetitive signals. Those can be made more complex by chaining +the control sources. One can attach another control-source to e.g. modulate the +frequency of the first GstLFOControlSource. + +In most cases GstControlBindingDirect will be the binding to be used. Other +control bindings are there to handle special cases, such as having 1-4 control- +sources and combine their values into a single guint to control a rgba-color +property. + + +TODO +~~~~ +control-source value ranges +- control sources should ideally emit values between [0.0 and 1.0] +- right now lfo-control-sources emits values between [-1.0 and 1.0] +- we can make control-sources announce that or fix it in a lfo2-control-source + +ranged-control-binding +- it might be a nice thing to have a control-binding that has scale and offset + properties +- when attaching a contro-source to e.g. volume one needs to be aware that the values + go from [0.0 to 4.0] +- we can also have a "mapping-mode"={AS_IS, TRANSFORMED} on direct-control-binding + and two extra properties that are used in TRANSFORMED mode + +control-setup descriptions +- it would be nice to have a way to parse a textual control-setup description. This + could be used in gst-launch and in presets. It needs to be complemented with a + formatter (for the preset storage or e.g. for debug logging). +- this could be function-style: + direct(control-source=lfo(waveform='sine',offset=0.5)) + or gst-launch style (looks weird) + lfo wave=sine offset=0.5 ! direct .control-source diff --git a/docs/design/part-memory.txt b/docs/design/part-memory.txt new file mode 100644 index 0000000..681ac04 --- /dev/null +++ b/docs/design/part-memory.txt @@ -0,0 +1,169 @@ +GstMemory +--------- + +This document describes the design of the memory objects. + +GstMemory objects are usually added to GstBuffer objects and contain the +multimedia data passed around in the pipeline. + +Requirements +~~~~~~~~~~~~ + + - It must be possible to have different memory allocators + - It must be possible to efficiently share memory objects, copy, span + and trim. + + +Memory layout +~~~~~~~~~~~~~ + + GstMemory manages a memory region. The accesible part of the managed region is + defined by an offset relative to the start of the region and a size. This + means that the managed region can be larger than what is visible to the user of + GstMemory API. + + Schematically, GstMemory has a pointer to a memory region of _maxsize_. The area + starting from _offset_ and _size_ is accessible. + + memory + GstMemory ->*----------------------------------------------------* + ^----------------------------------------------------^ + maxsize + ^--------------------------------------^ + offset size + + The current properties of the accessible memory can be retrieved with: + + gsize gst_memory_get_sizes (GstMemory *mem, gsize *offset, gsize *maxsize); + + The offset and size can be changed with: + + void gst_memory_resize (GstMemory *mem, gssize offset, gsize size); + + +Allocators +~~~~~~~~~~ + + GstMemory objects are created by allocators. Allocators are a subclass + of GstObject and can be subclassed to make custom allocators. + + struct _GstAllocator { + GstObject object; + + const gchar *mem_type; + + GstMemoryMapFunction mem_map; + GstMemoryUnmapFunction mem_unmap; + + GstMemoryCopyFunction mem_copy; + GstMemoryShareFunction mem_share; + GstMemoryIsSpanFunction mem_is_span; + }; + + The allocator class has 2 virtual methods. One to create a GstMemory, + another to free it again. + + struct _GstAllocatorClass { + GstObjectClass object_class; + + GstMemory * (*alloc) (GstAllocator *allocator, gsize size, + GstAllocationParams *params); + void (*free) (GstAllocator *allocator, GstMemory *memory); + }; + + + Allocators are refcounted. It is also possible to register the allocator to the + GStreamer system. This way, the allocator can be retrieved by name. + + After an allocator is created, new GstMemory can be created with + + GstMemory * gst_allocator_alloc (const GstAllocator * allocator, + gsize size, + GstAllocationParams *params); + + GstAllocationParams contain extra info such as flags, alignment, prefix and + padding. + + The GstMemory object is a refcounted object that must be freed with + gst_memory_unref (). + + The GstMemory keeps a ref to the allocator that allocated it. Inside the + allocator are the most common GstMemory operations listed. Custom + GstAllocator implementations must implement the various operations on + the memory they allocate. + + It is also possible to create a new GstMemory object that wraps existing + memory with: + + GstMemory * gst_memory_new_wrapped (GstMemoryFlags flags, + gpointer data, gsize maxsize, + gsize offset, gsize size, + gpointer user_data, + GDestroyNotify notify); + +Lifecycle +~~~~~~~~~ + +GstMemory extends from GstMiniObject and therefore uses its lifecycle +management (See part-miniobject.txt). + + + +Data Access +~~~~~~~~~~~ + + Access to the memory region is always controlled with a map and unmap method + call. This allows the implementation to monitor the access patterns or set up + the required memory mappings when needed. + + The access of the memory object is controlled with the locking mechanism on + GstMiniObject (See part-miniobject.txt). + + Mapping a memory region requires the caller to specify the access method: READ + and/or WRITE. Mapping a memory region will first try to get a lock on the + memory in the requested access mode. This means that the map operation can + fail when WRITE access is requested on a non-writable memory object (it has + an exclusive counter > 1, the memory is already locked in an incompatible + access mode or the memory is marked readonly). + + After the data has been accessed in the object, the unmap call must be + performed, which will unlock the memory again. + + It is allowed to recusively map multiple times with the same or narrower + access modes. for each of the map calls, an corresponding unmap call needs to + be made. WRITE-only memory cannot be mapped in READ mode and READ-only memory + cannot be mapped in WRITE mode. + + The memory pointer returned from the map call is guaranteed to remain valid in + the requested mapping mode until the corresponding unmap call is performed on + the pointer. + + When multiple map operations are nested and return the same pointer, the pointer + is valid until the last unmap call is done. + + When the final reference on a memory object is dropped, all outstanding + mappings should have been unmapped. + + Resizing a GstMemory does not influence any current mappings an any way. + +Copy +~~~~ + + A GstMemory copy can be made with the gst_memory_copy() call. Normally, + allocators will implement a custom version of this function to make a copy of + the same kind of memory as the original one. + + This is what the fallback version of the copy function will do, albeit slower + than what as custom implementation could do. + + The copy operation is only required to copy the visible range of the memory + block. + + +Share +~~~~~ + + A memory region can be shared between GstMemory object with the + gst_memory_share() operation. + + diff --git a/docs/design/part-meta.txt b/docs/design/part-meta.txt new file mode 100644 index 0000000..55a1ffd --- /dev/null +++ b/docs/design/part-meta.txt @@ -0,0 +1,396 @@ +GstMeta +------- + +This document describes the design for arbitrary per-buffer metadata. + +Buffer metadata typically describes the lowlevel properties of the buffer +content. These properties are typically not negotiated with caps but they are +negotiated in the bufferpools. + +Some examples of metadata: + + - interlacing information + - video alignment, cropping, panning information + - extra container information such as granulepos, ... + - extra global buffer properties + + +Requirements +~~~~~~~~~~~~ + + - It must be fast + * allocation, free, low fragmentation + * access to the metadata fields, preferably not much slower than directly + accessing a C structure field + - It must be extensible. Elements should be able to add new arbitrary metadata + without requiring much effort. Also new metadata fields should not break API + or ABI. + - It plays nice with subbuffers. When a subbuffer is created, the various + buffer metadata should be copied/updated correctly. + - We should be able to negotiate metadata between elements + +Use cases +--------- + + * Video planes + + Video data is sometimes allocated in non-contiguous planes for the Y and the UV + data. We need to be able to specify the data on a buffer using multiple + pointers in memory. We also need to be able to specify the stride for these + planes. + + * Extra buffer data + + Some elements might need to store extra data for a buffer. This is typically + done when the resources are allocated from another subsystem such as OMX or + X11. + + * Processing information + + Pan and crop information can be added to the buffer data when the downstream + element can understand and use this metadata. An imagesink can, for example, + use the pan and cropping formation when it blits the image on the screen + with little overhead. + + +GstMeta +~~~~~~~ + +A GstMeta is a structure as follows: + + struct _GstMeta { + GstMetaFlags flags; + const GstMetaInfo *info; /* tag and info for the meta item */ + }; + +The purpose of the this structure is to serve as a common header for all metadata +information that we can attach to a buffer. Specific metadata, such as timing metadata, +will have this structure as the first field. For example: + + struct _GstMetaTiming { + GstMeta meta; /* common meta header */ + + GstClockTime dts; /* decoding timestamp */ + GstClockTime pts; /* presentation timestamp */ + GstClockTime duration; /* duration of the data */ + GstClockTime clock_rate; /* clock rate for the above values */ + }; + +Or another example for the video memory regions that consists of both fields and +methods. + + + #define GST_VIDEO_MAX_PLANES 4 + + struct GstMetaVideo { + GstMeta meta; + + GstBuffer *buffer; + + GstVideoFlags flags; + GstVideoFormat format; + guint id + guint width; + guint height; + + guint n_planes; + gsize offset[GST_VIDEO_MAX_PLANES]; /* offset in the buffer memory region of the + * first pixel. */ + gint stride[GST_VIDEO_MAX_PLANES]; /* stride of the image lines. Can be negative when + * the image is upside-down */ + + gpointer (*map) (GstMetaVideo *meta, guint plane, gpointer * data, gint *stride, + GstMapFlags flags); + gboolean (*unmap) (GstMetaVideo *meta, guint plane, gpointer data); + }; + + gpointer gst_meta_video_map (GstMetaVideo *meta, guint plane, gpointer * data, + gint *stride, GstMapflags flags); + gboolean gst_meta_video_unmap (GstMetaVideo *meta, guint plane, gpointer data); + +GstMeta derived structures define the API of the metadata. The API can consist of +fields and/or methods. It is possible to have different implementations for the +same GstMeta structure. + +The implementation of the GstMeta api would typically add more fields to the +public structure that allow it to implement the API. + +GstMetaInfo will point to more information about the metadata and looks like this: + + struct _GstMetaInfo { + GType api; /* api type */ + GType type; /* implementation type */ + gsize size; /* size of the structure */ + + GstMetaInitFunction init_func; + GstMetaFreeFunction free_func; + GstMetaTransformFunction transform_func; + }; + +api will contain a GType of the metadata api. A repository of registered MetaInfo +will be maintained by the core. We will register some common metadata structures +in core and some media specific info for audio/video/text in -base. Plugins can +register additional custom metadata. + +For each implementation of api, there will thus be a unique GstMetaInfo. In the +case of metadata with a well defined API, the implementation specific init +function will setup the methods in the metadata structure. A unique GType will +be made for each implementation and stored in the type field. + +Along with the metadata description we will have functions to initialize/free (and/or refcount) +a specific GstMeta instance. We also have the possibility to add a custom +transform function that can be used to modify the metadata when a transformation +happens. + +There are no explicit methods to serialize and deserialize the metadata. Since +each type has a GType, we can reuse the GValue transform functions for this. + +The purpose of the separate MetaInfo is to not have to carry the free/init functions in +each buffer instance but to define them globally. We still want quick access to the info +so we need to make the buffer metadata point to the info. + +Technically we could also specify the field and types in the MetaInfo and +provide a generic API to retrieve the metadata fields without the need for a +header file. We will not do this yet. + +Allocation of the GstBuffer structure will result in the allocation of a memory region +of a customizable size (512 bytes). Only the first sizeof (GstBuffer) bytes of this +region will initially be used. The remaining bytes will be part of the free metadata +region of the buffer. Different implementations are possible and are invisible +in the API or ABI. + +The complete buffer with metadata could, for example, look as follows: + + +-------------------------------------+ +GstMiniObject | GType (GstBuffer) | + | refcount, flags, copy/disp/free | + +-------------------------------------+ +GstBuffer | pool,pts,dts,duration,offsets | + | <private data> | + +.....................................+ + | next ---+ + +- | info ------> GstMetaInfo +GstMetaTiming | | | | + | | dts | | + | | pts | | + | | duration | | + +- | clock_rate | | + + . . . . . . . . . . . . . . . . . . + | + | next <--+ +GstMetaVideo +- +- | info ------> GstMetaInfo + | | | | | + | | | flags | | + | | | n_planes | | + | | | planes[] | | + | | | map | | + | | | unmap | | + +- | | | | + | | private fields | | +GstMetaVideoImpl | | ... | | + | | ... | | + +- | | | + + . . . . . . . . . . . . . . . . . . + . + . . + + +API examples +~~~~~~~~~~~~ + +Buffers are created using the normal gst_buffer_new functions. The standard fields +are initialized as usual. A memory area that is bigger than the structure size +is allocated for the buffer metadata. + + gst_buffer_new (); + +After creating a buffer, the application can set caps and add metadata +information. + +To add or retrieve metadata, a handle to a GstMetaInfo structure needs to be +obtained. This defines the implementation and API of the metadata. Usually, a +handle to this info structure can be obtained by calling a public _get_info() +method from a shared library (for shared metadata). + +The following defines can usually be found in the shared .h file. + + GstMetaInfo * gst_meta_timing_get_info(); + #define GST_META_TIMING_INFO (gst_meta_timing_get_info()) + +Adding metadata to a buffer can be done with the gst_buffer_add_meta() call. +This function will create new metadata based on the implementation specified by +the GstMetaInfo. It is also possible to pass a generic pointer to the add_meta() +function that can contain parameters to initialize the new metadata fields. + +Retrieving the metadata on a buffer can be done with the +gst_buffer_meta_get() method. This function retrieves an existing metadata +conforming to the API specified in the given info. When no such metadata exists, +the function will return NULL. + + GstMetaTiming *timing; + + timing = gst_buffer_get_meta (buffer, GST_META_TIMING_INFO); + +Once a reference to the info has been obtained, the associated metadata can be +added or modified on a buffer. + + timing->timestamp = 0; + timing->duration = 20 * GST_MSECOND; + +Other convenience macros can be made to simplify the above code: + + #define gst_buffer_get_meta_timing(b) \ + ((GstMetaTiming *) gst_buffer_get_meta ((b), GST_META_TIMING_INFO) + +This makes the code look like this: + + GstMetaTiming *timing; + + timing = gst_buffer_get_meta_timing (buffer); + timing->timestamp = 0; + timing->duration = 20 * GST_MSECOND; + +To iterate the different metainfo structures, one can use the +gst_buffer_meta_get_next() methods. + + GstMeta *current = NULL; + + /* passing NULL gives the first entry */ + current = gst_buffer_meta_get_next (buffer, current); + + /* passing a GstMeta returns the next */ + current = gst_buffer_meta_get_next (buffer, current); + + +Memory management +~~~~~~~~~~~~~~~~~ + +* allocation + + We initially allocate a reasonable sized GstBuffer structure (say 512 bytes). + + Since the complete buffer structure, including a large area for metadata, is + allocated in one go, we can reduce the number of memory allocations while still + providing dynamic metadata. + + When adding metadata, we need to call the init function of the associated + metadata info structure. Since adding the metadata requires the caller to pass + a handle to the info, this operation does not require table lookups. + + Per-metadata memory initialisation is needed because not all metadata is + initialized in the same way. We need to, for example, set the timestamps to + NONE in the MetaTiming structures. + + The init/free functions can also be used to implement refcounting for a metadata + structure. This can be useful when a structure is shared between buffers. + + When the free_size of the GstBuffer is exhausted, we will allocate new memory + for each newly added Meta and use the next pointers to point to this. It + is expected that this does not occur often and we might be able to optimize + this transparently in the future. + +* free + + When a GstBuffer is freed, we potentially might have to call a custom free + function on the metadata info. In the case of the Memory metadata, we need to + call the associated free function to free the memory. + + When freeing a GstBuffer, the custom buffer free function will iterate all of + the metadata in the buffer and call the associated free functions in the + MetaInfo associated with the entries. Usually, this function will be NULL. + + +Serialization +~~~~~~~~~~~~~ + +When buffer should be sent over the wire or be serialized in GDP, we need a way +to perform custom serialization and deserialization on the metadata. + +for this we can use the GValue transform functions. + + +Transformations +~~~~~~~~~~~~~~~ + +After certain transformations, the metadata on a buffer might not be relevant +anymore. + +Consider, for example, metadata that lists certain regions of interest +on the video data. If the video is scaled or rotated, the coordinates might not +make sense anymore. A transform element should be able to adjust or remove the +associated metadata when it becomes invalid. + +We can make the transform element aware of the metadata so that it can adjust or +remove in an intelligent way. Since we allow arbitrary metadata, we can't do +this for all metadata and thus we need some other way. + +One proposition is to tag the metadata type with keywords that specify what it +functionally refers too. We could, for example, tag the metadata for the regions +of interest with a tag that notes that the metadata refers to absolute pixel +positions. A transform could then know that the metadata is not valid anymore +when the position of the pixels changed (due to rotation, flipping, scaling and +so on). + + +Subbuffers +~~~~~~~~~~ + +Subbuffers are implemented with a generic copy. Parameters to the copy +are the offset and size. This allows each metadata structure to implement the +actions needed to update the metadata of the subbuffer. + +It might not make sense for some metadata to work with subbuffers. For example +when we take a subbuffer of a buffer with a video frame, the GstMetaVideo +simply becomes invalid and is removed from the new subbuffer. + + +Relationship with GstCaps +~~~~~~~~~~~~~~~~~~~~~~~~~ + +The difference between GstCaps, used in negotiation, and the metadata is not +clearly defined. + +We would like to think of the GstCaps containing the information needed to +functionally negotiate the format between two elements. The Metadata should then +only contain variables that can change between each buffer. + +For example, for video we would have width/height/framerate in the caps but then +have the more technical details, such as stride, data pointers, pan/crop/zoom +etc in the metadata. + +A scheme like this would still allow us to functionally specify the desired +video resolution while the implementation details would be inside the metadata. + +Relationship with GstMiniObject qdata +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +qdata on a miniobject is element private and is not visible to other element. +Therefore qdata never contains essential information that describes the buffer +content. + + +Compatibility +~~~~~~~~~~~~~ + +We need to make sure that elements exchange metadata that they both understand, +This is particulary important when the metadata describes the data layout in +memory (such as strides). + +The ALLOCATION query is used to let upstream know what metadata we can suport. + +It is also possible to have a bufferpool add certain metadata to the buffers +from the pool. This feature is activated by enabling a buffer option when +configuring the pool. + + +Notes +~~~~~ + +Some structures that we need to be able to add to buffers. + +* Clean Aperture +* Arbitrary Matrix Transform +* Aspect ratio +* Pan/crop/zoom +* Video strides + +Some of these overlap, we need to find a minimal set of metadata structures that +allows us to define all use cases. diff --git a/docs/design/part-miniobject.txt b/docs/design/part-miniobject.txt new file mode 100644 index 0000000..8c04780 --- /dev/null +++ b/docs/design/part-miniobject.txt @@ -0,0 +1,209 @@ +GstMiniObject +------------- + +This document describes the design of the miniobject base class. + +The miniobject abstract base class is used to construct lightweight refcounted +and boxed types that are frequently created and destroyed. + +Requirements +~~~~~~~~~~~~ + + - Be lightweight + - Refcounted + - I must be possible to control access to the object, ie. when the object is + readable and writable. + - Subclasses must be able to use their own allocator for the memory. + + +Usage +~~~~~ + +Users of the GstMiniObject infrastructure will need to define a structure that +includes the GstMiniObject structure as the first field. + + struct { + GstMiniObject mini_object; + + /* my fields */ + ... + } MyObject + +The subclass should then implement a constructor method where it allocates the +memory for its structure and initializes the miniobject structure with +gst_mini_object_init(). Copy and Free functions are provided to the +gst_mini_object_init() function. + + MyObject * + my_object_new() + { + MyObject *res = g_slice_new (MyObject); + + gst_mini_object_init (GST_MINI_OBJECT_CAST (res), 0, + MY_TYPE_OBJECT, + (GstMiniObjectCopyFunction) _my_object_copy, + (GstMiniObjectDisposeFunction) NULL, + (GstMiniObjectFreeFunction) _my_object_free); + + /* other init */ + ..... + + return res; + } + +The Free function is responsible for freeing the allocated memory for +the structure. + + static void + _my_object_free (MyObject *obj) + { + /* other cleanup */ + ... + + g_slice_free (MyObject, obj); + } + + +Lifecycle +~~~~~~~~~ + +GstMiniObject is refcounted. When a GstMiniObject is first created, +it has a refcount of 1. + +Each variable holding a reference to a GstMiniObject is responsible for +updating the refcount. This includes incrementing the refcount with +gst_mini_object_ref() when a reference is kept to a miniobject or +gst_mini_object_unref() when a reference is released. + +When the refcount reaches 0, and thus no objects hold a reference to the +miniobject anymore, we can free the miniobject. + +When freeing the miniobject, first the GstMiniObjectDisposeFunction is called. +This function is allowed to revive the object again by incrementing the +refcount, in which case it should return FALSE from the dispose function. The +dispose function is used by GstBuffer to revive the buffer back into the +GstBufferPool when needed. + +When the dispose function returns TRUE, the GstMiniObjectFreeFunction will be +called and the miniobject will be freed. + + +Copy +~~~~ + +A miniobject can be copied with gst_mini_object_copy(). This function will +call the custom copy function that was provided when registering the new +GstMiniObject subclass. + +The copy function should try to preserve as much info from the original object +as possible. + +The new copy should be writable. + + +Access management +~~~~~~~~~~~~~~~~~ + +GstMiniObject can be shared between multiple threads. It is important that when +a thread writes to a GstMiniObject that the other threads don't not see the +changes. + +To avoid exposing changes from one thread to another thread, the miniobjects +are managed in a Copy-On-Write way. A copy is only made when it is known that +the object is shared between multiple objects or threads. + +There are 2 methods implemented for controlling access to the miniobject. + + - A first method relies on the refcount of the object to control writability. + Objects using this method have the LOCKABLE flag unset. + + - A second method relies on a separate counter for controlling + the access to the object. Objects using this method have the LOCKABLE flag + set. + + You can check if an object is writable with gst_mini_object_is_writable() and + you can make any miniobject writable with gst_mini_object_make_writable(). + This will create a writable copy when the object was not writable. + + + non-LOCKABLE GstMiniObjects + --------------------------- + + These GstMiniObjects have the LOCKABLE flag unset. They use the refcount value + to control writability of the object. + + When the refcount of the miniobject is > 1, the objects it referenced by at + least 2 objects and is thus considered unwritable. A copy must be made before a + modification to the object can be done. + + Using the refcount to control writability is problematic for many language + bindings that can keep additional references to the objects. This method is + mainly for historical reasons until all users of the miniobjects are + converted to use the LOCAKBLE flag. + + + LOCKABLE GstMiniObjects + ----------------------- + + These GstMiniObjects have the LOCKABLE flag set. They use a separate counter + for controlling writability and access to the object. + + It consists of 2 components: + + * exclusive counter + + Each object that wants to keep a reference to a GstMiniObject and doesn't want to + see the changes from other owners of the same GstMiniObject needs to lock the + GstMiniObject in EXCLUSIVE mode, which will increase the exclusive counter. + + The exclusive counter counts the amount of objects that share this + GstMiniObject. The counter is initially 0, meaning that the object is not shared with + any object. + + When a reference to a GstMiniObject release, both the ref count and the + exclusive counter will be decreased with gst_mini_object_unref() and + gst_mini_object_unlock () respectively. + + * locking + + All read and write access must be performed between a gst_mini_object_lock() and + gst_mini_object_unlock() pair with the requested access method. + + A gst_mini_object_lock() can fail when a WRITE lock is requested and the exclusive + counter is > 1. Indeed a GstMiniObject object with an exclusive counter > 1 is + locked EXCLUSIVELY by at least 2 objects and is therefore not writable. + + Once the GstMiniObject is locked with a certain access mode, it can be recursively + locked with the same or narrower access mode. For example, first locking the + GstMiniObject in READWRITE mode allows you to recusively lock the + GstMiniObject in + READWRITE, READ and WRITE mode. Memory locked in READ mode cannot be locked + recursively in WRITE or READWRITE mode. + + Note that multiple threads can READ lock the GstMiniObject concurrently but cannot + lock the object in WRITE mode because the exclusive counter must be > 1. + + All calls to gst_mini_object_lock() need to be paired with one + gst_mini_object_unlock() call with the same access mode. When the last refcount + of the object is removed, there should be no more outstanding locks. + + Note that a shared counter of both 0 and 1 leaves the GstMiniObject writable. The + reason is to make it easy to create and pass ownership of the GstMiniObject to + another object while keeping it writable. When the GstMiniObject is + created with a shared count of 0, it is writable. When the GstMiniObject is then + added to another object, the shared count is incremented to 1 and the + GstMiniObject remains writable. The 0 share counter has a similar purpose as the floating + reference in GObject. + + +Weak references +~~~~~~~~~~~~~~~ + +GstMiniObject has support for weak references. A callback will be called when +the object is freed for all registered weak references. + + +QData +~~~~~ + +Extra data can be associated with a GstMiniObject by using the QData API. diff --git a/docs/design/part-probes.txt b/docs/design/part-probes.txt new file mode 100644 index 0000000..d6234ea --- /dev/null +++ b/docs/design/part-probes.txt @@ -0,0 +1,362 @@ +Probes +------ + + Probes are callbacks that can be installed by the application and will notify + the application about the states of the dataflow. + + +Requirements +------------ + +Applications should be able to monitor and control the dataflow on pads. We +identify the following types: + + - be notified when the pad is/becomes idle and make sure the pad stays idle. + This is essential to be able to implement dynamic relinking of elements + without breaking the dataflow. + + - be notified when data, events or queries are pushed or sent on a pad. It + should also be possible to inspect and modify the data. + + - be able to drop, pass and block on data based on the result of the callback. + + - be able to drop, pass data on blocking pads based on methods performed by + the application thread. + + +Overview +-------- + + The function gst_pad_add_probe() is used to add a probe to a pad. It accepts a + probe type mask and a callback. + + gulong gst_pad_add_probe (GstPad *pad, + GstPadProbeType mask, + GstPadProbeCallback callback, + gpointer user_data, + GDestroyNotify destroy_data); + + The function returns a gulong that uniquely identifies the probe and that can + be used to remove the probe with gst_pad_remove_probe(): + + void gst_pad_remove_probe (GstPad *pad, gulong id); + + The mask parameter is a bitwise or of the following flags: + + typedef enum + { + GST_PAD_PROBE_TYPE_INVALID = 0, + + /* flags to control blocking */ + GST_PAD_PROBE_TYPE_IDLE = (1 << 0), + GST_PAD_PROBE_TYPE_BLOCK = (1 << 1), + + /* flags to select datatypes */ + GST_PAD_PROBE_TYPE_BUFFER = (1 << 4), + GST_PAD_PROBE_TYPE_BUFFER_LIST = (1 << 5), + GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM = (1 << 6), + GST_PAD_PROBE_TYPE_EVENT_UPSTREAM = (1 << 7), + GST_PAD_PROBE_TYPE_EVENT_FLUSH = (1 << 8), + GST_PAD_PROBE_TYPE_QUERY_DOWNSTREAM = (1 << 9), + GST_PAD_PROBE_TYPE_QUERY_UPSTREAM = (1 << 10), + + /* flags to select scheduling mode */ + GST_PAD_PROBE_TYPE_PUSH = (1 << 12), + GST_PAD_PROBE_TYPE_PULL = (1 << 13), + + } GstPadProbeType; + + When adding a probe with the IDLE or BLOCK flag, the probe will become a + blocking probe (see below). Otherwise the probe will be a DATA probe. + + The datatype and scheduling selector flags are used to select what kind of + datatypes and scheduling modes should be allowed in the callback. + + The blocking flags must match the triggered probe exactly. + + The probe callback is defined as: + + GstPadProbeReturn (*GstPadProbeCallback) (GstPad *pad, GstPadProbeInfo *info, + gpointer user_data); + + A probe info structure is passed as an argument and its type is guaranteed + to match the mask that was used to register the callback. The data item in the + info contains type specific data, which is usually the data item that is blocked + or NULL when no data item is present. + + The probe can return any of the following return values: + + typedef enum + { + GST_PAD_PROBE_DROP, + GST_PAD_PROBE_OK, + GST_PAD_PROBE_REMOVE, + GST_PAD_PROBE_PASS, + } GstPadProbeReturn; + + GST_PAD_PROBE_OK is the normal return value. DROP will drop the item that is + currently being probed. GST_PAD_PROBE_REMOVE the currently executing probe from the + list of probes. + + GST_PAD_PROBE_PASS is relevant for blocking probes and will temporarily unblock the + pad and let the item trough, it will then block again on the next item. + + +Blocking probes +--------------- + + Blocking probes are probes with BLOCK or IDLE flags set. They will always + block the dataflow and trigger the callback according to the following rules: + + When the IDLE flag is set, the probe callback is called as soon as no data is + flowing over the pad. If at the time of probe registration, the pad is idle, + the callback will be called immediately from the current thread. Otherwise, + the callback will be called as soon as the pad becomes idle in the streaming + thread. + + The IDLE probe is useful to perform dynamic linking, it allows to wait for for + a safe moment when an unlink/link operation can be done. Since the probe is a + blocking probe, it will also make sure that the pad stays idle until the probe + is removed. + + When the BLOCK flag is set, the probe callback will be called when new data + arrives on the pad and right before the pad goes into the blocking state. This + callback is thus only called when there is new data on the pad. + + The blocking probe is removed with gst_pad_remove_probe() or when the probe + callback return GST_PAD_PROBE_REMOVE. In both cases, and if this was the last + blocking probe on the pad, the pad is unblocked and dataflow can continue. + + +Non-Blocking probes +-------------------- + + Non-blocking probes or DATA probes are probes triggered when data is flowing + over the pad. The are called after the blocking probes are run and always with + data. + + +Push dataflow +------------- + +Push probes have the GST_PAD_PROBE_TYPE_PUSH flag set in the callbacks. + +In push based scheduling, the blocking probe is called first with the data item. +Then the data probes are called before the peer pad chain or event function is +called. + +The data probes are called before the peer pad is checked. This allows for +linking the pad in either the BLOCK or DATA probes on the pad. + +Before the peerpad chain or event function is called, the peer pad block and +data probes are called. + +Finally, the IDLE probe is called on the pad after the data was sent to the +peer pad. + +The push dataflow probe behavior is the same for buffers and bidirectional events. + + + pad peerpad + | | + gst_pad_push() / | | + gst_pad_push_event() | | + -------------------->O | + O | + flushing? O | + FLUSHING O | + < - - - - - - O | + O-> do BLOCK probes | + O | + O-> do DATA probes | + no peer? O | + NOT_LINKED O | + < - - - - - - O | + O gst_pad_chain() / | + O gst_pad_send_event() | + O------------------------------>O + O flushing? O + O FLUSHING O + O< - - - - - - - - - - - - - - -O + O O-> do BLOCK probes + O O + O O-> do DATA probes + O O + O O---> chainfunc / + O O eventfunc + O< - - - - - - - - - - - - - - -O + O | + O-> do IDLE probes | + O | + < - - - - - - O | + | | + + +Pull dataflow +------------- + +Pull probes have the GST_PAD_PROBE_TYPE_PULL flag set in the callbacks. + +The gst_pad_pull_range() call will first trigger the BLOCK probes without a DATA +item. This allows the pad to be linked before the peer pad is resolved. It also +allows the callback to set a data item in the probe info. + +After the blocking probe and the getrange function is called on the peer pad +and there is a data item, the DATA probes are called. + +When control returns to the sinkpad, the IDLE callbacks are called. The IDLE +callback is called without a data item so that it will also be called when there +was an error. + +If there is a valid DATA item, the DATA probes are called for the item. + + + srcpad sinkpad + | | + | | gst_pad_pull_range() + | O<--------------------- + | O + | O flushing? + | O FLUSHING + | O - - - - - - - - - - > + | do BLOCK probes <-O + | O no peer? + | O NOT_LINKED + | O - - - - - - - - - - > + | gst_pad_get_range() O + O<------------------------------O + O O + O flushing? O + O FLUSHING O + O- - - - - - - - - - - - - - - >O + do BLOCK probes <-O O + O O + getrangefunc <---O O + O flow error? O + O- - - - - - - - - - - - - - - >O + O O + do DATA probes <-O O + O- - - - - - - - - - - - - - - >O + | O + | do IDLE probes <-O + | O flow error? + | O - - - - - - - - - - > + | O + | do DATA probes <-O + | O - - - - - - - - - - > + | | + + +Queries +------- + +Query probes have the GST_PAD_PROBE_TYPE_QUERY_* flag set in the callbacks. + + + pad peerpad + | | + gst_pad_peer_query() | | + -------------------->O | + O | + O-> do BLOCK probes | + O | + O-> do QUERY | PUSH probes | + no peer? O | + FALSE O | + < - - - - - - O | + O gst_pad_query() | + O------------------------------>O + O O-> do BLOCK probes + O O + O O-> do QUERY | PUSH probes + O O + O O---> queryfunc + O error O + <- - - - - - - - - - - - - - - - - - - - - - -O + O O + O O-> do QUERY | PULL probes + O< - - - - - - - - - - - - - - -O + O | + O-> do QUERY | PULL probes | + O | + < - - - - - - O | + | | + +For queries, the PUSH ProbeType is set when the query is traveling to the object +that will answer the query and the PULL type is set when the query contains the +answer. + +Use-cases +--------- + +Prerolling a partial pipeline +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + .---------. .---------. .----------. + | filesrc | | demuxer | .-----. | decoder1 | + | src -> sink src1 ->|queue|-> sink src + '---------' | | '-----' '----------' X + | | .----------. + | | .-----. | decoder2 | + | src2 ->|queue|-> sink src + '---------' '-----' '----------' X + + +The purpose is to create the pipeline dynamically up to the +decoders but not yet connect them to a sink and without losing +any data. + +To do this, the source pads of the decoders is blocked so that no +events or buffers can escape and we don't interrupt the stream. + +When all of the dynamic pad are created (no-more-pads emited by the +branching point, ie, the demuxer or the queues filled) and the pads +are blocked (blocked callback received) the pipeline is completely +prerolled. + +It should then be possible to perform the following actions on the +prerolled pipeline: + +- query duration/position +- perform a flushing seek to preroll a new position +- connect other elements and unblock the blocked pads. + + +dynamically switching an element in a PLAYING pipeline +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + + .----------. .----------. .----------. + | element1 | | element2 | | element3 | + ... src -> sink src -> sink ... + '----------' '----------' '----------' + .----------. + | element4 | + sink src + '----------' + +The purpose is to replace element2 with element4 in the PLAYING +pipeline. + + 1) block element1 src pad. + 2) inside the block callback nothing is flowing between + element1 and element2 and nothing will flow until unblocked. + 3) unlink element1 and element2 + 4) optional step: make sure data is flushed out of element2: + 4a) pad event probe on element2 src + 4b) send EOS to element2, this makes sure that element2 flushes + out the last bits of data it holds. + 4c) wait for EOS to appear in the probe, drop the EOS. + 4d) remove the EOS pad event probe. + 5) unlink element2 and element3 + 5a) optionally element2 can now be set to NULL and/or removed from the + pipeline. + 6) link element4 and element3 + 7) link element1 and element4 + 8) make sure element4 is in the same state as the rest of the elements. The + element should at least be PAUSED. + 9) unblock element1 src + +The same flow can be used to replace an element in a PAUSED pipeline. Of +course in a PAUSED pipeline there might not be dataflow so the block might +not immediately happen. diff --git a/docs/design/part-progress.txt b/docs/design/part-progress.txt new file mode 100644 index 0000000..2b05614 --- /dev/null +++ b/docs/design/part-progress.txt @@ -0,0 +1,234 @@ +Progress Reporting +------------------ + +This document describes the design and use cases for the progress reporting +messages. + +PROGRESS messages are posted on the bus to inform the application about the +progress of asynchronous operations in the pipeline. This should not be confused +with asynchronous state changes. + +We accommodate for the following requirements: + + - Application is informed when an async operation starts and completes. + - It should be possible for the application to generically detect common + operations and incorporate their progress into the GUI. + - Applications can cancel pending operations by doing regular state changes. + - Applications should be able to wait for completion of async operations. + +We allow for the following scenarios: + + - Elements want to inform the application about asynchronous DNS lookups and + pending network requests. This includes starting and completing the lookup. + - Elements opening devices and resources asynchronously. + - Applications having more freedom to implement timeout and cancelation of + operations that currently block the state changes or happen invisibly behind + the scenes. + + +Rationale +~~~~~~~~~ + +The main reason for adding these extra progress notifications is twofold: + + 1) to give the application more information of what is going on + + When there are well defined progress information codes, applications + can let the user know about the status of the progress. We anticipate to + have at least DNS resolving and server connections and requests be well + defined. + + 2) To make the state changes non-blocking and cancelable. + + Currently state changes such as going to the READY or PAUSED state often do + blocking calls such as resolving DNS or connecting to a remote server. These + operations often block the main thread and are often not cancelable, causing + application lockups. + + We would like to make the state change function, instead, start a separate + thread that performs the blocking operations in a cancelable way. When going + back to the NULL state, all pending operations would be canceled immediately. + + For downward state changes, we want to let the application implement its own + timeout mechanism. For example: when stopping an RTSP stream, the clients + needs to send a TEARDOWN request to the server. This can however take an + unlimited amount of time in case of network problems. We want to give the + application an opportunity to wait (and timeout) for the completion of the + async operation before setting the element to the final NULL state. + +Progress updates are very similar to buffering messages in the same way that the +application can decide to wait for the completion of the buffering process +before performing the next state change. It might make sense to implement +buffering with the progress messages in the future. + + +Async state changes +~~~~~~~~~~~~~~~~~~~ + +GStreamer currently has a GST_STATE_CHANGE_ASYNC return value to note to the +application that a state change is happening asynchronously. + +The main purpose of this return value is to make the pipeline wait for preroll +and delay a future (upwards) state changes until the sinks are prerolled. + +In the case of async operations on source, this will automatically force sinks +to stay async because they will not preroll before the source can produce data. + +The fact that other asynchronous operations happen behind the scenes is +irrelevant for the prerolling process so it is not implemented with the ASYNC +state change return value in order to not complicate the state changes and mix +concepts. + + +Use cases +~~~~~~~~~ + + * RTSP client (but also HTTP, MMS, ...) + + When the client goes from the READY to the PAUSED state, it opens a socket, + performs a DNS lookup, retrieves the SDP and negotiates the streams. All these + operations currently block the state change function for an indefinite amount + of time and while they are blocking cannot be canceled. + + Instead, a thread would be started to perform these operations asynchronously + and the state change would complete with the usual NO_PREROLL return value. + Before starting the thread a PROGRESS message would be posted to mark the + start of the async operation. + + As the DNS lookup completes and the connection is established, PROGRESS + messages are posted on the bus to inform the application of the progress. When + something fails, an error is posted and a PROGRESS CANCELED message is posted. + The application can then stop the pipeline. + + If there are no errors and the setup of the streams completed successfully, a + PROGRESS COMPLETED is posted on the bus. The thread then goes to sleep and the + asynchronous operation completed. + + The RTSP protocol requires to send a TEARDOWN request to the server + before closing the connection and destroying the socket. A state change to the + READY state will issue the TEARDOWN request in the background and notify the + application of this pending request with a PROGRESS message. + + The application might want to only go to the NULL state after it got confirmation + that the TEARDOWN request completed or it might choose to go to NULL after a + timeout. It might also be possible that the application just want to close the + socket as fast as possible without waiting for completion of the TEARDOWN request. + + * Network performance measuring + + DNS lookup and connection times can be measured by calculating the elapsed + time between the various PROGRESS messages. + + + +Messages +~~~~~~~~ + + A new PROGRESS message will be created. + The following fields will be contained in the message: + + - "type", GST_TYPE_PROGRESS_TYPE + + - a set of types to define the type of progress + + GST_PROGRESS_TYPE_START: A new task is started in the background + GST_PROGRESS_TYPE_CONTINUE: The previous tasks completed and a new + one continues. This is done so that the application can follow + a set of continuous tasks and react to COMPLETE only when the + element completely finished. + GST_PROGRESS_TYPE_CANCELED: A task is canceled by the user. + GST_PROGRESS_TYPE_ERROR: A task stopped because of an error. In case of + an error, an error message will have been posted before. + GST_PROGRESS_TYPE_COMPLETE: A task completed successfully. + + - "code", G_TYPE_STRING + + A generic extensible string that can be used to programatically determine the + action that is in progress. Some standard predefined codes will be + defined. + + - "text", G_TYPE_STRING + + A user visible string detailing the action. + + - "percent", G_TYPE_INT between 0 and 100 + + Progress of the action as a percentage, the following values are allowed: + - GST_PROGRESS_TYPE_START always has a 0% value. + - GST_PROGRESS_TYPE_CONTINUE have a value between 0 and 100 + - GST_PROGRESS_TYPE_CANCELED, GST_PROGRESS_TYPE_ERROR and + GST_PROGRESS_TYPE_COMPLETE always have a 100% value. + + - "timeout", G_TYPE_INT in milliseconds + + The timeout of the async operation. -1 if unknown/unlimited.. + This field can be interesting to the application when it wants to display + some sort of progress indication. + + - .... + + Depending on the code, more fields can be put here. + + +Implementation +~~~~~~~~~~~~~~ + +Elements should not do blocking operations from the state change function. +Instead, elements should post an appropriate progress message with the right +code and of type GST_PROGRESS_TYPE_START and then start a thread to perform +the blocking calls in a cancelable manner. + +It is highly recommended to only start async operations from the READY to PAUSED +state and onwards and not from the NULL to READY state. The reason for this is +that streaming threads are usually started in the READY to PAUSED state and that +the current NULL to READY state change is used to perform a blocking check for +the presence of devices. + +The progress message needs to be posted from the state change function so that +the application can immediately take appropriate action after setting the state. + +The threads will usually perform many blocking calls with different codes +in a row, a client might first do a DNS query and then continue with +establishing a connection to the server. For this purpose the +GST_PROGRESS_TYPE_CONTINUE must be used. + +Usually, the thread used to perform the blocking operations can be used to +implement the streaming threads when needed. + +Upon downward state changes, operations that are busy in the thread are canceled +and GST_PROGRESS_TYPE_CANCELED is posted. + +The application can know about pending tasks because they received the +GST_PROGRESS_TYPE_START messages that didn't complete with a +GST_PROGRESS_TYPE_COMPLETE message, got canceled with a +GST_PROGRESS_TYPE_CANCELED or errored with GST_PROGRESS_TYPE_ERROR. +Applications should be able to choose if they wait for the pending +operation or cancel them. + +If an async operation fails, an error message is posted first before the +GST_PROGRESS_TYPE_ERROR progress message. + + +Categories +~~~~~~~~~~ + + We want to propose some standard codes here: + + "open" : A resource is being opened + "close" : A resource is being closed + + "name-lookup" : A DNS lookup. + + "connect" : A socket connection is established + + "disconnect" : a socket connection is closed + + "request" : A request is sent to a server and we are waiting for a + reply. This message is posted right before the request is sent + and completed when the reply has arrived completely. + + "mount" : A volume is being mounted + + "unmount" : A volume is being unmounted + + More codes can be posted by elements and can be made official later. diff --git a/docs/faq/Makefile.in b/docs/faq/Makefile.in index bfacb3e..69c10e5 100644 --- a/docs/faq/Makefile.in +++ b/docs/faq/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.14 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. diff --git a/docs/gst/Makefile.in b/docs/gst/Makefile.in index 7088e58..a43f48a 100644 --- a/docs/gst/Makefile.in +++ b/docs/gst/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.14 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. diff --git a/docs/gst/html/annotation-glossary.html b/docs/gst/html/annotation-glossary.html index 841e0a1..18eebe6 100644 --- a/docs/gst/html/annotation-glossary.html +++ b/docs/gst/html/annotation-glossary.html @@ -22,84 +22,87 @@ <tr><td colspan="5" class="shortcuts"> <a class="shortcut" href="#glsT">T</a> | - <a class="shortcut" href="#glsS">S</a> + <a class="shortcut" href="#glsA">A</a> | - <a class="shortcut" href="#glsO">O</a> + <a class="shortcut" href="#glsC">C</a> | <a class="shortcut" href="#glsT">T</a> | - <a class="shortcut" href="#glsI">I</a> + <a class="shortcut" href="#glsS">S</a> | - <a class="shortcut" href="#glsT">T</a> + <a class="shortcut" href="#glsO">O</a> + | + <a class="shortcut" href="#glsI">I</a> | <a class="shortcut" href="#glsO">O</a> | + <a class="shortcut" href="#glsA">A</a> + | + <a class="shortcut" href="#glsE">E</a> + | <a class="shortcut" href="#glsS">S</a> | - <a class="shortcut" href="#glsC">C</a> + <a class="shortcut" href="#glsT">T</a> | <a class="shortcut" href="#glsO">O</a> | <a class="shortcut" href="#glsI">I</a> | - <a class="shortcut" href="#glsA">A</a> - | - <a class="shortcut" href="#glsE">E</a> - | - <a class="shortcut" href="#glsA">A</a> + <a class="shortcut" href="#glsT">T</a> </td></tr> </table> <div class="glossary"> <div class="titlepage"><div><div><h1 class="title"> <a name="annotation-glossary"></a>Annotation Glossary</h1></div></div></div> <a name="glsT"></a><h3 class="title">T</h3> +<dt><span class="glossterm"><a name="annotation-glossterm-transfer%20full"></a>transfer full</span></dt> +<dd class="glossdef"><p>Free data after the code is done.</p></dd> +<a name="glsA"></a><h3 class="title">A</h3> +<dt><span class="glossterm"><a name="annotation-glossterm-allow-none"></a>allow-none</span></dt> +<dd class="glossdef"><p>NULL is ok, both for passing and for returning.</p></dd> +<a name="glsC"></a><h3 class="title">C</h3> +<dt><span class="glossterm"><a name="annotation-glossterm-closure"></a>closure</span></dt> +<dd class="glossdef"><p>This parameter is a 'user_data', for callbacks; many bindings can pass NULL here.</p></dd> +<a name="glsT"></a><h3 class="title">T</h3> <dt><span class="glossterm"><a name="annotation-glossterm-transfer%20floating"></a>transfer floating</span></dt> <dd class="glossdef"><p>Alias for <acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>, used for objects with floating refs.</p></dd> +<dt><span class="glossterm"><a name="annotation-glossterm-transfer%20container"></a>transfer container</span></dt> +<dd class="glossdef"><p>Free data container after the code is done.</p></dd> <a name="glsS"></a><h3 class="title">S</h3> -<dt><span class="glossterm"><a name="annotation-glossterm-scope%20call"></a>scope call</span></dt> -<dd class="glossdef"><p>The callback is valid only during the call to the method.</p></dd> +<dt><span class="glossterm"><a name="annotation-glossterm-skip"></a>skip</span></dt> +<dd class="glossdef"><p>Exposed in C code, not necessarily available in other languages.</p></dd> +<dt><span class="glossterm"><a name="annotation-glossterm-scope%20async"></a>scope async</span></dt> +<dd class="glossdef"><p>The callback is valid until first called.</p></dd> <a name="glsO"></a><h3 class="title">O</h3> -<dt><span class="glossterm"><a name="annotation-glossterm-out%20callee-allocates"></a>out callee-allocates</span></dt> +<dt><span class="glossterm"><a name="annotation-glossterm-out%20caller-allocates"></a>out caller-allocates</span></dt> <dd class="glossdef"><p>Out parameter, where caller must allocate storage.</p></dd> -<a name="glsT"></a><h3 class="title">T</h3> -<dt><span class="glossterm"><a name="annotation-glossterm-transfer%20container"></a>transfer container</span></dt> -<dd class="glossdef"><p>Free data container after the code is done.</p></dd> -<dt><span class="glossterm"><a name="annotation-glossterm-type"></a>type</span></dt> -<dd class="glossdef"><p>Override the parsed C type with given type.</p></dd> -<dt><span class="glossterm"><a name="annotation-glossterm-transfer%20full"></a>transfer full</span></dt> -<dd class="glossdef"><p>Free data after the code is done.</p></dd> <a name="glsI"></a><h3 class="title">I</h3> <dt><span class="glossterm"><a name="annotation-glossterm-inout"></a>inout</span></dt> <dd class="glossdef"><p>Parameter for input and for returning results. Default is <acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>.</p></dd> -<a name="glsT"></a><h3 class="title">T</h3> -<dt><span class="glossterm"><a name="annotation-glossterm-transfer%20none"></a>transfer none</span></dt> -<dd class="glossdef"><p>Don't free data after the code is done.</p></dd> <a name="glsO"></a><h3 class="title">O</h3> <dt><span class="glossterm"><a name="annotation-glossterm-out"></a>out</span></dt> <dd class="glossdef"><p>Parameter for returning results. Default is <acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>.</p></dd> +<a name="glsA"></a><h3 class="title">A</h3> +<dt><span class="glossterm"><a name="annotation-glossterm-array"></a>array</span></dt> +<dd class="glossdef"><p>Parameter points to an array of items.</p></dd> +<a name="glsE"></a><h3 class="title">E</h3> +<dt><span class="glossterm"><a name="annotation-glossterm-element-type"></a>element-type</span></dt> +<dd class="glossdef"><p>Generics and defining elements of containers and arrays.</p></dd> <a name="glsS"></a><h3 class="title">S</h3> -<dt><span class="glossterm"><a name="annotation-glossterm-scope%20async"></a>scope async</span></dt> -<dd class="glossdef"><p>The callback is valid until first called.</p></dd> -<dt><span class="glossterm"><a name="annotation-glossterm-skip"></a>skip</span></dt> -<dd class="glossdef"><p>Exposed in C code, not necessarily available in other languages.</p></dd> -<a name="glsC"></a><h3 class="title">C</h3> -<dt><span class="glossterm"><a name="annotation-glossterm-closure"></a>closure</span></dt> -<dd class="glossdef"><p>This parameter is a 'user_data', for callbacks; many bindings can pass NULL here.</p></dd> +<dt><span class="glossterm"><a name="annotation-glossterm-scope%20call"></a>scope call</span></dt> +<dd class="glossdef"><p>The callback is valid only during the call to the method.</p></dd> +<a name="glsT"></a><h3 class="title">T</h3> +<dt><span class="glossterm"><a name="annotation-glossterm-transfer%20none"></a>transfer none</span></dt> +<dd class="glossdef"><p>Don't free data after the code is done.</p></dd> <a name="glsO"></a><h3 class="title">O</h3> -<dt><span class="glossterm"><a name="annotation-glossterm-out%20caller-allocates"></a>out caller-allocates</span></dt> +<dt><span class="glossterm"><a name="annotation-glossterm-out%20callee-allocates"></a>out callee-allocates</span></dt> <dd class="glossdef"><p>Out parameter, where caller must allocate storage.</p></dd> <a name="glsI"></a><h3 class="title">I</h3> <dt><span class="glossterm"><a name="annotation-glossterm-in"></a>in</span></dt> <dd class="glossdef"><p>Parameter for input. Default is <acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>.</p></dd> -<a name="glsA"></a><h3 class="title">A</h3> -<dt><span class="glossterm"><a name="annotation-glossterm-allow-none"></a>allow-none</span></dt> -<dd class="glossdef"><p>NULL is ok, both for passing and for returning.</p></dd> -<a name="glsE"></a><h3 class="title">E</h3> -<dt><span class="glossterm"><a name="annotation-glossterm-element-type"></a>element-type</span></dt> -<dd class="glossdef"><p>Generics and defining elements of containers and arrays.</p></dd> -<a name="glsA"></a><h3 class="title">A</h3> -<dt><span class="glossterm"><a name="annotation-glossterm-array"></a>array</span></dt> -<dd class="glossdef"><p>Parameter points to an array of items.</p></dd> +<a name="glsT"></a><h3 class="title">T</h3> +<dt><span class="glossterm"><a name="annotation-glossterm-type"></a>type</span></dt> +<dd class="glossdef"><p>Override the parsed C type with given type.</p></dd> </div> <div class="footer"> <hr> diff --git a/docs/gst/html/api-index-full.html b/docs/gst/html/api-index-full.html index 49233c3..e4e74d8 100644 --- a/docs/gst/html/api-index-full.html +++ b/docs/gst/html/api-index-full.html @@ -1746,19 +1746,19 @@ </dt> <dd></dd> <dt> -<a class="link" href="gstreamer-GstInfo.html#gst-debug-bin-to-dot-file" title="gst_debug_bin_to_dot_file ()">gst_debug_bin_to_dot_file</a>, function in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a> +<a class="link" href="gstreamer-GstInfo.html#GST-DEBUG-BIN-TO-DOT-FILE:CAPS" title="GST_DEBUG_BIN_TO_DOT_FILE()">GST_DEBUG_BIN_TO_DOT_FILE</a>, macro in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a> </dt> <dd></dd> <dt> -<a class="link" href="gstreamer-GstInfo.html#GST-DEBUG-BIN-TO-DOT-FILE:CAPS" title="GST_DEBUG_BIN_TO_DOT_FILE()">GST_DEBUG_BIN_TO_DOT_FILE</a>, macro in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a> +<a class="link" href="gstreamer-GstInfo.html#gst-debug-bin-to-dot-file" title="gst_debug_bin_to_dot_file ()">gst_debug_bin_to_dot_file</a>, function in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a> </dt> <dd></dd> <dt> -<a class="link" href="gstreamer-GstInfo.html#GST-DEBUG-BIN-TO-DOT-FILE-WITH-TS:CAPS" title="GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS()">GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS</a>, macro in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a> +<a class="link" href="gstreamer-GstInfo.html#gst-debug-bin-to-dot-file-with-ts" title="gst_debug_bin_to_dot_file_with_ts ()">gst_debug_bin_to_dot_file_with_ts</a>, function in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a> </dt> <dd></dd> <dt> -<a class="link" href="gstreamer-GstInfo.html#gst-debug-bin-to-dot-file-with-ts" title="gst_debug_bin_to_dot_file_with_ts ()">gst_debug_bin_to_dot_file_with_ts</a>, function in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a> +<a class="link" href="gstreamer-GstInfo.html#GST-DEBUG-BIN-TO-DOT-FILE-WITH-TS:CAPS" title="GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS()">GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS</a>, macro in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a> </dt> <dd></dd> <dt> @@ -4955,11 +4955,11 @@ </dt> <dd></dd> <dt> -<a class="link" href="gstreamer-GstPoll.html#GST-POLL-FD-INIT:CAPS" title="GST_POLL_FD_INIT">GST_POLL_FD_INIT</a>, macro in <a class="link" href="gstreamer-GstPoll.html" title="GstPoll">GstPoll</a> +<a class="link" href="gstreamer-GstPoll.html#gst-poll-fd-init" title="gst_poll_fd_init ()">gst_poll_fd_init</a>, function in <a class="link" href="gstreamer-GstPoll.html" title="GstPoll">GstPoll</a> </dt> <dd></dd> <dt> -<a class="link" href="gstreamer-GstPoll.html#gst-poll-fd-init" title="gst_poll_fd_init ()">gst_poll_fd_init</a>, function in <a class="link" href="gstreamer-GstPoll.html" title="GstPoll">GstPoll</a> +<a class="link" href="gstreamer-GstPoll.html#GST-POLL-FD-INIT:CAPS" title="GST_POLL_FD_INIT">GST_POLL_FD_INIT</a>, macro in <a class="link" href="gstreamer-GstPoll.html" title="GstPoll">GstPoll</a> </dt> <dd></dd> <dt> @@ -5786,11 +5786,11 @@ </dt> <dd></dd> <dt> -<a class="link" href="GstElement.html#GST-STATE:CAPS" title="GST_STATE()">GST_STATE</a>, macro in <a class="link" href="GstElement.html" title="GstElement">GstElement</a> +<a class="link" href="GstElement.html#GstState" title="enum GstState">GstState</a>, enum in <a class="link" href="GstElement.html" title="GstElement">GstElement</a> </dt> <dd></dd> <dt> -<a class="link" href="GstElement.html#GstState" title="enum GstState">GstState</a>, enum in <a class="link" href="GstElement.html" title="GstElement">GstElement</a> +<a class="link" href="GstElement.html#GST-STATE:CAPS" title="GST_STATE()">GST_STATE</a>, macro in <a class="link" href="GstElement.html" title="GstElement">GstElement</a> </dt> <dd></dd> <dt> diff --git a/docs/gst/html/gstreamer-GstVersion.html b/docs/gst/html/gstreamer-GstVersion.html index 11746b0..faa792f 100644 --- a/docs/gst/html/gstreamer-GstVersion.html +++ b/docs/gst/html/gstreamer-GstVersion.html @@ -88,7 +88,7 @@ The minor version of GStreamer at compile time: <hr> <div class="refsect2"> <a name="GST-VERSION-MICRO:CAPS"></a><h3>GST_VERSION_MICRO</h3> -<pre class="programlisting">#define GST_VERSION_MICRO (2) +<pre class="programlisting">#define GST_VERSION_MICRO (3) </pre> <p> The micro version of GStreamer at compile time: diff --git a/docs/gst/html/index.html b/docs/gst/html/index.html index 08c561a..0ea78fa 100644 --- a/docs/gst/html/index.html +++ b/docs/gst/html/index.html @@ -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 1.0 Core Reference Manual</p></th></tr></table></div> <div><p class="releaseinfo"> - for GStreamer Core 1.0 (1.2.2) + for GStreamer Core 1.0 (1.2.3) The latest version of this documentation can be found on-line at <a class="ulink" href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/" target="_top">http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/</a>. </p></div> diff --git a/docs/gst/html/index.sgml b/docs/gst/html/index.sgml index 2be8fcc..12ff547 100644 --- a/docs/gst/html/index.sgml +++ b/docs/gst/html/index.sgml @@ -2735,20 +2735,20 @@ <ANCHOR id="gst-debug-bin-to-dot-file" href="gstreamer-1.0/gstreamer-GstInfo.html#gst-debug-bin-to-dot-file"> <ANCHOR id="gst-debug-bin-to-dot-file-with-ts" href="gstreamer-1.0/gstreamer-GstInfo.html#gst-debug-bin-to-dot-file-with-ts"> <ANCHOR id="gstreamer-GstInfo.see-also" href="gstreamer-1.0/gstreamer-GstInfo.html#gstreamer-GstInfo.see-also"> +<ANCHOR id="annotation-glossterm-transfer full" href="gstreamer-1.0/annotation-glossary.html#annotation-glossterm-transfer full"> +<ANCHOR id="annotation-glossterm-allow-none" href="gstreamer-1.0/annotation-glossary.html#annotation-glossterm-allow-none"> +<ANCHOR id="annotation-glossterm-closure" href="gstreamer-1.0/annotation-glossary.html#annotation-glossterm-closure"> <ANCHOR id="annotation-glossterm-transfer floating" href="gstreamer-1.0/annotation-glossary.html#annotation-glossterm-transfer floating"> -<ANCHOR id="annotation-glossterm-scope call" href="gstreamer-1.0/annotation-glossary.html#annotation-glossterm-scope call"> -<ANCHOR id="annotation-glossterm-out callee-allocates" href="gstreamer-1.0/annotation-glossary.html#annotation-glossterm-out callee-allocates"> <ANCHOR id="annotation-glossterm-transfer container" href="gstreamer-1.0/annotation-glossary.html#annotation-glossterm-transfer container"> -<ANCHOR id="annotation-glossterm-type" href="gstreamer-1.0/annotation-glossary.html#annotation-glossterm-type"> -<ANCHOR id="annotation-glossterm-transfer full" href="gstreamer-1.0/annotation-glossary.html#annotation-glossterm-transfer full"> -<ANCHOR id="annotation-glossterm-inout" href="gstreamer-1.0/annotation-glossary.html#annotation-glossterm-inout"> -<ANCHOR id="annotation-glossterm-transfer none" href="gstreamer-1.0/annotation-glossary.html#annotation-glossterm-transfer none"> -<ANCHOR id="annotation-glossterm-out" href="gstreamer-1.0/annotation-glossary.html#annotation-glossterm-out"> -<ANCHOR id="annotation-glossterm-scope async" href="gstreamer-1.0/annotation-glossary.html#annotation-glossterm-scope async"> <ANCHOR id="annotation-glossterm-skip" href="gstreamer-1.0/annotation-glossary.html#annotation-glossterm-skip"> -<ANCHOR id="annotation-glossterm-closure" href="gstreamer-1.0/annotation-glossary.html#annotation-glossterm-closure"> +<ANCHOR id="annotation-glossterm-scope async" href="gstreamer-1.0/annotation-glossary.html#annotation-glossterm-scope async"> <ANCHOR id="annotation-glossterm-out caller-allocates" href="gstreamer-1.0/annotation-glossary.html#annotation-glossterm-out caller-allocates"> -<ANCHOR id="annotation-glossterm-in" href="gstreamer-1.0/annotation-glossary.html#annotation-glossterm-in"> -<ANCHOR id="annotation-glossterm-allow-none" href="gstreamer-1.0/annotation-glossary.html#annotation-glossterm-allow-none"> -<ANCHOR id="annotation-glossterm-element-type" href="gstreamer-1.0/annotation-glossary.html#annotation-glossterm-element-type"> +<ANCHOR id="annotation-glossterm-inout" href="gstreamer-1.0/annotation-glossary.html#annotation-glossterm-inout"> +<ANCHOR id="annotation-glossterm-out" href="gstreamer-1.0/annotation-glossary.html#annotation-glossterm-out"> <ANCHOR id="annotation-glossterm-array" href="gstreamer-1.0/annotation-glossary.html#annotation-glossterm-array"> +<ANCHOR id="annotation-glossterm-element-type" href="gstreamer-1.0/annotation-glossary.html#annotation-glossterm-element-type"> +<ANCHOR id="annotation-glossterm-scope call" href="gstreamer-1.0/annotation-glossary.html#annotation-glossterm-scope call"> +<ANCHOR id="annotation-glossterm-transfer none" href="gstreamer-1.0/annotation-glossary.html#annotation-glossterm-transfer none"> +<ANCHOR id="annotation-glossterm-out callee-allocates" href="gstreamer-1.0/annotation-glossary.html#annotation-glossterm-out callee-allocates"> +<ANCHOR id="annotation-glossterm-in" href="gstreamer-1.0/annotation-glossary.html#annotation-glossterm-in"> +<ANCHOR id="annotation-glossterm-type" href="gstreamer-1.0/annotation-glossary.html#annotation-glossterm-type"> diff --git a/docs/libs/Makefile.in b/docs/libs/Makefile.in index de184a3..35ef1f1 100644 --- a/docs/libs/Makefile.in +++ b/docs/libs/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.14 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. diff --git a/docs/libs/html/annotation-glossary.html b/docs/libs/html/annotation-glossary.html index 5e8baca..dc6b69a 100644 --- a/docs/libs/html/annotation-glossary.html +++ b/docs/libs/html/annotation-glossary.html @@ -20,69 +20,63 @@ <td> </td> </tr> <tr><td colspan="5" class="shortcuts"> -<a class="shortcut" href="#glsI">I</a> - | - <a class="shortcut" href="#glsC">C</a> +<a class="shortcut" href="#glsS">S</a> | <a class="shortcut" href="#glsT">T</a> | - <a class="shortcut" href="#glsS">S</a> + <a class="shortcut" href="#glsE">E</a> | <a class="shortcut" href="#glsA">A</a> | - <a class="shortcut" href="#glsE">E</a> + <a class="shortcut" href="#glsO">O</a> | <a class="shortcut" href="#glsT">T</a> | - <a class="shortcut" href="#glsO">O</a> + <a class="shortcut" href="#glsC">C</a> | - <a class="shortcut" href="#glsT">T</a> + <a class="shortcut" href="#glsI">I</a> | <a class="shortcut" href="#glsA">A</a> - | - <a class="shortcut" href="#glsO">O</a> </td></tr> </table> <div class="glossary"> <div class="titlepage"><div><div><h1 class="title"> <a name="annotation-glossary"></a>Annotation Glossary</h1></div></div></div> -<a name="glsI"></a><h3 class="title">I</h3> -<dt><span class="glossterm"><a name="annotation-glossterm-in"></a>in</span></dt> -<dd class="glossdef"><p>Parameter for input. Default is <acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>.</p></dd> -<a name="glsC"></a><h3 class="title">C</h3> -<dt><span class="glossterm"><a name="annotation-glossterm-closure"></a>closure</span></dt> -<dd class="glossdef"><p>This parameter is a 'user_data', for callbacks; many bindings can pass NULL here.</p></dd> -<a name="glsT"></a><h3 class="title">T</h3> -<dt><span class="glossterm"><a name="annotation-glossterm-type"></a>type</span></dt> -<dd class="glossdef"><p>Override the parsed C type with given type.</p></dd> <a name="glsS"></a><h3 class="title">S</h3> <dt><span class="glossterm"><a name="annotation-glossterm-scope%20call"></a>scope call</span></dt> <dd class="glossdef"><p>The callback is valid only during the call to the method.</p></dd> -<a name="glsA"></a><h3 class="title">A</h3> -<dt><span class="glossterm"><a name="annotation-glossterm-array"></a>array</span></dt> -<dd class="glossdef"><p>Parameter points to an array of items.</p></dd> +<a name="glsT"></a><h3 class="title">T</h3> +<dt><span class="glossterm"><a name="annotation-glossterm-transfer%20full"></a>transfer full</span></dt> +<dd class="glossdef"><p>Free data after the code is done.</p></dd> <a name="glsE"></a><h3 class="title">E</h3> <dt><span class="glossterm"><a name="annotation-glossterm-element-type"></a>element-type</span></dt> <dd class="glossdef"><p>Generics and defining elements of containers and arrays.</p></dd> -<a name="glsT"></a><h3 class="title">T</h3> -<dt><span class="glossterm"><a name="annotation-glossterm-transfer%20container"></a>transfer container</span></dt> -<dd class="glossdef"><p>Free data container after the code is done.</p></dd> -<dt><span class="glossterm"><a name="annotation-glossterm-transfer%20floating"></a>transfer floating</span></dt> -<dd class="glossdef"><p>Alias for <acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>, used for objects with floating refs.</p></dd> +<a name="glsA"></a><h3 class="title">A</h3> +<dt><span class="glossterm"><a name="annotation-glossterm-array"></a>array</span></dt> +<dd class="glossdef"><p>Parameter points to an array of items.</p></dd> <a name="glsO"></a><h3 class="title">O</h3> +<dt><span class="glossterm"><a name="annotation-glossterm-out%20caller-allocates"></a>out caller-allocates</span></dt> +<dd class="glossdef"><p>Out parameter, where caller must allocate storage.</p></dd> <dt><span class="glossterm"><a name="annotation-glossterm-out"></a>out</span></dt> <dd class="glossdef"><p>Parameter for returning results. Default is <acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>.</p></dd> <a name="glsT"></a><h3 class="title">T</h3> -<dt><span class="glossterm"><a name="annotation-glossterm-transfer%20full"></a>transfer full</span></dt> -<dd class="glossdef"><p>Free data after the code is done.</p></dd> +<dt><span class="glossterm"><a name="annotation-glossterm-transfer%20container"></a>transfer container</span></dt> +<dd class="glossdef"><p>Free data container after the code is done.</p></dd> <dt><span class="glossterm"><a name="annotation-glossterm-transfer%20none"></a>transfer none</span></dt> <dd class="glossdef"><p>Don't free data after the code is done.</p></dd> +<dt><span class="glossterm"><a name="annotation-glossterm-transfer%20floating"></a>transfer floating</span></dt> +<dd class="glossdef"><p>Alias for <acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>, used for objects with floating refs.</p></dd> +<dt><span class="glossterm"><a name="annotation-glossterm-type"></a>type</span></dt> +<dd class="glossdef"><p>Override the parsed C type with given type.</p></dd> +<a name="glsC"></a><h3 class="title">C</h3> +<dt><span class="glossterm"><a name="annotation-glossterm-closure"></a>closure</span></dt> +<dd class="glossdef"><p>This parameter is a 'user_data', for callbacks; many bindings can pass NULL here.</p></dd> +<a name="glsI"></a><h3 class="title">I</h3> +<dt><span class="glossterm"><a name="annotation-glossterm-in"></a>in</span></dt> +<dd class="glossdef"><p>Parameter for input. Default is <acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>.</p></dd> <a name="glsA"></a><h3 class="title">A</h3> <dt><span class="glossterm"><a name="annotation-glossterm-allow-none"></a>allow-none</span></dt> <dd class="glossdef"><p>NULL is ok, both for passing and for returning.</p></dd> -<a name="glsO"></a><h3 class="title">O</h3> -<dt><span class="glossterm"><a name="annotation-glossterm-out%20caller-allocates"></a>out caller-allocates</span></dt> -<dd class="glossdef"><p>Out parameter, where caller must allocate storage.</p></dd> </div> <div class="footer"> <hr> diff --git a/docs/libs/html/api-index-full.html b/docs/libs/html/api-index-full.html index 377563c..dbe4412 100644 --- a/docs/libs/html/api-index-full.html +++ b/docs/libs/html/api-index-full.html @@ -694,11 +694,11 @@ </dt> <dd></dd> <dt> -<a class="link" href="gstreamer-libs-GstBitReader.html#gst-bit-reader-init" title="gst_bit_reader_init ()">gst_bit_reader_init</a>, function in <a class="link" href="gstreamer-libs-GstBitReader.html" title="GstBitReader">GstBitReader</a> +<a class="link" href="gstreamer-libs-GstBitReader.html#GST-BIT-READER-INIT:CAPS" title="GST_BIT_READER_INIT()">GST_BIT_READER_INIT</a>, macro in <a class="link" href="gstreamer-libs-GstBitReader.html" title="GstBitReader">GstBitReader</a> </dt> <dd></dd> <dt> -<a class="link" href="gstreamer-libs-GstBitReader.html#GST-BIT-READER-INIT:CAPS" title="GST_BIT_READER_INIT()">GST_BIT_READER_INIT</a>, macro in <a class="link" href="gstreamer-libs-GstBitReader.html" title="GstBitReader">GstBitReader</a> +<a class="link" href="gstreamer-libs-GstBitReader.html#gst-bit-reader-init" title="gst_bit_reader_init ()">gst_bit_reader_init</a>, function in <a class="link" href="gstreamer-libs-GstBitReader.html" title="GstBitReader">GstBitReader</a> </dt> <dd></dd> <dt> diff --git a/docs/libs/html/index.html b/docs/libs/html/index.html index d64cd65..a3ee65b 100644 --- a/docs/libs/html/index.html +++ b/docs/libs/html/index.html @@ -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 1.0 Library Reference Manual</p></th></tr></table></div> <div><p class="releaseinfo"> - for GStreamer Library 1.0 (1.2.2) + for GStreamer Library 1.0 (1.2.3) The latest version of this documentation can be found on-line at <a class="ulink" href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/" target="_top">http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/</a>. </p></div> diff --git a/docs/libs/html/index.sgml b/docs/libs/html/index.sgml index e6cf7a5..bfb911f 100644 --- a/docs/libs/html/index.sgml +++ b/docs/libs/html/index.sgml @@ -690,16 +690,16 @@ <ANCHOR id="GstTestClock.property-details" href="gstreamer-libs-1.0/GstTestClock.html#GstTestClock.property-details"> <ANCHOR id="GstTestClock--start-time" href="gstreamer-libs-1.0/GstTestClock.html#GstTestClock--start-time"> <ANCHOR id="GstTestClock.see-also" href="gstreamer-libs-1.0/GstTestClock.html#GstTestClock.see-also"> -<ANCHOR id="annotation-glossterm-in" href="gstreamer-libs-1.0/annotation-glossary.html#annotation-glossterm-in"> -<ANCHOR id="annotation-glossterm-closure" href="gstreamer-libs-1.0/annotation-glossary.html#annotation-glossterm-closure"> -<ANCHOR id="annotation-glossterm-type" href="gstreamer-libs-1.0/annotation-glossary.html#annotation-glossterm-type"> <ANCHOR id="annotation-glossterm-scope call" href="gstreamer-libs-1.0/annotation-glossary.html#annotation-glossterm-scope call"> -<ANCHOR id="annotation-glossterm-array" href="gstreamer-libs-1.0/annotation-glossary.html#annotation-glossterm-array"> +<ANCHOR id="annotation-glossterm-transfer full" href="gstreamer-libs-1.0/annotation-glossary.html#annotation-glossterm-transfer full"> <ANCHOR id="annotation-glossterm-element-type" href="gstreamer-libs-1.0/annotation-glossary.html#annotation-glossterm-element-type"> -<ANCHOR id="annotation-glossterm-transfer container" href="gstreamer-libs-1.0/annotation-glossary.html#annotation-glossterm-transfer container"> -<ANCHOR id="annotation-glossterm-transfer floating" href="gstreamer-libs-1.0/annotation-glossary.html#annotation-glossterm-transfer floating"> +<ANCHOR id="annotation-glossterm-array" href="gstreamer-libs-1.0/annotation-glossary.html#annotation-glossterm-array"> +<ANCHOR id="annotation-glossterm-out caller-allocates" href="gstreamer-libs-1.0/annotation-glossary.html#annotation-glossterm-out caller-allocates"> <ANCHOR id="annotation-glossterm-out" href="gstreamer-libs-1.0/annotation-glossary.html#annotation-glossterm-out"> -<ANCHOR id="annotation-glossterm-transfer full" href="gstreamer-libs-1.0/annotation-glossary.html#annotation-glossterm-transfer full"> +<ANCHOR id="annotation-glossterm-transfer container" href="gstreamer-libs-1.0/annotation-glossary.html#annotation-glossterm-transfer container"> <ANCHOR id="annotation-glossterm-transfer none" href="gstreamer-libs-1.0/annotation-glossary.html#annotation-glossterm-transfer none"> +<ANCHOR id="annotation-glossterm-transfer floating" href="gstreamer-libs-1.0/annotation-glossary.html#annotation-glossterm-transfer floating"> +<ANCHOR id="annotation-glossterm-type" href="gstreamer-libs-1.0/annotation-glossary.html#annotation-glossterm-type"> +<ANCHOR id="annotation-glossterm-closure" href="gstreamer-libs-1.0/annotation-glossary.html#annotation-glossterm-closure"> +<ANCHOR id="annotation-glossterm-in" href="gstreamer-libs-1.0/annotation-glossary.html#annotation-glossterm-in"> <ANCHOR id="annotation-glossterm-allow-none" href="gstreamer-libs-1.0/annotation-glossary.html#annotation-glossterm-allow-none"> -<ANCHOR id="annotation-glossterm-out caller-allocates" href="gstreamer-libs-1.0/annotation-glossary.html#annotation-glossterm-out caller-allocates"> diff --git a/docs/list-ulink.xsl b/docs/list-ulink.xsl new file mode 100644 index 0000000..969b5b7 --- /dev/null +++ b/docs/list-ulink.xsl @@ -0,0 +1,8 @@ +<?xml version='1.0'?> +<xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'> + <xsl:output method='text'/> + <xsl:template xmlns:xi='http://www.w3.org/2003/XInclude' match='ulink'> + <xsl:value-of select='@url'/><xsl:text>
</xsl:text> + </xsl:template> + <xsl:template match='text()|@*'/> +</xsl:stylesheet> diff --git a/docs/manual/Makefile.in b/docs/manual/Makefile.in index 1af65b2..ec6f477 100644 --- a/docs/manual/Makefile.in +++ b/docs/manual/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.14 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. diff --git a/docs/plugins/Makefile.in b/docs/plugins/Makefile.in index d750fae..e0202ff 100644 --- a/docs/plugins/Makefile.in +++ b/docs/plugins/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.14 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. diff --git a/docs/plugins/html/gstreamer-plugins-plugin-coreelements.html b/docs/plugins/html/gstreamer-plugins-plugin-coreelements.html index ffe46da..8637681 100644 --- a/docs/plugins/html/gstreamer-plugins-plugin-coreelements.html +++ b/docs/plugins/html/gstreamer-plugins-plugin-coreelements.html @@ -41,7 +41,7 @@ </tr> <tr> <td><p><span class="term">version</span></p></td> -<td>1.2.2</td> +<td>1.2.3</td> </tr> <tr> <td><p><span class="term">run-time license</span></p></td> diff --git a/docs/plugins/html/index.html b/docs/plugins/html/index.html index 2098e1d..4ea21ee 100644 --- a/docs/plugins/html/index.html +++ b/docs/plugins/html/index.html @@ -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 Core Plugins 1.0 Plugins Reference Manual</p></th></tr></table></div> <div><p class="releaseinfo"> - for GStreamer Core Plugins 1.0 (1.2.2) + for GStreamer Core Plugins 1.0 (1.2.3) The latest version of this documentation can be found on-line at <a class="ulink" href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-plugins/html/" target="_top">http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-plugins/html/</a>. </p></div> diff --git a/docs/plugins/inspect/plugin-coreelements.xml b/docs/plugins/inspect/plugin-coreelements.xml index 622f808..c34673d 100644 --- a/docs/plugins/inspect/plugin-coreelements.xml +++ b/docs/plugins/inspect/plugin-coreelements.xml @@ -3,7 +3,7 @@ <description>GStreamer core elements</description> <filename>../../plugins/elements/.libs/libgstcoreelements.so</filename> <basename>libgstcoreelements.so</basename> - <version>1.2.2</version> + <version>1.2.3</version> <license>LGPL</license> <source>gstreamer</source> <package>GStreamer source release</package> diff --git a/docs/pwg/Makefile.in b/docs/pwg/Makefile.in index ecb39dd..c4fe440 100644 --- a/docs/pwg/Makefile.in +++ b/docs/pwg/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.14 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. diff --git a/docs/slides/Makefile.in b/docs/slides/Makefile.in index 0c56569..a016500 100644 --- a/docs/slides/Makefile.in +++ b/docs/slides/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.14 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. diff --git a/docs/xsl/Makefile.in b/docs/xsl/Makefile.in index 5e689b2..bd80a31 100644 --- a/docs/xsl/Makefile.in +++ b/docs/xsl/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.14 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. diff --git a/gst/Makefile.in b/gst/Makefile.in index 9fde22b..a074240 100644 --- a/gst/Makefile.in +++ b/gst/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.14 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. diff --git a/gst/gstpad.c b/gst/gstpad.c index 3c3f484..794814b 100644 --- a/gst/gstpad.c +++ b/gst/gstpad.c @@ -544,6 +544,7 @@ restart: if (G_UNLIKELY (ev->event != ev_ret.event)) { if (G_UNLIKELY (ev_ret.event == NULL)) { /* function unreffed and set the event to NULL, remove it */ + gst_event_unref (ev->event); g_array_remove_index (events, i); len--; cookie = ++pad->priv->events_cookie; @@ -575,8 +576,9 @@ apply_pad_offset (GstPad * pad, GstEvent * event) gst_event_copy_segment (event, &segment); gst_event_unref (event); - /* adjust and make a new event with the offset applied */ - segment.base += pad->offset; + GST_DEBUG_OBJECT (pad, "apply pad offset %" GST_TIME_FORMAT, + GST_TIME_ARGS (pad->offset)); + gst_segment_offset_running_time (&segment, segment.format, pad->offset); event = gst_event_new_segment (&segment); } return event; @@ -1177,6 +1179,34 @@ gst_pad_is_active (GstPad * pad) return result; } +static void +cleanup_hook (GstPad * pad, GHook * hook) +{ + GstPadProbeType type; + + if (!G_HOOK_IS_VALID (hook)) + return; + + type = (hook->flags) >> G_HOOK_FLAG_USER_SHIFT; + + if (type & GST_PAD_PROBE_TYPE_BLOCKING) { + /* unblock when we remove the last blocking probe */ + pad->num_blocked--; + GST_DEBUG_OBJECT (pad, "remove blocking probe, now %d left", + pad->num_blocked); + + /* Might have new probes now that want to be called */ + GST_PAD_BLOCK_BROADCAST (pad); + + if (pad->num_blocked == 0) { + GST_DEBUG_OBJECT (pad, "last blocking probe removed, unblocking"); + GST_OBJECT_FLAG_UNSET (pad, GST_PAD_FLAG_BLOCKED); + } + } + g_hook_destroy_link (&pad->probes, hook); + pad->num_probes--; +} + /** * gst_pad_add_probe: * @pad: the #GstPad to add the probe to @@ -1245,6 +1275,9 @@ gst_pad_add_probe (GstPad * pad, GstPadProbeType mask, GST_OBJECT_FLAG_SET (pad, GST_PAD_FLAG_BLOCKED); GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad, "added blocking probe, " "now %d blocking probes", pad->num_blocked); + + /* Might have new probes now that want to be called */ + GST_PAD_BLOCK_BROADCAST (pad); } /* call the callback if we need to be called for idle callbacks */ @@ -1258,13 +1291,42 @@ gst_pad_add_probe (GstPad * pad, GstPadProbeType mask, GST_OBJECT_UNLOCK (pad); } else { GstPadProbeInfo info = { GST_PAD_PROBE_TYPE_IDLE, res, }; + GstPadProbeReturn ret; + + /* Keep another ref, the callback could destroy the pad */ + gst_object_ref (pad); /* the pad is idle now, we can signal the idle callback now */ GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad, "pad is idle, trigger idle callback"); GST_OBJECT_UNLOCK (pad); - callback (pad, &info, user_data); + ret = callback (pad, &info, user_data); + + GST_OBJECT_LOCK (pad); + switch (ret) { + case GST_PAD_PROBE_REMOVE: + /* remove the probe */ + GST_DEBUG_OBJECT (pad, "asked to remove hook"); + cleanup_hook (pad, hook); + res = 0; + break; + case GST_PAD_PROBE_DROP: + GST_DEBUG_OBJECT (pad, "asked to drop item"); + break; + case GST_PAD_PROBE_PASS: + GST_DEBUG_OBJECT (pad, "asked to pass item"); + break; + case GST_PAD_PROBE_OK: + GST_DEBUG_OBJECT (pad, "probe returned OK"); + break; + default: + GST_DEBUG_OBJECT (pad, "probe returned %d", ret); + break; + } + GST_OBJECT_UNLOCK (pad); + + gst_object_unref (pad); } } else { GST_OBJECT_UNLOCK (pad); @@ -1272,31 +1334,6 @@ gst_pad_add_probe (GstPad * pad, GstPadProbeType mask, return res; } -static void -cleanup_hook (GstPad * pad, GHook * hook) -{ - GstPadProbeType type; - - if (!G_HOOK_IS_VALID (hook)) - return; - - type = (hook->flags) >> G_HOOK_FLAG_USER_SHIFT; - - if (type & GST_PAD_PROBE_TYPE_BLOCKING) { - /* unblock when we remove the last blocking probe */ - pad->num_blocked--; - GST_DEBUG_OBJECT (pad, "remove blocking probe, now %d left", - pad->num_blocked); - if (pad->num_blocked == 0) { - GST_DEBUG_OBJECT (pad, "last blocking probe removed, unblocking"); - GST_OBJECT_FLAG_UNSET (pad, GST_PAD_FLAG_BLOCKED); - GST_PAD_BLOCK_BROADCAST (pad); - } - } - g_hook_destroy_link (&pad->probes, hook); - pad->num_probes--; -} - /** * gst_pad_remove_probe: * @pad: the #GstPad with the probe @@ -3026,8 +3063,9 @@ probe_hook_marshal (GHook * hook, ProbeMarshall * data) flags = hook->flags >> G_HOOK_FLAG_USER_SHIFT; type = info->type; - /* one of the data types */ - if ((flags & GST_PAD_PROBE_TYPE_ALL_BOTH & type) == 0) + /* one of the data types for non-idle probes */ + if ((type & GST_PAD_PROBE_TYPE_IDLE) == 0 + && (flags & GST_PAD_PROBE_TYPE_ALL_BOTH & type) == 0) goto no_match; /* one of the scheduling types */ if ((flags & GST_PAD_PROBE_TYPE_SCHEDULING & type) == 0) @@ -3036,6 +3074,9 @@ probe_hook_marshal (GHook * hook, ProbeMarshall * data) if ((type & GST_PAD_PROBE_TYPE_BLOCKING) && (flags & GST_PAD_PROBE_TYPE_BLOCKING & type) == 0) goto no_match; + if ((type & GST_PAD_PROBE_TYPE_BLOCKING) == 0 && + (flags & GST_PAD_PROBE_TYPE_BLOCKING)) + goto no_match; /* only probes that have GST_PAD_PROBE_TYPE_EVENT_FLUSH set */ if ((type & GST_PAD_PROBE_TYPE_EVENT_FLUSH) && (flags & GST_PAD_PROBE_TYPE_EVENT_FLUSH & type) == 0) @@ -3193,6 +3234,14 @@ again: GST_OBJECT_FLAG_UNSET (pad, GST_PAD_FLAG_BLOCKING); GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad, "We got unblocked"); + /* if the list changed, call the new callbacks (they will not have their + * cookie set to data.cookie */ + if (cookie != pad->priv->probe_list_cookie) { + GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad, + "probe list changed, restarting"); + goto again; + } + if (G_UNLIKELY (GST_PAD_IS_FLUSHING (pad))) goto flushing; } diff --git a/gst/gstsegment.c b/gst/gstsegment.c index 5f0ac33..cb6d19c 100644 --- a/gst/gstsegment.c +++ b/gst/gstsegment.c @@ -651,7 +651,7 @@ gst_segment_to_position (const GstSegment * segment, GstFormat format, if (G_LIKELY (segment->rate > 0.0)) { /* bring to corrected position in segment */ - result += start; + result += start + segment->offset; /* outside of the segment boundary stop */ if (G_UNLIKELY (stop != -1 && result > stop)) @@ -663,12 +663,11 @@ gst_segment_to_position (const GstSegment * segment, GstFormat format, return -1; /* bring to corrected position in segment */ - result = stop - result; + result = stop - result - segment->offset; } return result; } - /** * gst_segment_set_running_time: * @segment: a #GstSegment structure. @@ -713,3 +712,51 @@ gst_segment_set_running_time (GstSegment * segment, GstFormat format, return TRUE; } + +/** + * gst_segment_offset_running_time: + * @segment: a #GstSegment structure. + * @format: the format of the segment. + * @offset: the offset to apply in the segment + * + * Adjust the values in @segment so that @offset is applied to all + * future running-time calculations. + * + * Since: 1.2.3 + * + * Returns: %TRUE if the segment could be updated successfully. If %FALSE is + * returned, @offset is not in @segment. + */ +gboolean +gst_segment_offset_running_time (GstSegment * segment, GstFormat format, + gint64 offset) +{ + g_return_val_if_fail (segment != NULL, FALSE); + g_return_val_if_fail (segment->format == format, FALSE); + + if (offset == 0) + return TRUE; + + if (offset > 0) { + /* positive offset, we can simply apply to the base time */ + segment->base += offset; + } else { + offset = -offset; + /* negative offset, first try to subtract from base */ + if (segment->base > offset) { + segment->base -= offset; + } else { + guint64 position; + + /* subtract all from segment.base, remainder in offset */ + offset -= segment->base; + segment->base = 0; + position = gst_segment_to_position (segment, format, offset); + if (position == -1) + return FALSE; + + segment->offset = position; + } + } + return TRUE; +} diff --git a/gst/gstsegment.h b/gst/gstsegment.h index 65f8a62..0f08eb5 100644 --- a/gst/gstsegment.h +++ b/gst/gstsegment.h @@ -191,6 +191,8 @@ guint64 gst_segment_to_position (const GstSegment *segment, GstForm gboolean gst_segment_set_running_time (GstSegment *segment, GstFormat format, guint64 running_time); +gboolean gst_segment_offset_running_time (GstSegment *segment, GstFormat format, gint64 offset); + gboolean gst_segment_clip (const GstSegment *segment, GstFormat format, guint64 start, guint64 stop, guint64 *clip_start, guint64 *clip_stop); diff --git a/gst/parse/Makefile.in b/gst/parse/Makefile.in index 9e65380..d34b240 100644 --- a/gst/parse/Makefile.in +++ b/gst/parse/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.14 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. diff --git a/gst/printf/Makefile.in b/gst/printf/Makefile.in index 5594dec..895cb68 100644 --- a/gst/printf/Makefile.in +++ b/gst/printf/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.14 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. diff --git a/gstreamer.doap b/gstreamer.doap index 9fc05c3..9b984bd 100644 --- a/gstreamer.doap +++ b/gstreamer.doap @@ -40,6 +40,16 @@ hierarchy, and a set of media-agnostic core elements. <release> <Version> + <revision>1.2.3</revision> + <branch>1.2</branch> + <name></name> + <created>2014-02-08</created> + <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gstreamer/gstreamer-1.2.3.tar.xz" /> + </Version> + </release> + + <release> + <Version> <revision>1.2.2</revision> <branch>1.2</branch> <name></name> diff --git a/gstreamer.spec b/gstreamer.spec index 7b746ea..4c57453 100644 --- a/gstreamer.spec +++ b/gstreamer.spec @@ -4,7 +4,7 @@ %define _glib2 2.32.0 Name: %{gstreamer} -Version: 1.2.2 +Version: 1.2.3 Release: 1 Summary: GStreamer streaming media framework runtime diff --git a/libs/Makefile.in b/libs/Makefile.in index 895dcb3..2f00606 100644 --- a/libs/Makefile.in +++ b/libs/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.14 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. diff --git a/libs/gst/Makefile.in b/libs/gst/Makefile.in index 08eb87c..5eaf2f1 100644 --- a/libs/gst/Makefile.in +++ b/libs/gst/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.14 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. diff --git a/libs/gst/base/Makefile.in b/libs/gst/base/Makefile.in index 9c97366..21884e8 100644 --- a/libs/gst/base/Makefile.in +++ b/libs/gst/base/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.14 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. diff --git a/libs/gst/base/gstbaseparse.c b/libs/gst/base/gstbaseparse.c index 629b92b..07e0e6a 100644 --- a/libs/gst/base/gstbaseparse.c +++ b/libs/gst/base/gstbaseparse.c @@ -330,8 +330,10 @@ struct _GstBaseParsePrivate /* Pending serialized events */ GList *pending_events; - /* Newsegment event to be sent after SEEK */ - gboolean pending_segment; + + /* If baseparse has checked the caps to identify if it is + * handling video or audio */ + gboolean checked_media; /* offset of last parsed frame/data */ gint64 prev_offset; @@ -471,11 +473,14 @@ static GstFlowReturn gst_base_parse_locate_time (GstBaseParse * parse, static GstFlowReturn gst_base_parse_start_fragment (GstBaseParse * parse); static GstFlowReturn gst_base_parse_finish_fragment (GstBaseParse * parse, gboolean prev_head); +static GstFlowReturn gst_base_parse_send_buffers (GstBaseParse * parse); static inline GstFlowReturn gst_base_parse_check_sync (GstBaseParse * parse); static gboolean gst_base_parse_is_seekable (GstBaseParse * parse); +static void gst_base_parse_push_pending_events (GstBaseParse * parse); + static void gst_base_parse_clear_queues (GstBaseParse * parse) { @@ -507,7 +512,8 @@ gst_base_parse_clear_queues (GstBaseParse * parse) g_list_foreach (parse->priv->pending_events, (GFunc) gst_event_unref, NULL); g_list_free (parse->priv->pending_events); parse->priv->pending_events = NULL; - parse->priv->pending_segment = FALSE; + + parse->priv->checked_media = FALSE; } static void @@ -526,7 +532,6 @@ gst_base_parse_finalize (GObject * object) NULL); g_list_free (parse->priv->pending_events); parse->priv->pending_events = NULL; - parse->priv->pending_segment = FALSE; if (parse->priv->index) { gst_object_unref (parse->priv->index); @@ -826,6 +831,7 @@ gst_base_parse_reset (GstBaseParse * parse) parse->priv->idx_byte_interval = 0; parse->priv->exact_position = TRUE; parse->priv->seen_keyframe = FALSE; + parse->priv->checked_media = FALSE; parse->priv->last_dts = GST_CLOCK_TIME_NONE; parse->priv->last_pts = GST_CLOCK_TIME_NONE; @@ -835,7 +841,6 @@ gst_base_parse_reset (GstBaseParse * parse) NULL); g_list_free (parse->priv->pending_events); parse->priv->pending_events = NULL; - parse->priv->pending_segment = FALSE; if (parse->priv->cache) { gst_buffer_unref (parse->priv->cache); @@ -1083,6 +1088,7 @@ gst_base_parse_sink_event_default (GstBaseParse * parse, GstEvent * event) * whatever else it might claim */ parse->priv->upstream_seekable = FALSE; next_dts = in_segment->start; + gst_event_copy_segment (event, &out_segment); } memcpy (&parse->segment, &out_segment, sizeof (GstSegment)); @@ -1092,13 +1098,11 @@ gst_base_parse_sink_event_default (GstBaseParse * parse, GstEvent * event) applied_rate, format, start, stop, start); */ - /* save the segment for later, right before we push a new buffer so that - * the caps are fixed and the next linked element can receive - * the segment. */ - parse->priv->pending_segment = TRUE; ret = TRUE; - /* but finish the current segment */ + /* save the segment for later, right before we push a new buffer so that + * the caps are fixed and the next linked element can receive + * the segment but finish the current segment */ GST_DEBUG_OBJECT (parse, "draining current segment"); if (in_segment->rate > 0.0) gst_base_parse_drain (parse); @@ -1149,16 +1153,8 @@ gst_base_parse_sink_event_default (GstBaseParse * parse, GstEvent * event) ("No valid frames found before end of stream"), (NULL)); } /* newsegment and other serialized events before eos */ - if (G_UNLIKELY (parse->priv->pending_events)) { - GList *l; + gst_base_parse_push_pending_events (parse); - for (l = parse->priv->pending_events; l != NULL; l = l->next) { - gst_pad_push_event (parse->srcpad, GST_EVENT (l->data)); - } - g_list_free (parse->priv->pending_events); - parse->priv->pending_events = NULL; - parse->priv->pending_segment = FALSE; - } if (parse->priv->framecount < MIN_FRAMES_TO_POST_BITRATE) { /* We've not posted bitrate tags yet - do so now */ gst_base_parse_post_bitrates (parse, TRUE, TRUE, TRUE); @@ -1192,6 +1188,9 @@ gst_base_parse_sink_event_default (GstBaseParse * parse, GstEvent * event) case GST_EVENT_GAP: { GST_DEBUG_OBJECT (parse, "draining current data due to gap event"); + + gst_base_parse_push_pending_events (parse); + if (parse->segment.rate > 0.0) gst_base_parse_drain (parse); else @@ -1859,6 +1858,7 @@ gst_base_parse_check_media (GstBaseParse * parse) if (caps) gst_caps_unref (caps); + parse->priv->checked_media = TRUE; GST_DEBUG_OBJECT (parse, "media is video: %d", parse->priv->is_video); } @@ -2008,6 +2008,26 @@ gst_base_parse_handle_buffer (GstBaseParse * parse, GstBuffer * buffer, return ret; } +/* gst_base_parse_push_pending_events: + * @parse: #GstBaseParse + * + * Pushes the pending events + */ +static void +gst_base_parse_push_pending_events (GstBaseParse * parse) +{ + if (G_UNLIKELY (parse->priv->pending_events)) { + GList *r = g_list_reverse (parse->priv->pending_events); + GList *l; + + parse->priv->pending_events = NULL; + for (l = r; l != NULL; l = l->next) { + gst_pad_push_event (parse->srcpad, GST_EVENT_CAST (l->data)); + } + g_list_free (r); + } +} + /* gst_base_parse_handle_and_push_frame: * @parse: #GstBaseParse. * @klass: #GstBaseParseClass. @@ -2174,23 +2194,13 @@ gst_base_parse_push_frame (GstBaseParse * parse, GstBaseParseFrame * frame) if (!gst_pad_has_current_caps (parse->srcpad)) goto no_caps; - if (G_UNLIKELY (parse->priv->pending_segment)) { + if (G_UNLIKELY (!parse->priv->checked_media)) { /* have caps; check identity */ gst_base_parse_check_media (parse); } /* Push pending events, including SEGMENT events */ - if (G_UNLIKELY (parse->priv->pending_events)) { - GList *r = g_list_reverse (parse->priv->pending_events); - GList *l; - - parse->priv->pending_events = NULL; - for (l = r; l != NULL; l = l->next) { - gst_pad_push_event (parse->srcpad, GST_EVENT (l->data)); - } - g_list_free (r); - parse->priv->pending_segment = FALSE; - } + gst_base_parse_push_pending_events (parse); /* segment adjustment magic; only if we are running the whole show */ if (!parse->priv->passthrough && parse->segment.rate > 0.0 && @@ -2288,6 +2298,34 @@ gst_base_parse_push_frame (GstBaseParse * parse, GstBaseParseFrame * frame) size); ret = gst_pad_push (parse->srcpad, buffer); GST_LOG_OBJECT (parse, "frame pushed, flow %s", gst_flow_get_name (ret)); + } else if (!parse->priv->disable_passthrough && parse->priv->passthrough) { + + /* in backwards playback mode, if on passthrough we need to push buffers + * directly without accumulating them into the buffers_queued as baseparse + * will never check for a DISCONT while on passthrough and those buffers + * will never be pushed. + * + * also, as we are on reverse playback, it might be possible that + * passthrough might have just been enabled, so make sure to drain the + * buffers_queued list */ + if (G_UNLIKELY (parse->priv->buffers_queued != NULL)) { + gst_base_parse_finish_fragment (parse, TRUE); + ret = gst_base_parse_send_buffers (parse); + } + + if (ret == GST_FLOW_OK) { + GST_LOG_OBJECT (parse, + "pushing frame (%" G_GSIZE_FORMAT " bytes) now..", size); + ret = gst_pad_push (parse->srcpad, buffer); + GST_LOG_OBJECT (parse, "frame pushed, flow %s", + gst_flow_get_name (ret)); + } else { + GST_LOG_OBJECT (parse, + "frame (%" G_GSIZE_FORMAT " bytes) not pushed: %s", size, + gst_flow_get_name (ret)); + gst_buffer_unref (buffer); + } + } else { GST_LOG_OBJECT (parse, "frame (%" G_GSIZE_FORMAT " bytes) queued for now", size); @@ -3206,17 +3244,7 @@ pause: } if (push_eos) { /* Push pending events, including SEGMENT events */ - if (G_UNLIKELY (parse->priv->pending_events)) { - GList *r = g_list_reverse (parse->priv->pending_events); - GList *l; - - parse->priv->pending_events = NULL; - for (l = r; l != NULL; l = l->next) { - gst_pad_push_event (parse->srcpad, GST_EVENT (l->data)); - } - g_list_free (r); - parse->priv->pending_segment = FALSE; - } + gst_base_parse_push_pending_events (parse); gst_pad_push_event (parse->srcpad, gst_event_new_eos ()); } @@ -3321,7 +3349,6 @@ gst_base_parse_sink_activate_mode (GstPad * pad, GstObject * parent, parse->priv->pending_events = g_list_prepend (parse->priv->pending_events, gst_event_new_segment (&parse->segment)); - parse->priv->pending_segment = TRUE; result = TRUE; } else { result = gst_pad_stop_task (pad); @@ -4213,7 +4240,6 @@ gst_base_parse_handle_seek (GstBaseParse * parse, GstEvent * event) /* store the newsegment event so it can be sent from the streaming thread. */ /* This will be sent later in _loop() */ - parse->priv->pending_segment = TRUE; segment_event = gst_event_new_segment (&parse->segment); gst_event_set_seqnum (segment_event, seqnum); parse->priv->pending_events = diff --git a/libs/gst/base/gstcollectpads.c b/libs/gst/base/gstcollectpads.c index 799835a..a30e10a 100644 --- a/libs/gst/base/gstcollectpads.c +++ b/libs/gst/base/gstcollectpads.c @@ -504,7 +504,8 @@ gst_collect_pads_clip_running_time (GstCollectPads * pads, if (G_LIKELY (GST_CLOCK_TIME_IS_VALID (time))) { time = gst_segment_to_running_time (&cdata->segment, GST_FORMAT_TIME, time); if (G_UNLIKELY (!GST_CLOCK_TIME_IS_VALID (time))) { - GST_DEBUG_OBJECT (cdata->pad, "clipping buffer on pad outside segment"); + GST_DEBUG_OBJECT (cdata->pad, "clipping buffer on pad outside segment %" + GST_TIME_FORMAT, GST_TIME_ARGS (GST_BUFFER_PTS (buf))); gst_buffer_unref (buf); *outbuf = NULL; } else { @@ -1716,7 +1717,8 @@ gst_collect_pads_event_default (GstCollectPads * pads, GstCollectData * data, GST_COLLECT_PADS_STATE_SET (data, GST_COLLECT_PADS_STATE_NEW_SEGMENT); /* now we can use for e.g. running time */ - seg.position = gst_collect_pads_clip_time (pads, data, seg.start); + seg.position = + gst_collect_pads_clip_time (pads, data, seg.start + seg.offset); /* update again */ data->segment = seg; @@ -1739,6 +1741,7 @@ gst_collect_pads_event_default (GstCollectPads * pads, GstCollectData * data, GST_COLLECT_PADS_STREAM_LOCK (pads); gst_event_parse_gap (event, &start, &duration); + /* FIXME, handle reverse playback case */ if (GST_CLOCK_TIME_IS_VALID (duration)) start += duration; /* we do not expect another buffer until after gap, diff --git a/libs/gst/check/Makefile.in b/libs/gst/check/Makefile.in index ddafe7f..ce1bce9 100644 --- a/libs/gst/check/Makefile.in +++ b/libs/gst/check/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.14 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. diff --git a/libs/gst/check/libcheck/Makefile.in b/libs/gst/check/libcheck/Makefile.in index 893eb88..ad69bac 100644 --- a/libs/gst/check/libcheck/Makefile.in +++ b/libs/gst/check/libcheck/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.14 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. diff --git a/libs/gst/controller/Makefile.in b/libs/gst/controller/Makefile.in index c5f1df2..3badfc6 100644 --- a/libs/gst/controller/Makefile.in +++ b/libs/gst/controller/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.14 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. diff --git a/libs/gst/helpers/Makefile.in b/libs/gst/helpers/Makefile.in index 25ffee3..6e640f6 100644 --- a/libs/gst/helpers/Makefile.in +++ b/libs/gst/helpers/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.14 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. diff --git a/libs/gst/net/Makefile.in b/libs/gst/net/Makefile.in index c713399..2ec6f6e 100644 --- a/libs/gst/net/Makefile.in +++ b/libs/gst/net/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.14 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. diff --git a/m4/Makefile.in b/m4/Makefile.in index 606c1c1..1cb2334 100644 --- a/m4/Makefile.in +++ b/m4/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.14 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. diff --git a/pkgconfig/Makefile.in b/pkgconfig/Makefile.in index d851c55..db7e93d 100644 --- a/pkgconfig/Makefile.in +++ b/pkgconfig/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.14 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. diff --git a/plugins/Makefile.in b/plugins/Makefile.in index 472696c..f908e43 100644 --- a/plugins/Makefile.in +++ b/plugins/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.14 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. diff --git a/plugins/elements/Makefile.in b/plugins/elements/Makefile.in index c00da16..01f7192 100644 --- a/plugins/elements/Makefile.in +++ b/plugins/elements/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.14 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. diff --git a/plugins/elements/gstmultiqueue.c b/plugins/elements/gstmultiqueue.c index 266fead..df0c65d 100644 --- a/plugins/elements/gstmultiqueue.c +++ b/plugins/elements/gstmultiqueue.c @@ -508,8 +508,11 @@ gst_multi_queue_set_property (GObject * object, guint prop_id, gst_data_queue_get_level (q->queue, &size); /* do not reduce max size below current level if the single queue has grown because of empty queue */ - if (new_size >= size.visible && size.visible <= mq->max_size.visible) + if (new_size == 0) { q->max_size.visible = new_size; + } else if (new_size > size.visible) { + q->max_size.visible = new_size; + } tmp = g_list_next (tmp); }; @@ -740,6 +743,9 @@ gst_multi_queue_change_state (GstElement * element, GstStateChange transition) sq = (GstSingleQueue *) tmp->data; sq->flushing = TRUE; g_cond_signal (&sq->turn); + + sq->last_query = FALSE; + g_cond_signal (&sq->query_handled); } GST_MULTI_QUEUE_MUTEX_UNLOCK (mqueue); break; diff --git a/plugins/elements/gsttee.c b/plugins/elements/gsttee.c index a6d4b9d..d45b483 100644 --- a/plugins/elements/gsttee.c +++ b/plugins/elements/gsttee.c @@ -78,10 +78,6 @@ gst_tee_pull_mode_get_type (void) return type; } -/* lock to protect request pads from being removed while downstream */ -#define GST_TEE_DYN_LOCK(tee) g_mutex_lock (&(tee)->dyn_lock) -#define GST_TEE_DYN_UNLOCK(tee) g_mutex_unlock (&(tee)->dyn_lock) - #define DEFAULT_PROP_NUM_SRC_PADS 0 #define DEFAULT_PROP_HAS_CHAIN TRUE #define DEFAULT_PROP_SILENT TRUE @@ -220,8 +216,6 @@ gst_tee_finalize (GObject * object) g_free (tee->last_message); - g_mutex_clear (&tee->dyn_lock); - G_OBJECT_CLASS (parent_class)->finalize (object); } @@ -285,8 +279,6 @@ gst_tee_class_init (GstTeeClass * klass) static void gst_tee_init (GstTee * tee) { - g_mutex_init (&tee->dyn_lock); - tee->sinkpad = gst_pad_new_from_static_template (&sinktemplate, "sink"); tee->sink_mode = GST_PAD_MODE_NONE; @@ -404,8 +396,6 @@ gst_tee_release_pad (GstElement * element, GstPad * pad) GST_DEBUG_OBJECT (tee, "releasing pad"); - /* wait for pending pad_alloc to finish */ - GST_TEE_DYN_LOCK (tee); GST_OBJECT_LOCK (tee); /* mark the pad as removed so that future pad_alloc fails with NOT_LINKED. */ GST_TEE_PAD_CAST (pad)->removed = TRUE; @@ -419,7 +409,6 @@ gst_tee_release_pad (GstElement * element, GstPad * pad) gst_element_remove_pad (GST_ELEMENT_CAST (tee), pad); gst_pad_set_active (pad, FALSE); - GST_TEE_DYN_UNLOCK (tee); gst_object_unref (pad); @@ -591,6 +580,9 @@ gst_tee_handle_data (GstTee * tee, gpointer data, gboolean is_list) if (!pads->next) { GstPad *pad = GST_PAD_CAST (pads->data); + /* Keep another ref around, a pad probe + * might release and destroy the pad */ + gst_object_ref (pad); GST_OBJECT_UNLOCK (tee); if (pad == tee->pull_pad) { @@ -600,6 +592,9 @@ gst_tee_handle_data (GstTee * tee, gpointer data, gboolean is_list) } else { ret = gst_pad_push (pad, GST_BUFFER_CAST (data)); } + + gst_object_unref (pad); + return ret; } diff --git a/plugins/elements/gsttee.h b/plugins/elements/gsttee.h index c092b8f..3f408cb 100644 --- a/plugins/elements/gsttee.h +++ b/plugins/elements/gsttee.h @@ -66,9 +66,6 @@ struct _GstTee { GstElement element; /*< private >*/ - /* lock protecting dynamic pads */ - GMutex dyn_lock; - GstPad *sinkpad; GstPad *allocpad; guint pad_counter; Binary files differ@@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: gstreamer 0.9.7\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2013-12-26 17:29+0100\n" +"POT-Creation-Date: 2014-02-08 11:32+0100\n" "PO-Revision-Date: 2005-12-05 11:45+0200\n" "Last-Translator: Petri Jooste <rkwjpj@puk.ac.za>\n" "Language-Team: Afrikaans <i18n@af.org.za>\n" Binary files differ@@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: gstreamer-0.8.0\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2013-12-26 17:29+0100\n" +"POT-Creation-Date: 2014-02-08 11:32+0100\n" "PO-Revision-Date: 2004-03-19 18:40+0200\n" "Last-Translator: Metin Amiroff <metin@karegen.com>\n" "Language-Team: Azerbaijani <translation-team-az@lists.sourceforge.net>\n" Binary files differ@@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: gstreamer 0.9.7\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2013-12-26 17:29+0100\n" +"POT-Creation-Date: 2014-02-08 11:32+0100\n" "PO-Revision-Date: 2006-01-18 22:26+0200\n" "Last-Translator: Ales Nyakhaychyk <nab@mail.by>\n" "Language-Team: Belarusian <i18n@mova.org>\n" Binary files differ@@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: gstreamer 0.10.32.2\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2013-12-26 17:29+0100\n" +"POT-Creation-Date: 2014-02-08 11:32+0100\n" "PO-Revision-Date: 2011-04-26 22:40+0300\n" "Last-Translator: Alexander Shopov <ash@kambanaria.org>\n" "Language-Team: Bulgarian <dict@fsa-bg.org>\n" Binary files differ@@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: gstreamer 0.10.30.3\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2013-12-26 17:29+0100\n" +"POT-Creation-Date: 2014-02-08 11:32+0100\n" "PO-Revision-Date: 2010-11-04 19:41+0100\n" "Last-Translator: Jordi Mallach <jordi@sindominio.net>\n" "Language-Team: Catalan <ca@dodds.net>\n" Binary files differ@@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: gstreamer 1.1.4\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2013-12-26 17:29+0100\n" +"POT-Creation-Date: 2014-02-08 11:32+0100\n" "PO-Revision-Date: 2013-09-18 19:42+0200\n" "Last-Translator: Marek Černocký <marek@manet.cz>\n" "Language-Team: Czech <translation-team-cs@lists.sourceforge.net>\n" Binary files differ@@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: gstreamer 1.2.1\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2013-12-26 17:29+0100\n" +"POT-Creation-Date: 2014-02-08 11:32+0100\n" "PO-Revision-Date: 2013-12-08 12:41+0100\n" "Last-Translator: Mogens Jaeger <mogensjaeger@gmail.com>\n" "Language-Team: Danish <dansk@dansk-gruppen.dk>\n" Binary files differ@@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: gstreamer 1.2.1\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2013-12-26 17:29+0100\n" +"POT-Creation-Date: 2014-02-08 11:32+0100\n" "PO-Revision-Date: 2013-12-16 00:01+0100\n" "Last-Translator: Christian Kirbach <christian.kirbach@gmail.com>\n" "Language-Team: German <translation-team-de@lists.sourceforge.net>\n" Binary files differ@@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: gstreamer-0.10.30.3\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2013-12-26 17:29+0100\n" +"POT-Creation-Date: 2014-02-08 11:32+0100\n" "PO-Revision-Date: 2010-11-29 11:14+0200\n" "Last-Translator: Michael Kotsarinis <mk73628@gmail.com>\n" "Language-Team: Greek <team@lists.gnome.gr>\n" diff --git a/po/en_GB.gmo b/po/en_GB.gmo Binary files differindex 9653f9c..d0f5048 100644 --- a/po/en_GB.gmo +++ b/po/en_GB.gmo diff --git a/po/en_GB.po b/po/en_GB.po index 6a83dcb..bc7ebfa 100644 --- a/po/en_GB.po +++ b/po/en_GB.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: gstreamer 0.8.1\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2013-12-26 17:29+0100\n" +"POT-Creation-Date: 2014-02-08 11:32+0100\n" "PO-Revision-Date: 2004-04-26 10:36-0400\n" "Last-Translator: Gareth Owen <gowen72@yahoo.com>\n" "Language-Team: English (British) <en_gb@li.org>\n" Binary files differ@@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: gstreamer 0.10.32.2\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2013-12-26 17:29+0100\n" +"POT-Creation-Date: 2014-02-08 11:32+0100\n" "PO-Revision-Date: 2011-06-04 21:11+0100\n" "Last-Translator: Kristjan SCHMIDT <kristjan.schmidt@googlemail.com>\n" "Language-Team: Esperanto <translation-team-eo@lists.sourceforge.net>\n" Binary files differ@@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: gstreamer 0.10.32.2\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2013-12-26 17:29+0100\n" +"POT-Creation-Date: 2014-02-08 11:32+0100\n" "PO-Revision-Date: 2011-10-02 15:45+0200\n" "Last-Translator: Jorge González González <aloriel@gmail.com>\n" "Language-Team: Spanish <es@li.org>\n" Binary files differ@@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: gstreamer-0.10.26.2\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2013-12-26 17:29+0100\n" +"POT-Creation-Date: 2014-02-08 11:32+0100\n" "PO-Revision-Date: 2010-03-25 13:10+0100\n" "Last-Translator: Mikel Olasagasti Uranga <hey_neken@mundurat.net>\n" "Language-Team: Basque <translation-team-eu@lists.sourceforge.net>\n" Binary files differ@@ -12,7 +12,7 @@ msgid "" msgstr "" "Project-Id-Version: gstreamer 0.10.30.3\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2013-12-26 17:29+0100\n" +"POT-Creation-Date: 2014-02-08 11:32+0100\n" "PO-Revision-Date: 2010-11-17 23:10+0200\n" "Last-Translator: Tommi Vainikainen <Tommi.Vainikainen@iki.fi>\n" "Language-Team: Finnish <translation-team-fi@lists.sourceforge.net>\n" Binary files differ@@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: gstreamer 1.0.3\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2013-12-26 17:29+0100\n" +"POT-Creation-Date: 2014-02-08 11:32+0100\n" "PO-Revision-Date: 2012-12-05 19:31+0100\n" "Last-Translator: Claude Paroz <claude@2xlibre.net>\n" "Language-Team: French <traduc@traduc.org>\n" Binary files differ@@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: gstreamer 1.0.3\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2013-12-26 17:29+0100\n" +"POT-Creation-Date: 2014-02-08 11:32+0100\n" "PO-Revision-Date: 2012-12-15 03:29+0200\n" "Last-Translator: Fran Dieguez <frandieguez@ubuntu.com>\n" "Language-Team: Galician <proxecto@trasno.net>\n" diff --git a/po/gstreamer-1.0.pot b/po/gstreamer-1.0.pot index 1aa493d..59a2770 100644 --- a/po/gstreamer-1.0.pot +++ b/po/gstreamer-1.0.pot @@ -5,9 +5,9 @@ #, fuzzy msgid "" msgstr "" -"Project-Id-Version: gstreamer 1.2.2\n" +"Project-Id-Version: gstreamer 1.2.3\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2013-12-26 17:29+0100\n" +"POT-Creation-Date: 2014-02-08 11:32+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" Binary files differ@@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: gstreamer 0.10.32.2\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2013-12-26 17:29+0100\n" +"POT-Creation-Date: 2014-02-08 11:32+0100\n" "PO-Revision-Date: 2012-05-25 16:47+0200\n" "Last-Translator: Tomislav Krznar <tomislav.krznar@gmail.com>\n" "Language-Team: Croatian <lokalizacija@linux.hr>\n" Binary files differ@@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: gstreamer 1.0.3\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2013-12-26 17:29+0100\n" +"POT-Creation-Date: 2014-02-08 11:32+0100\n" "PO-Revision-Date: 2012-11-29 14:03+0100\n" "Last-Translator: Gabor Kelemen <kelemeng@gnome.hu>\n" "Language-Team: Hungarian <translation-team-hu@lists.sourceforge.net>\n" Binary files differ@@ -1,22 +1,21 @@ # Indonesian translations for gstreamer package. # This file is put in the public domain. -# Andhika Padmawan <andhika.padmawan@gmail.com>, 2010-2012. -# Andika Triwidada <andika@gmail.com>. +# Andika Triwidada <andika@gmail.com>, 2013. +# Andhika Padmawan <andhika.padmawan@gmail.com>, 2010-2014. # msgid "" msgstr "" -"Project-Id-Version: gstreamer 1.1.4\n" +"Project-Id-Version: gstreamer 1.2.1\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2013-12-26 17:29+0100\n" -"PO-Revision-Date: 2013-10-15 15:58+0700\n" -"Last-Translator: Andika Triwidada <andika@gmail.com>\n" +"POT-Creation-Date: 2014-02-08 11:32+0100\n" +"PO-Revision-Date: 2014-01-27 20:09+0700\n" +"Last-Translator: Andhika Padmawan <andhika.padmawan@gmail.com>\n" "Language-Team: Indonesian <translation-team-id@lists.sourceforge.net>\n" "Language: id\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Poedit 1.5.7\n" msgid "Print the GStreamer version" msgstr "Cetak versi GStreamer" @@ -27,11 +26,10 @@ msgstr "Buat semua peringatan fatal" msgid "Print available debug categories and exit" msgstr "Cetak kategori awakutu yang tersedia lalu keluar" -#, fuzzy msgid "" "Default debug level from 1 (only error) to 9 (anything) or 0 for no output" msgstr "" -"Level awakutu standar dari 1 (hanya galat) ke 5 (apapun) atau 0 untuk tak " +"Level awakutu standar dari 1 (hanya galat) ke 9 (apapun) atau 0 untuk tak " "ada keluaran" msgid "LEVEL" @@ -1167,9 +1165,9 @@ msgstr "Kemajuan: (%s) %s\n" msgid "Missing element: %s\n" msgstr "Elemen kurang: %s\n" -#, fuzzy, c-format +#, c-format msgid "Got context from element '%s': %s=%s\n" -msgstr "Mendapat konteks dari elemen '%s': %s\n" +msgstr "Mendapat konteks dari elemen '%s': %s=%s\n" msgid "Output tags (also known as metadata)" msgstr "Tag keluaran (juga dikenal sebagai metadata)" Binary files differ@@ -106,7 +106,7 @@ msgid "" msgstr "" "Project-Id-Version: gstreamer 0.10.30.3\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2013-12-26 17:29+0100\n" +"POT-Creation-Date: 2014-02-08 11:32+0100\n" "PO-Revision-Date: 2010-10-25 10:03+0200\n" "Last-Translator: Luca Ferretti <elle.uca@infinito.it>\n" "Language-Team: Italian <tp@lists.linux.it>\n" Binary files differ@@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: gstreamer 1.0.3\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2013-12-26 17:29+0100\n" +"POT-Creation-Date: 2014-02-08 11:32+0100\n" "PO-Revision-Date: 2013-08-20 14:56+0900\n" "Last-Translator: Makoto Kato <makoto.kt@gmail.com>\n" "Language-Team: Japanese <translation-team-ja@lists.sourceforge.net>\n" Binary files differ@@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: gstreamer 0.10.29.2\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2013-12-26 17:29+0100\n" +"POT-Creation-Date: 2014-02-08 11:32+0100\n" "PO-Revision-Date: 2010-07-16 00:50+0300\n" "Last-Translator: Žygimantas Beručka <uid0@akl.lt>\n" "Language-Team: Lithuanian <komp_lt@konferencijos.lt>\n" Binary files differ@@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: gstreamer 0.10.30.3\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2013-12-26 17:29+0100\n" +"POT-Creation-Date: 2014-02-08 11:32+0100\n" "PO-Revision-Date: 2010-10-24 21:36+0200\n" "Last-Translator: Kjartan Maraas <kmaraas@gnome.org>\n" "Language-Team: Norwegian Bokmaal <i18n-nb@lister.ping.uio.no>\n" Binary files differ@@ -1,17 +1,17 @@ -# translation of gstreamer-1.1.4.po to Dutch +# translation of gstreamer-1.2.1.po to Dutch # Dutch translation of gstreamer # Copyright (C) 2003-2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. # This file is distributed under the same license as the gstreamer package. # # Thomas Vander Stichele <thomas@apestaart.org>, 2004. # Taco Witte <tcwitte@cs.uu.nl>, 2006. -# Freek de Kruijf <f.de.kruijf@gmail.com>, 2007, 2008, 2009, 2010, 2011, 2012, 2013. +# Freek de Kruijf <f.de.kruijf@gmail.com>, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014. msgid "" msgstr "" -"Project-Id-Version: gstreamer 1.1.4\n" +"Project-Id-Version: gstreamer 1.2.1\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2013-12-26 17:29+0100\n" -"PO-Revision-Date: 2013-09-15 13:39+0200\n" +"POT-Creation-Date: 2014-02-08 11:32+0100\n" +"PO-Revision-Date: 2014-01-09 12:55+0100\n" "Last-Translator: Freek de Kruijf <f.de.kruijf@gmail.com>\n" "Language-Team: Dutch <vertaling@vrijschrift.org>\n" "Language: nl\n" @@ -30,11 +30,10 @@ msgstr "Alle waarschuwingen fataal maken" msgid "Print available debug categories and exit" msgstr "Beschikbare debug-categorieën weergeven en afsluiten" -#, fuzzy msgid "" "Default debug level from 1 (only error) to 9 (anything) or 0 for no output" msgstr "" -"Standaard debug-niveau van 1 (enkel fouten) tot 5 (alles) of 0 voor geen " +"Standaard debug-niveau van 1 (alleen fouten) tot 9 (alles) of 0 voor geen " "uitvoer" msgid "LEVEL" @@ -1180,9 +1179,9 @@ msgstr "Voortgang: (%s) %s\n" msgid "Missing element: %s\n" msgstr "ontbrekend element: \"%s\"\n" -#, fuzzy, c-format +#, c-format msgid "Got context from element '%s': %s=%s\n" -msgstr "Context verkregen van element '%s': %s\n" +msgstr "Context verkregen van element '%s': %s=%s\n" msgid "Output tags (also known as metadata)" msgstr "Tags (ook bekend als metadata) weergeven" Binary files differ@@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: gstreamer 1.2.1\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2013-12-26 17:29+0100\n" +"POT-Creation-Date: 2014-02-08 11:32+0100\n" "PO-Revision-Date: 2013-12-08 08:57+0100\n" "Last-Translator: Jakub Bogusz <qboosh@pld-linux.org>\n" "Language-Team: Polish <translation-team-pl@lists.sourceforge.net>\n" diff --git a/po/pt_BR.gmo b/po/pt_BR.gmo Binary files differindex 546a189..b5e87f4 100644 --- a/po/pt_BR.gmo +++ b/po/pt_BR.gmo diff --git a/po/pt_BR.po b/po/pt_BR.po index 770c2f5..381bf04 100644 --- a/po/pt_BR.po +++ b/po/pt_BR.po @@ -15,10 +15,10 @@ # msgid "" msgstr "" -"Project-Id-Version: gstreamer-1.0.3\n" +"Project-Id-Version: gstreamer-1.2.1\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2013-12-26 17:29+0100\n" -"PO-Revision-Date: 2013-08-20 23:59-0300\n" +"POT-Creation-Date: 2014-02-08 11:32+0100\n" +"PO-Revision-Date: 2013-12-29 18:20-0200\n" "Last-Translator: Fabrício Godoy <skarllot@gmail.com>\n" "Language-Team: Brazilian Portuguese <ldpbr-translation@lists.sourceforge." "net>\n" @@ -37,11 +37,10 @@ msgstr "Tratar todos avisos como fatais" msgid "Print available debug categories and exit" msgstr "Exibir as categorias de depuração disponíveis e sair" -#, fuzzy msgid "" "Default debug level from 1 (only error) to 9 (anything) or 0 for no output" msgstr "" -"Níveis de depuração predefinidos de 1 (apenas erros) até 5 (tudo) ou 0 para " +"Níveis de depuração predefinidos de 1 (apenas erros) até 9 (tudo) ou 0 para " "nenhuma saída" msgid "LEVEL" @@ -65,6 +64,8 @@ msgid "" "Changes coloring mode of the debug log. Possible modes: off, on, disable, " "auto, unix" msgstr "" +"Altera o modo de cor do log de depuração. Modos possíveis: off (desligado), " +"on (ligado), disable (desabilitado), auto (automático) e unix" msgid "Disable debugging" msgstr "Desabilitar depuração" @@ -272,7 +273,7 @@ msgstr "" #, c-format msgid "Error writing registry cache to %s: %s" -msgstr "" +msgstr "Erro ao escrever o cache de registro em %s: %s" msgid "title" msgstr "título" @@ -812,27 +813,28 @@ msgid "How the image should be rotated or flipped before display" msgstr "Como a imagem deveria ser rotacionada ou invertida antes da exibição" msgid "publisher" -msgstr "" +msgstr "editora" msgid "Name of the label or publisher" -msgstr "" +msgstr "Nome da gravadora ou editora" msgid "interpreted-by" -msgstr "" +msgstr "interpretado por" msgid "Information about the people behind a remix and similar interpretations" msgstr "" +"Informações sobre a pessoa detrás de um remix ou interpretações similares" msgid ", " msgstr ", " #, c-format msgid "No URI handler for the %s protocol found" -msgstr "" +msgstr "Nenhum manipulador URI para o protocolo %s foi encontrado" #, c-format msgid "URI scheme '%s' not supported" -msgstr "" +msgstr "Não há suporte para o esquema URI \"%s\"" #, c-format msgid "ERROR: from element %s: %s\n" @@ -917,7 +919,7 @@ msgid "Internal clock error." msgstr "Erro interno no temporizador." msgid "Failed to map buffer." -msgstr "" +msgstr "Falha ao mapear o buffer." msgid "Filter caps" msgstr "Caps do filtro" @@ -1154,9 +1156,8 @@ msgstr "AVISO: do elemento %s: %s\n" msgid "Prerolled, waiting for buffering to finish...\n" msgstr "Preparado, esperando o preenchimento do buffer para finalizar...\n" -#, fuzzy msgid "Prerolled, waiting for progress to finish...\n" -msgstr "Preparado, esperando o preenchimento do buffer para finalizar...\n" +msgstr "Preparado, esperando o progresso para finalizar...\n" msgid "buffering..." msgstr "preenchendo buffer..." @@ -1182,15 +1183,15 @@ msgstr "Interrupção: Parando a fila de processamento...\n" #, c-format msgid "Progress: (%s) %s\n" -msgstr "" +msgstr "Progresso: (%s) %s\n" #, c-format msgid "Missing element: %s\n" msgstr "Elemento faltando: %s\n" -#, fuzzy, c-format +#, c-format msgid "Got context from element '%s': %s=%s\n" -msgstr "AVISO: do elemento %s: %s\n" +msgstr "Contexto obtido do elemento \"%s\": %s=%s\n" msgid "Output tags (also known as metadata)" msgstr "Exibir etiquetas (metadados)" Binary files differ@@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: gstreamer 0.10.29.2\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2013-12-26 17:29+0100\n" +"POT-Creation-Date: 2014-02-08 11:32+0100\n" "PO-Revision-Date: 2010-08-16 01:10+0300\n" "Last-Translator: Lucian Adrian Grijincu <lucian.grijincu@gmail.com>\n" "Language-Team: Romanian <translation-team-ro@lists.sourceforge.net>\n" Binary files differ@@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: gstreamer 1.2.1\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2013-12-26 17:29+0100\n" +"POT-Creation-Date: 2014-02-08 11:32+0100\n" "PO-Revision-Date: 2013-12-08 12:44+0400\n" "Last-Translator: Yuri Kozlov <yuray@komyakino.ru>\n" "Language-Team: Russian <gnu@mx.ru>\n" Binary files differ@@ -15,7 +15,7 @@ msgid "" msgstr "" "Project-Id-Version: gstreamer 0.8.8\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2013-12-26 17:29+0100\n" +"POT-Creation-Date: 2014-02-08 11:32+0100\n" "PO-Revision-Date: 2005-04-04 10:55-0700\n" "Last-Translator: Steven Michael Murphy <murf@e-tools.com>\n" "Language-Team: Kinyarwanda <translation-team-rw@lists.sourceforge.net>\n" Binary files differ@@ -3,13 +3,13 @@ # Copyright (C) 2004, 2005 gstreamer's COPYRIGHT HOLDER # This file is put in the public domain. # -# Peter Tuhársky <tuharsky@misbb.sk>, 2007, 2008, 2009, 2010. +# Peter Tuhársky <tuharsky@misbb.sk>, 2007, 2008, 2009, 2010, 2014. msgid "" msgstr "" -"Project-Id-Version: gstreamer 0.10.30.3\n" +"Project-Id-Version: gstreamer 1.2.1\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2013-12-26 17:29+0100\n" -"PO-Revision-Date: 2010-11-08 16:13+0100\n" +"POT-Creation-Date: 2014-02-08 11:32+0100\n" +"PO-Revision-Date: 2014-01-30 10:24+0100\n" "Last-Translator: Peter Tuhársky <tuharsky@misbb.sk>\n" "Language-Team: Slovak <sk-i18n@lists.linux.sk>\n" "Language: sk\n" @@ -31,11 +31,10 @@ msgstr "Chápať všetky varovania ako závažné" msgid "Print available debug categories and exit" msgstr "Vypísať dostupné ladiace kategórie a skončiť" -#, fuzzy msgid "" "Default debug level from 1 (only error) to 9 (anything) or 0 for no output" msgstr "" -"Predvolená úroveň ladenia od 1 (len chyby) po 5 (všetko) alebo 0 (bez " +"Predvolená úroveň ladenia od 1 (len chyby) po 9 (všetko) alebo 0 (bez " "výstupu)" msgid "LEVEL" @@ -59,6 +58,8 @@ msgid "" "Changes coloring mode of the debug log. Possible modes: off, on, disable, " "auto, unix" msgstr "" +"Zmení farebný režim ladiaceho výstupu. Dostupné režimy: zapnutý, vypnutý, " +"zakázaný, automatický, unix" msgid "Disable debugging" msgstr "Zakázať ladenie" @@ -106,13 +107,10 @@ msgstr "GStreamer narazil na všeobecnú chybu hlavnej knižnice." msgid "" "GStreamer developers were too lazy to assign an error code to this error." msgstr "" -"Vývojári GStreamer boli príliš leniví na to, aby tejto chybe priradili kód. " -"Ohláste prosím túto chybu." +"Vývojári GStreamer boli príliš leniví na to, aby tejto chybe priradili kód." msgid "Internal GStreamer error: code not implemented." -msgstr "" -"Vnútorná chyba GStreamer: kód nebol implementovaný. Ohláste prosím túto " -"chybu." +msgstr "Vnútorná chyba GStreamer: kód nebol implementovaný." msgid "" "GStreamer error: state change failed and some element failed to post a " @@ -122,42 +120,31 @@ msgstr "" "patričné hlásenie o chybe s dôvodom zlyhania." msgid "Internal GStreamer error: pad problem." -msgstr "" -"Vnútorná chyba GStreamer: problém pri vyplňovaní. Ohláste prosím túto chybu." +msgstr "Vnútorná chyba GStreamer: problém pri vyplňovaní." msgid "Internal GStreamer error: thread problem." -msgstr "" -"Vnútorná chyba GStreamer: problém s vláknami. Ohláste prosím túto chybu." +msgstr "Vnútorná chyba GStreamer: problém s vláknami." -#, fuzzy msgid "GStreamer error: negotiation problem." -msgstr "" -"Vnútorná chyba GStreamer: problém pri vyjednávaní. Ohláste prosím túto chybu." +msgstr "Vnútorná chyba GStreamer: problém pri vyjednávaní." msgid "Internal GStreamer error: event problem." -msgstr "" -"Vnútorná chyba GStreamer: problém s udalosťami. Ohláste prosím túto chybu." +msgstr "Vnútorná chyba GStreamer: problém s udalosťami." msgid "Internal GStreamer error: seek problem." -msgstr "" -"Vnútorná chyba GStreamer: problém s nastavením pozície. Ohláste prosím túto " -"chybu." +msgstr "Vnútorná chyba GStreamer: problém s nastavením pozície." msgid "Internal GStreamer error: caps problem." -msgstr "" -"Vnútorná chyba GStreamer: problém schopností. Ohláste prosím túto chybu." +msgstr "Vnútorná chyba GStreamer: problém schopností." msgid "Internal GStreamer error: tag problem." -msgstr "" -"Vnútorná chyba GStreamer: problém so značkami. Ohláste prosím túto chybu." +msgstr "Vnútorná chyba GStreamer: problém so značkami." msgid "Your GStreamer installation is missing a plug-in." -msgstr "Vašej inštalácii GStreamer chýba zásuvný modul." +msgstr "Vašej inštalácii GStreamer chýba nejaký zásuvný modul." -#, fuzzy msgid "GStreamer error: clock problem." -msgstr "" -"Vnútorná chyba GStreamer: problém s časovaním. Ohláste prosím túto chybu." +msgstr "Vnútorná chyba GStreamer: problém s časovaním." msgid "" "This application is trying to use GStreamer functionality that has been " @@ -432,12 +419,11 @@ msgstr "uri pre copyright" msgid "URI to the copyright notice of the data" msgstr "URI pre poznámku o autorských právach údajov" -#, fuzzy msgid "encoded by" msgstr "kodér" msgid "name of the encoding person or organization" -msgstr "" +msgstr "meno kódujúcej osoby alebo organizácie" msgid "contact" msgstr "kontakt" @@ -580,13 +566,12 @@ msgstr "Referenčná úroveň zisku pre stopu a pre album" msgid "language code" msgstr "jazykový kód" -#, fuzzy msgid "language code for this stream, conforming to ISO-639-1 or ISO-639-2" -msgstr "jazykový kód pre tento prúd údajov, v súlade s ISO-639-1" +msgstr "" +"Jazykový kód pre tento prúd údajov, v súlade s ISO-639-1 alebo ISO-639-2" -#, fuzzy msgid "language name" -msgstr "jazykový kód" +msgstr "názov jazyku" msgid "freeform name of the language this stream is in" msgstr "" @@ -623,7 +608,7 @@ msgid "comma separated keywords describing the content" msgstr "kľúčové slová, opisujúce obsah, oddelené čiarkou" msgid "geo location name" -msgstr "geografická poloha" +msgstr "zemepisná poloha - názov" msgid "" "human readable descriptive location of where the media has been recorded or " @@ -655,7 +640,7 @@ msgstr "" "pre západné dĺžky)" msgid "geo location elevation" -msgstr "zemepisná nadmorská výška" +msgstr "nadmorská výška" msgid "" "geo elevation of where the media has been recorded or produced in meters " @@ -665,21 +650,20 @@ msgstr "" "produkované, v metroch podľa WGS84 (0 je priemerná hladina mora)" msgid "geo location country" -msgstr "zemepisná poloha krajina" +msgstr "zemepisná poloha - krajina" msgid "country (english name) where the media has been recorded or produced" msgstr "krajina (v angličtine), kde bolo toto médium nahraté alebo produkované" msgid "geo location city" -msgstr "zemepisná poloha mesto" +msgstr "zemepisná poloha - mesto" msgid "city (english name) where the media has been recorded or produced" msgstr "mesto (v angličtine), kde bolo toto médium nahraté alebo produkované" msgid "geo location sublocation" -msgstr "zemepisná poloha upresnenie" +msgstr "zemepisná poloha - upresnenie" -#, fuzzy msgid "" "a location within a city where the media has been produced or created (e.g. " "the neighborhood)" @@ -688,20 +672,20 @@ msgstr "" "vytvorené (napr. v susedstve)" msgid "geo location horizontal error" -msgstr "geografická poloha vodorovná odchýlka" +msgstr "geografická poloha - vodorovná odchýlka" msgid "expected error of the horizontal positioning measures (in meters)" msgstr "očakávaná odchýlka vodorovného umiestnenia (v metroch)" msgid "geo location movement speed" -msgstr "zemepisná poloha rýchlosť pohybu" +msgstr "zemepisná poloha - rýchlosť pohybu" msgid "" "movement speed of the capturing device while performing the capture in m/s" msgstr "rýchlosť pohybu zachytávajúceho zariadenia počas zachytávania v m/s" msgid "geo location movement direction" -msgstr "zemepisná poloha smer pohybu" +msgstr "zemepisná poloha - smer pohybu" msgid "" "indicates the movement direction of the device performing the capture of a " @@ -713,7 +697,7 @@ msgstr "" "geografický sever, a zvyšuje sa v smere hodinových ručičiek" msgid "geo location capture direction" -msgstr "zemepisná poloha smer zachytávania" +msgstr "zemepisná poloha - smer zachytávania" msgid "" "indicates the direction the device is pointing to when capturing a media. " @@ -815,27 +799,27 @@ msgid "How the image should be rotated or flipped before display" msgstr "Ako má byť obrázok otočený alebo prevrátený pred jeho zobrazením" msgid "publisher" -msgstr "" +msgstr "vydavateľ" msgid "Name of the label or publisher" msgstr "" msgid "interpreted-by" -msgstr "" +msgstr "interpret" msgid "Information about the people behind a remix and similar interpretations" -msgstr "" +msgstr "Informácie o ľuďoch v pozadí remixovania a podobných interpretácií" msgid ", " msgstr ", " #, c-format msgid "No URI handler for the %s protocol found" -msgstr "" +msgstr "Nenašla sa obsluha URI pre protokol %s" #, c-format msgid "URI scheme '%s' not supported" -msgstr "" +msgstr "URI schéma '%s' nie je podporovaná" #, c-format msgid "ERROR: from element %s: %s\n" @@ -918,7 +902,7 @@ msgid "Internal clock error." msgstr "Vnútorná chyba časovača." msgid "Failed to map buffer." -msgstr "" +msgstr "Zlyhalo vytváranie vyrovnávacej pamäte." msgid "Filter caps" msgstr "Filtrovať schopnosti" @@ -927,7 +911,7 @@ msgid "" "Restrict the possible allowed capabilities (NULL means ANY). Setting this " "property takes a reference to the supplied GstCaps object." msgstr "" -"Obmedziť možné povolené schopnosti (NULL znamená ĽUBOVOĽNÉ). Nastavenie " +"Obmedziť možné povolené schopnosti (NULOVÉ znamená ĽUBOVOĽNÉ). Nastavenie " "tejto vlastnosti berie referenciu na zadaný objekt GstCaps." msgid "No file name specified for writing." @@ -1012,13 +996,13 @@ msgid "controllable" msgstr "ovládateľné" msgid "changeable in NULL, READY, PAUSED or PLAYING state" -msgstr "" +msgstr "meniteľné v stave NULOVÝ, PRIPRAVENÝ, POZASTAVENÝ alebo HRAJÚCI" msgid "changeable only in NULL, READY or PAUSED state" -msgstr "" +msgstr "meniteľné v iba stave NULOVÝ, PRIPRAVENÝ alebo POZASTAVENÝ" msgid "changeable only in NULL or READY state" -msgstr "" +msgstr "meniteľné iba v stave NULOVÝ alebo PRIPRAVENÝ" msgid "Blacklisted files:" msgstr "Zakázané súbory:" @@ -1075,12 +1059,14 @@ msgid "List the plugin contents" msgstr "Vypísať zoznam zásuvných modulov" msgid "Check if the specified element or plugin exists" -msgstr "" +msgstr "Skontrolovať, či existuje vybraný prvok alebo zásuvný modul" msgid "" "When checking if an element or plugin exists, also check that its version is " "at least the version specified" msgstr "" +"Pri kontrole, či existuje daný prvok alebo zásuvný modul, skontrolovať aj či " +"je jeho verzia aspoň na určenej úrovni" msgid "Print supported URI schemes, with the elements that implement them" msgstr "" @@ -1095,7 +1081,7 @@ msgid "No such element or plugin '%s'\n" msgstr "Takýto prvok alebo zásuvný modul neexistuje '%s'\n" msgid "Index statistics" -msgstr "" +msgstr "Štatistika indexu" #, c-format msgid "Got message #%u from element \"%s\" (%s): " @@ -1132,17 +1118,16 @@ msgstr "NAŠLA SA ZNAČKA : našiel ju objekt \"%s\".\n" msgid "FOUND TAG\n" msgstr "NAŠLA SA ZNAČKA\n" -#, fuzzy, c-format +#, c-format msgid "FOUND TOC : found by element \"%s\".\n" -msgstr "NAŠLA SA ZNAČKA : našiel ju prvok \"%s\".\n" +msgstr "NAŠLA SA TABUĽKA : našiel ju prvok \"%s\".\n" -#, fuzzy, c-format +#, c-format msgid "FOUND TOC : found by object \"%s\".\n" -msgstr "NAŠLA SA ZNAČKA : našiel ju objekt \"%s\".\n" +msgstr "NAŠLA SA TABUĽKA : našiel ju objekt \"%s\".\n" -#, fuzzy msgid "FOUND TOC\n" -msgstr "NAŠLA SA ZNAČKA\n" +msgstr "NAŠLA SA TABUĽKA\n" #, c-format msgid "" @@ -1159,15 +1144,14 @@ msgstr "VAROVANIE: z prvku %s: %s\n" msgid "Prerolled, waiting for buffering to finish...\n" msgstr "Predčítané, čakám na dokončenie napĺňania vyrovnávacej pamäte...\n" -#, fuzzy msgid "Prerolled, waiting for progress to finish...\n" -msgstr "Predčítané, čakám na dokončenie napĺňania vyrovnávacej pamäte...\n" +msgstr "Predčítané, čakám na dokončenie...\n" msgid "buffering..." msgstr "Ukladám do vyrovnávacej pamäte..." msgid "Done buffering, setting pipeline to PLAYING ...\n" -msgstr "Vyrovnávacia pamäť je naplnená, nastavujem rúru na PREHRÁVA ...\n" +msgstr "Vyrovnávacia pamäť je naplnená, nastavujem rúru na HRAJÚCU ...\n" msgid "Buffering, setting pipeline to PAUSED ...\n" msgstr "Napĺňa sa vyrovnávacia pamäť, nastavujem rúru na POZASTAVENÚ ...\n" @@ -1184,21 +1168,21 @@ msgstr "Prerušenie: Zastavujem rúru ...\n" #, c-format msgid "Progress: (%s) %s\n" -msgstr "" +msgstr "Priebeh: (%s) %s\n" -#, fuzzy, c-format +#, c-format msgid "Missing element: %s\n" -msgstr "prvok \"%s\" neexistuje" +msgstr "Chýba prvok %s\n" -#, fuzzy, c-format +#, c-format msgid "Got context from element '%s': %s=%s\n" -msgstr "VAROVANIE: z prvku %s: %s\n" +msgstr "Získal som kontext z prvku '%s': %s=%s\n" msgid "Output tags (also known as metadata)" msgstr "Vypísať značky (známe tiež ako metadáta)" msgid "Output TOC (chapters and editions)" -msgstr "" +msgstr "Výstupná tabuľka obsahu (kapitoly a vydania)" msgid "Output status information and property notifications" msgstr "Vypísať informácie o stave a upozornenia o vlastnostiach" @@ -1222,7 +1206,7 @@ msgid "Force EOS on sources before shutting the pipeline down" msgstr "Vynútiť EOS na zdrojoch pred vypnutím rúry" msgid "Gather and print index statistics" -msgstr "" +msgstr "Zozbierať a zobraziť štatistiku indexu" #, c-format msgid "ERROR: pipeline could not be constructed: %s.\n" @@ -1259,7 +1243,7 @@ msgid "Pipeline is PREROLLED ...\n" msgstr "Rúra je v stave PREROLLED ...\n" msgid "Setting pipeline to PLAYING ...\n" -msgstr "Nastavujem rúru na PREHRÁVA ...\n" +msgstr "Nastavujem rúru na HRAJÚCU ...\n" # On strike? msgid "ERROR: pipeline doesn't want to play.\n" @@ -1268,9 +1252,8 @@ msgstr "CHYBA: Rúra nechce hrať.\n" msgid "EOS on shutdown enabled -- Forcing EOS on the pipeline\n" msgstr "EOS pri vypnutí je povolený -- Vynucujem EOS pre rúru\n" -#, fuzzy msgid "EOS on shutdown enabled -- waiting for EOS after Error\n" -msgstr "EOS pri vypnutí je povolený -- Vynucujem EOS pre rúru\n" +msgstr "EOS pri vypnutí je povolený -- čakám na EOS po chybe\n" msgid "Waiting for EOS...\n" msgstr "Čakám na EOS...\n" @@ -1278,9 +1261,8 @@ msgstr "Čakám na EOS...\n" msgid "EOS received - stopping pipeline...\n" msgstr "Prijatý EOS - zastavujem rúru ...\n" -#, fuzzy msgid "Interrupt while waiting for EOS - stopping pipeline...\n" -msgstr "Prerušenie: Zastavujem rúru ...\n" +msgstr "Prerušenie počas čakania na EOS - zastavujem rúru ...\n" msgid "An error happened while waiting for EOS\n" msgstr "Počas čakania na EOS nastala chyba\n" @@ -1297,8 +1279,8 @@ msgstr "Nastavujem rúru na NULOVÚ ...\n" msgid "Freeing pipeline ...\n" msgstr "Uvoľňujem rúru ...\n" -#~ msgid "Print alloc trace (if enabled at compile time)" -#~ msgstr "Vypisovať stopu alokácie (ak je to povolené pri kompilácii)" +#~ msgid "maximum" +#~ msgstr "maximum" #~ msgid "Usage: gst-xmllaunch <file.xml> [ element.property=value ... ]\n" #~ msgstr "" @@ -1330,6 +1312,9 @@ msgstr "Uvoľňujem rúru ...\n" #~ msgid "Do not install signal handlers for SIGUSR1 and SIGUSR2" #~ msgstr "Neinštalovať obsluhu signálov SIGUSR1 a SIGUSR2" +#~ msgid "Print alloc trace (if enabled at compile time)" +#~ msgstr "Vypisovať stopu alokácie (ak je to povolené pri kompilácii)" + #~ msgid "Error re-scanning registry %s: %s" #~ msgstr "Chyba pri opätovnom skenovaní registrov %s: %s" @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: gstreamer-1.0.3\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2013-12-26 17:29+0100\n" +"POT-Creation-Date: 2014-02-08 11:32+0100\n" "PO-Revision-Date: 2013-01-05 10:16+0100\n" "Last-Translator: Klemen Košir <klemen913@gmail.com>\n" "Language-Team: Slovenian <translation-team-sl@lists.sourceforge.net>\n" Binary files differ@@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: gstreamer 0.8.4\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2013-12-26 17:29+0100\n" +"POT-Creation-Date: 2014-02-08 11:32+0100\n" "PO-Revision-Date: 2004-08-07 23:46+0200\n" "Last-Translator: Laurent Dhima <laurenti@alblinux.net>\n" "Language-Team: Albanian <begraj@hotmail.com>\n" Binary files differ@@ -2,13 +2,13 @@ # Copyright (C) 2004, 2005 Free Software Foundation, Inc. # This file is distributed under the same license as the gstreamer package. # Danilo Segan <dsegan@gmx.net>, 2004, 2005. -# Мирослав Николић <miroslavnikolic@rocketmail.com>, 2011, 2013. +# Мирослав Николић <miroslavnikolic@rocketmail.com>, 2011, 2013, 2014. msgid "" msgstr "" -"Project-Id-Version: gstreamer-1.1.4\n" +"Project-Id-Version: gstreamer-1.2.1\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2013-12-26 17:29+0100\n" -"PO-Revision-Date: 2013-10-04 22:39+0200\n" +"POT-Creation-Date: 2014-02-08 11:32+0100\n" +"PO-Revision-Date: 2014-01-13 17:53+0200\n" "Last-Translator: Мирослав Николић <miroslavnikolic@rocketmail.com>\n" "Language-Team: Serbian <(nothing)>\n" "Language: sr\n" @@ -28,12 +28,11 @@ msgstr "Чини сва упозорења кобним" msgid "Print available debug categories and exit" msgstr "Исписује доступне категорије за уклањање грешака и излази" -#, fuzzy msgid "" "Default debug level from 1 (only error) to 9 (anything) or 0 for no output" msgstr "" -"Подразумевани ниво за уклањање грешака од 1 (само грешке) до 5 (све) или 0 " -"(без излаза)" +"Основни ниво за уклањање грешака од 1 (само грешке) до 9 (све) или 0 (без " +"излаза)" msgid "LEVEL" msgstr "НИВО" @@ -1176,9 +1175,9 @@ msgstr "Напредовање: (%s) %s\n" msgid "Missing element: %s\n" msgstr "Недостаје елемент: %s\n" -#, fuzzy, c-format +#, c-format msgid "Got context from element '%s': %s=%s\n" -msgstr "Добих садржај из елемента „%s“: %s\n" +msgstr "Добих садржај из елемента „%s“: %s=%s\n" msgid "Output tags (also known as metadata)" msgstr "Излазне ознаке (такође познате и као метаподаци)" Binary files differ@@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: gstreamer 0.10.31.2\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2013-12-26 17:29+0100\n" +"POT-Creation-Date: 2014-02-08 11:32+0100\n" "PO-Revision-Date: 2011-01-09 19:46+0100\n" "Last-Translator: Daniel Nylander <po@danielnylander.se>\n" "Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n" Binary files differ@@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: gstreamer 0.8.0\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2013-12-26 17:29+0100\n" +"POT-Creation-Date: 2014-02-08 11:32+0100\n" "PO-Revision-Date: 2004-04-03 03:14+0300\n" "Last-Translator: Baris Cicek <baris@teamforce.name.tr>\n" "Language-Team: Turkish <gnu-tr-u12a@lists.sourceforge.net>\n" Binary files differ@@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: gstreamer 1.2.1\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2013-12-26 17:29+0100\n" +"POT-Creation-Date: 2014-02-08 11:32+0100\n" "PO-Revision-Date: 2013-12-07 22:49+0200\n" "Last-Translator: Yuri Chornoivan <yurchor@ukr.net>\n" "Language-Team: Ukrainian <translation-team-uk@lists.sourceforge.net>\n" Binary files differ@@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: gstreamer-1.2.1\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2013-12-26 17:29+0100\n" +"POT-Creation-Date: 2014-02-08 11:32+0100\n" "PO-Revision-Date: 2013-12-11 08:08+0700\n" "Last-Translator: Trần Ngọc Quân <vnwildman@gmail.com>\n" "Language-Team: Vietnamese <translation-team-vi@lists.sourceforge.net>\n" diff --git a/po/zh_CN.gmo b/po/zh_CN.gmo Binary files differindex 8f81919..9abd94c 100644 --- a/po/zh_CN.gmo +++ b/po/zh_CN.gmo diff --git a/po/zh_CN.po b/po/zh_CN.po index 52f7621..0096c03 100644 --- a/po/zh_CN.po +++ b/po/zh_CN.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: gstreamer 0.10.25.2\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2013-12-26 17:29+0100\n" +"POT-Creation-Date: 2014-02-08 11:32+0100\n" "PO-Revision-Date: 2010-02-02 18:58+0800\n" "Last-Translator: Ji ZhengYu <zhengyuji@gmail.com>\n" "Language-Team: Chinese (simplified) <i18n-zh@googlegroups.com>\n" diff --git a/po/zh_TW.gmo b/po/zh_TW.gmo Binary files differindex 43d975a..f2f6f89 100644 --- a/po/zh_TW.gmo +++ b/po/zh_TW.gmo diff --git a/po/zh_TW.po b/po/zh_TW.po index 86dc7fa..967d8a3 100644 --- a/po/zh_TW.po +++ b/po/zh_TW.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: gstreamer 0.8.8\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2013-12-26 17:29+0100\n" +"POT-Creation-Date: 2014-02-08 11:32+0100\n" "PO-Revision-Date: 2005-04-27 14:55+0800\n" "Last-Translator: Abel Cheung <abelcheung@gmail.com>\n" "Language-Team: Chinese (traditional) <zh-l10n@linux.org.tw>\n" diff --git a/tests/Makefile.in b/tests/Makefile.in index 31318e5..a1f0f1b 100644 --- a/tests/Makefile.in +++ b/tests/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.14 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. diff --git a/tests/benchmarks/Makefile.in b/tests/benchmarks/Makefile.in index 6beab2c..f84e20a 100644 --- a/tests/benchmarks/Makefile.in +++ b/tests/benchmarks/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.14 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. diff --git a/tests/check/Makefile.am b/tests/check/Makefile.am index 0568d90..28b0173 100644 --- a/tests/check/Makefile.am +++ b/tests/check/Makefile.am @@ -88,6 +88,7 @@ REGISTRY_CHECKS = \ elements/queue \ elements/queue2 \ elements/valve \ + libs/baseparse \ libs/basesrc \ libs/basesink \ libs/controller \ diff --git a/tests/check/Makefile.in b/tests/check/Makefile.in index 86175b6..7762a11 100644 --- a/tests/check/Makefile.in +++ b/tests/check/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.14 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. @@ -187,6 +187,7 @@ CONFIG_CLEAN_VPATH_FILES = @GST_DISABLE_REGISTRY_FALSE@ elements/queue$(EXEEXT) \ @GST_DISABLE_REGISTRY_FALSE@ elements/queue2$(EXEEXT) \ @GST_DISABLE_REGISTRY_FALSE@ elements/valve$(EXEEXT) \ +@GST_DISABLE_REGISTRY_FALSE@ libs/baseparse$(EXEEXT) \ @GST_DISABLE_REGISTRY_FALSE@ libs/basesrc$(EXEEXT) \ @GST_DISABLE_REGISTRY_FALSE@ libs/basesink$(EXEEXT) \ @GST_DISABLE_REGISTRY_FALSE@ libs/controller$(EXEEXT) \ @@ -585,6 +586,12 @@ libs_adapter_LDADD = $(LDADD) libs_adapter_DEPENDENCIES = $(top_builddir)/libs/gst/check/libgstcheck-@GST_API_VERSION@.la \ $(top_builddir)/libs/gst/base/libgstbase-@GST_API_VERSION@.la \ $(am__DEPENDENCIES_1) +libs_baseparse_SOURCES = libs/baseparse.c +libs_baseparse_OBJECTS = libs/baseparse.$(OBJEXT) +libs_baseparse_LDADD = $(LDADD) +libs_baseparse_DEPENDENCIES = $(top_builddir)/libs/gst/check/libgstcheck-@GST_API_VERSION@.la \ + $(top_builddir)/libs/gst/base/libgstbase-@GST_API_VERSION@.la \ + $(am__DEPENDENCIES_1) libs_basesink_SOURCES = libs/basesink.c libs_basesink_OBJECTS = libs/basesink.$(OBJEXT) libs_basesink_LDADD = $(LDADD) @@ -792,16 +799,16 @@ SOURCES = elements/capsfilter.c elements/fakesink.c elements/fakesrc.c \ gst/gstsegment.c gst/gststructure.c gst/gstsystemclock.c \ gst/gsttag.c gst/gsttagsetter.c gst/gsttask.c gst/gsttoc.c \ gst/gsttocsetter.c gst/gsturi.c gst/gstutils.c gst/gstvalue.c \ - libs/adapter.c libs/basesink.c libs/basesrc.c libs/bitreader.c \ - libs/bytereader.c libs/bytewriter.c libs/collectpads.c \ - libs/controller.c $(libs_gstlibscpp_SOURCES) \ - libs/gstnetclientclock.c libs/gstnettimeprovider.c \ - libs/gsttestclock.c libs/libsabi.c libs/queuearray.c \ - libs/transform1.c libs/typefindhelper.c pipelines/cleanup.c \ - pipelines/parse-disabled.c pipelines/parse-launch.c \ - pipelines/queue-error.c pipelines/seek.c \ - pipelines/simple-launch-lines.c pipelines/stress.c \ - tools/gstinspect.c + libs/adapter.c libs/baseparse.c libs/basesink.c libs/basesrc.c \ + libs/bitreader.c libs/bytereader.c libs/bytewriter.c \ + libs/collectpads.c libs/controller.c \ + $(libs_gstlibscpp_SOURCES) libs/gstnetclientclock.c \ + libs/gstnettimeprovider.c libs/gsttestclock.c libs/libsabi.c \ + libs/queuearray.c libs/transform1.c libs/typefindhelper.c \ + pipelines/cleanup.c pipelines/parse-disabled.c \ + pipelines/parse-launch.c pipelines/queue-error.c \ + pipelines/seek.c pipelines/simple-launch-lines.c \ + pipelines/stress.c tools/gstinspect.c DIST_SOURCES = elements/capsfilter.c elements/fakesink.c \ elements/fakesrc.c elements/fdsrc.c elements/filesink.c \ elements/filesrc.c elements/funnel.c elements/identity.c \ @@ -821,16 +828,16 @@ DIST_SOURCES = elements/capsfilter.c elements/fakesink.c \ gst/gstsegment.c gst/gststructure.c gst/gstsystemclock.c \ gst/gsttag.c gst/gsttagsetter.c gst/gsttask.c gst/gsttoc.c \ gst/gsttocsetter.c gst/gsturi.c gst/gstutils.c gst/gstvalue.c \ - libs/adapter.c libs/basesink.c libs/basesrc.c libs/bitreader.c \ - libs/bytereader.c libs/bytewriter.c libs/collectpads.c \ - libs/controller.c $(libs_gstlibscpp_SOURCES) \ - libs/gstnetclientclock.c libs/gstnettimeprovider.c \ - libs/gsttestclock.c libs/libsabi.c libs/queuearray.c \ - libs/transform1.c libs/typefindhelper.c pipelines/cleanup.c \ - pipelines/parse-disabled.c pipelines/parse-launch.c \ - pipelines/queue-error.c pipelines/seek.c \ - pipelines/simple-launch-lines.c pipelines/stress.c \ - tools/gstinspect.c + libs/adapter.c libs/baseparse.c libs/basesink.c libs/basesrc.c \ + libs/bitreader.c libs/bytereader.c libs/bytewriter.c \ + libs/collectpads.c libs/controller.c \ + $(libs_gstlibscpp_SOURCES) libs/gstnetclientclock.c \ + libs/gstnettimeprovider.c libs/gsttestclock.c libs/libsabi.c \ + libs/queuearray.c libs/transform1.c libs/typefindhelper.c \ + pipelines/cleanup.c pipelines/parse-disabled.c \ + pipelines/parse-launch.c pipelines/queue-error.c \ + pipelines/seek.c pipelines/simple-launch-lines.c \ + pipelines/stress.c tools/gstinspect.c am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ @@ -1400,6 +1407,7 @@ LIBSABI_CHECKS = libs/libsabi @GST_DISABLE_REGISTRY_FALSE@ elements/queue \ @GST_DISABLE_REGISTRY_FALSE@ elements/queue2 \ @GST_DISABLE_REGISTRY_FALSE@ elements/valve \ +@GST_DISABLE_REGISTRY_FALSE@ libs/baseparse \ @GST_DISABLE_REGISTRY_FALSE@ libs/basesrc \ @GST_DISABLE_REGISTRY_FALSE@ libs/basesink \ @GST_DISABLE_REGISTRY_FALSE@ libs/controller \ @@ -1948,6 +1956,12 @@ libs/adapter.$(OBJEXT): libs/$(am__dirstamp) \ libs/adapter$(EXEEXT): $(libs_adapter_OBJECTS) $(libs_adapter_DEPENDENCIES) $(EXTRA_libs_adapter_DEPENDENCIES) libs/$(am__dirstamp) @rm -f libs/adapter$(EXEEXT) $(AM_V_CCLD)$(LINK) $(libs_adapter_OBJECTS) $(libs_adapter_LDADD) $(LIBS) +libs/baseparse.$(OBJEXT): libs/$(am__dirstamp) \ + libs/$(DEPDIR)/$(am__dirstamp) + +libs/baseparse$(EXEEXT): $(libs_baseparse_OBJECTS) $(libs_baseparse_DEPENDENCIES) $(EXTRA_libs_baseparse_DEPENDENCIES) libs/$(am__dirstamp) + @rm -f libs/baseparse$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(libs_baseparse_OBJECTS) $(libs_baseparse_LDADD) $(LIBS) libs/basesink.$(OBJEXT): libs/$(am__dirstamp) \ libs/$(DEPDIR)/$(am__dirstamp) @@ -2173,6 +2187,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@gst/$(DEPDIR)/gstutils.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@gst/$(DEPDIR)/gstvalue.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libs/$(DEPDIR)/adapter.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@libs/$(DEPDIR)/baseparse.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libs/$(DEPDIR)/basesink.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libs/$(DEPDIR)/basesrc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libs/$(DEPDIR)/bitreader.Po@am__quote@ @@ -2940,6 +2955,13 @@ elements/valve.log: elements/valve$(EXEEXT) --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) +libs/baseparse.log: libs/baseparse$(EXEEXT) + @p='libs/baseparse$(EXEEXT)'; \ + b='libs/baseparse'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) libs/basesrc.log: libs/basesrc$(EXEEXT) @p='libs/basesrc$(EXEEXT)'; \ b='libs/basesrc'; \ diff --git a/tests/check/gst/gstpad.c b/tests/check/gst/gstpad.c index 406d1ce..2b193b1 100644 --- a/tests/check/gst/gstpad.c +++ b/tests/check/gst/gstpad.c @@ -1109,7 +1109,6 @@ test_pad_blocking_with_type (GstPadProbeType type) id = gst_pad_add_probe (pad, type, block_async_cb_return_ok, NULL, NULL); - thread = g_thread_try_new ("gst-check", (GThreadFunc) push_buffer_async, pad, NULL); @@ -1192,6 +1191,106 @@ GST_START_TEST (test_pad_probe_remove) GST_END_TEST; +static GstPadProbeReturn +probe_block_a (GstPad * pad, GstPadProbeInfo * info, gpointer user_data) +{ + return GST_PAD_PROBE_OK; +} + +static GstPadProbeReturn +probe_block_b (GstPad * pad, GstPadProbeInfo * info, gpointer user_data) +{ + gboolean *probe_b_called = user_data; + + *probe_b_called = TRUE; + + return GST_PAD_PROBE_OK; +} + +static GstPadProbeReturn +probe_block_c (GstPad * pad, GstPadProbeInfo * info, gpointer user_data) +{ + gboolean *probe_c_called = user_data; + + *probe_c_called = TRUE; + + return GST_PAD_PROBE_REMOVE; +} + +GST_START_TEST (test_pad_probe_block_add_remove) +{ + GstPad *pad; + GThread *thread; + gulong probe_a, probe_b; + gboolean probe_b_called = FALSE; + gboolean probe_c_called = FALSE; + + pad = gst_pad_new ("src", GST_PAD_SRC); + fail_unless (pad != NULL); + + gst_pad_set_active (pad, TRUE); + fail_unless (pad->num_probes == 0); + fail_unless (pad->num_blocked == 0); + + fail_unless (gst_pad_push_event (pad, + gst_event_new_stream_start ("test")) == TRUE); + fail_unless (gst_pad_push_event (pad, + gst_event_new_segment (&dummy_segment)) == TRUE); + + probe_a = gst_pad_add_probe (pad, + GST_PAD_PROBE_TYPE_BLOCK | GST_PAD_PROBE_TYPE_BUFFER, + probe_block_a, NULL, NULL); + + fail_unless (pad->num_probes == 1); + fail_unless (pad->num_blocked == 1); + + thread = g_thread_try_new ("gst-check", (GThreadFunc) push_buffer_async, + pad, NULL); + + /* wait for the block */ + while (!gst_pad_is_blocking (pad)) { + g_usleep (10000); + } + + probe_b = gst_pad_add_probe (pad, + GST_PAD_PROBE_TYPE_BLOCK | GST_PAD_PROBE_TYPE_BUFFER, + probe_block_b, &probe_b_called, NULL); + + gst_pad_remove_probe (pad, probe_a); + + /* wait for the callback */ + while (!probe_b_called) { + g_usleep (10000); + } + + /* wait for the block */ + while (!gst_pad_is_blocking (pad)) { + g_usleep (10000); + } + + gst_pad_add_probe (pad, + GST_PAD_PROBE_TYPE_BLOCK | GST_PAD_PROBE_TYPE_BUFFER, + probe_block_c, &probe_c_called, NULL); + + gst_pad_remove_probe (pad, probe_b); + + /* wait for the callback */ + while (!probe_c_called) { + g_usleep (10000); + } + + /* wait for the unblock */ + while (gst_pad_is_blocking (pad)) { + g_usleep (10000); + } + + gst_object_unref (pad); + + g_thread_join (thread); +} + +GST_END_TEST; + static gboolean src_flush_start_probe_called = FALSE; static gboolean src_flush_stop_probe_called = FALSE; static gboolean sink_flush_start_probe_called = FALSE; @@ -1746,6 +1845,7 @@ gst_pad_suite (void) tcase_add_test (tc_chain, test_pad_blocking_with_probe_type_block); tcase_add_test (tc_chain, test_pad_blocking_with_probe_type_blocking); tcase_add_test (tc_chain, test_pad_probe_remove); + tcase_add_test (tc_chain, test_pad_probe_block_add_remove); tcase_add_test (tc_chain, test_pad_probe_flush_events); tcase_add_test (tc_chain, test_queue_src_caps_notify_linked); tcase_add_test (tc_chain, test_queue_src_caps_notify_not_linked); diff --git a/tests/check/gst/gstsegment.c b/tests/check/gst/gstsegment.c index 4c15133..771d15d 100644 --- a/tests/check/gst/gstsegment.c +++ b/tests/check/gst/gstsegment.c @@ -613,6 +613,86 @@ GST_START_TEST (segment_seek_noupdate) GST_END_TEST; +GST_START_TEST (segment_offset) +{ + GstSegment segment; + + gst_segment_init (&segment, GST_FORMAT_TIME); + + segment.start = 0; + segment.position = 50; + segment.stop = 200; + segment.time = 0; + + check_times (&segment, 20, 20, 20); + check_times (&segment, 220, -1, -1); + + fail_unless (gst_segment_offset_running_time (&segment, GST_FORMAT_TIME, + 0) == TRUE); + fail_unless (segment.start == 0); + fail_unless (segment.stop == 200); + fail_unless (segment.time == 0); + fail_unless (segment.position == 50); + fail_unless (segment.base == 0); + fail_unless (segment.offset == 0); + check_times (&segment, 20, 20, 20); + + fail_unless (gst_segment_offset_running_time (&segment, GST_FORMAT_TIME, + 100) == TRUE); + fail_unless (segment.start == 0); + fail_unless (segment.stop == 200); + fail_unless (segment.time == 0); + fail_unless (segment.position == 50); + fail_unless (segment.base == 100); + fail_unless (segment.offset == 0); + check_times (&segment, 20, 20, 120); + + fail_unless (gst_segment_offset_running_time (&segment, GST_FORMAT_TIME, + -50) == TRUE); + fail_unless (segment.start == 0); + fail_unless (segment.stop == 200); + fail_unless (segment.time == 0); + fail_unless (segment.position == 50); + fail_unless (segment.base == 50); + fail_unless (segment.offset == 0); + check_times (&segment, 20, 20, 70); + + fail_unless (gst_segment_offset_running_time (&segment, GST_FORMAT_TIME, + -100) == TRUE); + fail_unless (segment.start == 0); + fail_unless (segment.stop == 200); + fail_unless (segment.time == 0); + fail_unless (segment.position == 50); + fail_unless (segment.base == 0); + fail_unless (segment.offset == 50); + check_times (&segment, 20, 20, -1); + check_times (&segment, 200, 200, 150); + + /* can go negative */ + fail_unless (gst_segment_offset_running_time (&segment, GST_FORMAT_TIME, + -151) == FALSE); + fail_unless (segment.start == 0); + fail_unless (segment.stop == 200); + fail_unless (segment.time == 0); + fail_unless (segment.position == 50); + fail_unless (segment.base == 0); + fail_unless (segment.offset == 50); + check_times (&segment, 100, 100, 50); + check_times (&segment, 200, 200, 150); + + fail_unless (gst_segment_offset_running_time (&segment, GST_FORMAT_TIME, + -150) == TRUE); + fail_unless (segment.start == 0); + fail_unless (segment.stop == 200); + fail_unless (segment.time == 0); + fail_unless (segment.position == 50); + fail_unless (segment.base == 0); + fail_unless (segment.offset == 200); + check_times (&segment, 200, 200, 0); +} + +GST_END_TEST; + static Suite * gst_segment_suite (void) @@ -629,6 +709,7 @@ gst_segment_suite (void) tcase_add_test (tc_chain, segment_seek_rate); tcase_add_test (tc_chain, segment_copy); tcase_add_test (tc_chain, segment_seek_noupdate); + tcase_add_test (tc_chain, segment_offset); return s; } diff --git a/tests/check/libs/baseparse.c b/tests/check/libs/baseparse.c new file mode 100644 index 0000000..42b260b --- /dev/null +++ b/tests/check/libs/baseparse.c @@ -0,0 +1,304 @@ +/* GStreamer + * + * Copyright (C) 2014 Samsung Electronics. All rights reserved. + * Author: Thiago Santos <ts.santos@sisa.samsung.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include <gst/gst.h> +#include <gst/check/gstcheck.h> +#include <gst/base/gstbaseparse.h> + +static GstPad *mysrcpad, *mysinkpad; +static GstElement *parsetest; + +#define TEST_VIDEO_WIDTH 640 +#define TEST_VIDEO_HEIGHT 480 +#define TEST_VIDEO_FPS_N 30 +#define TEST_VIDEO_FPS_D 1 + +#define GST_PARSER_TESTER_TYPE gst_parser_tester_get_type() +static GType gst_parser_tester_get_type (void); + +typedef struct _GstParserTester GstParserTester; +typedef struct _GstParserTesterClass GstParserTesterClass; + +struct _GstParserTester +{ + GstBaseParse parent; +}; + +struct _GstParserTesterClass +{ + GstBaseParseClass parent_class; +}; + +G_DEFINE_TYPE (GstParserTester, gst_parser_tester, GST_TYPE_BASE_PARSE); + +static gboolean +gst_parser_tester_start (GstBaseParse * parse) +{ + return TRUE; +} + +static gboolean +gst_parser_tester_stop (GstBaseParse * parse) +{ + return TRUE; +} + +static gboolean +gst_parser_tester_set_sink_caps (GstBaseParse * parse, GstCaps * caps) +{ + gst_pad_set_caps (GST_BASE_PARSE_SRC_PAD (parse), caps); + gst_caps_unref (caps); + return TRUE; +} + +static GstFlowReturn +gst_parser_tester_handle_frame (GstBaseParse * parse, + GstBaseParseFrame * frame, gint * skipsize) +{ + while (frame->buffer && gst_buffer_get_size (frame->buffer) >= 8) { + GST_BUFFER_DURATION (frame->buffer) = + gst_util_uint64_scale_round (GST_SECOND, TEST_VIDEO_FPS_D, + TEST_VIDEO_FPS_N); + gst_base_parse_finish_frame (parse, frame, 8); + } + return GST_FLOW_OK; +} + +static void +gst_parser_tester_class_init (GstParserTesterClass * klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + GstBaseParseClass *baseparse_class = GST_BASE_PARSE_CLASS (klass); + + static GstStaticPadTemplate sink_templ = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, GST_PAD_ALWAYS, + GST_STATIC_CAPS ("video/x-test-custom")); + + static GstStaticPadTemplate src_templ = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, GST_PAD_ALWAYS, + GST_STATIC_CAPS ("video/x-test-custom")); + + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_templ)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_templ)); + + gst_element_class_set_metadata (element_class, + "ParserTester", "Parser/Video", "yep", "me"); + + baseparse_class->start = gst_parser_tester_start; + baseparse_class->stop = gst_parser_tester_stop; + baseparse_class->handle_frame = gst_parser_tester_handle_frame; + baseparse_class->set_sink_caps = gst_parser_tester_set_sink_caps; +} + +static void +gst_parser_tester_init (GstParserTester * tester) +{ +} + +static void +setup_parsertester (void) +{ + GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("video/x-test-custom") + ); + GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("video/x-test-custom") + ); + + parsetest = g_object_new (GST_PARSER_TESTER_TYPE, NULL); + mysrcpad = gst_check_setup_src_pad (parsetest, &srctemplate); + mysinkpad = gst_check_setup_sink_pad (parsetest, &sinktemplate); +} + +static void +cleanup_parsertest (void) +{ + gst_pad_set_active (mysrcpad, FALSE); + gst_pad_set_active (mysinkpad, FALSE); + gst_check_teardown_src_pad (parsetest); + gst_check_teardown_sink_pad (parsetest); + gst_check_teardown_element (parsetest); +} + +static GstBuffer * +create_test_buffer (guint64 num) +{ + GstBuffer *buffer; + guint64 *data = g_malloc (sizeof (guint64)); + + *data = num; + + buffer = gst_buffer_new_wrapped (data, sizeof (guint64)); + + GST_BUFFER_PTS (buffer) = + gst_util_uint64_scale_round (num, GST_SECOND * TEST_VIDEO_FPS_D, + TEST_VIDEO_FPS_N); + GST_BUFFER_DURATION (buffer) = + gst_util_uint64_scale_round (GST_SECOND, TEST_VIDEO_FPS_D, + TEST_VIDEO_FPS_N); + + return buffer; +} + +static void +send_startup_events (void) +{ + GstCaps *caps; + + fail_unless (gst_pad_push_event (mysrcpad, + gst_event_new_stream_start ("randomvalue"))); + + /* push caps */ + caps = + gst_caps_new_simple ("video/x-test-custom", "width", G_TYPE_INT, + TEST_VIDEO_WIDTH, "height", G_TYPE_INT, TEST_VIDEO_HEIGHT, "framerate", + GST_TYPE_FRACTION, TEST_VIDEO_FPS_N, TEST_VIDEO_FPS_D, NULL); + fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_caps (caps))); +} + +static void +run_parser_playback_test (GList * input, gint expected_output, gdouble rate) +{ + GstBuffer *buffer; + guint64 i; + GList *iter; + GstSegment segment; + + gst_pad_set_active (mysrcpad, TRUE); + gst_element_set_state (parsetest, GST_STATE_PLAYING); + gst_pad_set_active (mysinkpad, TRUE); + + send_startup_events (); + + /* push a new segment */ + gst_segment_init (&segment, GST_FORMAT_TIME); + segment.rate = rate; + fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_segment (&segment))); + + /* push buffers, the data is actually a number so we can track them */ + for (iter = input; iter; iter = g_list_next (iter)) { + buffer = iter->data; + + fail_unless (gst_pad_push (mysrcpad, buffer) == GST_FLOW_OK); + } + g_list_free (input); + + fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ())); + + /* check that all buffers were received by our source pad */ + fail_unless (g_list_length (buffers) == expected_output); + i = 0; + for (iter = buffers; iter; iter = g_list_next (iter)) { + GstMapInfo map; + guint64 num; + + buffer = iter->data; + + gst_buffer_map (buffer, &map, GST_MAP_READ); + + num = *(guint64 *) map.data; + fail_unless (i == num); + fail_unless (GST_BUFFER_PTS (buffer) == gst_util_uint64_scale_round (i, + GST_SECOND * TEST_VIDEO_FPS_D, TEST_VIDEO_FPS_N)); + fail_unless (GST_BUFFER_DURATION (buffer) == + gst_util_uint64_scale_round (GST_SECOND, TEST_VIDEO_FPS_D, + TEST_VIDEO_FPS_N)); + + gst_buffer_unmap (buffer, &map); + i++; + } + + g_list_free_full (buffers, (GDestroyNotify) gst_buffer_unref); + buffers = NULL; + + cleanup_parsertest (); +} + + +GST_START_TEST (parser_playback) +{ + GList *input = NULL; + gint i; + GstBuffer *buffer; + + setup_parsertester (); + + /* push buffers, the data is actually a number so we can track them */ + for (i = 0; i < 3; i++) { + buffer = create_test_buffer (i); + input = g_list_append (input, buffer); + } + + run_parser_playback_test (input, 3, 1.0); +} + +GST_END_TEST; + + +/* Check https://bugzilla.gnome.org/show_bug.cgi?id=721941 */ +GST_START_TEST (parser_reverse_playback_on_passthrough) +{ + GList *input = NULL; + gint i; + GstBuffer *buffer; + + setup_parsertester (); + + gst_base_parse_set_passthrough (GST_BASE_PARSE (parsetest), TRUE); + + /* push buffers, the data is actually a number so we can track them */ + for (i = 0; i < 6; i++) { + buffer = create_test_buffer (i); + if (i > 0) + GST_BUFFER_FLAG_SET (buffer, GST_BUFFER_FLAG_DELTA_UNIT); + input = g_list_append (input, buffer); + } + GST_BUFFER_FLAG_SET (g_list_nth (input, 3)->data, GST_BUFFER_FLAG_DISCONT); + + run_parser_playback_test (input, 6, -1.0); +} + +GST_END_TEST; + + +static Suite * +gst_baseparse_suite (void) +{ + Suite *s = suite_create ("GstBaseParse"); + TCase *tc = tcase_create ("general"); + + suite_add_tcase (s, tc); + tcase_add_test (tc, parser_playback); + tcase_add_test (tc, parser_reverse_playback_on_passthrough); + + return s; +} + +GST_CHECK_MAIN (gst_baseparse); diff --git a/tests/examples/Makefile.in b/tests/examples/Makefile.in index 50c2e1d..1a0e14e 100644 --- a/tests/examples/Makefile.in +++ b/tests/examples/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.14 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. diff --git a/tests/examples/adapter/Makefile.in b/tests/examples/adapter/Makefile.in index 50fdb45..3b3c637 100644 --- a/tests/examples/adapter/Makefile.in +++ b/tests/examples/adapter/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.14 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. diff --git a/tests/examples/controller/Makefile.in b/tests/examples/controller/Makefile.in index 8cee6ab..7186d97 100644 --- a/tests/examples/controller/Makefile.in +++ b/tests/examples/controller/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.14 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. diff --git a/tests/examples/helloworld/Makefile.in b/tests/examples/helloworld/Makefile.in index 6eb9d0f..c3602ac 100644 --- a/tests/examples/helloworld/Makefile.in +++ b/tests/examples/helloworld/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.14 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. diff --git a/tests/examples/launch/Makefile.in b/tests/examples/launch/Makefile.in index 42ec64d..b593531 100644 --- a/tests/examples/launch/Makefile.in +++ b/tests/examples/launch/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.14 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. diff --git a/tests/examples/manual/Makefile.in b/tests/examples/manual/Makefile.in index ed7973a..4a17244 100644 --- a/tests/examples/manual/Makefile.in +++ b/tests/examples/manual/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.14 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. diff --git a/tests/examples/memory/Makefile.in b/tests/examples/memory/Makefile.in index 2682ea4..2c1b63d 100644 --- a/tests/examples/memory/Makefile.in +++ b/tests/examples/memory/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.14 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. diff --git a/tests/examples/metadata/Makefile.in b/tests/examples/metadata/Makefile.in index 6690651..093b781 100644 --- a/tests/examples/metadata/Makefile.in +++ b/tests/examples/metadata/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.14 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. diff --git a/tests/examples/queue/Makefile.in b/tests/examples/queue/Makefile.in index f51b740..f073877 100644 --- a/tests/examples/queue/Makefile.in +++ b/tests/examples/queue/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.14 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. diff --git a/tests/examples/stepping/Makefile.in b/tests/examples/stepping/Makefile.in index 1c58c4e..aa29847 100644 --- a/tests/examples/stepping/Makefile.in +++ b/tests/examples/stepping/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.14 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. diff --git a/tests/examples/streams/Makefile.in b/tests/examples/streams/Makefile.in index 7d975fb..8e1dd92 100644 --- a/tests/examples/streams/Makefile.in +++ b/tests/examples/streams/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.14 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. diff --git a/tests/examples/typefind/Makefile.in b/tests/examples/typefind/Makefile.in index e57396c..0c7aaba 100644 --- a/tests/examples/typefind/Makefile.in +++ b/tests/examples/typefind/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.14 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. diff --git a/tests/misc/Makefile.in b/tests/misc/Makefile.in index 1798a53..00971a4 100644 --- a/tests/misc/Makefile.in +++ b/tests/misc/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.14 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. diff --git a/tools/Makefile.in b/tools/Makefile.in index 4c13151..54b303b 100644 --- a/tools/Makefile.in +++ b/tools/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.14 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. diff --git a/win32/common/config.h b/win32/common/config.h index 19ce168..a4be139 100644 --- a/win32/common/config.h +++ b/win32/common/config.h @@ -62,7 +62,7 @@ #define GST_PACKAGE_ORIGIN "Unknown package origin" /* GStreamer package release date/time for plugins as YYYY-MM-DD */ -#define GST_PACKAGE_RELEASE_DATETIME "2013-12-26" +#define GST_PACKAGE_RELEASE_DATETIME "2014-02-08" /* Define if static plugins should be built */ #undef GST_PLUGIN_BUILD_STATIC @@ -354,7 +354,7 @@ #define PACKAGE_NAME "GStreamer" /* Define to the full name and version of this package. */ -#define PACKAGE_STRING "GStreamer 1.2.2" +#define PACKAGE_STRING "GStreamer 1.2.3" /* Define to the one symbol short name of this package. */ #define PACKAGE_TARNAME "gstreamer" @@ -363,7 +363,7 @@ #undef PACKAGE_URL /* Define to the version of this package. */ -#define PACKAGE_VERSION "1.2.2" +#define PACKAGE_VERSION "1.2.3" /* directory where plugins are located */ #ifdef _DEBUG @@ -401,7 +401,7 @@ #undef USE_POISONING /* Version number of package */ -#define VERSION "1.2.2" +#define VERSION "1.2.3" /* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most significant byte first (like Motorola and SPARC, unlike Intel). */ diff --git a/win32/common/gstversion.h b/win32/common/gstversion.h index 667f246..e42fefd 100644 --- a/win32/common/gstversion.h +++ b/win32/common/gstversion.h @@ -57,7 +57,7 @@ G_BEGIN_DECLS * * The micro version of GStreamer at compile time: */ -#define GST_VERSION_MICRO (2) +#define GST_VERSION_MICRO (3) /** * GST_VERSION_NANO: * diff --git a/win32/common/libgstreamer.def b/win32/common/libgstreamer.def index 6f8da1a..a53d2b5 100644 --- a/win32/common/libgstreamer.def +++ b/win32/common/libgstreamer.def @@ -1041,6 +1041,7 @@ EXPORTS gst_segment_get_type gst_segment_init gst_segment_new + gst_segment_offset_running_time gst_segment_set_running_time gst_segment_to_position gst_segment_to_running_time |