react-native-skia-webgpu-video 0.1.0-beta.0 → 0.1.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,72 @@
1
+ package com.azzapp.rnskv;
2
+
3
+ import android.content.Context;
4
+ import android.hardware.display.DisplayManager;
5
+ import android.view.Display;
6
+
7
+ /**
8
+ * The vsync period of a display, kept current as its refresh rate changes.
9
+ *
10
+ * Taken from the display rather than from the gaps between vsyncs: those
11
+ * cannot tell a slower refresh rate from missed vsyncs, and an adaptive
12
+ * display dropping from 90 or 120 Hz to 60 Hz left such an estimate at the
13
+ * old rate.
14
+ */
15
+ final class DisplayVsyncPeriod implements DisplayManager.DisplayListener {
16
+ private final DisplayManager displayManager;
17
+ private final Display display;
18
+ private volatile long periodNanos;
19
+
20
+ private DisplayVsyncPeriod(DisplayManager displayManager, Display display) {
21
+ this.displayManager = displayManager;
22
+ this.display = display;
23
+ update();
24
+ }
25
+
26
+ /**
27
+ * Follows the display's refresh rate changes on the calling thread's looper.
28
+ *
29
+ * @param display the display to follow, null for the default one
30
+ * @return null when the display cannot be followed
31
+ */
32
+ static DisplayVsyncPeriod watch(Context context, Display display) {
33
+ DisplayManager displayManager = context.getSystemService(DisplayManager.class);
34
+ if (displayManager == null) return null;
35
+ if (display == null) display = displayManager.getDisplay(Display.DEFAULT_DISPLAY);
36
+ if (display == null) return null;
37
+ DisplayVsyncPeriod period = new DisplayVsyncPeriod(displayManager, display);
38
+ displayManager.registerDisplayListener(period, null);
39
+ return period;
40
+ }
41
+
42
+ /**
43
+ * @return the display's vsync period in nanoseconds, 0 when unknown
44
+ */
45
+ long getPeriodNanos() {
46
+ return periodNanos;
47
+ }
48
+
49
+ void release() {
50
+ displayManager.unregisterDisplayListener(this);
51
+ }
52
+
53
+ private void update() {
54
+ float rate = display.getRefreshRate();
55
+ periodNanos = rate > 0 ? (long) (1_000_000_000L / rate) : 0;
56
+ }
57
+
58
+ @Override
59
+ public void onDisplayAdded(int displayId) {
60
+ }
61
+
62
+ @Override
63
+ public void onDisplayRemoved(int displayId) {
64
+ }
65
+
66
+ @Override
67
+ public void onDisplayChanged(int displayId) {
68
+ if (displayId == display.getDisplayId()) {
69
+ update();
70
+ }
71
+ }
72
+ }
@@ -21,7 +21,15 @@ final class NativeRgbaBuffer {
21
21
  ByteBuffer::allocateDirect, NativeRgbaBuffer::nativeAlias, size -> {
22
22
  Runtime runtime = Runtime.getRuntime();
23
23
  RgbaBufferAllocator.checkAllocationCapacity(size, runtime.maxMemory());
24
- });
24
+ }, NativeRgbaBuffer::collect);
25
+
26
+ /** Collects, then waits for the references it cleared to be enqueued. */
27
+ private static void collect() {
28
+ Runtime.getRuntime().gc();
29
+ // On ART this waits for the reference queue daemon, which enqueues the
30
+ // buffers' phantom references ahead of the finalizers it waits on.
31
+ System.runFinalization();
32
+ }
25
33
 
26
34
  static ByteBuffer allocate(int size) { return allocator.allocate(size); }
27
35
 
