Commit graph

465 commits

Author SHA1 Message Date
Tim-Philipp Müller
e9bfb4edc2 qt: remove plugin, moved to -good
https://bugzilla.gnome.org/show_bug.cgi?id=754094
2018-02-12 18:48:32 +00:00
Tim-Philipp Müller
90a836bb89 gtk: remove, plugin has moved to -good 2018-02-12 15:16:37 +00:00
Matthew Waters
1894293d63 webrtcbin: an element that handles the transport aspects of webrtc connections
SDP's are generated and consumed according to the W3C PeerConnection API
available from https://www.w3.org/TR/webrtc/

The SDP is either created initially from the connected
sink pads/attached transceivers as in the case of generating an offer or
intersected with the connected sink pads/attached transceivers as in
the case for creating an answer.  In both cases, the rtp payloaded streams
sent by the peer are exposed as separate src pads.

The implementation supports trickle ICE, RTCP muxing, reduced size RTCP.

With contributions from:
Nirbheek Chauhan <nirbheek@centricular.com>
Mathieu Duponchelle <mathieu@centricular.com>
Edward Hervey <edward@centricular.com>

https://bugzilla.gnome.org/show_bug.cgi?id=792523
2018-02-02 15:02:21 +11:00
Olivier Crête
599dd8c72c gtk example: Fix cflags in Makefile.am 2017-12-19 16:22:52 -05:00
Tim-Philipp Müller
06e4403fdb gl: update plugins to use GstGL from -base 2017-12-19 12:02:31 +00:00
Tim-Philipp Müller
769a21d0bb gl: remove GStreamer OpenGL integration library and move to -base
https://bugzilla.gnome.org/show_bug.cgi?id=754094
2017-12-19 12:02:31 +00:00
Wonchul Lee
9667ba688e examples: audiomixmatrix: Remove unused part
matrix-value-array property is removed since
18917de956 commit applied

https://bugzilla.gnome.org/show_bug.cgi?id=790836
2017-12-06 14:18:59 -05:00
Nicolas Dufresne
ee0212b83d sdlshare: Destroy GL backend buffer before the GL Context
This was otherwise leading to a deadlock in the GL library.
2017-11-24 17:06:22 -05:00
Nicolas Dufresne
4f36f75eb1 sdlshare2: Fix race conditions
The client-draw callback is running on the GL Thread, which will
be required to map the buffer. Map early, and pass the mapped
frame instead. On top of that, make sure to signal any pending
draw before trying to push EOS, as some pad locks might be taken.
This is the cost of using the same thread to control GStreamer and
to render GL.
2017-11-24 16:58:21 -05:00
Nicolas Dufresne
c9e755d79e meson: Build gl/sdl examples 2017-11-24 16:58:01 -05:00
Nicolas Dufresne
d8ee5a0c31 meson: Playout example has not GL deps 2017-11-24 15:48:19 -05:00
Nicolas Dufresne
b41f190130 meson: Add missing examples directory
This will make it more visible what is missing in meson.
2017-11-24 15:25:47 -05:00
Nicolas Dufresne
78a7fe013c meson: Build playout example 2017-11-24 15:25:47 -05:00
Jan Schmidt
9a10dbe350 3dvideo example: Correct video overlay for HiDPI
Use the GTK scaling factor to scale the video allocation
so video displays correctly on hi-dpi screens
2017-11-24 01:37:48 +11:00
Jérôme Laheurte
b569ae4832 Use value instead of version macro when testing for mac OS version
https://bugzilla.gnome.org/show_bug.cgi?id=788404
2017-10-20 01:49:22 +11:00
Nicolas Dufresne
1cf1aac9a7 meson: Define GST_USE_UNSTABLE_API in the build system
This way meson and autotools both do the same thing and we don't need to
modify the code after all.
2017-10-04 10:00:48 -04:00
Reynaldo H. Verdejo Pinochet
5edd068e30 Fix autotools build broken by 25dee2f2cb
Build fails on GST_USE_UNSTABLE_API being redefined
2017-10-03 15:27:37 -07:00
Nicolas Dufresne
f793e04db0 meson: Build tsparser example 2017-10-03 17:17:59 -04:00
Nicolas Dufresne
25dee2f2cb tsparses: Define GST_USE_UNSTABLE_API
This example is entirely based on unstable API, this avoids the expected
compilation warning.
2017-10-03 17:17:50 -04:00
George Kiagiadakis
e450bba609 examples: Makefile.am: add ipcpipeline in SUBDIRS if enabled 2017-09-04 16:13:41 +03:00
George Kiagiadakis
91edec25dd examples: ipcpipeline: get rid of yet another use of SOCK_NONBLOCK
https://bugzilla.gnome.org/show_bug.cgi?id=786763
2017-09-04 10:40:40 +03:00
George Kiagiadakis
4e239a6632 examples: ipcpipeline: do not use the linux-specific SOCK_NONBLOCK flag
Use fcntl() instead to set O_NONBLOCK, which is portable.

