]> git.sesse.net Git - nageru-docs/blob - futatabi.rst
af615963f879d7f398ca631c1a1d887ddb57b17c
[nageru-docs] / futatabi.rst
1 Futatabi: Real-time instant replay with slow motion
2 ===================================================
3
4 Futatabi (after the Japanese word *futatabi*, 再び, meaning “again” or
5 “for the second time”) is a system for instant replay. Even though Futatabi
6 is meant to be used with Nageru, shares some code with it and is built from
7 the same source distribution, it is a separate
8 application. Futatabi is meant for slow motion for e.g. sports broadcasts, but
9 can also be used as a more generic multitrack recorder for later editing.
10
11 Futatabi supports *interpolated* slow motion, meaning you do not need to buy
12 a high-speed 120 fps camera to get smooth 60 fps output after slowdown—Futatabi
13 will automatically synthesize in-between frames for you during playback.
14 Good interpolation, especially in realtime, is a difficult problem, and not all
15 content will do equally well. Most content should do quite acceptably, especially
16 considering that half of the frames will actually be originals, but you
17 will need to see in practice what actually works for you. Interpolation can
18 also be used for frame rate conversion (e.g. 50 to 59.94 fps).
19
20 Futatabi currently uses a GPU reimplementation of
21 `Fast Optical Flow using Dense Inverse Search (DIS) <https://github.com/tikroeger/OF_DIS>`_
22 by Kroeger et al, together with about half of the algorithm from
23 `Occlusion Reasoning for Temporal Interpolation Using Optical Flow <https://www.microsoft.com/en-us/research/publication/occlusion-reasoning-for-temporal-interpolation-using-optical-flow/>`_
24 (to do the actual interpolation based on the estimated
25 optical flow), although this may change in the future.
26
27 Since Futatabi is part of the Nageru source distribution, its version number
28 mirrors Nageru. Thus, the first version of Futatabi is version 1.8.0,
29 which is the Nageru version when it was first introduced.
30
31
32 System requirements
33 -------------------
34
35 It is strongly recommended to run Futatabi on a separate machine from Nageru,
36 not the least because you probably want a different person to operate the replay
37 while the producer is operating Nageru. (See :ref:`coop`.)
38
39 Like Nageru, Futatabi uses your GPU for nearly all image processing.
40 However, unlike Nageru, Futatabi requires a powerful GPU for interpolation;
41 a GTX 1080 or similar is recommended for interpolated 720p60. (Futatabi
42 was initially developed on a GTX 950, which is passable, but has little
43 performance margin.) If you have a slower GPU and are happy with worse
44 quality, or just wish to test, you can use a faster preset, or turn off
45 interpolation entirely. Futatabi requires OpenGL 4.5 or newer.
46
47 For other required libraries, see :ref:`compile`; when you build Nageru,
48 you also build Futatabi.
49
50
51 Getting started
52 ---------------
53
54 Futatabi always pulls data from Nageru over the network; it doesn't support SDI
55 input or output. Assuming you have a recent version of Nageru (typically one
56 that comes with Futatabi), it is capable of sending all of its cameras as one
57 video stream (see :ref:`futatabiformat`), so you can start Futatabi with
58
59   ./futatabi http://nageru-server.example.org/multicam.mp4
60
61 If you do not have a running Nageru installation, see :ref:`sampledata`.
62
63 Once you are up and connected, Futatabi will start recording all of the frames
64 to disk. This process happens continuously for as long as you have disk space,
65 even if you are playing something back or editing clips, and the streams are
66 displayed in real time in mini-display as they come in. You make replays in
67 the form of *clips* (the top list is the clip list), which are then queued into
68 the *playlist* (the bottom list). Your end result is a live HTTP stream that
69 can be fed back into Nageru as a video input; by default, Futatabi listens
70 on port 9096.
71
72 Futatabi has the concept of a *workspace*, which defaults to your current
73 directory (you can change it with the -d option). This holds all of the
74 recorded frames, all metadata about clips, and preferences set from the menus
75 (interpolation quality and cue point padding).  If you quit Futatabi and
76 restart it (or you go down as the result of a power failure or the likes),
77 it will remember all the state and frames for you. As a special case,
78 if you give */dev/null* in place of an input URL or file, you can keep using
79 your workspace without getting any new frames added.
80
81 .. _basicui:
82
83 Basic UI operations
84 '''''''''''''''''''
85
86 Nageru can be operated using either the keyboard and mouse, or using a MIDI
87 controller with some help of the mouse. In this section, we will be discussing
88 the keyboard and mouse only; see :ref:`midi-futatabi` for details on using MIDI
89 controllers.
90
91 A clip in the clip list consists simply of an in and an out point; it represents
92 an interval of physical time (although timed to the video clock). A clip in the
93 playlist contains the same information plus some playback parameters, in particular
94 which camera (stream) to play back.
95
96 Clicking the ”Cue in” button, or pressing the A key, will start a new clip in
97 the clip list that begins at the current time. Similarly, clicking the ”Cue
98 out” button, or pressing the S key, will set the end point for said clip.
99 (If you click a button twice, it will overwrite the previous result.)
100 Now it is in a state where you can queue it to the play list (mark the camera
101 you want to use and click the “Queue” button, or Q on the keyboard—you can queue
102 a clip multiple times with different cameras) for
103 playing, or you can preview them using the “Preview” button (W on the
104 keyboard). Previewing can be done either from the clip list the clip list or
105 the playlist; they will not be interpolated or faded, but will be played back
106 in the right
107
108 You can edit cue points, both in the clip and the playlist, in two ways:
109 Either use the scroll wheel on the mouse, or hold down the left mouse button
110 and scrub left or right. (You can hold down Shift to change ten times as fast,
111 or Alt to change at one-tenth the speed.) You'll see the new cue points as you
112 change them in the preview window. You can also give clips names; these don't
113 mean anything, but can be good references to locate a specific kind of clip
114 for later use. Once you're happy with a playlist, and your producer is ready
115 to cut to your channel, click on the first clip you want to play back and
116 click the “Play” button (space on the keyboard); the result will both be
117 visible in the top screen and go out live over the network to Nageru.
118
119 .. _speed:
120
121 Controlling the playback speed
122 ''''''''''''''''''''''''''''''
123
124 Most slow motion is at 0.5x speed (or equivalently, “2x slow motion”),
125 and when you queue a clip from the clip list to the playlist, this is what
126 it gets by default. However, you are free to change it to whatever you wish,
127 like 0.333x, 0.25x (both are fairly common “super slow” standards) or even 1.0x.
128 As long as you are reasonably close to a rational number with low integers
129 (e.g. 1/2, 2/3, etc.), Futatabi will do its best to try to reuse as many
130 original frames as possible, keeping quality and performance at their highest
131 levels.
132
133 In addition to the per-clip speed, it is often interesting to change the
134 speed *during* playback of a clip. For instance, you could keep normal
135 slow motion (0.5x) speed in the run-up to a shot, ramp down to 0.1x to get
136 a good look at the actual shot, and then ramp back once it's done.
137 When done right and not overused, this can create a dramatic effect that's
138 hard to replicate using constant slowdown.
139
140 To this effect, Futatabi supports a *master speed* control. It is found at
141 the bottom of the window (or you can :ref:`control it using a MIDI device <midi-futatabi>`);
142 note that by default, it is locked at 100% until you click the lock button
143 to unlock it. (This is particularly important when using a MIDI device, where it is very easy
144 to touch a slider inadvertedly, and very hard to set it back exactly at 100%.)
145 The master speed control is multiplied in on top of all other speed factors,
146 so if you have e.g. a clip at 0.5x and the master speed is set to 70%,
147 the clip will effectively play back at 0.35x. The master speed can be set between
148 10% and 200%, inclusive.
149
150 Note that the master speed control governs the speed of the *output* clock,
151 unlike any other speed control in Futatabi. In particular, this means that unlike
152 the regular clip speeds, it affects fade times; if fade time is at 0.5 seconds
153 and master speed is set to 70%, the fade will take approximately 0.714 seconds
154 (0.5 divided by 0.7). It also means that the “remaining time” displays will be
155 wrong if master speed is not at 100%. This is because the master speed
156 is by nature unpredictable (the user can change it at any time); one cannot
157 e.g. delay fades when the master speed is reduced, since turning it back up
158 would mean the start of the fade were simply missed. Similarly, it is impossible
159 to give a proper estimate of time remaining that takes master speed into account;
160 it would be overestimating time significantly, given that the operator is likely
161 to turn it back up to 100% again soon.
162
163 Finally, note that when changing master speed, the speed is no longer at a
164 rational, so most frames will be interpolated frames. If your GPU is not fast
165 enough to interpolate every frame (ie., it is reliant on Futatabi's usual
166 reuse of original frames), it will drop output frames. Normal behavior will
167 resume from the next clip, when the clocks will again go in lockstep (assuming the master
168 speed is at 100% at that point). If you're not ramping, or if you're done ramping,
169 it's recommended to keep the speed lock on to avoid inadvertedly changing the speed.
170
171 .. _coop:
172
173 Working with your producer
174 ''''''''''''''''''''''''''
175
176 Generally, we recommend that the producer (Nageru operator) and slow motion
177 operator (Futatabi operator) sit closely together and can communicate verbally.
178 Good cooperation between the two is essential to get a good final product;
179 especially the switches to and from the replays can be a critical point.
180
181 The general rule for working together is fairly obvious: The producer should
182 switch to a replay when there's something to show, and switch away when there's
183 nothing more to show (or, less ideally, when something live takes priority).
184 Generally, when you have a playlist ready, inform your producer; they will
185 count you in (three, two, one, go). At one, start playing so that you have some
186 margin. If the Nageru theme is set up correctly (see :ref:`talkback`), they will
187 know how much is queued up so that they can switch back before the replay runs
188 out, but it doesn't hurt to give a warning up-front. The producer might also
189 be able to request replays of specific events, or ask you to save something
190 for later if they can't show it right now (e.g. a foul situation that wasn't called).
191
192 Audio support
193 '''''''''''''
194
195 Since version 1.8.5, Futatabi has limited audio support. It is recorded
196 (assuming Nageru is also at version 1.8.5 or newer) and saved for all inputs,
197 and played back when showing a replay, but only when the replay speed is at
198 100%, or very close to it. (At other speeds, you will get silence.)
199 Furthermore, there is no local audio output; the Futatabi operator will not
200 hear any audio, unless they use a video player into the Futatabi stream locally
201 (with associated delay). All of this may change in the future.
202
203
204 White balance
205 '''''''''''''
206
207 Since version 1.9.2, Futatabi will integrate with Nageru for white balance;
208 the white balance set in Nageru will be recorded, and properly applied on
209 playback (including fades). Note that this assumes you are using the built-in
210 white balance adjustment (new in 1.9.2), not adding WhiteBalanceEffect manually
211 to the scene; see :ref:`white-balance` for an example.
212
213
214 Replay workflows
215 ----------------
216
217 On top of the basics outlined in :ref:`basicui`, there are many possible
218 workflows; we'll discuss only two. Try out a few and see which ones fit your
219 style and type of event.
220
221 Repeated cue-in
222 '''''''''''''''
223
224 In many sports, you don't necessarily know when a replay-worthy event has happened
225 before it's already happened. However, you may reasonably know when something is
226 *not* happening, and it would be a good time to start a clip if something is happening
227 immediately afterwards. At these points, you can make repeated cue-ins, ie., start
228 a clip without finishing it. As long as you keep making cue-ins, the previous one
229 will be discarded. Once you see that something *is* happening, you can wait until
230 it's done, and then do a cue-out, which gives you a good clip immediately.
231
232 For instance, in a basketball game, you could be seeing a series of uninteresting
233 passes, clicking cue-in on each of them. However, once it looks like there's an
234 opportunity for a score, you can hold and see what happens; if the shot happens,
235 you can click cue-out, and if not, you can go back.
236
237 Before playing the clip, you can make adjustments to the in and out points
238 as detailed above. This will help you trim away any uninteresting lead-ups,
239 or add more margins for fades. If you consistently find that you have too
240 little margin, you can use the *cue point padding* feature (either from the
241 command line using *--cue-in-point-padding* and *--cue-out-point-padding*, or set from the menu). If you set
242 cue in point padding to e.g. two seconds, the cue-in point will automatically be set
243 two seconds ago when you cue-in, and similarly, if you set cue out point padding,
244 the cue-out point will be set two seconds
245 into the future when you cue-out. (Cue-in and cue-out point padding were one
246 joint setting before Futatabi 1.8.3.)
247
248
249 Instant clips
250 '''''''''''''
251
252 Like the previous section explained how you generally would know the *start*
253 of an interesting event (at least if discarding most of the candidates),
254 you would be even more sure about the *end* of one. Thus, you can simply wait
255 until something interesting has happened, and then click cue-in immediately
256 followed by cue-out. This will give you a clip of near zero length, ending
257 at the right point. Then, edit this clip to set the starting point as needed,
258 and it's ready to play.
259
260 Again, you can use the cue point padding feature to your advantage; if so,
261 your clips will not be of zero length, but rather of some predefined length
262 given by your chosen cue point padding.
263
264
265 .. _sampledata:
266
267 Sample multicamera data
268 '''''''''''''''''''''''
269
270 Good multicamera sample video is hard to come by, so it can be hard to
271 test or train before an actual event. To alleviate this, I've uploaded some
272 real-world video from the very first event where an early version of Futatabi
273 was tested. (There are some issues with the JPEG quality, but it should
274 largely be unproblematic.) You are free to use these for training or
275 demonstration purposes. Do note that they will not be displayed entirely
276 correctly in most video players (see :ref:`futatabiformat`), although
277 they will certainly be watchable.
278
279 There are two files:
280
281  * `Trøndisk 2018, final only (MJPEG, 126 GB) <https://storage.sesse.net/trondisk2018-final-multicam-mjpeg.mkv>`_:
282    The final match, in MJPEG format (about 73 minutes). This can be downloaded
283    and then fed directly to Futatabi as if it were a real camera stream
284    (remember the --slow-down-input option).
285  * `Trøndisk 2018, entire tournament (H.264, 74 GB) <https://storage.sesse.net/trondisk2018-multicam-h264.mp4>`_:
286    The entire first part of the tournament,
287    with no cuts (about 12 hours). However, due to space and bandwidth
288    constraints, it has been transcoded to H.264 (with some associated
289    quality loss), and needs to be transcoded to MJPEG before Nageru can use it.
290
291 Both files are mixed-resolution, with some cameras at 1080p59.94 and some
292 at 720p59.94 (one even switches between matches, as the camera was replaced).
293 They contain four different camera angles (overview camera on crane, detail camera
294 in tripod, two fixed endzone overhead cameras) with differing quality depending
295 on the camera operators. In short, they should be realistic input material
296 to practice with.
297
298
299 .. _futatabiformat:
300
301 Internal video format details
302 -----------------------------
303
304 Futatabi expects to get data in MJPEG format only; though MJPEG is old,
305 it yields fairly good quality per bit for an intraframe format, supports
306 4:2:2 without too many issues, and has hardware support through VA-API
307 for both decode (since Ivy Bridge) and encode (since Skylake). The latter
308 is especially important for Futatabi, since there are so many high-resolution
309 streams; software encode/decode of several 1080p60 streams at the same time
310 is fairly taxing on the CPU if done in software. This means we can easily
311 send 4:2:2 camera streams back and forth between Nageru and Futatabi without having
312 to scale or do other lossy processing (except of course the compression itself).
313
314 However, JPEG as such does not have any way of specifying things like color
315 spaces and chroma placement. JFIF, the *de facto* JPEG standard container,
316 specifies conventions that are widely followed, but they do not match what
317 comes out of a capture card. Nageru's multicam export _does_ set the appropriate
318 fields in the output Matroska mux (which is pretty much the only mux that can
319 hold such information), but there are few if any programs that read them and give
320 them priority over JFIF's defaults. Thus, if you want to use the multicam stream
321 for something other than Futatabi, or feed Futatabi with data not from Nageru,
322 there are a few subtle issues to keep in mind.
323
324 In particular:
325
326   * Capture cards typically send limited-range Y'CbCr (luma between 16..235
327     and chroma between 16..240); JFIF is traditionally full-range (0..255
328     for both). (See also :ref:`synthetictests`.) Note that there is a special
329     private JPEG comment added to signal this, which FFmpeg understands.
330   * JFIF, like MPEG, assumes center chroma placement; capture cards and most
331     modern video standards assume left.
332   * JFIF assumes Rec. 601 Y'CbCr coefficients, while all modern HD processing
333     uses Rec. 709 Y'CbCr coefficients. (Futatabi does not care much about
334     the actual RGB color space; Nageru assumes it is Rec. 709, like for capture
335     cards, but the differences between 601 and 709 here are small. sRGB gamma
336     is assumed throughout, like in JFIF.)
337   * The white balance (gray point) is stored in a minimal EXIF header,
338     and echoed back for original and interpolated frames. (During fades, Futatabi
339     applies white balance itself, and does not require gray point adjustment
340     from the client.)
341
342 Many players may also be confused by the fact that the resolution can change
343 from frame to frame; this is because for original (uninterpolated) frames,
344 Futatabi will simply output the received JPEG frame directly to the output
345 stream, which can be a different resolution from the interpolated frames.
346
347 Also, even though Futatabi exists to make a fixed-framerate stream out of
348 something that's not, the output stream can be variable-framerate (VFR) due to
349 pauses and frame drops. In particular, when the stream is paused, frames are
350 only output about every 100 milliseconds.
351
352 Finally, the subtitle track with status information (see :ref:`talkback`) is
353 not marked as metadata due to FFmpeg limitations, and as such will show up
354 raw in subtitle-enabled players.
355
356
357 .. _midi-futatabi:
358
359 Using MIDI controllers
360 ----------------------
361
362 This section assumes you have already read the section about
363 `MIDI controllers in Nageru <audio.html#midi-controllers>`__. MIDI controllers
364 in Futatabi are fairly similar, but there are also some important differences,
365 since they control replay and not audio:
366
367   * There is no concept of a bus (there is only one video output channel).
368     Thus, the concept of guessing also is obsolete.
369   * Since there are no buses, there are also usually plenty of buttons
370     and controls, rendering the bank concept less useful. It *is* supported,
371     but activity highlights (to show which bank is active) are not.
372   * Finally, outputs (controller lights and button lights) frequently have
373     more than one state depending on the velocity sent, e.g. 1 for on and 2 for
374     blinking. Thus, the Futatabi MIDI mapping editor allows you to change the
375     note velocities from the default 1.
376
377 Futatabi has been tested with the `Behringer CMD PL-1 <https://www.musictribe.com/Categories/Behringer/Computer-Audio/DJ-Controllers/CMD-PL-1/p/P0AJF>`_;
378 it is not originally designed for slow motion (it is a DJ controller), but provides everything you
379 need (a jog wheel, a slider that works as a T bar for master speed, and plenty
380 of buttons) at a fraction of the price of a “real” slow motion remote.
381 A sample MIDI mapping is included with Futatabi.
382
383 Futatabi currently does not support classic RS-422 controllers, only MIDI
384 controllers.
385
386
387 Monitoring
388 ----------
389
390 .. _talkback:
391
392 Tally and status talkback
393 '''''''''''''''''''''''''
394
395 In addition to the verbal communication between the two operators
396 (see :ref:`coop`), it is also useful to have automatic communication
397 between Nageru and Futatabi. This goes both ways.
398
399 First, Futatabi can consume :ref:`Nageru's tally data <tally>` like any camera
400 can; give the correct channel URL to *--tally-url* on the Futatabi command line,
401 and the color around the live view will show up when you are ready or playing
402 (e.g. *--tally-url http://nageru-server.example.org:9096/channels/2*).
403
404 Second, Futatabi can export its current status in two ways. The simplest is
405 through a REST call; the HTTP server that exposes the stream also exposes
406 the endpoint */queue_status* (e.g. http://futatabi-server.example.org:9096/queue_status).
407 This contains the same text as is below the live window, ie., how much time
408 is queued or left.
409
410 The same status is also exported programmatically in the video output from
411 Futatabi, as a subtitle track. This allows the Nageru theme not only to display
412 it if desired, but even to act automatically to switch to a different channel
413 when the playlist is nearing its end. (See :ref:`subtitle-ingest` for information
414 on how to digest such information from the Nageru side.)
415
416 Each subtitle entry is displayed momentarily before the frame it belongs to,
417 and has the following format:
418
419   Futatabi 1.8.2;PLAYING;6.995;0:06.995 left
420
421 The semicolon-separated columns are as follows:
422
423   * The first column is the identifier for the Futatabi version in use; if the format
424     should ever diverge between versions, it can serve as a way to distinguish between
425     them if needed. (The version may also change without the format changing.)
426     For now, however, you can ignore it.
427   * The second column is either PLAYING or PAUSED, depending on the current status.
428   * The third column is how many seconds is queued up (PAUSED) or remaining (PLAYING).
429     It is always in C locale, no matter what the user has set (ie., the decimal point
430     will always be a period). Note that this does not take into account the master
431     speed (see :ref:`speed`).
432   * Finally, the fourth column is a human-readable string, the same as is exposed
433     on the /queue_status endpoint above.
434
435 Prometheus metrics
436 ''''''''''''''''''
437
438 Like Nageru, Futatabi supports a series of Prometheus metrics for monitoring;
439 see :doc:`monitoring` for general information. Futatabi provides entirely different
440 metrics, though, mostly related to performance. There is no predefined Grafana
441 dashboard available at the current time.