Merge branch gstreamer:main into decklink

This commit is contained in:
Wojciech Kapsa 2024-03-22 07:34:24 +00:00
commit af19699df0
884 changed files with 92818 additions and 26948 deletions

View file

@ -1,9 +1,9 @@
include:
- project: 'freedesktop/ci-templates'
ref: 185ede0e9b9b1924b92306ab8b882a6294e92613
ref: "801093be0b88f23c8dbabe9cfce7134548f7ccdc"
file: '/templates/fedora.yml'
- project: 'freedesktop/ci-templates'
ref: 185ede0e9b9b1924b92306ab8b882a6294e92613
ref: "801093be0b88f23c8dbabe9cfce7134548f7ccdc"
file: '/templates/debian.yml'
###
# IMPORTANT
@ -45,6 +45,7 @@ variables:
-Dlibnice:examples=disabled
-Dlibnice:gupnp=disabled
-Dopenh264:tests=disabled
-Dgst-plugins-good:soup-lookup-dep=true
-Dpygobject:tests=false
-Dpython=enabled
-Dlibav=enabled
@ -161,6 +162,7 @@ gst-indent amd64 docker:
FDO_DISTRIBUTION_TAG: "$LINT_TAG-$GST_UPSTREAM_BRANCH"
FDO_DISTRIBUTION_PACKAGES: 'python3-pip git'
FDO_DISTRIBUTION_EXEC: 'ci/docker/lint/prepare.sh'
FDO_USER: "ciuser"
commitlint docker:
extends:
@ -214,6 +216,8 @@ gst indent:
script:
- ./scripts/check-format-c
- ./scripts/format-csharp --check
# We want both wraps to use the same version, overkill to create a separate job for this
- cmp subprojects/gtk-sharp.wrap subprojects/gstreamer-sharp/subprojects/gtk-sharp.wrap
rules:
- !reference [.upstream-branch-rules, rules]
- if: '$CI_PROJECT_NAMESPACE != "gstreamer" || $CI_COMMIT_BRANCH != $GST_UPSTREAM_BRANCH'
@ -242,6 +246,8 @@ commitlint:
needs:
- job: 'commitlint docker'
artifacts: false
before_script:
- git config --global --add safe.directory $CI_PROJECT_DIR
script:
- echo $CI_MERGE_REQUEST_DIFF_BASE_SHA
- gitlint --commits $CI_MERGE_REQUEST_DIFF_BASE_SHA..HEAD
@ -299,6 +305,9 @@ commitlint:
GST_WERROR: "true"
MESON_ARGS: "${DEFAULT_MESON_ARGS}"
SUBPROJECTS_CACHE_DIR: "/subprojects"
# Avoid weird issue about cross-device links
# https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/3197
GI_SCANNER_DISABLE_CACHE: "1"
script:
- $CI_PROJECT_DIR/ci/scripts/build.sh
- ./gst-env.py gst-inspect-1.0 --version
@ -412,7 +421,6 @@ build fedora clang:
-Dgst-plugins-base:pango=enabled
-Dgst-plugins-good:cairo=enabled
-Dgst-plugins-good:soup=enabled
-Dgst-plugins-good:soup-lookup-dep=true
-Dgst-plugins-bad:d3d11-wgc=enabled
rules:
- !reference [.upstream-branch-rules, rules]
@ -480,9 +488,8 @@ build vs2022 amd64 full-static:
# Setting up a cross build with MSVC is still non-trivial because
# the --vsenv argument cannot be used to set it up
- echo $env:MESON_CROSS_ARGS
- cmd.exe /C "C:\BuildTools\Common7\Tools\VsDevCmd.bat -host_arch=amd64 -arch=$env:ARCH &&
meson setup build $env:MESON_ARGS $env:MESON_CROSS_ARGS &&
meson compile -C build --jobs $env:FDO_CI_CONCURRENT"
- cmd.exe /C "C:\BuildTools\Common7\Tools\VsDevCmd.bat -host_arch=amd64 -arch=$env:ARCH && meson setup build $env:MESON_ARGS $env:MESON_CROSS_ARGS"
- cmd.exe /C "C:\BuildTools\Common7\Tools\VsDevCmd.bat -host_arch=amd64 -arch=$env:ARCH && meson compile -C build --jobs $env:FDO_CI_CONCURRENT"
build vs2022 x86:
extends: '.build windows cross'
@ -507,7 +514,6 @@ build vs2022 arm64:
MESON_CROSS_ARGS: >-
-Dgst-plugins-base:pango=disabled
-Dgst-plugins-good:cairo=disabled
-Dgst-plugins-good:soup-lookup-dep=false
-Dgst-devtools:cairo=disabled
-Dpython=disabled
-Dintrospection=disabled
@ -559,7 +565,6 @@ build macos:
-Dgst-plugins-base:pango=enabled
-Dgst-plugins-good:cairo=enabled
-Dgst-plugins-good:soup=enabled
-Dgst-plugins-good:soup-lookup-dep=true
# ---- Tests ----- #
@ -574,6 +579,10 @@ build macos:
MESON_ARGS: "${SIMPLE_BUILD}"
SUBPROJECTS_CACHE_DIR: "/subprojects"
# Avoid weird issue about cross-device links
# https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/3197
GI_SCANNER_DISABLE_CACHE: "1"
# Disable colored output to avoid weird rendering issues
GST_DEBUG_NO_COLOR: "true"
CI_ARTIFACTS_URL: "${CI_PROJECT_URL}/-/jobs/${CI_JOB_ID}/artifacts/raw/validate-logs/"

View file

@ -5,10 +5,10 @@ variables:
# If you are hacking on them or need a them to rebuild, its enough
# to change any part of the string of the image you want.
###
FEDORA_TAG: '2023-12-29.0'
FEDORA_TAG: '2024-02-13.0'
INDENT_TAG: '2023-08-24.3'
LINT_TAG: '2023-02-16.5'
LINT_TAG: '2024-02-20.0'
WINDOWS_TAG: '2023-12-29.0'
WINDOWS_TAG: '2024-02-08.0'

View file

@ -4,7 +4,7 @@
<!-- For any GStreamer usage questions or application development support
please head over to our new GStreamer Discourse forum at
https://discourse.gstreamer.org/ instead, or find us on
the #gstreamer IRC channel on https://www.oftc.net -->
the GStreamer Matrix room at https://matrix.to/#/#gstreamer:gstreamer.org -->
#### Expected Behavior
<!-- What did you expect to happen -->

View file

