Merge branch 'master' of ssh://git.freedesktop.org/git/gstreamer/gst-plugins-base

This commit is contained in:
Michael Smith 2012-10-03 10:45:26 -07:00
commit 92560517e8
60 changed files with 567 additions and 709 deletions

45
NEWS
View file

@ -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

217
RELEASE
View file

@ -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
 
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
Руслан Ижбулатов

2
common

@ -1 +1 @@
Subproject commit 4f962f78357a11e545510d48227f41af24bfaab7
Subproject commit 6c0b52c72c0958952b79b573105a270d7a651b33

View file

@ -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 ****

View file

@ -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

View file

@ -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:

View file

@ -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.

View file

@ -3,10 +3,10 @@
<description>Adds multiple streams</description>
<filename>../../gst/adder/.libs/libgstadder.so</filename>
<basename>libgstadder.so</basename>
<version>0.11.99</version>
<version>1.0.0.1</version>
<license>LGPL</license>
<source>gst-plugins-base</source>
<package>GStreamer Base Plug-ins source release</package>
<package>GStreamer Base Plug-ins git</package>
<origin>Unknown package origin</origin>
<elements>
<element>

View file

@ -3,10 +3,10 @@
<description>ALSA plugin library</description>
<filename>../../ext/alsa/.libs/libgstalsa.so</filename>
<basename>libgstalsa.so</basename>
<version>0.11.99</version>
<version>1.0.0.1</version>
<license>LGPL</license>
<source>gst-plugins-base</source>
<package>GStreamer Base Plug-ins source release</package>
<package>GStreamer Base Plug-ins git</package>
<origin>Unknown package origin</origin>
<elements>
<element>

View file

@ -3,10 +3,10 @@
<description>Elements used to communicate with applications</description>
<filename>../../gst/app/.libs/libgstapp.so</filename>
<basename>libgstapp.so</basename>
<version>0.11.99</version>
<version>1.0.0.1</version>
<license>LGPL</license>
<source>gst-plugins-base</source>
<package>GStreamer Base Plug-ins source release</package>
<package>GStreamer Base Plug-ins git</package>
<origin>Unknown package origin</origin>
<elements>
<element>

View file

@ -3,10 +3,10 @@
<description>Convert audio to different formats</description>
<filename>../../gst/audioconvert/.libs/libgstaudioconvert.so</filename>
<basename>libgstaudioconvert.so</basename>
<version>0.11.99</version>
<version>1.0.0.1</version>
<license>LGPL</license>
<source>gst-plugins-base</source>
<package>GStreamer Base Plug-ins source release</package>
<package>GStreamer Base Plug-ins git</package>
<origin>Unknown package origin</origin>
<elements>
<element>

View file

@ -3,10 +3,10 @@
<description>Adjusts audio frames</description>
<filename>../../gst/audiorate/.libs/libgstaudiorate.so</filename>
<basename>libgstaudiorate.so</basename>
<version>0.11.99</version>
<version>1.0.0.1</version>
<license>LGPL</license>
<source>gst-plugins-base</source>
<package>GStreamer Base Plug-ins source release</package>
<package>GStreamer Base Plug-ins git</package>
<origin>Unknown package origin</origin>
<elements>
<element>

View file

@ -3,10 +3,10 @@
<description>Resamples audio</description>
<filename>../../gst/audioresample/.libs/libgstaudioresample.so</filename>
<basename>libgstaudioresample.so</basename>
<version>0.11.99</version>
<version>1.0.0.1</version>
<license>LGPL</license>
<source>gst-plugins-base</source>
<package>GStreamer Base Plug-ins source release</package>
<package>GStreamer Base Plug-ins git</package>
<origin>Unknown package origin</origin>
<elements>
<element>

View file

@ -3,10 +3,10 @@
<description>Creates audio test signals of given frequency and volume</description>
<filename>../../gst/audiotestsrc/.libs/libgstaudiotestsrc.so</filename>
<basename>libgstaudiotestsrc.so</basename>
<version>0.11.99</version>
<version>1.0.0.1</version>
<license>LGPL</license>
<source>gst-plugins-base</source>
<package>GStreamer Base Plug-ins source release</package>
<package>GStreamer Base Plug-ins git</package>
<origin>Unknown package origin</origin>
<elements>
<element>