https://bugzilla.gnome.org/show_bug.cgi?id=786763
2017-08-31 15:09:24 +03:00
Philippe Normand
26760588e8 examples/gl/gtk: build fix for the 3dvideo example on macOS 2017-08-30 15:18:58 +01:00
Philippe Normand
bdcac6f435 examples/gl/gtk: fix overlay handling for macOS
The GTK+ window requires a NSView sub-view, not an NSWindow.
2017-08-30 15:16:39 +01:00
Julien Isorce
2fd84a6c86 gl: do not include GL headers in public gstgl headers
Except for gst/gl/gstglfuncs.h

It is up to the client app to include these headers.
It is coherent with the fact that gstreamer-gl.pc does not
require any egl.pc/gles.pc. I.e. it is the responsability
of the app to search these headers within its build setup.

For example gstreamer-vaapi includes explicitly EGL/egl.h
and search for it in its configure.ac.

For example with this patch, if an app includes the headers
  gst/gl/egl/gstglcontext_egl.h
  gst/gl/egl/gstgldisplay_egl.h
  gst/gl/egl/gstglmemoryegl.h
it will *no longer* automatically include EGL/egl.h and GLES2/gl2.h.
Which is good because the app might want to use the gstgl api only
without the need to bother about gl headers.

Also added a test: cd tests/check && make libs/gstglheaders.check

https://bugzilla.gnome.org/show_bug.cgi?id=784779
2017-08-22 10:00:19 +01:00
Tim-Philipp Müller
357fc8064a examples: fix compiler warning in compositor crossfade example
warning: control reaches end of non-void function
2017-08-03 20:21:17 +01:00
Thibault Saunier
9c575243e1 tests: examples: Add a simple crossfade example
https://bugzilla.gnome.org/show_bug.cgi?id=784827
2017-08-03 13:01:50 -04:00
George Kiagiadakis
e97877dc7e tests/examples: add manual tests/examples for the ipcpipeline elements
ipcpipeline1 is a very simple test that shows a short videotestsrc fragment.

ipc-play is a clone of gst-play that splits the pipeline in two
processes, running the source & demuxer on the master process
and the decoders & sinks on the slave.
2017-08-01 14:43:06 +03:00
Jan Schmidt
7ea366501b qmlsink example: Add CMakeLists.txt
Make it possible to build using cmake instead of qmake
2017-06-22 01:01:40 +10:00
Tim-Philipp Müller
624fe65f54 examples: gl: remove ancient bitrotten .vcproj files 2017-05-21 10:57:53 +01:00
Josep Torra
2c9b513695 examples: fix macOS 9.12 deprecation warnings
Add #defines to allow older versions of macOS to use the new constant names.
2017-05-20 12:41:51 +02:00
Nick Kallen
46bbc60d24 applemedia/gl: Update code to use ARC
All code interacting with Objective-C objects should now use Automated
Reference Counting rather than manual memory management or Garbage
Collection. Because ARC prohibits C-structs from containing
references to Objective-C objects, all such fields are now typed
'gpointer'. Setting and gettings Objective-C fields on such a
struct now uses explicit __bridge_* calls to tell ARC about
object lifetimes.

https://bugzilla.gnome.org/show_bug.cgi?id=777847
2017-03-07 13:37:07 +02:00
Edgard Lima
38ad22a7f1 Update Edgard Lima's email
https://bugzilla.gnome.org/show_bug.cgi?id=779230
2017-02-27 00:50:46 +00:00
Vivia Nikolaidou
fa47edf846 audiomixmatrix: New element that mixes audio channels
This element transforms a given number of input channels into a given number of
output channels according to a given transformation matrix. The matrix
coefficients must be between -1 and 1. In the auto mode, input/output channels
are automatically negotiated and the transformation matrix is a truncated or
zero-padded identity matrix.

