WEBVTT

NOTE
This file was generated by switchtitle

1
00:00:13.500 --> 00:00:15.625
This is Self-Directed Research. Our

2
00:00:15.625 --> 00:00:17.125
hosts, James and Amos,

3
00:00:17.125 --> 00:00:18.041
entertain each other with

4
00:00:18.041 --> 00:00:20.000
weekly hyper-focused technical deep

5
00:00:20.000 --> 00:00:21.375
dives. Amos continues

6
00:00:21.375 --> 00:00:22.708
on the arc this week with

7
00:00:22.791 --> 00:00:25.666
"How Far Can You Take OpenFX?" Make sure

8
00:00:25.666 --> 00:00:26.500
to like, follow, and

9
00:00:26.500 --> 00:00:27.916
subscribe wherever you find us,

10
00:00:27.916 --> 00:00:30.708
and visit sdr-podcast.com/episodes

11
00:00:30.708 --> 00:00:31.083
for all the

12
00:00:31.083 --> 00:00:32.750
presentations, videos, show notes,

13
00:00:32.750 --> 00:00:35.041
and transcripts. Also, mark your

14
00:00:35.041 --> 00:00:36.333
calendars! Self-Directed

15
00:00:36.333 --> 00:00:37.583
Research will be recording live

16
00:00:37.750 --> 00:00:40.833
at EuroRust in Paris and online October

17
00:00:40.833 --> 00:00:42.208
9th and 10th, 2025.

18
00:00:42.750 --> 00:00:44.333
Don't miss it! And as usual,

19
00:00:44.791 --> 00:00:46.375
stay tuned to the end to hear more about

20
00:00:46.375 --> 00:00:48.416
Depot, the sponsor of this episode.

21
00:00:54.458 --> 00:00:56.458
<v Amos Wenger>So I've been up all night.

22
00:00:56.458 --> 00:00:57.208
No, that's not true.

23
00:00:57.583 --> 00:00:58.791
Trying to figure out what

24
00:00:58.791 --> 00:01:00.500
to bring to show the class.

25
00:01:01.166 --> 00:01:03.166
And I thought it might be fun if we did

26
00:01:03.166 --> 00:01:05.875
the freaking news, but I didn't.

27
00:01:06.083 --> 00:01:06.416
I don't know.

28
00:01:06.583 --> 00:01:07.500
It kept me up.

29
00:01:07.750 --> 00:01:10.833
So I opened my iPhone Notes app just to

30
00:01:10.833 --> 00:01:12.583
list all the things I could talk about.

31
00:01:12.958 --> 00:01:15.708
And I decided to use the research that I

32
00:01:15.708 --> 00:01:18.958
did yesterday to kind of close the arc of

33
00:01:18.958 --> 00:01:21.625
me going deeper and deeper into rabbit

34
00:01:21.625 --> 00:01:25.916
holes when it comes to making videos the

35
00:01:25.916 --> 00:01:27.125
silliest possible way.

36
00:01:27.458 --> 00:01:27.958
James, are you excited?

37
00:01:28.208 --> 00:01:28.666
<v James Munns>I am.

38
00:01:29.083 --> 00:01:30.833
I'm glad I was using Bluetooth headphones

39
00:01:30.833 --> 00:01:32.333
because I did wander away to get my

40
00:01:32.333 --> 00:01:33.625
fidget toy, but I did

41
00:01:33.625 --> 00:01:34.500
hear the whole intro.

42
00:01:34.750 --> 00:01:35.833
<v Amos Wenger>Good. Good, good, good.

43
00:01:36.208 --> 00:01:37.666
So today's episode is called

44
00:01:37.666 --> 00:01:39.791
How Far Can You Take OpenFX?

45
00:01:40.250 --> 00:01:42.416
Subtitle, can you embed a full motion

46
00:01:42.416 --> 00:01:43.500
design suite with it?

47
00:01:43.500 --> 00:01:45.458
But I would like to manage everyone's

48
00:01:45.458 --> 00:01:47.291
expectations, including my own.

49
00:01:47.541 --> 00:01:51.000
And it's that I only put like

50
00:01:51.000 --> 00:01:52.916
one day of research into this.

51
00:01:53.125 --> 00:01:54.375
<v James Munns>For folks who haven't listened to your

52
00:01:54.375 --> 00:01:57.166
last episode where we were introduced to

53
00:01:57.166 --> 00:01:59.375
what OpenFX, do you want to remind the

54
00:01:59.375 --> 00:02:01.708
audience what OpenFX is and where you

55
00:02:01.708 --> 00:02:03.458
start this rabbit hole dive in?

56
00:02:03.708 --> 00:02:05.250
<v Amos Wenger>James, ye of little faith.

57
00:02:05.666 --> 00:02:06.916
<v James Munns>Well, I've got to ask for the audience

58
00:02:06.916 --> 00:02:09.458
<v Amos Wenger>Previously, on Self-Directed Research.

59
00:02:09.958 --> 00:02:11.125
<v James Munns>Oh, love it.

60
00:02:11.333 --> 00:02:11.708
Love it.

61
00:02:11.958 --> 00:02:13.375
<v Amos Wenger>So first of all, as always, you can get

62
00:02:13.375 --> 00:02:16.250
the slides on SDR dash podcast dot com

63
00:02:16.250 --> 00:02:19.375
slash episodes or by watching the episode

64
00:02:19.375 --> 00:02:20.666
on YouTube or Spotify.

65
00:02:21.166 --> 00:02:21.916
We have video on Spotify.

66
00:02:23.416 --> 00:02:25.750
And for those of you who don't know, I

67
00:02:25.750 --> 00:02:26.791
make YouTube videos.

68
00:02:27.375 --> 00:02:29.291
And on the slide, we can currently see

69
00:02:29.291 --> 00:02:30.250
what my videos look like.

70
00:02:30.250 --> 00:02:31.750
It's mostly a talking

71
00:02:31.750 --> 00:02:34.083
head, mine, in front of code.

72
00:02:34.291 --> 00:02:35.250
Sometimes there's a green screen

73
00:02:35.250 --> 00:02:36.125
involved, but we don't

74
00:02:36.125 --> 00:02:37.083
need to get into that.

75
00:02:37.083 --> 00:02:38.375
The important part is how do we render

76
00:02:38.375 --> 00:02:40.791
that code and how do we like animated and

77
00:02:40.791 --> 00:02:42.333
highlight parts of it and whatnot?

78
00:02:42.375 --> 00:02:44.458
And I've gone through several different

79
00:02:44.458 --> 00:02:45.958
techniques to do that.

80
00:02:46.208 --> 00:02:48.625
It all started with screenshots because

81
00:02:48.625 --> 00:02:49.458
the code blocks are

82
00:02:49.458 --> 00:02:50.208
already on my website.

83
00:02:50.500 --> 00:02:50.708
Right.

84
00:02:50.875 --> 00:02:53.083
I my website is also all custom.

85
00:02:53.250 --> 00:02:54.708
It does syntax highlighting.

86
00:02:55.166 --> 00:02:57.291
So they're already rendered exactly the

87
00:02:57.291 --> 00:02:58.250
way I would like to

88
00:02:58.250 --> 00:02:59.541
present them on my website.

89
00:02:59.791 --> 00:03:01.166
So ideally, I just take that

90
00:03:01.166 --> 00:03:02.291
and put that in the videos.

91
00:03:02.583 --> 00:03:04.958
And that's what I used to do is just use

92
00:03:04.958 --> 00:03:06.875
the Mac OS screenshot tool and do a

93
00:03:06.875 --> 00:03:07.875
rectangle screenshot

94
00:03:07.875 --> 00:03:09.208
and save that somewhere.

95
00:03:09.416 --> 00:03:12.000
Rename that to something meaningful.

96
00:03:12.541 --> 00:03:14.000
Make sure I don't lose it because that's

97
00:03:14.000 --> 00:03:14.958
the thing with

98
00:03:14.958 --> 00:03:15.958
DaVinci Resolve projects

99
00:03:15.958 --> 00:03:18.000
The cloud is a relative concept.

100
00:03:18.500 --> 00:03:21.041
And yeah, it just took a lot of time and

101
00:03:21.041 --> 00:03:23.208
it was hard to position them properly.

102
00:03:23.208 --> 00:03:25.458
If you go from one slide to the next, if

103
00:03:25.458 --> 00:03:27.541
you if you did the rectangle screenshot

104
00:03:27.541 --> 00:03:28.958
slightly different from

105
00:03:28.958 --> 00:03:30.791
the one before, it's funky.

106
00:03:31.041 --> 00:03:32.333
You can definitely see it in the

107
00:03:32.333 --> 00:03:33.666
transition from one to the other.

108
00:03:34.208 --> 00:03:36.125
The controls in the venture resolve to

109
00:03:36.125 --> 00:03:37.666
set the position and size

110
00:03:37.666 --> 00:03:39.916
of the text are very weird.

111
00:03:40.166 --> 00:03:40.708
I don't even know what

112
00:03:40.708 --> 00:03:42.125
they're based on, honestly.

113
00:03:42.791 --> 00:03:44.458
And, you know, it was not good.

114
00:03:44.458 --> 00:03:46.416
So I started looking for solutions on how

115
00:03:46.416 --> 00:03:47.791
to make this easier because I usually

116
00:03:47.791 --> 00:03:50.916
write an entire article first and then

117
00:03:50.916 --> 00:03:51.833
make a video out of it.

118
00:03:52.875 --> 00:03:54.000
So I have everything.

119
00:03:54.375 --> 00:03:57.541
So I can just open the article in a

120
00:03:57.541 --> 00:03:58.541
browser like Safari.

121
00:03:58.791 --> 00:04:00.375
And I noticed that in Safari in the dev

122
00:04:00.375 --> 00:04:01.666
tools, well, they call

123
00:04:01.666 --> 00:04:02.333
it the Web Inspector.

124
00:04:02.666 --> 00:04:04.458
But you can make transparent screenshots.

125
00:04:04.875 --> 00:04:07.083
And then I in the automating macOS

126
00:04:07.083 --> 00:04:09.708
episode of the season, we discovered that

127
00:04:09.708 --> 00:04:11.583
we can use Apple scripts to automate

128
00:04:11.583 --> 00:04:14.250
Safari, which means you can make those

129
00:04:14.250 --> 00:04:16.208
transparent screenshots automatically.

130
00:04:16.875 --> 00:04:18.666
And for one of the videos I had, like, I

131
00:04:18.666 --> 00:04:20.541
don't know, like 200 of them, blocks of

132
00:04:20.541 --> 00:04:22.625
code and diagrams and whatnot.

133
00:04:22.875 --> 00:04:24.000
So, you know, it gets

134
00:04:24.000 --> 00:04:25.291
very long to do it by hand.

135
00:04:25.750 --> 00:04:26.416
Which one was that?

136
00:04:26.750 --> 00:04:27.250
I forget.

137
00:04:27.833 --> 00:04:28.958
Honestly, I have.

138
00:04:29.208 --> 00:04:30.958
OK, I'm lost in my pipeline.

139
00:04:31.166 --> 00:04:32.375
<v James Munns>To be honest, you probably could have

140
00:04:32.375 --> 00:04:33.208
said anything and it

141
00:04:33.208 --> 00:04:33.958
wouldn't surprise me.

142
00:04:34.458 --> 00:04:37.750
<v Amos Wenger>Yeah, I started making shorter pieces

143
00:04:37.750 --> 00:04:40.833
because it's just not nice to have a 50

144
00:04:40.833 --> 00:04:42.458
minute video to edit, I think

145
00:04:42.458 --> 00:04:45.166
some people here can relate.

146
00:04:45.166 --> 00:04:46.333
<v James Munns>Now you're considering the

147
00:04:46.333 --> 00:04:48.083
niceness of your editors time.

148
00:04:48.083 --> 00:04:50.333
And so that just being your time, you go,

149
00:04:50.333 --> 00:04:52.333
well, I would I wouldn't inflict that on

150
00:04:52.333 --> 00:04:53.250
anyone, let alone

151
00:04:53.250 --> 00:04:54.375
someone who works with me.

152
00:04:54.875 --> 00:04:55.041
<v Amanda Majorowicz>Yeah.

153
00:04:55.750 --> 00:04:57.250
I appreciate it.

154
00:04:57.583 --> 00:04:58.375
The past I don't know how

155
00:04:58.375 --> 00:04:59.708
many episodes have been like,

156
00:05:00.708 --> 00:05:01.833
<v James Munns>said Amanda, who's been

157
00:05:01.833 --> 00:05:03.291
editing 50 minute episodes.

158
00:05:03.708 --> 00:05:04.416
Don't worry, Amanda,

159
00:05:04.541 --> 00:05:05.208
this one will be a short.

160
00:05:05.208 --> 00:05:05.541
<v Amanda Majorowicz>Yeah, exactly.

161
00:05:05.708 --> 00:05:07.583
Only 44 slides or what is it?

162
00:05:07.875 --> 00:05:08.083
<v Amos Wenger>Yeah.

163
00:05:08.125 --> 00:05:08.333
Yeah.

164
00:05:08.375 --> 00:05:08.541
Yeah.

165
00:05:08.791 --> 00:05:09.125
<v Amanda Majorowicz>Nice.

166
00:05:09.541 --> 00:05:11.000
<v Amos Wenger>I've aligned incentives for my videos

167
00:05:11.000 --> 00:05:12.208
because I paid my editor

168
00:05:12.208 --> 00:05:14.125
by minute of edited video.

169
00:05:14.458 --> 00:05:14.666
<v James Munns>Nice.

170
00:05:15.125 --> 00:05:15.875
<v Amos Wenger>So I have an

171
00:05:15.875 --> 00:05:17.041
incentive to make them short.

172
00:05:17.333 --> 00:05:18.583
And then we discussed the rate and

173
00:05:18.583 --> 00:05:20.208
evolve and evolve it over time.

174
00:05:20.541 --> 00:05:22.000
But so that's what we

175
00:05:22.000 --> 00:05:23.333
discussed in automating Mac OS.

176
00:05:23.583 --> 00:05:24.333
You just use Apple

177
00:05:24.333 --> 00:05:25.750
script, which was very fun.

178
00:05:25.750 --> 00:05:26.875
There's on the slide.

179
00:05:26.875 --> 00:05:27.958
If you're watching the

180
00:05:27.958 --> 00:05:29.208
slide, you can see that there is

181
00:05:30.208 --> 00:05:34.458
not a mono space font, but a serif font.

182
00:05:34.875 --> 00:05:35.791
Actually, is it serif?

183
00:05:36.041 --> 00:05:36.833
I don't see serif.

184
00:05:36.833 --> 00:05:37.291
Is it sans?

185
00:05:37.875 --> 00:05:38.083
Whatever.

186
00:05:38.166 --> 00:05:39.875
It's that it's proportional for sure,

187
00:05:40.166 --> 00:05:41.541
which is the opposite of monospace.

188
00:05:41.541 --> 00:05:42.208
<v Amanda Majorowicz>It's sans serif.

189
00:05:42.541 --> 00:05:44.416
There are no serifs on this font.

190
00:05:44.416 --> 00:05:46.250
<v Amos Wenger>I thought maybe the the lack of sleep

191
00:05:46.250 --> 00:05:47.750
made me the sans disappear.

192
00:05:48.125 --> 00:05:49.083
The serifs disappear.

193
00:05:50.250 --> 00:05:52.125
And another as the episode named

194
00:05:52.125 --> 00:05:53.291
Blackmagic Fusion is weird.

195
00:05:53.666 --> 00:05:57.250
I discussed my new and current setup.

196
00:05:57.333 --> 00:05:59.083
I've already reached a video with it.

197
00:05:59.083 --> 00:06:00.791
I forget which one, which involved

198
00:06:00.791 --> 00:06:05.416
reversing the Lua based formats that

199
00:06:05.416 --> 00:06:08.250
Blackmagic Fusion uses for node graphs

200
00:06:08.250 --> 00:06:10.458
and just kind of generating what it

201
00:06:10.458 --> 00:06:12.916
expects and generating a Text+ node

202
00:06:12.916 --> 00:06:15.791
with the character level styling modifier

203
00:06:15.791 --> 00:06:19.666
and doing syntax highlighting that way.

204
00:06:19.666 --> 00:06:21.708
And I even vibe coded a

205
00:06:21.708 --> 00:06:23.041
little preview on my website.

206
00:06:23.083 --> 00:06:24.916
So you press a button and then it opens

207
00:06:24.916 --> 00:06:27.708
this editor that uses "contenteditable"

208
00:06:28.125 --> 00:06:30.333
So you can remove the parts that you're

209
00:06:30.333 --> 00:06:31.458
we're not talking about in the video

210
00:06:31.458 --> 00:06:33.500
right now, you can like select a bit of

211
00:06:33.500 --> 00:06:34.666
text and press space.

212
00:06:34.666 --> 00:06:35.791
And it actually highlight

213
00:06:35.791 --> 00:06:37.541
this and dims everything else.

214
00:06:37.791 --> 00:06:39.166
It's really, really nice.

215
00:06:39.416 --> 00:06:42.083
It has a stand in for my face.

216
00:06:42.083 --> 00:06:44.291
I look super goofy again.

217
00:06:44.291 --> 00:06:45.375
Really, you should check the slides.

218
00:06:45.666 --> 00:06:46.333
That's half the fun.

219
00:06:47.750 --> 00:06:49.000
<v James Munns>This is disappointing because this is one

220
00:06:49.000 --> 00:06:50.791
of the few website plugins that only

221
00:06:50.791 --> 00:06:51.791
works locally and you

222
00:06:51.791 --> 00:06:52.708
can't trigger it remotely.

223
00:06:52.833 --> 00:06:54.708
Because otherwise I'd love to like edit