View file

@ -3,10 +3,10 @@
<description>Read audio from CD in paranoid mode</description>
<filename>../../ext/cdparanoia/.libs/libgstcdparanoia.so</filename>
<basename>libgstcdparanoia.so</basename>
<version>0.11.99</version>
<version>1.0.0.1</version>
<license>LGPL</license>
<source>gst-plugins-base</source>
<package>GStreamer Base Plug-ins source release</package>
<package>GStreamer Base Plug-ins git</package>
<origin>Unknown package origin</origin>
<elements>
<element>

View file

@ -3,10 +3,10 @@
<description>various encoding-related elements</description>
<filename>../../gst/encoding/.libs/libgstencodebin.so</filename>
<basename>libgstencodebin.so</basename>
<version>0.11.99</version>
<version>1.0.0.1</version>
<license>LGPL</license>
<source>gst-plugins-base</source>
<package>GStreamer Base Plug-ins source release</package>
<package>GStreamer Base Plug-ins git</package>
<origin>Unknown package origin</origin>
<elements>
<element>

View file

@ -3,10 +3,10 @@
<description>GIO elements</description>
<filename>../../gst/gio/.libs/libgstgio.so</filename>
<basename>libgstgio.so</basename>
<version>0.11.99</version>
<version>1.0.0.1</version>
<license>LGPL</license>
<source>gst-plugins-base</source>
<package>GStreamer Base Plug-ins source release</package>
<package>GStreamer Base Plug-ins git</package>
<origin>Unknown package origin</origin>
<elements>
<element>

View file

@ -3,10 +3,10 @@
<description>Vorbis Tremor decoder</description>
<filename>../../ext/vorbis/.libs/libgstivorbisdec.so</filename>
<basename>libgstivorbisdec.so</basename>
<version>0.11.99</version>
<version>1.0.0.1</version>
<license>LGPL</license>
<source>gst-plugins-base</source>
<package>GStreamer Base Plug-ins source release</package>
<package>GStreamer Base Plug-ins git</package>
<origin>Unknown package origin</origin>
<elements>
<element>

View file

@ -3,10 +3,10 @@
<description>libvisual visualization plugins</description>
<filename>../../ext/libvisual/.libs/libgstlibvisual.so</filename>
<basename>libgstlibvisual.so</basename>
<version>0.11.99</version>
<version>1.0.0.1</version>
<license>LGPL</license>
<source>gst-plugins-base</source>
<package>GStreamer Base Plug-ins source release</package>
<package>GStreamer Base Plug-ins git</package>
<origin>Unknown package origin</origin>
<elements>
<element>

View file

