Skip to content

Releases: geneva-render/geneva

Release list

v1.1.0

Choose a tag to compare

@github-actions github-actions released this 28 Sep 11:05

Timeline format 1.1: a "1.0" document is read as it is.

Added

  • Captions from part of a file. The captions source takes in and
    out, as a video clip does: cues outside the range are left out, one
    crossing an edge is cut, and in becomes the clip's start. Captions
    for three shots cut from one film are three captions clips on the same
    file with the shots' own in, out and start. Before, a word file
    or a subtitle file could only be used whole from its first second, and
    two agents building a social clip and a news package from the middle
    of a film both had to rewrite the file's times by hand.
  • Several posters in one document. Each poster entry in outputs
    is written, at its own at. Before, only the last one by name was
    written and the others were skipped without a word. A second sprites
    entry is now E434, since a document writes one sheet.

Changed

  • A pause ends a caption. Words from a speech recogniser were
    grouped by segment and by length only, so a cue could hold the words
    on both sides of a six-second silence and show the second half
    seconds before it was said. A pause of a second or more between two
    words now starts a new cue.
  • geneva frame --at draws the frame a render shows at that time,
    from the time it starts, as the render draws it. It drew the exact
    time asked for, which between two frames is a picture the video never
    holds.
  • An audio clip's fades longer than the clip are W306, not W304,
    which kept only its other meaning: a color on a crossfade. Every
    code now has one meaning.

Fixed

  • A <div> with paragraphs in it set them side by side. An element
    that set no display was a flex row, taffy's default, rather than a
    block, CSS's, so <div><p>A</p><p>B</p></div> drew "AB" on one line
    and a heading after them ran off the edge instead of wrapping. An
    element with no display that holds block elements is now a block
    and they stack. One that holds only text and inline elements keeps
    the row, which is how a line of spans stays a line. Markup that sets
    display is laid out as before; every golden case and benchmark
    piece renders the same to the bit.

  • Subtitle streams ran past the end of the video. A cue after the
    output's end was kept, so a 3 s video with a subtitle file offset
    into it reported itself as 20 s long. Cues are now cut at the end.
    A subtitle title was dropped in MP4 and MOV, which have no stream
    title; it is now written as the stream's handler name, which is what
    players there show.

  • An outputs entry with both width and height in another shape
    stretched the whole picture into it without a word. It still does,
    with W406, and the reference says a different framing needs its own
    document.

  • Diagnostics pointed at the wrong place or said the same thing
    twice.
    An error in an @keyframes inside markup pointed at a JSON
    field named after the CSS offset (/source/from); it now points at
    the source and names the rule and the offset in the message. A
    captions clip with a negative start gave one E300 per cue, with
    times nobody wrote; it gives one. geneva explain W201 called a note
    a warning.

  • A word in bold inside a sentence broke the sentence. In markup,
    <p>Go for <b>launch</b> at nine</p> was laid out as three boxes in a
    row: the paragraph stopped wrapping and ran off the edge of its box,
    the space after the bold word was lost, and nothing said so. Text with
    inline elements inside it (b, strong, i, em, span, small,
    code, a and the other inline tags) is now set as one run, as a
    browser sets it: it wraps as a whole, spaces are collapsed across the
    pieces, each piece keeps its own colour, weight, style, size, family
    and letter-spacing, a line is as tall as its tallest piece, and <br>
    breaks the line. An inline element that
    needs a box of its own (a background, a border, padding) still gets
    one, and an element that asks for display: flex still makes its text
    and elements flex items, as a browser does.

  • Full-screen motion graphics in markup render two to four times
    faster.
    A benchmark against Remotion found geneva slower on pure
    markup pieces, and a profile found work that changed nothing in the
    picture. A panel waiting to wipe in, its clip-path still a line, was
    painted over the whole frame every frame and then masked away; it is
    now bounded to its polygon and skipped while the polygon covers
    nothing. Everything under the last box that covers the frame in an
    opaque colour is no longer painted. A group laid down exactly as
    painted (full opacity, no blur, blend or transform, clips that cover
    it) no longer gets a buffer of its own. A soft shape under a steady
    filter: blur() is blurred once and kept, where it was blurred again
    every frame. Inside a box, pixels well within its corners and its
    clip skip the rounded-rectangle test, screen and multiply no
    longer divide by alpha, and text is encoded through a table rather
    than a power per pixel. Two faults in the cache of group pictures went
    with it: a group whose boxes changed every frame was repainted over its
    whole reach every frame instead of being given up on, and a picture no
    longer shown was never let go, so it could keep a new one out of the
    budget. On a 4-vCPU Xeon VM (2.1 GHz, no GPU) a 16 s kinetic typography piece at 1080p
    takes 14.3 s where it took 59.3, and a 14 s intro with blurred shapes
    in screen 29.9 s where it took 74.3. The picture is the same to one
    level in 8 bits, except that a glyph running past the edge of a group
    that now has no buffer is drawn whole, as a browser draws it, rather
    than cut at the buffer's edge.

  • A keyframe's letter-spacing in em failed the render with E442, invalid length ".3em", although the same length works in a static
    rule and in a browser: keyframes were parsed without the element, so
    only pixels could be read. An em is now kept as written and resolved
    against the element's own font size when the animation is played on
    it. normal reads as 0; rem and percentages are still refused.
    Found by a kinetic typography piece whose word collapses from .6em
    to -.02em.

  • An animation on markup's outermost element with only a to (or only
    a from) keyframe was dropped
    with W440, nothing interpolates.
    CSS starts such a rule from the element's own value, so
    @keyframes out { to { opacity: 0 } } fades out in a browser; geneva
    played the outermost element's animation on the clip and found one
    keyframe with nothing to move between. A missing first or last keyframe
    now takes the clip's own value: no movement, no scaling, no turning,
    and the clip's opacity. The same holds for a clip's animation in the
    document. Found by the intro card of a benchmark package, whose
    card-out fade never ran.

  • Overlays over a video cost less when they are far apart. With a
    card at the top of the frame and captions at the bottom, the two were
    drawn onto one transparent frame spanning both, two thirds of a 720p
    picture, and every block of it was visited and a small list allocated
    for each before the transparent ones were skipped. Clips whose boxes
    do not touch are now drawn and laid on separately, blocks are skipped
    without allocating, and word-timed captions are drawn again only when
    the lit word changes. The output is the same to the bit. On
    examples/lower-third.json (720p, 9 s, 4 cores) the render takes
    5.9 s where it took 6.2; ffmpeg, drawing the same card and an ASS
    version of the captions, takes 5.5.