224
00:06:54.708 --> 00:06:57.750
your page and then slap your face in on

225
00:06:57.750 --> 00:07:00.250
examples and be like you are making your

226
00:07:00.250 --> 00:07:02.291
own meme templates except for it's.

227
00:07:02.291 --> 00:07:04.916
<v Amos Wenger>I need a new patrons here for like like

228
00:07:04.916 --> 00:07:05.916
green screen pictures of me.

229
00:07:06.208 --> 00:07:06.500
Yeah, sure.

230
00:07:07.750 --> 00:07:09.208
Yeah, exactly.

231
00:07:09.208 --> 00:07:09.916
For evil people.

232
00:07:10.166 --> 00:07:12.583
I just saw yesterday on Reddit a post

233
00:07:12.583 --> 00:07:14.583
where some burger place lets you pay.

234
00:07:14.916 --> 00:07:16.166
The Veruca Salt special.

235
00:07:16.458 --> 00:07:18.500
You can pay a thousand dollars to

236
00:07:18.500 --> 00:07:20.125
get in front of the line and just.

237
00:07:20.625 --> 00:07:21.583
I want it now, Daddy.

238
00:07:21.875 --> 00:07:23.000
I think that's what it said.

239
00:07:23.500 --> 00:07:23.708
<v James Munns>Exactly.

240
00:07:23.875 --> 00:07:24.041
Yeah.

241
00:07:24.333 --> 00:07:25.625
<v Amos Wenger>And I think that's something people

242
00:07:25.625 --> 00:07:26.625
should consider, like

243
00:07:26.625 --> 00:07:27.875
making tiers that are higher.

244
00:07:28.500 --> 00:07:30.083
So yeah, that reminds me of also someone

245
00:07:30.083 --> 00:07:31.916
said like on Twitter a long time ago, you

246
00:07:31.916 --> 00:07:33.125
know, when Twitter was still Twitter,

247
00:07:33.125 --> 00:07:34.958
they said like if someone were to pay me

248
00:07:34.958 --> 00:07:36.875
like 5000 a month, I would just stop

249
00:07:36.875 --> 00:07:37.833
posting indefinitely.

250
00:07:38.458 --> 00:07:39.250
And that's true.

251
00:07:41.000 --> 00:07:41.416
<v James Munns>I do.

252
00:07:41.416 --> 00:07:42.958
Who was I'm going to have to go back and

253
00:07:42.958 --> 00:07:44.541
find that because I definitely remember

254
00:07:44.541 --> 00:07:46.416
that of the like it's someone we know.

255
00:07:46.625 --> 00:07:47.750
<v Amos Wenger>I don't I forget whom.

256
00:07:47.875 --> 00:07:49.958
<v James Munns>Yeah, it was just I'll shut up, you know,

257
00:07:49.958 --> 00:07:51.375
for that check keeps clear.

258
00:07:51.375 --> 00:07:52.916
And I exactly I'll just shut the hell up.

259
00:07:53.166 --> 00:07:56.541
<v Amos Wenger>And it worked out beautifully on my blog.

260
00:07:56.541 --> 00:07:57.458
I have my articles that

261
00:07:57.458 --> 00:07:58.583
are exclusive for six months.

262
00:07:58.833 --> 00:08:00.333
Someone was like, hey, it's bad that

263
00:08:00.333 --> 00:08:01.333
exclusive for six months.

264
00:08:01.333 --> 00:08:02.666
And I was like, OK, you want to you want

265
00:08:02.666 --> 00:08:03.458
to pay to change that?

266
00:08:03.458 --> 00:08:03.958
I was like, OK,

267
00:08:05.541 --> 00:08:07.416
that was Depot, the sponsor of this episode.

268
00:08:07.875 --> 00:08:09.583
So a big thanks to them.

269
00:08:09.583 --> 00:08:10.458
<v James Munns>Yeah, I was going to say it was our

270
00:08:10.458 --> 00:08:12.583
lovely sponsor, Depot, who is I know, who

271
00:08:12.583 --> 00:08:13.500
is sponsored this entire

272
00:08:13.500 --> 00:08:15.375
season and that article.

273
00:08:15.750 --> 00:08:17.000
<v Amos Wenger>Very generous and very cool platform.

274
00:08:17.000 --> 00:08:17.375
Check them out.

275
00:08:17.666 --> 00:08:17.791
<v James Munns>Yeah.

276
00:08:17.791 --> 00:08:18.666
Listen to the end of the episode.

277
00:08:19.041 --> 00:08:19.250
<v Amos Wenger>Yeah.

278
00:08:19.458 --> 00:08:21.375
Back to my short presentation in the

279
00:08:21.375 --> 00:08:22.833
Black Magic Fusion is Weird episode.

280
00:08:23.291 --> 00:08:24.791
It's kind of a misnomer because it has

281
00:08:24.791 --> 00:08:26.666
this whole nice solution of generating.

282
00:08:26.666 --> 00:08:28.375
And I also talked about the other ways in

283
00:08:28.375 --> 00:08:30.333
which fusion can be extended, including

284
00:08:30.333 --> 00:08:32.416
fuses, which we learned come from the

285
00:08:32.416 --> 00:08:33.666
same word as fusion.

286
00:08:34.041 --> 00:08:35.458
We weren't sure during the episode, but

287
00:08:35.458 --> 00:08:37.541
in the in the show notes that Amanda put

288
00:08:37.541 --> 00:08:40.333
together, I saw that the etymology says

289
00:08:40.333 --> 00:08:42.083
that they are from the same word.

290
00:08:42.083 --> 00:08:42.541
<v James Munns>Were they consistent?

291
00:08:42.833 --> 00:08:43.708
I saw one was like a

292
00:08:43.708 --> 00:08:45.916
bundle of twine, like "fuset"

293
00:08:45.958 --> 00:08:47.000
I think it was a French word.

294
00:08:47.250 --> 00:08:48.083
And then I don't remember

295
00:08:48.083 --> 00:08:50.083
where fusion came from, but

296
00:08:50.083 --> 00:08:53.291
<v Amos Wenger>"fusée" is a spaceship like a rocket ship.

297
00:08:53.291 --> 00:08:54.083
<v James Munns>Oh, yeah.

298
00:08:54.083 --> 00:08:55.583
Maybe I'm probably pronouncing the French

299
00:08:55.583 --> 00:08:56.916
word very, very wrong.

300
00:08:57.541 --> 00:09:00.166
<v Amos Wenger>But yeah, my brain is too mushy to figure

301
00:09:00.166 --> 00:09:01.708
out which which French word you mean.

302
00:09:03.291 --> 00:09:04.916
<v James Munns>We'll leave etymology for another day.

303
00:09:05.750 --> 00:09:05.958
Yeah.

304
00:09:06.083 --> 00:09:09.041
<v Amos Wenger>So fuses, which are a bits of Lua that you

305
00:09:09.041 --> 00:09:10.416
can hot reload and everything.

306
00:09:10.416 --> 00:09:12.291
It's a very nice development environment,

307
00:09:12.291 --> 00:09:13.625
which are fast enough

308
00:09:13.625 --> 00:09:15.375
because it's using a jit

309
00:09:15.416 --> 00:09:16.458
It's actually a LuaJIT

310
00:09:16.833 --> 00:09:18.375
Whenever people say Lua, they usually

311
00:09:18.375 --> 00:09:20.333
mean LuaJIT not always, but usually.

312
00:09:20.833 --> 00:09:22.166
And and OpenFX, I

313
00:09:22.166 --> 00:09:23.458
briefly touched on OpenFX.

314
00:09:23.458 --> 00:09:25.208
I was like, OK, it's a standard way to do

315
00:09:25.208 --> 00:09:28.208
video plug ins a little bit like AU

316
00:09:28.500 --> 00:09:30.833
and what was the one VST for audio?

317
00:09:31.333 --> 00:09:32.500
But this one is for video.

318
00:09:32.500 --> 00:09:34.916
And I said, you probably could bring in

319
00:09:34.916 --> 00:09:36.666
your own renderer and do

320
00:09:36.666 --> 00:09:37.958
exactly what you wanted.

321
00:09:38.250 --> 00:09:39.958
Yeah, one of the limitations we ran into

322
00:09:39.958 --> 00:09:41.958
by using back magic fusion's own text

323
00:09:41.958 --> 00:09:43.458
renderer is that it does not support

324
00:09:43.458 --> 00:09:44.708
color emoji, for example.

325
00:09:44.833 --> 00:09:47.041
And it does not support font fallbacks.

326
00:09:47.583 --> 00:09:49.333
So part of the difficulty for me in

327
00:09:49.333 --> 00:09:51.291
generating the graph is that if, for

328
00:09:51.291 --> 00:09:53.750
example, there is a nerd font symbol, it

329
00:09:53.750 --> 00:09:56.375
has to specify that this pan is using the

330
00:09:56.375 --> 00:09:57.625
nerd font symbol font.

331
00:09:57.916 --> 00:09:59.750
Everything else is in Berkeley Mono

332
00:09:59.750 --> 00:10:01.833
except for emojis, which are using Noto,

333
00:10:02.083 --> 00:10:03.416
Noto without color.

334
00:10:03.416 --> 00:10:04.666
<v James Munns>monospace or the monochrome.

335
00:10:04.666 --> 00:10:05.708
<v Amos Wenger>Yeah, the monochrome.

336
00:10:05.708 --> 00:10:06.041
<v James Munns>Yeah.

337
00:10:06.500 --> 00:10:07.875
And I went back and looked it up.

338
00:10:07.875 --> 00:10:08.875
And the word I thought

339
00:10:08.875 --> 00:10:10.416
was toast is actually tofu.

340
00:10:10.750 --> 00:10:12.583
And that's where the Noto Sans name

341
00:10:12.583 --> 00:10:14.583
comes from is "no tofu".

342
00:10:14.750 --> 00:10:16.125
Because it defines all of the

343
00:10:16.125 --> 00:10:17.666
symbols for all of the emojis.

344
00:10:17.958 --> 00:10:19.916
So you'll never get the tofu, which is

345
00:10:19.916 --> 00:10:21.333
that little rectangle that's either an

346
00:10:21.333 --> 00:10:23.541
exclamation point or has like the hex

347
00:10:23.541 --> 00:10:24.541
characters in there.

348
00:10:24.541 --> 00:10:26.166
I don't remember why it's called tofu,

349
00:10:26.375 --> 00:10:28.041
but that was the word I was trying to

350
00:10:28.041 --> 00:10:29.291
think of in that episode.

351
00:10:29.291 --> 00:10:31.250
<v Amos Wenger>The Unicode replacement character.

352
00:10:31.291 --> 00:10:31.583
<v James Munns>Yeah.

353
00:10:32.000 --> 00:10:32.166
Yeah.

354
00:10:32.166 --> 00:10:33.416
Well, there's maybe two.

355
00:10:33.625 --> 00:10:34.333
There's one.

356
00:10:34.541 --> 00:10:35.000
Wow.

357
00:10:35.291 --> 00:10:35.916
<v Amos Wenger>No tofu.

358
00:10:35.916 --> 00:10:36.083
<v James Munns>Yeah.

359
00:10:36.500 --> 00:10:38.208
But tofu was what I was thinking of when

360
00:10:38.208 --> 00:10:39.250
it shows you the like,

361
00:10:39.250 --> 00:10:40.375
I don't have the glyph.

362
00:10:40.583 --> 00:10:41.458
Here's some hex codes.

363
00:10:41.708 --> 00:10:42.458
Do you like that?

364
00:10:42.500 --> 00:10:44.291
<v Amanda Majorowicz>I like learning about all this stuff,

365
00:10:44.666 --> 00:10:46.041
like going through editing the episode,

366
00:10:46.250 --> 00:10:47.708
collecting all the links and then being

367
00:10:47.708 --> 00:10:48.375
like, I don't know what

368
00:10:48.375 --> 00:10:49.416
you were talking about.

369
00:10:49.416 --> 00:10:50.791
And now next episode,

370
00:10:51.208 --> 00:10:53.875
learning about last week's episode.

371
00:10:54.125 --> 00:10:54.583
Very cool.

372
00:10:55.500 --> 00:10:57.291
<v Amos Wenger>I think you should feel free to cut in

373
00:10:57.291 --> 00:10:58.250
like add editors notes

374
00:10:58.250 --> 00:10:59.125
in the middle of episodes.

375
00:10:59.375 --> 00:10:59.958
Like I checked it.

376
00:11:00.208 --> 00:11:02.041
It's not true or something.

377
00:11:02.250 --> 00:11:03.125
They're still wrong.

378
00:11:03.458 --> 00:11:04.791
<v Amanda Majorowicz>I was actually thinking about that.

379
00:11:04.791 --> 00:11:04.958
Yeah.

380
00:11:05.125 --> 00:11:06.416
But you know, who knows?

381
00:11:06.416 --> 00:11:07.250
Maybe in a future episode.

382
00:11:07.250 --> 00:11:07.583
We'll see.

383
00:11:07.958 --> 00:11:08.166
<v Amos Wenger>Yeah.

384
00:11:08.333 --> 00:11:10.500
So yeah, I mentioned OpenFX saying, yeah,

385
00:11:10.500 --> 00:11:11.791
you can you can make native plugins.

386
00:11:12.125 --> 00:11:13.833
You know, it's clearly overkill.

387
00:11:14.375 --> 00:11:16.291
Obviously, I'm not going to touch that.

388
00:11:16.583 --> 00:11:17.333
That would be crazy.

389
00:11:17.791 --> 00:11:18.958
So that's what I did next.

390
00:11:19.291 --> 00:11:19.708
<v James Munns>Yeah, of course.

391
00:11:20.041 --> 00:11:20.583
<v Amos Wenger>Yeah, of course.

392
00:11:21.625 --> 00:11:23.375
Because because it's

393
00:11:23.375 --> 00:11:24.666
<v James Munns>stuck in the back of my mind.

394
00:11:25.000 --> 00:11:26.041
There were some hints in there where

395
00:11:26.041 --> 00:11:27.500
you're like, oh, there's a crate.

396
00:11:27.750 --> 00:11:28.666
You know, I definitely

397
00:11:28.666 --> 00:11:30.250
exactly don't need that.

398
00:11:30.250 --> 00:11:30.916
I'll I'll definitely

399
00:11:30.916 --> 00:11:31.958
use the Lua for that.

400
00:11:31.958 --> 00:11:33.583
And it was one of those like, oh, no,

401
00:11:33.583 --> 00:11:34.958
it's this is Chekhov's

402
00:11:34.958 --> 00:11:36.333
gun in the last episode.

403
00:11:36.583 --> 00:11:37.500
<v Amos Wenger>Check Chekhov's crate.

404
00:11:37.500 --> 00:11:37.750
Yeah.

405
00:11:37.750 --> 00:11:39.625
That's what I was writing the slides.

406
00:11:39.625 --> 00:11:40.958
I was actually thinking of that line.

407
00:11:41.000 --> 00:11:42.250
Yeah, there was a crate for it.

408
00:11:42.250 --> 00:11:44.708
So how could I not look into it?

409
00:11:44.708 --> 00:11:45.250
Of course.

410
00:11:45.250 --> 00:11:47.083
I think the audience deserves that.

411
00:11:47.083 --> 00:11:48.750
I think that's what we're all here for.

412
00:11:48.958 --> 00:11:50.458
It's to watch me suffer.

413
00:11:50.458 --> 00:11:52.083
I was kind of immediately disappointed

414
00:11:52.083 --> 00:11:56.333
because the crates ofx-rs is written

415
00:11:56.333 --> 00:11:58.916
against nightly rust from six years ago.

416
00:11:59.125 --> 00:12:00.375
I didn't realize that I thought it was

417
00:12:00.375 --> 00:12:01.833
stable rust from six years ago, which

418
00:12:01.833 --> 00:12:02.666
would have been totally fine.

419
00:12:02.875 --> 00:12:04.791
I think maybe maybe a couple of fixes,

420
00:12:04.791 --> 00:12:08.000
but like unless something was wrong in

421
00:12:08.000 --> 00:12:10.041
terms of soundness, I

422
00:12:10.041 --> 00:12:11.041
think we would have been fine.

423
00:12:11.583 --> 00:12:13.000
But nightly from six years ago, I was

424
00:12:13.000 --> 00:12:16.041
using two features that just have changed

425
00:12:16.041 --> 00:12:17.625
or not there anymore, whatever.

426
00:12:18.041 --> 00:12:19.791
I got over 200 errors trying

427
00:12:19.791 --> 00:12:20.875
to compile the example code.

428
00:12:21.291 --> 00:12:23.041
So I thought that would be the end of it.

429
00:12:23.041 --> 00:12:24.208
That I told you it would be short.

430
00:12:24.500 --> 00:12:25.875
<v James Munns>Yeah, I'm trying to like 2019 rust.

431
00:12:26.208 --> 00:12:27.666
It's not as far as it could be.

432
00:12:27.833 --> 00:12:29.125
We're like post 2018,

433
00:12:29.125 --> 00:12:30.583
which is a pretty big step.

434
00:12:30.583 --> 00:12:31.166
But yeah.

435
00:12:31.625 --> 00:12:32.041
Yeah.

436
00:12:32.041 --> 00:12:33.333
Six years of nightly is a stretch.

437
00:12:33.791 --> 00:12:34.083
Yeah.

438
00:12:34.291 --> 00:12:38.750
<v Amos Wenger>But then I found NTSC-RS, which is a port

439
00:12:38.750 --> 00:12:41.791
of NTSC-QT to rust

440
00:12:41.791 --> 00:12:43.833
and SIMD by Valadaptive.

441
00:12:44.208 --> 00:12:44.833
And among other

442
00:12:44.833 --> 00:12:47.458
things, it's 20 times faster.

