Skip to content

Implement dynamic layout in video recording format#2

Closed
kepstin wants to merge 306 commits into
recording-video-presetsfrom
recording-dynamic-video
Closed

Implement dynamic layout in video recording format#2
kepstin wants to merge 306 commits into
recording-video-presetsfrom
recording-dynamic-video

Conversation

@kepstin

@kepstin kepstin commented Oct 28, 2025

Copy link
Copy Markdown
Owner

The current video recording format supports multiple layouts depending on the media shared in the recording, but the layout has to be selected before processing the recording and a single layout is used for the entire recording length.

This causes problems with, for example, meetings that use deskshare and webcams, but do not use presentation. Either the webcams are fullscreen when deskshare isn't being used but the deskshare covers up the webcams, or the webcams are beside the deskshare but remain small and at the side of the recording.

The new system uses the same layouts but instead of selecting the layout once before generating the video, it selects the layout separately for each individual cut of the video. This allows, for example, webcams to be fullscreen when deskshare isn't used, but when deskshare starts the webcams will become smaller and move to the side.

As part of this work, to allow the presentation video to change size as the layout changes between cuts, the handling for video sources was refactored to be generic, allowing a new video source to be made for presentation video which generates presentation video on demand for each cut. This also speeds up recording processing and reduces disk space
requirements by removing the separate step to generate the presentation video before rendering the recording.


This is created as a draft PR because it depends on bigbluebutton#23887 which is not yet merged (commits from that PR are included here, which makes this part of the changes difficult to review). Additionally, bigbluebutton/bbb-presentation-video#69 is required.

@kepstin kepstin force-pushed the recording-video-presets branch from b6e0dfc to 31e5401 Compare November 13, 2025 19:26
@github-actions

Copy link
Copy Markdown

This pull request has conflicts ☹
Please resolve those so we can review the pull request.
Thanks.

antobinary and others added 25 commits November 14, 2025 15:16
…patch-6

docs: Note renaming pngCreationExecTimeoutInMs pngCreationExecTimeout
100% translated source file: 'en.json'
on 'ja'.
Adds a check to the audio alert playing logic, to check whether the new
message is from a chat that is already opened - if so, the sound is not
played.
100% translated source file: 'en.json'
on 'eu'.
100% translated source file: 'en.json'
on 'zh_TW'.
The thumbnail and text conversion implementations in bbb-web use the
incorrect timeout unit (ms rather than s) when fetching the base timeout
against the max presentation conversion one (which is seconds). This
causes both of them to intermittently fail intermittently.

Use the correct unit (s) for thumbnail creation and text file creation
timeouts. Their configurations changed name:
  - thumbnailCreationExecTimeoutMs -> thumbnailCreationExecTimeout
  - textFileCreationExecTimeoutMs -> textFileCreationExecTimeout
…cTimeout, textFileCreationExecTimeoutInMs -> textFileCreationExecTimeout
100% translated source file: 'en.json'
on 'et'.
Adds the info about layout when presenter changes something with push layout enabled (BroadcastLayoutEvtMsg):

  <event timestamp="677408846" module="PARTICIPANT" eventname="LayoutBroadcastedEvent">
    <focusedCamera>none</focusedCamera>
    <presentationVideoRate>0.0</presentationVideoRate>
    <cameraPosition>contentTop</cameraPosition>
    <presentationIsOpen>false</presentationIsOpen>
    <layout>CUSTOM_LAYOUT</layout>
    <timestampUTC>1763562184363</timestampUTC>
    <date>2025-11-19T11:23:04.363-03</date>
    <isResizing>false</isResizing>
  </event>
…resets

Add support for multiple presets to 'video' recording format
…res-timeouts

fix(bbb-web): thumbnail and text conversion fails due to timeouts
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
docs(plugins): Added documentation for sidekick area ui-commands
…4-antobinary-patch-7

Revert "conf: Hide nginx version in bigbluebutton.nginx"
…ures

feat(plugin): private chat messages commands
…s_2935847a4e24479f947b810bd25cd703_it_IT

Updates for project BigBlueButton v3.0 HTML5 client and language it_IT
…s_2935847a4e24479f947b810bd25cd703_ja