@ -3,10 +3,10 @@
<description>ogg stream manipulation (info about ogg: http://xiph.org)</description>
<filename>../../ext/ogg/.libs/libgstogg.so</filename>
<basename>libgstogg.so</basename>
<version>0.11.99</version>
<version>1.0.0.1</version>
<license>LGPL</license>
<source>gst-plugins-base</source>
<package>GStreamer Base Plug-ins source release</package>
<package>GStreamer Base Plug-ins git</package>
<origin>Unknown package origin</origin>
<elements>
<element>

View file

@ -3,10 +3,10 @@
<description>Pango-based text rendering and overlay</description>
<filename>../../ext/pango/.libs/libgstpango.so</filename>
<basename>libgstpango.so</basename>
<version>0.11.99</version>
<version>1.0.0.1</version>
<license>LGPL</license>
<source>gst-plugins-base</source>
<package>GStreamer Base Plug-ins source release</package>
<package>GStreamer Base Plug-ins git</package>
<origin>Unknown package origin</origin>
<elements>
<element>

View file

@ -3,10 +3,10 @@
<description>various playback elements</description>
<filename>../../gst/playback/.libs/libgstplayback.so</filename>
<basename>libgstplayback.so</basename>
<version>0.11.99</version>
<version>1.0.0.1</version>
<license>LGPL</license>
<source>gst-plugins-base</source>
<package>GStreamer Base Plug-ins source release</package>
<package>GStreamer Base Plug-ins git</package>
<origin>Unknown package origin</origin>
<elements>
<element>

View file

@ -3,10 +3,10 @@
<description>Subtitle parsing</description>
<filename>../../gst/subparse/.libs/libgstsubparse.so</filename>
<basename>libgstsubparse.so</basename>
<version>0.11.99</version>
<version>1.0.0.1</version>
<license>LGPL</license>
<source>gst-plugins-base</source>
<package>GStreamer Base Plug-ins source release</package>
<package>GStreamer Base Plug-ins git</package>
<origin>Unknown package origin</origin>
<elements>
<element>

View file

@ -3,10 +3,10 @@
<description>transfer data over the network via TCP</description>
<filename>../../gst/tcp/.libs/libgsttcp.so</filename>
<basename>libgsttcp.so</basename>
<version>0.11.99</version>
<version>1.0.0.1</version>
<license>LGPL</license>
<source>gst-plugins-base</source>
<package>GStreamer Base Plug-ins source release</package>
<package>GStreamer Base Plug-ins git</package>
<origin>Unknown package origin</origin>
<elements>
<element>

View file

@ -3,10 +3,10 @@
<description>Theora plugin library</description>
<filename>../../ext/theora/.libs/libgsttheora.so</filename>
<basename>libgsttheora.so</basename>
<version>0.11.99</version>
<version>1.0.0.1</version>
<license>LGPL</license>
<source>gst-plugins-base</source>
<package>GStreamer Base Plug-ins source release</package>
<package>GStreamer Base Plug-ins git</package>
<origin>Unknown package origin</origin>
<elements>
<element>

View file

@ -3,10 +3,10 @@
<description>default typefind functions</description>
<filename>../../gst/typefind/.libs/libgsttypefindfunctions.so</filename>
<basename>libgsttypefindfunctions.so</basename>
<version>0.11.99</version>
<version>1.0.0.1</version>
<license>LGPL</license>
<source>gst-plugins-base</source>
<package>GStreamer Base Plug-ins source release</package>
<package>GStreamer Base Plug-ins git</package>
<origin>Unknown package origin</origin>
<elements>
</elements>

View file

@ -3,7 +3,7 @@
<description>Colorspace conversion</description>
<filename>../../gst/videoconvert/.libs/libgstvideoconvert.so</filename>
<basename>libgstvideoconvert.so</basename>
<version>0.11.99</version>
<version>1.0.0.1</version>
<license>LGPL</license>
<source>gst-plugins-base</source>
<package></package>

View file

@ -3,10 +3,10 @@
<description>Adjusts video frames</description>
<filename>../../gst/videorate/.libs/libgstvideorate.so</filename>
<basename>libgstvideorate.so</basename>
<version>0.11.99</version>
<version>1.0.0.1</version>
<license>LGPL</license>
<source>gst-plugins-base</source>
<package>GStreamer Base Plug-ins source release</package>
<package>GStreamer Base Plug-ins git</package>
<origin>Unknown package origin</origin>
<elements>
<element>

View file

@ -3,10 +3,10 @@
<description>Resizes video</description>
<filename>../../gst/videoscale/.libs/libgstvideoscale.so</filename>
<basename>libgstvideoscale.so</basename>
<version>0.11.99</version>
<version>1.0.0.1</version>
<license>LGPL</license>
<source>gst-plugins-base</source>
<package>GStreamer Base Plug-ins source release</package>
<package>GStreamer Base Plug-ins git</package>
<origin>Unknown package origin</origin>
<elements>
<element>

View file

@ -3,10 +3,10 @@
<description>Creates a test video stream</description>
<filename>../../gst/videotestsrc/.libs/libgstvideotestsrc.so</filename>
<basename>libgstvideotestsrc.so</basename>
<version>0.11.99</version>
<version>1.0.0.1</version>
<license>LGPL</license>
<source>gst-plugins-base</source>
<package>GStreamer Base Plug-ins source release</package>
<package>GStreamer Base Plug-ins git</package>
<origin>Unknown package origin</origin>
<elements>
<element>

View file

@ -3,10 +3,10 @@
<description>plugin for controlling audio volume</description>
<filename>../../gst/volume/.libs/libgstvolume.so</filename>
<basename>libgstvolume.so</basename>
<version>0.11.99</version>
<version>1.0.0.1</version>
<license>LGPL</license>
<source>gst-plugins-base</source>
<package>GStreamer Base Plug-ins source release</package>
<package>GStreamer Base Plug-ins git</package>
<origin>Unknown package origin</origin>
<elements>
<element>

View file

@ -3,10 +3,10 @@
<description>Vorbis plugin library</description>
<filename>../../ext/vorbis/.libs/libgstvorbis.so</filename>
<basename>libgstvorbis.so</basename>
<version>0.11.99</version>
<version>1.0.0.1</version>
<license>LGPL</license>
<source>gst-plugins-base</source>
<package>GStreamer Base Plug-ins source release</package>
<package>GStreamer Base Plug-ins git</package>
<origin>Unknown package origin</origin>
<elements>
<element>

View file

@ -3,10 +3,10 @@
<description>X11 video output element based on standard Xlib calls</description>
<filename>../../sys/ximage/.libs/libgstximagesink.so</filename>
<basename>libgstximagesink.so</basename>
<version>0.11.99</version>
<version>1.0.0.1</version>
<license>LGPL</license>
<source>gst-plugins-base</source>
<package>GStreamer Base Plug-ins source release</package>
<package>GStreamer Base Plug-ins git</package>
<origin>Unknown package origin</origin>
<elements>
<element>

View file

@ -3,10 +3,10 @@
<description>XFree86 video output plugin using Xv extension</description>
<filename>../../sys/xvimage/.libs/libgstxvimagesink.so</filename>
<basename>libgstxvimagesink.so</basename>
<version>0.11.99</version>
<version>1.0.0.1</version>
<license>LGPL</license>
<source>gst-plugins-base</source>
<package>GStreamer Base Plug-ins source release</package>
<package>GStreamer Base Plug-ins git</package>
<origin>Unknown package origin</origin>
<elements>
<element>

View file

@ -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;
}