443
00:12:47.666 --> 00:12:48.750
Yeah, it uses SIMD and

444
00:12:48.750 --> 00:12:49.708
concurrency and stuff.

445
00:12:49.708 --> 00:12:50.541
It's an analog.

446
00:12:50.875 --> 00:12:52.083
<v James Munns>They have a very pretty website.

447
00:12:52.333 --> 00:12:52.750
<v Amos Wenger>It does.

448
00:12:53.125 --> 00:12:55.625
It's a VHS effect for your

449
00:12:55.625 --> 00:12:57.166
video filter, essentially.

450
00:12:57.416 --> 00:12:59.500
And it uses what does the website say?

451
00:13:00.083 --> 00:13:02.166
Uses algorithms that model how NTSC

452
00:13:02.166 --> 00:13:03.291
transmission and VHS

453
00:13:03.291 --> 00:13:05.333
encoding actually work.

454
00:13:05.333 --> 00:13:06.541
I imagine that is the next word.

455
00:13:06.791 --> 00:13:08.500
<v James Munns>Ooh, someone was asking me about this on

456
00:13:08.500 --> 00:13:10.333
BlueSky because there's shaders that

457
00:13:10.333 --> 00:13:12.291
I've seen for terminals that give you

458
00:13:12.291 --> 00:13:14.250
that like CRT glow and stuff like that.

459
00:13:14.250 --> 00:13:15.875
But I'm not surprised that especially

460
00:13:15.875 --> 00:13:18.750
with all of the back rooms and like

461
00:13:18.750 --> 00:13:21.375
cassette futurism stuff that's going on,

462
00:13:21.375 --> 00:13:24.291
that there's not like super shaded CRTs

463
00:13:24.291 --> 00:13:27.041
and VHS things going on these days.

464
00:13:27.291 --> 00:13:27.500
<v Amos Wenger>True.

465
00:13:27.791 --> 00:13:28.541
True, true, true, true.

466
00:13:28.541 --> 00:13:31.625
That one is all CPU as far as I can tell,

467
00:13:31.625 --> 00:13:33.250
but it's I don't know.

468
00:13:33.250 --> 00:13:34.791
I think it's an old effect.

469
00:13:34.791 --> 00:13:36.083
Yeah, ported to rust.

470
00:13:36.500 --> 00:13:38.708
And the code place is very versatile

471
00:13:38.708 --> 00:13:39.916
because it has a standalone

472
00:13:39.916 --> 00:13:42.166
application with egui controls.

473
00:13:42.166 --> 00:13:43.416
I don't know if you recognize the

474
00:13:43.416 --> 00:13:45.583
egui-ness of the of the GUI.

475
00:13:45.583 --> 00:13:45.833
<v James Munns>Definitely.

476
00:13:46.333 --> 00:13:47.208
<v Amos Wenger>Yeah, it could be.

477
00:13:47.458 --> 00:13:48.166
What's the other one?

478
00:13:48.166 --> 00:13:49.333
What's the C++ one?

479
00:13:49.583 --> 00:13:51.500
The one used in all the video games.

480
00:13:52.125 --> 00:13:52.500
Imgui.

481
00:13:52.791 --> 00:13:53.750
Oh, yeah, Dear Imgui.

482
00:13:53.958 --> 00:13:55.125
Yeah, Dear Dear Imgui.

483
00:13:55.125 --> 00:13:55.333
Exactly.

484
00:13:55.541 --> 00:13:57.125
I could be that, but I spend too much

485
00:13:57.125 --> 00:13:59.083
time with egui making demos.

486
00:13:59.375 --> 00:14:00.583
So it's available as a standalone.

487
00:14:01.000 --> 00:14:02.541
It's available as a CLI.

488
00:14:02.916 --> 00:14:04.125
It's available as an After

489
00:14:04.125 --> 00:14:05.208
Effects and Premiere plugin.

490
00:14:05.625 --> 00:14:07.750
And as an OpenFX plugin.

491
00:14:08.541 --> 00:14:09.583
<v James Munns>And are we getting back into those

492
00:14:09.583 --> 00:14:10.875
plug-in world like we were talking about

493
00:14:10.875 --> 00:14:12.541
with the audio ones where it's like you

494
00:14:12.541 --> 00:14:13.958
have purchased a DLL.

495
00:14:14.375 --> 00:14:14.791
Congratulations.

496
00:14:15.250 --> 00:14:16.375
It runs in your environment.

497
00:14:16.625 --> 00:14:16.958
Kind of.

498
00:14:16.958 --> 00:14:17.958
Is it something much more

499
00:14:17.958 --> 00:14:19.625
specific to this platform?

500
00:14:20.291 --> 00:14:20.708
<v Amos Wenger>Kind of.

501
00:14:20.708 --> 00:14:22.291
Actually, so NTSC RS is open source.

502
00:14:22.708 --> 00:14:22.916
Okay.

503
00:14:23.083 --> 00:14:25.375
So actually they use cargo-xtask to

504
00:14:25.375 --> 00:14:27.875
build the plugin, but it's just so it can

505
00:14:27.875 --> 00:14:30.416
generate that little bundle, which looks

506
00:14:30.416 --> 00:14:31.750
like a Mac OS app bundle.

507
00:14:31.750 --> 00:14:33.458
It has a contents directory with an

508
00:14:33.458 --> 00:14:35.958
Info.plist in there, a MacOS directory

509
00:14:35.958 --> 00:14:38.500
with a .ofx, which is a shared library,

510
00:14:38.500 --> 00:14:39.333
resources directory

511
00:14:39.333 --> 00:14:41.583
with an icon of the plugin.

512
00:14:41.958 --> 00:14:44.125
And the info.plist is just XML.

513
00:14:44.458 --> 00:14:45.708
There's one of the plist formats.

514
00:14:45.708 --> 00:14:46.750
There's a binary one and

515
00:14:46.750 --> 00:14:48.041
there's a third one, I forget.

516
00:14:48.291 --> 00:14:49.250
Like text but not XML.

517
00:14:49.500 --> 00:14:50.083
I don't know James,

518
00:14:50.083 --> 00:14:50.958
does that ring a bell?

519
00:14:51.208 --> 00:14:51.791
<v James Munns>Yeah, I gotcha.

520
00:14:51.791 --> 00:14:53.333
It's exactly the same kind of thing that

521
00:14:53.333 --> 00:14:54.958
I had to put together for the Postation

522
00:14:54.958 --> 00:14:56.833
bundle and for when you're

523
00:14:56.833 --> 00:14:57.958
shipping a binary on Mac OS.

524
00:14:58.166 --> 00:14:59.583
So it definitely rings true.

525
00:14:59.583 --> 00:15:00.958
<v Amos Wenger>Yeah, it looks a lot

526
00:15:00.958 --> 00:15:03.000
like it, but it's not .app.

527
00:15:03.083 --> 00:15:04.458
It's .ofx.bundle.

528
00:15:04.833 --> 00:15:05.666
It's weird.

529
00:15:06.375 --> 00:15:07.458
<v James Munns>It's a folder that's

530
00:15:07.458 --> 00:15:08.791
pretending not to be a folder.

531
00:15:09.208 --> 00:15:11.041
<v Amos Wenger>And yeah, so the reason there's an

532
00:15:11.041 --> 00:15:13.458
xtask, which is kind of turning Cargo into

533
00:15:13.458 --> 00:15:15.208
make, you know, you can have different

534
00:15:15.208 --> 00:15:17.791
targets and it's "cargo xtask

535
00:15:17.791 --> 00:15:19.833
build-ofx-plugin" is because they want to

536
00:15:19.833 --> 00:15:20.708
make a universal build.

537
00:15:20.958 --> 00:15:22.125
I don't know if that's

538
00:15:22.125 --> 00:15:24.041
built into rustc yet.

539
00:15:24.416 --> 00:15:26.791
Nowadays, you make a binary for x86-64

540
00:15:26.791 --> 00:15:30.250
and for aarch64, but in the past you did it

541
00:15:30.250 --> 00:15:32.375
for like, well, Intel 32-bit and Intel

542
00:15:32.375 --> 00:15:34.208
64-bit, you put that in the same binary

543
00:15:34.375 --> 00:15:35.875
or a PowerPC plus until

544
00:15:35.875 --> 00:15:37.375
32-bit, even further back.

545
00:15:37.666 --> 00:15:39.958
So like any kind of transition that Apple

546
00:15:39.958 --> 00:15:42.083
has done, like Mac OS has done, you could

547
00:15:42.083 --> 00:15:44.750
have a transition period where you've

548
00:15:44.750 --> 00:15:46.791
shipped both binaries in the same thing.

549
00:15:46.791 --> 00:15:48.791
And it's still happening today because

550
00:15:48.791 --> 00:15:50.541
not everyone has Apple

551
00:15:50.541 --> 00:15:52.083
Silicon Mac, an ARM Mac.

552
00:15:52.333 --> 00:15:53.833
If you go on Visual Studio Code webpage,

553
00:15:54.041 --> 00:15:55.208
for example, there's a

554
00:15:55.208 --> 00:15:57.000
single download for Mac OS button.

555
00:15:57.000 --> 00:15:58.666
But if you download that and you use

556
00:15:58.666 --> 00:16:01.291
lipo-info, then you see that there's two

557
00:16:01.291 --> 00:16:03.958
architectures in there, x86-64 and arm64.

558
00:16:04.041 --> 00:16:05.333
<v James Munns>I think even, I can't remember if it was

559
00:16:05.333 --> 00:16:08.208
Android or iOS, like for the iPhones and

560
00:16:08.208 --> 00:16:09.416
things like that, where they were doing

561
00:16:09.416 --> 00:16:11.000
that as well, because there's different

562
00:16:11.000 --> 00:16:13.250
generations of the processors that they

563
00:16:13.250 --> 00:16:15.500
use instead of doing the like, hey, we're

564
00:16:15.500 --> 00:16:18.125
compiling for the oldest compatible X86

565
00:16:18.125 --> 00:16:19.416
version and things like that.

566
00:16:19.416 --> 00:16:20.833
There's the option to do multiple

567
00:16:20.833 --> 00:16:22.375
compilations for different target

568
00:16:22.375 --> 00:16:24.500
platforms so that you can get either like

569
00:16:24.500 --> 00:16:27.791
the operating system platform level or

570
00:16:27.791 --> 00:16:30.291
like the CPU for Apple where there's much

571
00:16:30.291 --> 00:16:32.541
more control over like, hey, this works

572
00:16:32.541 --> 00:16:34.041
on these versions of phones and later,

573
00:16:34.041 --> 00:16:35.208
which means you have all of these

574
00:16:35.208 --> 00:16:37.833
processor extensions available for more

575
00:16:37.833 --> 00:16:39.000
performance and stuff like that.

576
00:16:39.000 --> 00:16:40.291
I wouldn't be surprised if both of them

577
00:16:40.291 --> 00:16:41.416
were doing that, but I guess it's just

578
00:16:41.416 --> 00:16:42.375
how you do the packaging

579
00:16:42.375 --> 00:16:43.958
and the app store handles it.

580
00:16:43.958 --> 00:16:46.125
<v Amos Wenger>It's possible, but given

581
00:16:46.125 --> 00:16:47.958
that these would be mobile apps.

582
00:16:48.583 --> 00:16:50.416
This is an aside, I will, yeah.

583
00:16:50.458 --> 00:16:53.791
I think the equation changes a little bit

584
00:16:53.791 --> 00:16:55.625
because who cares if VS Code is a few

585
00:16:55.625 --> 00:16:57.375
megabytes larger, but on

586
00:16:57.375 --> 00:16:59.125
the phone, I don't know.

587
00:16:59.125 --> 00:17:01.500
I know there's like SDK target levels for

588
00:17:01.500 --> 00:17:04.166
sure, and I know those are hard to handle

589
00:17:04.166 --> 00:17:05.958
properly, and those are also

590
00:17:05.958 --> 00:17:08.375
a thing on macOS, but yeah.

591
00:17:08.750 --> 00:17:09.958
<v James Munns>But yeah, universal binaries.

592
00:17:10.291 --> 00:17:11.875
I remember them, like you said, from X86

593
00:17:11.875 --> 00:17:13.166
and ARM, but they

594
00:17:13.166 --> 00:17:14.333
continue to be relevant.

595
00:17:15.166 --> 00:17:18.083
<v Amos Wenger>If you want to save the bytes, you can go

596
00:17:18.083 --> 00:17:21.583
to that detailed download page and have

597
00:17:21.583 --> 00:17:23.958
like the Intel or Apple Silicon build

598
00:17:23.958 --> 00:17:26.791
separately and all the, oh yeah, for

599
00:17:26.791 --> 00:17:27.625
Linux, you get the

600
00:17:27.625 --> 00:17:30.458
ARM32 builds for like, what?

601
00:17:30.875 --> 00:17:32.458
What's ARM32 these days?

602
00:17:33.500 --> 00:17:34.458
<v James Munns>Original Raspberry Pis.

603
00:17:35.083 --> 00:17:37.291
Raspberry Pi was 32-bit for a long while,

604
00:17:37.291 --> 00:17:39.041
and then it did a very weird thing where

605
00:17:39.041 --> 00:17:41.500
the kernel was 64-bit, but the user space

606
00:17:41.500 --> 00:17:44.041
was 32-bit, which was like a

607
00:17:44.041 --> 00:17:45.416
compat thing so that they didn't

608
00:17:45.416 --> 00:17:46.583
<v Amos Wenger>have to-- Because of RAM usage?

609
00:17:47.041 --> 00:17:49.166
Like 32-bit pointers or, okay.

610
00:17:49.666 --> 00:17:51.708
<v James Munns>For compat, like if people had, yeah, so

611
00:17:51.708 --> 00:17:53.916
if people had compiled some binary

612
00:17:53.916 --> 00:17:57.000
application for 32-bit, you need a 32-bit

613
00:17:57.000 --> 00:17:58.458
user space to continue to run that,

614
00:17:58.458 --> 00:17:59.625
because otherwise you'd have to recompile

615
00:17:59.625 --> 00:18:02.416
to run on a 64-bit user space, but you

616
00:18:02.416 --> 00:18:03.666
might want your operating system to be

617
00:18:03.666 --> 00:18:07.083
able to handle more than the two, or be

618
00:18:07.083 --> 00:18:09.083
able to handle more RAM, or at least have

619
00:18:09.083 --> 00:18:10.750
extended RAM range, even if

620
00:18:10.750 --> 00:18:11.958
it's virtual memory range.

621
00:18:12.291 --> 00:18:13.125
So for a while they were doing that.

622
00:18:13.125 --> 00:18:15.375
I think they're all 64-bit now, but yeah,

623
00:18:15.375 --> 00:18:17.166
I know Raspberry Pi was like the 32-bit

624
00:18:17.166 --> 00:18:18.750
ARM that everyone had and

625
00:18:18.750 --> 00:18:20.250
was popular for quite a while.

626
00:18:21.333 --> 00:18:22.416
<v Amos Wenger>Yeah, it's funny.

627
00:18:22.833 --> 00:18:25.083
If you look at Windows or Mac, Mac is

628
00:18:25.083 --> 00:18:26.541
just Intel chip, right?

629
00:18:26.541 --> 00:18:29.041
It doesn't even think about 32-bits, and

630
00:18:29.041 --> 00:18:31.333
Windows, it's x64, x64, Arm64.

631
00:18:31.666 --> 00:18:33.250
They're using the terminology for each

632
00:18:33.250 --> 00:18:34.375
platform, which is nice.

633
00:18:35.416 --> 00:18:37.375
Anyway, that bundle structure that I just

634
00:18:37.375 --> 00:18:39.333
showed is the same on other platforms,

635
00:18:39.333 --> 00:18:41.416
because it's a very macOS thing to do to

636
00:18:41.416 --> 00:18:43.875
distribute an app as a folder and call it

637
00:18:43.875 --> 00:18:45.958
a bundle, and have it show differently in

638
00:18:45.958 --> 00:18:47.333
the finder, but actually it's just a

639
00:18:47.333 --> 00:18:48.625
folder if you look in the command line.

640
00:18:48.833 --> 00:18:50.833
But as far as I've been able to find,

641
00:18:50.833 --> 00:18:52.583
because I've been looking around the

642
00:18:52.583 --> 00:18:56.291
OFXRS directory, repository, even if I

643
00:18:56.291 --> 00:18:59.000
wasn't able to run it, I saw, I looked at

644
00:18:59.000 --> 00:19:01.375
how they were doing things, and they are

645
00:19:01.375 --> 00:19:04.625
making a content slash Linux dash x86

646
00:19:04.625 --> 00:19:06.666
dash 64 directory, which

647
00:19:06.666 --> 00:19:09.041
is, it's a Franken bundle.

648
00:19:09.416 --> 00:19:10.875
Like it's weird, because

649
00:19:10.875 --> 00:19:13.958
it's macOS semantics on Linux.

650
00:19:14.375 --> 00:19:15.041
I don't know.

651
00:19:15.250 --> 00:19:16.791
It's really weird to me.

652
00:19:16.791 --> 00:19:18.958
Anyway, NTSC RS does work.

653
00:19:18.958 --> 00:19:21.791
I was able to build it from source and

654
00:19:21.791 --> 00:19:23.250
import it in DaVinci

655
00:19:23.250 --> 00:19:26.250
Resolve, and it works everywhere.

656
00:19:26.250 --> 00:19:27.041
It works as an effect.

657
00:19:27.291 --> 00:19:28.250
You can drag onto a

658
00:19:28.250 --> 00:19:29.291
clip in the edit page.

659
00:19:29.291 --> 00:19:31.458
It works as an effect in the color page,

660
00:19:31.916 --> 00:19:34.583
and it works as a node in fusion, which

661
00:19:34.583 --> 00:19:36.000
is absolutely lovely.

