-
Notifications
You must be signed in to change notification settings - Fork 48
/
612.srt
1908 lines (1399 loc) · 41.1 KB
/
612.srt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
WEBVTT
X-TIMESTAMP-MAP=MPEGTS:181083,LOCAL:00:00:00.000
00:00:00.506 --> 00:00:09.576 A:middle
[ Silence ]
00:00:10.076 --> 00:00:12.736 A:middle
>> Hello and welcome
to the advanced editing
00:00:12.736 --> 00:00:13.986 A:middle
with AV foundation session.
00:00:14.646 --> 00:00:17.116 A:middle
My name's Scott Johnston
on the AV Foundation Team.
00:00:17.616 --> 00:00:25.146 A:middle
[ Applause ]
00:00:25.646 --> 00:00:27.626 A:middle
So today we have two
main topics for you.
00:00:28.446 --> 00:00:32.066 A:middle
Introducing custom video
compositing, and secondly,
00:00:32.226 --> 00:00:34.226 A:middle
a really useful debugging
technique
00:00:34.346 --> 00:00:35.846 A:middle
for debugging compositions.
00:00:36.286 --> 00:00:38.766 A:middle
So let's start with
custom video compositing.
00:00:41.266 --> 00:00:43.036 A:middle
First of all, we're going
to take a few moments just
00:00:43.036 --> 00:00:46.026 A:middle
to review the existing AV
Foundation Architecture.
00:00:49.116 --> 00:00:53.806 A:middle
AV Foundation has been
available for a few years now.
00:00:54.266 --> 00:00:56.746 A:middle
Ever since iOS 4 and Lion.
00:00:57.886 --> 00:01:00.926 A:middle
It's used in a wide variety
of video editing applications
WEBVTT
X-TIMESTAMP-MAP=MPEGTS:181083,LOCAL:00:00:00.000
00:00:57.886 --> 00:01:00.926 A:middle
It's used in a wide variety
of video editing applications
00:01:00.926 --> 00:01:04.366 A:middle
in the app store
including those from Apple.
00:01:04.495 --> 00:01:08.116 A:middle
It provides core and
key fundamental tools
00:01:08.606 --> 00:01:11.526 A:middle
to create cuts only
temporal compositions,
00:01:12.336 --> 00:01:15.276 A:middle
video mixing compositions,
and of course audio mixing.
00:01:21.416 --> 00:01:24.136 A:middle
In Mountain Lion and iOS
6, it's quite possible
00:01:24.136 --> 00:01:28.066 A:middle
to create a wide variety
of visual effects.
00:01:30.216 --> 00:01:35.176 A:middle
Dissolves, scaling,
transformation effects,
00:01:35.446 --> 00:01:43.636 A:middle
layering, picture in picture
effects, wipes, and slides.
00:01:43.636 --> 00:01:54.906 A:middle
And now, new for
Mavericks and iOS 7,
00:01:55.396 --> 00:01:57.276 A:middle
we'd like to give you
guys the opportunity
00:01:57.276 --> 00:02:00.386 A:middle
to place your code inside
the video composition
WEBVTT
X-TIMESTAMP-MAP=MPEGTS:181083,LOCAL:00:00:00.000
00:01:57.276 --> 00:02:00.386 A:middle
to place your code inside
the video composition
00:02:00.386 --> 00:02:01.206 A:middle
render pipeline.
00:02:01.826 --> 00:02:10.686 A:middle
So giving you direct access
to the pixels with the CPU
00:02:10.686 --> 00:02:17.746 A:middle
and the GPU to colorize,
warp, texture map.
00:02:18.706 --> 00:02:21.836 A:middle
Achieve a much wider
variety of complex effects.
00:02:25.926 --> 00:02:29.756 A:middle
And we'll see more of the
sea otters later [laughter].
00:02:30.716 --> 00:02:32.396 A:middle
So custom video compositor.
00:02:33.726 --> 00:02:35.356 A:middle
But what is a video compositor?
00:02:36.446 --> 00:02:39.626 A:middle
Well, it's basically a
chunk of video mixing code.
00:02:40.556 --> 00:02:44.756 A:middle
Which takes zero or more
source frames blending
00:02:45.196 --> 00:02:50.186 A:middle
or modifying the pixels to
deliver a single output frame.
00:02:50.516 --> 00:02:54.876 A:middle
We'll find the existing
built-in compositor inside the
00:02:54.876 --> 00:02:55.986 A:middle
composition architecture.
00:02:58.316 --> 00:03:01.566 A:middle
So looking inside
compositions as a whole,
WEBVTT
X-TIMESTAMP-MAP=MPEGTS:181083,LOCAL:00:00:00.000
00:02:58.316 --> 00:03:01.566 A:middle
So looking inside
compositions as a whole,
00:03:01.986 --> 00:03:04.176 A:middle
we first see the AVComposition,
00:03:04.936 --> 00:03:07.306 A:middle
which is our temporal
cuts-only edit.
00:03:07.976 --> 00:03:14.956 A:middle
We place time ranges of
source assets in tracks.
00:03:15.676 --> 00:03:17.466 A:middle
Here we have two
tracks, A and B,
00:03:18.276 --> 00:03:21.986 A:middle
and in this example we're going
to be dissolving from track A
00:03:21.986 --> 00:03:23.866 A:middle
to B and back to A again.
00:03:23.866 --> 00:03:27.826 A:middle
In order to achieve
the dissolve,
00:03:28.576 --> 00:03:32.786 A:middle
we have the AVVideoComposition,
00:03:32.786 --> 00:03:38.296 A:middle
which stores the video mixing
parameters and time ranges.
00:03:38.296 --> 00:03:48.466 A:middle
So let's take a closer look at
the video composition itself.
00:03:48.466 --> 00:03:51.876 A:middle
Now for these time ranges
in the video composition,
00:03:52.206 --> 00:03:53.536 A:middle
they're instruction objects,
00:03:54.716 --> 00:03:56.736 A:middle
which store the mixing
parameters.
WEBVTT
X-TIMESTAMP-MAP=MPEGTS:181083,LOCAL:00:00:00.000
00:04:00.696 --> 00:04:02.976 A:middle
But some instructions
are simpler than others.
00:04:02.976 --> 00:04:04.906 A:middle
For example, one source track.
00:04:05.446 --> 00:04:07.856 A:middle
Another can take more than one.
00:04:07.856 --> 00:04:16.125 A:middle
And looking at the first
simple segment there,
00:04:16.125 --> 00:04:17.206 A:middle
that first instruction.
00:04:17.805 --> 00:04:22.106 A:middle
It's effectively just passing
through frames from track A
00:04:22.106 --> 00:04:27.276 A:middle
through the compositor
rendering the first segment.
00:04:27.746 --> 00:04:29.046 A:middle
Now the more interesting
segment is
00:04:29.076 --> 00:04:30.916 A:middle
where the initial
dissolve happens,
00:04:30.916 --> 00:04:35.096 A:middle
where we take two frames,
and using the parameters
00:04:35.096 --> 00:04:37.936 A:middle
from the instruction to tell
the compositor to blend them.
00:04:38.886 --> 00:04:44.986 A:middle
And with them, we render
the rest of the edit.
00:04:44.986 --> 00:04:46.466 A:middle
Focusing even more
on the compositor,
00:04:47.096 --> 00:04:53.146 A:middle
we have multiple source
frames and a single frame out.
00:04:55.256 --> 00:04:57.846 A:middle
Along with the source frames,
we have the instruction object
00:04:57.996 --> 00:04:59.196 A:middle
with the mixing parameters.
00:04:59.736 --> 00:05:04.326 A:middle
In this case, a dissolve
which we encode
WEBVTT
X-TIMESTAMP-MAP=MPEGTS:181083,LOCAL:00:00:00.000
00:04:59.736 --> 00:05:04.326 A:middle
In this case, a dissolve
which we encode
00:05:04.326 --> 00:05:05.966 A:middle
as a property in
the instruction.
00:05:05.966 --> 00:05:09.716 A:middle
In this case, in ramp
from one down to zero.
00:05:10.296 --> 00:05:15.686 A:middle
At this point, we're
at the compositor,
00:05:15.686 --> 00:05:18.396 A:middle
so let's introduce the new
custom compositing API.
00:05:19.236 --> 00:05:25.326 A:middle
The built-in compositor is
green, you can now replace that
00:05:26.646 --> 00:05:30.546 A:middle
and do your own stuff
in Mavericks and iOS 7.
00:05:32.476 --> 00:05:36.096 A:middle
In addition, you can implement
your own instruction to gather
00:05:36.096 --> 00:05:39.396 A:middle
up and carry your own
set of mixing parameters.
00:05:39.956 --> 00:05:45.506 A:middle
It's bundled up with the source
frames in the request object.
00:05:46.026 --> 00:05:52.596 A:middle
So you'll be implementing the
new protocol AVVideoCompositing,
00:05:53.116 --> 00:05:56.836 A:middle
which receives the new object,
00:05:56.836 --> 00:06:00.306 A:middle
AVAsynchronousVideoComposition
request.
WEBVTT
X-TIMESTAMP-MAP=MPEGTS:181083,LOCAL:00:00:00.000
00:05:56.836 --> 00:06:00.306 A:middle
AVAsynchronousVideoComposition
request.
00:06:00.876 --> 00:06:06.846 A:middle
And, in addition, you'll
be implementing the
00:06:07.116 --> 00:06:09.966 A:middle
AVVideoCompositionInstruction.
00:06:10.506 --> 00:06:16.546 A:middle
Now looking at the
methods involved here,
00:06:17.856 --> 00:06:19.196 A:middle
you'll be receiving your request
00:06:19.536 --> 00:06:21.756 A:middle
when you implement
startVideo CompositionRequest.
00:06:22.326 --> 00:06:26.006 A:middle
And then deliver the
frame once you've rendered
00:06:26.826 --> 00:06:28.396 A:middle
with finishWith
ComposedVideoFrame.
00:06:28.396 --> 00:06:32.986 A:middle
Now in the event of an error,
you can call finishWithError
00:06:33.046 --> 00:06:35.666 A:middle
or acknowledge a
cancelled request.
00:06:36.286 --> 00:06:44.066 A:middle
Okay, so what about the
format of the source frames?
00:06:44.066 --> 00:06:45.886 A:middle
How are the pixels arranged?
00:06:45.886 --> 00:06:50.276 A:middle
Well you've probably
looked in our header files
00:06:50.276 --> 00:06:52.136 A:middle
and seen a wide variety
of formats.
00:06:52.706 --> 00:06:57.406 A:middle
You'll probably only see a
small subset here, but generally
00:06:58.106 --> 00:07:09.876 A:middle
when we're decoding H.264 video,
you'll receive YUV 8-bit 420.
WEBVTT
X-TIMESTAMP-MAP=MPEGTS:181083,LOCAL:00:00:00.000
00:06:58.106 --> 00:07:09.876 A:middle
when we're decoding H.264 video,
you'll receive YUV 8-bit 420.
00:07:10.026 --> 00:07:13.596 A:middle
But that could vary and
your code may not be able
00:07:13.596 --> 00:07:14.716 A:middle
to render into YUV.
00:07:15.016 --> 00:07:17.176 A:middle
So you can express the exact
format that you require
00:07:17.886 --> 00:07:20.086 A:middle
by implementing source
pixel buffer attributes.
00:07:20.666 --> 00:07:25.806 A:middle
Now here you can provide
an array of formats
00:07:25.806 --> 00:07:27.416 A:middle
that you would like to receive.
00:07:28.406 --> 00:07:33.196 A:middle
In this case, our example
requires 32-bit BGRA,
00:07:34.266 --> 00:07:37.216 A:middle
and by doing so the
system will, on the fly,
00:07:37.216 --> 00:07:45.396 A:middle
convert the source
frames into that format.
00:07:45.616 --> 00:07:47.986 A:middle
Similarly for the
output pixel format,
00:07:49.356 --> 00:07:50.996 A:middle
you implement
requiredPixelBuffer
00:07:50.996 --> 00:07:52.426 A:middle
AttributesForRenderContext.
00:07:55.386 --> 00:08:05.276 A:middle
And we're requiring
32-bit BGRA here.
WEBVTT
X-TIMESTAMP-MAP=MPEGTS:181083,LOCAL:00:00:00.000
00:07:55.386 --> 00:08:05.276 A:middle
And we're requiring
32-bit BGRA here.
00:08:05.356 --> 00:08:08.956 A:middle
Now in order to get hold of a
new empty frame to render into,
00:08:09.386 --> 00:08:10.956 A:middle
we go back to the
request object,
00:08:11.806 --> 00:08:16.166 A:middle
ask it for the render context,
which contains information
00:08:16.556 --> 00:08:20.186 A:middle
about the aspect ratio and the
size that we're rendering to,
00:08:20.706 --> 00:08:25.696 A:middle
and also the required
pixel format.
00:08:25.906 --> 00:08:27.396 A:middle
So we ask it for a
new pixel buffer.
00:08:27.606 --> 00:08:29.316 A:middle
Now this comes from
a managed pool.
00:08:29.826 --> 00:08:39.346 A:middle
So the frame is allocated, we
can then render in to their,
00:08:39.346 --> 00:08:43.275 A:middle
in this case our dissolve and
send the output on its way.
00:08:43.275 --> 00:08:49.156 A:middle
Now let's jump into Xcode
and we'll have a demo.
00:08:49.286 --> 00:08:54.186 A:middle
Okay, so, in Xcode, here we are
with the Hello World equivalent
00:08:54.186 --> 00:08:56.006 A:middle
of a custom compositor.
00:08:56.746 --> 00:09:01.176 A:middle
So, here we're implementing
our AVVideoCompositing protocol
WEBVTT
X-TIMESTAMP-MAP=MPEGTS:181083,LOCAL:00:00:00.000
00:08:56.746 --> 00:09:01.176 A:middle
So, here we're implementing
our AVVideoCompositing protocol
00:09:02.256 --> 00:09:08.616 A:middle
and those three methods that
we called out in the slides.
00:09:09.206 --> 00:09:14.866 A:middle
So again, we're requiring
BGRA and it's simply a case
00:09:14.866 --> 00:09:16.516 A:middle
of putting in that value.
00:09:16.516 --> 00:09:20.866 A:middle
Now remember it's an array, so
we can, if we do support YUV
00:09:20.866 --> 00:09:26.066 A:middle
in some flavor, we
can drop it in there.
00:09:26.126 --> 00:09:29.146 A:middle
Similarly for the output,
in this case it's identical.
00:09:29.766 --> 00:09:36.656 A:middle
Now the action happens
inside the rendering function
00:09:36.656 --> 00:09:41.546 A:middle
startVideo CompositionRequest
receiving our request object.
00:09:42.596 --> 00:09:43.566 A:middle
Let's open this guy.
00:09:45.186 --> 00:09:49.996 A:middle
Okay, so, the first
thing we do here is -
00:09:49.996 --> 00:09:52.736 A:middle
it's slightly hard coded
just for simplicity -
00:09:53.766 --> 00:09:56.826 A:middle
but we fish out the
source frames
00:09:56.826 --> 00:09:59.726 A:middle
from the passed in
request object.
WEBVTT
X-TIMESTAMP-MAP=MPEGTS:181083,LOCAL:00:00:00.000
00:10:00.616 --> 00:10:03.056 A:middle
Now you'll get these as
Core Video pixel buffers,
00:10:03.316 --> 00:10:07.936 A:middle
and we'll try our hardest
00:10:07.936 --> 00:10:09.736 A:middle
to make sure they're
IOSurface backed,
00:10:09.736 --> 00:10:11.966 A:middle
so they're going
to be on the GPU.
00:10:12.436 --> 00:10:16.966 A:middle
The next thing we do
is we allocate a fresh,
00:10:16.966 --> 00:10:20.526 A:middle
new pixel buffer to render into
so, as we saw in the slides,
00:10:20.526 --> 00:10:23.216 A:middle
we ask the request object
for the render context
00:10:24.476 --> 00:10:25.756 A:middle
and allocate a new pixel buffer.
00:10:26.086 --> 00:10:31.406 A:middle
Then we do the rendering and
deliver the output frame.
00:10:31.726 --> 00:10:35.366 A:middle
So before we look at what's
inside that little render block,
00:10:35.556 --> 00:10:39.436 A:middle
let's run up and
see what this does.
00:10:39.996 --> 00:10:43.256 A:middle
Okay here we are
with a deer again.
00:10:43.516 --> 00:10:46.866 A:middle
Okay so this app, a simple
app, and it's really simple
00:10:46.866 --> 00:10:50.766 A:middle
because we've managed to use
the new AVPlayerView from AVKit,
00:10:51.546 --> 00:10:55.116 A:middle
which gives you a nice, simple
player view with a scrubber
00:10:55.766 --> 00:10:57.226 A:middle
and various other goodies.
00:10:57.946 --> 00:11:00.816 A:middle
So let's play and
we'll see what happens.
WEBVTT
X-TIMESTAMP-MAP=MPEGTS:181083,LOCAL:00:00:00.000
00:10:57.946 --> 00:11:00.816 A:middle
So let's play and
we'll see what happens.
00:11:01.496 --> 00:11:03.596 A:middle
Okay so we've got a
really simple wipe,
00:11:03.596 --> 00:11:05.246 A:middle
with that white line
coming down.
00:11:06.086 --> 00:11:08.186 A:middle
Let's play it again
if you missed it.
00:11:08.836 --> 00:11:11.526 A:middle
Okay so there's nothing
particularly exciting,
00:11:11.526 --> 00:11:17.456 A:middle
but the main thing is this will
illustrate how we can get hold
00:11:17.456 --> 00:11:20.876 A:middle
of those pixels, in
this case which is CPU,
00:11:21.586 --> 00:11:25.276 A:middle
so the pixel buffers you can
lock to the base address.
00:11:25.336 --> 00:11:33.056 A:middle
At which point, you can then
ask for the usual things
00:11:33.056 --> 00:11:36.636 A:middle
like the bytes-per-row
and the base address,
00:11:36.636 --> 00:11:39.846 A:middle
and at which point we can then
start splatting the pixels.
00:11:39.846 --> 00:11:43.286 A:middle
Now, you'll see this rather ugly
- and don't do this at home -
00:11:43.286 --> 00:11:44.736 A:middle
memcpy and memset stuff.
00:11:45.326 --> 00:11:52.676 A:middle
Just purely for simplicity
here, but I'll close that.
00:11:52.676 --> 00:11:56.616 A:middle
Now, up here, when we
play that transition,
00:11:56.616 --> 00:11:59.606 A:middle
obviously we're doing some
sort of animation and on
00:11:59.606 --> 00:12:02.576 A:middle
to calculate the vertical
position of the white band.
WEBVTT
X-TIMESTAMP-MAP=MPEGTS:181083,LOCAL:00:00:00.000
00:11:59.606 --> 00:12:02.576 A:middle
to calculate the vertical
position of the white band.
00:12:03.496 --> 00:12:08.056 A:middle
We have to basically interpolate
across our time range to work
00:12:08.056 --> 00:12:12.206 A:middle
out exactly at what
point we are,
00:12:12.206 --> 00:12:14.366 A:middle
we use a thing called
tweening here,
00:12:14.366 --> 00:12:16.976 A:middle
we calculate this tween factor.
00:12:17.166 --> 00:12:20.496 A:middle
Now we're going to come back to
this in the slides in a moment,
00:12:20.926 --> 00:12:23.656 A:middle
but basically there's some basic
arithmetic going on in here
00:12:24.346 --> 00:12:28.726 A:middle
and it's all to do with
the time range associated
00:12:28.786 --> 00:12:32.166 A:middle
with the current video
composition instruction.
00:12:32.616 --> 00:12:34.256 A:middle
We'll come back to
that in a sec.
00:12:34.926 --> 00:12:37.266 A:middle
But this isn't a
particularly exciting example
00:12:37.266 --> 00:12:38.506 A:middle
of a compositor, so
let's have a look
00:12:38.506 --> 00:12:41.416 A:middle
at something using
the GPU, using OpenGL.
00:12:42.226 --> 00:12:43.566 A:middle
So let's run this guy again.
00:12:43.566 --> 00:12:49.066 A:middle
And this time we're going
to change the composition,
00:12:49.066 --> 00:12:51.586 A:middle
and I've got some pre-prepared
ones fortunately, so,
00:12:52.736 --> 00:12:56.126 A:middle
let's switch to this guy.
00:12:56.126 --> 00:12:58.516 A:middle
Okay, so, let's play
it this time.
00:12:58.666 --> 00:13:01.236 A:middle
Coming in quite fast, and
there's our otters again.
WEBVTT
X-TIMESTAMP-MAP=MPEGTS:181083,LOCAL:00:00:00.000
00:12:58.666 --> 00:13:01.236 A:middle
Coming in quite fast, and
there's our otters again.
00:13:01.816 --> 00:13:03.646 A:middle
I'll play that again.
00:13:04.386 --> 00:13:08.196 A:middle
It goes through quite quickly,
but we can do something
00:13:08.196 --> 00:13:13.896 A:middle
about that, we can change the
[pause] video mixing parameters
00:13:14.216 --> 00:13:16.216 A:middle
that we've placed
in our composition,
00:13:17.366 --> 00:13:24.416 A:middle
and I can reveal some controls
wired directly to properties
00:13:24.416 --> 00:13:26.996 A:middle
in our instruction, in our
custom instruction here.
00:13:26.996 --> 00:13:30.336 A:middle
In this case, stiffening
and damping.
00:13:31.116 --> 00:13:35.826 A:middle
Now these are going to influence
the way we're calculating
00:13:35.826 --> 00:13:36.446 A:middle
the physics.
00:13:36.646 --> 00:13:37.846 A:middle
In this case we're mapping,
00:13:37.846 --> 00:13:41.036 A:middle
texture mapping the
video onto a mash.
00:13:41.646 --> 00:13:46.926 A:middle
And then applying some
physics to the vertices.
00:13:46.926 --> 00:13:49.306 A:middle
So let's see if we can slow
this down a little bit, so,
00:13:49.766 --> 00:13:54.216 A:middle
[pause] let's play
that through again.
00:13:54.216 --> 00:13:56.336 A:middle
Okay, it's a little
bit different.
00:13:56.856 --> 00:14:02.716 A:middle
You can see the, as it comes in,
it's a strange, hypnotic effect.
WEBVTT
X-TIMESTAMP-MAP=MPEGTS:181083,LOCAL:00:00:00.000
00:13:56.856 --> 00:14:02.716 A:middle
You can see the, as it comes in,
it's a strange, hypnotic effect.
00:14:02.966 --> 00:14:06.866 A:middle
But this we can play
with it even more
00:14:08.076 --> 00:14:09.206 A:middle
by playing with the damping.
00:14:10.566 --> 00:14:13.176 A:middle
Woops. Okay.
00:14:13.456 --> 00:14:29.356 A:middle
Of course that was all planned.
00:14:32.196 --> 00:14:34.386 A:middle
Okay so, we've set up
the stiffness and damping
00:14:34.386 --> 00:14:37.156 A:middle
to be a little bit
wilder this time.
00:14:38.316 --> 00:14:44.416 A:middle
Yeah. [Pause] Okay, so
anyway, that's an example
00:14:44.416 --> 00:14:46.556 A:middle
of the OpenGL doing
something useful.
00:14:47.606 --> 00:14:52.566 A:middle
Let's switch back to the slides.
00:14:54.006 --> 00:14:55.426 A:middle
Okay we mentioned
tweening there,
00:14:55.426 --> 00:14:56.546 A:middle
which is an interpolation.
00:14:56.546 --> 00:15:00.246 A:middle
So let's have a quick
overview of that
WEBVTT
X-TIMESTAMP-MAP=MPEGTS:181083,LOCAL:00:00:00.000
00:14:56.546 --> 00:15:00.246 A:middle
So let's have a quick
overview of that
00:15:00.246 --> 00:15:03.316 A:middle
in case you're not familiar
with how that works.
00:15:03.986 --> 00:15:06.946 A:middle
Now we'll focus in on
the second segment,
00:15:06.946 --> 00:15:09.586 A:middle
which does the dissolve
in this example.
00:15:10.336 --> 00:15:22.426 A:middle
Okay our instruction
contains our opacity ramp
00:15:23.376 --> 00:15:25.186 A:middle
from 100 percent
down to 0 percent.
00:15:25.736 --> 00:15:30.306 A:middle
Of course the interesting
properties in there,
00:15:30.306 --> 00:15:33.386 A:middle
as well as the opacity
ramp is the time range
00:15:33.576 --> 00:15:36.286 A:middle
and our first example
is arbitrarily starting
00:15:36.286 --> 00:15:41.336 A:middle
at 5 seconds with a duration
of ten-thirtieths of a second.
00:15:41.946 --> 00:15:47.106 A:middle
Now in the first frame we've
only elapsed a few seconds in.
00:15:48.576 --> 00:15:50.976 A:middle
At which point, the passed
capacity should be 100 percent.
00:15:50.976 --> 00:15:56.016 A:middle
Now we calculate
this tween factor
00:15:56.606 --> 00:16:01.586 A:middle
by dividing the elapsed
time by the duration.
WEBVTT
X-TIMESTAMP-MAP=MPEGTS:181083,LOCAL:00:00:00.000
00:15:56.606 --> 00:16:01.586 A:middle
by dividing the elapsed
time by the duration.
00:16:01.586 --> 00:16:04.866 A:middle
In which case we calculate
zero, which leads right
00:16:04.866 --> 00:16:06.716 A:middle
to the beginning of
the opacity ramp.
00:16:06.716 --> 00:16:08.876 A:middle
Now things get a
bit more interesting
00:16:08.876 --> 00:16:10.536 A:middle
when we move forward one frame.
00:16:11.626 --> 00:16:13.486 A:middle
We've elapsed one-thirtieth
of a second in.
00:16:14.886 --> 00:16:19.126 A:middle
The tween factor is now
calculated to be 0.1,
00:16:19.126 --> 00:16:23.386 A:middle
which means we're a tenth of the
way through the opacity ramp.