Projects
Essentials
gstreamer-plugins-ugly-codecs
Sign Up
Log In
Username
Password
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
Expand all
Collapse all
Changes of Revision 20
View file
gstreamer-plugins-ugly-codecs.changes
Changed
@@ -1,4 +1,9 @@ ------------------------------------------------------------------- +Fri Jun 28 09:04:23 UTC 2024 - Bjørn Lie <zaitor@opensuse.org> + +- Update to version 1.24.5 + +------------------------------------------------------------------- Mon Nov 27 08:40:51 UTC 2023 - Bjørn Lie <zaitor@opensuse.org> - Drop asfdemux plugin, now available in main distro package.
View file
gstreamer-plugins-ugly-codecs.spec
Changed
@@ -4,10 +4,10 @@ %define _name gst-plugins-ugly %define gst_branch 1.0 -%define _version 1.22.0 +%define _version 1.24.0 Name: gstreamer-plugins-ugly-codecs -Version: 1.22.7 +Version: 1.24.5 Release: 0 Summary: Codecs/plugins for gstreamer-plugins-ugly License: LGPL-2.1-or-later @@ -38,7 +38,7 @@ BuildRequires: pkgconfig(gstreamer-sdp-1.0) BuildRequires: pkgconfig(gstreamer-tag-1.0) BuildRequires: pkgconfig(gstreamer-video-1.0) -BuildRequires: pkgconfig(x264) >= 0.120 +BuildRequires: pkgconfig(x264) >= 0.156 Requires: gstreamer-plugins-ugly >= %{_version} Supplements: gstreamer-plugins-ugly
View file
gst-plugins-ugly-1.22.7.tar.xz/ext/amrnb
Deleted
-(directory)
View file
gst-plugins-ugly-1.22.7.tar.xz/ext/amrnb/GstAmrnbEnc.prs
Deleted
@@ -1,11 +0,0 @@ -_presets_ -version=0.10 -element-name=GstAmrnbEnc - -enhance-size -_meta/comment=Maximize compression, lowest bitrate -band-mode=0 - -enhance-quality -_meta/comment=Maximize quality, highest bitrate -band-mode=7
View file
gst-plugins-ugly-1.22.7.tar.xz/ext/amrnb/README
Deleted
@@ -1,6 +0,0 @@ -Compiling AMRNB: -================ - -To compile the amrnb plugin, you need the opencore-amrnb development package. -If your distribution does not provide this package, you can download the -source code from "http://sourceforge.net/projects/opencore-amr".
View file
gst-plugins-ugly-1.22.7.tar.xz/ext/amrnb/amrnb.c
Deleted
@@ -1,44 +0,0 @@ -/* GStreamer Adaptive Multi-Rate Narrow-Band (AMR-NB) plugin - * Copyright (C) 2004 Ronald Bultje <rbultje@ronald.bitfreak.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., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "amrnbdec.h" -#include "amrnbenc.h" - -static gboolean -plugin_init (GstPlugin * plugin) -{ - gboolean ret = FALSE; - - ret |= GST_ELEMENT_REGISTER (amrnbdec, plugin); - ret |= GST_ELEMENT_REGISTER (amrnbenc, plugin); - - return ret; -} - - -GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, - GST_VERSION_MINOR, - amrnb, - "Adaptive Multi-Rate Narrow-Band", - plugin_init, VERSION, GST_LICENSE_UNKNOWN, GST_PACKAGE_NAME, - GST_PACKAGE_ORIGIN);
View file
gst-plugins-ugly-1.22.7.tar.xz/ext/amrnb/amrnbdec.c
Deleted
@@ -1,309 +0,0 @@ -/* GStreamer Adaptive Multi-Rate Narrow-Band (AMR-NB) plugin - * Copyright (C) 2004 Ronald Bultje <rbultje@ronald.bitfreak.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., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -/** - * SECTION:element-amrnbdec - * @title: amrnbdec - * @see_also: #GstAmrnbEnc, #GstAmrParse - * - * AMR narrowband decoder based on the - * opencore codec implementation(http://sourceforge.net/projects/opencore-amr). - * - * ## Example launch line - * | - * gst-launch-1.0 filesrc location=abc.amr ! amrparse ! amrnbdec ! audioconvert ! audioresample ! autoaudiosink - * | - * - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "amrnbdec.h" - -static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", - GST_PAD_SINK, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ("audio/AMR, " "rate = (int) 8000, " "channels = (int) 1") - ); - -static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ("audio/x-raw, format = (string) " GST_AUDIO_NE (S16) ", " - "layout = (string) interleaved, " - "rate = (int) 8000," "channels = (int) 1") - ); - -GST_DEBUG_CATEGORY_STATIC (gst_amrnbdec_debug); -#define GST_CAT_DEFAULT gst_amrnbdec_debug - -static const gint block_size_if116 = { 12, 13, 15, 17, 19, 20, 26, 31, 5, - 0, 0, 0, 0, 0, 0, 0 -}; - -static const gint block_size_if216 = { 12, 13, 15, 17, 18, 20, 25, 30, 5, - 0, 0, 0, 0, 0, 0, 0 -}; - -static GType -gst_amrnb_variant_get_type (void) -{ - static GType gst_amrnb_variant_type = 0; - static const GEnumValue gst_amrnb_variant = { - {GST_AMRNB_VARIANT_IF1, "IF1", "IF1"}, - {GST_AMRNB_VARIANT_IF2, "IF2", "IF2"}, - {0, NULL, NULL}, - }; - if (!gst_amrnb_variant_type) { - gst_amrnb_variant_type = - g_enum_register_static ("GstAmrnbVariant", gst_amrnb_variant); - } - return gst_amrnb_variant_type; -} - -#define GST_AMRNB_VARIANT_TYPE (gst_amrnb_variant_get_type()) - -#define VARIANT_DEFAULT GST_AMRNB_VARIANT_IF1 -enum -{ - PROP_0, - PROP_VARIANT -}; - -static void gst_amrnbdec_set_property (GObject * object, guint prop_id, - const GValue * value, GParamSpec * pspec); -static void gst_amrnbdec_get_property (GObject * object, guint prop_id, - GValue * value, GParamSpec * pspec); - -static gboolean gst_amrnbdec_start (GstAudioDecoder * dec); -static gboolean gst_amrnbdec_stop (GstAudioDecoder * dec); -static gboolean gst_amrnbdec_set_format (GstAudioDecoder * dec, GstCaps * caps); -static GstFlowReturn gst_amrnbdec_parse (GstAudioDecoder * dec, - GstAdapter * adapter, gint * offset, gint * length); -static GstFlowReturn gst_amrnbdec_handle_frame (GstAudioDecoder * dec, - GstBuffer * buffer); - -#define gst_amrnbdec_parent_class parent_class -G_DEFINE_TYPE (GstAmrnbDec, gst_amrnbdec, GST_TYPE_AUDIO_DECODER); -GST_ELEMENT_REGISTER_DEFINE (amrnbdec, "amrnbdec", GST_RANK_PRIMARY, - GST_TYPE_AMRNBDEC); - -static void -gst_amrnbdec_class_init (GstAmrnbDecClass * klass) -{ - GObjectClass *object_class = G_OBJECT_CLASS (klass); - GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - GstAudioDecoderClass *base_class = GST_AUDIO_DECODER_CLASS (klass); - - object_class->set_property = gst_amrnbdec_set_property; - object_class->get_property = gst_amrnbdec_get_property; - - gst_element_class_add_static_pad_template (element_class, &sink_template); - gst_element_class_add_static_pad_template (element_class, &src_template); - - gst_element_class_set_static_metadata (element_class, "AMR-NB audio decoder", - "Codec/Decoder/Audio", - "Adaptive Multi-Rate Narrow-Band audio decoder", - "GStreamer maintainers <gstreamer-devel@lists.freedesktop.org>"); - - base_class->start = GST_DEBUG_FUNCPTR (gst_amrnbdec_start); - base_class->stop = GST_DEBUG_FUNCPTR (gst_amrnbdec_stop); - base_class->set_format = GST_DEBUG_FUNCPTR (gst_amrnbdec_set_format); - base_class->parse = GST_DEBUG_FUNCPTR (gst_amrnbdec_parse); - base_class->handle_frame = GST_DEBUG_FUNCPTR (gst_amrnbdec_handle_frame); - - g_object_class_install_property (object_class, PROP_VARIANT, - g_param_spec_enum ("variant", "Variant", - "The decoder variant", GST_AMRNB_VARIANT_TYPE, - VARIANT_DEFAULT, - G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); - - GST_DEBUG_CATEGORY_INIT (gst_amrnbdec_debug, "amrnbdec", 0, - "AMR-NB audio decoder"); - - gst_type_mark_as_plugin_api (GST_AMRNB_VARIANT_TYPE, 0); -} - -static void -gst_amrnbdec_init (GstAmrnbDec * amrnbdec) -{ - gst_audio_decoder_set_needs_format (GST_AUDIO_DECODER (amrnbdec), TRUE); - gst_audio_decoder_set_use_default_pad_acceptcaps (GST_AUDIO_DECODER_CAST - (amrnbdec), TRUE); - GST_PAD_SET_ACCEPT_TEMPLATE (GST_AUDIO_DECODER_SINK_PAD (amrnbdec)); -} - -static gboolean -gst_amrnbdec_start (GstAudioDecoder * dec) -{ - GstAmrnbDec *amrnbdec = GST_AMRNBDEC (dec); - - GST_DEBUG_OBJECT (dec, "start"); - if (!(amrnbdec->handle = Decoder_Interface_init ())) - return FALSE; - - amrnbdec->rate = 0; - amrnbdec->channels = 0; - - return TRUE; -} - -static gboolean -gst_amrnbdec_stop (GstAudioDecoder * dec) -{ - GstAmrnbDec *amrnbdec = GST_AMRNBDEC (dec); - - GST_DEBUG_OBJECT (dec, "stop"); - Decoder_Interface_exit (amrnbdec->handle); - - return TRUE; -} - -static void -gst_amrnbdec_set_property (GObject * object, guint prop_id, - const GValue * value, GParamSpec * pspec) -{ - GstAmrnbDec *self = GST_AMRNBDEC (object); - - switch (prop_id) { - case PROP_VARIANT: - self->variant = g_value_get_enum (value); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } - return; -} - -static void -gst_amrnbdec_get_property (GObject * object, guint prop_id, - GValue * value, GParamSpec * pspec) -{ - GstAmrnbDec *self = GST_AMRNBDEC (object); - - switch (prop_id) { - case PROP_VARIANT: - g_value_set_enum (value, self->variant); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } - return; -} - -static gboolean -gst_amrnbdec_set_format (GstAudioDecoder * dec, GstCaps * caps) -{ - GstStructure *structure; - GstAmrnbDec *amrnbdec; - GstAudioInfo info; - - amrnbdec = GST_AMRNBDEC (dec); - - structure = gst_caps_get_structure (caps, 0); - - /* get channel count */ - gst_structure_get_int (structure, "channels", &amrnbdec->channels); - gst_structure_get_int (structure, "rate", &amrnbdec->rate); - - /* create reverse caps */ - gst_audio_info_init (&info); - gst_audio_info_set_format (&info, - GST_AUDIO_FORMAT_S16, amrnbdec->rate, amrnbdec->channels, NULL); - - return gst_audio_decoder_set_output_format (dec, &info); -} - -static GstFlowReturn -gst_amrnbdec_parse (GstAudioDecoder * dec, GstAdapter * adapter, - gint * offset, gint * length) -{ - GstAmrnbDec *amrnbdec = GST_AMRNBDEC (dec); - guint8 head1; - guint size; - gboolean sync, eos; - gint block, mode; - - size = gst_adapter_available (adapter); - if (size < 1) - return GST_FLOW_ERROR; - - gst_audio_decoder_get_parse_state (dec, &sync, &eos); - - /* need to peek data to get the size */ - gst_adapter_copy (adapter, head, 0, 1); - - /* get size */ - switch (amrnbdec->variant) { - case GST_AMRNB_VARIANT_IF1: - mode = (head0 >> 3) & 0x0F; - block = block_size_if1mode + 1; - break; - case GST_AMRNB_VARIANT_IF2: - mode = head0 & 0x0F; - block = block_size_if2mode + 1; - break; - default: - g_assert_not_reached (); - return GST_FLOW_ERROR; - break; - } - - GST_DEBUG_OBJECT (amrnbdec, "mode %d, block %d", mode, block); - - if (block > size) - return GST_FLOW_EOS; - - *offset = 0; - *length = block; - - return GST_FLOW_OK; -} - -static GstFlowReturn -gst_amrnbdec_handle_frame (GstAudioDecoder * dec, GstBuffer * buffer) -{ - GstAmrnbDec *amrnbdec; - GstMapInfo inmap, outmap; - GstBuffer *out; - - amrnbdec = GST_AMRNBDEC (dec); - - /* no fancy flushing */ - if (!buffer || !gst_buffer_get_size (buffer)) - return GST_FLOW_OK; - - gst_buffer_map (buffer, &inmap, GST_MAP_READ); - - /* get output */ - out = gst_buffer_new_and_alloc (160 * 2); - /* decode */ - gst_buffer_map (out, &outmap, GST_MAP_WRITE); - Decoder_Interface_Decode (amrnbdec->handle, inmap.data, - (gint16 *) outmap.data, 0); - gst_buffer_unmap (out, &outmap); - - gst_buffer_unmap (buffer, &inmap); - - return gst_audio_decoder_finish_frame (dec, out, 1); -}
View file
gst-plugins-ugly-1.22.7.tar.xz/ext/amrnb/amrnbdec.h
Deleted
@@ -1,71 +0,0 @@ -/* GStreamer Adaptive Multi-Rate Narrow-Band (AMR-NB) plugin - * Copyright (C) 2004 Ronald Bultje <rbultje@ronald.bitfreak.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., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifndef __GST_AMRNBDEC_H__ -#define __GST_AMRNBDEC_H__ - -#include <gst/gst.h> -#include <gst/audio/gstaudiodecoder.h> - -#include <opencore-amrnb/interf_dec.h> - -G_BEGIN_DECLS - -#define GST_TYPE_AMRNBDEC \ - (gst_amrnbdec_get_type()) -#define GST_AMRNBDEC(obj) \ - (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_AMRNBDEC, GstAmrnbDec)) -#define GST_AMRNBDEC_CLASS(klass) \ - (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_AMRNBDEC, GstAmrnbDecClass)) -#define GST_IS_AMRNBDEC(obj) \ - (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_AMRNBDEC)) -#define GST_IS_AMRNBDEC_CLASS(klass) \ - (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_AMRNBDEC)) - -typedef struct _GstAmrnbDec GstAmrnbDec; -typedef struct _GstAmrnbDecClass GstAmrnbDecClass; - -typedef enum -{ - GST_AMRNB_VARIANT_IF1, - GST_AMRNB_VARIANT_IF2 -} GstAmrnbVariant; - -struct _GstAmrnbDec { - GstAudioDecoder element; - - GstAmrnbVariant variant; - - /* library handle */ - void *handle; - - /* output settings */ - gint channels, rate; -}; - -struct _GstAmrnbDecClass { - GstAudioDecoderClass parent_class; -}; - -GType gst_amrnbdec_get_type (void); -GST_ELEMENT_REGISTER_DECLARE (amrnbdec); - -G_END_DECLS - -#endif /* __GST_AMRNBDEC_H__ */
View file
gst-plugins-ugly-1.22.7.tar.xz/ext/amrnb/amrnbenc.c
Deleted
@@ -1,295 +0,0 @@ -/* GStreamer Adaptive Multi-Rate Narrow-Band (AMR-NB) plugin - * Copyright (C) 2004 Ronald Bultje <rbultje@ronald.bitfreak.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., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -/** - * SECTION:element-amrnbenc - * @title: amrnbenc - * @see_also: #GstAmrnbDec, #GstAmrnbParse - * - * AMR narrowband encoder based on the - * opencore codec implementation(http://sourceforge.net/projects/opencore-amr). - * - * ## Example launch line - * | - * gst-launch-1.0 filesrc location=abc.wav ! wavparse ! audioconvert ! audioresample ! amrnbenc ! filesink location=abc.amr - * | - * Please note that the above stream misses the header, that is needed to play - * the stream. - * - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "amrnbenc.h" - -static GType -gst_amrnbenc_bandmode_get_type (void) -{ - static GType gst_amrnbenc_bandmode_type = 0; - static const GEnumValue gst_amrnbenc_bandmode = { - {MR475, "MR475", "MR475"}, - {MR515, "MR515", "MR515"}, - {MR59, "MR59", "MR59"}, - {MR67, "MR67", "MR67"}, - {MR74, "MR74", "MR74"}, - {MR795, "MR795", "MR795"}, - {MR102, "MR102", "MR102"}, - {MR122, "MR122", "MR122"}, - {MRDTX, "MRDTX", "MRDTX"}, - {0, NULL, NULL}, - }; - if (!gst_amrnbenc_bandmode_type) { - gst_amrnbenc_bandmode_type = - g_enum_register_static ("GstAmrnbEncBandMode", gst_amrnbenc_bandmode); - } - return gst_amrnbenc_bandmode_type; -} - -#define GST_AMRNBENC_BANDMODE_TYPE (gst_amrnbenc_bandmode_get_type()) - -#define BANDMODE_DEFAULT MR122 -enum -{ - PROP_0, - PROP_BANDMODE -}; - -static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", - GST_PAD_SINK, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ("audio/x-raw, format = (string) " GST_AUDIO_NE (S16) ", " - "layout = (string) interleaved, " - "rate = (int) 8000," "channels = (int) 1") - ); - -static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ("audio/AMR, " "rate = (int) 8000, " "channels = (int) 1") - ); - -GST_DEBUG_CATEGORY_STATIC (gst_amrnbenc_debug); -#define GST_CAT_DEFAULT gst_amrnbenc_debug - -static gboolean gst_amrnbenc_start (GstAudioEncoder * enc); -static gboolean gst_amrnbenc_stop (GstAudioEncoder * enc); -static gboolean gst_amrnbenc_set_format (GstAudioEncoder * enc, - GstAudioInfo * info); -static GstFlowReturn gst_amrnbenc_handle_frame (GstAudioEncoder * enc, - GstBuffer * in_buf); - -#define gst_amrnbenc_parent_class parent_class -G_DEFINE_TYPE (GstAmrnbEnc, gst_amrnbenc, GST_TYPE_AUDIO_ENCODER); -GST_ELEMENT_REGISTER_DEFINE (amrnbenc, "amrnbenc", GST_RANK_SECONDARY, - GST_TYPE_AMRNBENC); - -static void -gst_amrnbenc_set_property (GObject * object, guint prop_id, - const GValue * value, GParamSpec * pspec) -{ - GstAmrnbEnc *self = GST_AMRNBENC (object); - - switch (prop_id) { - case PROP_BANDMODE: - self->bandmode = g_value_get_enum (value); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } - return; -} - -static void -gst_amrnbenc_get_property (GObject * object, guint prop_id, - GValue * value, GParamSpec * pspec) -{ - GstAmrnbEnc *self = GST_AMRNBENC (object); - - switch (prop_id) { - case PROP_BANDMODE: - g_value_set_enum (value, self->bandmode); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } - return; -} - -static void -gst_amrnbenc_class_init (GstAmrnbEncClass * klass) -{ - GObjectClass *object_class = G_OBJECT_CLASS (klass); - GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - GstAudioEncoderClass *base_class = GST_AUDIO_ENCODER_CLASS (klass); - - object_class->set_property = gst_amrnbenc_set_property; - object_class->get_property = gst_amrnbenc_get_property; - - base_class->start = GST_DEBUG_FUNCPTR (gst_amrnbenc_start); - base_class->stop = GST_DEBUG_FUNCPTR (gst_amrnbenc_stop); - base_class->set_format = GST_DEBUG_FUNCPTR (gst_amrnbenc_set_format); - base_class->handle_frame = GST_DEBUG_FUNCPTR (gst_amrnbenc_handle_frame); - - g_object_class_install_property (object_class, PROP_BANDMODE, - g_param_spec_enum ("band-mode", "Band Mode", - "Encoding Band Mode (Kbps)", GST_AMRNBENC_BANDMODE_TYPE, - BANDMODE_DEFAULT, - G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); - - gst_element_class_add_static_pad_template (element_class, &sink_template); - gst_element_class_add_static_pad_template (element_class, &src_template); - - gst_element_class_set_static_metadata (element_class, "AMR-NB audio encoder", - "Codec/Encoder/Audio", - "Adaptive Multi-Rate Narrow-Band audio encoder", - "Wim Taymans <wim.taymans@gmail.com>"); - - GST_DEBUG_CATEGORY_INIT (gst_amrnbenc_debug, "amrnbenc", 0, - "AMR-NB audio encoder"); - - gst_type_mark_as_plugin_api (GST_AMRNBENC_BANDMODE_TYPE, 0); -} - -static void -gst_amrnbenc_init (GstAmrnbEnc * amrnbenc) -{ - GST_PAD_SET_ACCEPT_TEMPLATE (GST_AUDIO_ENCODER_SINK_PAD (amrnbenc)); -} - -static gboolean -gst_amrnbenc_start (GstAudioEncoder * enc) -{ - GstAmrnbEnc *amrnbenc = GST_AMRNBENC (enc); - - GST_DEBUG_OBJECT (amrnbenc, "start"); - - if (!(amrnbenc->handle = Encoder_Interface_init (0))) - return FALSE; - - return TRUE; -} - -static gboolean -gst_amrnbenc_stop (GstAudioEncoder * enc) -{ - GstAmrnbEnc *amrnbenc = GST_AMRNBENC (enc); - - GST_DEBUG_OBJECT (amrnbenc, "stop"); - - Encoder_Interface_exit (amrnbenc->handle); - - return TRUE; -} - -static gboolean -gst_amrnbenc_set_format (GstAudioEncoder * enc, GstAudioInfo * info) -{ - GstAmrnbEnc *amrnbenc; - GstCaps *copy; - - amrnbenc = GST_AMRNBENC (enc); - - /* parameters already parsed for us */ - amrnbenc->rate = GST_AUDIO_INFO_RATE (info); - amrnbenc->channels = GST_AUDIO_INFO_CHANNELS (info); - - /* we do not really accept other input, but anyway ... */ - /* this is not wrong but will sound bad */ - if (amrnbenc->channels != 1) { - g_warning ("amrnbdec is only optimized for mono channels"); - } - if (amrnbenc->rate != 8000) { - g_warning ("amrnbdec is only optimized for 8000 Hz samplerate"); - } - - /* create reverse caps */ - copy = gst_caps_new_simple ("audio/AMR", - "channels", G_TYPE_INT, amrnbenc->channels, - "rate", G_TYPE_INT, amrnbenc->rate, NULL); - - gst_audio_encoder_set_output_format (GST_AUDIO_ENCODER (amrnbenc), copy); - gst_caps_unref (copy); - - /* report needs to base class: hand one frame at a time */ - gst_audio_encoder_set_frame_samples_min (enc, 160); - gst_audio_encoder_set_frame_samples_max (enc, 160); - gst_audio_encoder_set_frame_max (enc, 1); - - return TRUE; -} - -static GstFlowReturn -gst_amrnbenc_handle_frame (GstAudioEncoder * enc, GstBuffer * buffer) -{ - GstAmrnbEnc *amrnbenc; - GstFlowReturn ret; - GstBuffer *out; - GstMapInfo in_map, out_map; - gsize out_size; - - amrnbenc = GST_AMRNBENC (enc); - - g_return_val_if_fail (amrnbenc->handle, GST_FLOW_FLUSHING); - - /* we don't deal with squeezing remnants, so simply discard those */ - if (G_UNLIKELY (buffer == NULL)) { - GST_DEBUG_OBJECT (amrnbenc, "no data"); - return GST_FLOW_OK; - } - - gst_buffer_map (buffer, &in_map, GST_MAP_READ); - - if (G_UNLIKELY (in_map.size < 320)) { - gst_buffer_unmap (buffer, &in_map); - GST_DEBUG_OBJECT (amrnbenc, "discarding trailing data of %" G_GSIZE_FORMAT - " bytes", in_map.size); - return gst_audio_encoder_finish_frame (enc, NULL, -1); - } - - /* get output, max size is 32 */ - out = gst_buffer_new_and_alloc (32); - /* AMR encoder actually writes into the source data buffers it gets */ - /* should be able to handle that with what we are given */ - - gst_buffer_map (out, &out_map, GST_MAP_WRITE); - /* encode */ - out_size = - Encoder_Interface_Encode (amrnbenc->handle, amrnbenc->bandmode, - (short *) in_map.data, out_map.data, 0); - gst_buffer_unmap (out, &out_map); - gst_buffer_resize (out, 0, out_size); - gst_buffer_unmap (buffer, &in_map); - - GST_LOG_OBJECT (amrnbenc, "output data size %" G_GSIZE_FORMAT, out_size); - - if (out_size) { - ret = gst_audio_encoder_finish_frame (enc, out, 160); - } else { - /* should not happen (without dtx or so at least) */ - GST_WARNING_OBJECT (amrnbenc, "no encoded data; discarding input"); - gst_buffer_unref (out); - ret = gst_audio_encoder_finish_frame (enc, NULL, -1); - } - - return ret; -}
View file
gst-plugins-ugly-1.22.7.tar.xz/ext/amrnb/amrnbenc.h
Deleted
@@ -1,67 +0,0 @@ -/* GStreamer Adaptive Multi-Rate Narrow-Band (AMR-NB) plugin - * Copyright (C) 2004 Ronald Bultje <rbultje@ronald.bitfreak.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., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifndef __GST_AMRNBENC_H__ -#define __GST_AMRNBENC_H__ - -#include <gst/gst.h> -#include <gst/audio/gstaudioencoder.h> - -#include <opencore-amrnb/interf_enc.h> - -G_BEGIN_DECLS - -#define GST_TYPE_AMRNBENC \ - (gst_amrnbenc_get_type()) -#define GST_AMRNBENC(obj) \ - (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_AMRNBENC, GstAmrnbEnc)) -#define GST_AMRNBENC_CLASS(klass) \ - (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_AMRNBENC, GstAmrnbEncClass)) -#define GST_IS_AMRNBENC(obj) \ - (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_AMRNBENC)) -#define GST_IS_AMRNBENC_CLASS(klass) \ - (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_AMRNBENC)) - -typedef struct _GstAmrnbEnc GstAmrnbEnc; -typedef struct _GstAmrnbEncClass GstAmrnbEncClass; - -struct _GstAmrnbEnc { - GstAudioEncoder element; - - /* library handle */ - void *handle; - - /* input settings */ - gint channels, rate; - gint duration; - - /* property */ - enum Mode bandmode; -}; - -struct _GstAmrnbEncClass { - GstAudioEncoderClass parent_class; -}; - -GType gst_amrnbenc_get_type (void); -GST_ELEMENT_REGISTER_DECLARE (amrnbenc); - -G_END_DECLS - -#endif /* __GST_AMRNBENC_H__ */
View file
gst-plugins-ugly-1.22.7.tar.xz/ext/amrnb/meson.build
Deleted
@@ -1,18 +0,0 @@ -amrnb_dep = dependency('opencore-amrnb', version : '>= 0.1.3', required : get_option('amrnb')) - -if amrnb_dep.found() - amrnb = library('gstamrnb', - 'amrnb.c', 'amrnbdec.c', 'amrnbenc.c', - c_args : ugly_args, - include_directories : configinc, - dependencies : gstaudio_dep, amrnb_dep, - install : true, - install_dir : plugins_install_dir, - ) - plugins += amrnb - install_data(sources: 'GstAmrnbEnc.prs', install_dir: presetdir) - - env = environment() - env.prepend('GST_PRESET_PATH', meson.current_source_dir()) - meson.add_devenv(env) -endif
View file
gst-plugins-ugly-1.22.7.tar.xz/ext/amrwbdec
Deleted
-(directory)
View file
gst-plugins-ugly-1.22.7.tar.xz/ext/amrwbdec/README
Deleted
@@ -1,6 +0,0 @@ -Compiling AMRWB decoder: -======================== - -To compile the amrwbdec plugin, you need the opencore-amrwb development -package. If your distribution does not provide this package, you can -download the source code from "http://sourceforge.net/projects/opencore-amr".
View file
gst-plugins-ugly-1.22.7.tar.xz/ext/amrwbdec/amrwb.c
Deleted
@@ -1,38 +0,0 @@ -/* GStreamer Adaptive Multi-Rate Wide-Band (AMR-WB) Decoder plugin - * Copyright (C) 2006 Edgard Lima <edgard.lima@gmail.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "amrwbdec.h" - -static gboolean -plugin_init (GstPlugin * plugin) -{ - return GST_ELEMENT_REGISTER (amrwbdec, plugin); -} - - -GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, - GST_VERSION_MINOR, - amrwbdec, - "Adaptive Multi-Rate Wide-Band Decoder", - plugin_init, VERSION, GST_LICENSE_UNKNOWN, GST_PACKAGE_NAME, - GST_PACKAGE_ORIGIN);
View file
gst-plugins-ugly-1.22.7.tar.xz/ext/amrwbdec/amrwbdec.c
Deleted
@@ -1,234 +0,0 @@ -/* GStreamer Adaptive Multi-Rate Narrow-Band (AMR-NB) plugin - * Copyright (C) 2004 Ronald Bultje <rbultje@ronald.bitfreak.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., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -/** - * SECTION:element-amrwbdec - * @title: amrwbdec - * @see_also: #GstAmrwbEnc - * - * AMR wideband decoder based on the - * opencore codec implementation(http://sourceforge.net/projects/opencore-amr). - * - * ## Example launch line - * | - * gst-launch-1.0 filesrc location=abc.amr ! amrparse ! amrwbdec ! audioconvert ! audioresample ! autoaudiosink - * | - * - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include <gst/audio/audio.h> - -#include "amrwbdec.h" - -static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", - GST_PAD_SINK, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ("audio/AMR-WB, " - "rate = (int) 16000, " "channels = (int) 1") - ); - -static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ("audio/x-raw, " - "format = (string) " GST_AUDIO_NE (S16) ", " - "layout = (string) interleaved, " - "rate = (int) 16000, " "channels = (int) 1") - ); - -GST_DEBUG_CATEGORY_STATIC (gst_amrwbdec_debug); -#define GST_CAT_DEFAULT gst_amrwbdec_debug - -#define L_FRAME16k 320 /* Frame size at 16kHz */ - -static const unsigned char block_size16 = - { 18, 24, 33, 37, 41, 47, 51, 59, 61, - 6, 0, 0, 0, 0, 1, 1 -}; - -static gboolean gst_amrwbdec_start (GstAudioDecoder * dec); -static gboolean gst_amrwbdec_stop (GstAudioDecoder * dec); -static gboolean gst_amrwbdec_set_format (GstAudioDecoder * dec, GstCaps * caps); -static GstFlowReturn gst_amrwbdec_parse (GstAudioDecoder * dec, - GstAdapter * adapter, gint * offset, gint * length); -static GstFlowReturn gst_amrwbdec_handle_frame (GstAudioDecoder * dec, - GstBuffer * buffer); - -#define gst_amrwbdec_parent_class parent_class -G_DEFINE_TYPE (GstAmrwbDec, gst_amrwbdec, GST_TYPE_AUDIO_DECODER); -GST_ELEMENT_REGISTER_DEFINE (amrwbdec, "amrwbdec", - GST_RANK_PRIMARY, GST_TYPE_AMRWBDEC); - -static void -gst_amrwbdec_class_init (GstAmrwbDecClass * klass) -{ - GstAudioDecoderClass *base_class = GST_AUDIO_DECODER_CLASS (klass); - GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - - gst_element_class_add_static_pad_template (element_class, &sink_template); - gst_element_class_add_static_pad_template (element_class, &src_template); - - gst_element_class_set_static_metadata (element_class, "AMR-WB audio decoder", - "Codec/Decoder/Audio", - "Adaptive Multi-Rate Wideband audio decoder", - "Renato Araujo <renato.filho@indt.org.br>"); - - base_class->start = GST_DEBUG_FUNCPTR (gst_amrwbdec_start); - base_class->stop = GST_DEBUG_FUNCPTR (gst_amrwbdec_stop); - base_class->set_format = GST_DEBUG_FUNCPTR (gst_amrwbdec_set_format); - base_class->parse = GST_DEBUG_FUNCPTR (gst_amrwbdec_parse); - base_class->handle_frame = GST_DEBUG_FUNCPTR (gst_amrwbdec_handle_frame); - - GST_DEBUG_CATEGORY_INIT (gst_amrwbdec_debug, "amrwbdec", 0, - "AMR-WB audio decoder"); -} - -static void -gst_amrwbdec_init (GstAmrwbDec * amrwbdec) -{ - gst_audio_decoder_set_needs_format (GST_AUDIO_DECODER (amrwbdec), TRUE); - gst_audio_decoder_set_use_default_pad_acceptcaps (GST_AUDIO_DECODER_CAST - (amrwbdec), TRUE); - GST_PAD_SET_ACCEPT_TEMPLATE (GST_AUDIO_DECODER_SINK_PAD (amrwbdec)); -} - -static gboolean -gst_amrwbdec_start (GstAudioDecoder * dec) -{ - GstAmrwbDec *amrwbdec = GST_AMRWBDEC (dec); - - GST_DEBUG_OBJECT (dec, "start"); - if (!(amrwbdec->handle = D_IF_init ())) - return FALSE; - - amrwbdec->rate = 0; - amrwbdec->channels = 0; - - return TRUE; -} - -static gboolean -gst_amrwbdec_stop (GstAudioDecoder * dec) -{ - GstAmrwbDec *amrwbdec = GST_AMRWBDEC (dec); - - GST_DEBUG_OBJECT (dec, "stop"); - D_IF_exit (amrwbdec->handle); - - return TRUE; -} - -static gboolean -gst_amrwbdec_set_format (GstAudioDecoder * dec, GstCaps * caps) -{ - GstStructure *structure; - GstAmrwbDec *amrwbdec; - GstAudioInfo info; - - amrwbdec = GST_AMRWBDEC (dec); - - structure = gst_caps_get_structure (caps, 0); - - /* get channel count */ - gst_structure_get_int (structure, "channels", &amrwbdec->channels); - gst_structure_get_int (structure, "rate", &amrwbdec->rate); - - /* create reverse caps */ - gst_audio_info_init (&info); - gst_audio_info_set_format (&info, - GST_AUDIO_FORMAT_S16, amrwbdec->rate, amrwbdec->channels, NULL); - - gst_audio_decoder_set_output_format (dec, &info); - - return TRUE; -} - -static GstFlowReturn -gst_amrwbdec_parse (GstAudioDecoder * dec, GstAdapter * adapter, - gint * offset, gint * length) -{ - GstAmrwbDec *amrwbdec = GST_AMRWBDEC (dec); - guint8 header1; - guint size; - gboolean sync, eos; - gint block, mode; - - size = gst_adapter_available (adapter); - if (size < 1) - return GST_FLOW_ERROR; - - gst_audio_decoder_get_parse_state (dec, &sync, &eos); - - /* need to peek data to get the size */ - gst_adapter_copy (adapter, header, 0, 1); - mode = (header0 >> 3) & 0x0F; - block = block_sizemode; - - GST_DEBUG_OBJECT (amrwbdec, "mode %d, block %d", mode, block); - - if (block) { - if (block > size) - return GST_FLOW_EOS; - *offset = 0; - *length = block; - } else { - /* no frame yet, skip one byte */ - GST_LOG_OBJECT (amrwbdec, "skipping byte"); - *offset = 1; - return GST_FLOW_EOS; - } - - return GST_FLOW_OK; -} - -static GstFlowReturn -gst_amrwbdec_handle_frame (GstAudioDecoder * dec, GstBuffer * buffer) -{ - GstAmrwbDec *amrwbdec; - GstBuffer *out; - GstMapInfo inmap, outmap; - - amrwbdec = GST_AMRWBDEC (dec); - - /* no fancy flushing */ - if (!buffer || !gst_buffer_get_size (buffer)) - return GST_FLOW_OK; - - /* the library seems to write into the source data, hence the copy. */ - /* should be no problem */ - gst_buffer_map (buffer, &inmap, GST_MAP_READ); - - /* get output */ - out = gst_buffer_new_and_alloc (sizeof (gint16) * L_FRAME16k); - gst_buffer_map (out, &outmap, GST_MAP_WRITE); - - /* decode */ - D_IF_decode (amrwbdec->handle, (unsigned char *) inmap.data, - (short int *) outmap.data, _good_frame); - - gst_buffer_unmap (out, &outmap); - gst_buffer_unmap (buffer, &inmap); - - /* send out */ - return gst_audio_decoder_finish_frame (dec, out, 1); -}
View file
gst-plugins-ugly-1.22.7.tar.xz/ext/amrwbdec/amrwbdec.h
Deleted
@@ -1,69 +0,0 @@ -/* GStreamer Adaptive Multi-Rate Wide-Band (AMR-WB) plugin - * Copyright (C) 2006 Edgard Lima <edgard.lima@gmail.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifndef __GST_AMRWBDEC_H__ -#define __GST_AMRWBDEC_H__ - -#include <gst/gst.h> -#include <gst/audio/gstaudiodecoder.h> - -#include <opencore-amrwb/dec_if.h> -#include <opencore-amrwb/if_rom.h> - -G_BEGIN_DECLS - -#define GST_TYPE_AMRWBDEC \ - (gst_amrwbdec_get_type()) -#define GST_AMRWBDEC(obj) \ - (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_AMRWBDEC, GstAmrwbDec)) -#define GST_AMRWBDEC_CLASS(klass) \ - (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_AMRWBDEC, GstAmrwbDecClass)) -#define GST_IS_AMRWBDEC(obj) \ - (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_AMRWBDEC)) -#define GST_IS_AMRWBDEC_CLASS(klass) \ - (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_AMRWBDEC)) - -typedef struct _GstAmrwbDec GstAmrwbDec; -typedef struct _GstAmrwbDecClass GstAmrwbDecClass; - -/** - * GstAmrwbDec: - * - * Opaque data structure. - */ -struct _GstAmrwbDec { - GstAudioDecoder element; - - /* library handle */ - void *handle; - - /* output settings */ - gint channels, rate; -}; - -struct _GstAmrwbDecClass { - GstAudioDecoderClass parent_class; -}; - -GType gst_amrwbdec_get_type (void); -GST_ELEMENT_REGISTER_DECLARE (amrwbdec); - -G_END_DECLS - -#endif /* __GST_AMRWBDEC_H__ */
View file
gst-plugins-ugly-1.22.7.tar.xz/ext/amrwbdec/meson.build
Deleted
@@ -1,13 +0,0 @@ -amrwb_dep = dependency('opencore-amrwb', version : '>= 0.1.3', required : get_option('amrwbdec')) - -if amrwb_dep.found() - amrwbdec = library('gstamrwbdec', - 'amrwb.c', 'amrwbdec.c', - c_args : ugly_args, - include_directories : configinc, - dependencies : gstaudio_dep, amrwb_dep, - install : true, - install_dir : plugins_install_dir, - ) - plugins += amrwbdec -endif
View file
gst-plugins-ugly-1.22.7.tar.xz/gst/realmedia/asmrules.c
Deleted
@@ -1,712 +0,0 @@ -/* GStreamer - * Copyright (C) <2007> Wim Taymans <wim.taymans@gmail.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#include <string.h> -#include <stdlib.h> - -#include "asmrules.h" - -#define MAX_RULE_LENGTH 2048 - -/* define to enable some more debug */ -#undef DEBUG - -static GstASMNode * -gst_asm_node_new (void) -{ - GstASMNode *node; - - node = g_new0 (GstASMNode, 1); - node->type = GST_ASM_NODE_UNKNOWN; - - return node; -} - -static void -gst_asm_node_free (GstASMNode * node) -{ - if (node->left) - gst_asm_node_free (node->left); - if (node->right) - gst_asm_node_free (node->right); - if (node->type == GST_ASM_NODE_VARIABLE && node->data.varname) - g_free (node->data.varname); - g_free (node); -} - -static gfloat -gst_asm_operator_eval (GstASMOp optype, gfloat left, gfloat right) -{ - gfloat result = 0.0; - - switch (optype) { - case GST_ASM_OP_GREATER: - result = (gfloat) (left > right); - break; - case GST_ASM_OP_LESS: - result = (gfloat) (left < right); - break; - case GST_ASM_OP_GREATEREQUAL: - result = (gfloat) (left >= right); - break; - case GST_ASM_OP_LESSEQUAL: - result = (gfloat) (left <= right); - break; - case GST_ASM_OP_EQUAL: - result = (gfloat) (left == right); - break; - case GST_ASM_OP_NOTEQUAL: - result = (gfloat) (left != right); - break; - case GST_ASM_OP_AND: - result = (gfloat) (left && right); - break; - case GST_ASM_OP_OR: - result = (gfloat) (left || right); - break; - default: - break; - } - return result; -} - -static gfloat -gst_asm_node_evaluate (GstASMNode * node, GHashTable * vars) -{ - gfloat result = 0.0; - - if (node == NULL) - return 0.0; - - switch (node->type) { - case GST_ASM_NODE_VARIABLE: - { - gchar *val; - - val = g_hash_table_lookup (vars, node->data.varname); - if (val) - result = (gfloat) atof (val); - break; - } - case GST_ASM_NODE_INTEGER: - result = (gfloat) node->data.intval; - break; - case GST_ASM_NODE_FLOAT: - result = node->data.floatval; - break; - case GST_ASM_NODE_OPERATOR: - { - gfloat left, right; - - left = gst_asm_node_evaluate (node->left, vars); - right = gst_asm_node_evaluate (node->right, vars); - - result = gst_asm_operator_eval (node->data.optype, left, right); - break; - } - default: - break; - } - return result; -} - -#define IS_SPACE(p) (((p) == ' ') || ((p) == '\n') || \ - ((p) == '\r') || ((p) == '\t')) -#define IS_RULE_DELIM(p) (((p) == ',') || ((p) == ';') || ((p) == ')')) -#define IS_OPERATOR(p) (((p) == '>') || ((p) == '<') || \ - ((p) == '=') || ((p) == '!') || \ - ((p) == '&') || ((p) == '|')) -#define IS_NUMBER(p) ((((p) >= '0') && ((p) <= '9')) || ((p) == '.')) -#define IS_CHAR(p) (!IS_OPERATOR(ch) && !IS_RULE_DELIM(ch) && (ch != '\0')) - -#define IS_OP_TOKEN(t) (((t) == GST_ASM_TOKEN_AND) || ((t) == GST_ASM_TOKEN_OR)) -#define IS_COND_TOKEN(t) (((t) == GST_ASM_TOKEN_LESS) || ((t) == GST_ASM_TOKEN_LESSEQUAL) || \ - ((t) == GST_ASM_TOKEN_GREATER) || ((t) == GST_ASM_TOKEN_GREATEREQUAL) || \ - ((t) == GST_ASM_TOKEN_EQUAL) || ((t) == GST_ASM_TOKEN_NOTEQUAL)) - -typedef struct -{ - const gchar *buffer; - gint pos; - gchar ch; - - GstASMToken token; - gchar valMAX_RULE_LENGTH; -} GstASMScan; - -#define NEXT_CHAR(scan) ((scan)->ch = (scan)->buffer(scan)->pos++) -#define THIS_CHAR(scan) ((scan)->ch) - -static GstASMScan * -gst_asm_scan_new (const gchar * buffer) -{ - GstASMScan *scan; - - scan = g_new0 (GstASMScan, 1); - scan->buffer = buffer; - NEXT_CHAR (scan); - - return scan; -} - -static void -gst_asm_scan_free (GstASMScan * scan) -{ - g_free (scan); -} - -static void -gst_asm_scan_string (GstASMScan * scan, gchar delim) -{ - gchar ch; - gint i = 0; - - ch = THIS_CHAR (scan); - while ((ch != delim) && (ch != '\0')) { - if (i < MAX_RULE_LENGTH - 1) - scan->vali++ = ch; - ch = NEXT_CHAR (scan); - if (ch == '\\') - ch = NEXT_CHAR (scan); - } - scan->vali = '\0'; - - if (ch == delim) - NEXT_CHAR (scan); - - scan->token = GST_ASM_TOKEN_STRING; -} - -static void -gst_asm_scan_number (GstASMScan * scan) -{ - gchar ch; - gint i = 0; - gboolean have_float = FALSE; - - ch = THIS_CHAR (scan); - /* real strips all spaces that are not inside quotes for numbers */ - while ((IS_NUMBER (ch) || IS_SPACE (ch))) { - if (i < (MAX_RULE_LENGTH - 1) && !IS_SPACE (ch)) - scan->vali++ = ch; - if (ch == '.') - have_float = TRUE; - ch = NEXT_CHAR (scan); - } - scan->vali = '\0'; - - if (have_float) - scan->token = GST_ASM_TOKEN_FLOAT; - else - scan->token = GST_ASM_TOKEN_INT; -} - -static void -gst_asm_scan_identifier (GstASMScan * scan) -{ - gchar ch; - gint i = 0; - - ch = THIS_CHAR (scan); - /* real strips all spaces that are not inside quotes for identifiers */ - while ((IS_CHAR (ch) || IS_SPACE (ch))) { - if (i < (MAX_RULE_LENGTH - 1) && !IS_SPACE (ch)) - scan->vali++ = ch; - ch = NEXT_CHAR (scan); - } - scan->vali = '\0'; - - scan->token = GST_ASM_TOKEN_IDENTIFIER; -} - -static void -gst_asm_scan_print_token (GstASMScan * scan) -{ -#ifdef DEBUG - switch (scan->token) { - case GST_ASM_TOKEN_NONE: - g_print ("none\n"); - break; - case GST_ASM_TOKEN_EOF: - g_print ("EOF\n"); - break; - - case GST_ASM_TOKEN_INT: - g_print ("INT %d\n", atoi (scan->val)); - break; - case GST_ASM_TOKEN_FLOAT: - g_print ("FLOAT %f\n", atof (scan->val)); - break; - case GST_ASM_TOKEN_IDENTIFIER: - g_print ("ID %s\n", scan->val); - break; - case GST_ASM_TOKEN_STRING: - g_print ("STRING %s\n", scan->val); - break; - - case GST_ASM_TOKEN_HASH: - g_print ("HASH\n"); - break; - case GST_ASM_TOKEN_SEMICOLON: - g_print ("SEMICOLON\n"); - break; - case GST_ASM_TOKEN_COMMA: - g_print ("COMMA\n"); - break; - case GST_ASM_TOKEN_EQUAL: - g_print ("==\n"); - break; - case GST_ASM_TOKEN_NOTEQUAL: - g_print ("!=\n"); - break; - case GST_ASM_TOKEN_AND: - g_print ("&&\n"); - break; - case GST_ASM_TOKEN_OR: - g_print ("||\n"); - break; - case GST_ASM_TOKEN_LESS: - g_print ("<\n"); - break; - case GST_ASM_TOKEN_LESSEQUAL: - g_print ("<=\n"); - break; - case GST_ASM_TOKEN_GREATER: - g_print (">\n"); - break; - case GST_ASM_TOKEN_GREATEREQUAL: - g_print (">=\n"); - break; - case GST_ASM_TOKEN_DOLLAR: - g_print ("$\n"); - break; - case GST_ASM_TOKEN_LPAREN: - g_print ("(\n"); - break; - case GST_ASM_TOKEN_RPAREN: - g_print (")\n"); - break; - default: - break; - } -#endif -} - -static GstASMToken -gst_asm_scan_next_token (GstASMScan * scan) -{ - gchar ch; - - ch = THIS_CHAR (scan); - - /* skip spaces */ - while (IS_SPACE (ch)) - ch = NEXT_CHAR (scan); - - /* remove \ which is common in front of " */ - while (ch == '\\') - ch = NEXT_CHAR (scan); - - switch (ch) { - case '#': - scan->token = GST_ASM_TOKEN_HASH; - NEXT_CHAR (scan); - break; - case ';': - scan->token = GST_ASM_TOKEN_SEMICOLON; - NEXT_CHAR (scan); - break; - case ',': - scan->token = GST_ASM_TOKEN_COMMA; - NEXT_CHAR (scan); - break; - case '=': - scan->token = GST_ASM_TOKEN_EQUAL; - if (NEXT_CHAR (scan) == '=') - NEXT_CHAR (scan); - break; - case '!': - if (NEXT_CHAR (scan) == '=') { - scan->token = GST_ASM_TOKEN_NOTEQUAL; - NEXT_CHAR (scan); - } - break; - case '&': - scan->token = GST_ASM_TOKEN_AND; - if (NEXT_CHAR (scan) == '&') - NEXT_CHAR (scan); - break; - case '|': - scan->token = GST_ASM_TOKEN_OR; - if (NEXT_CHAR (scan) == '|') - NEXT_CHAR (scan); - break; - case '<': - scan->token = GST_ASM_TOKEN_LESS; - if (NEXT_CHAR (scan) == '=') { - scan->token = GST_ASM_TOKEN_LESSEQUAL; - NEXT_CHAR (scan); - } - break; - case '>': - scan->token = GST_ASM_TOKEN_GREATER; - if (NEXT_CHAR (scan) == '=') { - scan->token = GST_ASM_TOKEN_GREATEREQUAL; - NEXT_CHAR (scan); - } - break; - case '$': - scan->token = GST_ASM_TOKEN_DOLLAR; - NEXT_CHAR (scan); - break; - case '(': - scan->token = GST_ASM_TOKEN_LPAREN; - NEXT_CHAR (scan); - break; - case ')': - scan->token = GST_ASM_TOKEN_RPAREN; - NEXT_CHAR (scan); - break; - case '"': - NEXT_CHAR (scan); - gst_asm_scan_string (scan, '"'); - break; - case '\'': - NEXT_CHAR (scan); - gst_asm_scan_string (scan, '\''); - break; - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - gst_asm_scan_number (scan); - break; - case '\0': - scan->token = GST_ASM_TOKEN_EOF; - break; - default: - gst_asm_scan_identifier (scan); - break; - } - gst_asm_scan_print_token (scan); - return scan->token; -} - -static GstASMRule * -gst_asm_rule_new (void) -{ - GstASMRule *rule; - - rule = g_new (GstASMRule, 1); - rule->root = NULL; - rule->props = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); - - return rule; -} - -static void -gst_asm_rule_free (GstASMRule * rule) -{ - g_hash_table_destroy (rule->props); - if (rule->root) - gst_asm_node_free (rule->root); - g_free (rule); -} - -static void -gst_asm_rule_add_property (GstASMRule * rule, gchar * key, gchar * val) -{ - g_hash_table_insert (rule->props, key, val); -} - -static GstASMNode *gst_asm_scan_parse_condition (GstASMScan * scan); - -static GstASMNode * -gst_asm_scan_parse_operand (GstASMScan * scan) -{ - GstASMNode *node; - - switch (scan->token) { - case GST_ASM_TOKEN_DOLLAR: - gst_asm_scan_next_token (scan); - - if (scan->token != GST_ASM_TOKEN_IDENTIFIER) - g_warning ("identifier expected"); - - node = gst_asm_node_new (); - node->type = GST_ASM_NODE_VARIABLE; - node->data.varname = g_strdup (scan->val); - break; - case GST_ASM_TOKEN_INT: - node = gst_asm_node_new (); - node->type = GST_ASM_NODE_INTEGER; - node->data.intval = (gfloat) atof (scan->val); - break; - case GST_ASM_TOKEN_FLOAT: - node = gst_asm_node_new (); - node->type = GST_ASM_NODE_FLOAT; - node->data.floatval = atoi (scan->val); - break; - case GST_ASM_TOKEN_LPAREN: - gst_asm_scan_next_token (scan); - node = gst_asm_scan_parse_condition (scan); - if (scan->token != GST_ASM_TOKEN_RPAREN) - g_warning (") expected"); - break; - default: - g_warning ("$ <number> or ) expected"); - node = NULL; - break; - } - gst_asm_scan_next_token (scan); - - return node; -} - -static GstASMNode * -gst_asm_scan_parse_expression (GstASMScan * scan) -{ - GstASMNode *node, *left; - - node = gst_asm_scan_parse_operand (scan); - - while (IS_COND_TOKEN (scan->token)) { - left = node; - - node = gst_asm_node_new (); - node->type = GST_ASM_NODE_OPERATOR; - node->data.optype = (GstASMOp) scan->token; - - gst_asm_scan_next_token (scan); - - node->right = gst_asm_scan_parse_operand (scan); - node->left = left; - } - return node; -} - -static GstASMNode * -gst_asm_scan_parse_condition (GstASMScan * scan) -{ - GstASMNode *node, *left; - - node = gst_asm_scan_parse_expression (scan); - - while (IS_OP_TOKEN (scan->token)) { - left = node; - - node = gst_asm_node_new (); - node->type = GST_ASM_NODE_OPERATOR; - node->data.optype = (GstASMOp) scan->token; - - gst_asm_scan_next_token (scan); - - node->right = gst_asm_scan_parse_expression (scan); - node->left = left; - } - return node; -} - -static void -gst_asm_scan_parse_property (GstASMRule * rule, GstASMScan * scan) -{ - gchar *key, *val; - - if (scan->token != GST_ASM_TOKEN_IDENTIFIER) { - g_warning ("identifier expected"); - return; - } - key = g_strdup (scan->val); - - gst_asm_scan_next_token (scan); - if (scan->token != GST_ASM_TOKEN_EQUAL) { - g_warning ("= expected"); - g_free (key); - return; - } - gst_asm_scan_next_token (scan); - val = g_strdup (scan->val); - - gst_asm_rule_add_property (rule, key, val); - gst_asm_scan_next_token (scan); -} - -static GstASMRule * -gst_asm_scan_parse_rule (GstASMScan * scan) -{ - GstASMRule *rule; - - rule = gst_asm_rule_new (); - - if (scan->token == GST_ASM_TOKEN_HASH) { - gst_asm_scan_next_token (scan); - rule->root = gst_asm_scan_parse_condition (scan); - if (scan->token == GST_ASM_TOKEN_COMMA) - gst_asm_scan_next_token (scan); - } - - if (scan->token != GST_ASM_TOKEN_SEMICOLON) { - gst_asm_scan_parse_property (rule, scan); - while (scan->token == GST_ASM_TOKEN_COMMA) { - gst_asm_scan_next_token (scan); - gst_asm_scan_parse_property (rule, scan); - } - gst_asm_scan_next_token (scan); - } - return rule; -} - -static gboolean -gst_asm_rule_evaluate (GstASMRule * rule, GHashTable * vars) -{ - gboolean res; - - if (rule->root) { - res = (gboolean) gst_asm_node_evaluate (rule->root, vars); - } else - res = TRUE; - - return res; -} - -GstASMRuleBook * -gst_asm_rule_book_new (const gchar * rulebook) -{ - GstASMRuleBook *book; - GstASMRule *rule = NULL; - GstASMScan *scan; - GstASMToken token; - - book = g_new0 (GstASMRuleBook, 1); - book->rulebook = rulebook; - - scan = gst_asm_scan_new (book->rulebook); - gst_asm_scan_next_token (scan); - - do { - rule = gst_asm_scan_parse_rule (scan); - if (rule) { - book->rules = g_list_append (book->rules, rule); - book->n_rules++; - } - token = scan->token; - } while (token != GST_ASM_TOKEN_EOF); - - gst_asm_scan_free (scan); - - return book; -} - -void -gst_asm_rule_book_free (GstASMRuleBook * book) -{ - GList *walk; - - for (walk = book->rules; walk; walk = g_list_next (walk)) { - GstASMRule *rule = (GstASMRule *) walk->data; - - gst_asm_rule_free (rule); - } - g_list_free (book->rules); - g_free (book); -} - -gint -gst_asm_rule_book_match (GstASMRuleBook * book, GHashTable * vars, - gint * rulematches) -{ - GList *walk; - gint i, n = 0; - - for (walk = book->rules, i = 0; walk; walk = g_list_next (walk), i++) { - GstASMRule *rule = (GstASMRule *) walk->data; - - if (gst_asm_rule_evaluate (rule, vars)) { - rulematchesn++ = i; - } - } - return n; -} - -#ifdef TEST -gint -main (gint argc, gchar * argv) -{ - GstASMRuleBook *book; - gint rulematchMAX_RULEMATCHES; - GHashTable *vars; - gint i, n; - - static const gchar rules1 = - "#($Bandwidth < 67959),TimestampDelivery=T,DropByN=T," - "priority=9;#($Bandwidth >= 67959) && ($Bandwidth < 167959)," - "AverageBandwidth=67959,Priority=9;#($Bandwidth >= 67959) && ($Bandwidth" - " < 167959),AverageBandwidth=0,Priority=5,OnDepend=\\\"1\\\";#($Bandwidth >= 167959)" - " && ($Bandwidth < 267959),AverageBandwidth=167959,Priority=9;#($Bandwidth >= 167959)" - " && ($Bandwidth < 267959),AverageBandwidth=0,Priority=5,OnDepend=\\\"3\\\";" - "#($Bandwidth >= 267959),AverageBandwidth=267959,Priority=9;#($Bandwidth >= 267959)" - ",AverageBandwidth=0,Priority=5,OnDepend=\\\"5\\\";"; - static const gchar rules2 = - "AverageBandwidth=32041,Priority=5;AverageBandwidth=0," - "Priority=5,OnDepend=\\\"0\\\", OffDepend=\\\"0\\\";"; - static const gchar rules3 = - "#(($Bandwidth >= 27500) && ($OldPNMPlayer)),AverageBandwidth=27500,priority=9,PNMKeyframeRule=T;#(($Bandwidth >= 27500) && ($OldPNMPlayer)),AverageBandwidth=0,priority=5,PNMNonKeyframeRule=T;#(($Bandwidth < 27500) && ($OldPNMPlayer)),TimestampDelivery=T,DropByN=T,priority=9,PNMThinningRule=T;#($Bandwidth < 13899),TimestampDelivery=T,DropByN=T,priority=9;#($Bandwidth >= 13899) && ($Bandwidth < 19000),AverageBandwidth=13899,Priority=9;#($Bandwidth >= 13899) && ($Bandwidth < 19000),AverageBandwidth=0,Priority=5,OnDepend=\\\"4\\\";#($Bandwidth >= 19000) && ($Bandwidth < 27500),AverageBandwidth=19000,Priority=9;#($Bandwidth >= 19000) && ($Bandwidth < 27500),AverageBandwidth=0,Priority=5,OnDepend=\\\"6\\\";#($Bandwidth >= 27500) && ($Bandwidth < 132958),AverageBandwidth=27500,Priority=9;#($Bandwidth >= 27500) && ($Bandwidth < 132958),AverageBandwidth=0,Priority=5,OnDepend=\\\"8\\\";#($Bandwidth >= 132958) && ($Bandwidth < 187958),AverageBandwidth=132958,Priority=9;#($Bandwidth >= 132958) && ($Bandwidth < 187958),AverageBandwidth=0,Priority=5,OnDepend=\\\"10\\\";#($Bandwidth >= 187958),AverageBandwidth=187958,Priority=9;#($Bandwidth >= 187958),AverageBandwidth=0,Priority=5,OnDepend=\\\"12\\\";"; - - vars = g_hash_table_new (g_str_hash, g_str_equal); - g_hash_table_insert (vars, (gchar *) "Bandwidth", (gchar *) "300000"); - - book = gst_asm_rule_book_new (rules1); - n = gst_asm_rule_book_match (book, vars, rulematch); - gst_asm_rule_book_free (book); - - g_print ("%d rules matched\n", n); - for (i = 0; i < n; i++) { - g_print ("rule %d matched\n", rulematchi); - } - - book = gst_asm_rule_book_new (rules2); - n = gst_asm_rule_book_match (book, vars, rulematch); - gst_asm_rule_book_free (book); - - g_print ("%d rules matched\n", n); - for (i = 0; i < n; i++) { - g_print ("rule %d matched\n", rulematchi); - } - - book = gst_asm_rule_book_new (rules3); - n = gst_asm_rule_book_match (book, vars, rulematch); - gst_asm_rule_book_free (book); - - - g_print ("%d rules matched\n", n); - for (i = 0; i < n; i++) { - g_print ("rule %d matched\n", rulematchi); - } - - g_hash_table_destroy (vars); - - return 0; -} -#endif
View file
gst-plugins-ugly-1.22.7.tar.xz/gst/realmedia/asmrules.h
Deleted
@@ -1,115 +0,0 @@ -/* GStreamer - * Copyright (C) <2007> Wim Taymans <wim.taymans@gmail.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifndef __GST_ASM_RULES_H__ -#define __GST_ASM_RULES_H__ - -#include <gst/gst.h> - -G_BEGIN_DECLS - -#define MAX_RULEMATCHES 16 - -typedef struct _GstASMNode GstASMNode; -typedef struct _GstASMRule GstASMRule; -typedef struct _GstASMRuleBook GstASMRuleBook; - -typedef enum { - GST_ASM_TOKEN_NONE, - GST_ASM_TOKEN_EOF, - - GST_ASM_TOKEN_INT, - GST_ASM_TOKEN_FLOAT, - GST_ASM_TOKEN_IDENTIFIER, - GST_ASM_TOKEN_STRING, - - GST_ASM_TOKEN_HASH, - GST_ASM_TOKEN_SEMICOLON, - GST_ASM_TOKEN_COMMA, - GST_ASM_TOKEN_DOLLAR, - - GST_ASM_TOKEN_LPAREN, - GST_ASM_TOKEN_RPAREN, - - GST_ASM_TOKEN_GREATER, - GST_ASM_TOKEN_LESS, - GST_ASM_TOKEN_GREATEREQUAL, - GST_ASM_TOKEN_LESSEQUAL, - GST_ASM_TOKEN_EQUAL, - GST_ASM_TOKEN_NOTEQUAL, - - GST_ASM_TOKEN_AND, - GST_ASM_TOKEN_OR -} GstASMToken; - -typedef enum { - GST_ASM_NODE_UNKNOWN, - GST_ASM_NODE_VARIABLE, - GST_ASM_NODE_INTEGER, - GST_ASM_NODE_FLOAT, - GST_ASM_NODE_OPERATOR -} GstASMNodeType; - -typedef enum { - GST_ASM_OP_GREATER = GST_ASM_TOKEN_GREATER, - GST_ASM_OP_LESS = GST_ASM_TOKEN_LESS, - GST_ASM_OP_GREATEREQUAL = GST_ASM_TOKEN_GREATEREQUAL, - GST_ASM_OP_LESSEQUAL = GST_ASM_TOKEN_LESSEQUAL, - GST_ASM_OP_EQUAL = GST_ASM_TOKEN_EQUAL, - GST_ASM_OP_NOTEQUAL = GST_ASM_TOKEN_NOTEQUAL, - - GST_ASM_OP_AND = GST_ASM_TOKEN_AND, - GST_ASM_OP_OR = GST_ASM_TOKEN_OR -} GstASMOp; - -struct _GstASMNode { - GstASMNodeType type; - - union { - gchar *varname; - gint intval; - gfloat floatval; - GstASMOp optype; - } data; - - GstASMNode *left; - GstASMNode *right; -}; - -struct _GstASMRule { - GstASMNode *root; - GHashTable *props; -}; - -struct _GstASMRuleBook { - const gchar *rulebook; - - guint n_rules; - GList *rules; -}; - -G_END_DECLS - -GstASMRuleBook* gst_asm_rule_book_new (const gchar *rulebook); -void gst_asm_rule_book_free (GstASMRuleBook *book); - -gint gst_asm_rule_book_match (GstASMRuleBook *book, GHashTable *vars, - gint *rulematches); - -#endif /* __GST_ASM_RULES_H__ */
View file
gst-plugins-ugly-1.22.7.tar.xz/gst/realmedia/gstrdtbuffer.c
Deleted
@@ -1,477 +0,0 @@ -/* GStreamer - * Copyright (C) <2008> Wim Taymans <wim.taymans@gmail.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ -#include <string.h> - -#include "gstrdtbuffer.h" - -gboolean -gst_rdt_buffer_validate_data (guint8 * data, guint len) -{ - return TRUE; -} - -gboolean -gst_rdt_buffer_validate (GstBuffer * buffer) -{ - return TRUE; -} - -guint -gst_rdt_buffer_get_packet_count (GstBuffer * buffer) -{ - GstRDTPacket packet; - guint count; - - g_return_val_if_fail (GST_IS_BUFFER (buffer), 0); - - count = 0; - if (gst_rdt_buffer_get_first_packet (buffer, &packet)) { - do { - count++; - } while (gst_rdt_packet_move_to_next (&packet)); - } - return count; -} - -static gboolean -read_packet_header (GstRDTPacket * packet) -{ - GstMapInfo map; - guint8 *data; - gsize size; - guint offset; - guint length; - guint length_offset; - - g_return_val_if_fail (packet != NULL, FALSE); - g_return_val_if_fail (GST_IS_BUFFER (packet->buffer), FALSE); - - gst_buffer_map (packet->buffer, &map, GST_MAP_READ); - data = map.data; - size = map.size; - - offset = packet->offset; - - /* check if we are at the end of the buffer, we add 3 because we also want to - * ensure we can read the type, which is always at offset 1 and 2 bytes long. */ - if (offset + 3 > size) - goto packet_end; - - /* read type */ - packet->type = GST_READ_UINT16_BE (&dataoffset + 1); - - length = -1; - length_offset = -1; - - /* figure out the length of the packet, this depends on the type */ - if (GST_RDT_IS_DATA_TYPE (packet->type)) { - if (dataoffset & 0x80) - /* length is present */ - length_offset = 3; - } else { - switch (packet->type) { - case GST_RDT_TYPE_ASMACTION: - if (dataoffset & 0x80) - length_offset = 5; - break; - case GST_RDT_TYPE_BWREPORT: - if (dataoffset & 0x80) - length_offset = 3; - break; - case GST_RDT_TYPE_ACK: - if (dataoffset & 0x80) - length_offset = 3; - break; - case GST_RDT_TYPE_RTTREQ: - length = 3; - break; - case GST_RDT_TYPE_RTTRESP: - length = 11; - break; - case GST_RDT_TYPE_CONGESTION: - length = 11; - break; - case GST_RDT_TYPE_STREAMEND: - length = 9; - /* total_reliable */ - if (dataoffset & 0x80) - length += 2; - /* stream_id_expansion */ - if ((dataoffset & 0x7c) == 0x7c) - length += 2; - /* ext_flag, FIXME, get string length */ - if ((dataoffset & 0x1) == 0x1) - length += 7; - break; - case GST_RDT_TYPE_REPORT: - if (dataoffset & 0x80) - length_offset = 3; - break; - case GST_RDT_TYPE_LATENCY: - if (dataoffset & 0x80) - length_offset = 3; - break; - case GST_RDT_TYPE_INFOREQ: - length = 3; - /* request_time_ms */ - if (dataoffset & 0x2) - length += 2; - break; - case GST_RDT_TYPE_INFORESP: - length = 3; - /* has_rtt_info */ - if (dataoffset & 0x4) { - length += 4; - /* is_delayed */ - if (dataoffset & 0x2) { - length += 4; - } - } - if (dataoffset & 0x1) { - /* buffer_info_count, FIXME read and skip */ - length += 2; - } - break; - case GST_RDT_TYPE_AUTOBW: - if (dataoffset & 0x80) - length_offset = 3; - break; - case GST_RDT_TYPE_INVALID: - default: - goto unknown_packet; - } - } - - if (length != -1) { - /* we have a fixed length */ - packet->length = length; - } else if (length_offset != -1) { - /* we can read the length from an offset */ - packet->length = GST_READ_UINT16_BE (&datalength_offset); - } else { - /* length is remainder of packet */ - packet->length = size - offset; - } - gst_buffer_unmap (packet->buffer, &map); - - /* the length should be smaller than the remaining size */ - if (packet->length + offset > size) - goto invalid_length; - - return TRUE; - - /* ERRORS */ -packet_end: - { - gst_buffer_unmap (packet->buffer, &map); - return FALSE; - } -unknown_packet: - { - packet->type = GST_RDT_TYPE_INVALID; - gst_buffer_unmap (packet->buffer, &map); - return FALSE; - } -invalid_length: - { - packet->type = GST_RDT_TYPE_INVALID; - packet->length = 0; - return FALSE; - } -} - -gboolean -gst_rdt_buffer_get_first_packet (GstBuffer * buffer, GstRDTPacket * packet) -{ - g_return_val_if_fail (GST_IS_BUFFER (buffer), FALSE); - g_return_val_if_fail (packet != NULL, FALSE); - - /* init to 0 */ - packet->buffer = buffer; - packet->offset = 0; - packet->type = GST_RDT_TYPE_INVALID; - memset (&packet->map, 0, sizeof (GstMapInfo)); - - if (!read_packet_header (packet)) - return FALSE; - - return TRUE; -} - -gboolean -gst_rdt_packet_move_to_next (GstRDTPacket * packet) -{ - g_return_val_if_fail (packet != NULL, FALSE); - g_return_val_if_fail (packet->type != GST_RDT_TYPE_INVALID, FALSE); - g_return_val_if_fail (GST_IS_BUFFER (packet->buffer), FALSE); - - /* if we have an invalid packet, it must be the last, - * return FALSE */ - if (packet->type == GST_RDT_TYPE_INVALID) - goto end; - - /* move to next packet */ - packet->offset += packet->length; - - /* try to read new header */ - if (!read_packet_header (packet)) - goto end; - - return TRUE; - - /* ERRORS */ -end: - { - packet->type = GST_RDT_TYPE_INVALID; - return FALSE; - } -} - -GstRDTType -gst_rdt_packet_get_type (GstRDTPacket * packet) -{ - g_return_val_if_fail (packet != NULL, GST_RDT_TYPE_INVALID); - g_return_val_if_fail (packet->type != GST_RDT_TYPE_INVALID, - GST_RDT_TYPE_INVALID); - - return packet->type; -} - -guint16 -gst_rdt_packet_get_length (GstRDTPacket * packet) -{ - g_return_val_if_fail (packet != NULL, 0); - g_return_val_if_fail (packet->type != GST_RDT_TYPE_INVALID, 0); - - return packet->length; -} - -GstBuffer * -gst_rdt_packet_to_buffer (GstRDTPacket * packet) -{ - GstBuffer *result; - - g_return_val_if_fail (packet != NULL, NULL); - g_return_val_if_fail (packet->type != GST_RDT_TYPE_INVALID, NULL); - - result = - gst_buffer_copy_region (packet->buffer, GST_BUFFER_COPY_ALL, - packet->offset, packet->length); - /* timestamp applies to all packets in this buffer */ - GST_BUFFER_TIMESTAMP (result) = GST_BUFFER_TIMESTAMP (packet->buffer); - - return result; -} - -gint -gst_rdt_buffer_compare_seqnum (guint16 seqnum1, guint16 seqnum2) -{ - return (gint16) (seqnum2 - seqnum1); -} - -guint16 -gst_rdt_packet_data_get_seq (GstRDTPacket * packet) -{ - GstMapInfo map; - guint header; - guint16 result; - - g_return_val_if_fail (packet != NULL, FALSE); - g_return_val_if_fail (GST_RDT_IS_DATA_TYPE (packet->type), FALSE); - - gst_buffer_map (packet->buffer, &map, GST_MAP_READ); - - /* skip header bits */ - header = packet->offset + 1; - - /* read seq_no */ - result = GST_READ_UINT16_BE (&map.dataheader); - - gst_buffer_unmap (packet->buffer, &map); - - return result; -} - -guint8 * -gst_rdt_packet_data_map (GstRDTPacket * packet, guint * size) -{ - GstMapInfo map; - guint header; - gboolean length_included_flag; - gboolean need_reliable_flag; - guint8 stream_id; - guint8 asm_rule_number; - - g_return_val_if_fail (packet != NULL, NULL); - g_return_val_if_fail (packet->map.data == NULL, NULL); - g_return_val_if_fail (GST_RDT_IS_DATA_TYPE (packet->type), NULL); - - gst_buffer_map (packet->buffer, &map, GST_MAP_READ); - - header = packet->offset; - - length_included_flag = (map.dataheader & 0x80) == 0x80; - need_reliable_flag = (map.dataheader & 0x40) == 0x40; - stream_id = (map.dataheader & 0x3e) >> 1; - - /* skip seq_no and header bits */ - header += 3; - - if (length_included_flag) { - /* skip length */ - header += 2; - } - asm_rule_number = (map.dataheader & 0x3f); - - /* skip timestamp and asm_rule_number */ - header += 5; - - if (stream_id == 0x1f) { - /* skip stream_id_expansion */ - header += 2; - } - if (need_reliable_flag) { - /* skip total_reliable */ - header += 2; - } - if (asm_rule_number == 63) { - /* skip asm_rule_number_expansion */ - header += 2; - } - - if (size) - *size = packet->length - (header - packet->offset); - - packet->map = map; - - return &map.dataheader; -} - -gboolean -gst_rdt_packet_data_unmap (GstRDTPacket * packet) -{ - g_return_val_if_fail (packet != NULL, FALSE); - g_return_val_if_fail (packet->map.data != NULL, FALSE); - - gst_buffer_unmap (packet->buffer, &packet->map); - packet->map.data = NULL; - - return TRUE; -} - -guint16 -gst_rdt_packet_data_get_stream_id (GstRDTPacket * packet) -{ - GstMapInfo map; - guint16 result; - guint header; - gboolean length_included_flag; - - g_return_val_if_fail (packet != NULL, 0); - g_return_val_if_fail (GST_RDT_IS_DATA_TYPE (packet->type), 0); - - gst_buffer_map (packet->buffer, &map, GST_MAP_READ); - - header = packet->offset; - - length_included_flag = (map.dataheader & 0x80) == 0x80; - result = (map.dataheader & 0x3e) >> 1; - if (result == 31) { - /* skip seq_no and header bits */ - header += 3; - - if (length_included_flag) { - /* skip length */ - header += 2; - } - /* skip asm_rule_number and timestamp */ - header += 5; - - /* stream_id_expansion */ - result = GST_READ_UINT16_BE (&map.dataheader); - } - gst_buffer_unmap (packet->buffer, &map); - - return result; -} - -guint32 -gst_rdt_packet_data_get_timestamp (GstRDTPacket * packet) -{ - GstMapInfo map; - guint header; - gboolean length_included_flag; - guint32 result; - - g_return_val_if_fail (packet != NULL, 0); - g_return_val_if_fail (GST_RDT_IS_DATA_TYPE (packet->type), 0); - - gst_buffer_map (packet->buffer, &map, GST_MAP_READ); - - header = packet->offset; - - length_included_flag = (map.dataheader & 0x80) == 0x80; - - /* skip seq_no and header bits */ - header += 3; - - if (length_included_flag) { - /* skip length */ - header += 2; - } - /* skip asm_rule_number */ - header += 1; - - /* get timestamp */ - result = GST_READ_UINT32_BE (&map.dataheader); - gst_buffer_unmap (packet->buffer, &map); - - return result; -} - -guint8 -gst_rdt_packet_data_get_flags (GstRDTPacket * packet) -{ - GstMapInfo map; - guint8 result; - guint header; - gboolean length_included_flag; - - g_return_val_if_fail (packet != NULL, 0); - g_return_val_if_fail (GST_RDT_IS_DATA_TYPE (packet->type), 0); - - gst_buffer_map (packet->buffer, &map, GST_MAP_READ); - - header = packet->offset; - - length_included_flag = (map.dataheader & 0x80) == 0x80; - - /* skip seq_no and header bits */ - header += 3; - - if (length_included_flag) { - /* skip length */ - header += 2; - } - /* get flags */ - result = map.dataheader; - gst_buffer_unmap (packet->buffer, &map); - - return result; -}
View file
gst-plugins-ugly-1.22.7.tar.xz/gst/realmedia/gstrdtbuffer.h
Deleted
@@ -1,121 +0,0 @@ -/* GStreamer - * Copyright (C) <2008> Wim Taymans <wim.taymans@gmail.com> - * - * gstrdtbuffer.h: various helper functions to manipulate buffers - * with RDT payload. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifndef __GST_RDTBUFFER_H__ -#define __GST_RDTBUFFER_H__ - -#include <gst/gst.h> - -G_BEGIN_DECLS -/** - * GstRDTType: - * @GST_RDT_TYPE_INVALID: - * @GST_RDT_TYPE_ASMACTION: - * @GST_RDT_TYPE_ACK: - * @GST_RDT_TYPE_RTTREQ: - * @GST_RDT_TYPE_RTTRESP: - * @GST_RDT_TYPE_CONGESTION: - * @GST_RDT_TYPE_STREAMEND: - * @GST_RDT_TYPE_LATENCY: - * @GST_RDT_TYPE_INFOREQ: - * @GST_RDT_TYPE_INFORESP: - * @GST_RDT_TYPE_AUTOBW: - * - * Different RDT packet types. - */ -typedef enum -{ - GST_RDT_TYPE_INVALID = 0xffff, - GST_RDT_TYPE_ASMACTION = 0xff00, - GST_RDT_TYPE_BWREPORT = 0xff01, - GST_RDT_TYPE_ACK = 0xff02, - GST_RDT_TYPE_RTTREQ = 0xff03, - GST_RDT_TYPE_RTTRESP = 0xff04, - GST_RDT_TYPE_CONGESTION = 0xff05, - GST_RDT_TYPE_STREAMEND = 0xff06, - GST_RDT_TYPE_REPORT = 0xff07, - GST_RDT_TYPE_LATENCY = 0xff08, - GST_RDT_TYPE_INFOREQ = 0xff09, - GST_RDT_TYPE_INFORESP = 0xff0a, - GST_RDT_TYPE_AUTOBW = 0xff0b -} GstRDTType; - -/** - * GST_RDT_IS_DATA_TYPE: - * @t: the #GstRDTType to check - * - * Check if @t is a data packet type. - */ -#define GST_RDT_IS_DATA_TYPE(t) ((t) < 0xff00) - -typedef struct _GstRDTPacket GstRDTPacket; - -/** - * GstRDTPacket: - * @buffer: pointer to RDT buffer - * @offset: offset of packet in buffer data - * - * Data structure that points to a packet at @offset in @buffer. - * The size of the structure is made public to allow stack allocations. - */ -struct _GstRDTPacket -{ - GstBuffer *buffer; - guint offset; - - /*< private >*/ - GstRDTType type; /* type of current packet */ - guint16 length; /* length of current packet in bytes */ - GstMapInfo map; /* last mapped data */ -}; - -/* validate buffers */ -gboolean gst_rdt_buffer_validate_data (guint8 *data, guint len); -gboolean gst_rdt_buffer_validate (GstBuffer *buffer); - -/* retrieving packets */ -guint gst_rdt_buffer_get_packet_count (GstBuffer *buffer); -gboolean gst_rdt_buffer_get_first_packet (GstBuffer *buffer, GstRDTPacket *packet); -gboolean gst_rdt_packet_move_to_next (GstRDTPacket *packet); - -/* working with packets */ -GstRDTType gst_rdt_packet_get_type (GstRDTPacket *packet); -guint16 gst_rdt_packet_get_length (GstRDTPacket *packet); -GstBuffer* gst_rdt_packet_to_buffer (GstRDTPacket *packet); - - -/* data packets */ -guint16 gst_rdt_packet_data_get_seq (GstRDTPacket *packet); -guint8 * gst_rdt_packet_data_map (GstRDTPacket *packet, guint *size); -gboolean gst_rdt_packet_data_unmap (GstRDTPacket *packet); -guint16 gst_rdt_packet_data_get_stream_id (GstRDTPacket *packet); -guint32 gst_rdt_packet_data_get_timestamp (GstRDTPacket *packet); - -guint8 gst_rdt_packet_data_get_flags (GstRDTPacket * packet); - -/* utils */ -gint gst_rdt_buffer_compare_seqnum (guint16 seqnum1, guint16 seqnum2); - -G_END_DECLS - -#endif /* __GST_RDTBUFFER_H__ */ -
View file
gst-plugins-ugly-1.22.7.tar.xz/gst/realmedia/rdtdepay.c
Deleted
@@ -1,496 +0,0 @@ -/* GStreamer - * Copyright (C) <2006> Lutz Mueller <lutz at topfrose dot de> - * <2006> Wim Taymans <wim@fluendo.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include <string.h> - -#include "gstrdtbuffer.h" -#include "rdtdepay.h" - -GST_DEBUG_CATEGORY_STATIC (rdtdepay_debug); -#define GST_CAT_DEFAULT rdtdepay_debug - -/* RDTDepay signals and args */ -enum -{ - /* FILL ME */ - LAST_SIGNAL -}; - -enum -{ - PROP_0, -}; - -static GstStaticPadTemplate gst_rdt_depay_src_template = -GST_STATIC_PAD_TEMPLATE ("src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ("application/vnd.rn-realmedia") - ); - -static GstStaticPadTemplate gst_rdt_depay_sink_template = -GST_STATIC_PAD_TEMPLATE ("sink", - GST_PAD_SINK, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ("application/x-rdt, " - "media = (string) \"application\", " - "clock-rate = (int) 1, MAX , " - "encoding-name = (string) \"X-REAL-RDT\"" - /* All optional parameters - * - * "config=" - */ - ) - ); - -#define gst_rdt_depay_parent_class parent_class -G_DEFINE_TYPE (GstRDTDepay, gst_rdt_depay, GST_TYPE_ELEMENT); -GST_ELEMENT_REGISTER_DEFINE (rdtdepay, "rdtdepay", - GST_RANK_MARGINAL, GST_TYPE_RDT_DEPAY); - -static void gst_rdt_depay_finalize (GObject * object); - -static GstStateChangeReturn gst_rdt_depay_change_state (GstElement * - element, GstStateChange transition); - -static gboolean gst_rdt_depay_sink_event (GstPad * pad, GstObject * parent, - GstEvent * event); -static GstFlowReturn gst_rdt_depay_chain (GstPad * pad, GstObject * parent, - GstBuffer * buf); - -static void -gst_rdt_depay_class_init (GstRDTDepayClass * klass) -{ - GObjectClass *gobject_class; - GstElementClass *gstelement_class; - - gobject_class = (GObjectClass *) klass; - gstelement_class = (GstElementClass *) klass; - - parent_class = g_type_class_peek_parent (klass); - - gobject_class->finalize = gst_rdt_depay_finalize; - - gstelement_class->change_state = gst_rdt_depay_change_state; - - gst_element_class_add_static_pad_template (gstelement_class, - &gst_rdt_depay_src_template); - gst_element_class_add_static_pad_template (gstelement_class, - &gst_rdt_depay_sink_template); - - gst_element_class_set_static_metadata (gstelement_class, "RDT packet parser", - "Codec/Depayloader/Network", - "Extracts RealMedia from RDT packets", - "Lutz Mueller <lutz at topfrose dot de>, " - "Wim Taymans <wim@fluendo.com>"); - - GST_DEBUG_CATEGORY_INIT (rdtdepay_debug, "rdtdepay", - 0, "Depayloader for RDT RealMedia packets"); -} - -static void -gst_rdt_depay_init (GstRDTDepay * rdtdepay) -{ - rdtdepay->sinkpad = - gst_pad_new_from_static_template (&gst_rdt_depay_sink_template, "sink"); - gst_pad_set_chain_function (rdtdepay->sinkpad, gst_rdt_depay_chain); - gst_pad_set_event_function (rdtdepay->sinkpad, gst_rdt_depay_sink_event); - gst_element_add_pad (GST_ELEMENT_CAST (rdtdepay), rdtdepay->sinkpad); - - rdtdepay->srcpad = - gst_pad_new_from_static_template (&gst_rdt_depay_src_template, "src"); - gst_element_add_pad (GST_ELEMENT_CAST (rdtdepay), rdtdepay->srcpad); -} - -static void -gst_rdt_depay_finalize (GObject * object) -{ - GstRDTDepay *rdtdepay; - - rdtdepay = GST_RDT_DEPAY (object); - - if (rdtdepay->header) - gst_buffer_unref (rdtdepay->header); - - G_OBJECT_CLASS (parent_class)->finalize (object); -} - -static gboolean -gst_rdt_depay_setcaps (GstPad * pad, GstCaps * caps) -{ - GstStructure *structure; - GstRDTDepay *rdtdepay; - GstCaps *srccaps; - gint clock_rate = 1000; /* default */ - const GValue *value; - GstBuffer *header; - - rdtdepay = GST_RDT_DEPAY (GST_PAD_PARENT (pad)); - - structure = gst_caps_get_structure (caps, 0); - - if (gst_structure_has_field (structure, "clock-rate")) - gst_structure_get_int (structure, "clock-rate", &clock_rate); - - /* config contains the RealMedia header as a buffer. */ - value = gst_structure_get_value (structure, "config"); - if (!value) - goto no_header; - - header = gst_value_get_buffer (value); - if (!header) - goto no_header; - - /* get other values for newsegment */ - value = gst_structure_get_value (structure, "npt-start"); - if (value && G_VALUE_HOLDS_UINT64 (value)) - rdtdepay->npt_start = g_value_get_uint64 (value); - else - rdtdepay->npt_start = 0; - GST_DEBUG_OBJECT (rdtdepay, "NPT start %" G_GUINT64_FORMAT, - rdtdepay->npt_start); - - value = gst_structure_get_value (structure, "npt-stop"); - if (value && G_VALUE_HOLDS_UINT64 (value)) - rdtdepay->npt_stop = g_value_get_uint64 (value); - else - rdtdepay->npt_stop = -1; - - GST_DEBUG_OBJECT (rdtdepay, "NPT stop %" G_GUINT64_FORMAT, - rdtdepay->npt_stop); - - value = gst_structure_get_value (structure, "play-speed"); - if (value && G_VALUE_HOLDS_DOUBLE (value)) - rdtdepay->play_speed = g_value_get_double (value); - else - rdtdepay->play_speed = 1.0; - - value = gst_structure_get_value (structure, "play-scale"); - if (value && G_VALUE_HOLDS_DOUBLE (value)) - rdtdepay->play_scale = g_value_get_double (value); - else - rdtdepay->play_scale = 1.0; - - /* caps seem good, configure element */ - rdtdepay->clock_rate = clock_rate; - - /* set caps on pad and on header */ - srccaps = gst_caps_new_empty_simple ("application/vnd.rn-realmedia"); - gst_pad_set_caps (rdtdepay->srcpad, srccaps); - gst_caps_unref (srccaps); - - if (rdtdepay->header) - gst_buffer_unref (rdtdepay->header); - rdtdepay->header = gst_buffer_ref (header); - - return TRUE; - - /* ERRORS */ -no_header: - { - GST_ERROR_OBJECT (rdtdepay, "no header found in caps, no 'config' field"); - return FALSE; - } -} - -static gboolean -gst_rdt_depay_sink_event (GstPad * pad, GstObject * parent, GstEvent * event) -{ - GstRDTDepay *depay; - gboolean res = TRUE; - - depay = GST_RDT_DEPAY (parent); - - switch (GST_EVENT_TYPE (event)) { - case GST_EVENT_CAPS: - { - GstCaps *caps; - - gst_event_parse_caps (event, &caps); - res = gst_rdt_depay_setcaps (pad, caps); - gst_event_unref (event); - break; - } - case GST_EVENT_FLUSH_STOP: - res = gst_pad_push_event (depay->srcpad, event); - - gst_segment_init (&depay->segment, GST_FORMAT_UNDEFINED); - depay->need_newsegment = TRUE; - depay->next_seqnum = -1; - break; - case GST_EVENT_SEGMENT: - { - gst_event_copy_segment (event, &depay->segment); - /* don't pass the event downstream, we generate our own segment - * including the NTP time and other things we receive in caps */ - gst_event_unref (event); - break; - } - default: - /* pass other events forward */ - res = gst_pad_push_event (depay->srcpad, event); - break; - } - return res; -} - -static GstEvent * -create_segment_event (GstRDTDepay * depay, gboolean update, - GstClockTime position) -{ - GstSegment segment; - - gst_segment_init (&segment, GST_FORMAT_TIME); - segment.rate = depay->play_speed; - segment.applied_rate = depay->play_scale; - segment.start = position; - - if (depay->npt_stop != -1) - segment.stop = depay->npt_stop - depay->npt_start; - else - segment.stop = -1; - - segment.time = position + depay->npt_start; - - return gst_event_new_segment (&segment); -} - -static GstFlowReturn -gst_rdt_depay_push (GstRDTDepay * rdtdepay, GstBuffer * buffer) -{ - GstFlowReturn ret; - - if (rdtdepay->need_newsegment) { - GstEvent *event; - - event = create_segment_event (rdtdepay, FALSE, 0); - gst_pad_push_event (rdtdepay->srcpad, event); - - rdtdepay->need_newsegment = FALSE; - } - - if (rdtdepay->discont) { - GST_BUFFER_FLAG_SET (buffer, GST_BUFFER_FLAG_DISCONT); - rdtdepay->discont = FALSE; - } - ret = gst_pad_push (rdtdepay->srcpad, buffer); - - return ret; -} - -static GstFlowReturn -gst_rdt_depay_handle_data (GstRDTDepay * rdtdepay, GstClockTime outtime, - GstRDTPacket * packet) -{ - GstFlowReturn ret; - GstBuffer *outbuf; - GstMapInfo outmap; - guint8 *data, *outdata; - guint size; - guint16 stream_id; - guint32 timestamp; - gint gap; - guint16 seqnum; - guint8 flags; - guint16 outflags; - - /* get pointers to the packet data */ - data = gst_rdt_packet_data_map (packet, &size); - - outbuf = gst_buffer_new_and_alloc (12 + size); - GST_BUFFER_TIMESTAMP (outbuf) = outtime; - - GST_DEBUG_OBJECT (rdtdepay, "have size %u", size); - - /* copy over some things */ - stream_id = gst_rdt_packet_data_get_stream_id (packet); - timestamp = gst_rdt_packet_data_get_timestamp (packet); - flags = gst_rdt_packet_data_get_flags (packet); - - seqnum = gst_rdt_packet_data_get_seq (packet); - - GST_DEBUG_OBJECT (rdtdepay, "stream_id %u, timestamp %u, seqnum %d, flags %d", - stream_id, timestamp, seqnum, flags); - - if (rdtdepay->next_seqnum != -1) { - gap = gst_rdt_buffer_compare_seqnum (seqnum, rdtdepay->next_seqnum); - - /* if we have no gap, all is fine */ - if (G_UNLIKELY (gap != 0)) { - GST_LOG_OBJECT (rdtdepay, "got packet %u, expected %u, gap %d", seqnum, - rdtdepay->next_seqnum, gap); - if (gap < 0) { - /* seqnum > next_seqnum, we are missing some packets, this is always a - * DISCONT. */ - GST_LOG_OBJECT (rdtdepay, "%d missing packets", gap); - rdtdepay->discont = TRUE; - } else { - /* seqnum < next_seqnum, we have seen this packet before or the sender - * could be restarted. If the packet is not too old, we throw it away as - * a duplicate, otherwise we mark discont and continue. 100 misordered - * packets is a good threshold. See also RFC 4737. */ - if (gap < 100) - goto dropping; - - GST_LOG_OBJECT (rdtdepay, - "%d > 100, packet too old, sender likely restarted", gap); - rdtdepay->discont = TRUE; - } - } - } - rdtdepay->next_seqnum = (seqnum + 1); - if (rdtdepay->next_seqnum == 0xff00) - rdtdepay->next_seqnum = 0; - - if ((flags & 1) == 0) - outflags = 2; - else - outflags = 0; - - gst_buffer_map (outbuf, &outmap, GST_MAP_WRITE); - outdata = outmap.data; - GST_WRITE_UINT16_BE (outdata + 0, 0); /* version */ - GST_WRITE_UINT16_BE (outdata + 2, size + 12); /* length */ - GST_WRITE_UINT16_BE (outdata + 4, stream_id); /* stream */ - GST_WRITE_UINT32_BE (outdata + 6, timestamp); /* timestamp */ - GST_WRITE_UINT16_BE (outdata + 10, outflags); /* flags */ - memcpy (outdata + 12, data, size); - gst_buffer_unmap (outbuf, &outmap); - gst_buffer_resize (outbuf, 0, 12 + size); - - gst_rdt_packet_data_unmap (packet); - - GST_DEBUG_OBJECT (rdtdepay, "Pushing packet, outtime %" GST_TIME_FORMAT, - GST_TIME_ARGS (outtime)); - - ret = gst_rdt_depay_push (rdtdepay, outbuf); - - return ret; - - /* ERRORS */ -dropping: - { - GST_WARNING_OBJECT (rdtdepay, "%d <= 100, dropping old packet", gap); - return GST_FLOW_OK; - } -} - -static GstFlowReturn -gst_rdt_depay_chain (GstPad * pad, GstObject * parent, GstBuffer * buf) -{ - GstRDTDepay *rdtdepay; - GstFlowReturn ret; - GstClockTime timestamp; - gboolean more; - GstRDTPacket packet; - - rdtdepay = GST_RDT_DEPAY (parent); - - if (GST_BUFFER_IS_DISCONT (buf)) { - GST_LOG_OBJECT (rdtdepay, "received discont"); - rdtdepay->discont = TRUE; - } - - if (rdtdepay->header) { - GstBuffer *out; - - out = rdtdepay->header; - rdtdepay->header = NULL; - - /* push header data first */ - gst_rdt_depay_push (rdtdepay, out); - } - - /* save timestamp */ - timestamp = GST_BUFFER_TIMESTAMP (buf); - - ret = GST_FLOW_OK; - - GST_LOG_OBJECT (rdtdepay, "received buffer timestamp %" GST_TIME_FORMAT, - GST_TIME_ARGS (timestamp)); - - /* data is in RDT format. */ - more = gst_rdt_buffer_get_first_packet (buf, &packet); - while (more) { - GstRDTType type; - - type = gst_rdt_packet_get_type (&packet); - GST_DEBUG_OBJECT (rdtdepay, "Have packet of type %04x", type); - - if (GST_RDT_IS_DATA_TYPE (type)) { - GST_DEBUG_OBJECT (rdtdepay, "We have a data packet"); - ret = gst_rdt_depay_handle_data (rdtdepay, timestamp, &packet); - } else { - switch (type) { - default: - GST_DEBUG_OBJECT (rdtdepay, "Ignoring packet"); - break; - } - } - if (ret != GST_FLOW_OK) - break; - - more = gst_rdt_packet_move_to_next (&packet); - } - - gst_buffer_unref (buf); - - return ret; -} - -static GstStateChangeReturn -gst_rdt_depay_change_state (GstElement * element, GstStateChange transition) -{ - GstRDTDepay *rdtdepay; - GstStateChangeReturn ret; - - rdtdepay = GST_RDT_DEPAY (element); - - switch (transition) { - case GST_STATE_CHANGE_NULL_TO_READY: - break; - case GST_STATE_CHANGE_READY_TO_PAUSED: - gst_segment_init (&rdtdepay->segment, GST_FORMAT_UNDEFINED); - rdtdepay->next_seqnum = -1; - rdtdepay->need_newsegment = TRUE; - break; - default: - break; - } - - ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); - - switch (transition) { - case GST_STATE_CHANGE_PAUSED_TO_READY: - if (rdtdepay->header) - gst_buffer_unref (rdtdepay->header); - rdtdepay->header = NULL; - break; - case GST_STATE_CHANGE_READY_TO_NULL: - break; - default: - break; - } - return ret; -}
View file
gst-plugins-ugly-1.22.7.tar.xz/gst/realmedia/rdtdepay.h
Deleted
@@ -1,74 +0,0 @@ -/* GStreamer - * Copyright (C) <2006> Lutz Mueller <lutz at topfrose dot de> - * <2006> Wim Taymans <wim@fluendo.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifndef __GST_RDT_DEPAY_H__ -#define __GST_RDT_DEPAY_H__ - -#include <gst/gst.h> - -G_BEGIN_DECLS - -#define GST_TYPE_RDT_DEPAY \ - (gst_rdt_depay_get_type()) -#define GST_RDT_DEPAY(obj) \ - (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RDT_DEPAY,GstRDTDepay)) -#define GST_RDT_DEPAY_CLASS(klass) \ - (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RDT_DEPAY,GstRDTDepayClass)) -#define GST_IS_RDT_DEPAY(obj) \ - (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RDT_DEPAY)) -#define GST_IS_RDT_DEPAY_CLASS(klass) \ - (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RDT_DEPAY)) - -typedef struct _GstRDTDepay GstRDTDepay; -typedef struct _GstRDTDepayClass GstRDTDepayClass; - -struct _GstRDTDepay -{ - GstElement parent; - - GstPad *sinkpad; - GstPad *srcpad; - - guint clock_rate; - GstClockTime npt_start; - GstClockTime npt_stop; - gdouble play_speed; - gdouble play_scale; - - guint32 next_seqnum; - - gboolean discont; - gboolean need_newsegment; - GstSegment segment; - GstBuffer *header; -}; - -struct _GstRDTDepayClass -{ - GstElementClass parent_class; -}; - -GType gst_rdt_depay_get_type (void); - -GST_ELEMENT_REGISTER_DECLARE (rdtdepay); - -G_END_DECLS - -#endif /* __GST_RDT_DEPAY_H__ */
View file
gst-plugins-ugly-1.22.7.tar.xz/gst/realmedia/rdtjitterbuffer.c
Deleted
@@ -1,531 +0,0 @@ -/* GStreamer - * Copyright (C) <2007> Wim Taymans <wim.taymans@gmail.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ -#include <string.h> -#include <stdlib.h> - -#include "rdtjitterbuffer.h" -#include "gstrdtbuffer.h" - -GST_DEBUG_CATEGORY_STATIC (rdt_jitter_buffer_debug); -#define GST_CAT_DEFAULT rdt_jitter_buffer_debug - -#define MAX_WINDOW RDT_JITTER_BUFFER_MAX_WINDOW -#define MAX_TIME (2 * GST_SECOND) - -/* signals and args */ -enum -{ - LAST_SIGNAL -}; - -enum -{ - PROP_0 -}; - -/* GObject vmethods */ -static void rdt_jitter_buffer_finalize (GObject * object); - -/* static guint rdt_jitter_buffer_signalsLAST_SIGNAL = { 0 }; */ - -G_DEFINE_TYPE (RDTJitterBuffer, rdt_jitter_buffer, G_TYPE_OBJECT); - -static void -rdt_jitter_buffer_class_init (RDTJitterBufferClass * klass) -{ - GObjectClass *gobject_class; - - gobject_class = (GObjectClass *) klass; - - gobject_class->finalize = rdt_jitter_buffer_finalize; - - GST_DEBUG_CATEGORY_INIT (rdt_jitter_buffer_debug, "rdtjitterbuffer", 0, - "RDT Jitter Buffer"); -} - -static void -rdt_jitter_buffer_init (RDTJitterBuffer * jbuf) -{ - jbuf->packets = g_queue_new (); - - rdt_jitter_buffer_reset_skew (jbuf); -} - -static void -rdt_jitter_buffer_finalize (GObject * object) -{ - RDTJitterBuffer *jbuf; - - jbuf = RDT_JITTER_BUFFER_CAST (object); - - rdt_jitter_buffer_flush (jbuf); - g_queue_free (jbuf->packets); - - G_OBJECT_CLASS (rdt_jitter_buffer_parent_class)->finalize (object); -} - -/** - * rdt_jitter_buffer_new: - * - * Create an #RDTJitterBuffer. - * - * Returns: a new #RDTJitterBuffer. Use g_object_unref() after usage. - */ -RDTJitterBuffer * -rdt_jitter_buffer_new (void) -{ - RDTJitterBuffer *jbuf; - - jbuf = g_object_new (RDT_TYPE_JITTER_BUFFER, NULL); - - return jbuf; -} - -void -rdt_jitter_buffer_reset_skew (RDTJitterBuffer * jbuf) -{ - jbuf->base_time = -1; - jbuf->base_rtptime = -1; - jbuf->ext_rtptime = -1; - jbuf->window_pos = 0; - jbuf->window_filling = TRUE; - jbuf->window_min = 0; - jbuf->skew = 0; - jbuf->prev_send_diff = -1; -} - -/* For the clock skew we use a windowed low point averaging algorithm as can be - * found in http://www.grame.fr/pub/TR-050601.pdf. The idea is that the jitter is - * composed of: - * - * J = N + n - * - * N : a constant network delay. - * n : random added noise. The noise is concentrated around 0 - * - * In the receiver we can track the elapsed time at the sender with: - * - * send_diff(i) = (Tsi - Ts0); - * - * Tsi : The time at the sender at packet i - * Ts0 : The time at the sender at the first packet - * - * This is the difference between the RDT timestamp in the first received packet - * and the current packet. - * - * At the receiver we have to deal with the jitter introduced by the network. - * - * recv_diff(i) = (Tri - Tr0) - * - * Tri : The time at the receiver at packet i - * Tr0 : The time at the receiver at the first packet - * - * Both of these values contain a jitter Ji, a jitter for packet i, so we can - * write: - * - * recv_diff(i) = (Cri + D + ni) - (Cr0 + D + n0)) - * - * Cri : The time of the clock at the receiver for packet i - * D + ni : The jitter when receiving packet i - * - * We see that the network delay is irrelevant here as we can eliminate D: - * - * recv_diff(i) = (Cri + ni) - (Cr0 + n0)) - * - * The drift is now expressed as: - * - * Drift(i) = recv_diff(i) - send_diff(i); - * - * We now keep the W latest values of Drift and find the minimum (this is the - * one with the lowest network jitter and thus the one which is least affected - * by it). We average this lowest value to smooth out the resulting network skew. - * - * Both the window and the weighting used for averaging influence the accuracy - * of the drift estimation. Finding the correct parameters turns out to be a - * compromise between accuracy and inertia. - * - * We use a 2 second window or up to 512 data points, which is statistically big - * enough to catch spikes (FIXME, detect spikes). - * We also use a rather large weighting factor (125) to smoothly adapt. During - * startup, when filling the window, we use a parabolic weighting factor, the - * more the window is filled, the faster we move to the detected possible skew. - * - * Returns: @time adjusted with the clock skew. - */ -static GstClockTime -calculate_skew (RDTJitterBuffer * jbuf, guint32 rtptime, GstClockTime time, - guint32 clock_rate) -{ - guint64 ext_rtptime; - guint64 send_diff, recv_diff; - gint64 delta; - gint64 old; - gint pos, i; - GstClockTime gstrtptime, out_time; - - //ext_rtptime = gst_rtp_buffer_ext_timestamp (&jbuf->ext_rtptime, rtptime); - ext_rtptime = rtptime; - - gstrtptime = gst_util_uint64_scale_int (ext_rtptime, GST_SECOND, clock_rate); - -again: - /* first time, lock on to time and gstrtptime */ - if (jbuf->base_time == -1) - jbuf->base_time = time; - if (jbuf->base_rtptime == -1) - jbuf->base_rtptime = gstrtptime; - - if (gstrtptime >= jbuf->base_rtptime) - send_diff = gstrtptime - jbuf->base_rtptime; - else { - /* elapsed time at sender, timestamps can go backwards and thus be smaller - * than our base time, take a new base time in that case. */ - GST_DEBUG ("backward timestamps at server, taking new base time"); - jbuf->base_rtptime = gstrtptime; - jbuf->base_time = time; - send_diff = 0; - } - - GST_DEBUG ("extrtp %" G_GUINT64_FORMAT ", gstrtp %" GST_TIME_FORMAT ", base %" - GST_TIME_FORMAT ", send_diff %" GST_TIME_FORMAT, ext_rtptime, - GST_TIME_ARGS (gstrtptime), GST_TIME_ARGS (jbuf->base_rtptime), - GST_TIME_ARGS (send_diff)); - - if (jbuf->prev_send_diff != -1 && time != -1) { - gint64 delta_diff; - - if (send_diff > jbuf->prev_send_diff) - delta_diff = send_diff - jbuf->prev_send_diff; - else - delta_diff = jbuf->prev_send_diff - send_diff; - - /* server changed rtp timestamps too quickly, reset skew detection and start - * again. This value is sortof arbitrary and can be a bad measurement up if - * there are many packets missing because then we get a big gap that is - * unrelated to a timestamp switch. */ - if (delta_diff > GST_SECOND) { - GST_DEBUG ("delta changed too quickly %" GST_TIME_FORMAT " reset skew", - GST_TIME_ARGS (delta_diff)); - rdt_jitter_buffer_reset_skew (jbuf); - goto again; - } - } - jbuf->prev_send_diff = send_diff; - - /* we don't have an arrival timestamp so we can't do skew detection. we - * should still apply a timestamp based on RDT timestamp and base_time */ - if (time == -1) - goto no_skew; - - /* elapsed time at receiver, includes the jitter */ - recv_diff = time - jbuf->base_time; - - GST_DEBUG ("time %" GST_TIME_FORMAT ", base %" GST_TIME_FORMAT ", recv_diff %" - GST_TIME_FORMAT, GST_TIME_ARGS (time), GST_TIME_ARGS (jbuf->base_time), - GST_TIME_ARGS (recv_diff)); - - /* measure the diff */ - delta = ((gint64) recv_diff) - ((gint64) send_diff); - - pos = jbuf->window_pos; - - if (jbuf->window_filling) { - /* we are filling the window */ - GST_DEBUG ("filling %d, delta %" G_GINT64_FORMAT, pos, delta); - jbuf->windowpos++ = delta; - /* calc the min delta we observed */ - if (pos == 1 || delta < jbuf->window_min) - jbuf->window_min = delta; - - if (send_diff >= MAX_TIME || pos >= MAX_WINDOW) { - jbuf->window_size = pos; - - /* window filled */ - GST_DEBUG ("min %" G_GINT64_FORMAT, jbuf->window_min); - - /* the skew is now the min */ - jbuf->skew = jbuf->window_min; - jbuf->window_filling = FALSE; - } else { - gint perc_time, perc_window, perc; - - /* figure out how much we filled the window, this depends on the amount of - * time we have or the max number of points we keep. */ - perc_time = send_diff * 100 / MAX_TIME; - perc_window = pos * 100 / MAX_WINDOW; - perc = MAX (perc_time, perc_window); - - /* make a parabolic function, the closer we get to the MAX, the more value - * we give to the scaling factor of the new value */ - perc = perc * perc; - - /* quickly go to the min value when we are filling up, slowly when we are - * just starting because we're not sure it's a good value yet. */ - jbuf->skew = - (perc * jbuf->window_min + ((10000 - perc) * jbuf->skew)) / 10000; - jbuf->window_size = pos + 1; - } - } else { - /* pick old value and store new value. We keep the previous value in order - * to quickly check if the min of the window changed */ - old = jbuf->windowpos; - jbuf->windowpos++ = delta; - - if (delta <= jbuf->window_min) { - /* if the new value we inserted is smaller or equal to the current min, - * it becomes the new min */ - jbuf->window_min = delta; - } else if (old == jbuf->window_min) { - gint64 min = G_MAXINT64; - - /* if we removed the old min, we have to find a new min */ - for (i = 0; i < jbuf->window_size; i++) { - /* we found another value equal to the old min, we can stop searching now */ - if (jbuf->windowi == old) { - min = old; - break; - } - if (jbuf->windowi < min) - min = jbuf->windowi; - } - jbuf->window_min = min; - } - /* average the min values */ - jbuf->skew = (jbuf->window_min + (124 * jbuf->skew)) / 125; - GST_DEBUG ("delta %" G_GINT64_FORMAT ", new min: %" G_GINT64_FORMAT, - delta, jbuf->window_min); - } - /* wrap around in the window */ - if (pos >= jbuf->window_size) - pos = 0; - jbuf->window_pos = pos; - -no_skew: - /* the output time is defined as the base timestamp plus the RDT time - * adjusted for the clock skew .*/ - out_time = jbuf->base_time + send_diff + jbuf->skew; - - GST_DEBUG ("skew %" G_GINT64_FORMAT ", out %" GST_TIME_FORMAT, - jbuf->skew, GST_TIME_ARGS (out_time)); - - return out_time; -} - -/** - * rdt_jitter_buffer_insert: - * @jbuf: an #RDTJitterBuffer - * @buf: a buffer - * @time: a running_time when this buffer was received in nanoseconds - * @clock_rate: the clock-rate of the payload of @buf - * @tail: TRUE when the tail element changed. - * - * Inserts @buf into the packet queue of @jbuf. The sequence number of the - * packet will be used to sort the packets. This function takes ownerhip of - * @buf when the function returns %TRUE. - * @buf should have writable metadata when calling this function. - * - * Returns: %FALSE if a packet with the same number already existed. - */ -gboolean -rdt_jitter_buffer_insert (RDTJitterBuffer * jbuf, GstBuffer * buf, - GstClockTime time, guint32 clock_rate, gboolean * tail) -{ - GList *list; - guint32 rtptime; - guint16 seqnum; - GstRDTPacket packet; - gboolean more; - - g_return_val_if_fail (jbuf != NULL, FALSE); - g_return_val_if_fail (buf != NULL, FALSE); - - more = gst_rdt_buffer_get_first_packet (buf, &packet); - /* programmer error */ - g_return_val_if_fail (more == TRUE, FALSE); - - seqnum = gst_rdt_packet_data_get_seq (&packet); - /* do skew calculation by measuring the difference between rtptime and the - * receive time, this function will retimestamp @buf with the skew corrected - * running time. */ - rtptime = gst_rdt_packet_data_get_timestamp (&packet); - - /* loop the list to skip strictly smaller seqnum buffers */ - for (list = jbuf->packets->head; list; list = g_list_next (list)) { - guint16 qseq; - gint gap; - - more = - gst_rdt_buffer_get_first_packet (GST_BUFFER_CAST (list->data), &packet); - /* programmer error */ - g_return_val_if_fail (more == TRUE, FALSE); - - qseq = gst_rdt_packet_data_get_seq (&packet); - - /* compare the new seqnum to the one in the buffer */ - gap = gst_rdt_buffer_compare_seqnum (seqnum, qseq); - - /* we hit a packet with the same seqnum, notify a duplicate */ - if (G_UNLIKELY (gap == 0)) - goto duplicate; - - /* seqnum > qseq, we can stop looking */ - if (G_LIKELY (gap < 0)) - break; - } - - - if (clock_rate) { - time = calculate_skew (jbuf, rtptime, time, clock_rate); - GST_BUFFER_TIMESTAMP (buf) = time; - } - - if (list) - g_queue_insert_before (jbuf->packets, list, buf); - else - g_queue_push_tail (jbuf->packets, buf); - - /* tail was changed when we did not find a previous packet, we set the return - * flag when requested. */ - if (tail) - *tail = (list == NULL); - - return TRUE; - - /* ERRORS */ -duplicate: - { - GST_WARNING ("duplicate packet %d found", (gint) seqnum); - return FALSE; - } -} - -/** - * rdt_jitter_buffer_pop: - * @jbuf: an #RDTJitterBuffer - * - * Pops the oldest buffer from the packet queue of @jbuf. The popped buffer will - * have its timestamp adjusted with the incoming running_time and the detected - * clock skew. - * - * Returns: a #GstBuffer or %NULL when there was no packet in the queue. - */ -GstBuffer * -rdt_jitter_buffer_pop (RDTJitterBuffer * jbuf) -{ - GstBuffer *buf; - - g_return_val_if_fail (jbuf != NULL, FALSE); - - buf = g_queue_pop_tail (jbuf->packets); - - return buf; -} - -/** - * rdt_jitter_buffer_peek: - * @jbuf: an #RDTJitterBuffer - * - * Peek the oldest buffer from the packet queue of @jbuf. Register a callback - * with rdt_jitter_buffer_set_tail_changed() to be notified when an older packet - * was inserted in the queue. - * - * Returns: a #GstBuffer or %NULL when there was no packet in the queue. - */ -GstBuffer * -rdt_jitter_buffer_peek (RDTJitterBuffer * jbuf) -{ - GstBuffer *buf; - - g_return_val_if_fail (jbuf != NULL, FALSE); - - buf = g_queue_peek_tail (jbuf->packets); - - return buf; -} - -/** - * rdt_jitter_buffer_flush: - * @jbuf: an #RDTJitterBuffer - * - * Flush all packets from the jitterbuffer. - */ -void -rdt_jitter_buffer_flush (RDTJitterBuffer * jbuf) -{ - GstBuffer *buffer; - - g_return_if_fail (jbuf != NULL); - - while ((buffer = g_queue_pop_head (jbuf->packets))) - gst_buffer_unref (buffer); -} - -/** - * rdt_jitter_buffer_num_packets: - * @jbuf: an #RDTJitterBuffer - * - * Get the number of packets currently in "jbuf. - * - * Returns: The number of packets in @jbuf. - */ -guint -rdt_jitter_buffer_num_packets (RDTJitterBuffer * jbuf) -{ - g_return_val_if_fail (jbuf != NULL, 0); - - return jbuf->packets->length; -} - -/** - * rdt_jitter_buffer_get_ts_diff: - * @jbuf: an #RDTJitterBuffer - * - * Get the difference between the timestamps of first and last packet in the - * jitterbuffer. - * - * Returns: The difference expressed in the timestamp units of the packets. - */ -guint32 -rdt_jitter_buffer_get_ts_diff (RDTJitterBuffer * jbuf) -{ - guint64 high_ts, low_ts; - GstBuffer *high_buf, *low_buf; - guint32 result; - - g_return_val_if_fail (jbuf != NULL, 0); - - high_buf = g_queue_peek_head (jbuf->packets); - low_buf = g_queue_peek_tail (jbuf->packets); - - if (!high_buf || !low_buf || high_buf == low_buf) - return 0; - - //high_ts = gst_rtp_buffer_get_timestamp (high_buf); - //low_ts = gst_rtp_buffer_get_timestamp (low_buf); - high_ts = 0; - low_ts = 0; - - /* it needs to work if ts wraps */ - if (high_ts >= low_ts) { - result = (guint32) (high_ts - low_ts); - } else { - result = (guint32) (high_ts + G_MAXUINT32 + 1 - low_ts); - } - return result; -}
View file
gst-plugins-ugly-1.22.7.tar.xz/gst/realmedia/rdtjitterbuffer.h
Deleted
@@ -1,91 +0,0 @@ -/* GStreamer - * Copyright (C) <2007> Wim Taymans <wim.taymans@gmail.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifndef __RDT_JITTER_BUFFER_H__ -#define __RDT_JITTER_BUFFER_H__ - -#include <gst/gst.h> - -typedef struct _RDTJitterBuffer RDTJitterBuffer; -typedef struct _RDTJitterBufferClass RDTJitterBufferClass; - -#define RDT_TYPE_JITTER_BUFFER (rdt_jitter_buffer_get_type()) -#define RDT_JITTER_BUFFER(src) (G_TYPE_CHECK_INSTANCE_CAST((src),RDT_TYPE_JITTER_BUFFER,RDTJitterBuffer)) -#define RDT_JITTER_BUFFER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),RDT_TYPE_JITTER_BUFFER,RDTJitterBufferClass)) -#define RDT_IS_JITTER_BUFFER(src) (G_TYPE_CHECK_INSTANCE_TYPE((src),RDT_TYPE_JITTER_BUFFER)) -#define RDT_IS_JITTER_BUFFER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),RDT_TYPE_JITTER_BUFFER)) -#define RDT_JITTER_BUFFER_CAST(src) ((RDTJitterBuffer *)(src)) - -/** - * RTPTailChanged: - * @jbuf: an #RDTJitterBuffer - * @user_data: user data specified when registering - * - * This callback will be called when the tail buffer of @jbuf changed. - */ -typedef void (*RTPTailChanged) (RDTJitterBuffer *jbuf, gpointer user_data); - -#define RDT_JITTER_BUFFER_MAX_WINDOW 512 -/** - * RDTJitterBuffer: - * - * A JitterBuffer in the #RTPSession - */ -struct _RDTJitterBuffer { - GObject object; - - GQueue *packets; - - /* for calculating skew */ - GstClockTime base_time; - GstClockTime base_rtptime; - guint64 ext_rtptime; - gint64 windowRDT_JITTER_BUFFER_MAX_WINDOW; - guint window_pos; - guint window_size; - gboolean window_filling; - gint64 window_min; - gint64 skew; - gint64 prev_send_diff; -}; - -struct _RDTJitterBufferClass { - GObjectClass parent_class; -}; - -GType rdt_jitter_buffer_get_type (void); - -/* managing lifetime */ -RDTJitterBuffer* rdt_jitter_buffer_new (void); - -void rdt_jitter_buffer_reset_skew (RDTJitterBuffer *jbuf); - -gboolean rdt_jitter_buffer_insert (RDTJitterBuffer *jbuf, GstBuffer *buf, - GstClockTime time, - guint32 clock_rate, - gboolean *tail); -GstBuffer * rdt_jitter_buffer_peek (RDTJitterBuffer *jbuf); -GstBuffer * rdt_jitter_buffer_pop (RDTJitterBuffer *jbuf); - -void rdt_jitter_buffer_flush (RDTJitterBuffer *jbuf); - -guint rdt_jitter_buffer_num_packets (RDTJitterBuffer *jbuf); -guint32 rdt_jitter_buffer_get_ts_diff (RDTJitterBuffer *jbuf); - -#endif /* __RDT_JITTER_BUFFER_H__ */
View file
gst-plugins-ugly-1.22.7.tar.xz/gst/realmedia/rdtmanager.c
Deleted
@@ -1,1371 +0,0 @@ -/* GStreamer - * Copyright (C) <2005,2006> Wim Taymans <wim@fluendo.com> - * <2013> Wim Taymans <wim.taymans@gmail.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ -/* - * Unless otherwise indicated, Source Code is licensed under MIT license. - * See further explanation attached in License Statement (distributed in the file - * LICENSE). - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is furnished to do - * so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -/* Element-Checklist-Version: 5 */ - -/** - * SECTION:element-rdtmanager - * @title: rdtmanager - * @see_also: GstRtspSrc - * - * A simple RTP session manager used internally by rtspsrc. - */ - -/* #define HAVE_RTCP */ - -#include "gstrdtbuffer.h" -#include "rdtmanager.h" -#include "rdtjitterbuffer.h" - -#include <gst/glib-compat-private.h> - -#include <stdio.h> - -GST_DEBUG_CATEGORY_STATIC (rdtmanager_debug); -#define GST_CAT_DEFAULT (rdtmanager_debug) - -/* GstRDTManager signals and args */ -enum -{ - SIGNAL_REQUEST_PT_MAP, - SIGNAL_CLEAR_PT_MAP, - - SIGNAL_ON_NEW_SSRC, - SIGNAL_ON_SSRC_COLLISION, - SIGNAL_ON_SSRC_VALIDATED, - SIGNAL_ON_SSRC_ACTIVE, - SIGNAL_ON_SSRC_SDES, - SIGNAL_ON_BYE_SSRC, - SIGNAL_ON_BYE_TIMEOUT, - SIGNAL_ON_TIMEOUT, - SIGNAL_ON_NPT_STOP, - LAST_SIGNAL -}; - -#define DEFAULT_LATENCY_MS 200 - -enum -{ - PROP_0, - PROP_LATENCY -}; - -static GstStaticPadTemplate gst_rdt_manager_recv_rtp_sink_template = -GST_STATIC_PAD_TEMPLATE ("recv_rtp_sink_%u", - GST_PAD_SINK, - GST_PAD_REQUEST, - GST_STATIC_CAPS ("application/x-rdt") - ); - -static GstStaticPadTemplate gst_rdt_manager_recv_rtcp_sink_template = -GST_STATIC_PAD_TEMPLATE ("recv_rtcp_sink_%u", - GST_PAD_SINK, - GST_PAD_REQUEST, - GST_STATIC_CAPS ("application/x-rtcp") - ); - -static GstStaticPadTemplate gst_rdt_manager_recv_rtp_src_template = -GST_STATIC_PAD_TEMPLATE ("recv_rtp_src_%u_%u_%u", - GST_PAD_SRC, - GST_PAD_SOMETIMES, - GST_STATIC_CAPS ("application/x-rdt") - ); - -static GstStaticPadTemplate gst_rdt_manager_rtcp_src_template = -GST_STATIC_PAD_TEMPLATE ("rtcp_src_%u", - GST_PAD_SRC, - GST_PAD_REQUEST, - GST_STATIC_CAPS ("application/x-rtcp") - ); - -static void gst_rdt_manager_finalize (GObject * object); -static void gst_rdt_manager_set_property (GObject * object, - guint prop_id, const GValue * value, GParamSpec * pspec); -static void gst_rdt_manager_get_property (GObject * object, - guint prop_id, GValue * value, GParamSpec * pspec); - -static gboolean gst_rdt_manager_query_src (GstPad * pad, GstObject * parent, - GstQuery * query); -static gboolean gst_rdt_manager_src_activate_mode (GstPad * pad, - GstObject * parent, GstPadMode mode, gboolean active); - -static GstClock *gst_rdt_manager_provide_clock (GstElement * element); -static GstStateChangeReturn gst_rdt_manager_change_state (GstElement * element, - GstStateChange transition); -static GstPad *gst_rdt_manager_request_new_pad (GstElement * element, - GstPadTemplate * templ, const gchar * name, const GstCaps * caps); -static void gst_rdt_manager_release_pad (GstElement * element, GstPad * pad); - -static gboolean gst_rdt_manager_parse_caps (GstRDTManager * rdtmanager, - GstRDTManagerSession * session, GstCaps * caps); -static gboolean gst_rdt_manager_event_rdt (GstPad * pad, GstObject * parent, - GstEvent * event); - -static GstFlowReturn gst_rdt_manager_chain_rdt (GstPad * pad, - GstObject * parent, GstBuffer * buffer); -static GstFlowReturn gst_rdt_manager_chain_rtcp (GstPad * pad, - GstObject * parent, GstBuffer * buffer); -static void gst_rdt_manager_loop (GstPad * pad); - -static guint gst_rdt_manager_signalsLAST_SIGNAL = { 0 }; - -#define JBUF_LOCK(sess) (g_mutex_lock (&(sess)->jbuf_lock)) - -#define JBUF_LOCK_CHECK(sess,label) G_STMT_START { \ - JBUF_LOCK (sess); \ - if (sess->srcresult != GST_FLOW_OK) \ - goto label; \ -} G_STMT_END - -#define JBUF_UNLOCK(sess) (g_mutex_unlock (&(sess)->jbuf_lock)) -#define JBUF_WAIT(sess) (g_cond_wait (&(sess)->jbuf_cond, &(sess)->jbuf_lock)) - -#define JBUF_WAIT_CHECK(sess,label) G_STMT_START { \ - JBUF_WAIT(sess); \ - if (sess->srcresult != GST_FLOW_OK) \ - goto label; \ -} G_STMT_END - -#define JBUF_SIGNAL(sess) (g_cond_signal (&(sess)->jbuf_cond)) - -/* Manages the receiving end of the packets. - * - * There is one such structure for each RTP session (audio/video/...). - * We get the RTP/RTCP packets and stuff them into the session manager. - */ -struct _GstRDTManagerSession -{ - /* session id */ - gint id; - /* the parent bin */ - GstRDTManager *dec; - - gboolean active; - /* we only support one ssrc and one pt */ - guint32 ssrc; - guint8 pt; - gint clock_rate; - GstCaps *caps; - gint64 clock_base; - - GstSegment segment; - - /* the last seqnum we pushed out */ - guint32 last_popped_seqnum; - /* the next expected seqnum */ - guint32 next_seqnum; - /* last output time */ - GstClockTime last_out_time; - - /* the pads of the session */ - GstPad *recv_rtp_sink; - GstPad *recv_rtp_src; - GstPad *recv_rtcp_sink; - GstPad *rtcp_src; - - GstFlowReturn srcresult; - gboolean blocked; - gboolean eos; - gboolean waiting; - gboolean discont; - GstClockID clock_id; - - /* jitterbuffer, lock and cond */ - RDTJitterBuffer *jbuf; - GMutex jbuf_lock; - GCond jbuf_cond; - - /* some accounting */ - guint64 num_late; - guint64 num_duplicates; -}; - -/* find a session with the given id */ -static GstRDTManagerSession * -find_session_by_id (GstRDTManager * rdtmanager, gint id) -{ - GSList *walk; - - for (walk = rdtmanager->sessions; walk; walk = g_slist_next (walk)) { - GstRDTManagerSession *sess = (GstRDTManagerSession *) walk->data; - - if (sess->id == id) - return sess; - } - return NULL; -} - -/* create a session with the given id */ -static GstRDTManagerSession * -create_session (GstRDTManager * rdtmanager, gint id) -{ - GstRDTManagerSession *sess; - - sess = g_new0 (GstRDTManagerSession, 1); - sess->id = id; - sess->dec = rdtmanager; - sess->jbuf = rdt_jitter_buffer_new (); - g_mutex_init (&sess->jbuf_lock); - g_cond_init (&sess->jbuf_cond); - rdtmanager->sessions = g_slist_prepend (rdtmanager->sessions, sess); - - return sess; -} - -static gboolean -forward_sticky_events (GstPad * pad, GstEvent ** event, gpointer user_data) -{ - GstPad *srcpad = GST_PAD_CAST (user_data); - - gst_pad_push_event (srcpad, gst_event_ref (*event)); - - return TRUE; -} - -static gboolean -activate_session (GstRDTManager * rdtmanager, GstRDTManagerSession * session, - guint32 ssrc, guint8 pt) -{ - GstPadTemplate *templ; - GstElementClass *klass; - gchar *name; - GstCaps *caps; - GValue ret = { 0 }; - GValue args3 = { {0} - , {0} - , {0} - }; - - GST_DEBUG_OBJECT (rdtmanager, "creating stream"); - - session->ssrc = ssrc; - session->pt = pt; - - /* get pt map */ - g_value_init (&args0, GST_TYPE_ELEMENT); - g_value_set_object (&args0, rdtmanager); - g_value_init (&args1, G_TYPE_UINT); - g_value_set_uint (&args1, session->id); - g_value_init (&args2, G_TYPE_UINT); - g_value_set_uint (&args2, pt); - - g_value_init (&ret, GST_TYPE_CAPS); - g_value_set_boxed (&ret, NULL); - - g_signal_emitv (args, gst_rdt_manager_signalsSIGNAL_REQUEST_PT_MAP, 0, - &ret); - - g_value_unset (&args0); - g_value_unset (&args1); - g_value_unset (&args2); - caps = (GstCaps *) g_value_dup_boxed (&ret); - g_value_unset (&ret); - - if (caps) - gst_rdt_manager_parse_caps (rdtmanager, session, caps); - - name = g_strdup_printf ("recv_rtp_src_%u_%u_%u", session->id, ssrc, pt); - klass = GST_ELEMENT_GET_CLASS (rdtmanager); - templ = gst_element_class_get_pad_template (klass, "recv_rtp_src_%u_%u_%u"); - session->recv_rtp_src = gst_pad_new_from_template (templ, name); - g_free (name); - - gst_pad_set_element_private (session->recv_rtp_src, session); - gst_pad_set_query_function (session->recv_rtp_src, gst_rdt_manager_query_src); - gst_pad_set_activatemode_function (session->recv_rtp_src, - gst_rdt_manager_src_activate_mode); - - gst_pad_set_active (session->recv_rtp_src, TRUE); - - gst_pad_sticky_events_foreach (session->recv_rtp_sink, forward_sticky_events, - session->recv_rtp_src); - gst_pad_set_caps (session->recv_rtp_src, caps); - gst_caps_unref (caps); - - gst_element_add_pad (GST_ELEMENT_CAST (rdtmanager), session->recv_rtp_src); - - return TRUE; -} - -static void -free_session (GstRDTManagerSession * session) -{ - g_object_unref (session->jbuf); - g_cond_clear (&session->jbuf_cond); - g_mutex_clear (&session->jbuf_lock); - g_free (session); -} - -#define gst_rdt_manager_parent_class parent_class -G_DEFINE_TYPE (GstRDTManager, gst_rdt_manager, GST_TYPE_ELEMENT); -GST_ELEMENT_REGISTER_DEFINE (rdtmanager, "rdtmanager", - GST_RANK_NONE, GST_TYPE_RDT_MANAGER); - -/* BOXED:UINT,UINT */ -#define g_marshal_value_peek_uint(v) g_value_get_uint (v) - -static void -gst_rdt_manager_marshal_BOXED__UINT_UINT (GClosure * closure, - GValue * return_value, - guint n_param_values, - const GValue * param_values, - gpointer invocation_hint, gpointer marshal_data) -{ - typedef gpointer (*GMarshalFunc_BOXED__UINT_UINT) (gpointer data1, - guint arg_1, guint arg_2, gpointer data2); - register GMarshalFunc_BOXED__UINT_UINT callback; - register GCClosure *cc = (GCClosure *) closure; - register gpointer data1, data2; - gpointer v_return; - - g_return_if_fail (return_value != NULL); - g_return_if_fail (n_param_values == 3); - - if (G_CCLOSURE_SWAP_DATA (closure)) { - data1 = closure->data; - data2 = g_value_peek_pointer (param_values + 0); - } else { - data1 = g_value_peek_pointer (param_values + 0); - data2 = closure->data; - } - callback = - (GMarshalFunc_BOXED__UINT_UINT) (marshal_data ? marshal_data : - cc->callback); - - v_return = callback (data1, - g_marshal_value_peek_uint (param_values + 1), - g_marshal_value_peek_uint (param_values + 2), data2); - - g_value_take_boxed (return_value, v_return); -} - -static void -gst_rdt_manager_marshal_VOID__UINT_UINT (GClosure * closure, - GValue * return_value, - guint n_param_values, - const GValue * param_values, - gpointer invocation_hint, gpointer marshal_data) -{ - typedef void (*GMarshalFunc_VOID__UINT_UINT) (gpointer data1, - guint arg_1, guint arg_2, gpointer data2); - register GMarshalFunc_VOID__UINT_UINT callback; - register GCClosure *cc = (GCClosure *) closure; - register gpointer data1, data2; - - g_return_if_fail (n_param_values == 3); - - if (G_CCLOSURE_SWAP_DATA (closure)) { - data1 = closure->data; - data2 = g_value_peek_pointer (param_values + 0); - } else { - data1 = g_value_peek_pointer (param_values + 0); - data2 = closure->data; - } - callback = - (GMarshalFunc_VOID__UINT_UINT) (marshal_data ? marshal_data : - cc->callback); - - callback (data1, - g_marshal_value_peek_uint (param_values + 1), - g_marshal_value_peek_uint (param_values + 2), data2); -} - -static void -gst_rdt_manager_class_init (GstRDTManagerClass * g_class) -{ - GObjectClass *gobject_class; - GstElementClass *gstelement_class; - GstRDTManagerClass *klass; - - klass = (GstRDTManagerClass *) g_class; - gobject_class = (GObjectClass *) klass; - gstelement_class = (GstElementClass *) klass; - - gobject_class->finalize = gst_rdt_manager_finalize; - gobject_class->set_property = gst_rdt_manager_set_property; - gobject_class->get_property = gst_rdt_manager_get_property; - - g_object_class_install_property (gobject_class, PROP_LATENCY, - g_param_spec_uint ("latency", "Buffer latency in ms", - "Amount of ms to buffer", 0, G_MAXUINT, DEFAULT_LATENCY_MS, - G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); - - /** - * GstRDTManager::request-pt-map: - * @rdtmanager: the object which received the signal - * @session: the session - * @pt: the pt - * - * Request the payload type as #GstCaps for @pt in @session. - */ - gst_rdt_manager_signalsSIGNAL_REQUEST_PT_MAP = - g_signal_new ("request-pt-map", G_TYPE_FROM_CLASS (klass), - G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRDTManagerClass, request_pt_map), - NULL, NULL, gst_rdt_manager_marshal_BOXED__UINT_UINT, GST_TYPE_CAPS, 2, - G_TYPE_UINT, G_TYPE_UINT); - - /** - * GstRDTManager::clear-pt-map: - * @rtpbin: the object which received the signal - * - * Clear all previously cached pt-mapping obtained with - * GstRDTManager::request-pt-map. - */ - gst_rdt_manager_signalsSIGNAL_CLEAR_PT_MAP = - g_signal_new ("clear-pt-map", G_TYPE_FROM_CLASS (klass), - G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRDTManagerClass, clear_pt_map), - NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0, G_TYPE_NONE); - - /** - * GstRDTManager::on-bye-ssrc: - * @rtpbin: the object which received the signal - * @session: the session - * @ssrc: the SSRC - * - * Notify of an SSRC that became inactive because of a BYE packet. - */ - gst_rdt_manager_signalsSIGNAL_ON_BYE_SSRC = - g_signal_new ("on-bye-ssrc", G_TYPE_FROM_CLASS (klass), - G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRDTManagerClass, on_bye_ssrc), - NULL, NULL, gst_rdt_manager_marshal_VOID__UINT_UINT, G_TYPE_NONE, 2, - G_TYPE_UINT, G_TYPE_UINT); - /** - * GstRDTManager::on-bye-timeout: - * @rtpbin: the object which received the signal - * @session: the session - * @ssrc: the SSRC - * - * Notify of an SSRC that has timed out because of BYE - */ - gst_rdt_manager_signalsSIGNAL_ON_BYE_TIMEOUT = - g_signal_new ("on-bye-timeout", G_TYPE_FROM_CLASS (klass), - G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRDTManagerClass, on_bye_timeout), - NULL, NULL, gst_rdt_manager_marshal_VOID__UINT_UINT, G_TYPE_NONE, 2, - G_TYPE_UINT, G_TYPE_UINT); - /** - * GstRDTManager::on-timeout: - * @rtpbin: the object which received the signal - * @session: the session - * @ssrc: the SSRC - * - * Notify of an SSRC that has timed out - */ - gst_rdt_manager_signalsSIGNAL_ON_TIMEOUT = - g_signal_new ("on-timeout", G_TYPE_FROM_CLASS (klass), - G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRDTManagerClass, on_timeout), - NULL, NULL, gst_rdt_manager_marshal_VOID__UINT_UINT, G_TYPE_NONE, 2, - G_TYPE_UINT, G_TYPE_UINT); - - /** - * GstRDTManager::on-npt-stop: - * @rtpbin: the object which received the signal - * @session: the session - * @ssrc: the SSRC - * - * Notify that SSRC sender has sent data up to the configured NPT stop time. - */ - gst_rdt_manager_signalsSIGNAL_ON_NPT_STOP = - g_signal_new ("on-npt-stop", G_TYPE_FROM_CLASS (klass), - G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRDTManagerClass, on_npt_stop), - NULL, NULL, gst_rdt_manager_marshal_VOID__UINT_UINT, G_TYPE_NONE, 2, - G_TYPE_UINT, G_TYPE_UINT); - - - gstelement_class->provide_clock = - GST_DEBUG_FUNCPTR (gst_rdt_manager_provide_clock); - gstelement_class->change_state = - GST_DEBUG_FUNCPTR (gst_rdt_manager_change_state); - gstelement_class->request_new_pad = - GST_DEBUG_FUNCPTR (gst_rdt_manager_request_new_pad); - gstelement_class->release_pad = - GST_DEBUG_FUNCPTR (gst_rdt_manager_release_pad); - - /* sink pads */ - gst_element_class_add_static_pad_template (gstelement_class, - &gst_rdt_manager_recv_rtp_sink_template); - gst_element_class_add_static_pad_template (gstelement_class, - &gst_rdt_manager_recv_rtcp_sink_template); - /* src pads */ - gst_element_class_add_static_pad_template (gstelement_class, - &gst_rdt_manager_recv_rtp_src_template); - gst_element_class_add_static_pad_template (gstelement_class, - &gst_rdt_manager_rtcp_src_template); - - gst_element_class_set_static_metadata (gstelement_class, "RTP Decoder", - "Codec/Parser/Network", - "Accepts raw RTP and RTCP packets and sends them forward", - "Wim Taymans <wim.taymans@gmail.com>"); - - GST_DEBUG_CATEGORY_INIT (rdtmanager_debug, "rdtmanager", 0, "RTP decoder"); -} - -static void -gst_rdt_manager_init (GstRDTManager * rdtmanager) -{ - rdtmanager->provided_clock = gst_system_clock_obtain (); - rdtmanager->latency = DEFAULT_LATENCY_MS; - GST_OBJECT_FLAG_SET (rdtmanager, GST_ELEMENT_FLAG_PROVIDE_CLOCK); -} - -static void -gst_rdt_manager_finalize (GObject * object) -{ - GstRDTManager *rdtmanager; - - rdtmanager = GST_RDT_MANAGER (object); - - g_slist_foreach (rdtmanager->sessions, (GFunc) free_session, NULL); - g_slist_free (rdtmanager->sessions); - g_clear_object (&rdtmanager->provided_clock); - - G_OBJECT_CLASS (parent_class)->finalize (object); -} - -static gboolean -gst_rdt_manager_query_src (GstPad * pad, GstObject * parent, GstQuery * query) -{ - GstRDTManager *rdtmanager; - gboolean res; - - rdtmanager = GST_RDT_MANAGER (parent); - - switch (GST_QUERY_TYPE (query)) { - case GST_QUERY_LATENCY: - { - GstClockTime latency; - - latency = rdtmanager->latency * GST_MSECOND; - - /* we pretend to be live with a 3 second latency */ - gst_query_set_latency (query, TRUE, latency, -1); - - GST_DEBUG_OBJECT (rdtmanager, "reporting %" GST_TIME_FORMAT " of latency", - GST_TIME_ARGS (latency)); - res = TRUE; - break; - } - default: - res = gst_pad_query_default (pad, parent, query); - break; - } - return res; -} - -static gboolean -gst_rdt_manager_src_activate_mode (GstPad * pad, GstObject * parent, - GstPadMode mode, gboolean active) -{ - gboolean result; - GstRDTManager *rdtmanager; - GstRDTManagerSession *session; - - session = gst_pad_get_element_private (pad); - rdtmanager = session->dec; - - switch (mode) { - case GST_PAD_MODE_PUSH: - if (active) { - /* allow data processing */ - JBUF_LOCK (session); - GST_DEBUG_OBJECT (rdtmanager, "Enabling pop on queue"); - /* Mark as non flushing */ - session->srcresult = GST_FLOW_OK; - gst_segment_init (&session->segment, GST_FORMAT_TIME); - session->last_popped_seqnum = -1; - session->last_out_time = -1; - session->next_seqnum = -1; - session->eos = FALSE; - JBUF_UNLOCK (session); - - /* start pushing out buffers */ - GST_DEBUG_OBJECT (rdtmanager, "Starting task on srcpad"); - result = - gst_pad_start_task (pad, (GstTaskFunction) gst_rdt_manager_loop, - pad, NULL); - } else { - /* make sure all data processing stops ASAP */ - JBUF_LOCK (session); - /* mark ourselves as flushing */ - session->srcresult = GST_FLOW_FLUSHING; - GST_DEBUG_OBJECT (rdtmanager, "Disabling pop on queue"); - /* this unblocks any waiting pops on the src pad task */ - JBUF_SIGNAL (session); - /* unlock clock, we just unschedule, the entry will be released by - * the locking streaming thread. */ - if (session->clock_id) - gst_clock_id_unschedule (session->clock_id); - JBUF_UNLOCK (session); - - /* NOTE this will hardlock if the state change is called from the src pad - * task thread because we will _join() the thread. */ - GST_DEBUG_OBJECT (rdtmanager, "Stopping task on srcpad"); - result = gst_pad_stop_task (pad); - } - break; - default: - result = FALSE; - break; - } - return result; -} - -static GstFlowReturn -gst_rdt_manager_handle_data_packet (GstRDTManagerSession * session, - GstClockTime timestamp, GstRDTPacket * packet) -{ - GstRDTManager *rdtmanager; - guint16 seqnum; - gboolean tail; - GstFlowReturn res; - GstBuffer *buffer; - - rdtmanager = session->dec; - - res = GST_FLOW_OK; - - seqnum = 0; - GST_DEBUG_OBJECT (rdtmanager, - "Received packet #%d at time %" GST_TIME_FORMAT, seqnum, - GST_TIME_ARGS (timestamp)); - - buffer = gst_rdt_packet_to_buffer (packet); - - JBUF_LOCK_CHECK (session, out_flushing); - - /* insert the packet into the queue now, FIXME, use seqnum */ - if (!rdt_jitter_buffer_insert (session->jbuf, buffer, timestamp, - session->clock_rate, &tail)) - goto duplicate; - - /* signal addition of new buffer when the _loop is waiting. */ - if (session->waiting) - JBUF_SIGNAL (session); - -finished: - JBUF_UNLOCK (session); - - return res; - - /* ERRORS */ -out_flushing: - { - res = session->srcresult; - GST_DEBUG_OBJECT (rdtmanager, "flushing %s", gst_flow_get_name (res)); - gst_buffer_unref (buffer); - goto finished; - } -duplicate: - { - GST_WARNING_OBJECT (rdtmanager, "Duplicate packet #%d detected, dropping", - seqnum); - session->num_duplicates++; - gst_buffer_unref (buffer); - goto finished; - } -} - -static gboolean -gst_rdt_manager_parse_caps (GstRDTManager * rdtmanager, - GstRDTManagerSession * session, GstCaps * caps) -{ - GstStructure *caps_struct; - guint val; - - /* first parse the caps */ - caps_struct = gst_caps_get_structure (caps, 0); - - GST_DEBUG_OBJECT (rdtmanager, "got caps"); - - /* we need a clock-rate to convert the rtp timestamps to GStreamer time and to - * measure the amount of data in the buffer */ - if (!gst_structure_get_int (caps_struct, "clock-rate", &session->clock_rate)) - session->clock_rate = 1000; - - if (session->clock_rate <= 0) - goto wrong_rate; - - GST_DEBUG_OBJECT (rdtmanager, "got clock-rate %d", session->clock_rate); - - /* gah, clock-base is uint. If we don't have a base, we will use the first - * buffer timestamp as the base time. This will screw up sync but it's better - * than nothing. */ - if (gst_structure_get_uint (caps_struct, "clock-base", &val)) - session->clock_base = val; - else - session->clock_base = -1; - - GST_DEBUG_OBJECT (rdtmanager, "got clock-base %" G_GINT64_FORMAT, - session->clock_base); - - /* first expected seqnum */ - if (gst_structure_get_uint (caps_struct, "seqnum-base", &val)) - session->next_seqnum = val; - else - session->next_seqnum = -1; - - GST_DEBUG_OBJECT (rdtmanager, "got seqnum-base %d", session->next_seqnum); - - return TRUE; - - /* ERRORS */ -wrong_rate: - { - GST_DEBUG_OBJECT (rdtmanager, "Invalid clock-rate %d", session->clock_rate); - return FALSE; - } -} - -static gboolean -gst_rdt_manager_event_rdt (GstPad * pad, GstObject * parent, GstEvent * event) -{ - GstRDTManager *rdtmanager; - GstRDTManagerSession *session; - gboolean res; - - rdtmanager = GST_RDT_MANAGER (parent); - /* find session */ - session = gst_pad_get_element_private (pad); - - switch (GST_EVENT_TYPE (event)) { - case GST_EVENT_CAPS: - { - GstCaps *caps; - - gst_event_parse_caps (event, &caps); - res = gst_rdt_manager_parse_caps (rdtmanager, session, caps); - gst_event_unref (event); - break; - } - default: - res = gst_pad_event_default (pad, parent, event); - break; - } - return res; -} - -static GstFlowReturn -gst_rdt_manager_chain_rdt (GstPad * pad, GstObject * parent, GstBuffer * buffer) -{ - GstFlowReturn res; - GstRDTManager *rdtmanager; - GstRDTManagerSession *session; - GstClockTime timestamp; - GstRDTPacket packet; - guint32 ssrc; - guint8 pt; - gboolean more; - - rdtmanager = GST_RDT_MANAGER (parent); - - GST_DEBUG_OBJECT (rdtmanager, "got RDT packet"); - - ssrc = 0; - pt = 0; - - GST_DEBUG_OBJECT (rdtmanager, "SSRC %08x, PT %d", ssrc, pt); - - /* find session */ - session = gst_pad_get_element_private (pad); - - /* see if we have the pad */ - if (!session->active) { - activate_session (rdtmanager, session, ssrc, pt); - session->active = TRUE; - } - - if (GST_BUFFER_IS_DISCONT (buffer)) { - GST_DEBUG_OBJECT (rdtmanager, "received discont"); - session->discont = TRUE; - } - - res = GST_FLOW_OK; - - /* take the timestamp of the buffer. This is the time when the packet was - * received and is used to calculate jitter and clock skew. We will adjust - * this timestamp with the smoothed value after processing it in the - * jitterbuffer. */ - timestamp = GST_BUFFER_TIMESTAMP (buffer); - /* bring to running time */ - timestamp = gst_segment_to_running_time (&session->segment, GST_FORMAT_TIME, - timestamp); - - more = gst_rdt_buffer_get_first_packet (buffer, &packet); - while (more) { - GstRDTType type; - - type = gst_rdt_packet_get_type (&packet); - GST_DEBUG_OBJECT (rdtmanager, "Have packet of type %04x", type); - - if (GST_RDT_IS_DATA_TYPE (type)) { - GST_DEBUG_OBJECT (rdtmanager, "We have a data packet"); - res = gst_rdt_manager_handle_data_packet (session, timestamp, &packet); - } else { - switch (type) { - default: - GST_DEBUG_OBJECT (rdtmanager, "Ignoring packet"); - break; - } - } - if (res != GST_FLOW_OK) - break; - - more = gst_rdt_packet_move_to_next (&packet); - } - - gst_buffer_unref (buffer); - - return res; -} - -/* push packets from the queue to the downstream demuxer */ -static void -gst_rdt_manager_loop (GstPad * pad) -{ - GstRDTManager *rdtmanager; - GstRDTManagerSession *session; - GstBuffer *buffer; - GstFlowReturn result; - - rdtmanager = GST_RDT_MANAGER (GST_PAD_PARENT (pad)); - - session = gst_pad_get_element_private (pad); - - JBUF_LOCK_CHECK (session, flushing); - GST_DEBUG_OBJECT (rdtmanager, "Peeking item"); - while (TRUE) { - /* always wait if we are blocked */ - if (!session->blocked) { - /* if we have a packet, we can exit the loop and grab it */ - if (rdt_jitter_buffer_num_packets (session->jbuf) > 0) - break; - /* no packets but we are EOS, do eos logic */ - if (session->eos) - goto do_eos; - } - /* underrun, wait for packets or flushing now */ - session->waiting = TRUE; - JBUF_WAIT_CHECK (session, flushing); - session->waiting = FALSE; - } - - buffer = rdt_jitter_buffer_pop (session->jbuf); - - GST_DEBUG_OBJECT (rdtmanager, "Got item %p", buffer); - - if (session->discont) { - GST_BUFFER_FLAG_SET (buffer, GST_BUFFER_FLAG_DISCONT); - session->discont = FALSE; - } - - JBUF_UNLOCK (session); - - result = gst_pad_push (session->recv_rtp_src, buffer); - if (result != GST_FLOW_OK) - goto pause; - - return; - - /* ERRORS */ -flushing: - { - GST_DEBUG_OBJECT (rdtmanager, "we are flushing"); - gst_pad_pause_task (session->recv_rtp_src); - JBUF_UNLOCK (session); - return; - } -do_eos: - { - /* store result, we are flushing now */ - GST_DEBUG_OBJECT (rdtmanager, "We are EOS, pushing EOS downstream"); - session->srcresult = GST_FLOW_EOS; - gst_pad_pause_task (session->recv_rtp_src); - gst_pad_push_event (session->recv_rtp_src, gst_event_new_eos ()); - JBUF_UNLOCK (session); - return; - } -pause: - { - GST_DEBUG_OBJECT (rdtmanager, "pausing task, reason %s", - gst_flow_get_name (result)); - - JBUF_LOCK (session); - /* store result */ - session->srcresult = result; - /* we don't post errors or anything because upstream will do that for us - * when we pass the return value upstream. */ - gst_pad_pause_task (session->recv_rtp_src); - JBUF_UNLOCK (session); - return; - } -} - -static GstFlowReturn -gst_rdt_manager_chain_rtcp (GstPad * pad, GstObject * parent, - GstBuffer * buffer) -{ - GstRDTManager *src; - -#ifdef HAVE_RTCP - gboolean valid; - GstRTCPPacket packet; - gboolean more; -#endif - - src = GST_RDT_MANAGER (parent); - - GST_DEBUG_OBJECT (src, "got rtcp packet"); - -#ifdef HAVE_RTCP - valid = gst_rtcp_buffer_validate (buffer); - if (!valid) - goto bad_packet; - - /* position on first packet */ - more = gst_rtcp_buffer_get_first_packet (buffer, &packet); - while (more) { - switch (gst_rtcp_packet_get_type (&packet)) { - case GST_RTCP_TYPE_SR: - { - guint32 ssrc, rtptime, packet_count, octet_count; - guint64 ntptime; - guint count, i; - - gst_rtcp_packet_sr_get_sender_info (&packet, &ssrc, &ntptime, &rtptime, - &packet_count, &octet_count); - - GST_DEBUG_OBJECT (src, - "got SR packet: SSRC %08x, NTP %" G_GUINT64_FORMAT - ", RTP %u, PC %u, OC %u", ssrc, ntptime, rtptime, packet_count, - octet_count); - - count = gst_rtcp_packet_get_rb_count (&packet); - for (i = 0; i < count; i++) { - guint32 ssrc, exthighestseq, jitter, lsr, dlsr; - guint8 fractionlost; - gint32 packetslost; - - gst_rtcp_packet_get_rb (&packet, i, &ssrc, &fractionlost, - &packetslost, &exthighestseq, &jitter, &lsr, &dlsr); - - GST_DEBUG_OBJECT (src, "got RB packet %d: SSRC %08x, FL %u" - ", PL %u, HS %u, JITTER %u, LSR %u, DLSR %u", ssrc, fractionlost, - packetslost, exthighestseq, jitter, lsr, dlsr); - } - break; - } - case GST_RTCP_TYPE_RR: - { - guint32 ssrc; - guint count, i; - - ssrc = gst_rtcp_packet_rr_get_ssrc (&packet); - - GST_DEBUG_OBJECT (src, "got RR packet: SSRC %08x", ssrc); - - count = gst_rtcp_packet_get_rb_count (&packet); - for (i = 0; i < count; i++) { - guint32 ssrc, exthighestseq, jitter, lsr, dlsr; - guint8 fractionlost; - gint32 packetslost; - - gst_rtcp_packet_get_rb (&packet, i, &ssrc, &fractionlost, - &packetslost, &exthighestseq, &jitter, &lsr, &dlsr); - - GST_DEBUG_OBJECT (src, "got RB packet %d: SSRC %08x, FL %u" - ", PL %u, HS %u, JITTER %u, LSR %u, DLSR %u", ssrc, fractionlost, - packetslost, exthighestseq, jitter, lsr, dlsr); - } - break; - } - case GST_RTCP_TYPE_SDES: - { - guint chunks, i, j; - gboolean more_chunks, more_items; - - chunks = gst_rtcp_packet_sdes_get_chunk_count (&packet); - GST_DEBUG_OBJECT (src, "got SDES packet with %d chunks", chunks); - - more_chunks = gst_rtcp_packet_sdes_first_chunk (&packet); - i = 0; - while (more_chunks) { - guint32 ssrc; - - ssrc = gst_rtcp_packet_sdes_get_ssrc (&packet); - - GST_DEBUG_OBJECT (src, "chunk %d, SSRC %08x", i, ssrc); - - more_items = gst_rtcp_packet_sdes_first_item (&packet); - j = 0; - while (more_items) { - GstRTCPSDESType type; - guint8 len; - gchar *data; - - gst_rtcp_packet_sdes_get_item (&packet, &type, &len, &data); - - GST_DEBUG_OBJECT (src, "item %d, type %d, len %d, data %s", j, - type, len, data); - - more_items = gst_rtcp_packet_sdes_next_item (&packet); - j++; - } - more_chunks = gst_rtcp_packet_sdes_next_chunk (&packet); - i++; - } - break; - } - case GST_RTCP_TYPE_BYE: - { - guint count, i; - gchar *reason; - - reason = gst_rtcp_packet_bye_get_reason (&packet); - GST_DEBUG_OBJECT (src, "got BYE packet (reason: %s)", - GST_STR_NULL (reason)); - g_free (reason); - - count = gst_rtcp_packet_bye_get_ssrc_count (&packet); - for (i = 0; i < count; i++) { - guint32 ssrc; - - - ssrc = gst_rtcp_packet_bye_get_nth_ssrc (&packet, i); - - GST_DEBUG_OBJECT (src, "SSRC: %08x", ssrc); - } - break; - } - case GST_RTCP_TYPE_APP: - GST_DEBUG_OBJECT (src, "got APP packet"); - break; - default: - GST_WARNING_OBJECT (src, "got unknown RTCP packet"); - break; - } - more = gst_rtcp_packet_move_to_next (&packet); - } - gst_buffer_unref (buffer); - return GST_FLOW_OK; - -bad_packet: - { - GST_WARNING_OBJECT (src, "got invalid RTCP packet"); - return GST_FLOW_OK; - } -#else - return GST_FLOW_OK; -#endif -} - -static void -gst_rdt_manager_set_property (GObject * object, guint prop_id, - const GValue * value, GParamSpec * pspec) -{ - GstRDTManager *src; - - src = GST_RDT_MANAGER (object); - - switch (prop_id) { - case PROP_LATENCY: - src->latency = g_value_get_uint (value); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -gst_rdt_manager_get_property (GObject * object, guint prop_id, GValue * value, - GParamSpec * pspec) -{ - GstRDTManager *src; - - src = GST_RDT_MANAGER (object); - - switch (prop_id) { - case PROP_LATENCY: - g_value_set_uint (value, src->latency); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static GstClock * -gst_rdt_manager_provide_clock (GstElement * element) -{ - GstRDTManager *rdtmanager; - - rdtmanager = GST_RDT_MANAGER (element); - - return GST_CLOCK_CAST (gst_object_ref (rdtmanager->provided_clock)); -} - -static GstStateChangeReturn -gst_rdt_manager_change_state (GstElement * element, GstStateChange transition) -{ - GstStateChangeReturn ret; - - switch (transition) { - default: - break; - } - - ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); - - switch (transition) { - case GST_STATE_CHANGE_READY_TO_PAUSED: - case GST_STATE_CHANGE_PLAYING_TO_PAUSED: - /* we're NO_PREROLL when going to PAUSED */ - ret = GST_STATE_CHANGE_NO_PREROLL; - break; - default: - break; - } - - return ret; -} - -/* Create a pad for receiving RTP for the session in @name - */ -static GstPad * -create_recv_rtp (GstRDTManager * rdtmanager, GstPadTemplate * templ, - const gchar * name) -{ - guint sessid; - GstRDTManagerSession *session; - - /* first get the session number */ - if (name == NULL || sscanf (name, "recv_rtp_sink_%u", &sessid) != 1) - goto no_name; - - GST_DEBUG_OBJECT (rdtmanager, "finding session %d", sessid); - - /* get or create session */ - session = find_session_by_id (rdtmanager, sessid); - if (!session) { - GST_DEBUG_OBJECT (rdtmanager, "creating session %d", sessid); - /* create session now */ - session = create_session (rdtmanager, sessid); - if (session == NULL) - goto create_error; - } - /* check if pad was requested */ - if (session->recv_rtp_sink != NULL) - goto existed; - - GST_DEBUG_OBJECT (rdtmanager, "getting RTP sink pad"); - - session->recv_rtp_sink = gst_pad_new_from_template (templ, name); - gst_pad_set_element_private (session->recv_rtp_sink, session); - gst_pad_set_event_function (session->recv_rtp_sink, - gst_rdt_manager_event_rdt); - gst_pad_set_chain_function (session->recv_rtp_sink, - gst_rdt_manager_chain_rdt); - gst_pad_set_active (session->recv_rtp_sink, TRUE); - gst_element_add_pad (GST_ELEMENT_CAST (rdtmanager), session->recv_rtp_sink); - - return session->recv_rtp_sink; - - /* ERRORS */ -no_name: - { - g_warning ("rdtmanager: invalid name given"); - return NULL; - } -create_error: - { - /* create_session already warned */ - return NULL; - } -existed: - { - g_warning ("rdtmanager: recv_rtp pad already requested for session %d", - sessid); - return NULL; - } -} - -/* Create a pad for receiving RTCP for the session in @name - */ -static GstPad * -create_recv_rtcp (GstRDTManager * rdtmanager, GstPadTemplate * templ, - const gchar * name) -{ - guint sessid; - GstRDTManagerSession *session; - - /* first get the session number */ - if (name == NULL || sscanf (name, "recv_rtcp_sink_%u", &sessid) != 1) - goto no_name; - - GST_DEBUG_OBJECT (rdtmanager, "finding session %d", sessid); - - /* get the session, it must exist or we error */ - session = find_session_by_id (rdtmanager, sessid); - if (!session) - goto no_session; - - /* check if pad was requested */ - if (session->recv_rtcp_sink != NULL) - goto existed; - - GST_DEBUG_OBJECT (rdtmanager, "getting RTCP sink pad"); - - session->recv_rtcp_sink = gst_pad_new_from_template (templ, name); - gst_pad_set_element_private (session->recv_rtp_sink, session); - gst_pad_set_chain_function (session->recv_rtcp_sink, - gst_rdt_manager_chain_rtcp); - gst_pad_set_active (session->recv_rtcp_sink, TRUE); - gst_element_add_pad (GST_ELEMENT_CAST (rdtmanager), session->recv_rtcp_sink); - - return session->recv_rtcp_sink; - - /* ERRORS */ -no_name: - { - g_warning ("rdtmanager: invalid name given"); - return NULL; - } -no_session: - { - g_warning ("rdtmanager: no session with id %d", sessid); - return NULL; - } -existed: - { - g_warning ("rdtmanager: recv_rtcp pad already requested for session %d", - sessid); - return NULL; - } -} - -/* Create a pad for sending RTCP for the session in @name - */ -static GstPad * -create_rtcp (GstRDTManager * rdtmanager, GstPadTemplate * templ, - const gchar * name) -{ - guint sessid; - GstRDTManagerSession *session; - - /* first get the session number */ - if (name == NULL || sscanf (name, "rtcp_src_%u", &sessid) != 1) - goto no_name; - - /* get or create session */ - session = find_session_by_id (rdtmanager, sessid); - if (!session) - goto no_session; - - /* check if pad was requested */ - if (session->rtcp_src != NULL) - goto existed; - - session->rtcp_src = gst_pad_new_from_template (templ, name); - gst_pad_set_active (session->rtcp_src, TRUE); - gst_element_add_pad (GST_ELEMENT_CAST (rdtmanager), session->rtcp_src); - - return session->rtcp_src; - - /* ERRORS */ -no_name: - { - g_warning ("rdtmanager: invalid name given"); - return NULL; - } -no_session: - { - g_warning ("rdtmanager: session with id %d does not exist", sessid); - return NULL; - } -existed: - { - g_warning ("rdtmanager: rtcp_src pad already requested for session %d", - sessid); - return NULL; - } -} - -/* - */ -static GstPad * -gst_rdt_manager_request_new_pad (GstElement * element, - GstPadTemplate * templ, const gchar * name, const GstCaps * caps) -{ - GstRDTManager *rdtmanager; - GstElementClass *klass; - GstPad *result; - - g_return_val_if_fail (templ != NULL, NULL); - g_return_val_if_fail (GST_IS_RDT_MANAGER (element), NULL); - - rdtmanager = GST_RDT_MANAGER (element); - klass = GST_ELEMENT_GET_CLASS (element); - - /* figure out the template */ - if (templ == gst_element_class_get_pad_template (klass, "recv_rtp_sink_%u")) { - result = create_recv_rtp (rdtmanager, templ, name); - } else if (templ == gst_element_class_get_pad_template (klass, - "recv_rtcp_sink_%u")) { - result = create_recv_rtcp (rdtmanager, templ, name); - } else if (templ == gst_element_class_get_pad_template (klass, "rtcp_src_%u")) { - result = create_rtcp (rdtmanager, templ, name); - } else - goto wrong_template; - - return result; - - /* ERRORS */ -wrong_template: - { - g_warning ("rdtmanager: this is not our template"); - return NULL; - } -} - -static void -gst_rdt_manager_release_pad (GstElement * element, GstPad * pad) -{ -}
View file
gst-plugins-ugly-1.22.7.tar.xz/gst/realmedia/rdtmanager.h
Deleted
@@ -1,93 +0,0 @@ -/* GStreamer - * Copyright (C) <2005,2006> Wim Taymans <wim@fluendo.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ -/* - * Unless otherwise indicated, Source Code is licensed under MIT license. - * See further explanation attached in License Statement (distributed in the file - * LICENSE). - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is furnished to do - * so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef __GST_RDT_MANAGER_H__ -#define __GST_RDT_MANAGER_H__ - -#include <gst/gst.h> - -G_BEGIN_DECLS - -#define GST_TYPE_RDT_MANAGER (gst_rdt_manager_get_type()) -#define GST_IS_RDT_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RDT_MANAGER)) -#define GST_IS_RDT_MANAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RDT_MANAGER)) -#define GST_RDT_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RDT_MANAGER, GstRDTManager)) -#define GST_RDT_MANAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RDT_MANAGER, GstRDTManagerClass)) - -typedef struct _GstRDTManager GstRDTManager; -typedef struct _GstRDTManagerClass GstRDTManagerClass; -typedef struct _GstRDTManagerSession GstRDTManagerSession; - -struct _GstRDTManager { - GstElement element; - - guint latency; - GSList *sessions; - GstClock *provided_clock; -}; - -struct _GstRDTManagerClass { - GstElementClass parent_class; - - /* get the caps for pt */ - GstCaps* (*request_pt_map) (GstRDTManager *rtpdec, guint session, guint pt); - - void (*clear_pt_map) (GstRDTManager *rtpdec); - - void (*on_new_ssrc) (GstRDTManager *rtpdec, guint session, guint32 ssrc); - void (*on_ssrc_collision) (GstRDTManager *rtpdec, guint session, guint32 ssrc); - void (*on_ssrc_validated) (GstRDTManager *rtpdec, guint session, guint32 ssrc); - void (*on_ssrc_active) (GstRDTManager *rtpdec, guint session, guint32 ssrc); - void (*on_ssrc_sdes) (GstRDTManager *rtpdec, guint session, guint32 ssrc); - void (*on_bye_ssrc) (GstRDTManager *rtpdec, guint session, guint32 ssrc); - void (*on_bye_timeout) (GstRDTManager *rtpdec, guint session, guint32 ssrc); - void (*on_timeout) (GstRDTManager *rtpdec, guint session, guint32 ssrc); - void (*on_npt_stop) (GstRDTManager *rtpdec, guint session, guint32 ssrc); -}; - -GType gst_rdt_manager_get_type(void); - -GST_ELEMENT_REGISTER_DECLARE (rdtmanager); - -G_END_DECLS - -#endif /* __GST_RDT_MANAGER_H__ */
View file
gst-plugins-ugly-1.22.7.tar.xz/gst/realmedia/realhash.c
Deleted
@@ -1,324 +0,0 @@ -/* GStreamer - * Copyright (C) <2005,2006> Wim Taymans <wim@fluendo.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ -/* Element-Checklist-Version: 5 */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#ifdef HAVE_STDINT_H -#include <stdint.h> -#endif - -#include <string.h> - -#include <gst/gst.h> - -#include "realhash.h" - -void rtsp_ext_real_calc_response_and_checksum (char *response, - char *chksum, char *challenge); - -/* - * The following code has been copied from - * xine-lib-1.1.1/src/input/libreal/real.c. - */ - -static const unsigned char xor_table = { - 0x05, 0x18, 0x74, 0xd0, 0x0d, 0x09, 0x02, 0x53, - 0xc0, 0x01, 0x05, 0x05, 0x67, 0x03, 0x19, 0x70, - 0x08, 0x27, 0x66, 0x10, 0x10, 0x72, 0x08, 0x09, - 0x63, 0x11, 0x03, 0x71, 0x08, 0x08, 0x70, 0x02, - 0x10, 0x57, 0x05, 0x18, 0x54, 0x00, 0x00, 0x00 -}; - -#define LE_32(x) GST_READ_UINT32_LE(x) -#define BE_32C(x,y) GST_WRITE_UINT32_BE(x,y) -#define LE_32C(x,y) GST_WRITE_UINT32_LE(x,y) - -static void -hash (char *field, char *param) -{ - uint32_t a, b, c, d; - - /* fill variables */ - a = LE_32 (field); - b = LE_32 (field + 4); - c = LE_32 (field + 8); - d = LE_32 (field + 12); - - a = ((b & c) | (~b & d)) + LE_32 ((param + 0x00)) + a - 0x28955B88; - a = ((a << 0x07) | (a >> 0x19)) + b; - d = ((a & b) | (~a & c)) + LE_32 ((param + 0x04)) + d - 0x173848AA; - d = ((d << 0x0c) | (d >> 0x14)) + a; - c = ((d & a) | (~d & b)) + LE_32 ((param + 0x08)) + c + 0x242070DB; - c = ((c << 0x11) | (c >> 0x0f)) + d; - b = ((c & d) | (~c & a)) + LE_32 ((param + 0x0c)) + b - 0x3E423112; - b = ((b << 0x16) | (b >> 0x0a)) + c; - a = ((b & c) | (~b & d)) + LE_32 ((param + 0x10)) + a - 0x0A83F051; - a = ((a << 0x07) | (a >> 0x19)) + b; - d = ((a & b) | (~a & c)) + LE_32 ((param + 0x14)) + d + 0x4787C62A; - d = ((d << 0x0c) | (d >> 0x14)) + a; - c = ((d & a) | (~d & b)) + LE_32 ((param + 0x18)) + c - 0x57CFB9ED; - c = ((c << 0x11) | (c >> 0x0f)) + d; - b = ((c & d) | (~c & a)) + LE_32 ((param + 0x1c)) + b - 0x02B96AFF; - b = ((b << 0x16) | (b >> 0x0a)) + c; - a = ((b & c) | (~b & d)) + LE_32 ((param + 0x20)) + a + 0x698098D8; - a = ((a << 0x07) | (a >> 0x19)) + b; - d = ((a & b) | (~a & c)) + LE_32 ((param + 0x24)) + d - 0x74BB0851; - d = ((d << 0x0c) | (d >> 0x14)) + a; - c = ((d & a) | (~d & b)) + LE_32 ((param + 0x28)) + c - 0x0000A44F; - c = ((c << 0x11) | (c >> 0x0f)) + d; - b = ((c & d) | (~c & a)) + LE_32 ((param + 0x2C)) + b - 0x76A32842; - b = ((b << 0x16) | (b >> 0x0a)) + c; - a = ((b & c) | (~b & d)) + LE_32 ((param + 0x30)) + a + 0x6B901122; - a = ((a << 0x07) | (a >> 0x19)) + b; - d = ((a & b) | (~a & c)) + LE_32 ((param + 0x34)) + d - 0x02678E6D; - d = ((d << 0x0c) | (d >> 0x14)) + a; - c = ((d & a) | (~d & b)) + LE_32 ((param + 0x38)) + c - 0x5986BC72; - c = ((c << 0x11) | (c >> 0x0f)) + d; - b = ((c & d) | (~c & a)) + LE_32 ((param + 0x3c)) + b + 0x49B40821; - b = ((b << 0x16) | (b >> 0x0a)) + c; - - a = ((b & d) | (~d & c)) + LE_32 ((param + 0x04)) + a - 0x09E1DA9E; - a = ((a << 0x05) | (a >> 0x1b)) + b; - d = ((a & c) | (~c & b)) + LE_32 ((param + 0x18)) + d - 0x3FBF4CC0; - d = ((d << 0x09) | (d >> 0x17)) + a; - c = ((d & b) | (~b & a)) + LE_32 ((param + 0x2c)) + c + 0x265E5A51; - c = ((c << 0x0e) | (c >> 0x12)) + d; - b = ((c & a) | (~a & d)) + LE_32 ((param + 0x00)) + b - 0x16493856; - b = ((b << 0x14) | (b >> 0x0c)) + c; - a = ((b & d) | (~d & c)) + LE_32 ((param + 0x14)) + a - 0x29D0EFA3; - a = ((a << 0x05) | (a >> 0x1b)) + b; - d = ((a & c) | (~c & b)) + LE_32 ((param + 0x28)) + d + 0x02441453; - d = ((d << 0x09) | (d >> 0x17)) + a; - c = ((d & b) | (~b & a)) + LE_32 ((param + 0x3c)) + c - 0x275E197F; - c = ((c << 0x0e) | (c >> 0x12)) + d; - b = ((c & a) | (~a & d)) + LE_32 ((param + 0x10)) + b - 0x182C0438; - b = ((b << 0x14) | (b >> 0x0c)) + c; - a = ((b & d) | (~d & c)) + LE_32 ((param + 0x24)) + a + 0x21E1CDE6; - a = ((a << 0x05) | (a >> 0x1b)) + b; - d = ((a & c) | (~c & b)) + LE_32 ((param + 0x38)) + d - 0x3CC8F82A; - d = ((d << 0x09) | (d >> 0x17)) + a; - c = ((d & b) | (~b & a)) + LE_32 ((param + 0x0c)) + c - 0x0B2AF279; - c = ((c << 0x0e) | (c >> 0x12)) + d; - b = ((c & a) | (~a & d)) + LE_32 ((param + 0x20)) + b + 0x455A14ED; - b = ((b << 0x14) | (b >> 0x0c)) + c; - a = ((b & d) | (~d & c)) + LE_32 ((param + 0x34)) + a - 0x561C16FB; - a = ((a << 0x05) | (a >> 0x1b)) + b; - d = ((a & c) | (~c & b)) + LE_32 ((param + 0x08)) + d - 0x03105C08; - d = ((d << 0x09) | (d >> 0x17)) + a; - c = ((d & b) | (~b & a)) + LE_32 ((param + 0x1c)) + c + 0x676F02D9; - c = ((c << 0x0e) | (c >> 0x12)) + d; - b = ((c & a) | (~a & d)) + LE_32 ((param + 0x30)) + b - 0x72D5B376; - b = ((b << 0x14) | (b >> 0x0c)) + c; - - a = (b ^ c ^ d) + LE_32 ((param + 0x14)) + a - 0x0005C6BE; - a = ((a << 0x04) | (a >> 0x1c)) + b; - d = (a ^ b ^ c) + LE_32 ((param + 0x20)) + d - 0x788E097F; - d = ((d << 0x0b) | (d >> 0x15)) + a; - c = (d ^ a ^ b) + LE_32 ((param + 0x2c)) + c + 0x6D9D6122; - c = ((c << 0x10) | (c >> 0x10)) + d; - b = (c ^ d ^ a) + LE_32 ((param + 0x38)) + b - 0x021AC7F4; - b = ((b << 0x17) | (b >> 0x09)) + c; - a = (b ^ c ^ d) + LE_32 ((param + 0x04)) + a - 0x5B4115BC; - a = ((a << 0x04) | (a >> 0x1c)) + b; - d = (a ^ b ^ c) + LE_32 ((param + 0x10)) + d + 0x4BDECFA9; - d = ((d << 0x0b) | (d >> 0x15)) + a; - c = (d ^ a ^ b) + LE_32 ((param + 0x1c)) + c - 0x0944B4A0; - c = ((c << 0x10) | (c >> 0x10)) + d; - b = (c ^ d ^ a) + LE_32 ((param + 0x28)) + b - 0x41404390; - b = ((b << 0x17) | (b >> 0x09)) + c; - a = (b ^ c ^ d) + LE_32 ((param + 0x34)) + a + 0x289B7EC6; - a = ((a << 0x04) | (a >> 0x1c)) + b; - d = (a ^ b ^ c) + LE_32 ((param + 0x00)) + d - 0x155ED806; - d = ((d << 0x0b) | (d >> 0x15)) + a; - c = (d ^ a ^ b) + LE_32 ((param + 0x0c)) + c - 0x2B10CF7B; - c = ((c << 0x10) | (c >> 0x10)) + d; - b = (c ^ d ^ a) + LE_32 ((param + 0x18)) + b + 0x04881D05; - b = ((b << 0x17) | (b >> 0x09)) + c; - a = (b ^ c ^ d) + LE_32 ((param + 0x24)) + a - 0x262B2FC7; - a = ((a << 0x04) | (a >> 0x1c)) + b; - d = (a ^ b ^ c) + LE_32 ((param + 0x30)) + d - 0x1924661B; - d = ((d << 0x0b) | (d >> 0x15)) + a; - c = (d ^ a ^ b) + LE_32 ((param + 0x3c)) + c + 0x1fa27cf8; - c = ((c << 0x10) | (c >> 0x10)) + d; - b = (c ^ d ^ a) + LE_32 ((param + 0x08)) + b - 0x3B53A99B; - b = ((b << 0x17) | (b >> 0x09)) + c; - - a = ((~d | b) ^ c) + LE_32 ((param + 0x00)) + a - 0x0BD6DDBC; - a = ((a << 0x06) | (a >> 0x1a)) + b; - d = ((~c | a) ^ b) + LE_32 ((param + 0x1c)) + d + 0x432AFF97; - d = ((d << 0x0a) | (d >> 0x16)) + a; - c = ((~b | d) ^ a) + LE_32 ((param + 0x38)) + c - 0x546BDC59; - c = ((c << 0x0f) | (c >> 0x11)) + d; - b = ((~a | c) ^ d) + LE_32 ((param + 0x14)) + b - 0x036C5FC7; - b = ((b << 0x15) | (b >> 0x0b)) + c; - a = ((~d | b) ^ c) + LE_32 ((param + 0x30)) + a + 0x655B59C3; - a = ((a << 0x06) | (a >> 0x1a)) + b; - d = ((~c | a) ^ b) + LE_32 ((param + 0x0C)) + d - 0x70F3336E; - d = ((d << 0x0a) | (d >> 0x16)) + a; - c = ((~b | d) ^ a) + LE_32 ((param + 0x28)) + c - 0x00100B83; - c = ((c << 0x0f) | (c >> 0x11)) + d; - b = ((~a | c) ^ d) + LE_32 ((param + 0x04)) + b - 0x7A7BA22F; - b = ((b << 0x15) | (b >> 0x0b)) + c; - a = ((~d | b) ^ c) + LE_32 ((param + 0x20)) + a + 0x6FA87E4F; - a = ((a << 0x06) | (a >> 0x1a)) + b; - d = ((~c | a) ^ b) + LE_32 ((param + 0x3c)) + d - 0x01D31920; - d = ((d << 0x0a) | (d >> 0x16)) + a; - c = ((~b | d) ^ a) + LE_32 ((param + 0x18)) + c - 0x5CFEBCEC; - c = ((c << 0x0f) | (c >> 0x11)) + d; - b = ((~a | c) ^ d) + LE_32 ((param + 0x34)) + b + 0x4E0811A1; - b = ((b << 0x15) | (b >> 0x0b)) + c; - a = ((~d | b) ^ c) + LE_32 ((param + 0x10)) + a - 0x08AC817E; - a = ((a << 0x06) | (a >> 0x1a)) + b; - d = ((~c | a) ^ b) + LE_32 ((param + 0x2c)) + d - 0x42C50DCB; - d = ((d << 0x0a) | (d >> 0x16)) + a; - c = ((~b | d) ^ a) + LE_32 ((param + 0x08)) + c + 0x2AD7D2BB; - c = ((c << 0x0f) | (c >> 0x11)) + d; - b = ((~a | c) ^ d) + LE_32 ((param + 0x24)) + b - 0x14792C6F; - b = ((b << 0x15) | (b >> 0x0b)) + c; - - a += LE_32 (field); - b += LE_32 (field + 4); - c += LE_32 (field + 8); - d += LE_32 (field + 12); - - LE_32C (field, a); - LE_32C (field + 4, b); - LE_32C (field + 8, c); - LE_32C (field + 12, d); -} - -static void -call_hash (char *key, char *challenge, int len) -{ - uint8_t *ptr1, *ptr2; - uint32_t a, b, c, d, tmp; - - ptr1 = (uint8_t *) (key + 16); - ptr2 = (uint8_t *) (key + 20); - - a = LE_32 (ptr1); - b = (a >> 3) & 0x3f; - a += len * 8; - LE_32C (ptr1, a); - - if (a < (len << 3)) - ptr2 += 4; - - tmp = LE_32 (ptr2) + (len >> 0x1d); - LE_32C (ptr2, tmp); - a = 64 - b; - c = 0; - if (a <= len) { - - memcpy (key + b + 24, challenge, a); - hash (key, key + 24); - c = a; - d = c + 0x3f; - - while (d < len) { - hash (key, challenge + d - 0x3f); - d += 64; - c += 64; - } - b = 0; - } - - memcpy (key + b + 24, challenge + c, len - c); -} - -void -gst_rtsp_ext_real_calc_response_and_checksum (char *response, char *chksum, - char *challenge) -{ - int ch_len, table_len, resp_len; - int i; - char *ptr; - char buf128; - char field128; - char zres20; - char buf1128; - char buf2128; - - /* initialize return values */ - memset (response, 0, 64); - memset (chksum, 0, 34); - - /* initialize buffer */ - memset (buf, 0, 128); - ptr = buf; - BE_32C (ptr, 0xa1e9149d); - ptr += 4; - BE_32C (ptr, 0x0e6b3b59); - ptr += 4; - - if ((ch_len = MIN (strlen (challenge), 56)) == 40) { - challenge32 = 0; - ch_len = 32; - } - memcpy (ptr, challenge, ch_len); - - /* xor challenge bytewise with xor_table */ - table_len = MIN (strlen ((char *) xor_table), 56); - for (i = 0; i < table_len; i++) - ptri = ptri ^ xor_tablei; - - /* initialize our field */ - BE_32C (field, 0x01234567); - BE_32C (field + 4, 0x89ABCDEF); - BE_32C (field + 8, 0xFEDCBA98); - BE_32C (field + 12, 0x76543210); - BE_32C (field + 16, 0x00000000); - BE_32C (field + 20, 0x00000000); - - /* calculate response */ - call_hash (field, buf, 64); - memset (buf1, 0, 64); - *buf1 = (char) 128; - memcpy (buf2, field + 16, 8); - i = (LE_32 ((buf2)) >> 3) & 0x3f; - if (i < 56) - i = 56 - i; - else - i = 120 - i; - call_hash (field, buf1, i); - call_hash (field, buf2, 8); - memcpy (zres, field, 16); - - /* convert zres to ascii string */ - for (i = 0; i < 16; i++) { - char a, b; - - a = (zresi >> 4) & 15; - b = zresi & 15; - - responsei * 2 = ((a < 10) ? (a + 48) : (a + 87)) & 255; - responsei * 2 + 1 = ((b < 10) ? (b + 48) : (b + 87)) & 255; - } - - /* add tail */ - resp_len = strlen (response); - strcpy (&responseresp_len, "01d0a8e3"); - - /* calculate checksum */ - for (i = 0; i < resp_len / 4; i++) - chksumi = responsei * 4; -}
View file
gst-plugins-ugly-1.22.7.tar.xz/gst/realmedia/realhash.h
Deleted
@@ -1,31 +0,0 @@ -/* GStreamer - * Copyright (C) <2005,2006> Wim Taymans <wim@fluendo.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifndef __GST_RTSP_HASH_H__ -#define __GST_RTSP_HASH_H__ - -G_BEGIN_DECLS - -void -gst_rtsp_ext_real_calc_response_and_checksum (char *response, char *chksum, - char *challenge); - -G_END_DECLS - -#endif /* __GST_RTSP_HASH_H__ */
View file
gst-plugins-ugly-1.22.7.tar.xz/gst/realmedia/rtspreal.c
Deleted
@@ -1,735 +0,0 @@ -/* GStreamer - * Copyright (C) <2005,2006> Wim Taymans <wim@fluendo.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ -/* Element-Checklist-Version: 5 */ - -/** - * SECTION:element-rtspreal - * @title: rtspreal - * - * A RealMedia RTSP extension - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#ifdef HAVE_STDINT_H -#include <stdint.h> -#endif - -#include <stdlib.h> -#include <string.h> - -#include <gst/rtsp/gstrtspextension.h> - -#include "realhash.h" -#include "rtspreal.h" -#include "asmrules.h" - -GST_DEBUG_CATEGORY_STATIC (rtspreal_debug); -#define GST_CAT_DEFAULT (rtspreal_debug) - -#define SERVER_PREFIX "RealServer" -#define DEFAULT_BANDWIDTH "10485800" - -static GstRTSPResult -rtsp_ext_real_get_transports (GstRTSPExtension * ext, - GstRTSPLowerTrans protocols, gchar ** transport) -{ - GstRTSPReal *ctx = (GstRTSPReal *) ext; - GString *str; - - if (!ctx->isreal) - return GST_RTSP_OK; - - GST_DEBUG_OBJECT (ext, "generating transports for %d", protocols); - - str = g_string_new (""); - - /* - if (protocols & GST_RTSP_LOWER_TRANS_UDP_MCAST) { - g_string_append (str, "x-real-rdt/mcast;client_port=%%u1;mode=play,"); - } - if (protocols & GST_RTSP_LOWER_TRANS_UDP) { - g_string_append (str, "x-real-rdt/udp;client_port=%%u1;mode=play,"); - g_string_append (str, "x-pn-tng/udp;client_port=%%u1;mode=play,"); - } - */ - if (protocols & GST_RTSP_LOWER_TRANS_TCP) { - g_string_append (str, "x-real-rdt/tcp;mode=play,"); - g_string_append (str, "x-pn-tng/tcp;mode=play,"); - } - - /* if we added something, remove trailing ',' */ - if (str->len > 0) - g_string_truncate (str, str->len - 1); - - *transport = g_string_free (str, FALSE); - - return GST_RTSP_OK; -} - -static GstRTSPResult -rtsp_ext_real_before_send (GstRTSPExtension * ext, GstRTSPMessage * request) -{ - GstRTSPReal *ctx = (GstRTSPReal *) ext; - - switch (request->type_data.request.method) { - case GST_RTSP_OPTIONS: - { - gst_rtsp_message_add_header (request, GST_RTSP_HDR_USER_AGENT, - //"RealMedia Player (" GST_PACKAGE_NAME ")"); - "RealMedia Player Version 6.0.9.1235 (linux-2.0-libc6-i386-gcc2.95)"); - gst_rtsp_message_add_header (request, GST_RTSP_HDR_CLIENT_CHALLENGE, - "9e26d33f2984236010ef6253fb1887f7"); - gst_rtsp_message_add_header (request, GST_RTSP_HDR_COMPANY_ID, - "KnKV4M4I/B2FjJ1TToLycw=="); - gst_rtsp_message_add_header (request, GST_RTSP_HDR_GUID, - "00000000-0000-0000-0000-000000000000"); - gst_rtsp_message_add_header (request, GST_RTSP_HDR_REGION_DATA, "0"); - gst_rtsp_message_add_header (request, GST_RTSP_HDR_PLAYER_START_TIME, - "28/03/2003:22:50:23 00:00"); - gst_rtsp_message_add_header (request, GST_RTSP_HDR_CLIENT_ID, - "Linux_2.4_6.0.9.1235_play32_RN01_EN_586"); - ctx->isreal = FALSE; - break; - } - case GST_RTSP_DESCRIBE: - { - if (ctx->isreal) { - gst_rtsp_message_add_header (request, GST_RTSP_HDR_BANDWIDTH, - DEFAULT_BANDWIDTH); - gst_rtsp_message_add_header (request, GST_RTSP_HDR_GUID, - "00000000-0000-0000-0000-000000000000"); - gst_rtsp_message_add_header (request, GST_RTSP_HDR_REGION_DATA, "0"); - gst_rtsp_message_add_header (request, GST_RTSP_HDR_CLIENT_ID, - "Linux_2.4_6.0.9.1235_play32_RN01_EN_586"); - gst_rtsp_message_add_header (request, GST_RTSP_HDR_MAX_ASM_WIDTH, "1"); - gst_rtsp_message_add_header (request, GST_RTSP_HDR_LANGUAGE, "en-US"); - gst_rtsp_message_add_header (request, GST_RTSP_HDR_REQUIRE, - "com.real.retain-entity-for-setup"); - } - break; - } - case GST_RTSP_SETUP: - { - if (ctx->isreal) { - gchar *value = - g_strdup_printf ("%s, sd=%s", ctx->challenge2, ctx->checksum); - gst_rtsp_message_add_header (request, GST_RTSP_HDR_REAL_CHALLENGE2, - value); - gst_rtsp_message_add_header (request, GST_RTSP_HDR_IF_MATCH, ctx->etag); - g_free (value); - } - break; - } - default: - break; - } - return GST_RTSP_OK; -} - -static GstRTSPResult -rtsp_ext_real_after_send (GstRTSPExtension * ext, GstRTSPMessage * req, - GstRTSPMessage * resp) -{ - GstRTSPReal *ctx = (GstRTSPReal *) ext; - - switch (req->type_data.request.method) { - case GST_RTSP_OPTIONS: - { - gchar *challenge1 = NULL; - gchar *server = NULL; - - gst_rtsp_message_get_header (resp, GST_RTSP_HDR_SERVER, &server, 0); - - gst_rtsp_message_get_header (resp, GST_RTSP_HDR_REAL_CHALLENGE1, - &challenge1, 0); - if (!challenge1) - goto no_challenge1; - - gst_rtsp_ext_real_calc_response_and_checksum (ctx->challenge2, - ctx->checksum, challenge1); - - GST_DEBUG_OBJECT (ctx, "Found Real challenge tag"); - ctx->isreal = TRUE; - break; - } - case GST_RTSP_DESCRIBE: - { - gchar *etag = NULL; - guint len; - - gst_rtsp_message_get_header (resp, GST_RTSP_HDR_ETAG, &etag, 0); - if (etag) { - len = sizeof (ctx->etag); - strncpy (ctx->etag, etag, len); - ctx->etaglen - 1 = '\0'; - } - break; - } - default: - break; - } - return GST_RTSP_OK; - - /* ERRORS */ -no_challenge1: - { - GST_DEBUG_OBJECT (ctx, "Could not find challenge tag."); - ctx->isreal = FALSE; - return GST_RTSP_OK; - } -} - -#define ENSURE_SIZE(size) \ -G_STMT_START { \ - while (data_len < size) { \ - data_len += 1024; \ - data = g_realloc (data, data_len); \ - } \ -} G_STMT_END - -#define READ_BUFFER_GEN(src, func, name, dest, dest_len) \ -G_STMT_START { \ - dest = (gchar *)func (src, name); \ - dest_len = 0; \ - if (!dest) { \ - dest = (char *) ""; \ - } \ - else if (!strncmp (dest, "buffer;\"", 8)) { \ - dest += 8; \ - dest_len = strlen (dest) - 1; \ - destdest_len = '\0'; \ - g_base64_decode_inplace (dest, &dest_len); \ - } \ -} G_STMT_END - -#define READ_BUFFER(sdp, name, dest, dest_len) \ - READ_BUFFER_GEN(sdp, gst_sdp_message_get_attribute_val, name, dest, dest_len) -#define READ_BUFFER_M(media, name, dest, dest_len) \ - READ_BUFFER_GEN(media, gst_sdp_media_get_attribute_val, name, dest, dest_len) - -#define READ_INT_GEN(src, func, name, dest) \ -G_STMT_START { \ - const gchar *val = func (src, name); \ - if (val && !strncmp (val, "integer;", 8)) \ - dest = atoi (val + 8); \ - else \ - dest = 0; \ -} G_STMT_END - -#define READ_INT(sdp, name, dest) \ - READ_INT_GEN(sdp, gst_sdp_message_get_attribute_val, name, dest) -#define READ_INT_M(media, name, dest) \ - READ_INT_GEN(media, gst_sdp_media_get_attribute_val, name, dest) - -#define READ_STRING(media, name, dest, dest_len) \ -G_STMT_START { \ - const gchar *val = gst_sdp_media_get_attribute_val (media, name); \ - if (val && !strncmp (val, "string;\"", 8)) { \ - dest = (gchar *) val + 8; \ - dest_len = strlen (dest) - 1; \ - destdest_len = '\0'; \ - } else { \ - dest = (char *) ""; \ - dest_len = 0; \ - } \ -} G_STMT_END - -#define WRITE_STRING1(datap, str, str_len) \ -G_STMT_START { \ - *datap = str_len; \ - memcpy ((datap) + 1, str, str_len); \ - datap += str_len + 1; \ -} G_STMT_END - -#define WRITE_STRING2(datap, str, str_len) \ -G_STMT_START { \ - GST_WRITE_UINT16_BE (datap, str_len); \ - memcpy (datap + 2, str, str_len); \ - datap += str_len + 2; \ -} G_STMT_END - -static GstRTSPResult -rtsp_ext_real_parse_sdp (GstRTSPExtension * ext, GstSDPMessage * sdp, - GstStructure * props) -{ - GstRTSPReal *ctx = (GstRTSPReal *) ext; - guint size; - gint i; - gchar *title, *author, *copyright, *comment; - gsize title_len, author_len, copyright_len, comment_len; - guint8 *data = NULL, *datap; - guint data_len = 0, offset; - GstBuffer *buf; - gchar *opaque_data; - gsize opaque_data_len, asm_rule_book_len; - GHashTable *vars; - GString *rules; - - /* don't bother for non-real formats */ - READ_INT (sdp, "IsRealDataType", ctx->isreal); - if (!ctx->isreal) - return TRUE; - - /* Force PAUSE | PLAY */ - //src->methods |= GST_RTSP_PLAY | GST_RTSP_PAUSE; - - ctx->n_streams = gst_sdp_message_medias_len (sdp); - - ctx->max_bit_rate = 0; - ctx->avg_bit_rate = 0; - ctx->max_packet_size = 0; - ctx->avg_packet_size = 0; - ctx->duration = 0; - - for (i = 0; i < ctx->n_streams; i++) { - const GstSDPMedia *media; - gint intval; - - media = gst_sdp_message_get_media (sdp, i); - - READ_INT_M (media, "MaxBitRate", intval); - ctx->max_bit_rate += intval; - READ_INT_M (media, "AvgBitRate", intval); - ctx->avg_bit_rate += intval; - READ_INT_M (media, "MaxPacketSize", intval); - ctx->max_packet_size = MAX (ctx->max_packet_size, intval); - READ_INT_M (media, "AvgPacketSize", intval); - ctx->avg_packet_size = (ctx->avg_packet_size * i + intval) / (i + 1); - READ_INT_M (media, "Duration", intval); - ctx->duration = MAX (ctx->duration, intval); - } - - /* FIXME: use GstByteWriter to write the header */ - /* PROP */ - offset = 0; - size = 50; - ENSURE_SIZE (size); - datap = data + offset; - - memcpy (datap + 0, "PROP", 4); - GST_WRITE_UINT32_BE (datap + 4, size); - GST_WRITE_UINT16_BE (datap + 8, 0); - GST_WRITE_UINT32_BE (datap + 10, ctx->max_bit_rate); - GST_WRITE_UINT32_BE (datap + 14, ctx->avg_bit_rate); - GST_WRITE_UINT32_BE (datap + 18, ctx->max_packet_size); - GST_WRITE_UINT32_BE (datap + 22, ctx->avg_packet_size); - GST_WRITE_UINT32_BE (datap + 26, 0); - GST_WRITE_UINT32_BE (datap + 30, ctx->duration); - GST_WRITE_UINT32_BE (datap + 34, 0); - GST_WRITE_UINT32_BE (datap + 38, 0); - GST_WRITE_UINT32_BE (datap + 42, 0); - GST_WRITE_UINT16_BE (datap + 46, ctx->n_streams); - GST_WRITE_UINT16_BE (datap + 48, 0); - offset += size; - - /* CONT */ - READ_BUFFER (sdp, "Title", title, title_len); - READ_BUFFER (sdp, "Author", author, author_len); - READ_BUFFER (sdp, "Comment", comment, comment_len); - READ_BUFFER (sdp, "Copyright", copyright, copyright_len); - - size = 18 + title_len + author_len + comment_len + copyright_len; - ENSURE_SIZE (offset + size); - datap = data + offset; - - memcpy (datap, "CONT", 4); - GST_WRITE_UINT32_BE (datap + 4, size); - GST_WRITE_UINT16_BE (datap + 8, 0); /* Version */ - datap += 10; - WRITE_STRING2 (datap, title, title_len); - WRITE_STRING2 (datap, author, author_len); - WRITE_STRING2 (datap, copyright, copyright_len); - WRITE_STRING2 (datap, comment, comment_len); - offset += size; - - /* fix the hashtale for the rule parser */ - rules = g_string_new (""); - vars = g_hash_table_new (g_str_hash, g_str_equal); - g_hash_table_insert (vars, (gchar *) "Bandwidth", - (gchar *) DEFAULT_BANDWIDTH); - - /* MDPR */ - for (i = 0; i < ctx->n_streams; i++) { - const GstSDPMedia *media; - guint32 len; - GstRTSPRealStream *stream; - gchar *str; - gint rulematchesMAX_RULEMATCHES; - gint sel, j, n; - - media = gst_sdp_message_get_media (sdp, i); - - if (media->media && !strcmp (media->media, "data")) - continue; - - stream = g_new0 (GstRTSPRealStream, 1); - ctx->streams = g_list_append (ctx->streams, stream); - - READ_INT_M (media, "MaxBitRate", stream->max_bit_rate); - READ_INT_M (media, "AvgBitRate", stream->avg_bit_rate); - READ_INT_M (media, "MaxPacketSize", stream->max_packet_size); - READ_INT_M (media, "AvgPacketSize", stream->avg_packet_size); - READ_INT_M (media, "StartTime", stream->start_time); - READ_INT_M (media, "Preroll", stream->preroll); - READ_INT_M (media, "Duration", stream->duration); - READ_STRING (media, "StreamName", str, stream->stream_name_len); - stream->stream_name = g_strndup (str, stream->stream_name_len); - READ_STRING (media, "mimetype", str, stream->mime_type_len); - stream->mime_type = g_strndup (str, stream->mime_type_len); - - /* FIXME: Depending on the current bandwidth, we need to select one - * bandwidth out of a list offered by the server. Someone needs to write - * a parser for strings like - * - * #($Bandwidth < 67959),TimestampDelivery=T,DropByN=T,priority=9; - * #($Bandwidth >= 67959) && ($Bandwidth < 167959),AverageBandwidth=67959, - * Priority=9;#($Bandwidth >= 67959) && ($Bandwidth < 167959), - * AverageBandwidth=0,Priority=5,OnDepend=\"1\"; - * #($Bandwidth >= 167959) && ($Bandwidth < 267959), - * AverageBandwidth=167959,Priority=9; - * #($Bandwidth >= 167959) && ($Bandwidth < 267959),AverageBandwidth=0, - * Priority=5,OnDepend=\"3\";#($Bandwidth >= 267959), - * AverageBandwidth=267959,Priority=9;#($Bandwidth >= 267959), - * AverageBandwidth=0,Priority=5,OnDepend=\"5\"; - * - * As I don't know how to do that, I just use the first entry (sel = 0). - * But to give you a starting point, I offer you above string - * in the variable 'asm_rule_book'. - */ - READ_STRING (media, "ASMRuleBook", str, asm_rule_book_len); - stream->rulebook = gst_asm_rule_book_new (str); - - n = gst_asm_rule_book_match (stream->rulebook, vars, rulematches); - for (j = 0; j < n; j++) { - g_string_append_printf (rules, "stream=%u;rule=%u,", i, rulematchesj); - } - - /* get the MLTI for the first matched rules */ - sel = rulematches0; - - READ_BUFFER_M (media, "OpaqueData", opaque_data, opaque_data_len); - - if (opaque_data_len < 4) { - GST_DEBUG_OBJECT (ctx, "opaque_data_len %" G_GSIZE_FORMAT " < 4", - opaque_data_len); - goto strange_opaque_data; - } - if (strncmp (opaque_data, "MLTI", 4)) { - GST_DEBUG_OBJECT (ctx, "no MLTI found, appending all"); - stream->type_specific_data_len = opaque_data_len; - stream->type_specific_data = g_memdup2 (opaque_data, opaque_data_len); - goto no_type_specific; - } - opaque_data += 4; - opaque_data_len -= 4; - - if (opaque_data_len < 2) { - GST_DEBUG_OBJECT (ctx, "opaque_data_len %" G_GSIZE_FORMAT " < 2", - opaque_data_len); - goto strange_opaque_data; - } - stream->num_rules = GST_READ_UINT16_BE (opaque_data); - opaque_data += 2; - opaque_data_len -= 2; - - if (sel >= stream->num_rules) { - GST_DEBUG_OBJECT (ctx, "sel %d >= num_rules %d", sel, stream->num_rules); - goto strange_opaque_data; - } - - if (opaque_data_len < 2 * sel) { - GST_DEBUG_OBJECT (ctx, "opaque_data_len %" G_GSIZE_FORMAT - " < 2 * sel (%d)", opaque_data_len, 2 * sel); - goto strange_opaque_data; - } - opaque_data += 2 * sel; - opaque_data_len -= 2 * sel; - - if (opaque_data_len < 2) { - GST_DEBUG_OBJECT (ctx, "opaque_data_len %" G_GSIZE_FORMAT " < 2", - opaque_data_len); - goto strange_opaque_data; - } - stream->codec = GST_READ_UINT16_BE (opaque_data); - opaque_data += 2; - opaque_data_len -= 2; - - if (opaque_data_len < 2 * (stream->num_rules - sel - 1)) { - GST_DEBUG_OBJECT (ctx, "opaque_data_len %" G_GSIZE_FORMAT - " < %d", opaque_data_len, 2 * (stream->num_rules - sel - 1)); - goto strange_opaque_data; - } - opaque_data += 2 * (stream->num_rules - sel - 1); - opaque_data_len -= 2 * (stream->num_rules - sel - 1); - - if (opaque_data_len < 2) { - GST_DEBUG_OBJECT (ctx, "opaque_data_len %" G_GSIZE_FORMAT " < 2", - opaque_data_len); - goto strange_opaque_data; - } - stream->num_rules = GST_READ_UINT16_BE (opaque_data); - opaque_data += 2; - opaque_data_len -= 2; - - if (stream->codec > stream->num_rules) { - GST_DEBUG_OBJECT (ctx, "codec %d > num_rules %d", stream->codec, - stream->num_rules); - goto strange_opaque_data; - } - - for (j = 0; j < stream->codec; j++) { - if (opaque_data_len < 4) { - GST_DEBUG_OBJECT (ctx, "opaque_data_len %" G_GSIZE_FORMAT " < 4", - opaque_data_len); - goto strange_opaque_data; - } - len = GST_READ_UINT32_BE (opaque_data); - opaque_data += 4; - opaque_data_len -= 4; - - if (opaque_data_len < len) { - GST_DEBUG_OBJECT (ctx, "opaque_data_len %" G_GSIZE_FORMAT " < len %d", - opaque_data_len, len); - goto strange_opaque_data; - } - opaque_data += len; - opaque_data_len -= len; - } - - if (opaque_data_len < 4) { - GST_DEBUG_OBJECT (ctx, "opaque_data_len %" G_GSIZE_FORMAT " < 4", - opaque_data_len); - goto strange_opaque_data; - } - stream->type_specific_data_len = GST_READ_UINT32_BE (opaque_data); - opaque_data += 4; - opaque_data_len -= 4; - - if (opaque_data_len < stream->type_specific_data_len) { - GST_DEBUG_OBJECT (ctx, "opaque_data_len %" G_GSIZE_FORMAT " < %d", - opaque_data_len, stream->type_specific_data_len); - goto strange_opaque_data; - } - stream->type_specific_data = - g_memdup2 (opaque_data, stream->type_specific_data_len); - - no_type_specific: - size = - 46 + stream->stream_name_len + stream->mime_type_len + - stream->type_specific_data_len; - ENSURE_SIZE (offset + size); - datap = data + offset; - - memcpy (datap, "MDPR", 4); - GST_WRITE_UINT32_BE (datap + 4, size); - GST_WRITE_UINT16_BE (datap + 8, 0); - GST_WRITE_UINT16_BE (datap + 10, i); - GST_WRITE_UINT32_BE (datap + 12, stream->max_bit_rate); - GST_WRITE_UINT32_BE (datap + 16, stream->avg_bit_rate); - GST_WRITE_UINT32_BE (datap + 20, stream->max_packet_size); - GST_WRITE_UINT32_BE (datap + 24, stream->avg_packet_size); - GST_WRITE_UINT32_BE (datap + 28, stream->start_time); - GST_WRITE_UINT32_BE (datap + 32, stream->preroll); - GST_WRITE_UINT32_BE (datap + 36, stream->duration); - datap += 40; - WRITE_STRING1 (datap, stream->stream_name, stream->stream_name_len); - WRITE_STRING1 (datap, stream->mime_type, stream->mime_type_len); - GST_WRITE_UINT32_BE (datap, stream->type_specific_data_len); - if (stream->type_specific_data_len) - memcpy (datap + 4, stream->type_specific_data, - stream->type_specific_data_len); - offset += size; - } - - /* destroy the rulebook hashtable now */ - g_hash_table_destroy (vars); - - /* strip final , if we added some stream rules */ - if (rules->len > 0) { - rules = g_string_truncate (rules, rules->len - 1); - } - - /* and store rules in the context */ - ctx->rules = g_string_free (rules, FALSE); - - /* DATA */ - size = 18; - ENSURE_SIZE (offset + size); - datap = data + offset; - - memcpy (datap, "DATA", 4); - GST_WRITE_UINT32_BE (datap + 4, size); - GST_WRITE_UINT16_BE (datap + 8, 0); - GST_WRITE_UINT32_BE (datap + 10, 0); /* number of packets */ - GST_WRITE_UINT32_BE (datap + 14, 0); /* next data header */ - offset += size; - - buf = gst_buffer_new_wrapped (data, offset); - - /* Set on caps */ - GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_HEADER); - gst_structure_set (props, "config", GST_TYPE_BUFFER, buf, NULL); - gst_buffer_unref (buf); - - /* Overwrite encoding and media fields */ - gst_structure_set (props, "encoding-name", G_TYPE_STRING, "X-REAL-RDT", NULL); - gst_structure_set (props, "media", G_TYPE_STRING, "application", NULL); - - return TRUE; - - /* ERRORS */ -strange_opaque_data: - { - g_string_free (rules, TRUE); - g_hash_table_destroy (vars); - g_free (data); - - GST_ELEMENT_ERROR (ctx, RESOURCE, WRITE, ("Strange opaque data."), (NULL)); - return FALSE; - } -} - -static GstRTSPResult -rtsp_ext_real_stream_select (GstRTSPExtension * ext, GstRTSPUrl * url) -{ - GstRTSPReal *ctx = (GstRTSPReal *) ext; - GstRTSPResult res; - GstRTSPMessage request = { 0 }; - GstRTSPMessage response = { 0 }; - gchar *req_url; - - if (!ctx->isreal) - return GST_RTSP_OK; - - if (!ctx->rules) - return GST_RTSP_OK; - - req_url = gst_rtsp_url_get_request_uri (url); - - /* create SET_PARAMETER */ - if ((res = gst_rtsp_message_init_request (&request, GST_RTSP_SET_PARAMETER, - req_url)) < 0) - goto create_request_failed; - - g_free (req_url); - - gst_rtsp_message_add_header (&request, GST_RTSP_HDR_SUBSCRIBE, ctx->rules); - - /* send SET_PARAMETER */ - if ((res = gst_rtsp_extension_send (ext, &request, &response)) < 0) - goto send_error; - - gst_rtsp_message_unset (&request); - gst_rtsp_message_unset (&response); - - return GST_RTSP_OK; - - /* ERRORS */ -create_request_failed: - { - GST_ELEMENT_ERROR (ctx, LIBRARY, INIT, - ("Could not create request."), (NULL)); - g_free (req_url); - goto reset; - } -send_error: - { - GST_ELEMENT_ERROR (ctx, RESOURCE, WRITE, - ("Could not send message."), (NULL)); - goto reset; - } -reset: - { - gst_rtsp_message_unset (&request); - gst_rtsp_message_unset (&response); - return res; - } -} - -static void gst_rtsp_real_extension_init (gpointer g_iface, - gpointer iface_data); -static void gst_rtsp_real_finalize (GObject * obj); - -#define gst_rtsp_real_parent_class parent_class -G_DEFINE_TYPE_WITH_CODE (GstRTSPReal, gst_rtsp_real, GST_TYPE_ELEMENT, - G_IMPLEMENT_INTERFACE (GST_TYPE_RTSP_EXTENSION, - gst_rtsp_real_extension_init)); -GST_ELEMENT_REGISTER_DEFINE (rtspreal, "rtspreal", - GST_RANK_MARGINAL, GST_TYPE_RTSP_REAL); - -static void -gst_rtsp_real_class_init (GstRTSPRealClass * g_class) -{ - GObjectClass *gobject_class = (GObjectClass *) g_class; - GstElementClass *gstelement_class = (GstElementClass *) g_class; - - gobject_class->finalize = gst_rtsp_real_finalize; - - gst_element_class_set_static_metadata (gstelement_class, - "RealMedia RTSP Extension", "Network/Extension/Protocol", - "Extends RTSP so that it can handle RealMedia setup", - "Wim Taymans <wim.taymans@gmail.com>"); - - GST_DEBUG_CATEGORY_INIT (rtspreal_debug, "rtspreal", 0, - "RealMedia RTSP extension"); -} - -static void -gst_rtsp_real_init (GstRTSPReal * rtspreal) -{ - rtspreal->isreal = FALSE; -} - -static void -gst_rtsp_stream_free (GstRTSPRealStream * stream) -{ - g_free (stream->stream_name); - g_free (stream->mime_type); - gst_asm_rule_book_free (stream->rulebook); - g_free (stream->type_specific_data); - - g_free (stream); -} - -static void -gst_rtsp_real_finalize (GObject * obj) -{ - GstRTSPReal *r = (GstRTSPReal *) obj; - - g_list_foreach (r->streams, (GFunc) gst_rtsp_stream_free, NULL); - g_list_free (r->streams); - g_free (r->rules); - - G_OBJECT_CLASS (parent_class)->finalize (obj); -} - -static void -gst_rtsp_real_extension_init (gpointer g_iface, gpointer iface_data) -{ - GstRTSPExtensionInterface *iface = (GstRTSPExtensionInterface *) g_iface; - - iface->before_send = rtsp_ext_real_before_send; - iface->after_send = rtsp_ext_real_after_send; - iface->parse_sdp = rtsp_ext_real_parse_sdp; - iface->stream_select = rtsp_ext_real_stream_select; - iface->get_transports = rtsp_ext_real_get_transports; -}
View file
gst-plugins-ugly-1.22.7.tar.xz/gst/realmedia/rtspreal.h
Deleted
@@ -1,93 +0,0 @@ -/* GStreamer - * Copyright (C) <2005,2006> Wim Taymans <wim@fluendo.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifndef __GST_RTSP_REAL_H__ -#define __GST_RTSP_REAL_H__ - -#include <gst/gst.h> - -#include "asmrules.h" - -G_BEGIN_DECLS - -#define GST_TYPE_RTSP_REAL (gst_rtsp_real_get_type()) -#define GST_IS_RTSP_REAL(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTSP_REAL)) -#define GST_IS_RTSP_REAL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTSP_REAL)) -#define GST_RTSP_REAL(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTSP_REAL, GstRTSPReal)) -#define GST_RTSP_REAL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTSP_REAL, GstRTSPRealClass)) - -typedef struct _GstRTSPReal GstRTSPReal; -typedef struct _GstRTSPRealClass GstRTSPRealClass; - -typedef struct _GstRTSPRealStream GstRTSPRealStream; - -struct _GstRTSPRealStream { - guint id; - guint max_bit_rate; - guint avg_bit_rate; - guint max_packet_size; - guint avg_packet_size; - guint start_time; - guint preroll; - guint duration; - gchar *stream_name; - guint stream_name_len; - gchar *mime_type; - guint mime_type_len; - - GstASMRuleBook *rulebook; - - gchar *type_specific_data; - guint type_specific_data_len; - - guint16 num_rules, j, sel, codec; -}; - -struct _GstRTSPReal { - GstElement element; - - gchar checksum34; - gchar challenge264; - gchar etag64; - gboolean isreal; - - guint n_streams; - GList *streams; - - guint max_bit_rate; - guint avg_bit_rate; - guint max_packet_size; - guint avg_packet_size; - guint duration; - - gchar *rules; -}; - -struct _GstRTSPRealClass { - GstElementClass parent_class; -}; - -GType gst_rtsp_real_get_type(void); - -GST_ELEMENT_REGISTER_DECLARE (rtspreal); - - -G_END_DECLS - -#endif /* __GST_RTSP_REAL_H__ */
View file
gst-plugins-ugly-1.22.7.tar.xz/tests/check/elements/amrnbenc.c
Deleted
@@ -1,144 +0,0 @@ -/* - * GStreamer - * - * unit test for amrnbenc - * - * Copyright (C) 2006 Thomas Vander Stichele <thomas at apestaart dot org> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#include <gst/check/gstcheck.h> -#include <gst/audio/audio.h> - -#define SRC_CAPS "audio/x-raw, format = (string)" GST_AUDIO_NE (S16) ", " \ - "layout = (string) interleaved, channels = (int) 1, rate = (int) 8000" -#define SINK_CAPS "audio/AMR" - -static GstPad *srcpad, *sinkpad; - -static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", - GST_PAD_SINK, - GST_PAD_ALWAYS, - GST_STATIC_CAPS (SINK_CAPS) - ); - -static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_STATIC_CAPS (SRC_CAPS) - ); - -static void -buffer_unref (void *buffer, void *user_data) -{ - gst_buffer_unref (GST_BUFFER (buffer)); -} - -static GstElement * -setup_amrnbenc (void) -{ - GstElement *amrnbenc; - GstCaps *caps; - GstBus *bus; - - GST_DEBUG ("setup_amrnbenc"); - - amrnbenc = gst_check_setup_element ("amrnbenc"); - srcpad = gst_check_setup_src_pad (amrnbenc, &srctemplate); - sinkpad = gst_check_setup_sink_pad (amrnbenc, &sinktemplate); - gst_pad_set_active (srcpad, TRUE); - gst_pad_set_active (sinkpad, TRUE); - - bus = gst_bus_new (); - gst_element_set_bus (amrnbenc, bus); - - fail_unless (gst_element_set_state (amrnbenc, - GST_STATE_PLAYING) != GST_STATE_CHANGE_FAILURE, - "could not set to playing"); - - caps = gst_caps_from_string (SRC_CAPS); - gst_check_setup_events (srcpad, amrnbenc, caps, GST_FORMAT_TIME); - gst_caps_unref (caps); - - buffers = NULL; - return amrnbenc; -} - -static void -cleanup_amrnbenc (GstElement * amrnbenc) -{ - GstBus *bus; - - /* free encoded buffers */ - g_list_foreach (buffers, buffer_unref, NULL); - g_list_free (buffers); - buffers = NULL; - - bus = GST_ELEMENT_BUS (amrnbenc); - gst_bus_set_flushing (bus, TRUE); - gst_object_unref (bus); - - GST_DEBUG ("cleanup_amrnbenc"); - gst_pad_set_active (srcpad, FALSE); - gst_pad_set_active (sinkpad, FALSE); - gst_check_teardown_src_pad (amrnbenc); - gst_check_teardown_sink_pad (amrnbenc); - gst_check_teardown_element (amrnbenc); -} - -/* push a random block of audio of the given size */ -static void -push_data (gint size, GstFlowReturn expected_return) -{ - GstBuffer *buffer; - GstFlowReturn res; - - buffer = gst_buffer_new_and_alloc (size); - /* make valgrind happier */ - gst_buffer_memset (buffer, 0, 0, size); - - res = gst_pad_push (srcpad, buffer); - fail_unless (res == expected_return, - "pushing audio returned %d (%s) not %d (%s)", res, - gst_flow_get_name (res), expected_return, - gst_flow_get_name (expected_return)); -} - -GST_START_TEST (test_enc) -{ - GstElement *amrnbenc; - - amrnbenc = setup_amrnbenc (); - push_data (1000, GST_FLOW_OK); - - cleanup_amrnbenc (amrnbenc); -} - -GST_END_TEST; - -static Suite * -amrnbenc_suite () -{ - Suite *s = suite_create ("amrnbenc"); - TCase *tc_chain = tcase_create ("general"); - - suite_add_tcase (s, tc_chain); - tcase_add_test (tc_chain, test_enc); - return s; -} - -GST_CHECK_MAIN (amrnbenc);
View file
gst-plugins-ugly-1.22.7.tar.xz/ChangeLog -> gst-plugins-ugly-1.24.5.tar.xz/ChangeLog
Changed
@@ -1,537 +1,384 @@ -=== release 1.22.7 === +=== release 1.24.5 === -2023-11-13 11:04:22 +0000 Tim-Philipp Müller <tim@centricular.com> +2024-06-20 12:54:15 +0100 Tim-Philipp Müller <tim@centricular.com> * NEWS: * RELEASE: * gst-plugins-ugly.doap: * meson.build: - Release 1.22.7 + Release 1.24.5 -2023-09-20 19:41:00 +0100 Tim-Philipp Müller <tim@centricular.com> +2024-05-29 13:51:27 +0300 Tim-Philipp Müller <tim@centricular.com> * meson.build: - Back to development - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5371> + Back to development after 1.24.4 -=== release 1.22.6 === +=== release 1.24.4 === -2023-09-20 18:10:57 +0100 Tim-Philipp Müller <tim@centricular.com> +2024-05-29 13:44:50 +0300 Tim-Philipp Müller <tim@centricular.com> * NEWS: * RELEASE: * gst-plugins-ugly.doap: * meson.build: - Release 1.22.6 + Release 1.24.4 -2023-07-20 16:57:47 +0100 Tim-Philipp Müller <tim@centricular.com> +2024-04-30 00:36:59 +0100 Tim-Philipp Müller <tim@centricular.com> * meson.build: - Back to development - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5082> + Back to development after 1.24.3 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6772> -=== release 1.22.5 === +=== release 1.24.3 === -2023-07-20 15:22:48 +0100 Tim-Philipp Müller <tim@centricular.com> +2024-04-30 00:15:23 +0100 Tim-Philipp Müller <tim@centricular.com> * NEWS: * RELEASE: * gst-plugins-ugly.doap: * meson.build: - Release 1.22.5 - -2023-07-07 10:08:21 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/realmedia/rmdemux.c: - rmdemux: Check for integer overflow when calculation audio packet size - Fixes ZDI-CAN-21444 - https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/2782 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5073> - -2023-07-07 10:08:03 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/realmedia/rmdemux.c: - rmdemux: Use GST_LOG_OBJECT instead of GST_LOG - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5073> - -2023-07-07 10:00:19 +0300 Sebastian Dröge <sebastian@centricular.com> + Release 1.24.3 - * gst/realmedia/rmdemux.c: - rmdemux: Check that enough SIPR audio data is available when copying - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5073> - -2023-07-07 09:59:20 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/realmedia/rmdemux.c: - rmdemux: Check for integer overflows when calculating the size of SIPR audio buffers - Fixes ZDI-CAN-21443 - Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/2782 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5073> - -2023-07-07 09:59:04 +0300 Sebastian Dröge <sebastian@centricular.com> - - * gst/realmedia/rmdemux.c: - rmdemux: Use GST_LOG_OBJECT instead of GST_LOG - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5073> - -2023-06-20 19:10:38 +0100 Tim-Philipp Müller <tim@centricular.com> +2024-04-10 00:04:02 +0100 Tim-Philipp Müller <tim@centricular.com> * meson.build: - Back to development - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4907> + Back to development after 1.24.2 -=== release 1.22.4 === +=== release 1.24.2 === -2023-06-20 17:42:25 +0100 Tim-Philipp Müller <tim@centricular.com> +2024-04-09 21:48:55 +0100 Tim-Philipp Müller <tim@centricular.com> * NEWS: * RELEASE: * gst-plugins-ugly.doap: * meson.build: - Release 1.22.4 + Release 1.24.2 -2023-05-19 12:36:19 +0100 Tim-Philipp Müller <tim@centricular.com> +2024-03-22 01:38:06 +0100 Tim-Philipp Müller <tim@centricular.com> * meson.build: Back to development - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4679> -=== release 1.22.3 === +=== release 1.24.1 === -2023-05-19 09:23:19 +0100 Tim-Philipp Müller <tim@centricular.com> +2024-03-21 21:47:53 +0100 Tim-Philipp Müller <tim@centricular.com> * NEWS: - * README.md: * RELEASE: * gst-plugins-ugly.doap: * meson.build: - Release 1.22.3 + Release 1.24.1 -2023-04-12 00:31:17 +0100 Tim-Philipp Müller <tim@centricular.com> +2024-03-05 13:45:27 +0000 Tim-Philipp Müller <tim@centricular.com> * meson.build: Back to development + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6264> -=== release 1.22.2 === +=== release 1.24.0 === -2023-04-11 17:29:28 +0100 Tim-Philipp Müller <tim@centricular.com> - - * NEWS: - * RELEASE: - * gst-plugins-ugly.doap: - * meson.build: - Release 1.22.2 - -2023-03-17 16:32:45 +0200 Sebastian Dröge <sebastian@centricular.com> - - * tests/check/elements/x264enc.c: - plugins: Fix various trivial clang compiler warnings - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4221> - -2023-03-04 16:13:04 +0000 Tim-Philipp Müller <tim@centricular.com> - - * meson.build: - Back to development - -=== release 1.22.1 === - -2023-03-04 13:42:32 +0000 Tim-Philipp Müller <tim@centricular.com> +2024-03-04 23:51:42 +0000 Tim-Philipp Müller <tim@centricular.com> * NEWS: + * README.md: * RELEASE: * gst-plugins-ugly.doap: * meson.build: - Release 1.22.1 + Release 1.24.0 -2023-01-25 16:46:42 +0000 Tim-Philipp Müller <tim@centricular.com> +2024-02-26 09:27:40 +0100 Edward Hervey <edward@centricular.com> - * meson.build: - Back to development - -=== release 1.22.0 === - -2023-01-23 19:29:34 +0000 Tim-Philipp Müller <tim@centricular.com> - - * NEWS: + * README.md: * RELEASE: - * gst-plugins-ugly.doap: - * meson.build: - Release 1.22.0 - -2023-01-23 16:28:13 +0000 Tim-Philipp Müller <tim@centricular.com> - - * po/hr.po: - * po/ro.po: - gst-plugins-ugly: update translations - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3773> + docs: Use Discourse and Matrix as prefered communication channels + Part of: https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6220 -=== release 1.21.90 === +=== release 1.23.90 === -2023-01-13 19:08:48 +0000 Tim-Philipp Müller <tim@centricular.com> +2024-02-23 18:20:11 +0000 Tim-Philipp Müller <tim@centricular.com> * NEWS: * RELEASE: * gst-plugins-ugly.doap: * meson.build: - Release 1.21.90 - -2023-01-11 15:41:26 +0000 Tim-Philipp Müller <tim@centricular.com> - - * po/LINGUAS: - * po/eo.po: - * po/es.po: - * po/hr.po: - * po/ka.po: - * po/lt.po: - * po/ru.po: - * po/sk.po: - * po/sl.po: - * po/sq.po: - * po/sr.po: - * po/uk.po: - * po/zh_TW.po: - gst-plugins-ugly: update translations - Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/1575 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3711> + Release 1.23.90 -2023-01-11 14:53:39 +0000 Tim-Philipp Müller <tim@centricular.com> +2023-09-17 18:47:31 +0200 Jochen Henneberg <jh@henneberg-systemdesign.com> - * scripts/dist-translations.py: - * scripts/meson.build: - Fix translation pot files when creating dist tarballs - Add version as per Translation Project requirements and - also add a .pot file without the ABI suffix. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3711> + * gst/asfdemux/gstrtpasfdepay.c: + rtpasfdepay: Enabled header extension aggregation + Because this depayloader may build several output buffers within one + process run we push them all into a GstBufferList and push them out at + once to make sure that each buffer gets notified about each header + extension. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5378> -2022-12-05 02:29:08 +0000 Tim-Philipp Müller <tim@centricular.com> +2024-02-15 16:38:53 +0000 Tim-Philipp Müller <tim@centricular.com> * meson.build: Back to development + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6126> -=== release 1.21.3 === +=== release 1.23.2 === -2022-12-05 01:28:21 +0000 Tim-Philipp Müller <tim@centricular.com> +2024-02-15 15:37:17 +0000 Tim-Philipp Müller <tim@centricular.com> * NEWS: * RELEASE: * gst-plugins-ugly.doap: * meson.build: - Release 1.21.3 - -2022-12-04 12:25:41 +0000 Tim-Philipp Müller <tim@centricular.com> + Release 1.23.2 - * ChangeLog: - * docs/random/ChangeLog-0.8: - Remove ChangeLog files from git repository - This information is tracked fully in the git repository, so - no point having the ChangeLog duplicate it, and it interferes - with grepping the repository. - We are going to create the ChangeLogs on the fly when generating - tarballs going forward (with a limited history), since it's still - valuable for tarball consumers to be able to easily see a list of - recent changes. - Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer-project/-/issues/73 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3521> +2024-02-14 00:38:10 +0000 Tim-Philipp Müller <tim@centricular.com> -2022-11-07 00:10:39 +0000 Tim-Philipp Müller <tim@centricular.com> + * po/lv.po: + gst-plugins-ugly: update translations + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6113> - * meson.build: - * scripts/gen-changelog.py: - meson: Generate ChangeLog files for release tarballs on dist - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3521> +2024-02-10 19:47:24 +0000 Tim-Philipp Müller <tim@centricular.com> -2022-11-08 02:08:08 +0000 Tim-Philipp Müller <tim@centricular.com> + * docs/gst_plugins_cache.json: + * gst/realmedia/asmrules.c: + * gst/realmedia/asmrules.h: + * gst/realmedia/gstrdtbuffer.c: + * gst/realmedia/gstrdtbuffer.h: + * gst/realmedia/meson.build: + * gst/realmedia/rdtdepay.c: + * gst/realmedia/rdtdepay.h: + * gst/realmedia/rdtjitterbuffer.c: + * gst/realmedia/rdtjitterbuffer.h: + * gst/realmedia/rdtmanager.c: + * gst/realmedia/rdtmanager.h: + * gst/realmedia/realhash.c: + * gst/realmedia/realhash.h: + * gst/realmedia/realmedia.c: + * gst/realmedia/rtspreal.c: + * gst/realmedia/rtspreal.h: + realmedia: remove RealServer RTSP extension, RDT handling and PNM source + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6091> + +2024-02-06 18:09:02 +0000 Tim-Philipp Müller <tim@centricular.com> * meson.build: Back to development - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3358> + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6066> -=== release 1.21.2 === +=== release 1.23.1 === -2022-11-07 23:53:59 +0000 Tim-Philipp Müller <tim@centricular.com> +2024-02-06 16:37:19 +0000 Tim-Philipp Müller <tim@centricular.com> - * ChangeLog: * NEWS: * RELEASE: * gst-plugins-ugly.doap: * meson.build: - Release 1.21.2 - -2022-11-07 23:53:57 +0000 Tim-Philipp Müller <tim@centricular.com> - - * ChangeLog: - Update ChangeLogs for 1.21.2 - -2022-10-23 20:32:35 +0100 Tim-Philipp Müller <tim@centricular.com> - - * docs/gst_plugins_cache.json: - * gst/meson.build: - * gst/xingmux/gstxingmux.c: - * gst/xingmux/gstxingmux.h: - * gst/xingmux/meson.build: - * gst/xingmux/plugin.c: - * meson_options.txt: - * tests/check/elements/xingmux.c: - * tests/check/elements/xingmux_testdata.h: - * tests/check/meson.build: - xingmux: move from gst-plugins-ugly to gst-plugins-good - Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-base/-/issues/415 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3251> + Release 1.23.1 -2022-10-04 03:57:31 +0100 Tim-Philipp Müller <tim@centricular.com> +2024-01-28 11:15:01 +0000 Tim-Philipp Müller <tim@centricular.com> * meson.build: - Back to development - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3115> - -=== release 1.21.1 === + meson: bump Meson requirement to >= 1.1 for all modules + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6002> -2022-10-04 01:14:01 +0100 Tim-Philipp Müller <tim@centricular.com> +2023-11-02 00:03:28 +0900 Seungha Yang <seungha@centricular.com> - * ChangeLog: - * NEWS: - * RELEASE: - * gst-plugins-ugly.doap: * meson.build: - Release 1.21.1 + meson: Fix MSVC build with GST_DISABLE_GST_DEBUG + MSVC does not understand Wno-unused + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5585> -2022-10-04 01:13:59 +0100 Tim-Philipp Müller <tim@centricular.com> - - * ChangeLog: - Update ChangeLogs for 1.21.1 - -2022-09-21 19:19:45 +0530 Nirbheek Chauhan <nirbheek@centricular.com> +2022-04-06 12:56:30 +0100 Tim-Philipp Müller <tim@centricular.com> * meson.build: - meson: Use implicit builtin dirs in pkgconfig generation - Starting with Meson 0.62, meson automatically populates the variables - list in the pkgconfig file if you reference builtin directories in the - pkgconfig file (whether via a custom pkgconfig variable or elsewhere). - We need this, because ${prefix}/libexec is a hard-coded value which is - incorrect on, for example, Debian. - Bump requirement to 0.62, and remove version compares that retained - support for older Meson versions. - Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/1245 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3061> - -2022-08-29 10:17:45 -0400 Thibault Saunier <tsaunier@igalia.com> - - * docs/meson.build: - doc: Do not build plugins to build the doc - It is not actually necessary - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2954> + meson: Bump GLib requirement to >= 2.64 + This includes fixes to make GstBus watches non-racy. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2126> -2021-03-24 14:20:18 -0500 Zebediah Figura <z.figura12@gmail.com> +2023-09-13 10:12:44 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> - * meson.build: - meson: Build with -Wl,-z,nodelete to prevent unloading of dynamic libraries and plugins - GLib made the unfortunate decision to prevent libgobject from ever being - unloaded, which means that now any library which registers a static type - can't ever be unloaded either (and any library that depends on those, - ad nauseam). - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/778> + * ext/x264/meson.build: + x264: Check that minimum version is met + Since the addition of monochrome encoding support, we now depends on build 156. + No version check was happening so far. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5325> -2018-10-18 12:32:03 +0900 Yeongjin Jeong <yeongjin.jeong@navercorp.com> +2023-06-08 14:21:07 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com> + * docs/gst_plugins_cache.json: * ext/x264/gstx264enc.c: - x264enc: Print full option-string applied to x264_encoder in debug log - x264 encoder transfers all options applied to the encoder - to the SEI payload when the headers(SPS, PPS) is requested. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3014> + * tests/check/elements/x264enc.c: + x264enc: Add monochrome 8bit support + This is mapped to GStreamer GRAY8 format. This allow producing files with + the chroma_format_idc 0 (monochrome). This is only availbable to high profile. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4812> -2018-10-17 23:38:22 +0900 Yeongjin Jeong <yeongjin.jeong@navercorp.com> +2023-07-07 10:08:21 +0300 Sebastian Dröge <sebastian@centricular.com> - * ext/x264/gstx264enc.c: - x264enc: Don't assume the order of nal unit - Just for extra safety, let's check the index of the nal unit - through the enum value of the nal type provided by x264. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3014> + * gst/realmedia/rmdemux.c: + rmdemux: Check for integer overflow when calculation audio packet size + Fixes ZDI-CAN-21444 + https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/2782 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5072> -2022-09-01 15:11:31 -0400 Thibault Saunier <tsaunier@igalia.com> +2023-07-07 10:08:03 +0300 Sebastian Dröge <sebastian@centricular.com> - * ext/a52dec/meson.build: - * ext/amrnb/meson.build: - * ext/amrwbdec/meson.build: - * ext/cdio/meson.build: - * ext/dvdread/meson.build: - * ext/mpeg2dec/meson.build: - * ext/sidplay/meson.build: - * ext/x264/meson.build: - * gst/asfdemux/meson.build: - * gst/dvdlpcmdec/meson.build: - * gst/dvdsub/meson.build: - * gst/realmedia/meson.build: - * gst/xingmux/meson.build: - * meson.build: - meson: Call pkgconfig.generate in the loop where we declare plugins dependencies - Removing some copy pasted code - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2970> + * gst/realmedia/rmdemux.c: + rmdemux: Use GST_LOG_OBJECT instead of GST_LOG + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5072> -2022-09-01 11:51:48 -0400 Thibault Saunier <tsaunier@igalia.com> +2023-07-07 10:00:19 +0300 Sebastian Dröge <sebastian@centricular.com> - * docs/meson.build: - meson: Namespace the plugins_doc_dep/libraries variables - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2970> + * gst/realmedia/rmdemux.c: + rmdemux: Check that enough SIPR audio data is available when copying + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5072> -2022-08-31 18:44:14 -0400 Thibault Saunier <tsaunier@igalia.com> +2023-07-07 09:59:20 +0300 Sebastian Dröge <sebastian@centricular.com> - * meson.build: - meson: Rename plugins list and make them "dependency" objects - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2970> + * gst/realmedia/rmdemux.c: + rmdemux: Check for integer overflows when calculating the size of SIPR audio buffers + Fixes ZDI-CAN-21443 + Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/2782 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5072> -2022-05-31 15:18:03 +0200 Stéphane Cerveau <scerveau@collabora.com> +2023-07-07 09:59:04 +0300 Sebastian Dröge <sebastian@centricular.com> - * docs/meson.build: - * meson.build: - docs: disable in static build - Following gst-plugins-base, disable docs if static_build - in: - - gstreamer - - gst-plugins-good - - gst-plugins-ugly - - gst-libav - - gstreamer-vaapi - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2529> - -2022-06-29 10:55:13 +0100 Tim-Philipp Müller <tim@centricular.com> + * gst/realmedia/rmdemux.c: + rmdemux: Use GST_LOG_OBJECT instead of GST_LOG + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5072> - * meson.build: - coding style: allow declarations after statement - See https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1243/ - and https://gitlab.freedesktop.org/gstreamer/gstreamer-project/-/issues/78 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2683> +2023-07-05 18:46:25 -0600 Olivier Crête <olivier.crete@collabora.com> -2022-06-25 19:50:10 +0100 Tim-Philipp Müller <tim@centricular.com> + * scripts/gen-changelog.py: + gst-omx: Retire the whole package + The OpenMAX standard is long dead and even the Raspberry Pi OS + no longer supports it. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4976> - * tests/check/meson.build: - tests: skip unit tests for dependency-less elements that have been disabled - Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues/1136 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2660> +2023-07-12 09:27:22 +0530 Nirbheek Chauhan <nirbheek@centricular.com> -2022-04-06 12:56:30 +0100 Tim-Philipp Müller <tim@centricular.com> + * tests/check/meson.build: + meson: Always use forward slashes in defines with paths + Fixes the following build failure on MSYS2: + ``` + ../subprojects/gstreamer/tests/check/elements/filesrc.c: In function 'test_seeking': + ../subprojects/gstreamer/tests/check/elements/filesrc.c:107:53: error: incomplete universal character name \U + 107 | g_object_set (G_OBJECT (src), "location", TESTFILE, NULL); + | ^ + ../subprojects/gstreamer/tests/check/elements/filesrc.c:107:53: warning: unknown escape sequence: '\A' + ../subprojects/gstreamer/tests/check/elements/filesrc.c:107:53: warning: unknown escape sequence: '\g' + ../subprojects/gstreamer/tests/check/elements/filesrc.c:107:53: warning: unknown escape sequence: '\s' + ../subprojects/gstreamer/tests/check/elements/filesrc.c:107:53: warning: unknown escape sequence: '\g' + ../subprojects/gstreamer/tests/check/elements/filesrc.c:107:53: warning: unknown escape sequence: '\c' + ``` + Due to: `-DTESTFILE=\"C:\\Users\\Administrator\...` + https://gitlab.freedesktop.org/nirbheek/gstreamer/-/jobs/45317733 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5018> + +2023-03-07 14:05:54 +0100 Stéphane Cerveau <scerveau@igalia.com> + + * tests/meson.build: + gstreamer-full: add full static support + Allow a project to use gstreamer-full as a static library + and link to create a binary without dependencies. + Introduce the option 'gst-full-target-type' to + select the build type, dynamic(default) or static. + In gstreamer-full/static build configuration gstreamer (gst.c) + needs the symbol gst_init_static_plugins which is defined + in gstreamer-full. + All the tests and examples are linking with gstreamer but the + symbol gst_init_static_plugins is only defined in the gstreamer-full + library. gstreamer-full can not be built first as it needs to know what plugins + will be built. + One option would be to build all the examples and tests after + gstreamer-full as the tools. + Disable tools build in subprojects too as it will be built at the end of + build process. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4128> + +2023-05-17 22:58:46 +0200 Ruben Gonzalez <rgonzalez@fluendo.com> - * meson.build: - Bump GLib requirement to >= 2.62 - Can't require 2.64 yet because of - https://gitlab.freedesktop.org/gstreamer/cerbero/-/issues/323 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2568> + * README.md: + README.md: fix current version + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4662> -2022-03-25 10:18:34 -0400 Xavier Claessens <xavier.claessens@collabora.com> +2023-05-10 08:57:40 +0200 Edward Hervey <edward@centricular.com> - * meson.build: - Always define ENABLE_NLS - GLib guarantees libintl API is always available, provided by - proxy-libintl as last resort. GLib itself unconditionally define - ENABLE_NLS. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2028> + * ext/mpeg2dec/gstmpeg2dec.c: + mpeg2dec: Fix conflicting type declaration + It was always a GstFlowReturn + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4588> -2022-03-25 10:20:24 -0400 Xavier Claessens <xavier.claessens@collabora.com> +2023-04-28 16:06:24 +0100 Tim-Philipp Müller <tim@centricular.com> - * gst-libs/gst/gettext.h: - * gst-libs/gst/gst-i18n-plugin.h: - Delete unused i18n headers - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2028> + * REQUIREMENTS: + * docs/gst_plugins_cache.json: + * ext/amrnb/GstAmrnbEnc.prs: + * ext/amrnb/README: + * ext/amrnb/amrnb.c: + * ext/amrnb/amrnbdec.c: + * ext/amrnb/amrnbdec.h: + * ext/amrnb/amrnbenc.c: + * ext/amrnb/amrnbenc.h: + * ext/amrnb/meson.build: + * ext/amrwbdec/README: + * ext/amrwbdec/amrwb.c: + * ext/amrwbdec/amrwbdec.c: + * ext/amrwbdec/amrwbdec.h: + * ext/amrwbdec/meson.build: + * ext/meson.build: + * meson_options.txt: + * tests/check/elements/amrnbenc.c: + * tests/check/gst-plugins-ugly.supp: + * tests/check/meson.build: + amrnb, amrwbdec: move AMR-NB and AMR-WB plugins to -good + Fedora ships these libraries as part of the main distribution now, + and they are decades old anyway so don't implement any of the newer + features. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4512> -2022-03-25 09:59:23 -0400 Xavier Claessens <xavier.claessens@collabora.com> +2023-03-19 15:35:29 -0300 Thibault Saunier <tsaunier@igalia.com> - * ext/cdio/gstcdiocddasrc.c: - * ext/dvdread/dvdreadsrc.c: - * gst/asfdemux/gstasf.c: - * gst/asfdemux/gstasfdemux.c: - * gst/asfdemux/gstasfelement.c: - Replace gst-i18n-*.h with gi18n-lib.h - GLib guarantees libintl is always present, using proxy-libintl as - last resort. There is no need to mock gettex API any more. - This fix static build on Windows because G_INTL_STATIC_COMPILATION must - be defined before including libintl.h, and glib does it for us as part - as including glib.h. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2028> + * docs/meson.build: + doc: Avoid shelling out to hotdoc to generate plugins config files + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4479> -2022-04-15 16:53:25 +0300 Sebastian Dröge <sebastian@centricular.com> +2023-04-11 11:50:57 -0400 Arun Raghavan <arun@asymptotic.io> * ext/x264/gstx264enc.c: - x264enc: Don't try to fixate ANY allowed caps - Instead fall back to the template caps. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2197> - -2022-03-30 11:06:02 -0400 Xavier Claessens <xavier.claessens@collabora.com> - - * meson.build: - Use gmodule-no-export-2.0 - We don't need `-Wl,--export-dynamic`, that's used only for executables - that needs to export an API to be used by plugins they load. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2031> - -2022-03-25 15:00:20 -0400 Xavier Claessens <xavier.claessens@collabora.com> + x264enc: Check more video info fields to decide whether to reconfigure encoder + The encoder is also initialised using interlace mode, colorimetry, chroma-site + and multiview mode, so let's make sure we only skip reinitialising the encoder + in set_format() if none of those have changed. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4395> - * ext/dvdread/meson.build: - * meson.build: - Remove glib and gobject dependencies everywhere - They are part of gst_dep already and we have to make sure to always have - gst_dep. The order in dependencies matters, because it is also the order - in which Meson will set -I args. We want gstreamer's config.h to take - precedence over glib's private config.h when it's a subproject. - While at it, remove useless fallback args for gmodule/gio dependencies, - only gstreamer core needs it. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2031> +2023-03-17 16:32:45 +0200 Sebastian Dröge <sebastian@centricular.com> -2022-03-18 13:42:27 +0530 Nirbheek Chauhan <nirbheek@centricular.com> + * tests/check/elements/x264enc.c: + plugins: Fix various trivial clang compiler warnings + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4210> - * meson.build: - meson: Bump all meson requirements to 0.60 - Lots of new warnings ever since - https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1934 - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1977> +2023-03-15 18:53:09 +0000 Tim-Philipp Müller <tim@centricular.com> -2022-02-23 11:10:11 +0100 Sebastian Fricke <sebastian.fricke@collabora.com> + * gst/asfdemux/gstasfdemux.c: + gst-plugins-ugly: re-indent with GNU indent 2.2.12 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4182> - * README.md: - Maintain build instructions at a single location - Do not maintain similar build instructions within each gst-plugins-* - subproject and the subproject/gstreamer subproject. Use the build - instructions from the mono-repository and link to them via hyperlink. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1743> +2023-01-08 17:15:12 +0000 Tim-Philipp Müller <tim@centricular.com> -2022-02-21 11:37:26 -0500 Xavier Claessens <xavier.claessens@collabora.com> + * ext/mpeg2dec/gstmpeg2dec.c: + mpeg2dec: drop use of GSlice + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3695> - * ext/amrnb/meson.build: - * ext/x264/meson.build: - devenv: Add some missing GStreamer specific env variables - This should make "meson devenv" closer to what "gst-env.py" sets. - - GST_VALIDATE_SCENARIOS_PATH - - GST_VALIDATE_APPS_DIR - - GST_OMX_CONFIG_DIR - - GST_ENCODING_TARGET_PATH - - GST_PRESET_PATH - - GST_PLUGIN_SCANNER - - GST_PTP_HELPER - - _GI_OVERRIDES_PATH - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1768> - -2022-02-21 23:29:23 +0100 Ruben Gonzalez <rgonzalez@fluendo.com> +2023-01-08 17:15:00 +0000 Tim-Philipp Müller <tim@centricular.com> - * docs/gst_plugins_cache.json: * ext/x264/gstx264enc.c: - x264enc: Update long-name and description - Update x264enc long-name to be more than just the name. Then the - description also was updated to be longer than the long-name, and - similar to the plugin description. - Finally, as I am here, H264 was replaced by H.264 and x264 is only a - plugin (not plugins). - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1771> + x264enc: drop use of GSlice + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3695> -2021-10-01 20:27:28 +0900 Seungha Yang <seungha@centricular.com> - - * meson.build: - meson: Do hard build error for some MSVC warnings - Handle various MSVC warnings as errors for development version. - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1006> - -2022-02-04 11:15:47 +0000 Tim-Philipp Müller <tim@centricular.com> +2023-01-23 23:04:53 +0000 Tim-Philipp Müller <tim@centricular.com> * meson.build: Back to development - Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1635> + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3775> -=== release 1.20.0 === +=== release 1.22.0 ===
View file
gst-plugins-ugly-1.22.7.tar.xz/NEWS -> gst-plugins-ugly-1.24.5.tar.xz/NEWS
Changed
@@ -1,1776 +1,1465 @@ -GStreamer 1.22 Release Notes +GStreamer 1.24 Release Notes -GStreamer 1.22.0 was originally released on 23 January 2023. +GStreamer 1.24.0 was originally released on 4 March 2024. -The latest bug-fix release in the stable 1.22 series is 1.22.7 and was -released on 13 November 2023. +The latest bug-fix release in the stable 1.24 series is 1.24.5 and was released on 20 June 2024. -See https://gstreamer.freedesktop.org/releases/1.22/ for the latest -version of this document. - -Last updated: Monday 13 November 2023, 10:00 UTC (log) - -Introduction - -The GStreamer team is proud to announce a new major feature release in -the stable 1.x API series of your favourite cross-platform multimedia -framework! - -As always, this release is again packed with many new features, bug -fixes and other improvements. - -Highlights - -- AV1 video codec support improvements -- New HLS, DASH and Microsoft Smooth Streaming adaptive streaming - clients -- Qt6 support for rendering video inside a QML scene -- Minimal builds optimised for binary size, including only the - individual elements needed -- Playbin3, Decodebin3, UriDecodebin3, Parsebin enhancements and - stabilisation -- WebRTC simulcast support and support for Google Congestion Control -- WebRTC-based media server ingestion/egress (WHIP/WHEP) support -- New easy to use batteries-included WebRTC sender plugin -- Easy RTP sender timestamp reconstruction for RTP and RTSP -- ONVIF timed metadata support -- New fragmented MP4 muxer and non-fragmented MP4 muxer -- New plugins for Amazon AWS storage and audio transcription services -- New gtk4paintablesink and gtkwaylandsink renderers -- New videocolorscale element that can convert and scale in one go for - better performance -- High bit-depth video improvements -- Touchscreen event support in navigation API -- Rust plugins now shipped in macOS and Windows/MSVC binary packages -- H.264/H.265 timestamp correction elements for PTS/DTS reconstruction - before muxers -- Improved design for DMA buffer sharing and modifier handling for - hardware-accelerated video decoders/encoders/filters and - capturing/rendering on Linux -- Video4Linux2 hardware accelerated decoder improvements -- CUDA integration and Direct3D11 integration and plugin improvements -- New H.264 / AVC, H.265 / HEVC and AV1 hardware-accelerated video - encoders for AMD GPUs using the Advanced Media Framework (AMF) SDK -- applemedia: H.265 / HEVC video encoding + decoding support -- androidmedia: H.265 / HEVC video encoding support -- New “force-live” property for audiomixer, compositor, glvideomixer, - d3d11compositor etc. -- Lots of new plugins, features, performance improvements and bug - fixes - -Major new features and changes - -AV1 video codec support improvements - -AV1 is a royalty free next-generation video codec by AOMedia and a free -alternative to H.265/HEVC. - -While supported in earlier versions of GStreamer already, this release -saw a lot of improvements across the board: - -- Support for hardware encoding and decoding via VAAPI/VA, AMF, D3D11, - NVCODEC, QSV and Intel MediaSDK. Hardware codecs for AV1 are slowly - becoming available in embedded systems and desktop GPUs (AMD, Intel, - NVIDIA), and these can now be used via GStreamer. - -- New AV1 RTP payloader and depayloader elements. - -- New encoder settings in the AOM reference encoder-based av1enc - element. - -- Various improvements in the AV1 parser and in the MP4/Matroska/WebM - muxers/demuxers. - -- dav1d and rav1e based software decoder/encoder elements shipped as - part of the binaries. - -- AV1 parser improvements and various bugfixes all over the place. - -Touchscreen event support in Navigation API - -The Navigation API supports the sending of key press events and mouse -events through a GStreamer pipeline. Typically these will be picked up -by a video sink on which these events happen and then the event is -transmitted into the pipeline so it can be handled by elements inside -the pipeline if it wasn’t handled by the application. - -This has traditionally been used for DVD menu support, but can also be -used to forward such inputs to source elements that render a web page -using a browser engine such as WebKit or Chromium. - -This API has now gained support for touchscreen events, and this has -been implemented in various plugins such as the GTK, Qt, XV, and x11 -video sinks as well as the wpevideosrc element. - -GStreamer CUDA integration - -- New gst-cuda library -- integration with D3D11 and NVIDIA dGPU NVMM elements -- new cudaconvertscale element - -GStreamer Direct3D11 integration - -- New gst-d3d11 public library - - gst-d3d11 library is not integrated with GStreamer documentation - system yet. Please refer to the examples -- d3d11screencapture: Add Windows Graphics Capture API based capture - mode, including Win32 application window capturing -- d3d11videosink and d3d11convert can support flip/rotation and crop - meta -- d3d11videosink: New emit-present property and present signal so that - applications can overlay an image on Direct3D11 swapchain’s - backbuffer via Direct3D/Direct2D APIs. See also C++ and Rust - examples -- d3d11compositor supports YUV blending/composing without intermediate - RGB(A) conversion to improve performance -- Direct3D11 video decoders are promoted to GST_RANK_PRIMARY or - higher, except for the MPEG2 decoder - -H.264/H.265 timestamp correction elements - -- Muxers are often picky and need proper PTS/DTS timestamps set on the - input buffers, but that can be a problem if the encoded input media - stream comes from a source that doesn’t provide proper signalling of - DTS, such as is often the case for RTP, RTSP and WebRTC streams or - Matroska container files. Theoretically parsers should be able to - fix this up, but it would probably require fairly invasive changes - in the parsers, so two new elements h264timestamper and - h265timestamper bridge the gap in the meantime and can reconstruct - missing PTS/DTS. - -Easy sender timestamp reconstruction for RTP and RTSP - -- it was always possible to reconstruct and retrieve the original RTP - sender timestamps in GStreamer, but required a fair bit of - understanding of the internal mechanisms and the right property - configuration and clock setup. - -- rtspsrc and rtpjitterbuffer gained a new - “add-reference-timestamp-meta” property that if set puts the - original absolute reconstructed sender timestamps on the output - buffers via a meta. This is particularly useful if the sender is - synced to an NTP clock or PTP clock. The original sender timestamps - are either based on the RTCP NTP times, NTP RTP header extensions - (RFC6051) or RFC7273-style clock signalling. - -Qt6 support - -- new qml6glsink element for Qt6 similar to the existing Qt5 element. - Matching source and overlay elements will hopefully follow in the - near future. - -OpenGL + Video library enhancements - -- Support for new video formats (NV12_4L4, NV12_16L32S, NV12_8L128, - NV12_10BE_8L128) and dmabuf import in more formats (Y410, Y212_LE, - Y212_BE, Y210, NV21, NV61) - -- Improved support for tiled formats with arbitrary tile dimensions, - as needed by certain hardware decoders/encoders - -- glvideomixer: New “crop-left,”crop-right, “crop-top” and - “crop-bottom” pad properties for cropping inputs - -- OpenGL support for gst_video_sample_convert(): - - - Used for video snapshotting and thumbnailing, to convert buffers - retrieved from appsinks or sink “last-sample” properties in - JPG/PNG thumbnails. - - This function can now take samples and buffers backed by GL - textures as input and will automatically plug a gldownload - element in that case. - -High bit-depth support (10, 12, 16 bits per component value) improvements - -- compositor can now handle any supported input format and also mix - high-bitdepth (10-16 bit) formats (naively) - -- videoflip has gained support for higher bit depth formats. - -- vp9enc, vp9dec now support 12-bit formats and also 10-bit 4:4:4 - -WebRTC - -- Allow insertion of bandwidth estimation elements e.g. for Google - Congestion Control (GCC) support - -- Initial support for sending or receiving simulcast streams - -- Support for asynchronous host resolution for STUN/TURN servers - -- GstWebRTCICE was split into base classes and implementation to make - it possible to plug custom ICE implementations - -- webrtcsink: batteries-included WebRTC sender (Rust) - -- whipsink: WebRTC HTTP ingest (WHIP) to a MediaServer (Rust) - -- whepsrc: WebRTC HTTP egress (WHEP) from a MediaServer (Rust) - -- Many other improvements and bug fixes - -New HLS, DASH and MSS adaptive streaming clients - -A new set of “adaptive demuxers” to support HLS, DASH and MSS adaptive -streaming protocols has been added. They provide improved performance, -new features and better stream compatibility compared to the previous -elements. These new elements require a “streams-aware” pipeline such as -playbin3, uridecodebin3 or urisourcebin. - -The previous elements’ design prevented implementing several use-cases -and fixing long-standing issues. The new elements were re-designed from -scratch to tackle those: - -- Scheduling Only 3 threads are present, regardless of the number of - streams selected. One in charge of downloading fragments and - manifests, one in charge of outputting parsed data downstream, and - one in charge of scheduling. This improves performance, resource - usage and latency. - -- Better download control The elements now directly control the - scheduling and download of manifests and fragments using libsoup - directly instead of depending on external elements for downloading. - -- Stream selection, only the selected streams are downloaded. This - improves bandwith usage. Switching stream is done in such a way to - ensure there are no gaps, meaning the new stream will be switched to - only once enough data for it has been downloaded. - -- Internal parsing, the downloaded streams are parsed internally. This - allows the element to fully respect the various specifications and - offer accurate buffering, seeking and playback. This is especially - important for HLS streams which require parsing for proper - positioning of streams. - -- Buffering and adaptive rate switching, the new elements handle - buffering internally which allows them to have a more accurate - visibility of which bandwith variant to switch to. - -Playbin3, Decodebin3, UriDecodebin3, Parsebin improvements - -The “new” playback elements introduced in 1.18 (playbin3 and its various -components) have been refactored to allow more use-cases and improve -performance. They are no longer considered experimental, so applications -using the legacy playback elements (playbin and (uri)decodebin) can -migrate to the new components to benefit from these improvements. - -- Gapless The “gapless” feature allows files and streams to be - fetched, buffered and decoded in order to provide a “gapless” - output. This feature has been refactored extensively in the new - components: - - A single (uri)decodebin3 (and therefore a single set of - decoders) is used. This improves memory and cpu usage, since on - identical codecs a single decoder will be used. - - The “next” stream to play will be pre-rolled “just-in-time” - thanks to the buffering improvements in urisourcebin (see below) - - This feature is now handled at the uridecodebin3 level. - Applications that wish to have a “gapless” stream and process it - (instead of just outputting it, for example for transcoding, - retransmission, …) can now use uridecodebin3 directly. Note that - a streamsynchronizer element is required in that case. -- Buffering improvements The urisourcebin element is in charge of - fetching and (optionally) buffering/downloading the stream. It has - been extended and improved: - - When the parse-streams property is used (by default in - uridecodebin3 and playbin3), compatible streams will be demuxed - and parsed (via parsebin) and buffering will be done on the - elementary streams. This provides a more accurate handling of - buffering. Previously buffering was done on a best-effort basis - and was mostly wrong (i.e. downloading more than needed). - - Applications can use urisourcebin with this property as a - convenient way of getting elementary streams from a given URI. - - Elements can handle buffering themselves (such as the new - adaptive demuxers) by answering the GST_QUERY_BUFFERING query. - In that case urisourcebin will not handle it. -- Stream Selection Efficient stream selection was previously only - possible within decodebin3. The downside is that this meant that - upstream elements had to provide all the streams from which to chose - from, which is inefficient. With the addition of the - GST_QUERY_SELECTABLE query, this can now be handled by elements - upstream (i.e. sources) - - Elements that can handle stream selection internally (such as - the new adaptive demuxer elements) answer that query, and handle - the stream selection events themselves. - - In this case, decodebin3 will always process all streams that - are provided to it. -- Instant URI switching This new feature allows switching URIs - “instantly” in playbin3 (and uridecodebin3) without having to change - states. This mimics switching channels on a television. - - If compatible, decoders will be re-used, providing lower - latency/cpu/memory than by switching states. - - This is enabled by setting the instant-uri property to true, - setting the URI to switch to immediately, and then disabling the - instant-uri property again afterwards. -- playbin3, decodebin3, uridecodebin3, parsebin, and urisourcebin are - no longer experimental - - They were originally marked as ‘technology preview’ but have - since seen extensive usage in production settings, so are - considered ready for general use now. - -Fraunhofer AAC audio encoder HE-AAC and AAC-LD profile support - -- fdkaacenc: - - Support for encoding to HE-AACv1 and HE-AACv2 profile - - Support for encoding to AAC Low Delay (LD) profile - - Advanced bitrate control options via new “rate-control”, - “vbr-preset”, “peak-bitrate”, and “afterburner” properties - -RTP rapid synchronization support in the RTP stack (RFC6051) - -RTP provides several mechanisms how streams can be synchronized relative -to each other, and how absolute sender times for RTP packets can be -obtained. One of these mechanisms is via RTCP, which has the -disadvantage that the synchronization information is only distributed -out-of-band and usually some time after the start. - -GStreamer’s RTP stack, specifically the rtpbin, rtpsession and -rtpjitterbuffer elements, now also have support for retrieving and -sending the same synchronization information in-band via RTP header -extensions according to RFC6051 (Rapid Synchronisation of RTP Flows). -Only 64-bit timestamps are supported currently. - -This provides per packet synchronization information from the very -beginning of a stream and allows accurate inter-stream, and (depending -on setup) inter-device, synchronization at the receiver side. - -ONVIF XML Timed Metadata support - -The ONVIF standard implemented by various security cameras also -specifies a format for timed metadata that is transmitted together with -the audio/video streams, usually over RTSP. - -Support for this timed metadata is implemented in the MP4 demuxer now as -well as the new fragmented MP4 muxer and the new non-fragmented MP4 -muxer from the GStreamer Rust plugins. Additionally, the new onvif -plugin ‒ which is part of the GStreamer Rust plugins ‒ provides general -elements for handling the metadata and e.g. overlaying certain parts of -it over a video stream. - -As part of this support for absolute UTC times was also implemented -according to the requirements of the ONVIF standards in the -corresponding elements. - -MP3 gapless playback support - -While MP3 can probably considered a legacy format at this point, a new -feature was added with this release. - -When playing back plain MP3 files, i.e. outside a container format, -switches between files can now be completely gapless if the required -metadata is provided inside the file. There is no standardized metadata -for this, but the LAME MP3 encoder writes metadata that can be parsed by -the mpegaudioparse element now and forwarded to decoders for ensuring -removal of padding samples at the front and end of MP3 files. - -“force-live” property for audio + video aggregators - -This is a quality of life fix for playout and streaming applications -where it is common to have audio and video mixer elements that should -operate in live mode from the start and produce output continuously. - -Often one would start a pipeline without any inputs hooked up to these -mixers in the beginning, and up until now there was no way to easily -force these elements into live mode from the start. One would have to -add an initial live video or audio test source as dummy input to achieve -this. - -The new “force-live” property makes these audio and video aggregators -start in live mode without the need for any dummy inputs, which is -useful for scenarios where inputs are only added after starting the -pipeline. - -This new property should usually be used in connection with the -“min-upstream-latency” property, i.e. you should always set a non-0 -minimum upstream latency then. - -This is now supported in all GstAudioAggregator and GstVideoAggregator -subclasses such as audiomixer, audiointerleave, compositor, -glvideomixer, d3d11compositor, etc. - -New elements and plugins - -- new cudaconvertscale element that can convert and scale in one pass - -- new gtkwaylandsink element based on gtksink, but similar to - waylandsink and uses Wayland APIs directly instead of rendering with - Gtk/Cairo primitives. This approach is only compatible with Gtk3, - and like gtksink this element only supports Gtk3. - -- new h264timestamper and h265timestamper elements to reconstruct - missing pts/dts from inputs that might not provide them such as - e.g. RTP/RTSP/WebRTC inputs (see above) - -- mfaacdec, mfmp3dec: Windows MediaFoundation AAC and MP3 decoders - -- new msdkav1enc AV1 video encoder element - -- new nvcudah264enc, nvcudah265enc, nvd3d11h264enc, and nvd3d11h265enc - NVIDIA GPU encoder elements to support zero-copy encoding, via CUDA - and Direct3D11 APIs, respectively - -- new nvautogpuh264enc and nvautogpuh265enc NVIDIA GPU encoder - elements: The auto GPU elements will automatically select a target - GPU instance in case multiple NVIDIA desktop GPUs are present, also - taking into account the input memory. On Windows CUDA or Direct3D11 - mode will be determined by the elements automatically as well. Those - new elements are useful if target GPU and/or API mode (either CUDA - or Direct3D11 in case of Windows) is undeterminable from the encoder - point of view at the time when pipeline is configured, and therefore - lazy target GPU and/or API selection are required in order to avoid - unnecessary memory copy operations. - -- new nvav1dec AV1 NVIDIA desktop GPU decoder element - -- new qml6glsink element to render video with Qt6 - -- qsv: New Intel OneVPL/MediaSDK (a.k.a Intel Quick Sync) based - decoder and encoder elements, with gst-d3d11 (on Windows) and gst-va - (on Linux) integration - - - Support multi-GPU environment, for example, concurrent video - encoding using Intel iGPU and dGPU in a single pipeline - - H.264 / H.265 / VP9 and JPEG decoders - - H.264 / H.265 / VP9 / AV1 / JPEG encoders with dynamic encoding - bitrate update - - New plugin does not require external SDK for building on Windows - -- vulkanoverlaycompositor: new vulkan overlay compositor element to - overlay upstream GstVideoOverlayCompositonMeta onto the video - stream. - -- vulkanshaderspv: performs operations with SPIRV shaders in Vulkan - -- win32ipcvideosink, win32ipcvideosrc: new shared memory videosrc/sink - elements for Windows - -- wicjpegdec, wicpngdec: Windows Imaging Component (WIC) based JPEG - and PNG decoder elements. - -- Many exciting new Rust elements, see Rust section below - -New element features and additions - -- audioconvert: Dithering now uses a slightly slower, less biased PRNG - which results in better quality output. Also dithering can now be - enabled via the new “dithering-threshold” property for target bit - depths of more than 20 bits. - -- av1enc: Add “keyframe-max-dist” property for controlling max - distance between keyframes, as well as “enc-pass”, “keyframe-mode”, - “lag-in-frames” and “usage-profile” properties. - -- cccombiner: new “output-padding” property - -- decklink: Add support for 4k DCI, 8k/UHD2 and 8k DCI modes - -- dvbsubenc: Support for >SD resolutions is working correctly now. - -- fdkaacenc: Add HE-AAC / HE-AACv2 profile support +See https://gstreamer.freedesktop.org/releases/1.24/ for the latest version of this document. -- glvideomixer: New “crop-left,”crop-right, “crop-top” and - “crop-bottom” pad properties for cropping inputs +Last updated: Wednesday 20 June 2024, 22:35 UTC (log) -- gssink: new ‘content-type’ property. Useful when one wants to upload - a video as video/mp4 instead of ’video/quicktime` for example. +## Introduction -- jpegparse: Rewritten using the common parser library +The GStreamer team is proud to announce a new major feature release in the stable 1.x API series of your favourite +cross-platform multimedia framework! + +As always, this release is again packed with many new features, bug fixes and other improvements. + +## Highlights + +- New Discourse forum and Matrix chat space +- New Analytics and Machine Learning abstractions and elements +- Playbin3 and decodebin3 are now stable and the default in gst-play-1.0, GstPlay/GstPlayer +- The va plugin is now preferred over gst-vaapi and has higher ranks +- GstMeta serialization/deserialization and other GstMeta improvements +- New GstMeta for SMPTE ST-291M HANC/VANC Ancillary Data +- New unixfd plugin for efficient 1:N inter-process communication on Linux +- cudaipc source and sink for zero-copy CUDA memory sharing between processes +- New intersink and intersrc elements for 1:N pipeline decoupling within the same process +- Qt5 + Qt6 QML integration improvements including qml6glsrc, qml6glmixer, qml6gloverlay, and qml6d3d11sink elements +- DRM Modifier Support for dmabufs on Linux +- OpenGL, Vulkan and CUDA integration enhancements +- Vulkan H.264 and H.265 video decoders +- RTP stack improvements including new RFC7273 modes and more correct header extension handling in depayloaders +- WebRTC improvements such as support for ICE consent freshness, and a new webrtcsrc element to complement webrtcsink +- WebRTC signallers and webrtcsink implementations for LiveKit and AWS Kinesis Video Streams +- WHIP server source and client sink, and a WHEP source +- Precision Time Protocol (PTP) clock support for Windows and other additions +- Low-Latency HLS (LL-HLS) support and many other HLS and DASH enhancements +- New W3C Media Source Extensions library +- Countless closed caption handling improvements including new cea608mux and cea608tocea708 elements +- Translation support for awstranscriber +- Bayer 10/12/14/16-bit depth support +- MPEG-TS support for asynchronous KLV demuxing and segment seeking, plus various new muxer features +- Capture source and sink for AJA capture and playout cards +- SVT-AV1 and VA-API AV1 encoders, stateless AV1 video decoder +- New uvcsink element for exporting streams as UVC camera +- DirectWrite text rendering plugin for windows +- Direct3D12-based video decoding, conversion, composition, and rendering +- AMD Advanced Media Framework AV1 + H.265 video encoders with 10-bit and HDR support +- AVX/AVX2 support and NEON support on macOS on Apple ARM64 CPUs via new liborc +- GStreamer C# bindings have been updated +- Rust bindings improvements and many new and improved Rust plugins +- Rust plugins now shipped in packages for all major platforms including Android and iOS +- Lots of new plugins, features, performance improvements and bug fixes + +## Major new features and changes + +### Discourse forum and Matrix chat space + +- The new Discourse forum and Matrix chat space are now our preferred communication channels for support and developer chat. + +- The mailing lists and IRC channel are on their way to being phased out, but Discourse can be used via e-mail as well. + +- For release announcements please subscribe to the News + Announcements category on Discourse, although we will continue to + also send announcements to the mailing list for the time being. + +### Playbin3, decodebin3 now stable and default + +- After a year of stability, testing and more improvements, playbin3, and its various components (uridecodebin3, decodebin3 + and urisourcebin), are now the recommended playback components. + +- Some playback components have now switched to defaulting to playbin3: gst-play-1.0 and the GstPlay / GstPlayer libraries. + Application developers are strongly recommended to switch to using those components instead of the legacy playbin and + (uri)decodebin. + +Improvements in this cycle: + +- Better support missing/faulty decoders, attempt to use another one or gracefully un-select the stream. + +- Many fixes for more complex gapless and instant-switching scenarios + +- Lower latency for live pipelines + +- Fix for “chained” streams (ex: Ogg, or PMT update in MPEG-TS) + +- Fixes for hardware-accelerated playback with subtitles (provided the sink can handle offloading composition). This was also + partly due to a historical confusion between subtitle “decoders” (which decode the format to text and “parsers” (which only + do timing detection and optional seeking). + +### GstMeta serialization/deserialization and other GstMeta improvements + +- GstMeta serialization/deserialization allows metas to be transmitted or stored. This is used by the unixfd and cudaipc + plugins for inter-process communication (IPC). Implemented so far for GstCustomMeta, GstVideoMeta, GstAudioMeta and + GstReferenceTimestampMeta. + +- Simplified GstCustomMeta registration with gst_meta_register_custom_simple() for the simple case where tags and transform + functions are not needed. + +- GstMetaClearFunction clears the content of the meta. This will be called by buffer pools when a pooled buffer is returned to + the pool. + +- Add gst_meta_info_new() and gst_meta_info_register() to register a GstMeta in two steps for easier extensibility. + +### New unixfd plugin for efficient 1:N inter-process communication on Linux + +- unixfdsink and unixfdsrc are elements that, inspired by shmsink andn shmsrc, send UNIX file descriptors (e.g. memfd, dmabuf) + from one sink to multiple source elements in other processes on Linux. + +- The unixfdsink proposes a memfd/shm allocator to upstream elements which allows for example videotestsrc to write directly + into memory that can be transfered to other processes without copying. + +### New GstMeta for SMPTE ST-291M HANC/VANC Ancillary Data + +- Previously only various specific GstMeta for ancillary data were provided, such as GstVideoCaptionMeta and GstVideoAFDMeta. + The new GstAncillaryMeta allows passing arbitrary ancillary data between elements, including custom and non-standard + ancillary data. See GstAncillaryMeta for details. + +- Add with gst_buffer_add_ancillary_meta() and retrieve with gst_buffer_get_ancillary_meta() or + gst_buffer_iterate_ancillary_meta(). + +- Supported by the newly added AJA sink and source elements + +### DSD audio support + +- DSD audio is a non-PCM raw audio format representation and the GstAudio library gained support for this in form of new + GstDsdInfo and GstDsdFormat API. + +- Support for DSD audio has been implemented in alsasink as well as the GstAudioSink and GstAudioRingBuffer base classes, and + the gst-libav plugin to enable FFmpeg-based DSD elements and functionality. + +### Analytics and Machine Learning + +- A new library, GstAnalytics, has been added. It defines a GstAnalyticsRelationMeta that can efficiently hold a large number + of observations from a data analysis process, for example from machine learning. It also contains a matrix of the + relationship between those observations. + +- Three types of metadata are already defined in the library: object detection, classification and tracking. + +- A new objectdetectionoverlay element has been merged that draws the bounding boxes and the classes from the object detection + and classification metadata types. + +- The onnxinference element has been split into two parts. The first part works with the ONNX Runtime library to do the actual + inference, while the second part called ssdobjectdetector interprets the produced tensor. This new element creates + GstAnalyticsRelationMeta. + +- The onnxinference element now accepts video frames without transformation if the module declares that it accepts the “Image” + type and the format is something that GStreamer knows. + +- In the next release, tensor decoders such as ssdobjectdetector will live outside of the ONNX plugin so they can be used with + other machine learning acceleration frameworks. + +### Qt5 + Qt6 QML integration improvements + +- The Qt5 qmlglsink, qmlgloverlay, qmlglmixer received support for directly consuming BGRA and YV12 video frames without a + prior glcolorconvert. + +- New qml6glsrc, qml6glmixer, and qml6gloverlay elements as Qt6 counterparts to the existing Qt5 elements, also with support + for directly consuming BGRA and YV12 video frames without a prior glcolorconvert. + +- qml6d3d11sink is a new Direct3D11 Qt6 QML sink for Windows as an alternative to the existing qml6glsink. + +### DRM Modifier Support for dmabufs on Linux + +The Linux dmabuf subsystem provides buffer sharing across different hardware device drivers and subsystems, and is used +extensively by the DRM subsystem to exchange buffers between processes, contexts, and library APIs within the same process, and +also to exchange buffers with other subsystems such as Linux Media. + +In GStreamer, it’s used on the capture side (v4l2src, pipewire), hardware-accelerated video decoders and encoders, OpenGL +integration, Wayland renderers, etc. + +GStreamer has had support for dmabufs for a long time and was able to negotiate “zero-copy” paths between different components, +however it only supported and assumed simple linear formats and was not able to negotiate complex non-linear formats. This meant +that dmabuf support actually had to be disabled in many scenarios to avoid “garbled video”. + +With GStreamer 1.24 there is now full DRM modifier support and complex non-linear formats can be supported and negotiated +between components. + +This is achieved with an extra drm_format field in video/x-raw(memory:DMABuf), format=(string)DMA_DRM caps, e.g. +drm-format=(string)NV12:0x0x0100000000000001. + +See the GStreamer DMA buffers design documentation for more details. + +This is used in the VA-API va plugin, waylandsink, the MSDK plugin, and the OpenGL integration. Video4Linux support is expected +to land in one of the next minor releases. + +New API has been added for easy handling of these new caps: + +- GstVideoInfoDmaDrm plus associated functions, similar to GstVideoInfo, including conversion to and from GstVideoInfo with + gst_video_info_dma_drm_from_video_info() and gst_video_info_dma_drm_to_video_info() + +- GST_VIDEO_DMA_DRM_CAPS_MAKE + +- GST_VIDEO_FORMAT_DMA_DRM + +### OpenGL integration enhancements + +- When using EGL, if both OpenGL ES and OpenGL are available, OpenGL ES is preferred over OpenGL. OpenGL ES supports some + necessary features required for dmabuf support. This does not apply if an external library/application chooses an OpenGL API + first. + +- Improved support for dmabuf use cases. The glupload element now supports the new and improved dmabuf negotiation with + explicit modifiers. + +- Base classes for mixing with OpenGL are now public API. GstGLBaseMixer and GstGLMixer are exposed matching the existing + filter-based GstGLBaseFilter and GstGLFilter base classes. The new OpenGL mixer base classes are based on + GstVideoAggregator. + +- Add support for a ‘surfaceless’ EGL context using EGL_MESA_platform_surfaceless. + +- Expose Vivante Framebuffer build-related files (pkg-config, gir) as public API + +- Add support for more video formats: + + - A420 8/10/12/16-bit. + - A422 8/10/12/16-bit. + - A444 8/10/12/16-bit. + - I420 10/12 bit. + - RBGA. + +- Add support for tiled video formats + + - NV12_16L32S (Mediatek format) + - NV12_4L4 (Verisilicon Hantro format) + +- glcolorconvert now has API for retrieving shader strings for: + + - swizzling (reordering components). + - YUV->RGB conversion. + - RGB->YUV conversion. + +- Add more helpers for information about a particular video and/or GL format e.g. number of components, bytes used, or pixel + ordering. + +- glvideomixer has new sink pad properties sizing-policy, xalign, yalign matching compositor. + +- GstGLBufferPool now has a configuration option for allowing a number of buffers to be always outstanding allowing for + reducing the potential synchronisation delay when reusing OpenGL memory backed buffers. + +### Vulkan integration enhancements + +- Add support for the Vulkan H.264 and H.265 decoders. + +- Add support for timeline semaphores. + +- Optionally use newer Vulkan functions for format selection. + +- Add support for GPU-assisted validation. + +- Vulkan/Wayland: add support for xdg_wm_base protocol for creating a visible debug window. Required as the previous wl_shell + interface is being removed from compositors. + +### CUDA / NVCODEC integration and feature additions + +- New cudaipcsrc and cudaipcsink elements for zero-copy CUDA memory sharing between processes + +- New nvJPEG library based nvjpegenc JPEG encoder element + +- The NVIDIA desktop GPU decoder nvh264sldec, nvh265sldec, nvvp8sldec, and nvvp9sldec elements were renamed to nvh264dec, + nvh265dec, nvvp8dec, and nvvp9dec, respectively. + +- GStreamer NVIDIA H.264 and H.265 encoders except for nvh264enc and nvh265enc gained support for CEA708 Closed Caption + inserting. + +- OpenGL memory support is added to nv{cuda,autogpu}h264enc and nv{cuda,autogpu}h265enc elements + +- CUDA stream integration: As of 1.24, CUDA stream synchronization is an application’s responsibility, and GStreamer will not + execute unnecessary synchronization operations. If an application needs direct access to CUDA memory via GST_MAP_CUDA map + flag, cuStreamSynchronize() or gst_cuda_memory_sync() call is required unless application-side CUDA operation is executed + with the GstCudaMemory’s associated CUDA stream. + +### RTP stack improvements + +- New rtppassthroughpay element which just passes RTP packets through unchanged, but appears like an RTP payloader element. + This is useful for relaying an RTP stream as-is through gst-rtsp-server, which expects an RTP payloader with certain + properties at the end of an RTSP media sub-pipeline. + +- New “timeout-inactive-rtp-sources” property on rtpbin, sdpdemux and rtpsession to allow applications to disable automatic + timeout of sources from which no data has been received for a while. + +- rtpvp8pay, rtpvp9pay: expose “picture-id” as a property, and add a “picture-id-offset” property to the VP9 payloader to + bring it in line with the VP8 payloader. + +- rtpjitterbuffer has seen improved media clock handling (clock equality and clock setting/resetting), as well as two new + properties that allow reconstruction of absolute PTP timestamps without actually syncing to the PTP clock, which can be + useful in scenarios where one wants to reconstruct the absolute PTP clock timestamps on a machine that doesn’t have access + to the network of the PTP clock provider. The two new properties are: + + - “rfc7273-use-system-clock”: allows the jitter buffer to assume that the system clock is synced sufficiently close to the + media clock used by an RFC7273 stream. By default the property is disabled and the jitter buffer will create a media + clock and try to sync to it, but this is only required to determine in which wraparound period from the media clock’s + Epoch the current RTP timestamps refer to (and thus to reconstruct absolute time stamps from them). If the property is + enabled the wraparound period and current offset from the Epoch will be determined based on the local system clock, + which means that no direct network connection to the media clock provider is needed to reconstruct absolute timestamps. + There is also no start-up delay, because there’s no clock sync that needs to be established first. + + - “rfc7273-reference-timestamp-meta-only”: If this property is enabled then the jitter buffer will do the normal timestamp + calculations for the output buffers according to the configured mode instead of making use of the RFC7273 media clock + for that. It will still calculate RFC7273 media clock timestamps, but only attach them to the output buffers in form of + a clock reference meta. + +- RTP payloaders and depayloaders now have an “extensions” property for retrieving the list of currently enabled RTP header + extensions. + +- rtpbin and webrtcbin no longer blindly set properties on the jitter buffer assuming it’s a standard rtpjitterbuffer, but + instead check if the property is available first, to better support non-standard jitterbuffers or even an identity element + in lieu of a jitter buffer. + +- RTP header extension handling fixes for depayloaders that aggregate multiple input buffers into a single output buffer. + Before, only the last RTP input buffer was checked for header extensions. Now the depayloader remembers all RTP packets + pushed before an output buffer is produced and checks all RTP input buffers for header extensions. + + - Affected depayloaders: rtph264depay, rtph265depay, rtpvp8depay, rtpvp9depay, rtpxqtdepay, rtpasfdepay, rtpmp4gdepay, + rtpsbcdepay, rtpvorbisdepay, rtpmp4vdepay, rtptheoradepay, rtpsv3vdepay, rtpmp4adepay, rtpklvdepay, rtpjpegdepay, + rtpj2kdepay, rtph263pdepay, rtph263depay, rtph261depay. rtpgstdepay. + +### WebRTC improvements + +- Add support for ICE consent freshness (RFC 7675). This requires libnice >= 0.1.22. + +- Advertise the local side of an end-of-candidates with an empty candidate string. + +- Add the number of Data Channels opened and closed to webrtcbin’s statistics. + +- Various improvements and feature additions in the Rust webrtc plugin, which provides webrtcsrc and webrtcsink elements as + well as specific elements for different WebRTC signalling protocols. See the Rust plugins section below for more details. + +### Adaptive Streaming improvements and Low-Latency HLS (LL-HLS) support + +- hlsdemux2 now supports Low-Latency HLS (LL-HLS) + +- hlsdemux2 asynchronous playlist download and update improves responsiveness and bandwith usage. + +- hlsdemux2 handles fallback variant URLs. + +- hlsdemux2 is more responsive and accurate when handling seeks. + +- dashdemux2 and hlsdemux2 have a new “start-bitrate” property, improving the decision for which initial stream variant that + will be used. + +- dashdemux2, hlsdemux2, mssdemux2 have received many improvements regarding seeking, along with support for “early-seek” + which allows playback to start immediately from the requested position without any previous download. + +- dashdemux2, hlsdemux2, mssdemux2 better handle errors on or near the live edge. + +- dashsink can now use the dashmp4mux muxer from the Rust plugins and will also produce better and RFC 6381-compatible codec + strings. The “suggested-presentation-delay” property allows to set the suggested presentation delay in the MPD. + +- No development took place on the legacy demuxers (dashdemux, hlsdemux, mssdemux). Application developers are reminded to use + the new demuxers instead. They are automatically picked up when using urisourcebin, uridecodebin3 or playbin3. + +### W3C Media Source Extensions library + +- A new GStreamer library (mse) implementing the W3C Media Source Extensions specification was added. + +- Applications can embed this library along with GStreamer in order to integrate software that uses the Media Source APIs + without relying on a web browser engine. Typically an application consuming this library will wrap the C API with JavaScript + bindings that match the Media Source API so their existing code can integrate with this library. + +### Closed Caption handling improvements + +- ccconverter supports converting between the two CEA-608 fields. + +- New cea608mux element for muxing multiple CEA-608 streams together. + +- Various improvements and feature additions in the Rust-based closed caption elements. Check out the Rust plugins section + below for more details. + +### Precision Time Protocol (PTP) clock improvements + +- Many fixes and compatibility/interoperability improvements. + +- Better support for running on devices with multiple network interfaces. + +- Allow sync to master clock on same host. + +- PTP clock support is now also available on Windows. + +- The standalone ptp-helper binary has been rewritten in Rust for portability and security. This works on Linux, Android, + Windows, macOS, FreeBSD, NetBSD, OpenBSD, DragonFlyBSD, Solaris and Illumos. Newly supported compared to the C version is + Windows. Compared to the C version various error paths are handled more correctly and a couple of memory leaks are fixed. + Otherwise it should work identically. The minimum required Rust version for compiling this is 1.48, i.e. the version + currently in Debian oldstable. On Windows, Rust 1.54 is needed at least. + +- New ptp-helper Meson build option so PTP support can be disabled or required. + +- gst_ptp_init_full() allows for a more fine-grained and extensible configuration and initialization of the GStreamer PTP + subsystem, including TTL configuration. + +### Bayer 10/12/14/16-bit depth support + +- bayer2rgb and rgb2bayer now support bayer with 10/12/14/16 bit depths + +- v4l2src and videotestsrc now support bayer with 10/12/14/16 bit depths + +- imagefreeze gained bayer support as well + +### MPEG-TS improvements + +- mpegtsdemux gained support for + - segment seeking for seamless non-flushing looping, and + - synchronous KLV +- mpegtsmux now + - allows attaching PCR to non-PES streams + - allows setting of the PES stream number for AAC audio and AVC video streams via a new “stream-number” property on the + muxer sink pads. Currently the PES stream number is hard-coded to zero for these stream types. + - allows writing arbitrary Opus channel mapping families and up to 255 channels + - separate handling of DVB and ATSC AC3 descriptors + +## New elements and plugins + +- analyticsoverlay visualises object-detection metas on a video stream. + +- autovideoflip and autodeinterlace are two new auto elements. + +- AJA source and sink elements plus device provider for AJA capture and playout cards, including support for HANC/VANC + ancillary data. + +- New cea608mux element for muxing multiple CEA-608 streams together. + +- The codec2json plugin adds av12json, h2642json, h2652json and vp82json elements which convert AV1, H.264, H.265 and VP8 + frame parameters into human readable JSON data, which is useful for debugging and testing purposes. + +- New lc3 plugin with a decoder and encoder for the Bluetooth LC3 audio codec. + +- New onnxinference element to run ONNX inference models on video buffers. + +- New rtppassthroughpay element which just passes RTP packets through unchanged, but appears like an RTP payloader element. + This is mostly useful for medias that simply pass through an existing RTP stream in gst-rtsp-server. + +- Qt6: qml6glsrc, qml6glmixer, qml6gloverlay, and qml6d3d11sink + +- New SVT-AV1 encoder plugin, imported from SVT-AV1 but with many fixes. + +- Many exciting new Rust elements, see Rust section below. + +- New DirectWrite text rendering and Direct3D12 plugins (see Windows section below). + +- New vaav1enc element for encoding video in AV1 (See VA-API section) + +- New uvcsink element for exporting streams as UVC camera + +## New element features and additions + +- alphacombine supports I420_10LE now for 10-bit WebM/alpha support. + +- The amfcodec for hardware-accelerated video encoding using the Advanced Media Framework (AMF) SDK for AMD GPUs gained some + new features: + + - 10-bit and HDR support for H.265 / HEVC and AV1 video encoders + - B-frame support in the H.264 encoder + - Initial support of pre-analysis and pre-encoding + - Initial support of Smart Access Video for optimal distribution amongst multiple AMD hardware instances. + +- appsink: new “propose-allocation” signal so applications can provide a buffer pool or allocators to the upstream elements, + as well as “max-time” and “max-buffers” properties to configure the maximum size of the appsink-internal queue in addition + to the existing “max-bytes” property. + +- autovideoconvert exposes colorspace and scaler elements for well know elements + +- avtp: add AVTP Raw Video Format payload and de-payload support. + +- cacasink’s output driver can now be selected via the “driver” property. + +- camerabin: various fixes and stability improvements + +- clocksync: “QoS” property to optionally send QoS events upstream like a synchronising sink would. + +- cutter: can add GstAudioLevelMeta on output buffers, which can be enabled via the new “audio-level-meta” property. + +- dashdemux2 has a new “start-bitrate” property. + +- dashsink can now use the dashmp4mux muxer from the Rust plugins and will also produce better and RFC 6381-compatible codec + strings. The “suggested-presentation-delay” property allows to set the suggested presentation delay in the MPD. + +- deinterlace: Add support for 10/12/16-bit planar YUV formats + +- The dvdspu subpicture overlay now implements GstVideoOverlayComposition support to make it work better with hardware + decoders where the video data should ideally stay on the GPU/VPU and the overlay blitting be delegated to the renderer. + +- encodebin now automatically autoplugs timestamper elements such as h264timestamper or h265timestamper, based on new + “Timestamper” element factory type and rank. + +- New fakevideodec element (see debugging section below). + +- filesink: “file-mode” property to allow the ability to specify rb+ file mode, which overwrites an existing file. This is + useful in combination with splitmuxsink so that files can be pre-allocated which can be useful to reduce disk fragmentation + over time. + +- flvmux: add “enforce-increasing-timestamps” property to allow disabling a hack that was added back in the day because + librtmp as used in rtmpsink would get confused by timestamps going backwards, but this is no longer required with rtmpsink2. + If set to true (still the default, for backwards compatibility), flvmux will modify buffers timestamps to ensure they are + always strictly increasing, inside one stream and also between the audio and video streams. + +- giostreamsink: Add a property to close the stream on stop(). + +- h264parse improved its AU boundary detection. + +- h264parse, h265parse, mpegvideoparse now support multiple unregistered user data SEI messages. + +- insertbin is now a registered element and available via the registry, so can be constructed via parse-launch and not just + via the insertbin API. + +- jack: libjack is now loaded dynamically at runtime instead of linking it at build time. This means the plugin can be shipped + on Windows and macOS and will work if there’s a user-installed JACK server/library setup. + +- jpegparse now has a rank so it will be autoplugged if needed. + +- kmssink: Add auto-detection for NXP i.MX8M Plus LCDIFv3, ST STM32 LTDC, and Texas Instruments TIDSS display controllers. + +- matroskademux and matroskamux gained support for more raw video formats, namely RGBA64_LE, BGRA64_LE, GRAY10_BE32, GRAY16_LE + +- mpg123audiodec’s rank was changed from MARGINAL to PRIMARY so it’s now higher than avdec_mp3, as it works better with + “freeformat” MP3s. - msdk: - - new msdkav1enc AV1 video encoder element - - msdk decoders: Add support for Scaler Format Converter (SFC) on - supported Intel platforms for hardware accelerated conversion - and scaling - - msdk encoders: support import of dmabuf, va memory and D3D11 - memory - - msdk encoders: add properties for low delay bitrate control and - max frame sizes for I/P frames - - msdkh264enc, msdkh265enc: more properties to control intra - refresh - - note that on systems with multi GPUs the Windows D3D11 - integration might only work reliably if the Intel GPU is the - primary GPU + - DRM modifier support on Linux -- mxfdemux: Add support for Canon XF-HEVC + - only expose codecs and capabilities actually supported by the platform -- openaptx: Support the freeaptx library + - msdkvpp video post-processing: -- qroverlay: + - new “hdr-tone-mapping” property to enable HDR-to-SDR tone mapping + - new compute scaling mode - - new “qrcode-case-sensitive” property allows encoding case - sensitive strings like wifi SSIDs or passwords. - - added the ability to pick up data to render from an - upstream-provided custom GstQROverlay meta + - Decoders sport D3D11 and VA integration, and the VP9 decoder supports certain resolution changes. -- qtdemux: Add support for ONVIF XML Timed MetaData and AVC-Intra - video + - Encoders: -- rfbsrc now supports the uri handler interface, so applications can - use RFB/VNC sources in uridecodebin(3) and playbin, with - e.g. rfb://:password@10.1.2.3:5903?shared=1 + - msdkh264enc, msdkh265enc**: “pic-timing-sei” property to insert pic timing SEI + - msdkh264enc, msdkh265enc**: Add properties to allow different max/min-qp values for I/P/B frames + - msdkh264enc: Added BGRx format DMABuf support + - Advertise special image formats in low power mode -- rtponviftimestamp: Add support for using reference timestamps +- mxfdemux gained support for FFV1 demuxing -- rtpvp9depay now has the same keyframe-related properties as - rtpvp8depay and rtph264depay: “request-keyframe” and - “wait-for-keyframe” +- opusenc, opusdec now support decoding and encoding more than 8 channels, and can also handle unknown/unpositioned channel + layouts. -- rtspsrc: Various RTSP servers are using invalid URL operations for - constructing the control URL. Until GStreamer 1.16 these worked - correctly because GStreamer was just appending strings itself to - construct the control URL, but starting version 1.18 the correct URL - operations were used. With GStreamer 1.22, rtspsrc now first tries - with the correct control URL and if that fails it will retry with - the wrongly constructed control URL to restore support for such - servers. +- The oss plugin gained a device provider for audio device discovery -- rtspsrc and rtpjitterbuffer gained a new - “add-reference-timestamp-meta” property that makes them put the - unmodified original sender timestamp on output buffers for NTP or - PTP clock synced senders +- pcapparse learned how to handle the Linux “cooked” capture encapsulation v2 -- srtsrc, srtsink: new “auto-reconnect” property to make it possible - to disable automatic reconnects (in caller mode) and make the - elements post an error immediately instead; also stats improvements +- Intel Quick Sync plugin improvements: -- srtsrc: new “keep-listening” property to avoid EOS on disconnect and - keep the source running while it waits for a new connection. + - qsvh264enc gained more encoding options + - qsvh265dec now supports GBR decoding and HEVC RExt profiles -- videocodectestsink: added YUV 4:2:2 support +- qtdemux now adds audio clipping meta when playing gapless m4a content, supports CENC sample grouping, as well as the SpeedHQ + video codec. -- wasapi2src: Add support for process loopback capture +- ristsrc gained support for dynamic payloads via the new “caps” and “encoding-name” properties. These can be used to make the + ristsrc receive other payload types than MPEG-TS. -- wpesrc: Add support for modifiers in key/touch/pointer events +- rtmp2src: a new “no-eof-is-error” property was added: There is currently no way for applications to know if the stream has + been properly terminated by the server or if the network connection was disconnected, as an EOS is sent in both cases. With + the property set, connection errors will be reported as errors, allowing applications to distinguish between both scenarios. -Plugin and library moves +- rtspsrc: new “extra-http-request-headers” property for adding custom http request headers when using http tunnelling. -- The xingmux plugin has been moved from gst-plugins-ugly into - gst-plugins-good. +- sdpdemux now supports SDP source filters as per RFC 4570; audio-only or video-only streaming can be selected via the new + “media” property, and RTCP feedback can be disabled via the “rtcp-mode” property. -- The various Windows directshow plugins in gst-plugins-bad have been - unified into a single directshow plugin. +- splitmuxsrc uses natural ordering to sort globbed filenames now, i.e. 0, 1, 2, 10, 11 instead of 0, 1, 10, 11, 2, … -Plugin removals +- srt: Add more fields to the statistics to see how many packets were retransmitted and how many were dropped. -- The dxgiscreencapsrc element has been removed, use - d3d11screencapturesrc instead +- switchbin: many improvements, especially for caps handling and passthrough. -Miscellaneous API additions +- taginject: a “scope” property was added to allow injection of global tags in addition to the current default which is stream + tags. -- GST_AUDIO_FORMAT_INFO_IS_VALID_RAW() and - GST_VIDEO_FORMAT_INFO_IS_VALID_RAW() can be used to check if a - GstAudioFormatInfo or GstVideoFormatInfo has been initialised to a - valid raw format. +- timeoverlay: add buffer-count and buffer-offset time modes. -- Video SEI meta: new GstVideoSEIUserDataUnregisteredMeta to carry - H.264 and H.265 metadata from SEI User Data Unregistered messages. +- udpsrc: new “multicast-source” property to support IGMPv3 Source Specific Muliticast (SSM) as per RFC 4604. -- vulkan: Expose gst_vulkan_result_to_string() +- videoconvertscale, videoconvert: add a “converter-config” property to allow fine-tuning conversion parameters that are not + exposed directly as property. -Miscellaneous performance, latency and memory optimisations +- videoflip: many orientation tag handling fixes and improvements -- liborc 0.4.33 adds support for aarch64 (64-bit ARM) architecture - (not enabled by default on Windows yet though) and improvements for - 32-bit ARM and should greatly enhance performance for certain - operations that use ORC. +- videorate: add “drop-out-of-segment” property to force dropping of out-of-segment buffers. -- as always there have been plenty of performance, latency and memory - optimisations all over the place. +- volume now supports arbitrarily-large positive gains via a new “volume-full-range” property (it was not possibly to just + allow a bigger maximum value for the existing “volume” property for GstController-related backwards-compatibility reasons). -Miscellaneous other changes and enhancements +- waylandsink, gtkwaylandsink: improved frame scheduling reducing frame drops and improve throughput. -- the audio/video decoder base classes will not consider decoding - errors a hard error by default anymore but will continue trying to - decode. Previously more than 10 consecutive errors were considered a - hard error but this caused various partially broken streams to fail. - The threshold is configurable via the “max-errors” property. +- webpenc now has support for animated WebP which can be enabled via the new “animated” property. By default it will just + output a stand-alone WebP image for each input buffer, just like before. -- compatibility of the GStreamer PTP clock implementation with - different PTP server implementations was improved, and - synchronization is achieved successfully in various scenarios that - failed before. +- wpe: added a WebProcess crash handler; gained WPEWebKit 2.0 API support. -Tracing framework and debugging improvements +- x264enc gained support for 8-bit monochrome video (GRAY8). -New tracers +- ximagesrc gained navigation support (mouse and keyboard events). -- buffer-lateness: Records lateness of buffers and the reported - latency for each pad in a CSV file. Comes with a script for - visualisation. +- y4mdec now parses extended headers to support high bit depth video. -- pipeline-snapshot: Creates a .dot file of all pipelines in the - application whenever requested via SIGUSR1 (on UNIX systems) +## Plugin and library moves -- queue-levels: Records queue levels for each queue in a CSV file. - Comes with a script for visualisation. +- The AMR-NB and AMR-WB plugins have been moved from -ugly to -good. -Debug logging system improvements +## Plugin and element removals -- new log macros GST_LOG_ID, GST_DEBUG_ID, GST_INFO_ID, - GST_WARNING_ID, GST_ERROR_ID, and GST_TRACE_ID allow passing a - string identifier instead of a GObject. This makes it easier to log - non-gobject-based items and also has performance benefits. +- The entire gst-omx package and plugin has been retired. See the OMX section below for more details. -Tools +- The RealServer RTSP extension, RDT handling and PNM source have been removed from the realmedia plugin. -- gst-play-1.0 gained a --no-position command line option to suppress - position/duration queries, which can be useful to reduce debug log - noise. +- The kate subtitle plugin has been removed. -GStreamer FFMPEG wrapper +## Miscellaneous API additions -- Fixed bitrate management and timestamp inaccuracies for video - encoders +GStreamer Core -- Fix synchronization issues and errors created by the (wrong) - forwarding of upstream segment events by ffmpeg demuxers. +- gst_pipeline_get_configured_latency() and gst_pipeline_is_live() convenience functions to query liveness and configured + latency of a pipeline. -- Clipping meta support for gapless mp3 playback +- Plugins can now provide status info messages for plugins that will be displayed in gst-inspect-1.0 and is useful for dynamic + plugins that register features at runtime. They are now able to provide information to the user why features might not be + available. This is now used in the amfcodec, nvcodec, qsv, and va plugins. -GStreamer RTSP server +- GST_OBJECT_AUTO_LOCK() and GST_PAD_STREAM_AUTO_LOCK() are g_autoptr(GMutexLocker)-based helpers for GstPad and GstObject + that unlock the mutex automatically when the helper goes out of scope. This is not portable so should not be used in + GStreamer code that needs to be portable to e.g. Windows with MSVC. -- Add RFC5576 Source-specific media attribute to the SDP media for - signalling the CNAME +- gst_clear_context(), gst_clear_promise(), gst_clear_sample() -- Add support for adjusting request response on pipeline errors +- gst_util_ceil_log2() and gst_util_simplify_fraction() utility functions - - Give the application the possibility to adjust the error code - when responding to a request. For that purpose the pipeline’s - bus messages are emitted to subscribers through a - “handle-message” signal. The subscribers can then check those - messages for errors and adjust the response error code by - overriding the virtual method - GstRTSPClientClass::adjust_error_code(). +- New TAG_CONTAINER_SPECIFIC_TRACK_ID tag for container specific track ID as used in an HTML5 context, plus basic support in + matroskademux, qtdemux, dashdemux and dashdemux2 -- Add gst_rtsp_context_set_token() method to make it possible to set - the RTSPToken on some RTSPContext from bindings such as the Python - bindings. +- New utility functions to create a stream-id without a pad for elements: -- rtspclientsink gained a “publish-clock-mode” property to configure - whether the pipeline clock should be published according to RFC7273 - (RTP Clock Source Signalling), similar to the same API on - GstRTSPMedia. + - gst_element_decorate_stream_id() + - gst_element_decorate_stream_id_printf_valist() + - gst_element_decorate_stream_id_printf() -GStreamer VA-API support +- GstQueueArray gained API for sorting and sorted insertion -- Development activity has shifted towards the new va plugin, with - gstreamer-vaapi now basically in maintenance-only mode. Most of the - below refers to the va plugin (not gstreamer-vaapi). +- Add strict GstStructure serialisation with gst_structure_serialize_full() in combination with GST_SERIALIZE_FLAG_STRICT + which only succeeds if the result can later be fully deserialised again. -- new gst-va library for GStreamer VA-API integration +- GstBaseSrc enhancements: the “automatic-eos” property can be used to do the equivalent to gst_base_src_set_automatic_eos(). + gst_base_src_push_segment() sends a segment event right away which can be useful for subclasses like appsrc which have their + own internal queuing. -- vajpegdec: new JPEG decoder +- GstBaseSink gained a new custom GST_BASE_SINK_FLOW_DROPPED flow return which can be used by subclasses from the virtual + ::render method to signal to the base class that a frame is not being rendered. This is used in e.g. waylandsink and ensures + that elements such as fpsdisplaysink will correctly report the rate of frames rendered and dropped. -- vah264enc, vah265enc: new H.264/H.265 encoders +GstDiscoverer -- vah264lpenc, vah265lpenc: new low power mode encoders +- New “load-serialized-info” signal to retrieve a serialized GstDiscovererInfo -- vah265enc: Add extended formats support such as 10/12 bits, 4:2:2 - and 4:4:4 +GstSDP -- Support encoder reconfiguration +- Add gst_sdp_message_remove_media() -- vacompositor: Add new compositor element using the VA-API VPP - interface +Video Library -- vapostproc: +DRM Modifier Support for dmabufs on Linux - - new “scale-method” property - - Process HDR caps if supported - - parse video orientation from tags +See section above. -- vaapipostproc: Enable the use of DMA-Buf import and export - (gstreamer-vaapi) +List of Video Formats for Passthrough -GStreamer Video4Linux2 support +New helper API was added to get a list of all supported video formats, including DMA_DRM formats, and can be used to advertise +all supported formats for passthrough purposes: -- Added support for Mediatek Stateless CODEC (VP8, H.264, VP9) +- GST_VIDEO_FORMATS_ANY_STR, GST_VIDEO_FORMATS_ANY +- gst_video_formats_any() which can be used by bindings or for code that prefers GstVideoFormat values instead of strings. -- Stateless H.264 interlaced decoder support +New Video Formats -- Stateless H.265 decoder support +- 12-bit and 16-bit A420 / A422 / A444 (YUV with alpha channel) variants: -- Stateful decoder support for driver resolution change events + - A444_12BE, A444_12LE + - A422_12BE, A422_12LE + - A420_12BE, A420_12LE + - A444_16BE, A444_16LE + - A422_16BE, A422_16LE + - A420_16BE, A420_16LE -- Stateful decoding support fixes for NXP/Amphion driver +- 8-bit A422 / A444 (YUV with alpha channel) variant: -- Support for hardware crop in v4l2src + - A422 + - A444 -- Conformance test improvement for stateful decoders +- Planar 16-bit 4:4:4 RGB formats: -- Fixes for Raspberry Pi CODEC + - GBR_16BE + - GBR_16LE -GStreamer OMX +- RBGA, intended to be used by hardware decoders where VUYA is only supported 4:4:4 decoding surface but the stream is encoded + with GBR color space, such as HEVC and VP9 GBR streams for example. -- There were no changes in this module +- Two tiled Mediatek 10-bit formats: -GStreamer Editing Services and NLE + - MT2110T + - MT2110R -- Handle compositors that are bins around the actual compositor - implementation (like glvideomixers which wraps several elements) +- Tiled 10-bit NV12 format NV12_10LE40_4L4 (Verisilicon Hantro) -- Add a mode to disable timeline editing API so the user can be in - full control of its layout (meaning that the user is responsible for - ensuring its validity/coherency) +## Miscellaneous performance, latency and memory optimisations -- Add a new fade-in transition type +- liborc 0.4.35 (latest: 0.4.38) adds support for AVX/AVX2 and contains improvements for the SSE backend. -- Add support for non-1/1 PAR source videos +- liborc 0.4.37 adds support for NEON on macOS on Apple ARM64 CPUs. -- Fix frame accuracy when working with very low framerate streams +- Most direct use of the GLib GSLice allocator has been removed, as there is little evidence that it actually still provides + much advantage over the standard system allocator on Linux or Windows in 2024. There is strong evidence however that it + causes memory fragmentation for standard GStreamer workloads such as RTSP/RTP/WebRTC streaming. -GStreamer validate +- As always there have been plenty of performance, latency and memory optimisations all over the place. -- Clean up and stabilize API so we can now generate rust bindings +## Tracing framework and debugging improvements -- Enhance the appsrc-push action type allowing to find tune the - buffers more in details +- The gst-stats tool can now be passed a custom regular expression -- Add an action type to verify currently configured pad caps +- gst-debug-viewer from the devtools module has seen minor improvements and fixes -- Add a way to run checks from any thread after executing a ‘wait’ - action. This is useful when waiting on a signal and want to check - the value of a property right when it is emited for example. +New tracers -GStreamer Python Bindings +- None in this release. -- Add a Gst.init_python() function to be called from plugins which - will initialise everything needed for the GStreamer Python bindings - but not call Gst.init() again since this will have been called - already. +Debug logging system improvements -- Add support for the GstURIHandlerInterface that allows elements to - advertise what URI protocols they support. +- Nothing major in this cycle. -GStreamer C# Bindings +Fake video decoder -- Fix AppSrc and AppSink constructors +- The new fakevideodec element does not decode the input bitstream, it only reads video width, height and framerate from the + caps and then pushes out raw video frames of the expected size in RGB format. -- The C# bindings have yet to be updated to include new 1.22 API, - which requires improvements in various places in the bindings / - binding generator stack. See issue #1718 in GitLab for more - information and to track progress. +- It draws a snake moving from left to right in the middle of the frame, which is reasonably light weight and still provides + an idea about how smooth the rendering is. -GStreamer Rust Bindings and Rust Plugins +## Tools -The GStreamer Rust bindings are released separately with a different -release cadence that’s tied to gtk-rs, but the latest release has -already been updated for the new GStreamer 1.22 API. Check the bindings -release notes for details of the changes since 0.18, which was released -around GStreamer 1.20. +- gst-launch-1.0 gained a new --prog-name command line option to set the program name, which will be used by GTK and GStreamer + to set the class or app-id. -gst-plugins-rs, the module containing GStreamer plugins written in Rust, -has also seen lots of activity with many new elements and plugins. A -list of all Rust plugins and elements provided with the 0.9 release can -be found in the repository. +- gst-play-1.0 now defaults to using playbin3, but can still be made to use the old playbin by passing the --use-playbin2 + command line argument. -- 33% of GStreamer commits are now in Rust (bindings + plugins), and - the Rust plugins module is also where most of the new plugins are - added these days. +## GStreamer FFmpeg wrapper -- The Rust plugins are now shipped as part of the Windows MSVC + macOS - binary packages. See below for the list of shipped plugins and the - status of Rust support in cerbero. +- New avvideocompare element to compare two incoming video buffers using a specified comparison method (e.g. SSIM or PSNR). -- The Rust plugins are also part of the documentation on the GStreamer - website now. +- Prefer using FFmpeg Musepack decoder/demuxer over musepackdec as they work better with decodebin3 and playbin3 which likes + to have parsers and decoders separate. -- Rust plugins can be used from any programming language. To the - outside they look just like a plugin written in C or C++. +- Added codec mappings for AV1, MxPEG, FFVHuff video -New Rust plugins and elements +- Added raw video format support for P010, VUYA, Y410, P012, Y212 and Y412. -- rtpav1pay / rtpav1depay: RTP (de)payloader for the AV1 video codec -- gtk4paintablesink: a GTK4 video sink that provides a GdkPaintable - for rendering a video in any place inside a GTK UI. Supports - zero-copy rendering via OpenGL on Linux and macOS. -- ndi: source, sink and device provider for NewTek NDI protocol -- onvif: Various elements for parsing, RTP (de)payloading, overlaying - of ONVIF timed metadata. -- livesync: Element for converting a live stream into a continuous - stream without gaps and timestamp jumps while preserving live - latency requirements. -- raptorq: Encoder/decoder elements for the RaptorQ FEC mechanism that - can be used for RTP streams (RFC6330). +- Newer, non-deprecated APIs are used by the plugin when built with FFmpeg 6.0 or newer. -WebRTC elements +- The FFmpeg meson subproject wrap has been updated to v6.1 -- webrtcsink: a WebRTC sink (batteries included WebRTC sender with - specific signalling) -- whipsink: WebRTC HTTP ingest (WHIP) to MediaServer -- whepsrc: WebRTC HTTP egress (WHEP) from MediaServer -- rtpgccbwe: RTP bandwidth estimator based on the Google Congestion - Control algorithm (GCC), used by webrtcsink +- Note: see Known Issues section below for known issues with FFmpeg 6.0.0 and the latest FFmpeg 7.x release -Amazon AWS services +## GStreamer RTSP server -- awss3src / awss3sink: A source and sink element to talk to the - Amazon S3 object storage system. -- awss3hlssink: A sink element to store HLS streams on Amazon S3. -- awstranscriber: an element wrapping the AWS Transcriber service. -- awstranscribeparse: an element parsing the packets of the AWS - Transcriber service. +- New “ensure-keyunit-on-start” property: While the suspend modes NONE and PAUSED provided a low startup latency for + connecting clients, it did not ensure that streams started on fresh data. With this new property it is possible to maintain + the low startup latency of those suspend modes while also ensuring that a stream starts on a key unit. Furthermore, by + setting the new “ensure-keyunit-on-start-timeout” property it is also possible to accept a key unit of a certain age, but + discard it if too much time has passed and instead force a new key unit. -Video Effects (videofx) +- rtspclientsink: apply “port-range” property for RTCP port selection as well -- roundedcorners: Element to make the corners of a video rounded via - the alpha channel. -- colordetect: A pass-through filter able to detect the dominant - color(s) on incoming frames, using color-thief. -- videocompare: Compare similarity of video frames. The element can - use different hashing algorithms like Blockhash, DSSIM, and others. +## GStreamer VA-API support -New MP4 muxer + Fragmented MP4 muxer +GstVA -- isofmp4mux, cmafmux, dashmp4mux, onviffmp4mux: New fragmented - MP4/ISOBMFF/CMAF muxer for generating e.g. DASH/HLS media fragments. -- isomp4mux, onvifmp4mux: New non-fragmented, normal MP4 muxer. +- vah264dec, vah265dec, vavp8dec, vavp9dec, vampeg2dec and vaav1dec were promoted to rank PRIMARY+1 on Linux -Both plugins provides elements that replace the existing qtmux/mp4mux -element from gst-plugins-good. While not feature-equivalent yet, the new -codebase and using separate elements for the fragment and non-fragmented -case allows for easier extensability in the future. +- Improved support for dmabuf use cases. All va elements now negotiate the new and improved dmabuf capabilities with explicit + modifiers. This supports both import and export of dmabufs. -Cerbero Rust support +- Added vaav1enc element, available in recent Intel and AMD GPUs -- Starting this release, cerbero has support for building and shipping - Rust code on Linux, Windows (MSVC) and macOS. The Windows (MSVC) and - macOS binaries also ship the GStreamer Rust plugins in this release. - Only dynamic plugins are built and shipped currently. +- Added support for the experimental VA-Win32 backend. It needs at least libva 1.18 -- Preliminary support for Android, iOS and Windows (MinGW) exists but - more work is needed. Check the tracker issue for more details about - future work. +- Improved handling of multi-GPU systems. Still, sharing buffers among them is not advised. -- The following plugins are included currently: audiofx, aws, cdg, - claxon, closedcaption, dav1d, fallbackswitch, ffv1, fmp4, gif, - hlssink3, hsv, json, livesync, lewton, mp4, ndi, onvif, rav1e, - regex, reqwest, raptorq, png, rtp, textahead, textwrap, threadshare, - togglerecord, tracers, uriplaylistbin, videofx, webrtc, webrtchttp. +- Bumped minimum libva version to 1.12 -Build and Dependencies +- Enhanced support for RadeonSI Mesa driver for 10bit decoding -- meson 0.62 or newer is required +- Register elements only for allowed drivers (Intel and Mesa, for the moment) -- GLib >= 2.62 is now required (but GLib >= 2.64 is strongly - recommended) +GStreamer-VAAPI -- libnice >= 0.1.21 is now required and contains important fixes for - GStreamer’s WebRTC stack. +- The new GstVA elements (see above) should be preferred when possible. -- liborc >= 0.4.33 is recommended for 64-bit ARM support and 32-bit - ARM improvements +- Ranks of decoders were demoted to NONE so they won’t be used automatically by playbin and similar elements anymore. -- onnx: OnnxRT >= 1.13.1 is now required +- Clean-ups and minimal fixes. -- openaptx: can now be built against libfreeaptx +- gstreamer-vaapi should be considered deprecated and may be discontinued as soon as the va plugin is fully feature + equivalent. Users who rely on gstreamer-vaapi are encouraged to migrate and test the va elements at the earliest + opportunity. -- opencv: allow building against any 4.x version +## GStreamer Video4Linux2 support -- shout: libshout >= 2.4.3 is now required +- New uvcsink element, based on v4l2sink allow streaming your pipeline as a UVC camera using Linux UVC Gadget driver. -- gstreamer-vaapi’s Meson build options have been switched from a - custom combo type (yes/no/auto) to the built-in Meson feature type - (enabled/disabled/auto) +- v4l2src now supports 10/12/14/16-bit bayer formats. -- The GStreamer Rust plugins module gst-plugins-rs is now considered - an essential part of the GStreamer plugin offering and packagers and - distributors are strongly encouraged to package and ship those - plugins alongside the existing plugin modules. +- Stateful decoders now pass too large encoded frames over multiple buffers. -- we now make use of Meson’s install tags feature which allows - selective installation of installl components and might be useful - for packagers. +- AV1 Stateless video decoder. -Monorepo build (gst-build) +- Stateless decoders now tested using Virtual driver (visl), making it possible to run the tests in the cloud based CI -- new “orc-source” build option to allow build against a - system-installed liborc instead of forcing the use of orc as a - subproject. +## GStreamer OMX -- GStreamer command line tools can now be linked to the gstreamer-full - library if it’s built +- The gst-omx module has been removed. The OpenMAX standard is long dead and even the Raspberry Pi OS no longer supports it. + There has not been any development since 1.22 was released. Users of these elements should switch to the Video4Linux-based + video encoders and decoders which have been the standard on embedded Linux for quite some time now. -Cerbero +- Hardware vendors which still use OpenMAX are known to have non-standard forks and it is recommended that they maintain it + while planning their move to the Video4Linux API. -Cerbero is a meta build system used to build GStreamer plus dependencies -on platforms where dependencies are not readily available, such as -Windows, Android, iOS, and macOS. +## GStreamer Editing Services and NLE -General improvements +- Implement a gesvideoscale effect which gives user the ability to chooses where a clip has to be scaled in the chain of + effects. By default scaling is done in the compositor. -- Rust support was added for all support configurations, controlled by - the rust variant; see above for more details -- All pkgconfig files are now reliably relocatable without requiring - pkg-config --define-prefix. This also fixes statically linking with - GStreamer plugins using the corresponding pkgconfig files. -- New documentation on how to build a custom GStreamer repository - using Cerbero, please see the README -- HTTPS certificate checking is enabled for downloads on all platforms - now -- Fetching now automatically retries on error for robustness against - transient errors -- Support for building the new Qt6 plugin was added -- pkgconfig files for various recipes were fixed -- Several recipes were updated to newer versions -- New plugins: adaptivedemux2 aes codectimestamper dav1d -- New libraries: cuda webrtcnice - -macOS / iOS - -- Added support for running Cerbero on ARM64 macOS -- GStreamer.framework and all libraries in it are now relocatable, - which means they use LC_RPATH entries to find dependencies instead - of using an absolute path. If you link to GStreamer using the - pkgconfig files, no action is necessary. However, if you use the - framework directly or link to the libraries inside the framework by - hand, then you need to pass -Wl,-rpath,<path_to_libdir> to the - linker. -- Apple bitcode support was dropped, since Apple has deprecated it -- macOS installer now correctly advertises support for both x86_64 and - arm64 -- macOS framework now ships the gst-rtsp-server-1.0 library -- Various fixes were made to make static linking to gstreamer - libraries and plugins work correctly on macOS -- When statically linking to the applemedia plugin using Xcode 13, you - will need to pass -fno-objc-msgsend-selector-stubs which works - around a backwards-incompatible change in Xcode 14. This is not - required for the rest of GStreamer at present, but will be in the - future. -- macOS installer now shows the GStreamer logo correctly +- Add support for gessrc as sub-timeline element so third party can implement their own formatters and use their timelines as + sub-timelines. Before that, only timelines serialized as files on the filesystem could be loaded as sub-timelines (using + gesdemux). -Windows +- Implement a new GESDiscovererManager singleton object making management of the discoverers used to discoverer media files + cleaner and allowing to expose the following APIs: -- MSVC is now required by default on Windows, and the Visual Studio - variant is enabled by default - - To build with MinGW, use the mingw variant -- Visual Studio props files were updated for newer Visual Studio - versions -- Visual Studio 2015 support was dropped -- MSYS2 is now supported as the base instead of MSYS. Please see the - README for more details. Some advantages include: - - Faster build times, since parallel make works - - Faster bootstrap, since some tools are provided by MSYS2 - - Other speed-ups due to using MSYS2 tools instead of MSYS -- Faster download by using powershell instead of hand-rolled Python - code -- Many recipes were ported from Autotools to Meson, speeding up the - build -- Universal Windows Platform is no longer supported, and binaries are - no longer shipped for it -- New documentation on how to force a specific Visual Studio - installation in Cerbero, please see the README -- New plugins: qsv wavpack directshow amfcodec wic win32ipc -- New libraries: d3d11 + - load-serialize-info signal so GstDiscovererInfo can be serialized by users the way they like and load them without + requiring discovering the file when reloading a project. + - source-setup signal so user can tweak source elements during discovery -Windows MSI installer +- Expose GESFrameCompositionMeta in public API so user can implement their own effects targetting GES which take into account + that meta. -- Universal Windows Platform prebuilt binaries are no longer available +- Expose audioconvert:mix-matrix property in audio sources -Linux +- Port GESPipeline rendering to use encodebin2. This allows rendering timelines directly with a muxing sink (like hlssinkX + etc..) and leverage all new features of that new element. -- Various fixes for RHEL/CentOS 7 support -- Added support for running on Linux ARM64 +ges-launch -Android +- Fix setting keyframes -- Android support now requires Android API version 21 (Lollipop) -- Support for Android Gradle plugin 7.2 +- Add an ignore-eos option -Platform-specific changes and improvements +- Allow overriding container profile so that the user can build encoding profiles following the media format of a specific + media file, for example, but ensuring it is muxed using a specific format -Android +- Ensure sink elements are inside a GstBin and never in a GstPipeline -- Android SDK 21 is required now as minimum SDK version +- Move +effect stack effects from source to last effect added, so it feels more natural to user as adding them at the + beginning of the chain while the syntax is +effect felt wrong -- androidmedia: Add H.265 / HEVC video encoder mapping +## GStreamer validate -- Implement JNI_OnLoad() to register static plugins etc. automatically - in case GStreamer is loaded from Java using System.loadLibrary(), - which is also useful for the gst-full deployment scenario. - -Apple macOS and iOS - -- The GLib version shipped with the GStreamer binaries does not - initialize an NSApp and does not run a NSRunLoop on the main thread - anymore. This was a custom GLib patch and caused it to behave - different from the GLib shipped by Homebrew or anybody else. - - The change was originally introduced because various macOS APIs - require a NSRunLoop to run on the main thread to function correctly - but as this change will never get merged into GLib and it was - reverted for 1.22. Applications that relied on this behaviour should - move to the new gst_macos_main() function, which also does not - require the usage of a GMainLoop. - - See e.g. gst-play.c for an example for the usage of - gst_macos_main(). - -- GStreamer.framework and all libraries in it are now relocatable, - which means they use LC_RPATH entries to find dependencies instead - of using an absolute path. If you link to GStreamer using the - pkgconfig files, no action is necessary. However, if you use the - framework directly or link to the libraries inside the framework by - hand, then you need to pass -Wl,-rpath,<path_to_libdir> to the - linker. - -- avfvideosrc: Allow specifying crop coordinates during screen capture - -- vtenc, vtdec: H.265 / HEVC video encoding + decoding support - -- osxaudiosrc: Support a device as both input and output - - - osxaudiodeviceprovider now probes devices more than once to - determine if the device can function as both an input AND and - output device. Previously, if the device provider detected that - a device had any output capabilities, it was treated solely as - an Audio/Sink. This caused issues for devices that have both - input and output capabilities (for example, USB interfaces for - professional audio have both input and output channels). Such - devicesare now listed as both an Audio/Sink as well as an - Audio/Source. - -- osxaudio: support hidden devices on macOS - - - These are devices that will not be shown in the macOS UIs and - that cannot be retrieved without having the specific UID of the - hidden device. There are cases when you might want to have a - hidden device, for example when having a virtual speaker that - forwards the data to a virtual hidden input device from which - you can then grab the audio. The blackhole project supports - these hidden devices and this change provides a way that if the - device id is a hidden device it will use it instead of checkinf - the hardware list of devices to understand if the device is - valid. +- In action types, add a way to avoid checking property value after setting it, in case elements do it async for example. -Windows +- Add a vmethod to free GstValidateActionParameters to be more binding friendly. -- win32ipcvideosink, win32ipcvideosrc: new shared memory videosrc/sink - elements +- Allow scenarios to define the pipeline state target in the metadata instead of assuming PLAYING state. -- wasapi2: Add support for process loopback capture for a specified - PID (requires Windows 11/Windows Server 2022) +- Add support to run sub-pipelines/scenarios -- The Windows universal UWP build is currently non-functional and will - need updating after the recent GLib upgrade. It is unclear if anyone - is using these binaries, so if you are please make yourself known. + - Added support to forward buffers from appsink to appsrc -- wicjpegdec, wicpngdec: Windows Imaging Component (WIC) based JPEG - and PNG decoder elements. +- Add a way to set pipeline base-time, start-time and force using the system clock. -- mfaacdec, mfmp3dec: Windows MediaFoundation AAC and MP3 decoders +- Add a ‘fill-mode’ to the appsrc-push action type so we can create some type of streams easily using an appsrc, giving + control when writing scenarios without requiring files with the content. -- The uninstalled development environment supports PowerShell 7 now +- Add a “select-streams” action type to test “stream aware” elements. -Linux +- Add a way to wait for a property to reach a specified value before executing an action. For example it is possible to wait + for a pad to get some specific caps set before executing an action. -- Improved design for DMA buffer sharing and modifier handling for - hardware-accelerated video decoders/encoders/filters and - capture/rendering on Linux and Linux-like system. +- validate: Add support to replace variables in deeply nested structures in particular for more complex action types where + some of the properties are inside structures. -- kmssink +- Fixed compatibility with Python 3.12. - - new “fd” property which allows an application to provide their - own opened DRM device fd handle to kmssink. That way an - application can lease multiple fd’s from a DRM master to display - on different CRTC outputs at the same time with multiple kmssink - instances, for example. - - new “skip-vsync” property to achieve full framerate with legacy - emulation in drivers. - - HDR10 infoframe support +## GStreamer Python Bindings -- va plugin and gstreamer-vaapi improvements (see above) +gst-python is an extension of the regular GStreamer Python bindings based on gobject-introspection information and PyGObject, +and provides “syntactic sugar” in form of overrides for various GStreamer APIs that makes them easier to use in Python and more +pythonic; as well as support for APIs that aren’t available through the regular gobject-introspection based bindings, such as +e.g. GStreamer’s fundamental GLib types such as Gst.Fraction, Gst.IntRange etc. -- waylandsink: Add “rotate-method” property and “render-rectangle” - property +- Added a GstTagList override that makes a tag list act like a dict -- new gtkwaylandsink element based on gtksink, but similar to - waylandsink and uses Wayland APIs directly instead of rendering with - Gtk/Cairo primitives. This approach is only compatible with Gtk3, - and like gtksink this element only supports Gtk3. +- Fix build and usage in Windows -Documentation improvements +- Various fixes for Python >= 3.12 -- The GStreamer Rust plugins are now included and documented in the - plugin documentation. +- Rework libpython loading to be relocatable -Possibly Breaking Changes +- Fix libpython dlopen on macOS -- the Opus audio RTP payloader and depayloader no longer accept the - lower case encoding-format=multiopus but instead produce and accept - only the upper case variant encoding-format=MULTIOPUS, since those - should always be upper case in GStreamer (caps fields are always - case sensitive). This should hopefully only affect applications - where RTP caps are set manually and multi-channel audio (>= 3 - channels) is used. +## GStreamer C# Bindings -- wpesrc: the URI handler protocols changed from wpe:// and web:// to - web+http://, web+https://, and web+file:// which means URIs are RFC - 3986 compliant and the source can simply strip the prefix from the - protocol. +- The GStreamer C# bindings have been updated to a more recent version of GtkSharp and the bindings have been regenerated with + that version. -- The Windows screen capture element dxgiscreencapsrc has been - removed, please use d3d11screencapturesrc instead. +- GStreamer API added in recent GStreamer releases is now available -- On Android the minimum supported Android API version is now version - 21 and has been increased from 16. +- GstRtspServer bindings have been added, plus an RTSP server example -- On macOS, the GLib version shipped with the GStreamer binaries will - no longer initialize an NSApp or run an NSRunLoop on the main - thread. See macOS/iOS section above for details. +## GStreamer Rust Bindings and Rust Plugins -- decklink: The decklink plugin is now using the 12.2.2 version of the - SDK and will not work with drivers older than version 12. +The GStreamer Rust bindings and plugins are released separately with a different release cadence that’s tied to the twice-a-year +GNOME release cycle. -- On iOS Apple Bitcode support was removed from the binaries. This - feature is deprecated since XCode 14 and not used on the App Store - anymore. +The latest release of the bindings (0.22) has already been updated for the new GStreamer 1.24 APIs, and works with any GStreamer +version starting at 1.14. -- The MP4/Matroska/WebM muxers now require the “stream-format” to be - provided as part of the AV1 caps as only the original “obu-stream” - format is supported in these containers and not the “annexb” format. +gst-plugins-rs, the module containing GStreamer plugins written in Rust, has also seen lots of activity with many new elements +and plugins. The GStreamer 1.24 binaries track the 0.12 release series of gst-plugins-rs, and fixes from newer versions will be +backported as needed to the 0.12 brach for future 1.24.x bugfix releases. -Known Issues +Rust plugins can be used from any programming language. To applications they look just like a plugin written in C or C++. -- The Windows UWP build in Cerbero needs fixing after the recent GLib - upgrade (see above) +### WebRTC -- The C# bindings have not been updated to include new 1.22 API yet - (see above) +- New element webrtcsrc that can act as a recvonly WebRTC client. Just like the opposite direction, webrtcsink, this can + support various different WebRTC signalling protocols. Some are included with the plugin and provide their own element + factory for easier usage but it is also possible for applications to provide new signalling protocol implementations. -Statistics +- webrtcsink now exposes the signaller as property and allows implementing a custom signaller by connecting signal handlers to + the default signaller. -- 4072 commits +- A new signaller and webrtcsink implementation for Janus’ VideoRoom implementation. The corresponding webrtcsrc signaller + implementation is currently in a merge request in GitLab. -- 2224 Merge Requests +- New whepsrc element that can receive WHEP WebRTC streams. This is currently not based on webrtcsrc but in the future a new + element around webrtcsrc will be added. -- 716 Issues +- New whipserversrc element around webrtcsrc for ingesting WHIP WebRTC streams in GStreamer. -- 200+ Contributors +- New whipclientsink element around webrtcsink for publishing WHIP WebRTC streams from GStreamer. This deprecates the old + whipsink element. -- ~33% of all commits and Merge Requests were in Rust modules +- A new signaller and webrtcsink implementation for LiveKit. The corresponding webrtcsrc signaller implementation was merged + into the git repository recently. -- 4747 files changed +- A new signaller and webrtcsink implementation for AWS Kinesis Video Streams -- 469633 lines added +- webrtcsink has a new payloader-setup signal to allow the application more fine grained control over the RTP payloader + configuration, similar to the already existing encoder-setup signal for encoders. -- 209842 lines deleted +- webrtcsrc gained support for a custom navigation event protocol over the data channel, which is compatible with the + navigation event protocol supported by webrtcsink. -- 259791 lines added (net) +- webrtcsink supports encoded streams as input. Using encoded streams will disable webrtcsinks congestion control changing any + encoded stream parameters. -Contributors +- webrtcsink and webrtcsrc have a new signal ‘request-encoded-filter’ to allow transformations of the encoded stream. This can + be used, for example, for the same use-cases as the WebRTC Insertable Streams API. -Ádám Balázs, Adam Doupe, Adrian Fiergolski, Adrian Perez de Castro, Alba -Mendez, Aleix Conchillo Flaqué, Aleksandr Slobodeniuk, Alicia Boya -García, Alireza Miryazdi, Andoni Morales Alastruey, Andrew Pritchard, -Arun Raghavan, A. Wilcox, Bastian Krause, Bastien Nocera, Benjamin -Gaignard, Bill Hofmann, Bo Elmgreen, Boyuan Zhang, Brad Hards, Branko -Subasic, Bruce Liang, Bunio FH, byran77, Camilo Celis Guzman, Carlos -Falgueras García, Carlos Rafael Giani, Célestin Marot, Christian Wick, -Christopher Obbard, Christoph Reiter, Chris Wiggins, Chun-wei Fan, Colin -Kinloch, Corentin Damman, Corentin Noël, Damian Hobson-Garcia, Daniel -Almeida, Daniel Morin, Daniel Stone, Daniels Umanovskis, Danny Smith, -David Svensson Fors, Devin Anderson, Diogo Goncalves, Dmitry Osipenko, -Dongil Park, Doug Nazar, Edward Hervey, ekwange, Eli Schwartz, Elliot -Chen, Enrique Ocaña González, Eric Knapp, Erwann Gouesbet, Evgeny -Pavlov, Fabian Orccon, Fabrice Fontaine, Fan F He, F. Duncanh, Filip -Hanes, Florian Zwoch, François Laignel, Fuga Kato, George Kiagiadakis, -Guillaume Desmottes, Gu Yanjie, Haihao Xiang, Haihua Hu, Havard Graff, -Heiko Becker, He Junyan, Henry Hoegelow, Hiero32, Hoonhee Lee, Hosang -Lee, Hou Qi, Hugo Svirak, Ignacio Casal Quinteiro, Ignazio Pillai, Igor -V. Kovalenko, Jacek Skiba, Jakub Adam, James Cowgill, James Hilliard, -Jan Alexander Steffens (heftig), Jan Lorenz, Jan Schmidt, Jianhui Dai, -jinsl00000, Johan Sternerup, Jonas Bonn, Jonas Danielsson, Jordan -Petridis, Joseph Donofry, Jose Quaresma, Julian Bouzas, Junsoo Park, -Justin Chadwell, Khem Raj, Krystian Wojtas, László Károlyi, Linus -Svensson, Loïc Le Page, Ludvig Rappe, Marc Leeman, Marek Olejnik, Marek -Vasut, Marijn Suijten, Mark Nauwelaerts, Martin Dørum, Martin Reboredo, -Mart Raudsepp, Mathieu Duponchelle, Matt Crane, Matthew Waters, Matthias -Clasen, Matthias Fuchs, Mengkejiergeli Ba, MGlolenstine, Michael Gruner, -Michiel Konstapel, Mikhail Fludkov, Ming Qian, Mingyang Ma, Myles -Inglis, Nicolas Dufresne, Nirbheek Chauhan, Olivier Crête, Pablo Marcos -Oltra, Patricia Muscalu, Patrick Griffis, Paweł Stawicki, Peter -Stensson, Philippe Normand, Philipp Zabel, Pierre Bourré, Piotr -Brzeziński, Rabindra Harlalka, Rafael Caricio, Rafael Sobral, Rafał -Dzięgiel, Raul Tambre, Robert Mader, Robert Rosengren, Rodrigo -Bernardes, Rouven Czerwinski, Ruben Gonzalez, Sam Van Den Berge, -Sanchayan Maity, Sangchul Lee, Sebastian Dröge, Sebastian Fricke, -Sebastian Groß, Sebastian Mueller, Sebastian Wick, Sergei Kovalev, -Seungha Yang, Seungmin Kim, sezanzeb, Sherrill Lin, Shingo Kitagawa, -Stéphane Cerveau, Talha Khan, Taruntej Kanakamalla, Thibault Saunier, -Tim Mooney, Tim-Philipp Müller, Tomasz Andrzejak, Tom Schuring, Tong Wu, -toor, Tristan Matthews, Tulio Beloqui, U. Artie Eoff, Víctor Manuel -Jáquez Leal, Vincent Cheah Beng Keat, Vivia Nikolaidou, Vivienne -Watermeier, WANG Xuerui, Wojciech Kapsa, Wonchul Lee, Wu Tong, Xabier -Rodriguez Calvar, Xavier Claessens, Yatin Mann, Yeongjin Jeong, Zebediah -Figura, Zhao Zhili, Zhiyuaniu, مهدي شينون (Mehdi Chinoune), - -… and many others who have contributed bug reports, translations, sent -suggestions or helped testing. - -Stable 1.22 branch - -After the 1.22.0 release there will be several 1.22.x bug-fix releases -which will contain bug fixes which have been deemed suitable for a -stable branch, but no new features or intrusive changes will be added to -a bug-fix release usually. The 1.22.x bug-fix releases will be made from -the git 1.22 branch, which will be a stable branch. - -1.22.0 - -1.22.0 was originally released on 23 January 2023. - -1.22.1 - -The first 1.22 bug-fix release (1.22.1) was released on 04 March 2023. - -This release only contains bugfixes and it should be safe to update from -1.22.0. - -Highlighted bugfixes in 1.22.1 - -- audio channel-mix: allow up to 64 channels (instead of up to 63 - channels) -- avfvideosrc: Don’t wait on main thread for permissions request -- avvidenc: avoid generating inaccurate output timestamps, especially - with variable framerate streams -- AV1 video codec caps signalling improvements in various elements -- codectimestamper: Fix timestamping on sequence update -- d3d11overlaycompositor: fix texture width and height -- d3d11videosink: Fix rendering on external handle -- dashdemux2: fix seek operation taking a log time to finish for some - streams -- nvencoder: Fix B-frame encoding on Linux and min buffers in auto GPU - mode -- playbin3: fixing buffering for live pipelines -- playbin: fix potential deadlock when stopping stream with subtitles - visible -- redenc: fix setting of extension ID for twcc -- rtspsrc: improved compatibility with more broken RTSP servers -- v4l2h264dec: Fix Raspberry Pi4 will not play video in application -- vtdec: fix jittery playback of H.264 Level 4.1 movies in macOS -- vtdec: Fix non-deterministic frame output after flushing seeks -- vtenc: fix handling of interlaced ProRes on Apple M1 hardware -- vtenc: don’t advertise ARGB/RGBA64 input caps on M1 Pro/Max with - macOS <13 -- wasapi2src: Fix loopback capture on Windows 10 Anniversary Update -- tools: better handling of non-ASCII command line arguments on - Windows -- gst-libav: fix build against newer ffmpeg versions -- gst-python: Use arch-specific install dir for gi overrides -- cerbero: Fix setuptools site.py breakage in Python 3.11 -- macOS packages: Fix broken binaries on macos < 11.0 -- various bug fixes, memory leak fixes, and other stability and - reliability improvements +- gstwebrtc-api: JavaScript API for interacting with the default signalling protocol used by webrtcsink / webrtcsrc. -gstreamer +… and various other smaller improvements! -- buffer: fix copy meta reference debug log formatting -- bin: Don’t unlock unlocked mutex in gst_bin_remove_func() -- pad: Don’t leak user_data in gst_pad_start_task() -- aggregator: Always lock aggpad around update_time_level -- inputselector: Avoid potential deadlock when shutting down, - e.g. playbin with subtitles -- multiqueue: Handle use-interleave latency live pipelines, fixing - buffering for live pipelines in playbin3 -- GstBaseSrc: fix transfer annotation for fixate() virtual method -- GstBaseSrc, GstPushSrc: add nullable annotations to virtual methods -- tools: Make sure UTF-8 encoded command line arguments on Windows +### RTSP -gst-plugins-base +- New rtspsrc2 element. Only a subset of RTSP features are implemented so far: + - RTSP 1.0 support + - TCP, UDP, UDP-Multicast lower transports + - RTCP SR, RTCP RR, RTCP-based A/V sync + - Tested for correctness in multicast cases too + - Lower transport selection and order (NEW!) + - The existing rtspsrc has a hard-coded order list for lower transports + - Many advanced features are not implemented yet, such as non-live support. See the README for the current status. -- alsasink: Fix stall when going from PLAYING to NULL (stucked at - PAUSED) with uac1 gadget -- appsrc: Don’t chain up BaseSrc::negotiate() -- audio: channel-mix: Fix channel count limit to be able to equal 64 -- gldisplay: Mark gst_gl_display_create_context() other_context - parameter as nullable -- gldisplay: Remove unused code -- gstglwindow_x11.c: Fix colormap leak -- gl/cocoa: Return a strong ref to the parent GstGLContext -- rtspconnection: Annotate RTSP message and RTSP events parameters - correctly -- sdp, typefind: Fix some annotations -- sdp: gstmikey: gst_mikey_message_to_caps: extract ROC from first - crypto session -- subparse: Properly forward segment seqnum -- uridecodebin: Set source element to READY before querying it -- uritranscodebin: Fix unref of NULL -- gst-play-1.0: Don’t force accurate seeking +### GTK4 -gst-plugins-good +- Support for rendering GL textures on X11/EGL, X11/GLX, Wayland, macOS, and WGL/EGL on Windows. -- adaptivedemux2: Fix buffering threshold initialization -- dashdemux2: the seek operation takes a log time to finish for some - streams -- glvideomixer: Keep a reference to the underlying pad -- qtdemux: Don’t emit GstSegment correcting start time when in MSE - mode -- qtdemux: Handle moov atom length=0 case by reading until the end -- qtdemux, qtmux: Drop av1C version 0 parsing and implement version 1 - parsing/writing -- qtmux: Fix assertion on caps update -- redenc: fix setting of extension ID for twcc -- rtspsrc: Use the correct vfunc for the push-backchannel-sample - action signal -- rtpssrcdemux: set different stream-id on each src pad -- udpsrc: GstSocketTimestampMessage only for SCM_TIMESTAMPNS -- v4l2h264dec: Fix Raspberry Pi4 will not play video in application +- Create a window for testing purposes when running in gst-launch-1.0 or if GST_GTK4_WINDOW=1 is set. -gst-plugins-bad +- New background-color property for setting the color of the background of the frame and the borders, if any. This also allows + setting a fully transparent background. -- aom: Include stream-format and alignment in the AV1 caps -- av1parser, h265parser: Fix some code defects -- av1parser: Don’t consider unknown metadata OBUs a bitstream error -- avfvideosrc: Don’t wait on main thread for permissions request -- ccconverter: don’t debug a potentially freed filter caps -- codectimestamper: Fix timestamping on sequence update -- codecparsers: {h264, h265}bitwriter: Remove redundant condition - checks -- codecs: decoders: fail early if no input caps have been provided for - all new decoder base classes -- closedcaption: Don’t leak caps event -- curlhttpsrc: Add curl anyauth option -- d3d11overlaycompositor: fix texture width and height -- d3d11videosink: Fix rendering on external handle -- h265parse: Always set profile on src caps -- msdkav1enc: fix the category for msdkav1enc debug -- nvcodec: improve error reporting on plugin init -- nvencoder: Fix b-frame encoding on Linux -- nvencoder: Fix min buffers parameter of allocation query in auto GPU - mode -- nvvp9dec: Fix return value -- qsvav1enc, amfav1enc: Set stream-format on caps -- vtdec: Jittery playback of H.264 Level 4.1 movies in macOS (both - x86_64 and arm64) -- vtdec: Fix DPB size calculations not taking values from SPS into - account -- vtdec: Fix not waiting for async frames when flushing -- vtenc: Disable ARGB/RGBA64 caps on M1 Pro/Max with macOS <13 -- vtenc: Fix checking for certain CPU variants when running in VMs -- vtenc: Disable HW acceleration for interlaced ProRes -- va: Avoid the array index overflow when filling 8x8 scaling list. -- va: Fix some code defects -- vah265enc: Use helper to update properties. -- vulkan: memory: Flush non coherent memory after write. -- wasapi2src: Fix loopback capture on Windows 10 Anniversary Update -- webrtcbin: small stats improvements -- win32ipcutils: Add missing include -- wpe: Logging fixes for the WebExtension +- New scale-filter property for defining how to scale the frames. -gst-plugins-ugly +- Add Python example application to the repository. -- mpegpsdemux: Ignore DTS if PTS < DTS +- Various bugfixes, including support for the new GTK 4.14 GL renderer. The plugin needs to be built with at least the + gtk_v4_10 feature to work with the new GTK 4.14 GL renderer, and will work best if built with the gtk_v4_14 feature. -gst-libav +### Closed Caption -- avauddec, avviddec: Free packet side data after usage -- avviddec: change - AV_CODEC_CAP_AUTO_THREADS->AV_CODEC_CAP_OTHER_THREADS to fix build - against newer ffmpeg versions -- Memory leak in ’ av_packet_add_side_data’ in - /lib/x86_64-linux-gnu/libavcodec.so reading the file - clock_odd_size_RLE_g1597902.avi -- avvidenc: Don’t take ffmpeg timestamps verbatim but only use them to - calculate DTS +- Add cea608tocea708 element for upconverting CEA-608 captions to their CEA-708 representation. -gst-rtsp-server +- Add support for translations within transcriberbin. -- No changes +- awstranscriber supports translating the transcribed text into different languages, including multiple languages at the same + time. -gstreamer-vaapi +- awstranscriber is using the new HTTP/2-based API now instead of the WebSocket-based one. -- vaapi: Skip plugin pc file for shared plugins +### Other new elements -gstreamer-sharp +- New awss3putobjectsink that works similar to awss3sink but with a different upload strategy. -- No changes +- New hlscmafsink element for writing HLS streams with CMAF/ISOBMFF fragments. -gst-omx +- New inter plugin with new intersink and intersrc elements that allow to 1:N connect different pipelines in the same process. + This is implemented around the appsrc / appsink-based StreamProducer API that is provided as part of the GStreamer Rust + bindings, and is also used inside webrtcsrc and webrtcsink. -- No changes +- New livesync element that allows maintaining a contiguous live stream without gaps from a potentially unstable source. -gst-python +- New isomp4mux non-fragmented MP4 muxer element. -- gst-python: Use arch-specific install dir for gi overrides +### Other improvements -gst-editing-services +- audiornnoise + - Attach audio level meta to output buffers. + - Add voice detection threshold property +- fmp4mux + - Add support for CMAF-style chunking, e.g. low-latency / LL HLS and DASH + - Add support for muxing Opus, VP8, VP9 and AV1 streams + - Add ‘offset-to-zero’ property and make media/track timescales configurable +- hlssink3 + - Allow adding EXT-X-PROGRAM-DATE-TIME tag to the manifest. + - Allow generating I-frame-only playlist +- ndi + - Closed Caption support in ndisrc / ndisink + - Zero-copy output support in ndisrc for raw video and audio +- spotifyaudiosrc: Support configurable bitrate -- No changes +For a full list of changes in the Rust plugins see the gst-plugins-rs ChangeLog between versions 0.9 (shipped with GStreamer +1.22) and 0.12 (shipped with GStreamer 1.24). -gst-validate + gst-integration-testsuites +## Cerbero Rust support -- validate:scenario: sink refs when building -- tests: Fix known issue definition location for unit tests and how we - handle them in validate launcher -- tests: mark elements_srtp.test_play test as flaky -- Fix gstreamer-validate-1.0 dependency name -- validate-scenario: fix g-i warning in annotation -- validate: Fix gst_validate_execute_action annotation +- As of GStreamer 1.24, the GStreamer Rust plugins are shipped as part of our binary packages on all major platforms. This + includes Android and iOS now in addition to macOS and Windows/MSVC. -gst-examples +## Build and Dependencies -- webrtc examples: Use webrtc.gstreamer.net -- webrtc_sendrecv.py: Various fixes +- Meson >= 1.1 is now required for all modules -Development build environment +- The GLib requirement has been bumped to >= 2.64 -- gst-env: Handle installing python modules to dist-packages -- meson: Allow sysdeps to be forced as fallback subprojects -- meson: Switch dav1d wrap to a tarball and update to dav1d 1.1.0 - -Cerbero build tool and packaging changes in 1.22.1 - -- macos: Fix broken binaries on macos < 11.0 -- orc: Update pthread_jit_write_protect fix for macOS/iOS -- dav1d: Update to 1.1.0 -- libsrtp: update to v2.5.0 -- rustup: Update to 1.25.2 -- rust: Update to 1.67; cargo-c to 0.9.16 -- cerbero: Don’t error out if bindir already exists -- Fix setuptools site.py breakage in Python 3.11, bump - gobject-introspection, bump windows image -- cerbero: Retry if cargo update fails on macOS -- gst-plugins-rs: Build glib/gio bindings with 2.74 API support - -Contributors to 1.22.1 - -Alessandro Bono, Arun Raghavan, Bart Van Severen, Carlos Falgueras -García, Célestin Marot, David Svensson Fors, Edward Hervey, Enrique -Ocaña González, Frank Dana, Guillaume Desmottes, He Junyan, James -Hilliard, Jan Alexander Steffens (heftig), Jan Schmidt, Jordan Petridis, -Mathieu Duponchelle, Matthew Waters, medithe, Mengkejiergeli Ba, Nicolas -Beland, Nirbheek Chauhan, Patricia Muscalu, Pawel Stawicki, Philippe -Normand, Piotr Brzeziński, Rajneesh Soni, Robert Rosengren, Sanchayan -Maity, Sebastian Dröge, Seungha Yang, Simon Himmelbauer, Thibault -Saunier, Tim-Philipp Müller, Tristan van Berkom, U. Artie Eoff, Víctor -Manuel Jáquez Leal, Vivia Nikolaidou, Xuchen Yang, Yinhang Liu, - -… and many others who have contributed bug reports, translations, sent -suggestions or helped testing. Thank you all! - -List of merge requests and issues fixed in 1.22.1 - -- List of Merge Requests applied in 1.22.1 -- List of Issues fixed in 1.22.1 - -1.22.2 - -The second 1.22 bug-fix release (1.22.2) was released on 11 April 2023. - -This release only contains bugfixes and it should be safe to update from -1.22.x. - -Highlighted bugfixes in 1.22.2 - -- avdec_h264: fix decoder deadlocks with FFmpeg 6.0 -- rtspsrc: fix regression with URI protocols in OPTIONS requests for - RTSP over TLS -- rtspsrc: improved control url handling compatibility for broken - servers -- decklink: fix 10 bit RGB (r210) format auto detection for capture - and fix playout if video caps are configured before audio caps -- d3d11videosink: Fix tearing in case of fullscreen mode -- playbin: fix deadlock when stopping stream with subtitles visible - (even more) -- typefinding: fix regression not detecting application/dash+xml in - some corner cases -- osxvideosink: fix broken aspect ratio and frame drawing region -- decodebin3, parsebin: Improve elementary stream handling when - decoders are not present and fix hang when removing a failing stream -- urisourcebin: Propagate sticky events from parsebin, so that the - STREAM_START event with the GstStream info is always available when - pads get exposed -- v4l2: Add support for YVU420M format; mark JPEG content as parsed -- h264decoder, h265decoder: DPB bumping process and latency reporting - fixes -- Opus: Fix reading of extended channel config in MPEG-TS and fix - missing sample rate when remuxing from RTP to Matroska -- zxing: add support for building against zxing-c++ 2.0 -- cerbero: Fix packaging of Rust plugins on Android; fix modern Gentoo - distro detection -- various bug fixes, memory leak fixes, and other stability and - reliability improvements +- liborc >= 0.4.38 is strongly recommended -gstreamer +- libnice >= 0.1.22 is strongly recommended, as it is required for WebRTC ICE consent freshness (RFC 7675). -- datetime: Return G_MAXFLOAT instead of G_MAXDOUBLE for no timezone - offset -- inputselector: Wake up streaming thread before PLAYING_TO_PAUSED - transition -- tools: fix potential crash when passing command-line options on - Windows +- gst-libav was updated for FFmpeg API deprecations and removals -gst-plugins-base +- libwebpmux is required for the animated WebP support -- alsasink: Fix for being stuck in stop_streaming_threads state -- decodebin3: fix hang when removing a failing stream -- gl: wayland: cleanup on close -- parsebin: Improve elementary stream handling -- playbin: fix deadlock when stopping stream with subtitles visible - even more -- sdp: Skip source-specific caps fields when creating an SDP media - from caps -- urisourcebin: Propagate sticky events from parsebin -- urisourcebin: Activate pad before transferring sticky events -- typefinding: fix failure to recognize application/dash+xml in some - cases +- The wpe plugin gained support for the WPEWebKit 2.0 API version -gst-plugins-good +- Bumped minimum libva version to 1.12 for the va plugin. -- osxvideosink: fix broken aspect ratio and frame drawing region -- qtdemux: Fix seek adjustment with SNAP_AFTER flag -- rtpopusdepay, matroskamux: Fix invalid rate while muxing Opus in - Matroska -- rtpmanager: twcc: Fix duplicate packet handling -- rtsp: url: fix incorrect request URI scheme for TLS transport - methods (regression) -- rtspsrc: Consider “451: Parameter Not Understood” when handling - broken control urls -- rtspsrc: fix behavior change with URI protocols in OPTIONS requests -- rtspsrc: Skip PTs with caps incompatible to the global caps -- rtpjpegdepay: fix logic error when checking if an end of image (EOI) - tag is present -- v4l2: Add support for YVU420M format -- v4l2: mark JPEG as parsed +- zxing: added support for the zxing-c++ 2.0 API -gst-plugins-bad +- The ptp-helper for Precision Time Protocol (PTP) support in GStreamer core has been rewritten in Rust, and the minimum + required Rust version for building this is 1.48, i.e. the version currently in Debian oldstable. On Windows, at least Rust + 1.54 is needed. There is a new ptp-helper Meson feature option that can be used to make sure everything needed for PTP + support is available (if set to ptp-helper=enabled). cargo is not required for building. -- cea708overlay: fix HCR interpretation -- d3d11bufferpool: Fix invalid access in debug print loop -- d3d11compositor: Fix composition error on release_pad() -- d3d11converter: Fix conversion backend selection -- d3d11videosink: Fix tearing in case of fullscreen mode - - d3d11bufferpool: Fix invalid access in debug print loop -- d3d11window: fix memory leak -- decklink: fix 10 bit RGB (r210) format auto detection -- decklinkaudiosink: Fix playback when video caps is configured before - audio -- decklinkvideosrc: RGB 4:4:4 doesn’t work after GStreamer upgrade - (regression) -- decklinkvideosrc: unable to show HDMI stream that Blackmagic’s Media - Express is able to see -- debugqroverlay: fix string leak -- gtkwaylandsink: Destroy GstWlWindow when parent GtkWindow is - destroyed -- gtkwaylandsink: Fix crash when rendering after the window is closed -- ksvideo, directshow: Fix reference leaks in device providers -- h264decoder: Fix DPB bumping process -- h264decoder, h265decoder: Latency reporting related fixes -- h264parse: Validate VUI framerate -- jpegparse: reset parse state when the SOI is not the first marker -- nvencoder: Fix CQP option setting -- nvh264encoder: Fix template caps to include progressive mode as well -- openjpegdec: allow multithread decoding only in subframe mode -- tsdemux: Fix reading of extended Opus channel configuration -- vulkan: fix validation layer issues -- vulkanoverlaycompositor: fix potential use after free -- vulkanswapper: correctly handle force-aspect-ratio=false -- wasapi2: Fix potential crash on device activation failure -- webrtc: Fix segfault traversing ice transports -- webrtc: patch leak caused by early return -- zxing: add support for zxing-c++ 2.0 +- gst-plugins-rs requires Rust 1.70 or newer. -gst-plugins-ugly +- Link to libsoup at build time in all cases on non-Linux, and only load it dynamically on Linux systems where we might need + to support a mix of applications with dependencies that might be using libsoup2 or libsoup3. A “soup-version” meson build + option was added to prefer a specific version. Distros should make sure that libsoup is still a package dependency, since + it’s still required at runtime for the soup and adaptivedemux2 plugins to function. -- No changes +- libjack is now dynamically loaded at runtime by the JACK audio plugin, and no longer a hard build dependency. However, it + still is a runtime dependency, so distros should make sure it remains a package dependency. -gst-libav +Monorepo build (née gst-build) -- avdec_h264 pipeline freeze with FFmpeg6 -- avdeinterlace, avmux: fix element reference leak -- avviddec: Drop decoder stream lock when calling send_packet +- There is now a top-level meson build option to enable/require webrtc -gst-rtsp-server +- The FFmpeg subproject wrap was udpated to 6.1 -- rtsp-server: fix deadlock on shutdown with non-live pipeline if - media isn’t playing/prerolled yet and eos-shutdown is enabled for - the media +- A libvpx wrap was added (for VP8/VP9 software encoding/decoding) -gstreamer-vaapi +gstreamer-full -- No changes +- Add full static build support, including on Windows: Allow a project to use gstreamer-full as a static library and link to + create a binary without dependencies. Introduce the meson build option gst-full-target-type to select the build type: + dynamic (default) or static. -gstreamer-sharp +- Registers all full features in a plugin now to offer the possibility to get information at the plugin level and get it from + the registry. All the full features are now registered in a fullstaticfeatures meta plugin instead of having a NULL plugin. -- No changes +Development environment -gst-omx +- add VSCode IDE integration -- No changes +- gst-env.py: Output a setting for the prompt with --only-environment -gst-python +### Cerbero -- No changes +Cerbero is a meta build system used to build GStreamer plus dependencies on platforms where dependencies are not readily +available, such as Windows, Android, iOS, and macOS. -gst-editing-services +General improvements -- No changes +- New plugins have been added + - codecalpha dvbsubenc rtponvif switchbin videosignal isac ivfparse inter rtspsrc2 +- JACK plugin is now available all platforms (previously only Linux), and will be loaded if the JACK library is found at + plugin load time +- Several recipes were ported to meson, leading to faster builds and better MSVC support + - ffmpeg, gperf, lame, libvpx, ogg, opencore-amr, sbc, speex, tiff, webrtc-audio-processing + - For more information, please see the tracker issue +- Some recipes are now outdated or unnecessary and have been removed: + - intltool, libkate +- Various recipe updated to their latest versions +- Rust toolchain updated to 1.76.0 (latest as of writing) +- Rust plugins are now stripped and debug info split out correctly, reducing their size +- Fix several spurious build issues, especially with the Rust toolchain +- CMake is picked up from the system if available +- Cerbero will no longer OOM or consume excessive resources on low-end systems +- Python recipes have been moved from setuptools to virtualenv +- Fixed support for Python 3.12+ + +macOS + +- Minimum macOS version has been increased to 10.13 (High Sierra) + - Released 5½ years ago, >95% marketshare +- Fix macOS app store validation issue caused by absolute RPATHs +- Rosetta is automatically installed if required for universal builds on Apple Silicon +- The official macOS binaries now also include static libs for the GStreamer Rust plugins + +iOS + +- Minimum iOS version has been increased to 12.0 +- The iOS binary packages now include the GStreamer Rust plugins +- tremor and ivorbisdec plugins are no longer shipped on iOS -gst-validate + gst-integration-testsuites +Windows -- No changes +- New features shipped with the official binaries: + - plugins: dwrite d3d12 (MSVC) soundtouch (MSVC) taglib (MSVC) webrtcdsp (MSVC) + - plugin features: d3d11-wgc (Windows Graphics Capture Support) + - libraries: gstdxva-1.0 +- New qml6 plugin can be built on Windows with the qt6 variant enabled + - Similar to qt5, this plugin cannot be included in the official binaries +- GLib process handling helpers for Windows are now shipped +- Windows 11 SDK is now required for builds + - Visual Studio 2019 and newer ship this SDK +- MSYS is now deprecated for building Windows binaries, will be removed in the next release + - MSYS2 is required, and the bootstrap script tools/bootstrap-windows.ps can install it for you +- Windows bootstrap script tools/bootstrap-windows.ps1 is much more interactive and user-friendly now +- Fixed Pango crash on 32-bit Windows +- WiX packaging now works with cross-windows builds from linux -gst-examples +Linux -- No changes +- Linux packages will now also include static libs for the GStreamer Rust plugins +- Add Python support for multiarch distributions +- Build fixes for various recipes on multiarch distributions +- Use arch-specific libdir correctly on multiarch distributions +- gst-omx was removed from gstreamer, and hence is no longer shipped +- Fixed Gentoo support +- Added support for RHEL 9 +- Added support for Rocky Linux +- Added support for Manjaro Linux -Development build environment +Android + +- Android NDK has been updated to r25c + - Only the Clang toolchain is used from the NDK now (both target and host) + - gnustl has been completely removed +- The Android binary packages now include the GStreamer Rust plugins +- tremor and ivorbisdec plugins are no longer shipped on Android +- openh264 plugin no longer enables ASM optimizations on Android x86 due to relocation errors + +## Platform-specific changes and improvements + +### Android + +- Add NDK implementation of Android MediaCodec. This reduces the amount of Java <-> native calls, which should reduce + overhead. + +- Add support for AV1 to the androidmedia video encoder and decoder. + +### Apple macOS and iOS + +- osxaudio: audio clock improvements (interpolate based on system time) + +- Set activation policy in gst_macos_main() and in osxvideosink and glimagesink. Setting the policy to + NSApplicationActivationPolicyAccessory by default makes sure that we can activate windows programmatically or by clicking on + them. Without that, windows would disappear if you clicked outside them and there would be no way to bring them to front + again. This change also allows osxvideosink to receive navigation events correctly. + +### Windows + +- New DirectWrite text rendering plugin with dwriteclockoverlay, dwritetimeoverlay, dwritetextoverlay, dwritesubtitlemux, and + dwritesubtitleoverlay elements, including closed caption overlay support in dwritetextoverlay. + +- PTP clock support is now also available on Windows + +- qml6d3d11sink is a new Direct3D11 Qt6 QML sink for Windows as an alternative to the existing qml6glsink. + +- wasapi2 audio plugin: + + - Added an option to monitor a loopback device’s mute state + - Allows process loopback capture on Windows 10 + +- win32ipc supports zero-copy rendering now through a shared bufferpool. + +- Add a Windows-specific plugin loader implementation (gst-plugin-scanner), so plugin loading during registry updates happens + in an external process on Windows as well. + +- gst_video_convert_sample() which is often used for thumbnailing gained a D3D11 specific conversion path. + +- d3d11 plugin: + + - d3d11mpeg2dec element is promoted to PRIMARY + 1 rank + - Added d3d11ipcsrc and d3d11ipcsink elements for zero-copy GPU memory sharing between multiple processes. + - Added HLSL shader pre-compilation (at binary build time) support in MSVC build. + - d3d11videosink and d3d11convert elements support 3D transform, MSAA (MultiSampling Anti-Aliasing) and anisotropic + sampling method. + - Added support for more raw video formats by using compute shader. A list of supported raw video formats can be found in + the d3d11videosink plugin documentation. + - Added d3d11overlay element for applications to be able to draw/blend an overlay image on Direct3D11 texture directly. + +- New Direct3D12 plugin: From a video decoding, conversion, composition, and rendering point of view, this new d3d12 plugin is + feature-wise near equivalent to the d3d11 plugin. Notable differences between d3d12 and d3d11 are: + - The GStreamer Direct3D12 integration layer is not exposed as a GStreamer API yet. Thus, other plugins such as amfcodec, + nvcodec, qsv, and dwrite are not integrated with d3d12 yet. + - H.264 video encoding support via d3d12h264enc element. + - Direct3D12 video encoding API requires Windows 11 or DirectX 12 Agility SDK + - IPC, overlay, and deinterlace elements are not implemented in d3d12 + - Windows Graphics Capture API based screen capturing is not implemented in d3d12 + - In this release, MSVC is the only officially supported toolchain for the d3d12 plugin build. + - All d3d12 elements are zero ranked for now. Users will need to adjust rank of each d3d12 element via GST_PLUGIN_RANK + environment or appropriate plugin feature APIs if they want these elements autoplugged. + +## Documentation improvements + +- hotdoc has been updated to the latest version, and the theme has also been updated, which should fix various usability + issues. + +## Possibly Breaking Changes + +- gst_plugin_feature_check_version() has been updated to fix unexpected version check behaviour for git versions. It would + return TRUE if the plugin version is for a git development version (e.g. 1.24.0.1) and the check is for the “next” micro + version (1.24.1). Now it no longer does this. This just brings the runtime version check in line with the build time version + checks which have been fixed some time ago. + +- GstAudioAggregator and subclasses such as audiomixer now sync property values to output timestamp, which is what + GstVideoAggregator has been doing already since 2019, and which makes sense, as the properties need to change at every + output frame based on the output time because they may change even though the input frame is not changing. + +- rtpac3depay now outputs audio/x-ac3 instead of audio/ac3 as that is the canonical media format in GStreamer. audio/ac3 is + still sometimes accepted as input format for backwards compatibility (e.g. in rtpac3pay or ac3parse), but shouldn’t be + output. + +- timecodestamper: The “drop-frame” property now defaults to TRUE -- git: prevent CRLF line ending conversion for patches to fix pango - subproject patching issues on Windows +- The NVIDIA desktop GPU decoders nvh264sldec, nvh265sldec, nvvp8sldec and nvvp9sldec were renamed to nvh264dec, nvh265dec, + nvvp8dec and nvvp9dec, respectively. -Cerbero build tool and packaging changes in 1.22.2 +## Known Issues -- build: retry rust build on SIGBUS errors too -- Fix packaging of rust plugins on Android -- Modern Gentoo distro adaptation -- sbc: update to 2.0 -- speex: update to 1.2.1 - -Contributors to 1.22.2 - -Adrien De Coninck, Albert Sjölund, Alexande B, Antonio Rojas, Arun -Raghavan, Bart Van Severen, Carlo Cabrera, Colin Kinloch, Edward Hervey, -Guillaume Desmottes, Haihua Hu, He Junyan, Ilie Halip, Jordan Petridis, -Josef Kolář, Lily Foster, Mathieu Duponchelle, Matt Feury, Matthew -Waters, Maxim P. Dementyev, Michael Tretter, Nicolas Dufresne, Nirbheek -Chauhan, Piotr Brzeziński, Robert Rosengren, Rouven Czerwinski, -Sebastian Dröge, Seungha Yang, Shengqi Yu, Stéphane Cerveau, Talha Khan, -Thibault Saunier, Tim-Philipp Müller, Víctor Manuel Jáquez Leal, Vivia -Nikolaidou, Wang Chuan, Wojciech Kapsa, - -… and many others who have contributed bug reports, translations, sent -suggestions or helped testing. Thank you all! - -List of merge requests and issues fixed in 1.22.2 - -- List of Merge Requests applied in 1.22.2 -- List of Issues fixed in 1.22.2 - -1.22.3 - -The third 1.22 bug-fix release (1.22.3) was released on 19 May 2023. - -This release only contains bugfixes and it should be safe to update from -1.22.x. - -Highlighted bugfixes in 1.22.3 - -- avdec: fix occasional video decoder deadlock on seeking with FFmpeg - 6.0 -- decodebin3: fix regression handling input streams without CAPS or - TIME segment such as e.g. udpsrc or `pushfilesrc -- bluez: a2dpsink: fix Bluetooth SIG Certification test failures -- osxvideosink: fix deadlock upon closing output window -- qtdemux: fix edit list handling regression and AV1 codec box parsing -- qtmux: fix extraction of CEA608 closed caption data from S334-1A - packets -- rtspsrc: Fix handling of * control path -- splitmux: timestamp handling improvements -- v4l2videodec: Rework dynamic resolution change handling (needed for - IMX6 mainline codec) -- videoflip: fix regression with automatically rotating video based on - tags -- d3d11: many d3d11videosink and d3d11compositor fixes -- webrtc, rtp: numerous data race fixes and stability fixes -- various bug fixes, memory leak fixes, and other stability and - reliability improvements +- There are known issues with FFmpeg version 6.0.0 due to opaque passing being broken in that version. This affects at least + avdec_h264, but may affect other decoders as well. Versions before 6.0.0, and 6.0.1 or higher are not affected. + +- gst-libav currently doesn’t build against the latest FFmpeg 7.0 release. This is being worked on and tracked in this “libav: + Fix compatibility with ffmpeg 7” Merge Request. + +## Statistics + +- 4643 commits + +- 2405 Merge Requests + +- 850 Issues + +- 290+ Contributors + +- ~25% of all commits and Merge Requests were in Rust modules + +- 4747 files changed + +- 469633 lines added + +- 209842 lines deleted + +- 259791 lines added (net) + +## Contributors + +Aaron Boxer, Aaron Huang, Acky Xu, adixonn, Adrian Fiergolski, Adrien De Coninck, Akihiro Sagawa, Albert Sjölund, Alessandro +Bono, Alexande B, Alexander Slobodeniuk, Alicia Boya García, amindfv, Amir Naghdinezhad, anaghdin, Anders Hellerup Madsen, +Andoni Morales Alastruey, Antonio Kevo, Antonio Rojas, Arnaud Rebillout, Arnaud Vrac, Arun Raghavan, badcel, Balló György, Bart +Van Severen, Bastien Nocera, Benjamin Gaignard, Bilal Elmoussaoui, Brad Hards, Camilo Celis Guzman, Carlo Cabrera, Carlos +Falgueras García, Carlos Rafael Giani, Célestin Marot, Chao Guo, Charlie Blevins, Cheah, Vincent Beng Keat, Chris Degawa, Chris +Spencer, Christian Curtis Veng, Christian Meissl, Christopher Degawa, Chris Wiggins, Cidana-Developers, Colin Kinloch, Damian +Hobson-Garcia, Daniel Almeida, Daniel Knobe, Daniel Moberg, Daniel Morin, Daniel Pendse, Daniel Stone, Daniel Ulery, Dan +Searles, Dario Marino Saccavino, Dave Patrick Caberto, David Craven, David Revay, David Rosca, David Svensson Fors, Detlev +Casanova, Diego Nieto, Dominique Leroux, Dongyun Seo, Doug Nazar, Edward Hervey, Ekwang Lee, elenril, Elliot Chen, Enrique Ocaña +González, Erik Fröbrant, Eva Pace, Evgeny Pavlov, Fabian Orccon, Felix Yan, Fernando Jiménez Moreno, Florian Zwoch, François +Laignel, Frank Dana, Georges Basile Stavracas Neto, Guillaume Desmottes, Guillaume Gomez, Gwyn Ciesla, Haihua Hu, Hassene Tmar, +hassount, Heiko Becker, He Junyan, hguermaz, Hiero32, Hosang Lee, Hou Qi, Hugo Svirak, Hugues Fruchet, Hu Qian, Hyung Song, +Ignazio Pillai, Ilie Halip, Itamar Marom, Ivan Molodetskikh, Ivan Tishchenko, JackZhouVCD, Jacob Johnsson, jainl28patel, Jakub +Adam, James Cowgill, James Hilliard, James Oliver, Jan Alexander Steffens (heftig), Jan Beich, Jan Schmidt, Jan Vermaete, Jayson +Reis, Jeff Wilson, Jeongki Kim, Jeri Li, Jimmi Holst Christensen, Jimmy Ohn, Jochen Henneberg, Johan Adam Nilsson, Johan +Sternerup, John King, Jonas Danielsson, Jonas K Danielsson, Jonas Kvinge, Jordan Petridis, Jordan Yelloz, Josef Kolář, Juan +Navarro, Julien Isorce, Jun Zhao, Jurijs Satcs, Kalev Lember, Kamal Mostafa, kelvinhu325, Kevin Song, Khem Raj, Kourosh +Firoozbakht, Leander Schulten, Leif Andersen, L. E. Segovia, Lieven Paulissen, lijing0010, Lily Foster, Link Mauve, Li Yuanheng, +Loïc Le Page, Loïc Molinari, Lukas Geiger, Luke McGartland, Maksym Khomenko, Ma, Mingyang, Manel J, Marcin Kolny, Marc Leeman, +Marc Solsona, Marc Wiblishauser, Marek Vasut, Marijn Suijten, Mark Hymers, Markus Ebner, Martin Nordholts, Martin Robinson, Mart +Raudsepp, Marvin Schmidt, Mathieu Duponchelle, Matt Feury, Matthew Waters, Matthias Fuchs, Matthieu Volat, Maxim P. Dementyev, +medithe, Mengkejiergeli Ba, Michael Bunk, Michael Gruner, Michael Grzeschik, Michael Olbrich, Michael Tretter, Michiel +Westerbeek, Mihail Ivanchev, Ming Qian, Nader Mahdi, naglis, Nick Steel, Nicolas Beland, Nicolas Dufresne, Nirbheek Chauhan, +Olivier Babasse, Olivier Blin, Olivier Crête, Omar Khlif, Onur Demiralay, Patricia Muscalu, Paul Fee, Pawel Stawicki, Peter +Stensson, Philippe Normand, Philipp Zabel, PhoenixWorthVCD, Piotr Brzeziński, Priit Laes, Qian Hu, Rabindra Harlalka, Rafał +Dzięgiel, Rahul T R, rajneeshksoni, Ratchanan Srirattanamet, renjun wang, Rhythm Narula, Robert Ayrapetyan, Robert Mader, Robert +Rosengren, Robin Gustavsson, Roman Lebedev, Rouven Czerwinski, Ruben Gonzalez, Ruslan Khamidullin, Ryan Pavlik, Sanchayan Maity, +Sangchul Lee, Scott Kanowitz, Scott Moreau, SeaDve, Sean DuBois, Sebastian Dröge, Sebastian Szczepaniak, Sergey Radionov, +Seungha Yang, Shengqi Yu, Simon Himmelbauer, Slava Andrejev, Slawomir Pawlowski, soak, Stefan Brüns, Stéphane Cerveau, Stephan +Seitz, Stijn Last, Talha Khan, Taruntej Kanakamalla, Jin Chung Teng, Théo Maillart, Thibault Saunier, Thomas Schneider, +Tim-Philipp Müller, Tobias Rapp, Tong Wu, Tristan van Berkom, ttrigui, U. Artie Eoff, utzcoz, Víctor Manuel Jáquez Leal, Vivia +Nikolaidou, Wang Chuan, William Manley, Wojciech Kapsa, Xabier Rodriguez Calvar, Xavier Claessens, Xuchen Yang, Yatin Maan, +Yinhang Liu, Yorick Smilda, Yuri Fedoseev, Gang Zhao, Jack Zhou, … + +… and many others who have contributed bug reports, translations, sent suggestions or helped testing. Thank you all! + +Stable 1.24 branch + +After the 1.24.0 release there will be several 1.24.x bug-fix releases which will contain bug fixes which have been deemed +suitable for a stable branch, but no new features or intrusive changes will be added to a bug-fix release usually. The 1.24.x +bug-fix releases will be made from the git 1.24 branch, which will be a stable branch. + +1.24.0 + +GStreamer 1.24.0 was released on 4 March 2024. + +1.24.1 + +The first 1.24 bug-fix release (1.24.1) was released on 21 March 2024. + +This release only contains bugfixes and it should be safe to update from 1.24.0. + +Highlighted bugfixes in 1.24.1 + +- Fix instant-EOS regression in audio sinks in some cases when volume is 0 +- rtspsrc: server compatibility improvements and ONVIF trick mode fixes +- rtsp-server: fix issues if RTSP media was set to be both shared and reusable +- (uri)decodebin3 and playbin3 fixes +- adaptivdemux2/hlsdemux2: Fix issues with failure updating playlists +- mpeg123 audio decoder fixes +- v4l2codecs: DMA_DRM caps support for decoders +- va: various AV1 / H.264 / H.265 video encoder fixes +- vtdec: fix potential deadlock regression with ProRes playback +- gst-libav: fixes for video decoder frame handling, interlaced mode detection +- avenc_aac: support for 7.1 and 16 channel modes +- glimagesink: Fix the sink not always respecting preferred size on macOS +- gtk4paintablesink: Fix scaling of texture position +- webrtc: Allow resolution and framerate changes, and many other improvements +- webrtc: Add new LiveKit source element +- Fix usability of binary packages on arm64 iOS +- various bug fixes, memory leak fixes, and other stability and reliability improvements gstreamer -- tracing: Initialize tracing infrastructure even if the debug system - is not compiled in -- parse-launch: fix missing unref of looked-up child element -- gstutils: Add category and object to most logging messages +- registry, ptp: Canonicalize the library path returned by dladdr +- segment: Don’t use g_return_val_if_fail() in gst_segment_to_running_time_full() +- uri: Sort uri protocol sources/sinks by feature name to break a feature rank tie +- ptp: Initialize expected DELAY_REQ seqnum to an invalid value +- ptp: Don’t install test executable +- gst-inspect: fix –exists for plugins with versions other than GStreamer’s version, like the Rust plugins +- identity: Don’t refuse seeks unless single-segment=true gst-plugins-base -- allocators: Fix fdmem unit test with recent GLib versions -- audiotestsrc: Initialize all samples in wave=ticks mode -- decodebin3: Handle input streams without CAPS or TIME segment such - as e.g. udpsrc or pushfilesrc -- decodebin3: fix regression handling streams without caps -- decodebin3: fix random hang when remove failing stream -- uridecodebin3: Ensure atomic urisourcebin state change -- glvideoflip: fix leaked caps -- glcontext_wgl: fix missing unref -- playsink: Fix volume leak +- audiobasesink: Don’t wait on gap events +- audioencoder: Avoid using temporarily mapped memory as base for input buffers +- decodebin3: Be more specific when sending missing plugin messages +- decodebin3: Fix re-usability issues +- decodebin3: Provide clear error message if no decoders present +- playbin3: Remove un-needed URI NULL check +- uridecodebin3: Don’t hold lock when posting messages or signals +- uridecodebin3: Handle potential double redirection errors +- glimagesink: Fix the sink not always respecting preferred size on macOS +- glupload: Do not propose allocators with sysmem, fixes warning when playing VP9 with alpha +- shmallocator: fix build on Illumos +- meson: Fix the condition to skip theoradec test gst-plugins-good -- adaptivedemux2: fix critical when using an unsupported URI -- dashdemux2: mpdclient: fix divide by 0 if segment has no duration -- imagesequencesrc: Properly set default location -- multifile: error out if no filename was set -- osxvideosink: fix deadlock upon closing output window -- rtpmanager: rtpsession: data race leading to critical warnings -- rtpmanager: rtpsession: race conditions leading to critical warnings -- rtspsrc: Fix handling of * control path -- splitmuxsink: Catch invalid DTS to avoid running into problems later -- splitmuxsrc: Make PTS contiguous by preference -- qtdemux: emit no-more-pads after pruning old pads -- Revert “qtdemux: fix conditions for end of segment in reverse - playback” to fix edit list regression -- qtdemux: Fix av1C parsing -- qtmux: Fix extraction of CEA608 data from S334-1A packets -- qtwindow: unref caps in destructor -- v4l2: device provider: Fix GMainLoop leak -- v4l2: videodec: Rework dynamic resolution change handling -- v4l2: videodec: Prefer acquired caps over anything downstream -- videoflip: fix setting of method property at construction time -- videoflip 1.22.2 not rotating video when extracting frames +- adaptivdemux/hlsdemux2: Fix issues with failure updating playlists +- mpg123audiodec: Correctly handle the case of clipping all decoded samples +- mpg123audiodec: gst_audio_decoder_allocate_output_buffer: assertion ‘size > 0’ failed +- qt: Fix description in meson build options +- qtdemux: Do not set channel-mask to zero +- rtspsrc: remove ‘deprecated’ flag from the ‘push-backchannel-sample’ signal +- rtspsrc: Consider 503 Service Not Available when handling broken control urls +- rtspsrc, rtponviftimestamp: ONVIF mode fixes +- rtspsrc: Don’t invoke close when stopping if we’ve started cleanup, fixing potential crash on shutdown +- rtpgstpay: Delay pushing of event packets until the next buffer gst-plugins-bad -- a2dpsink: Fails many tests in Bluetooth SIG Certification -- avdtputil: Use int instead of int range for fixed bitpool values -- ccconverter: reintroduce frame count reset on cycle completion -- ccconverter: integer overflow & crashing -- codectimestamper: remove PC file generation from plugin’s own - meson.build -- cudamemory: Fix for semi planar YUV memory size decision -- d3d11compositor: Reconfigure resource only when output caps is - changed -- d3d11compositor: Skip zero alpha input -- d3d11convert: Fix for runtime property update -- d3d11memory: Don’t clear wrapped texture memory -- d3d11videosink: Fix for ignored initial render rectangle -- d3d11videosink: fix race condition in window unprepare -- d3d11videosink: Enhancement for initial window size decision -- d3d11videosink: Don’t clear prepared buffer on unlock_stop() -- dashdemux: mpdclient: fix divide by 0 if segment has no duration -- dtlstransport: Keep strong ref of dtls encoder/decoder -- GstPlay: avoid getting property of playbin2 if subtitle_sid is null -- GstPlay: fix critical log when using playbin3 -- h264decoder: Drop nonexisting picture silently without error -- dtmf: element classification improvements -- mfvideoenc: Allow only even resolution numbers -- sctpenc: Fix potential shutdown deadlock -- srtpdec: fix “srtp-key” check -- tests: disable dtls test if openssl is not present -- tsdemux: Set number of channels to 2 for dual mono Opus -- va: Various fixes for defects found with MSVC -- wasapi2: Allows process loopback capture on Windows 10 -- webrtcdatachannel: Bind to parent webrtcbin using a weak reference -- webrtcbin: Fix potential deadlock when closing before any data was - sent -- webrtc: Plug leaks of resolved ICE addresses -- webrtc: do not tear down data channel before data is flushed +- asio: Fix {input,output}-channels property handling +- cuda,d3d11,d3d12bufferpool: Disable preallocation +- d3d11device: Fix adapter LUID comparison in wrapped device mode +- d3d12device: Fix IDXGIFactory2 leak +- d3d12: Fix SDK debug layer activation +- dvbsubenc: Fix bottom field size calculation +- dvdspu: avoid null dereference +- GstPlay: Fix a critical warning in error callback +- v4l2codecs: decoders: Add DMA_DRM caps support +- vaav1enc: Init the output_frame_num when resetting gf group +- vah264enc, vah265enc, vaav1enc: fix potential crash on devices without rate control +- vah265enc: checking surface alignment +- videoparsers: Don’t verbosely warn about CEA_708_PROCESS_EM_DATA_FLAG not being set +- vtdec: Fix a deadlock during ProRes playback, handle non-linked gracefully gst-plugins-ugly -- mpegpsdemux: Rework gap sending +- No changes + +GStreamer Rust plugins + +- gtk4paintablesink: Fix scaling of texture position +- janusvrwebrtcsink: Handle 64 bit numerical room ids +- janusvrwebrtcsink: Don’t include deprecated audio/video fields in publish messages +- janusvrwebrtcsink: Handle various other messages to avoid printing errors +- livekitwebrtc: Fix shutdown behaviour +- rtpgccbwe: Don’t forward buffer lists with buffers from different SSRCs to avoid breaking assumptions in rtpsession +- sccparse: Ignore invalid timecodes during seeking +- webrtcsink: Don’t try parsing audio caps as video caps +- webrtc: Allow resolution and framerate changes +- webrtcsrc: Make producer-peer-id optional +- livekitwebrtcsrc: Add new LiveKit source element +- regex: Add support for configuring regex behaviour +- spotifyaudiosrc: Document how to use with non-Facebook accounts +- webrtcsrc: Add do-retransmission property gst-libav -- avviddec: Temporarily unlock stream lock while flushing buffers -- Random freeze and deadlock in ffmpegviddec flush and get_buffer - while seeking +- avcodecmap: Increase max AAC channels to 16 +- avviddec: Fix how we get back the codec frame +- avviddec: Fix interlaced mode detection +- avviddec: Double check if AV_CODEC_FLAG_COPY_OPAQUE port is safe for our scenario gst-rtsp-server -- No changes +- media: gst_rtsp_media_set_reusable() and gst_rtsp_media_set_shared() have become incompatible +- rtsp-stream: clear sockets when leaving bin gstreamer-vaapi @@ -1790,8 +1479,7 @@ gst-editing-services -- ges: base-xml-formatter: Don’t pass non-GObject pointers to - GST_DEBUG_OBJECT +- ges: Fix critical warning gst-validate + gst-integration-testsuites @@ -1805,140 +1493,125 @@ - No changes -Cerbero build tool and packaging changes in 1.22.3 +Cerbero build tool and packaging changes in 1.24.1 + +- gstreamer: Enable ptp helper explicitly +- gst-plugins-bad: Package new insertbin plugin +- gst-plugins-rs: Adjust parallel architecture build blocks +- libnice: update to 0.1.22 +- pixman: Bump to 0.43.4 +- orc: disable JIT code generation on arm64 on iOS again, fixing crashes -- glib: Ship Windows process spawning helpers -- recipes: add recipe for libltc for timecodestamper element -- Add support for RHEL9 and Rocky Linux - -Contributors to 1.22.3 - -Aleksandr Slobodeniuk, Antonio Kevo, Arun Raghavan, Carlos Rafael Giani, -Daniel Moberg, Edward Hervey, Elliot Chen, François Laignel, Guillaume -Desmottes, Haihua Hu, Jan Alexander Steffens (heftig), Jan Beich, Jan -Schmidt, Johan Sternerup, John King, Jordan Petridis, Juan Navarro, Lily -Foster, Martin Nordholts, Mathieu Duponchelle, Matthew Waters, Matthias -Fuchs, Michael Olbrich, Mihail Ivanchev, Nick Steel, Nicolas Dufresne, -Nirbheek Chauhan, Patricia Muscalu, Philippe Normand, Piotr Brzeziński, -Sanchayan Maity, Sebastian Dröge, Seungha Yang, Stéphane Cerveau, -Thibault Saunier, Tim-Philipp Müller, Xabier Rodriguez Calvar, - -… and many others who have contributed bug reports, translations, sent -suggestions or helped testing. Thank you all! - -List of merge requests and issues fixed in 1.22.3 - -- List of Merge Requests applied in 1.22.3 -- List of Issues fixed in 1.22.3 - -1.22.4 - -The fourth 1.22 bug-fix release (1.22.4) was released on 20 June 2023. - -This release only contains bugfixes and security fixes and it should be -safe to update from 1.22.x. - -Highlighted bugfixes in 1.22.4 - -- Security fixes for flacparse, dvdspu, and subparse -- d3d11videosink: Fix error on pause and play -- decklink: Correctly handle SDK strings on macOS and free strings - after usage on Linux -- filesink: Fix buffered mode writing of buffer lists and buffers with - multiple memories -- gldownload: handle passthrough without a critical -- h265parse: Fix framerate handling regression -- oggdemux: vp8 fixes -- mp4mux, qtmux, qtdemux: Opus audio mapping fixes -- pngdec: Fix wrong colours output from 16bit RGB images -- ptp clock: Work around ptpd bug in default configuration -- srtpdec: fix critical warnings on shutdown -- v4l2src: fix support for bayer format -- v4l2videoenc: support force-keyframe event in v4l2 encoder -- vtenc: apply DTS offset to ensure DTS <= PTS -- gst-python: allow more functions to be called before gst_init() -- cerbero: fix vaapi variant; add qt6 build on windows; ensure errors - on unguarded use of new APIs, require macOS 10.13 -- packages: ship codecalpha, rtponvif, dvbsubenc, switchbin, - videosignal plugins; fix pango crash on 32-bit windows -- various bug fixes, memory leak fixes, and other stability and - reliability improvements +Contributors to 1.24.1 + +Alexander Slobodeniuk, Antonio Larrosa, Edward Hervey, Elizabeth Figura, François Laignel, Guillaume Desmottes, He Junyan, Jan +Schmidt, Jordan Yelloz, L. E. Segovia, Mark Nauwelaerts, Mathieu Duponchelle, Michael Tretter, Mikhail Rudenko, Nicolas +Dufresne, Nirbheek Chauhan, Philippe Normand, Piotr Brzeziński, Robert Mader, Ruijing Dong, Sebastian Dröge, Seungha Yang, +Thomas Goodwin, Thomas Klausner, Tim-Philipp Müller, Xi Ruoyao, + +… and many others who have contributed bug reports, translations, sent suggestions or helped testing. Thank you all! + +List of merge requests and issues fixed in 1.24.1 + +- List of Merge Requests applied in 1.24.1 +- List of Issues fixed in 1.24.1 + +1.24.2 + +The second 1.24 bug-fix release (1.24.2) was released on 9 April 2024. + +This release only contains bugfixes and it should be safe to update from 1.24.x. + +Highlighted bugfixes in 1.24.2 + +- H.264 parsing regression fixes +- WavPack typefinding improvements +- Video4linux fixes and improvements +- Android build and runtime fixes +- macOS OpenGL memory leak and robustness fixes +- Qt/QML video sink fixes +- Package new analytics and mse libraries in binary packages +- Windows MSVC binary packages: fix libvpx avx/avx2/avx512 instruction set detection +- various bug fixes, memory leak fixes, and other stability and reliability improvements gstreamer -- filesink: Fix buffered mode writing of buffer lists and buffers with - multiple memories -- basesink: Clear EOS flag on STREAM-START event -- typefindhelper: downgrade bogus error level debug log message -- ptp: Correctly parse clock ID from the commandline parameters in the - helper -- ptp: Work around bug in ptpd in default configuration +- clock: Block futex_time64 usage on Android API level < 30 +- basesrc: Clear submitted buffer lists consistently with buffers +- ptpclock: fix double free of domain data during deinit +- clocksync: Proxy allocation queries +- inputselector: fix possible clock leak on shutdown +- typefind: Handle WavPack block sizes > 131072 gst-plugins-base -- alsasink: Fix stall for transition from PAUSED to READY with USB - speakerphone. -- appsink: unref buffer in prev sample early so buffers from v4l2 can - be released properly -- basetextoverlay: Fix typo in “text-y” property description -- gldownload: handle passthrough without a critical -- glfilter: add parent meta to output buffer for input buffer -- oggdemux: vp8: Push headers downstream and detect keyframe packets -- opus: Fix potential crash when getting unexpected channel position -- streamsynchronizer: reset eos on STREAM_START -- subparse: Look for the closing > of a tag after the opening < -- video: convertframe: Add D3D11 specific conversion path -- videometa: Only validate the alignment only when it contains some - info -- video-blend: Fix linking error with C++ +- glcolorconvert: Ensure glcolorconvert does not miss supported RGB formats +- gl/macos: a couple of race/reference count fixes +- pbutils: descriptions: Don’t warn on MPEG-1 audio caps without layer field +- encodebin: Add the parser before timestamper to tosync list +- videorate: Reset last_ts when a new segment is received gst-plugins-good -- flacparse: Avoid integer overflow in available data check for image - tags -- flvmux: use the correct timestamp to calculate wait times -- isomp4: Fix (E)AC-3 channel count handling -- jpegdec: fixes related to interlaced jpeg -- pngdec: Fix wrong colours output from 16bit RGB images -- qtmux, qtdemux: fix byte order for opus extension -- rtspsrc: Do not try send dropped get/set parameter -- qt5, qt6: Add more meson options and eliminate all automagic -- qt: glrenderer: don’t attempt to use QWindow from non-Qt main thread -- qml6glsink: Support building on win32 -- v4l2src: fix support for bayer format -- v4l2: Change to query only up to - V4L2_CID_PRIVATE_BASE+V4L2_CID_MAX_CTRLS -- v4l2videodec: treat MPEG-1 format as MPEG-2 -- v4l2videoenc: support force keyframe event in v4l2 encoder -- tests: rtpbin_buffer_list: fix possible unaligned write/read on - 32-bit ARM +- qml6glsink: fix destruction of underlying texture +- qt/qt6: Fixup for dummy textures +- rtpjitterbuffer: Don’t use estimated_dts to do default skew adjustment +- rtpjitterbuffer: Use an extended RTP timestamp for the clock-base +- rtpmp4adepay: Set duration on outgoing buffers +- tests: rtpred: fix out-of-bound writes +- v4l2: allocator: Fix unref log/trace on memory release +- v4l2: Also set max_width/max_width if enum framesize fail +- v4l2: enforce a pixel aspect ratio of 1/1 if no data are available +- v4l2: fix error in calculating padding bottom for tile format +- v4l2src: need maintain the caps order in caps compare when fixate +- vpxenc: Include vpx error details in errors and warnings gst-plugins-bad -- asfmux: fix possible unaligned write on 32-bit ARM -- d3d11videosink: Fix error on pause and play -- d3dvideosink: Fix navigation event leak -- decklink: Correctly handle SDK strings on macOS and free strings - after usage on Linux -- dvdspu: Make sure enough data is allocated for the available data -- fdkaacdec: Support up to 5 rear channels -- h265parse: Fix framerate handling -- kmssink: Add STM32 LTDC and NXP i.MX8M Plus LCDIFv3 auto-detection -- sdpdemux: ensure that only one srcpad is created per stream -- srtpdec: fix critical warnings on shutdown -- testsrcbin: Remove spurious caps unref -- va: map the mbbrc to correct enum value in get_property() -- vtenc: apply DTS offset to ensure DTS <= PTS -- vtdec: time glitches on h264 playback -- waylandsink: Emit “map” signal boarder surface is ready +- h264parse: element hangs with some video streams (regression) +- h264parse: Revert “AU boundary detection changes” +- alphadecodebin: Explicitly pass 64 bit integers as such through varargs +- atdec: Set a channel mask for channel counts greater than 2 +- ccconverter: Fix caps leak and remove unnecessary code +- d3d11videosink: disconnect signals before releasing the window +- d3d11: meson: Add support for MinGW DirectXMath package and update directxmath wrap to 3.1.9 +- d3d11: meson: Disable library build if DirectXMath header was not found +- dwrite: Fix crash on device update +- GstPlay: Update video_snapshot to support playbin3 +- jpegparse: avi1 tag can be progressive +- jpegparse: turn some bus warnings into object ones +- qsvdecoder: Release too old frames +- ristsrc: Only free caps if needed +- va: av1enc: Correct the reference number and improve the reference setting +- va: {vp9, av1}enc: Avoid reopen encoder or renegotiate +- videoparsers: Demote CC warning message +- vkbufferpool: correct usage flags type +- vkh26xdec: a couple decoding fixes +- vtdec: Fix caps criticals during negotiation +- wpe: avoid crash with G_DEBUG=fatal_criticals and static build +- Sink missing floating references gst-plugins-ugly - No changes +GStreamer Rust plugins + +- aws: use fixed BehaviorVersion +- aws: improve error message logs +- fmp4: Update to dash-mpd 0.16 +- fmp4mux: Require gstreamer-pbutils 1.20 for the examples +- onvifmetadataparse: Reset state in PAUSED->READY after pad deactivation, fixing occasional deadlock on shutdown +- reqwest: Update to reqwest 0.12 +- webrtcsink: set perfect-timestamp=true on audio encoders +- webrtcsink: improve panic message on unexpected caps during discovery +- webrtchttp: Update to reqwest 0.12 +- webrtc: fix inconsistencies in documentation of object names +- Fix clippy warnings after upgrade to Rust 1.77 + gst-libav -- No changes +- avviddec: Fix AVPacket leak gst-rtsp-server @@ -1946,7 +1619,7 @@ gstreamer-vaapi -- vaapidecodebin: don’t load vaapipostproc if not available +- No changes gstreamer-sharp @@ -1958,11 +1631,11 @@ gst-python -- python: More functions can be called before gst_init() +- No changes gst-editing-services -- ges: launcher: Never put sinks in a GstPipeline +- ges: frame-composition-meta: Stop using keyword ‘operator’ for field in C++ gst-validate + gst-integration-testsuites @@ -1970,159 +1643,147 @@ gst-examples -- No changes +- webrtc examples: set perfect-timestamp=true on opusenc for better Chrome interoperability Development build environment -- No changes +- flac: Add subproject wrap and allow falling back to it in the flac plugin +- libnice: bump subproject wrap to v0.1.22 (needed for ICE consent freshness support in gstwebrtc) -Cerbero build tool and packaging changes in 1.22.4 +Cerbero build tool and packaging changes in 1.24.2 -- Ship codecalpha, rtponvif, dvbsubenc, switchbin, videosignal plugins -- pango: Fix crash on Windows 32bit build -- qml6: Add support for building the qml6 plugin on Windows and bump - meson to 1.1.1 -- vaapi: update vaapi variant/recipe for meson option changes -- packages: Put libass in the same category as assrender -- cerbero: Don’t extract if already extracted in fetch -- darwin: Ensure errors on unguarded use of new APIs, require macOS - 10.13 - -Contributors to 1.22.4 - -Andoni Morales Alastruey, Arun Raghavan, Colin Kinloch, Daniel Morin, -Edward Hervey, ekwange, Elliot Chen, François Laignel, Guillaume -Desmottes, Haihua Hu, He Junyan, Hou Qi, Jan Alexander Steffens -(heftig), Jochen Henneberg, Jordan Petridis, Kevin Song, Maksym -Khomenko, Marek Vasut, Mathieu Duponchelle, Matthew Waters, -Mengkejiergeli Ba, Michael Olbrich, Nicolas Beland, Nicolas Dufresne, -Nirbheek Chauhan, Philippe Normand, Piotr Brzeziński, Sebastian Dröge, -Seungha Yang, Thibault Saunier, Tim-Philipp Müller, Víctor Manuel Jáquez -Leal, William Manley, Xavier Claessens, Yuri Fedoseev, - -… and many others who have contributed bug reports, translations, sent -suggestions or helped testing. Thank you all! - -List of merge requests and issues fixed in 1.22.4 - -- List of Merge Requests applied in 1.22.4 -- List of Issues fixed in 1.22.4 - -1.22.5 - -The fifth 1.22 bug-fix release (1.22.5) was released on 20 July 2023. - -This release only contains bugfixes and security fixes and it should be -safe to update from 1.22.x. - -Highlighted bugfixes in 1.22.5 - -- Security fixes for the RealMedia demuxer -- vaapi decoders, postproc: Disable DMAbuf from caps negotiation to - fix garbled video in some cases -- decodebin3, playbin3, parsebin fixes, especially for stream - reconfiguration -- hlsdemux2: fix early seeking; don’t pass referer when updating - playlists; webvtt fixes -- gtk: Fix critical caused by pointer movement when stream is getting - ready -- qt6: Set sampler filtering method, fixes bad quality with qml6glsink - and gstqt6d3d11 -- v4l2src: handle resolution change when buffers are copied -- videoflip: update orientation tag in auto mode -- video timecode: Add support for framerates lower than 1fps and - accept 119.88 (120/1.001) fps -- webrtcsink: fixes for x264enc and NVIDIA encoders -- cerbero: Pull ninja from system if possible, avoid spurious - bootstrap of cmake -- packages: Recipe updates for ffmpeg, libsoup, orc -- various bug fixes, memory leak fixes, and other stability and - reliability improvements +- glib: Block futex_time64 usage on Android API level < 30 +- libvpx: Fix build with Python 3.8 +- libvpx: Fix errors with avx* instruction set detection for x86* builds and MSVC +- openjpeg: Update to 2.5.2 +- directxmath: Update to 3.1.9 +- gst-plugins-rs: Fix superstripping for ELF breaking all plugins +- Rust-based plugin initialization hangs on Android with GStreamer 1.24.0 + +Contributors to 1.24.2 + +Alexander Slobodeniuk, Arnaud Vrac, Chao Guo, Chris Spencer, Daniel Morin, Edward Hervey, Elizabeth Figura, Elliot Chen, eri, +François Laignel, Guillaume Desmottes, Haihua Hu, He Junyan, Hou Qi, Jan Schmidt, Jochen Henneberg, L. E. Segovia, Martin +Nordholts, Matthew Waters, Nicolas Dufresne, Philippe Normand, Philipp Zabel, Piotr Brzeziński, Robert Guziolowski, Robert +Mader, Ruben Gonzalez, Sebastian Dröge, Seungha Yang, Taruntej Kanakamalla, Thibault Saunier, Tim Blechmann, Tim-Philipp Müller, +Víctor Manuel Jáquez Leal, Wojciech Kapsa, Xavier Claessens, + +… and many others who have contributed bug reports, translations, sent suggestions or helped testing. Thank you all! + +List of merge requests and issues fixed in 1.24.2 + +- List of Merge Requests applied in 1.24.2 +- List of Issues fixed in 1.24.2 + +1.24.3 + +The third 1.24 bug-fix release (1.24.3) was released on 30 April 2024. + +This release only contains bugfixes and it should be safe to update from 1.24.x. + +Highlighted bugfixes in 1.24.3 + +- EXIF image tag parsing security fixes +- Subtitle handling improvements in parsebin +- Fix issues with HLS streams that contain VTT subtitles +- Qt6 QML sink re-render and re-sizing fixes +- unixfd ipc plugin timestamp and segment handling fixes +- vah264enc, vah265enc: Do not touch the PTS of the output frame +- vah264dec and vapostproc fixes and improvements +- v4l2: multiple fixes and improvements, incl. for mediatek JPEG decoder and v4l2 loopback +- v4l2: fix hang after seek with some v4l2 decoders +- Wayland sink fixes +- ximagesink: fix regression on RPi/aarch64 +- fmp4mux, mp4mux gained FLAC audio support +- D3D11, D3D12: reliablity improvements and memory leak fixes +- Media Foundation device provider fixes +- GTK4 paintable sink improvements including support for directly importing dmabufs with GTK 4.14 +- WebRTC sink/source fixes and improvements +- AWS s3sink, s3src, s3hlssink now support path-style addressing +- MPEG-TS demuxer fixes +- Python bindings fixes +- various bug fixes, memory leak fixes, and other stability and reliability improvements gstreamer -- taglist, plugins: fix compiler warnings with GLib >= 2.76 -- tracerutils: allow casting parameter types -- inputselector: fix playing variable is never set +- ptp: Silence Rust compiler warning about some unused trait methods gst-plugins-base -- appsink: add missing make_writable call -- audioaggregator: Do not post message before being constructed -- decodebin3: Prevent a critical warning when reassigning output slots -- decodebin3: Fix slot input linking when the associated stream has - changed -- decodebin3: Remove spurious input locking during parsebin - reconfiguration -- urisourcebin: Set source element to READY before querying it -- gl/viv-fb: meson build updates -- plugins: fix compiler warnings with GLib >= 2.76 -- subtitleoverlay: fix mutex error if sink caps is not video -- video: timecode: Add support for framerates lower than 1fps -- video: accept timecode of 119.88 (120/1.001) FPS -- video: cannot attach time code meta when frame rate is 119.88 - (120000/1001) -- videodecoder: fix copying buffer metas +- EXIF image tag parsing security fixes +- glcolorconvert: remove some dead code +- parsebin: Ensure non-time subtitle streams get “parsed” +- playbin3: Handle combiner update in case of errors +- ximagesink: initialize mask for XISelectEvents gst-plugins-good -- adaptivedemux2: Fix early seeking -- hlsdemux2: Ensure processed webvtt ends with empty new line -- hlsdemux2: Don’t set a referer when updating playlists -- matroska: demux: Strip signal byte when encrypted -- rtspsrc: Fix crash when is-live=false -- gtk: Fix critical caused by pointer movement when stream is getting - ready -- qt6: Set sampler filtering method, fixes bad quality with qml6glsink - and gstqt6d3d11 -- qtdemux: opus: set entry as sampled -- v4l2src: handle resolution change when buffers are copied -- v4l2videodec: Fix handling of initial gaps -- v4l2videodec: correctly register v4l2mpeg2dec -- v4l2videoenc: replace custom QUERY_CAPS handling with getcaps - callback -- videoflip: update orientation tag in auto mode -- videoflip: fix critical when tag list is not writable +- adaptivedemux2: Playback hangs with VTT fragments +- adaptivedemux2: Avoid double usage of parsebin +- pulsedeviceprovider: Add compare_device_type_name function and missing lock +- qml6glsink: Notify that the returned QSGNode node has changes +- qml6glsink: video content resizes to new item size +- qtdemux: fix wrong full_range offset when parsing colr box +- soup: fix thread name +- v4l2: add multiplane y42b (yuv422m) support (for mediatek v4l2 jpeg decoder) +- v4l2: bufferpool: Drop writable check on output pool process +- v4l2: bufferpool: Ensure freshly created buffers are not marked as queued, fixing issues with v4l2sink on a v4l2loopback + device +- v4l2: bufferpool: queue back the buffer flagged LAST but empty, fixes hangs after seek with some decoders +- v4l2: silence valgrind warning +- vpx: Include vpx error details in errors and warnings gst-plugins-bad -- d3d11bufferpool: Fix heavy CPU usage in case of fixed-size pool -- jpegparser: jpegdecoder: Don’t pollute bus and comply with spec -- plugins: fix compiler warnings with GLib >= 2.76 -- webrtcbin: Prevent critical warning when creating an additional data - channel -- webrtcstats: Properly report IceCandidate type +- d3d11device: protect device_lock vs device_new +- d3d11decoder, d3d12decoder: Fix potential use after free +- d3d11videosink: Fix rendering on keyed mutex enabled handle +- d3d12decoder: Fix d3d12 resource copy +- d3d12encoder: Fix buffer pool leak +- d3d12videosink: HWND event handling related fixes +- d3d12vp9dec: Fix Intel GPU crash occurred when decoding VP9 SVC +- dvbsubenc: fixed some memory leaks and a crash +- GstPlay: fix read duration failure issue for some type rtsp streams which have valid duration +- mediafoundation: Fix device enumeration +- mediafoundation: Fix infinite loop in device provider +- tests: fix possible libscpp build failure in gst-plugins-bad +- tsdemux, tsparse: Fix Program equality check +- tsdemux: Disable smart program update +- unixfdsink: Take segment into account when converting timestamps +- va: videoformat: use video library to get DRM fourcc +- va: radeonsi: DRM RGB formats doesn’t look correctly mapped to VA formats +- vah264enc, vah265enc: Do not touch the PTS of output frame +- vaav1enc: Change the alignment of output to “tu” +- vaallocator: disable derived all together for Mesa <23.3 +- waylandsink: free staged buffer when do gst_wl_window_finalize +- wlwindow: clear configure mutex and cond when finalize +- waylandsink: config buffer pool with query size when propose_allocation +- v4l2codecs: Don’t unref allocation query caps gst-plugins-ugly -- rmdemux: add some integer overflow checks +- No changes + +GStreamer Rust plugins -gst-plugins-rs +Fixed: -- fallbackswitch: Change the threshold for trailing buffers -- fallbackswitch: Fix pad health calculation and notifies -- fmp4mux: Fix draining in chunk mode if keyframes are too late -- livesync: Wait for the end timestamp of the previous buffer before - looking at queue -- livesync: Improve EOS handling -- togglerecord: Clip segment before calculating timestamp/duration -- togglerecord: Error out if main stream buffer has no valid running - time -- webrtcsink: fix pipeline when input caps contain max-framerate -- webrtcsink: Configure only 4 threads for x264enc -- webrtcsink: Translate force-keyunit events to force-IDR action - signal for NVIDIA encoders -- webrtcsink: Set config-interval=-1 and aggregate-mode=zero-latency - on rtph264pay and rtph265pay -- webrtcsink: Set VP8/VP9 payloader based on payloader element factory - name -- webrtcink: Use correct property types for nvvideoconvert -- webrtc/signalling: fix race condition in message ordering -- videofx: Minimize dependencies of the image crate +- hrtfrender: Use a bitmask instead of an int in the caps for the channel-mask +- rtpgccbwe: Don’t log an error when pushing a buffer list fails while stopping +- webrtcsink: Don’t panic in bitrate handling with unsupported encoders +- webrtcsink: Don’t panic if unsupported input caps are used +- webrtcsrc: Allow a None producer-id in request-encoded-filter signal + +Added: + +- aws: New property to support path-style addressing +- fmp4mux / mp4mux: Support FLAC inside (f)MP4 +- gtk4: Support directly importing dmabufs with GTK 4.14 +- gtk4: Add force-aspect-ratio property similar to other video sinks gst-libav -- No changes +- libav: guard some recently dropped APIs gst-rtsp-server @@ -2130,7 +1791,7 @@ gstreamer-vaapi -- vaapidecode,vaapipostproc: Disable DMAbuf from caps negotiation. +- No changes gstreamer-sharp @@ -2142,17 +1803,17 @@ gst-python -- No changes +- Fix Python library name fetching and library searching on Windows +- Don’t link to python for the gi overrides module gst-editing-services -- ges: some fixes for 32-bit systems -- ges, nle: Avoid setting state or sending query when constructing - objects +- ges-launcher: Fix for forcing container profiles -gst-validate + gst-integration-testsuites +gst-devtools, gst-validate + gst-integration-testsuites -- No changes +- debug-viewer: Fix plugin loading machinery +- validate/flvdemux: Stop spamming audio/video on test gst-examples @@ -2162,146 +1823,112 @@ - No changes -Cerbero build tool and packaging changes in 1.22.5 +Cerbero build tool and packaging changes in 1.24.3 + +- No changes + +Contributors to 1.24.3 + +Alexander Slobodeniuk, Edward Hervey, Elliot Chen, F. Duncanh, François Laignel, Haihua Hu, He Junyan, Hou Qi, Jan Schmidt, +Jimmy Ohn, Maksym Khomenko, Matthew Waters, Nicolas Dufresne, Nirbheek Chauhan, Philippe Normand, Philipp Zabel, Qian Hu (胡骞), +Sanchayan Maity, Sebastian Dröge, Seungha Yang, Simonas Kazlauskas, Taruntej Kanakamalla, Tim Blechmann, Tim-Philipp Müller, U. +Artie Eoff, Víctor Manuel Jáquez Leal, William Wedler, Xavier Claessens, + +… and many others who have contributed bug reports, translations, sent suggestions or helped testing. Thank you all! + +List of merge requests and issues fixed in 1.24.3 + +- List of Merge Requests applied in 1.24.3 +- List of Issues fixed in 1.24.3 + +1.24.4 + +The fourth 1.24 bug-fix release (1.24.4) was released on 29 May 2024. -- Pull ninja from system if possible, avoid spurious bootstrap of - cmake -- ffmpeg: update to 5.0.3 -- libsoup: update to 2.74.3 -- orc: update to 0.4.34 - -Contributors to 1.22.5 - -Andoni Morales Alastruey, Bastien Nocera, Carlos Rafael Giani, David -Craven, Doug Nazar, Edward Hervey, François Laignel, Guillaume -Desmottes, He Junyan, Hou Qi, Jan Alexander Steffens (heftig), Jan -Schmidt, Maksym Khomenko, Mathieu Duponchelle, Matthew Waters, Michael -Olbrich, Michael Tretter, Nicolas Dufresne, Nirbheek Chauhan, Philippe -Normand, Ruslan Khamidullin, Sebastian Dröge, Seungha Yang, Théo -Maillart, Thibault Saunier, Tim-Philipp Müller, Víctor Manuel Jáquez -Leal, Vivia Nikolaidou, Yatin Maan, - -… and many others who have contributed bug reports, translations, sent -suggestions or helped testing. Thank you all! - -List of merge requests and issues fixed in 1.22.5 - -- List of Merge Requests applied in 1.22.5 -- List of Issues fixed in 1.22.5 - -1.22.6 - -The sixth 1.22 bug-fix release (1.22.6) was released on 20 September -2023. - -This release only contains bugfixes and security fixes and it should be -safe to update from 1.22.x. - -Highlighted bugfixes in 1.22.6 - -- Security fixes for the MXF demuxer and H.265 video parser -- Fix latency regression in H.264 hardware decoder base class -- androidmedia: fix HEVC codec profile registration and fix coded_data - handling -- decodebin3: fix switching from a raw stream to an encoded stream -- gst-inspect: prettier and more correct signal and action signals - printing -- rtmp2: Allow NULL flash version, omitting the field, for better RTMP - server compatibility -- rtspsrc: better compatibility with buggy RTSP servers that don’t set - a clock-rate -- rtpjitterbuffer: fix integer overflow that led to more packets being - declared lost than have been lost -- v4l2: fix video encoding regression on RPi and fix support for left - and top padding -- waylandsink: Crop surfaces to their display width height -- cerbero: recognise Manjaro; add Rust support for MSVC ARM64; cmake - detection fixes -- various bug fixes, build fixes, memory leak fixes, and other - stability and reliability improvements +This release only contains bugfixes and it should be safe to update from 1.24.x. + +Highlighted bugfixes in 1.24.4 + +- audioconvert: support more than 64 audio channels +- avvidec: fix dropped frames when doing multi-threaded decoding of I-frame codecs such as DV Video +- mpegtsmux: Correctly time out in live pipelines, esp. for sparse streams like KLV and DVB subtitles +- vtdec deadlock fixes on shutdown and format/resolution changes (as might happen with e.g. HLS/DASH) +- fmp4mux, isomp4mux: Add support for adding AV1 header OBUs into the MP4 headers, and add language from tags +- gtk4paintablesink improvements: fullscreen mode and gst-play-1.0 support +- webrtcsink: add support for insecure TLS and improve error handling and VP9 handling +- v4l2codecs: decoder: Reorder caps to prefer DMA_DRM ones, fixes issues with playbin3 +- vah264enc, vah265enc: timestamp handling fixes; generate IDR frames on force-keyunit-requests, not I frames +- Visualizer plugins fixes +- Avoid using private APIs on iOS +- Various bug fixes, memory leak fixes, and other stability and reliability improvements gstreamer -- gst-inspect: prettier and more correct signal printing, and print - action signals in g_signal_emit_by_name() format -- gst-launch: Disable fault signal handlers on macOS +- clock: Fix 32 bit assertions in GST_TIME_TO_TIMEVAL and GST_TIME_TO_TIMESPEC +- systemclock: fix usage of __STDC_NO_ATOMICS__ +- filesrc: Don’t abort on _get_osfhandle() on Windows +- tests: Avoid using “bool” for the variable name +- Various Solaris / Illumos fixes +- parse: Don’t assume that child proxy child objects are GstObjects gst-plugins-base -- audio: Make sure to stop ringbuffer on error -- decodebin3: avoid identity, sinkpad, parsebin leakage when reset - input -- decodebin3: Ensure the slot is unlinked before linking to decoder -- sdp: fix wrong debug log error message for missing clock-rate in - caps -- sdp: Parse zero clock-rate as default +- audioconvert: Support converting >64 channels +- decodebin3: Fix caps and stream leaks +- playbin(3), streamsynchronizer: Fix deadlock when streams have been flushed before others start +- videotestsrc: fix race condition when clearing cached buffer +- Fix visualization plugins +- GstDiscoverer hangs when processing media file containing mebx on MacOS +- glmixer: Add GL_SYNC_META option to buffer pool +- typefinding: Fix ID_ODD_SIZE handling regression in WavPack typefinder gst-plugins-good -- adaptivedemux2: fix memory leak -- pulsedeviceprovider: fix incorrect usage of GST_ELEMENT_ERROR -- qt: Unbreak build with qt-egl enabled but viv_fb missing -- qt: Fix searching of qt5/qt6 tools with qmake in Meson -- qtdemux: Fix premature EOS when some files are played in push mode -- qtdemux: attach cbcs crypt info at the right moment -- rtpjitterbuffer: Avoid integer overflow in max saveable packets - calculation with negative offset -- videoflip: fix concurrent access when modifying the tag list -- v4l2: allocator: Don’t close foreign dmabuf -- v4l2: bufferpool: Fix large encoded stream regression -- v4l2: bufferpool: Problems when checking for truncated buffer -- v4l2: Fix support for left and top padding -- v4l2object: clear format lists if source change event is received +- osxaudio: Avoid using private APIs on iOS +- qtdemux: unit test fixes for 32-bit platforms gst-plugins-bad -- androidmedia/enc: handle codec-data before popping - GstVideoCodecFrames -- androidmedia: fix hevc codec profile registration -- androidmedia: Small fixes -- androidmedia: Add more null checks (of env) to JNI utilities -- applemedia: Fix pixel format for I420 and NV12 -- audiolatency: Forward latency query and event upstream -- av1parser: Fix segmentation params update -- codecparsers: Fix MPEG-1 aspect ratio table -- d3d11convert: Passthrough allocation query on same caps -- h264decoder: Update latency dynamically -- h265parser: Allow partially broken hvcC data -- h265parser: Fix possible overflow using max_sub_layers_minus1 -- hlssink2: Always use forward slash separator -- mdns: Fix a crash on context error -- mxfdemux: Fix integer overflow causing out of bounds writes when - handling invalid uncompressed video and check channels for AES3 -- nvencoder: Fix negotiation error when interlace-mode is unspecified -- rtmp2: Allow NULL flash version, omitting the field -- rtmp2sink: fix crash if message conversion failed -- transcodebin: Fixes for upstream selectable support -- va: Fix in error logs functions mismatches -- waylandsink: Crop surfaces to their display width height -- waylandsink: Fix cropping for video with non-square aspect ratio -- webrtc: Fix docs for create-data-channel action signal -- win32ipc: Fix pipe handle leak +- cudamemory: Fix offset of subsampled planar formats +- d3d11: Revert “d3d11device: protect device_lock vs device_new +- d3dshader: Fix gamma and primaries conversion pixel shader +- dtlsconnection: Fix overflow in timeout calculation on systems with 32 bit time_t +- GstPlay: Initialize debug category and error quark in class_init +- kmssink: Do not close the DRM prime handle twice +- mpegtsmux: Correctly time out and mux anyway in live pipelines +- nvcodec: Accept progressive-high profiles for h264 +- nvencoder: Fix maximum QP value setting +- qsvh264dec, qsvh265dec: Fix nalu leaks +- v4l2codecs: decoder: Reorder caps to prefer DMA_DRM ones +- vah264enc, vah265enc: Let FORCE_KEYFRAME be IDR frame rather than just I frame +- vah264enc, vah265enc: Set DTS offset before PTS +- vkh26xdec: Fix stop memory leak +- vtdec: Fix deadlock when negotiating format change +- vtdec: Fix PAUSED->READY deadlock when output loop is running +- wayland: Use wl_display_create_queue_with_name +- webrtc: request-aux-sender, only sink floating refs +- webrtcbin: Allow session level setup attribute in SDP gst-plugins-ugly - No changes -gst-plugins-rs +GStreamer Rust plugins -- fallbackswitch: locking/deadlock fixes -- onvifmetadataparse: Skip metadata frames with unrepresentable UTC - time -- transcriberbin: Configure audioresample in front of transcriber -- webrtcsink: Propagate GstContext messages -- webrtcsink: Add support for d3d11 memory and qsvh264enc -- webrtcsink: fix TWCC extension adding -- webrtcsink: don’t forget to setup encoders for discoveries -- webrtcsink: NVIDIA V4L2 encoders always require NVMM memory -- meson: Fix handling of optional deps, and don’t require Python 3.8 +- fmp4mux, isomp4mux: Add support for adding AV1 header OBUs into the MP4 headers +- fmp4mux, isomp4mux: Add language from tags +- gtk4paintablesink: Also create own window for gst-play-1.0 +- gtk4paintablesink: Add GST_GTK4_WINDOW_FULLSCREEN environment variable to fullscreen window for testing with + e.g. gst-launch-1.0 +- gtk4: Fix plugin description and update python examples +- rtpgccbwe: Log effective bitrate in more places, and log delay and loss target bitrates separately +- webrtcsink: Improve error when no encoder was found or RTP plugins were missing +- webrtcsink: Add VP9 parser after the encoder for VP9 too +- webrtc: Add support for insecure TLS connections gst-libav -- No changes +- avvidec: Fix dropping wrong “ghost” frames - fixing multi-threaded decoding of I-frame codecs such as DV Video gst-rtsp-server @@ -2325,11 +1952,11 @@ gst-editing-services -- No changes +- ges-pipeline: Configure encodebin before linking -gst-validate + gst-integration-testsuites +gst-devtools, gst-validate + gst-integration-testsuites -- gst-validate: Disable fault signal handlers on macOS +- No changes gst-examples @@ -2337,179 +1964,113 @@ Development build environment -- macos-bison: Update to 3.8.2 and add an ARM64 build -- wrap: update libpsl to 0.21.2 +- No changes + +Cerbero build tool and packaging changes in 1.24.4 + +- Add Fedora 40 support +- srt: bump version to 1.5.3 +- pango: Fix leaks on Windows (textoverlay plugins) +- windows runtime installer has empty qt6 msm +- WiX: assorted fixes + +Contributors to 1.24.4 + +Alexander Slobodeniuk, Bill Nottingham, Brad Reitmeyer, Chris Del Guercio, Daniel Stone, Edward Hervey, Emil Pettersson, He +Junyan, Jordan Petridis, Joshua Breeden, L. E. Segovia, Martin Nordholts, Mathieu Duponchelle, Matthew Waters, Nirbheek Chauhan, +Philippe Normand, Piotr Brzeziński, Rafael Carício, Robert Ayrapetyan, Robert Mader, Sebastian Dröge, Seungha Yang, Shengqi Yu, +Stéphane Cerveau, Tim-Philipp Müller, -Cerbero build tool and packaging changes in 1.22.6 +… and many others who have contributed bug reports, translations, sent suggestions or helped testing. Thank you all! -- Add Rust support for MSVC ARM64 -- Recognise PERL5LIB as a joinable Unix variable -- Recognise Manjaro as an Arch derivative -- Fix picking up cmake from build-tools - -Contributors to 1.22.6 - -Akihiro Sagawa, Alicia Boya García, Guillaume Desmottes, Haihua Hu, -Hugues Fruchet, Ivan Molodetskikh, Jan Alexander Steffens (heftig), Jan -Schmidt, L. E. Segovia, Mathieu Duponchelle, Matthew Waters, Ming Qian, -Nicolas Dufresne, Nirbheek Chauhan, Olivier Blin, Olivier Crête, -Philippe Normand, Piotr Brzeziński, Robert Ayrapetyan, Ryan Pavlik, -Sebastian Dröge, Seungha Yang, Stéphane Cerveau, Stephan Seitz, Thomas -Schneider, Tim-Philipp Müller, Víctor Manuel Jáquez Leal, Wang Chuan, -Xabier Rodriguez Calvar, - -… and many others who have contributed bug reports, translations, sent -suggestions or helped testing. Thank you all! - -List of merge requests and issues fixed in 1.22.6 - -- List of Merge Requests applied in 1.22.6 -- List of Issues fixed in 1.22.6 - -1.22.7 - -The seventh 1.22 bug-fix release (1.22.7) was released on 13 November -2023. - -This release only contains bugfixes and security fixes and it should be -safe to update from 1.22.x. - -Highlighted bugfixes in 1.22.7 - -- Security fixes for the MXF demuxer and AV1 codec parser -- glfilter: Memory leak fix for OpenGL filter elements -- d3d11videosink: Fix toggling between fullscreen and maximized, and - window switching in fullscreen mode -- DASH / HLS adaptive streaming fixes -- Decklink card device provider device name string handling fixes -- interaudiosrc: handle non-interleaved audio properly -- openh264: Fail gracefully if openh264 encoder/decoder creation fails -- rtspsrc: improved whitespace handling in response headers by certain - cameras -- v4l2codecs: avoid wrap-around after 1000000 frames; tiled formats - handling fixes -- video-scaler, audio-resampler: downgraded “Can’t find exact taps” - debug log messages -- wasapi2: Don’t use global volume control object -- Rust plugins: various improvements in aws, fmp4mux, hlssink3, - livesync, ndisrc, rtpav1depay, rsfilesink, s3sink, sccparse -- WebRTC: various webrtchttp, webrtcsrc, and webrtcsink improvements - and fixes -- Cerbero build tools: recognise Windows 11; restrict parallelism of - gst-plugins-rs build on small systems -- Packages: ca-certificates update; fix gio module loading and TLS - support on macOS +List of merge requests and issues fixed in 1.24.4 + +- List of Merge Requests applied in 1.24.4 +- List of Issues fixed in 1.24.4 + +1.24.5 + +The fifth 1.24 bug-fix release (1.24.5) was released on 20 June 2024. + +This release only contains bugfixes and it should be safe to update from 1.24.x. + +Highlighted bugfixes in 1.24.5 + +- webrtcsink: Support for AV1 via nvav1enc, av1enc or rav1enc encoders +- AV1 RTP payloader/depayloader fixes to work correctly with Chrome and Pion WebRTC +- av1parse, av1dec error handling/robustness improvements +- av1enc: Handle force-keyunit events properly for WebRTC +- decodebin3: selection and collection handling improvements +- hlsdemux2: Various fixes for discontinuities, variant switching, playlist updates +- qml6glsink: fix RGB format support +- rtspsrc: more control URL handling fixes +- v4l2src: Interpret V4L2 report of sync loss as video signal loss +- d3d12 encoder, memory and videosink fixes +- vtdec: more robust error handling, fix regression +- ndi: support for NDI SDK v6 +- Various bug fixes, memory leak fixes, and other stability and reliability improvements gstreamer -- debugutils: provide gst_debug_bin_to_dot_data() implementation even - if debug system is disabled +- promise: Don’t use g_return_* for internal checks +- debug: Add missing gst_debug_log_id_literal() dummy with gst_debug=false +- ptp-helper: Add GNU/Hurd support gst-plugins-base -- audioaggregator, audiomixer: Make access to the pad list thread-safe - while mixing -- basetextoverlay: Fix overlay never rendering again if width reaches - 1px -- glfiter: Protect GstGLContext access -- glfilter: Only add parent meta if inbuf != outbuf -- macOS: fix huge memory leak with glfilter-based elements -- rtspconnection: Ignore trailing whitespace in rtsp headers -- video-scaler, audio-resampler: downgrade ‘can’t find exact taps’ to - debug +- uridecodebin3: Don’t hold PLAY_ITEMS lock when activating them +- decodebin3: Always ensure we end up with parsebin or identity +- decodebin3: Properly support changing input collections +- decodebin3: Avoid usage of parsebin even more +- decodebin3: Fix dealing with input without caps +- video-info: Don’t crash in gst_video_info_is_equal() if one videoinfo is zero-initialized gst-plugins-good -- adaptivedemux2: Do not submit_transfer when cancelled -- adaptivedemux2: Call GTasks’s return functions for blocking tasks -- flacenc: Correctly handle up to 255 cue entries -- flvmux: set the src segment position as running time -- imagesequencesrc: fix deadlock when feeding the same image in a loop -- pngenc: output one frame only in snapshot mode and mark output - frames as I-frames -- qmlglsrc: sync on the streaming thread -- souphttpsrc: Chain up to finalize to fix memory leak -- wavparse: fix buffer leak with adtl tag -- v4l2codecs: Avoid QBUF/DQBUF struct timeval .tv_usec wrap-around at - frame 1000000 -- v4l2codecs: Fix tiled formats stride conversion +- flacparse: fix buffer overflow +- hlsdemux2: Various fixes for discontinuities, variant switching, playlist updates +- qml6glsink: fix RGB format support +- rtpdtmfdepay: fix caps negotiation with audioconvert +- rtpdtmfsrc: fix leak when shutting down mid-event +- rtspsrc: fix invalid seqnum assertions +- rtspsrc: Various control URL handling fixes +- v4l2src: Interpret V4L2 report of sync loss as video signal loss gst-plugins-bad -- audiobuffersplit: disable max-silence-time if set to 0 -- libde265: Do not decode the non 4:2:0 8 bits format -- codecparsers: av1: Clip max tile rows and cols values -- codecs: h265: Do not free slice header before using it -- d3d11converter: Fix 10/12bits planar output -- d3d11decoder: Fix crash on negotiate() when decoder is not - configured -- d3d11videosink: Fix toggling between fullscreen and maximized -- d3d11videosink: Fix window switching in case of fullscreen mode -- d3d11screencapturesrc: Fix mouse cursor blending -- decklink: Fix broken COM string conversion -- decklink: Decklink Device Provider wrongly parses SDK strings -- gstwayland: Don’t depend on wayland-protocols -- interaudiosrc: Add audio meta to buffers containing non-interleaved - samples -- kmssink: Add TIDSS auto-detection -- mfvideoencoder: Fix typo in template caps -- mxfdemux: Store GstMXFDemuxEssenceTrack in their own fixed - allocation -- nvcodec: fix bounds for auto-select GPU enumeration -- openh264: Fail gracefully if openh264 encoder/decoder creation fails -- tsmux: More cleanups -- tsmux: Fill padding packets with stuffing bytes -- v4l2codecs: Fix tiled formats stride conversion -- v4l2videodec: Correctly free caps to avoid memory leak -- wasapi2: Don’t use global volume control object -- wasapi2device: Ignore activation failed device +- av1parse: Do not return error when expectedFrameId mismatch +- av1dec: Don’t treat decoding errors as fatal and print more error details +- av1enc: Handle force-keyunit events properly by requesting keyframes +- codectimestamper: never set DTS to NONE +- d3d12encoder: Do not print error log for not-supported feature +- d3d12memory: Fix staging buffer alignment +- d3d12videosink: Disconnect window signal handler on dispose as intended +- dtlssrtpenc: Don’t crash if no pad name is provided when requesting a new pad +- glcolorconvert: update existing sync meta if outbuf has one +- pcapparse: Parsing code assumes unaligned memory accesses are OK +- pcapparse: Avoid unaligned memory access +- tsdemux: Fix maximum PCR/DTS values +- vtdec: Improve error handling in edge cases +- vtdec, qtdemux: regression in 1.24.3 - internal data stream error +- uvcgadget: Use g_path_get_basename instead of libc basename gst-plugins-ugly - No changes -gst-plugins-rs +GStreamer Rust plugins -- aws: s3sink: Fix handling of special characters in key -- aws: s3: Properly percent-decode GstS3Url -- fmp4mux: Don’t overflow negative composition offset calculation -- fmp4mux: specify the fragment duration unit -- hlssink3: Use Path API for getting file name -- hlssink3: Use sprintf for segment name formatting -- hlssink3: Remove unused deps -- hlssink3: Don’t remove old files if max-files is zero -- hlssink3: Don’t remove uri from playlist if playlist-length is zero -- hlssink3: Various cleanup -- livesync: log new pending segments -- livesync: display jitter when waiting on clock -- livesync: Rename activatemode methods to *_activatemode -- livesync: Simplify start_src_task and src_loop -- livesync: Improve audio duration fixups -- livesync: Log a category error when we are missing the segment -- livesync: Clean up state handling -- livesync: Replace an if-let with match -- livesync: Move a notify closer to the interesting state change -- livesync: Move num_in counting to the src task -- livesync: Simplify num_duplicate counting -- livesync: Handle flags and late buffer patching after queueing -- livesync: Separate out_buffer duplicate status from GAP flag -- livesync: Use fallback_duration for audio repeat buffers as well -- livesync: example: Add identities single-segment=1 -- livesync: Split fallback_duration into in_ and out_duration -- livesync: Keep existing buffer duration in some cases -- livesync: Remove the stop from outgoing segments -- ndisrc: Assume input with more than 8 raw audio channels is - unpositioned -- rtpav1depay: Skip unexpected leading fragments -- rtpav1depay: Don’t push stale temporal delimiters downstream -- rsfilesink: set sync=false -- s3sink: set sync=false -- sccparse: Fix leading spaces between the tab and caption data -- webrtchttp: Respect HTTP redirects -- webrtcsrc: use @watch instead of @to-owned -- webrtcsrc: add turn-servers property -- webrtc: Fix paths in README -- webrtcsink: don’t miss ice candidates +- gtk4: update flatpak integration code +- ndi: Add support for loading NDI SDK v6 +- reqwesthttpsrc: Fix race condition when unlocking +- rtp: Don’t restrict payload types for payloaders +- rtp: av1pay: Correctly use N flag for marking keyframes +- rtp: av1depay: Parse internal size fields of OBUs and handle them +- webrtcsink: Refactor value retrieval to avoid lock poisoning +- webrtcsink: Add support for AV1 +- webrtc: Update to async-tungstenite 0.26 +- Fix various new clippy 1.79 warnings +- meson: Fix various issues in dependency management, feature detection, some regressions, and add logging gst-libav @@ -2517,7 +2078,7 @@ gst-rtsp-server -- rtspclientsink: Don’t leak previous server_ip +- No changes gstreamer-vaapi @@ -2539,9 +2100,9 @@ - No changes -gst-validate + gst-integration-testsuites +gst-devtools, gst-validate + gst-integration-testsuites -- gst-validate: Fix compatibility with Python 3.12 +- No changes gst-examples @@ -2551,54 +2112,36 @@ - No changes -Cerbero build tool and packaging changes in 1.22.7 +Cerbero build tool and packaging changes in 1.24.5 + +- No changes + +Contributors to 1.24.5 + +Angelo Verlain, Chris Del Guercio, Corentin Damman, Edward Hervey, Francisco Javier Velázquez-García, He Junyan, Jakub Adam, +Jakub Vaněk, Khem Raj, Martin Nordholts, Mathieu Duponchelle, Nirbheek Chauhan, Piotr Brzeziński, Samuel Thibault, Sebastian +Dröge, Sergey Krivohatskiy, Seungha Yang, Tim-Philipp Müller, Zach van Rijn, + +… and many others who have contributed bug reports, translations, sent suggestions or helped testing. Thank you all! + +List of merge requests and issues fixed in 1.24.5 + +- List of Merge Requests applied in 1.24.5 +- List of Issues fixed in 1.24.5 + +Schedule for 1.26 + +Our next major feature release will be 1.26, and 1.25 will be the unstable development version leading up to the stable 1.26 +release. The development of 1.25/1.25 will happen in the git main branch of the GStreamer mono repository. + +The schedule for 1.26 is yet to be decided. + +1.26 will be backwards-compatible to the stable 1.24, 1.22, 1.20, 1.18, 1.16, 1.14, 1.12, 1.10, 1.8, 1.6, 1.4, 1.2 and 1.0 +release series. + +-------------------------------------------------------------------------------------------------------------------------------- -- Add Windows 11 to the supported versions list -- ca-certificates: Update to version from 2023-08-22 -- cargo: Restrict parallelism if a small system is detected (for - gst-plugins-rs build) -- Fix venv setup on Python 3.11+ -- Fix unlinking of Android NDK directories if install fails midway -- glib: Work around AppleClang + -Werror test build failure -- glib: Re-add gio module loading patch for macOS, remove unused patch - files - -Contributors to 1.22.7 - -Albert Sjölund, Arun Raghavan, Balló György, Benjamin Gaignard, Detlev -Casanova, Doug Nazar, Eric, Florian Zwoch, François Laignel, Guillaume -Desmottes, He Junyan, Hou Qi, James Oliver, Jan Alexander Steffens -(heftig), Jan Schmidt, Johan Adam Nilsson, Jordan Yelloz, Kalev Lember, -L. E. Segovia, Lieven Paulissen, Maksym Khomenko, Marek Vasut, Matthias -Fuchs, Michiel Westerbeek, Nicolas Dufresne, Philippe Normand, Piotr -Brzeziński, Rahul T R, Sean DuBois, Sebastian Dröge, Seungha Yang, -Stéphane Cerveau, Thibault Saunier, Tim-Philipp Müller, - -… and many others who have contributed bug reports, translations, sent -suggestions or helped testing. Thank you all! - -List of merge requests and issues fixed in 1.22.7 - -- List of Merge Requests applied in 1.22.7 -- List of Issues fixed in 1.22.7 - -Schedule for 1.24 - -Our next major feature release will be 1.24, and 1.23 will be the -unstable development version leading up to the stable 1.24 release. The -development of 1.23/1.24 will happen in the git main branch of the -GStreamer mono repository. - -The plan for the 1.24 development cycle is yet to be confirmed. - -1.24 will be backwards-compatible to the stable 1.22, 1.20, 1.18, 1.16, -1.14, 1.12, 1.10, 1.8, 1.6, 1.4, 1.2 and 1.0 release series. - ------------------------------------------------------------------------- - -These release notes have been prepared by Tim-Philipp Müller with -contributions from Edward Hervey, Matthew Waters, Nicolas Dufresne, -Nirbheek Chauhan, Olivier Crête, Sebastian Dröge, Seungha Yang, and -Thibault Saunier. +These release notes have been prepared by Tim-Philipp Müller with contributions from Edward Hervey, Matthew Waters, Nicolas +Dufresne, Nirbheek Chauhan, Olivier Crête, Sebastian Dröge, Seungha Yang, Thibault Saunier, and Víctor Manuel Jáquez Leal. License: CC BY-SA 4.0
View file
gst-plugins-ugly-1.22.7.tar.xz/README.md -> gst-plugins-ugly-1.24.5.tar.xz/README.md
Changed
@@ -1,4 +1,4 @@ -GStreamer 1.22.x stable series +GStreamer 1.24.x stable series WHAT IT IS ---------- @@ -16,17 +16,17 @@ https://gstreamer.freedesktop.org/documentation/ -You can subscribe to our mailing lists: +You can ask questions on the GStreamer Discourse at - https://lists.freedesktop.org/mailman/listinfo/gstreamer-announce - - https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel + https://discourse.gstreamer.org/ We track bugs, feature requests and merge requests (patches) in GitLab at https://gitlab.freedesktop.org/gstreamer/ -You can join us on IRC - #gstreamer on irc.oftc.net +You can join us on our Matrix room at + + https://matrix.to/#/#gstreamer:gstreamer.org GStreamer 1.0 series --------------------
View file
gst-plugins-ugly-1.22.7.tar.xz/RELEASE -> gst-plugins-ugly-1.24.5.tar.xz/RELEASE
Changed
@@ -1,17 +1,17 @@ -This is GStreamer gst-plugins-ugly 1.22.7. +This is GStreamer gst-plugins-ugly 1.24.5. The GStreamer team is thrilled to announce a new major feature release of your favourite cross-platform multimedia framework! As always, this release is again packed with new features, bug fixes and other improvements. - -The 1.22 release series adds new features on top of the 1.20 series and is + +The 1.24 release series adds new features on top of the 1.22 series and is part of the API and ABI-stable 1.x release series. Full release notes can be found at: - https://gstreamer.freedesktop.org/releases/1.22/ + https://gstreamer.freedesktop.org/releases/1.24/ Binaries for Android, iOS, Mac OS X and Windows will usually be provided shortly after the release. @@ -44,10 +44,7 @@ - gstreamer-vaapi: hardware-accelerated video decoding and encoding using VA-API on Linux. Primarily for Intel graphics hardware. - - - gst-omx: hardware-accelerated video decoding and encoding, primarily for - embedded Linux systems that provide an OpenMax - implementation layer such as the Raspberry Pi. + (Deprecated, use the new "va" plugin instead) - gst-rtsp-server: library to serve files or streaming pipelines via RTSP @@ -80,14 +77,18 @@ for more details. -For help and support, please subscribe to and send questions to the -gstreamer-devel mailing list (see below for details). +For help and support, please head over to our Discourse forum at -There is also a #gstreamer IRC channel on the OFTC IRC network, which is -also bridged into the Matrix network. + https://discourse.gstreamer.org/ -Please do not submit support requests in GitLab, we only use it -for bug tracking and merge requests review. +or pop into one of our Matrix chat rooms, see + + https://discourse.gstreamer.org/t/new-gstreamer-matrix-chat-space/675 + +for more details. + +Please do not submit support requests in GitLab, we only use it for +bug tracking and merge requests review. Use the Discourse forum instead. ==== Developers ==== @@ -99,6 +100,9 @@ Merge Requests or file issues for bugs or feature requests. Interested developers of the core library, plugins, and applications should -subscribe to the gstreamer-devel list: +join us on Matrix for chat and the Discourse forum for announcements, help +and discussions. + +There is also a gstreamer-devel mailing list, but Discourse is preferred: https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel
View file
gst-plugins-ugly-1.22.7.tar.xz/REQUIREMENTS -> gst-plugins-ugly-1.24.5.tar.xz/REQUIREMENTS
Changed
@@ -32,8 +32,6 @@ a52dec (for the a52dec AC-3 decoder) http://liba52.sourceforge.net/ -opencore-amr (for the AMR-NB decoder and encoder and the AMR-WB decoder) - http://sourceforge.net/projects/opencore-amr/ libdvdread (for the dvdreadsrc) http://www.dtek.chalmers.se/groups/dvd/ (optional: libcss for encrypted DVDs)
View file
gst-plugins-ugly-1.22.7.tar.xz/docs/gst_plugins_cache.json -> gst-plugins-ugly-1.24.5.tar.xz/docs/gst_plugins_cache.json
Changed
@@ -122,209 +122,6 @@ "tracers": {}, "url": "Unknown package origin" }, - "amrnb": { - "description": "Adaptive Multi-Rate Narrow-Band", - "elements": { - "amrnbdec": { - "author": "GStreamer maintainers <gstreamer-devel@lists.freedesktop.org>", - "description": "Adaptive Multi-Rate Narrow-Band audio decoder", - "hierarchy": - "GstAmrnbDec", - "GstAudioDecoder", - "GstElement", - "GstObject", - "GInitiallyUnowned", - "GObject" - , - "klass": "Codec/Decoder/Audio", - "long-name": "AMR-NB audio decoder", - "pad-templates": { - "sink": { - "caps": "audio/AMR:\n rate: 8000\n channels: 1\n", - "direction": "sink", - "presence": "always" - }, - "src": { - "caps": "audio/x-raw:\n format: S16LE\n layout: interleaved\n rate: 8000\n channels: 1\n", - "direction": "src", - "presence": "always" - } - }, - "properties": { - "variant": { - "blurb": "The decoder variant", - "conditionally-available": false, - "construct": true, - "construct-only": false, - "controllable": false, - "default": "IF1 (0)", - "mutable": "null", - "readable": true, - "type": "GstAmrnbVariant", - "writable": true - } - }, - "rank": "primary" - }, - "amrnbenc": { - "author": "Wim Taymans <wim.taymans@gmail.com>", - "description": "Adaptive Multi-Rate Narrow-Band audio encoder", - "hierarchy": - "GstAmrnbEnc", - "GstAudioEncoder", - "GstElement", - "GstObject", - "GInitiallyUnowned", - "GObject" - , - "interfaces": - "GstPreset" - , - "klass": "Codec/Encoder/Audio", - "long-name": "AMR-NB audio encoder", - "pad-templates": { - "sink": { - "caps": "audio/x-raw:\n format: S16LE\n layout: interleaved\n rate: 8000\n channels: 1\n", - "direction": "sink", - "presence": "always" - }, - "src": { - "caps": "audio/AMR:\n rate: 8000\n channels: 1\n", - "direction": "src", - "presence": "always" - } - }, - "properties": { - "band-mode": { - "blurb": "Encoding Band Mode (Kbps)", - "conditionally-available": false, - "construct": true, - "construct-only": false, - "controllable": false, - "default": "MR122 (7)", - "mutable": "null", - "readable": true, - "type": "GstAmrnbEncBandMode", - "writable": true - } - }, - "rank": "secondary" - } - }, - "filename": "gstamrnb", - "license": "unknown", - "other-types": { - "GstAmrnbEncBandMode": { - "kind": "enum", - "values": - { - "desc": "MR475", - "name": "MR475", - "value": "0" - }, - { - "desc": "MR515", - "name": "MR515", - "value": "1" - }, - { - "desc": "MR59", - "name": "MR59", - "value": "2" - }, - { - "desc": "MR67", - "name": "MR67", - "value": "3" - }, - { - "desc": "MR74", - "name": "MR74", - "value": "4" - }, - { - "desc": "MR795", - "name": "MR795", - "value": "5" - }, - { - "desc": "MR102", - "name": "MR102", - "value": "6" - }, - { - "desc": "MR122", - "name": "MR122", - "value": "7" - }, - { - "desc": "MRDTX", - "name": "MRDTX", - "value": "8" - } - - }, - "GstAmrnbVariant": { - "kind": "enum", - "values": - { - "desc": "IF1", - "name": "IF1", - "value": "0" - }, - { - "desc": "IF2", - "name": "IF2", - "value": "1" - } - - } - }, - "package": "GStreamer Ugly Plug-ins", - "source": "gst-plugins-ugly", - "tracers": {}, - "url": "Unknown package origin" - }, - "amrwbdec": { - "description": "Adaptive Multi-Rate Wide-Band Decoder", - "elements": { - "amrwbdec": { - "author": "Renato Araujo <renato.filho@indt.org.br>", - "description": "Adaptive Multi-Rate Wideband audio decoder", - "hierarchy": - "GstAmrwbDec", - "GstAudioDecoder", - "GstElement", - "GstObject", - "GInitiallyUnowned", - "GObject" - , - "klass": "Codec/Decoder/Audio", - "long-name": "AMR-WB audio decoder", - "pad-templates": { - "sink": { - "caps": "audio/AMR-WB:\n rate: 16000\n channels: 1\n", - "direction": "sink", - "presence": "always" - }, - "src": { - "caps": "audio/x-raw:\n format: S16LE\n layout: interleaved\n rate: 16000\n channels: 1\n", - "direction": "src", - "presence": "always" - } - }, - "properties": {}, - "rank": "primary" - } - }, - "filename": "gstamrwbdec", - "license": "unknown", - "other-types": {}, - "package": "GStreamer Ugly Plug-ins", - "source": "gst-plugins-ugly", - "tracers": {}, - "url": "Unknown package origin" - }, "asf": { "description": "Demuxes and muxes audio and video in Microsofts ASF format", "elements": { @@ -710,46 +507,6 @@ "realmedia": { "description": "RealMedia support plugins", "elements": { - "pnmsrc": { - "author": "Wim Taymans <wim.taymans@gmail.com>", - "description": "Receive data over the network via PNM", - "hierarchy": - "GstPNMSrc", - "GstPushSrc", - "GstBaseSrc", - "GstElement", - "GstObject", - "GInitiallyUnowned", - "GObject" - , - "interfaces": - "GstURIHandler" - , - "klass": "Source/Network", - "long-name": "PNM packet receiver", - "pad-templates": { - "src": { - "caps": "application/vnd.rn-realmedia:\n", - "direction": "src", - "presence": "always" - } - }, - "properties": { - "location": { - "blurb": "Location of the PNM url to read", - "conditionally-available": false, - "construct": false, - "construct-only": false, - "controllable": false, - "default": "NULL", - "mutable": "null", - "readable": true, - "type": "gchararray", - "writable": true - } - }, - "rank": "marginal" - }, "rademux": { "author": "Tim-Philipp Müller <tim centricular net>", "description": "Demultiplex a RealAudio file", @@ -761,7 +518,6 @@ "GObject" , "klass": "Codec/Demuxer", - "long-name": "RealAudio Demuxer", "pad-templates": { "sink": { "caps": "application/x-pn-realaudio:\n", @@ -774,163 +530,7 @@ "presence": "sometimes" } }, - "rank": "secondary", - "signals": {} - }, - "rdtdepay": { - "author": "Lutz Mueller <lutz at topfrose dot de>, Wim Taymans <wim@fluendo.com>", - "description": "Extracts RealMedia from RDT packets", - "hierarchy": - "GstRDTDepay", - "GstElement", - "GstObject", - "GInitiallyUnowned", - "GObject" - , - "klass": "Codec/Depayloader/Network", - "long-name": "RDT packet parser", - "pad-templates": { - "sink": { - "caps": "application/x-rdt:\n media: application\n clock-rate: 1, 2147483647 \n encoding-name: X-REAL-RDT\n", - "direction": "sink", - "presence": "always" - }, - "src": { - "caps": "application/vnd.rn-realmedia:\n", - "direction": "src", - "presence": "always" - } - }, - "rank": "marginal" - }, - "rdtmanager": { - "author": "Wim Taymans <wim.taymans@gmail.com>", - "description": "Accepts raw RTP and RTCP packets and sends them forward", - "hierarchy": - "GstRDTManager", - "GstElement", - "GstObject", - "GInitiallyUnowned", - "GObject" - , - "klass": "Codec/Parser/Network", - "long-name": "RTP Decoder", - "pad-templates": { - "recv_rtcp_sink_%%u": { - "caps": "application/x-rtcp:\n", - "direction": "sink", - "presence": "request" - }, - "recv_rtp_sink_%%u": { - "caps": "application/x-rdt:\n", - "direction": "sink", - "presence": "request" - }, - "recv_rtp_src_%%u_%%u_%%u": { - "caps": "application/x-rdt:\n", - "direction": "src", - "presence": "sometimes" - }, - "rtcp_src_%%u": { - "caps": "application/x-rtcp:\n", - "direction": "src", - "presence": "request" - } - }, - "properties": { - "latency": { - "blurb": "Amount of ms to buffer", - "conditionally-available": false, - "construct": false, - "construct-only": false, - "controllable": false, - "default": "200", - "max": "-1", - "min": "0", - "mutable": "null", - "readable": true, - "type": "guint", - "writable": true - } - }, - "rank": "none", - "signals": { - "clear-pt-map": { - "args": , - "return-type": "void", - "when": "last" - }, - "on-bye-ssrc": { - "args": - { - "name": "arg0", - "type": "guint" - }, - { - "name": "arg1", - "type": "guint" - } - , - "return-type": "void", - "when": "last" - }, - "on-bye-timeout": { - "args": - { - "name": "arg0", - "type": "guint" - }, - { - "name": "arg1", - "type": "guint" - } - , - "return-type": "void", - "when": "last" - }, - "on-npt-stop": { - "args": - { - "name": "arg0", - "type": "guint" - }, - { - "name": "arg1", - "type": "guint" - } - , - "return-type": "void", - "when": "last" - }, - "on-timeout": { - "args": - { - "name": "arg0", - "type": "guint" - }, - { - "name": "arg1", - "type": "guint" - } - , - "return-type": "void", - "when": "last" - }, - "request-pt-map": { - "args": - { - "name": "arg0", - "type": "guint" - }, - { - "name": "arg1", - "type": "guint" - } - , - "return-type": "GstCaps", - "when": "last" - } - } + "rank": "secondary" }, "rmdemux": { "author": "David Schleef <ds@schleef.org>", @@ -943,7 +543,6 @@ "GObject" , "klass": "Codec/Demuxer", - "long-name": "RealMedia Demuxer", "pad-templates": { "audio_%%u": { "caps": "ANY", @@ -961,25 +560,7 @@ "presence": "sometimes" } }, - "rank": "primary", - "signals": {} - }, - "rtspreal": { - "author": "Wim Taymans <wim.taymans@gmail.com>", - "description": "Extends RTSP so that it can handle RealMedia setup", - "hierarchy": - "GstRTSPReal", - "GstElement", - "GstObject", - "GInitiallyUnowned", - "GObject" - , - "interfaces": - "GstRTSPExtension" - , - "klass": "Network/Extension/Protocol", - "long-name": "RealMedia RTSP Extension", - "rank": "marginal" + "rank": "primary" } }, "filename": "gstrealmedia", @@ -1198,7 +779,7 @@ "long-name": "x264 H.264 Encoder", "pad-templates": { "sink": { - "caps": "video/x-raw:\n framerate: 0/1, 2147483647/1 \n width: 1, 2147483647 \n height: 1, 2147483647 \n format: { Y444, Y42B, I420, YV12, NV12, Y444_10LE, I422_10LE, I420_10LE }\n", + "caps": "video/x-raw:\n framerate: 0/1, 2147483647/1 \n width: 1, 2147483647 \n height: 1, 2147483647 \n format: { Y444, Y42B, I420, YV12, NV12, GRAY8, Y444_10LE, I422_10LE, I420_10LE }\n", "direction": "sink", "presence": "always" },
View file
gst-plugins-ugly-1.22.7.tar.xz/docs/meson.build -> gst-plugins-ugly-1.24.5.tar.xz/docs/meson.build
Changed
@@ -95,23 +95,25 @@ print(':'.join(json.load(f).keys()), end='') '''.format(plugins_cache), check: true) -foreach plugin_name: list_plugin_res.stdout().split(':') - plugins_doc += hotdoc.generate_doc(plugin_name, - project_version: api_version, - sitemap: 'sitemap.txt', - index: 'index.md', - gst_index: 'index.md', - gst_smart_index: true, - gst_c_sources: - join_paths(root_rel, 'sys/*/*.ch'), - join_paths(root_rel, 'ext/*/*.ch'), - join_paths(root_rel, 'gst/*/*.ch'), - , - gst_c_source_filters: excludes, - dependencies: gst_dep, - gst_order_generated_subpages: true, - disable_incremental_build: true, - gst_cache_file: plugins_cache, - gst_plugin_name: plugin_name, - ) -endforeach +cdir = meson.current_source_dir() +if host_machine.system() == 'windows' + pathsep = ';' +else + pathsep = ':' +endif +gst_plugins_doc = run_command( + plugins_cache_generator, + 'hotdoc-config', + '--builddir', meson.current_build_dir(), + '--project_version', api_version, + '--sitemap', cdir / 'sitemap.txt', + '--index', cdir / 'index.md', + '--gst_index', cdir / 'index.md', + '--gst_c_sources', + root_rel / 'sys/*/*.ch', + root_rel / 'ext/*/*.ch', + root_rel / 'gst/*/*.ch', + '--gst_c_source_filters', excludes, + '--gst_cache_file', plugins_cache, + check: true, +).stdout().split(pathsep)
View file
gst-plugins-ugly-1.22.7.tar.xz/ext/meson.build -> gst-plugins-ugly-1.24.5.tar.xz/ext/meson.build
Changed
@@ -1,6 +1,4 @@ subdir('a52dec') -subdir('amrnb') -subdir('amrwbdec') subdir('cdio') subdir('dvdread') subdir('mpeg2dec')
View file
gst-plugins-ugly-1.22.7.tar.xz/ext/mpeg2dec/gstmpeg2dec.c -> gst-plugins-ugly-1.24.5.tar.xz/ext/mpeg2dec/gstmpeg2dec.c
Changed
@@ -82,7 +82,7 @@ GstQuery * query); static void gst_mpeg2dec_clear_buffers (GstMpeg2dec * mpeg2dec); -static gboolean gst_mpeg2dec_crop_buffer (GstMpeg2dec * dec, +static GstFlowReturn gst_mpeg2dec_crop_buffer (GstMpeg2dec * dec, GstVideoCodecFrame * in_frame, GstVideoFrame * in_vframe); static void @@ -548,7 +548,7 @@ while ((l = g_list_first (mpeg2dec->buffers))) { GstMpeg2DecBuffer *mbuf = l->data; gst_video_frame_unmap (&mbuf->frame); - g_slice_free (GstMpeg2DecBuffer, mbuf); + g_free (mbuf); mpeg2dec->buffers = g_list_delete_link (mpeg2dec->buffers, l); } } @@ -561,7 +561,7 @@ GST_LOG_OBJECT (mpeg2dec, "Saving local info for frame %d", id); - mbuf = g_slice_new0 (GstMpeg2DecBuffer); + mbuf = g_new0 (GstMpeg2DecBuffer, 1); mbuf->id = id; mbuf->frame = *frame; @@ -585,7 +585,7 @@ if (l) { GstMpeg2DecBuffer *mbuf = l->data; gst_video_frame_unmap (&mbuf->frame); - g_slice_free (GstMpeg2DecBuffer, mbuf); + g_free (mbuf); mpeg2dec->buffers = g_list_delete_link (mpeg2dec->buffers, l); GST_LOG_OBJECT (mpeg2dec, "Discarded local info for frame %d", id); } else {
View file
gst-plugins-ugly-1.22.7.tar.xz/ext/x264/gstx264enc.c -> gst-plugins-ugly-1.24.5.tar.xz/ext/x264/gstx264enc.c
Changed
@@ -113,6 +113,16 @@ GST_DEBUG_CATEGORY_STATIC (x264_enc_debug); #define GST_CAT_DEFAULT x264_enc_debug +enum AllowedSubsamplingFlags +{ + ALLOW_400_8 = 1 << 0, + ALLOW_420_8 = 1 << 1, + ALLOW_420_10 = 1 << 2, + ALLOW_422 = 1 << 4, + ALLOW_444 = 1 << 5, + ALLOW_ANY = 0xffff +}; + struct _GstX264EncVTable { GModule *module; @@ -210,8 +220,7 @@ static gboolean gst_x264_enc_add_x264_chroma_format (GstStructure * s, - gboolean allow_420_8, gboolean allow_420_10, gboolean allow_422, - gboolean allow_444) + enum AllowedSubsamplingFlags flags) { GValue fmts = G_VALUE_INIT; GValue fmt = G_VALUE_INIT; @@ -223,17 +232,20 @@ if (vtable_8bit) { gint chroma_format = *vtable_8bit->x264_chroma_format; - if ((chroma_format == 0 || chroma_format == X264_CSP_I444) && allow_444) { + if ((chroma_format == 0 || chroma_format == X264_CSP_I444) && + flags & ALLOW_444) { g_value_set_string (&fmt, "Y444"); gst_value_list_append_value (&fmts, &fmt); } - if ((chroma_format == 0 || chroma_format == X264_CSP_I422) && allow_422) { + if ((chroma_format == 0 || chroma_format == X264_CSP_I422) && + flags & ALLOW_422) { g_value_set_string (&fmt, "Y42B"); gst_value_list_append_value (&fmts, &fmt); } - if ((chroma_format == 0 || chroma_format == X264_CSP_I420) && allow_420_8) { + if ((chroma_format == 0 || chroma_format == X264_CSP_I420) && + flags & ALLOW_420_8) { g_value_set_string (&fmt, "I420"); gst_value_list_append_value (&fmts, &fmt); g_value_set_string (&fmt, "YV12"); @@ -241,12 +253,19 @@ g_value_set_string (&fmt, "NV12"); gst_value_list_append_value (&fmts, &fmt); } + + if ((chroma_format == 0 || chroma_format == X264_CSP_I400) && + flags & ALLOW_400_8) { + g_value_set_string (&fmt, "GRAY8"); + gst_value_list_append_value (&fmts, &fmt); + } } if (vtable_10bit) { gint chroma_format = *vtable_10bit->x264_chroma_format; - if ((chroma_format == 0 || chroma_format == X264_CSP_I444) && allow_444) { + if ((chroma_format == 0 || chroma_format == X264_CSP_I444) && + flags & ALLOW_444) { if (G_BYTE_ORDER == G_LITTLE_ENDIAN) g_value_set_string (&fmt, "Y444_10LE"); else @@ -255,7 +274,8 @@ gst_value_list_append_value (&fmts, &fmt); } - if ((chroma_format == 0 || chroma_format == X264_CSP_I422) && allow_422) { + if ((chroma_format == 0 || chroma_format == X264_CSP_I422) && + flags & ALLOW_422) { if (G_BYTE_ORDER == G_LITTLE_ENDIAN) g_value_set_string (&fmt, "I422_10LE"); else @@ -264,7 +284,8 @@ gst_value_list_append_value (&fmts, &fmt); } - if ((chroma_format == 0 || chroma_format == X264_CSP_I420) && allow_420_10) { + if ((chroma_format == 0 || chroma_format == X264_CSP_I420) && + flags & ALLOW_420_10) { if (G_BYTE_ORDER == G_LITTLE_ENDIAN) g_value_set_string (&fmt, "I420_10LE"); else @@ -785,20 +806,20 @@ } static void -check_formats (const gchar * str, gboolean * has_420_8, gboolean * has_420_10, - gboolean * has_422, gboolean * has_444) +check_formats (const gchar * str, enum AllowedSubsamplingFlags *flags) { if (g_str_has_prefix (str, "high-4:4:4")) - *has_444 = TRUE; + *flags |= ALLOW_444; else if (g_str_has_prefix (str, "high-4:2:2")) - *has_422 = TRUE; + *flags |= ALLOW_422; else if (g_str_has_prefix (str, "high-10")) - *has_420_10 = TRUE; + *flags |= ALLOW_420_10; + else if (g_str_has_prefix (str, "high")) + *flags |= ALLOW_420_8 | ALLOW_400_8; else - *has_420_8 = TRUE; + *flags |= ALLOW_420_8; } - /* allowed input caps depending on whether libx264 was built for 8 or 10 bits */ static GstCaps * gst_x264_enc_sink_getcaps (GstVideoEncoder * enc, GstCaps * filter) @@ -853,26 +874,20 @@ gst_structure_set_value (s, "chroma-site", val); if ((val = gst_structure_get_value (allowed_s, "profile"))) { - gboolean has_420_8 = FALSE; - gboolean has_420_10 = FALSE; - gboolean has_422 = FALSE; - gboolean has_444 = FALSE; + enum AllowedSubsamplingFlags flags = 0; if (G_VALUE_HOLDS_STRING (val)) { - check_formats (g_value_get_string (val), &has_420_8, &has_420_10, - &has_422, &has_444); + check_formats (g_value_get_string (val), &flags); } else if (GST_VALUE_HOLDS_LIST (val)) { for (k = 0; k < gst_value_list_get_size (val); k++) { const GValue *vlist = gst_value_list_get_value (val, k); if (G_VALUE_HOLDS_STRING (vlist)) - check_formats (g_value_get_string (vlist), &has_420_8, - &has_420_10, &has_422, &has_444); + check_formats (g_value_get_string (vlist), &flags); } } - gst_x264_enc_add_x264_chroma_format (s, has_420_8, has_420_10, has_422, - has_444); + gst_x264_enc_add_x264_chroma_format (s, flags); } filter_caps = gst_caps_merge_structure (filter_caps, s); @@ -1211,7 +1226,7 @@ "height", GST_TYPE_INT_RANGE, 1, G_MAXINT, NULL); gst_x264_enc_add_x264_chroma_format (gst_caps_get_structure - (supported_sinkcaps, 0), TRUE, TRUE, TRUE, TRUE); + (supported_sinkcaps, 0), ALLOW_ANY); sink_templ = gst_pad_template_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, supported_sinkcaps); @@ -1346,7 +1361,7 @@ if (!gst_video_frame_map (&vframe, info, frame->input_buffer, GST_MAP_READ)) return NULL; - fdata = g_slice_new (FrameData); + fdata = g_new (FrameData, 1); fdata->frame = gst_video_codec_frame_ref (frame); fdata->vframe = vframe; @@ -1368,7 +1383,7 @@ gst_video_frame_unmap (&fdata->vframe); gst_video_codec_frame_unref (fdata->frame); - g_slice_free (FrameData, fdata); + g_free (fdata); enc->pending_frames = g_list_delete_link (enc->pending_frames, l); return; @@ -1385,7 +1400,7 @@ gst_video_frame_unmap (&fdata->vframe); gst_video_codec_frame_unref (fdata->frame); - g_slice_free (FrameData, fdata); + g_free (fdata); } g_list_free (enc->pending_frames); enc->pending_frames = NULL; @@ -1517,6 +1532,10 @@ gst_x264_enc_gst_to_x264_video_format (GstVideoFormat format, gint * nplanes) { switch (format) { + case GST_VIDEO_FORMAT_GRAY8: + if (nplanes) + *nplanes = 1; + return X264_CSP_I400; case GST_VIDEO_FORMAT_I420: case GST_VIDEO_FORMAT_YV12: if (nplanes) @@ -2332,7 +2351,13 @@ if (info->finfo->format == old->finfo->format && info->width == old->width && info->height == old->height && info->fps_n == old->fps_n && info->fps_d == old->fps_d - && info->par_n == old->par_n && info->par_d == old->par_d) { + && info->par_n == old->par_n && info->par_d == old->par_d + && info->interlace_mode == old->interlace_mode + && gst_video_colorimetry_is_equal (&info->colorimetry, + &old->colorimetry) + && GST_VIDEO_INFO_CHROMA_SITE (info) == GST_VIDEO_INFO_CHROMA_SITE (old) + && GST_VIDEO_INFO_MULTIVIEW_MODE (info) == + GST_VIDEO_INFO_MULTIVIEW_MODE (old)) { gst_video_codec_state_unref (encoder->input_state); encoder->input_state = gst_video_codec_state_ref (state); return TRUE;
View file
gst-plugins-ugly-1.22.7.tar.xz/ext/x264/meson.build -> gst-plugins-ugly-1.24.5.tar.xz/ext/x264/meson.build
Changed
@@ -8,7 +8,7 @@ 'gstencoderbitrateprofilemanager.c', -x264_dep = dependency('x264', required : x264_opt, +x264_dep = dependency('x264', version : '>=0.156', required : x264_opt, fallback: 'x264', 'libx264_dep') if x264_dep.found()
View file
gst-plugins-ugly-1.22.7.tar.xz/gst-plugins-ugly.doap -> gst-plugins-ugly-1.24.5.tar.xz/gst-plugins-ugly.doap
Changed
@@ -35,71 +35,91 @@ <release> <Version> - <revision>1.22.7</revision> - <branch>1.22</branch> + <revision>1.24.5</revision> + <branch>1.24</branch> <name></name> - <created>2023-11-13</created> - <file-release rdf:resource="https://gstreamer.freedesktop.org/src/gst-plugins-ugly/gst-plugins-ugly-1.22.7.tar.xz" /> + <created>2024-06-20</created> + <file-release rdf:resource="https://gstreamer.freedesktop.org/src/gst-plugins-ugly/gst-plugins-ugly-1.24.5.tar.xz" /> </Version> </release> <release> <Version> - <revision>1.22.6</revision> - <branch>1.22</branch> + <revision>1.24.4</revision> + <branch>1.24</branch> <name></name> - <created>2023-09-20</created> - <file-release rdf:resource="https://gstreamer.freedesktop.org/src/gst-plugins-ugly/gst-plugins-ugly-1.22.6.tar.xz" /> + <created>2024-05-29</created> + <file-release rdf:resource="https://gstreamer.freedesktop.org/src/gst-plugins-ugly/gst-plugins-ugly-1.24.4.tar.xz" /> </Version> </release> <release> <Version> - <revision>1.22.5</revision> - <branch>1.22</branch> + <revision>1.24.3</revision> + <branch>1.24</branch> <name></name> - <created>2023-07-20</created> - <file-release rdf:resource="https://gstreamer.freedesktop.org/src/gst-plugins-ugly/gst-plugins-ugly-1.22.5.tar.xz" /> + <created>2024-04-30</created> + <file-release rdf:resource="https://gstreamer.freedesktop.org/src/gst-plugins-ugly/gst-plugins-ugly-1.24.3.tar.xz" /> </Version> </release> <release> <Version> - <revision>1.22.4</revision> - <branch>1.22</branch> + <revision>1.24.2</revision> + <branch>1.24</branch> <name></name> - <created>2023-06-20</created> - <file-release rdf:resource="https://gstreamer.freedesktop.org/src/gst-plugins-ugly/gst-plugins-ugly-1.22.4.tar.xz" /> + <created>2024-04-09</created> + <file-release rdf:resource="https://gstreamer.freedesktop.org/src/gst-plugins-ugly/gst-plugins-ugly-1.24.2.tar.xz" /> </Version> </release> <release> <Version> - <revision>1.22.3</revision> - <branch>1.22</branch> + <revision>1.24.1</revision> + <branch>1.24</branch> <name></name> - <created>2023-05-19</created> - <file-release rdf:resource="https://gstreamer.freedesktop.org/src/gst-plugins-ugly/gst-plugins-ugly-1.22.3.tar.xz" /> + <created>2024-03-21</created> + <file-release rdf:resource="https://gstreamer.freedesktop.org/src/gst-plugins-ugly/gst-plugins-ugly-1.24.1.tar.xz" /> </Version> </release> <release> <Version> - <revision>1.22.2</revision> - <branch>1.22</branch> + <revision>1.24.0</revision> + <branch>main</branch> + <name></name> + <created>2024-03-04</created> + <file-release rdf:resource="https://gstreamer.freedesktop.org/src/gst-plugins-ugly/gst-plugins-ugly-1.24.0.tar.xz" /> + </Version> + </release> + + <release> + <Version> + <revision>1.23.90</revision> + <branch>main</branch> <name></name> - <created>2023-04-11</created> - <file-release rdf:resource="https://gstreamer.freedesktop.org/src/gst-plugins-ugly/gst-plugins-ugly-1.22.2.tar.xz" /> + <created>2024-02-23</created> + <file-release rdf:resource="https://gstreamer.freedesktop.org/src/gst-plugins-ugly/gst-plugins-ugly-1.23.90.tar.xz" /> </Version> </release> <release> <Version> - <revision>1.22.1</revision> - <branch>1.22</branch> + <revision>1.23.2</revision> + <branch>main</branch> + <name></name> + <created>2024-02-15</created> + <file-release rdf:resource="https://gstreamer.freedesktop.org/src/gst-plugins-ugly/gst-plugins-ugly-1.23.2.tar.xz" /> + </Version> + </release> + + <release> + <Version> + <revision>1.23.1</revision> + <branch>main</branch> <name></name> - <created>2023-03-04</created> - <file-release rdf:resource="https://gstreamer.freedesktop.org/src/gst-plugins-ugly/gst-plugins-ugly-1.22.1.tar.xz" /> + <created>2024-02-06</created> + <file-release rdf:resource="https://gstreamer.freedesktop.org/src/gst-plugins-ugly/gst-plugins-ugly-1.23.1.tar.xz" /> </Version> </release>
View file
gst-plugins-ugly-1.22.7.tar.xz/gst/asfdemux/gstasfdemux.c -> gst-plugins-ugly-1.24.5.tar.xz/gst/asfdemux/gstasfdemux.c
Changed
@@ -3042,7 +3042,7 @@ flags = gst_asf_demux_get_uint16 (&data, &size); stream_id = flags & 0x7f; - is_encrypted = ! !(flags & 0x8000); + is_encrypted = !!(flags & 0x8000); unknown = gst_asf_demux_get_uint32 (&data, &size); GST_DEBUG_OBJECT (demux, "Found stream %u, time_offset=%" GST_TIME_FORMAT, @@ -3759,8 +3759,8 @@ max_pktsize = gst_asf_demux_get_uint32 (&data, &size); min_bitrate = gst_asf_demux_get_uint32 (&data, &size); - demux->broadcast = ! !(flags & 0x01); - demux->seekable = ! !(flags & 0x02); + demux->broadcast = !!(flags & 0x01); + demux->seekable = !!(flags & 0x02); GST_DEBUG_OBJECT (demux, "min_pktsize = %u", min_pktsize); GST_DEBUG_OBJECT (demux, "flags::broadcast = %d", demux->broadcast);
View file
gst-plugins-ugly-1.22.7.tar.xz/gst/asfdemux/gstrtpasfdepay.c -> gst-plugins-ugly-1.24.5.tar.xz/gst/asfdemux/gstrtpasfdepay.c
Changed
@@ -104,6 +104,9 @@ static void gst_rtp_asf_depay_init (GstRtpAsfDepay * depay) { + gst_rtp_base_depayload_set_aggregate_hdrext_enabled (GST_RTP_BASE_DEPAYLOAD + (depay), TRUE); + depay->adapter = gst_adapter_new (); } @@ -335,6 +338,7 @@ GstRtpAsfDepay *depay; const guint8 *payload; GstBuffer *outbuf; + GstBufferList *outbufs = NULL; gboolean S, L, R, D, I; guint payload_len, hdr_len, offset; guint len_offs; @@ -359,6 +363,7 @@ GST_LOG_OBJECT (depay, "got payload len of %u", payload_len); + outbufs = gst_buffer_list_new (); do { guint packet_len; @@ -473,9 +478,12 @@ gst_rtp_buffer_get_payload_subbuffer (&rtpbuf, offset, packet_len); } - /* If we haven't completed a full ASF packet, return */ - if (!outbuf) + /* If we haven't completed a full ASF packet, return but first + push what we have so far */ + if (!outbuf) { + gst_rtp_base_depayload_push_list (depayload, outbufs); return NULL; + } outbuf = gst_rtp_asf_depay_update_padding (depay, outbuf); @@ -490,7 +498,7 @@ GST_BUFFER_TIMESTAMP (outbuf) = timestamp; - gst_rtp_base_depayload_push (depayload, outbuf); + gst_buffer_list_add (outbufs, outbuf); /* only apply the timestamp to the first buffer of this packet */ timestamp = -1; @@ -501,6 +509,8 @@ payload_len -= packet_len; } while (payload_len > 0); + gst_rtp_base_depayload_push_list (depayload, outbufs); + gst_rtp_buffer_unmap (&rtpbuf); return NULL; @@ -511,6 +521,12 @@ gst_rtp_buffer_unmap (&rtpbuf); GST_WARNING_OBJECT (depayload, "Payload too small, expected at least 4 " "bytes for header, but got only %d bytes", payload_len); + if (gst_buffer_list_length (outbufs) == 0) { + gst_rtp_base_depayload_dropped (depayload); + gst_buffer_list_unref (outbufs); + } else { + gst_rtp_base_depayload_push_list (depayload, outbufs); + } return NULL; } }
View file
gst-plugins-ugly-1.22.7.tar.xz/gst/realmedia/meson.build -> gst-plugins-ugly-1.24.5.tar.xz/gst/realmedia/meson.build
Changed
@@ -2,14 +2,6 @@ 'rademux.c', 'rmdemux.c', 'rmutils.c', - 'rdtdepay.c', - 'rdtmanager.c', - 'rtspreal.c', - 'realhash.c', - 'asmrules.c', - 'rdtjitterbuffer.c', - 'gstrdtbuffer.c', - 'pnmsrc.c', 'realmedia.c'
View file
gst-plugins-ugly-1.22.7.tar.xz/gst/realmedia/realmedia.c -> gst-plugins-ugly-1.24.5.tar.xz/gst/realmedia/realmedia.c
Changed
@@ -23,10 +23,6 @@ #include "rmdemux.h" #include "rademux.h" -#include "rdtdepay.h" -#include "rdtmanager.h" -#include "rtspreal.h" -#include "pnmsrc.h" static gboolean plugin_init (GstPlugin * plugin) @@ -35,10 +31,6 @@ ret |= GST_ELEMENT_REGISTER (rmdemux, plugin); ret |= GST_ELEMENT_REGISTER (rademux, plugin); - ret |= GST_ELEMENT_REGISTER (rdtdepay, plugin); - ret |= GST_ELEMENT_REGISTER (rdtmanager, plugin); - ret |= GST_ELEMENT_REGISTER (rtspreal, plugin); - ret |= GST_ELEMENT_REGISTER (pnmsrc, plugin); return ret; }
View file
gst-plugins-ugly-1.22.7.tar.xz/meson.build -> gst-plugins-ugly-1.24.5.tar.xz/meson.build
Changed
@@ -1,6 +1,6 @@ project('gst-plugins-ugly', 'c', - version : '1.22.7', - meson_version : '>= 0.62', + version : '1.24.5', + meson_version : '>= 1.1', default_options : 'warning_level=1', 'buildtype=debugoptimized' ) @@ -19,7 +19,7 @@ have_cxx = add_languages('cpp', native: false, required: false) -glib_req = '>= 2.62.0' +glib_req = '>= 2.64.0' if gst_version_is_stable gst_req = '>= @0@.@1@.0'.format(gst_version_major, gst_version_minor) @@ -66,8 +66,6 @@ '/we4053', # one void operand for '?:' '/we4062', # enumerator 'identifier' in switch of enum 'enumeration' is not handled '/we4098', # 'function' : void function returning a value - '/we4101', # 'identifier' : unreferenced local variable - '/we4189', # 'identifier' : local variable is initialized but not referenced ) endif if have_cxx @@ -220,13 +218,28 @@ if gst_debug_disabled message('GStreamer debug system is disabled') - if cc.has_argument('-Wno-unused') - add_project_arguments('-Wno-unused', language: 'c') - endif - if have_cxx and cxx.has_argument ('-Wno-unused') - add_project_arguments('-Wno-unused', language: 'cpp') + if cc.get_argument_syntax() == 'msvc' + msvc_args = cc.get_supported_arguments( + '/wd4101', # 'identifier' : unreferenced local variable + '/wd4189', # 'identifier' : local variable is initialized but not referenced + ) + add_project_arguments(msvc_args, language: 'c', 'cpp') + else + if cc.has_argument('-Wno-unused') + add_project_arguments('-Wno-unused', language: 'c') + endif + if have_cxx and cxx.has_argument ('-Wno-unused') + add_project_arguments('-Wno-unused', language: 'cpp') + endif endif else + if cc.get_argument_syntax() == 'msvc' and gst_version_is_dev + msvc_args = cc.get_supported_arguments( + '/we4101', # 'identifier' : unreferenced local variable + '/we4189', # 'identifier' : local variable is initialized but not referenced + ) + add_project_arguments(msvc_args, language: 'c', 'cpp') + endif message('GStreamer debug system is enabled') endif @@ -329,7 +342,7 @@ configure_file(output : 'config.h', configuration : cdata) -meson.add_dist_script('scripts/gen-changelog.py', meson.project_name(), '1.20.0', meson.project_version()) +meson.add_dist_script('scripts/gen-changelog.py', meson.project_name(), '1.22.0', meson.project_version()) plugin_names = gst_plugins =
View file
gst-plugins-ugly-1.22.7.tar.xz/meson_options.txt -> gst-plugins-ugly-1.24.5.tar.xz/meson_options.txt
Changed
@@ -9,8 +9,6 @@ # Feature options for plugins that need external deps option('a52dec', type : 'feature', value : 'auto', description : 'Dolby Digital (AC-3) audio decoder plugin based on liba52 (GPL - only built if gpl option is also enabled!)') -option('amrnb', type : 'feature', value : 'auto', description : 'Adaptive Multi-Rate Narrow-Band audio codec plugin') -option('amrwbdec', type : 'feature', value : 'auto', description : 'Adaptive Multi-Rate Wide-Band audio decoder plugin') option('cdio', type : 'feature', value : 'auto', description : 'CD audio source plugin based on libcdio (GPL - only built if gpl option is also enabled!)') option('dvdread', type : 'feature', value : 'auto', description : 'DVD video source plugin based on libdvdread (GPL - only built if gpl option is also enabled!)') option('mpeg2dec', type : 'feature', value : 'auto', description : 'MPEG 2 video decoder plugin based on libmpeg2 (GPL - only built if gpl option is also enabled!)')
View file
gst-plugins-ugly-1.22.7.tar.xz/po/gst-plugins-ugly-1.0.pot -> gst-plugins-ugly-1.24.5.tar.xz/po/gst-plugins-ugly-1.0.pot
Changed
@@ -6,9 +6,9 @@ #, fuzzy msgid "" msgstr "" -"Project-Id-Version: gst-plugins-ugly-1.22.7\n" +"Project-Id-Version: gst-plugins-ugly-1.24.5\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-11-13 11:08+0000\n" +"POT-Creation-Date: 2024-06-20 12:55+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
View file
gst-plugins-ugly-1.22.7.tar.xz/po/gst-plugins-ugly.pot -> gst-plugins-ugly-1.24.5.tar.xz/po/gst-plugins-ugly.pot
Changed
@@ -6,9 +6,9 @@ #, fuzzy msgid "" msgstr "" -"Project-Id-Version: gst-plugins-ugly-1.22.7\n" +"Project-Id-Version: gst-plugins-ugly-1.24.5\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-11-13 11:08+0000\n" +"POT-Creation-Date: 2024-06-20 12:55+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
View file
gst-plugins-ugly-1.22.7.tar.xz/po/lv.po -> gst-plugins-ugly-1.24.5.tar.xz/po/lv.po
Changed
@@ -3,50 +3,50 @@ # Arvis Lācis <arvis.lacis@inbox.lv>, 2009. # Rihards Prieditis <rprieditis@gmail.com>, 2011. # Rūdolfs Mazurs <rudolfs.mazurs@gmail.com>, 2014. +# Rihards Prieditis <rprieditis@gmail.com>, 2023. msgid "" msgstr "" -"Project-Id-Version: gst-plugins-ugly 1.2.1\n" +"Project-Id-Version: gst-plugins-ugly 1.21.90\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-10-25 01:02+0100\n" -"PO-Revision-Date: 2014-04-20 16:24+0300\n" -"Last-Translator: Rihards Prieditis <rprieditis@gmail.com>\n" +"POT-Creation-Date: 2023-01-13 19:11+0000\n" +"PO-Revision-Date: 2023-12-24 15:38+0000\n" +"Last-Translator: Rihards Priedītis <rprieditis@gmail.com>\n" "Language-Team: Latvian <translation-team-lv@lists.sourceforge.net>\n" "Language: lv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==0 || (n%100>=11 && n%100<=19) ? 0 : " +"n%10==1 && n%100!=11 ? 1 : 2);\n" "X-Bugs: Report translation errors to the Language-Team address.\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : " -"2);\n" -"X-Generator: Lokalize 1.5\n" +"X-Generator: Poedit 3.4.2\n" msgid "Could not read from CD." -msgstr "Nevarēja nolasīt no CD." +msgstr "Nevar nolasīt no CD." msgid "Could not open CD device for reading." -msgstr "Nevarēja atvērt CD ierīci lasīšanai." +msgstr "Nevar atvērt CD ierīci lasīšanai." msgid "Disc is not an Audio CD." msgstr "Disks nav Audio CD." msgid "Could not open DVD" -msgstr "Nevarēja atvērt DVD" +msgstr "Nevar atvērt DVD" #, c-format msgid "Could not open DVD title %d" -msgstr "Nevarēja atvērt DVD nosaukumu %d" +msgstr "Nevar atvērt DVD sadaļu %d" #, c-format msgid "Failed to go to chapter %d of DVD title %d" -msgstr "Neizdevās pāriet uz %d nodaļu DVD nosaukumā %d" +msgstr "Neizdevās pāriet uz %d nodaļu DVD sadaļā %d" #, c-format msgid "" "Could not open DVD title %d. Interactive titles are not supported by this " "element" msgstr "" -"Nevarēja atvērt DVD nosaukumu %d. Šis elements nenodrošina interaktīvos " -"nosaukumus." +"Nevar atvērt DVD sadaļu %d. Šis elements neatbalsta interaktīvus nosaukumus" msgid "" "Could not read DVD. This may be because the DVD is encrypted and a DVD " @@ -56,10 +56,10 @@ "bibliotēka nav instalēta." msgid "Could not read DVD." -msgstr "Nevarēja nolasīt DVD." +msgstr "Nevar nolasīt DVD." msgid "This stream contains no data." -msgstr "Šī straume nesatur datus." +msgstr "Šajā plūsmā nav datu." #~ msgid "" #~ "Failed to configure LAME mp3 audio encoder. Check your encoding " @@ -68,7 +68,6 @@ #~ "Neizdevās konfigurēt LAME mp3 audio kodētāju. Pārbaudiet savus kodēšanas " #~ "parametrus." -#, c-format #~ msgid "" #~ "The requested bitrate %d kbit/s for property '%s' is not allowed. The " #~ "bitrate was changed to %d kbit/s."
View file
gst-plugins-ugly-1.22.7.tar.xz/scripts/gen-changelog.py -> gst-plugins-ugly-1.24.5.tar.xz/scripts/gen-changelog.py
Changed
@@ -29,7 +29,6 @@ 'gst-editing-services': 'ee8bf88ebf131cf7c7161356540efc20bf411e14', 'gst-python': 'b3e564eff577e2f577d795051bbcca85d47c89dc', 'gstreamer-vaapi': 'c89e9afc5d43837c498a55f8f13ddf235442b83b', - 'gst-omx': 'd2463b017f222e678978582544a9c9a80edfd330', 'gst-devtools': 'da962d096af9460502843e41b7d25fdece7ff1c2', 'gstreamer-sharp': 'b94528f8e7979df49fedf137dfa228d8fe475e1b', }
View file
gst-plugins-ugly-1.22.7.tar.xz/tests/check/elements/x264enc.c -> gst-plugins-ugly-1.24.5.tar.xz/tests/check/elements/x264enc.c
Changed
@@ -148,6 +148,11 @@ fail_unless (!strcmp (caps_profile, profile)); } +static const GstVideoFormat formats_420_8_and_400_8 = + { GST_VIDEO_FORMAT_I420, GST_VIDEO_FORMAT_YV12, GST_VIDEO_FORMAT_NV12, + GST_VIDEO_FORMAT_GRAY8, GST_VIDEO_FORMAT_UNKNOWN +}; + static const GstVideoFormat formats_420_8 = { GST_VIDEO_FORMAT_I420, GST_VIDEO_FORMAT_YV12, GST_VIDEO_FORMAT_NV12, GST_VIDEO_FORMAT_UNKNOWN @@ -358,8 +363,8 @@ { gint i; - for (i = 0; formats_420_8i != GST_VIDEO_FORMAT_UNKNOWN; i++) - test_video_profile ("high", 0x64, formats_420_8, i); + for (i = 0; formats_420_8_and_400_8i != GST_VIDEO_FORMAT_UNKNOWN; i++) + test_video_profile ("high", 0x64, formats_420_8_and_400_8, i); } GST_END_TEST;
View file
gst-plugins-ugly-1.22.7.tar.xz/tests/check/gst-plugins-ugly.supp -> gst-plugins-ugly-1.24.5.tar.xz/tests/check/gst-plugins-ugly.supp
Changed
@@ -1,190 +0,0 @@ -### amrnb suppressions -### these should/could be submitted to amrnb - -{ - <amrnb> - Memcheck:Cond - fun:Encoder_Interface_Encode - fun:gst_amrnbenc_chain - fun:gst_pad_chain - fun:gst_pad_push -} - -{ - <amrnb> - Memcheck:Cond - fun:Speech_Encode_Frame - fun:Encoder_Interface_Encode - fun:gst_amrnbenc_chain - fun:gst_pad_chain - fun:gst_pad_push -} - -{ - <amrnb> - Memcheck:Cond - obj:/usr/lib/libamrnb.so* - fun:Speech_Encode_Frame - fun:Encoder_Interface_Encode - fun:gst_amrnbenc_chain - fun:gst_pad_chain - fun:gst_pad_push -} - -{ - <amrnb> - Memcheck:Cond - obj:/usr/lib/libamrnb.so* - obj:/usr/lib/libamrnb.so* - fun:Speech_Encode_Frame - fun:Encoder_Interface_Encode - fun:gst_amrnbenc_chain - fun:gst_pad_chain - fun:gst_pad_push -} - -{ - <amrnb> - Memcheck:Cond - obj:/usr/lib/libamrnb.so* - obj:/usr/lib/libamrnb.so* - obj:/usr/lib/libamrnb.so* - fun:Speech_Encode_Frame - fun:Encoder_Interface_Encode - fun:gst_amrnbenc_chain - fun:gst_pad_chain - fun:gst_pad_push -} - -{ - <amrnb acos> - Memcheck:Cond - fun:acos - obj:/usr/lib/libamrnb.so* - obj:/usr/lib/libamrnb.so* - fun:Speech_Encode_Frame - fun:Encoder_Interface_Encode - fun:gst_amrnbenc_chain - fun:gst_pad_chain - fun:gst_pad_push -} - -{ - <AMR encoder> - Memcheck:Cond - fun:Levinson - fun:Speech_Encode_Frame - fun:Encoder_Interface_Encode -} - -{ - <AMR encoder> - Memcheck:Cond - fun:Az_lsp - fun:Speech_Encode_Frame - fun:Encoder_Interface_Encode -} - -{ - <AMR encoder> - Memcheck:Cond - fun:acos - fun:Lsp_lsf - fun:Speech_Encode_Frame - fun:Encoder_Interface_Encode -} - -{ - <AMR encoder> - Memcheck:Cond - fun:Lsf_wt - fun:Speech_Encode_Frame - fun:Encoder_Interface_Encode -} -{ - <AMR encoder> - Memcheck:Cond - fun:Vq_subvec - fun:Speech_Encode_Frame - fun:Encoder_Interface_Encode -} - -{ - <AMR encoder> - Memcheck:Cond - fun:Lag_max - fun:Pitch_ol - fun:ol_ltp - fun:Speech_Encode_Frame - fun:Encoder_Interface_Encode -} - -{ - <AMR encoder> - Memcheck:Cond - fun:Pitch_ol - fun:ol_ltp - fun:Speech_Encode_Frame - fun:Encoder_Interface_Encode -} - -{ - <AMR encoder> - Memcheck:Cond - fun:cl_ltp - fun:Speech_Encode_Frame - fun:Encoder_Interface_Encode -} - -{ - <AMR encoder> - Memcheck:Cond - fun:searchFrac - fun:cl_ltp - fun:Speech_Encode_Frame - fun:Encoder_Interface_Encode -} - -{ - <AMR encoder> - Memcheck:Cond - fun:q_gain_pitch - fun:cl_ltp - fun:Speech_Encode_Frame - fun:Encoder_Interface_Encode -} - -{ - <AMR encoder> - Memcheck:Cond - fun:set_sign12k2 - fun:code_10i40_35bits - fun:cbsearch - fun:Speech_Encode_Frame - fun:Encoder_Interface_Encode -} - -{ - <AMR encoder> - Memcheck:Cond - fun:code_10i40_35bits - fun:cbsearch - fun:Speech_Encode_Frame - fun:Encoder_Interface_Encode -} - -{ - <AMR encoder> - Memcheck:Cond - fun:gainQuant - fun:Speech_Encode_Frame - fun:Encoder_Interface_Encode -} - -{ - <AMR encoder on FC4> - Memcheck:Value2 - obj:/usr/lib/libamrnb.so.0.0.0 - fun:Speech_Encode_Frame - fun:Encoder_Interface_Encode -}
View file
gst-plugins-ugly-1.22.7.tar.xz/tests/check/meson.build -> gst-plugins-ugly-1.24.5.tar.xz/tests/check/meson.build
Changed
@@ -7,16 +7,16 @@ # FIXME: unistd dependency or not tested yet on windows if host_machine.system() != 'windows' ugly_tests += - 'elements/amrnbenc', not amrnb_dep.found() , 'elements/mpeg2dec', not mpeg2_dep.found() or not cdata.has('HAVE_UNISTD_H'), gstvideo_dep , endif +fsmod = import('fs') test_defines = '-UG_DISABLE_ASSERT', '-UG_DISABLE_CAST_CHECKS', '-DGST_CHECK_TEST_ENVIRONMENT_BEACON="GST_PLUGIN_LOADING_WHITELIST"', - '-DGST_TEST_FILES_PATH="' + meson.current_source_dir() + '/../files"', + '-DGST_TEST_FILES_PATH="' + fsmod.as_posix(meson.current_source_dir()) + '/../files"', '-DGST_USE_UNSTABLE_API',
View file
gst-plugins-ugly-1.22.7.tar.xz/tests/meson.build -> gst-plugins-ugly-1.24.5.tar.xz/tests/meson.build
Changed
@@ -1,3 +1,7 @@ -if not get_option('tests').disabled() and gstcheck_dep.found() +if get_option('tests').disabled() or static_build + subdir_done() +endif + +if gstcheck_dep.found() subdir('check') endif
Locations
Projects
Search
Status Monitor
Help
Open Build Service
OBS Manuals
API Documentation
OBS Portal
Reporting a Bug
Contact
Mailing List
Forums
Chat (IRC)
Twitter
Open Build Service (OBS)
is an
openSUSE project
.