https://bugzilla.gnome.org/show_bug.cgi?id=777376
2017-02-23 21:02:44 +02:00
Juan Pablo Ugarte
98997e9f79 gl/examples/gtk: fixed compilation on systems without GL_GEOMETRY_SHADER
https://bugzilla.gnome.org/show_bug.cgi?id=777143
2017-01-13 11:20:51 +11:00
Matthew Waters
de41d74e6f tests/examples/qmlsink: scope QApplication/Engine
So they are destroyed before gst_deinit() is run and the leaks tracer
doesn't show false-positives.

https://bugzilla.gnome.org/show_bug.cgi?id=775746
2016-12-07 23:02:02 +11:00
Garima Gaur
aa08be43c7 gst: Fix caps leak
https://bugzilla.gnome.org/show_bug.cgi?id=775072
2016-11-30 09:59:08 +02:00
Matthew Waters
5d22e0c8d0 examples/gl/qt: fix the examples for the use of newer API
gstgl doesn't undo/overwrite what GL state the examples are changing
anymore.  As such, the examples need to reset the GL state themselves
to be able to play nice with libgstgl
2016-11-08 15:14:27 +11:00
Matthew Waters
41a6448918 gl: GST_GL_TYPE -> GST_TYPE_GL
Some deprecated symbols are kept for backwards compatibility
2016-11-03 16:16:12 +11:00
Alistair Buxton
16d48770d1 gl/examples: Really remove references to $(GST_PLUGINS_GL_*).
These seem to have been missed in the previous commit to this file.

https://bugzilla.gnome.org/show_bug.cgi?id=771023
2016-09-08 09:45:56 +10:00
Matthew Waters
e6b93e18d3 gl/examples/fxtest: fix up for wayland support
- Pass the wayland display to gst
- Redrawing on resize is no longer needed.
2016-08-19 16:05:33 +10:00
Haihua Hu
65a3c35670 qmlglsrc: Add qmlglsrc unit test example
https://bugzilla.gnome.org/show_bug.cgi?id=768160
2016-08-03 22:11:11 +10:00
Sebastian Dröge
d6c173d038 qml: Don't forget to unref the actual sink element after setting it on glsinkbin 2016-07-22 17:00:14 +03:00
Sebastian Dröge
b10ab99e02 qml: Use glsinkbin instead of glupload directly 2016-07-22 16:57:45 +03:00
Martin Kelly
01d8b446a6 examples: opencv: typo fix
https://bugzilla.gnome.org/show_bug.cgi?id=766639
2016-05-19 09:18:43 +01:00
Matthew Waters
f9d03dd9c4 gl/examples: fix switchvideooverlay for wayland
and call XInitThreads() for X11
2016-03-31 20:53:18 +11:00
Matthew Waters
8fe5b198be gl/examples: remove duplicated videooverlay example
filtervideooverlay proved the exact same example (only with a extra glfiltercube).
2016-03-31 20:53:18 +11:00
Matthew Waters
14cf686e61 gl/examples/3d: additions for wayland support 2016-03-31 20:53:18 +11:00
Sebastian Dröge
10bc9a7efc gl/gtk: Fix compiler warning in example
fxtest.c: In function ‘main’:
fxtest.c:190:3: error: ISO C90 forbids mixed declarations and code [-Werror=declaration-after-statement]
   GtkWidget *window;
   ^~~~~~~~~
2016-03-24 14:08:46 +02:00
Matthew Waters
df7016553e gl/examples/qt: restrict the GL API to opengl where needed
Until the examples are ported to opengl3/gles2, they will not work with any
other GL api.
2016-03-17 16:48:19 +11:00
Matthew Waters
0703c04414 gl/examples/gtk: call XInitThreads
Fixes some sporadic X11 threading assertions.
2016-03-17 16:34:05 +11:00
Matthew Waters
59da66f969 gl/examples/cube*: choose opengl by default
The examples don't work with any other GL API.