@ -1,4 +1,5 @@
For any GStreamer usage questions or application development support
please head over to our new GStreamer Discourse forum at
https://discourse.gstreamer.org instead, or find us on the
`#gstreamer` IRC channel on the OFTC IRC network (https://www.oftc.net).
GStreamer Matrix room at https://matrix.to/#/#gstreamer:gstreamer.org

View file

@ -13,8 +13,11 @@ min-length=10
# Ensure every title starts with a prefix
[title-match-regex]
regex=^[\w]+[\w, -\\/]*[\w]+: .*
regex=^[\w]+[\w, -\\/{}]*[\w]+: .*
# Ignore GDB backtraces
[ignore-body-lines]
regex=^ \#\d(.*):\d+$
regex=^ \#\d(.*):\d+$
[ignore-by-title]
regex=^(Release|Back to development)

View file

@ -12,17 +12,17 @@ Our documentation, including tutorials, API reference and FAQ can be found at
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
This repository contains all official modules supported by the GStreamer
community which can be found in the `subprojects/` directory.

View file

@ -93,6 +93,8 @@ qt5-qtx11extras-devel
redhat-rpm-config
sbc-devel
SDL2-devel
srt-devel
srt-libs
toolbox-experience
valgrind
vulkan-devel

View file

@ -4,7 +4,7 @@ set -eux
# Install Rust
RUSTUP_VERSION=1.26.0
RUST_VERSION=1.75.0
RUST_VERSION=1.76.0
RUST_ARCH="x86_64-unknown-linux-gnu"
RUSTUP_URL=https://static.rust-lang.org/rustup/archive/$RUSTUP_VERSION/$RUST_ARCH/rustup-init
@ -19,7 +19,7 @@ chmod +x rustup-init;
rm rustup-init;
chmod -R a+w $RUSTUP_HOME $CARGO_HOME
cargo install cargo-c --version 0.9.28+cargo-0.75.0
cargo install cargo-c --version 0.9.30+cargo-0.77.0
rustup --version
cargo --version

View file

@ -1,3 +1,5 @@
#! /bin/bash
set -eux
python3 -m pip install gitlint

View file

@ -1,6 +1,6 @@
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12;
$rust_version = '1.75.0'
$rust_version = '1.76.0'
$rustup_url = 'https://win.rustup.rs/x86_64'
Invoke-WebRequest -Uri $rustup_url -OutFile C:\rustup-init.exe

View file

@ -489,6 +489,8 @@ and/or use gtk-doc annotations. -->
<source-position filename="../subprojects/gst-plugins-bad/gst-libs/gst/cuda/stub/cuda.h"/>
<member name="success" value="0" c:identifier="CUDA_SUCCESS">
</member>
<member name="error_no_device" value="100" c:identifier="CUDA_ERROR_NO_DEVICE">
</member>
<member name="error_already_mapped" value="208" c:identifier="CUDA_ERROR_ALREADY_MAPPED">
</member>
<member name="error_not_supported" value="801" c:identifier="CUDA_ERROR_NOT_SUPPORTED">

View file

@ -1499,7 +1499,7 @@ do_time_effect_change (GESClip * clip)
children = ges_container_get_children (GES_CONTAINER (clip), FALSE);
for (tmp = children; tmp; tmp = tmp-&gt;next)
ges_track_element_set_auto_clamp_control_source (tmp-&gt;data, FALSE);
ges_track_element_set_auto_clamp_control_sources (tmp-&gt;data, FALSE);
// add time effect, or set their children properties, or move them around
...
@ -1520,7 +1520,7 @@ do_time_effect_change (GESClip * clip)
// handle error
for (tmp = children; tmp; tmp = tmp-&gt;next)
ges_track_element_set_auto_clamp_control_source (tmp-&gt;data, TRUE);
ges_track_element_set_auto_clamp_control_sources (tmp-&gt;data, TRUE);
g_list_free_full (children, gst_object_unref);
gst_object_unref (source);
@ -1664,7 +1664,8 @@ would not be able to adapt itself once the effect is added.</doc>
<type name="BaseEffect" c:type="GESBaseEffect*"/>
</parameter>
<parameter name="index" transfer-ownership="none">
<doc xml:space="preserve" filename="../subprojects/gst-editing-services/ges/ges-clip.c">The index to add @effect at, or -1 to add at the highest</doc>
<doc xml:space="preserve" filename="../subprojects/gst-editing-services/ges/ges-clip.c">The index to add @effect at, or -1 to add at the highest,
see #ges_clip_get_top_effect_index for more information</doc>
<type name="gint" c:type="gint"/>
</parameter>
</parameters>
@ -3536,10 +3537,23 @@ and [clip management](http://pitivi.org/manual/usingclips.html).</doc>
</function>
</enumeration>
<class name="Effect" c:symbol-prefix="effect" c:type="GESEffect" parent="BaseEffect" glib:type-name="GESEffect" glib:get-type="ges_effect_get_type" glib:type-struct="EffectClass">
<doc xml:space="preserve" filename="../subprojects/gst-editing-services/ges/ges-effect.c">Currently we only support effects with N sinkpads and one single srcpad.
Apart from `gesaudiomixer` and `gescompositor` which can be used as effects
and where sinkpads will be requested as needed based on the timeline topology
GES will always request at most one sinkpad per effect (when required).
<doc xml:space="preserve" filename="../subprojects/gst-editing-services/ges/ges-effect.c">Any GStreamer filter can be used as effects in GES. The only restriction we
have is that effects element should have a single [sinkpad](GST_PAD_SINK)
(which will be requested if necessary) and a single [srcpad](GST_PAD_SRC).
Note that `gesaudiomixer` and `gescompositor` can be used as effects even
though they can have several sinkpads.
## GES specific effects:
* **`gesvideoscale`**: GES implements a specific scaling bin that allows
specifying where scaling will happen inside the chain of effects. By
default scaling can happen either in the source (if the source doesn't have
a specific size, like `videotestsrc` or [mixing](ges_track_set_mixing) has
been disabled) or in the mixing element otherwise, when adding that element
as an effect, GES guarantees that the scaling will happen in it. This can
be useful for example if you want to crop the video before scaling or apply
rounding corners to the video after scaling, etc...
&gt; Note: GES always adds converters (`audioconvert ! audioresample !
&gt; audioconvert` for audio effects and `videoconvert` for video effects) to
@ -4473,19 +4487,21 @@ composition.</doc>
</field>
<field name="posx" writable="1">
<doc xml:space="preserve" filename="../subprojects/gst-editing-services/ges/ges-frame-composition-meta.h">The desired x position.</doc>
<type name="gint" c:type="gint"/>
<type name="gdouble" c:type="gdouble"/>
</field>
<field name="posy" writable="1">
<doc xml:space="preserve" filename="../subprojects/gst-editing-services/ges/ges-frame-composition-meta.h">The desired y position.</doc>
<type name="gint" c:type="gint"/>
<type name="gdouble" c:type="gdouble"/>
</field>
<field name="height" writable="1">
<doc xml:space="preserve" filename="../subprojects/gst-editing-services/ges/ges-frame-composition-meta.h">The desired height of the video.</doc>
<type name="gint" c:type="gint"/>
<doc xml:space="preserve" filename="../subprojects/gst-editing-services/ges/ges-frame-composition-meta.h">The desired height of the video. -1 means that no scaling should be
applied.</doc>
<type name="gdouble" c:type="gdouble"/>
</field>
<field name="width" writable="1">
<doc xml:space="preserve" filename="../subprojects/gst-editing-services/ges/ges-frame-composition-meta.h">The desired width of the video.</doc>
<type name="gint" c:type="gint"/>
<doc xml:space="preserve" filename="../subprojects/gst-editing-services/ges/ges-frame-composition-meta.h">The desired width of the video. -1 means that no scaling should beapplied
applied.</doc>
<type name="gdouble" c:type="gdouble"/>
</field>
<field name="zorder" writable="1">
<doc xml:space="preserve" filename="../subprojects/gst-editing-services/ges/ges-frame-composition-meta.h">The desired z order.</doc>
@ -15446,7 +15462,7 @@ contains one frame)</doc>
<source-position filename="../subprojects/gst-editing-services/ges/ges-version.h"/>
<type name="gint" c:type="gint"/>
</constant>
<constant name="VERSION_MINOR" value="23" c:type="GES_VERSION_MINOR">
<constant name="VERSION_MINOR" value="25" c:type="GES_VERSION_MINOR">
<source-position filename="../subprojects/gst-editing-services/ges/ges-version.h"/>
<type name="gint" c:type="gint"/>
</constant>

View file

@ -26903,6 +26903,35 @@ last ref and @obj is about to be freed.</doc>
</parameter>
</parameters>
</function-macro>
<function-macro name="OBJECT_AUTO_LOCK" c:identifier="GST_OBJECT_AUTO_LOCK" version="1.24.0" introspectable="0">
<doc xml:space="preserve" filename="../subprojects/gstreamer/gst/gstobject.h">Declare a #GMutexLocker variable with g_autoptr() and lock the object. The
mutex will be unlocked automatically when leaving the scope.
``` c
{
GST_OBJECT_AUTO_LOCK (obj, locker);
obj-&gt;stuff_with_lock();
if (cond) {
// No need to unlock
return;
}
// Unlock before end of scope
g_clear_pointer (&amp;locker, g_mutex_locker_free);
obj-&gt;stuff_without_lock();
}
```</doc>
<source-position filename="../subprojects/gstreamer/gst/gstobject.h"/>
<parameters>
<parameter name="obj">
<doc xml:space="preserve" filename="../subprojects/gstreamer/gst/gstobject.h">a #GstObject to lock</doc>
</parameter>
<parameter name="var">
<doc xml:space="preserve" filename="../subprojects/gstreamer/gst/gstobject.h">a variable name to be declared</doc>
</parameter>
</parameters>
</function-macro>
<function-macro name="OBJECT_CAST" c:identifier="GST_OBJECT_CAST" introspectable="0">
<source-position filename="../subprojects/gstreamer/gst/gstobject.h"/>
<parameters>
@ -27900,6 +27929,14 @@ the elements contained in that bin.</doc>
<doc xml:space="preserve" filename="../subprojects/gstreamer/gst/gstobject.h">the object is expected to stay alive even
after gst_deinit() has been called and so should be ignored by leak
detection tools. (Since: 1.10)</doc>
</member>
<member name="constructed" value="2" c:identifier="GST_OBJECT_FLAG_CONSTRUCTED" version="1.24" glib:nick="constructed">
<doc xml:space="preserve" filename="../subprojects/gstreamer/gst/gstobject.h">Flag that's set when the object has been constructed. This can be used by
API such as base class setters to differentiate between the case where
they're called from a subclass's instance init function (and where the
object isn't fully constructed yet, and so one shouldn't do anything but
set values in the instance structure), and the case where the object is
constructed.</doc>
</member>
<member name="last" value="16" c:identifier="GST_OBJECT_FLAG_LAST" glib:nick="last">
<doc xml:space="preserve" filename="../subprojects/gstreamer/gst/gstobject.h">subclasses can add additional flags starting from this flag</doc>
@ -28482,6 +28519,35 @@ queries explicitly if your element supports multiple scheduling modes.</doc>
</parameter>
</parameters>
</function-macro>
<function-macro name="PAD_STREAM_AUTO_LOCK" c:identifier="GST_PAD_STREAM_AUTO_LOCK" version="1.24.0" introspectable="0">
<doc xml:space="preserve" filename="../subprojects/gstreamer/gst/gstpad.h">Declare a #GRecMutexLocker variable with g_autoptr() and lock the pad. The
recursive mutex will be unlocked automatically when leaving the scope.
``` c
{
GST_PAD_STREAM_AUTO_LOCK (pad, locker);
gst_pad_push_event(pad, event1);
if (cond) {
// No need to unlock
return;
}
// Unlock before end of scope
g_clear_pointer (&amp;locker, g_rec_mutex_locker_free);
gst_pad_push_event(pad, event2);
}
```</doc>
<source-position filename="../subprojects/gstreamer/gst/gstpad.h"/>
<parameters>
<parameter name="pad">
<doc xml:space="preserve" filename="../subprojects/gstreamer/gst/gstpad.h">a #GstPad</doc>
</parameter>
<parameter name="var">
<doc xml:space="preserve" filename="../subprojects/gstreamer/gst/gstpad.h">a variable name to be declared</doc>
</parameter>
</parameters>
</function-macro>
<function-macro name="PAD_STREAM_LOCK" c:identifier="GST_PAD_STREAM_LOCK" introspectable="0">
<doc xml:space="preserve" filename="../subprojects/gstreamer/gst/gstpad.h">Take the pad's stream lock. The stream lock is recursive and will be taken
when buffers or serialized downstream events are pushed on a pad.</doc>
@ -32796,6 +32862,23 @@ clock, even if the pipeline is not in the PLAYING state.</doc>
</instance-parameter>
</parameters>
</method>
<method name="get_configured_latency" c:identifier="gst_pipeline_get_configured_latency" version="1.24">
<doc xml:space="preserve" filename="../subprojects/gstreamer/gst/gstpipeline.c">Return the configured latency on @pipeline.</doc>
<source-position filename="../subprojects/gstreamer/gst/gstpipeline.h"/>
<return-value transfer-ownership="none">
<doc xml:space="preserve" filename="../subprojects/gstreamer/gst/gstpipeline.c">@pipeline configured latency, or %GST_CLOCK_TIME_NONE if none has been configured
because @pipeline did not reach the PLAYING state yet.
MT safe.</doc>
<type name="ClockTime" c:type="GstClockTime"/>
</return-value>
<parameters>
<instance-parameter name="pipeline" transfer-ownership="none">
<doc xml:space="preserve" filename="../subprojects/gstreamer/gst/gstpipeline.c">a #GstPipeline</doc>
<type name="Pipeline" c:type="GstPipeline*"/>
</instance-parameter>
</parameters>
</method>
<method name="get_delay" c:identifier="gst_pipeline_get_delay">
<doc xml:space="preserve" filename="../subprojects/gstreamer/gst/gstpipeline.c">Get the configured delay (see gst_pipeline_set_delay()).</doc>
<source-position filename="../subprojects/gstreamer/gst/gstpipeline.h"/>
@ -32844,6 +32927,22 @@ clock, even if the pipeline is not in the PLAYING state.</doc>
</instance-parameter>
</parameters>
</method>
<method name="is_live" c:identifier="gst_pipeline_is_live" version="1.24">
<doc xml:space="preserve" filename="../subprojects/gstreamer/gst/gstpipeline.c">Check if @pipeline is live.</doc>
<source-position filename="../subprojects/gstreamer/gst/gstpipeline.h"/>
<return-value transfer-ownership="none">
<doc xml:space="preserve" filename="../subprojects/gstreamer/gst/gstpipeline.c">%TRUE if @pipeline is live, %FALSE if not or if it did not reach the PAUSED state yet.
MT safe.</doc>
<type name="gboolean" c:type="gboolean"/>
</return-value>
<parameters>
<instance-parameter name="pipeline" transfer-ownership="none">
<doc xml:space="preserve" filename="../subprojects/gstreamer/gst/gstpipeline.c">a #GstPipeline</doc>
<type name="Pipeline" c:type="GstPipeline*"/>
</instance-parameter>
</parameters>
</method>
<method name="set_auto_flush_bus" c:identifier="gst_pipeline_set_auto_flush_bus">
<doc xml:space="preserve" filename="../subprojects/gstreamer/gst/gstpipeline.c">Usually, when a pipeline goes from READY to NULL state, it automatically
flushes all pending messages on the bus, which is done for refcounting
@ -33329,6 +33428,54 @@ arguments separated by predefined delimiters (see above).</doc>
</parameter>
</parameters>
</method>
<method name="add_status_error" c:identifier="gst_plugin_add_status_error" version="1.24">
<source-position filename="../subprojects/gstreamer/gst/gstplugin.h"/>
<return-value transfer-ownership="none">
<type name="none" c:type="void"/>
</return-value>
<parameters>
<instance-parameter name="plugin" transfer-ownership="none">
<doc xml:space="preserve" filename="../subprojects/gstreamer/gst/gstplugin.c">a #GstPlugin</doc>
<type name="Plugin" c:type="GstPlugin*"/>
</instance-parameter>
<parameter name="message" transfer-ownership="none">
<doc xml:space="preserve" filename="../subprojects/gstreamer/gst/gstplugin.c">the status error message</doc>
<type name="utf8" c:type="const gchar*"/>
</parameter>
</parameters>
</method>
<method name="add_status_info" c:identifier="gst_plugin_add_status_info" version="1.24">
<source-position filename="../subprojects/gstreamer/gst/gstplugin.h"/>
<return-value transfer-ownership="none">
<type name="none" c:type="void"/>
</return-value>
<parameters>
<instance-parameter name="plugin" transfer-ownership="none">
<doc xml:space="preserve" filename="../subprojects/gstreamer/gst/gstplugin.c">a #GstPlugin</doc>
<type name="Plugin" c:type="GstPlugin*"/>
</instance-parameter>
<parameter name="message" transfer-ownership="none">
<doc xml:space="preserve" filename="../subprojects/gstreamer/gst/gstplugin.c">the status info message</doc>
<type name="utf8" c:type="const gchar*"/>
</parameter>
</parameters>
</method>
<method name="add_status_warning" c:identifier="gst_plugin_add_status_warning" version="1.24">
<source-position filename="../subprojects/gstreamer/gst/gstplugin.h"/>
<return-value transfer-ownership="none">
<type name="none" c:type="void"/>
</return-value>
<parameters>
<instance-parameter name="plugin" transfer-ownership="none">
<doc xml:space="preserve" filename="../subprojects/gstreamer/gst/gstplugin.c">a #GstPlugin</doc>
<type name="Plugin" c:type="GstPlugin*"/>
</instance-parameter>
<parameter name="message" transfer-ownership="none">
<doc xml:space="preserve" filename="../subprojects/gstreamer/gst/gstplugin.c">the status warning message</doc>
<type name="utf8" c:type="const gchar*"/>
</parameter>
</parameters>
</method>
<method name="get_cache_data" c:identifier="gst_plugin_get_cache_data">
<doc xml:space="preserve" filename="../subprojects/gstreamer/gst/gstplugin.c">Gets the plugin specific data cache. If it is %NULL there is no cached data
stored. This is the case when the registry is getting rebuilt.</doc>
@ -33465,6 +33612,51 @@ available.</doc>
</instance-parameter>
</parameters>
</method>
<method name="get_status_errors" c:identifier="gst_plugin_get_status_errors" version="1.24">
<source-position filename="../subprojects/gstreamer/gst/gstplugin.h"/>
<return-value transfer-ownership="full" nullable="1">
<doc xml:space="preserve" filename="../subprojects/gstreamer/gst/gstplugin.c">an array of plugin status error messages, or NULL</doc>
<array c:type="gchar**">
<type name="utf8"/>
</array>
</return-value>
<parameters>
<instance-parameter name="plugin" transfer-ownership="none">
<doc xml:space="preserve" filename="../subprojects/gstreamer/gst/gstplugin.c">a #GstPlugin</doc>
<type name="Plugin" c:type="GstPlugin*"/>
</instance-parameter>
</parameters>
</method>
<method name="get_status_infos" c:identifier="gst_plugin_get_status_infos" version="1.24">
<source-position filename="../subprojects/gstreamer/gst/gstplugin.h"/>
<return-value transfer-ownership="full" nullable="1">
<doc xml:space="preserve" filename="../subprojects/gstreamer/gst/gstplugin.c">an array of plugin status info messages, or NULL</doc>
<array c:type="gchar**">
<type name="utf8"/>
</array>
</return-value>
<parameters>
<instance-parameter name="plugin" transfer-ownership="none">
<doc xml:space="preserve" filename="../subprojects/gstreamer/gst/gstplugin.c">a #GstPlugin</doc>
<type name="Plugin" c:type="GstPlugin*"/>
</instance-parameter>
</parameters>
</method>
<method name="get_status_warnings" c:identifier="gst_plugin_get_status_warnings" version="1.24">
<source-position filename="../subprojects/gstreamer/gst/gstplugin.h"/>
<return-value transfer-ownership="full" nullable="1">
<doc xml:space="preserve" filename="../subprojects/gstreamer/gst/gstplugin.c">an array of plugin status warning messages, or NULL</doc>
<array c:type="gchar**">
<type name="utf8"/>
</array>
</return-value>
<parameters>
<instance-parameter name="plugin" transfer-ownership="none">
<doc xml:space="preserve" filename="../subprojects/gstreamer/gst/gstplugin.c">a #GstPlugin</doc>
<type name="Plugin" c:type="GstPlugin*"/>
</instance-parameter>
</parameters>
</method>
<method name="get_version" c:identifier="gst_plugin_get_version">
<doc xml:space="preserve" filename="../subprojects/gstreamer/gst/gstplugin.c">get the version of the plugin</doc>
<source-position filename="../subprojects/gstreamer/gst/gstplugin.h"/>
@ -41089,7 +41281,7 @@ a-struct, nested=[nested-struct, nested=true]
```
&gt; *note*: gst_structure_to_string() won't use that syntax for backward
&gt; compatibility reason, gst_structure_serialize() has been added for
&gt; compatibility reason, gst_structure_serialize_full() has been added for
&gt; that purpose.</doc>
<source-position filename="../subprojects/gstreamer/gst/gststructure.h"/>
<field name="type" writable="1">
@ -42539,7 +42731,7 @@ argument is ignored.</doc>
</parameter>
</parameters>
</method>
<method name="serialize" c:identifier="gst_structure_serialize" version="1.20">
<method name="serialize" c:identifier="gst_structure_serialize" version="1.20" deprecated="1">
<doc xml:space="preserve" filename="../subprojects/gstreamer/gst/gststructure.c">Converts @structure to a human-readable string representation.
This version of the caps serialization function introduces support for nested
@ -42547,10 +42739,35 @@ structures and caps but the resulting strings won't be parsable with
GStreamer prior to 1.20 unless #GST_SERIALIZE_FLAG_BACKWARD_COMPAT is passed
as @flag.
%GST_SERIALIZE_FLAG_STRICT flags is not allowed because it would make this
function nullable which is an API break for bindings.
Use gst_structure_serialize_full() instead.
Free-function: g_free</doc>
<doc-deprecated xml:space="preserve">Use gst_structure_serialize_full() instead.</doc-deprecated>
<source-position filename="../subprojects/gstreamer/gst/gststructure.h"/>
<return-value transfer-ownership="full">
<doc xml:space="preserve" filename="../subprojects/gstreamer/gst/gststructure.c">a pointer to string allocated by g_malloc().
g_free() after usage.</doc>
<type name="utf8" c:type="gchar*"/>
</return-value>
<parameters>
<instance-parameter name="structure" transfer-ownership="none">
<doc xml:space="preserve" filename="../subprojects/gstreamer/gst/gststructure.c">a #GstStructure</doc>
<type name="Structure" c:type="const GstStructure*"/>
</instance-parameter>
<parameter name="flags" transfer-ownership="none">
<doc xml:space="preserve" filename="../subprojects/gstreamer/gst/gststructure.c">The flags to use to serialize structure</doc>
<type name="SerializeFlags" c:type="GstSerializeFlags"/>
</parameter>
</parameters>
</method>
<method name="serialize_full" c:identifier="gst_structure_serialize_full" version="1.24">
<doc xml:space="preserve" filename="../subprojects/gstreamer/gst/gststructure.c">Alias for gst_structure_serialize() but with nullable annotation because it
can return %NULL when %GST_SERIALIZE_FLAG_STRICT flag is set.</doc>
<source-position filename="../subprojects/gstreamer/gst/gststructure.h"/>
<return-value transfer-ownership="full" nullable="1">
<doc xml:space="preserve" filename="../subprojects/gstreamer/gst/gststructure.c">a pointer to string allocated by g_malloc().
g_free() after usage.</doc>
<type name="utf8" c:type="gchar*"/>
</return-value>
@ -42754,7 +42971,7 @@ This prints the structure in human readable form.
This function will lead to unexpected results when there are nested #GstCaps
/ #GstStructure deeper than one level, you should user
gst_structure_serialize() instead for those cases.
gst_structure_serialize_full() instead for those cases.
Free-function: g_free</doc>
<source-position filename="../subprojects/gstreamer/gst/gststructure.h"/>
@ -43081,6 +43298,14 @@ attachment)</doc>
<source-position filename="../subprojects/gstreamer/gst/gsttaglist.h"/>
<type name="utf8" c:type="gchar*"/>
</constant>
<constant name="TAG_CONTAINER_SPECIFIC_TRACK_ID" value="container-specific-track-id" c:type="GST_TAG_CONTAINER_SPECIFIC_TRACK_ID" version="1.24">
<doc xml:space="preserve" filename="../subprojects/gstreamer/gst/gsttaglist.h">Unique identifier for the audio, video or text track this tag is associated
with. The mappings for several container formats are defined in the [Sourcing
In-band Media Resource Tracks from Media Containers into HTML
specification](https://dev.w3.org/html5/html-sourcing-inband-tracks/).</doc>
<source-position filename="../subprojects/gstreamer/gst/gsttaglist.h"/>
<type name="utf8" c:type="gchar*"/>
</constant>
<constant name="TAG_COPYRIGHT" value="copyright" c:type="GST_TAG_COPYRIGHT">
<doc xml:space="preserve" filename="../subprojects/gstreamer/gst/gsttaglist.h">copyright notice of the data (string)</doc>
<source-position filename="../subprojects/gstreamer/gst/gsttaglist.h"/>
@ -49166,7 +49391,7 @@ determine a order for the two provided values.</doc>
<source-position filename="../subprojects/gstreamer/gst/gstversion.h"/>
<type name="gint" c:type="gint"/>
</constant>
<constant name="VERSION_MINOR" value="23" c:type="GST_VERSION_MINOR">
<constant name="VERSION_MINOR" value="25" c:type="GST_VERSION_MINOR">
<doc xml:space="preserve" filename="../subprojects/gstreamer/gst/gstversion.h">The minor version of GStreamer at compile time:</doc>
<source-position filename="../subprojects/gstreamer/gst/gstversion.h"/>
<type name="gint" c:type="gint"/>
@ -51760,7 +51985,16 @@ which is then encapsulated in a GstProtectionMeta object and attached to
the corresponding output buffer using the gst_buffer_add_protection_meta()
function. The information in this attached GstProtectionMeta would be
used by a downstream decrypter element to recover the original unencrypted
frame.</doc>
frame.
In addition to the #GstProtectionMeta demuxers signal encrypted streams with
specific caps. The caps #GstStructure name will usually depend on the
encryption scheme, for instance Common Encryption will be signaled with
`application/x-cenc`. To prevent loss of information the media type of the
decrypted stream will be stored in a `original-media-type` string field.
Downstream elements can re-use that information, for instance decryptors can
set their source pad caps according to the `original-media-type` received on
their sink pad.</doc>
</docsection>
<docsection name="gststreams">
<doc xml:space="preserve" filename="../subprojects/gstreamer/gst/gststreams.c">A #GstStream is a high-level object defining a stream of data which is, or
@ -52256,6 +52490,57 @@ not allow to determine that size, @consumed is set to 0.</doc>
</parameter>
</parameters>
</function>
<function name="meta_info_new" c:identifier="gst_meta_info_new" moved-to="MetaInfo.new" version="1.24" introspectable="0">
<doc xml:space="preserve" filename="../subprojects/gstreamer/gst/gstmeta.c">Creates a new structure that needs to be filled before being
registered. This structure should filled and then registered with
gst_meta_info_register().
Example:
```c
const GstMetaInfo *
gst_my_meta_get_info (void)
{
static const GstMetaInfo *meta_info = NULL;
if (g_once_init_enter ((GstMetaInfo **) &amp; meta_info)) {
GstMetaInfo *info = gst_meta_info_new (
gst_my_meta_api_get_type (),
"GstMyMeta",
sizeof (GstMyMeta));
const GstMetaInfo *meta = NULL;
info-&gt;init_func = my_meta_init;
info-&gt;free_func = my_meta_free;
info-&gt;transform_func = my_meta_transform;
info-&gt;serialize_func = my_meta_serialize;
info-&gt;deserialize_func = my_meta_deserialize;
meta = gst_meta_info_register (info);
g_once_init_leave ((GstMetaInfo **) &amp; meta_info, (GstMetaInfo *) meta);
}
return meta_info;
}
```</doc>
<source-position filename="../subprojects/gstreamer/gst/gstmeta.h"/>
<return-value>
<doc xml:space="preserve" filename="../subprojects/gstreamer/gst/gstmeta.c">a new #GstMetaInfo that needs to be filled</doc>
<type name="MetaInfo" c:type="GstMetaInfo*"/>
</return-value>
<parameters>
<parameter name="api" transfer-ownership="none">
<doc xml:space="preserve" filename="../subprojects/gstreamer/gst/gstmeta.c">the type of the #GstMeta API</doc>
<type name="GType" c:type="GType"/>
</parameter>
<parameter name="impl" transfer-ownership="none">
<doc xml:space="preserve" filename="../subprojects/gstreamer/gst/gstmeta.c">the name of the #GstMeta implementation</doc>
<type name="utf8" c:type="const gchar*"/>
</parameter>
<parameter name="size" transfer-ownership="none">
<doc xml:space="preserve" filename="../subprojects/gstreamer/gst/gstmeta.c">the size of the #GstMeta structure</doc>
<type name="gsize" c:type="gsize"/>
</parameter>
</parameters>
</function>
<function name="meta_register" c:identifier="gst_meta_register" moved-to="Meta.register" introspectable="0">
<doc xml:space="preserve" filename="../subprojects/gstreamer/gst/gstmeta.c">Register a new #GstMeta implementation.
@ -54222,6 +54507,20 @@ element or %NULL if nothing was found</doc>
</parameter>
</parameters>
</function>
<function name="util_ceil_log2" c:identifier="gst_util_ceil_log2" version="1.24">
<doc xml:space="preserve" filename="../subprojects/gstreamer/gst/gstutils.c">Return a max num of log2.</doc>
<source-position filename="../subprojects/gstreamer/gst/gstutils.h"/>
<return-value transfer-ownership="none">
<doc xml:space="preserve" filename="../subprojects/gstreamer/gst/gstutils.c">a computed #guint val.</doc>
<type name="guint" c:type="guint"/>
</return-value>
<parameters>
<parameter name="v" transfer-ownership="none">
<doc xml:space="preserve" filename="../subprojects/gstreamer/gst/gstutils.c">a #guint32 value.</doc>
<type name="guint32" c:type="guint32"/>
</parameter>
</parameters>
</function>
<function name="util_double_to_fraction" c:identifier="gst_util_double_to_fraction">
<doc xml:space="preserve" filename="../subprojects/gstreamer/gst/gstutils.c">Transforms a #gdouble to a fraction and simplifies
the result.</doc>
@ -54276,6 +54575,23 @@ the result.</doc>
</parameter>
</parameters>
</function>
<function name="util_filename_compare" c:identifier="gst_util_filename_compare" version="1.24">
<doc xml:space="preserve" filename="../subprojects/gstreamer/gst/gstutils.c">Compares the given filenames using natural ordering.</doc>
<source-position filename="../subprojects/gstreamer/gst/gstutils.h"/>
<return-value transfer-ownership="none">
<type name="gint" c:type="gint"/>
</return-value>
<parameters>
<parameter name="a" transfer-ownership="none">
<doc xml:space="preserve" filename="../subprojects/gstreamer/gst/gstutils.c">a filename to compare with @b</doc>
<type name="filename" c:type="const gchar*"/>
</parameter>
<parameter name="b" transfer-ownership="none">
<doc xml:space="preserve" filename="../subprojects/gstreamer/gst/gstutils.c">a filename to compare with @a</doc>
<type name="filename" c:type="const gchar*"/>
</parameter>
</parameters>
</function>
<function name="util_fraction_add" c:identifier="gst_util_fraction_add">
<doc xml:space="preserve" filename="../subprojects/gstreamer/gst/gstutils.c">Adds the fractions @a_n/@a_d and @b_n/@b_d and stores
the result in @res_n and @res_d.</doc>

View file

@ -9,12 +9,8 @@ and/or use gtk-doc annotations. -->
<alias name="MtdType" c:type="GstAnalyticsMtdType">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.h">Type of analytics meta data</doc>
<source-position filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.h"/>
<type name="guint32" c:type="guint32"/>
<type name="guintptr" c:type="guintptr"/>
</alias>
<constant name="AN_RELATION_META_TAG" value="GST-ANALYSIS-RELATION-META-TAG" c:type="GST_AN_RELATION_META_TAG">
<source-position filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.h"/>
<type name="utf8" c:type="gchar*"/>
</constant>
<record name="ClsMtd" c:type="GstAnalyticsClsMtd" version="1.24">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsclassificationmtd.h">Handle containing data required to use gst_analytics_cls_mtd APIs. This type
is generally expected to be allocated on the stack.</doc>
@ -75,7 +71,7 @@ Get number of classes</doc>
</instance-parameter>
<parameter name="index" transfer-ownership="none">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsclassificationmtd.c">Object class index</doc>
<type name="gint" c:type="gint"/>
<type name="gsize" c:type="gsize"/>
</parameter>
</parameters>
</method>
@ -93,32 +89,26 @@ Get number of classes</doc>
<parameter name="index" transfer-ownership="none">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsclassificationmtd.c">index of the class
Get quark of the class at @index</doc>
<type name="gint" c:type="gint"/>
<type name="gsize" c:type="gsize"/>
</parameter>
</parameters>
</method>
<function name="get_type_name" c:identifier="gst_analytics_cls_mtd_get_type_name" version="1.24">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsclassificationmtd.c">Get the static string representing #GstAnalyticsMtd type.</doc>
<function name="get_mtd_type" c:identifier="gst_analytics_cls_mtd_get_mtd_type" version="1.24">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsclassificationmtd.c">Get an id identifying #GstAnalyticsMtd type.</doc>
<source-position filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsclassificationmtd.h"/>
<return-value transfer-ownership="none">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsclassificationmtd.c">#GstAnalyticsMtd type name.</doc>
<type name="utf8" c:type="const gchar*"/>
</return-value>
</function>
<function name="get_type_quark" c:identifier="gst_analytics_cls_mtd_get_type_quark" version="1.24">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsclassificationmtd.c">Get a quark identifying #GstAnalyticsMtd type.</doc>
<source-position filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsclassificationmtd.h"/>
<return-value transfer-ownership="none">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsclassificationmtd.c">Quark of #GstAnalyticsMtd type</doc>
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsclassificationmtd.c">opaque id of #GstAnalyticsMtd type</doc>
<type name="MtdType" c:type="GstAnalyticsMtdType"/>
</return-value>
</function>
</record>
<constant name="INF_RELATION_SPAN" value="-1" c:type="GST_INF_RELATION_SPAN">
<constant name="INF_RELATION_SPAN" value="-1" c:type="GST_INF_RELATION_SPAN" version="1.24">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.h">Passes to functions asking for a relation span when the span is
infinite.</doc>
<source-position filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.h"/>
<type name="gint" c:type="gint"/>
</constant>
<function-macro name="MTD_CAST" c:identifier="GST_ANALYTICS_MTD_CAST" introspectable="0">
<function-macro name="MTD_CAST" c:identifier="GST_ANALYTICS_MTD_CAST" version="1.24" introspectable="0">
<source-position filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.h"/>
<parameters>
<parameter name="mtd">
@ -144,6 +134,7 @@ identified by @id is stored.</doc>
<type name="RelationMeta" c:type="GstAnalyticsRelationMeta*"/>
</field>
<method name="get_id" c:identifier="gst_analytics_mtd_get_id" version="1.24">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.c">Get instance id</doc>
<source-position filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.h"/>
<return-value transfer-ownership="none">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.c">Id of @instance</doc>
@ -151,30 +142,15 @@ identified by @id is stored.</doc>
</return-value>
<parameters>
<instance-parameter name="instance" transfer-ownership="none">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.c">Instance of #GstAnalyticsMtd
Get instance id</doc>
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.c">Instance of #GstAnalyticsMtd</doc>
<type name="Mtd" c:type="GstAnalyticsMtd*"/>
</instance-parameter>
</parameters>
</method>
<method name="get_size" c:identifier="gst_analytics_mtd_get_size" version="1.24">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.c">@instance Instance of #GstAnalyticsRelatableMtd
Get instance size</doc>
<method name="get_mtd_type" c:identifier="gst_analytics_mtd_get_mtd_type" version="1.24">
<source-position filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.h"/>
<return-value transfer-ownership="none">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.c">Size (in bytes) of this instance or 0 on failure.</doc>
<type name="gsize" c:type="gsize"/>
</return-value>
<parameters>
<instance-parameter name="instance" transfer-ownership="none">
<type name="Mtd" c:type="GstAnalyticsMtd*"/>
</instance-parameter>
</parameters>
</method>
<method name="get_type_quark" c:identifier="gst_analytics_mtd_get_type_quark" version="1.24">
<source-position filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.h"/>
<return-value transfer-ownership="none">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.c">quark associated with type.</doc>
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.c">opaque id of the type</doc>
<type name="MtdType" c:type="GstAnalyticsMtdType"/>
</return-value>
<parameters>
@ -185,6 +161,73 @@ Get analysis result type.</doc>
</instance-parameter>
</parameters>
</method>
<method name="get_size" c:identifier="gst_analytics_mtd_get_size" version="1.24">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.c">Get instance size</doc>
<source-position filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.h"/>
<return-value transfer-ownership="none">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.c">Size (in bytes) of this instance or 0 on failure.</doc>
<type name="gsize" c:type="gsize"/>
</return-value>
<parameters>
<instance-parameter name="instance" transfer-ownership="none">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.c">Instance of #GstAnalyticsMtd</doc>
<type name="Mtd" c:type="GstAnalyticsMtd*"/>
</instance-parameter>
</parameters>
</method>
<function name="type_get_name" c:identifier="gst_analytics_mtd_type_get_name" version="1.24">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.c">Gets the string version of the name of this type of analytics data</doc>
<source-position filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.h"/>
<return-value transfer-ownership="none">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.c">the name</doc>
<type name="utf8" c:type="const gchar*"/>
</return-value>
<parameters>
<parameter name="type" transfer-ownership="none">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.c">The type of analytics data</doc>
<type name="MtdType" c:type="GstAnalyticsMtdType"/>
</parameter>
</parameters>
</function>
</record>
<record name="MtdImpl" c:type="GstAnalyticsMtdImpl" version="1.24">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.h">This structure must be provided when registering a new type of Mtd. It must
have a static lifetime (never be freed).</doc>
<source-position filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.h"/>
<field name="name" writable="1">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.h">The name of the metadata type</doc>
<type name="utf8" c:type="const char*"/>
</field>
<field name="mtd_meta_transform">
<callback name="mtd_meta_transform">
<source-position filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.h"/>
<return-value transfer-ownership="none">
<type name="gboolean" c:type="gboolean"/>
</return-value>
<parameters>
<parameter name="transbuf" transfer-ownership="none">
<type name="Gst.Buffer" c:type="GstBuffer*"/>
</parameter>
<parameter name="transmtd" transfer-ownership="none">
<type name="Mtd" c:type="GstAnalyticsMtd*"/>
</parameter>
<parameter name="buffer" transfer-ownership="none">
<type name="Gst.Buffer" c:type="GstBuffer*"/>
</parameter>
<parameter name="type" transfer-ownership="none">
<type name="GLib.Quark" c:type="GQuark"/>
</parameter>
<parameter name="data" transfer-ownership="none">
<type name="gpointer" c:type="gpointer"/>
</parameter>
</parameters>
</callback>
</field>
<field name="_reserved" readable="0" private="1">
<array zero-terminated="0" fixed-size="20">
<type name="gpointer" c:type="gpointer"/>
</array>
</field>
</record>
<record name="ODMtd" c:type="GstAnalyticsODMtd" version="1.24">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsobjectdetectionmtd.h">Handle containing data required to use gst_analytics_od_mtd APIs. This type
@ -199,6 +242,24 @@ is generally expected to be allocated on the stack.</doc>
identified by @id is stored.</doc>
<type name="RelationMeta" c:type="GstAnalyticsRelationMeta*"/>
</field>
<method name="get_confidence_lvl" c:identifier="gst_analytics_od_mtd_get_confidence_lvl" version="1.24">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsobjectdetectionmtd.c">Retrieve location confidence level.</doc>
<source-position filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsobjectdetectionmtd.h"/>
<return-value transfer-ownership="none">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsobjectdetectionmtd.c">TRUE on success, otherwise FALSE.</doc>
<type name="gboolean" c:type="gboolean"/>
</return-value>
<parameters>
<instance-parameter name="instance" transfer-ownership="none">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsobjectdetectionmtd.c">instance</doc>
<type name="ODMtd" c:type="GstAnalyticsODMtd*"/>
</instance-parameter>
<parameter name="loc_conf_lvl" direction="out" caller-allocates="0" transfer-ownership="full">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsobjectdetectionmtd.c">Confidence on object location</doc>
<type name="gfloat" c:type="gfloat*"/>
</parameter>
</parameters>
</method>
<method name="get_location" c:identifier="gst_analytics_od_mtd_get_location" version="1.24">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsobjectdetectionmtd.c">Retrieve location and location confidence level.</doc>
<source-position filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsobjectdetectionmtd.h"/>
@ -233,7 +294,8 @@ identified by @id is stored.</doc>
</parameter>
</parameters>
</method>
<method name="get_type" c:identifier="gst_analytics_od_mtd_get_type" version="1.24">
<method name="get_obj_type" c:identifier="gst_analytics_od_mtd_get_obj_type" version="1.24">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsobjectdetectionmtd.c">Quark of the class of object associated with this location.</doc>
<source-position filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsobjectdetectionmtd.h"/>
<return-value transfer-ownership="none">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsobjectdetectionmtd.c">Quark different from on success and 0 on failure.</doc>
@ -241,25 +303,16 @@ identified by @id is stored.</doc>
</return-value>
<parameters>
<instance-parameter name="handle" transfer-ownership="none">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsobjectdetectionmtd.c">Instance handle
Quark of the class of object associated with this location.</doc>
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsobjectdetectionmtd.c">Instance handle</doc>
<type name="ODMtd" c:type="GstAnalyticsODMtd*"/>
</instance-parameter>
</parameters>
</method>
<function name="get_type_name" c:identifier="gst_analytics_od_mtd_get_type_name" version="1.24">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsobjectdetectionmtd.c">Get a text representing object-detection metadata type.</doc>
<function name="get_mtd_type" c:identifier="gst_analytics_od_mtd_get_mtd_type" version="1.24">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsobjectdetectionmtd.c">Get an id that represent object-detection metadata type</doc>
<source-position filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsobjectdetectionmtd.h"/>
<return-value transfer-ownership="none">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsobjectdetectionmtd.c">#GstAnalyticsMtd type name.</doc>
<type name="utf8" c:type="const gchar*"/>
</return-value>
</function>
<function name="get_type_quark" c:identifier="gst_analytics_od_mtd_get_type_quark" version="1.24">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsobjectdetectionmtd.c">Get a quark that represent object-detection metadata type</doc>
<source-position filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsobjectdetectionmtd.h"/>
<return-value transfer-ownership="none">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsobjectdetectionmtd.c">Quark of #GstAnalyticsMtd type</doc>
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsobjectdetectionmtd.c">Opaque id of the #GstAnalyticsMtd type</doc>
<type name="MtdType" c:type="GstAnalyticsMtdType"/>
</return-value>
</function>
@ -284,43 +337,11 @@ Quark of the class of object associated with this location.</doc>
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.h">Only use for criteria.</doc>
</member>
</bitfield>
<record name="RelatableMtdData" c:type="GstAnalyticsRelatableMtdData" version="1.24">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.h">Base structure for analysis-metadata that can be placed in relation. Only
other analysis-metadata based on GstAnalyticsRelatableMtdData should
directly use this structure.</doc>
<source-position filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.h"/>
<field name="analysis_type" writable="1">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.h">Identify the type of analysis-metadata</doc>
<type name="MtdType" c:type="GstAnalyticsMtdType"/>
</field>
<field name="id" writable="1">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.h">Instance identifier.</doc>
<type name="guint" c:type="guint"/>
</field>
<field name="size" writable="1">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.h">Size in bytes of the instance</doc>
<type name="gsize" c:type="gsize"/>
</field>
<field name="free">
<callback name="free">
<source-position filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.h"/>
<return-value transfer-ownership="none">
<type name="none" c:type="void"/>
</return-value>
<parameters>
<parameter name="mtd_data" transfer-ownership="none">
<type name="RelatableMtdData" c:type="GstAnalyticsRelatableMtdData*"/>
</parameter>
</parameters>
</callback>
</field>
<field name="_gst_reserved" writable="1">
<array zero-terminated="0" fixed-size="4">
<type name="gpointer" c:type="gpointer"/>
</array>
</field>
</record>
<record name="RelationMeta" c:type="GstAnalyticsRelationMeta" disguised="1">
<record name="RelationMeta" c:type="GstAnalyticsRelationMeta" disguised="1" version="1.24">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.h">An opaque #GstMeta that can be used to hold various types of results
from analysis processes.
The content should be accessed through the API.</doc>
<source-position filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.h"/>
<method name="add_cls_mtd" c:identifier="gst_analytics_relation_meta_add_cls_mtd" version="1.24">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsclassificationmtd.c">Add analytic classification metadata to @instance.</doc>
@ -358,24 +379,22 @@ directly use this structure.</doc>
</parameter>
</parameters>
</method>
<method name="add_mtd" c:identifier="gst_analytics_relation_meta_add_mtd" introspectable="0">
<method name="add_mtd" c:identifier="gst_analytics_relation_meta_add_mtd" version="1.24" introspectable="0">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.c">Add a relatable metadata to @meta. This method is meant to be used by
new struct sub-classing GstAnalyticsRelatableMtd.</doc>
<source-position filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.h"/>
<return-value>
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.c">New GstAnalyticsRelatableMtdData instance.
Since 1.24</doc>
<type name="RelatableMtdData" c:type="GstAnalyticsRelatableMtdData*"/>
<return-value transfer-ownership="none" nullable="1">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.c">A pointer to a memory area of size @size where to put the data</doc>
<type name="gpointer" c:type="gpointer"/>
</return-value>
<parameters>
<instance-parameter name="meta" transfer-ownership="none">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.c">Instance</doc>
<type name="RelationMeta" c:type="GstAnalyticsRelationMeta*"/>
</instance-parameter>
<parameter name="type" transfer-ownership="none">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.c">Type of relatable (#GstAnalyticsRelatableMtd)</doc>
<type name="MtdType" c:type="GstAnalyticsMtdType"/>
<parameter name="impl" transfer-ownership="none">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.c">Implementation of relatable (#GstAnalyticsRelatableMtd)</doc>
<type name="MtdImpl" c:type="const GstAnalyticsMtdImpl*"/>
</parameter>
<parameter name="size" transfer-ownership="none">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.c">Size required</doc>
@ -483,7 +502,7 @@ Add an analytic tracking metadata to @instance.</doc>
</parameter>
</parameters>
</method>
<method name="exist" c:identifier="gst_analytics_relation_meta_exist">
<method name="exist" c:identifier="gst_analytics_relation_meta_exist" version="1.24">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.c">Verify existence of relation(s) between @an_meta_first_d and
@an_meta_second_id according to relation condition @cond_types. It optionally
also return a shortest path of relations ( compliant with @cond_types)
@ -491,9 +510,7 @@ between @an_meta_first_id and @an_meta_second_id.</doc>
<source-position filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.h"/>
<return-value transfer-ownership="none">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.c">TRUE if a relation between exit between @an_meta_first_id and
@an_meta_second_id, otherwise FALSE.
Since 1.24</doc>
@an_meta_second_id, otherwise FALSE.</doc>
<type name="gboolean" c:type="gboolean"/>
</return-value>
<parameters>
@ -534,14 +551,12 @@ Since 1.24</doc>
</parameter>
</parameters>
</method>
<method name="get_cls_mtd" c:identifier="gst_analytics_relation_meta_get_cls_mtd">
<method name="get_cls_mtd" c:identifier="gst_analytics_relation_meta_get_cls_mtd" version="1.24">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsclassificationmtd.c">Fill @rlt if a analytics-meta with id == @an_meta_id exist in @meta instance,
otherwise this method return FALSE and @rlt is invalid.</doc>
<source-position filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsclassificationmtd.h"/>
<return-value transfer-ownership="none">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsclassificationmtd.c">TRUE if successful.
Since 1.24</doc>
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsclassificationmtd.c">TRUE if successful.</doc>
<type name="gboolean" c:type="gboolean"/>
</return-value>
<parameters>
@ -560,12 +575,10 @@ Since 1.24</doc>
</parameter>
</parameters>
</method>
<method name="get_direct_related" c:identifier="gst_analytics_relation_meta_get_direct_related">
<method name="get_direct_related" c:identifier="gst_analytics_relation_meta_get_direct_related" version="1.24">
<source-position filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.h"/>
<return-value transfer-ownership="none">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.c">TRUE if @rlt_mtd was updated, other wise FALSE
Since 1.24</doc>
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.c">TRUE if @rlt_mtd was updated, other wise FALSE</doc>
<type name="gboolean" c:type="gboolean"/>
</return-value>
<parameters>
@ -598,14 +611,12 @@ Since 1.24</doc>
</parameter>
</parameters>
</method>
<method name="get_mtd" c:identifier="gst_analytics_relation_meta_get_mtd">
<method name="get_mtd" c:identifier="gst_analytics_relation_meta_get_mtd" version="1.24">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.c">Fill @rlt if a analytics-meta with id == @an_meta_id exist in @meta instance,
otherwise this method return FALSE and @rlt is invalid.</doc>
<source-position filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.h"/>
<return-value transfer-ownership="none">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.c">TRUE if successful.
Since 1.24</doc>
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.c">TRUE if successful.</doc>
<type name="gboolean" c:type="gboolean"/>
</return-value>
<parameters>
@ -629,13 +640,11 @@ Since 1.24</doc>
</parameter>
</parameters>
</method>
<method name="get_mtd_data" c:identifier="gst_analytics_relation_meta_get_mtd_data" introspectable="0">
<method name="get_mtd_data" c:identifier="gst_analytics_relation_meta_get_mtd_data" version="1.24" introspectable="0">
<source-position filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.h"/>
<return-value nullable="1">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.c">Instance of GstAnalyticsRelatableMtdData
Since 1.24</doc>
<type name="RelatableMtdData" c:type="GstAnalyticsRelatableMtdData*"/>
<return-value transfer-ownership="none" nullable="1">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.c">Analytics data pointer</doc>
<type name="gpointer" c:type="gpointer"/>
</return-value>
<parameters>
<instance-parameter name="meta" transfer-ownership="none">
@ -648,14 +657,12 @@ Since 1.24</doc>
</parameter>
</parameters>
</method>
<method name="get_od_mtd" c:identifier="gst_analytics_relation_meta_get_od_mtd">
<method name="get_od_mtd" c:identifier="gst_analytics_relation_meta_get_od_mtd" version="1.24">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsobjectdetectionmtd.c">Fill @rlt if a analytics-meta with id == @an_meta_id exist in @meta instance,
otherwise this method return FALSE and @rlt is invalid.</doc>
<source-position filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsobjectdetectionmtd.h"/>
<return-value transfer-ownership="none">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsobjectdetectionmtd.c">TRUE if successful.
Since 1.24</doc>
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsobjectdetectionmtd.c">TRUE if successful.</doc>
<type name="gboolean" c:type="gboolean"/>
</return-value>
<parameters>
@ -664,7 +671,7 @@ Since 1.24</doc>
<type name="RelationMeta" c:type="GstAnalyticsRelationMeta*"/>
</instance-parameter>
<parameter name="an_meta_id" transfer-ownership="none">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsobjectdetectionmtd.c">Id of #GstAnalyticsOdMtd instance to retrieve</doc>
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsobjectdetectionmtd.c">Id of #GstAnalyticsODMtd instance to retrieve</doc>
<type name="guint" c:type="guint"/>
</parameter>
<parameter name="rlt" direction="out" caller-allocates="1" transfer-ownership="none">
@ -675,13 +682,12 @@ Since 1.24</doc>
</parameters>
</method>
<method name="get_relation" c:identifier="gst_analytics_relation_meta_get_relation" version="1.24">
<source-position filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.h"/>
<return-value transfer-ownership="none">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.c">relation description between first and second analysis-meta.
Get relations between first and second analysis-meta.
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.c">Get relations between first and second analysis-meta.
Ids (@an_meta_first_id and @an_meta_second_id) must be from a call to
@gst_analytics_mtd_get_id (handle).</doc>
<source-position filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.h"/>
<return-value transfer-ownership="none">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.c">relation description between first and second analysis-meta.</doc>
<type name="RelTypes" c:type="GstAnalyticsRelTypes"/>
</return-value>
<parameters>
@ -699,14 +705,12 @@ Ids (@an_meta_first_id and @an_meta_second_id) must be from a call to
</parameter>
</parameters>
</method>
<method name="get_tracking_mtd" c:identifier="gst_analytics_relation_meta_get_tracking_mtd">
<method name="get_tracking_mtd" c:identifier="gst_analytics_relation_meta_get_tracking_mtd" version="1.24">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsobjecttrackingmtd.c">Fill @rlt if a analytics-meta with id == @an_meta_id exist in @meta instance,
otherwise this method return FALSE and @rlt is invalid.</doc>
<source-position filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsobjecttrackingmtd.h"/>
<return-value transfer-ownership="none">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsobjecttrackingmtd.c">TRUE if successful.
Since 1.24</doc>
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsobjecttrackingmtd.c">TRUE if successful.</doc>
<type name="gboolean" c:type="gboolean"/>
</return-value>
<parameters>
@ -725,12 +729,10 @@ Since 1.24</doc>
</parameter>
</parameters>
</method>
<method name="iterate" c:identifier="gst_analytics_relation_meta_iterate">
<method name="iterate" c:identifier="gst_analytics_relation_meta_iterate" version="1.24">
<source-position filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.h"/>
<return-value transfer-ownership="none">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.c">FALSE if end was reached and iteration is completed.
Since 1.24</doc>
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.c">FALSE if end was reached and iteration is completed.</doc>
<type name="gboolean" c:type="gboolean"/>
</return-value>
<parameters>
@ -784,7 +786,8 @@ Ids must have been obtained a call to
</parameter>
</parameters>
</method>
<function name="get_info" c:identifier="gst_analytics_relation_meta_get_info">
<function name="get_info" c:identifier="gst_analytics_relation_meta_get_info" version="1.24" introspectable="0">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.c">Get the meta info</doc>
<source-position filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.h"/>
<return-value transfer-ownership="none">
<type name="Gst.MetaInfo" c:type="const GstMetaInfo*"/>
@ -875,23 +878,17 @@ Set tracking to lost</doc>
</parameter>
</parameters>
</method>
<function name="get_type_name" c:identifier="gst_analytics_tracking_mtd_get_type_name">
<function name="get_mtd_type" c:identifier="gst_analytics_tracking_mtd_get_mtd_type" version="1.24">
<source-position filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsobjecttrackingmtd.h"/>
<return-value transfer-ownership="none">
<type name="utf8" c:type="const gchar*"/>
</return-value>
</function>
<function name="get_type_quark" c:identifier="gst_analytics_tracking_mtd_get_type_quark" version="1.24">
<source-position filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsobjecttrackingmtd.h"/>
<return-value transfer-ownership="none">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsobjecttrackingmtd.c">Quark representing the type of GstAnalyticsRelatableMtd
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsobjecttrackingmtd.c">id representing the type of GstAnalyticsRelatableMtd
Get the quark identifying the relatable type</doc>
<type name="GLib.Quark" c:type="GQuark"/>
Get the opaque id identifying the relatable type</doc>
<type name="MtdType" c:type="GstAnalyticsMtdType"/>
</return-value>
</function>
</record>
<function name="buffer_add_analytics_relation_meta" c:identifier="gst_buffer_add_analytics_relation_meta">
<function name="buffer_add_analytics_relation_meta" c:identifier="gst_buffer_add_analytics_relation_meta" version="1.24">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.c">Attach a analysis-results-meta-relation meta (#GstAnalyticsRelationMeta)to @buffer.
A #GstAnalyticsRelationMeta is a metadata describing relation between other
@ -899,9 +896,7 @@ analysis meta. It's more efficient to use #gst_buffer_add_analytics_relation_met
and providing the maximum number of analysis meta that will attached to a buffer.</doc>
<source-position filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.h"/>
<return-value transfer-ownership="none" nullable="1">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.c">Newly attached #GstAnalyticsRelationMeta
Since 1.24</doc>
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.c">Newly attached #GstAnalyticsRelationMeta</doc>
<type name="RelationMeta" c:type="GstAnalyticsRelationMeta*"/>
</return-value>
<parameters>
@ -911,16 +906,14 @@ Since 1.24</doc>
</parameter>
</parameters>
</function>
<function name="buffer_add_analytics_relation_meta_full" c:identifier="gst_buffer_add_analytics_relation_meta_full">
<function name="buffer_add_analytics_relation_meta_full" c:identifier="gst_buffer_add_analytics_relation_meta_full" version="1.24">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.c">Attache a analysis-results relation-meta (#GstAnalyticsRelationMeta) to @buffer.
A #GstAnalyticsRelationMeta is a metadata describing relation between other
analysis meta.</doc>
<source-position filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.h"/>
<return-value transfer-ownership="none" nullable="1">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.c">Newly attached #GstAnalyticsRelationMeta
Since 1.24</doc>
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.c">Newly attached #GstAnalyticsRelationMeta</doc>
<type name="RelationMeta" c:type="GstAnalyticsRelationMeta*"/>
</return-value>
<parameters>
@ -948,49 +941,70 @@ Since 1.24</doc>
</parameter>
</parameters>
</function>
<function name="cls_mtd_get_type_name" c:identifier="gst_analytics_cls_mtd_get_type_name" moved-to="ClsMtd.get_type_name" version="1.24">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsclassificationmtd.c">Get the static string representing #GstAnalyticsMtd type.</doc>
<function name="cls_mtd_get_mtd_type" c:identifier="gst_analytics_cls_mtd_get_mtd_type" moved-to="ClsMtd.get_mtd_type" version="1.24">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsclassificationmtd.c">Get an id identifying #GstAnalyticsMtd type.</doc>
<source-position filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsclassificationmtd.h"/>
<return-value transfer-ownership="none">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsclassificationmtd.c">#GstAnalyticsMtd type name.</doc>
<type name="utf8" c:type="const gchar*"/>
</return-value>
</function>
<function name="cls_mtd_get_type_quark" c:identifier="gst_analytics_cls_mtd_get_type_quark" moved-to="ClsMtd.get_type_quark" version="1.24">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsclassificationmtd.c">Get a quark identifying #GstAnalyticsMtd type.</doc>
<source-position filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsclassificationmtd.h"/>
<return-value transfer-ownership="none">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsclassificationmtd.c">Quark of #GstAnalyticsMtd type</doc>
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsclassificationmtd.c">opaque id of #GstAnalyticsMtd type</doc>
<type name="MtdType" c:type="GstAnalyticsMtdType"/>
</return-value>
</function>
<function name="od_mtd_get_type_name" c:identifier="gst_analytics_od_mtd_get_type_name" moved-to="ODMtd.get_type_name" version="1.24">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsobjectdetectionmtd.c">Get a text representing object-detection metadata type.</doc>
<source-position filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsobjectdetectionmtd.h"/>
<docsection name="gstanalyticsclassificationtd">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsclassificationmtd.c">This type of metadata holds classification, it is generally used in
relationship with another metadata type to enhance its content. For example,
it can enhance the classifcation of an object detection held by the
#GstAnalyticsODMtd metadata type.</doc>
</docsection>
<docsection name="gstanalyticsmeta">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.c">The #GstAnalyticsRelationMeta is a #GstMeta that can contain a large number
of results from the analysis of a meta. Each result can be accessed by
using its id, or more conviently, by using a #GstAnalyticsMtd. A matrix
of relationships between the various metadata is also defined and can be
filled by the analysis processes.</doc>
</docsection>
<docsection name="gstanalyticsobjectdetectionmtd">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsobjectdetectionmtd.c">This type of metadata holds the position of detected object inside the
image, along with the probabily of each detection.</doc>
</docsection>
<docsection name="gstanalyticsobjecttrackingmtd">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsobjecttrackingmtd.c">This type of metadata holds tracking information. In many cases, it is
desired to track an object across many frames. This type of metadata holds
information about the tracking, for example, it can be used alongside a
#GstAnalyticsODMtd to track an object.</doc>
</docsection>
<function name="mtd_type_get_name" c:identifier="gst_analytics_mtd_type_get_name" moved-to="Mtd.type_get_name" version="1.24">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.c">Gets the string version of the name of this type of analytics data</doc>
<source-position filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.h"/>
<return-value transfer-ownership="none">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsobjectdetectionmtd.c">#GstAnalyticsMtd type name.</doc>
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.c">the name</doc>
<type name="utf8" c:type="const gchar*"/>
</return-value>
<parameters>
<parameter name="type" transfer-ownership="none">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.c">The type of analytics data</doc>
<type name="MtdType" c:type="GstAnalyticsMtdType"/>
</parameter>
</parameters>
</function>
<function name="od_mtd_get_type_quark" c:identifier="gst_analytics_od_mtd_get_type_quark" moved-to="ODMtd.get_type_quark" version="1.24">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsobjectdetectionmtd.c">Get a quark that represent object-detection metadata type</doc>
<function name="od_mtd_get_mtd_type" c:identifier="gst_analytics_od_mtd_get_mtd_type" moved-to="ODMtd.get_mtd_type" version="1.24">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsobjectdetectionmtd.c">Get an id that represent object-detection metadata type</doc>
<source-position filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsobjectdetectionmtd.h"/>
<return-value transfer-ownership="none">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsobjectdetectionmtd.c">Quark of #GstAnalyticsMtd type</doc>
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsobjectdetectionmtd.c">Opaque id of the #GstAnalyticsMtd type</doc>
<type name="MtdType" c:type="GstAnalyticsMtdType"/>
</return-value>
</function>
<function name="relation_get_length" c:identifier="gst_analytics_relation_get_length" version="1.24">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.c">@instance Instance of #GstAnalyticsRelationMeta
Get number of relatable meta attached to instance</doc>
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.c">Get number of relatable meta attached to instance</doc>
<source-position filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.h"/>
<return-value transfer-ownership="none">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.c">Number of analysis-meta attached to this
instance.</doc>
instance.</doc>
<type name="gsize" c:type="gsize"/>
</return-value>
<parameters>
<parameter name="instance" transfer-ownership="none">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.c">Instance of #GstAnalyticsRelationMeta</doc>
<type name="RelationMeta" c:type="GstAnalyticsRelationMeta*"/>
</parameter>
</parameters>
@ -1002,25 +1016,20 @@ instance.</doc>
<type name="GType" c:type="GType"/>
</return-value>
</function>
<function name="relation_meta_get_info" c:identifier="gst_analytics_relation_meta_get_info" moved-to="RelationMeta.get_info">
<function name="relation_meta_get_info" c:identifier="gst_analytics_relation_meta_get_info" moved-to="RelationMeta.get_info" version="1.24" introspectable="0">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.c">Get the meta info</doc>
<source-position filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsmeta.h"/>
<return-value transfer-ownership="none">
<type name="Gst.MetaInfo" c:type="const GstMetaInfo*"/>
</return-value>
</function>
<function name="tracking_mtd_get_type_name" c:identifier="gst_analytics_tracking_mtd_get_type_name" moved-to="TrackingMtd.get_type_name">
<function name="tracking_mtd_get_mtd_type" c:identifier="gst_analytics_tracking_mtd_get_mtd_type" moved-to="TrackingMtd.get_mtd_type" version="1.24">
<source-position filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsobjecttrackingmtd.h"/>
<return-value transfer-ownership="none">
<type name="utf8" c:type="const gchar*"/>
</return-value>
</function>
<function name="tracking_mtd_get_type_quark" c:identifier="gst_analytics_tracking_mtd_get_type_quark" moved-to="TrackingMtd.get_type_quark" version="1.24">
<source-position filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsobjecttrackingmtd.h"/>
<return-value transfer-ownership="none">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsobjecttrackingmtd.c">Quark representing the type of GstAnalyticsRelatableMtd
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/analytics/gstanalyticsobjecttrackingmtd.c">id representing the type of GstAnalyticsRelatableMtd
Get the quark identifying the relatable type</doc>
<type name="GLib.Quark" c:type="GQuark"/>
Get the opaque id identifying the relatable type</doc>
<type name="MtdType" c:type="GstAnalyticsMtdType"/>
</return-value>
</function>
</namespace>

View file

@ -4863,10 +4863,10 @@ profiles defined in Annex A for service-compatible stereoscopic 3D services</doc
<member name="c3780" value="8" c:identifier="GST_MPEGTS_TRANSMISSION_MODE_C3780">
</member>
</enumeration>
<function name="buffer_add_mpegts_pes_metadata_meta" c:identifier="gst_buffer_add_mpegts_pes_metadata_meta" version="1.24" introspectable="0">
<function name="buffer_add_mpegts_pes_metadata_meta" c:identifier="gst_buffer_add_mpegts_pes_metadata_meta" version="1.24">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/mpegts/gst-mpegtspesmetadatameta.h">Creates and adds a #GstMpegtsPESMetadataMeta to a @buffer.</doc>
<source-position filename="../subprojects/gst-plugins-bad/gst-libs/gst/mpegts/gst-mpegtspesmetadatameta.h"/>
<return-value transfer-ownership="full">
<return-value transfer-ownership="none">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/mpegts/gst-mpegtspesmetadatameta.h">a newly created #GstMpegtsPESMetadataMeta</doc>
<type name="PESMetadataMeta" c:type="GstMpegtsPESMetadataMeta*"/>
</return-value>

View file

@ -587,12 +587,12 @@ GstPtpClock::internal-clock property will become non-NULL. You can
check this with gst_clock_wait_for_sync(), the GstClock::synced signal and
gst_clock_is_synced().</doc>
<source-position filename="../subprojects/gstreamer/libs/gst/net/gstptpclock.h"/>
<return-value transfer-ownership="full">
<return-value transfer-ownership="full" nullable="1">
<doc xml:space="preserve" filename="../subprojects/gstreamer/libs/gst/net/gstptpclock.c">A new #GstClock</doc>
<type name="Gst.Clock" c:type="GstClock*"/>
</return-value>
<parameters>
<parameter name="name" transfer-ownership="none">
<parameter name="name" transfer-ownership="none" nullable="1" allow-none="1">
<doc xml:space="preserve" filename="../subprojects/gstreamer/libs/gst/net/gstptpclock.c">Name of the clock</doc>
<type name="utf8" c:type="const gchar*"/>
</parameter>

View file

@ -2904,7 +2904,7 @@ in debugging.</doc>
<source-position filename="../subprojects/gst-plugins-base/gst-libs/gst/pbutils/gstpluginsbaseversion.h"/>
<type name="gint" c:type="gint"/>
</constant>
<constant name="PLUGINS_BASE_VERSION_MINOR" value="23" c:type="GST_PLUGINS_BASE_VERSION_MINOR">
<constant name="PLUGINS_BASE_VERSION_MINOR" value="25" c:type="GST_PLUGINS_BASE_VERSION_MINOR">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-base/gst-libs/gst/pbutils/gstpluginsbaseversion.h">The minor version of GStreamer's gst-plugins-base libraries at compile time.</doc>
<source-position filename="../subprojects/gst-plugins-base/gst-libs/gst/pbutils/gstpluginsbaseversion.h"/>
<type name="gint" c:type="gint"/>

View file

@ -312,8 +312,9 @@ from the ground-up, GstPlay provides the features you will most likely need.
An example player is available in gst-examples/playback/player/gst-play/.
Internally the GstPlay makes use of the `playbin` element. `playbin3` can be
selected if the `GST_PLAY_USE_PLAYBIN3=1` environment variable has been set.
Internally the GstPlay makes use of the `playbin3` element. The legacy
`playbin2` can be selected if the `GST_PLAY_USE_PLAYBIN3=0` environment
variable has been set.
**Important note**: If your application relies on the GstBus to get
notifications from GstPlay, you need to add some explicit clean-up code in
@ -434,8 +435,8 @@ This option is disabled by default.</doc>
</parameters>
</function>
<function name="config_set_position_update_interval" c:identifier="gst_play_config_set_position_update_interval" version="1.20">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/play/gstplay.c">set desired interval in milliseconds between two position-updated messages.
pass 0 to stop updating the position.</doc>
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/play/gstplay.c">Set desired interval in milliseconds between two position-updated messages.
Pass 0 to stop updating the position.</doc>
<source-position filename="../subprojects/gst-plugins-bad/gst-libs/gst/play/gstplay.h"/>
<return-value transfer-ownership="none">
<type name="none" c:type="void"/>
@ -546,7 +547,7 @@ matching #GstPlayVideoInfo.</doc>
<function name="is_play_message" c:identifier="gst_play_is_play_message" version="1.20">
<source-position filename="../subprojects/gst-plugins-bad/gst-libs/gst/play/gstplay.h"/>
<return-value transfer-ownership="none">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/play/gstplay.c">A #gboolean indicating wheter the passes message represents a #GstPlay message or not.</doc>
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/play/gstplay.c">A #gboolean indicating whether the passed message represents a #GstPlay message or not.</doc>
<type name="gboolean" c:type="gboolean"/>
</return-value>
<parameters>
@ -834,7 +835,7 @@ currently-playing stream.</doc>
</parameters>
</method>
<method name="get_subtitle_uri" c:identifier="gst_play_get_subtitle_uri" version="1.20">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/play/gstplay.c">current subtitle URI</doc>
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/play/gstplay.c">Current subtitle URI</doc>
<source-position filename="../subprojects/gst-plugins-bad/gst-libs/gst/play/gstplay.h"/>
<return-value transfer-ownership="full" nullable="1">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/play/gstplay.c">URI of the current external subtitle.
@ -879,7 +880,7 @@ currently-playing stream. g_free() after usage.</doc>
</method>
<method name="get_video_snapshot" c:identifier="gst_play_get_video_snapshot" version="1.20">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/play/gstplay.c">Get a snapshot of the currently selected video stream, if any. The format can be
selected with @format and optional configuration is possible with @config
selected with @format and optional configuration is possible with @config.
Currently supported settings are:
- width, height of type G_TYPE_INT
- pixel-aspect-ratio of type GST_TYPE_FRACTION
@ -1054,7 +1055,7 @@ value.</doc>
</method>
<method name="set_config" c:identifier="gst_play_set_config" version="1.20">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/play/gstplay.c">Set the configuration of the play. If the play is already configured, and
the configuration haven't change, this function will return %TRUE. If the
the configuration hasn't changed, this function will return %TRUE. If the
play is not in the GST_PLAY_STATE_STOPPED, this method will return %FALSE
and active configuration will remain.
@ -1276,7 +1277,7 @@ Sets the video track @stream_index.</doc>
<method name="set_visualization" c:identifier="gst_play_set_visualization" version="1.20">
<source-position filename="../subprojects/gst-plugins-bad/gst-libs/gst/play/gstplay.h"/>
<return-value transfer-ownership="none">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/play/gstplay.c">%TRUE if the visualizations was set correctly. Otherwise,
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/play/gstplay.c">%TRUE if the visualization was set correctly. Otherwise,
%FALSE.</doc>
<type name="gboolean" c:type="gboolean"/>
</return-value>

View file

@ -2633,6 +2633,19 @@ the need to handle these extensions manually using the
GstRTPBaseDepayload::request-extension: signal.</doc>
<type name="gboolean" c:type="gboolean"/>
</property>
<property name="extensions" version="1.24" transfer-ownership="none">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-base/gst-libs/gst/rtp/gstrtpbasedepayload.c">A list of already enabled RTP header extensions. This may be useful for finding
out which extensions are already enabled (with add-extension signal) and picking a non-conflicting
ID for a new extension that needs to be added on top of the existing ones.
Note that the value returned by reading this property is not dynamically updated when the set of
enabled extensions changes by any of existing action signals. Rather, it represents the current state
at the time the property is read.
Dynamic updates of this property can be received by subscribing to its corresponding "notify" signal, i.e.
"notify::extensions".</doc>
<type name="Gst.ValueArray"/>
</property>
<property name="max-reorder" version="1.18" writable="1" transfer-ownership="none">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-base/gst-libs/gst/rtp/gstrtpbasedepayload.c">Max seqnum reorder before the sender is assumed to have restarted.

View file

@ -2997,6 +2997,9 @@ UTC times will be converted to nanoseconds since 1900.</doc>
<member name="ok" value="0" c:identifier="GST_RTSP_OK" glib:nick="ok">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-base/gst-libs/gst/rtsp/gstrtspdefs.h">no error</doc>
</member>
<member name="ok_redirect" value="1" c:identifier="GST_RTSP_OK_REDIRECT" version="1.24" glib:nick="ok-redirect">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-base/gst-libs/gst/rtsp/gstrtspdefs.h">RTSP request is successful, but was redirected.</doc>
</member>
<member name="error" value="-1" c:identifier="GST_RTSP_ERROR" glib:nick="error">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-base/gst-libs/gst/rtsp/gstrtspdefs.h">some unspecified error occurred</doc>
</member>
@ -3094,6 +3097,12 @@ UTC times will be converted to nanoseconds since 1900.</doc>
</member>
<member name="use_proxy" value="305" c:identifier="GST_RTSP_STS_USE_PROXY" glib:nick="use-proxy">
</member>
<member name="redirect_temporarily" value="307" c:identifier="GST_RTSP_STS_REDIRECT_TEMPORARILY" version="1.24" glib:nick="redirect-temporarily">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-base/gst-libs/gst/rtsp/gstrtspdefs.h">RTSP request is temporarily redirected</doc>
</member>
<member name="redirect_permanently" value="308" c:identifier="GST_RTSP_STS_REDIRECT_PERMANENTLY" version="1.24" glib:nick="redirect-permanently">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-base/gst-libs/gst/rtsp/gstrtspdefs.h">RTSP request is permanently redirected</doc>
</member>
<member name="bad_request" value="400" c:identifier="GST_RTSP_STS_BAD_REQUEST" glib:nick="bad-request">
</member>
<member name="unauthorized" value="401" c:identifier="GST_RTSP_STS_UNAUTHORIZED" glib:nick="unauthorized">

View file

@ -833,7 +833,7 @@ the most widely used VA drivers.</doc>
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/va/gstvapool.c">a #GstBufferPool</doc>
<type name="Gst.BufferPool" c:type="GstBufferPool*"/>
</parameter>
<parameter name="size" direction="out" caller-allocates="0" transfer-ownership="full">
<parameter name="size" direction="out" caller-allocates="0" transfer-ownership="full" optional="1" allow-none="1">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/va/gstvapool.c">the declared surface size</doc>
<type name="guint" c:type="guint*"/>
</parameter>

View file

@ -7,6 +7,79 @@ and/or use gtk-doc annotations. -->
<package name="gstreamer-video-1.0"/>
<c:include name="gst/video/video.h"/>
<namespace name="GstVideo" version="1.0" shared-library="libgstvideo-1.0.so.0" c:identifier-prefixes="Gst" c:symbol-prefixes="gst">
<record name="AncillaryMeta" c:type="GstAncillaryMeta" version="1.24">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-base/gst-libs/gst/video/video-anc.h">#GstMeta for carrying SMPTE-291M Ancillary data. Note that all the ADF fields
(@DID to @checksum) are 10bit values with parity/non-parity high-bits set.</doc>
<source-position filename="../subprojects/gst-plugins-base/gst-libs/gst/video/video-anc.h"/>
<field name="meta" writable="1">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-base/gst-libs/gst/video/video-anc.h">Parent #GstMeta</doc>
<type name="Gst.Meta" c:type="GstMeta"/>
</field>
<field name="field" writable="1">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-base/gst-libs/gst/video/video-anc.h">The field where the ancillary data is located</doc>
<type name="AncillaryMetaField" c:type="GstAncillaryMetaField"/>
</field>
<field name="c_not_y_channel" writable="1">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-base/gst-libs/gst/video/video-anc.h">Which channel (luminance or chrominance) the ancillary
data is located. 0 if content is SD or stored in the luminance channel
(default). 1 if HD and stored in the chrominance channel.</doc>
<type name="gboolean" c:type="gboolean"/>
</field>
<field name="line" writable="1">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-base/gst-libs/gst/video/video-anc.h">The line on which the ancillary data is located (max 11bit). There
are two special values: 0x7ff if no line is specified (default), 0x7fe
to specify the ancillary data is on any valid line before active video</doc>
<type name="guint16" c:type="guint16"/>
</field>
<field name="offset" writable="1">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-base/gst-libs/gst/video/video-anc.h">The location of the ancillary data packet in a SDI raster relative
to the start of active video (max 12bits). A value of 0 means the ADF of
the ancillary packet starts immediately following SAV. There are 3
special values: 0xfff: No specified location (default), 0xffe: within
HANC data space, 0xffd: within the ancillary data space located between
SAV and EAV</doc>
<type name="guint16" c:type="guint16"/>
</field>
<field name="DID" writable="1">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-base/gst-libs/gst/video/video-anc.h">Data Identified</doc>
<type name="guint16" c:type="guint16"/>
</field>
<field name="SDID_block_number" writable="1">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-base/gst-libs/gst/video/video-anc.h">Secondary Data identification (if type 2) or Data block
number (if type 1)</doc>
<type name="guint16" c:type="guint16"/>
</field>
<field name="data_count" writable="1">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-base/gst-libs/gst/video/video-anc.h">The amount of user data</doc>
<type name="guint16" c:type="guint16"/>
</field>
<field name="data" writable="1">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-base/gst-libs/gst/video/video-anc.h">The User data</doc>
<type name="guint16" c:type="guint16*"/>
</field>
<field name="checksum" writable="1">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-base/gst-libs/gst/video/video-anc.h">The checksum of the ADF</doc>
<type name="guint16" c:type="guint16"/>
</field>
<function name="get_info" c:identifier="gst_ancillary_meta_get_info">
<source-position filename="../subprojects/gst-plugins-base/gst-libs/gst/video/video-anc.h"/>
<return-value transfer-ownership="none">
<type name="Gst.MetaInfo" c:type="const GstMetaInfo*"/>
</return-value>
</function>
</record>
<enumeration name="AncillaryMetaField" version="1.24" glib:type-name="GstAncillaryMetaField" glib:get-type="gst_ancillary_meta_field_get_type" c:type="GstAncillaryMetaField">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-base/gst-libs/gst/video/video-anc.h">Location of a @GstAncillaryMeta.</doc>
<member name="progressive" value="0" c:identifier="GST_ANCILLARY_META_FIELD_PROGRESSIVE" glib:nick="progressive">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-base/gst-libs/gst/video/video-anc.h">Progressive or no field specified (default)</doc>
</member>
<member name="interlaced_first" value="16" c:identifier="GST_ANCILLARY_META_FIELD_INTERLACED_FIRST" glib:nick="interlaced-first">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-base/gst-libs/gst/video/video-anc.h">Interlaced first field</doc>
</member>
<member name="interlaced_second" value="17" c:identifier="GST_ANCILLARY_META_FIELD_INTERLACED_SECOND" glib:nick="interlaced-second">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-base/gst-libs/gst/video/video-anc.h">Interlaced second field</doc>
</member>
</enumeration>
<constant name="BUFFER_POOL_OPTION_VIDEO_AFFINE_TRANSFORMATION_META" value="GstBufferPoolOptionVideoAffineTransformation" c:type="GST_BUFFER_POOL_OPTION_VIDEO_AFFINE_TRANSFORMATION_META">
<source-position filename="../subprojects/gst-plugins-base/gst-libs/gst/video/gstvideoaffinetransformationmeta.h"/>
<type name="utf8" c:type="gchar*"/>
@ -15799,6 +15872,33 @@ data.</doc>
<doc xml:space="preserve" filename="../subprojects/gst-plugins-base/gst-libs/gst/video/video-anc.h">An error occurred</doc>
</member>
</enumeration>
<function name="ancillary_meta_api_get_type" c:identifier="gst_ancillary_meta_api_get_type">
<source-position filename="../subprojects/gst-plugins-base/gst-libs/gst/video/video-anc.h"/>
<return-value transfer-ownership="none">
<type name="GType" c:type="GType"/>
</return-value>
</function>
<function name="ancillary_meta_get_info" c:identifier="gst_ancillary_meta_get_info" moved-to="AncillaryMeta.get_info">
<source-position filename="../subprojects/gst-plugins-base/gst-libs/gst/video/video-anc.h"/>
<return-value transfer-ownership="none">
<type name="Gst.MetaInfo" c:type="const GstMetaInfo*"/>
</return-value>
</function>
<function name="buffer_add_ancillary_meta" c:identifier="gst_buffer_add_ancillary_meta" version="1.24">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-base/gst-libs/gst/video/video-anc.c">Adds a new #GstAncillaryMeta to the @buffer. The caller is responsible for setting the appropriate
fields.</doc>
<source-position filename="../subprojects/gst-plugins-base/gst-libs/gst/video/video-anc.h"/>
<return-value transfer-ownership="none">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-base/gst-libs/gst/video/video-anc.c">A new #GstAncillaryMeta, or %NULL if an error happened.</doc>
<type name="AncillaryMeta" c:type="GstAncillaryMeta*"/>
</return-value>
<parameters>
<parameter name="buffer" transfer-ownership="none">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-base/gst-libs/gst/video/video-anc.c">A #GstBuffer</doc>
<type name="Gst.Buffer" c:type="GstBuffer*"/>
</parameter>
</parameters>
</function>
<function name="buffer_add_video_afd_meta" c:identifier="gst_buffer_add_video_afd_meta" version="1.18">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-base/gst-libs/gst/video/video-anc.c">Attaches #GstVideoAFDMeta metadata to @buffer with the given
parameters.</doc>
@ -16249,6 +16349,18 @@ parameters.</doc>
</parameter>
</parameters>
</function>
<function-macro name="buffer_get_ancillary_meta" c:identifier="gst_buffer_get_ancillary_meta" version="1.24" introspectable="0">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-base/gst-libs/gst/video/video-anc.h">Gets the #GstAncillaryMeta that might be present on @b.
Note: It is quite likely that there might be more than one ancillary meta on
a given buffer. This function will only return the first one. See gst_buffer_iterate_ancillary_meta() for a way to iterate over all ancillary metas of the buffer.</doc>
<source-position filename="../subprojects/gst-plugins-base/gst-libs/gst/video/video-anc.h"/>
<parameters>
<parameter name="b">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-base/gst-libs/gst/video/video-anc.h">A #GstBuffer</doc>
</parameter>
</parameters>
</function-macro>
<function-macro name="buffer_get_video_afd_meta" c:identifier="gst_buffer_get_video_afd_meta" version="1.18" introspectable="0">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-base/gst-libs/gst/video/video-anc.h">Gets the #GstVideoAFDMeta that might be present on @b.
@ -16407,6 +16519,22 @@ no such metadata on @buffer.</doc>
</parameter>
</parameters>
</function-macro>
<function-macro name="buffer_iterate_ancillary_meta" c:identifier="gst_buffer_iterate_ancillary_meta" version="1.24" introspectable="0">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-base/gst-libs/gst/video/video-anc.h">Retrieves the next #GstAncillaryMeta after the current one according to
@s. If @s points to %NULL, the first #GstAncillaryMeta will be returned (if
any).
@s will be updated with an opaque state pointer.</doc>
<source-position filename="../subprojects/gst-plugins-base/gst-libs/gst/video/video-anc.h"/>
<parameters>
<parameter name="b">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-base/gst-libs/gst/video/video-anc.h">A #GstBuffer</doc>
</parameter>
<parameter name="s">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-base/gst-libs/gst/video/video-anc.h">An opaque state pointer</doc>
</parameter>
</parameters>
</function-macro>
<function name="buffer_pool_config_get_video_alignment" c:identifier="gst_buffer_pool_config_get_video_alignment">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-base/gst-libs/gst/video/gstvideopool.c">Get the video alignment from the bufferpool configuration @config in
in @align</doc>

View file

@ -3501,6 +3501,15 @@ inside @handle.</doc>
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/vulkan/gstvkimagebufferpool.c">Vulkan memory property flags.</doc>
<type name="Vulkan.MemoryPropertyFlags" c:type="VkMemoryPropertyFlags"/>
</parameter>
<parameter name="initial_layout" transfer-ownership="none">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/vulkan/gstvkimagebufferpool.c">Initial Vulkan image layout.</doc>
<type name="Vulkan.ImageLayout" c:type="VkImageLayout"/>
</parameter>
<parameter name="initial_access" transfer-ownership="none">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/vulkan/gstvkimagebufferpool.c">Access flags for the layout transition if @initial_layout is
not VK_IMAGE_LAYOUT_UNDEFINED or VK_IMAGE_LAYOUT_PREINITIALIZED.</doc>
<type name="guint64" c:type="guint64"/>
</parameter>
</parameters>
</function>
<function name="config_set_decode_caps" c:identifier="gst_vulkan_image_buffer_pool_config_set_decode_caps" version="1.24">
@ -3704,6 +3713,9 @@ dest or DPB images.</doc>
<parameter name="usage" transfer-ownership="none">
<type name="Vulkan.ImageUsageFlags" c:type="VkImageUsageFlags"/>
</parameter>
<parameter name="initial_layout" transfer-ownership="none">
<type name="Vulkan.ImageLayout" c:type="VkImageLayout"/>
</parameter>
<parameter name="params" transfer-ownership="none">
<type name="Gst.AllocationParams" c:type="GstAllocationParams*"/>
</parameter>
@ -4341,6 +4353,10 @@ It can be called from any thread.</doc>
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/vulkan/gstvkmemory.h">number of times this memory is mapped</doc>
<type name="guint" c:type="guint"/>
</field>
<field name="mapping" version="1.24" writable="1">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/vulkan/gstvkmemory.h">internal pointer to already mapped memory</doc>
<type name="gpointer" c:type="gpointer"/>
</field>
<field name="notify" readable="0" private="1">
<type name="GLib.DestroyNotify" c:type="GDestroyNotify"/>
</field>

View file

@ -1,5 +1,5 @@
project('gstreamer-full', 'c',
version : '1.23.0.1',
version : '1.25.0.1',
meson_version : '>= 1.1',
default_options : ['buildtype=debugoptimized',
# Needed due to https://github.com/mesonbuild/meson/issues/1889,

View file

@ -2,4 +2,4 @@
directory=FFmpeg
url=https://gitlab.freedesktop.org/gstreamer/meson-ports/ffmpeg.git
push-url=git@gitlab.freedesktop.org:gstreamer/meson-ports/ffmpeg.git
revision=meson-4.4
revision=meson-6.1

File diff suppressed because it is too large Load diff

View file

@ -1,17 +1,15 @@
This is GStreamer gst-devtools 1.22.0.
This is GStreamer gst-devtools 1.25.0.1.
The GStreamer team is thrilled to announce a new major feature release
of your favourite cross-platform multimedia framework!
GStreamer 1.25 is the unstable development branch leading up to the next major
stable version which will be 1.26.
The 1.25 development series adds new features on top of the 1.24 series and is
part of the API and ABI-stable 1.x release series of the GStreamer multimedia
framework.
As always, this release is again packed with new features, bug fixes and
other improvements.
Full release notes will one day be found at:
The 1.22 release series adds new features on top of the 1.20 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.26/
Binaries for Android, iOS, Mac OS X and Windows will usually be provided
shortly after the release.
@ -44,10 +42,7 @@ with other GStreamer modules for a complete multimedia experience.
- 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 +75,18 @@ Please submit patches via GitLab as well, in form of Merge Requests. See
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 +98,9 @@ and can also be cloned from there and this is also where you can submit
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

@ -37,7 +37,7 @@ def load(paths=()):
def _load_plugins(path):
import imp
import importlib
import glob
files = glob.glob(os.path.join(path, "*.py"))
@ -47,8 +47,16 @@ def _load_plugins(path):
name = os.path.basename(os.path.splitext(filename)[0])
if name == "__init__":
continue
fp, pathname, description = imp.find_module(name, [path])
module = imp.load_module(name, fp, pathname, description)
finder = importlib.machinery.PathFinder()
spec = finder.find_spec(
name,
os.environ.get('_GI_OVERRIDES_PATH', '').split(os.pathsep)
)
if spec is None:
raise ModuleNotFoundError(name)
module = importlib.util.module_from_spec(spec)
yield module

View file

@ -53,6 +53,46 @@
</GitRepository>
</repository>
<release>
<Version>
<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-devtools/gst-devtools-1.24.0.tar.xz" />
</Version>
</release>
<release>
<Version>
<revision>1.23.90</revision>
<branch>main</branch>
<name></name>
<created>2024-02-23</created>
<file-release rdf:resource="https://gstreamer.freedesktop.org/src/gst-devtools/gst-devtools-1.23.90.tar.xz" />
</Version>
</release>
<release>
<Version>
<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-devtools/gst-devtools-1.23.2.tar.xz" />
</Version>
</release>
<release>
<Version>
<revision>1.23.1</revision>
<branch>main</branch>
<name></name>
<created>2024-02-06</created>
<file-release rdf:resource="https://gstreamer.freedesktop.org/src/gst-devtools/gst-devtools-1.23.1.tar.xz" />
</Version>
</release>
<release>
<Version>
<revision>1.22.0</revision>

View file

@ -1,6 +1,6 @@
project('gst-devtools', 'c',
version : '1.23.0.1',
meson_version : '>= 0.62',
version : '1.25.0.1',
meson_version : '>= 1.1',
default_options : [ 'warning_level=1',
'c_std=gnu99',
'buildtype=debugoptimized' ])
@ -176,7 +176,7 @@ if not get_option('debug_viewer').disabled()
endif
subdir('docs')
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

@ -373,6 +373,7 @@ validate_flow_format_buffer (GstBuffer * buffer, gint checksum_type,
buffer_parts_index > 0 ? g_strjoinv (", ",
buffer_parts) : g_strdup ("(empty)");
g_strfreev (ignored_fields);
g_free (meta_str);
g_free (flags_str);
while (buffer_parts_index > 0)

View file

@ -48,6 +48,7 @@ typedef struct _GstValidateReporterPrivate
} GstValidateReporterPrivate;
static GstValidateReporterPrivate *g_log_handler = NULL;
static GWeakRef log_reporter;
G_DEFINE_INTERFACE (GstValidateReporter, gst_validate_reporter, G_TYPE_OBJECT);
@ -284,28 +285,25 @@ gst_validate_default_log_hanlder (const gchar * log_domain,
g_log_default_handler (log_domain, log_level, message, user_data);
}
static void
gst_validate_reporter_destroyed (gpointer udata, GObject * freed_reporter)
{
g_log_set_handler ("GStreamer",
G_LOG_LEVEL_MASK, (GLogFunc) gst_validate_default_log_hanlder, NULL);
g_log_set_handler ("GLib",
G_LOG_LEVEL_MASK, (GLogFunc) gst_validate_default_log_hanlder, NULL);
g_log_set_handler ("GLib-GObject",
G_LOG_LEVEL_MASK, (GLogFunc) gst_validate_default_log_hanlder, NULL);
}
static void
gst_validate_reporter_g_log_func (const gchar * log_domain,
GLogLevelFlags log_level, const gchar * message,
GstValidateReporter * reporter)
GLogLevelFlags log_level, const gchar * message, gpointer udata)
{
GstValidateReporter *reporter = g_weak_ref_get (&log_reporter);
g_printerr ("G_LOG: %s\n", message);
if (!reporter) {
gst_validate_default_log_hanlder (log_domain, log_level, message, NULL);
return;
}
if (log_level & G_LOG_LEVEL_ERROR)
gst_validate_default_log_hanlder (log_domain, log_level, message, reporter);
else if (log_level & G_LOG_LEVEL_CRITICAL)
GST_VALIDATE_REPORT (reporter, G_LOG_CRITICAL, "%s", message);
else if (log_level & G_LOG_LEVEL_WARNING)
GST_VALIDATE_REPORT (reporter, G_LOG_WARNING, "%s", message);
gst_object_unref (reporter);
}
/**
@ -487,23 +485,21 @@ gst_validate_reporter_set_runner (GstValidateReporter * reporter,
void
gst_validate_reporter_set_handle_g_logs (GstValidateReporter * reporter)
{
g_log_set_default_handler ((GLogFunc) gst_validate_reporter_g_log_func,
reporter);
g_weak_ref_set (&log_reporter, reporter);
g_log_set_default_handler ((GLogFunc) gst_validate_reporter_g_log_func, NULL);
g_log_set_handler ("GStreamer",
G_LOG_LEVEL_MASK, (GLogFunc) gst_validate_reporter_g_log_func, reporter);
G_LOG_LEVEL_MASK, (GLogFunc) gst_validate_reporter_g_log_func, NULL);
g_log_set_handler ("GLib",
G_LOG_LEVEL_MASK, (GLogFunc) gst_validate_reporter_g_log_func, reporter);
G_LOG_LEVEL_MASK, (GLogFunc) gst_validate_reporter_g_log_func, NULL);
g_log_set_handler ("GLib-GObject",
G_LOG_LEVEL_MASK, (GLogFunc) gst_validate_reporter_g_log_func, reporter);
G_LOG_LEVEL_MASK, (GLogFunc) gst_validate_reporter_g_log_func, NULL);
g_log_handler = gst_validate_reporter_get_priv (reporter);
g_object_weak_ref (G_OBJECT (reporter), gst_validate_reporter_destroyed,
NULL);
}
/**

View file

@ -5941,24 +5941,27 @@ gst_validate_scenario_new (GstValidateRunner *
GstClockTime base_time, start_time;
gboolean use_system_clock = FALSE;
if (gst_validate_utils_get_clocktime (scenario->description, "base-time",
&base_time)) {
gst_validate_printf (NULL,
"**-> Setting %" GST_PTR_FORMAT " base time to %" GST_TIMEP_FORMAT
"**\n", pipeline, &base_time);
gst_element_set_base_time (GST_ELEMENT (pipeline), base_time);
if (scenario->description) {
if (gst_validate_utils_get_clocktime (scenario->description, "base-time",
&base_time)) {
gst_validate_printf (NULL,
"**-> Setting %" GST_PTR_FORMAT " base time to %" GST_TIMEP_FORMAT
"**\n", pipeline, &base_time);
gst_element_set_base_time (GST_ELEMENT (pipeline), base_time);
}
if (gst_validate_utils_get_clocktime (scenario->description, "start-time",
&start_time)) {
gst_validate_printf (NULL,
"**-> Setting %" GST_PTR_FORMAT " start time to %" GST_TIMEP_FORMAT
"**\n", pipeline, &base_time);
gst_element_set_start_time (GST_ELEMENT (pipeline), start_time);
}
gst_structure_get_boolean (scenario->description, "use-system-clock",
&use_system_clock);
}
if (gst_validate_utils_get_clocktime (scenario->description, "start-time",
&start_time)) {
gst_validate_printf (NULL,
"**-> Setting %" GST_PTR_FORMAT " start time to %" GST_TIMEP_FORMAT
"**\n", pipeline, &base_time);
gst_element_set_start_time (GST_ELEMENT (pipeline), start_time);
}
gst_structure_get_boolean (scenario->description, "use-system-clock",
&use_system_clock);
if (scenario->priv->clock) {
if (use_system_clock)
gst_validate_abort

View file

@ -352,7 +352,7 @@ class GstCheckTestsManager(MesonTestsManager):
arggroup.add_argument("--gst-check-leak-trace-testnames",
default=None,
help="A regex to specifying testsnames of the test"
"to run with the leak tracer activated, if 'known-not-leaky'"
" to run with the leak tracer activated, if 'known-not-leaky'"
" is specified, the testsuite will automatically activate"
" leak tracers on tests known to be not leaky.")
arggroup.add_argument("--gst-check-leak-options",

View file

@ -466,12 +466,13 @@ class GstValidatePlaybinTestsGenerator(GstValidatePipelineTestsGenerator):
for scenario in special_scenarios + scenarios:
cpipe = pipe
if not minfo.media_descriptor.is_compatible(scenario):
continue
cpipe = self._set_sinks(minfo, cpipe, scenario)
fname = self._get_name(scenario, protocol, minfo)
if not minfo.media_descriptor.is_compatible(scenario):
self.debug("Skipping (media descriptor is not compatible): %s", fname)
continue
self.debug("Adding: %s", fname)
if scenario.does_reverse_playback() and protocol == Protocols.HTTP:
@ -490,6 +491,7 @@ class GstValidatePlaybinTestsGenerator(GstValidatePipelineTestsGenerator):
rtspminfo = NamedDic({"path": minfo.media_descriptor.get_path(),
"media_descriptor": GstValidateRTSPMediaDescriptor(minfo.media_descriptor.get_path())})
if not rtspminfo.media_descriptor.is_compatible(scenario):
self.debug("Skipping (media descriptor is not compatible for rtsp test): %s", fname)
continue
cpipe = self._set_sinks(rtspminfo, "%s uri=rtsp://127.0.0.1:<RTSPPORTNUMBER>/test"
@ -989,7 +991,7 @@ class GstValidateRTSPMediaDescriptor(GstValidateMediaDescriptor):
def get_protocol(self):
return Protocols.RTSP
def prerrols(self):
def prerolls(self):
return False

View file

@ -2631,7 +2631,7 @@ class MediaDescriptor(Loggable):
def can_play_reverse(self):
raise NotImplemented
def prerrols(self):
def prerolls(self):
return True
def is_compatible(self, scenario):
@ -2649,6 +2649,8 @@ class MediaDescriptor(Loggable):
return False
if not self.can_play_reverse() and scenario.does_reverse_playback():
self.debug("Do not run %s as %s can not play reverse ",
scenario, self.get_uri())
return False
if not self.is_live() and scenario.needs_live_content():
@ -2661,7 +2663,9 @@ class MediaDescriptor(Loggable):
scenario, self.get_uri())
return False
if not self.prerrols() and getattr(scenario, 'needs_preroll', False):
if not self.prerolls() and getattr(scenario, 'needs_preroll', False):
self.debug("Do not run %s as %s does not support preroll",
scenario, self.get_uri())
return False
if self.get_duration() and self.get_duration() / GST_SECOND < scenario.get_min_media_duration():
@ -2674,7 +2678,7 @@ class MediaDescriptor(Loggable):
for track_type in ['audio', 'subtitle', 'video']:
if self.get_num_tracks(track_type) < scenario.get_min_tracks(track_type):
self.debug("%s -- %s | At least %s %s track needed < %s"
self.debug("Do not run %s -- %s | At least %s %s track needed < %s"
% (scenario, self.get_uri(), track_type,
scenario.get_min_tracks(track_type),
self.get_num_tracks(track_type)))

View file

@ -26,7 +26,7 @@ import os
TEST_MANAGER = "check"
KNOWN_NOT_LEAKY = r'^check.gst-devtools.*|^check.gstreamer.*|^check-gst-plugins-base|^check.gst-plugins-ugly|^check.gst-plugins-good'
KNOWN_NOT_LEAKY = r'^gst-devtools.*|^gstreamer.*|^gst-plugins-base|^gst-plugins-ugly|^gst-plugins-good'
# These tests take very long compared to what they add, so let's skip them.
LONG_VALGRIND_TESTS = [
@ -98,11 +98,13 @@ VALGRIND_BLACKLIST = [
(r'check.gst-plugins-good.elements_rtpjitterbuffer.test_push_backward_seq', 'flaky in valgrind'),
(r'check.gst-plugins-good.elements_rtpjitterbuffer.test_push_unordered', 'flaky in valgrind'),
(r'check.gst-plugins-bad.elements_assrender', '?'),
(r'check.gst-plugins-bad.elements_autovideoconvert.test_autovideoconvert_videoconvert', 'Leak with GLX, https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/3216'),
(r'check.gst-plugins-bad.elements_camerabin', '?'),
(r'check.gst-plugins-bad.elements_line21', '?'),
(r'check.gst-plugins-bad.elements_mpeg2enc', '?'),
(r'check.gst-plugins-bad.elements_mplex', '?'),
(r'check.gst-plugins-bad.elements_mxfmux', '?'),
(r'check.gst-plugins-bad.elements_srt.test_src_listener_sink_caller', 'Need to investigate libsrt leaks (flaky)'),
(r'check.gst-plugins-bad.elements_x265enc', '?'),
(r'check.gst-plugins-bad.elements_zbar', '?'),
(r'check.gst-plugins-bad.elements_webrtcbin.test_data_channel_remote_notify', 'Need to fix leaks'),
@ -179,6 +181,23 @@ CI_BLACKLIST = [
KNOWN_ISSUES = {
"https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/2973": {
"tests": [
"check.gst-editing-services.complex_effect_bin_desc"
],
"issues": [
{
'returncode': 238,
'sometimes': True,
},
{
"issue-id": "validateflow::mismatch",
"summary": "The recorded log does not match the expectation file.",
"level": "critical",
# "details": "Mismatch error in pad videosink:sink, line 4. Expected:\nbuffer: checksum=369888c2612267760fcfaa74e52fc53bd73e4d15, pts=0:00:00.000000000, dur=0:00:00.033333333, meta=GstVideoMeta\nActual:\nbuffer: checksum=b7764dce84f311119c4c36b511ba5adb66de76af, pts=0:00:00.000000000, dur=0:00:00.033333333, meta=GstVideoMeta\n",
},
],
},
"https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/773": {
"tests": [
r"check.gst-plugins-bad.elements_webrtcbin.*",

View file

@ -31,8 +31,8 @@ GST_START_TEST (test_resolve_variables)
NULL);
fail_unless (gst_structure_is_equal (struct_with_vars, expected),
"\nReplaced: `%s`\n!=\nExpected: `%s`",
gst_structure_serialize (struct_with_vars, GST_SERIALIZE_FLAG_NONE),
gst_structure_serialize (expected, GST_SERIALIZE_FLAG_NONE));
gst_structure_serialize_full (struct_with_vars, GST_SERIALIZE_FLAG_NONE),
gst_structure_serialize_full (expected, GST_SERIALIZE_FLAG_NONE));
gst_structure_free (variables);
gst_structure_free (struct_with_vars);

View file

@ -47,7 +47,7 @@ int
main (int argc, char *argv[])
{
#if defined(__APPLE__) && TARGET_OS_MAC && !TARGET_OS_IPHONE
return gst_macos_main (tutorial_main, argc, argv, NULL);
return gst_macos_main ((GstMainFunc) tutorial_main, argc, argv, NULL);
#else
return tutorial_main (argc, argv);
#endif

View file

@ -115,7 +115,7 @@ int
main (int argc, char *argv[])
{
#if defined(__APPLE__) && TARGET_OS_MAC && !TARGET_OS_IPHONE
return gst_macos_main (tutorial_main, argc, argv, NULL);
return gst_macos_main ((GstMainFunc) tutorial_main, argc, argv, NULL);
#else
return tutorial_main (argc, argv);
#endif

View file

@ -169,7 +169,7 @@ int
main (int argc, char *argv[])
{
#if defined(__APPLE__) && TARGET_OS_MAC && !TARGET_OS_IPHONE
return gst_macos_main (tutorial_main, argc, argv, NULL);
return gst_macos_main ((GstMainFunc) tutorial_main, argc, argv, NULL);
#else
return tutorial_main (argc, argv);
#endif

View file

@ -115,7 +115,7 @@ int
main (int argc, char *argv[])
{
#if defined(__APPLE__) && TARGET_OS_MAC && !TARGET_OS_IPHONE
return gst_macos_main (tutorial_main, argc, argv, NULL);
return gst_macos_main ((GstMainFunc) tutorial_main, argc, argv, NULL);
#else
return tutorial_main (argc, argv);
#endif

View file

@ -89,7 +89,7 @@ int
main (int argc, char *argv[])
{
#if defined(__APPLE__) && TARGET_OS_MAC && !TARGET_OS_IPHONE
return gst_macos_main (tutorial_main, argc, argv, NULL);
return gst_macos_main ((GstMainFunc) tutorial_main, argc, argv, NULL);
#else
return tutorial_main (argc, argv);
#endif

View file

@ -175,7 +175,7 @@ int
main (int argc, char *argv[])
{
#if defined(__APPLE__) && TARGET_OS_MAC && !TARGET_OS_IPHONE
return gst_macos_main (tutorial_main, argc, argv, NULL);
return gst_macos_main ((GstMainFunc) tutorial_main, argc, argv, NULL);
#else
return tutorial_main (argc, argv);
#endif

View file

@ -179,7 +179,7 @@ int
main (int argc, char *argv[])
{
#if defined(__APPLE__) && TARGET_OS_MAC && !TARGET_OS_IPHONE
return gst_macos_main (tutorial_main, argc, argv, NULL);
return gst_macos_main ((GstMainFunc) tutorial_main, argc, argv, NULL);
#else
return tutorial_main (argc, argv);
#endif

View file

@ -418,7 +418,7 @@ int
main (int argc, char *argv[])
{
#if defined(__APPLE__) && TARGET_OS_MAC && !TARGET_OS_IPHONE
return gst_macos_main (tutorial_main, argc, argv, NULL);
return gst_macos_main ((GstMainFunc) tutorial_main, argc, argv, NULL);
#else
return tutorial_main (argc, argv);
#endif

View file

@ -231,7 +231,7 @@ int
main (int argc, char *argv[])
{
#if defined(__APPLE__) && TARGET_OS_MAC && !TARGET_OS_IPHONE
return gst_macos_main (tutorial_main, argc, argv, NULL);
return gst_macos_main ((GstMainFunc) tutorial_main, argc, argv, NULL);
#else
return tutorial_main (argc, argv);
#endif

View file

@ -105,7 +105,7 @@ int
main (int argc, char *argv[])
{
#if defined(__APPLE__) && TARGET_OS_MAC && !TARGET_OS_IPHONE
return gst_macos_main (tutorial_main, argc, argv, NULL);
return gst_macos_main ((GstMainFunc) tutorial_main, argc, argv, NULL);
#else
return tutorial_main (argc, argv);
#endif

View file

@ -277,7 +277,7 @@ int
main (int argc, char *argv[])
{
#if defined(__APPLE__) && TARGET_OS_MAC && !TARGET_OS_IPHONE
return gst_macos_main (tutorial_main, argc, argv, NULL);
return gst_macos_main ((GstMainFunc) tutorial_main, argc, argv, NULL);
#else
return tutorial_main (argc, argv);
#endif

View file

@ -247,7 +247,7 @@ int
main (int argc, char *argv[])
{
#if defined(__APPLE__) && TARGET_OS_MAC && !TARGET_OS_IPHONE
return gst_macos_main (tutorial_main, argc, argv, NULL);
return gst_macos_main ((GstMainFunc) tutorial_main, argc, argv, NULL);
#else
return tutorial_main (argc, argv);
#endif

View file

@ -249,7 +249,7 @@ int
main (int argc, char *argv[])
{
#if defined(__APPLE__) && TARGET_OS_MAC && !TARGET_OS_IPHONE
return gst_macos_main (tutorial_main, argc, argv, NULL);
return gst_macos_main ((GstMainFunc) tutorial_main, argc, argv, NULL);
#else
return tutorial_main (argc, argv);
#endif

View file

@ -253,7 +253,7 @@ int
main (int argc, char *argv[])
{
#if defined(__APPLE__) && TARGET_OS_MAC && !TARGET_OS_IPHONE
return gst_macos_main (tutorial_main, argc, argv, NULL);
return gst_macos_main ((GstMainFunc) tutorial_main, argc, argv, NULL);
#else
return tutorial_main (argc, argv);
#endif

View file

@ -179,7 +179,7 @@ int
main (int argc, char *argv[])
{
#if defined(__APPLE__) && TARGET_OS_MAC && !TARGET_OS_IPHONE
return gst_macos_main (tutorial_main, argc, argv, NULL);
return gst_macos_main ((GstMainFunc) tutorial_main, argc, argv, NULL);
#else
return tutorial_main (argc, argv);
#endif

View file

@ -195,7 +195,7 @@ int
main (int argc, char *argv[])
{
#if defined(__APPLE__) && TARGET_OS_MAC && !TARGET_OS_IPHONE
return gst_macos_main (tutorial_main, argc, argv, NULL);
return gst_macos_main ((GstMainFunc) tutorial_main, argc, argv, NULL);
#else
return tutorial_main (argc, argv);
#endif

View file

@ -172,7 +172,7 @@ int
main (int argc, char *argv[])
{
#if defined(__APPLE__) && TARGET_OS_MAC && !TARGET_OS_IPHONE
return gst_macos_main (tutorial_main, argc, argv, NULL);
return gst_macos_main ((GstMainFunc) tutorial_main, argc, argv, NULL);
#else
return tutorial_main (argc, argv);
#endif

View file

@ -108,7 +108,7 @@ int
main (int argc, char *argv[])
{
#if defined(__APPLE__) && TARGET_OS_MAC && !TARGET_OS_IPHONE
return gst_macos_main (tutorial_main, argc, argv, NULL);
return gst_macos_main ((GstMainFunc) tutorial_main, argc, argv, NULL);
#else
return tutorial_main (argc, argv);
#endif

View file

@ -69,7 +69,7 @@ int
main (int argc, char *argv[])
{
#if defined(__APPLE__) && TARGET_OS_MAC && !TARGET_OS_IPHONE
return gst_macos_main (tutorial_main, argc, argv, NULL);
return gst_macos_main ((GstMainFunc) tutorial_main, argc, argv, NULL);
#else
return tutorial_main (argc, argv);
#endif

View file

@ -22,7 +22,7 @@ decoding the file immediately.
2) We need to inform the video encoder that it should start encoding a
keyframe starting from exactly the frame with the pattern.
3) We need to inform the demuxer that it should flush out any pending
3) We need to inform the muxer that it should flush out any pending
data and start creating the start of a new file with the keyframe as
a first video frame.

View file

@ -311,7 +311,7 @@ extensions)
- filters: (string): A comma separated list of object types to trace (make sure to enclose in
quotation marks)
**Run the leaks tracer on all `GstProxyPad` objects logging the references with a full backtraces**
**Run the leaks tracer on all `GstProxyPad` objects logging the references with full backtraces**
```
GST_TRACERS=leaks(stack-traces-flags=full,filters=”GstProxyPad”,check-refs=true) COMMAND
@ -422,22 +422,22 @@ little driver * <https://github.com/dkogan/feedgnuplot>
### Traces for buffer flow, events and messages in TRACE level:
```
GST_DEBUG="GST_TRACER:7,GST_BUFFER*:7,GST_EVENT:7,GST_MESSAGE:7"
GST_TRACERS=log gst-launch-1.0 fakesrc num-buffers=10 ! fakesink -
GST_DEBUG="GST_TRACER:7,GST_BUFFER*:7,GST_EVENT:7,GST_MESSAGE:7" \
GST_TRACERS=log gst-launch-1.0 fakesrc num-buffers=10 ! fakesink
```
### Print some pipeline stats on exit:
```
GST_DEBUG="GST_TRACER:7" GST_TRACERS="stats;rusage"
GST_DEBUG_FILE=trace.log gst-launch-1.0 fakesrc num-buffers=10
GST_DEBUG="GST_TRACER:7" GST_TRACERS="stats;rusage" \
GST_DEBUG_FILE=trace.log gst-launch-1.0 fakesrc num-buffers=10 \
sizetype=fixed ! queue ! fakesink && gst-stats-1.0 trace.log
```
### get ts, average-cpuload, current-cpuload, time and plot
```
GST_DEBUG="GST_TRACER:7" GST_TRACERS="stats;rusage"
GST_DEBUG="GST_TRACER:7" GST_TRACERS="stats;rusage" \
GST_DEBUG_FILE=trace.log /usr/bin/gst-play-1.0 $HOME/Videos/movie.mp4 &&
./scripts/gst-plot-traces.sh --format=png | gnuplot eog trace.log.*.png
```
@ -453,7 +453,7 @@ autoaudiosink
### print processing latencies for each element
```
GST_DEBUG="GST_TRACER:7" GST_TRACERS=latency(flags=element) gst-launch-1.0 \
GST_DEBUG="GST_TRACER:7" GST_TRACERS="latency(flags=element)" gst-launch-1.0 \
audiotestsrc num-buffers=10 ! audioconvert ! volume volume=0.7 ! \
autoaudiosink
```
@ -461,7 +461,7 @@ autoaudiosink
### print reported latencies for each element
```
GST_DEBUG="GST_TRACER:7" GST_TRACERS=latency(flags=reported) gst-launch-1.0 \
GST_DEBUG="GST_TRACER:7" GST_TRACERS="latency(flags=reported)" gst-launch-1.0 \
audiotestsrc num-buffers=10 ! audioconvert ! volume volume=0.7 ! \
autoaudiosink
```
@ -470,7 +470,7 @@ autoaudiosink
```
GST_DEBUG="GST_TRACER:7" \
GST_TRACERS=latency(flags=pipeline+element+reported) gst-launch-1.0 \
GST_TRACERS="latency(flags=pipeline+element+reported)" gst-launch-1.0 \
alsasrc num-buffers=20 ! flacenc ! identity ! \
fakesink
```
@ -478,14 +478,14 @@ fakesink
### Raise a warning if a leak is detected
```
GST_TRACERS="leaks" gst-launch-1.0 videotestsrc num-buffers=10 !
GST_TRACERS="leaks" gst-launch-1.0 videotestsrc num-buffers=10 ! \
fakesink
```
### check if any GstEvent or GstMessage is leaked and raise a warning
```
GST_DEBUG="GST_TRACER:7" GST_TRACERS="leaks(GstEvent,GstMessage)"
GST_DEBUG="GST_TRACER:7" GST_TRACERS="leaks(GstEvent,GstMessage)" \
gst-launch-1.0 videotestsrc num-buffers=10 ! fakesink
```

View file

@ -63,11 +63,9 @@ these operations:
- If you don't know which component to file the issue against, just pick the one
that seems the most likely to you, or file it against the gstreamer-project
component. If in doubt just pop into our IRC channel `#gstreamer` on the
[OFTC IRC network](https://www.oftc.net/), which you can connect to using
any IRC client application or the [OFTC IRC webchat](https://webchat.oftc.net/?channels=%23gstreamer).
In any case, if it's not the right component someone will move the issue
once they have a better idea what the problem is and where it belongs.
component. If in doubt just pop into our [Matrix Discussion channel][matrix].
In any case, if it's not the right component someone will move the issue once
they have a better idea what the problem is and where it belongs.
- Please mention:
@ -424,6 +422,7 @@ In the simplest case, you might be able to get away with just doing a `git pull
[special-md-references]: https://docs.gitlab.com/ee/user/markdown.html#special-gitlab-references
[bugs]: https://gstreamer.freedesktop.org/bugs/
[gitlab]: https://gitlab.freedesktop.org/gstreamer
[matrix]: https://matrix.to/#/#gstreamer:gstreamer.org
#### Coding Style
@ -530,7 +529,7 @@ code repositories in commit messages.
Whenever you submit a new Merge Request, add a comment to an existing issue or
Merge Request, GitLab will send a notification e-mail to GStreamer
developers. This means that there is usually no need to advertise the fact that
you have done so in other forums such as on IRC or on the mailing list, unless
you have done so in other forums such as on Matrix or Discourse, unless
you have been asked to file an issue there, in which case it's nice to follow up
with the link to the issue.

View file

@ -72,14 +72,14 @@ directory.
## Why is mail traffic so low on gstreamer-devel?
Our main arenas for coordination and discussion are IRC and Gitlab, not
the mailing lists. Join us in [`#gstreamer`][irc-gstreamer] on irc.oftc.net.
There is also a [webchat interface][webchat-gstreamer]. For larger picture
questions or getting more input from more people, a mail to the gstreamer-devel
mailing list is never a bad idea, however.
Our main arenas for coordination and discussion are [Matrix][matrix] and
[Gitlab][gitlab], not the mailing lists which are being phased out. For larger
picture questions or getting more input from more people, starting a discussion
on [Discourse][discourse] is the best place.
[irc-gstreamer]: irc://irc.oftc.net/#gstreamer
[webchat-gstreamer]: https://webchat.oftc.net/?channels=%23gstreamer
[matrix]: https://matrix.to/#/#gstreamer:gstreamer.org
[gitlab]: https://gitlab.freedesktop.org/gstreamer
[discourse]: https://discourse.gstreamer.org/
## What kind of versioning scheme does GStreamer use?

View file

@ -95,7 +95,7 @@ distributions we support with binaries are the distributions that we
have people who have volunteered to make binaries for. If you are
interested in maintaining GStreamer binaries for other distributions or
Unices we would be happy to hear from you. Contact us through the
GStreamer-devel mailing list.
GStreamer [Discourse][discourse] or [Matrix][matrix].
## I am having trouble compiling GStreamer on my LFS installation, why?
@ -104,11 +104,13 @@ knowledgeable enough to solve any build issues you get on your own.
Being volunteered based we can't promise support to anyone of course,
but are you using LFS consider yourself extra unsupported. We neither
can or want to know enough, about how your unique system is configured,
to be able to help you. That said, if you come to the \#gstreamer
channel on irc.openprojects.net we might of course be able to give you
some general hints and pointers.
to be able to help you. That said, if you come to the [Matrix rooms][matrix]
we might of course be able to give you some general hints and pointers.
## How do I get GStreamer through git?
See this page : <http://gstreamer.freedesktop.org/dev/> for git
access (anonymous and developer).
[matrix]: https://matrix.to/#/#gstreamer:gstreamer.org
[discourse]: https://discourse.gstreamer.org/

View file

@ -200,10 +200,13 @@ $ git cherry-pick <commit> ... --strategy=subtree
## I have another question related to the mono repository - where is the best place to ask or get help?
Best to just pop into our IRC channel `#gstreamer` on the OFTC network (also accessible via Matrix) or send a mail to the gstreamer-devel mailing list.
Best to just pop into our [Matrix room][matrix] or start a discussion on [Discourse][discourse].
You can also file an issue in GitLab if you have a question that you think might be worth adding to this FAQ.
[matrix]: https://matrix.to/#/#gstreamer:gstreamer.org
[discourse]: https://discourse.gstreamer.org/
- - -
*This FAQ has been prepared by Thibault Saunier and Tim-Philipp Müller with contributions from Mathieu Duponchelle.*

View file

@ -96,8 +96,8 @@ applications will use these properties and will display a
user-controllable widget with which these properties can be changed.
This means that - for the property to be as user-friendly as possible -
you should be as exact as possible in the definition of the property.
Not only in defining ranges in between which valid properties can be
located (for integers, floats, etc.), but also in using very descriptive
Not only in defining ranges of valid property values (for integers,
floats, etc.), but also in using very descriptive
(better yet: internationalized) strings in the definition of the
property, and if possible using enums and flags instead of integers. The
GObject documentation describes these in a very complete way, but below,

View file

@ -96,7 +96,7 @@ The last command creates two files: `gstmyfilter.c` and `gstmyfilter.h`.
> It is recommended that you create a copy of the `gst-plugin` directory
> before continuing.
Now one needs to run `meson build` from the parent directory to bootstrap the
Now one needs to run `meson setup build` from the parent directory to bootstrap the
build environment. After that, the project can be built and installed using the
well known `ninja -C build` commands.

View file

@ -38,8 +38,8 @@ should *not* be allocated in this state.
`GST_STATE_PAUSED` is the state in which an element is ready to accept
and handle data. For most elements this state is the same as PLAYING.
The only exception to this rule are sink elements. Sink elements only
accept one single buffer of data and then block. At this point the
The only exception to this rule are sink elements. Paused sink elements
only accept one buffer of data and then block. At this point the
pipeline is 'prerolled' and ready to render data immediately.
`GST_STATE_PLAYING` is the highest state that an element can be in. For
@ -51,9 +51,9 @@ card or render video pictures to an image sink.
## Managing filter state
If at all possible, your element should derive from one of the new base
classes ([Pre-made base classes](plugin-development/element-types/base-classes.md)). There are
ready-made general purpose base classes for different types of sources,
If at all possible, your element should derive from one of the
[pre-made base classes](plugin-development/element-types/base-classes.md).
These are ready-made general purpose base classes for different types of sources,
sinks and filter/transformation elements. In addition to those,
specialised base classes exist for audio and video elements and others.

View file

@ -4,8 +4,8 @@ title: Building a Test Application
# Building a Test Application
Often, you will want to test your newly written plugin in an as small
setting as possible. Usually, `gst-launch-1.0` is a good first step at
Often, you will want to test your newly written plugin in as small
a setting as possible. Usually, `gst-launch-1.0` is a good first step at
testing a plugin. If you have not installed your plugin in a directory
that GStreamer searches, then you will need to set the plugin path.
Either set GST\_PLUGIN\_PATH to the directory containing your plugin, or
@ -38,7 +38,7 @@ a `fakesink` element at the end of the pipeline to dump your data to the
stdout (in order to do this, set the `dump` property to TRUE). Lastly,
you can use valgrind to check for memory errors.
During linking, your test application can use filtered caps as a way to
During pipeline linking, your test application can use filtered caps as a way to
drive a specific type of data to or from your element. This is a very
simple and effective way of checking multiple types of input and output
in your element.

View file

@ -1,6 +1,6 @@
project('GStreamer manuals and tutorials', 'c',
version: '1.23.0.1',
meson_version : '>= 0.62')
version: '1.25.0.1',
meson_version : '>= 1.1')
hotdoc_p = find_program('hotdoc')
if not hotdoc_p.found()
@ -101,7 +101,7 @@ sitemap = configure_file(command: [sitemap_gen, '@INPUT@', '@OUTPUT@',
input: 'sitemap.txt',
output: 'sitemap.txt')
html_theme = 'https://github.com/hotdoc/hotdoc_lumen_theme/releases/download/0.15/hotdoc_lumen_theme-0.15.tar.xz?sha256=1ea7fd00d8dfd607d175c59e2d89918a55114c867f697a94c703f314b0d9b4b6'
html_theme = 'https://github.com/hotdoc/hotdoc_lumen_theme/releases/download/0.16/hotdoc_lumen_theme-0.16.tar.xz?sha256=b7d7dde51285d1c90836c44ae298754e4cfa957e9a6d14ee5844b8a2cac04b5a'
gstreamer_doc = hotdoc.generate_doc('GStreamer',
project_version: apiversion,
@ -150,4 +150,4 @@ run_target('release',
depends: [gstreamer_doc]
)
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())

File diff suppressed because it is too large Load diff

View file

@ -1 +1 @@
1.22
1.24

File diff suppressed because it is too large Load diff

View file

@ -1,17 +1,15 @@
This is GStreamer gst-editing-services 1.22.0.
This is GStreamer gst-editing-services 1.25.0.1.
The GStreamer team is thrilled to announce a new major feature release
of your favourite cross-platform multimedia framework!
GStreamer 1.25 is the unstable development branch leading up to the next major
stable version which will be 1.26.
The 1.25 development series adds new features on top of the 1.24 series and is
part of the API and ABI-stable 1.x release series of the GStreamer multimedia
framework.
As always, this release is again packed with new features, bug fixes and
other improvements.
Full release notes will one day be found at:
The 1.22 release series adds new features on top of the 1.20 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.26/
Binaries for Android, iOS, Mac OS X and Windows will usually be provided
shortly after the release.
@ -44,10 +42,7 @@ with other GStreamer modules for a complete multimedia experience.
- 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 +75,18 @@ Please submit patches via GitLab as well, in form of Merge Requests. See
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 +98,9 @@ and can also be cloned from there and this is also where you can submit
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

@ -111,7 +111,7 @@ libs_doc = [hotdoc.generate_doc('gst-editing-services',
depends: ges_gir[0],
)]
if host_machine.system() == 'windows'
if host_system == 'windows'
pathsep = ';'
else
pathsep = ':'

View file

@ -129,9 +129,24 @@
#include <gst/gst.h>
GST_DEBUG_CATEGORY_STATIC (ges_asset_debug);
#undef GST_CAT_DEFAULT
#define GST_CAT_DEFAULT ges_asset_debug
#ifndef GST_DISABLE_GST_DEBUG
#define GST_CAT_DEFAULT ensure_debug_category()
static GstDebugCategory *
ensure_debug_category (void)
{
static gsize cat_gonce = 0;
if (g_once_init_enter (&cat_gonce)) {
gsize cat_done = (gsize) _gst_debug_category_new ("ges-asset",
GST_DEBUG_FG_BLUE | GST_DEBUG_BOLD, "GES Asset");
g_once_init_leave (&cat_gonce, cat_done);
}
return (GstDebugCategory *) cat_gonce;
}
#endif /* GST_DISABLE_GST_DEBUG */
enum
{
@ -538,9 +553,6 @@ ges_asset_class_init (GESAssetClass * klass)
klass->extract = ges_asset_extract_default;
klass->request_id_update = ges_asset_request_id_update_default;
klass->inform_proxy = NULL;
GST_DEBUG_CATEGORY_INIT (ges_asset_debug, "ges-asset",
GST_DEBUG_FG_BLUE | GST_DEBUG_BOLD, "GES Asset");
}
void
@ -1116,7 +1128,7 @@ ges_asset_set_id (GESAsset * asset, const gchar * id)
priv = asset->priv;
if (priv->state != ASSET_INITIALIZED) {
GST_WARNING_OBJECT (asset, "Trying to rest ID on an object that is"
GST_WARNING_OBJECT (asset, "Trying to set ID on an object that is"
" not properly loaded");
return;
}
@ -1253,6 +1265,9 @@ ges_asset_request (GType extractable_type, const gchar * id, GError ** error)
if (lerr)
g_error_free (lerr);
GST_DEBUG ("Requesting %s with real id %s and id %s",
g_type_name (extractable_type), real_id, id);
/* asset owned by cache */
LOCK_CACHE;
asset = ges_asset_cache_lookup (extractable_type, real_id);
@ -1308,10 +1323,8 @@ ges_asset_request (GType extractable_type, const gchar * id, GError ** error)
iface = g_type_interface_peek (klass, G_TYPE_INITABLE);
if (iface->init) {
/* FIXME: allow the error to be set, which GInitable is designed
* for! */
asset = g_initable_new (asset_type,
NULL, NULL, "id", real_id, "extractable-type",
NULL, error, "id", real_id, "extractable-type",
extractable_type, NULL);
} else {
GST_INFO ("Tried to create an Asset for type %s but no ->init method",

View file

@ -176,7 +176,7 @@
* children = ges_container_get_children (GES_CONTAINER (clip), FALSE);
*
* for (tmp = children; tmp; tmp = tmp->next)
* ges_track_element_set_auto_clamp_control_source (tmp->data, FALSE);
* ges_track_element_set_auto_clamp_control_sources (tmp->data, FALSE);
*
* // add time effect, or set their children properties, or move them around
* ...
@ -197,7 +197,7 @@
* // handle error
*
* for (tmp = children; tmp; tmp = tmp->next)
* ges_track_element_set_auto_clamp_control_source (tmp->data, TRUE);
* ges_track_element_set_auto_clamp_control_sources (tmp->data, TRUE);
*
* g_list_free_full (children, gst_object_unref);
* gst_object_unref (source);
@ -250,6 +250,7 @@ struct _GESClipPrivate
gboolean allow_any_remove;
gint nb_scale_effects;
gboolean use_effect_priority;
guint32 effect_priority;
GError *add_error;
@ -1638,6 +1639,7 @@ _add_child (GESContainer * container, GESTimelineElement * element)
GESTimeline *timeline = GES_TIMELINE_ELEMENT_TIMELINE (container);
GESClipPrivate *priv = self->priv;
GESAsset *asset, *creator_asset;
gboolean adding_scale_effect = FALSE;
gboolean prev_prevent = priv->prevent_duration_limit_update;
gboolean prev_prevent_outpoint = priv->prevent_children_outpoint_update;
GList *tmp;
@ -1775,6 +1777,14 @@ _add_child (GESContainer * container, GESTimelineElement * element)
new_prio = MAX (new_prio, _PRIORITY (tmp->data) + 1);
}
}
if (GES_IS_EFFECT (element)) {
GESAsset *asset = ges_extractable_get_asset (GES_EXTRACTABLE (element));
const gchar *bindesc = ges_asset_get_id (asset);
adding_scale_effect = !strstr (bindesc, "gesvideoscale");
}
/* make sure higher than core */
for (tmp = container->children; tmp; tmp = tmp->next) {
if (_IS_CORE_CHILD (tmp->data))
@ -1817,9 +1827,16 @@ _add_child (GESContainer * container, GESTimelineElement * element)
_update_active_for_track (self, track_el);
priv->nb_effects++;
GST_DEBUG_OBJECT (self, "Adding %ith effect: %" GES_FORMAT
" Priority %i", priv->nb_effects, GES_ARGS (element), new_prio);
if (adding_scale_effect) {
GST_DEBUG_OBJECT (self, "Adding scaling effect to clip "
"%" GES_FORMAT, GES_ARGS (self));
priv->nb_scale_effects += 1;
}
/* changing priorities, and updating their offset */
priv->prevent_resort = TRUE;
priv->setting_priority = TRUE;
@ -1900,6 +1917,12 @@ ges_clip_set_remove_error (GESClip * clip, GError * error)
priv->remove_error = error;
}
gboolean
ges_clip_has_scale_effect (GESClip * clip)
{
return clip->priv->nb_scale_effects > 0;
}
static gboolean
_remove_child (GESContainer * container, GESTimelineElement * element)
{
@ -1961,6 +1984,17 @@ _remove_child (GESContainer * container, GESTimelineElement * element)
* relative priorities */
/* height may have changed */
_compute_height (container);
if (GES_IS_EFFECT (element)) {
GESAsset *asset = ges_extractable_get_asset (GES_EXTRACTABLE (element));
const gchar *bindesc = ges_asset_get_id (asset);
if (bindesc && !strstr (bindesc, "gesvideoscale")) {
GST_DEBUG_OBJECT (self, "Removing scaling effect to clip "
"%" GES_FORMAT, GES_ARGS (self));
priv->nb_scale_effects -= 1;
}
}
}
/* duration-limit updated in _child_removed */
return TRUE;
@ -3000,7 +3034,8 @@ _cmp_children_by_priority (gconstpointer a_p, gconstpointer b_p)
* ges_clip_add_top_effect:
* @clip: A #GESClip
* @effect: A top effect to add
* @index: The index to add @effect at, or -1 to add at the highest
* @index: The index to add @effect at, or -1 to add at the highest,
* see #ges_clip_get_top_effect_index for more information
* @error: (nullable): Return location for an error
*
* Add a top effect to a clip at the given index.

View file

@ -416,7 +416,7 @@ _cleanup_fields (const Property * field_names, GstStructure * structure,
exists = TRUE;
if (gst_structure_has_field (structure, field_names[i].long_name)) {
gchar *str_info = gst_structure_serialize (structure, 0);
gchar *str_info = gst_structure_serialize_full (structure, 0);
*error =
g_error_new (GES_ERROR, 0,

View file

@ -44,7 +44,7 @@ struct _GESDiscovererManager
GObject parent;
GHashTable *discoverers;
GMutex lock;
GRecMutex lock;
GstClockTime timeout;
gboolean use_cache;
@ -125,7 +125,7 @@ ges_discoverer_manager_finalize (GObject * object)
if (!context)
context = g_main_context_default ();
g_mutex_lock (&self->lock);
g_rec_mutex_lock (&self->lock);
g_hash_table_iter_init (&iter, self->discoverers);
while (g_hash_table_iter_next (&iter, NULL, (gpointer *) & discoverer_data)) {
GSource *source;
@ -138,7 +138,7 @@ ges_discoverer_manager_finalize (GObject * object)
}
g_hash_table_unref (self->discoverers);
g_mutex_unlock (&self->lock);
g_rec_mutex_unlock (&self->lock);
G_OBJECT_CLASS (ges_discoverer_manager_parent_class)->finalize (object);
}
@ -333,11 +333,11 @@ ges_discoverer_manager_set_timeout (GESDiscovererManager * self,
self->timeout = timeout;
g_mutex_lock (&self->lock);
g_rec_mutex_lock (&self->lock);
g_hash_table_iter_init (&iter, self->discoverers);
while (g_hash_table_iter_next (&iter, NULL, (gpointer *) & discoverer_data))
g_object_set (discoverer_data->discoverer, "timeout", timeout, NULL);
g_mutex_unlock (&self->lock);
g_rec_mutex_unlock (&self->lock);
}
static GstDiscovererInfo *
@ -366,7 +366,7 @@ cleanup_discoverer_cb (GESDiscovererData * discoverer_data)
return G_SOURCE_REMOVE;
}
g_mutex_lock (&self->lock);
g_rec_mutex_lock (&self->lock);
if (discoverer_data->n_uri > 0) {
GST_DEBUG_OBJECT (self, "Discoverer still has %d uris to discover",
discoverer_data->n_uri);
@ -385,7 +385,7 @@ cleanup_discoverer_cb (GESDiscovererData * discoverer_data)
}
done:
g_mutex_unlock (&self->lock);
g_rec_mutex_unlock (&self->lock);
g_object_unref (self);
return res;
@ -397,14 +397,14 @@ proxy_discovered_cb (GESDiscovererManager * self,
{
g_signal_emit (self, signals[DISCOVERER_SIGNAL], 0, info, err);
g_mutex_lock (&self->lock);
g_rec_mutex_lock (&self->lock);
GESDiscovererData *data =
g_hash_table_lookup (self->discoverers, g_thread_self ());
if (data) {
data->n_uri--;
data = g_atomic_rc_box_acquire (data);
}
g_mutex_unlock (&self->lock);
g_rec_mutex_unlock (&self->lock);
if (data) {
ges_timeout_add (1000, (GSourceFunc) cleanup_discoverer_cb, data,
@ -446,14 +446,14 @@ ges_discoverer_manager_get_discoverer (GESDiscovererManager * self)
g_return_val_if_fail (GES_IS_DISCOVERER_MANAGER (self), NULL);
g_mutex_lock (&self->lock);
g_rec_mutex_lock (&self->lock);
ret = g_hash_table_lookup (self->discoverers, g_thread_self ());
if (!ret) {
ret = create_discoverer (self);
} else {
g_hash_table_steal (self->discoverers, g_thread_self ());
}
g_mutex_unlock (&self->lock);
g_rec_mutex_unlock (&self->lock);
return ret;
}
@ -468,12 +468,12 @@ ges_discoverer_manager_start_discovery (GESDiscovererManager * self,
disco_data = ges_discoverer_manager_get_discoverer (self);
g_mutex_lock (&self->lock);
g_rec_mutex_lock (&self->lock);
gboolean res =
gst_discoverer_discover_uri_async (disco_data->discoverer, uri);
disco_data->n_uri++;
g_hash_table_insert (self->discoverers, g_thread_self (), disco_data);
g_mutex_unlock (&self->lock);
g_rec_mutex_unlock (&self->lock);
return res;
}

View file

@ -88,6 +88,8 @@ ges_effect_asset_init (GESEffectAsset * self)
static void
ges_effect_asset_constructed (GObject * object)
{
G_OBJECT_CLASS (ges_effect_asset_parent_class)->constructed (object);
_fill_track_type (GES_ASSET (object));
}
@ -396,10 +398,9 @@ ges_effect_asset_id_get_type_and_bindesc (const char *id,
}
for (tmp = GST_BIN_CHILDREN (effect); tmp; tmp = tmp->next) {
GstElementFactory *factory =
gst_element_get_factory (GST_ELEMENT (tmp->data));
const gchar *klass =
gst_element_factory_get_metadata (factory, GST_ELEMENT_METADATA_KLASS);
gst_element_class_get_metadata (GST_ELEMENT_GET_CLASS (tmp->data),
GST_ELEMENT_METADATA_KLASS);
if (g_strrstr (klass, "Effect") || g_strrstr (klass, "Filter")) {
if (g_strrstr (klass, "Audio")) {

View file

@ -23,10 +23,23 @@
* @short_description: adds an effect build from a parse-launch style bin
* description to a stream in a GESSourceClip or a GESLayer
*
* Currently we only support effects with N sinkpads and one single srcpad.
* Apart from `gesaudiomixer` and `gescompositor` which can be used as effects
* and where sinkpads will be requested as needed based on the timeline topology
* GES will always request at most one sinkpad per effect (when required).
* Any GStreamer filter can be used as effects in GES. The only restriction we
* have is that effects element should have a single [sinkpad](GST_PAD_SINK)
* (which will be requested if necessary) and a single [srcpad](GST_PAD_SRC).
*
* Note that `gesaudiomixer` and `gescompositor` can be used as effects even
* though they can have several sinkpads.
*
* ## GES specific effects:
*
* * **`gesvideoscale`**: GES implements a specific scaling bin that allows
* specifying where scaling will happen inside the chain of effects. By
* default scaling can happen either in the source (if the source doesn't have
* a specific size, like `videotestsrc` or [mixing](ges_track_set_mixing) has
* been disabled) or in the mixing element otherwise, when adding that element
* as an effect, GES guarantees that the scaling will happen in it. This can
* be useful for example if you want to crop the video before scaling or apply
* rounding corners to the video after scaling, etc...
*
* > Note: GES always adds converters (`audioconvert ! audioresample !
* > audioconvert` for audio effects and `videoconvert` for video effects) to
@ -368,8 +381,16 @@ GESEffect *
ges_effect_new (const gchar * bin_description)
{
GESEffect *effect;
GError *error = NULL;
GESAsset *asset = ges_asset_request (GES_TYPE_EFFECT,
bin_description, NULL);
bin_description, &error);
if (error != NULL) {
GST_ERROR ("Error requesting asset with description \"%s\": %s",
bin_description, error->message);
g_error_free (error);
/* fall-through */
}
g_return_val_if_fail (asset, NULL);

View file

@ -43,7 +43,34 @@
#ifdef HAS_PYTHON
#include <Python.h>
#include "ges-resources.h"
/*
* We need to call dlopen() directly on macOS to workaround a macOS runtime
* linker bug. When there are nested dlopen() calls and the second dlopen() is
* called from another library (such as gmodule), @loader_path is resolved as
* @executable_path and RPATHs are read from the executable (gst-plugin-scanner)
* instead of the library itself (libgstges.dylib). This doesn't happen if the
* second dlopen() call is directly in the source code of the library.
* Previously seen at:
* https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/1171#note_2290789
*/
#ifdef G_OS_WIN32
#include <gmodule.h>
#define ges_module_open(fname) g_module_open(fname,0)
#define ges_module_error g_module_error
#define ges_module_symbol(module,name,symbol) g_module_symbol(module,name,symbol)
#else
#include <dlfcn.h>
#define ges_module_open(fname) dlopen(fname,RTLD_NOW | RTLD_GLOBAL)
#define ges_module_error dlerror
static inline gboolean
ges_module_symbol (gpointer handle, const char *name, gpointer * symbol)
{
*symbol = dlsym (handle, name);
return *symbol != NULL;
}
#endif
#endif /* HAS_PYTHON */
GST_DEBUG_CATEGORY_STATIC (ges_formatter_debug);
#undef GST_CAT_DEFAULT
@ -558,27 +585,22 @@ load_python_formatters (void)
G_RESOURCE_LOOKUP_FLAGS_NONE, &err);
PyObject *code = NULL, *res = NULL;
gboolean we_initialized = FALSE;
GModule *libpython;
gpointer has_python = NULL;
GST_LOG ("Checking to see if libpython is already loaded");
if (g_module_symbol (g_module_open (NULL, G_MODULE_BIND_LOCAL),
if (ges_module_symbol (ges_module_open (NULL),
"_Py_NoneStruct", &has_python) && has_python) {
GST_LOG ("libpython is already loaded");
} else {
const gchar *libpython_path =
PY_LIB_LOC "/libpython" PYTHON_VERSION PY_ABI_FLAGS "." PY_LIB_SUFFIX;
GST_LOG ("loading libpython from '%s'", libpython_path);
libpython = g_module_open (libpython_path, 0);
if (!libpython) {
GST_ERROR ("Couldn't g_module_open libpython. Reason: %s",
g_module_error ());
GST_LOG ("loading libpython by name: %s", PY_LIB_FNAME);
if (!ges_module_open (PY_LIB_FNAME)) {
GST_ERROR ("Couldn't load libpython. Reason: %s", ges_module_error ());
return;
}
}
if (!Py_IsInitialized ()) {
GST_LOG ("python wasn't initialized");
GST_LOG ("python wasn't already initialized");
/* set the correct plugin for registering stuff */
Py_Initialize ();
we_initialized = TRUE;

View file

@ -43,8 +43,10 @@ GType ges_frame_composition_meta_api_get_type (void);
* @meta: the parent #GstMeta.
* @posx: The desired x position.
* @posy: The desired y position.
* @height: The desired height of the video.
* @width: The desired width of the video.
* @height: The desired height of the video. -1 means that no scaling should be
* applied.
* @width: The desired width of the video. -1 means that no scaling should beapplied
* applied.
* @zorder: The desired z order.
* @operator:The blending operator for the source.
*
@ -59,10 +61,10 @@ struct _GESFrameCompositionMeta {
GstMeta meta;
gdouble alpha;
gint posx;
gint posy;
gint height;
gint width;
gdouble posx;
gdouble posy;
gdouble height;
gdouble width;
guint zorder;
gint operator;
};

View file

@ -462,6 +462,7 @@ G_GNUC_INTERNAL void ges_clip_set_add_error (GESClip * cli
G_GNUC_INTERNAL void ges_clip_take_add_error (GESClip * clip, GError ** error);
G_GNUC_INTERNAL void ges_clip_set_remove_error (GESClip * clip, GError * error);
G_GNUC_INTERNAL void ges_clip_take_remove_error (GESClip * clip, GError ** error);
G_GNUC_INTERNAL gboolean ges_clip_has_scale_effect (GESClip * clip);
/****************************************************
* GESLayer *

View file

@ -254,6 +254,7 @@ _timeline_track_removed_cb (GESTimeline * timeline, GESTrack * track,
_unlink_track (pipeline, track);
}
static void
ges_pipeline_constructed (GObject * object)
{
@ -409,7 +410,8 @@ ges_pipeline_init (GESPipeline * self)
self->priv->playsink =
gst_element_factory_make ("playsink", "internal-sinks");
self->priv->encodebin =
gst_element_factory_make ("encodebin", "internal-encodebin");
gst_element_factory_make ("encodebin2", "internal-encodebin");
g_object_set (self->priv->encodebin, "avoid-reencoding", TRUE, NULL);
if (G_UNLIKELY (self->priv->playsink == NULL))
@ -515,7 +517,8 @@ _link_tracks (GESPipeline * pipeline)
{
GList *tmp;
GST_DEBUG_OBJECT (pipeline, "Linking tracks");
GST_DEBUG_OBJECT (pipeline, "Linking %d tracks",
g_list_length (pipeline->priv->timeline->tracks));
if (!pipeline->priv->timeline) {
GST_INFO_OBJECT (pipeline, "Not timeline set yet, doing nothing");
@ -626,8 +629,8 @@ ges_pipeline_change_state (GstElement * element, GstStateChange transition)
for (tmp = self->priv->not_rendered_tracks; tmp; tmp = tmp->next)
gst_element_set_locked_state (tmp->data, FALSE);
}
break;
}
case GST_STATE_CHANGE_PAUSED_TO_PLAYING:
{
GstElement *queue = gst_bin_get_by_name (GST_BIN (self->priv->playsink),
@ -1266,19 +1269,33 @@ ges_pipeline_set_mode (GESPipeline * pipeline, GESPipelineFlags mode)
GST_ERROR_OBJECT (pipeline, "Output URI not set !");
return FALSE;
}
if (!gst_bin_add (GST_BIN_CAST (pipeline), pipeline->priv->encodebin)) {
GST_ERROR_OBJECT (pipeline, "Couldn't add encodebin");
return FALSE;
}
if (!gst_bin_add (GST_BIN_CAST (pipeline), pipeline->priv->urisink)) {
GST_ERROR_OBJECT (pipeline, "Couldn't add URI sink");
return FALSE;
/* We know that encodebin2 will add its src pads as soon as the profile is
* set, so link the sink to it if it has a pad */
if (pipeline->priv->encodebin->numsrcpads > 0) {
if (pipeline->priv->encodebin->numsrcpads > 1) {
GST_WARNING_OBJECT (pipeline,
"Encodebin has more than one srcpad, this is not supported yet");
}
if (!gst_bin_add (GST_BIN_CAST (pipeline), pipeline->priv->urisink)) {
GST_ERROR_OBJECT (pipeline, "Couldn't add URI sink");
return FALSE;
}
gst_element_link_pads_full (pipeline->priv->encodebin, "src_0",
pipeline->priv->urisink, "sink", GST_PAD_LINK_CHECK_NOTHING);
} else {
GST_INFO_OBJECT (pipeline,
"Using an muxing sink, not adding any sink element");
}
g_object_set (pipeline->priv->encodebin, "avoid-reencoding",
!(!(mode & GES_PIPELINE_MODE_SMART_RENDER)), NULL);
gst_element_link_pads_full (pipeline->priv->encodebin, "src",
pipeline->priv->urisink, "sink", GST_PAD_LINK_CHECK_NOTHING);
}
if (pipeline->priv->timeline) {

View file

@ -20,6 +20,7 @@
#include "config.h"
#endif
#include <math.h>
#include "gstframepositioner.h"
#include "ges-frame-composition-meta.h"
#include "ges-types.h"
@ -38,6 +39,11 @@ struct _GESSmartMixerPad
gdouble alpha;
GstSegment segment;
GParamSpec *width_pspec;
GParamSpec *height_pspec;
GParamSpec *xpos_pspec;
GParamSpec *ypos_pspec;
};
struct _GESSmartMixerPadClass
@ -53,6 +59,18 @@ enum
G_DEFINE_TYPE (GESSmartMixerPad, ges_smart_mixer_pad, GST_TYPE_GHOST_PAD);
static void
ges_smart_mixer_notify_wrapped_pad (GESSmartMixerPad * self,
GstPad * real_mixer_pad)
{
GObjectClass *klass = G_OBJECT_GET_CLASS (real_mixer_pad);
self->width_pspec = g_object_class_find_property (klass, "width");
self->height_pspec = g_object_class_find_property (klass, "height");
self->xpos_pspec = g_object_class_find_property (klass, "xpos");
self->ypos_pspec = g_object_class_find_property (klass, "ypos");
}
static void
ges_smart_mixer_pad_get_property (GObject * object, guint prop_id,
GValue * value, GParamSpec * pspec)
@ -240,8 +258,35 @@ set_pad_properties_from_composition_meta (GstPad * mixer_pad,
g_object_set (mixer_pad, "alpha", meta->alpha * transalpha, NULL);
}
g_object_set (mixer_pad, "xpos", meta->posx, "ypos",
meta->posy, "width", meta->width, "height", meta->height, NULL);
if (G_PARAM_SPEC_VALUE_TYPE (ghost->xpos_pspec) == G_TYPE_INT) {
g_object_set (mixer_pad, "xpos", (gint) round (meta->posx), "ypos",
(gint) round (meta->posy), NULL);
} else if (G_PARAM_SPEC_VALUE_TYPE (ghost->xpos_pspec) == G_TYPE_FLOAT) {
g_object_set (mixer_pad, "xpos", (gfloat) meta->posx, "ypos",
(gfloat) meta->posy, NULL);
} else {
g_object_set (mixer_pad, "xpos", meta->posx, "ypos", meta->posy, NULL);
}
if (meta->width >= 0) {
if (G_PARAM_SPEC_VALUE_TYPE (ghost->width_pspec) == G_TYPE_INT) {
g_object_set (mixer_pad, "width", (gint) round (meta->width), NULL);
} else if (G_PARAM_SPEC_VALUE_TYPE (ghost->width_pspec) == G_TYPE_FLOAT) {
g_object_set (mixer_pad, "width", (gfloat) meta->width, NULL);
} else {
g_object_set (mixer_pad, "width", meta->width, NULL);
}
}
if (meta->height >= 0) {
if (G_PARAM_SPEC_VALUE_TYPE (ghost->height_pspec) == G_TYPE_INT) {
g_object_set (mixer_pad, "height", (gint) round (meta->height), NULL);
} else if (G_PARAM_SPEC_VALUE_TYPE (ghost->height_pspec) == G_TYPE_FLOAT) {
g_object_set (mixer_pad, "height", (gfloat) meta->height, NULL);
} else {
g_object_set (mixer_pad, "height", meta->height, NULL);
}
}
if (self->ABI.abi.has_operator)
g_object_set (mixer_pad, "operator", meta->operator, NULL);
@ -289,6 +334,8 @@ _request_new_pad (GstElement * element, GstPadTemplate * templ,
"direction", GST_PAD_DIRECTION (infos->mixer_pad), NULL);
infos->ghostpad = ghost;
gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (ghost), infos->mixer_pad);
ges_smart_mixer_notify_wrapped_pad (GES_SMART_MIXER_PAD (ghost),
infos->real_mixer_pad);
gst_pad_set_active (ghost, TRUE);
if (!gst_element_add_pad (GST_ELEMENT (self), ghost))
goto could_not_add;

View file

@ -987,9 +987,23 @@ _ges_container_add_child_from_struct (GESTimeline * timeline,
}
res = ges_container_add (container, child);
if (GES_IS_CLIP (container) && GES_IS_BASE_EFFECT (child)) {
GList *effects = ges_clip_get_top_effects (GES_CLIP (container));
res =
ges_clip_add_top_effect (GES_CLIP (container), GES_BASE_EFFECT (child),
0, error);
g_list_free_full (effects, gst_object_unref);
} else {
res = ges_container_add (container, child);
}
if (res == FALSE) {
g_error_new (GES_ERROR, 0, "Could not add child to container");
if (!*error)
*error = g_error_new (GES_ERROR, 0, "Could not add child to container");
goto beach;
} else {
g_object_set_qdata (G_OBJECT (timeline), LAST_CHILD_QDATA, child);
}

View file

@ -501,6 +501,8 @@ ges_timeline_handle_message (GstBin * bin, GstMessage * message)
gst_structure_get_string (mstructure, "reason"));
}
GST_OBJECT_UNLOCK (timeline);
} else {
goto forward;
}
gst_message_unref (message);
@ -514,6 +516,16 @@ forward:
GST_BIN_CLASS (parent_class)->handle_message (bin, message);
}
static void
ges_timeline_post_stream_collection (GESTimeline * timeline)
{
gst_element_post_message ((GstElement *) timeline,
gst_message_new_element ((GstObject *) timeline,
gst_structure_new ("ges-timeline-collection", "collection",
GST_TYPE_STREAM_COLLECTION, timeline->priv->stream_collection,
NULL)));
}
static GstStateChangeReturn
ges_timeline_change_state (GstElement * element, GstStateChange transition)
{
@ -524,9 +536,7 @@ ges_timeline_change_state (GstElement * element, GstStateChange transition)
transition);
if (transition == GST_STATE_CHANGE_READY_TO_PAUSED)
gst_element_post_message ((GstElement *) timeline,
gst_message_new_stream_collection ((GstObject *) timeline,
timeline->priv->stream_collection));
ges_timeline_post_stream_collection (timeline);
return res;
}
@ -2516,7 +2526,7 @@ ges_timeline_add_track (GESTimeline * timeline, GESTrack * track)
g_return_val_if_fail (GES_IS_TRACK (track), FALSE);
CHECK_THREAD (timeline);
GST_DEBUG ("timeline:%p, track:%p", timeline, track);
GST_DEBUG_OBJECT (timeline, "Adding %" GST_PTR_FORMAT, track);
/* make sure we don't already control it */
LOCK_DYN (timeline);
@ -2894,9 +2904,7 @@ ges_timeline_commit (GESTimeline * timeline)
UNLOCK_DYN (timeline);
if (pcollection != timeline->priv->stream_collection) {
gst_element_post_message ((GstElement *) timeline,
gst_message_new_stream_collection ((GstObject *) timeline,
timeline->priv->stream_collection));
ges_timeline_post_stream_collection (timeline);
}
ges_timeline_emit_snapping (timeline, NULL, NULL, GST_CLOCK_TIME_NONE);

View file

@ -56,6 +56,7 @@
#endif
#include "ges-internal.h"
#include "gstframepositioner.h"
#include "ges-extractable.h"
#include "ges-track-element.h"
#include "ges-clip.h"
@ -304,9 +305,11 @@ ges_track_element_set_asset (GESExtractable * extractable, GESAsset * asset)
gst_object_set_name (GST_OBJECT (nleobject), tmp);
g_free (tmp);
object->priv->nleobject = gst_object_ref (nleobject);
g_object_set_qdata (G_OBJECT (nleobject), NLE_OBJECT_TRACK_ELEMENT_QUARK,
object);
if (!object->priv->nleobject) {
object->priv->nleobject = gst_object_ref (nleobject);
g_object_set_qdata (G_OBJECT (nleobject), NLE_OBJECT_TRACK_ELEMENT_QUARK,
object);
}
/* Set some properties on the NleObject */
g_object_set (object->priv->nleobject,
@ -1009,6 +1012,10 @@ ges_track_element_create_gnl_object_func (GESTrackElement * self)
if (G_UNLIKELY (nleobject == NULL))
goto no_nleobject;
self->priv->nleobject = gst_object_ref (nleobject);
g_object_set_qdata (G_OBJECT (nleobject), NLE_OBJECT_TRACK_ELEMENT_QUARK,
self);
if (klass->create_element) {
GST_DEBUG ("Calling subclass 'create_element' vmethod");
child = klass->create_element (self);
@ -1078,11 +1085,10 @@ ges_track_element_add_child_props (GESTrackElement * self,
guint i;
factory = gst_element_get_factory (child);
/* FIXME: handle NULL factory */
klass = gst_element_factory_get_metadata (factory,
klass = gst_element_class_get_metadata (GST_ELEMENT_GET_CLASS (child),
GST_ELEMENT_METADATA_KLASS);
if (strv_find_str (blacklist, GST_OBJECT_NAME (factory))) {
if (factory && strv_find_str (blacklist, GST_OBJECT_NAME (factory))) {
GST_DEBUG_OBJECT (self, "%s blacklisted", GST_OBJECT_NAME (factory));
return;
}
@ -1908,10 +1914,12 @@ ges_track_element_set_control_source (GESTrackElement * object,
goto done;
}
/* First remove existing binding */
if (ges_track_element_remove_control_binding (object, property_name))
GST_LOG_OBJECT (object, "Removed old binding for property %s",
property_name);
if (GST_IS_FRAME_POSITIONNER (element)) {
if (!gst_frame_positioner_check_can_add_binding (GST_FRAME_POSITIONNER
(element), property_name)) {
goto done;
}
}
if (direct_absolute)
binding = gst_direct_control_binding_new_absolute (GST_OBJECT (element),

View file

@ -488,17 +488,37 @@ ges_track_handle_message (GstBin * bin, GstMessage * message)
{
GESTrack *track = GES_TRACK (bin);
if (GST_MESSAGE_TYPE (message) == GST_MESSAGE_STREAM_COLLECTION) {
GstStreamCollection *collection;
switch (GST_MESSAGE_TYPE (message)) {
case GST_MESSAGE_STREAM_COLLECTION:
g_error ("Internal stream collection messages should be kept internal");
break;
case GST_MESSAGE_ELEMENT:
{
const GstStructure *s = gst_message_get_structure (message);
gst_message_parse_stream_collection (message, &collection);
if (GES_IS_TIMELINE (GST_MESSAGE_SRC (message))) {
ges_track_select_subtimeline_streams (track, collection,
GST_ELEMENT (GST_MESSAGE_SRC (message)));
if (gst_structure_has_name (s, "ges-timeline-collection")) {
GstStreamCollection *collection;
gst_structure_get (s, "collection", GST_TYPE_STREAM_COLLECTION,
&collection, NULL);
ges_track_select_subtimeline_streams (track, collection,
GST_ELEMENT (GST_MESSAGE_SRC (message)));
GST_INFO_OBJECT (bin,
"Handled ges-timeline-collection message, dropping");
gst_message_unref (message);
return;
}
break;
}
default:
break;
}
gst_element_post_message (GST_ELEMENT_CAST (bin), message);
GST_BIN_CLASS (ges_track_parent_class)->handle_message (bin, message);
}
/* GObject virtual methods */

View file

@ -752,7 +752,7 @@ _extract (GESAsset * asset, GError ** error)
GESUriSourceAssetPrivate *priv = GES_URI_SOURCE_ASSET (asset)->priv;
if (GST_IS_DISCOVERER_STREAM_INFO (priv->sinfo) == FALSE) {
GST_WARNING_OBJECT (asset, "Can not extract as no strean info set");
GST_WARNING_OBJECT (asset, "Can not extract as no stream info set");
return NULL;
}

View file

@ -192,11 +192,13 @@ ges_uri_clip_class_init (GESUriClipClass * klass)
}
static gchar *
extractable_check_id (GType type, const gchar * id)
extractable_check_id (GType type, const gchar * id, GError ** error)
{
if (gst_uri_is_valid (id))
return g_strdup (id);
g_set_error (error, GES_ERROR, GES_ERROR_ASSET_WRONG_ID, "URI %s is invalid",
id);
return NULL;
}
@ -442,7 +444,7 @@ static void
ges_extractable_interface_init (GESExtractableInterface * iface)
{
iface->asset_type = GES_TYPE_URI_CLIP_ASSET;
iface->check_id = (GESExtractableCheckId) extractable_check_id;
iface->check_id = extractable_check_id;
iface->get_parameters_from_id = extractable_get_parameters_from_id;
iface->get_id = extractable_get_id;
iface->can_update_asset = TRUE;

View file

@ -192,6 +192,47 @@ find_compositor (GstPluginFeature * feature, gpointer udata)
(loaded_feature)), GST_TYPE_AGGREGATOR);
}
if (res) {
const gchar *needed_props[] = { "width", "height", "xpos", "ypos" };
GObjectClass *klass =
g_type_class_ref (gst_element_factory_get_element_type
(GST_ELEMENT_FACTORY (loaded_feature)));
GstPadTemplate *templ =
gst_element_class_get_pad_template (GST_ELEMENT_CLASS (klass),
"sink_%u");
g_type_class_unref (klass);
if (!templ) {
GST_INFO_OBJECT (loaded_feature, "No sink template found, ignoring");
res = FALSE;
goto done;
}
GType pad_type;
g_object_get (templ, "gtype", &pad_type, NULL);
klass = g_type_class_ref (pad_type);
for (gint i = 0; i < G_N_ELEMENTS (needed_props); i++) {
GParamSpec *pspec;
if (!(pspec = g_object_class_find_property (klass, needed_props[i]))) {
GST_INFO_OBJECT (loaded_feature, "No property %s found, ignoring",
needed_props[i]);
res = FALSE;
break;
}
if (pspec->value_type != G_TYPE_INT && pspec->value_type != G_TYPE_FLOAT
&& pspec->value_type != G_TYPE_DOUBLE) {
GST_INFO_OBJECT (loaded_feature,
"Property %s is not of type int or float, or double, ignoring",
needed_props[i]);
res = FALSE;
break;
}
}
g_type_class_unref (klass);
}
done:
gst_clear_object (&elem);
gst_object_unref (loaded_feature);

View file

@ -115,7 +115,9 @@ ges_video_source_create_filters (GESVideoSource * self, GPtrArray * elements,
GESTrackElement *trksrc = GES_TRACK_ELEMENT (self);
GstElement *positioner, *videoflip, *capsfilter, *videorate;
const gchar *positioner_props[]
= { "alpha", "posx", "posy", "width", "height", "operator", NULL };
= { "alpha", "posx", "fposx", "posy", "fposy", "width", "fwidth",
"height", "fheight", "operator", NULL
};
const gchar *videoflip_props[] = { "video-direction", NULL };
gchar *ename = NULL;

View file

@ -54,6 +54,7 @@ G_LOCK_DEFINE_STATIC (init_lock);
* between init/deinit
*/
static GThread *initialized_thread = NULL;
extern GType ges_video_scale_get_type (void);
#ifndef GST_DISABLE_GST_DEBUG
static gpointer
@ -96,9 +97,10 @@ ges_init_pre (GOptionContext * context, GOptionGroup * group, gpointer data,
return TRUE;
}
static gboolean
ges_init_post (GOptionContext * context, GOptionGroup * group, gpointer data,
GError ** error)
ges_init_post (GOptionContext * context, GOptionGroup * group,
gpointer data, GError ** error)
{
GESUriClipAssetClass *uriasset_klass = NULL;
GstElementFactory *nlecomposition_factory = NULL;
@ -154,6 +156,7 @@ ges_init_post (GOptionContext * context, GOptionGroup * group, gpointer data,
ges_asset_cache_init ();
gst_element_register (NULL, "gesvideoscale", 0, ges_video_scale_get_type ());
gst_element_register (NULL, "gesaudiomixer", 0, GES_TYPE_SMART_ADDER);
gst_element_register (NULL, "gescompositor", 0, GES_TYPE_SMART_MIXER);
gst_element_register (NULL, "framepositioner", 0, GST_TYPE_FRAME_POSITIONNER);

View file

@ -0,0 +1,176 @@
/* GStreamer
* Copyright (C) 2023 Thibault Saunier <tsaunier@igalia.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 Street, Suite 500,
* Boston, MA 02110-1335, USA.
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <gst/gst.h>
#include <math.h>
#include "ges-frame-composition-meta.h"
typedef struct _GESVideoScale GESVideoScale;
typedef struct
{
GstBinClass parent_class;
} GESVideoScaleClass;
struct _GESVideoScale
{
GstBin parent;
GstPad *sink;
GstElement *capsfilter;
gint width, height;
};
/* *INDENT-OFF* */
static GstStaticPadTemplate gst_video_scale_sink_template =
GST_STATIC_PAD_TEMPLATE ("sink",
GST_PAD_SINK,
GST_PAD_ALWAYS,
GST_STATIC_CAPS ("ANY")
);
static GstStaticPadTemplate gst_video_scale_src_template =
GST_STATIC_PAD_TEMPLATE ("src",
GST_PAD_SRC,
GST_PAD_ALWAYS,
GST_STATIC_CAPS ("ANY")
);
GES_DECLARE_TYPE (VideoScale, video_scale, VIDEO_SCALE)
G_DEFINE_TYPE (GESVideoScale, ges_video_scale, GST_TYPE_BIN);
/* *INDENT-ON* */
static void
set_dimension (GESVideoScale * self, gint width, gint height)
{
GstCaps *caps = gst_caps_new_simple ("video/x-raw",
"pixel-aspect-ratio", GST_TYPE_FRACTION, 1, 1,
NULL);
if (width >= 0)
gst_caps_set_simple (caps, "width", G_TYPE_INT, width, NULL);
if (height >= 0)
gst_caps_set_simple (caps, "height", G_TYPE_INT, height, NULL);
gst_caps_set_features (caps, 0, gst_caps_features_new_any ());
g_object_set (self->capsfilter, "caps", caps, NULL);
gst_caps_unref (caps);
GST_OBJECT_LOCK (self);
self->width = width;
self->height = height;
GST_OBJECT_UNLOCK (self);
}
static GstFlowReturn
chain (GstPad * pad, GESVideoScale * self, GstBuffer * buffer)
{
GESFrameCompositionMeta *meta;
meta =
(GESFrameCompositionMeta *) gst_buffer_get_meta (buffer,
ges_frame_composition_meta_api_get_type ());
if (meta) {
GST_OBJECT_LOCK (self);
if (meta->height != self->height || meta->width != self->width) {
GST_OBJECT_UNLOCK (self);
set_dimension (self, (gint) round (meta->width),
(gint) round (meta->height));
} else {
GST_OBJECT_UNLOCK (self);
}
meta->height = meta->width = -1;
}
return gst_proxy_pad_chain_default (pad, GST_OBJECT (self), buffer);
}
static GstStateChangeReturn
change_state (GstElement * element, GstStateChange transition)
{
GESVideoScale *self = GES_VIDEO_SCALE (element);
GstStateChangeReturn res =
((GstElementClass *) ges_video_scale_parent_class)->change_state (element,
transition);
if (transition == GST_STATE_CHANGE_PAUSED_TO_READY) {
GST_OBJECT_LOCK (self);
self->width = 0;
self->height = 0;
GST_OBJECT_UNLOCK (self);
}
return res;
}
static void
ges_video_scale_init (GESVideoScale * self)
{
GstPad *pad;
GstElement *scale;
GstPadTemplate *template =
gst_static_pad_template_get (&gst_video_scale_sink_template);
scale = gst_element_factory_make ("videoscale", NULL);
g_object_set (scale, "add-borders", FALSE, NULL);
self->capsfilter = gst_element_factory_make ("capsfilter", NULL);
gst_bin_add_many (GST_BIN (self), scale, self->capsfilter, NULL);
gst_element_link (scale, self->capsfilter);
self->sink =
gst_ghost_pad_new_from_template ("sink", scale->sinkpads->data, template);
gst_pad_set_chain_function (self->sink, (GstPadChainFunction) chain);
gst_element_add_pad (GST_ELEMENT (self), self->sink);
gst_object_unref (template);
template = gst_static_pad_template_get (&gst_video_scale_src_template);
pad =
gst_ghost_pad_new_from_template ("src", self->capsfilter->srcpads->data,
template);
gst_element_add_pad (GST_ELEMENT (self), pad);
gst_object_unref (template);
}
static void
ges_video_scale_class_init (GESVideoScaleClass * klass)
{
GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
gst_element_class_set_static_metadata (element_class,
"VideoScale",
"Video/Filter",
"Scaling element usable as a GES effect",
"Thibault Saunier <tsaunier@igalia.com>");
gst_element_class_add_static_pad_template (element_class,
&gst_video_scale_sink_template);
gst_element_class_add_static_pad_template (element_class,
&gst_video_scale_src_template);
element_class->change_state = change_state;
}

View file

@ -48,11 +48,20 @@ enum
{
PROP_0,
PROP_ALPHA,
PROP_POSX,
PROP_FPOSX,
PROP_POSY,
PROP_ZORDER,
PROP_FPOSY,
PROP_WIDTH,
PROP_FWIDTH,
PROP_HEIGHT,
PROP_FHEIGHT,
PROP_ZORDER,
PROP_OPERATOR,
PROP_LAST,
};
@ -113,6 +122,24 @@ gst_compositor_operator_get_type_and_default_value (int *default_operator_value)
return operator_gtype;
}
static gboolean
scales_downstream (GstFramePositioner * self)
{
if (self->scale_in_compositor)
return TRUE;
if (!self->track_source)
return self->scale_in_compositor;
GESTimelineElement *parent = GES_TIMELINE_ELEMENT_PARENT (self->track_source);
if (!parent || !GES_IS_CLIP (parent)) {
return self->scale_in_compositor;
}
return ges_clip_has_scale_effect (GES_CLIP (parent));
}
static void
_weak_notify_cb (GstFramePositioner * pos, GObject * old)
{
@ -125,9 +152,16 @@ is_user_positionned (GstFramePositioner * self)
gint i;
GParamSpec *positioning_props[] = {
properties[PROP_WIDTH],
properties[PROP_FWIDTH],
properties[PROP_HEIGHT],
properties[PROP_FHEIGHT],
properties[PROP_POSX],
properties[PROP_FPOSX],
properties[PROP_POSY],
properties[PROP_FPOSY],
};
if (self->user_positioned)
@ -201,13 +235,22 @@ reposition_properties (GstFramePositioner * pos, gint old_track_width,
gint old_track_height)
{
gint i;
/* *INDENT-OFF* */
RepositionPropertyData props_data[] = {
{&pos->width, old_track_width, pos->track_width, properties[PROP_FWIDTH]},
{&pos->width, old_track_width, pos->track_width, properties[PROP_WIDTH]},
{&pos->height, old_track_height, pos->track_height,
properties[PROP_HEIGHT]},
{&pos->height, old_track_height, pos->track_height, properties[PROP_FHEIGHT]},
{&pos->height, old_track_height, pos->track_height, properties[PROP_HEIGHT]},
{&pos->posx, old_track_width, pos->track_width, properties[PROP_FPOSX]},
{&pos->posx, old_track_width, pos->track_width, properties[PROP_POSX]},
{&pos->posy, old_track_height, pos->track_height, properties[PROP_FPOSY]},
{&pos->posy, old_track_height, pos->track_height, properties[PROP_POSY]},
};
/* *INDENT-ON* */
for (i = 0; i < G_N_ELEMENTS (props_data); i++) {
GList *values, *tmp;
@ -218,8 +261,10 @@ reposition_properties (GstFramePositioner * pos, gint old_track_width,
GstControlBinding *binding =
gst_object_get_control_binding (GST_OBJECT (pos), d.pspec->name);
*(d.value) =
*(d.value) * (gdouble) d.track_value / (gdouble) d.old_track_value;
if (G_PARAM_SPEC_VALUE_TYPE (d.pspec) == G_TYPE_FLOAT) {
*(d.value) =
*(d.value) * (gdouble) d.track_value / (gdouble) d.old_track_value;
}
if (!binding)
continue;
@ -274,7 +319,7 @@ gst_frame_positioner_update_properties (GstFramePositioner * pos,
caps = gst_caps_from_string ("video/x-raw(ANY)");
if (pos->track_width && pos->track_height &&
(!track_mixing || !pos->scale_in_compositor)) {
(!track_mixing || !scales_downstream (pos))) {
gst_caps_set_simple (caps, "width", G_TYPE_INT,
pos->track_width, "height", G_TYPE_INT, pos->track_height, NULL);
}
@ -321,6 +366,13 @@ gst_frame_positioner_update_properties (GstFramePositioner * pos,
reposition_properties (pos, old_track_width, old_track_height);
done:
if (scales_downstream (pos) && pos->natural_width && pos->natural_height) {
GST_DEBUG_OBJECT (pos,
"Forcing natural width in source make downstream scaling work");
gst_caps_set_simple (caps, "width", G_TYPE_INT, pos->natural_width,
"height", G_TYPE_INT, pos->natural_height, NULL);
}
GST_DEBUG_OBJECT (pos, "setting caps %" GST_PTR_FORMAT, caps);
g_object_set (pos->capsfilter, "caps", caps, NULL);
@ -469,7 +521,7 @@ gst_frame_positioner_class_init (GstFramePositionerClass * klass)
GstBaseTransformClass *base_transform_class =
GST_BASE_TRANSFORM_CLASS (klass);
GST_DEBUG_CATEGORY_INIT (_framepositioner, "framepositioner",
GST_DEBUG_CATEGORY_INIT (_framepositioner, "gesframepositioner",
GST_DEBUG_FG_YELLOW, "ges frame positioner");
gst_element_class_add_static_pad_template (GST_ELEMENT_CLASS (klass),
@ -498,9 +550,19 @@ gst_frame_positioner_class_init (GstFramePositionerClass * klass)
* The desired x position for the stream.
*/
properties[PROP_POSX] =
g_param_spec_int ("posx", "posx", "x position of the stream", MIN_PIXELS,
MAX_PIXELS, 0, G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE);
g_param_spec_int ("posx", "posx", "x position of the stream",
MIN_PIXELS, MAX_PIXELS, 0,
G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_LAX_VALIDATION);
/**
* gstframepositioner:fposx:
*
* The desired x position for the stream.
*/
properties[PROP_FPOSX] =
g_param_spec_float ("fposx", "fposx", "x position of the stream in float",
MIN_PIXELS, MAX_PIXELS, 0,
G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_LAX_VALIDATION);
/**
* gstframepositioner:posy:
@ -508,8 +570,20 @@ gst_frame_positioner_class_init (GstFramePositionerClass * klass)
* The desired y position for the stream.
*/
properties[PROP_POSY] =
g_param_spec_int ("posy", "posy", "y position of the stream", MIN_PIXELS,
MAX_PIXELS, 0, G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE);
g_param_spec_int ("posy", "posy", "y position of the stream",
MIN_PIXELS, MAX_PIXELS, 0,
G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_LAX_VALIDATION);
/**
* gstframepositioner:fposy:
*
* The desired y position for the stream.
*/
properties[PROP_FPOSY] =
g_param_spec_float ("fposy", "fposy", "y position of the stream in float",
MIN_PIXELS, MAX_PIXELS, 0,
G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_LAX_VALIDATION);
/**
* gstframepositioner:zorder:
@ -527,8 +601,20 @@ gst_frame_positioner_class_init (GstFramePositionerClass * klass)
* Set to 0 if size is not mandatory, will be set to width of the current track.
*/
properties[PROP_WIDTH] =
g_param_spec_int ("width", "width", "width of the source", 0, MAX_PIXELS,
0, G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE);
g_param_spec_int ("width", "width", "width of the source", 0,
MAX_PIXELS, 0,
G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_LAX_VALIDATION);
/**
* gesframepositioner:fwidth:
*
* The desired width for that source.
* Set to 0 if size is not mandatory, will be set to width of the current track.
*/
properties[PROP_FWIDTH] =
g_param_spec_float ("fwidth", "fwidth", "width of the source in float", 0,
MAX_PIXELS, 0,
G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_LAX_VALIDATION);
/**
* gesframepositioner:height:
@ -538,7 +624,19 @@ gst_frame_positioner_class_init (GstFramePositionerClass * klass)
*/
properties[PROP_HEIGHT] =
g_param_spec_int ("height", "height", "height of the source", 0,
MAX_PIXELS, 0, G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE);
MAX_PIXELS, 0,
G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_LAX_VALIDATION);
/**
* gesframepositioner:fheight:
*
* The desired height for that source.
* Set to 0 if size is not mandatory, will be set to height of the current track.
*/
properties[PROP_FHEIGHT] =
g_param_spec_float ("fheight", "fheight", "height of the source in float",
0, MAX_PIXELS, 0,
G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_LAX_VALIDATION);
/**
* gesframepositioner:operator:
@ -610,10 +708,18 @@ gst_frame_positioner_set_property (GObject * object, guint property_id,
framepositioner->posx = g_value_get_int (value);
framepositioner->user_positioned = TRUE;
break;
case PROP_FPOSX:
framepositioner->posx = g_value_get_float (value);
framepositioner->user_positioned = TRUE;
break;
case PROP_POSY:
framepositioner->posy = g_value_get_int (value);
framepositioner->user_positioned = TRUE;
break;
case PROP_FPOSY:
framepositioner->posy = g_value_get_float (value);
framepositioner->user_positioned = TRUE;
break;
case PROP_ZORDER:
framepositioner->zorder = g_value_get_uint (value);
break;
@ -623,12 +729,24 @@ gst_frame_positioner_set_property (GObject * object, guint property_id,
gst_frame_positioner_update_properties (framepositioner, track_mixing,
0, 0);
break;
case PROP_FWIDTH:
framepositioner->user_positioned = TRUE;
framepositioner->width = g_value_get_float (value);
gst_frame_positioner_update_properties (framepositioner, track_mixing,
0, 0);
break;
case PROP_HEIGHT:
framepositioner->user_positioned = TRUE;
framepositioner->height = g_value_get_int (value);
gst_frame_positioner_update_properties (framepositioner, track_mixing,
0, 0);
break;
case PROP_FHEIGHT:
framepositioner->user_positioned = TRUE;
framepositioner->height = g_value_get_float (value);
gst_frame_positioner_update_properties (framepositioner, track_mixing,
0, 0);
break;
case PROP_OPERATOR:
framepositioner->operator = g_value_get_enum (value);
gst_frame_positioner_update_properties (framepositioner, track_mixing,
@ -646,7 +764,7 @@ gst_frame_positioner_get_property (GObject * object, guint property_id,
GValue * value, GParamSpec * pspec)
{
GstFramePositioner *pos = GST_FRAME_POSITIONNER (object);
gint real_width, real_height;
gdouble real_width, real_height;
switch (property_id) {
case PROP_ALPHA:
@ -655,9 +773,15 @@ gst_frame_positioner_get_property (GObject * object, guint property_id,
case PROP_POSX:
g_value_set_int (value, round (pos->posx));
break;
case PROP_FPOSX:
g_value_set_float (value, pos->posx);
break;
case PROP_POSY:
g_value_set_int (value, round (pos->posy));
break;
case PROP_FPOSY:
g_value_set_float (value, pos->posy);
break;
case PROP_ZORDER:
g_value_set_uint (value, pos->zorder);
break;
@ -665,18 +789,32 @@ gst_frame_positioner_get_property (GObject * object, guint property_id,
if (pos->scale_in_compositor) {
g_value_set_int (value, round (pos->width));
} else {
real_width =
pos->width > 0 ? round (pos->width) : round (pos->track_width);
g_value_set_int (value, real_width);
real_width = pos->width > 0 ? pos->width : pos->track_width;
g_value_set_int (value, round (real_width));
}
break;
case PROP_FWIDTH:
if (pos->scale_in_compositor) {
g_value_set_float (value, pos->width);
} else {
real_width = pos->width > 0 ? pos->width : pos->track_width;
g_value_set_float (value, real_width);
}
break;
case PROP_HEIGHT:
if (pos->scale_in_compositor) {
g_value_set_int (value, round (pos->height));
} else {
real_height =
pos->height > 0 ? round (pos->height) : round (pos->track_height);
g_value_set_int (value, real_height);
real_height = pos->height > 0 ? pos->height : pos->track_height;
g_value_set_int (value, round (real_height));
}
break;
case PROP_FHEIGHT:
if (pos->scale_in_compositor) {
g_value_set_float (value, pos->height);
} else {
real_height = pos->height > 0 ? pos->height : pos->track_height;
g_value_set_float (value, real_height);
}
break;
case PROP_OPERATOR:
@ -703,13 +841,54 @@ gst_frame_positioner_transform_ip (GstBaseTransform * trans, GstBuffer * buf)
GST_OBJECT_LOCK (framepositioner);
meta->alpha = framepositioner->alpha;
meta->posx = round (framepositioner->posx);
meta->posy = round (framepositioner->posy);
meta->width = round (framepositioner->width);
meta->height = round (framepositioner->height);
meta->posx = framepositioner->posx;
meta->posy = framepositioner->posy;
meta->width = framepositioner->width;
meta->height = framepositioner->height;
meta->zorder = framepositioner->zorder;
meta->operator = framepositioner->operator;
GST_OBJECT_UNLOCK (framepositioner);
return GST_FLOW_OK;
}
gboolean
gst_frame_positioner_check_can_add_binding (GstFramePositioner * self,
const gchar * property_name)
{
gint i = 0;
const gchar *checked_prop = NULL;
const gchar *props[][2] = {
{"posx", "fposx"},
{"posy", "fposy"},
{"width", "fwidth"},
{"height", "fheight"},
};
for (i = 0; i < G_N_ELEMENTS (props); i++) {
if (!g_strcmp0 (property_name, props[i][0])) {
checked_prop = props[i][1];
break;
} else if (!g_strcmp0 (property_name, props[i][1])) {
checked_prop = props[i][0];
break;
}
}
if (!checked_prop)
return TRUE;
GstControlBinding *b =
gst_object_get_control_binding (GST_OBJECT (self), checked_prop);
if (b) {
gst_object_unref (b);
GST_WARNING_OBJECT (self,
"Can't add control binding for %s as %s already has one", property_name,
checked_prop);
return FALSE;
}
return TRUE;
}

View file

@ -72,6 +72,7 @@ struct _GstFramePositionerClass
GstBaseTransformClass base_framepositioner_class;
};
G_GNUC_INTERNAL gboolean gst_frame_positioner_check_can_add_binding (GstFramePositioner *self, const gchar *property_name);
G_GNUC_INTERNAL GType gst_compositor_operator_get_type_and_default_value (int *default_operator_value);
G_GNUC_INTERNAL void ges_frame_positioner_set_source_and_filter (GstFramePositioner *pos,
GESTrackElement *trksrc,

View file

@ -67,6 +67,7 @@ ges_sources = files([
'ges-structure-parser.c',
'ges-marker-list.c',
'ges-discoverer-manager.c',
'gesvideoscale.c',
'gstframepositioner.c'
])

View file

@ -30,6 +30,46 @@ GStreamer library for creating audio and video editors
</GitRepository>
</repository>
<release>
<Version>
<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-editing-services/gst-editing-services-1.24.0.tar.xz" />
</Version>
</release>
<release>
<Version>
<revision>1.23.90</revision>
<branch>main</branch>
<name></name>
<created>2024-02-23</created>
<file-release rdf:resource="https://gstreamer.freedesktop.org/src/gst-editing-services/gst-editing-services-1.23.90.tar.xz" />
</Version>
</release>
<release>
<Version>
<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-editing-services/gst-editing-services-1.23.2.tar.xz" />
</Version>
</release>
<release>
<Version>
<revision>1.23.1</revision>
<branch>main</branch>
<name></name>
<created>2024-02-06</created>
<file-release rdf:resource="https://gstreamer.freedesktop.org/src/gst-editing-services/gst-editing-services-1.23.1.tar.xz" />
</Version>
</release>
<release>
<Version>
<revision>1.22.0</revision>

View file

@ -1,6 +1,6 @@
project('gst-editing-services', 'c',
version : '1.23.0.1',
meson_version : '>= 0.62',
version : '1.25.0.1',
meson_version : '>= 1.1',
default_options : [ 'warning_level=1',
'buildtype=debugoptimized' ])
@ -35,6 +35,7 @@ else
gst_req = '>= ' + gst_version
endif
host_system = host_machine.system()
cc = meson.get_compiler('c')
mathlib = cc.find_library('m', required : false)
@ -81,14 +82,14 @@ if cc.has_argument('-fno-strict-aliasing')
add_project_arguments('-fno-strict-aliasing', language: 'c')
endif
cdata.set('VERSION', '"@0@"'.format(gst_version))
cdata.set('PACKAGE', '"gst-editing-services"')
cdata.set('PACKAGE_VERSION', '"@0@"'.format(gst_version))
cdata.set('PACKAGE_BUGREPORT', '"https://gitlab.freedesktop.org/gstreamer/gstreamer/issues/new"')
cdata.set('PACKAGE_NAME', '"GStreamer Editing Services"')
cdata.set('GST_PACKAGE_NAME', '"GStreamer Editing Services"')
cdata.set('GST_PACKAGE_ORIGIN', '"Unknown package origin"')
cdata.set('GST_LICENSE', '"LGPL"')
cdata.set_quoted('VERSION', gst_version)
cdata.set_quoted('PACKAGE', 'gst-editing-services')
cdata.set_quoted('PACKAGE_VERSION', gst_version)
cdata.set_quoted('PACKAGE_BUGREPORT', 'https://gitlab.freedesktop.org/gstreamer/gstreamer/issues/new')
cdata.set_quoted('PACKAGE_NAME', 'GStreamer Editing Services')
cdata.set_quoted('GST_PACKAGE_NAME', 'GStreamer Editing Services')
cdata.set_quoted('GST_PACKAGE_ORIGIN', 'Unknown package origin')
cdata.set_quoted('GST_LICENSE', 'LGPL')
# Mandatory GST deps
gst_dep = dependency('gstreamer-' + apiversion, version : gst_req,
@ -101,7 +102,7 @@ gstaudio_dep = dependency('gstreamer-audio-' + apiversion, version : gst_req,
fallback : ['gst-plugins-base', 'audio_dep'])
gstbase_dep = dependency('gstreamer-base-1.0', version : gst_req,
fallback : ['gstreamer', 'gst_base_dep'])
if host_machine.system() != 'windows'
if host_system != 'windows'
gstcheck_dep = dependency('gstreamer-check-1.0', version : gst_req,
required : get_option('tests'),
fallback : ['gstreamer', 'gst_check_dep'])
@ -113,6 +114,7 @@ gstvalidate_dep = dependency('gstreamer-validate-1.0', version : gst_req, requir
gio_dep = dependency('gio-2.0', version: glib_req)
gmodule_dep = dependency('gmodule-no-export-2.0')
libdl = cc.find_library('dl', required: false)
libxml_dep = dependency('libxml-2.0', required: get_option('xptv'))
cdata.set('DISABLE_XPTV', not libxml_dep.found())
@ -143,73 +145,79 @@ gir_init_section = [ '--add-init-section=' + \
'ges_init();', '--quiet']
pymod = import('python')
python = pymod.find_installation(required: get_option('python'))
python_opt = get_option('python')
python = pymod.find_installation(required: python_opt)
has_python = false
static_build = get_option('default_library') == 'static'
if static_build
if get_option('python').enabled()
if python_opt.enabled()
error('Want to build python based modules but it is not supported while static building')
else
message('Disabling python support as it is not supported on static builds')
endif
elif build_gir
if python.found()
# Workaround for https://github.com/mesonbuild/meson/issues/5629
pythonver = python.language_version()
python_dep = dependency('python-@0@-embed'.format(pythonver), version: '>=3',
required: false, include_type: 'system')
if not python_dep.found()
python_dep = python.dependency(required : get_option('python'),
include_type: 'system')
endif
else
python_dep = dependency('', required: false)
endif
elif build_gir and python.found()
python_dep = python.dependency(required : python_opt, embed: true,
include_type: 'system')
if python_dep.found()
python_abi_flags = python.get_variable('ABIFLAGS', '')
message(f'python_abi_flags = @python_abi_flags@')
pylib_loc = get_option('libpython-dir')
error_msg = ''
if not cc.compiles('#include <Python.h>', dependencies: [python_dep])
error_msg = 'Could not compile a simple program against python'
elif pylib_loc == ''
fsmod = import('fs')
pylib_loc = python.get_variable('LIBPL', '')
if host_machine.system() != 'windows' and host_machine.system() != 'darwin'
pylib_ldlibrary = python.get_variable('LDLIBRARY', '')
if not fsmod.exists(pylib_loc / pylib_ldlibrary)
# Workaround for Fedora
pylib_loc = python.get_variable('LIBDIR', '')
message('pylib_loc = @0@'.format(pylib_loc))
endif
if not fsmod.exists(pylib_loc / pylib_ldlibrary)
error_msg = '@0@ doesn\' exist, can\'t use python'.format(join_paths(pylib_loc, pylib_ldlibrary))
endif
endif
if error_msg == ''
pylib_suffix = 'so'
if host_machine.system() == 'windows'
pylib_suffix = 'dll'
elif host_machine.system() == 'darwin'
pylib_suffix = 'dylib'
endif
libges_deps = libges_deps + [python_dep, gmodule_dep]
has_python = true
message('python_abi_flags = @0@'.format(python_abi_flags))
message('pylib_loc = @0@'.format(pylib_loc))
cdata.set('HAS_PYTHON', true)
cdata.set('PY_LIB_LOC', '"@0@"'.format(pylib_loc))
cdata.set('PY_ABI_FLAGS', '"@0@"'.format(python_abi_flags))
cdata.set('PY_LIB_SUFFIX', '"@0@"'.format(pylib_suffix))
cdata.set('PYTHON_VERSION', '"@0@"'.format(python_dep.version()))
if python_opt.enabled()
error(error_msg)
else
if get_option('python').enabled()
error(error_msg)
else
message(error_msg)
endif
message(error_msg)
endif
endif
fsmod = import('fs')
pylib_prefix = 'lib'
pylib_suffix = 'so'
if host_system == 'windows'
if cc.get_argument_syntax() == 'msvc'
pylib_prefix = ''
endif
pylib_suffix = 'dll'
elif host_system == 'darwin'
pylib_suffix = 'dylib'
endif
pylib_fnames = []
# Library name with soversion, non-devel package
pylib_fnames += python.get_variable('INSTSONAME', [])
# Library name without soversion, devel package, framework, etc.
pylib_fnames += python.get_variable('LDLIBRARY', [])
# Manually construct name as a fallback
pylib_fnames += [
pylib_prefix + 'python' + python_dep.version() + python_abi_flags + '.' + pylib_suffix
]
if pylib_loc != ''
pylib_locs = [pylib_loc]
else
pylib_locs = [
python.get_variable('LIBDIR', ''),
python.get_variable('LIBPL', ''),
]
endif
foreach loc: pylib_locs
foreach fname: pylib_fnames
if fsmod.exists(loc / fname)
libges_deps = libges_deps + [python_dep, gmodule_dep, libdl]
has_python = true
cdata.set('HAS_PYTHON', true)
cdata.set_quoted('PY_LIB_FNAME', fname)
message(f'PY_LIB_FNAME = @fname@ (@loc@)')
break
endif
endforeach
endforeach
if not has_python
error_msg = 'Could not find python library to load'
if python_opt.enabled()
error(error_msg)
else
message(error_msg)
endif
endif
endif
@ -318,7 +326,7 @@ endif
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

@ -321,7 +321,12 @@ ges_base_bin_set_timeline (GESBaseBin * self, GESTimeline * timeline)
/* Add queues the same way as in GESPipeline */
g_object_set (G_OBJECT (queue), "max-size-buffers", 0,
"max-size-bytes", 0, "max-size-time", (gint64) 2 * GST_SECOND, NULL);
gst_bin_add (sbin, queue);
if (!gst_bin_add (sbin, queue)) {
g_free (name);
gst_object_unref (queue);
continue;
}
gst_element_sync_state_with_parent (GST_ELEMENT (queue));
tmppad = gst_element_get_static_pad (queue, "sink");
@ -329,14 +334,18 @@ ges_base_bin_set_timeline (GESBaseBin * self, GESTimeline * timeline)
GST_ERROR_OBJECT (sbin, "Could not link %s:%s and %s:%s",
GST_DEBUG_PAD_NAME (pad), GST_DEBUG_PAD_NAME (tmppad));
g_free (name);
gst_object_unref (tmppad);
gst_object_unref (queue);
gst_bin_remove (sbin, queue);
continue;
}
gst_object_unref (tmppad);
tmppad = gst_element_get_static_pad (queue, "src");
gpad = gst_ghost_pad_new_from_template (name, tmppad,
gst_static_pad_template_get (template));
gst_object_unref (tmppad);
g_free (name);
gst_pad_set_active (gpad, TRUE);
gst_element_add_pad (GST_ELEMENT (sbin), gpad);

Some files were not shown because too many files have changed in this diff Show more