Updates for project BigBlueButton v3.0 HTML5 client and language ja
…s_2935847a4e24479f947b810bd25cd703_eu

Updates for project BigBlueButton v3.0 HTML5 client and language eu
…s_2935847a4e24479f947b810bd25cd703_zh_TW

Updates for project BigBlueButton v3.0 HTML5 client and language zh_TW
gustavotrott and others added 28 commits January 13, 2026 17:28
…ta hook (bigbluebutton#24213)

* feat(plugin): Add nameSortable in the UsersBasicInfo data hook

* feat(plugin): Add bot in the UsersBasicInfo data hook

* Fix typing

* upgrade plugin sdk to 0.0.96

* upgrade plugin sdk to 0.0.96 on bbb-web

* fix ts error

---------

Co-authored-by: Ramón Souza <contato@ramonsouza.com>
chore: Added data-test to all extensible-area components
feat: added more fields to useMeeting hook and created a projection feature
…indow

feat(plugin): added z-index to floating-window
Downgrade livekit-server to 1.9.9 (from v1.9.10) as the latest version is panicking.
…176a1634179b4da32c6886bf87c96b

test: [Snyk] Fix for 1 vulnerabilities
100% translated source file: 'en.json'
on 'tr'.

Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
…igbluebutton#24434)

* Translate en.json in ja

100% translated source file: 'en.json'
on 'ja'.

* Translate en.json in ja

100% translated source file: 'en.json'
on 'ja'.

---------

Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
chore(client): bump tldraw to 2.0.0-alpha.32
bbb-livekit's after-install script is explicitly setting up the
override config file with logging.level: debug. This is not
necessary.
v2.22.0
---
* feat(livekit): add histogram metrics for mute/unmute duration
* fix(livekit): honor user-scoped conditional recording flags
* chore: disable Kurento by default in base/example config file
…h-fix

fix(html5): exclude worker.ts from ReactRefresh so hot reload can work
The current video recording format supports multiple layouts depending
on the media shared in the recording, but the layout has to be selected
before processing the recording and a single layout is used for the
entire recording length.

This causes problems with, for example, meetings that use deskshare and
webcams, but do not use presentation. Either the webcams are fullscreen
when deskshare isn't being used but the deskshare covers up the webcams,
or the webcams are beside the deskshare but remain small and at the side
of the recording.

The new system uses the same layouts but instead of selecting the
layout once before generating the video, it selects the layout
separately for each individual cut of the video. This allows, for
example, webcams to be fullscreen when deskshare isn't used, but when
deskshare starts the webcams will become smaller and move to the side.

As part of this work, to allow the presentation video to change size
as the layout changes between cuts, the handling for video sources was
refactored to be generic, allowing a new video source to be made for
presentation video which generates presentation video on demand for each
cut. This also speeds up recording processing and reduces disk space
requirements by removing the separate step to generate the presentation
video before rendering the recording.
With the new system for selecting the layout separately for each cut
depending on which type of content is present, it is also possible to
make the layout selection depend on other things relating to the current
state of the meeting.

The EDL and layout data structures are updated to support "conditions".
When the EDL is generated, various conditions can be included which
identify things about the state of the session at that time. Then, when
selecting a layout, the layout is only used if the conditions specified
in the layout match the conditions in the session.

Two conditions are added initially:

* `presentation_used`: Indicates whether any actions have been done on
  the presentation/whiteboard area.
* `screenshare_as_content`: Indicates the current state of the
  presentation/screenshare swap feature.

The video recording format's code is simplified since it no longer needs
to detect whether the presentation area was used itself; it can rely on
the conditions to handle this instead. The default configuration file
has been updated with layouts which handle the two new conditions.
To make it easier to handle layout events, which usually deal with the
"content" area rather than specifically presentation or screenshare,
refactor the generator methods to create the EDL with layout-related
conditions in a separate method.
@kepstin kepstin force-pushed the recording-dynamic-video branch from 44fb75e to a461dcb Compare January 16, 2026 18:31
@kepstin kepstin closed this Jan 16, 2026
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.