Also fix the yuv example to not translate the cube out of the clipping area.
2016-03-10 22:52:52 +11:00
Matthew Waters
bf6838d913 gl/examples/fxtest: add needed glupload to the pipeline
Fixes a negotiation failure in the example
2016-03-10 22:52:26 +11:00
Sebastian Dröge
dbefd2f8a8 gtk: examples: #define GST_USE_UNSTABLE_API and link with X11_LIBS
X11_LIBS is needed for XInitThreads() and without the #define we get
warnings about the GL API being still unstable.
2016-03-05 11:38:46 +02:00
Holger Kaelberer
0ae665e35c tests: fix warning in qml example
https://bugzilla.gnome.org/show_bug.cgi?id=756082
2016-02-01 13:55:05 +11:00
Sebastian Dröge
0b5387b96c clutter: Fix compilation error in GL examples
Include gst/gl.h instead of specific headers to prevent such problems also in
the future.

In file included from ../../../../gst-libs/gst/gl/gl.h:47:0,
                 from ../../../../gst-libs/gst/gl/gstglbasememory.h:137,
                 from ../../../../gst-libs/gst/gl/gstglmemory.h:29,
                 from cluttershare.c:39:
../../../../gst-libs/gst/gl/gstglmemorypbo.h:51:20: error: field ‘mem’ has incomplete type
   GstGLMemory      mem;
                    ^
../../../../gst-libs/gst/gl/gstglmemorypbo.h:124:24: error: field ‘parent’ has incomplete type
   GstGLMemoryAllocator parent;
                        ^
../../../../gst-libs/gst/gl/gstglmemorypbo.h:134:29: error: field ‘parent_class’ has incomplete type
   GstGLMemoryAllocatorClass parent_class;
                             ^
2015-12-14 09:38:41 +01:00
George Kiagiadakis
1c8e2f3497 tests: put the waylandsink example window.ui file in EXTRA_DIST 2015-11-22 13:11:48 +01:00
George Kiagiadakis
0b97b89575 tests: fix linking waylandsink example with the gstwayland library
First, use top_builddir, otherwise it fails in out-of-source builds.
Second, link to the libtool archive directly to let make understand
the dependency.
2015-11-22 13:08:35 +01:00
Reynaldo H. Verdejo Pinochet
86ec812429 Remove unnecessary NULL checks before g_free()
g_free() is NULL-safe
2015-11-18 16:05:42 -08:00
George Kiagiadakis
3eeec2836a tests/examples: add a waylandsink example
https://bugzilla.gnome.org/show_bug.cgi?id=748322
2015-11-18 13:10:45 +01:00
Sebastian Dröge
5c8ebb4ada mxfdemux-structure: Sync fakesink state with the bin to make the application work at all 2015-10-21 19:54:15 +03:00
Matthew Waters
b9e1cd3732 glshaderelement: implement on-demand create-shader signalling
One may not have an GstGLContext available or current in the thread where one
would need to update the shader.  Support this by signalling create-shader
whenever the one-shot 'update-shader' is set to TRUE.
2015-10-17 16:10:41 +11:00
Matthew Waters
f0a0fcb0bf gl/examples: add a live shader demo using the new GstGLSLStage
Implemented with videotestsrc ! glshader ! glupload ! gtkglsink

Errors on an invalid shader compilation are ignored however any error
provided by the glsl compiler is printed to stdout.
2015-10-17 01:10:47 +11:00
Vineeth TM
8c9ca808af gstreamer: bad: Fix memory leaks when context parse fails
When g_option_context_parse fails, context and error variables are not getting free'd
which results in memory leaks. Free'ing the same.

And replacing g_error_free with g_clear_error, which checks if the error being passed
is not NULL and sets the variable to NULL on free'ing.

https://bugzilla.gnome.org/show_bug.cgi?id=753854
2015-10-02 17:24:35 +03:00
Arnaud Vrac
697f117ddd configure.ac: fix build when the uvch264 plugin is not selected
Instead of checking for the gstreamer-video-1.0 package is installed,
just assume it is since we already check for the -base dependency.

With this replace the GST_VIDEO_* variables in makefiles and directly
link with libgstvideo.