662
00:19:36.000 --> 00:19:37.833
You can see on the slide is a me on a

663
00:19:37.833 --> 00:19:41.541
green screen with a NTSC effect on a 480p

664
00:19:41.541 --> 00:19:42.750
timeline, because that's

665
00:19:42.750 --> 00:19:43.666
what they recommend doing.

666
00:19:43.666 --> 00:19:44.833
Even though it can run at higher

667
00:19:44.833 --> 00:19:46.458
resolutions, it's not supposed to have

668
00:19:46.458 --> 00:19:47.916
more than 480 lines.

669
00:19:48.291 --> 00:19:50.083
<v James Munns>You get sort of that like anachronism of

670
00:19:50.083 --> 00:19:52.875
like, here's my 4k image with scan lines,

671
00:19:53.125 --> 00:19:54.666
and you're like, that I don't think

672
00:19:54.666 --> 00:19:56.291
anyone was doing that.

673
00:19:56.750 --> 00:19:58.708
There might've been raw captures of that,

674
00:19:58.708 --> 00:20:00.750
but you certainly weren't broadcasting it

675
00:20:00.833 --> 00:20:02.375
more than 480 lines.

676
00:20:03.208 --> 00:20:04.416
It's got the vibe of it.

677
00:20:04.416 --> 00:20:07.458
It's very like found footage or like

678
00:20:07.458 --> 00:20:10.333
someone sent in a VHS of themselves in

679
00:20:10.333 --> 00:20:14.250
1990 to some technology show to it.

680
00:20:14.250 --> 00:20:15.291
You've definitely gotten

681
00:20:15.291 --> 00:20:16.416
that vibe out of the effect.

682
00:20:17.875 --> 00:20:19.833
<v Amos Wenger>And there's a ton of the parameters you

683
00:20:19.833 --> 00:20:21.708
can, a ton of controls you can change.

684
00:20:22.125 --> 00:20:24.833
I've put side by side the parameters as

685
00:20:24.833 --> 00:20:26.541
seen from the venture resolve and the

686
00:20:26.541 --> 00:20:28.583
parameters as seen from the

687
00:20:28.583 --> 00:20:30.250
standalone E-GUI interface.

688
00:20:30.750 --> 00:20:32.291
And the code base is just really

689
00:20:32.291 --> 00:20:34.291
well-designed because they have a single

690
00:20:34.291 --> 00:20:36.166
way to describe all the parameters and

691
00:20:36.166 --> 00:20:38.625
then it's mapped to whichever interface

692
00:20:39.375 --> 00:20:41.125
because they have essentially three

693
00:20:41.125 --> 00:20:42.083
different GUIs, right?

694
00:20:42.083 --> 00:20:43.541
They have egui and standalone, they

695
00:20:43.541 --> 00:20:45.250
have Premiere and After Effects, I think

696
00:20:45.250 --> 00:20:46.875
are roughly the same.

697
00:20:46.875 --> 00:20:47.958
I have a lot of commonalities.

698
00:20:48.416 --> 00:20:49.333
And then OpenFX.

699
00:20:49.916 --> 00:20:52.166
And OpenFX has different kinds of hosts

700
00:20:52.166 --> 00:20:53.458
like DaVinci Resolve

701
00:20:53.458 --> 00:20:56.750
or Natron or like any sort of VFX program

702
00:20:57.041 --> 00:20:58.125
that can load OpenFX

703
00:20:58.125 --> 00:20:59.291
plugins is called the host.

704
00:20:59.291 --> 00:21:00.833
It provides functions and provides these,

705
00:21:01.125 --> 00:21:03.333
the UI, the parameters like loading

706
00:21:03.333 --> 00:21:05.125
settings, saving settings, et cetera.

707
00:21:05.125 --> 00:21:08.166
And also you can see on every parameter

708
00:21:08.166 --> 00:21:09.208
here, there's a little

709
00:21:09.208 --> 00:21:11.166
diamond that's for keyframes.

710
00:21:11.583 --> 00:21:13.166
So OpenFX plugins don't

711
00:21:13.166 --> 00:21:14.125
need to know about keyframes.

712
00:21:14.250 --> 00:21:17.333
They just need to, for every render

713
00:21:17.333 --> 00:21:18.666
request, they just need to get the

714
00:21:18.666 --> 00:21:20.333
parameter for that time.

715
00:21:20.583 --> 00:21:22.375
And then the host is in charge of making

716
00:21:22.375 --> 00:21:24.125
the values change over time in the

717
00:21:24.125 --> 00:21:25.041
timeline and like

718
00:21:25.041 --> 00:21:26.500
interpolating things and stuff.

719
00:21:26.875 --> 00:21:27.291
<v James Munns>Hello, Amos.

720
00:21:27.625 --> 00:21:29.166
Yes, as someone who does not edit a lot

721
00:21:29.166 --> 00:21:31.875
of video, what distinction does keyframes

722
00:21:31.875 --> 00:21:34.166
make when it comes to applying an effect?

723
00:21:34.166 --> 00:21:36.375
Is the effect not just a stream of images

724
00:21:36.375 --> 00:21:37.875
that it's modifying or is there

725
00:21:37.875 --> 00:21:38.875
intelligence going on?

726
00:21:38.916 --> 00:21:40.500
<v Amos Wenger>Sure, but you see intensity here.

727
00:21:40.750 --> 00:21:42.375
You can make it change over time.

728
00:21:43.000 --> 00:21:44.666
So keyframe is just like, it's this value

729
00:21:44.666 --> 00:21:45.875
at that frame and then you

730
00:21:45.875 --> 00:21:47.791
wait 30 frames and then change it.

731
00:21:47.791 --> 00:21:49.500
And then it changes linearly or like

732
00:21:49.500 --> 00:21:51.875
maybe there's a little tweening happening

733
00:21:52.166 --> 00:21:53.166
between the two values.

734
00:21:53.166 --> 00:21:54.375
It's just animation basically.

735
00:21:54.791 --> 00:21:55.208
Gotcha.

736
00:21:55.250 --> 00:21:56.916
So yeah, let's keep walking through like

737
00:21:56.916 --> 00:21:59.250
what is actually in an OpenFX plugin.

738
00:21:59.750 --> 00:22:01.250
There's a well-known struct.

739
00:22:01.500 --> 00:22:02.458
It's exactly what you

740
00:22:02.458 --> 00:22:03.958
would expect from a plugin API.

741
00:22:04.041 --> 00:22:06.000
Essentially there's well-known structs.

742
00:22:06.000 --> 00:22:08.833
You export two important functions.

743
00:22:09.125 --> 00:22:11.250
One is, ofxGetNumberOfPlugins which

744
00:22:11.250 --> 00:22:12.291
in this case returns one and

745
00:22:12.291 --> 00:22:13.208
it's not shown on the slide.

746
00:22:13.666 --> 00:22:15.875
And ofxGetPlugin, which returns a struct.

747
00:22:16.208 --> 00:22:18.416
What's interesting in the OpenFX API is

748
00:22:18.416 --> 00:22:19.375
that they use a lot of

749
00:22:19.375 --> 00:22:20.958
string constants everywhere.

750
00:22:21.416 --> 00:22:22.583
Sorry, the first thing in the struct that

751
00:22:22.583 --> 00:22:23.833
you return is just a magic string.

752
00:22:24.208 --> 00:22:27.375
It's a "kOfxImageEffectPluginApi" as a

753
00:22:27.375 --> 00:22:28.750
string and that's it,

754
00:22:28.750 --> 00:22:29.541
well, without the K.

755
00:22:29.541 --> 00:22:30.166
And then there's API

756
00:22:30.166 --> 00:22:32.041
version, which is good.

757
00:22:32.041 --> 00:22:33.791
That means they can actually evolve it.

758
00:22:33.791 --> 00:22:35.625
Well, it's set to one in this case, but

759
00:22:35.625 --> 00:22:36.916
they can just like add or--

760
00:22:36.916 --> 00:22:38.375
<v James Munns>Which means it's never changed.

761
00:22:38.875 --> 00:22:39.083
<v Amos Wenger>Yeah,

762
00:22:40.083 --> 00:22:42.208
but they could like change the struct.

763
00:22:42.458 --> 00:22:44.041
They could interpret the struct as having

764
00:22:44.041 --> 00:22:46.375
this header that never changes except for

765
00:22:46.375 --> 00:22:47.875
the API version field.

766
00:22:47.875 --> 00:22:49.916
And then based on if it's one or two or

767
00:22:49.916 --> 00:22:52.333
three, like read different fields after

768
00:22:52.333 --> 00:22:54.250
that, like sort of like a rust enum.

769
00:22:54.791 --> 00:22:56.208
<v James Munns>Yeah, these are fun things for like

770
00:22:56.208 --> 00:22:58.333
binary compat, like, cause you run into

771
00:22:58.333 --> 00:23:00.416
it in protocols as well as like ABI

772
00:23:00.416 --> 00:23:02.708
things of, you need to just read the

773
00:23:02.708 --> 00:23:04.125
first two fields and then you promise

774
00:23:04.125 --> 00:23:05.250
that those never change.

775
00:23:05.750 --> 00:23:08.500
But that second API field, like you said,

776
00:23:08.500 --> 00:23:10.875
it acts like an enum where it's like, ah,

777
00:23:10.875 --> 00:23:12.750
do I actually know how to interpret the

778
00:23:12.750 --> 00:23:13.958
variant that it's claiming?

779
00:23:14.291 --> 00:23:16.083
Because if it says two and I have no idea

780
00:23:16.083 --> 00:23:17.833
what two means, I should stop reading

781
00:23:17.833 --> 00:23:18.791
because things are about

782
00:23:18.791 --> 00:23:20.125
to get very, very weird.

783
00:23:20.166 --> 00:23:21.000
<v Amos Wenger>Just throw an error.

784
00:23:21.083 --> 00:23:21.458
<v James Munns>Yeah.

785
00:23:21.500 --> 00:23:22.291
<v Amos Wenger>Yeah, instead of

786
00:23:22.291 --> 00:23:23.083
getting memory corruption.

787
00:23:23.916 --> 00:23:25.750
Next up, we have main entry, which is

788
00:23:25.750 --> 00:23:26.958
directly one of the fields

789
00:23:26.958 --> 00:23:28.166
of that struct that we return.

790
00:23:28.583 --> 00:23:30.791
And main entry is kind of like the main,

791
00:23:30.791 --> 00:23:32.875
kind of like DLLs on Windows

792
00:23:32.875 --> 00:23:34.375
also have a main entry point.

793
00:23:34.750 --> 00:23:37.458
It's just funny to me because it gets a

794
00:23:37.458 --> 00:23:39.541
string, a C string and you compare it

795
00:23:39.541 --> 00:23:41.125
against a bunch of constants and then you

796
00:23:41.125 --> 00:23:42.666
know if the action you're supposed to do

797
00:23:42.666 --> 00:23:46.125
is load or describe or get regions of

798
00:23:46.125 --> 00:23:47.666
interest or whatever or render.

799
00:23:48.083 --> 00:23:51.000
So that means every frame you render,

800
00:23:51.208 --> 00:23:52.708
every tile you render, there's a

801
00:23:52.708 --> 00:23:54.625
multi-threading thing that

802
00:23:54.625 --> 00:23:56.000
you can ask the host to do.

803
00:23:56.000 --> 00:23:57.750
You can ask the host to like divide the

804
00:23:57.750 --> 00:23:59.500
image in different tiles and ask you to

805
00:23:59.500 --> 00:24:00.375
render tiles in

806
00:24:00.375 --> 00:24:01.625
different threads and whatnot.

807
00:24:01.625 --> 00:24:03.000
You're just a poor shared library.

808
00:24:03.083 --> 00:24:04.083
So your function can be

809
00:24:04.083 --> 00:24:04.875
called from different threads.

810
00:24:05.125 --> 00:24:07.083
The first thing you do is just compare

811
00:24:07.083 --> 00:24:09.750
against like do a chain of ifs.

812
00:24:09.750 --> 00:24:10.791
It's like, okay, it's not load.

813
00:24:10.791 --> 00:24:11.458
It's not described.

814
00:24:11.458 --> 00:24:12.708
It's not describing context,

815
00:24:12.708 --> 00:24:13.541
blah, blah, blah, blah, blah.

816
00:24:13.541 --> 00:24:14.791
Finally, I was like, oh, it is render.

817
00:24:15.208 --> 00:24:17.541
So either string comparisons are a lot

818
00:24:17.541 --> 00:24:21.583
faster than I imagine or that does not

819
00:24:21.583 --> 00:24:23.333
that worried about performance.

820
00:24:23.791 --> 00:24:25.000
I don't know, James, how

821
00:24:25.000 --> 00:24:26.000
do you feel about this?

822
00:24:26.083 --> 00:24:27.000
<v James Munns>I mean, computers are fast.

823
00:24:27.458 --> 00:24:27.541
Like, yeah.

824
00:24:27.583 --> 00:24:27.791
True.

825
00:24:28.916 --> 00:24:30.458
I mean, a match, like it looks grosser

826
00:24:30.458 --> 00:24:32.000
than a match, but a match is essentially

827
00:24:32.000 --> 00:24:33.208
just doing the same thing.

828
00:24:33.500 --> 00:24:35.208
Like you can do much smarter string

829
00:24:35.208 --> 00:24:38.583
compares of like making either like a

830
00:24:38.583 --> 00:24:40.083
regex style automata

831
00:24:40.083 --> 00:24:40.791
or what are they called?

832
00:24:40.791 --> 00:24:41.791
They're not just finite statements.

833
00:24:42.041 --> 00:24:43.625
<v Amos Wenger>Sure, but why not just export constants

834
00:24:43.875 --> 00:24:45.166
from the library or something?

835
00:24:45.166 --> 00:24:48.458
Like define, I don't know, the U64 or

836
00:24:48.458 --> 00:24:51.041
whatever in file formats, like MP4, we

837
00:24:51.041 --> 00:24:52.916
have those atoms which

838
00:24:52.916 --> 00:24:55.250
are just 32 bits, like four.

839
00:24:55.541 --> 00:24:56.166
Yeah, four times

840
00:24:56.166 --> 00:24:57.875
eight is 32, just four characters.

841
00:24:58.291 --> 00:25:01.750
So you have like MOOV, you have MP4A,

842
00:25:01.750 --> 00:25:02.958
whatever, that's what all those things

843
00:25:02.958 --> 00:25:04.041
are four characters long.

844
00:25:04.041 --> 00:25:05.458
It's so that you get a nice

845
00:25:05.458 --> 00:25:07.250
32 bit constant out of it.

846
00:25:07.458 --> 00:25:11.000
<v James Munns>I assume 32 str comps are way cheaper

847
00:25:11.000 --> 00:25:12.791
than whatever video effects you're about

848
00:25:12.791 --> 00:25:13.875
to be doing, honestly.

849
00:25:14.208 --> 00:25:15.833
So like order of magnitude, they might

850
00:25:15.833 --> 00:25:17.666
go, "Eh, it's so we can debug it easier."

851
00:25:17.666 --> 00:25:18.875
Cause then you could just print instead

852
00:25:18.875 --> 00:25:21.583
of having to do a lookup or whatever when

853
00:25:21.583 --> 00:25:22.708
you print logs of like,

854
00:25:22.708 --> 00:25:23.791
"We were told to do this."

855
00:25:24.125 --> 00:25:24.458
True.

856
00:25:24.500 --> 00:25:25.000
I don't know.

857
00:25:25.000 --> 00:25:25.833
I think you're right.

858
00:25:25.833 --> 00:25:27.375
It would definitely be much smaller, but

859
00:25:27.375 --> 00:25:28.750
I think probably one of those order of

860
00:25:28.750 --> 00:25:30.291
magnitude things where it goes, "Eh,

861
00:25:30.625 --> 00:25:31.625
whatever, we're about to do

862
00:25:31.625 --> 00:25:34.083
a bunch of DSP, so whatever."

863
00:25:34.541 --> 00:25:36.208
<v Amos Wenger>Well, what I also like is that in this,

864
00:25:36.208 --> 00:25:38.625
in NTSC-RS specifically, it calls set

865
00:25:38.625 --> 00:25:40.250
hook, set panic hook.

866
00:25:40.250 --> 00:25:40.875
And I have no idea

867
00:25:40.875 --> 00:25:41.916
what the cost of that is.

868
00:25:42.208 --> 00:25:43.375
Like I have not measured it.

869
00:25:43.375 --> 00:25:45.500
I've measured other parts because the

870
00:25:45.500 --> 00:25:47.625
plugin was slow at some point, I did some

871
00:25:47.625 --> 00:25:48.333
performance measurement.

872
00:25:48.625 --> 00:25:50.458
I did not measure how long it takes to

873
00:25:50.458 --> 00:25:51.625
set the panic hook, but

874
00:25:51.625 --> 00:25:53.416
I imagine, I don't know.

875
00:25:53.416 --> 00:25:55.208
<v James Munns>I don't think a huge amount of time.

876
00:25:55.333 --> 00:25:56.500
No, but- Yeah, I have no idea

877
00:25:56.500 --> 00:25:57.625
either off the top of my head.

878
00:25:57.625 --> 00:25:58.958
This is running in std, which

879
00:25:58.958 --> 00:26:00.375
I don't do most of the time.

880
00:26:00.791 --> 00:26:01.750
Or at least I don't think too

881
00:26:01.750 --> 00:26:02.958
hard when I'm running in std.

882
00:26:02.958 --> 00:26:04.083
Like I think hard when I'm running in

883
00:26:04.083 --> 00:26:05.416
bare metal, but yeah.

884
00:26:05.875 --> 00:26:07.500
<v Amos Wenger>So next up, if the action that we're

885
00:26:07.500 --> 00:26:10.125
supposed to do is a render, then we get

