Exception thrown for XYGraph: Minimum tick spacing must be greater than 0 and less than or equal to 1

I got an exception when trying to display a XYGraph. I thought it was related to empty data, so I ensure there are some data but still in vain. How to avoid errors to display the chart correctly?
Version: 0.5.2
Target Platform: Desktop
Stacktrace:
Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: Minimum tick spacing must be greater than 0 and less than or equal to 1
	at io.github.koalaplot.core.xygraph.LinearAxisModel.computeMajorTickSpacing(LinearAxisModel.kt:104)
	at io.github.koalaplot.core.xygraph.LinearAxisModel.computeMajorTickValues(LinearAxisModel.kt:74)
	at io.github.koalaplot.core.xygraph.LinearAxisModel.computeTickValues-0680j_4(LinearAxisModel.kt:92)
	at io.github.koalaplot.core.xygraph.AxisDelegate$Companion.createAxis-eqLRuRQ(AxisDelegate.kt:95)
	at io.github.koalaplot.core.xygraph.AxisDelegate$Companion.createVerticalAxis-wH6b6FI(AxisDelegate.kt:82)
	at io.github.koalaplot.core.xygraph.XYGraphKt$XYGraph$1$1.invoke-0kLqBqw(XYGraph.kt:119)
	at io.github.koalaplot.core.xygraph.XYGraphKt$XYGraph$1$1.invoke(XYGraph.kt:98)
	at androidx.compose.ui.layout.LayoutNodeSubcompositionsState$createMeasurePolicy$1.measure-3p2s80s(SubcomposeLayout.kt:709)
	at androidx.compose.ui.node.InnerNodeCoordinator.measure-BRTryo0(InnerNodeCoordinator.kt:126)
	at androidx.compose.ui.node.LayoutNodeLayoutDelegate$performMeasureBlock$1.invoke(LayoutNodeLayoutDelegate.kt:252)
	at androidx.compose.ui.node.LayoutNodeLayoutDelegate$performMeasureBlock$1.invoke(LayoutNodeLayoutDelegate.kt:251)
	at androidx.compose.runtime.snapshots.Snapshot$Companion.observe(Snapshot.kt:2304)
	at androidx.compose.runtime.snapshots.SnapshotStateObserver$ObservedScopeMap.observe(SnapshotStateObserver.kt:504)
	at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.kt:260)
	at androidx.compose.ui.node.OwnerSnapshotObserver.observeReads$ui(OwnerSnapshotObserver.kt:133)
	at androidx.compose.ui.node.OwnerSnapshotObserver.observeMeasureSnapshotReads$ui(OwnerSnapshotObserver.kt:113)
	at androidx.compose.ui.node.LayoutNodeLayoutDelegate.performMeasure-BRTryo0(LayoutNodeLayoutDelegate.kt:1617)
	at androidx.compose.ui.node.LayoutNodeLayoutDelegate.access$performMeasure-BRTryo0(LayoutNodeLayoutDelegate.kt:36)
	at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate.remeasure-BRTryo0(LayoutNodeLayoutDelegate.kt:620)
	at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate.measure-BRTryo0(LayoutNodeLayoutDelegate.kt:596)
	at androidx.compose.foundation.layout.BoxMeasurePolicy.measure-3p2s80s(Box.kt:122)
	at androidx.compose.ui.node.InnerNodeCoordinator.measure-BRTryo0(InnerNodeCoordinator.kt:126)
	at androidx.compose.ui.node.LayoutNodeLayoutDelegate$performMeasureBlock$1.invoke(LayoutNodeLayoutDelegate.kt:252)
	at androidx.compose.ui.node.LayoutNodeLayoutDelegate$performMeasureBlock$1.invoke(LayoutNodeLayoutDelegate.kt:251)
	at androidx.compose.runtime.snapshots.Snapshot$Companion.observe(Snapshot.kt:2304)
	at androidx.compose.runtime.snapshots.SnapshotStateObserver$ObservedScopeMap.observe(SnapshotStateObserver.kt:504)
	at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.kt:260)
	at androidx.compose.ui.node.OwnerSnapshotObserver.observeReads$ui(OwnerSnapshotObserver.kt:133)
	at androidx.compose.ui.node.OwnerSnapshotObserver.observeMeasureSnapshotReads$ui(OwnerSnapshotObserver.kt:113)
	at androidx.compose.ui.node.LayoutNodeLayoutDelegate.performMeasure-BRTryo0(LayoutNodeLayoutDelegate.kt:1617)
	at androidx.compose.ui.node.LayoutNodeLayoutDelegate.access$performMeasure-BRTryo0(LayoutNodeLayoutDelegate.kt:36)
	at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate.remeasure-BRTryo0(LayoutNodeLayoutDelegate.kt:620)
	at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate.measure-BRTryo0(LayoutNodeLayoutDelegate.kt:596)
	at io.github.koalaplot.core.util.HoverableElementAreaKt$HoverableElementArea$2$1.measure-3p2s80s(HoverableElementArea.kt:85)
	at androidx.compose.ui.node.InnerNodeCoordinator.measure-BRTryo0(InnerNodeCoordinator.kt:126)
	at androidx.compose.ui.node.LayoutNodeLayoutDelegate$performMeasureBlock$1.invoke(LayoutNodeLayoutDelegate.kt:252)
	at androidx.compose.ui.node.LayoutNodeLayoutDelegate$performMeasureBlock$1.invoke(LayoutNodeLayoutDelegate.kt:251)
	at androidx.compose.runtime.snapshots.Snapshot$Companion.observe(Snapshot.kt:2304)
	at androidx.compose.runtime.snapshots.SnapshotStateObserver$ObservedScopeMap.observe(SnapshotStateObserver.kt:504)
	at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.kt:260)
	at androidx.compose.ui.node.OwnerSnapshotObserver.observeReads$ui(OwnerSnapshotObserver.kt:133)
	at androidx.compose.ui.node.OwnerSnapshotObserver.observeMeasureSnapshotReads$ui(OwnerSnapshotObserver.kt:113)
	at androidx.compose.ui.node.LayoutNodeLayoutDelegate.performMeasure-BRTryo0(LayoutNodeLayoutDelegate.kt:1617)
	at androidx.compose.ui.node.LayoutNodeLayoutDelegate.access$performMeasure-BRTryo0(LayoutNodeLayoutDelegate.kt:36)
	at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate.remeasure-BRTryo0(LayoutNodeLayoutDelegate.kt:620)
	at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate.measure-BRTryo0(LayoutNodeLayoutDelegate.kt:596)
	at androidx.compose.foundation.layout.BoxMeasurePolicy.measure-3p2s80s(Box.kt:122)
	at androidx.compose.ui.node.InnerNodeCoordinator.measure-BRTryo0(InnerNodeCoordinator.kt:126)
	at androidx.compose.ui.node.LayoutNodeLayoutDelegate$performMeasureBlock$1.invoke(LayoutNodeLayoutDelegate.kt:252)
	at androidx.compose.ui.node.LayoutNodeLayoutDelegate$performMeasureBlock$1.invoke(LayoutNodeLayoutDelegate.kt:251)
	at androidx.compose.runtime.snapshots.Snapshot$Companion.observe(Snapshot.kt:2304)
	at androidx.compose.runtime.snapshots.SnapshotStateObserver$ObservedScopeMap.observe(SnapshotStateObserver.kt:504)
	at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.kt:260)
	at androidx.compose.ui.node.OwnerSnapshotObserver.observeReads$ui(OwnerSnapshotObserver.kt:133)
	at androidx.compose.ui.node.OwnerSnapshotObserver.observeMeasureSnapshotReads$ui(OwnerSnapshotObserver.kt:113)
	at androidx.compose.ui.node.LayoutNodeLayoutDelegate.performMeasure-BRTryo0(LayoutNodeLayoutDelegate.kt:1617)
	at androidx.compose.ui.node.LayoutNodeLayoutDelegate.access$performMeasure-BRTryo0(LayoutNodeLayoutDelegate.kt:36)
	at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate.remeasure-BRTryo0(LayoutNodeLayoutDelegate.kt:620)
	at androidx.compose.ui.node.LayoutNode.remeasure-_Sx5XlM$ui(LayoutNode.kt:1145)
	at androidx.compose.ui.node.LayoutNode.remeasure-_Sx5XlM$ui$default(LayoutNode.kt:1136)
	at androidx.compose.ui.node.MeasureAndLayoutDelegate.doRemeasure-sdFAvZA(MeasureAndLayoutDelegate.kt:356)
	at androidx.compose.ui.node.MeasureAndLayoutDelegate.remeasureAndRelayoutIfNeeded(MeasureAndLayoutDelegate.kt:514)
	at androidx.compose.ui.node.MeasureAndLayoutDelegate.onlyRemeasureIfScheduled(MeasureAndLayoutDelegate.kt:598)
	at androidx.compose.ui.node.MeasureAndLayoutDelegate.forceMeasureTheSubtreeInternal(MeasureAndLayoutDelegate.kt:624)
	at androidx.compose.ui.node.MeasureAndLayoutDelegate.forceMeasureTheSubtreeInternal(MeasureAndLayoutDelegate.kt:631)
	at androidx.compose.ui.node.MeasureAndLayoutDelegate.forceMeasureTheSubtreeInternal(MeasureAndLayoutDelegate.kt:631)
	at androidx.compose.ui.node.MeasureAndLayoutDelegate.forceMeasureTheSubtreeInternal(MeasureAndLayoutDelegate.kt:631)
	at androidx.compose.ui.node.MeasureAndLayoutDelegate.forceMeasureTheSubtreeInternal(MeasureAndLayoutDelegate.kt:631)
	at androidx.compose.ui.node.MeasureAndLayoutDelegate.forceMeasureTheSubtreeInternal(MeasureAndLayoutDelegate.kt:631)
	at androidx.compose.ui.node.MeasureAndLayoutDelegate.forceMeasureTheSubtree(MeasureAndLayoutDelegate.kt:587)
	at androidx.compose.ui.node.RootNodeOwner$OwnerImpl.forceMeasureTheSubtree(RootNodeOwner.skiko.kt:308)
	at androidx.compose.ui.node.Owner.forceMeasureTheSubtree$default(Owner.kt:239)
	at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate.remeasure-BRTryo0(LayoutNodeLayoutDelegate.kt:632)
	at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate.measure-BRTryo0(LayoutNodeLayoutDelegate.kt:596)
	at org.jetbrains.compose.splitpane.DesktopSplitPaneKt$SplitPane$5.measure-3p2s80s(DesktopSplitPane.kt:100)
	at androidx.compose.ui.node.InnerNodeCoordinator.measure-BRTryo0(InnerNodeCoordinator.kt:126)
	at androidx.compose.ui.node.LayoutNodeLayoutDelegate$performMeasureBlock$1.invoke(LayoutNodeLayoutDelegate.kt:252)
	at androidx.compose.ui.node.LayoutNodeLayoutDelegate$performMeasureBlock$1.invoke(LayoutNodeLayoutDelegate.kt:251)
	at androidx.compose.runtime.snapshots.Snapshot$Companion.observe(Snapshot.kt:2304)
	at androidx.compose.runtime.snapshots.SnapshotStateObserver$ObservedScopeMap.observe(SnapshotStateObserver.kt:504)
	at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.kt:260)
	at androidx.compose.ui.node.OwnerSnapshotObserver.observeReads$ui(OwnerSnapshotObserver.kt:133)
	at androidx.compose.ui.node.OwnerSnapshotObserver.observeMeasureSnapshotReads$ui(OwnerSnapshotObserver.kt:113)
	at androidx.compose.ui.node.LayoutNodeLayoutDelegate.performMeasure-BRTryo0(LayoutNodeLayoutDelegate.kt:1617)
	at androidx.compose.ui.node.LayoutNodeLayoutDelegate.access$performMeasure-BRTryo0(LayoutNodeLayoutDelegate.kt:36)
	at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate.remeasure-BRTryo0(LayoutNodeLayoutDelegate.kt:620)
	at androidx.compose.ui.node.LayoutNode.remeasure-_Sx5XlM$ui(LayoutNode.kt:1145)
	at androidx.compose.ui.node.LayoutNode.remeasure-_Sx5XlM$ui$default(LayoutNode.kt:1136)
	at androidx.compose.ui.node.MeasureAndLayoutDelegate.doRemeasure-sdFAvZA(MeasureAndLayoutDelegate.kt:356)
	at androidx.compose.ui.node.MeasureAndLayoutDelegate.remeasureAndRelayoutIfNeeded(MeasureAndLayoutDelegate.kt:514)
	at androidx.compose.ui.node.MeasureAndLayoutDelegate.onlyRemeasureIfScheduled(MeasureAndLayoutDelegate.kt:598)
	at androidx.compose.ui.node.MeasureAndLayoutDelegate.forceMeasureTheSubtreeInternal(MeasureAndLayoutDelegate.kt:624)
	at androidx.compose.ui.node.MeasureAndLayoutDelegate.forceMeasureTheSubtree(MeasureAndLayoutDelegate.kt:587)
	at androidx.compose.ui.node.RootNodeOwner$OwnerImpl.forceMeasureTheSubtree(RootNodeOwner.skiko.kt:308)
	at androidx.compose.ui.node.Owner.forceMeasureTheSubtree$default(Owner.kt:239)
	at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate.remeasure-BRTryo0(LayoutNodeLayoutDelegate.kt:632)
	at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate.measure-BRTryo0(LayoutNodeLayoutDelegate.kt:596)
	at org.jetbrains.compose.splitpane.DesktopSplitPaneKt$SplitPane$5.measure-3p2s80s(DesktopSplitPane.kt:100)
	at androidx.compose.ui.node.InnerNodeCoordinator.measure-BRTryo0(InnerNodeCoordinator.kt:126)
	at androidx.compose.ui.node.LayoutNodeLayoutDelegate$performMeasureBlock$1.invoke(LayoutNodeLayoutDelegate.kt:252)
	at androidx.compose.ui.node.LayoutNodeLayoutDelegate$performMeasureBlock$1.invoke(LayoutNodeLayoutDelegate.kt:251)
	at androidx.compose.runtime.snapshots.Snapshot$Companion.observe(Snapshot.kt:2304)
	at androidx.compose.runtime.snapshots.SnapshotStateObserver$ObservedScopeMap.observe(SnapshotStateObserver.kt:504)
	at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.kt:260)
	at androidx.compose.ui.node.OwnerSnapshotObserver.observeReads$ui(OwnerSnapshotObserver.kt:133)
	at androidx.compose.ui.node.OwnerSnapshotObserver.observeMeasureSnapshotReads$ui(OwnerSnapshotObserver.kt:113)
	at androidx.compose.ui.node.LayoutNodeLayoutDelegate.performMeasure-BRTryo0(LayoutNodeLayoutDelegate.kt:1617)
	at androidx.compose.ui.node.LayoutNodeLayoutDelegate.access$performMeasure-BRTryo0(LayoutNodeLayoutDelegate.kt:36)
	at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate.remeasure-BRTryo0(LayoutNodeLayoutDelegate.kt:620)
	at androidx.compose.ui.node.LayoutNode.remeasure-_Sx5XlM$ui(LayoutNode.kt:1145)
	at androidx.compose.ui.node.LayoutNode.remeasure-_Sx5XlM$ui$default(LayoutNode.kt:1136)
	at androidx.compose.ui.node.MeasureAndLayoutDelegate.doRemeasure-sdFAvZA(MeasureAndLayoutDelegate.kt:356)
	at androidx.compose.ui.node.MeasureAndLayoutDelegate.remeasureAndRelayoutIfNeeded(MeasureAndLayoutDelegate.kt:514)
	at androidx.compose.ui.node.MeasureAndLayoutDelegate.remeasureAndRelayoutIfNeeded$default(MeasureAndLayoutDelegate.kt:491)
	at androidx.compose.ui.node.MeasureAndLayoutDelegate.measureAndLayout(MeasureAndLayoutDelegate.kt:377)
	at androidx.compose.ui.node.RootNodeOwner$OwnerImpl.measureAndLayout(RootNodeOwner.skiko.kt:290)
	at androidx.compose.ui.node.RootNodeOwner.measureAndLayout(RootNodeOwner.skiko.kt:187)
	at androidx.compose.ui.scene.MultiLayerComposeSceneImpl.measureAndLayout(MultiLayerComposeScene.skiko.kt:247)
	at androidx.compose.ui.scene.BaseComposeScene.doLayout(BaseComposeScene.skiko.kt:225)
	at androidx.compose.ui.scene.BaseComposeScene.access$doLayout(BaseComposeScene.skiko.kt:51)
	at androidx.compose.ui.scene.BaseComposeScene.render(BaseComposeScene.skiko.kt:164)
	at androidx.compose.ui.scene.ComposeSceneMediator$DesktopSkikoView.onRender(ComposeSceneMediator.desktop.kt:490)
	at org.jetbrains.skiko.SkiaLayer.update$skiko(SkiaLayer.awt.kt:548)
	at org.jetbrains.skiko.redrawer.AWTRedrawer.update(AWTRedrawer.kt:54)
	at org.jetbrains.skiko.redrawer.MetalRedrawer$frameDispatcher$1.invokeSuspend(MetalRedrawer.kt:82)
	at org.jetbrains.skiko.redrawer.MetalRedrawer$frameDispatcher$1.invoke(MetalRedrawer.kt)
	at org.jetbrains.skiko.redrawer.MetalRedrawer$frameDispatcher$1.invoke(MetalRedrawer.kt)
	at org.jetbrains.skiko.FrameDispatcher$job$1.invokeSuspend(FrameDispatcher.kt:33)
	at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
	at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:108)
	at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:318)
	at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:773)
	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:720)
	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:714)
	at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
	at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:742)
	at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
	at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
	Suppressed: kotlinx.coroutines.internal.DiagnosticCoroutineContextException: [StandaloneCoroutine{Cancelling}@570805d2, SwingDispatcher@6d583e10]