@@ -14,14 +14,23 @@ final class RgbaBufferAllocator {
14
14
  private final IntFunction<ByteBuffer> allocateBacking;
15
15
  private final Function<ByteBuffer, ByteBuffer> alias;
16
16
  private final IntConsumer checkHeap;
17
+ private final Runnable reclaim;
18
+ /** Collections asked for when the native budget refuses a reservation. */
19
+ static final int RECLAIM_ATTEMPTS = 3;
17
20
  RgbaBufferAllocator(BufferLifetime lifetimes, IntToLongFunction reserve, LongConsumer release,
18
21
  IntFunction<ByteBuffer> allocateBacking, Function<ByteBuffer, ByteBuffer> alias) {
19
22
  this(lifetimes, reserve, release, allocateBacking, alias, size -> {});
20
23
  }
21
24
  RgbaBufferAllocator(BufferLifetime lifetimes, IntToLongFunction reserve, LongConsumer release,
22
25
  IntFunction<ByteBuffer> allocateBacking, Function<ByteBuffer, ByteBuffer> alias, IntConsumer checkHeap) {
26
+ this(lifetimes, reserve, release, allocateBacking, alias, checkHeap, () -> {});
27
+ }
28
+ RgbaBufferAllocator(BufferLifetime lifetimes, IntToLongFunction reserve, LongConsumer release,
29
+ IntFunction<ByteBuffer> allocateBacking, Function<ByteBuffer, ByteBuffer> alias, IntConsumer checkHeap,
30
+ Runnable reclaim) {
23
31
  this.lifetimes = lifetimes; this.reserve = reserve; this.release = release;
24
32
  this.allocateBacking = allocateBacking; this.alias = alias; this.checkHeap = checkHeap;
33
+ this.reclaim = reclaim;
25
34
  }
26
35
 
27
36
  /** Refuse a single backing too large for ART's heap and cleanup headroom.
@@ -44,7 +53,7 @@ final class RgbaBufferAllocator {
44
53
  ByteBuffer allocate(int size) {
45
54
  lifetimes.drain();
46
55
  checkHeap.accept(size);
47
- long token = reserve.applyAsLong(size);
56
+ long token = reserveReclaiming(size);
48
57
  Allocation owner;
49
58
  try {
50
59
  owner = new Allocation();
@@ -79,5 +88,27 @@ final class RgbaBufferAllocator {
79
88
  lifetimes.track(exposed, owner, 0);
80
89
  return exposed;
81
90
  }
91
+ /** A buffer holds its reservation until the GC finds it unreachable. A fast
92
+ * decode drops a frame per vsync, 8 MB each in 1080p, and those dead buffers
93
+ * filled the native budget before the Java heap asked for a collection: the
94
+ * budget refused frames nobody held. Refused while buffers are tracked, the
95
+ * reservation is retried after a collection has returned theirs. */
96
+ private long reserveReclaiming(int size) {
97
+ try {
98
+ return reserve.applyAsLong(size);
99
+ } catch (RuntimeException refused) {
100
+ RuntimeException last = refused;
101
+ for (int attempt = 0; attempt < RECLAIM_ATTEMPTS && lifetimes.trackedCount() > 0; attempt++) {
102
+ reclaim.run();
103
+ lifetimes.drain();
104
+ try {
105
+ return reserve.applyAsLong(size);
106
+ } catch (RuntimeException again) {
107
+ last = again;
108
+ }
109
+ }
110
+ throw last;
111
+ }
112
+ }
82
113
  private static final class Allocation { ByteBuffer backing; }
83
114
  }
@@ -114,15 +114,22 @@ public class VideoCompositionDecoder {
114
114
  }
115
115
 