886
00:26:10.125 --> 00:26:13.833
the address of the functions from the

887
00:26:13.833 --> 00:26:16.000
host that we're supposed to call, like

888
00:26:16.000 --> 00:26:17.833
propGetString or

889
00:26:17.833 --> 00:26:19.250
propGetDouble, et cetera.

890
00:26:19.250 --> 00:26:21.916
Then we call that and we get all the

891
00:26:21.916 --> 00:26:22.833
properties that we want.

892
00:26:22.833 --> 00:26:25.333
Again, mostly with string constants, like

893
00:26:25.333 --> 00:26:26.208
the propGetDouble,

894
00:26:26.541 --> 00:26:28.333
kOfxPropTime.as_ptr()

895
00:26:28.333 --> 00:26:29.375
That's just the string.

896
00:26:29.583 --> 00:26:30.750
That's just "OfxPropTime".

897
00:26:32.208 --> 00:26:34.250
And also we're getting it as a double,

898
00:26:34.250 --> 00:26:37.000
which is an F64, but it's actually just

899
00:26:37.000 --> 00:26:37.875
in DaVinci Resolve,

900
00:26:37.875 --> 00:26:39.000
that's the frame number.

901
00:26:39.833 --> 00:26:41.083
So it's fully an integer.

902
00:26:41.416 --> 00:26:42.958
<v James Munns>speed, summer games done quick was just

903
00:26:42.958 --> 00:26:44.166
happened, which means everyone was

904
00:26:44.166 --> 00:26:46.416
talking about basically all like speed

905
00:26:46.416 --> 00:26:47.208
running and glitching

906
00:26:47.208 --> 00:26:48.083
and stuff like that.

907
00:26:48.083 --> 00:26:50.083
And there's a whole thing of like, what

908
00:26:50.083 --> 00:26:52.625
goes wrong when you use a floating point

909
00:26:52.625 --> 00:26:54.166
number for your frame counter.

910
00:26:54.458 --> 00:26:56.000
And it was basically like 16 million is

911
00:26:56.000 --> 00:26:59.208
where just add one breaks down because it

912
00:26:59.208 --> 00:27:01.125
rounds down instead of up, which means

913
00:27:01.125 --> 00:27:03.833
you just hard lock at 16 million frames.

914
00:27:03.875 --> 00:27:07.958
<v Amos Wenger>So 16 millions at 25 FPS.

915
00:27:08.833 --> 00:27:10.583
<v James Munns>Oh, it's like months.

916
00:27:10.916 --> 00:27:12.791
Like this was a Mario 64 glitch that was

917
00:27:12.791 --> 00:27:15.000
like, look, this portal stops rippling

918
00:27:15.000 --> 00:27:17.500
after four and a half months, but this

919
00:27:17.500 --> 00:27:19.583
one stops after a month and a half

920
00:27:19.833 --> 00:27:20.875
because it increments by

921
00:27:20.875 --> 00:27:22.291
two or something like that.

922
00:27:22.291 --> 00:27:24.625
<v Amos Wenger>It reminds me of the Windows 95 thing

923
00:27:24.625 --> 00:27:26.291
where if it stays up

924
00:27:26.375 --> 00:27:28.750
for 91 days or something,

925
00:27:29.458 --> 00:27:30.375
<v James Munns>didn't do this.

926
00:27:30.625 --> 00:27:32.166
You get this in planes and stuff.

927
00:27:32.166 --> 00:27:32.708
When you have-

928
00:27:32.708 --> 00:27:33.583
<v Amos Wenger>It overflows.

929
00:27:33.625 --> 00:27:34.750
<v James Munns>It's either a millisecond

930
00:27:34.750 --> 00:27:36.250
or a 10th of a millisecond.

931
00:27:36.500 --> 00:27:37.791
Whenever you see something that says it

932
00:27:37.791 --> 00:27:40.291
needs to be restarted every 50 days, or

933
00:27:40.291 --> 00:27:42.708
it crashes every 50 days, that's like,

934
00:27:43.208 --> 00:27:45.500
yeah, it's either every millisecond or a

935
00:27:45.500 --> 00:27:48.208
10th of a millisecond in a U32 counter.

936
00:27:48.750 --> 00:27:50.166
Or like, yeah, you start

937
00:27:50.166 --> 00:27:51.208
to notice those numbers.

938
00:27:51.541 --> 00:27:53.083
Like this is one millisecond, 10

939
00:27:53.083 --> 00:27:55.083
millisecond, a hundred millisecond, one

940
00:27:55.083 --> 00:27:56.875
microsecond of like those times where

941
00:27:56.875 --> 00:27:58.791
it's like, yeah, it just crashes if you

942
00:27:58.791 --> 00:28:00.208
run that long and it means that they

943
00:28:00.208 --> 00:28:01.583
didn't handle overflows right.

944
00:28:01.916 --> 00:28:04.375
<v Amos Wenger>Well, to be fair, it can be hard to

945
00:28:04.375 --> 00:28:06.250
handle that properly. 16 million frames is

946
00:28:06.250 --> 00:28:08.916
25, according to o3, which

947
00:28:08.916 --> 00:28:11.000
I trust with reservations,

948
00:28:12.333 --> 00:28:14.583
it's seven days, nine hours, 46 minutes

949
00:28:14.583 --> 00:28:15.625
and 40 seconds. 16

950
00:28:15.625 --> 00:28:17.958
So if you make a student film, that's

951
00:28:17.958 --> 00:28:19.291
just really boring in

952
00:28:19.291 --> 00:28:19.833
DaVinci Resolve.

953
00:28:20.208 --> 00:28:21.875
You might get into issues at some point.

954
00:28:22.291 --> 00:28:24.208
So you get all your, you get the

955
00:28:24.208 --> 00:28:27.250
addresses of the methods you need to call

956
00:28:27.250 --> 00:28:30.333
from the host, and then you call those

957
00:28:30.333 --> 00:28:32.166
and you get all the properties, all the

958
00:28:32.166 --> 00:28:34.833
parameters that I've shown earlier, like

959
00:28:34.833 --> 00:28:37.041
intensity, frequency, detail, snow, in

960
00:28:37.041 --> 00:28:38.458
the case of NTSC RS, but

961
00:28:38.458 --> 00:28:39.333
it could be anything, right?

962
00:28:39.333 --> 00:28:40.291
You can have anything in

963
00:28:40.291 --> 00:28:41.541
the UI, it's pretty flexible.

964
00:28:41.875 --> 00:28:45.708
You also get the input signal, the output

965
00:28:45.708 --> 00:28:47.125
signal, output buffer, where you're

966
00:28:47.125 --> 00:28:48.750
supposed to write the thing, the result

967
00:28:48.750 --> 00:28:49.916
of your effect being applied.

968
00:28:50.166 --> 00:28:52.583
The host tells you which part of the

969
00:28:52.583 --> 00:28:53.958
output buffer you're supposed to touch.

970
00:28:54.375 --> 00:28:57.166
It tells you the buffer format, if it's

971
00:28:57.166 --> 00:29:00.708
RGB, RGBA, if it's eight, 16, 32 bits, if

972
00:29:00.708 --> 00:29:02.333
it's floating point integer.

973
00:29:02.708 --> 00:29:05.666
I was curious what code path actually got

974
00:29:05.666 --> 00:29:07.458
used because NTSC RS

975
00:29:07.458 --> 00:29:08.833
handles all possible combinations.

976
00:29:09.416 --> 00:29:10.750
So how is developing

977
00:29:10.750 --> 00:29:11.708
an open effects plugin?

978
00:29:11.958 --> 00:29:14.083
I wanted to find out what

979
00:29:14.083 --> 00:29:16.125
was the actual buffer format.

980
00:29:16.125 --> 00:29:16.708
I wasn't planning on

981
00:29:16.708 --> 00:29:17.541
supporting everything.

982
00:29:17.875 --> 00:29:20.291
This is research level, we're just trying

983
00:29:20.291 --> 00:29:21.750
to get it to work for one specific

984
00:29:21.750 --> 00:29:23.041
configuration, like only

985
00:29:23.041 --> 00:29:26.000
on Mac OS, only on one host.

986
00:29:26.625 --> 00:29:27.708
And the first thing that

987
00:29:27.708 --> 00:29:29.041
hit me is how do you log?

988
00:29:29.375 --> 00:29:30.166
James, do you have any idea?

989
00:29:30.416 --> 00:29:31.166
<v James Munns>How do you log?

990
00:29:31.208 --> 00:29:31.708
<v Amos Wenger>How do you log?

991
00:29:31.708 --> 00:29:32.583
How do you print things?

992
00:29:32.916 --> 00:29:35.083
<v James Munns>Okay, so if I had to guess, there's...

993
00:29:35.083 --> 00:29:36.208
<v Amos Wenger>You send a

994
00:29:36.208 --> 00:29:37.791
postcard-rpc messag—no.

995
00:29:38.833 --> 00:29:39.750
<v James Munns>It's probably not far off.

996
00:29:39.750 --> 00:29:40.916
I mean, what I would assume is in the

997
00:29:40.916 --> 00:29:42.750
plugin, you get passed in some vtabl

998
00:29:42.750 --> 00:29:43.625
that has methods that

999
00:29:43.625 --> 00:29:44.375
you're allowed to call.

1000
00:29:45.041 --> 00:29:45.916
Or there's some like

1001
00:29:45.916 --> 00:29:47.458
global or something like that.

1002
00:29:47.458 --> 00:29:47.833
<v Amos Wenger>But no.

1003
00:29:47.875 --> 00:29:48.375
<v James Munns>Yes, but no.

1004
00:29:48.416 --> 00:29:50.125
<v Amos Wenger>There's absolutely nothing standard.

1005
00:29:50.541 --> 00:29:51.750
<v James Munns>Oh, love it, love it.

1006
00:29:51.750 --> 00:29:52.416
<v Amos Wenger>There's no OpenFX

1007
00:29:52.416 --> 00:29:53.375
blessed way to do logs.

1008
00:29:53.833 --> 00:29:56.333
You can write to standard error, but then

1009
00:29:56.333 --> 00:29:59.208
you need to start your host from the

1010
00:29:59.208 --> 00:30:00.833
terminal, which is annoying.

1011
00:30:01.625 --> 00:30:02.291
Resolver has its own

1012
00:30:02.291 --> 00:30:03.416
log, which you can't touch.

1013
00:30:03.416 --> 00:30:04.833
I'm assuming you can write it from fuses

1014
00:30:05.166 --> 00:30:07.750
and they also have their own SDK to make

1015
00:30:07.750 --> 00:30:09.125
plugins that are not open effects.

1016
00:30:09.541 --> 00:30:11.125
<v James Munns>Are you gonna tell me that you spawned a

1017
00:30:11.125 --> 00:30:12.833
Lua interpreter just to print messages

1018
00:30:12.833 --> 00:30:14.791
using some kind of Lua trampoline or

1019
00:30:14.791 --> 00:30:15.375
something like that?

1020
00:30:15.416 --> 00:30:16.666
<v Amos Wenger>No, I only had a day, James.

1021
00:30:16.666 --> 00:30:17.250
I didn't do that.

1022
00:30:17.250 --> 00:30:18.833
No, no, no, you're seeing solution in

1023
00:30:18.833 --> 00:30:20.416
front of you, which I just opened the

1024
00:30:20.416 --> 00:30:21.958
file and just appended to it.

1025
00:30:22.333 --> 00:30:24.583
<v James Munns>Yeah, okay, yeah, just no sandboxing,

1026
00:30:24.583 --> 00:30:25.291
just straight to temp.

1027
00:30:25.708 --> 00:30:26.958
Yeah, of course.

1028
00:30:29.791 --> 00:30:32.750
<v Amos Wenger>Sandboxing, James, your concerns are very

1029
00:30:32.750 --> 00:30:33.875
far from the concerns

1030
00:30:33.875 --> 00:30:35.333
of VFX people, I think.

1031
00:30:35.375 --> 00:30:36.625
<v James Munns>Oh, it's fair, it's fair, yeah.

1032
00:30:37.583 --> 00:30:38.416
<v Amos Wenger>Another question, how do

1033
00:30:38.416 --> 00:30:39.750
you reload your plugin?

1034
00:30:40.333 --> 00:30:40.750
Any ideas?

1035
00:30:41.625 --> 00:30:41.958
You panic.

1036
00:30:42.458 --> 00:30:44.625
No, if you panic, I'm pretty sure it

1037
00:30:44.625 --> 00:30:45.291
takes down the host.

1038
00:30:45.375 --> 00:30:45.708
<v James Munns>Okay.

1039
00:30:45.708 --> 00:30:46.375
<v Amos Wenger>Well, yeah.

1040
00:30:46.416 --> 00:30:47.958
<v James Munns>Oh, great, yeah, that's great.

1041
00:30:48.250 --> 00:30:49.166
Write no sandboxing.

1042
00:30:49.583 --> 00:30:50.333
<v Amos Wenger>Yeah, this is not

1043
00:30:50.333 --> 00:30:52.208
WebAssembly, this is not, you know.

1044
00:30:52.291 --> 00:30:54.708
<v James Munns>How do you hotload or reload your bundle?

1045
00:30:55.041 --> 00:30:56.625
Exactly, well, you don't,

1046
00:30:56.625 --> 00:30:57.125
<v Amos Wenger>you can't.

1047
00:30:57.916 --> 00:30:59.250
I'm showing you now the video plugin

1048
00:30:59.250 --> 00:31:02.166
settings pane and you can do, "pain" is

1049
00:31:02.166 --> 00:31:04.208
right, and you can disable all, enable

1050
00:31:04.208 --> 00:31:07.000
all, but all it does is just show you the

1051
00:31:07.000 --> 00:31:08.083
plugin and the list of

1052
00:31:08.083 --> 00:31:09.416
things you can use or not.

1053
00:31:09.791 --> 00:31:12.000
But once it's loaded, it's loaded, right?

1054
00:31:12.375 --> 00:31:14.875
"dlclose" is a lie in

1055
00:31:14.875 --> 00:31:15.916
pretty much all platforms.

1056
00:31:15.916 --> 00:31:17.250
It always leaks things.

1057
00:31:17.541 --> 00:31:19.500
There's no cleanly unloading something.

1058
00:31:19.750 --> 00:31:21.541
In Rust, if you load a library, it

1059
00:31:21.541 --> 00:31:23.791
returns to static lifetime and for good

1060
00:31:23.791 --> 00:31:25.416
reasons because you really shouldn't

1061
00:31:25.416 --> 00:31:26.875
unload things that you've loaded.

1062
00:31:26.875 --> 00:31:29.166
Even if you could like cleanly do it,

1063
00:31:29.166 --> 00:31:30.958
apparently in C++ you can cleanly do it.

1064
00:31:31.375 --> 00:31:32.833
Even if you could do all that and you're

1065
00:31:32.833 --> 00:31:36.291
initializing metal kernels and like

1066
00:31:36.291 --> 00:31:39.000
shaders and whatever and those can't

1067
00:31:39.000 --> 00:31:41.625
necessarily be torn down pretty like, I

1068
00:31:41.625 --> 00:31:43.500
don't know, I don't know the details, but

1069
00:31:43.500 --> 00:31:44.333
essentially you cannot.

1070
00:31:44.750 --> 00:31:47.750
So the way to reload it is to close the

1071
00:31:47.750 --> 00:31:49.458
Vintra Resolve and then reopen the Vintra

1072
00:31:49.458 --> 00:31:50.833
Resolve and then reload the project.

1073
00:31:51.083 --> 00:31:52.125
Do you have any concept

1074
00:31:52.125 --> 00:31:53.208
of how long that takes?

1075
00:31:54.000 --> 00:31:55.291
Uh, like?

1076
00:31:55.583 --> 00:31:56.166
I've timed it.

1077
00:31:56.333 --> 00:31:57.291
How long to shut it down?

1078
00:31:57.333 --> 00:31:59.541
<v James Munns>Okay, I know vaguely what it is for the

1079
00:31:59.541 --> 00:32:01.291
self-directed research, but we do no

1080
00:32:01.291 --> 00:32:03.083
video effects or any, well, I mean like

1081
00:32:03.083 --> 00:32:05.791
we have slides, I'm sure, minutes?

1082
00:32:06.458 --> 00:32:08.916
<v Amos Wenger>No, no, thankfully, no,

1083
00:32:08.916 --> 00:32:10.791
I have a very nice M4.

1084
00:32:11.208 --> 00:32:12.416
Wait, is it taking minutes on

1085
00:32:12.416 --> 00:32:14.000
your end to open the project?

1086
00:32:14.291 --> 00:32:16.750
<v James Munns>No, it takes like 15 or 20 seconds for

1087
00:32:16.750 --> 00:32:17.958
this, but we also

1088
00:32:17.958 --> 00:32:18.833
aren't loading any video.

1089
00:32:19.041 --> 00:32:19.750
<v Amos Wenger>Yeah, exactly, yeah, yeah,

1090
00:32:19.750 --> 00:32:20.791
that's more in the ballpark.

1091
00:32:21.250 --> 00:32:22.833
What gets me is that it takes 10 seconds

1092
00:32:22.833 --> 00:32:24.333
to shut down before you

1093
00:32:24.333 --> 00:32:25.291
can even start it up again.

1094
00:32:25.750 --> 00:32:26.250
That's annoying.

1095
00:32:26.625 --> 00:32:28.916
<v James Munns>You know someone just has a sleep that

1096
00:32:28.916 --> 00:32:30.208
they're like waiting for something to do

1097
00:32:30.250 --> 00:32:31.708
and they're like, whatever, it's a bunch

1098
00:32:31.708 --> 00:32:34.208
of sleep(1) or sleep(3) in there and

1099
00:32:34.208 --> 00:32:35.125
it just, it becomes