Reproducer:
ChartLayout(title = { AppText("Latencies over Time (95%)") }) {
    latenciesMsOverTime.takeIf { it.size >= 2 }?.let { latenciesMsOverTime ->
        XYGraph(
            xAxisModel = CategoryAxisModel(
                latenciesMsOverTime.keys.toList().ifEmpty { listOf(KInstant.now().toMilliseconds()) }),
            yAxisModel = LinearAxisModel(
                range = 0f..6000f,
            ),
            xAxisLabels = { KZonedInstant(it, KZoneOffset.local()).format("HH:mm:ss") },
            xAxisTitle = "Time",
            yAxisTitle = "Latency (ms)",
        ) {
            latenciesMsOverTime.forEach { (timestamp, result) ->
                DefaultPoint(timestamp, result.at95Percent)
            }
        }
    }
}

I can't run this without your data. But are you putting the graph in a vertically scrollable area without otherwise restricting the height of the graph, e.g. by using a modifier?

Yes. Is this not supported?

The graph will expand to consume all available space, so if you put it in a
scrollable column the vertical space is infinite - and by inspecting the
code I think that will lead to what you are seeing (I didn't try it but
there's a calculation that divides by the available space to find the
relative tick spacing, which would result in it being 0 - in any case you
probably don't want an infinitely tall graph).
If you use a Modifier to set a max height or aspect ratio, this exception
will likely go away.
On Mon, Feb 26, 2024 at 7:33 PM sunny-chung @.***>
wrote:

Yes. Is this not supported?
—
Reply to this email directly, view it on GitHub
https://github.com/KoalaPlot/koalaplot-core/issues/42#issuecomment-1965725769,
or unsubscribe
https://github.com/notifications/unsubscribe-auth/AGOGXZGYXJDJ2OSPWRMSMILYVVHZNAVCNFSM6AAAAABD2UCZLOVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMYTSNRVG4ZDKNZWHE
.
You are receiving this because you commented.Message ID:
@.***>

Thanks for the prompt response. I overcame this error, and encountered more errors.

exception thrown for autoScaleYRange() when there is no point
java.lang.ClassCastException: class io.github.koalaplot.core.xychart.DefaultPoint cannot be cast to class io.github.koalaplot.core.xygraph.Point

Then, I took an hour to figure out how to reduce minor grid lines.
I encountered an exception when I try to reduce number of grid lines in x-axis by reducing number of items in CategoryAxisModel.
And then, I changed to use LinearAxisModel, which only accepts Float values. My data are timestamps, so they are in Long. I keep encountering an error IllegalArgumentException: Axis range end (1.70904125E12) must be greater than start (1.70904125E12), even if I hardcoded things in the below code. Because x - 2000 and x has the same value after converting to Float, which is a low-precision data type.
                val pseudoPoints = points.ifEmpty {
                    val now = KInstant.now().toMilliseconds()
                    listOf(DefaultPoint(now - 2000, 0f), DefaultPoint(now, 0f))
                }.let {
                    if (it.size == 1) {
                        listOf(DefaultPoint(it.first().x - 2000, it.first().y), it.first())
                    } else {
                        it
                    }
                }

                val floatPoints = points.map { DefaultPoint(it.x.toFloat(), it.y) }
                XYGraph(
                    xAxisModel = LinearAxisModel(
                        pseudoPoints.first().x.toFloat() .. pseudoPoints.last().x.toFloat(),
                        minorTickCount = 0,
                        minimumMajorTickIncrement = 2000f,
                    ),
                    yAxisModel = LinearAxisModel(
                        pseudoPoints.autoScaleYRange(),
                        minorTickCount = 2,
                    ),

And autoScaleXRange() is only available for Float values.
Even if there is no IllegalArgumentException throwing, I would have to deal with precision loss issues raised by conversion from Long to Float and then back to Long.
This is a great library. I like the customizable styles and designs even though they are deeply buried and not documented. The look and feel is also okay. I wish the documentation on getting started could be better, the library could provide more friendly APIs and not coupled to one low-precision inflexible data type. Many of the exceptions I encountered can be avoided with a few lines of documentation. I may have to look for alternatives due to the floating point issues.
Please correct me if I did not understand the library well, so that I can still explore this library.

Thanks for the feedback, this is useful for helping to make the library better and understanding how people want to use it. Have you seen the documentation here https://koalaplot.github.io/docs/? If specific things are missing in the documentation that caused you trouble, please let me know so we can add more information on those topics.
With regards to the data types, that is something that should be fairly easy to add - I'll look into it. I was using Float myself, and and didn't create versions for every data type and was waiting for interest from other users. Since the Number class has no arithmetic operators, it's not as straightforward as just adding a generic type to the existing implementation.
The ClassCastException looks like a bug. The xychart.* classes/functions are deprecated and I plan to remove them in 0.6.0 - I'll do that soon.
Autoscaling will need at least 2 points to compute a scale. I don't know of a way to get the compiler to enforce that.

I just pushed a change adding LongLinearAxisModel (as well as for other data types) and addressing some of the other issues. It's not been heavily tested so give it a try and if you encounter bugs please open a new issue for each one.
The minor grid lines are tied to the minor ticks - there is 1 minor grid line for each minor tick. If you change the number of minor ticks it also changes the number of minor grid lines. I don't think I've ever seen a graph where the number of minor grid lines was different than the number of minor ticks (you can also change the length of minor ticks and set it to 0 if you don't want them to show, in which case you'll only see a change in the number of minor grid lines).  If you have an example of what you are trying to achieve I'll take a look at it.


Favicon isn't properly visible

Because of the small size of the favicon (mostly, 16×16 pixels), the visibility of a person's images as a favicon becomes poor so the favicon should be updated with a new logo or icon that can be visible even in small size.
For example, we should use these types of icons in the favicon -

these are icons related to business or something else. BUt what's if we use another icons related to coding

Yeah, totally fine. They're just examples.

Yeah, totally fine. They're just examples.

ok then add favicon

assigning to you


[kubernetes] Kubernetes C Client

This adds Kubernetes C Client library

Which triplets are supported/not supported?

Yes

If you are still working on the PR, open it as a Draft: https://github.blog/2019-02-14-introducing-draft-pull-requests/

two question:

usage should not be required. Is vcpkg unable to write automatically the same thing as you wrote, inspecting the target the lib creates?
why vcpkg_from_git and not vcpkg_from_github? the latter should be preferred for github repo

This PR fixes the MacOS errors: https://github.com/kubernetes-client/c/pull/84
I'll update this PR once that is merged.

two question:

usage should not be required. Is vcpkg unable to write automatically the same thing as you wrote, inspecting the target the lib creates?
why vcpkg_from_git and not vcpkg_from_github? the latter should be preferred for github repo

Done and done. Thank you.

MacOS version fixed.

Cool, Thanks @ahmedyarub !


Packer Install Bug

I have a fresh neovim install. After copying init,lua to the .config/nvim/ folder and running :PackerInstall it returns 'not an editor command'
To Reproduce
Steps to reproduce the behavior:

run nvim (debain terminal)
:PackerInstall

Desktop (please complete the following information):

OS: ubuntu 20.04.5
Terminal: debian, ubuntu, bash

** Neovim Version **

Output of running :version from inside of neovim:
NVIM v0.4.3
Build type: Release
LuaJIT 2.1.0-beta3
Compilation: /usr/bin/cc -g -O2 -fdebug-prefix-map=/build/neovim-gOb7vg/neovim-0.4.3=. -fstack-protec
tor-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=1 -DDISABLE_LOG -Wdate-time
-D_FORTIFY_SOURCE=1 -O2 -DNDEBUG -DMIN_LOG_LEVEL=3 -Wall -Wextra -pedantic -Wno-unused-parameter -Ws
trict-prototypes -std=gnu99 -Wshadow -Wconversion -Wmissing-prototypes -Wimplicit-fallthrough -Wvla -
fstack-protector-strong -fdiagnostics-color=always -DINCLUDE_GENERATED_DECLARATIONS -D_GNU_SOURCE -DN
VIM_MSGPACK_HAS_FLOAT32 -DNVIM_UNIBI_HAS_VAR_FROM -I/build/neovim-gOb7vg/neovim-0.4.3/build/config -I
/build/neovim-gOb7vg/neovim-0.4.3/src -I/usr/include -I/usr/include/lua5.1 -I/build/neovim-gOb7vg/neo
vim-0.4.3/build/src/nvim/auto -I/build/neovim-gOb7vg/neovim-0.4.3/build/include
Compiled by<EMAIL_ADDRESS>

I might be wrong, but you need at least nvim v0.5.0 or above.
Can you update your nvim and try again?

README.md suggest only latest stable and nightly of neovim.
I think at least v0.7.x because of the new function vim.keymap.set but I might be wrong.

you need v0.8.1 or nightly, as stated in the readme.


Synchronized Video Streaming with Raspberry PI Zero 2 W

Hello,
Great project! I would like to use this library for a specific use case, but I am not sure if it would be suitable so I'll ask here.
The use case involves using two Raspberry PI Zero 2 W devices to stream video feeds in parallel to a Linux terminal. The critical requirement is to align each video frame from one stream with the corresponding frame from the other stream, based on their timestamps.
To achieve this, the following functionalities are necessary:
Each video frame must be accompanied by a unique timestamp when sent from the Raspberry PIs.
The receiving terminal should be capable of processing the streams by fetching frames individually, retrieving their timestamps, and synchronizing them with the frames from the alternate stream.
Could you please advise whether your library supports these features, or if there is a possibility to implement such a synchronization mechanism using your library?
Thanks in advance!

I record timestamps while receiving the frame from the camera,
https://github.com/TzuHuanTai/RaspberryPi_WebRTC/blob/df98d7bbfcf4a44eb5ccfea360f04c117f66380f/src/track/v4l2_track_source.cpp#L76-L80
This timestamp is appended to the encoded frame before sending it to the webrtc client side.
https://github.com/TzuHuanTai/RaspberryPi_WebRTC/blob/df98d7bbfcf4a44eb5ccfea360f04c117f66380f/src/v4l2_codecs/raw_buffer_encoder.cpp#L82
So It may work for your case😕. But you must ensure the clocks from different devices are synchronized, or there is always a fixed time difference between each device.
There are still a lot of codes that need to be cleaned or refactored in the future. I don't recommend using this project in production so far. I'm refactoring the DMA mechanism to enhance the performance in those few days, I plan to migrate this project to my pi zero 2 as well😄.

Ah, that's great! I'll try out the timestamp code then :) As for time sync, I can use ntp sync, shouldn't be a problem.
As for production warning, message received. I already like how well the code is structured, looking forward to seeing the further progress! If you need some help in testing, let me know, especially with pi zero 2!

Btw, for testing on pi zero 2, would you recommend installing RaspberryPi OS 64bit?

Yes, I'm using Raspberry Pi OS 64bit. I haven't tested on others yet.😅

Alright, will try that (Bullseye 64bit)!
One more question: do build webrtc directly on RPI or do you cross-compile? I am asking because it might take a long time on pizero and am not even sure if it can do that. I am trying to figure out a good cross-compilation recipe..

I built on my WSL with Ubuntu 20.04, and it only took 10 minutes.
The compiling arguments are here.

Thanks. I have trying on bare ubuntun 22.04, but could also give WSL on 20.04 a try. Besides the compiling arguments you pointed at, you must also have a cross compile configuration/procedure right? I have been trying to cook one, but I am getting clang errors (despite using your recommended one). I am getting weird CLANG errors, e.g.,  there are several compiler flags that the current version of clang does not recognize (that's both with your optional procedures or the default vresion)
-Wno-thread-safety-reference-return
-Wno-delayed-template-parsing-in-cxx20
-split-threshold-for-reg-with-hint=0

Try to download the newer clang version here.
It usually happens because the webrtc team uses the relatively new clang.
It would show unrecognized errors If your clang is too old.

I don't know whether you check out the specific branch of webrtc or the newest one. I'm using m115 now.

That worked, thank you! I am cross-compiling on ubuntu 22.04. Later on, if you want I can share the whole recipe from creating the cross-compilation env onward, maybe it could be useful info for this repo.
Now I am moving to microsoft-signalr.so. Did you also cross-compile that on WSL or did you instead directly compiled and install it on RPI?

In the meantime I made progress with cross-compilation, however I now get stuck at Install [cpprestsdk](https://github.com/Microsoft/cpprestsdk/wiki/How-to-build-for-Linux).
all works (and I followed carefully your instructions about c++11 --> c++14) until when i try to run
ninja

at that point i have a ton of compilation errors; i create a gist with the output

I built all other libs on Raspberry Pi. webrtc.lib can be compiled on WSL because it provides a cross-compile arg target_cpu="arm64". We need to make sure all libs ars compatible with arm based platforms.

Alright, will do the same then and let you know!

Compiling on pizero seems to be quite hard though. I am now at casablanca but in 8 hours it is at this step:
[5/160] Building CXX object Release/src/CMakeFiles/cpprest.dir/json/json.cpp.o

while using 2GB+ swap.
I wonder if we could compile on more powerful RPI and then transfer the library - would that work you think?

I'm researching how to emulate Raspberry Pi OS on Windows to speed up.
I plan to use QEMU to run an arm-based device with it. But I got stuck on the below command.
I'm trying to figure it out. :(

qemu-system-aarch64 -machine raspi3b -cpu cortex-a72 -dtb "D:\bcm2710-rpi-3-b-plus.dtb" -kernel "D:\kernel8.img" -drive file="D:\2023-10-10-raspios-bookworm-arm64-full.img",if=none,id=drive0 -append "rw earlyprintk loglevel=8 console=ttyAMA0,115200 dwc_otg.lpm_enable=0 root=/dev/mmcblk0p2 rootdelay=1" -serial stdio -usb -device usb-mouse -device usb-kbd -device usb-net,netdev=net0 -netdev user,id=net0,hostfwd=tcp::5555-:22

btw, my libs were built on 3B, the pi zero is too slow.

excellent, i will do the same then (suing RPI3 and transfer); as for the QUEMU aproach, let me open another issue for you with my current configuration on ubuntu 22.04 (but should work on 20.04 as well); maybe we can work on the env together

I had to order a new RPI4 as I happened to have an 3A only. While I wait, would it be maybe possible to get your built libs to accelerate testing? Of course only if it isn't too much of a hassle for you.

I recompiled all dependent libs and released a static executable file here. You could take a try.

That's very kind, thank you (I deleted the message because right after I asked that the RPI4 arrived  :)

I just tested your binaries and everything is working, thank you!
Back to the original question of this issue, for our purpose, we won't need a browser on the receiving end. We will instead have another arm64 linux machine, which will match images based on their timestamps and then send that to a neural network. So, I am now wondering if we should replace signalr with a different (simpler) communication protocol. In particular, because it probably doesn't make much sense to use signalr server hub, right?
I don't know if you have recommendations for that. I was considering regular WebSockets maybe. Also, if that's the case, I wonder if you are interested in decoupling the signaling here in your library so that it becomes more general or you would like to keep signalr only (I am asking because in case I could contribute to that, but am really open to hear what you think is the best approach you have in mind).

It's a good question! I agree with your suggestion that the signaling mechanism could be replaced or selected by other protocols. I'll try to decouple and refactor it with an interface in a few days. For the time to implement the regular web socket or other protocols, I have no plan for when I'll finish it. Maybe you can implement your protocol on the interface, and recompile the program by setting customized options like -DUSE_SIGNALR=true, -DUSE_WEBSOCKET=true or so.
I initially chose signalr as a signaling mechanism because I have a project that broadcasts sensor data through signalr. Built on top of it is the most convenient way for me, that's all.

Having an interface would be great! Alright, I'll look into the best suitable signaling protocol for my use case while waiting for the interface then. I'll be happy to act as tester afterwards, maybe that could also be helpful for others if we document it well.

I refactored the signaling service code in #86.
For example, If you'd like to use websocket, the new command to set the signaling service would be "cmake .. -DCMAKE_CXX_COMPILER=/usr/bin/clang++ -DUSE_SIGNALING=WEBSOCKET", the default is SIGNALR. You can implement any protocols by inheriting the class in src/signaling/signaling_service.h, and creating the service in src/main.cpp like below.
https://github.com/TzuHuanTai/RaspberryPi_WebRTC/blob/01465be0cec3eaf09784c3b10a013a568cd526d5/src/main.cpp#L26-L34

That's great! I will give it a try and ask for feedback as I am not an expert :)

Quick question: which version of ffmpeg are you using on the RPI and was tested with?

I use 4.3.6 version of ffmpeg, the shared libs details show with the command apt list --installed | grep libav
libavc1394-0/oldstable,now 0.5.4-5 arm64 [installed,automatic]
libavcodec-dev/oldstable,now 8:4.3.6-0+deb11u1+rpt5 arm64 [installed]
libavcodec58/oldstable,now 8:4.3.6-0+deb11u1+rpt5 arm64 [installed,automatic]
libavdevice-dev/oldstable,now 8:4.3.6-0+deb11u1+rpt5 arm64 [installed]
libavdevice58/oldstable,now 8:4.3.6-0+deb11u1+rpt5 arm64 [installed,automatic]
libavfilter-dev/oldstable,now 8:4.3.6-0+deb11u1+rpt5 arm64 [installed,automatic]
libavfilter7/oldstable,now 8:4.3.6-0+deb11u1+rpt5 arm64 [installed,automatic]
libavformat-dev/oldstable,now 8:4.3.6-0+deb11u1+rpt5 arm64 [installed]
libavformat58/oldstable,now 8:4.3.6-0+deb11u1+rpt5 arm64 [installed,automatic]
libavresample4/oldstable,now 8:4.3.6-0+deb11u1+rpt5 arm64 [installed,automatic]
libavutil-dev/oldstable,now 8:4.3.6-0+deb11u1+rpt5 arm64 [installed]
libavutil56/oldstable,now 8:4.3.6-0+deb11u1+rpt5 arm64 [installed,automatic]

Thank you!
The receiver I am working on is a rock 5A,
Here my output of apt list --installed | grep libav
libavahi-client3/jammy-security,jammy-updates,now 0.8-5ubuntu5.2 arm64 [installed,automatic]
libavahi-common-data/jammy-security,jammy-updates,now 0.8-5ubuntu5.2 arm64 [installed,automatic]
libavahi-common3/jammy-security,jammy-updates,now 0.8-5ubuntu5.2 arm64 [installed,automatic]
libavahi-core7/jammy-security,jammy-updates,now 0.8-5ubuntu5.2 arm64 [installed,automatic]
libavc1394-0/jammy,now 0.5.4-5build2 arm64 [installed,automatic]
libavcodec-dev/jammy,now 7:6.0-5+git230804.e243e8d001~j1 arm64 [installed]
libavcodec58/jammy,now 7:4.4.2-0ubuntu<IP_ADDRESS>+rkmpp20230327 arm64 [installed,automatic]
libavcodec60/jammy,now 7:6.0-5+git230804.e243e8d001~j1 arm64 [installed,automatic]
libavdevice-dev/jammy,now 7:6.0-5+git230804.e243e8d001~j1 arm64 [installed]
libavdevice60/jammy,now 7:6.0-5+git230804.e243e8d001~j1 arm64 [installed,automatic]
libavfilter-dev/jammy,now 7:6.0-5+git230804.e243e8d001~j1 arm64 [installed]
libavfilter9/jammy,now 7:6.0-5+git230804.e243e8d001~j1 arm64 [installed,automatic]
libavformat-dev/jammy,now 7:6.0-5+git230804.e243e8d001~j1 arm64 [installed]
libavformat60/jammy,now 7:6.0-5+git230804.e243e8d001~j1 arm64 [installed,automatic]
libavutil-dev/jammy,now 7:6.0-5+git230804.e243e8d001~j1 arm64 [installed]
libavutil56/jammy,now 7:4.4.2-0ubuntu<IP_ADDRESS>+rkmpp20230327 arm64 [installed,automatic]
libavutil58/jammy,now 7:6.0-5+git230804.e243e8d001~j1 arm64 [installed,automatic]

I also need to build a specific ffmpeg version.
Do you think this could cause issues? If I understand correctly, the thing the receiver should do is properly decode and scale  the video stream. As far as I can see, these are the dynamic libs I should pay attention to:
set(WEBRTC_LINK_LIBS X11 dl)
set(FFMPEG_LINK_LIBS avformat avcodec avutil swscale avdevice)

Glad to hear. I indeed get issues such as
RaspberryPi_WebRTC/src/common/recorder.cpp:80:14: error: cannot initialize a variable of type 'AVCodec *' with an rvalue of type 'const AVCodec *'
    AVCodec *codec = avcodec_find_encoder_by_name(encoder_name.c_str());
             ^       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

which I could fix by replacing
AVCodec *codec = avcodec_find_encoder_by_name(encoder_name.c_str());

with
const AVCodec *codec = avcodec_find_encoder_by_name(encoder_name.c_str());

I am working on the alternative signaling and am also writing the receiver side (i.e., I am writing a conductor.h for the receiver as well as its server; for the server, I am trying mosquitto.

In this project, the ffmpeg is only used for recording the video file that I'm doing in issue #91 so far.

Hello @TzuHuanTai !
It took me some time but I managed to arrange a temporary version RaspberryPi_WebRTC that attempts to use Mosquitto for signaling.
I put the instructions how to run it in the README.md. I apologize for the not yet well integrated code. There is lot to be improved in terms of OOP, but I wanted to first make sure to keep the new files isolated so that they are easier to debug. Once all fixed, I'll be happy to make a PR if you are interested.
So far, I managed to successfully exchange SDP and ICE offers (at least, for what I can tell). In particular:
About SDP
Sender SDP:
[Conductor::CreateAnswer] Successfully set local description. SDP:
v=0
o=-<PHONE_NUMBER>307478089 3 IN IP4 <IP_ADDRESS>
s=-
t=0 0
a=group:BUNDLE 0 1 2
a=extmap-allow-mixed
a=msid-semantic: WMS test_stream_id
m=audio 9 UDP/TLS/RTP/SAVPF 111 63 9 102 0 8 13 110 126
c=IN IP4 <IP_ADDRESS>
a=rtcp:9 IN IP4 <IP_ADDRESS>
a=ice-ufrag:S1HD
a=ice-pwd:i94ulUDBazgxV3lArAll5L8Y
a=ice-options:trickle
a=fingerprint:sha-256 F9:1A:78:45:5C:69:43:5D:DC:52:D6:70:A0:90:C8:61:53:A3:86:63:C3:64:3C:74:E7:03:01:50:16:9B:CE:7A
a=setup:passive
a=mid:0
a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level
a=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=extmap:3 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01
a=extmap:4 urn:ietf:params:rtp-hdrext:sdes:mid
a=sendonly
a=msid:test_stream_id raspberrypi_audio
a=rtcp-mux
a=rtpmap:111 opus/48000/2
a=rtcp-fb:111 transport-cc
a=fmtp:111 minptime=10;useinbandfec=1
a=rtpmap:63 red/48000/2
a=fmtp:63 111/111
a=rtpmap:9 G722/8000
a=rtpmap:102 ILBC/8000
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:13 CN/8000
a=rtpmap:110 telephone-event/48000
a=rtpmap:126 telephone-event/8000
a=ssrc:1334265160 cname:yrCNoLNkYVwUaXi2
a=ssrc:1334265160 msid:test_stream_id raspberrypi_audio
m=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 39 40 100 101 127
c=IN IP4 <IP_ADDRESS>
a=rtcp:9 IN IP4 <IP_ADDRESS>
a=ice-ufrag:S1HD
a=ice-pwd:i94ulUDBazgxV3lArAll5L8Y
a=ice-options:trickle
a=fingerprint:sha-256 F9:1A:78:45:5C:69:43:5D:DC:52:D6:70:A0:90:C8:61:53:A3:86:63:C3:64:3C:74:E7:03:01:50:16:9B:CE:7A
a=setup:passive
a=mid:1
a=extmap:14 urn:ietf:params:rtp-hdrext:toffset
a=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=extmap:13 urn:3gpp:video-orientation
a=extmap:3 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01
a=extmap:5 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay
a=extmap:6 http://www.webrtc.org/experiments/rtp-hdrext/video-content-type
a=extmap:7 http://www.webrtc.org/experiments/rtp-hdrext/video-timing
a=extmap:8 http://www.webrtc.org/experiments/rtp-hdrext/color-space
a=extmap:4 urn:ietf:params:rtp-hdrext:sdes:mid
a=extmap:10 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id
a=extmap:11 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id
a=sendonly
a=msid:test_stream_id raspberrypi_video
a=rtcp-mux
a=rtcp-rsize
a=rtpmap:96 VP8/90000
a=rtcp-fb:96 goog-remb
a=rtcp-fb:96 transport-cc
a=rtcp-fb:96 ccm fir
a=rtcp-fb:96 nack
a=rtcp-fb:96 nack pli
a=rtpmap:97 rtx/90000
a=fmtp:97 apt=96
a=rtpmap:98 VP9/90000
a=rtcp-fb:98 goog-remb
a=rtcp-fb:98 transport-cc
a=rtcp-fb:98 ccm fir
a=rtcp-fb:98 nack
a=rtcp-fb:98 nack pli
a=fmtp:98 profile-id=0
a=rtpmap:99 rtx/90000
a=fmtp:99 apt=98
a=rtpmap:39 AV1/90000
a=rtcp-fb:39 goog-remb
a=rtcp-fb:39 transport-cc
a=rtcp-fb:39 ccm fir
a=rtcp-fb:39 nack
a=rtcp-fb:39 nack pli
a=rtpmap:40 rtx/90000
a=fmtp:40 apt=39
a=rtpmap:100 red/90000
a=rtpmap:101 rtx/90000
a=fmtp:101 apt=100
a=rtpmap:127 ulpfec/90000
a=ssrc-group:FID<PHONE_NUMBER> 115193243
a=ssrc:2712533784 cname:yrCNoLNkYVwUaXi2
a=ssrc:2712533784 msid:test_stream_id raspberrypi_video
a=ssrc:115193243 cname:yrCNoLNkYVwUaXi2
a=ssrc:115193243 msid:test_stream_id raspberrypi_video
m=application 9 UDP/DTLS/SCTP webrtc-datachannel
c=IN IP4 <IP_ADDRESS>
a=ice-ufrag:S1HD
a=ice-pwd:i94ulUDBazgxV3lArAll5L8Y
a=ice-options:trickle
a=fingerprint:sha-256 F9:1A:78:45:5C:69:43:5D:DC:52:D6:70:A0:90:C8:61:53:A3:86:63:C3:64:3C:74:E7:03:01:50:16:9B:CE:7A
a=setup:passive
a=mid:2
a=sctp-port:5000
a=max-message-size:262144

Audio and Video Tracks: Present and configured as sendonly, which means the sender is transmitting audio and video but not receiving.
Data Channel: Configured for data transmission.
ICE Credentials: Present and unique.
DTLS Setup: Passive. This means the sender expects the receiver to initiate the DTLS handshake.
Codecs and Extensions: Standard codecs and extensions are listed.

Receiver SDP:
[Mosquitto] Invoke AnswerSDP: v=0
o=-<PHONE_NUMBER>120899573 2 IN IP4 <IP_ADDRESS>
s=-
t=0 0
a=group:BUNDLE 0 1 2
a=extmap-allow-mixed
a=msid-semantic: WMS
m=audio 9 UDP/TLS/RTP/SAVPF 111 63 9 102 0 8 13 110 126
c=IN IP4 <IP_ADDRESS>
a=rtcp:9 IN IP4 <IP_ADDRESS>
a=ice-ufrag:zcoW
a=ice-pwd:Z+zmz7XcAgZON7/E+x8SwPY+
a=ice-options:trickle
a=fingerprint:sha-256 19:67:44:D9:D4:AF:12:17:E1:F6:FD:DF:0E:B2:36:BE:56:A1:BA:8F:BE:9B:2E:96:F5:EA:B0:43:F7:F0:E6:E5
a=setup:active
a=mid:0
a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level
a=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=extmap:3 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01
a=extmap:4 urn:ietf:params:rtp-hdrext:sdes:mid
a=recvonly
a=rtcp-mux
a=rtpmap:111 opus/48000/2
a=rtcp-fb:111 transport-cc
a=fmtp:111 minptime=10;useinbandfec=1
a=rtpmap:63 red/48000/2
a=fmtp:63 111/111
a=rtpmap:9 G722/8000
a=rtpmap:102 ILBC/8000
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:13 CN/8000
a=rtpmap:110 telephone-event/48000
a=rtpmap:126 telephone-event/8000
m=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 39 40 100 101 127
c=IN IP4 <IP_ADDRESS>
a=rtcp:9 IN IP4 <IP_ADDRESS>
a=ice-ufrag:zcoW
a=ice-pwd:Z+zmz7XcAgZON7/E+x8SwPY+
a=ice-options:trickle
a=fingerprint:sha-256 19:67:44:D9:D4:AF:12:17:E1:F6:FD:DF:0E:B2:36:BE:56:A1:BA:8F:BE:9B:2E:96:F5:EA:B0:43:F7:F0:E6:E5
a=setup:active
a=mid:1
a=extmap:14 urn:ietf:params:rtp-hdrext:toffset
a=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=extmap:13 urn:3gpp:video-orientation
a=extmap:3 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01
a=extmap:5 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay
a=extmap:6 http://www.webrtc.org/experiments/rtp-hdrext/video-content-type
a=extmap:7 http://www.webrtc.org/experiments/rtp-hdrext/video-timing
a=extmap:8 http://www.webrtc.org/experiments/rtp-hdrext/color-space
a=extmap:4 urn:ietf:params:rtp-hdrext:sdes:mid
a=extmap:10 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id
a=extmap:11 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id
a=recvonly
a=rtcp-mux
a=rtcp-rsize
a=rtpmap:96 VP8/90000
a=rtcp-fb:96 goog-remb
a=rtcp-fb:96 transport-cc
a=rtcp-fb:96 ccm fir
a=rtcp-fb:96 nack
a=rtcp-fb:96 nack pli
a=rtpmap:97 rtx/90000
a=fmtp:97 apt=96
a=rtpmap:98 VP9/90000
a=rtcp-fb:98 goog-remb
a=rtcp-fb:98 transport-cc
a=rtcp-fb:98 ccm fir
a=rtcp-fb:98 nack
a=rtcp-fb:98 nack pli
a=fmtp:98 profile-id=0
a=rtpmap:99 rtx/90000
a=fmtp:99 apt=98
a=rtpmap:39 AV1/90000
a=rtcp-fb:39 goog-remb
a=rtcp-fb:39 transport-cc
a=rtcp-fb:39 ccm fir
a=rtcp-fb:39 nack
a=rtcp-fb:39 nack pli
a=rtpmap:40 rtx/90000
a=fmtp:40 apt=39
a=rtpmap:100 red/90000
a=rtpmap:101 rtx/90000
a=fmtp:101 apt=100
a=rtpmap:127 ulpfec/90000
m=application 9 UDP/DTLS/SCTP webrtc-datachannel
c=IN IP4 <IP_ADDRESS>
a=ice-ufrag:zcoW
a=ice-pwd:Z+zmz7XcAgZON7/E+x8SwPY+
a=ice-options:trickle
a=fingerprint:sha-256 19:67:44:D9:D4:AF:12:17:E1:F6:FD:DF:0E:B2:36:BE:56:A1:BA:8F:BE:9B:2E:96:F5:EA:B0:43:F7:F0:E6:E5
a=setup:active
a=mid:2
a=sctp-port:5000
a=max-message-size:262144

Audio and Video Tracks: Present and configured as recvonly, which means the receiver is only expecting to receive audio and video but not send.
Data Channel: Configured and matches the sender's configuration.
ICE Credentials: Present and unique.
DTLS Setup: Active. This complements the sender’s passive setup, indicating the receiver will initiate the DTLS handshake.
Codecs and Extensions: Standard codecs and extensions are listed.

Which means that:

Role Compatibility: The sender is in a passive role for DTLS and sending media (audio, video, and data), while the receiver is in an active role and set to receive media. This is correct for a typical sender-receiver setup.
Codec Compatibility: The codecs and extensions listed in both SDPs seem standard and compatible.
ICE and DTLS: Both ICE and DTLS configurations appear to be correctly set up, with unique credentials and complementary roles.

About ICE
sender ICE-related logs:
=> AddIceCandidate: end[Conductor] Inside OnIceGatheringChange

=> OnIceGatheringChange: gathering
[Conductor] ICE is now gathering
=> OnConnectionChange: connecting
[Conductor] OnConnectionChange - IsConnected: [Mosquitto] OfferICE: Received!
0, StreamingState: 1
[Conductor] Inside OnIceCandidate
[SignalingService] Invoke AnswerLocalIce
[Mosquitto] Inside AnswerLocalIce:
[Mosquitto] Invoke AnswerICE: 0, 0, candidate:3005242381 1 udp<PHONE_NUMBER> <IP_ADDRESS> 38430 typ host generation 0 ufrag sSFE network-id 3 network-cost 10
[Mosquitto] OfferICE: 0, 0, candidate:1492520864 1 udp<PHONE_NUMBER> <IP_ADDRESS> 53849 typ srflx raddr <IP_ADDRESS> rport 34972 generation 0 ufrag UzVd network-id 1
=> AddIceCandidate: start creating
MosquittoService::PublishMessage - Message published on topic: SenderAnswerICE
=> main: wait for closing!
Async function started. Initial States - IsReadyForStreaming: 1, IsConnected: 0
=> AddIceCandidate: add candidated
=> AddIceCandidate: end
[Conductor] Inside OnIceGatheringChange
=> OnIceGatheringChange: complete
[Conductor] ICE gathering is complete
[Mosquitto] OfferICE: Received!
[Mosquitto] OfferICE: 0, 0, candidate:4248489337 1 tcp<PHONE_NUMBER> <IP_ADDRESS> 43403 typ host tcptype passive generation 0 ufrag UzVd network-id 1
=> AddIceCandidate: start creating
=> AddIceCandidate: add candidated
=> AddIceCandidate: end
[Mosquitto] OfferICE: Received!
[Mosquitto] OfferICE: 0, 0, candidate:3695579394 1 tcp<PHONE_NUMBER> <IP_ADDRESS> 53689 typ host tcptype passive generation 0 ufrag UzVd network-id 4 network-cost 10
=> AddIceCandidate: start creating
=> AddIceCandidate: add candidated
=> AddIceCandidate: end
close (24) dmafd
close (25) dmafd
fd(22) is closed!
Open file /dev/video12 fd(22) success!
driver 'bcm2835-codec' on card 'bcm2835-codec-isp' in mplane mode
V4l2m2m 22 formats: BA81(32x32) -> YU12(1280x720)
driver 'bcm2835-codec' on card 'bcm2835-codec-isp' in mplane mode
V4l2m2m 22 formats: YUYV(32x32) -> YU12(960x540)
(22) 9 export dma fd: (24)
(22) 9 export dma fd: (25)
[V4l2Scaler]: prepare done
unmapped (23) buffers
unmapped (23) buffers
close (26) dmafd
close (27) dmafd
fd(23) is closed!
Open file /dev/video10 fd(23) success!
driver 'bcm2835-codec' on card 'bcm2835-codec-decode' in mplane mode
V4l2m2m 23 formats: MPG4(32x32) -> MJPG(1280x720)
V4l2m2m querying (23) 10 buffer: 0x7f89d9a000 with 524288 length
V4l2m2m querying (23) 10 buffer: 0x7f89d1a000 with 524288 length
driver 'bcm2835-codec' on card 'bcm2835-codec-decode' in mplane mode
V4l2m2m 23 formats: YU12(1280x720) -> YU12(1280x720)
(23) 9 export dma fd: (26)
(23) 9 export dma fd: (27)
[V4l2Decoder]: prepare done
close (24) dmafd
close (25) dmafd
fd(22) is closed!
Open file /dev/video12 fd(22) success!
driver 'bcm2835-codec' on card 'bcm2835-codec-isp' in mplane mode
V4l2m2m 22 formats: BA81(32x32) -> YU12(1280x720)
driver 'bcm2835-codec' on card 'bcm2835-codec-isp' in mplane mode
V4l2m2m 22 formats: YUYV(32x32) -> YU12(640x360)
(22) 9 export dma fd: (24)
(22) 9 export dma fd: (25)
[V4l2Scaler]: prepare done
unmapped (23) buffers
unmapped (23) buffers
close (26) dmafd
close (27) dmafd
fd(23) is closed!
Open file /dev/video10 fd(23) success!
driver 'bcm2835-codec' on card 'bcm2835-codec-decode' in mplane mode
V4l2m2m 23 formats: MPG4(32x32) -> MJPG(1280x720)
V4l2m2m querying (23) 10 buffer: 0x7f89d9a000 with 524288 length
V4l2m2m querying (23) 10 buffer: 0x7f89d1a000 with 524288 length
driver 'bcm2835-codec' on card 'bcm2835-codec-decode' in mplane mode
V4l2m2m 23 formats: YU12(1280x720) -> YU12(1280x720)
(23) 9 export dma fd: (26)
(23) 9 export dma fd: (27)
[V4l2Decoder]: prepare done

receiver ICE-related logs:
=> Set OnSuccess:
[Receiver] Inside OnIceGatheringChange
=> OnIceGatheringChange: gathering
[Receiver] ICE is now gathering
[Receiver] Inside OnIceCandidate
[SignalingService] Invoke AnswerLocalIce:
[Mosquitto] Inside AnswerLocalIce:
[Mosquitto] Invoke AnswerICE: 0, => main: wait for closing!
0, candidate:2213883873 1 udp<PHONE_NUMBER> <IP_ADDRESS> 34972 typ host generation 0 ufrag UzVd network-id 1
[Receiver] Inside OnIceCandidate
[SignalingService] Invoke AnswerLocalIce:
[Mosquitto] Inside AnswerLocalIce:
[Mosquitto] Invoke AnswerICE: 0, 0, candidate:2726949786 1 udp<PHONE_NUMBER> <IP_ADDRESS> 55563 typ host generation 0 ufrag UzVd network-id 4 network-cost 10
[Receiver] Inside OnIceCandidate
[SignalingService] Invoke AnswerLocalIce:
[Mosquitto] Inside AnswerLocalIce:
[Mosquitto] Invoke AnswerICE: 0, 0, candidate:1492520864 1 udp<PHONE_NUMBER> <IP_ADDRESS> 53849 typ srflx raddr <IP_ADDRESS> rport 34972 generation 0 ufrag UzVd network-id 1
=> OnConnectionChange: connecting
[Receiver] OnConnectionChange - IsConnected: 0, StreamingState: 1
[Mosquitto] OfferICE: Received!
[Mosquitto] OfferICE: 0, 0, candidate:3005242381 1 udp<PHONE_NUMBER> <IP_ADDRESS> 38430 typ host generation 0 ufrag sSFE network-id 3 network-cost 10
=> AddIceCandidate: start creating
=> AddIceCandidate: add candidated
=> OnIceConnectionChange: Checking
=> AddIceCandidate: end
[Receiver] Inside OnIceCandidate
[SignalingService] Invoke AnswerLocalIce:
[Mosquitto] Inside AnswerLocalIce:
[Mosquitto] Invoke AnswerICE: 0, 0, candidate:4248489337 1 tcp<PHONE_NUMBER> <IP_ADDRESS> 43403 typ host tcptype passive generation 0 ufrag UzVd network-id 1
[Receiver] Inside OnIceCandidate
[SignalingService] Invoke AnswerLocalIce:
[Mosquitto] Inside AnswerLocalIce:
[Mosquitto] Invoke AnswerICE: 0, 0, candidate:3695579394 1 tcp<PHONE_NUMBER> <IP_ADDRESS> 53689 typ host tcptype passive generation 0 ufrag UzVd network-id 4 network-cost 10

The ICE seems to be exchanged, however, the peer2peer connection gets stuck and never goes into kConnected status. To debug further, to both conductor and receiver I added the method OnIceConnectionChange. Also there you can see that the connections gets stuck both on sender and receiver side on => OnIceConnectionChange: Checking.
In a first attempt to debug this, I tried to use two different networks, but no success. Note that I haven't yet tested a STUN server, however two remarks on this:

I used webrtc communication on the same network before without STUN server and everything was working fine;
Specifically for my usecase, the setup is the following: receiver creates a hotpot; sender connects to it via regular wifi connection; webrtc communicatino start. In this setup, internet connection is not even contemplated and therefore a STUN server wouldn't be an option. However, if the peers are on the same local network, WebRTC should, in most cases, be able to establish a direct connection without the need for STUN or TURN servers, right?

Alright, this is it for now. I would be very grateful if could give this setup a try. Of course, I am here to answer any questions!

I added also the dependent libs including mosquitto's .so, .a and header files here: https://github.com/eliabruni/RaspberryPi_WebRTC/releases/tag/m115-v0.1.0

I just finished my vacation. I'll browse/test in these few days.
STUN server is used for going through the NAT setting. If there are no settings in the router related to NAT, I think it is not necessary. As far as I know, webrtc will grab the local IP address info from the internet setting while establishing ICE. It should work without STUN or TURN in your case.

I hope you had nice holidays!
Thanks for confirming about STUN/TURN. And thanks, I'll wait for you to have a look, in the hope I made some obvious, easy-to-catch mistake.

After running and briefly reviewing your codes, I've found a problem.
The client's SDP includes vp8, vp9, av1, but the h264 is missing. The SDP needs to pick up the desired codec and remove others on the client side [ref]. In your reciever.cpp code here seems directly copy the codecs setting from conductor.cpp. You can refer to the webrtc official client example here and left needed codec, the created SDP by webrtc will auto apply the codecs setting then.
 However, if I try to fix it this way, I get Segmentation fault on the receiver side:
./webrtc_receiver --mqtt_host=<IP_ADDRESS> --mqtt_port=2550
=> peer_connection_factory: success!
[SignalingService] Inside InitIceCallback:
[Receiver][MQTT][WithReconnect]: Attempting reconnection
iphost<IP_ADDRESS>
=> main: wait for signaling!
Successfully subscribed to topic SenderOfferSDP
Successfully subscribed to topic SenderOfferICE
Successfully subscribed to topic SenderAnswerSDP
Successfully subscribed to topic SenderAnswerICE
Connected to MQTT broker.
[Mosquitto] OfferSDP: Received!
=> SetOfferSDP: start
=> OnSignalingChange: have-remote-offer
Segmentation fault

And I suspect that this is due to the sender sending out an SDP offer which doesnt specify H264 as encoding (in this version, I made such that the initial SDP offer is sent by the sender; see here and here):
./webrtc_sender --device=/dev/video0 --fps=30 --width=1280 --height=720 --v4l2_format=h264 --enable_v4l2_dma --mqtt_host=<IP_ADDRESS> --mqtt_port=2550
=> network thread start: success!
=> worker thread start: success!
=> signaling thread start: success!
=> peer_connection_factory: success!
Open file /dev/video0 fd(21) success!
GetDeviceName(0): device_name=mmal service 16.1, unique_name=platform:bcm2835_v4l2-0
driver 'bcm2835 mmal' on card 'mmal service 16.1' in splane mode
  Fps: 30
  Rotation: 0
Use h264 format source in v4l2
V4l2m2m 21 formats: JPEG(1024x768) -> H264(1280x720)
V4l2m2m querying (21) 1 buffer: 0x7f8d27b000 with 921600 length
V4l2m2m querying (21) 1 buffer: 0x7f8d19a000 with 921600 length
Open file /dev/video12 fd(22) success!
driver 'bcm2835-codec' on card 'bcm2835-codec-isp' in mplane mode
V4l2m2m 22 formats: BA81(32x32) -> YU12(1280x720)
Open file /dev/video10 fd(23) success!
driver 'bcm2835-codec' on card 'bcm2835-codec-decode' in mplane mode
V4l2m2m 23 formats: MPG4(32x32) -> H264(1280x720)
driver 'bcm2835-codec' on card 'bcm2835-codec-isp' in mplane mode
V4l2m2m 22 formats: YUYV(32x32) -> YU12(1280x720)
V4l2m2m querying (23) 10 buffer: 0x7f8c017000 with 524288 length
V4l2m2m querying (23) 10 buffer: 0x7f67f80000 with 524288 length
driver 'bcm2835-codec' on card 'bcm2835-codec-decode' in mplane mode
V4l2m2m 23 formats: YU12(1280x720) -> YU12(1280x720)
(22) 9 export dma fd: (24)
(22) 9 export dma fd: (25)
(23) 9 export dma fd: (26)
(23) 9 export dma fd: (27)
[V4l2Scaler]: prepare done
[V4l2Decoder]: prepare done
=> InitializeRecorder: Recorder is not created!
Succeeds to create data channel
[SignalingService] Inside InitIceCallback
[Receiver][MQTT][WithReconnect]: Attempting reconnection
Successfully subscribed to topic ReceiverOfferSDP
IP <IP_ADDRESS> Port 2550
Successfully subscribed to topic ReceiverOfferICE
IP <IP_ADDRESS> Port 2550
Successfully subscribed to topic ReceiverAnswerSDP
IP <IP_ADDRESS> Port 2550
Successfully subscribed to topic ReceiverAnswerICE
IP <IP_ADDRESS> Port 2550
MQTT service is ready.
Waiting for MQTT service to be ready...
Conductor::SetSignalingDelegate - Delegate set.
Conductor::CreateOffer - Starting to create offer.
iphost<IP_ADDRESS>
=> main: Before wait for signaling - IsReadyForStreaming: 0, IsConnected: 0
=> Set OnSuccess:
Receiver::CreateOffer - Offer created. SDP: v=0
o=-<PHONE_NUMBER>881729248 2 IN IP4 <IP_ADDRESS>
s=-
t=0 0
a=group:BUNDLE 0 1 2
a=extmap-allow-mixed
a=msid-semantic: WMS test_stream_id
m=audio 9 UDP/TLS/RTP/SAVPF 111 63 9 102 0 8 13 110 126
c=IN IP4 <IP_ADDRESS>
a=rtcp:9 IN IP4 <IP_ADDRESS>
a=ice-ufrag:s0pd
a=ice-pwd:jv6OexQwJLPFfClnc1vriBbP
a=ice-options:trickle
a=fingerprint:sha-256 42:E9:60:DB:EF:83:E2:91:F3:07:CB:F5:5D:A6:6C:B1:15:B5:C3:47:06:B6:16:19:BD:2F:6F:D9:CA:DF:81:89
a=setup:actpass
a=mid:0
a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level
a=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=extmap:3 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01
a=extmap:4 urn:ietf:params:rtp-hdrext:sdes:mid
a=sendrecv
a=msid:test_stream_id raspberrypi_audio
a=rtcp-mux
a=rtpmap:111 opus/48000/2
a=rtcp-fb:111 transport-cc
a=fmtp:111 minptime=10;useinbandfec=1
a=rtpmap:63 red/48000/2
a=fmtp:63 111/111
a=rtpmap:9 G722/8000
a=rtpmap:102 ILBC/8000
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:13 CN/8000
a=rtpmap:110 telephone-event/48000
a=rtpmap:126 telephone-event/8000
a=ssrc:2234857121 cname:y7jsl6IM+o0oRDQB
a=ssrc:2234857121 msid:test_stream_id raspberrypi_audio
m=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 39 40 100 101 127
c=IN IP4 <IP_ADDRESS>
a=rtcp:9 IN IP4 <IP_ADDRESS>
a=ice-ufrag:s0pd
a=ice-pwd:jv6OexQwJLPFfClnc1vriBbP
a=ice-options:trickle
a=fingerprint:sha-256 42:E9:60:DB:EF:83:E2:91:F3:07:CB:F5:5D:A6:6C:B1:15:B5:C3:47:06:B6:16:19:BD:2F:6F:D9:CA:DF:81:89
a=setup:actpass
a=mid:1
a=extmap:14 urn:ietf:params:rtp-hdrext:toffset
a=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=extmap:13 urn:3gpp:video-orientation
a=extmap:3 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01
a=extmap:5 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay
a=extmap:6 http://www.webrtc.org/experiments/rtp-hdrext/video-content-type
a=extmap:7 http://www.webrtc.org/experiments/rtp-hdrext/video-timing
a=extmap:8 http://www.webrtc.org/experiments/rtp-hdrext/color-space
a=extmap:4 urn:ietf:params:rtp-hdrext:sdes:mid
a=extmap:10 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id
a=extmap:11 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id
a=sendrecv
a=msid:test_stream_id raspberrypi_video
a=rtcp-mux
a=rtcp-rsize
a=rtpmap:96 VP8/90000
a=rtcp-fb:96 goog-remb
a=rtcp-fb:96 transport-cc
a=rtcp-fb:96 ccm fir
a=rtcp-fb:96 nack
a=rtcp-fb:96 nack pli
a=rtpmap:97 rtx/90000
a=fmtp:97 apt=96
a=rtpmap:98 VP9/90000
a=rtcp-fb:98 goog-remb
a=rtcp-fb:98 transport-cc
a=rtcp-fb:98 ccm fir
a=rtcp-fb:98 nack
a=rtcp-fb:98 nack pli
a=fmtp:98 profile-id=0
a=rtpmap:99 rtx/90000
a=fmtp:99 apt=98
a=rtpmap:39 AV1/90000
a=rtcp-fb:39 goog-remb
a=rtcp-fb:39 transport-cc
a=rtcp-fb:39 ccm fir
a=rtcp-fb:39 nack
a=rtcp-fb:39 nack pli
a=rtpmap:40 rtx/90000
a=fmtp:40 apt=39
a=rtpmap:100 red/90000
a=rtpmap:101 rtx/90000
a=fmtp:101 apt=100
a=rtpmap:127 ulpfec/90000
a=ssrc-group:FID<PHONE_NUMBER> 624887038
a=ssrc:2208810632 cname:y7jsl6IM+o0oRDQB
a=ssrc:2208810632 msid:test_stream_id raspberrypi_video
a=ssrc:624887038 cname:y7jsl6IM+o0oRDQB
a=ssrc:624887038 msid:test_stream_id raspberrypi_video
m=application 9 UDP/DTLS/SCTP webrtc-datachannel
c=IN IP4 <IP_ADDRESS>
a=ice-ufrag:s0pd
a=ice-pwd:jv6OexQwJLPFfClnc1vriBbP
a=ice-options:trickle
a=fingerprint:sha-256 42:E9:60:DB:EF:83:E2:91:F3:07:CB:F5:5D:A6:6C:B1:15:B5:C3:47:06:B6:16:19:BD:2F:6F:D9:CA:DF:81:89
a=setup:actpass
a=mid:2
a=sctp-port:5000
a=max-message-size:262144

MosquittoService::PublishMessage - Message published on topic: SenderOfferSDP
Main - Message published to topic: SenderOfferSDP
Conductor::CreateOffer - Delegate called to send offer.

Do you mind if I refer to your code and try it out?

Quite the contrary, I would be grateful if you could give it a try!

I invited you to the repo in case it helps.

I received the video on my web receiver by mqtt successfully. I'll clean, refactor some code, and rewrite docs then merge it into main branch in recent days if I have free time.

That's great news! OK, I'll wait for updates then.

I already merged to main and updated docs.

I noticed, awesome! I am currently on holiday, once back I test it.

Hello @TzuHuanTai, I reviewed the code, which looks very well organized now! Despite that, I am still hitting the same issue though and I am not sure how to proceed. Let me try to explain it to you.
Looking at your code, I suspect that the initiative of triggering the SDP exchange is left to the frontend, correct?
What I am trying to do is the following:
Start the SDP exchange from the RPI client. The problem with that is that I get the following SDP, which I believe is dictated by these (as you can see, no trace of h264):
SDP: v=0
o=-<PHONE_NUMBER>741922904 2 IN IP4 <IP_ADDRESS>
s=-
t=0 0
a=group:BUNDLE 0 1 2
a=extmap-allow-mixed
a=msid-semantic: WMS test_stream_id
m=audio 9 UDP/TLS/RTP/SAVPF 111 63 9 102 0 8 13 110 126
c=IN IP4 <IP_ADDRESS>
a=rtcp:9 IN IP4 <IP_ADDRESS>
a=ice-ufrag:Qlek
a=ice-pwd:XbCePd/89Kp9QCcjyRr/DXyd
a=ice-options:trickle
a=fingerprint:sha-256 C0:4A:29:57:55:C8:A4:77:83:88:87:0A:1B:18:E1:A6:B8:F4:21:7C:53:C2:E0:B8:F7:11:90:24:94:FF:23:89
a=setup:actpass
a=mid:0
a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level
a=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=extmap:3 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01
a=extmap:4 urn:ietf:params:rtp-hdrext:sdes:mid
a=sendrecv
a=msid:test_stream_id raspberrypi_audio
a=rtcp-mux
a=rtpmap:111 opus/48000/2
a=rtcp-fb:111 transport-cc
a=fmtp:111 minptime=10;useinbandfec=1
a=rtpmap:63 red/48000/2
a=fmtp:63 111/111
a=rtpmap:9 G722/8000
a=rtpmap:102 ILBC/8000
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:13 CN/8000
a=rtpmap:110 telephone-event/48000
a=rtpmap:126 telephone-event/8000
a=ssrc:493255696 cname:4gyOrv5Ca0nKtKEk
a=ssrc:493255696 msid:test_stream_id raspberrypi_audio
m=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 39 40 100 101 127
c=IN IP4 <IP_ADDRESS>
a=rtcp:9 IN IP4 <IP_ADDRESS>
a=ice-ufrag:Qlek
a=ice-pwd:XbCePd/89Kp9QCcjyRr/DXyd
a=ice-options:trickle
a=fingerprint:sha-256 C0:4A:29:57:55:C8:A4:77:83:88:87:0A:1B:18:E1:A6:B8:F4:21:7C:53:C2:E0:B8:F7:11:90:24:94:FF:23:89
a=setup:actpass
a=mid:1
a=extmap:14 urn:ietf:params:rtp-hdrext:toffset
a=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=extmap:13 urn:3gpp:video-orientation
a=extmap:3 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01
a=extmap:5 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay
a=extmap:6 http://www.webrtc.org/experiments/rtp-hdrext/video-content-type
a=extmap:7 http://www.webrtc.org/experiments/rtp-hdrext/video-timing
a=extmap:8 http://www.webrtc.org/experiments/rtp-hdrext/color-space
a=extmap:4 urn:ietf:params:rtp-hdrext:sdes:mid
a=extmap:10 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id
a=extmap:11 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id
a=sendrecv
a=msid:test_stream_id raspberrypi_video
a=rtcp-mux
a=rtcp-rsize
a=rtpmap:96 VP8/90000
a=rtcp-fb:96 goog-remb
a=rtcp-fb:96 transport-cc
a=rtcp-fb:96 ccm fir
a=rtcp-fb:96 nack
a=rtcp-fb:96 nack pli
a=rtpmap:97 rtx/90000
a=fmtp:97 apt=96
a=rtpmap:98 VP9/90000
a=rtcp-fb:98 goog-remb
a=rtcp-fb:98 transport-cc
a=rtcp-fb:98 ccm fir
a=rtcp-fb:98 nack
a=rtcp-fb:98 nack pli
a=fmtp:98 profile-id=0
a=rtpmap:99 rtx/90000
a=fmtp:99 apt=98
a=rtpmap:39 AV1/90000
a=rtcp-fb:39 goog-remb
a=rtcp-fb:39 transport-cc
a=rtcp-fb:39 ccm fir
a=rtcp-fb:39 nack
a=rtcp-fb:39 nack pli
a=rtpmap:40 rtx/90000
a=fmtp:40 apt=39
a=rtpmap:100 red/90000
a=rtpmap:101 rtx/90000
a=fmtp:101 apt=100
a=rtpmap:127 ulpfec/90000
a=ssrc-group:FID 755891420<PHONE_NUMBER>
a=ssrc:755891420 cname:4gyOrv5Ca0nKtKEk
a=ssrc:755891420 msid:test_stream_id raspberrypi_video
a=ssrc:1925509087 cname:4gyOrv5Ca0nKtKEk
a=ssrc:1925509087 msid:test_stream_id raspberrypi_video
m=application 9 UDP/DTLS/SCTP webrtc-datachannel
c=IN IP4 <IP_ADDRESS>
a=ice-ufrag:Qlek
a=ice-pwd:XbCePd/89Kp9QCcjyRr/DXyd
a=ice-options:trickle
a=fingerprint:sha-256 C0:4A:29:57:55:C8:A4:77:83:88:87:0A:1B:18:E1:A6:B8:F4:21:7C:53:C2:E0:B8:F7:11:90:24:94:FF:23:89
a=setup:actpass
a=mid:2
a=sctp-port:5000
a=max-message-size:262144

In fact, if I replace those with the following:
          webrtc::OpenH264DecoderTemplateAdapter>>();
        //   webrtc::LibvpxVp8DecoderTemplateAdapter,
        //   webrtc::LibvpxVp9DecoderTemplateAdapter,
        //   webrtc::Dav1dDecoderTemplateAdapter>>();

I get an incomplete offer (no trace of h264 either):
DP: v=0
o=-<PHONE_NUMBER>4357602 2 IN IP4 <IP_ADDRESS>
s=-
t=0 0
a=group:BUNDLE 0 1 2
a=extmap-allow-mixed
a=msid-semantic: WMS test_stream_id
m=audio 9 UDP/TLS/RTP/SAVPF 111 63 9 102 0 8 13 110 126
c=IN IP4 <IP_ADDRESS>
a=rtcp:9 IN IP4 <IP_ADDRESS>
a=ice-ufrag:0dRW
a=ice-pwd:fa8Ek9RHvtBjAXQ7U/J8UE8a
a=ice-options:trickle
a=fingerprint:sha-256 AD:CE:58:B3:35:9C:DD:97:61:BD:8C:42:F2:64:8C:0C:6F:BF:0A:C4:DF:2B:BB:03:FB:2B:2D:3D:78:27:77:29
a=setup:actpass
a=mid:0
a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level
a=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=extmap:3 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01
a=extmap:4 urn:ietf:params:rtp-hdrext:sdes:mid
a=sendrecv
a=msid:test_stream_id raspberrypi_audio
a=rtcp-mux
a=rtpmap:111 opus/48000/2
a=rtcp-fb:111 transport-cc
a=fmtp:111 minptime=10;useinbandfec=1
a=rtpmap:63 red/48000/2
a=fmtp:63 111/111
a=rtpmap:9 G722/8000
a=rtpmap:102 ILBC/8000
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:13 CN/8000
a=rtpmap:110 telephone-event/48000
a=rtpmap:126 telephone-event/8000
a=ssrc:2144757454 cname:F1Y/YlumvstoW2ni
a=ssrc:2144757454 msid:test_stream_id raspberrypi_audio
m=video 9 UDP/TLS/RTP/SAVPF 0
c=IN IP4 <IP_ADDRESS>
a=rtcp:9 IN IP4 <IP_ADDRESS>
a=ice-ufrag:0dRW
a=ice-pwd:fa8Ek9RHvtBjAXQ7U/J8UE8a
a=ice-options:trickle
a=fingerprint:sha-256 AD:CE:58:B3:35:9C:DD:97:61:BD:8C:42:F2:64:8C:0C:6F:BF:0A:C4:DF:2B:BB:03:FB:2B:2D:3D:78:27:77:29
a=setup:actpass
a=mid:1
a=extmap:14 urn:ietf:params:rtp-hdrext:toffset
a=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=extmap:13 urn:3gpp:video-orientation
a=extmap:3 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01
a=extmap:5 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay
a=extmap:6 http://www.webrtc.org/experiments/rtp-hdrext/video-content-type
a=extmap:7 http://www.webrtc.org/experiments/rtp-hdrext/video-timing
a=extmap:8 http://www.webrtc.org/experiments/rtp-hdrext/color-space
a=extmap:4 urn:ietf:params:rtp-hdrext:sdes:mid
a=extmap:10 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id
a=extmap:11 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id
a=sendrecv
a=msid:test_stream_id raspberrypi_video
a=rtcp-mux
a=rtcp-rsize
a=ssrc:309919679 cname:F1Y/YlumvstoW2ni
a=ssrc:309919679 msid:test_stream_id raspberrypi_video
m=application 9 UDP/DTLS/SCTP webrtc-datachannel
c=IN IP4 <IP_ADDRESS>
a=ice-ufrag:0dRW
a=ice-pwd:fa8Ek9RHvtBjAXQ7U/J8UE8a
a=ice-options:trickle
a=fingerprint:sha-256 AD:CE:58:B3:35:9C:DD:97:61:BD:8C:42:F2:64:8C:0C:6F:BF:0A:C4:DF:2B:BB:03:FB:2B:2D:3D:78:27:77:29
a=setup:actpass
a=mid:2
a=sctp-port:5000
a=max-message-size:262144

Now, if I instead try to kickstart the SDP offer from my receiver, I get an even smaller SDP offer and that's because all the RTP capabilities are to be inferred from the conductor (i.e., I dont create any tracks on the receiver side):
SDP: v=0
o=-<PHONE_NUMBER>20187586 2 IN IP4 <IP_ADDRESS>
s=-
t=0 0
a=extmap-allow-mixed
a=msid-semantic: WMS

I am quite puzzled and do not understand what am I missing in this logic.

Yes, my frontend leaves the specific codec info to decide it.
Maybe you need to recompile the libwebrtc.a because rtc_use_h264=false is used in our instructions.
The macro WEBRTC_USE_H264 is assigned false, so the h264 will never appear in SDP. ref

Hello @TzuHuanTai , thanks again for the hint. Let me paste here the progress I made so far (problem not solved yet).
First, I check ffmpeg's h264 availability:
ffmpeg -codecs | grep 'h264_omx\|h264_v4l2m2m'
ffmpeg version 4.3.6-0+deb11u1+rpt5 Copyright (c) 2000-2023 the FFmpeg developers
  built with gcc 10 (Debian 10.2.1-6)
  configuration: --prefix=/usr --extra-version=0+deb11u1+rpt5 --toolchain=hardened --incdir=/usr/include/aarch64-linux-gnu --enable-gpl --disable-stripping --enable-avresample --disable-filter=resample --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libdav1d --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librabbitmq --enable-librsvg --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opencl --enable-opengl --enable-sdl2 --disable-mmal --enable-neon --enable-v4l2-request --enable-libudev --enable-epoxy --enable-sand --libdir=/usr/lib/aarch64-linux-gnu --arch=arm64 --enable-pocketsphinx --enable-libdc1394 --enable-libdrm --enable-vout-drm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libx264 --enable-shared
  libavutil      56. 51.100 / 56. 51.100
  libavcodec     58. 91.100 / 58. 91.100
  libavformat    58. 45.100 / 58. 45.100
  libavdevice    58. 10.100 / 58. 10.100
  libavfilter     7. 85.100 /  7. 85.100
  libavresample   4.  0.  0 /  4.  0.  0
  libswscale      5.  7.100 /  5.  7.100
  libswresample   3.  7.100 /  3.  7.100
  libpostproc    55.  7.100 / 55.  7.100
 DEV.LS h264                 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (decoders: h264 h264_v4l2m2m ) (encoders: libx264 libx264rgb h264_omx h264_v4l2m2m h264_vaapi )

Them following this, I recompile libwertc.a with the following command:
gn gen out/Release64 --args='target_os="linux" target_cpu="arm64" rtc_include_tests=false rtc_use_h264=true proprietary_codecs=true ffmpeg_branding = "Chrome" use_rtti=true is_component_build=false is_debug=false rtc_build_examples=false use_custom_libcxx=false rtc_build_tools=false rtc_use_pipewire=false clang_base_path="/home/pi/clang+llvm-16.0.6-aarch64-linux-gnu" clang_use_chrome_plugins=false'

Then, I recompile pi_webrtc using the new libwertc.a. Then, I try again the same trick on the conductor:
          webrtc::OpenH264DecoderTemplateAdapter>>();
        //   webrtc::LibvpxVp8DecoderTemplateAdapter,
        //   webrtc::LibvpxVp9DecoderTemplateAdapter,
        //   webrtc::Dav1dDecoderTemplateAdapter>>();

And I print the offer like this, in the main:
 auto conductor = Conductor::Create(args);
      // Conductor-specific logic
      while (true) {
          if (!conductor->CreatePeerConnection()) {
              std::cerr << "Failed to create Peer Connection." << std::endl;
              continue;
          }

          std::cout << "=> main: Peer Connection created." << std::endl;

          conductor->CreateOffer();

and here is CreateOffer:
void Conductor::CreateOffer() {
  std::cout << "Conductor::CreateOffer - Starting to create offer." << std::endl;

  auto on_offer_created = [this](webrtc::SessionDescriptionInterface* desc) {
      std::string sdp;
      desc->ToString(&sdp);
      std::cout << "Conductor::CreateOffer - Offer created. SDP: " << sdp << std::endl;
   }

but that's what I get:
./pi_webrtc --device=/dev/video0 --fps=30 --width=1280 --height=720  --mqtt_host=<IP_ADDRESS> --mqtt_port=2550  --enable_v4l2_dma
=> network thread start: success!
=> worker thread start: success!
=> signaling thread start: success!
=> peer_connection_factory: success!
Open file /dev/video0 fd(21) success!
GetDeviceName(0): device_name=mmal service 16.1, unique_name=platform:bcm2835_v4l2-0
driver 'bcm2835 mmal' on card 'mmal service 16.1' in splane mode
Fps: 30
Rotation: 0
Use mjpeg format source in v4l2
V4l2m2m 21 formats: H264(1280x720) -> MJPG(1280x720)
V4l2m2m querying (21) 1 buffer: 0x7f90385000 with 921600 length
V4l2m2m querying (21) 1 buffer: 0x7f902a4000 with 921600 length
Open file /dev/video10 fd(22) success!
driver 'bcm2835-codec' on card 'bcm2835-codec-decode' in mplane mode
V4l2m2m 22 formats: MPG4(32x32)Open file /dev/video12 fd(23) success!
driver 'bcm2835-codec' on card 'bcm2835-codec-isp' in mplane mode
V4l2m2m 23 formats: BA81(32x32) -> MJPG(1280x720)
-> YU12(1280x720)
driver 'bcm2835-codec' on card 'bcm2835-codec-isp' in mplane mode
V4l2m2m 23 formats: YUYV(32x32) -> YU12(1280x720)
V4l2m2m querying (22) 10 buffer: 0x7f90123000 with 524288 length
V4l2m2m querying (22) 10 buffer: 0x7f900a3000 with 524288 length
driver 'bcm2835-codec' on card 'bcm2835-codec-decode' in mplane mode
V4l2m2m 22 formats: YU12(1280x720) -> YU12(1280x720)
(23) 9 export dma fd: (24)
(23) 9 export dma fd: (25)
(22) 9 export dma fd: (26)
(22) 9 export dma fd: (27)
[V4l2Scaler]: prepare done
[V4l2Decoder]: prepare done
[Conductor] Recorder is not created!
Succeeds to create data channel
Successfully subscribed to topic: OfferSDP
Successfully subscribed to topic: OfferICE
MQTT service is ready.
=> main: Peer Connection created.
Conductor::CreateOffer - Starting to create offer.
=> Set OnSuccess:
=> main: Offer created and sent.
=> main: wait for signaling!
Conductor::CreateOffer - Offer created. SDP: v=0
o=-<PHONE_NUMBER>528006577 2 IN IP4 <IP_ADDRESS>
s=-
t=0 0
a=group:BUNDLE 0 1 2
a=extmap-allow-mixed
a=msid-semantic: WMS test_stream_id
m=audio 9 UDP/TLS/RTP/SAVPF 111 63 9 102 0 8 13 110 126
c=IN IP4 <IP_ADDRESS>
a=rtcp:9 IN IP4 <IP_ADDRESS>
a=ice-ufrag:OFAd
a=ice-pwd:RiIf2yatr/uMhH5VCkBFMq59
a=ice-options:trickle
a=fingerprint:sha-256 10:2E:9E:C5:17:44:73:FD:32:3B:67:37:54:24:9F:EE:3A:11:AF:17:27:40:5E:C3:21:97:8B:EE:17:DD:7D:98
a=setup:actpass
a=mid:0
a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level
a=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=extmap:3 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01
a=extmap:4 urn:ietf:params:rtp-hdrext:sdes:mid
a=sendrecv
a=msid:test_stream_id raspberrypi_audio
a=rtcp-mux
a=rtpmap:111 opus/48000/2
a=rtcp-fb:111 transport-cc
a=fmtp:111 minptime=10;useinbandfec=1
a=rtpmap:63 red/48000/2
a=fmtp:63 111/111
a=rtpmap:9 G722/8000
a=rtpmap:102 ILBC/8000
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:13 CN/8000
a=rtpmap:110 telephone-event/48000
a=rtpmap:126 telephone-event/8000
a=ssrc:4124206175 cname:dPIg9Nrs2Ke4BkjC
a=ssrc:4124206175 msid:test_stream_id raspberrypi_audio
m=video 9 UDP/TLS/RTP/SAVPF 0
c=IN IP4 <IP_ADDRESS>
a=rtcp:9 IN IP4 <IP_ADDRESS>
a=ice-ufrag:OFAd
a=ice-pwd:RiIf2yatr/uMhH5VCkBFMq59
a=ice-options:trickle
a=fingerprint:sha-256 10:2E:9E:C5:17:44:73:FD:32:3B:67:37:54:24:9F:EE:3A:11:AF:17:27:40:5E:C3:21:97:8B:EE:17:DD:7D:98
a=setup:actpass
a=mid:1
a=extmap:14 urn:ietf:params:rtp-hdrext:toffset
a=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=extmap:13 urn:3gpp:video-orientation
a=extmap:3 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01
a=extmap:5 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay
a=extmap:6 http://www.webrtc.org/experiments/rtp-hdrext/video-content-type
a=extmap:7 http://www.webrtc.org/experiments/rtp-hdrext/video-timing
a=extmap:8 http://www.webrtc.org/experiments/rtp-hdrext/color-space
a=extmap:4 urn:ietf:params:rtp-hdrext:sdes:mid
a=extmap:10 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id
a=extmap:11 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id
a=sendrecv
a=msid:test_stream_id raspberrypi_video
a=rtcp-mux
a=rtcp-rsize
a=ssrc:3237880866 cname:dPIg9Nrs2Ke4BkjC
a=ssrc:3237880866 msid:test_stream_id raspberrypi_video
m=application 9 UDP/DTLS/SCTP webrtc-datachannel
c=IN IP4 <IP_ADDRESS>
a=ice-ufrag:OFAd
a=ice-pwd:RiIf2yatr/uMhH5VCkBFMq59
a=ice-options:trickle
a=fingerprint:sha-256 10:2E:9E:C5:17:44:73:FD:32:3B:67:37:54:24:9F:EE:3A:11:AF:17:27:40:5E:C3:21:97:8B:EE:17:DD:7D:98
a=setup:actpass
a=mid:2
a=sctp-port:5000
a=max-message-size:262144

I might have fixed it. In the project CMakeLists.txt I added WEBRTC_USE_H264 globally:
add_compile_definitions(
    WEBRTC_POSIX
    WEBRTC_LINUX
    USE_CPPRESTSDK
    WEBRTC_USE_H264
)

that's because, despite flagging it during libwertc.a compilation, it was still not set within the pi_webrtc project. Now, using this expanded CreateOffer function:
void Conductor::CreateOffer() {

    #ifdef WEBRTC_USE_H264
        std::cout << "Conductor::CreateOffer - WEBRTC_USE_H264 is defined.\n";
        auto supportedCodecs = webrtc::SupportedH264DecoderCodecs();
        std::cout << "Conductor::CreateOffer - Supported H264 Decoder Codecs: ";
        for (const auto& codec : supportedCodecs) {
            std::cout << codec.name << " ";
        }
        std::cout << std::endl;
    #else
        std::cout << "WEBRTC_USE_H264 is not defined.\n";
    #endif

    std::cout << "Conductor::CreateOffer - Starting to create offer." << std::endl;

    auto on_offer_created = [this](webrtc::SessionDescriptionInterface* desc) {
        std::string sdp;
        desc->ToString(&sdp);
        std::cout << "Conductor::CreateOffer - Offer created. SDP: " << sdp << std::endl;
       }
    }

I get this offer from the conductor (relevant output in bold):
./pi_webrtc --device=/dev/video0 --fps=30 --width=1280 --height=720 --v4l2_format=h264 --mqtt_host=<IP_ADDRESS> --mqtt_port=2550  --enable_v4l2_dma
=> network thread start: success!
=> worker thread start: success!
=> signaling thread start: success!
=> peer_connection_factory: success!
Open file /dev/video0 fd(21) success!
GetDeviceName(0): device_name=mmal service 16.1, unique_name=platform:bcm2835_v4l2-0
driver 'bcm2835 mmal' on card 'mmal service 16.1' in splane mode
  Fps: 30
  Rotation: 0
Use h264 format source in v4l2
V4l2m2m 21 formats: H264(1280x720) -> H264(1280x720)
V4l2m2m querying (21) 1 buffer: 0x7f81bc0000 with 921600 length
V4l2m2m querying (21) 1 buffer: 0x7f81adf000 with 921600 length
Open file /dev/video12 fd(22) success!
driver 'bcm2835-codec' on card 'bcm2835-codec-isp' in mplane mode
V4l2m2m 22 formats: BA81(32x32) -> YU12(1280x720)
Open file /dev/video10 fd(23) success!
driver 'bcm2835-codec' on card 'bcm2835-codec-decode' in mplane mode
V4l2m2m 23 formats: MPG4(32x32) -> H264(1280x720)
driver 'bcm2835-codec' on card 'bcm2835-codec-isp' in mplane mode
V4l2m2m 22 formats: YUYV(32x32) -> YU12(1280x720)
(22) 9 export dma fd: (24)
(22) 9 export dma fd: (25)
V4l2m2m querying (23) 10 buffer: 0x7f8095c000 with 524288 length
V4l2m2m querying (23) 10 buffer: 0x7f808dc000 with 524288 length
driver 'bcm2835-codec' on card 'bcm2835-codec-decode' in mplane mode
V4l2m2m 23 formats: YU12(1280x720) -> YU12(1280x720)
(23) 9 export dma fd: (26)
(23) 9 export dma fd: (27)
[V4l2Scaler]: prepare done
[V4l2Decoder]: prepare done
[Conductor] Recorder is not created!
Succeeds to create data channel
=> main: Peer Connection created.
**Conductor::CreateOffer - WEBRTC_USE_H264 is defined.
Conductor::CreateOffer - Supported H264 Decoder Codecs: H264 H264 H264 H264 H264 H264 H264 H264**
Conductor::CreateOffer - Starting to create offer.
Successfully subscribed to topic: OfferSDP
Successfully subscribed to topic: OfferICE
MQTT service is ready.
=> Set OnSuccess:
=> main: Offer created and sent.
=> main: wait for signaling!
Conductor::CreateOffer - Offer created.  Then use the openh264 with your receiver. I think it'll work.
media_dependencies.video_encoder_factory = std::make_unique<webrtc::VideoEncoderFactoryTemplate<
          webrtc::OpenH264EncoderTemplateAdapter>>();
media_dependencies.video_decoder_factory = std::make_unique<webrtc::VideoDecoderFactoryTemplate<
          webrtc::OpenH264DecoderTemplateAdapter>>();


not available in HACS list

the readme states that this integration can be installed with HACS
however, it is not available in HACS

did not realize that this is a "custom" repository
it can be added following the HACS guide for adding custom repositories (link)

I could probably clear this up in the README.md though...

I can add the cutom component just fine, but when i want to add it via configuration/integrations it's nowhere to be found. I've added plenty of custom hacs components so i'm decently sure i'm not doing it wrong.
Here is my info, perhaps it's a new "feature" of the latest HA? ;)
System Health

version
core-2021.7.4

installation_type
Home Assistant OS

dev
false

hassio
true

docker
true

virtualenv
false

python_version
3.9.5

os_name
Linux

os_version
5.10.53

arch
x86_64

timezone
Europe/Stockholm

Home Assistant Community Store

GitHub API
ok

Github API Calls Remaining
4988

Installed Version
1.13.2

Stage
running

Available Repositories
847

Installed Repositories
23

Home Assistant Supervisor

host_os
Home Assistant OS 6.2

update_channel
stable

supervisor_version
supervisor-2021.06.8

docker_version
20.10.6

disk_total
62.3 GB

disk_used
24.3 GB

healthy
true

supported
true

board
ova

supervisor_api
ok

version_api
ok

installed_addons
Home Assistant Google Drive Backup (0.104.3), Mosquitto broker (6.0.1), Grafana (7.0.1), Duck DNS (1.12.5), InfluxDB (4.1.1), Visual Studio Code (3.5.0), A better presence (1.2.0), ESPHome (1.19.4), TasmoAdmin (0.15.0), DahuaVTO2MQTT (1.0.2)

Lovelace

dashboards
2

resources
13

views
18

mode
yaml

I have had issues with custom integrations as well from time to time, but usually a restart of HA fixes it.  Has it showed up for you since, @gurkburk76?


Include new Python syntax check

Hi, I wanted to include the python syntax from here: https://github.com/hdima/python-syntax
but I don't know how to make it work. If anybody knows how to set it up, please let me know. Thanks!

Syntastic is about syntax checking, not about syntax highlighting.


Add UUID support

https://github.com/thinkaurelius/titan/issues/887
This request adds a UUID serializer.
Strings and Java UUID objects are supported allowing roundtrip via GSON.
Internally UUIDs are stored as two longs.

Hi @BrynCooke,
This PR should consider the data type register in ElasticSearchIndex, isn't it?

@dalaro Should I add mixed index support at the same time? I don't think this will be too difficult.

@BrynCooke Sure, why not ;-)

@BrynCooke so also fix #769 :)


Setup issue

Hi everyone,
I was just trying to install tract_querier and got the following error after running "python setup.py install":
Installed /home/neher/.local/lib/python2.7/site-packages/tract_querier-0.1-py2.7.egg
Traceback (most recent call last):
  File "setup.py", line 55, in <module>
    **(configuration().todict())
  File "/usr/lib/python2.7/distutils/core.py", line 151, in setup
    dist.run_commands()
  File "/usr/lib/python2.7/distutils/dist.py", line 953, in run_commands
    self.run_command(cmd)
  File "/usr/lib/python2.7/distutils/dist.py", line 972, in run_command
    cmd_obj.run()
  File "/home/neher/.local/lib/python2.7/site-packages/setuptools/command/install.py", line 74, in run
    self.do_egg_install()
  File "/home/neher/.local/lib/python2.7/site-packages/setuptools/command/install.py", line 97, in do_egg_install
    cmd.run()
  File "/home/neher/.local/lib/python2.7/site-packages/setuptools/command/easy_install.py", line 358, in run
    self.easy_install(spec, not self.no_deps)
  File "/home/neher/.local/lib/python2.7/site-packages/setuptools/command/easy_install.py", line 574, in easy_install
    return self.install_item(None, spec, tmpdir, deps, True)
  File "/home/neher/.local/lib/python2.7/site-packages/setuptools/command/easy_install.py", line 625, in install_item
    self.process_distribution(spec, dist, deps)
  File "/home/neher/.local/lib/python2.7/site-packages/setuptools/command/easy_install.py", line 666, in process_distribution
    distreq.project_name, distreq.specs, requirement.extras
TypeError: __init__() takes exactly 2 arguments (4 given)

Any suggestions what might cause this?
Cheers,
Peter

Hi!
Could you also report the version of distutils installed in your system for better debugging?

distutils is version 2.7.12

Dear @peterneher I have not been able to reproduce this bug. However, I pushed some minor changes to the tool. Would you mind verifying if it works now?

Unfortunately it still doesn't work. But I will let you know if I figure it out.

Weird,
Could you start a virtual environment (with venv) and try installing it there?

Hi Demian, sorry for the late reply. I didn't try it but my colleague @wasserth did. It works fine in a virtualenv but on his normal linux he encountered the same issue.
Maybe it's actually possible to ignore it. But when I encountered the following isse with my faulty installiation, I thought it might be caused by the installation problems: https://github.com/demianw/tract_querier/issues/33
Turns out that this is not the case.

Hm, weird. I tried installing it in different linux boxes and it worked. Maybe it is a problem of a tune-up that your linux distro has? I tried to install this on my Apple computer on the system python distribution at in t worked.
Could you please specify the linux distribution you are using?

I'm using ubuntu 16.04

OK, I will try to check the linux distribution in ubuntu. However different continuous integration frameworks work well so it might be a specific problem with ubuntu. I'd recommend to use miniconda or anaconda as a main python installation.

@peterneher The last updates should fix the bug. Could you please verify if this works now?

@demianw Everything works like a charm now!

Great!


setAttributes replacement

Hi,
We rely quite a lot on the setAttributes api to be able to change the css (used with css modules) depending on the size of the container. What is the migration path, now that it is removed ?
I would really like not doing it in the js via inline styles.
Thanks, keep up the good work :)

Thanks for your feedback. In your wrapped component, you need to use containerQuery property to specify class names on the root element:
import classnames from 'classnames';

...

...

This way, in you CSS you can just use class name selector instead of attribute selector. Does this work for you?

Not really, since I use css modules, classnames are namespaced automatically, and adding a :global keyword on each container query class is not clean.

I see, what about using something like this? This way you can not only use CSS module, but hash query names as well.
import css from 'css.css';

class MyComponent extends Component {
  render() {
    return (

the box

    );
  }
}

const query = {
  // Define queries using ES6 enhanced object literals computed (dynamic) property names
  [css['width-between-400-and-599']]: {
    minWidth: 400,
    maxWidth: 599
  },
  [css['width-larger-than-600']]: {
    minWidth: 600,
  }
};

const HigherOrderComponent = applyContainerQuery(MyComponent, query);

Let me know if this works for you.

It seems to work nicely :) I am in the process of converting everything, I'll let you know if I hit any issues.

Closing, seems like this is resolved.


Key mappings don't work when Visual Studio has focus

Microsoft PowerToys version
0.66.0
Installation method
GitHub, PowerToys auto-update
Running as admin
No
Area(s) with issue?
Keyboard Manager
Steps to reproduce
Set up Keyboard Manager to swap Caps Lock with Control, and Left Win with Left Alt.
Exercise the remapped keys, see that they are swapped as requested.
Run Visual Studio.
Exercise the remapped keys again.

✔ Expected Behavior
I expected the remapped keys to still be remapped when Visual Studio has focus.
❌ Actual Behavior
Instead, the keys behave according to their original function with no remapping applied. As soon as focus leaves Visual Studio, remapping resumes.
For example, press remapped Win in Visual Studio, and the menu bar pops up. Press remapped Alt in Visual Studio, and the Windows menu appears. Now that focus has left Visual Studio, press remapped Win and the Windows menu disappears.
Other Software
Microsoft Visual Studio Community 2022 (64-bit)
Version 17.4.4
running on Windows 10 21H2

It seems intermittent. I'm using VsVim 2022 and it works for the most part but sometimes not. Ctrl-[ will sometimes put caps lock on. Remapped Insert will turn capslock off until next time it fails.
Powertools 0.69.1.

I have the same problem. Kyeboard Manager works fine everywhere except the Visual Studio 2022.
Other Information
Windows 10 Enterprise 22H2
Microsoft Visual Studio Enterprise 2022 (64-bit) Version 17.6.5

If you run VS as Admin, you need to run PowerToys as admin as well
https://powertoys.io/keyboard-manager-utility-for-windows/
https://stackoverflow.com/questions/67593307/microsoft-powertoys-key-mapping-not-working-in-visual-studio


Standard deviation crashes Eve; doesn't allow restart

I've had two errors when trying to use the standard deviation function.  The first occurred when I tried to use it without chunking the data:
thread '<main>' panicked at 'index out of bounds: the len is 1 but the index is 1', ../src/libcollections/vec.rs:1263
stack backtrace:
   1:     0x7f15f69a38ce - sys::backtrace::write::h7f613ce09e7b1d1d5As
   2:     0x7f15f69a7166 - panicking::on_panic::he6322b413efd100fGFx
   3:     0x7f15f699669e - rt::unwind::begin_unwind_inner::h16a4850d896eee23R6w
   4:     0x7f15f69970c6 - rt::unwind::begin_unwind_fmt::hc997fb3d79d46a00X5w
   5:     0x7f15f69a6b36 - rust_begin_unwind
   6:     0x7f15f69d7794 - panicking::panic_fmt::hbcb2030cdfd213bbTgC
   7:     0x7f15f69d4417 - panicking::panic_bounds_check::hb124856f262b042eZfC
   8:     0x7f15f6645334 - vec::Vec<T>.Index<usize>::index::h8037228215804762499
                        at ../src/libcollections/vec.rs:1263
   9:     0x7f15f665206e - view::join_step::closure.19696
                        at src/view.rs:178
  10:     0x7f15f6651f88 - iter::Iterator::all::h3754851288281946283
                        at ../src/libcore/iter.rs:637
  11:     0x7f15f664bcdb - view::join_step::ha252f10e16365937Msb
                        at src/view.rs:177
  12:     0x7f15f664b852 - view::join_step::ha252f10e16365937Msb
                        at src/view.rs:157
  13:     0x7f15f664b852 - view::join_step::ha252f10e16365937Msb
                        at src/view.rs:157
  14:     0x7f15f664bd49 - view::join_step::ha252f10e16365937Msb
                        at src/view.rs:182
  15:     0x7f15f664b852 - view::join_step::ha252f10e16365937Msb
                        at src/view.rs:157
  16:     0x7f15f6652c69 - view::View::run::h782c809da55f9bd3myb
                        at src/view.rs:226
  17:     0x7f15f6671da4 - flow::Flow::recalculate::h822a4f7b8118f7c2DSb
                        at src/flow.rs:165
  18:     0x7f15f6676a16 - flow::Flow::quiesce::hd82d1002a53b941e7Wb
                        at src/flow.rs:198
  19:     0x7f15f67dba5a - server::handle_event::h09e10dc5e4cfe402Ibl
                        at src/server.rs:214
  20:     0x7f15f67deeab - server::run::hf62aec871edbc828Khl
                        at src/server.rs:285
  21:     0x7f15f660242a - main::haf3dba23e5e43d0aiaa
                        at src/bin/server.rs:11
  22:     0x7f15f69a6a8d - __rust_try
  23:     0x7f15f69a8e2a - rt::lang_start::h996e83640adddea1BAx
  24:     0x7f15f66070fb - main
  25:     0x7f15f57c8ec4 - __libc_start_main
  26:     0x7f15f66022e8 - <unknown>
  27:                0x0 - <unknown>
An unknown error occurred

I've been having trouble reproducing this error.
The second occurred after chunking the data:
thread '<main>' panicked at 'Found a NaN', ../src/libcore/option.rs:331
stack backtrace:
   1:     0x7f454cefa8ce - sys::backtrace::write::h7f613ce09e7b1d1d5As
   2:     0x7f454cefe166 - panicking::on_panic::he6322b413efd100fGFx
   3:     0x7f454ceed69e - rt::unwind::begin_unwind_inner::h16a4850d896eee23R6w
   4:     0x7f454ceee0c6 - rt::unwind::begin_unwind_fmt::hc997fb3d79d46a00X5w
   5:     0x7f454cefdb36 - rust_begin_unwind
   6:     0x7f454cf2e794 - panicking::panic_fmt::hbcb2030cdfd213bbTgC
   7:     0x7f454cb66835 - option::Option<T>::expect::h9876372140545173510
                        at ../src/libcore/macros.rs:28
   8:     0x7f454cb666f7 - value::Value.Ord::cmp::h3e41548deb63d5d8iwa
                        at src/value.rs:45
   9:     0x7f454cb7c657 - cmp::impls::_&'a A.Ord::cmp::h3113803495262884271
                        at ../src/libcore/cmp.rs:592
  10:     0x7f454cb7c57e - iter::order::cmp::h12146281612936117754
                        at ../src/libcore/iter.rs:3220
  11:     0x7f454cb7c47e - slice::_[T].Ord::cmp::h9449930615456791927
                        at ../src/libcore/slice.rs:1527
  12:     0x7f454cb7c3fe - vec::Vec<T>.Ord::cmp::h10484112555876818300
                        at ../src/libcollections/vec.rs:1535
  13:     0x7f454cb89c9e - relation::Relation::change_from::h2000949c2005cd8cG1a
                        at src/relation.rs:120
  14:     0x7f454cbc917a - flow::Flow::recalculate::h822a4f7b8118f7c2DSb
                        at src/flow.rs:176
  15:     0x7f454cbcda16 - flow::Flow::quiesce::hd82d1002a53b941e7Wb
                        at src/flow.rs:198
  16:     0x7f454cd32a5a - server::handle_event::h09e10dc5e4cfe402Ibl
                        at src/server.rs:214
  17:     0x7f454cd35eab - server::run::hf62aec871edbc828Khl
                        at src/server.rs:285
  18:     0x7f454cb5942a - main::haf3dba23e5e43d0aiaa
                        at src/bin/server.rs:11
  19:     0x7f454cefda8d - __rust_try
  20:     0x7f454ceffe2a - rt::lang_start::h996e83640adddea1BAx
  21:     0x7f454cb5e0fb - main
  22:     0x7f454bd1fec4 - __libc_start_main
  23:     0x7f454cb592e8 - <unknown>
  24:                0x0 - <unknown>
An unknown error occurred

I can reliably reproduce this error by loading the artists.eve example file, chunking the "Top Artists" data set, and connecting the standard deviation function to the rank.  (Yes, this is a meaningless calculation....)
In both cases, Eve fails when you try to restart it, due to an error in the autosave file:
thread '<main>' panicked at 'called `Result::unwrap()` on an `Err` value: SyntaxError("trailing characters", 1, 147726)', ../src/libcore/result.rs:732
stack backtrace:
   1:     0x7fc2c19cd8ce - sys::backtrace::write::h7f613ce09e7b1d1d5As
   2:     0x7fc2c19d1166 - panicking::on_panic::he6322b413efd100fGFx
   3:     0x7fc2c19c069e - rt::unwind::begin_unwind_inner::h16a4850d896eee23R6w
   4:     0x7fc2c19c10c6 - rt::unwind::begin_unwind_fmt::hc997fb3d79d46a00X5w
   5:     0x7fc2c19d0b36 - rust_begin_unwind
   6:     0x7fc2c1a01794 - panicking::panic_fmt::hbcb2030cdfd213bbTgC
   7:     0x7fc2c17e9766 - result::Result<T, E>::unwrap::h16748058307513226779
                        at ../src/libcore/macros.rs:28
   8:     0x7fc2c17e8391 - server::load::hf7ead53dd82576eev4k
                        at src/server.rs:134
   9:     0x7fc2c180821e - server::run::hf62aec871edbc828Khl
                        at src/server.rs:257
  10:     0x7fc2c162c42a - main::haf3dba23e5e43d0aiaa
                        at src/bin/server.rs:11
  11:     0x7fc2c19d0a8d - __rust_try
  12:     0x7fc2c19d2e2a - rt::lang_start::h996e83640adddea1BAx
  13:     0x7fc2c16310fb - main
  14:     0x7fc2c07f2ec4 - __libc_start_main
  15:     0x7fc2c162c2e8 - <unknown>
  16:                0x0 - <unknown>
An unknown error occurred

This is presumably the same sort of problem as in #202.  I have saved both of the autosave files, in case you would like to see them.
This is seen running Eve f35374c2 on Ubuntu 14.04.

If possible, can you gist the autosaves and link to them in each of the respective issues? That'll help us figure out the root cause of the issue.

Here's the autosave after the crash from trying to connect std-dev to
un-chunked data: https://gist.github.com/rschroll/d1b7255a9ea64bb183f0
And here's the autosave after the crash due to NaNs in the std-dev
data: https://gist.github.com/rschroll/b1e661af550eb262acd3

1 is a compiler bug - I'm still working on it. 2 was from bad math and is fixed. 3 was from a missing \n in the artists.eve file and is fixed.

I've just discovered that I can produce a crash much like the first by
dropping the output of a function on one of its inputs.  Moreover, it
produces an autosave file that causes the same error when Eve in
resumed: https://gist.github.com/rschroll/be8a8509e31fe23a77db
I can file this as a separate bug if it's actually a separate problem.
But given the problem I'm having reproducing the first crash, it's
possible that this was actually the problem, triggered by mistake after
I got the warning about the data not being chunked.

Ok, fixed 1 too. All of your autosaves work for me after the latest commit. Let me know if you can still trigger any of those after pulling and deleting your existing autosave file.

Looks good to me.  I'll go ahead and close this.  Thanks!


Detec if a word it's an isogram

Hi all, I want to add this snippet which consist in:
An isogram is a word that has no repeating letters, consecutive or non-consecutive
example :
isIsogram("Dermatoglyphics") == true
isIsogram("aba") == false
isIsogram("moOse") == false // -- ignore letter case

Hi @MoisesTR , I would like to take this up.

Hey, could you assign this to be? I would like to complete it

Hi @m11dedhia , I had already raised a PR for this change.
https://github.com/30-seconds/30-seconds-of-code/pull/1507

As mentioned in #1507, this is not really worth adding, as its real-life applications are very limited.

As mentioned in #1507, this is not really worth adding, as its real-life applications are very limited.

It's ok, to be honest,  you're right.


Is this project maintained?

Just wondering if this repo is still being maintained?

doesn't seem


es6: event names containing a dot don't work.

Declaring an event
/**
 * foo just happened on the client
 *
 * @memberof Engine
 * @event client.foo
 */

This causes much strangeness - the menu doesn't show the word "client".  The following approaches didn't work either:

declaring the event inside the class, without @memberof
declaring client.foo with single quotes or double quotes caused the quotes to be included in the event name in the output
escaping the dot

The correct solution is to enclose the event name in double quotes. I believe there's a separate issue to remove the quotes in the generated documentation.


get docker environment set up and downloaded.

I sent the script for getting the installation project done in the slack channel.

Adam - you should check the script in and post the github link here