View file

@ -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);

View file

@ -118,6 +118,7 @@ struct _GstOggMux
/* need_headers */
gboolean need_headers;
gboolean need_start_events;
guint64 max_delay;
guint64 max_page_delay;

View file

@ -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);

View file

@ -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;
}

View file

@ -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;

View file

@ -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__ */

View file

@ -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().

View file

@ -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, &timestamp);
@ -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;
}
/**

View file

@ -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++;

View file

@ -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 */

View file

@ -34,6 +34,16 @@ A wide range of video and audio decoders, encoders, and filters are included.
</GitRepository>
</repository>
<release>
<Version>
<revision>1.0.0</revision>
<branch>1.0</branch>
<name></name>
<created>2012-09-24</created>
<file-release rdf:resource="http://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-1.0.0.tar.xz" />
</Version>
</release>
<release>
<Version>
<revision>0.11.99</revision>

View file

@ -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);

View file

@ -81,6 +81,9 @@ struct _GstAdder {
GList *pending_events;
gboolean in_setcaps;
gboolean send_stream_start;
gboolean send_caps;
};
struct _GstAdderClass {

View file

@ -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++) {

View file

@ -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);
}

View file

@ -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

View file

@ -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;
}

View file

@ -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 <gstreamer-devel@lists.sourceforge.net>");
@ -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)

View file

@ -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;
}

View file

@ -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;

View file

@ -1,405 +0,0 @@
/* GStreamer
*
* unit test for videoconvert
*
* Copyright (C) <2006> Tim-Philipp Müller <tim centricular net>
*
* 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 <config.h>
#endif
#ifdef HAVE_VALGRIND
# include <valgrind/valgrind.h>
#endif
#include <unistd.h>
#include <gst/check/gstcheck.h>
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);

View file

@ -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);
}

View file

@ -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 <filename>\n", argv[0]);
g_print ("usage: %s <uri> [<suburi>]\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);

View file

@ -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 <stdint.h>

View file

@ -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). */