1100
00:32:35.125 --> 00:32:36.791
serialized and it takes 10 seconds.

1101
00:32:37.125 --> 00:32:39.208
<v Amos Wenger>I think it's all the shaders and stuff,

1102
00:32:39.208 --> 00:32:40.750
whatever, being unloaded or something.

1103
00:32:41.000 --> 00:32:43.250
Actually, oh, Jesus,

1104
00:32:43.458 --> 00:32:44.458
that's another nerd snipe.

1105
00:32:44.708 --> 00:32:46.625
But Instruments could probably tell

1106
00:32:46.625 --> 00:32:48.416
us what it's spending its time on.

1107
00:32:48.666 --> 00:32:51.166
<v James Munns>Come back next season for debugging the

1108
00:32:51.166 --> 00:32:52.625
plug-in interface of this, but yeah.

1109
00:32:53.708 --> 00:32:55.625
<v Amos Wenger>No, this is the end of the arc.

1110
00:32:57.333 --> 00:32:58.750
<v James Munns>That is one of those fun things of the

1111
00:32:58.750 --> 00:33:01.750
thundering herd of destructors is a not

1112
00:33:01.750 --> 00:33:04.000
trivial performance problem in a lot of

1113
00:33:04.000 --> 00:33:06.000
places of just, oh, we're gonna run all

1114
00:33:06.000 --> 00:33:08.041
the destructors now and it turns out that

1115
00:33:08.041 --> 00:33:10.125
takes a long time, but actually just

1116
00:33:10.125 --> 00:33:11.458
killing the program would have achieved

1117
00:33:11.458 --> 00:33:14.500
the same thing 99% of the time, except

1118
00:33:14.500 --> 00:33:16.291
for now it takes us 30

1119
00:33:16.291 --> 00:33:17.875
seconds to close the program.

1120
00:33:18.458 --> 00:33:20.875
<v Amos Wenger>So because it takes a long time to shut

1121
00:33:20.875 --> 00:33:22.333
down DaVinci Resolve and open it up again

1122
00:33:22.583 --> 00:33:25.625
what other people do is that they use

1123
00:33:25.625 --> 00:33:28.166
another host like Natron, I don't know

1124
00:33:28.166 --> 00:33:29.083
how to say it in English.

1125
00:33:29.083 --> 00:33:30.625
I know it's a French software.

1126
00:33:30.875 --> 00:33:33.500
It's scriptable with Python and you just

1127
00:33:33.500 --> 00:33:36.625
write a little script that sets up a node

1128
00:33:36.625 --> 00:33:37.625
graph and renders

1129
00:33:37.625 --> 00:33:39.916
everything and saves an image.

1130
00:33:40.208 --> 00:33:40.833
<v James Munns>Now, Amos, I can

1131
00:33:40.833 --> 00:33:42.458
excuse a Lua, but a Python?

1132
00:33:45.000 --> 00:33:47.083
<v Amos Wenger>I told you, it's also doing

1133
00:33:47.083 --> 00:33:49.125
Python in DaVinci Resolve.

1134
00:33:49.291 --> 00:33:50.666
<v James Munns>Sure, I remember what episode it was.

1135
00:33:50.666 --> 00:33:52.291
There was definitely some episode where I

1136
00:33:52.291 --> 00:33:54.333
said something about Python and Amos was

1137
00:33:54.333 --> 00:33:55.708
like, I can excuse a

1138
00:33:55.708 --> 00:33:56.666
Forth, but a Python?

1139
00:33:57.333 --> 00:33:57.833
Oh, I think it was

1140
00:33:57.833 --> 00:33:58.875
talking about bootstrapping.

1141
00:33:59.416 --> 00:34:03.500
<v Amos Wenger>But there's no aarch64 version of Natron or

1142
00:34:03.500 --> 00:34:04.541
Natron or something.

1143
00:34:04.833 --> 00:34:06.250
When I launch it on my computer, it just

1144
00:34:06.250 --> 00:34:07.291
immediately crashes.

1145
00:34:07.625 --> 00:34:08.291
Well, not immediately,

1146
00:34:08.625 --> 00:34:09.500
that's what's puzzling.

1147
00:34:09.750 --> 00:34:11.458
Like most things immediately crash.

1148
00:34:11.458 --> 00:34:13.750
It opens, it shows a little window, waits

1149
00:34:13.750 --> 00:34:15.958
a few seconds, it's loading more stuff

1150
00:34:15.958 --> 00:34:17.000
and then it crashes.

1151
00:34:17.375 --> 00:34:20.958
At that point, we have talked about

1152
00:34:20.958 --> 00:34:22.708
OpenFX, but we haven't really talked

1153
00:34:22.708 --> 00:34:23.750
about how do we actually

1154
00:34:23.750 --> 00:34:24.916
do the rendering, right?

1155
00:34:24.958 --> 00:34:26.416
We wanted to improve on the text

1156
00:34:26.416 --> 00:34:27.416
rendering with Blackmagic Fusion.

1157
00:34:28.000 --> 00:34:29.208
How do we actually do that in Rust?

1158
00:34:29.500 --> 00:34:30.333
James, I don't know if you're familiar

1159
00:34:30.541 --> 00:34:31.166
with the font

1160
00:34:31.166 --> 00:34:33.666
rendering ecosystem in Rust.

1161
00:34:34.166 --> 00:34:35.916
<v James Munns>No, no is my answer.

1162
00:34:35.916 --> 00:34:37.375
I know the people who are doing it a lot

1163
00:34:37.375 --> 00:34:38.291
of the times, but I am

1164
00:34:38.291 --> 00:34:39.208
not familiar with it.

1165
00:34:39.208 --> 00:34:39.500
<v Amos Wenger>You do?

1166
00:34:39.958 --> 00:34:40.416
Well, okay.

1167
00:34:41.541 --> 00:34:41.750
(Laughs)

1168
00:34:41.750 --> 00:34:42.583
<v Amos Wenger>That was a hell of a reaction.

1169
00:34:42.833 --> 00:34:44.500
Okay, I wanted, what I was thinking when

1170
00:34:44.500 --> 00:34:46.208
I blurted out was okay, was like, you

1171
00:34:46.208 --> 00:34:46.916
choose to thank them,

1172
00:34:46.916 --> 00:34:47.833
they're doing great work.

1173
00:34:48.041 --> 00:34:49.250
But what came out was okay.

1174
00:34:49.541 --> 00:34:49.833
<v James Munns>Oh.

1175
00:34:49.833 --> 00:34:50.208
Oh.

1176
00:34:50.250 --> 00:34:51.125
Well, I know some of the people.

1177
00:34:51.583 --> 00:34:53.416
I don't recognize Mooman219.

1178
00:34:53.791 --> 00:34:55.333
If it wasn't Rafe, then I probably

1179
00:34:55.333 --> 00:34:57.291
wouldn't have recognized who it was.

1180
00:34:57.583 --> 00:34:58.916
<v Amos Wenger>The one that I found that is pretty

1181
00:34:58.916 --> 00:35:01.958
simple and that kind of replaces rusttype

1182
00:35:01.958 --> 00:35:05.541
type and ab-glyph and glyphbrush and

1183
00:35:05.541 --> 00:35:08.250
glyphbrush-layout, rusttype being like,

1184
00:35:08.250 --> 00:35:09.875
I think an early port

1185
00:35:10.291 --> 00:35:12.083
of free type to Rust.

1186
00:35:12.500 --> 00:35:13.416
Pure Rust alternative.

1187
00:35:14.166 --> 00:35:15.416
I'm not actually sure if it's a port.

1188
00:35:15.666 --> 00:35:17.083
<v James Munns>I'm just excited that it's no_std

1189
00:35:17.083 --> 00:35:19.000
because now I need to, I want to go mess

1190
00:35:19.000 --> 00:35:20.583
with it and see if I can use that for

1191
00:35:20.583 --> 00:35:21.958
font rendering because that's a fun thing

1192
00:35:21.958 --> 00:35:23.583
in embedded where a lot of the times you

1193
00:35:23.583 --> 00:35:24.750
pre-bake your fonts.

1194
00:35:25.208 --> 00:35:27.041
Like you rasterize them to specific font

1195
00:35:27.041 --> 00:35:28.208
sizes and then you just--

1196
00:35:28.250 --> 00:35:28.958
<v Amos Wenger>Yeah, a lot of this

1197
00:35:28.958 --> 00:35:30.166
stuff is actually no_std

1198
00:35:30.416 --> 00:35:32.333
<v James Munns>Take the glyphs and stamp them in.

1199
00:35:32.333 --> 00:35:32.583
<v Amos Wenger>Yeah.

1200
00:35:32.625 --> 00:35:32.833
Nice.

1201
00:35:33.250 --> 00:35:35.000
This is how far I got with my research.

1202
00:35:35.291 --> 00:35:37.000
I integrated fontdue, like I kind of

1203
00:35:37.000 --> 00:35:40.416
vampirized the NTSC-RS plugin and I got it

1204
00:35:40.416 --> 00:35:42.416
to render the number of

1205
00:35:42.416 --> 00:35:43.916
the frame in the output.

1206
00:35:44.250 --> 00:35:46.250
At first upside down and

1207
00:35:46.250 --> 00:35:47.750
then finally right side up.

1208
00:35:47.833 --> 00:35:49.708
<v James Munns>Is this one of those like is zero top

1209
00:35:49.708 --> 00:35:52.291
left or bottom left or bottom right?

1210
00:35:52.541 --> 00:35:53.791
Who is it that has the excellent someone

1211
00:35:54.041 --> 00:35:55.833
we both follow on Twitter and then

1212
00:35:55.833 --> 00:35:58.458
BlueSky has all of the graphic, are all like

1213
00:35:58.458 --> 00:35:59.916
the game engines and stuff like that?

1214
00:36:00.166 --> 00:36:01.416
<v Amos Wenger>I think it's Freya Holmer.

1215
00:36:01.916 --> 00:36:02.708
<v James Munns>Oh yeah, exactly.

1216
00:36:02.916 --> 00:36:05.125
Exactly, it's Freya of like, what is X, Y

1217
00:36:05.125 --> 00:36:07.041
and Z positive, negative and where does

1218
00:36:07.041 --> 00:36:08.791
the zero index start on all

1219
00:36:08.791 --> 00:36:10.625
of those on 2D and 3D modes?

1220
00:36:10.625 --> 00:36:12.125
Cause everything's different.

1221
00:36:12.541 --> 00:36:14.250
<v Amos Wenger>But that's the fun thing is if there's

1222
00:36:14.250 --> 00:36:16.625
several ways to do a thing, if there's

1223
00:36:16.625 --> 00:36:18.666
several possible conventions, all of them

1224
00:36:18.666 --> 00:36:19.583
are in use somewhere.

1225
00:36:20.708 --> 00:36:21.958
But Unreal is actually

1226
00:36:21.958 --> 00:36:23.250
changing that I think.

1227
00:36:23.333 --> 00:36:23.791
Oh really?

1228
00:36:24.041 --> 00:36:24.458
<v James Munns>Okay.

1229
00:36:24.541 --> 00:36:25.083
<v Amos Wenger>Yeah, they're

1230
00:36:25.083 --> 00:36:27.250
switching to something else.

1231
00:36:27.666 --> 00:36:28.291
I don't know, they're

1232
00:36:28.291 --> 00:36:29.500
joining it or whatever.

1233
00:36:29.958 --> 00:36:30.833
I saw the announcement,

1234
00:36:30.833 --> 00:36:31.750
I was like, what, why?

1235
00:36:32.125 --> 00:36:33.333
It's gonna break everything.

1236
00:36:33.875 --> 00:36:34.791
I'm pretty happy with that

1237
00:36:34.791 --> 00:36:36.708
and it runs in almost real time.

1238
00:36:36.916 --> 00:36:38.500
Apparently getting all the parameters

1239
00:36:38.500 --> 00:36:40.583
that I wasn't using was

1240
00:36:40.583 --> 00:36:42.375
what was taking the most time.

1241
00:36:42.458 --> 00:36:45.625
And I got it down to like for a 4K frame

1242
00:36:45.625 --> 00:36:47.833
rendering between three and four

1243
00:36:47.833 --> 00:36:48.750
milliseconds, which I

1244
00:36:48.750 --> 00:36:49.916
thought was pretty nice.

1245
00:36:50.166 --> 00:36:53.333
I thought we had like a, for 60 FPS, you

1246
00:36:53.333 --> 00:36:56.000
get a 16 millisecond budget.

1247
00:36:56.000 --> 00:36:58.416
<v James Munns>Yeah, 16.6 milliseconds of frame, yeah.

1248
00:36:58.666 --> 00:37:00.750
<v Amos Wenger>Exactly and I only need to do 25 FPS.

1249
00:37:01.166 --> 00:37:03.083
So I figured we had plenty of time but

1250
00:37:03.083 --> 00:37:04.208
it's not running smoothly.

1251
00:37:04.458 --> 00:37:05.166
<v James Munns>You know what that means?

1252
00:37:05.416 --> 00:37:06.791
You know what that means, Amos, right?

1253
00:37:06.791 --> 00:37:07.375
What does that mean?

1254
00:37:07.708 --> 00:37:09.041
You were using the NTSC

1255
00:37:09.041 --> 00:37:10.791
plugin at a PAL framerate.

1256
00:37:13.416 --> 00:37:15.250
Because NTSC is 30 or

1257
00:37:15.250 --> 00:37:18.833
59.97 and PAL is 25 or 50.

1258
00:37:18.875 --> 00:37:20.208
<v Amos Wenger>But my footage is, I

1259
00:37:20.208 --> 00:37:21.166
live in Europe, okay?

1260
00:37:21.458 --> 00:37:21.916
Leave me alone.

1261
00:37:22.958 --> 00:37:23.291
<v James Munns>But yeah.

1262
00:37:23.833 --> 00:37:25.541
Yeah, it's like the slow-mo guys episode

1263
00:37:25.541 --> 00:37:27.125
where they explain why they want the

1264
00:37:27.125 --> 00:37:29.166
lower frame rate and it's just why more

1265
00:37:29.166 --> 00:37:30.583
frames doesn't actually help.

1266
00:37:30.916 --> 00:37:33.583
<v Amos Wenger>Yeah, for some reason, even with it

1267
00:37:33.583 --> 00:37:35.125
taking three or four milliseconds by

1268
00:37:35.125 --> 00:37:37.750
frame, it's still not running smoothly.

1269
00:37:38.291 --> 00:37:39.541
Like playback is not smooth.

1270
00:37:39.541 --> 00:37:41.458
Fortunately, you have a playback

1271
00:37:41.458 --> 00:37:43.000
resolution kind of fixed.

1272
00:37:43.000 --> 00:37:44.791
You can run at half resolution while you

1273
00:37:44.791 --> 00:37:46.291
do the editing and then while

1274
00:37:46.291 --> 00:37:47.833
you export it full resolution.

1275
00:37:48.208 --> 00:37:50.583
But it's still kind of not great because

1276
00:37:50.583 --> 00:37:53.000
this is just one line of very basic text.

1277
00:37:53.458 --> 00:37:55.166
This is why I was wondering about this,

1278
00:37:55.583 --> 00:37:57.666
setting the panic hook because maybe

1279
00:37:57.666 --> 00:37:58.541
that's taking a few

1280
00:37:58.541 --> 00:38:00.041
milliseconds here and there, you know?

1281
00:38:00.375 --> 00:38:01.708
Probably not much but...

1282
00:38:01.750 --> 00:38:02.666
<v James Munns>Yeah, I was just saying, if you don't

1283
00:38:02.666 --> 00:38:05.166
have logging, then doing timestamps of

1284
00:38:05.166 --> 00:38:06.791
things is gonna be egregious.

1285
00:38:07.375 --> 00:38:09.416
And then, like you said, trying to do

1286
00:38:09.416 --> 00:38:11.958
profiling for a DLL that you didn't

1287
00:38:11.958 --> 00:38:13.541
start, that someone else is starting

1288
00:38:13.541 --> 00:38:16.125
becomes dot, dot, dot fun.

1289
00:38:16.583 --> 00:38:18.875
Especially if the Egooey, like if that

1290
00:38:18.875 --> 00:38:21.708
raw binary setup does things that are

1291
00:38:21.708 --> 00:38:23.666
just intrinsically different than the

1292
00:38:23.666 --> 00:38:26.083
inside of DaVinci Resolve kind of things

1293
00:38:26.291 --> 00:38:28.250
or inside of Fusion or whatever.

1294
00:38:29.041 --> 00:38:30.250
Huh, that sounds fun.

1295
00:38:30.250 --> 00:38:31.875
<v Amos Wenger>Also, the other issue is that this

1296
00:38:31.875 --> 00:38:36.125
doesn't actually improve on the renderer

1297
00:38:36.125 --> 00:38:37.333
from Fusion because it

1298
00:38:37.333 --> 00:38:38.958
does not support color emojis.

1299
00:38:39.291 --> 00:38:40.250
It just supports like

1300
00:38:40.250 --> 00:38:41.291
the basic free type stuff.

1301
00:38:41.541 --> 00:38:42.541
Look basic, I don't know.

1302
00:38:43.000 --> 00:38:45.125
Look at me dismissing their hard work.

1303
00:38:45.125 --> 00:38:46.541
It's still like an amazing feat.

1304
00:38:46.875 --> 00:38:48.541
It's only basic, yeah.

1305
00:38:48.625 --> 00:38:50.291
But it supports a ton of

1306
00:38:50.291 --> 00:38:51.958
stuff but not color emojis.

1307
00:38:52.375 --> 00:38:55.333
Swash supports more things as far as I

1308
00:38:55.333 --> 00:38:58.375
can tell but it doesn't do layouting.

