Skip to content
Commits on Source (25)
......@@ -170,6 +170,11 @@ manual_traits = ["BaseSrcExtManual"]
# Use Result
ignore = true
[[object.function]]
name = "new_segment"
# Segment parameter
ignore = true
[[object]]
name = "GstBase.BaseTransform"
status = "generate"
......@@ -191,6 +196,16 @@ manual_traits = ["AggregatorExtManual"]
# Takes ownership
ignore = true
[[object.function]]
name = "finish_buffer_list"
# Takes ownership
ignore = true
[[object.function]]
name = "selected_samples"
# Info parameter
ignore = true
[[object.property]]
name = "latency"
version = "1.14"
......
......@@ -20,7 +20,6 @@ external_libraries = [
generate = [
"GstVideo.VideoCodecFrameFlags",
"GstVideo.VideoFormatFlags",
"GstVideo.VideoTileMode",
"GstVideo.VideoColorMatrix",
"GstVideo.VideoMultiviewMode",
"GstVideo.VideoFieldOrder",
......@@ -383,6 +382,14 @@ status = "generate"
name = "y412_le"
version = "1.18"
[[object.member]]
name = "nv12_4l4"
version = "1.18"
[[object.member]]
name = "nv12_32l32"
version = "1.18"
[[object]]
name = "GstVideo.VideoSink"
status = "generate"
......@@ -492,6 +499,9 @@ status = "generate"
[[object.member]]
name = "arib_std_b67"
version = "1.18"
[[object.member]]
name = "bt601"
version = "1.18"
[[object]]
name = "GstVideo.VideoColorPrimaries"
......@@ -508,3 +518,10 @@ status = "generate"
[[object.member]]
name = "ebu3213"
version = "1.16"
[[object]]
name = "GstVideo.VideoTileMode"
status = "generate"
[[object.member]]
name = "linear"
version = "1.18"
variables:
GST_RS_IMG_TAG: '2020-07-05.0'
GST_RS_IMG_TAG: '2020-09-08.0-0.16'
pip3 install meson==0.54.3
set -e
pip3 install meson==0.55.1
git clone --depth 1 https://gitlab.freedesktop.org/gstreamer/gst-build.git --branch master
cd gst-build
......
source ./ci/env.sh
set -e
export CARGO_HOME='/usr/local/cargo'
RUSTUP_VERSION=1.21.1
RUST_VERSION=$1
RUST_ARCH="x86_64-unknown-linux-gnu"
if [ "$RUST_VERSION" = "stable" ]; then
RUST_VERSION="1.44.1"
fi
RUSTUP_URL=https://static.rust-lang.org/rustup/archive/$RUSTUP_VERSION/$RUST_ARCH/rustup-init
wget $RUSTUP_URL
......@@ -17,9 +23,9 @@ rustup --version
cargo --version
rustc --version
if [ "$RUST_VERSION" = "stable" ]; then
rustup component add clippy-preview
rustup component add rustfmt
if [ "$RUST_VERSION" = "1.44.1" ]; then
rustup component add clippy-preview --toolchain $RUST_VERSION
rustup component add rustfmt --toolchain $RUST_VERSION
cargo install --force cargo-deny
cargo install --force --git https://github.com/kbknapp/cargo-outdated
cargo install --force cargo-outdated
fi
......@@ -19,7 +19,7 @@ gstreamer-editing-services = { version = "0.16", path = "../gstreamer-editing-se
gstreamer-sdp = { version = "0.16", path = "../gstreamer-sdp", optional = true }
gstreamer-rtsp = { version = "0.16", path = "../gstreamer-rtsp", optional = true }
gstreamer-rtsp-server = { version = "0.16", path = "../gstreamer-rtsp-server", optional = true }
gstreamer-rtsp-server-sys = { version = "0.9", features = ["v1_8"], optional = true }
gstreamer-rtsp-server-sys = { version = "0.9", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs-sys.git", rev = "0.9", features = ["v1_8"], optional = true }
gtk = { version = "0.9", optional = true }
gdk = { version = "0.13", optional = true }
gio = { version = "0.9", optional = true }
......
......@@ -84,7 +84,7 @@ fn create_ui(app: &gtk::Application) {
// the underlying pipeline, and display it in our gui.
// Since this closure is called by the mainloop thread, we are allowed
// to modify the gui widgets here.
let timeout_id = gtk::timeout_add(500, move || {
let timeout_id = glib::timeout_add_local(500, move || {
// Here we temporarily retrieve a strong reference on the pipeline from the weak one
// we moved into this callback.
let pipeline = match pipeline_weak.upgrade() {
......
......@@ -195,7 +195,7 @@ fn create_ui(app: &gtk::Application) {
// the underlying pipeline, and display it in our gui.
// Since this closure is called by the mainloop thread, we are allowed
// to modify the gui widgets here.
let timeout_id = gtk::timeout_add(500, move || {
let timeout_id = glib::timeout_add_local(500, move || {
// Here we temporarily retrieve a strong reference on the pipeline from the weak one
// we moved into this callback.
let pipeline = match pipeline_weak.upgrade() {
......
#!/usr/bin/env python
#!/usr/bin/env python3
from os import listdir
from os.path import isfile, join
......
......@@ -949,7 +949,7 @@ be created by clips.</doc-deprecated>
<type name="utf8" c:type="gchar*"/>
</field>
<field name="priv" readable="0" private="1">
<type name="AudioUriSourcePrivate" c:type="GESAudioUriSourcePrivate*"/>
<type name="UriSource" c:type="GESUriSource*"/>
</field>
<field name="_ges_reserved" readable="0" private="1">
<array zero-terminated="0" fixed-size="4">
......@@ -6742,7 +6742,7 @@ after calling this.
</parameters>
</method>
<method name="set_render_settings" c:identifier="ges_pipeline_set_render_settings">
<doc xml:space="preserve">Specifies the encoding to be used by the pipeline to render its
<doc xml:space="preserve">Specifies encoding setting to be used by the pipeline to render its
#GESPipeline:timeline, and where the result should be written to.
 
This method **must** be called before setting the pipeline mode to
......@@ -6874,7 +6874,9 @@ forced decoding (the underlying #encodebin has its
<member name="smart_render" value="8" c:identifier="GES_PIPELINE_MODE_SMART_RENDER" glib:nick="smart_render">
<doc xml:space="preserve">Render the #GESPipeline:timeline,
avoiding decoding/reencoding (the underlying #encodebin has its
#encodebin:avoid-reencoding property set to %TRUE)</doc>
#encodebin:avoid-reencoding property set to %TRUE).
&gt; NOTE: Smart rendering can not work in tracks where #GESTrack:mixing
&gt; is enabled.</doc>
</member>
</bitfield>
<record name="PipelinePrivate" c:type="GESPipelinePrivate" disguised="1">
......@@ -6905,6 +6907,7 @@ is really not in good shape and is deprecated.</doc>
</field>
</class>
<record name="PitiviFormatterClass" c:type="GESPitiviFormatterClass" glib:is-gtype-struct-for="PitiviFormatter">
<attribute name="doc.skip" value="true"/>
<field name="parent_class" readable="0" private="1">
<type name="FormatterClass" c:type="GESFormatterClass"/>
......@@ -9547,6 +9550,25 @@ layers were created for the timeline.</doc>
</parameter>
</parameters>
</glib:signal>
<glib:signal name="select-element-track" when="last" version="1.18">
<doc xml:space="preserve">Simplified version of #GESTimeline::select-tracks-for-object which only
allows @track_element to be added to a single #GESTrack.</doc>
<return-value transfer-ownership="full">
<doc xml:space="preserve">A track to put @track_element into, or %NULL if
it should be discarded.</doc>
<type name="Track"/>
</return-value>
<parameters>
<parameter name="clip" transfer-ownership="none">
<doc xml:space="preserve">The clip that @track_element is being added to</doc>
<type name="Clip"/>
</parameter>
<parameter name="track_element" transfer-ownership="none">
<doc xml:space="preserve">The element being added</doc>
<type name="TrackElement"/>
</parameter>
</parameters>
</glib:signal>
<glib:signal name="select-tracks-for-object" when="last">
<doc xml:space="preserve">This will be emitted whenever the timeline needs to determine which
tracks a clip's children should be added to. The track element will
......@@ -12915,7 +12937,10 @@ function already set appropriately.</doc>
</parameters>
</method>
<method name="set_restriction_caps" c:identifier="ges_track_set_restriction_caps">
<doc xml:space="preserve">Sets the #GESTrack:restriction-caps for the track.</doc>
<doc xml:space="preserve">Sets the #GESTrack:restriction-caps for the track.
&gt; **NOTE**: Restriction caps are **not** taken into account when
&gt; using #GESPipeline:mode=#GES_PIPELINE_MODE_SMART_RENDER.</doc>
<return-value transfer-ownership="none">
<type name="none" c:type="void"/>
......@@ -14869,6 +14894,10 @@ are different as those can be extended 'infinitely'.</doc>
</record>
<record name="UriClipPrivate" c:type="GESUriClipPrivate" disguised="1">
</record>
<record name="UriSource" c:type="GESUriSource" disguised="1">
<attribute name="doc.skip" value="true"/>
</record>
<class name="UriSourceAsset" c:symbol-prefix="uri_source_asset" c:type="GESUriSourceAsset" parent="TrackElementAsset" glib:type-name="GESUriSourceAsset" glib:get-type="ges_uri_source_asset_get_type" glib:type-struct="UriSourceAssetClass">
<doc xml:space="preserve">Asset to create a stream specific #GESSource for a media file.
......@@ -14959,6 +14988,22 @@ contains one frame)</doc>
<record name="UriSourceAssetPrivate" c:type="GESUriSourceAssetPrivate" disguised="1">
</record>
<constant name="VERSION_MAJOR" value="1" c:type="GES_VERSION_MAJOR">
<type name="gint" c:type="gint"/>
</constant>
<constant name="VERSION_MICRO" value="0" c:type="GES_VERSION_MICRO">
<type name="gint" c:type="gint"/>
</constant>
<constant name="VERSION_MINOR" value="18" c:type="GES_VERSION_MINOR">
<type name="gint" c:type="gint"/>
</constant>
<constant name="VERSION_NANO" value="0" c:type="GES_VERSION_NANO">
<type name="gint" c:type="gint"/>
</constant>
<class name="VideoSource" c:symbol-prefix="video_source" c:type="GESVideoSource" parent="Source" abstract="1" glib:type-name="GESVideoSource" glib:get-type="ges_video_source_get_type" glib:type-struct="VideoSourceClass">
<doc xml:space="preserve">Base class for video sources</doc>
......@@ -15665,7 +15710,7 @@ for later use.</doc>
<type name="utf8" c:type="gchar*"/>
</field>
<field name="priv" readable="0" private="1">
<type name="VideoUriSourcePrivate" c:type="GESVideoUriSourcePrivate*"/>
<type name="UriSource" c:type="GESUriSource*"/>
</field>
<field name="_ges_reserved" readable="0" private="1">
<array zero-terminated="0" fixed-size="4">
......
......@@ -12081,7 +12081,11 @@ when devices are added or removed from the system.
Since the #GstDeviceProvider is a singleton,
gst_device_provider_start() may already have been called by another
user of the object, gst_device_provider_stop() needs to be called the same
number of times.</doc>
number of times.
After this function has been called, gst_device_provider_get_devices() will
return the same objects that have been received from the
#GST_MESSAGE_DEVICE_ADDED messages and will no longer probe.</doc>
<return-value transfer-ownership="none">
<doc xml:space="preserve">%TRUE if the device providering could be started</doc>
......@@ -12203,7 +12207,10 @@ This is for use by subclasses.</doc>
</method>
<method name="get_devices" c:identifier="gst_device_provider_get_devices" version="1.4">
<doc xml:space="preserve">Gets a list of devices that this provider understands. This may actually
probe the hardware if the provider is not currently started.</doc>
probe the hardware if the provider is not currently started.
If the provider has been started, this will returned the same #GstDevice
objedcts that have been returned by the #GST_MESSAGE_DEVICE_ADDED messages.</doc>
<return-value transfer-ownership="full">
<doc xml:space="preserve">a #GList of
......@@ -12300,7 +12307,11 @@ when devices are added or removed from the system.
Since the #GstDeviceProvider is a singleton,
gst_device_provider_start() may already have been called by another
user of the object, gst_device_provider_stop() needs to be called the same
number of times.</doc>
number of times.
After this function has been called, gst_device_provider_get_devices() will
return the same objects that have been received from the
#GST_MESSAGE_DEVICE_ADDED messages and will no longer probe.</doc>
<return-value transfer-ownership="none">
<doc xml:space="preserve">%TRUE if the device providering could be started</doc>
......@@ -18909,8 +18920,8 @@ element scope.</doc>
</member>
<member name="error" value="-5" c:identifier="GST_FLOW_ERROR" glib:nick="error">
<doc xml:space="preserve">Some (fatal) error occurred. Element generating
this error should post an error message with more
details.</doc>
this error should post an error message using
GST_ELEMENT_ERROR() with more details.</doc>
</member>
<member name="not_supported" value="-6" c:identifier="GST_FLOW_NOT_SUPPORTED" glib:nick="not-supported">
<doc xml:space="preserve">This operation is not supported.</doc>
......@@ -42339,7 +42350,7 @@ Free-function: gst_tag_list_unref</doc>
</parameter>
</parameters>
</method>
<method name="copy" c:identifier="gst_tag_list_copy" introspectable="0">
<method name="copy" c:identifier="gst_tag_list_copy">
<doc xml:space="preserve">Creates a new #GstTagList as a copy of the old @taglist. The new taglist
will have a refcount of 1, owned by the caller, and will be writable as
a result.
......@@ -46723,6 +46734,32 @@ cannot be parsed.</doc>
</parameter>
</parameters>
</function>
<function name="from_string_escaped" c:identifier="gst_uri_from_string_escaped" version="1.18">
<doc xml:space="preserve">Parses a URI string into a new #GstUri object. Will return NULL if the URI
cannot be parsed. This is identical to gst_uri_from_string() except that
the userinfo and fragment components of the URI will not be unescaped while
parsing.
Use this when you need to extract a username and password from the userinfo
such as https://user:password@example.com since either may contain
a URI-escaped ':' character. gst_uri_from_string() will unescape the entire
userinfo component, which will make it impossible to know which ':'
delineates the username and password.
The same applies to the fragment component of the URI, such as
https://example.com/path#fragment which may contain a URI-escaped '#'.</doc>
<return-value transfer-ownership="full" nullable="1">
<doc xml:space="preserve">A new #GstUri object, or NULL.</doc>
<type name="Uri" c:type="GstUri*"/>
</return-value>
<parameters>
<parameter name="uri" transfer-ownership="none">
<doc xml:space="preserve">The URI string to parse.</doc>
<type name="utf8" c:type="const gchar*"/>
</parameter>
</parameters>
</function>
<function name="get_location" c:identifier="gst_uri_get_location">
<doc xml:space="preserve">Extracts the location out of a given valid URI, ie. the protocol and "://"
are stripped from the URI, which means that the location returned includes
......@@ -47013,12 +47050,12 @@ determine a order for the two provided values.</doc>
<type name="gint" c:type="gint"/>
</constant>
<constant name="VERSION_MICRO" value="2" c:type="GST_VERSION_MICRO">
<constant name="VERSION_MICRO" value="0" c:type="GST_VERSION_MICRO">
<doc xml:space="preserve">The micro version of GStreamer at compile time:</doc>
<type name="gint" c:type="gint"/>
</constant>
<constant name="VERSION_MINOR" value="17" c:type="GST_VERSION_MINOR">
<constant name="VERSION_MINOR" value="18" c:type="GST_VERSION_MINOR">
<doc xml:space="preserve">The minor version of GStreamer at compile time:</doc>
<type name="gint" c:type="gint"/>
......@@ -50952,6 +50989,32 @@ cannot be parsed.</doc>
</parameter>
</parameters>
</function>
<function name="uri_from_string_escaped" c:identifier="gst_uri_from_string_escaped" moved-to="Uri.from_string_escaped" version="1.18">
<doc xml:space="preserve">Parses a URI string into a new #GstUri object. Will return NULL if the URI
cannot be parsed. This is identical to gst_uri_from_string() except that
the userinfo and fragment components of the URI will not be unescaped while
parsing.
Use this when you need to extract a username and password from the userinfo
such as https://user:password@example.com since either may contain
a URI-escaped ':' character. gst_uri_from_string() will unescape the entire
userinfo component, which will make it impossible to know which ':'
delineates the username and password.
The same applies to the fragment component of the URI, such as
https://example.com/path#fragment which may contain a URI-escaped '#'.</doc>
<return-value transfer-ownership="full" nullable="1">
<doc xml:space="preserve">A new #GstUri object, or NULL.</doc>
<type name="Uri" c:type="GstUri*"/>
</return-value>
<parameters>
<parameter name="uri" transfer-ownership="none">
<doc xml:space="preserve">The URI string to parse.</doc>
<type name="utf8" c:type="const gchar*"/>
</parameter>
</parameters>
</function>
<function name="uri_get_location" c:identifier="gst_uri_get_location" moved-to="Uri.get_location">
<doc xml:space="preserve">Extracts the location out of a given valid URI, ie. the protocol and "://"
are stripped from the URI, which means that the location returned includes
......@@ -1570,42 +1570,79 @@ A stream_type stream</doc>
</parameters>
</method>
<property name="block" writable="1" transfer-ownership="none">
<doc xml:space="preserve">When max-bytes are queued and after the enough-data signal has been emitted,
block any further push-buffer calls until the amount of queued bytes drops
below the max-bytes limit.</doc>
<type name="gboolean" c:type="gboolean"/>
</property>
<property name="caps" writable="1" transfer-ownership="none">
<doc xml:space="preserve">The GstCaps that will negotiated downstream and will be put
on outgoing buffers.</doc>
<type name="Gst.Caps"/>
</property>
<property name="current-level-bytes" transfer-ownership="none">
<property name="current-level-bytes" version="1.2" transfer-ownership="none">
<doc xml:space="preserve">The number of currently queued bytes inside appsrc.</doc>
<type name="guint64" c:type="guint64"/>
</property>
<property name="duration" writable="1" transfer-ownership="none">
<property name="duration" version="1.10" writable="1" transfer-ownership="none">
<doc xml:space="preserve">The total duration in nanoseconds of the data stream. If the total duration is known, it
is recommended to configure it with this property.</doc>
<type name="guint64" c:type="guint64"/>
</property>
<property name="emit-signals" writable="1" transfer-ownership="none">
<doc xml:space="preserve">Make appsrc emit the "need-data", "enough-data" and "seek-data" signals.
This option is by default enabled for backwards compatibility reasons but
can disabled when needed because signal emission is expensive.</doc>
<type name="gboolean" c:type="gboolean"/>
</property>
<property name="format" writable="1" transfer-ownership="none">
<doc xml:space="preserve">The format to use for segment events. When the source is producing
timestamped buffers this property should be set to GST_FORMAT_TIME.</doc>
<type name="Gst.Format"/>
</property>
<property name="handle-segment-change" version="1.18" writable="1" transfer-ownership="none">
<doc xml:space="preserve">When enabled, appsrc will check GstSegment in GstSample which was
pushed via gst_app_src_push_sample() or "push-sample" signal action.
If a GstSegment is changed, corresponding segment event will be followed
by next data flow.
FIXME: currently only GST_FORMAT_TIME format is supported and therefore
GstAppSrc::format should be time. However, possibly #GstAppSrc can support
other formats.</doc>
<type name="gboolean" c:type="gboolean"/>
</property>
<property name="is-live" writable="1" transfer-ownership="none">
<doc xml:space="preserve">Instruct the source to behave like a live source. This includes that it
will only push out buffers in the PLAYING state.</doc>
<type name="gboolean" c:type="gboolean"/>
</property>
<property name="max-bytes" writable="1" transfer-ownership="none">
<doc xml:space="preserve">The maximum amount of bytes that can be queued internally.
After the maximum amount of bytes are queued, appsrc will emit the
"enough-data" signal.</doc>
<type name="guint64" c:type="guint64"/>
</property>
<property name="max-latency" writable="1" transfer-ownership="none">
<type name="gint64" c:type="gint64"/>
</property>
<property name="min-latency" writable="1" transfer-ownership="none">
<doc xml:space="preserve">The minimum latency of the source. A value of -1 will use the default
latency calculations of #GstBaseSrc.</doc>
<type name="gint64" c:type="gint64"/>
</property>
<property name="min-percent" writable="1" transfer-ownership="none">
<doc xml:space="preserve">Make appsrc emit the "need-data" signal when the amount of bytes in the
queue drops below this percentage of max-bytes.</doc>
<type name="guint" c:type="guint"/>
</property>
<property name="size" writable="1" transfer-ownership="none">
<doc xml:space="preserve">The total size in bytes of the data stream. If the total size is known, it
is recommended to configure it with this property.</doc>
<type name="gint64" c:type="gint64"/>
</property>
<property name="stream-type" writable="1" transfer-ownership="none">
<doc xml:space="preserve">The type of stream that this source is producing. For seekable streams the
application should connect to the seek-data signal.</doc>
<type name="AppStreamType"/>
</property>
<field name="basesrc">
......@@ -1620,106 +1657,61 @@ A stream_type stream</doc>
</array>
</field>
<glib:signal name="end-of-stream" when="last" action="1">
<doc xml:space="preserve">Notify @appsrc that no more buffer are available.</doc>
<return-value transfer-ownership="none">
<type name="Gst.FlowReturn"/>
</return-value>
</glib:signal>
<glib:signal name="enough-data" when="last">
<doc xml:space="preserve">Signal that the source has enough data. It is recommended that the
application stops calling push-buffer until the need-data signal is
emitted again to avoid excessive buffer queueing.</doc>
<return-value transfer-ownership="none">
<type name="none" c:type="void"/>
</return-value>
</glib:signal>
<glib:signal name="need-data" when="last">
<doc xml:space="preserve">Signal that the source needs more data. In the callback or from another
thread you should call push-buffer or end-of-stream.
@length is just a hint and when it is set to -1, any number of bytes can be
pushed into @appsrc.
You can call push-buffer multiple times until the enough-data signal is
fired.</doc>
<return-value transfer-ownership="none">
<type name="none" c:type="void"/>
</return-value>
<parameters>
<parameter name="length" transfer-ownership="none">
<doc xml:space="preserve">the amount of bytes needed.</doc>
<parameter name="object" transfer-ownership="none">
<type name="guint" c:type="guint"/>
</parameter>
</parameters>
</glib:signal>
<glib:signal name="push-buffer" when="last" action="1">
<doc xml:space="preserve">Adds a buffer to the queue of buffers that the appsrc element will
push to its source pad. This function does not take ownership of the
buffer so the buffer needs to be unreffed after calling this function.
When the block property is TRUE, this function can block until free space
becomes available in the queue.</doc>
<return-value transfer-ownership="none">
<type name="Gst.FlowReturn"/>
</return-value>
<parameters>
<parameter name="buffer" transfer-ownership="none">
<doc xml:space="preserve">a buffer to push</doc>
<parameter name="object" transfer-ownership="none">
<type name="Gst.Buffer"/>
</parameter>
</parameters>
</glib:signal>
<glib:signal name="push-buffer-list" when="last" action="1" version="1.14">
<doc xml:space="preserve">Adds a buffer list to the queue of buffers and buffer lists that the
appsrc element will push to its source pad. This function does not take
ownership of the buffer list so the buffer list needs to be unreffed
after calling this function.
When the block property is TRUE, this function can block until free space
becomes available in the queue.</doc>
<glib:signal name="push-buffer-list" when="last" action="1">
<return-value transfer-ownership="none">
<type name="Gst.FlowReturn"/>
</return-value>
<parameters>
<parameter name="buffer_list" transfer-ownership="none">
<doc xml:space="preserve">a buffer list to push</doc>
<parameter name="object" transfer-ownership="none">
<type name="Gst.BufferList"/>
</parameter>
</parameters>
</glib:signal>
<glib:signal name="push-sample" when="last" action="1" version="1.6">
<doc xml:space="preserve">Extract a buffer from the provided sample and adds the extracted buffer
to the queue of buffers that the appsrc element will
push to its source pad. This function set the appsrc caps based on the caps
in the sample and reset the caps if they change.
Only the caps and the buffer of the provided sample are used and not
for example the segment in the sample.
This function does not take ownership of the
sample so the sample needs to be unreffed after calling this function.
When the block property is TRUE, this function can block until free space
becomes available in the queue.</doc>
<glib:signal name="push-sample" when="last" action="1">
<return-value transfer-ownership="none">
<type name="Gst.FlowReturn"/>
</return-value>
<parameters>
<parameter name="sample" transfer-ownership="none">
<doc xml:space="preserve">a sample from which extract buffer to push</doc>
<parameter name="object" transfer-ownership="none">
<type name="Gst.Sample"/>
</parameter>
</parameters>
</glib:signal>
<glib:signal name="seek-data" when="last">
<doc xml:space="preserve">Seek to the given offset. The next push-buffer should produce buffers from
the new @offset.
This callback is only called for seekable stream types.</doc>
<return-value transfer-ownership="none">
<doc xml:space="preserve">%TRUE if the seek succeeded.</doc>
<type name="gboolean" c:type="gboolean"/>
</return-value>
<parameters>
<parameter name="offset" transfer-ownership="none">
<doc xml:space="preserve">the offset to seek to</doc>
<parameter name="object" transfer-ownership="none">
<type name="guint64" c:type="guint64"/>
</parameter>
</parameters>
......
......@@ -1154,7 +1154,21 @@ caps.
A notable exception for now is the sample rate, sink pads must
have the same sample rate as either the downstream requirement,
or the first configured pad, or a combination of both (when
downstream specifies a range or a set of acceptable rates).</doc>
downstream specifies a range or a set of acceptable rates).
The #GstAggregator::samples-selected signal is provided with some
additional information about the output buffer:
- "offset" G_TYPE_UINT64 Offset in samples since segment start
for the position that is next to be filled in the output buffer.
- "frames" G_TYPE_UINT Number of frames per output buffer.
In addition the gst_aggregator_peek_next_sample() function returns
additional information in the info #GstStructure of the returned sample:
- "output-offset" G_TYPE_UINT64 Sample offset in output segment relative to
the output segment's start where the current position of this input
buffer would be placed
- "position" G_TYPE_UINT current position in the input buffer in samples
- "size" G_TYPE_UINT size of the input buffer in samples</doc>
<virtual-method name="aggregate_one_buffer">
......
......@@ -982,16 +982,17 @@ Control is given to the subclass when all pads have data.
* When data is queued on all pads, the aggregate vmethod is called.
 
* One can peek at the data on any given GstAggregatorPad with the
gst_aggregator_pad_peek_buffer () method, and remove it from the pad
gst_aggregator_pad_peek_buffer() method, and remove it from the pad
with the gst_aggregator_pad_pop_buffer () method. When a buffer
has been taken with pop_buffer (), a new buffer can be queued
on that pad.
 
* If the subclass wishes to push a buffer downstream in its aggregate
implementation, it should do so through the
gst_aggregator_finish_buffer () method. This method will take care
gst_aggregator_finish_buffer() method. This method will take care
of sending and ordering mandatory events such as stream start, caps
and segment.
and segment. Buffer lists can also be pushed out with
gst_aggregator_finish_buffer_list().
 
* Same goes for EOS events, which should not be pushed directly by the
subclass, it should instead return GST_FLOW_EOS in its aggregate
......@@ -1092,6 +1093,25 @@ sent before pushing the buffer.</doc>
</parameter>
</parameters>
</virtual-method>
<virtual-method name="finish_buffer_list" invoker="finish_buffer_list" version="1.18">
<doc xml:space="preserve">This method will push the provided output buffer list downstream. If needed,
mandatory events such as stream-start, caps, and segment events will be
sent before pushing the buffer.</doc>
<return-value transfer-ownership="none">
<type name="Gst.FlowReturn" c:type="GstFlowReturn"/>
</return-value>
<parameters>
<instance-parameter name="aggregator" transfer-ownership="none">
<doc xml:space="preserve">The #GstAggregator</doc>
<type name="Aggregator" c:type="GstAggregator*"/>
</instance-parameter>
<parameter name="bufferlist" transfer-ownership="full">
<doc xml:space="preserve">the #GstBufferList to push.</doc>
<type name="Gst.BufferList" c:type="GstBufferList*"/>
</parameter>
</parameters>
</virtual-method>
<virtual-method name="fixate_src_caps">
<return-value transfer-ownership="full">
......@@ -1158,6 +1178,28 @@ if #GstAggregatorClass.negotiate() fails.</doc>
</parameter>
</parameters>
</virtual-method>
<virtual-method name="peek_next_sample" invoker="peek_next_sample" version="1.18">
<doc xml:space="preserve">Use this function to determine what input buffers will be aggregated
to produce the next output buffer. This should only be called from
a #GstAggregator::samples-selected handler, and can be used to precisely
control aggregating parameters for a given set of input samples.</doc>
<return-value transfer-ownership="full">
<doc xml:space="preserve">The sample that is about to be aggregated. It may hold a #GstBuffer
or a #GstBufferList. The contents of its info structure is subclass-dependent,
and documented on a subclass basis. The buffers held by the sample are
not writable.</doc>
<type name="Gst.Sample" c:type="GstSample*"/>
</return-value>
<parameters>
<instance-parameter name="aggregator" transfer-ownership="none">
<type name="Aggregator" c:type="GstAggregator*"/>
</instance-parameter>
<parameter name="aggregator_pad" transfer-ownership="none">
<type name="AggregatorPad" c:type="GstAggregatorPad*"/>
</parameter>
</parameters>
</virtual-method>
<virtual-method name="propose_allocation">
<return-value transfer-ownership="none">
......@@ -1349,6 +1391,25 @@ sent before pushing the buffer.</doc>
</parameter>
</parameters>
</method>
<method name="finish_buffer_list" c:identifier="gst_aggregator_finish_buffer_list" version="1.18">
<doc xml:space="preserve">This method will push the provided output buffer list downstream. If needed,
mandatory events such as stream-start, caps, and segment events will be
sent before pushing the buffer.</doc>
<return-value transfer-ownership="none">
<type name="Gst.FlowReturn" c:type="GstFlowReturn"/>
</return-value>
<parameters>
<instance-parameter name="aggregator" transfer-ownership="none">
<doc xml:space="preserve">The #GstAggregator</doc>
<type name="Aggregator" c:type="GstAggregator*"/>
</instance-parameter>
<parameter name="bufferlist" transfer-ownership="full">
<doc xml:space="preserve">the #GstBufferList to push.</doc>
<type name="Gst.BufferList" c:type="GstBufferList*"/>
</parameter>
</parameters>
</method>
<method name="get_allocator" c:identifier="gst_aggregator_get_allocator">
<doc xml:space="preserve">Lets #GstAggregator sub-classes get the memory @allocator
acquired by the base class and its @params.
......@@ -1423,6 +1484,66 @@ if #GstAggregatorClass.negotiate() fails.</doc>
</instance-parameter>
</parameters>
</method>
<method name="peek_next_sample" c:identifier="gst_aggregator_peek_next_sample" version="1.18">
<doc xml:space="preserve">Use this function to determine what input buffers will be aggregated
to produce the next output buffer. This should only be called from
a #GstAggregator::samples-selected handler, and can be used to precisely
control aggregating parameters for a given set of input samples.</doc>
<return-value transfer-ownership="full">
<doc xml:space="preserve">The sample that is about to be aggregated. It may hold a #GstBuffer
or a #GstBufferList. The contents of its info structure is subclass-dependent,
and documented on a subclass basis. The buffers held by the sample are
not writable.</doc>
<type name="Gst.Sample" c:type="GstSample*"/>
</return-value>
<parameters>
<instance-parameter name="self" transfer-ownership="none">
<type name="Aggregator" c:type="GstAggregator*"/>
</instance-parameter>
<parameter name="pad" transfer-ownership="none">
<type name="AggregatorPad" c:type="GstAggregatorPad*"/>
</parameter>
</parameters>
</method>
<method name="selected_samples" c:identifier="gst_aggregator_selected_samples" version="1.18">
<doc xml:space="preserve">Subclasses should call this when they have prepared the
buffers they will aggregate for each of their sink pads, but
before using any of the properties of the pads that govern
*how* aggregation should be performed, for example z-index
for video aggregators.
If gst_aggregator_update_segment() is used by the subclass,
it MUST be called before gst_aggregator_selected_samples().
This function MUST only be called from the #GstAggregatorClass::aggregate()
function.</doc>
<return-value transfer-ownership="none">
<type name="none" c:type="void"/>
</return-value>
<parameters>
<instance-parameter name="self" transfer-ownership="none">
<type name="Aggregator" c:type="GstAggregator*"/>
</instance-parameter>
<parameter name="pts" transfer-ownership="none">
<doc xml:space="preserve">The presentation timestamp of the next output buffer</doc>
<type name="Gst.ClockTime" c:type="GstClockTime"/>
</parameter>
<parameter name="dts" transfer-ownership="none">
<doc xml:space="preserve">The decoding timestamp of the next output buffer</doc>
<type name="Gst.ClockTime" c:type="GstClockTime"/>
</parameter>
<parameter name="duration" transfer-ownership="none">
<doc xml:space="preserve">The duration of the next output buffer</doc>
<type name="Gst.ClockTime" c:type="GstClockTime"/>
</parameter>
<parameter name="info" transfer-ownership="none" nullable="1" allow-none="1">
<doc xml:space="preserve">a #GstStructure containing additional information</doc>
<type name="Gst.Structure" c:type="GstStructure*"/>
</parameter>
</parameters>
</method>
<method name="set_latency" c:identifier="gst_aggregator_set_latency">
<doc xml:space="preserve">Lets #GstAggregator sub-classes tell the baseclass what their internal
latency is. Will also post a LATENCY message on the bus so the pipeline
......@@ -1485,7 +1606,10 @@ and you have a dead line based aggregator subclass.</doc>
<method name="update_segment" c:identifier="gst_aggregator_update_segment" version="1.18">
<doc xml:space="preserve">Subclasses should use this to update the segment on their
source pad, instead of directly pushing new segment events
downstream.</doc>
downstream.
Subclasses MUST call this before gst_aggregator_selected_samples(),
if it is used at all.</doc>
<return-value transfer-ownership="none">
<type name="none" c:type="void"/>
......@@ -1499,6 +1623,10 @@ downstream.</doc>
</parameter>
</parameters>
</method>
<property name="emit-signals" version="1.18" writable="1" transfer-ownership="none">
<doc xml:space="preserve">Enables the emission of signals such as #GstAggregator::samples-selected</doc>
<type name="gboolean" c:type="gboolean"/>
</property>
<property name="latency" writable="1" transfer-ownership="none">
<type name="guint64" c:type="guint64"/>
</property>
......@@ -1531,6 +1659,36 @@ account when larger than the actually reported minimum latency.</doc>
<type name="gpointer" c:type="gpointer"/>
</array>
</field>
<glib:signal name="samples-selected" when="first" version="1.18">
<doc xml:space="preserve">Signals that the #GstAggregator subclass has selected the next set
of input samples it will aggregate. Handlers may call
gst_aggregator_peek_next_sample() at that point.</doc>
<return-value transfer-ownership="none">
<type name="none" c:type="void"/>
</return-value>
<parameters>
<parameter name="segment" transfer-ownership="none">
<doc xml:space="preserve">The #GstSegment the next output buffer is part of</doc>
<type name="Gst.Segment"/>
</parameter>
<parameter name="pts" transfer-ownership="none">
<doc xml:space="preserve">The presentation timestamp of the next output buffer</doc>
<type name="guint64" c:type="guint64"/>
</parameter>
<parameter name="dts" transfer-ownership="none">
<doc xml:space="preserve">The decoding timestamp of the next output buffer</doc>
<type name="guint64" c:type="guint64"/>
</parameter>
<parameter name="duration" transfer-ownership="none">
<doc xml:space="preserve">The duration of the next output buffer</doc>
<type name="guint64" c:type="guint64"/>
</parameter>
<parameter name="info" transfer-ownership="none" nullable="1" allow-none="1">
<doc xml:space="preserve">a #GstStructure containing additional information</doc>
<type name="Gst.Structure"/>
</parameter>
</parameters>
</glib:signal>
</class>
<record name="AggregatorClass" c:type="GstAggregatorClass" glib:is-gtype-struct-for="Aggregator" version="1.14">
<doc xml:space="preserve">The aggregator base class will handle in a thread-safe way all manners of
......@@ -1904,8 +2062,46 @@ _finish_buffer from inside that function.</doc>
</parameters>
</callback>
</field>
<field name="finish_buffer_list">
<callback name="finish_buffer_list">
<return-value transfer-ownership="none">
<type name="Gst.FlowReturn" c:type="GstFlowReturn"/>
</return-value>
<parameters>
<parameter name="aggregator" transfer-ownership="none">
<doc xml:space="preserve">The #GstAggregator</doc>
<type name="Aggregator" c:type="GstAggregator*"/>
</parameter>
<parameter name="bufferlist" transfer-ownership="full">
<doc xml:space="preserve">the #GstBufferList to push.</doc>
<type name="Gst.BufferList" c:type="GstBufferList*"/>
</parameter>
</parameters>
</callback>
</field>
<field name="peek_next_sample">
<callback name="peek_next_sample">
<return-value transfer-ownership="full">
<doc xml:space="preserve">The sample that is about to be aggregated. It may hold a #GstBuffer
or a #GstBufferList. The contents of its info structure is subclass-dependent,
and documented on a subclass basis. The buffers held by the sample are
not writable.</doc>
<type name="Gst.Sample" c:type="GstSample*"/>
</return-value>
<parameters>
<parameter name="aggregator" transfer-ownership="none">
<type name="Aggregator" c:type="GstAggregator*"/>
</parameter>
<parameter name="aggregator_pad" transfer-ownership="none">
<type name="AggregatorPad" c:type="GstAggregatorPad*"/>
</parameter>
</parameters>
</callback>
</field>
<field name="_gst_reserved" readable="0" private="1">
<array zero-terminated="0" fixed-size="17">
<array zero-terminated="0" fixed-size="15">
<type name="gpointer" c:type="gpointer"/>
</array>
</field>
......@@ -5549,13 +5745,14 @@ buffer is allocated.</doc>
</instance-parameter>
</parameters>
</method>
<method name="new_seamless_segment" c:identifier="gst_base_src_new_seamless_segment">
<method name="new_seamless_segment" c:identifier="gst_base_src_new_seamless_segment" deprecated="1" deprecated-version="1.18">
<doc xml:space="preserve">Prepare a new seamless segment for emission downstream. This function must
only be called by derived sub-classes, and only from the #GstBaseSrcClass::create function,
as the stream-lock needs to be held.
 
The format for the new segment will be the current format of the source, as
configured with gst_base_src_set_format()</doc>
<doc-deprecated xml:space="preserve">Use gst_base_src_new_segment()</doc-deprecated>
<return-value transfer-ownership="none">
<doc xml:space="preserve">%TRUE if preparation of the seamless segment succeeded.</doc>
......@@ -5580,6 +5777,32 @@ configured with gst_base_src_set_format()</doc>
</parameter>
</parameters>
</method>
<method name="new_segment" c:identifier="gst_base_src_new_segment" version="1.18">
<doc xml:space="preserve">Prepare a new segment for emission downstream. This function must
only be called by derived sub-classes, and only from the #GstBaseSrcClass::create function,
as the stream-lock needs to be held.
The format for the @segment must be identical with the current format
of the source, as configured with gst_base_src_set_format().
The format of @src must not be %GST_FORMAT_UNDEFINED and the format
should be configured via gst_base_src_set_format() before calling this method.</doc>
<return-value transfer-ownership="none">
<doc xml:space="preserve">%TRUE if preparation of new segment succeeded.</doc>
<type name="gboolean" c:type="gboolean"/>
</return-value>
<parameters>
<instance-parameter name="src" transfer-ownership="none">
<doc xml:space="preserve">a #GstBaseSrc</doc>
<type name="BaseSrc" c:type="GstBaseSrc*"/>
</instance-parameter>
<parameter name="segment" transfer-ownership="none">
<doc xml:space="preserve">a pointer to a #GstSegment</doc>
<type name="Gst.Segment" c:type="const GstSegment*"/>
</parameter>
</parameters>
</method>
<method name="query_latency" c:identifier="gst_base_src_query_latency">
<doc xml:space="preserve">Query the source for the latency parameters. @live will be %TRUE when @src is
configured as a live source. @min_latency and @max_latency will be set
......
......@@ -17,13 +17,6 @@ and/or use gtk-doc annotations. -->
</parameter>
</parameters>
</function-macro>
<function-macro name="CHECK_MAIN" c:identifier="GST_CHECK_MAIN" introspectable="0">
<parameters>
<parameter name="name">
</parameter>
</parameters>
</function-macro>
......@@ -2091,15 +2084,6 @@ MT safe.</doc>
</parameter>
</parameters>
</function-macro>
<function-macro name="START_TEST" c:identifier="GST_START_TEST" introspectable="0">
<doc xml:space="preserve">wrapper for checks START_TEST</doc>
<parameters>
<parameter name="__testname">
<doc xml:space="preserve">test function name</doc>
</parameter>
</parameters>
</function-macro>
<record name="StreamConsistency" c:type="GstStreamConsistency" disguised="1">
<doc xml:space="preserve">Opaque consistency checker handle.</doc>
......
This diff is collapsed.
......@@ -2027,8 +2027,11 @@ for more about restrictions. Does not apply to #GstEncodingContainerProfile.</do
</parameters>
</method>
<method name="set_single_segment" c:identifier="gst_encoding_profile_set_single_segment" version="1.18">
<doc xml:space="preserve">If using a single segment, buffers will be retimestamped
and segments will be eat so as to appear as one segment.</doc>
<doc xml:space="preserve">If using a single segment, buffers will be retimestamped and segments will be
eat so as to appear as one segment.
&gt; *NOTE*: Single segment is not property supported when using
&gt; #encodebin:avoid-reencoding</doc>
<return-value transfer-ownership="none">
<type name="none" c:type="void"/>
......@@ -2039,8 +2042,8 @@ and segments will be eat so as to appear as one segment.</doc>
<type name="EncodingProfile" c:type="GstEncodingProfile*"/>
</instance-parameter>
<parameter name="single_segment" transfer-ownership="none">
<doc xml:space="preserve">#TRUE if the stream represented by @profile should use a single
segment before the encoder #FALSE otherwise.</doc>
<doc xml:space="preserve">#TRUE if the stream represented by @profile should use a
single segment before the encoder, #FALSE otherwise.</doc>
<type name="gboolean" c:type="gboolean"/>
</parameter>
</parameters>
......@@ -2336,6 +2339,8 @@ not a multi-pass profile</doc>
</parameters>
</method>
<method name="get_variableframerate" c:identifier="gst_encoding_video_profile_get_variableframerate">
<doc xml:space="preserve">&gt; *NOTE*: Fixed framerate won't be enforced when #encodebin:avoid-reencoding
&gt; is set.</doc>
<return-value transfer-ownership="none">
<doc xml:space="preserve">Whether non-constant video framerate is allowed for encoding.</doc>
......@@ -2756,12 +2761,12 @@ in debugging.</doc>
<type name="gint" c:type="gint"/>
</constant>
<constant name="PLUGINS_BASE_VERSION_MICRO" value="2" c:type="GST_PLUGINS_BASE_VERSION_MICRO">
<constant name="PLUGINS_BASE_VERSION_MICRO" value="0" c:type="GST_PLUGINS_BASE_VERSION_MICRO">
<doc xml:space="preserve">The micro version of GStreamer's gst-plugins-base libraries at compile time.</doc>
<type name="gint" c:type="gint"/>
</constant>
<constant name="PLUGINS_BASE_VERSION_MINOR" value="17" c:type="GST_PLUGINS_BASE_VERSION_MINOR">
<constant name="PLUGINS_BASE_VERSION_MINOR" value="18" c:type="GST_PLUGINS_BASE_VERSION_MINOR">
<doc xml:space="preserve">The minor version of GStreamer's gst-plugins-base libraries at compile time.</doc>
<type name="gint" c:type="gint"/>
......
......@@ -2988,16 +2988,6 @@ the last processed buffer and current state of the stream being payloaded:
<property name="timestamp-offset" writable="1" transfer-ownership="none">
<type name="guint" c:type="guint"/>
</property>
<property name="twcc-ext-id" version="1.18" writable="1" transfer-ownership="none">
<doc xml:space="preserve">The RTP header-extension ID used for tagging buffers with Transport-Wide
Congestion Control sequence-numbers.
To use this across multiple bundled streams (transport wide), the
GstRTPFunnel can mux TWCC sequence-numbers together.
This is experimental, as it is still a draft and not yet a standard.</doc>
<type name="guint" c:type="guint"/>
</property>
<field name="element">
<type name="Gst.Element" c:type="GstElement"/>
</field>
......
This diff is collapsed.
......@@ -5,6 +5,24 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html),
specifically the [variant used by Rust](http://doc.crates.io/manifest.html#the-version-field).
## [0.16.3] - 2020-09-08
### Fixed
- Reset vfuncs if calling `BaseTransformClass::configure()` multiple times.
- Fix `gst::debug_remove_default_log_function()` to actually remove the
default log function.
### Added
- Some more new APIs added in 1.18.
- API for getting an owned buffer from a readable `gst_video::VideoFrame` /
`VideoFrameRef`.
### Changed
- Updated bindings to 1.18.0. This stabilized GStreamer 1.18 support and any
API behind the "v1_18" feature is considered stable now.
- Factor out some common code from `gst::Pad::ProbeInfo` code. This reduces
the code generated for each pad probe considerably.
- Update paste dependency to 1.0 and pretty-hex to 0.2.
## [0.16.2] - 2020-07-27
### Fixed
- Use correct pointer for the plane data in `gst_audio::AudioBuffer`.
......@@ -856,7 +874,8 @@ specifically the [variant used by Rust](http://doc.crates.io/manifest.html#the-v
(< 0.8.0) of the bindings can be found [here](https://github.com/arturoc/gstreamer1.0-rs).
The API of the two is incompatible.
[Unreleased]: https://gitlab.freedesktop.org/gstreamer/gstreamer-rs/compare/0.16.2...HEAD
[Unreleased]: https://gitlab.freedesktop.org/gstreamer/gstreamer-rs/compare/0.16.3...HEAD
[0.16.3]: https://gitlab.freedesktop.org/gstreamer/gstreamer-rs/compare/0.16.2...0.16.3
[0.16.2]: https://gitlab.freedesktop.org/gstreamer/gstreamer-rs/compare/0.16.1...0.16.2
[0.16.1]: https://gitlab.freedesktop.org/gstreamer/gstreamer-rs/compare/0.16.0...0.16.1
[0.16.0]: https://gitlab.freedesktop.org/gstreamer/gstreamer-rs/compare/0.15.7...0.16.0
......