https://bugzilla.gnome.org/show_bug.cgi?id=753820
2015-08-19 16:52:03 +03:00
Luis de Bethencourt
64513a60e9 examples: facedetect: add silent option
By default the example floods the screen with the detected face values.
Add an option to avoid this for frail terminals.
2015-08-17 23:44:47 +01:00
Luis de Bethencourt
29786be80f examples: facedetect: only create variables when needed
The variables to store face values are only needed if they will be used to
control the volume. Which isn't the default to avoid potentially being very
loud accidentally. Only create variables when needed.
2015-08-10 19:09:52 +01:00
Luis de Bethencourt
53a9374eb5 examples: facedetect: make volume control optional 2015-08-10 18:58:55 +01:00
Luis de Bethencourt
c895f3f3b3 examples: facedetect: only set to playing when it's not already 2015-08-08 13:19:47 +01:00
Luis de Bethencourt
d7fbb72c72 examples: opencv: remove unnecessary setting of a property
"/dev/video0" is the default device of v4l2src, setting it to this is
redundant.
2015-08-08 12:52:38 +01:00
Vanessa Chipirrás
02b9daafdf facedetect: Add unit test
I created four utilities of the detected features:
1- If you hide your mouth, the volume of video is low.
2- If you hide the nose, the volume of the video is up.
3- If you hide the full face, the video stops.

You can see proof of this here:
https://www.youtube.com/watch?v=pxzejNKV_WQ

https://bugzilla.gnome.org/show_bug.cgi?id=748377
2015-07-31 17:43:56 +01:00
Matthew Waters
769fffa3d9 new qt5 qml GL video sink
Very much in the same spirit as the Gtk GL sink

Two things are provided
1. A QQuickItem subclass that renders out RGBA filled GstGLMemory
   buffers that is instantiated from qml.
2. A sink element that will push buffers into (1)

To use
1. Declare the GstGLVideoItem in qml with an appropriate
   objectName property set.
2. Get the aforementioned GstGLVideoItem from qml using something like

QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

QObject *rootObject = engine.rootObjects().first();
QQuickItem *videoItem = rootObject->findChild<QQuickItem *> ("videoItem");

3. Set the videoItem on the sink

https://bugzilla.gnome.org/show_bug.cgi?id=752185
2015-07-10 15:25:26 +10:00
Tim-Philipp Müller
e7512329ca examples: move vp8 parser test to codecparser example directory 2015-06-21 11:51:38 +01:00
Tim-Philipp Müller
82be4ad395 examples: add small jpeg codecparser test
https://bugzilla.gnome.org/show_bug.cgi?id=673925
2015-06-21 11:34:39 +01:00
Jan Schmidt
3ea9f51dd7 3dvideo: Add simple gtk example stereoscopic video player
https://bugzilla.gnome.org/show_bug.cgi?id=611157
2015-06-19 01:49:33 +10:00
Matthew Waters
f600a8ac9a gl/examples: update qt examples for api changes 2015-06-15 16:47:15 +10:00
Nirbheek Chauhan
f8137dd8a6 examples: playout: Add better help text
This should help people figure out how to use the example a bit better
2015-06-12 21:15:03 +01:00
Nirbheek Chauhan
4d42704312 examples: playout: Decrement the currently-playing counter correctly
Only do that when we're removing an item that was playing, otherwise we'll mess
things up while trying to edit the play queue (playlist).
2015-06-12 21:14:57 +01:00
Nirbheek Chauhan
5da10b4f57 playout: New example for seamless audio/video playback
An example app that takes video URIs as command line arguments and switches
between them seamlessly one after the other using compositor and audiomixer.
Both audio-video and video-only media files are valid inputs, but mixing files
of both types in a single invocation is cumbersome to support, and hence does
not work. The example attempts to keep the audio stream moving along perfectly,
and duplicates video frames where necessary to cover gaps in the video
timestamps using the 'ignore-eos' videoaggregator pad property.

Ensuring seamless (and mostly-glitch-free) switching is harder than it sounds,
and hence the example contains plenty of pad probes and running time
calculations to make things work.

The GPtrArray play_queue contains items that are being played back, have been
prepared for playback, and will be played back in the future. The queue itself
is mutable besides the first two items (playing and prepared). The item that has
been prepared should not be edited or removed since it has been prepared in
advance to be activated immediately on the current item's EOS.

The example also has support for switching to the next item in the queue
prematurely; see the --switch-after/-s flag to the application.