1309
00:38:58.375 --> 00:38:59.833
If you wanna do layouting, you need

1310
00:38:59.833 --> 00:39:01.458
something like cosmic text.

1311
00:39:02.000 --> 00:39:05.000
And cosmic text actually works really

1312
00:39:05.000 --> 00:39:07.291
nice but I tried the demo

1313
00:39:07.291 --> 00:39:08.916
and it does render color emoji.

1314
00:39:08.916 --> 00:39:09.625
I was impressed.

1315
00:39:09.625 --> 00:39:11.250
Like, oh, does anything in the Rust

1316
00:39:11.250 --> 00:39:12.875
ecosystem support color emoji or is it

1317
00:39:12.875 --> 00:39:14.583
only a thing that browsers can do?

1318
00:39:14.583 --> 00:39:16.500
No, no, no, you can render emojis with

1319
00:39:16.500 --> 00:39:18.291
cosmic text, the Mac OS color ones.

1320
00:39:18.833 --> 00:39:20.500
Apparently the color emojis format for

1321
00:39:20.500 --> 00:39:22.166
Mac OS, Windows and Linux are completely

1322
00:39:22.166 --> 00:39:23.875
different because yeah,

1323
00:39:23.875 --> 00:39:25.291
that's why we can't have nice things.

1324
00:39:25.666 --> 00:39:27.666
But the demo of cosmic

1325
00:39:27.666 --> 00:39:29.833
text was actually pretty slow.

1326
00:39:30.166 --> 00:39:30.958
Like it's rendering a bunch

1327
00:39:30.958 --> 00:39:33.291
of text and you can select it.

1328
00:39:33.291 --> 00:39:34.250
It's kind of an editor.

1329
00:39:34.625 --> 00:39:38.000
But yeah, on this pretty good computer, I

1330
00:39:38.000 --> 00:39:39.833
expected it to be really fast, like running

1331
00:39:39.833 --> 00:39:42.083
at 60FPS or something and it did not.

1332
00:39:42.083 --> 00:39:43.125
So I don't know who's to blame here.

1333
00:39:43.291 --> 00:39:44.041
I don't know what's happening.

1334
00:39:44.583 --> 00:39:46.625
Cosmic text is probably great and fine

1335
00:39:46.625 --> 00:39:48.125
and this is not its fault.

1336
00:39:48.666 --> 00:39:49.791
But text rendering is just

1337
00:39:49.791 --> 00:39:51.333
more expensive than I thought.

1338
00:39:51.333 --> 00:39:54.375
I guess the trick is to not do it every

1339
00:39:54.375 --> 00:39:55.958
frame if you don't need to and like cache

1340
00:39:55.958 --> 00:39:56.666
as much as possible.

1341
00:39:57.083 --> 00:39:58.458
And I don't know, like, you know,

1342
00:39:58.458 --> 00:39:59.666
at-laces and whatnot.

1343
00:39:59.958 --> 00:40:00.916
And the demo is just

1344
00:40:00.916 --> 00:40:02.708
about correctness instead.

1345
00:40:02.958 --> 00:40:03.750
I have no idea.

1346
00:40:03.833 --> 00:40:05.500
But at this point, I started wondering,

1347
00:40:05.833 --> 00:40:08.000
well, I have demos on my website which

1348
00:40:08.000 --> 00:40:09.916
use more than just text.

1349
00:40:10.166 --> 00:40:11.041
Like what if I could just

1350
00:40:11.041 --> 00:40:12.750
render a whole browser in there?

1351
00:40:12.750 --> 00:40:14.041
Instead of messing around and having just

1352
00:40:14.041 --> 00:40:16.000
text and text renderers and Rust.

1353
00:40:16.458 --> 00:40:16.666
Okay.

1354
00:40:16.833 --> 00:40:18.041
When it comes to embedding browsers,

1355
00:40:18.250 --> 00:40:19.416
there are several options.

1356
00:40:19.666 --> 00:40:21.166
One of them is UltraLite, which is a

1357
00:40:21.166 --> 00:40:25.291
stripped down build of, I think, WebKit,

1358
00:40:25.833 --> 00:40:28.666
which means not Chrome, but like Safari

1359
00:40:29.000 --> 00:40:31.000
with like JavaScript core and whatnot.

1360
00:40:31.000 --> 00:40:32.791
It's this pure GPU HTML renderer.

1361
00:40:32.833 --> 00:40:33.875
I'm pretty sure that's, I

1362
00:40:33.875 --> 00:40:35.208
don't know how accurate that is.

1363
00:40:35.208 --> 00:40:36.291
It's GPU accelerated,

1364
00:40:36.291 --> 00:40:37.375
I'll acknowledge that.

1365
00:40:37.375 --> 00:40:39.208
There's SDKs for Rust,

1366
00:40:39.208 --> 00:40:41.500
non-official ones, but feasible.

1367
00:40:41.916 --> 00:40:43.000
But I took a look at the pricing.

1368
00:40:43.416 --> 00:40:44.291
James, what do you think this costs?

1369
00:40:44.625 --> 00:40:45.833
Wait, browsers cost money?

1370
00:40:45.916 --> 00:40:46.500
It's not a browser.

1371
00:40:46.791 --> 00:40:47.833
It's an embeddable

1372
00:40:47.833 --> 00:40:49.291
pure GPU HTML renderer.

1373
00:40:50.000 --> 00:40:50.500
HTML renderer?

1374
00:40:52.333 --> 00:40:53.375
<v James Munns>Contact us for pricing?

1375
00:40:53.750 --> 00:40:55.250
<v Amos Wenger>No, it's a little better than that.

1376
00:40:55.250 --> 00:40:56.541
So there's a free tier up

1377
00:40:56.541 --> 00:40:59.250
until 100K of revenue per year.

1378
00:40:59.458 --> 00:41:00.750
And then there's a pro tier.

1379
00:41:00.916 --> 00:41:01.291
Okay.

1380
00:41:01.791 --> 00:41:02.958
You can pay something yearly.

1381
00:41:03.291 --> 00:41:03.750
Okay.

1382
00:41:03.791 --> 00:41:04.458
And it's 3K.

1383
00:41:05.291 --> 00:41:08.166
So some years flirt with 100K.

1384
00:41:08.541 --> 00:41:09.208
<v James Munns>Wait, so where does the

1385
00:41:09.208 --> 00:41:10.250
browser come into this?

1386
00:41:11.125 --> 00:41:12.500
Where browser?

1387
00:41:12.833 --> 00:41:14.333
We were talking about video editing.

1388
00:41:14.708 --> 00:41:15.375
Where browser?

1389
00:41:15.791 --> 00:41:16.416
<v Amos Wenger>Where browser?

1390
00:41:16.708 --> 00:41:18.750
UltraLite lets you open a webpage pretty

1391
00:41:18.750 --> 00:41:21.541
much and render it in a GPU buffer.

1392
00:41:21.583 --> 00:41:23.500
<v James Munns>You'd have a plugin that does browser

1393
00:41:23.500 --> 00:41:24.958
rendering, so you'd write JavaScript.

1394
00:41:25.500 --> 00:41:26.958
So you're running a scripting engine

1395
00:41:26.958 --> 00:41:29.125
inside of your plugin with a rendering

1396
00:41:29.125 --> 00:41:31.416
target, and then you're going splat into

1397
00:41:31.416 --> 00:41:32.916
the image and then like, you know,

1398
00:41:33.041 --> 00:41:34.000
rasterizing that into the

1399
00:41:34.000 --> 00:41:35.083
green screen or something?

1400
00:41:35.541 --> 00:41:37.041
<v Amos Wenger>Not sure I follow your explanation, but

1401
00:41:37.041 --> 00:41:38.083
yes, the idea would be

1402
00:41:38.083 --> 00:41:39.958
to-- It's probably wrong.

1403
00:41:40.708 --> 00:41:42.333
To have, instead of rendering text

1404
00:41:42.333 --> 00:41:45.416
directly, you would render web contents.

1405
00:41:45.750 --> 00:41:47.125
And that way, those motion

1406
00:41:47.125 --> 00:41:48.125
design tools are available.

1407
00:41:48.333 --> 00:41:51.041
I forgot their names, but you can write

1408
00:41:51.041 --> 00:41:53.083
TypeScript code essentially instead of

1409
00:41:53.083 --> 00:41:54.958
doing things on a timeline and say, okay,

1410
00:41:54.958 --> 00:41:56.333
this element comes in, this element

1411
00:41:56.333 --> 00:41:57.083
rotates, this

1412
00:41:57.083 --> 00:41:59.583
element's opacity does this.

1413
00:41:59.625 --> 00:42:01.750
Yeah, code your own visualizations.

1414
00:42:02.458 --> 00:42:04.250
And then the idea would be, instead of

1415
00:42:04.250 --> 00:42:06.000
exporting that, like rendering all that

1416
00:42:06.000 --> 00:42:08.375
to video, you could have an OpenFX plugin

1417
00:42:08.375 --> 00:42:10.333
where you're just, hey, here's the file

1418
00:42:10.333 --> 00:42:12.333
for that scene or whatever.

1419
00:42:12.333 --> 00:42:13.458
It would render frames

1420
00:42:13.458 --> 00:42:15.875
as requested by the host.

1421
00:42:16.208 --> 00:42:16.458
Interesting.

1422
00:42:16.958 --> 00:42:17.958
Using an HTML engine.

1423
00:42:18.416 --> 00:42:18.625
Yeah.

1424
00:42:18.958 --> 00:42:20.250
But HTML engine is, you know.

1425
00:42:20.250 --> 00:42:22.041
That's how the question has become, how

1426
00:42:22.041 --> 00:42:24.125
do we embed HTML content?

1427
00:42:24.333 --> 00:42:26.000
So how do we render that onto a canvas?

1428
00:42:27.000 --> 00:42:28.666
So UltraLite, easy to embed in

1429
00:42:28.666 --> 00:42:31.458
everything, but I'm not paying 3K a year,

1430
00:42:31.750 --> 00:42:33.791
the year that I break 100K of revenue.

1431
00:42:34.125 --> 00:42:36.416
I looked into, it was a nice, like.

1432
00:42:36.458 --> 00:42:37.000
<v James Munns>That was my question.

1433
00:42:37.458 --> 00:42:38.333
Servo was my next question.

1434
00:42:38.666 --> 00:42:39.458
<v Amos Wenger>Yeah, Servo.

1435
00:42:39.500 --> 00:42:41.083
Servo has a gazillion dependencies.

1436
00:42:41.583 --> 00:42:43.625
It has SpiderMonkey, it has

1437
00:42:43.625 --> 00:42:45.625
its own build system called "mach".

1438
00:42:46.416 --> 00:42:48.250
I tried to build it and then immediately

1439
00:42:48.250 --> 00:42:49.291
complain about GStreamer.

1440
00:42:49.750 --> 00:42:52.708
I freaking hate slash love GStreamer.

1441
00:42:53.166 --> 00:42:54.875
<v James Munns>GStreamer is one of those words that I've

1442
00:42:54.875 --> 00:42:56.875
seen it install logs and stuff like that.

1443
00:42:56.875 --> 00:42:58.666
I have no idea how it works and it would

1444
00:42:58.666 --> 00:42:59.833
probably hurt my head to learn.

1445
00:43:01.125 --> 00:43:02.125
<v Amos Wenger>(Laughing) It's not that bad.

1446
00:43:02.125 --> 00:43:03.166
I should do an episode about it.

1447
00:43:03.166 --> 00:43:05.250
But it has a gazillion dependencies and

1448
00:43:05.250 --> 00:43:06.583
libraries spread all over the place

1449
00:43:06.583 --> 00:43:07.958
because they lean into

1450
00:43:07.958 --> 00:43:09.750
dynamic linking a lot.

1451
00:43:10.041 --> 00:43:13.375
The Servo embedding story is before it

1452
00:43:13.375 --> 00:43:16.000
was abandoned, someone was keeping a

1453
00:43:16.000 --> 00:43:17.208
repository on GitHub with

1454
00:43:17.208 --> 00:43:19.208
examples, Paul Rouget, I think.

1455
00:43:19.500 --> 00:43:21.166
And that hasn't been

1456
00:43:21.166 --> 00:43:22.000
touched in six years.

1457
00:43:22.500 --> 00:43:24.791
In the meantime, it's been unabandoned

1458
00:43:25.000 --> 00:43:26.625
and they have collaborated

1459
00:43:26.625 --> 00:43:29.583
with Tauri in January of 2024.

1460
00:43:30.041 --> 00:43:31.458
Tauri, they're like Electron but in Rust.

1461
00:43:32.291 --> 00:43:33.416
And they've done a proof

1462
00:43:33.416 --> 00:43:34.291
of concept integration.

1463
00:43:34.708 --> 00:43:35.583
<v James Munns>It got picked up by that

1464
00:43:35.583 --> 00:43:36.791
collective, what are they called?

1465
00:43:37.125 --> 00:43:37.458
<v Amos Wenger>Igalia.

1466
00:43:37.958 --> 00:43:38.583
<v James Munns>Igalia, yeah, yeah, yeah.

1467
00:43:38.583 --> 00:43:40.125
It got picked up by Igalia because a lot

1468
00:43:40.125 --> 00:43:41.625
of people want a little browser engine.

1469
00:43:41.625 --> 00:43:42.375
I guess what you were

1470
00:43:42.375 --> 00:43:43.291
saying makes a lot of sense.

1471
00:43:43.458 --> 00:43:45.750
I've seen people wanting to embed it in

1472
00:43:45.750 --> 00:43:47.958
either VR, XR type stuff,

1473
00:43:47.958 --> 00:43:49.166
or even in game engines.

1474
00:43:49.541 --> 00:43:50.625
Because like you said, you want someone

1475
00:43:50.625 --> 00:43:52.791
to be able to write, use web tech to make

1476
00:43:52.791 --> 00:43:56.291
your heads up display in a VR setting or

1477
00:43:56.291 --> 00:43:56.875
something like that.

1478
00:43:56.875 --> 00:43:58.291
So actually it does kind of track.

1479
00:43:58.791 --> 00:44:01.833
<v Amos Wenger>A lot of people do, but they use CEF,

1480
00:44:02.083 --> 00:44:02.958
which I'm just getting to.

1481
00:44:03.250 --> 00:44:04.500
I just wanted to mention that like the

1482
00:44:04.500 --> 00:44:07.125
Tauri embedding proof of concept thingy

1483
00:44:07.125 --> 00:44:08.875
happened in January of 2024.

1484
00:44:09.250 --> 00:44:11.291
And then in February of 2025, there's a

1485
00:44:11.291 --> 00:44:12.625
new blog article with a tagline

1486
00:44:12.625 --> 00:44:13.500
of "Servo is becoming

1487
00:44:13.500 --> 00:44:15.291
truly embeddable this year."

1488
00:44:15.291 --> 00:44:16.541
So, you know, we're

1489
00:44:16.541 --> 00:44:17.625
halfway through the year.

1490
00:44:17.625 --> 00:44:19.000
I'm excited to see what's to come.

1491
00:44:19.000 --> 00:44:20.708
But for now in the documentation, there's

1492
00:44:20.708 --> 00:44:22.583
nothing about how to embed or anything.

1493
00:44:23.333 --> 00:44:24.750
<v James Munns>The year of servo on the embedded.

1494
00:44:25.916 --> 00:44:28.416
<v Amos Wenger>Speaking of embedded, what most games and

1495
00:44:28.416 --> 00:44:30.458
like, for example, the League of Legends

1496
00:44:30.458 --> 00:44:32.666
clients, Riot Games client and all that,

1497
00:44:32.916 --> 00:44:34.666
all the applications that are mostly

1498
00:44:34.666 --> 00:44:37.708
Electron, but actually not, they're using

1499
00:44:37.708 --> 00:44:40.375
the Chromium embedded framework, CEF.

1500
00:44:40.375 --> 00:44:43.208
There's a crate for that, which entire

1501
00:44:43.208 --> 00:44:44.875
page just says, use the

1502
00:44:44.875 --> 00:44:46.291
Chromium embedded framework in Rust.

1503
00:44:46.583 --> 00:44:47.208
And that's it.

1504
00:44:47.208 --> 00:44:47.958
<v James Munns>I love it.

1505
00:44:47.958 --> 00:44:48.791
Straight into the point.

1506
00:44:48.833 --> 00:44:49.000
Yes.

1507
00:44:49.250 --> 00:44:50.250
With a version number

1508
00:44:50.250 --> 00:44:51.625
that definitely makes sense.

1509
00:44:52.375 --> 00:44:54.208
<v Amos Wenger>It matches the Chromium version.

1510
00:44:54.458 --> 00:44:55.958
You can tell it's automated because it

1511
00:44:55.958 --> 00:44:57.166
was less published three days ago.

1512
00:44:57.375 --> 00:44:58.875
So I'm like, and it works, right?

1513
00:44:58.875 --> 00:45:00.375
I tried their example and it works.

1514
00:45:00.375 --> 00:45:01.333
You can have your own

1515
00:45:01.333 --> 00:45:03.291
little browser with no Chrome.

1516
00:45:03.583 --> 00:45:05.791
Chrome is the browser interface, like the

1517
00:45:05.791 --> 00:45:08.708
address bar, next previous button, the

1518
00:45:08.708 --> 00:45:09.583
menus and everything.

1519
00:45:09.583 --> 00:45:10.333
That's the Chrome.

1520
00:45:10.750 --> 00:45:11.500
Firefox has a Chrome.

1521
00:45:11.916 --> 00:45:13.250
It's written in CSS and JavaScript.

1522
00:45:13.458 --> 00:45:16.125
But I don't know much about CEF and that

1523
00:45:16.125 --> 00:45:18.875
simple demo worked, but there's an

1524
00:45:18.875 --> 00:45:19.875
offscreen rendering demo

