diff --git a/NEWS b/NEWS index cd55c3cb49..29dab24b9e 100644 --- a/NEWS +++ b/NEWS @@ -1,45 +1,6 @@ -This is GStreamer Base Plug-ins 0.11.92 "Comfortably Numb" +This is GStreamer Base Plugins 1.0.0 -New in 0.11.92: +New features in 1.0.0: * Parallel installability with 0.10.x series - * API cleanup and minor API improvements - * Major cleanup of video/audio libraries - * Lots of bugfixes, cleanup and other improvements - -New in 0.11.91: - - * Compressed audio passthrough support in alsasink - * Removal of interfaces library, mixer and tuner interface - * Addition of video encoder and decoder base classes - * Improvements/cleanup for the video library API - -New in 0.11.90: - - * Lots of bugfixes, cleanup and other improvements - * API cleanup in the audio base classes - * Improvements to the RTP buffer - -New in 0.11.3: - - * Many fixes and improvements - * video: Improve video frame map/unmap - * theora: Improve video negotiation - * Various performance improvements - -Bugs fixed in this release - - * 668343 : [0.11] - segfault when using missing plugin support in 0.11 - * 668542 : [0.11] EncodingProfileClass is missing from GstPbutils-0.11.gir - - -New in 0.11.2: - - * Parallel installability with 0.10.x series - * Many API cleanups - * Ported to new 0.11 core API changes - * Use new GstSample for snapshots - * Improved video filter base class - * New multichannel caps with mask - * Port network elements to GIO - * Many fixes and improvements + * See release notes for more details diff --git a/RELEASE b/RELEASE index 1609b3a9ec..3be21df17d 100644 --- a/RELEASE +++ b/RELEASE @@ -1,113 +1,176 @@ +Release notes for GStreamer Base Plugins 1.0.0 -Release notes for GStreamer Base Plug-ins 0.11.92 "Comfortably Numb" - +The GStreamer project is pleased to announce the very first release of the +new API and ABI-stable 1.x series of the GStreamer multimedia framework. +The 1.x series is a stable series targeted at end users. It is not API or ABI +compatible with the 0.10.x series. It can, however, be installed in parallel +with the 0.10.x series and will not affect an existing 0.10.x installation. -The GStreamer team is proud to announce a new release -in the 0.11.x unstable series of the -GStreamer Base Plug-ins. +Major improvements include: more flexible memory handling; extensible and +negotiable metadata for buffers; caps negotiation and renegotiation mechanisms, +decoupled from buffer allocation; improved caps renegotiation; automatic +re-sending of state for dynamic pipelines; reworked and more fine-grained pad +probing; simpler and more descriptive audio and video caps; more efficient +allocation of buffers, events and other mini objects; improved timestamp +handling; support for gobject-inspection-based language bindings; countless +other improvements. +Most of these changes involve the GStreamer plugin API. The application API +has changed comparatively little, and most applications should be fairly easy +to port to the new API. There is a porting guide available. +The GStreamer team would like to thank everyone who helped bring this release +about, whether by submitting patches, reporting bugs, testing, sponsoring +development, attending hackfests, or simply supplying moral support. -The 0.11.x series is an unstable series targeted at developers. -It is not API or ABI compatible with the stable 0.10.x series. -It is, however, parallel installable with the 0.10.x series. +This is the end of a long development process, but also the beginning of +one. This release does not mark the pinnacle of perfection, but the point +where the team is content with the API and stability and quality of the code +base in general, especially compared to the old 0.10 series. +There will be bugs to fix, and starting from this release there will be +distinct bug-fixing and feature development cycles, with the goal of getting +bug-fixes out quicker and unencumbered by other more risky changes. See + http://gstreamer.freedesktop.org/wiki/ReleasePlanning/RoadMap + +for a tentative road map and possible schedule. + +=== Modules This module contains a set of reference plugins, base classes for other plugins, and helper libraries. -This module is kept up-to-date together with the core developments. Element -writers should look at the elements in this module as a reference for -their development. +This module is kept up-to-date together with the core developments. +Element writers should look at the elements in this module as a reference +for their development. This module contains elements for, among others: - device plugins: x(v)imagesink, alsa, v4lsrc, cdparanoia + device plugins: x(v)imagesink, alsa, cdparanoia containers: ogg codecs: vorbis, theora text: textoverlay, subparse - sources: audiotestsrc, videotestsrc, gnomevfssrc, giosrc + sources: audiotestsrc, videotestsrc, giosrc network: tcp typefind functions audio processing: audioconvert, adder, audiorate, audioresample, volume visualisation: libvisual - video processing: ffmpegcolorspace - aggregate elements: uridecodebin, playbin2, decodebin2, decodebin, playbin, encodebin - libraries: app, audio, cdda, fft, interfaces, netbuffer, pbutils, riff, rtp, rtsp, sdp, tag, video + video processing: videoconvert, videoscale + aggregate elements: playbin, uridecodebin, decodebin, encodebin + libraries: app, audio, fft, pbutils, riff, rtp, rtsp, sdp, tag, video +Other modules containing plugins are: -Other modules containing plug-ins are: + gst-plugins-good : a set of well-supported plugins under our preferred license + gst-plugins-ugly : a set of well-supported plugins, but might pose problems + for distributors + gst-plugins-bad : a set of less supported plugins that haven't passed the + rigorous quality testing we expect + gst-libav : a set of codecs plugins based on libav (formerly gst-ffmpeg) +==== Download -gst-plugins-good -contains a set of well-supported plug-ins under our preferred license -gst-plugins-ugly -contains a set of well-supported plug-ins, but might pose problems for - distributors -gst-plugins-bad -contains a set of less supported plug-ins that haven't passed the - rigorous quality testing we expect +You can find source releases of gstreamer in the download directory: + http://gstreamer.freedesktop.org/src/gstreamer/ - - - -Features of this release - - * Parallel installability with 0.10.x series - * API cleanup and minor API improvements - * Major cleanup of video/audio libraries - * Lots of bugfixes, cleanup and other improvements -There were no bugs fixed in this release - - -Download - -You can find source releases of gst-plugins-base in the download directory: -http://gstreamer.freedesktop.org/src/gst-plugins-base/ - -GStreamer Homepage +==== GStreamer Homepage More details can be found on the project's website: -http://gstreamer.freedesktop.org/ -Support and Bugs + http://gstreamer.freedesktop.org/ + +==== Support and Bugs We use GNOME's bugzilla for bug reports and feature requests: -http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer -Developers + http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer + or + http://gstreamer.freedesktop.org/bugs/ -GStreamer is stored in Git, hosted at git.freedesktop.org, and can be cloned from there. -Interested developers of the core library, plug-ins, and applications should -subscribe to the gstreamer-devel list. If there is sufficient interest we -will create more lists as necessary. +==== Developers - -Applications - -Contributors to this release - - * Alban Browaeys - * Andoni Morales Alastruey - * Andre Moreira Magalhaes (andrunko) - * Anton Belka - * Arun Raghavan - * Bastien Nocera - * David Svensson Fors - * Edward Hervey - * Idar Tollefsen - * Mark Nauwelaerts - * Matej Knopp - * Raimo Järvi - * Sebastian Dröge - * Sebastian Rasmussen - * Sreerenj Balachandran - * Stefan Sauer - * Thiago Santos - * Tim-Philipp Müller - * Vincent Penquerc'h - * Wim Taymans -  \ No newline at end of file +GStreamer is stored in Git, hosted at git.freedesktop.org, and can be +cloned from there. Interested developers of the core library, plugins, and +applications should subscribe to the gstreamer-devel list and/or pop into +our #gstreamer IRC channel on Freenode. + +==== Contributors to this release + + Akihiro Tsukada + Alban Browaeys + Alessandro Decina + Andoni Morales Alastruey + Andreas Frisch + Andre Moreira Magalhaes (andrunko) + Andy Wingo + Anssi Hannula + Anton Belka + Arnaud Vrac + Arun Raghavan + Bastien Nocera + Benjamin Gaignard + Benjamin Otte + Christian Fredrik Kalager Schaller + Christian Schaller + Damien Lespiau + David Schleef + David Svensson Fors + Debarshi Ray + Edward Hervey + Evan Nemerson + George Kiagiadakis + Havard Graff + Holger Kaelberer + Idar Tollefsen + Jan Schmidt + Jason DeRose + Javier Jardón + Jens Georg + Johan Dahlin + Jonathan Lyons + Jonathan Matthew + Josep Torra + Julian Scheel + Marc Leeman + Mark Nauwelaerts + Matej Knopp + Michael Smith + Miguel Angel Cabrera Moya + Nicolas Dufresne + Ognyan Tonchev + Oleksij Rempel (Alexey Fisher) + Olivier Aubert + Olivier Crête + Pascal Buhler + Peter Korsgaard + Philip Flarsheim + Philippe Normand + Pontus Oldberg + Raimo Järvi + René Stadler + Reynaldo H. Verdejo Pinochet + Robert Swain + Ronald S. Bultje + Ryan Lortie + Sebastian Dröge + Sebastian Rasmussen + Sreerenj Balachandran + Stefan Kost + Stefan Sauer + Stéphane Loeuillet + Steve Lhomme + Thiago Santos + Thibault Saunier + Thomas Vander Stichele + Tim-Philipp Müller + Víctor Manuel Jáquez Leal + Vincent Penquerc'h + Vincent Untz + Vivia Nikolaidou + Wim Taymans + Youness Alaoui + Zaheer Abbas Merali + Руслан Ижбулатов diff --git a/common b/common index 4f962f7835..6c0b52c72c 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit 4f962f78357a11e545510d48227f41af24bfaab7 +Subproject commit 6c0b52c72c0958952b79b573105a270d7a651b33 diff --git a/configure.ac b/configure.ac index 761fc88eef..8afbdf26f5 100644 --- a/configure.ac +++ b/configure.ac @@ -5,7 +5,7 @@ dnl please read gstreamer/docs/random/autotools before changing this file dnl initialize autoconf dnl releases only do -Wall, git and prerelease does -Werror too dnl use a three digit version number for releases, and four for git/prerelease -AC_INIT(GStreamer Base Plug-ins, 0.11.99, +AC_INIT(GStreamer Base Plug-ins, 1.0.0.1, http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer, gst-plugins-base) @@ -53,7 +53,7 @@ dnl sets GST_LT_LDFLAGS AS_LIBTOOL(GST, 0, 0, 0) dnl *** required versions of GStreamer stuff *** -GST_REQ=0.11.99 +GST_REQ=1.0.0 dnl *** autotools stuff **** diff --git a/docs/design/draft-subtitle-overlays.txt b/docs/design/draft-subtitle-overlays.txt index b2e080dde6..87f2c2c61a 100644 --- a/docs/design/draft-subtitle-overlays.txt +++ b/docs/design/draft-subtitle-overlays.txt @@ -1,11 +1,9 @@ =============================================================== - Subtitle overlays, hardware-accelerated decoding and playbin2 + Subtitle overlays, hardware-accelerated decoding and playbin =============================================================== Status: EARLY DRAFT / BRAINSTORMING -The following text will use "playbin" synonymous with "playbin2". - === 1. Background === Subtitles can be muxed in containers or come from an external source. @@ -30,7 +28,7 @@ us to allocate and blend whole pictures (1920x1080 AYUV = 8MB, is only a small rectangle at the bottom. This wastes memory and CPU. We could do something better by introducing a new format that only encodes the region(s) of interest, but we don't have such a format yet, and -are not necessarily keen to rewrite this part of the logic in playbin2 +are not necessarily keen to rewrite this part of the logic in playbin at this point - and we can't change existing elements' behaviour, so would need to introduce new elements for this. @@ -58,7 +56,7 @@ map the data back into system memory (and then later back to the GPU). It's much better to upload the much smaller encoded data to the GPU/DSP and then leave it there until rendered. -Currently playbin2 only supports subtitles on top of raw decoded video. +Currently playbin only supports subtitles on top of raw decoded video. It will try to find a suitable overlay element from the plugin registry based on the input subtitle caps and the rank. (It is assumed that we will be able to convert any raw video format into any format required @@ -66,7 +64,7 @@ by the overlay using a converter such as videoconvert.) It will not render subtitles if the video sent to the sink is not raw YUV or RGB or if conversions have been disabled by setting the -native-video flag on playbin2. +native-video flag on playbin. Subtitle rendering is considered an important feature. Enabling hardware-accelerated decoding by default should not lead to a major @@ -174,7 +172,7 @@ Multiple possible solutions come to mind: to buffers seems more intuitive than sending it interleaved as events. And buffers stored or passed around (e.g. via the "last-buffer" property in the sink when doing screenshots via - playbin2) always contain all the information needed. + playbin) always contain all the information needed. (d) create a video/x-raw-*-delta format and use a backend-specific videomixer @@ -185,7 +183,7 @@ Multiple possible solutions come to mind: in the video backend plugin. It would also add a concept that might be generally useful (think ximagesrc capture with xdamage). However, it would require adding foorender variants of all the - existing overlay elements, and changing playbin2 to that new + existing overlay elements, and changing playbin to that new design, which is somewhat intrusive. And given the general nature of such a new format/API, we would need to take a lot of care to be able to accommodate all possible use cases when diff --git a/docs/design/draft-va.txt b/docs/design/draft-va.txt index be02706cf4..2bff4bc3e7 100644 --- a/docs/design/draft-va.txt +++ b/docs/design/draft-va.txt @@ -3,7 +3,9 @@ Video Acceleration Status: - DRAFT. + DRAFT. Outdated for 1.0, we want to use video/x-raw in order to + interoperate with all elements that handle video. Optimized handling of + the VA surfaces can be done with the metadata. Purpose: diff --git a/docs/design/part-playbin.txt b/docs/design/part-playbin.txt index 195d048898..232ac0cd23 100644 --- a/docs/design/part-playbin.txt +++ b/docs/design/part-playbin.txt @@ -1,4 +1,4 @@ -playbin2 +playbin -------- The purpose of this element is to decode and render the media contained in a @@ -48,7 +48,7 @@ Components - allows for configuration of visualisation element. - allows for enable/disable of visualisation, audio and video. -* playbin2 +* playbin - combination of one or more uridecodebin elements to read the uri and subtitle uri. @@ -61,7 +61,7 @@ Components Gapless playback ---------------- -playbin2 has an "about-to-finish" signal. The application should configure a new +playbin has an "about-to-finish" signal. The application should configure a new uri (and optional suburi) in the callback. When the current media finishes, this new media will be played next. diff --git a/docs/plugins/inspect/plugin-adder.xml b/docs/plugins/inspect/plugin-adder.xml index 20d16cc68b..2778e566f9 100644 --- a/docs/plugins/inspect/plugin-adder.xml +++ b/docs/plugins/inspect/plugin-adder.xml @@ -3,10 +3,10 @@ Adds multiple streams ../../gst/adder/.libs/libgstadder.so libgstadder.so - 0.11.99 + 1.0.0.1 LGPL gst-plugins-base - GStreamer Base Plug-ins source release + GStreamer Base Plug-ins git Unknown package origin diff --git a/docs/plugins/inspect/plugin-alsa.xml b/docs/plugins/inspect/plugin-alsa.xml index 787577e50f..aa4c29731d 100644 --- a/docs/plugins/inspect/plugin-alsa.xml +++ b/docs/plugins/inspect/plugin-alsa.xml @@ -3,10 +3,10 @@ ALSA plugin library ../../ext/alsa/.libs/libgstalsa.so libgstalsa.so - 0.11.99 + 1.0.0.1 LGPL gst-plugins-base - GStreamer Base Plug-ins source release + GStreamer Base Plug-ins git Unknown package origin diff --git a/docs/plugins/inspect/plugin-app.xml b/docs/plugins/inspect/plugin-app.xml index 9d8a7db1c0..01cd80e5ad 100644 --- a/docs/plugins/inspect/plugin-app.xml +++ b/docs/plugins/inspect/plugin-app.xml @@ -3,10 +3,10 @@ Elements used to communicate with applications ../../gst/app/.libs/libgstapp.so libgstapp.so - 0.11.99 + 1.0.0.1 LGPL gst-plugins-base - GStreamer Base Plug-ins source release + GStreamer Base Plug-ins git Unknown package origin diff --git a/docs/plugins/inspect/plugin-audioconvert.xml b/docs/plugins/inspect/plugin-audioconvert.xml index 264989f337..3b514a0977 100644 --- a/docs/plugins/inspect/plugin-audioconvert.xml +++ b/docs/plugins/inspect/plugin-audioconvert.xml @@ -3,10 +3,10 @@ Convert audio to different formats ../../gst/audioconvert/.libs/libgstaudioconvert.so libgstaudioconvert.so - 0.11.99 + 1.0.0.1 LGPL gst-plugins-base - GStreamer Base Plug-ins source release + GStreamer Base Plug-ins git Unknown package origin diff --git a/docs/plugins/inspect/plugin-audiorate.xml b/docs/plugins/inspect/plugin-audiorate.xml index bcbc61a782..7104dba497 100644 --- a/docs/plugins/inspect/plugin-audiorate.xml +++ b/docs/plugins/inspect/plugin-audiorate.xml @@ -3,10 +3,10 @@ Adjusts audio frames ../../gst/audiorate/.libs/libgstaudiorate.so libgstaudiorate.so - 0.11.99 + 1.0.0.1 LGPL gst-plugins-base - GStreamer Base Plug-ins source release + GStreamer Base Plug-ins git Unknown package origin diff --git a/docs/plugins/inspect/plugin-audioresample.xml b/docs/plugins/inspect/plugin-audioresample.xml index 3148578d32..fe35f34699 100644 --- a/docs/plugins/inspect/plugin-audioresample.xml +++ b/docs/plugins/inspect/plugin-audioresample.xml @@ -3,10 +3,10 @@ Resamples audio ../../gst/audioresample/.libs/libgstaudioresample.so libgstaudioresample.so - 0.11.99 + 1.0.0.1 LGPL gst-plugins-base - GStreamer Base Plug-ins source release + GStreamer Base Plug-ins git Unknown package origin diff --git a/docs/plugins/inspect/plugin-audiotestsrc.xml b/docs/plugins/inspect/plugin-audiotestsrc.xml index 2d91a2df0b..715b3faa21 100644 --- a/docs/plugins/inspect/plugin-audiotestsrc.xml +++ b/docs/plugins/inspect/plugin-audiotestsrc.xml @@ -3,10 +3,10 @@ Creates audio test signals of given frequency and volume ../../gst/audiotestsrc/.libs/libgstaudiotestsrc.so libgstaudiotestsrc.so - 0.11.99 + 1.0.0.1 LGPL gst-plugins-base - GStreamer Base Plug-ins source release + GStreamer Base Plug-ins git Unknown package origin diff --git a/docs/plugins/inspect/plugin-cdparanoia.xml b/docs/plugins/inspect/plugin-cdparanoia.xml index 9de8d92c04..6c4ef88734 100644 --- a/docs/plugins/inspect/plugin-cdparanoia.xml +++ b/docs/plugins/inspect/plugin-cdparanoia.xml @@ -3,10 +3,10 @@ Read audio from CD in paranoid mode ../../ext/cdparanoia/.libs/libgstcdparanoia.so libgstcdparanoia.so - 0.11.99 + 1.0.0.1 LGPL gst-plugins-base - GStreamer Base Plug-ins source release + GStreamer Base Plug-ins git Unknown package origin diff --git a/docs/plugins/inspect/plugin-encoding.xml b/docs/plugins/inspect/plugin-encoding.xml index 4ba9259bf6..2ba48e6c41 100644 --- a/docs/plugins/inspect/plugin-encoding.xml +++ b/docs/plugins/inspect/plugin-encoding.xml @@ -3,10 +3,10 @@ various encoding-related elements ../../gst/encoding/.libs/libgstencodebin.so libgstencodebin.so - 0.11.99 + 1.0.0.1 LGPL gst-plugins-base - GStreamer Base Plug-ins source release + GStreamer Base Plug-ins git Unknown package origin diff --git a/docs/plugins/inspect/plugin-gio.xml b/docs/plugins/inspect/plugin-gio.xml index 33ba04d304..a0a46ef3e7 100644 --- a/docs/plugins/inspect/plugin-gio.xml +++ b/docs/plugins/inspect/plugin-gio.xml @@ -3,10 +3,10 @@ GIO elements ../../gst/gio/.libs/libgstgio.so libgstgio.so - 0.11.99 + 1.0.0.1 LGPL gst-plugins-base - GStreamer Base Plug-ins source release + GStreamer Base Plug-ins git Unknown package origin diff --git a/docs/plugins/inspect/plugin-ivorbisdec.xml b/docs/plugins/inspect/plugin-ivorbisdec.xml index 93a5f24520..08f8df09c1 100644 --- a/docs/plugins/inspect/plugin-ivorbisdec.xml +++ b/docs/plugins/inspect/plugin-ivorbisdec.xml @@ -3,10 +3,10 @@ Vorbis Tremor decoder ../../ext/vorbis/.libs/libgstivorbisdec.so libgstivorbisdec.so - 0.11.99 + 1.0.0.1 LGPL gst-plugins-base - GStreamer Base Plug-ins source release + GStreamer Base Plug-ins git Unknown package origin diff --git a/docs/plugins/inspect/plugin-libvisual.xml b/docs/plugins/inspect/plugin-libvisual.xml index 58c56ecef2..5554cfee11 100644 --- a/docs/plugins/inspect/plugin-libvisual.xml +++ b/docs/plugins/inspect/plugin-libvisual.xml @@ -3,10 +3,10 @@ libvisual visualization plugins ../../ext/libvisual/.libs/libgstlibvisual.so libgstlibvisual.so - 0.11.99 + 1.0.0.1 LGPL gst-plugins-base - GStreamer Base Plug-ins source release + GStreamer Base Plug-ins git Unknown package origin diff --git a/docs/plugins/inspect/plugin-ogg.xml b/docs/plugins/inspect/plugin-ogg.xml index ea3bbb3131..09ace4e11a 100644 --- a/docs/plugins/inspect/plugin-ogg.xml +++ b/docs/plugins/inspect/plugin-ogg.xml @@ -3,10 +3,10 @@ ogg stream manipulation (info about ogg: http://xiph.org) ../../ext/ogg/.libs/libgstogg.so libgstogg.so - 0.11.99 + 1.0.0.1 LGPL gst-plugins-base - GStreamer Base Plug-ins source release + GStreamer Base Plug-ins git Unknown package origin diff --git a/docs/plugins/inspect/plugin-pango.xml b/docs/plugins/inspect/plugin-pango.xml index 6a5ef9e1df..862f3da43b 100644 --- a/docs/plugins/inspect/plugin-pango.xml +++ b/docs/plugins/inspect/plugin-pango.xml @@ -3,10 +3,10 @@ Pango-based text rendering and overlay ../../ext/pango/.libs/libgstpango.so libgstpango.so - 0.11.99 + 1.0.0.1 LGPL gst-plugins-base - GStreamer Base Plug-ins source release + GStreamer Base Plug-ins git Unknown package origin diff --git a/docs/plugins/inspect/plugin-playback.xml b/docs/plugins/inspect/plugin-playback.xml index 9a975abcb3..e57d42f605 100644 --- a/docs/plugins/inspect/plugin-playback.xml +++ b/docs/plugins/inspect/plugin-playback.xml @@ -3,10 +3,10 @@ various playback elements ../../gst/playback/.libs/libgstplayback.so libgstplayback.so - 0.11.99 + 1.0.0.1 LGPL gst-plugins-base - GStreamer Base Plug-ins source release + GStreamer Base Plug-ins git Unknown package origin diff --git a/docs/plugins/inspect/plugin-subparse.xml b/docs/plugins/inspect/plugin-subparse.xml index 587710db6e..6b44fb7d6c 100644 --- a/docs/plugins/inspect/plugin-subparse.xml +++ b/docs/plugins/inspect/plugin-subparse.xml @@ -3,10 +3,10 @@ Subtitle parsing ../../gst/subparse/.libs/libgstsubparse.so libgstsubparse.so - 0.11.99 + 1.0.0.1 LGPL gst-plugins-base - GStreamer Base Plug-ins source release + GStreamer Base Plug-ins git Unknown package origin diff --git a/docs/plugins/inspect/plugin-tcp.xml b/docs/plugins/inspect/plugin-tcp.xml index 718f13d2e3..c8558a6d7d 100644 --- a/docs/plugins/inspect/plugin-tcp.xml +++ b/docs/plugins/inspect/plugin-tcp.xml @@ -3,10 +3,10 @@ transfer data over the network via TCP ../../gst/tcp/.libs/libgsttcp.so libgsttcp.so - 0.11.99 + 1.0.0.1 LGPL gst-plugins-base - GStreamer Base Plug-ins source release + GStreamer Base Plug-ins git Unknown package origin diff --git a/docs/plugins/inspect/plugin-theora.xml b/docs/plugins/inspect/plugin-theora.xml index 1048e0877e..9cd1bb3f0d 100644 --- a/docs/plugins/inspect/plugin-theora.xml +++ b/docs/plugins/inspect/plugin-theora.xml @@ -3,10 +3,10 @@ Theora plugin library ../../ext/theora/.libs/libgsttheora.so libgsttheora.so - 0.11.99 + 1.0.0.1 LGPL gst-plugins-base - GStreamer Base Plug-ins source release + GStreamer Base Plug-ins git Unknown package origin diff --git a/docs/plugins/inspect/plugin-typefindfunctions.xml b/docs/plugins/inspect/plugin-typefindfunctions.xml index 8930df7a64..679f50fa84 100644 --- a/docs/plugins/inspect/plugin-typefindfunctions.xml +++ b/docs/plugins/inspect/plugin-typefindfunctions.xml @@ -3,10 +3,10 @@ default typefind functions ../../gst/typefind/.libs/libgsttypefindfunctions.so libgsttypefindfunctions.so - 0.11.99 + 1.0.0.1 LGPL gst-plugins-base - GStreamer Base Plug-ins source release + GStreamer Base Plug-ins git Unknown package origin diff --git a/docs/plugins/inspect/plugin-videoconvert.xml b/docs/plugins/inspect/plugin-videoconvert.xml index 71827493f1..ec6d8133b5 100644 --- a/docs/plugins/inspect/plugin-videoconvert.xml +++ b/docs/plugins/inspect/plugin-videoconvert.xml @@ -3,7 +3,7 @@ Colorspace conversion ../../gst/videoconvert/.libs/libgstvideoconvert.so libgstvideoconvert.so - 0.11.99 + 1.0.0.1 LGPL gst-plugins-base diff --git a/docs/plugins/inspect/plugin-videorate.xml b/docs/plugins/inspect/plugin-videorate.xml index ce987673c2..07987c6e7b 100644 --- a/docs/plugins/inspect/plugin-videorate.xml +++ b/docs/plugins/inspect/plugin-videorate.xml @@ -3,10 +3,10 @@ Adjusts video frames ../../gst/videorate/.libs/libgstvideorate.so libgstvideorate.so - 0.11.99 + 1.0.0.1 LGPL gst-plugins-base - GStreamer Base Plug-ins source release + GStreamer Base Plug-ins git Unknown package origin diff --git a/docs/plugins/inspect/plugin-videoscale.xml b/docs/plugins/inspect/plugin-videoscale.xml index 503f48d899..ed8f6da1fe 100644 --- a/docs/plugins/inspect/plugin-videoscale.xml +++ b/docs/plugins/inspect/plugin-videoscale.xml @@ -3,10 +3,10 @@ Resizes video ../../gst/videoscale/.libs/libgstvideoscale.so libgstvideoscale.so - 0.11.99 + 1.0.0.1 LGPL gst-plugins-base - GStreamer Base Plug-ins source release + GStreamer Base Plug-ins git Unknown package origin diff --git a/docs/plugins/inspect/plugin-videotestsrc.xml b/docs/plugins/inspect/plugin-videotestsrc.xml index 3f7a4c45ff..18180df09b 100644 --- a/docs/plugins/inspect/plugin-videotestsrc.xml +++ b/docs/plugins/inspect/plugin-videotestsrc.xml @@ -3,10 +3,10 @@ Creates a test video stream ../../gst/videotestsrc/.libs/libgstvideotestsrc.so libgstvideotestsrc.so - 0.11.99 + 1.0.0.1 LGPL gst-plugins-base - GStreamer Base Plug-ins source release + GStreamer Base Plug-ins git Unknown package origin diff --git a/docs/plugins/inspect/plugin-volume.xml b/docs/plugins/inspect/plugin-volume.xml index 6faa308784..05c4c6d8ad 100644 --- a/docs/plugins/inspect/plugin-volume.xml +++ b/docs/plugins/inspect/plugin-volume.xml @@ -3,10 +3,10 @@ plugin for controlling audio volume ../../gst/volume/.libs/libgstvolume.so libgstvolume.so - 0.11.99 + 1.0.0.1 LGPL gst-plugins-base - GStreamer Base Plug-ins source release + GStreamer Base Plug-ins git Unknown package origin diff --git a/docs/plugins/inspect/plugin-vorbis.xml b/docs/plugins/inspect/plugin-vorbis.xml index 8c48b673e6..0a52bba4b3 100644 --- a/docs/plugins/inspect/plugin-vorbis.xml +++ b/docs/plugins/inspect/plugin-vorbis.xml @@ -3,10 +3,10 @@ Vorbis plugin library ../../ext/vorbis/.libs/libgstvorbis.so libgstvorbis.so - 0.11.99 + 1.0.0.1 LGPL gst-plugins-base - GStreamer Base Plug-ins source release + GStreamer Base Plug-ins git Unknown package origin diff --git a/docs/plugins/inspect/plugin-ximagesink.xml b/docs/plugins/inspect/plugin-ximagesink.xml index a3c79cf08e..84b07a46cb 100644 --- a/docs/plugins/inspect/plugin-ximagesink.xml +++ b/docs/plugins/inspect/plugin-ximagesink.xml @@ -3,10 +3,10 @@ X11 video output element based on standard Xlib calls ../../sys/ximage/.libs/libgstximagesink.so libgstximagesink.so - 0.11.99 + 1.0.0.1 LGPL gst-plugins-base - GStreamer Base Plug-ins source release + GStreamer Base Plug-ins git Unknown package origin diff --git a/docs/plugins/inspect/plugin-xvimagesink.xml b/docs/plugins/inspect/plugin-xvimagesink.xml index 71c15f0bdc..ab109251ec 100644 --- a/docs/plugins/inspect/plugin-xvimagesink.xml +++ b/docs/plugins/inspect/plugin-xvimagesink.xml @@ -3,10 +3,10 @@ XFree86 video output plugin using Xv extension ../../sys/xvimage/.libs/libgstxvimagesink.so libgstxvimagesink.so - 0.11.99 + 1.0.0.1 LGPL gst-plugins-base - GStreamer Base Plug-ins source release + GStreamer Base Plug-ins git Unknown package origin diff --git a/ext/alsa/gstalsasink.c b/ext/alsa/gstalsasink.c index 2749b4c5ad..3a7957c5bc 100644 --- a/ext/alsa/gstalsasink.c +++ b/ext/alsa/gstalsasink.c @@ -1113,7 +1113,7 @@ gst_alsasink_payload (GstAudioBaseSink * sink, GstBuffer * buf) gst_buffer_map (out, &oinfo, GST_MAP_WRITE); if (!gst_audio_iec61937_payload (iinfo.data, iinfo.size, - oinfo.data, oinfo.size, &sink->ringbuffer->spec)) { + oinfo.data, oinfo.size, &sink->ringbuffer->spec, G_BIG_ENDIAN)) { gst_buffer_unref (out); return NULL; } diff --git a/ext/ogg/gstoggmux.c b/ext/ogg/gstoggmux.c index 7fa1413fe2..51b8cc1de2 100644 --- a/ext/ogg/gstoggmux.c +++ b/ext/ogg/gstoggmux.c @@ -210,6 +210,7 @@ gst_ogg_mux_clear (GstOggMux * ogg_mux) { ogg_mux->pulling = NULL; ogg_mux->need_headers = TRUE; + ogg_mux->need_start_events = TRUE; ogg_mux->delta_pad = NULL; ogg_mux->offset = 0; ogg_mux->next_ts = 0; @@ -1913,6 +1914,23 @@ all_pads_eos (GstCollectPads * pads) return TRUE; } +static void +gst_ogg_mux_send_start_events (GstOggMux * ogg_mux, GstCollectPads * pads) +{ + GstSegment segment; + gchar s_id[32]; + + /* stream-start (FIXME: create id based on input ids) */ + g_snprintf (s_id, sizeof (s_id), "oggmux-%08x", g_random_int ()); + gst_pad_push_event (ogg_mux->srcpad, gst_event_new_stream_start (s_id)); + + /* segment */ + gst_segment_init (&segment, GST_FORMAT_BYTES); + gst_pad_push_event (ogg_mux->srcpad, gst_event_new_segment (&segment)); + + /* we'll send caps later, need to collect all headers first */ +} + /* This function is called when there is data on all pads. * * It finds a pad to pull on, this is done by looking at the buffers @@ -1932,6 +1950,11 @@ gst_ogg_mux_collected (GstCollectPads * pads, GstOggMux * ogg_mux) GST_LOG_OBJECT (ogg_mux, "collected"); + if (ogg_mux->need_start_events) { + gst_ogg_mux_send_start_events (ogg_mux, pads); + ogg_mux->need_start_events = FALSE; + } + /* queue buffers on all pads; find a buffer with the lowest timestamp */ best = gst_ogg_mux_queue_pads (ogg_mux, &popped); diff --git a/ext/ogg/gstoggmux.h b/ext/ogg/gstoggmux.h index fb87ca0093..cad7076dfa 100644 --- a/ext/ogg/gstoggmux.h +++ b/ext/ogg/gstoggmux.h @@ -118,6 +118,7 @@ struct _GstOggMux /* need_headers */ gboolean need_headers; + gboolean need_start_events; guint64 max_delay; guint64 max_page_delay; diff --git a/ext/pango/gstbasetextoverlay.c b/ext/pango/gstbasetextoverlay.c index 7db318f64c..e1229c9de5 100644 --- a/ext/pango/gstbasetextoverlay.c +++ b/ext/pango/gstbasetextoverlay.c @@ -2210,40 +2210,45 @@ wait_for_text_buf: in_text = (gchar *) map.data; in_size = map.size; - /* g_markup_escape_text() absolutely requires valid UTF8 input, it - * might crash otherwise. We don't fall back on GST_SUBTITLE_ENCODING - * here on purpose, this is something that needs fixing upstream */ - if (!g_utf8_validate (in_text, in_size, NULL)) { - const gchar *end = NULL; + if (in_size > 0) { + /* g_markup_escape_text() absolutely requires valid UTF8 input, it + * might crash otherwise. We don't fall back on GST_SUBTITLE_ENCODING + * here on purpose, this is something that needs fixing upstream */ + if (!g_utf8_validate (in_text, in_size, NULL)) { + const gchar *end = NULL; - GST_WARNING_OBJECT (overlay, "received invalid UTF-8"); - in_text = g_strndup (in_text, in_size); - while (!g_utf8_validate (in_text, in_size, &end) && end) - *((gchar *) end) = '*'; - } - - /* Get the string */ - if (overlay->have_pango_markup) { - text = g_strndup (in_text, in_size); - } else { - text = g_markup_escape_text (in_text, in_size); - } - - if (text != NULL && *text != '\0') { - gint text_len = strlen (text); - - while (text_len > 0 && (text[text_len - 1] == '\n' || - text[text_len - 1] == '\r')) { - --text_len; + GST_WARNING_OBJECT (overlay, "received invalid UTF-8"); + in_text = g_strndup (in_text, in_size); + while (!g_utf8_validate (in_text, in_size, &end) && end) + *((gchar *) end) = '*'; } - GST_DEBUG_OBJECT (overlay, "Rendering text '%*s'", text_len, text); - gst_base_text_overlay_render_text (overlay, text, text_len); + + /* Get the string */ + if (overlay->have_pango_markup) { + text = g_strndup (in_text, in_size); + } else { + text = g_markup_escape_text (in_text, in_size); + } + + if (text != NULL && *text != '\0') { + gint text_len = strlen (text); + + while (text_len > 0 && (text[text_len - 1] == '\n' || + text[text_len - 1] == '\r')) { + --text_len; + } + GST_DEBUG_OBJECT (overlay, "Rendering text '%*s'", text_len, text); + gst_base_text_overlay_render_text (overlay, text, text_len); + } else { + GST_DEBUG_OBJECT (overlay, "No text to render (empty buffer)"); + gst_base_text_overlay_render_text (overlay, " ", 1); + } + if (in_text != (gchar *) map.data) + g_free (in_text); } else { GST_DEBUG_OBJECT (overlay, "No text to render (empty buffer)"); gst_base_text_overlay_render_text (overlay, " ", 1); } - if (in_text != (gchar *) map.data) - g_free (in_text); gst_buffer_unmap (overlay->text_buffer, &map); diff --git a/gst-libs/gst/app/gstappsrc.c b/gst-libs/gst/app/gstappsrc.c index 5312cb675f..d9192d0e7b 100644 --- a/gst-libs/gst/app/gstappsrc.c +++ b/gst-libs/gst/app/gstappsrc.c @@ -667,7 +667,7 @@ gst_app_src_get_property (GObject * object, guint prop_id, GValue * value, { guint64 max; - gst_app_src_get_latency (appsrc, &max, NULL); + gst_app_src_get_latency (appsrc, NULL, &max); g_value_set_int64 (value, max); break; } diff --git a/gst-libs/gst/audio/gstaudioiec61937.c b/gst-libs/gst/audio/gstaudioiec61937.c index d665474fc0..cdd9805c84 100644 --- a/gst-libs/gst/audio/gstaudioiec61937.c +++ b/gst-libs/gst/audio/gstaudioiec61937.c @@ -134,6 +134,7 @@ gst_audio_iec61937_frame_size (const GstAudioRingBufferSpec * spec) * payloaded contents in. Should not overlap with @src * @dst_n: size of @dst in bytes * @spec: the ringbufer spec for @src + * @endianness: the expected byte order of the payloaded data * * Payloads @src in the form specified by IEC 61937 for the type from @spec and * stores the result in @dst. @src must contain exactly one frame of data and @@ -144,7 +145,7 @@ gst_audio_iec61937_frame_size (const GstAudioRingBufferSpec * spec) */ gboolean gst_audio_iec61937_payload (const guint8 * src, guint src_n, guint8 * dst, - guint dst_n, const GstAudioRingBufferSpec * spec) + guint dst_n, const GstAudioRingBufferSpec * spec, gint endianness) { guint i, tmp; #if G_BYTE_ORDER == G_BIG_ENDIAN @@ -291,22 +292,22 @@ gst_audio_iec61937_payload (const guint8 * src, guint src_n, guint8 * dst, /* Copy the payload */ i = 8; -#if G_BYTE_ORDER == G_BIG_ENDIAN - memcpy (dst + i, src, src_n); -#else - /* Byte-swapped again */ - /* FIXME: orc-ify this */ - for (tmp = 1; tmp < src_n; tmp += 2) { - dst[i + tmp - 1] = src[tmp]; - dst[i + tmp] = src[tmp - 1]; + if (G_BYTE_ORDER == endianness) { + memcpy (dst + i, src, src_n); + } else { + /* Byte-swapped again */ + /* FIXME: orc-ify this */ + for (tmp = 1; tmp < src_n; tmp += 2) { + dst[i + tmp - 1] = src[tmp]; + dst[i + tmp] = src[tmp - 1]; + } + /* Do we have 1 byte remaining? */ + if (src_n % 2) { + dst[i + src_n - 1] = 0; + dst[i + src_n] = src[src_n - 1]; + i++; + } } - /* Do we have 1 byte remaining? */ - if (src_n % 2) { - dst[i + src_n - 1] = 0; - dst[i + src_n] = src[src_n - 1]; - i++; - } -#endif i += src_n; diff --git a/gst-libs/gst/audio/gstaudioiec61937.h b/gst-libs/gst/audio/gstaudioiec61937.h index 79b8728daf..1cdc6461d9 100644 --- a/gst-libs/gst/audio/gstaudioiec61937.h +++ b/gst-libs/gst/audio/gstaudioiec61937.h @@ -27,6 +27,7 @@ guint gst_audio_iec61937_frame_size (const GstAudioRingBufferSpec * spec); gboolean gst_audio_iec61937_payload (const guint8 * src, guint src_n, guint8 * dst, guint dst_n, - const GstAudioRingBufferSpec * spec); + const GstAudioRingBufferSpec * spec, + gint endianness); #endif /* __GST_AUDIO_IEC61937_H__ */ diff --git a/gst-libs/gst/rtsp/gstrtspurl.c b/gst-libs/gst/rtsp/gstrtspurl.c index e5ffee54f0..ffd4407a62 100644 --- a/gst-libs/gst/rtsp/gstrtspurl.c +++ b/gst-libs/gst/rtsp/gstrtspurl.c @@ -79,7 +79,7 @@ static const struct /** * gst_rtsp_url_parse: * @urlstr: the url string to parse - * @url: location to hold the result. + * @url: (out): location to hold the result. * * Parse the RTSP @urlstr into a newly allocated #GstRTSPUrl. Free after usage * with gst_rtsp_url_free(). diff --git a/gst-libs/gst/video/gstvideodecoder.c b/gst-libs/gst/video/gstvideodecoder.c index 9c365079ed..788ac21a03 100644 --- a/gst-libs/gst/video/gstvideodecoder.c +++ b/gst-libs/gst/video/gstvideodecoder.c @@ -350,6 +350,8 @@ struct _GstVideoDecoderPrivate /* last outgoing ts */ GstClockTime last_timestamp_out; + /* incoming pts - dts */ + GstClockTime pts_delta; /* reverse playback */ /* collect input */ @@ -378,12 +380,13 @@ struct _GstVideoDecoderPrivate GList *frames; /* Protected with OBJECT_LOCK */ GstVideoCodecState *input_state; - GstVideoCodecState *output_state; + GstVideoCodecState *output_state; /* OBJECT_LOCK and STREAM_LOCK */ gboolean output_state_changed; /* QoS properties */ - gdouble proportion; - GstClockTime earliest_time; + gdouble proportion; /* OBJECT_LOCK */ + GstClockTime earliest_time; /* OBJECT_LOCK */ + GstClockTime qos_frame_duration; /* OBJECT_LOCK */ gboolean discont; /* qos messages: frames dropped/processed */ guint dropped; @@ -957,6 +960,14 @@ gst_video_decoder_sink_event_default (GstVideoDecoder * decoder, flow_ret = gst_video_decoder_drain_out (decoder, TRUE); ret = (flow_ret == GST_FLOW_OK); + /* Forward EOS immediately. This is required because no + * buffer or serialized event will come after EOS and + * nothing could trigger another _finish_frame() call. + * + * The subclass can override this behaviour by overriding + * the ::sink_event() vfunc and not chaining up to the + * parent class' ::sink_event() until a later time. + */ forward_immediate = TRUE; break; } @@ -966,6 +977,11 @@ gst_video_decoder_sink_event_default (GstVideoDecoder * decoder, flow_ret = gst_video_decoder_drain_out (decoder, FALSE); ret = (flow_ret == GST_FLOW_OK); + + /* Forward GAP immediately. Everything is drained after + * the GAP event and we can forward this event immediately + * now without having buffers out of order. + */ forward_immediate = TRUE; break; } @@ -980,6 +996,10 @@ gst_video_decoder_sink_event_default (GstVideoDecoder * decoder, flow_ret = gst_video_decoder_drain_out (decoder, FALSE); ret = (flow_ret == GST_FLOW_OK); } + /* Forward STILL_FRAME immediately. Everything is drained after + * the STILL_FRAME event and we can forward this event immediately + * now without having buffers out of order. + */ forward_immediate = TRUE; } break; @@ -1040,6 +1060,10 @@ gst_video_decoder_sink_event_default (GstVideoDecoder * decoder, /* well, this is kind of worse than a DISCONT */ gst_video_decoder_flush (decoder, TRUE); GST_VIDEO_DECODER_STREAM_UNLOCK (decoder); + /* Forward FLUSH_STOP immediately. This is required because it is + * expected to be forwarded immediately and no buffers are queued + * anyway. + */ forward_immediate = TRUE; break; } @@ -1061,16 +1085,10 @@ gst_video_decoder_sink_event_default (GstVideoDecoder * decoder, break; } - /* Forward non-serialized events and EOS/FLUSH_STOP immediately. - * For EOS this is required because no buffer or serialized event - * will come after EOS and nothing could trigger another - * _finish_frame() call. * - * If the subclass handles sending of EOS manually it can return - * _DROPPED from ::finish() and all other subclasses should have - * decoded/flushed all remaining data before this - * - * For FLUSH_STOP this is required because it is expected - * to be forwarded immediately and no buffers are queued anyway. + /* Forward non-serialized events immediately, and all other + * events which can be forwarded immediately without potentially + * causing the event to go out of order with other events and + * buffers as decided above. */ if (event) { if (!GST_EVENT_IS_SERIALIZED (event) || forward_immediate) { @@ -1246,7 +1264,6 @@ gst_video_decoder_src_event_default (GstVideoDecoder * decoder, gdouble proportion; GstClockTimeDiff diff; GstClockTime timestamp; - GstClockTime duration; gst_event_parse_qos (event, &type, &proportion, &diff, ×tamp); @@ -1254,13 +1271,7 @@ gst_video_decoder_src_event_default (GstVideoDecoder * decoder, priv->proportion = proportion; if (G_LIKELY (GST_CLOCK_TIME_IS_VALID (timestamp))) { if (G_UNLIKELY (diff > 0)) { - if (priv->output_state->info.fps_n > 0) - duration = - gst_util_uint64_scale (GST_SECOND, - priv->output_state->info.fps_d, priv->output_state->info.fps_n); - else - duration = 0; - priv->earliest_time = timestamp + 2 * diff + duration; + priv->earliest_time = timestamp + 2 * diff + priv->qos_frame_duration; } else { priv->earliest_time = timestamp + diff; } @@ -1384,8 +1395,13 @@ gst_video_decoder_src_query (GstPad * pad, GstObject * parent, GstQuery * query) GST_DEBUG_OBJECT (dec, "convert query"); gst_query_parse_convert (query, &src_fmt, &src_val, &dest_fmt, &dest_val); - res = gst_video_rawvideo_convert (dec->priv->output_state, - src_fmt, src_val, &dest_fmt, &dest_val); + GST_OBJECT_LOCK (dec); + if (dec->priv->output_state != NULL) + res = gst_video_rawvideo_convert (dec->priv->output_state, + src_fmt, src_val, &dest_fmt, &dest_val); + else + res = FALSE; + GST_OBJECT_UNLOCK (dec); if (!res) goto error; gst_query_set_convert (query, src_fmt, src_val, dest_fmt, dest_val); @@ -1399,7 +1415,7 @@ gst_video_decoder_src_query (GstPad * pad, GstObject * parent, GstQuery * query) res = gst_pad_peer_query (dec->sinkpad, query); if (res) { gst_query_parse_latency (query, &live, &min_latency, &max_latency); - GST_DEBUG_OBJECT (dec, "Peer latency: live %d, min %" + GST_DEBUG_OBJECT (dec, "Peer qlatency: live %d, min %" GST_TIME_FORMAT " max %" GST_TIME_FORMAT, live, GST_TIME_ARGS (min_latency), GST_TIME_ARGS (max_latency)); @@ -1589,9 +1605,14 @@ gst_video_decoder_reset (GstVideoDecoder * decoder, gboolean full) if (priv->input_state) gst_video_codec_state_unref (priv->input_state); priv->input_state = NULL; + GST_OBJECT_LOCK (decoder); if (priv->output_state) gst_video_codec_state_unref (priv->output_state); priv->output_state = NULL; + + priv->qos_frame_duration = 0; + GST_OBJECT_UNLOCK (decoder); + priv->min_latency = 0; priv->max_latency = 0; @@ -1605,6 +1626,7 @@ gst_video_decoder_reset (GstVideoDecoder * decoder, gboolean full) priv->base_timestamp = GST_CLOCK_TIME_NONE; priv->last_timestamp_out = GST_CLOCK_TIME_NONE; + priv->pts_delta = GST_CLOCK_TIME_NONE; priv->input_offset = 0; priv->frame_offset = 0; @@ -1630,8 +1652,10 @@ gst_video_decoder_reset (GstVideoDecoder * decoder, gboolean full) priv->bytes_out = 0; priv->time = 0; + GST_OBJECT_LOCK (decoder); priv->earliest_time = GST_CLOCK_TIME_NONE; priv->proportion = 0.5; + GST_OBJECT_UNLOCK (decoder); GST_VIDEO_DECODER_STREAM_UNLOCK (decoder); } @@ -1712,12 +1736,11 @@ gst_video_decoder_flush_decode (GstVideoDecoder * dec) while (walk) { GList *next; GstVideoCodecFrame *frame = (GstVideoCodecFrame *) (walk->data); - GstBuffer *buf = frame->input_buffer; GST_DEBUG_OBJECT (dec, "decoding frame %p buffer %p, PTS %" GST_TIME_FORMAT - ", DTS %" GST_TIME_FORMAT, frame, buf, - GST_TIME_ARGS (GST_BUFFER_PTS (buf)), - GST_TIME_ARGS (GST_BUFFER_DTS (buf))); + ", DTS %" GST_TIME_FORMAT, frame, frame->input_buffer, + GST_TIME_ARGS (GST_BUFFER_PTS (frame->input_buffer)), + GST_TIME_ARGS (GST_BUFFER_DTS (frame->input_buffer))); next = walk->next; @@ -2123,6 +2146,44 @@ gst_video_decoder_prepare_finish_frame (GstVideoDecoder * GST_TIME_ARGS (frame->duration)); } + /* PTS is expected montone ascending, + * so a good guess is lowest unsent DTS */ + { + GstClockTime min_ts = GST_CLOCK_TIME_NONE; + GstVideoCodecFrame *oframe = NULL; + gboolean seen_none = FALSE; + + /* some maintenance regardless */ + for (l = priv->frames; l; l = l->next) { + GstVideoCodecFrame *tmp = l->data; + + if (!GST_CLOCK_TIME_IS_VALID (tmp->abidata.ABI.ts)) { + seen_none = TRUE; + continue; + } + + if (!GST_CLOCK_TIME_IS_VALID (min_ts) || tmp->abidata.ABI.ts < min_ts) { + min_ts = tmp->abidata.ABI.ts; + oframe = tmp; + } + } + /* save a ts if needed */ + if (oframe && oframe != frame) { + oframe->abidata.ABI.ts = frame->abidata.ABI.ts; + } + + /* and set if needed; + * valid delta means we have reasonable DTS input */ + if (!GST_CLOCK_TIME_IS_VALID (frame->pts) && !seen_none && + GST_CLOCK_TIME_IS_VALID (priv->pts_delta)) { + frame->pts = min_ts + priv->pts_delta; + GST_DEBUG_OBJECT (decoder, + "no valid PTS, using oldest DTS %" GST_TIME_FORMAT, + GST_TIME_ARGS (frame->pts)); + } + } + + if (frame->pts == GST_CLOCK_TIME_NONE) { /* Last ditch timestamp guess: Just add the duration to the previous * frame */ @@ -2204,13 +2265,16 @@ gst_video_decoder_drop_frame (GstVideoDecoder * dec, GstVideoCodecFrame * frame) dec->priv->dropped++; /* post QoS message */ - timestamp = frame->pts; + GST_OBJECT_LOCK (dec); proportion = dec->priv->proportion; + earliest_time = dec->priv->earliest_time; + GST_OBJECT_UNLOCK (dec); + + timestamp = frame->pts; segment = &dec->output_segment; stream_time = gst_segment_to_stream_time (segment, GST_FORMAT_TIME, timestamp); qostime = gst_segment_to_running_time (segment, GST_FORMAT_TIME, timestamp); - earliest_time = dec->priv->earliest_time; jitter = GST_CLOCK_DIFF (qostime, earliest_time); qos_msg = gst_message_new_qos (GST_OBJECT_CAST (dec), FALSE, qostime, stream_time, @@ -2526,11 +2590,19 @@ gst_video_decoder_decode_frame (GstVideoDecoder * decoder, frame->pts = GST_BUFFER_PTS (frame->input_buffer); frame->dts = GST_BUFFER_DTS (frame->input_buffer); frame->duration = GST_BUFFER_DURATION (frame->input_buffer); + frame->abidata.ABI.ts = frame->dts; /* For keyframes, PTS = DTS */ if (GST_VIDEO_CODEC_FRAME_IS_SYNC_POINT (frame)) { - if (!GST_CLOCK_TIME_IS_VALID (frame->pts)) + if (!GST_CLOCK_TIME_IS_VALID (frame->pts)) { frame->pts = frame->dts; + } else if (GST_CLOCK_TIME_IS_VALID (frame->dts)) { + /* just in case they are not equal as might ideally be, + * e.g. quicktime has a (positive) delta approach */ + priv->pts_delta = frame->pts - frame->dts; + GST_DEBUG_OBJECT (decoder, "PTS delta %d ms", + (gint) (priv->pts_delta / GST_MSECOND)); + } } GST_LOG_OBJECT (decoder, "PTS %" GST_TIME_FORMAT ", DTS %" GST_TIME_FORMAT, @@ -2567,10 +2639,10 @@ gst_video_decoder_get_output_state (GstVideoDecoder * decoder) { GstVideoCodecState *state = NULL; - GST_VIDEO_DECODER_STREAM_LOCK (decoder); + GST_OBJECT_LOCK (decoder); if (decoder->priv->output_state) state = gst_video_codec_state_ref (decoder->priv->output_state); - GST_VIDEO_DECODER_STREAM_UNLOCK (decoder); + GST_OBJECT_UNLOCK (decoder); return state; } @@ -2615,12 +2687,23 @@ gst_video_decoder_set_output_state (GstVideoDecoder * decoder, state = _new_output_state (fmt, width, height, reference); GST_VIDEO_DECODER_STREAM_LOCK (decoder); + + GST_OBJECT_LOCK (decoder); /* Replace existing output state by new one */ if (priv->output_state) gst_video_codec_state_unref (priv->output_state); priv->output_state = gst_video_codec_state_ref (state); + if (priv->output_state != NULL && priv->output_state->info.fps_n > 0) { + priv->qos_frame_duration = + gst_util_uint64_scale (GST_SECOND, priv->output_state->info.fps_d, + priv->output_state->info.fps_n); + } else { + priv->qos_frame_duration = 0; + } priv->output_state_changed = TRUE; + GST_OBJECT_UNLOCK (decoder); + GST_VIDEO_DECODER_STREAM_UNLOCK (decoder); return state; @@ -2944,13 +3027,24 @@ gst_video_decoder_allocate_output_frame (GstVideoDecoder * decoder, GstVideoCodecFrame * frame) { GstFlowReturn flow_ret; - GstVideoCodecState *state = decoder->priv->output_state; - int num_bytes = GST_VIDEO_INFO_SIZE (&state->info); + GstVideoCodecState *state; + int num_bytes; - g_return_val_if_fail (num_bytes != 0, GST_FLOW_ERROR); g_return_val_if_fail (frame->output_buffer == NULL, GST_FLOW_ERROR); GST_VIDEO_DECODER_STREAM_LOCK (decoder); + + state = decoder->priv->output_state; + if (state == NULL) { + g_warning ("Output state should be set before allocating frame"); + goto error; + } + num_bytes = GST_VIDEO_INFO_SIZE (&state->info); + if (num_bytes == 0) { + g_warning ("Frame size should not be 0"); + goto error; + } + if (G_UNLIKELY (decoder->priv->output_state_changed || (decoder->priv->output_state && gst_pad_check_reconfigure (decoder->srcpad)))) @@ -2964,6 +3058,10 @@ gst_video_decoder_allocate_output_frame (GstVideoDecoder * GST_VIDEO_DECODER_STREAM_UNLOCK (decoder); return flow_ret; + +error: + GST_VIDEO_DECODER_STREAM_UNLOCK (decoder); + return GST_FLOW_ERROR; } /** diff --git a/gst-libs/gst/video/gstvideoencoder.c b/gst-libs/gst/video/gstvideoencoder.c index d8a5ec2e3b..2b0e3de05f 100644 --- a/gst-libs/gst/video/gstvideoencoder.c +++ b/gst-libs/gst/video/gstvideoencoder.c @@ -1217,6 +1217,7 @@ gst_video_encoder_new_frame (GstVideoEncoder * encoder, GstBuffer * buf, frame->pts = pts; frame->dts = dts; frame->duration = duration; + frame->abidata.ABI.ts = pts; return frame; } @@ -1229,7 +1230,7 @@ gst_video_encoder_chain (GstPad * pad, GstObject * parent, GstBuffer * buf) GstVideoEncoderPrivate *priv; GstVideoEncoderClass *klass; GstVideoCodecFrame *frame; - GstClockTime pts, dts, duration; + GstClockTime pts, duration; GstFlowReturn ret = GST_FLOW_OK; guint64 start, stop, cstart, cstop; @@ -1254,14 +1255,13 @@ gst_video_encoder_chain (GstPad * pad, GstObject * parent, GstBuffer * buf) GST_VIDEO_ENCODER_STREAM_LOCK (encoder); pts = GST_BUFFER_PTS (buf); - dts = GST_BUFFER_DTS (buf); duration = GST_BUFFER_DURATION (buf); GST_LOG_OBJECT (encoder, "received buffer of size %" G_GSIZE_FORMAT " with PTS %" GST_TIME_FORMAT - ", PTS %" GST_TIME_FORMAT ", duration %" GST_TIME_FORMAT, - gst_buffer_get_size (buf), GST_TIME_ARGS (pts), GST_TIME_ARGS (dts), - GST_TIME_ARGS (duration)); + ", DTS %" GST_TIME_FORMAT ", duration %" GST_TIME_FORMAT, + gst_buffer_get_size (buf), GST_TIME_ARGS (pts), + GST_TIME_ARGS (GST_BUFFER_DTS (buf)), GST_TIME_ARGS (duration)); if (priv->at_eos) { ret = GST_FLOW_EOS; @@ -1275,15 +1275,17 @@ gst_video_encoder_chain (GstPad * pad, GstObject * parent, GstBuffer * buf) stop = GST_CLOCK_TIME_NONE; /* Drop buffers outside of segment */ - if (!gst_segment_clip (&encoder->output_segment, + if (!gst_segment_clip (&encoder->input_segment, GST_FORMAT_TIME, start, stop, &cstart, &cstop)) { GST_DEBUG_OBJECT (encoder, "clipping to segment dropped frame"); gst_buffer_unref (buf); goto done; } - frame = - gst_video_encoder_new_frame (encoder, buf, cstart, dts, cstop - cstart); + /* incoming DTS is not really relevant and does not make sense anyway, + * so pass along _NONE and maybe come up with something better later on */ + frame = gst_video_encoder_new_frame (encoder, buf, cstart, + GST_CLOCK_TIME_NONE, cstop - cstart); GST_OBJECT_LOCK (encoder); if (priv->force_key_unit) { @@ -1756,6 +1758,41 @@ gst_video_encoder_finish_frame (GstVideoEncoder * encoder, GST_BUFFER_FLAG_SET (frame->output_buffer, GST_BUFFER_FLAG_DELTA_UNIT); } + /* DTS is expected monotone ascending, + * so a good guess is the lowest unsent PTS (all being OK) */ + { + GstClockTime min_ts = GST_CLOCK_TIME_NONE; + GstVideoCodecFrame *oframe = NULL; + gboolean seen_none = FALSE; + + /* some maintenance regardless */ + for (l = priv->frames; l; l = l->next) { + GstVideoCodecFrame *tmp = l->data; + + if (!GST_CLOCK_TIME_IS_VALID (tmp->abidata.ABI.ts)) { + seen_none = TRUE; + continue; + } + + if (!GST_CLOCK_TIME_IS_VALID (min_ts) || tmp->abidata.ABI.ts < min_ts) { + min_ts = tmp->abidata.ABI.ts; + oframe = tmp; + } + } + /* save a ts if needed */ + if (oframe && oframe != frame) { + oframe->abidata.ABI.ts = frame->abidata.ABI.ts; + } + + /* and set if needed */ + if (!GST_CLOCK_TIME_IS_VALID (frame->dts) && !seen_none) { + frame->dts = min_ts; + GST_DEBUG_OBJECT (encoder, + "no valid DTS, using oldest PTS %" GST_TIME_FORMAT, + GST_TIME_ARGS (frame->pts)); + } + } + frame->distance_from_sync = priv->distance_from_sync; priv->distance_from_sync++; diff --git a/gst-libs/gst/video/gstvideoutils.h b/gst-libs/gst/video/gstvideoutils.h index 50cb2b56fb..a3ff4f9e35 100644 --- a/gst-libs/gst/video/gstvideoutils.h +++ b/gst-libs/gst/video/gstvideoutils.h @@ -246,7 +246,12 @@ struct _GstVideoCodecFrame gpointer user_data; GDestroyNotify user_data_destroy_notify; - void *padding[GST_PADDING_LARGE]; + union { + struct { + GstClockTime ts; + } ABI; + void *padding[GST_PADDING_LARGE]; + } abidata; }; /* GstVideoCodecState */ diff --git a/gst-plugins-base.doap b/gst-plugins-base.doap index c4cf3e2e03..728a97dab7 100644 --- a/gst-plugins-base.doap +++ b/gst-plugins-base.doap @@ -34,6 +34,16 @@ A wide range of video and audio decoders, encoders, and filters are included. + + + 1.0.0 + 1.0 + + 2012-09-24 + + + + 0.11.99 diff --git a/gst/adder/gstadder.c b/gst/adder/gstadder.c index 0efdc81d37..84488968bf 100644 --- a/gst/adder/gstadder.c +++ b/gst/adder/gstadder.c @@ -296,7 +296,7 @@ gst_adder_setcaps (GstAdder * adder, GstPad * pad, GstCaps * caps) GST_INFO_OBJECT (pad, "setting caps to %" GST_PTR_FORMAT, caps); adder->current_caps = gst_caps_ref (caps); - gst_pad_push_event (adder->srcpad, gst_event_new_caps (adder->current_caps)); + /* send caps event later, after stream-start event */ it = gst_element_iterate_pads (GST_ELEMENT_CAST (adder)); @@ -1114,6 +1114,24 @@ gst_adder_collected (GstCollectPads * pads, gpointer user_data) if (G_UNLIKELY (adder->func == NULL)) goto not_negotiated; + if (adder->send_stream_start) { + gchar s_id[32]; + + /* stream-start (FIXME: create id based on input ids) */ + g_snprintf (s_id, sizeof (s_id), "adder-%08x", g_random_int ()); + gst_pad_push_event (adder->srcpad, gst_event_new_stream_start (s_id)); + adder->send_stream_start = FALSE; + } + + if (adder->send_caps) { + GstEvent *caps_event; + + caps_event = gst_event_new_caps (adder->current_caps); + GST_INFO_OBJECT (adder, "caps event %" GST_PTR_FORMAT, caps_event); + gst_pad_push_event (adder->srcpad, caps_event); + adder->send_caps = FALSE; + } + if (g_atomic_int_compare_and_exchange (&adder->flush_stop_pending, TRUE, FALSE)) { GST_DEBUG_OBJECT (adder, "pending flush stop"); @@ -1339,6 +1357,8 @@ gst_adder_change_state (GstElement * element, GstStateChange transition) adder->flush_stop_pending = FALSE; adder->new_segment_pending = TRUE; adder->wait_for_new_segment = FALSE; + adder->send_stream_start = TRUE; + adder->send_caps = TRUE; gst_caps_replace (&adder->current_caps, NULL); gst_segment_init (&adder->segment, GST_FORMAT_TIME); gst_collect_pads_start (adder->collect); diff --git a/gst/adder/gstadder.h b/gst/adder/gstadder.h index 59d6f9bec9..9c61e12e62 100644 --- a/gst/adder/gstadder.h +++ b/gst/adder/gstadder.h @@ -81,6 +81,9 @@ struct _GstAdder { GList *pending_events; gboolean in_setcaps; + + gboolean send_stream_start; + gboolean send_caps; }; struct _GstAdderClass { diff --git a/gst/audioconvert/gstchannelmix.c b/gst/audioconvert/gstchannelmix.c index 21a70cafd1..2364faa6cf 100644 --- a/gst/audioconvert/gstchannelmix.c +++ b/gst/audioconvert/gstchannelmix.c @@ -683,7 +683,7 @@ gst_channel_mix_mix_int (AudioConvertCtx * this, outchannels = this->out.channels; backwards = outchannels > inchannels; - /* FIXME: use liboil here? */ + /* FIXME: use orc here? */ for (n = (backwards ? samples - 1 : 0); n < samples && n >= 0; backwards ? n-- : n++) { for (out = 0; out < outchannels; out++) { diff --git a/gst/encoding/gstencodebin.c b/gst/encoding/gstencodebin.c index db45f57116..a811b5d636 100644 --- a/gst/encoding/gstencodebin.c +++ b/gst/encoding/gstencodebin.c @@ -1793,7 +1793,9 @@ stream_group_free (GstEncodeBin * ebin, StreamGroup * sgroup) /* Remove muxer request sink pad */ gst_pad_unlink (tmppad, pad); - gst_element_release_request_pad (ebin->muxer, pad); + if (GST_PAD_TEMPLATE_PRESENCE (GST_PAD_PAD_TEMPLATE (pad)) == + GST_PAD_REQUEST) + gst_element_release_request_pad (ebin->muxer, pad); gst_object_unref (tmppad); gst_object_unref (pad); } diff --git a/gst/playback/gstdecodebin2.c b/gst/playback/gstdecodebin2.c index 43f6a8b80b..a4148ef662 100644 --- a/gst/playback/gstdecodebin2.c +++ b/gst/playback/gstdecodebin2.c @@ -929,6 +929,8 @@ gst_decode_bin_class_init (GstDecodeBinClass * klass) gstbin_klass->handle_message = GST_DEBUG_FUNCPTR (gst_decode_bin_handle_message); + + g_type_class_ref (GST_TYPE_DECODE_PAD); } gint diff --git a/gst/playback/gstplaysink.c b/gst/playback/gstplaysink.c index 4d09a4ef74..36fc5da080 100644 --- a/gst/playback/gstplaysink.c +++ b/gst/playback/gstplaysink.c @@ -627,6 +627,9 @@ gst_play_sink_class_init (GstPlaySinkClass * klass) _playsink_reset_segment_event_marker_id = g_quark_from_static_string ("gst-playsink-reset-segment-event-marker"); + + g_type_class_ref (GST_TYPE_STREAM_SYNCHRONIZER); + g_type_class_ref (GST_TYPE_COLOR_BALANCE_CHANNEL); } static void @@ -2899,7 +2902,7 @@ no_audioconvert: post_missing_element_message (playsink, "audioconvert"); GST_ELEMENT_ERROR (playsink, CORE, MISSING_PLUGIN, (_("Missing element '%s' - check your GStreamer installation."), - "audioconvert"), ("possibly a liboil version mismatch?")); + "audioconvert"), ("make sure audioconvert isn't blacklisted")); free_chain ((GstPlayChain *) chain); return NULL; } diff --git a/gst/videoconvert/gstvideoconvert.c b/gst/videoconvert/gstvideoconvert.c index e14c8994e9..03357b6630 100644 --- a/gst/videoconvert/gstvideoconvert.c +++ b/gst/videoconvert/gstvideoconvert.c @@ -290,7 +290,7 @@ gst_video_convert_class_init (GstVideoConvertClass * klass) gst_static_pad_template_get (&gst_video_convert_sink_template)); gst_element_class_set_static_metadata (gstelement_class, - " Colorspace converter", "Filter/Converter/Video", + "Colorspace converter", "Filter/Converter/Video", "Converts video from one colorspace to another", "GStreamer maintainers "); @@ -391,4 +391,5 @@ plugin_init (GstPlugin * plugin) GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, - videoconvert, "Colorspace conversion", plugin_init, VERSION, "LGPL", "", "") + videoconvert, "Colorspace conversion", plugin_init, VERSION, GST_LICENSE, + GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) diff --git a/gst/videotestsrc/gstvideotestsrc.c b/gst/videotestsrc/gstvideotestsrc.c index 5f9a7ccd6b..9c2a303bb4 100644 --- a/gst/videotestsrc/gstvideotestsrc.c +++ b/gst/videotestsrc/gstvideotestsrc.c @@ -704,6 +704,12 @@ gst_video_test_src_setcaps (GstBaseSrc * bsrc, GstCaps * caps) videotestsrc->tmpline2 = g_malloc ((info.width + 8) * 4); videotestsrc->tmpline_u16 = g_malloc ((info.width + 16) * 8); + videotestsrc->accum_rtime += videotestsrc->running_time; + videotestsrc->accum_frames += videotestsrc->n_frames; + + videotestsrc->running_time = 0; + videotestsrc->n_frames = 0; + return TRUE; /* ERRORS */ @@ -783,6 +789,8 @@ gst_video_test_src_do_seek (GstBaseSrc * bsrc, GstSegment * segment) } else { src->n_frames = 0; } + src->accum_frames = 0; + src->accum_rtime = 0; if (src->info.fps_n) { src->running_time = gst_util_uint64_scale (src->n_frames, src->info.fps_d * GST_SECOND, src->info.fps_n); @@ -830,11 +838,19 @@ gst_video_test_src_fill (GstPushSrc * psrc, GstBuffer * buffer) gst_video_frame_unmap (&frame); - GST_BUFFER_DTS (buffer) = src->timestamp_offset + src->running_time; + GST_BUFFER_DTS (buffer) = + src->accum_rtime + src->timestamp_offset + src->running_time; GST_BUFFER_PTS (buffer) = GST_BUFFER_DTS (buffer); - GST_BUFFER_OFFSET (buffer) = src->n_frames; + + GST_DEBUG_OBJECT (src, "Timestamp: %" GST_TIME_FORMAT " = accumulated %" + GST_TIME_FORMAT " + offset: %" + GST_TIME_FORMAT " + running time: %" GST_TIME_FORMAT, + GST_TIME_ARGS (GST_BUFFER_PTS (buffer)), GST_TIME_ARGS (src->accum_rtime), + GST_TIME_ARGS (src->timestamp_offset), GST_TIME_ARGS (src->running_time)); + + GST_BUFFER_OFFSET (buffer) = src->accum_frames + src->n_frames; src->n_frames++; - GST_BUFFER_OFFSET_END (buffer) = src->n_frames; + GST_BUFFER_OFFSET_END (buffer) = GST_BUFFER_OFFSET (buffer) + 1; if (src->info.fps_n) { next_time = gst_util_uint64_scale_int (src->n_frames * GST_SECOND, src->info.fps_d, src->info.fps_n); @@ -874,6 +890,8 @@ gst_video_test_src_start (GstBaseSrc * basesrc) src->running_time = 0; src->n_frames = 0; + src->accum_frames = 0; + src->accum_rtime = 0; return TRUE; } diff --git a/gst/videotestsrc/gstvideotestsrc.h b/gst/videotestsrc/gstvideotestsrc.h index f64837ec0c..a09e210799 100644 --- a/gst/videotestsrc/gstvideotestsrc.h +++ b/gst/videotestsrc/gstvideotestsrc.h @@ -130,9 +130,15 @@ struct _GstVideoTestSrc { /* private */ gint64 timestamp_offset; /* base offset */ + + /* running time and frames for current caps */ GstClockTime running_time; /* total running time */ gint64 n_frames; /* total frames sent */ + /* previous caps running time and frames */ + GstClockTime accum_rtime; /* accumulated running_time */ + gint64 accum_frames; /* accumulated frames */ + /* zoneplate */ gint k0; gint kx; diff --git a/tests/check/elements/ffmpegcolorspace.c b/tests/check/elements/ffmpegcolorspace.c deleted file mode 100644 index a4bbfab068..0000000000 --- a/tests/check/elements/ffmpegcolorspace.c +++ /dev/null @@ -1,405 +0,0 @@ -/* GStreamer - * - * unit test for videoconvert - * - * Copyright (C) <2006> Tim-Philipp Müller - * - * 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., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#ifdef HAVE_CONFIG_H -# include -#endif - -#ifdef HAVE_VALGRIND -# include -#endif - -#include - -#include - -typedef struct _RGBConversion -{ - const gchar *from_fmt; - const gchar *to_fmt; - GstCaps *from_caps; - GstCaps *to_caps; -} RGBConversion; - -static GstCaps * -rgb_format_to_caps (const gchar * fmt) -{ - GstCaps *caps; - - g_assert (fmt != NULL); - - caps = gst_caps_new_simple ("video/x-raw", - "format", G_TYPE_STRING, fmt, - "width", G_TYPE_INT, 16, "height", G_TYPE_INT, 16, - "framerate", GST_TYPE_FRACTION, 1, 1, NULL); - - return caps; -} - -static GList * -create_rgb_conversions (void) -{ - const gchar *rgb_formats[] = { - "RGBA", - "ARGB", - "BGRA", - "ABGR", - "RGBx", - "xRGB", - "BGRx", - "xBGR", - "RGB", - "BGR", - "RGB15", - "BGR15", - "RGB16", - "BGR16" - }; - GList *conversions = NULL; - guint from_fmt, to_fmt; - - for (from_fmt = 0; from_fmt < G_N_ELEMENTS (rgb_formats); ++from_fmt) { - for (to_fmt = 0; to_fmt < G_N_ELEMENTS (rgb_formats); ++to_fmt) { - guint i; - - for (i = 0; i < 4; ++i) { - RGBConversion *conversion; - - conversion = g_new0 (RGBConversion, 1); - conversion->from_fmt = rgb_formats[from_fmt]; - conversion->to_fmt = rgb_formats[to_fmt]; - conversion->from_caps = rgb_format_to_caps (conversion->from_fmt); - conversion->to_caps = rgb_format_to_caps (conversion->to_fmt); - conversions = g_list_prepend (conversions, conversion); - } - } - } - - return g_list_reverse (conversions); -} - -static void -rgb_conversion_free (RGBConversion * conv) -{ - gst_caps_unref (conv->from_caps); - gst_caps_unref (conv->to_caps); - memset (conv, 0x99, sizeof (RGBConversion)); - g_free (conv); -} - -static guint32 -right_shift_colour (guint32 mask, guint32 pixel) -{ - if (mask == 0) - return 0; - - pixel = pixel & mask; - while ((mask & 0x01) == 0) { - mask = mask >> 1; - pixel = pixel >> 1; - } - - return pixel; -} - -#if 0 -static guint8 -fix_expected_colour (guint32 col_mask, guint8 col_expected) -{ - guint32 mask; - gint last = g_bit_nth_msf (col_mask, -1); - gint first = g_bit_nth_lsf (col_mask, -1); - - mask = 1 << (last - first + 1); - mask -= 1; - - g_assert (col_expected == 0x00 || col_expected == 0xff); - - /* this only works because we only check for all-bits-set or no-bits-set */ - return col_expected & mask; -} - -static void -check_rgb_buf (const guint8 * pixels, guint32 r_mask, guint32 g_mask, - guint32 b_mask, guint32 a_mask, guint8 r_expected, guint8 g_expected, - guint8 b_expected, guint endianness, guint bpp, guint depth) -{ - guint32 pixel, red, green, blue; - - switch (bpp) { - case 32:{ - if (endianness == G_LITTLE_ENDIAN) - pixel = GST_READ_UINT32_LE (pixels); - else - pixel = GST_READ_UINT32_BE (pixels); - break; - } - case 24:{ - if (endianness == G_BIG_ENDIAN) { - pixel = (GST_READ_UINT8 (pixels) << 16) | - (GST_READ_UINT8 (pixels + 1) << 8) | - (GST_READ_UINT8 (pixels + 2) << 0); - } else { - pixel = (GST_READ_UINT8 (pixels + 2) << 16) | - (GST_READ_UINT8 (pixels + 1) << 8) | - (GST_READ_UINT8 (pixels + 0) << 0); - } - break; - } - case 16:{ - if (endianness == G_LITTLE_ENDIAN) - pixel = GST_READ_UINT16_LE (pixels); - else - pixel = GST_READ_UINT16_BE (pixels); - break; - } - default: - g_return_if_reached (); - } - - red = right_shift_colour (r_mask, pixel); - green = right_shift_colour (g_mask, pixel); - blue = right_shift_colour (b_mask, pixel); - /* alpha = right_shift_colour (a_mask, pixel); */ - - /* can't enable this by default, valgrind will complain about accessing - * uninitialised memory for the depth=24,bpp=32 formats ... */ - /* GST_LOG ("pixels: 0x%02x 0x%02x 0x%02x 0x%02x => pixel = 0x%08x", - pixels[0], (guint) pixels[1], pixels[2], pixels[3], pixel); */ - - /* fix up the mask (for rgb15/16) */ - if (bpp == 16) { - r_expected = fix_expected_colour (r_mask, r_expected); - g_expected = fix_expected_colour (g_mask, g_expected); - b_expected = fix_expected_colour (b_mask, b_expected); - } - - fail_unless (red == r_expected, "RED: expected 0x%02x, found 0x%02x " - "Bytes: 0x%02x 0x%02x 0x%02x 0x%02x Pixel: 0x%08x", r_expected, red, - pixels[0], pixels[1], pixels[2], pixels[3], pixel); - fail_unless (green == g_expected, "GREEN: expected 0x%02x, found 0x%02x " - "Bytes: 0x%02x 0x%02x 0x%02x 0x%02x Pixel: 0x%08x", g_expected, green, - pixels[0], pixels[1], pixels[2], pixels[3], pixel); - fail_unless (blue == b_expected, "BLUE: expected 0x%02x, found 0x%02x " - "Bytes: 0x%02x 0x%02x 0x%02x 0x%02x Pixel: 0x%08x", b_expected, blue, - pixels[0], pixels[1], pixels[2], pixels[3], pixel); - -// FIXME: fix alpha check -// fail_unless (a_mask == 0 || alpha != 0); /* better than nothing */ -} -#endif - -static void -got_buf_cb (GstElement * sink, GstBuffer * new_buf, GstPad * pad, - GstBuffer ** p_old_buf) -{ - gst_buffer_replace (p_old_buf, new_buf); -} - -/* Note: lots of this code here is also in the videotestsrc.c unit test */ -GST_START_TEST (test_rgb_to_rgb) -{ - const struct - { - const gchar *pattern_name; - gint pattern_enum; - guint8 r_expected; - guint8 g_expected; - guint8 b_expected; - } test_patterns[] = { - { - "white", 3, 0xff, 0xff, 0xff}, { - "red", 4, 0xff, 0x00, 0x00}, { - "green", 5, 0x00, 0xff, 0x00}, { - "blue", 6, 0x00, 0x00, 0xff}, { - "black", 2, 0x00, 0x00, 0x00} - }; - GstElement *pipeline, *src, *filter1, *csp, *filter2, *sink; - GstCaps *template_caps; - GstBuffer *buf = NULL; - GstPad *srcpad, *csppad; - GList *conversions, *l; - gint p; - - /* test check function */ - fail_unless (right_shift_colour (0x00ff0000, 0x11223344) == 0x22); - - pipeline = gst_pipeline_new ("pipeline"); - src = gst_check_setup_element ("videotestsrc"); - filter1 = gst_check_setup_element ("capsfilter"); - csp = gst_check_setup_element ("videoconvert"); - filter2 = gst_element_factory_make ("capsfilter", "to_filter"); - sink = gst_check_setup_element ("fakesink"); - - gst_bin_add_many (GST_BIN (pipeline), src, filter1, csp, filter2, sink, NULL); - - fail_unless (gst_element_link (src, filter1)); - fail_unless (gst_element_link (filter1, csp)); - fail_unless (gst_element_link (csp, filter2)); - fail_unless (gst_element_link (filter2, sink)); - - srcpad = gst_element_get_static_pad (src, "src"); - template_caps = gst_pad_get_pad_template_caps (srcpad); - gst_object_unref (srcpad); - - csppad = gst_element_get_static_pad (csp, "src"); - - g_object_set (sink, "signal-handoffs", TRUE, NULL); - g_signal_connect (sink, "preroll-handoff", G_CALLBACK (got_buf_cb), &buf); - - GST_LOG ("videotestsrc src template caps: %" GST_PTR_FORMAT, template_caps); - - conversions = create_rgb_conversions (); - - for (l = conversions; l != NULL; l = l->next) { - RGBConversion *conv = (RGBConversion *) l->data; - - /* does videotestsrc support the from_caps? */ - if (!gst_caps_is_subset (conv->from_caps, template_caps)) { - GST_DEBUG ("videotestsrc doesn't support from_caps %" GST_PTR_FORMAT, - conv->from_caps); - continue; - } - - /* caps are supported, let's run some tests then ... */ - for (p = 0; p < G_N_ELEMENTS (test_patterns); ++p) { - GstStateChangeReturn state_ret; - const gchar *from = conv->from_fmt; - const gchar *to = conv->to_fmt; -#if 0 - guint8 *data; - gsize size; -#endif - - /* trick compiler into thinking from is used, might throw warning - * otherwise if the debugging system is disabled */ - fail_unless (from != NULL); - - gst_element_set_state (pipeline, GST_STATE_NULL); - - g_object_set (src, "pattern", test_patterns[p].pattern_enum, NULL); - - GST_INFO ("%5s => %5s, pattern=%s", - from, to, test_patterns[p].pattern_name); - - /* now get videotestsrc to produce a buffer with the given caps */ - g_object_set (filter1, "caps", conv->from_caps, NULL); - - /* ... and force videoconvert to convert to our target caps */ - g_object_set (filter2, "caps", conv->to_caps, NULL); - - state_ret = gst_element_set_state (pipeline, GST_STATE_PAUSED); - if (state_ret == GST_STATE_CHANGE_FAILURE) { - GstMessage *msg; - GError *err = NULL; - - msg = gst_bus_poll (GST_ELEMENT_BUS (pipeline), GST_MESSAGE_ERROR, 0); - fail_if (msg == NULL, "expected ERROR message on the bus"); - fail_unless (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_ERROR); - gst_message_parse_error (msg, &err, NULL); - fail_unless (err != NULL); - if (msg->src == GST_OBJECT_CAST (src) && - err->code == GST_STREAM_ERROR_FORMAT) { - GST_DEBUG ("videoconvert does not support this conversion"); - gst_message_unref (msg); - g_error_free (err); - continue; - } - fail_unless (state_ret != GST_STATE_CHANGE_FAILURE, - "pipeline _set_state() to PAUSED failed: %s", err->message); - } - - state_ret = gst_element_get_state (pipeline, NULL, NULL, -1); - fail_unless (state_ret == GST_STATE_CHANGE_SUCCESS, - "pipeline failed going to PAUSED state"); - - state_ret = gst_element_set_state (pipeline, GST_STATE_NULL); - fail_unless (state_ret == GST_STATE_CHANGE_SUCCESS); - - fail_unless (buf != NULL); - - /* check buffer caps */ - { - GstCaps *caps; - GstStructure *s; - const gchar *fmt; - - g_object_get (csppad, "caps", &caps, NULL); - - fail_unless (caps != NULL); - s = gst_caps_get_structure (caps, 0); - fmt = gst_structure_get_string (s, "format"); - fail_unless (fmt != NULL); - fail_unless (!strcmp (fmt, to)); - } - -#if 0 - /* now check the top-left pixel */ - data = gst_buffer_map (buf, &size, NULL, GST_MAP_READ); - check_rgb_buf (data, to->red_mask, - to->green_mask, to->blue_mask, to->alpha_mask, - test_patterns[p].r_expected, test_patterns[p].g_expected, - test_patterns[p].b_expected, to->endianness, to->bpp, to->depth); - gst_buffer_unmap (buf, data, size); -#endif - - gst_buffer_unref (buf); - buf = NULL; - } - } - - gst_caps_unref (template_caps); - - g_list_foreach (conversions, (GFunc) rgb_conversion_free, NULL); - g_list_free (conversions); - - gst_element_set_state (pipeline, GST_STATE_NULL); - gst_object_unref (pipeline); -} - -GST_END_TEST; - -static Suite * -videoconvert_suite (void) -{ - Suite *s = suite_create ("videoconvert"); - TCase *tc_chain = tcase_create ("general"); - - suite_add_tcase (s, tc_chain); - -#ifdef HAVE_VALGRIND - if (RUNNING_ON_VALGRIND) { - /* otherwise valgrind errors out when liboil probes CPU extensions - * during which it causes SIGILLs etc. to be fired */ - g_setenv ("OIL_CPU_FLAGS", "0", 0); - /* test_rgb_formats takes a bit longer, so increase timeout */ - tcase_set_timeout (tc_chain, 10 * 60); - } -#endif - - /* FIXME: add tests for YUV <=> YUV and YUV <=> RGB */ - tcase_add_test (tc_chain, test_rgb_to_rgb); - - return s; -} - -GST_CHECK_MAIN (videoconvert); diff --git a/tests/check/elements/videotestsrc.c b/tests/check/elements/videotestsrc.c index 40fd3693d9..0760a088a0 100644 --- a/tests/check/elements/videotestsrc.c +++ b/tests/check/elements/videotestsrc.c @@ -379,9 +379,6 @@ videotestsrc_suite (void) #ifdef HAVE_VALGRIND if (RUNNING_ON_VALGRIND) { - /* otherwise valgrind errors out when liboil probes CPU extensions - * during which it causes SIGILLs etc. to be fired */ - g_setenv ("OIL_CPU_FLAGS", "0", 0); /* test_rgb_formats takes a bit longer, so increase timeout */ tcase_set_timeout (tc_chain, 5 * 60); } diff --git a/tests/icles/playbin-text.c b/tests/icles/playbin-text.c index a8129e98c1..7a603e5b63 100644 --- a/tests/icles/playbin-text.c +++ b/tests/icles/playbin-text.c @@ -83,21 +83,22 @@ bus_message (GstBus * bus, GstMessage * message, App * app) return TRUE; } -static void +static GstFlowReturn have_subtitle (GstElement * appsink, App * app) { GstBuffer *buffer; + GstSample *sample; /* get the buffer, we can also wakeup the mainloop to get the subtitle from * appsink in the mainloop */ - g_signal_emit_by_name (appsink, "pull-buffer", &buffer); - - if (buffer) { + g_signal_emit_by_name (appsink, "pull-sample", &sample); + if (sample) { GstMapInfo map; gint64 position; GstClock *clock; GstClockTime base_time, running_time; + buffer = gst_sample_get_buffer (sample); gst_element_query_position (appsink, GST_FORMAT_TIME, &position); clock = gst_element_get_clock (appsink); @@ -114,7 +115,9 @@ have_subtitle (GstElement * appsink, App * app) gst_buffer_map (buffer, &map, GST_MAP_READ); gst_util_dump_mem (map.data, map.size); gst_buffer_unmap (buffer, &map); + gst_sample_unref (sample); } + return GST_FLOW_OK; } int @@ -127,7 +130,7 @@ main (int argc, char *argv[]) gst_init (&argc, &argv); if (argc < 2) { - g_print ("usage: %s \n", argv[0]); + g_print ("usage: %s []\n", argv[0]); return -1; } @@ -141,7 +144,7 @@ main (int argc, char *argv[]) app->textsink = gst_element_factory_make ("appsink", "subtitle_sink"); g_object_set (G_OBJECT (app->textsink), "emit-signals", TRUE, NULL); g_object_set (G_OBJECT (app->textsink), "ts-offset", 0 * GST_SECOND, NULL); - g_signal_connect (app->textsink, "new-buffer", G_CALLBACK (have_subtitle), + g_signal_connect (app->textsink, "new-sample", G_CALLBACK (have_subtitle), app); subcaps = gst_caps_from_string ("text/x-raw, format={ utf8, pango-markup }"); g_object_set (G_OBJECT (app->textsink), "caps", subcaps, NULL); @@ -157,6 +160,9 @@ main (int argc, char *argv[]) /* set to read from appsrc */ g_object_set (app->playbin, "uri", argv[1], NULL); + if (argc > 2) + g_object_set (app->playbin, "suburi", argv[2], NULL); + /* go to playing and wait in a mainloop. */ gst_element_set_state (app->playbin, GST_STATE_PLAYING); diff --git a/win32/common/_stdint.h b/win32/common/_stdint.h index 6e38443030..58313a4049 100644 --- a/win32/common/_stdint.h +++ b/win32/common/_stdint.h @@ -1,7 +1,7 @@ #ifndef _GST_PLUGINS_BASE__STDINT_H #define _GST_PLUGINS_BASE__STDINT_H 1 #ifndef _GENERATED_STDINT_H -#define _GENERATED_STDINT_H "gst-plugins-base 0.11.99" +#define _GENERATED_STDINT_H "gst-plugins-base 1.0.0.1" /* generated using gnu compiler gcc (Debian 4.7.1-5) 4.7.1 */ #define _STDINT_HAVE_STDINT_H 1 #include diff --git a/win32/common/config.h b/win32/common/config.h index fe0cff2d79..c348705d35 100644 --- a/win32/common/config.h +++ b/win32/common/config.h @@ -81,13 +81,13 @@ #define GST_LICENSE "LGPL" /* package name in plugins */ -#define GST_PACKAGE_NAME "GStreamer Base Plug-ins source release" +#define GST_PACKAGE_NAME "GStreamer Base Plug-ins git" /* package origin */ #define GST_PACKAGE_ORIGIN "Unknown package origin" /* GStreamer package release date/time for plugins as YYYY-MM-DD */ -#define GST_PACKAGE_RELEASE_DATETIME "2012-09-17" +#define GST_PACKAGE_RELEASE_DATETIME "2012-09-24T15:34Z" /* Define to enable ALSA (used by alsa). */ #undef HAVE_ALSA @@ -313,7 +313,7 @@ #define PACKAGE_NAME "GStreamer Base Plug-ins" /* Define to the full name and version of this package. */ -#define PACKAGE_STRING "GStreamer Base Plug-ins 0.11.99" +#define PACKAGE_STRING "GStreamer Base Plug-ins 1.0.0.1" /* Define to the one symbol short name of this package. */ #define PACKAGE_TARNAME "gst-plugins-base" @@ -322,7 +322,7 @@ #undef PACKAGE_URL /* Define to the version of this package. */ -#define PACKAGE_VERSION "0.11.99" +#define PACKAGE_VERSION "1.0.0.1" /* directory where plugins are located */ #ifdef _DEBUG @@ -356,7 +356,7 @@ #undef USE_TREMOLO /* Version number of package */ -#define VERSION "0.11.99" +#define VERSION "1.0.0.1" /* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most significant byte first (like Motorola and SPARC, unlike Intel). */