• mpph264enc could not say constrained-baseline, so H.264 was never offered

    Ghost released this 2026-08-25 09:29:02 +00:00 | 0 commits to main since this release

    webrtcsink's codec discovery builds its encoding chain with no output caps, so force_profile is
    true and it inserts a capsfilter demanding profile=constrained-baseline — WebRTC's interoperable
    floor. h264parse strips alignment, stream-format and parsed from a caps query but not
    profile, so that demand reaches mpph264enc's src pad, whose template listed only
    { baseline, main, high }. Empty intersection, GstVideoEncoder's sink getcaps returns nothing,
    and the failure surfaces upstream as videorate reporting it "could not transform NV12 ... in
    anything we support". Discovery then drops H.264 with a warning nobody was reading, VP8 wins by
    default, and the session dies in rtpvp8pay.

    The element could always produce constrained-baseline; only its static template denied it.
    Measured on an RK3566: mpph264enc profile=baseline ! h264parse negotiates
    profile=(string)constrained-baseline on the parser's src pad, because baseline mode turns CABAC
    and 8x8 transform off and MPP emits no FMO, ASO or redundant slices. So this widens the template
    by one word rather than claiming something new.

    Patches now live in a directory per upstream, applied by an apply_patches helper and recorded in
    the MANIFEST as patch <project>/<file>. Two reasons: a patch aimed at the wrong tree failed the
    same way a stale one does, and the MANIFEST's flat patch <file> line landed next to whichever
    .so happened to precede it, which read as provenance for the wrong plugin.

    Assisted-by: Claude:claude-opus-5[1m]

    Downloads