The fake video decoder ignores input bitstream except
to enforce caps restrictions. It reads video width,
height and framerate from caps. Then it just pushes
video frames without doing any decoding.
The fake video decoder just draws a snake moving from
left to right in the middle of the frame. This is a
light weight drawing while it still provides an idea
about how smooth is the rendering.
The fake video decoder inherits from GstVideoDecoder.
It is useful to measure how smooth will be the whole
rendering pipeline if you had the most efficient video
decoder. Also useful to bisect issues for example when
suspecting issues in a specific video decoder.
Handles mpeg2, mpeg4, h263, h264, theora, vp8, wmv3, msmpeg,
flash-video, vp6, vp9, wmv1, wmv2, divx but more can be
added if needed.
For now it can only output RGBA, RGBx, BGRA, BGRx.
Its rank is 0 (none) but I added a property to change it so
that it can be selected by decodebin.
gst-launch-1.0 fakevideodec rank=512 \
playbin uri=http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4http://bugzilla.gnome.org/show_bug.cgi?id=723778Closes#679
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5636>
From a multimedia perspective GLES >= 2 has the big advantage of
supporting external textures (`OES_EGL_image_external` /
`OES_EGL_image_external_essl3`), allowing various YUV formats to be
imported directly by drivers.
It appears unlikely by now that the extension will ever be ported to
GL with Vulkan becoming more popular, leaving GL without an "official"
way to import YUV formats.
Further more, for Gst internal purposes it's likely that GLES2 works
equally well if not better on most drivers these days, especially on
embedded devices.
Thus switch the default for EGL context creation to GLES2. This won't
affect apps that create their own context, but `gst-launch-1.0` etc.,
which are often used for testing so people don't have to pass
`GST_GL_API=gles2`.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5509>
By sealing for future writes, we broke Wayland SHM support. It seems like the
wayland library maps the SHM in read/write mode. This is visible through no
display and an error message like this:
wl_shm@7: error 2: failed mmap fd 43: Operation not permitted
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5684>
Take the case into account when user filters have been set before the
source gets updated.
Note that the further linking of the filters, if present, happens below
in the `gst_camera_bin_check_and_replace_filter()` calls.
The audio filter is still affected by the same issue but left out for
now.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5527>
If this property is enabled then the jitterbuffer will do the normal PTS
calculations according to the configured mode instead of making use of
the RFC7273 media clock.
The timestamp calculated from the RFC7273 media clock will only be
stored in the reference timestamp meta, if addition of that meta is enabled.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5512>
When this property is used, it is assumed that the system clock is
synced close enough to the media clock used by an RFC7273 stream.
As long as both clocks are at most a few seconds from each other this
will give the correct results and avoids having to create an actual
network clock that has to sync first.
If the system clock is actually synchronized to the media clock then
everything will behave exactly the same, otherwise the reference
timestamp meta will be correct but the buffer timestamps will be off by
the difference between the two clocks.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5512>
Do more checks for clock equality than just checking pointers. The same
NTP/PTP clock might be used as pipeline clock but a new instance, so
instead also check what clock they are synced to.
Also handling setting / resetting of the media clock and pipeline clock
correctly by resetting the media clock's state accordingly.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5512>
This allows configuring the TTL that is used for multicast packets sent
out on the sockets, and is defaulting to 1 as before. The default might
change at some point.
In some networks multiple hops are needed to reach the PTP clock and
this allows to configure GStreamer in a way that works in such networks.
At a later time, per-domain or per-interface TTL configurations might be
added when needed.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5649>
Even if IDXGIOutput6 says current display colorspace is HDR,
captured texture via IDXGIOutputDuplication::AcquireNextFrame()
is converted frame by OS unless we use IDXGIOutput5::DuplicateOutput1()
with DXGI_FORMAT_R16G16B16A16_FLOAT format, in order for captured
frame to be scRGB color space. Then application should perform
tonemap operation based on reported display white level, color primaries, etc.
Since we don't have any tonemapping implementation, ignores colorimetry
reported by IDXGIOutput6.
Fixes: https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/3128
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5671>
This commit makes sure that pads are valid for linking
after the pads has been temporarily unlocked in the linking process.
Not doing this opens up for a race condition where
pads potentially can be linked twice.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5670>
This is how it was documented and how it worked before the port to GstPlay.
Without this, applications expecting signals to be emitted directly
without anything running the main context will simply not receive any
signals.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5672>
d2d runtime seems to execute pending GPU command list
when DXGI ID2D1RenderTarget is being released, and it will invoke
d3d11 immediate context APIs. Should protect all rendering operations
and DXGI resources with lock.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5659>
Because we treat raw audio chunks/samples as keyframes, they were interfering
with seek time adjustment.
Became apparent when the accompanying video stream was I-frame only,
for example ProRes.
Since raw audio streams can be seeked freely, it's fine to just ignore them here,
giving priority to the real keyframes in the video stream.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4946>
The code seems to validate that the media-level fingerprint matches
the fingerprint of the previous media or of the whole session. There
is no such requirement in any RFC I found. The session-session one
is just meant to act as a fallback when there is no media-level
fingerprint.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1118>
This commit corrects the mapping relationship between RGB and BGR in GST and DRM.
The previous mapping was incorrect, causing potential color mismatches in the output.
The changes are as follows:
{WL_SHM_FORMAT_RGB888, DRM_FORMAT_RGB888, GST_VIDEO_FORMAT_BGR},
{WL_SHM_FORMAT_BGR888, DRM_FORMAT_BGR888, GST_VIDEO_FORMAT_RGB},
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5620>
After talking with Vivia on IRC, she does not remember why the default
was FALSE and it is in my opinion preferable to stick to whatever
representation best represents time for a given framerate as a default
behavior.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5628>
In the case of encoders and filters when importing a DMABuf, use
GstVideoInfoDmaDrm to get the drm fourcc and modifier.
In both cases, instead of keeping the original GstVideoInfoDmaDrm from caps, the
GstVideoInfo part of the structure is converted as canonical one, given the
format from the fourcc. It's kept in the way to handle V4L2 linear DMABufs and
to avoid too many changes in the current code.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5264>
Instead of guessing the DRM format and modifier, pass a DRM video info to
gst_va_dmabuf_memories_setup().
Still, it checks for the DRM parameters in DRM info, if they are not available,
as in the case of V4L2 buffers, the part of the video info is used.
This is an API breakage, but since the plugin is still in stage, it's still
allowed.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5264>
To import DMAbufs we used VASurfaceAttribExternalBuffers which works, but it's
not specific for DRM PRIME 2, since it lacks of many metadata. This patch
replaces VASurfaceAttribExternalBuffers with VADRMPRIMESurfaceDescriptor in
va_create_surfaces().
Still, this patch assumes linear modifier only.
The hack for RGB surfaces in I965 driver was pushed down into
va_create_surfaces() to avoid handling both structures.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5264>
Should fix auto-generated follow-up sections like "Hierarchy" or
"Factory details" to be listed under the element name in the
table-of-contents of the document, instead of a stand-alone
"Duplex-Mode" section.
Also cleanup some spurious colon suffix after section names.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5625>
Now that nvidia-vaapi-driver appeared and isn't yet supported by GstVA, we've to
add an allowed list of supported drivers.
This patch implements it adding a environment variable to disable this driver
check: GST_VA_ALL_DRIVERS
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5616>
If text width ever reached 1px, for example after resizing the output window, the overlay would stop rendering
and never return again. The 1px condition itself does not seem to make much sense here anyway.
This was a chain of events: width reached 1, so the composition was set to NULL. Then, after resizing the output window,
push_frame() was called but would not attempt to renegotiate because composition is NULL. This caused the width/height
to never be updated again, as that only happens during negotiation, so the overlay was gone for good.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5614>
When a new discoverer was created for a thread so discovery could
recurse we could end up removing the wrong discoverer info from the
cache leading to freeing it while it was still discovering URIS, which
lead to the following assertion:
``` bt
Thread 1 (Thread 0x7fcc2e1a5840 (LWP 1855496)):
#0 __pthread_kill_implementation (threadid=<optimized out>, signo=signo@entry=6, no_tid=no_tid@entry=0) at pthread_kill.c:44
#1 0x00007fcc2e9d98a3 in __pthread_kill_internal (signo=6, threadid=<optimized out>) at pthread_kill.c:78
#2 0x00007fcc2e9878ee in __GI_raise (sig=sig@entry=6) at ../sysdeps/posix/raise.c:26
#3 0x00007fcc2e96f8ff in __GI_abort () at abort.c:79
#4 0x00007fcc2ed80056 in g_assertion_message (domain=domain@entry=0x7fcc2f2c19f9 "GES", file=file@entry=0x7fcc2f2dfd68 "../subprojects/gst-editing-services/ges/ges-discoverer-manager.c", line=line@entry=20, func=func@entry=0x7fcc2f2e0030 <__func__.7> "ges_discoverer_data_free", message=message@entry=0x12dab70 "assertion failed: (data->n_uri == 0)") at ../glib/gtestutils.c:3497
#5 0x00007fcc2ede1d87 in g_assertion_message_expr (domain=domain@entry=0x7fcc2f2c19f9 "GES", file=file@entry=0x7fcc2f2dfd68 "../subprojects/gst-editing-services/ges/ges-discoverer-manager.c", line=line@entry=20, func=func@entry=0x7fcc2f2e0030 <__func__.7> "ges_discoverer_data_free", expr=expr@entry=0x7fcc2f2dfcf1 "data->n_uri == 0") at ../glib/gtestutils.c:3523
#6 0x00007fcc2f2bd5c5 in ges_discoverer_data_free (data=0x160e430) at ../subprojects/gst-editing-services/ges/ges-discoverer-manager.c:20
#7 0x00007fcc2ed8509d in g_atomic_rc_box_release_full (clear_func=0x7fcc2f2bd4f0 <ges_discoverer_data_free>, mem_block=0x160e430) at ../glib/garcbox.c:355
#8 g_atomic_rc_box_release_full (mem_block=0x160e430, clear_func=0x7fcc2f2bd4f0 <ges_discoverer_data_free>) at ../glib/garcbox.c:338
#9 0x00007fcc2eda6809 in g_hash_table_remove_internal (notify=1, key=0x10448a0, hash_table=0x12e0be0) at ../glib/ghash.c:1776
#10 g_hash_table_remove (hash_table=0x12e0be0, key=0x10448a0) at ../glib/ghash.c:1804
#11 0x00007fcc2f2bd95f in cleanup_discoverer_cb (discoverer_data=discoverer_data@entry=0x13e7000) at ../subprojects/gst-editing-services/ges/ges-discoverer-manager.c:379
#12 0x00007fcc2edbc759 in g_timeout_dispatch (source=0x15a6060, callback=0x7fcc2f2bd910 <cleanup_discoverer_cb>, user_data=0x13e7000) at ../glib/gmain.c:5121
#13 0x00007fcc2edbbe1c in g_main_dispatch (context=0x1044700) at ../glib/gmain.c:3476
#14 g_main_context_dispatch_unlocked (context=0x1044700) at ../glib/gmain.c:4284
#15 0x00007fcc2ee16d78 in g_main_context_iterate_unlocked.isra.0 (context=0x1044700, block=block@entry=1, dispatch=dispatch@entry=1, self=<optimized out>) at ../glib/gmain.c:4349
#16 0x00007fcc2edbd407 in g_main_loop_run (loop=0x12ccbd0) at ../glib/gmain.c:4551
#17 0x00007fcc2f285791 in ges_uri_clip_asset_request_sync (uri=uri@entry=0x12d7980 "file:///var/home/phil/gstreamer/build/subprojects/gst-integration-testsuites/logs/ges/scenarios/check_seek_on_very_deeply_nested_timeline/nested_timeline_depth6.xges", error=error@entry=0x7fff499015a8) at ../subprojects/gst-editing-services/ges/ges-uri-asset.c:688
#18 0x00007fcc2f28949b in ges_project_create_asset_sync (project=0x12c1c70, id=id@entry=0x12d7980 "file:///var/home/phil/gstreamer/build/subprojects/gst-integration-testsuites/logs/ges/scenarios/check_seek_on_very_deeply_nested_timeline/nested_timeline_depth6.xges", extractable_type=extractable_type@entry=Python Exception <class 'gdb.error'>: value has been optimized out , error=error@entry=0x7fff499015a8) at ../subprojects/gst-editing-services/ges/ges-project.c:959
#19 0x00007fcc2f2ba484 in _ges_get_asset_from_timeline (timeline=timeline@entry=0x12bdc80, type=type@entry=Python Exception <class 'gdb.error'>: value has been optimized out , id=id@entry=0x12d7980 "file:///var/home/phil/gstreamer/build/subprojects/gst-integration-testsuites/logs/ges/scenarios/check_seek_on_very_deeply_nested_timeline/nested_timeline_depth6.xges", error=error@entry=0x7fff49901728) at ../subprojects/gst-editing-services/ges/ges-structured-interface.c:540
#20 0x00007fcc2f2ba9b2 in _ges_add_clip_from_struct (timeline=0x12bdc80, structure=0x157f690, error=0x7fff49901728) at ../subprojects/gst-editing-services/ges/ges-structured-interface.c:697
#21 0x00007fcc2f2b6a9d in _validate_action_execute (scenario=0x15f7620, action=0x157f500) at ../subprojects/gst-editing-services/ges/ges-validate.c:922
#22 0x00007fcc2eef5c9c in gst_validate_execute_action (action=0x157f500, action_type=0x13e0500) at ../subprojects/gst-devtools/validate/gst/validate/gst-validate-scenario.c:2541
#23 gst_validate_execute_action (action_type=0x13e0500, action=0x157f500) at ../subprojects/gst-devtools/validate/gst/validate/gst-validate-scenario.c:2507
#24 0x00007fcc2eef8ce3 in execute_next_action_full (scenario=<optimized out>, message=<optimized out>) at ../subprojects/gst-devtools/validate/gst/validate/gst-validate-scenario.c:2782
#25 0x00007fcc2eef9dee in _action_set_done (action=0x157efb0) at ../subprojects/gst-devtools/validate/gst/validate/gst-validate-scenario.c:6368
#26 0x00007fcc2edbd26d in g_main_context_invoke_full (context=0x1044700, priority=200, function=0x7fcc2eef9ab0 <_action_set_done>, data=0x157efb0, notify=0x7fcc2eeea5d0 <gst_validate_action_unref>) at ../glib/gmain.c:6533
#27 0x00007fcc2eef6cf2 in gst_validate_action_set_done (action=0x157efb0) at ../subprojects/gst-devtools/validate/gst/validate/gst-validate-scenario.c:6411
#28 0x00007fcc2eef9018 in execute_next_action_full (scenario=<optimized out>, message=<optimized out>) at ../subprojects/gst-devtools/validate/gst/validate/gst-validate-scenario.c:2803
#29 0x00007fcc2eef9dee in _action_set_done (action=0x157ea60) at ../subprojects/gst-devtools/validate/gst/validate/gst-validate-scenario.c:6368
#30 0x00007fcc2edbd26d in g_main_context_invoke_full (context=0x1044700, priority=200, function=0x7fcc2eef9ab0 <_action_set_done>, data=0x157ea60, notify=0x7fcc2eeea5d0 <gst_validate_action_unref>) at ../glib/gmain.c:6533
#31 0x00007fcc2eef6cf2 in gst_validate_action_set_done (action=0x157ea60) at ../subprojects/gst-devtools/validate/gst/validate/gst-validate-scenario.c:6411
#32 0x00007fcc2eef9018 in execute_next_action_full (scenario=<optimized out>, message=<optimized out>) at ../subprojects/gst-devtools/validate/gst/validate/gst-validate-scenario.c:2803
#33 0x00007fcc2eef9dee in _action_set_done (action=0x157e510) at ../subprojects/gst-devtools/validate/gst/validate/gst-validate-scenario.c:6368
#34 0x00007fcc2edbd26d in g_main_context_invoke_full (context=0x1044700, priority=200, function=0x7fcc2eef9ab0 <_action_set_done>, data=0x157e510, notify=0x7fcc2eeea5d0 <gst_validate_action_unref>) at ../glib/gmain.c:6533
#35 0x00007fcc2eef6cf2 in gst_validate_action_set_done (action=0x157e510) at ../subprojects/gst-devtools/validate/gst/validate/gst-validate-scenario.c:6411
#36 0x00007fcc2eef9018 in execute_next_action_full (scenario=<optimized out>, message=<optimized out>) at ../subprojects/gst-devtools/validate/gst/validate/gst-validate-scenario.c:2803
#37 0x00007fcc2eef9dee in _action_set_done (action=0x157df10) at ../subprojects/gst-devtools/validate/gst/validate/gst-validate-scenario.c:6368
#38 0x00007fcc2edbd26d in g_main_context_invoke_full (context=0x1044700, priority=200, function=0x7fcc2eef9ab0 <_action_set_done>, data=0x157df10, notify=0x7fcc2eeea5d0 <gst_validate_action_unref>) at ../glib/gmain.c:6533
#39 0x00007fcc2eef6cf2 in gst_validate_action_set_done (action=0x157df10) at ../subprojects/gst-devtools/validate/gst/validate/gst-validate-scenario.c:6411
#40 0x00007fcc2eef9018 in execute_next_action_full (scenario=<optimized out>, message=<optimized out>) at ../subprojects/gst-devtools/validate/gst/validate/gst-validate-scenario.c:2803
#41 0x00007fcc2eef9dee in _action_set_done (action=0x157d9e0) at ../subprojects/gst-devtools/validate/gst/validate/gst-validate-scenario.c:6368
#42 0x00007fcc2edbd26d in g_main_context_invoke_full (context=0x1044700, priority=200, function=0x7fcc2eef9ab0 <_action_set_done>, data=0x157d9e0, notify=0x7fcc2eeea5d0 <gst_validate_action_unref>) at ../glib/gmain.c:6533
#43 0x00007fcc2eef6cf2 in gst_validate_action_set_done (action=0x157d9e0) at ../subprojects/gst-devtools/validate/gst/validate/gst-validate-scenario.c:6411
#44 0x00007fcc2eef9018 in execute_next_action_full (scenario=<optimized out>, message=<optimized out>) at ../subprojects/gst-devtools/validate/gst/validate/gst-validate-scenario.c:2803
#45 0x00007fcc2eef9dee in _action_set_done (action=0x157d3e0) at ../subprojects/gst-devtools/validate/gst/validate/gst-validate-scenario.c:6368
#46 0x00007fcc2edbd26d in g_main_context_invoke_full (context=0x1044700, priority=200, function=0x7fcc2eef9ab0 <_action_set_done>, data=0x157d3e0, notify=0x7fcc2eeea5d0 <gst_validate_action_unref>) at ../glib/gmain.c:6533
#47 0x00007fcc2eef6cf2 in gst_validate_action_set_done (action=0x157d3e0) at ../subprojects/gst-devtools/validate/gst/validate/gst-validate-scenario.c:6411
#48 0x00007fcc2eef9018 in execute_next_action_full (scenario=<optimized out>, message=<optimized out>) at ../subprojects/gst-devtools/validate/gst/validate/gst-validate-scenario.c:2803
#49 0x00007fcc2eef9dee in _action_set_done (action=0x157cf70) at ../subprojects/gst-devtools/validate/gst/validate/gst-validate-scenario.c:6368
#50 0x00007fcc2edbd26d in g_main_context_invoke_full (context=0x1044700, priority=200, function=0x7fcc2eef9ab0 <_action_set_done>, data=0x157cf70, notify=0x7fcc2eeea5d0 <gst_validate_action_unref>) at ../glib/gmain.c:6533
#51 0x00007fcc2eef6cf2 in gst_validate_action_set_done (action=0x157cf70) at ../subprojects/gst-devtools/validate/gst/validate/gst-validate-scenario.c:6411
#52 0x00007fcc2eef9018 in execute_next_action_full (scenario=<optimized out>, message=<optimized out>) at ../subprojects/gst-devtools/validate/gst/validate/gst-validate-scenario.c:2803
#53 0x00007fcc2eef9dee in _action_set_done (action=0x157cb00) at ../subprojects/gst-devtools/validate/gst/validate/gst-validate-scenario.c:6368
#54 0x00007fcc2edbd26d in g_main_context_invoke_full (context=0x1044700, priority=200, function=0x7fcc2eef9ab0 <_action_set_done>, data=0x157cb00, notify=0x7fcc2eeea5d0 <gst_validate_action_unref>) at ../glib/gmain.c:6533
#55 0x00007fcc2eef6cf2 in gst_validate_action_set_done (action=0x157cb00) at ../subprojects/gst-devtools/validate/gst/validate/gst-validate-scenario.c:6411
#56 0x00007fcc2eef9018 in execute_next_action_full (scenario=<optimized out>, message=<optimized out>) at ../subprojects/gst-devtools/validate/gst/validate/gst-validate-scenario.c:2803
#57 0x00007fcc2eef9dee in _action_set_done (action=0x157c690) at ../subprojects/gst-devtools/validate/gst/validate/gst-validate-scenario.c:6368
#58 0x00007fcc2edbd26d in g_main_context_invoke_full (context=0x1044700, priority=200, function=0x7fcc2eef9ab0 <_action_set_done>, data=0x157c690, notify=0x7fcc2eeea5d0 <gst_validate_action_unref>) at ../glib/gmain.c:6533
#59 0x00007fcc2eef6cf2 in gst_validate_action_set_done (action=0x157c690) at ../subprojects/gst-devtools/validate/gst/validate/gst-validate-scenario.c:6411
#60 0x00007fcc2eef9018 in execute_next_action_full (scenario=<optimized out>, message=<optimized out>) at ../subprojects/gst-devtools/validate/gst/validate/gst-validate-scenario.c:2803
#61 0x00007fcc2eef9dee in _action_set_done (action=0x157c220) at ../subprojects/gst-devtools/validate/gst/validate/gst-validate-scenario.c:6368
#62 0x00007fcc2edbd26d in g_main_context_invoke_full (context=0x1044700, priority=200, function=0x7fcc2eef9ab0 <_action_set_done>, data=0x157c220, notify=0x7fcc2eeea5d0 <gst_validate_action_unref>) at ../glib/gmain.c:6533
#63 0x00007fcc2eef6cf2 in gst_validate_action_set_done (action=0x157c220) at ../subprojects/gst-devtools/validate/gst/validate/gst-validate-scenario.c:6411
#64 0x00007fcc2eef9018 in execute_next_action_full (scenario=<optimized out>, message=<optimized out>) at ../subprojects/gst-devtools/validate/gst/validate/gst-validate-scenario.c:2803
#65 0x00007fcc2eef9dee in _action_set_done (action=0x15233c0) at ../subprojects/gst-devtools/validate/gst/validate/gst-validate-scenario.c:6368
#66 0x00007fcc2edbd26d in g_main_context_invoke_full (context=0x1044700, priority=200, function=0x7fcc2eef9ab0 <_action_set_done>, data=0x15233c0, notify=0x7fcc2eeea5d0 <gst_validate_action_unref>) at ../glib/gmain.c:6533
#67 0x00007fcc2eef6cf2 in gst_validate_action_set_done (action=0x15233c0) at ../subprojects/gst-devtools/validate/gst/validate/gst-validate-scenario.c:6411
#68 0x00007fcc2eef9018 in execute_next_action_full (scenario=<optimized out>, message=<optimized out>) at ../subprojects/gst-devtools/validate/gst/validate/gst-validate-scenario.c:2803
#69 0x00007fcc2eef9dee in _action_set_done (action=0x1522f80) at ../subprojects/gst-devtools/validate/gst/validate/gst-validate-scenario.c:6368
#70 0x00007fcc2edbd26d in g_main_context_invoke_full (context=0x1044700, priority=200, function=0x7fcc2eef9ab0 <_action_set_done>, data=0x1522f80, notify=0x7fcc2eeea5d0 <gst_validate_action_unref>) at ../glib/gmain.c:6533
#71 0x00007fcc2eef6cf2 in gst_validate_action_set_done (action=0x1522f80) at ../subprojects/gst-devtools/validate/gst/validate/gst-validate-scenario.c:6411
#72 0x00007fcc2eef9018 in execute_next_action_full (scenario=<optimized out>, message=<optimized out>) at ../subprojects/gst-devtools/validate/gst/validate/gst-validate-scenario.c:2803
#73 0x00007fcc2eef9dee in _action_set_done (action=0x1522ae0) at ../subprojects/gst-devtools/validate/gst/validate/gst-validate-scenario.c:6368
#74 0x00007fcc2edbd26d in g_main_context_invoke_full (context=0x1044700, priority=200, function=0x7fcc2eef9ab0 <_action_set_done>, data=0x1522ae0, notify=0x7fcc2eeea5d0 <gst_validate_action_unref>) at ../glib/gmain.c:6533
#75 0x00007fcc2eef6cf2 in gst_validate_action_set_done (action=0x1522ae0) at ../subprojects/gst-devtools/validate/gst/validate/gst-validate-scenario.c:6411
#76 0x00007fcc2eef9018 in execute_next_action_full (scenario=<optimized out>, message=<optimized out>) at ../subprojects/gst-devtools/validate/gst/validate/gst-validate-scenario.c:2803
#77 0x00007fcc2eef9dee in _action_set_done (action=0x1522190) at ../subprojects/gst-devtools/validate/gst/validate/gst-validate-scenario.c:6368
#78 0x00007fcc2edbd26d in g_main_context_invoke_full (context=0x1044700, priority=200, function=0x7fcc2eef9ab0 <_action_set_done>, data=0x1522190, notify=0x7fcc2eeea5d0 <gst_validate_action_unref>) at ../glib/gmain.c:6533
#79 0x00007fcc2eef6cf2 in gst_validate_action_set_done (action=0x1522190) at ../subprojects/gst-devtools/validate/gst/validate/gst-validate-scenario.c:6411
#80 0x00007fcc2eef9018 in execute_next_action_full (scenario=<optimized out>, message=<optimized out>) at ../subprojects/gst-devtools/validate/gst/validate/gst-validate-scenario.c:2803
#81 0x00007fcc2eef9dee in _action_set_done (action=0x1520ea0) at ../subprojects/gst-devtools/validate/gst/validate/gst-validate-scenario.c:6368
#82 0x00007fcc2edbd26d in g_main_context_invoke_full (context=0x1044700, priority=200, function=0x7fcc2eef9ab0 <_action_set_done>, data=0x1520ea0, notify=0x7fcc2eeea5d0 <gst_validate_action_unref>) at ../glib/gmain.c:6533
#83 0x00007fcc2eef6cf2 in gst_validate_action_set_done (action=0x1520ea0) at ../subprojects/gst-devtools/validate/gst/validate/gst-validate-scenario.c:6411
#84 0x00007fcc2eef9018 in execute_next_action_full (scenario=<optimized out>, message=<optimized out>) at ../subprojects/gst-devtools/validate/gst/validate/gst-validate-scenario.c:2803
#85 0x00007fcc2edbc759 in g_timeout_dispatch (source=0x14b6340, callback=0x7fcc2eef99c0 <execute_next_action>, user_data=0x15f7620) at ../glib/gmain.c:5121
#86 0x00007fcc2edbbe1c in g_main_dispatch (context=0x1044700) at ../glib/gmain.c:3476
#87 g_main_context_dispatch_unlocked (context=0x1044700) at ../glib/gmain.c:4284
#88 0x00007fcc2ee16d78 in g_main_context_iterate_unlocked.isra.0 (context=context@entry=0x1044700, block=block@entry=1, dispatch=dispatch@entry=1, self=<optimized out>) at ../glib/gmain.c:4349
#89 0x00007fcc2edb9a93 in g_main_context_iteration (context=context@entry=0x1044700, may_block=may_block@entry=1) at ../glib/gmain.c:4414
#90 0x00007fcc2ec14c3d in g_application_run (application=application@entry=0x1042ab0, argc=argc@entry=4, argv=argv@entry=0x7fff499031e8) at ../gio/gapplication.c:2577
#91 0x0000000000405dfd in real_main (argv=0x7fff499031e8, argc=4) at ../subprojects/gst-editing-services/tools/ges-launch.c:38
#92 main (argc=4, argv=0x7fff499031e8) at ../subprojects/gst-editing-services/tools/ges-launch.c:56
```
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5619>
Suppose you have a project where GStreamer and wayland-protocols are
pulled in as dependencies via .wrap files. In that case, Meson's setup
step will fail for gst-plugins-bad with the message "Sandbox violation:
Tried to grab file viewporter.xml outside current (sub)project." To
avoid this exception, one should use Meson's `files` and `join_paths`
functions. The suggested solution is identical to how GTK 4 processes
Wayland files.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5593>
In rare cases - notably on macOS, because of multiple GL contexts - the lack of a sync point was causing overlays
to disappear for a frame after being redrawn, or sometimes not appear at all. This change makes sure that the display
in one GL context will be correctly synchronised with the other GL context where the overlay texture was uploaded.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5610>
The manager keeps track of one discoverer per thread and in large applications
with hundreds of threads this can significantly increase memory pressure. So we
need to periodically clean-up the unused discoverers.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5608>
When using deeply nested timelines with the `ges:` protocol the
formatters ends up trying to do discovery from the same thread current
discovery happens, leading to infinite freeze as GstDiscoverer can't run
several discoveries at the same time.
By ensuring that when calling `gst_discoverer_discover_uri_async` no
`GstDiscoverer` is set as "thread discoverer" we know that another
discoverer will be created if discovery recurses, effectively removing
the freeze.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5608>
A payload of 0x80 0x80 means that it's padding. It's not a good idea to
throw this away though, because of the cc_valid field.
According to CEA 10-B section 25.2.1, if cc_valid is zero, the run-in
clock and start bit should not be generated. In practice, this means
that any closed captions will be erased and the end-user TV will show
that captions are not available for this stream. This might have
undesired consequences, e.g. we were just showing a long line of
captions and we disable it before the user has had time to read it, or
you can't enable closed captions during silence/music intervals.
We cannot reliably detect whether there's a currently-silent closed
caption stream or just nothing, but we have this information coming from
upstream, so we can at least not discard it.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5508>
When decoding stream using hardware V4L2 decoder element, in any of the
currently supported formats, the decoding will fail once frame number
1000000 is reached. The reported error clearly indicates a wrap-around
occured, instead of receiving decoded frame 1000000, frame 0 is received
from the hardware V4L2 decoder driver.
The problem is actually not in the driver itself, but rather in gstreamer,
which uses `struct v4l2_buffer` member `.timestamp` in a special way. The
timestamp of buffers with encoded data added to the SINK (input) queue of
the driver is copied by the driver into matching buffers with decoded data
added to the SOURCE (output) queue of the driver. In fact, the timestamp
is not a timestamp at all, but rather in this special case, only part of
it is used as an incrementing frame counter.
The `.timestamp` is of type `struct timeval`, which is defined in
`sys/time.h` [1]. Only the `tv_usec` member of this structure is used
for the incrementing frame counter. However, suseconds_t tv_usec [2]
may be limited to range [-1, 1000000]:
"
[XSI] The type suseconds_t shall be a signed integer type capable of
storing values at least in the range [-1, 1000000].
"
Therefore, once frame 1000000 is reached, a rollover occurs and decoding
fails.
Fix this by using both `struct timeval` members, `.tv_sec` and `.tv_usec`
with matching modular arithmetic, this way the failure would occur again
just short of 2^84 frames, which should be plenty.
[1] https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_time.h.html
[2] https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_types.h.html
A test case using stateless hardware h264 decoder, the WARN/ERROR output
in gstreamer log indicates a failure occurred. With this change, that
error no longer occurs and the WARN/ERROR are not present:
```
pc$ gst-launch-1.0 videotestsrc num-buffers=1001001 pattern=6 ! \
video/x-raw,width=16,height=16,format=I420 ! \
x264enc ! filesink location=/tmp/test.h264
dut$ GST_DEBUG="*:3" gst-launch-1.0 filesrc location=/tmp/test.h264 ! \
h264parse ! v4l2slh264dec ! fakesink
...
0:03:51.393677606 12111 0x370df400 WARN \
v4l2codecs-decoder gstv4l2decoder.c:1157:gst_v4l2_request_set_done:<v4l2decoder2> \
Requested frame 1000000, but driver returned frame 0.
0:03:51.394140597 12111 0x370df400 WARN \
v4l2codecs-decoder gstv4l2decoder.c:1157:gst_v4l2_request_set_done:<v4l2decoder2> \
Requested frame 1000001, but driver returned frame 1.
0:03:51.394425216 12111 0x370df400 WARN \
v4l2codecs-decoder gstv4l2decoder.c:1157:gst_v4l2_request_set_done:<v4l2decoder2> \
Requested frame 1000002, but driver returned frame 2.
0:03:51.394665211 12111 0x370df400 WARN \
v4l2codecs-decoder gstv4l2decoder.c:1157:gst_v4l2_request_set_done:<v4l2decoder2> \
Requested frame 1000003, but driver returned frame 3.
0:03:51.394785833 12111 0x370df400 WARN \
v4l2codecs-h264dec gstv4l2codech264dec.c:1059:gst_v4l2_codec_h264_dec_output_picture:<v4l2slh264dec0> \
error: Failed to decode frame 1000000
ERROR: from element /GstPipeline:pipeline0/v4l2slh264dec:v4l2slh264dec0: Failed to decode frame 1000000
```
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5598>
This pair of elements, inspired from shmsink/shmsrc, send unix file
descriptors (e.g. memfd, dmabuf) from one sink to multiple source
elements in other processes.
The unixfdsink proposes a memfd/shm allocator, which causes for example
videotestsrc to write directly into memories that can be transfered to
other processes without copying.
Sponsored-by: Netflix Inc.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5328>
There is no guarantee that g_get_user_runtime_dir() is in a tmpfs. Using
an explicit shared memory API seems safer for all POSIX platforms.
Note that Android does not have shm_open() and only added memfd_create()
since API level 30 (Android 11).
Sponsored-by: Netflix Inc.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5328>
Detail a bit the intention behind GST_ALLOCATOR_FLAG_CUSTOM_ALLOC, even
if implementation does not currently fully follow that usage. Introduce
a new flag specifically for copying memories using the default system
allocator.
Sponsored-by: Netflix Inc.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5328>
The src caps of the libde265 is now fixed to I420, and so if the
stream is other format, such as 4:4:4 or 10 bits format, the pipeline
will crash because the dowstream element accesses the video buffer as
I420 format.
We now restrain the input caps to "main" profile, which only contains
4:2:0 8 bits stream.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5573>
While the minimum timeout duration is 5s, checking only every 5s means
that we would notice this 4.9s too late in the worst case.
Checking once a second reduces this considerably while keeping the
number of wakeups still low.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5520>
Otherwise it can happen that we regularly switch back and forth between
clocks under certain circumstances for no good reason.
Also remove redundant comparison when comparing the steps removed between two
clocks.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5520>
This can happen with the dummy "noopenh264" library that the freedesktop
flatpak runtime ships, and Fedora is planning on shipping as well. In
both cases the dummy implementation gets replaced with the actual
openh264 library that's downloaded directly from Cisco, but just to be
on safe side, this patch makes it careful to check the return values to
avoid crashing if the underlying library hasn't been swapped out yet.
The patch is taken from freedesktop-sdk and was originally written by
Valentin David <valentin.david@codethink.co.uk>.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5581>
- Fixes a crash in tutorial 5, which happened when going back from video playback to the 'library' view, due to
ui_delegate already being destroyed at that point.
- Updates layouts to avoid navigation bar overlapping play/pause buttons. Colours are now correctly updated
based on light/dark mode being enabled, overall look and feel is improved with bigger buttons and paddings.
New button types are used, so target version is now iOS 15.0.
- Disables debug log coloring, as the default terminal in XCode does not render that anyway, so logs are now
more readable there.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5473>
The local glib subproject doesn't exist so the glib/glib.supp file
cannot be included.
As it is needed for the do_lookup_by_name() function call, let's add the
system wide suppression file so that its version matches the installed glib
version.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5434>
If users update geometry related properties very frequently
for a stream to be animated, redrawing on every update
can make rendering choppy or can be a performance bottleneck.
To address the issue, adding a property to control the behavior
of redrawing scene when geometry related properties are updated.
Also, do not resize swapchain on such property update, since
re-allocating backbuffer and multi-sampled render target is
unnecessary in that case.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5575>
Other Windows applications allow window switching even when
an application window is in fullscreen mode. Also fixing
regression introduced in 15248d8b84
which makes restored window is always located at topmost
since we do not call SetWindowPos() anymore when restoring
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5574>
ISimpleAudioVolume controls volume of corresponding audio session
and there would be only single input/output audio session
in case of share-mode, which means that it controls audio volume of the
process. Instead, use IAudioStreamVolume interface which controls
volume of the stream.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5549>
Ignore alpha component of source (mouse cursor texture)
when blending alpha channel, otherwise the background area of source
(which has zeros) will be written to render target. Then it will result
in black rectangle if output texture is converted to premultiplied alpha
texture
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5566>
In snapshot mode pngenc should output exactly one frame
and then return FLOW_EOS to upstream. If upstream sends
more input frames before shutting down, it should keep
returning FLOW_EOS but not output any more encoded frames.
After a flushing seek it should output frames again though.
Fixes#3069.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5546>
It's a bad idea trying to mix the Options from GStramer and
GTK, in addition with cli argument being a bit wonky thing for
GUI applications in general. In the rare, now, occasion
that an application wants to parse arguments, its preferable
to parse them manually and use library apis afterwards
rather than trying to combine the option groups and hope it
works.
In addition, applications should be opening files using
`g_application_open` instead of parsing random arguments.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4788>
When hotdoc documentation is enabled and opencv plugin is set as
auto-detected, but the library isn't installed, meson configuration fails
with this message:
../subprojects/gst-plugins-bad/docs/meson.build:139:21: ERROR: Unknown variable "gstopencv_dep".
This patch fixes this case defined gstopencv_dep as disabler() when
dependencies aren't found.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5560>
Current codes try derive image in _update_image_info first, if
derive returns no error, the va_allocator->info is the one from derived
image, but in va_map_unlocked, we disable derive manner for d3d backend
because it doesn't seem to work, this will cause issue for d3d path,
i.e. possibly using derived info in va_get_image to do mapping...
This patch disables derive image for d3d backend in _update_image_info,
to ensure we only use info from va_create_image for d3d path.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5495>
An operation is an arbitrary amount of work to be executed on the host, a
device, or an external entity such as a presentation engine.
The purpose of this object is to help on the operation's synchronization
through declaring explicit execution dependencies, and memory dependencies
between two sets of operations defined by the command’s two synchronization
scopes.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5079>
While VkPipelineStageFlags is an enum (arguably backed as uint32 in 32bit
platforms), VkPipelineStageFlags2 is a redefinition of guint64; likewise for
VkAccessFlags and VkAccessFlags2.
This patch types both members in GstVulkanBarrierMemoryInfo as guint64 for
compatibility, so it could be used with or without synchronization2 vulkan
extension.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5079>
Previously we were checking for opencv dep in 2 different places,
and the checks would vary in terms of how complex and exhaustive
they were.
Move the check into the libs module and reuse the result later on.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3016>
The default 2MB ENCODED_BUFFER_SIZE can't support some 4K video playback. We now
detect the driver reported maximum resolution and choose an appropriate
default bitstream size accordingly. For 4K video these results in around 4MB
buffer instead of 2MB.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4549>
After rendering a QML scene the qml6glsrc element copies the contents of
the scene to a GStreamer buffer. This happens on the Qt render thread.
Then it attaches a sync point to the destination buffer. This sync point
must be awaited by other threads which use the buffer later on. The
current implementation relies on the downstream elements to wait for the
sync point. However, there are situation where this does not work. The
GstBaseTransform e.g. copies the buffer metadata (which overwrites the
sync point without waiting for it) *before* waiting for the sync point.
This commit waits for the sync point inside the qml6glsrc element before
sending it downstream. The wait command is issued on the streaming
thread with the pipeline OpenGL context, i.e. it will synchronize with
the GStreamer OpenGL thread.
This is a port of the original fix for the qmlglsrc element.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5519>
This field is used to store gbooleans (which are ints) but if it's
a :1 bit depth assigning ints to it changes it's value as the only
valid values are -1 and 0.
Make it a guint instead so the cast would be correct.
```
../subprojects/gst-plugins-bad/gst-libs/gst/vulkan/xcb/gstvkwindow_xcb.c:151:25: error:
implicit truncation from 'int' to a one-bit wide bit-field changes value from 1 to -1
[-Werror,-Wsingle-bit-bitfield-constant-conversion]
window_xcb->visible = TRUE;
```
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5432>
Followup to 75872c802b , clang version
While we ignore `discarded-qualifiers` already for gcc, clang seems
to assign this error to `incompatible-pointer-types-discards-qualifiers`
so we need to ignore that as well.
```
In file included from \
../subprojects/gst-plugins-base/ext/cdparanoia/gstcdparanoiasrc.h:37: \
/usr/include/cdda/cdda_interface.h:164:3: error: initializing 'char *' with an expression \
of type 'const char [8]' discards qualifiers [-Werror, \
-Wincompatible-pointer-types-discards-qualifiers]
"Success",
^~~~~~~~~
```
See 75872c802b for more
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5474>
This was wrongly calling the base class method, which unnecessairly took the stream lock, already taken by
handle_frame(). The drain() call in negotiate() would then wait for the output loop to pause, while that loop
is stuck waiting to take the stream lock, thus causing a deadlock.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5521>
This element refactors functionality from gstonnxinference element,
namely separating out the ONNX inference from the subsequent analysis.
The new element runs an ONNX model on each video frame, and then
attaches a TensorMeta meta with the output tensor data. This tensor data
will then be consumed by downstream elements such as gstobjectdetector.
At the moment, a provisional TensorMeta is used just in the ONNX
plugin, but in future this will upgraded to a GStreamer API for other
plugins to consume.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4916>
- Don't try to make the parameters match `GHFunc`. Use a dedicated
callback for `g_hash_table_foreach`.
- Don't try to be clever with buffer memories. We're allocating a full
packet anyway, might as well memcpy and save on a lot of complexity.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5496>
After rendering a QML scene the qmlglsrc element copies the contents of
the scene to a GStreamer buffer. This happens on the Qt render thread.
Then it attaches a sync point to the destination buffer. This sync point
must be awaited by other threads which use the buffer later on. The
current implementation relies on the downstream elements to wait for the
sync point. However, there are situation where this does not work. The
GstBaseTransform e.g. copies the buffer metadata (which overwrites the
sync point without waiting for it) *before* waiting for the sync point.
This commit waits for the sync point inside the qmlglsrc element before
sending it downstream. The wait command is issued on the streaming
thread with the pipeline OpenGL context, i.e. it will synchronize with
the GStreamer OpenGL thread.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5506>
There are a bunch of plugins that you need for webrtc support, and
it's not obvious at all to users which those are.
With this commit, srtp, sctp and dtls options will be auto-enabled if
the webrtc option is enabled.
Requires meson 1.1
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5505>
In _gl_memory_upload_propose_allocation(), when output target is "external-oes",
then we should not provide GL allocator and pool in the allocation query.
This is because the "external-oes" kind memory can never be mapped directly
and the upstream element may misuse it.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5468>
The propose and decide allocation vfuncs are called directly from
basetransform and need to use the locked accessor function for
retrieving a reliable reference to the GstGLContext (if available)
Fixes spurious crashes on shutdown during pad reconfiguration
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5437>
The v4l2codecs H.265 decoder uses the
GstH265SliceHdr::entry_point_offset_minus1 array so make sure that it is not
freed before decoding the frame.
Before this patch, some H.265 input would segfault in
gst_v4l2_codec_h265_dec_fill_slice_params() when executing the line:
guint32 entry_point_offset = slice_hdr->entry_point_offset_minus1[i] + 1;
Make sure that the array is not freed before using it.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5499>
The number of planes is a meta we carry around in the GstVideoMeta with
DMA_DRM format. In cannot be decuded correctly from knowledge of the
base format. Notably, some compression modifier may introduce an extra
plane to store the compression parameters.
So use n_planes from GstVideoMeta and pass this explicitly when
importing to EGLImage.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5461>
The DMAbuf accept function was ensuring the in_dma_info values was valid if
the in_caps have change. But the check was bogus since the in_caps was being
modified without a pointer change. As a side effect, on the second accept
call, the drm_fourcc was reset to 0, which cause the uploader to fallback.
Fix this by ensuring we always have a valid dma_frm info directly in the
set_caps() function. Also remove the bogus caps changed check and remove any
modification to the info structure and always do that inner checks.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5461>
DRM Modifiers are not generically transferrable from a format like NV12 to
their indirect shading format (R8 / RG88). So the helper to this do needs
to be removed from our API.
To make things worse, we support indirect formats that aren't DRM format in
the first place. Notably NV12_16L32 (aka MM21) is not (yet) a DRM format. Yet,
each plane can be indirectly imported using R8/RG88 and a detiling shader.
This patch also removes this constraint restoring zero-copy playback on
Mediatek SoC.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5461>
With one regular image file path provided (without %05d),
the element was stuck in a dead loop counting the frames:
gst_image_sequence_src_count_frames
This allows to display any image file out of the element
for a given number of buffers.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5471>
Update connection-speed at runtime in playbin, uridecodebin and decodebin
also do the same thing in urisourcebin.
With contributions from Philippe Normand <philn@igalia.com> (build fixes and
rebase on mono-repo).
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4713>
If the v4l2videoenc receives an QUERY_ALLOCATION, it must not propose a
currently used pool, because it cannot be sure that the allocation query came
from exactly the same upstream element. The QUERY_ALLOCATION will not contain
the internal OUTPUT pool.
The upstream element (the basesrc) detects that the newly proposed pool differs
from the old pool. It deactivates the old pool and switches to the new pool.
If there was a format change, a new OUTPUT buffer pool will be allocated in
gst_v4l2_object_set_format_full() and the CAPTURE task will be stopped to switch
the format. If there hasn't been a format change,
gst_v4l2_object_set_format_full() will not be called. The old pool will be kept
and reused.
Without a format change, the processing task continues running.
This leads to the situation that the processing task is running, but the OUTPUT
buffer pool (the old pool) is deactivated. Therefore, the encoder is not able to
get buffers from the OUTPUT pool and encoding cannot continue.
This situation can be triggered by sending a RECONFIGURE event without a format
change.
Resolve this situation by ensuring that the OUTPUT buffer pool is always
activated when frames arrive at the encoder.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4235>
There is a CAPTURE pool in the same function. While the CAPTURE pool is called
cpool, using pool for the OUTPUT pool is confusing.
Using opool for the OUTPUT pool makes it more obvious, which pool is used.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4235>
We were already converting the pad last timestamp to running time but
not the segment position.
This segment position is used by gst_aggregator_simple_get_next_time()
to compute the waiting time when aggregating.
Those waiting times were wrong in my live pipeline using the system
clock, resulting in the aggregator to never wait at all.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5460>
While adding arbitrary tile support, a round up operation was badly
converter. This caused the Y component of the stride to be 0. This
eventually lead to a crash in glupoad preceded by the following
assertion.
gst_gl_buffer_allocation_params_new: assertion 'alloc_size > 0' failed
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5458>
While adding arbitrary tile support, a round up operation was badly
converter. This caused the Y component of the stride to be 0. This
eventually lead to a crash in glupoad preceded by the following
assertion.
gst_gl_buffer_allocation_params_new: assertion 'alloc_size > 0' failed
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5458>
Do not update timelevel on segment. Segment itself does not tell
anything about the amount of buffered time duration in the element
but buffer timestamp/duration is required to measure actual bufferred time.
Moreover, at the time when new segment is applied to sink/srcpad,
segment.position would point to random value.
Therefore calculating running time using the random value does not
make sense and it will result in wrong timelevel report.
This patch updates queue/queue2's timelevel measuring logic so that
it can be updated only on buffer/buffer-list/gap-event flow.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5430>
This was causing a memory leak in cases like `gltestsrc ! gltransformation scale-x=0.5 ! glimagesink`.
Parent meta was being added in assumption that those buffers are different, which was not the case here,
creating a reference loop and never freeing the buffer.
Co-authored-by: Matthew Waters <matthew@centricular.com>
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5445>
The caps that were sent by the caps event can be retrieved from the sinkpad
using gst_pad_get_current_caps(). This is more reliable than using cur_caps as
we know exactly which caps upstream selected when the UVC host didn't select a
format, yet.
This further allows to simplify the check, if the uvcsink has to wait for the
caps event before switching to the internal v4l2sink.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4994>
The probe passes all events except the EVENT_CAPS. Installing and removing the
probe doesn't provide any additional value.
Install an event function and always handle EVENT_CAPS. Use the caps_changed
field, to decide, if the element has to do anything special on a EVENT_CAPS.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4994>
Move the sanity checks to the beginning of the function. Make the actual effect
of the function more obvious and reset the flags in the end.
This should make it easier to understand what this function is doing.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4994>
The probe that installs the buffer probe is already on the correct pad. There is
no need for a separate function to install the probe.
While at it, change the signature of the probe functions to GstPadProbeCallback
to avoid the cast when installing the probes.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4994>
The uvcsink calculates the caps for the format that the UVC host selected. The
gst_uvc_sink_parse_cur_caps() sets these caps as cur_caps as a side effect. This
behavior is surprising as cur_caps is later updated to reflect the actually used
caps.
Just return the configured caps to avoid side effects. This makes the function
easier to understand. Update the function name to reflect the new behavior.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4994>
The only job of the event peer probe is to catch the upcoming caps event
and be able to react with the sink change. All other events that are
passing the pad shall be passed and ignored.
Since the probe is a blocking probe, there is no use in returning
with GST_PAD_PROBE_OK on other events. Otherwise the event would just
be blocked.
Since we are handling the probe removal of the probe already in the
event switch, we can remove the second explicit probe removal.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4994>
There is a race condition where transfer has not been submitted yet while the
request is cancelled which leads to the transfer state going back to
`DOWNLOAD_REQUEST_STATE_OPEN` and the user of the request to get signalled about
its completion (and the task actually happening after it was cancelled) leading
to assertions and misbehaviours.
To ensure that this race can't happen, we start differentiating between the
UNSENT and CANCELLED states as in the normal case, when entering `submit_request`
the state is UNSENT and at that point we need to know that it is not because
the request has been cancelled.
In practice this case lead to an assertion in
`gst_adaptive_demux2_stream_begin_download_uri` because in a previous call to
`gst_adaptive_demux2_stream_stop_default` we cancelled the previous request and
setup a new one while it had not been submitted yet and then got a `on_download_complete`
callback called from that previous cancelled request and then we tried to do
`download_request_set_uri` on a request that was still `in_use`, leading to
something like:
```
#0: 0x0000000186655ec8 g_assert (request->in_use == FALSE)assert.c:0
#1: 0x00000001127236b8 libgstadaptivedemux2.dylib`download_request_set_uri(request=0x000060000017cc00, uri="https://XXX/chunk-stream1-00002.webm", range_start=0, range_end=-1) at downloadrequest.c:361
#2: 0x000000011271cee8 libgstadaptivedemux2.dylib`gst_adaptive_demux2_stream_begin_download_uri(stream=0x00000001330f1800, uri="https://XXX/chunk-stream1-00002.webm", start=0, end=-1) at gstadaptivedemux-stream.c:1447
#3: 0x0000000112719898 libgstadaptivedemux2.dylib`gst_adaptive_demux2_stream_load_a_fragment [inlined] gst_adaptive_demux2_stream_download_fragment(stream=0x00000001330f1800) at gstadaptivedemux-stream.c:0
#4: 0x00000001127197f8 libgstadaptivedemux2.dylib`gst_adaptive_demux2_stream_load_a_fragment(stream=0x00000001330f1800) at gstadaptivedemux-stream.c:1969
#5: 0x000000011271c2a4 libgstadaptivedemux2.dylib`gst_adaptive_demux2_stream_next_download(stream=0x00000001330f1800) at gstadaptivedemux-stream.c:2112
```
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5435>
Back in the mists of time[1], we switched `giostream*` elements to not close the
stream on stop() so that applications that needed a handle to the stream after
the element stopped had it.
Unfortunately, we also have cases[2] where waiting for the element to be
finalized is too late for the stream to be closed.
In order to not change the behaviour of the element, we add a property to allow
users to select the desired behaviour.
[1]: https://bugzilla.gnome.org/show_bug.cgi?id=587896
[2]: gst-plugins-rs#423
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5372>
Formatters might call "loaded" from the `gessrc` streaming thread
meaning that the `->formatters` field need to be protected.
Several other APIs are called from gesbasedemux, in some radom
thread, so we should ensure that this is all MT. safe, and the API
makes it simple.
Co-authored-by: Philippe Normand <philn@igalia.com>
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5431>
By using the gst_caps_set_simple() to set the format on all structures, the
compositor may create invalid combinations as the caps may contain passthrough
caps. Avoid this issue by intersecting the resul with its original.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5386>
Adds list of formats that should be used by element in needs to passthrough
video. It contains the full list of video format plus DMA_DRM format
and will be extended in the future as needed. This patches includes 3 new
symbols:
- GST_VIDEO_FORMATS_ANY_STR
- GST_VIDEO_FORMATS_ANY
- gst_video_formats_any()
The last one can be used by bindings or for code that prefers having
GstVideoFormat values instead of strings.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5386>
This commit ports functionality from the `rtpsrc` to make the `ristsrc`
work with dynamic payload types.
It adds two properties:
- `caps`
- `encoding-name`
These can be used to make the `ristsrc` receive other payload types than
the MPEG TS one.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5422>
While the suspend modes NONE and PAUSED provided a low startup latency
for connecting clients they did not ensure that streams started on
fresh data.
With this property we can maintain the low startup latency of those
suspend modes while also ensuring that a stream starts on a key unit.
Furthermore, by modifying the value of a new property,
ensure-keyunit-on-start-timeout, it is possible to accept a keyunit of
a certain age but discard it if too much time has passed and instead
force a new keyunit.
Fixes#2443
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4334>
The counter was using a signed 8 bit integer, which was overflowing
after 127 entries. That was then passed as an unsigned 32 bit integer to
libflac, which caused it to be converted to a huge unsigned number.
That then caused an invalid memory access inside libflac.
As a bonus, signed integer overflow is undefined behaviour.
Instead, use an unsigned 8 bit integer. Once this overflows the existing
code already catches it and stops adding the cue. While FLAC__metadata_object_cuesheet_insert_track()
takes an unsigned 32 bit integer for the track number, FLAC__StreamMetadata_CueSheet_Track is
limiting it to an unsigned 8 bit integer.
Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/2921
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5420>
Since DXVA does not support some profiles such as HEVC RExt,
vendor specific decoding API is still required.
When decoder is negotiated with d3d11 caps, decoder will convert
semi-planar frame to planar since semi-planar format (e.g.,
DXGI_FORMAT_NV12) is not supported by CUDA/D3D11 interop.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5409>
Found that osxaudiosink could not be added standalone in gst-full build
using
-Dgst-full-elements=osxaudio:osxaudiosink because element registration
was
done at the plugin level. Now src/sink elements and deviceprovider have
their
individual registration.
Copied/adapted from the alsa plugin.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5419>
Use gst_codec_utils_caps_get_mime_codec() in pbutils for codec
strings. That function gives more elaborate RFC 6381 compatible
strings than the helper functions in gstmdphelper.c, such as
"avc1.F4000D".
Remove the helper functions, as they were only used from dashsink.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5404>
When the property "start-time-selection" is set to "first", it
calculates the start time of the output from the buffer pts
(converting it to running time of the segment), but if the
rate is negative, the real start is not the pts, but the
pts + duration, because it plays from the end of the buffer
to it's start.
As a result of this bug, in the negative rate, when the
start-time-selection=first, the first frame is dropped
by the videoaggregator (reproduced on d3d11compositor).
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5276>
The interaudiosrc might take buffers of different sizes from the audio adapter,
so keeping metas consistency would be an issue. So the sink now strips the audio
metas away and the src adds them back (for non-interleaved layouts only) when
taking buffers from the adapter.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5324>