Releases: geneva-render/geneva
Release list
v1.1.0
Timeline format 1.1: a "1.0" document is read as it is.
Added
- Captions from part of a file. The
captionssource takesinand
out, as a video clip does: cues outside the range are left out, one
crossing an edge is cut, andinbecomes the clip's start. Captions
for three shots cut from one film are three captions clips on the same
file with the shots' ownin,outandstart. 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
posterentry inoutputs
is written, at its ownat. Before, only the last one by name was
written and the others were skipped without a word. A secondsprites
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 --atdraws 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: acoloron a crossfade. Every
code now has one meaning.
Fixed
-
A
<div>with paragraphs in it set them side by side. An element
that set nodisplaywas 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 nodisplaythat 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
displayis 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 subtitletitlewas 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
outputsentry with bothwidthandheightin 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@keyframesinside 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 negativestartgave one E300 per cue, with
times nobody wrote; it gives one.geneva explain W201called 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,aand 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 fordisplay: flexstill 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, itsclip-pathstill 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,screenandmultiplyno
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
inscreen29.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-spacinginemfailed the render withE442, 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. Anemis now kept as written and resolved
against the element's own font size when the animation is played on
it.normalreads as0;remand 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
afrom) keyframe was dropped withW440, 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'sanimationin the
document. Found by the intro card of a benchmark package, whose
card-outfade 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.