mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-19 06:46:38 +00:00
Merge branch 'master' of ssh://git.freedesktop.org/git/gstreamer/gst-plugins-base
This commit is contained in:
commit
92560517e8
60 changed files with 567 additions and 709 deletions
45
NEWS
45
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
|
||||
|
|
217
RELEASE
217
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
|
||||
|
||||
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
2
common
|
@ -1 +1 @@
|
|||
Subproject commit 4f962f78357a11e545510d48227f41af24bfaab7
|
||||
Subproject commit 6c0b52c72c0958952b79b573105a270d7a651b33
|
|
@ -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 ****
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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:
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -118,6 +118,7 @@ struct _GstOggMux
|
|||
|
||||
/* need_headers */
|
||||
gboolean need_headers;
|
||||
gboolean need_start_events;
|
||||
|
||||
guint64 max_delay;
|
||||
guint64 max_page_delay;
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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__ */
|
||||
|
|
|
@ -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().
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -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++;
|
||||
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -81,6 +81,9 @@ struct _GstAdder {
|
|||
GList *pending_events;
|
||||
|
||||
gboolean in_setcaps;
|
||||
|
||||
gboolean send_stream_start;
|
||||
gboolean send_caps;
|
||||
};
|
||||
|
||||
struct _GstAdderClass {
|
||||
|
|
|
@ -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++) {
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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). */
|
||||
|
|
Loading…
Reference in a new issue