1525
00:45:19.875 --> 00:45:20.875
and that one didn't work.

1526
00:45:21.166 --> 00:45:23.875
So I'm assuming it was coded against

1527
00:45:23.875 --> 00:45:25.041
Windows or something.

1528
00:45:25.041 --> 00:45:27.791
And you need this whole kind of app

1529
00:45:27.791 --> 00:45:29.750
bundle structure with all the libraries

1530
00:45:29.750 --> 00:45:30.541
in the right places.

1531
00:45:30.958 --> 00:45:32.708
It seems like it's a lot of effort.

1532
00:45:33.208 --> 00:45:35.291
I just, I gave up on that avenue.

1533
00:45:35.625 --> 00:45:37.541
I'm sure it's probably the right way to

1534
00:45:37.541 --> 00:45:39.875
go at this point because when I look at

1535
00:45:39.875 --> 00:45:41.833
Servo, for example, I load it, my voice

1536
00:45:41.833 --> 00:45:42.708
out in it to see it.

1537
00:45:42.708 --> 00:45:43.916
And it supports a lot of things.

1538
00:45:44.125 --> 00:45:47.291
But for example, I have SVG diagrams that

1539
00:45:47.291 --> 00:45:50.500
use HTML text formatting and it only

1540
00:45:50.500 --> 00:45:52.250
showed the shapes and it didn't show the

1541
00:45:52.250 --> 00:45:54.000
text because it didn't support like

1542
00:45:54.000 --> 00:45:56.166
foreign objects, nodes in

1543
00:45:56.166 --> 00:45:57.625
SVG, which is kind of a bummer.

1544
00:45:58.541 --> 00:46:00.875
Finally, I figured the easiest way to

1545
00:46:00.875 --> 00:46:02.583
experiment with all this would be to use

1546
00:46:02.583 --> 00:46:05.375
Electron because Electron has an

1547
00:46:05.375 --> 00:46:06.875
offscreen rendering API and you can just

1548
00:46:06.875 --> 00:46:09.375
write a bit of JavaScript code.

1549
00:46:09.875 --> 00:46:13.083
And the way I started experimenting with

1550
00:46:13.083 --> 00:46:16.375
this is just listening on some TCP port

1551
00:46:16.375 --> 00:46:18.291
for some RPC requests,

1552
00:46:18.875 --> 00:46:20.375
which is just a line of JSON.

1553
00:46:20.708 --> 00:46:22.833
There's a bunch of ways to capture the

1554
00:46:22.833 --> 00:46:24.375
contents of the webpage and one of them

1555
00:46:24.375 --> 00:46:25.625
is CPU, the other is GPU.

1556
00:46:26.083 --> 00:46:28.875
I only tried the CPU because GPU is

1557
00:46:28.875 --> 00:46:30.250
essentially you get a shared texture

1558
00:46:30.250 --> 00:46:32.041
handle and then you need to open it and

1559
00:46:32.041 --> 00:46:34.875
like copy from the, or try not to copy

1560
00:46:34.875 --> 00:46:36.416
from the OpenFX plugin.

1561
00:46:36.916 --> 00:46:39.291
I'm pretty sure there would be a way to,

1562
00:46:40.000 --> 00:46:42.000
instead of filling out the buffer, say,

1563
00:46:42.000 --> 00:46:45.000
hey, here's the shared texture handle, go

1564
00:46:45.000 --> 00:46:47.125
take that, go use that, I don't know.

1565
00:46:47.541 --> 00:46:49.375
Yeah, it gives those nice images.

1566
00:46:50.125 --> 00:46:52.375
It's, this is not different from all the

1567
00:46:52.375 --> 00:46:53.875
other slides, but that one was generated

1568
00:46:53.875 --> 00:46:55.291
with the whole Electron pipeline.

1569
00:46:55.500 --> 00:46:56.958
And I figured, yeah, okay, the plugin

1570
00:46:56.958 --> 00:46:58.625
could like start Electron in the

1571
00:46:58.625 --> 00:46:59.958
background, send those RPC

1572
00:46:59.958 --> 00:47:02.375
requests, get the images back.

1573
00:47:02.375 --> 00:47:03.875
But do you have any idea how long it

1574
00:47:03.875 --> 00:47:05.208
takes to generate one

1575
00:47:05.208 --> 00:47:06.833
frame, one 4K frame?

1576
00:47:07.375 --> 00:47:08.166
<v James Munns>I bet it's not gonna be

1577
00:47:08.166 --> 00:47:09.083
three to four milliseconds.

1578
00:47:09.791 --> 00:47:10.875
<v Amos Wenger>It's not three to four milliseconds.

1579
00:47:11.833 --> 00:47:12.125
Okay.

1580
00:47:13.750 --> 00:47:14.416
650 milliseconds.

1581
00:47:15.333 --> 00:47:17.541
<v James Munns>Okay, love that, love that.

1582
00:47:17.583 --> 00:47:20.166
<v Amos Wenger>So in that there's like Node.js startup

1583
00:47:20.166 --> 00:47:21.791
time connecting over TCP

1584
00:47:21.791 --> 00:47:23.250
socket, this is not a good test.

1585
00:47:23.250 --> 00:47:25.666
And also it's encoding everything to PNG.

1586
00:47:26.458 --> 00:47:27.958
So you can definitely shave

1587
00:47:27.958 --> 00:47:30.000
off a bunch of times here.

1588
00:47:30.000 --> 00:47:30.750
There's next steps,

1589
00:47:31.250 --> 00:47:32.250
more research is required.

1590
00:47:32.958 --> 00:47:34.291
And next season is

1591
00:47:34.291 --> 00:47:36.208
required for this for sure.

1592
00:47:36.416 --> 00:47:38.666
Because I think the shared texture handle

1593
00:47:38.666 --> 00:47:41.500
thing is the way to go if doing Electron.

1594
00:47:41.833 --> 00:47:43.958
I think embedding servo is probably a lot

1595
00:47:43.958 --> 00:47:46.166
better, but then I started thinking

1596
00:47:46.166 --> 00:47:48.625
bigger picture, even if everything worked

1597
00:47:48.625 --> 00:47:50.791
well and was low latency, like you get

1598
00:47:50.791 --> 00:47:52.125
real time playback and everything.

1599
00:47:52.125 --> 00:47:54.750
You now have some interface inside the

1600
00:47:54.750 --> 00:47:56.000
host, inside DaVinci Resolve.

1601
00:47:56.500 --> 00:47:58.625
And ideally you'd also want to be able

1602
00:47:58.625 --> 00:48:00.416
to, if you're doing motion design, if you

1603
00:48:00.416 --> 00:48:02.208
have like bits of code, like you can zoom

1604
00:48:02.208 --> 00:48:04.166
in and highlight and whatnot, that's

1605
00:48:04.166 --> 00:48:05.083
something you need to do

1606
00:48:05.083 --> 00:48:07.458
inside of your web contents.

1607
00:48:07.916 --> 00:48:09.875
Right, you can't do it in the venture

1608
00:48:09.875 --> 00:48:12.041
resolve because if you zoom in, if you

1609
00:48:12.041 --> 00:48:13.416
have a clip, you put it in your scene and

1610
00:48:13.416 --> 00:48:14.166
then you zoom that in,

1611
00:48:14.250 --> 00:48:15.666
it's gonna be pixelated.

1612
00:48:16.291 --> 00:48:16.958
All right, does that make sense?

1613
00:48:17.541 --> 00:48:18.250
<v James Munns>Yeah, yeah, yeah.

1614
00:48:18.291 --> 00:48:20.416
You're doing like pan and scan on a

1615
00:48:20.416 --> 00:48:22.000
rasterized image, which means either the

1616
00:48:22.000 --> 00:48:24.583
rasterized image needs to be huge, so you

1617
00:48:24.583 --> 00:48:26.291
can zoom into whatever fidelity you want,

1618
00:48:26.708 --> 00:48:29.000
or you want it rendered on the fly, which

1619
00:48:29.000 --> 00:48:31.125
is more like a camera flying around.

1620
00:48:31.916 --> 00:48:32.125
<v Amos Wenger>Exactly.

1621
00:48:32.458 --> 00:48:35.000
So that means now that all your

1622
00:48:35.000 --> 00:48:36.875
positioning, your zooming, everything

1623
00:48:36.875 --> 00:48:39.708
needs to be a part, that needs to be a

1624
00:48:39.708 --> 00:48:42.541
parameter, that you can keyframe inside

1625
00:48:42.541 --> 00:48:44.541
the host, or it needs to be part of a

1626
00:48:44.541 --> 00:48:46.875
scene that you can kind of open in a

1627
00:48:46.875 --> 00:48:49.000
separate editor, a web-based editor, and

1628
00:48:49.000 --> 00:48:51.833
then the OpenFX plugin is just a

1629
00:48:51.833 --> 00:48:54.041
renderer, and it's just like giving you a

1630
00:48:54.041 --> 00:48:55.416
frame of a predetermined scene.

1631
00:48:55.625 --> 00:48:56.875
And you still have the problem that I

1632
00:48:56.875 --> 00:48:59.458
often have, which is you usually want to

1633
00:48:59.458 --> 00:49:01.083
do the animation synchronized with some

1634
00:49:01.083 --> 00:49:03.208
audio, right, someone's talking, and then

1635
00:49:03.208 --> 00:49:05.250
you want the code to come in as they talk

1636
00:49:05.250 --> 00:49:06.250
about different things.

1637
00:49:06.250 --> 00:49:09.250
And if your editor is outside of resolve,

1638
00:49:09.541 --> 00:49:10.250
you're not gonna get the

1639
00:49:10.250 --> 00:49:11.750
audio from the resolve timeline.

1640
00:49:12.166 --> 00:49:14.041
At that point, the only reasonable course

1641
00:49:14.041 --> 00:49:15.416
of action is to make your

1642
00:49:15.416 --> 00:49:17.666
own nonlinear editor, right?

1643
00:49:18.583 --> 00:49:19.291
<v James Munns>I was wondering if it

1644
00:49:19.291 --> 00:49:20.291
was gonna come to this.

1645
00:49:20.375 --> 00:49:21.375
<v Amos Wenger>Well, I certainly

1646
00:49:21.375 --> 00:49:22.666
haven't done it in a day.

1647
00:49:23.291 --> 00:49:25.458
I'm not planning on doing it because how

1648
00:49:25.458 --> 00:49:27.500
do you hire editors for your own

1649
00:49:27.500 --> 00:49:29.583
nonlinear editor software?

1650
00:49:30.333 --> 00:49:32.500
But that would be the way to do it.

1651
00:49:33.375 --> 00:49:34.958
<v James Munns>You sound like you're standing on the

1652
00:49:34.958 --> 00:49:36.875
ledge, and I'm not sure whether to slowly

1653
00:49:36.875 --> 00:49:38.958
talk you down or not, or if you're

1654
00:49:38.958 --> 00:49:41.750
excited for this jump into the unknown.

1655
00:49:42.333 --> 00:49:44.083
<v Amos Wenger>On top of Gear Acquisition Syndrome, I

1656
00:49:44.083 --> 00:49:46.375
have Software Replacement Syndrome.

1657
00:49:46.583 --> 00:49:48.166
I use software too much.

1658
00:49:49.333 --> 00:49:50.291
DaVinci Resolve used to be this

1659
00:49:50.291 --> 00:49:52.333
really intimidating, big piece of

1660
00:49:52.333 --> 00:49:53.375
software that I didn't

1661
00:49:53.375 --> 00:49:54.875
know how to deal with.

1662
00:49:55.166 --> 00:49:58.666
And now I kind of see the seams of the

1663
00:49:58.666 --> 00:49:59.833
different parts of the

1664
00:49:59.833 --> 00:50:01.583
things that they pulled together.

1665
00:50:02.041 --> 00:50:06.041
And I think you could do better if you

1666
00:50:06.041 --> 00:50:06.875
started from scratch.

1667
00:50:07.000 --> 00:50:08.583
The problem is, of course, all the

1668
00:50:08.583 --> 00:50:10.583
unknown unknowns, all the things that

1669
00:50:10.583 --> 00:50:12.208
they got absolutely right, and I have no

1670
00:50:12.208 --> 00:50:14.291
idea how to do high-performance image

1671
00:50:14.291 --> 00:50:15.500
processing using shaders.

1672
00:50:16.333 --> 00:50:16.958
No idea about that.

1673
00:50:17.666 --> 00:50:19.583
<v James Munns>Or just 30 years of paper cut shaving.

1674
00:50:20.291 --> 00:50:21.875
There's a huge amount of, with Second

1675
00:50:21.875 --> 00:50:23.208
System Syndrome, where you're like, "I

1676
00:50:23.208 --> 00:50:24.333
could make it so much easier."

1677
00:50:24.708 --> 00:50:27.250
And you realize that so much of the

1678
00:50:27.250 --> 00:50:29.375
things that make it painful are like,

1679
00:50:29.375 --> 00:50:31.500
"Oh, we decided it was worth that pain,

1680
00:50:31.875 --> 00:50:33.583
accumulated over 30 years."

1681
00:50:33.583 --> 00:50:34.250
You know what I mean?

1682
00:50:34.958 --> 00:50:36.041
But yeah.

1683
00:50:36.291 --> 00:50:37.833
You cheat by doing less, so if you could

1684
00:50:37.833 --> 00:50:39.000
figure out how to do something that only

1685
00:50:39.000 --> 00:50:40.916
matters for you, hell yeah.

1686
00:50:41.416 --> 00:50:43.333
But yeah, I imagine

1687
00:50:43.333 --> 00:50:44.250
it's gonna be a thing.

1688
00:50:45.833 --> 00:50:47.875
<v Amos Wenger>Well, I'm gonna try not to

1689
00:50:47.875 --> 00:50:49.625
go any further down that road.

1690
00:50:50.208 --> 00:50:50.666
Wish me luck.

1691
00:50:50.875 --> 00:50:51.583
<v Amanda Majorowicz>Famous last words.

1692
00:50:52.000 --> 00:50:52.958
I think we both know.

1693
00:50:54.125 --> 00:50:55.250
<v James Munns>That road does not end.

1694
00:50:55.708 --> 00:50:57.041
I was gonna say, we are both the epitome

1695
00:50:57.041 --> 00:50:58.541
of if you give a mouse a cookie.

1696
00:50:59.083 --> 00:51:01.250
We figured out scripting to, okay, well,

1697
00:51:01.250 --> 00:51:01.833
I guess I need to

1698
00:51:01.833 --> 00:51:02.875
replace DaVinci Resolve.

1699
00:51:03.458 --> 00:51:04.833
(Laughs)

1700
00:51:04.916 --> 00:51:07.875
<v Amos Wenger>But I, no, no, I-- I will be strong.

1701
00:51:08.291 --> 00:51:09.333
<v James Munns>All right, I believe in you.

1702
00:51:09.708 --> 00:51:10.333
Thank you.

1703
00:51:10.333 --> 00:51:11.541
I'm looking forward to next season.

1704
00:51:12.625 --> 00:51:12.875
(Laughs)

1705
00:51:13.166 --> 00:51:13.500
<v James Munns>Me too.

1706
00:51:21.458 --> 00:51:22.958
This episode is sponsored by Depot,

1707
00:51:23.125 --> 00:51:23.916
the build acceleration

1708
00:51:23.916 --> 00:51:25.208
platform that's on a mission

1709
00:51:25.208 --> 00:51:26.833
to make all builds near instant.

1710
00:51:27.208 --> 00:51:28.541
If you're tired of watching your builds

1711
00:51:28.541 --> 00:51:29.750
and GitHub actions crawl

1712
00:51:29.750 --> 00:51:31.041
like the modern day equivalent

1713
00:51:31.041 --> 00:51:33.041
of paint drying, give Depot's GitHub

1714
00:51:33.041 --> 00:51:34.083
Actions runners a try.

1715
00:51:34.541 --> 00:51:35.958
They're up to 10 times faster with

1716
00:51:35.958 --> 00:51:37.208
unlimited concurrency,

1717
00:51:37.250 --> 00:51:38.583
faster caching, support for

1718
00:51:38.583 --> 00:51:40.083
Linux, macOS and Windows,

1719
00:51:40.375 --> 00:51:41.291
and they plug right into

1720
00:51:41.291 --> 00:51:42.375
other Depot optimizations

1721
00:51:42.625 --> 00:51:44.333
like accelerated container image builds

1722
00:51:44.458 --> 00:51:45.416
and remote caching for

1723
00:51:45.416 --> 00:51:47.625
Bazel, Turborepo, Gradle and more.

1724
00:51:48.041 --> 00:51:49.541
Depot is built by developers who are

1725
00:51:49.541 --> 00:51:50.541
tired of wasting time

1726
00:51:50.541 --> 00:51:52.041
waiting on builds instead of shipping.

1727
00:51:52.333 --> 00:51:53.125
It's made for teams

1728
00:51:53.125 --> 00:51:54.125
that wanna move faster

1729
00:51:54.375 --> 00:51:55.083
and stay focused on

1730
00:51:55.083 --> 00:51:55.958
what actually matters.

1731
00:51:56.458 --> 00:51:57.125
That's why companies

1732
00:51:57.125 --> 00:51:58.583
like PostHog use Depot

1733
00:51:58.583 --> 00:52:00.458
to cut build times from over three hours

1734
00:52:00.458 --> 00:52:01.583
to just three minutes,

1735
00:52:01.833 --> 00:52:02.916
saving tens of thousands

1736
00:52:02.916 --> 00:52:04.250
of build hours every week.

1737
00:52:04.541 --> 00:52:05.500
Start your free seven

1738
00:52:05.500 --> 00:52:06.875
day trial at depot.dev

1739
00:52:06.875 --> 00:52:08.083
and let them know we sent you.