116
116
  private void prepareCurrent(long positionUs) {
117
+ if (realTime) {
118
+ // The codecs call back on their own thread, lazy or not. Left to default
119
+ // they call back on the looper of the thread that configures them, and
120
+ // the preview prepares from the UI thread: every buffer of every item,
121
+ // and the burst after each seek (a loop's wrap, a seam), then queued on
122
+ // the main looper ahead of the frame that draws them.
123
+ callbackThread = new HandlerThread("ReactNativeSkiaVideo-Codecs");
124
+ callbackThread.start();
125
+ callbacks = new Handler(callbackThread.getLooper());
126
+ }
117
127
  if (realTime && window.isLazy()) {
118
128
  // Opening a codec takes tens of milliseconds: not on the thread that
119
129
  // draws, nor the one that plays, nor the one the playing codec calls back on.
120
130
  openerThread = new HandlerThread("ReactNativeSkiaVideo-Opener");
121
131
  openerThread.start();
122
132
  opener = new Handler(openerThread.getLooper());
123
- callbackThread = new HandlerThread("ReactNativeSkiaVideo-Codecs");
124
- callbackThread.start();
125
- callbacks = new Handler(callbackThread.getLooper());
126
133
  }
127
134
  for (VideoComposition.Item item : composition.getItems()) {
128
135
  if (!item.isVideo() || !opens(item, positionUs)) {
@@ -1,16 +1,21 @@
1
1
  package com.azzapp.rnskv;
2
2
 
3
+ import android.app.Activity;
3
4
  import android.os.Handler;
4
5
  import android.os.HandlerThread;
5
6
  import android.os.Message;
6
7
  import android.os.Process;
7
8
  import android.os.SystemClock;
8
9
  import android.util.Log;
10
+ import android.view.Choreographer;
9
11
 
10
12
  import androidx.media3.common.util.UnstableApi;
11
13
 
14
+ import com.facebook.react.bridge.ReactApplicationContext;
15
+
12
16
  import java.io.IOException;
13
17
  import java.util.Map;
18
+ import java.util.concurrent.atomic.AtomicBoolean;
14
19
  import javax.microedition.khronos.egl.EGLContext;
15
20
  import javax.microedition.khronos.egl.EGL10;
16
21
 
@@ -48,13 +53,47 @@ public class VideoCompositionFramesExtractor {
48
53
 
49
54
 
50
55
  private long pendingSeek = 0;
51
- private boolean isPlaying = false;
56
+ // Read on the thread that collects frames (see releaseForNextVsync), written on the playback thread.
57
+ private volatile boolean isPlaying = false;
52
58
 
53
- private long startTime = 0;
54
- private long pausePosition = 0;
59
+ private volatile long startTime = 0;
60
+ private volatile long pausePosition = 0;
55
61
  private boolean isEOS = false;
56
62
  private boolean completeDispatched = false;
57
63
 
64
+ // Vsync-aligned release, written and read on the thread that collects frames.
65
+ private long lastVsyncNanos = 0;
66
+ private long recordedVsyncNanos = 0;
67
+ private boolean recordingVsync = false;
68
+ /** Notes each vsync's timestamp on the collecting thread, for as long as the preview lives. */
69
+ private final Choreographer.FrameCallback vsyncRecorder = new Choreographer.FrameCallback() {
70
+ @Override
71
+ public void doFrame(long frameTimeNanos) {
72
+ if (releasing) {
73
+ unwatchDisplay();
74
+ return;
75
+ }
76
+ recordedVsyncNanos = frameTimeNanos;
77
+ Choreographer.getInstance().postFrameCallback(this);
78
+ }
79
+ };
80
+ // The display the preview is on; null until the first collection, or when unknown.
81
+ private DisplayVsyncPeriod vsyncPeriod;
82
+ // When that thread last released frames; the playback loop stands back meanwhile.
83
+ private volatile long lastVsyncReleaseNanos = 0;
84
+ // The release itself runs on the playback thread: the decoder's locks are held
85
+ // there for whole codec flushes on a seek, and the UI thread must never
86
+ // wait on them (measured: 65 ms frames when it did).
87
+ private volatile long vsyncReleasePosition = 0;
88
+ private final AtomicBoolean vsyncReleasePosted = new AtomicBoolean(false);
89
+ private final Runnable vsyncRelease = this::runVsyncRelease;
90
+
91
+ private void runVsyncRelease() {
92
+ vsyncReleasePosted.set(false);
93
+ if (!releasing) decoder.render(vsyncReleasePosition);
94
+ }
95
+ private static final long VSYNC_RELEASE_TIMEOUT_NANOS = 100_000_000L;
96
+
58
97
  /**
59
98
  * Create a new VideoCompositionFramesExtractor.
60
99
  *
@@ -117,7 +156,74 @@ public class VideoCompositionFramesExtractor {
117
156
  * when finished, without affecting the producer or other snapshots
118
157
  */
119
158
  public Map<String, VideoFrame> decodeCompositionFrames() {
120
- return decoder.updateVideosFrames();
159
+ Map<String, VideoFrame> frames = decoder.updateVideosFrames();
160
+ releaseForNextVsync();
161
+ return frames;
162
+ }
163
+
164
+ /**
165
+ * Releases the decoded frames the next vsync is due to show, from the thread
166
+ * that collects them, right after collecting.
167
+ *
168
+ * The playback loop released them on its 10 ms tick, out of phase with the
169
+ * display, so whether a frame was collected on the vsync after its time or
170
+ * the one after that was chance: 24 fps on a 60 Hz display came out in
171
+ * 17/67 ms steps among the 33/50 ms it implies. Released against the vsync's
172
+ * own timestamp, one vsync ahead, every frame is collected on the first
173
+ * vsync at or after its time. The position is decided here, against the
174
+ * vsync; the release is posted to the playback thread, a vsync ahead of the
175
+ * collection that needs it.
176
+ */
177
+ private void releaseForNextVsync() {
178
+ if (!recordingVsync) {
179
+ try {
180
+ // The collecting thread is a Choreographer thread (the UI thread).
181
+ Choreographer.getInstance().postFrameCallback(vsyncRecorder);
182
+ recordingVsync = true;
183
+ } catch (RuntimeException e) {
184
+ // No looper on this thread: leave the release to the playback loop.
185
+ return;
186
+ }
187
+ watchDisplay();
188
+ return;
189
+ }
190
+ long period = vsyncPeriod != null ? vsyncPeriod.getPeriodNanos() : 0;
191
+ if (period == 0 || recordedVsyncNanos == 0) return;
192
+ // This frame's vsync, whether the recorder has run in this frame yet or not.
193
+ long since = Math.max(0, System.nanoTime() - recordedVsyncNanos);
194
+ long vsyncNanos = recordedVsyncNanos + (since / period) * period;
195
+ if (vsyncNanos == lastVsyncNanos) return;
196
+ lastVsyncNanos = vsyncNanos;
197
+ long vsyncPeriodNanos = period;
198
+ long position = isPlaying
199
+ ? (vsyncNanos + vsyncPeriodNanos) / 1000 - startTime
200
+ : pausePosition;
201
+ lastVsyncReleaseNanos = System.nanoTime();
202
+ vsyncReleasePosition = position;
203
+ if (vsyncReleasePosted.compareAndSet(false, true)) {
204
+ handler.post(vsyncRelease);
205
+ }
206
+ }
207
+
208
+ /**
209
+ * Follows the refresh rate of the display the preview is on, from the
210
+ * collecting thread, whose looper then receives its changes. Without a React
211
+ * context (instrumented tests) the period stays unknown and the playback loop
212
+ * releases on its tick.
213
+ */
214
+ private void watchDisplay() {
215
+ ReactApplicationContext context = ReactNativeSkiaVideoModule.currentReactApplicationContext();
216
+ if (context == null) return;
217
+ Activity activity = context.getCurrentActivity();
218
+ vsyncPeriod = DisplayVsyncPeriod.watch(context,
219
+ activity != null ? activity.getWindowManager().getDefaultDisplay() : null);
220
+ }
221
+
222
+ private void unwatchDisplay() {
223
+ if (vsyncPeriod != null) {
224
+ vsyncPeriod.release();
225
+ vsyncPeriod = null;
226
+ }
121
227
  }
122
228
 
123
229
  /**
@@ -241,7 +347,10 @@ public class VideoCompositionFramesExtractor {
241
347
  completeDispatched = false;
242
348
  }
243
349
  decoder.updateWindow(currentPosition);
244
- decoder.render(currentPosition);
350
+ if (System.nanoTime() - lastVsyncReleaseNanos > VSYNC_RELEASE_TIMEOUT_NANOS) {
351
+ // No one collecting at vsync (not yet, or no longer): release on the tick.
352
+ decoder.render(currentPosition);
353
+ }
245
354
  if (isEOS && looping) {
246
355
  playInternal();
247
356
  }
@@ -24,6 +24,8 @@ export const useVideoComposition = ({
24
24
  autoPlay = false,
25
25
  isLooping = false,
26
26
  drawWhenPaused = false,
27
+ redrawOnTime,
28
+ splitImportAndDraw = false,
27
29
  onReadyToPlay,
28
30
  onComplete,
29
31
  onError
@@ -161,6 +163,10 @@ export const useVideoComposition = ({
161
163
  const lastDrawnFramesVersion = useSharedValue(-1);
162
164
  const lastDrawnTime = useSharedValue(-1);
163
165
  const lastDrawnInputs = useSharedValue(null);
166
+ // Frames version whose new frames the previous vsyncs already imported.
167
+ const lastImportedVersion = useSharedValue(-1);
168
+ // Whether the previous vsync imported and left its draw to this one.
169
+ const drawDeferred = useSharedValue(false);
164
170
  // A new drawFrame can draw something else from the same time and frames.
165
171
  useEffect(() => {
166
172
  lastDrawnTime.value = -1;
@@ -206,6 +212,18 @@ export const useVideoComposition = ({
206
212
  sourcesGeneration.value = generation;
207
213
  const currentTime = framesExtractor.currentTime;
208
214
  const framesVersion = framesExtractor.framesVersion;
215
+ if (splitImportAndDraw && framesVersion !== lastImportedVersion.value) {
216
+ // ownVideoFrames above has just imported the new frames: leave the
217
+ // draw to the next vsync, which finds them in the import cache. Never
218
+ // twice running: a frame that lands on the vsync owed a draw would
219
+ // push it again, and the frame before it would never be shown.
220
+ lastImportedVersion.value = framesVersion;
221
+ if (!drawDeferred.value && currentFrame.value !== null && frameGeneration.value === generation) {
222
+ drawDeferred.value = true;
223
+ return;
224
+ }
225
+ }
226
+ drawDeferred.value = false;
209
227
  const inputs = Array.isArray(drawWhenPaused) ? drawWhenPaused : null;
210
228
  let inputsSame = true;
211
229
  if (inputs) {
@@ -219,8 +237,10 @@ export const useVideoComposition = ({
219
237
  }
220
238
  }
221
239
  }
222
- if (drawWhenPaused !== true && inputsSame && !framesExtractor.isPlaying && currentFrame.value !== null && frameGeneration.value === generation && framesVersion === lastDrawnFramesVersion.value && currentTime === lastDrawnTime.value && surfaceWidth.value === pixelWidth && surfaceHeight.value === pixelHeight) {
223
- // Paused with nothing new: the image on screen is still exact, and
240
+ // A negative last time means a redraw was requested (a new drawFrame).
241
+ const timeSame = currentTime === lastDrawnTime.value || redrawOnTime !== undefined && lastDrawnTime.value >= 0 && !redrawOnTime(lastDrawnTime.value, currentTime);
242
+ if (drawWhenPaused !== true && inputsSame && (!framesExtractor.isPlaying || redrawOnTime !== undefined) && currentFrame.value !== null && frameGeneration.value === generation && framesVersion === lastDrawnFramesVersion.value && timeSame && surfaceWidth.value === pixelWidth && surfaceHeight.value === pixelHeight) {
243
+ // Nothing new to show: the image on screen is still exact, and
224
244
  // redrawing it at every vsync would only burn GPU time and battery.
225
245
  return;
226
246
  }
@@ -1 +1 @@
1
- {"version":3,"names":["getVideoCanvas","BlendMode","Skia","useSharedValue","useFrameCallback","runOnUI","useCallback","useEffect","useRef","useState","RNSkiaVideoModule","useEventListener","PixelRatio","scheduleOnRN","ownVideoFrames","releaseVideoFrameImage","frameByteSize","reserveVideoMemory","disposePreviewResources","useVideoComposition","composition","drawFrame","beforeDrawFrame","afterDrawFrame","width","height","autoPlay","isLooping","drawWhenPaused","onReadyToPlay","onComplete","onError","failedComposition","setFailedComposition","isErrored","session","setSession","framesExtractor","extractor","generation","nextGeneration","activeOnRN","activeGeneration","frameGeneration","sourcesGeneration","currentFrame","pendingSnapshot","pendingAfterDraw","previousSources","onCreationError","current","created","createVideoCompositionFramesExtractor","error","createdGeneration","value","releasePreview","failure","native","failed","console","warn","retry","errorHandler","isCurrentSession","prepare","play","surfaceSharedValue","canvasSharedValue","surfaceReservation","surfaceWidth","surfaceHeight","resources","surface","canvas","images","frames","Object","values","reservation","afterDraw","run","lastDrawnFramesVersion","lastDrawnTime","lastDrawnInputs","pixelRatio","get","pixelWidth","Math","floor","pixelHeight","isFinite","decodeCompositionFrames","key","previous","entries","producerId","currentTime","framesVersion","inputs","Array","isArray","inputsSame","last","length","i","isPlaying","retired","retiredFailure","Surface","MakeOffscreen","Error","drawColor","Color","Clear","context","drawn","submitted","undefined","releaseContext","videoComposition","next","makeImageSnapshot","flush","modify","dispose","map","input","player"],"sourceRoot":"../../src","sources":["videoCompositionPlayer.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["getVideoCanvas","BlendMode","Skia","useSharedValue","useFrameCallback","runOnUI","useCallback","useEffect","useRef","useState","RNSkiaVideoModule","useEventListener","PixelRatio","scheduleOnRN","ownVideoFrames","releaseVideoFrameImage","frameByteSize","reserveVideoMemory","disposePreviewResources","useVideoComposition","composition","drawFrame","beforeDrawFrame","afterDrawFrame","width","height","autoPlay","isLooping","drawWhenPaused","redrawOnTime","splitImportAndDraw","onReadyToPlay","onComplete","onError","failedComposition","setFailedComposition","isErrored","session","setSession","framesExtractor","extractor","generation","nextGeneration","activeOnRN","activeGeneration","frameGeneration","sourcesGeneration","currentFrame","pendingSnapshot","pendingAfterDraw","previousSources","onCreationError","current","created","createVideoCompositionFramesExtractor","error","createdGeneration","value","releasePreview","failure","native","failed","console","warn","retry","errorHandler","isCurrentSession","prepare","play","surfaceSharedValue","canvasSharedValue","surfaceReservation","surfaceWidth","surfaceHeight","resources","surface","canvas","images","frames","Object","values","reservation","afterDraw","run","lastDrawnFramesVersion","lastDrawnTime","lastDrawnInputs","lastImportedVersion","drawDeferred","pixelRatio","get","pixelWidth","Math","floor","pixelHeight","isFinite","decodeCompositionFrames","key","previous","entries","producerId","currentTime","framesVersion","inputs","Array","isArray","inputsSame","last","length","i","timeSame","undefined","isPlaying","retired","retiredFailure","Surface","MakeOffscreen","Error","drawColor","Color","Clear","context","drawn","submitted","releaseContext","videoComposition","next","makeImageSnapshot","flush","modify","dispose","map","input","player"],"sourceRoot":"../../src","sources":["videoCompositionPlayer.ts"],"mappings":"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","ignoreList":[]}
@@ -51,6 +51,26 @@ type UseVideoCompositionPlayerOptions<T = undefined> = {
51
51
  * @default false
52
52
  */
53
53
  drawWhenPaused?: boolean | SharedValue<unknown>[];
54
+ /**
55
+ * Whether `drawFrame` can draw something different at `currentTime` than it
56
+ * drew at `previousTime` from the same decoded frames. By default every time
57
+ * change redraws, so a playing player draws at every vsync even though the
58
+ * video only changes at its own frame rate. A drawer whose picture depends on
59
+ * time only through the frames (or only at known moments, a transition say)
60
+ * returns false elsewhere, and the player then redraws when a new frame is
61
+ * decoded instead. Must be a worklet.
62
+ */
63
+ redrawOnTime?: (previousTime: number, currentTime: number) => boolean;
64
+ /**
65
+ * Import a newly decoded frame in one vsync and draw it in the next, instead
66
+ * of both in the same one. On Android the import (YUV blit and its checked
67
+ * GPU wait) and the draw (snapshot and its checked GPU wait) cost about as
68
+ * much as each other, and together they overrun a 90–120 Hz frame budget on
69
+ * the UI thread. The picture then trails the clock by one vsync.
70
+ * The first frame of a session is still drawn as soon as it is imported.
71
+ * @default false
72
+ */
73
+ splitImportAndDraw?: boolean;
54
74
  /**
55
75
  * Callback that is called when the composition is ready to play.
56
76
  */
@@ -80,6 +100,6 @@ type UseVideoCompositionPlayerReturnType = {
80
100
  /**
81
101
  * A hook that creates a video composition player.
82
102
  */
83
- export declare const useVideoComposition: <T = undefined>({ composition, drawFrame, beforeDrawFrame, afterDrawFrame, width, height, autoPlay, isLooping, drawWhenPaused, onReadyToPlay, onComplete, onError, }: UseVideoCompositionPlayerOptions<T>) => UseVideoCompositionPlayerReturnType;
103
+ export declare const useVideoComposition: <T = undefined>({ composition, drawFrame, beforeDrawFrame, afterDrawFrame, width, height, autoPlay, isLooping, drawWhenPaused, redrawOnTime, splitImportAndDraw, onReadyToPlay, onComplete, onError, }: UseVideoCompositionPlayerOptions<T>) => UseVideoCompositionPlayerReturnType;
84
104
  export {};
85
105
  //# sourceMappingURL=videoCompositionPlayer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"videoCompositionPlayer.d.ts","sourceRoot":"","sources":["../../../src/videoCompositionPlayer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAY,OAAO,EAAa,MAAM,mBAAmB,CAAC;AAEtE,OAAO,EAIL,KAAK,YAAY,EACjB,KAAK,WAAW,EACjB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,KAAK,EACV,WAAW,EAEX,gBAAgB,EAChB,+BAA+B,EAChC,MAAM,YAAS,CAAC;AASjB,KAAK,gCAAgC,CAAC,CAAC,GAAG,SAAS,IAAI;IACrD;;;OAGG;IACH,WAAW,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACrC;;OAEG;IACH,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IAC1B;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC,CAAC;IAC1B;;;;OAIG;IACH,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,IAAI,CAAC;IACtC;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IACd;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;IACf;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;;;;;;;;;OAWG;IACH,cAAc,CAAC,EAAE,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;IAClD;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB;;;;OAIG;IACH,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;CACnD,CAAC;AAEF,KAAK,gCAAgC,GAAG,IAAI,CAC1C,+BAA+B,EAC/B,aAAa,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,WAAW,CAC1D,CAAC;AAEF,KAAK,mCAAmC,GAAG;IACzC;;OAEG;IACH,YAAY,EAAE,YAAY,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IAC3C;;OAEG;IACH,MAAM,EAAE,gCAAgC,GAAG,IAAI,CAAC;CACjD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,mBAAmB,GAAI,CAAC,GAAG,SAAS,EAAE,sJAahD,gCAAgC,CAAC,CAAC,CAAC,KAAG,mCA4YxC,CAAC"}
1
+ {"version":3,"file":"videoCompositionPlayer.d.ts","sourceRoot":"","sources":["../../../src/videoCompositionPlayer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAY,OAAO,EAAa,MAAM,mBAAmB,CAAC;AAEtE,OAAO,EAIL,KAAK,YAAY,EACjB,KAAK,WAAW,EACjB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,KAAK,EACV,WAAW,EAEX,gBAAgB,EAChB,+BAA+B,EAChC,MAAM,YAAS,CAAC;AASjB,KAAK,gCAAgC,CAAC,CAAC,GAAG,SAAS,IAAI;IACrD;;;OAGG;IACH,WAAW,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACrC;;OAEG;IACH,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IAC1B;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC,CAAC;IAC1B;;;;OAIG;IACH,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,IAAI,CAAC;IACtC;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IACd;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;IACf;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;;;;;;;;;OAWG;IACH,cAAc,CAAC,EAAE,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;IAClD;;;;;;;;OAQG;IACH,YAAY,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC;IACtE;;;;;;;;OAQG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB;;;;OAIG;IACH,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;CACnD,CAAC;AAEF,KAAK,gCAAgC,GAAG,IAAI,CAC1C,+BAA+B,EAC/B,aAAa,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,WAAW,CAC1D,CAAC;AAEF,KAAK,mCAAmC,GAAG;IACzC;;OAEG;IACH,YAAY,EAAE,YAAY,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IAC3C;;OAEG;IACH,MAAM,EAAE,gCAAgC,GAAG,IAAI,CAAC;CACjD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,mBAAmB,GAAI,CAAC,GAAG,SAAS,EAAE,wLAehD,gCAAgC,CAAC,CAAC,CAAC,KAAG,mCAsaxC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-skia-webgpu-video",
3
- "version": "0.1.0-beta.0",
3
+ "version": "0.1.0-beta.1",
4
4
  "description": "Bounded video composition, playback and export for React Native Skia 3 / Graphite",
5
5
  "main": "./lib/module/index.js",
6
6
  "types": "./lib/typescript/src/index.d.ts",
@@ -59,7 +59,8 @@
59
59
  "benchmark:compare": "node scripts/benchmark-compare.mjs",
60
60
  "benchmark:inventory": "node scripts/benchmark-inventory.mjs",
61
61
  "benchmark:fixtures": "node scripts/benchmark-fixture-manifest.mjs",
62
- "test:package": "node --test test/package/*.test.mjs"
62
+ "test:package": "node --test test/package/*.test.mjs",
63
+ "release": "node scripts/release.mjs"
63
64
  },
64
65
  "keywords": [
65
66
  "react-native",
@@ -73,6 +73,26 @@ type UseVideoCompositionPlayerOptions<T = undefined> = {
73
73
  * @default false
74
74
  */
75
75
  drawWhenPaused?: boolean | SharedValue<unknown>[];
76
+ /**
77
+ * Whether `drawFrame` can draw something different at `currentTime` than it
78
+ * drew at `previousTime` from the same decoded frames. By default every time
79
+ * change redraws, so a playing player draws at every vsync even though the
80
+ * video only changes at its own frame rate. A drawer whose picture depends on
81
+ * time only through the frames (or only at known moments, a transition say)
82
+ * returns false elsewhere, and the player then redraws when a new frame is
83
+ * decoded instead. Must be a worklet.
84
+ */
85
+ redrawOnTime?: (previousTime: number, currentTime: number) => boolean;
86
+ /**
87
+ * Import a newly decoded frame in one vsync and draw it in the next, instead
88
+ * of both in the same one. On Android the import (YUV blit and its checked
89
+ * GPU wait) and the draw (snapshot and its checked GPU wait) cost about as
90
+ * much as each other, and together they overrun a 90–120 Hz frame budget on
91
+ * the UI thread. The picture then trails the clock by one vsync.
92
+ * The first frame of a session is still drawn as soon as it is imported.
93
+ * @default false
94
+ */
95
+ splitImportAndDraw?: boolean;
76
96
  /**
77
97
  * Callback that is called when the composition is ready to play.
78
98
  */
@@ -118,6 +138,8 @@ export const useVideoComposition = <T = undefined>({
118
138
  autoPlay = false,
119
139
  isLooping = false,
120
140
  drawWhenPaused = false,
141
+ redrawOnTime,
142
+ splitImportAndDraw = false,
121
143
  onReadyToPlay,
122
144
  onComplete,
123
145
  onError,
@@ -291,6 +313,10 @@ export const useVideoComposition = <T = undefined>({
291
313
  const lastDrawnFramesVersion = useSharedValue(-1);
292
314
  const lastDrawnTime = useSharedValue(-1);
293
315
  const lastDrawnInputs = useSharedValue<unknown[] | null>(null);
316
+ // Frames version whose new frames the previous vsyncs already imported.
317
+ const lastImportedVersion = useSharedValue(-1);
318
+ // Whether the previous vsync imported and left its draw to this one.
319
+ const drawDeferred = useSharedValue(false);
294
320
  // A new drawFrame can draw something else from the same time and frames.
295
321
  useEffect(() => {
296
322
  lastDrawnTime.value = -1;
@@ -356,6 +382,22 @@ export const useVideoComposition = <T = undefined>({
356
382
  sourcesGeneration.value = generation;
357
383
  const currentTime = framesExtractor.currentTime;
358
384
  const framesVersion = framesExtractor.framesVersion;
385
+ if (splitImportAndDraw && framesVersion !== lastImportedVersion.value) {
386
+ // ownVideoFrames above has just imported the new frames: leave the
387
+ // draw to the next vsync, which finds them in the import cache. Never
388
+ // twice running: a frame that lands on the vsync owed a draw would
389
+ // push it again, and the frame before it would never be shown.
390
+ lastImportedVersion.value = framesVersion;
391
+ if (
392
+ !drawDeferred.value &&
393
+ currentFrame.value !== null &&
394
+ frameGeneration.value === generation
395
+ ) {
396
+ drawDeferred.value = true;
397
+ return;
398
+ }
399
+ }
400
+ drawDeferred.value = false;
359
401
  const inputs = Array.isArray(drawWhenPaused) ? drawWhenPaused : null;
360
402
  let inputsSame = true;
361
403
  if (inputs) {
@@ -370,18 +412,24 @@ export const useVideoComposition = <T = undefined>({
370
412
  }
371
413
  }
372
414
  }
415
+ // A negative last time means a redraw was requested (a new drawFrame).
416
+ const timeSame =
417
+ currentTime === lastDrawnTime.value ||
418
+ (redrawOnTime !== undefined &&
419
+ lastDrawnTime.value >= 0 &&
420
+ !redrawOnTime(lastDrawnTime.value, currentTime));
373
421
  if (
374
422
  drawWhenPaused !== true &&
375
423
  inputsSame &&
376
- !framesExtractor.isPlaying &&
424
+ (!framesExtractor.isPlaying || redrawOnTime !== undefined) &&
377
425
  currentFrame.value !== null &&
378
426
  frameGeneration.value === generation &&
379
427
  framesVersion === lastDrawnFramesVersion.value &&
380
- currentTime === lastDrawnTime.value &&
428
+ timeSame &&
381
429
  surfaceWidth.value === pixelWidth &&
382
430
  surfaceHeight.value === pixelHeight
383
431
  ) {
384
- // Paused with nothing new: the image on screen is still exact, and
432
+ // Nothing new to show: the image on screen is still exact, and
385
433
  // redrawing it at every vsync would only burn GPU time and battery.
386
434
  return;
387
435
  }