Note: the output video is hard-coded at 1280x720, and input video is scaled as
needed to fit this size. Set OUTPUT_VIDEO_WIDTH/HEIGHT to change this.

https://bugzilla.gnome.org/show_bug.cgi?id=748947
2015-06-12 20:32:25 +01:00
Nicolas Dufresne
0c647ec8a7 gstgtk: No need to realize the widget
The widget already does that.
2015-06-11 12:41:49 -04:00
Nicolas Dufresne
1f9bdcad87 gstgtk: Don't leak the widget
g_object_get() returns a ref, gtk_container_add() only ref_sink().
That mean we still need to unref afterward. This leak was hiding
a reference bug previously present.
2015-06-11 12:41:49 -04:00
Sebastian Dröge
b9d8d83ca4 gtk: Add missing CFLAGS to example 2015-06-11 14:58:27 +02:00
Matthew Waters
23fb666dd7 Implement gtk sinks
two sinks are provided.  gtksink which is a cairo/software based renderer
and gtkglsink which utilises the GL support in gtk and gstreamer.
2015-06-11 22:01:03 +10:00
Julien Isorce
6d04b62e85 gl/example: fix build error when compiling cocoa-videooverlay
libtool: error: ignoring unknown tag OBJC
and
clang: error: argument unused during compilation: '-pthread'
2015-06-04 08:04:13 +01:00
Luis de Bethencourt
16f61e7b2d examples: gst-camerabin2-test: protect from division by zero
Highly unlikely to have 0 captures, but protect from crashes in the future by
doing none of the math if there is no data.
2015-06-03 14:58:13 +01:00
Edward Hervey
5fe88f7ed7 examples: Fix gl usage without wayland support
Not all platforms have wayland support. Handle that gracefully at
compile time
2015-06-01 14:05:06 +02:00
Matthew Waters
5f0c006a82 gl/examples: update gtk examples for glupload 2015-05-31 16:09:34 +10:00
Matthew Waters
21cbf763b0 gl/examples: update gtk examples for wayland 2015-05-31 16:09:34 +10:00
Matthew Waters
349685ad27 tests/gl/gtk: implement setting a wayland display/surface 2015-05-31 16:04:13 +10:00
Jan Schmidt
cdff13e07b Fix flags order in GL examples for uninstalled build 2015-05-21 13:42:35 +10:00
Thiago Santos
cb56a6b32b examples: gst-camera: add zoom property to UI
Add a slider to modify the zoom in camerabin
2015-04-27 21:14:09 -03:00
Thiago Santos
31b1348559 examples: gst-camera: remove widgets deprecated in GTK3.0
VBox and HBox are now simply Box
2015-04-27 21:14:09 -03:00
Thiago Santos
a1a58d438f examples: gst-camera: update to GTK3
When opening the .ui file it complains about being for GTK 2 and
automatically updates it to GTK3. Commit this version and update
the makefile
2015-04-27 21:14:09 -03:00
Tim-Philipp Müller
0ff70da6bc examples: motioncells: remove GPL3 code we don't need
If 95% of the code of an example app consists of GObject
code, maybe that's defeating the point a little. So just
remove a lot of that and trim down the example to the
absolute minimum. Also removes the last remaining GPL3
licensed code in -bad.
2015-04-25 13:44:01 +01:00
Tim-Philipp Müller
b800bba76a examples: motioncells: simplify property setting 2015-04-25 13:44:01 +01:00
Tim-Philipp Müller
d531f908e5 examples: motioncells: port to 1.x 2015-04-25 13:44:01 +01:00
Robert Jobbagy
0f4ecf52ad examples: motioncells: relicense opencv example to LGPLv2 2015-04-25 13:43:54 +01:00
Matthew Waters
199f9bd194 gl/examples: fixup generic cube example for NDC
translating outside the clip region doesn't work
2015-03-14 18:12:38 +00:00
Julien Isorce
7dd3a2ec9e gl/examples: add sdlshare2 that uses glimagesink to output textures
https://bugzilla.gnome.org/show_bug.cgi?id=739681
2015-03-14 17:56:39 +00:00
Julien Isorce
0150255a46 glimagesink: provide GstSample in client-draw signal
Instead of prividing texture and size directly.
And apply changes to examples.

https://bugzilla.gnome.org/show_bug.cgi?id=739681
2015-03-14 17:56:21 +00:00