Skip to content

audio & video player: migrate to common playbin implementation #481

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 19 commits into from
May 13, 2025

Conversation

ardera
Copy link
Owner

@ardera ardera commented May 13, 2025

  1. Expand the gstplayer (previously used to implement video playback for the video player):

    • switch to gstreamer playbin / playbin3, to enable audio support
    • add a more explicit constructor where audio/video support can be toggled separately
    • support one-off duration queries (gstplayer_get_duration)
    • support audio balance (gstplayer_set_audio_balance, gstplayer_get_audio_balance)
    • support switching playback sources
    • add a duration, seeking info, eos and gstreamer error notifier
  2. Migrate the audio player to gstplayer.

    • move gstplayer into separate file, compile if either video player or audio player should be built

ardera added 16 commits May 8, 2025 21:51
When uploading memory with size X into a dmabuf, create a buffer that is square
(e.g. sqrt(x) by sqrt(x)) instead of one that is X pixels wide and one pixel
high.

Drivers have limitations on buffer dimensions, and e.g. the intel (iris) driver
ran into this limitation.
Use playbin3 for playback instead of uridecodebin.
This also enables audio support.

Furthermore, separate out the appsink (which
uploads buffers into a flutter texture) into a
separate "pseudo" gstreamer-element,
which can be created using `flutter_gl_texture_sink_new`.

Synchronization is reworked as well, it is now
assumed the player is only accessed from a
single thread, the platform thread.

The callbacks called by gstreamer (which are
called on internal threads) will rethread, if necessary,
by posting messages to the GstBus.

The buffering query is also now properly fixed.
Previously it queried the playbin instead of the
element that does the actual queueing (a `multiqueue`).

Also, a one-shot debug logging message is
added to the frame uploader, to inform the user
when slower, manual dmabuf uploads are used
instead of zero-copy.
Only supported since gstreamer 1.24.0 and
requires some more work to implement correctly.
Also don't use conditional compilation in places
that don't absolutely depend on it.
There's an issue in the gstreamer video4linux2 plugin where seeking will lead
to buffer management issues, causing streaming to stop, or even
memory leaks.

See: https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4465
- add `raw_std_method_call_from_buffer` to
  create a "raw_std_value" from a byte buffer
  & size, and check whether its encoding is
  valid
- add `platch_respond_malformed_message_std`
  to send a pre-determined response if
  the encoding was invalid
Used by Zed to store clangd cache.
- add audio balance setter/getter
- support releasing & prerolling a playback
  source
- add separate seeking info, duration and
  end of stream notifiers
- make gstreamer_video_player.h not
  depend on gstreamer headers (if possible)
Finishing unifying playback element used by
audioplayers and video player plugins.
Did cause a message to be logged on every atomic commit.
On Raspberry Pi, the fix is now backported to 1.22:
  RPi-Distro/repo#391

This reverts commit dc0ff2a.
ardera added 3 commits May 13, 2025 16:45
Was added in gstreamer 1.20, debian bullseye is still on 1.18.
Uses gstreamer 1.20.0-only API and is only used for 1.20.0
anyway.
@ardera ardera merged commit 5c296de into master May 13, 2025
120 of 229 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant