react-native-skia-webgpu-video 0.0.0-stage → 0.1.0-beta.0
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.
- package/LICENSE +22 -0
- package/README.md +303 -2
- package/android/BUILD_VALIDATION.md +62 -0
- package/android/CMakeLists.txt +99 -0
- package/android/build-validation.json +262 -0
- package/android/build.gradle +185 -0
- package/android/cpp/EncoderTargets.cpp +226 -0
- package/android/cpp/EncoderTargets.h +70 -0
- package/android/cpp/JNIHelpers.cpp +15 -0
- package/android/cpp/JNIHelpers.h +20 -0
- package/android/cpp/NativeEventDispatcher.cpp +59 -0
- package/android/cpp/NativeEventDispatcher.h +31 -0
- package/android/cpp/NativeHardwareBuffer.cpp +397 -0
- package/android/cpp/NativeHardwareBuffer.h +34 -0
- package/android/cpp/NativeRgbaBuffer.cpp +45 -0
- package/android/cpp/NativeRgbaBuffer.h +9 -0
- package/android/cpp/ReturnedVideoFrames.h +37 -0
- package/android/cpp/RgbaFrameLease.h +53 -0
- package/android/cpp/VideoCapabilities.cpp +87 -0
- package/android/cpp/VideoCapabilities.h +44 -0
- package/android/cpp/VideoComposition.cpp +170 -0
- package/android/cpp/VideoComposition.h +36 -0
- package/android/cpp/VideoCompositionFramesExtractor.cpp +82 -0
- package/android/cpp/VideoCompositionFramesExtractor.h +48 -0
- package/android/cpp/VideoCompositionFramesExtractorHostObject.cpp +230 -0
- package/android/cpp/VideoCompositionFramesExtractorHostObject.h +42 -0
- package/android/cpp/VideoCompositionFramesExtractorSyncHostObject.cpp +133 -0
- package/android/cpp/VideoCompositionFramesExtractorSyncHostObject.h +46 -0
- package/android/cpp/VideoEncoderHostObject.cpp +318 -0
- package/android/cpp/VideoEncoderHostObject.h +76 -0
- package/android/cpp/VideoFrame.cpp +293 -0
- package/android/cpp/VideoFrame.h +27 -0
- package/android/cpp/VideoPlayer.cpp +96 -0
- package/android/cpp/VideoPlayer.h +52 -0
- package/android/cpp/VideoPlayerHostObject.cpp +225 -0
- package/android/cpp/VideoPlayerHostObject.h +43 -0
- package/android/cpp/cpp-adapter.cpp +316 -0
- package/android/gradle.properties +5 -0
- package/android/instrumentation-inventory.json +178 -0
- package/android/proguard-rules.pro +4 -0
- package/android/src/main/AndroidManifest.xml +2 -0
- package/android/src/main/java/com/azzapp/rnskv/AudioCompositionExporter.java +537 -0
- package/android/src/main/java/com/azzapp/rnskv/AudioCompositionPlayer.java +321 -0
- package/android/src/main/java/com/azzapp/rnskv/BufferLifetime.java +55 -0
- package/android/src/main/java/com/azzapp/rnskv/DecodeRequests.java +100 -0
- package/android/src/main/java/com/azzapp/rnskv/DecoderWindow.java +55 -0
- package/android/src/main/java/com/azzapp/rnskv/EGLResourcesHolder.java +132 -0
- package/android/src/main/java/com/azzapp/rnskv/EGLUtils.java +225 -0
- package/android/src/main/java/com/azzapp/rnskv/FrameSize.java +50 -0
- package/android/src/main/java/com/azzapp/rnskv/GLFrameExtractor.java +510 -0
- package/android/src/main/java/com/azzapp/rnskv/JNIHelpers.java +12 -0
- package/android/src/main/java/com/azzapp/rnskv/NativeEventDispatcher.java +25 -0
- package/android/src/main/java/com/azzapp/rnskv/NativeHardwareBuffer.java +62 -0
- package/android/src/main/java/com/azzapp/rnskv/NativeRgbaBuffer.java +35 -0
- package/android/src/main/java/com/azzapp/rnskv/ReactNativeSkiaVideoModule.java +45 -0
- package/android/src/main/java/com/azzapp/rnskv/ReactNativeSkiaVideoPackage.java +43 -0
- package/android/src/main/java/com/azzapp/rnskv/ReactNativeSkiaVideoSpec.java +9 -0
- package/android/src/main/java/com/azzapp/rnskv/RgbaBufferAllocator.java +83 -0
- package/android/src/main/java/com/azzapp/rnskv/RgbaLayout.java +33 -0
- package/android/src/main/java/com/azzapp/rnskv/SurfaceOutputPolicy.java +13 -0
- package/android/src/main/java/com/azzapp/rnskv/TextureRenderer.java +150 -0
- package/android/src/main/java/com/azzapp/rnskv/TimeHelpers.java +11 -0
- package/android/src/main/java/com/azzapp/rnskv/VideoCapabilities.java +354 -0
- package/android/src/main/java/com/azzapp/rnskv/VideoComposition.java +147 -0
- package/android/src/main/java/com/azzapp/rnskv/VideoCompositionDecoder.java +772 -0
- package/android/src/main/java/com/azzapp/rnskv/VideoCompositionFramesExtractor.java +354 -0
- package/android/src/main/java/com/azzapp/rnskv/VideoCompositionFramesExtractorSync.java +241 -0
- package/android/src/main/java/com/azzapp/rnskv/VideoCompositionItemDecoder.java +492 -0
- package/android/src/main/java/com/azzapp/rnskv/VideoEncoder.java +639 -0
- package/android/src/main/java/com/azzapp/rnskv/VideoFrame.java +74 -0
- package/android/src/main/java/com/azzapp/rnskv/VideoPlayer.java +361 -0
- package/cpp/RNSVCheckedSizes.h +54 -0
- package/cpp/RNSVEventEmitter.cpp +199 -0
- package/cpp/RNSVEventEmitter.h +31 -0
- package/cpp/RNSVHostObject.cpp +79 -0
- package/cpp/RNSVHostObject.h +67 -0
- package/cpp/RNSVMemoryBudget.cpp +68 -0
- package/cpp/RNSVMemoryBudget.h +100 -0
- package/cpp/RNSVRuntimeLifecycleMonitor.cpp +88 -0
- package/cpp/RNSVRuntimeLifecycleMonitor.h +33 -0
- package/docs/ANDROID_DEVICE_306.md +95 -0
- package/docs/ANDROID_EXPORT_CACHE_306.md +48 -0
- package/docs/ANDROID_MEMORY_RETENTION_306.md +67 -0
- package/docs/BENCHMARKS.md +368 -0
- package/docs/IOS_DEVICE_TESTS.md +115 -0
- package/docs/IOS_SIMULATOR_TESTS.md +74 -0
- package/docs/MIGRATION.md +82 -0
- package/docs/NATIVE_MEMORY_INVESTIGATION_306.md +88 -0
- package/docs/PERFORMANCE_AB_IPHONE_303.md +196 -0
- package/docs/PERFORMANCE_AB_SIMULATOR.md +135 -0
- package/docs/PERFORMANCE_AB_SOAK_SIMULATOR.md +84 -0
- package/docs/PERFORMANCE_IPHONE_306_OPTIMIZATION.md +76 -0
- package/docs/PERFORMANCE_SIMULATOR.md +89 -0
- package/docs/PERFORMANCE_SIMULATOR_INITIAL.md +96 -0
- package/docs/PERFORMANCE_SOAK_IPHONE_303.md +41 -0
- package/docs/UPSTREAM_NOTES.md +188 -0
- package/docs/assets/banner.svg +26 -0
- package/examples/webgpu-overlay.ts +147 -0
- package/ios/AVAssetTrackUtils.h +24 -0
- package/ios/AudioCompositionUtils.h +27 -0
- package/ios/AudioCompositionUtils.mm +113 -0
- package/ios/DecoderWindow.h +52 -0
- package/ios/NativeResourceStats.h +32 -0
- package/ios/RNSVColorSpace.h +50 -0
- package/ios/RNSVJSIUtils.h +46 -0
- package/ios/RNSVScopedPixelBuffer.h +17 -0
- package/ios/RNSVVideoPlayer.h +46 -0
- package/ios/RNSVVideoPlayer.mm +410 -0
- package/ios/ReactNativeSkiaVideo.h +8 -0
- package/ios/ReactNativeSkiaVideo.mm +310 -0
- package/ios/SeekPolicy.h +27 -0
- package/ios/VideoComposition.h +148 -0
- package/ios/VideoCompositionFramesExtractorHostObject.h +105 -0
- package/ios/VideoCompositionFramesExtractorHostObject.mm +686 -0
- package/ios/VideoCompositionFramesExtractorSyncHostObject.h +37 -0
- package/ios/VideoCompositionFramesExtractorSyncHostObject.mm +168 -0
- package/ios/VideoCompositionItemDecoder.h +60 -0
- package/ios/VideoCompositionItemDecoder.mm +480 -0
- package/ios/VideoEncoderHostObject.h +83 -0
- package/ios/VideoEncoderHostObject.mm +706 -0
- package/ios/VideoFrame.h +66 -0
- package/ios/VideoFrame.mm +108 -0
- package/ios/VideoPlayerHostObject.h +52 -0
- package/ios/VideoPlayerHostObject.mm +332 -0
- package/lib/module/NativeReactNativeSkiaVideo.js +5 -0
- package/lib/module/NativeReactNativeSkiaVideo.js.map +1 -0
- package/lib/module/RNSkiaVideoModule.js +20 -0
- package/lib/module/RNSkiaVideoModule.js.map +1 -0
- package/lib/module/canvas.js +18 -0
- package/lib/module/canvas.js.map +1 -0
- package/lib/module/exportCache.js +22 -0
- package/lib/module/exportCache.js.map +1 -0
- package/lib/module/exportFrames.js +338 -0
- package/lib/module/exportFrames.js.map +1 -0
- package/lib/module/exportQueue.js +52 -0
- package/lib/module/exportQueue.js.map +1 -0
- package/lib/module/exportTarget.js +137 -0
- package/lib/module/exportTarget.js.map +1 -0
- package/lib/module/exportVideoComposition.js +492 -0
- package/lib/module/exportVideoComposition.js.map +1 -0
- package/lib/module/frameInterop.js +532 -0
- package/lib/module/frameInterop.js.map +1 -0
- package/lib/module/gpu.js +222 -0
- package/lib/module/gpu.js.map +1 -0
- package/lib/module/gpuDevice.js +54 -0
- package/lib/module/gpuDevice.js.map +1 -0
- package/lib/module/index.js +36 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/memory.js +38 -0
- package/lib/module/memory.js.map +1 -0
- package/lib/module/package.json +1 -0
- package/lib/module/previewLifecycle.js +52 -0
- package/lib/module/previewLifecycle.js.map +1 -0
- package/lib/module/runtimeYield.js +10 -0
- package/lib/module/runtimeYield.js.map +1 -0
- package/lib/module/types.js +4 -0
- package/lib/module/types.js.map +1 -0
- package/lib/module/utils/useEventListener.js +18 -0
- package/lib/module/utils/useEventListener.js.map +1 -0
- package/lib/module/videoCompositionPlayer.js +348 -0
- package/lib/module/videoCompositionPlayer.js.map +1 -0
- package/lib/module/videoFrameImage.js +185 -0
- package/lib/module/videoFrameImage.js.map +1 -0
- package/lib/module/videoPlayer.js +172 -0
- package/lib/module/videoPlayer.js.map +1 -0
- package/lib/module/yuvBlit.js +299 -0
- package/lib/module/yuvBlit.js.map +1 -0
- package/lib/typescript/package.json +1 -0
- package/lib/typescript/src/NativeReactNativeSkiaVideo.d.ts +7 -0
- package/lib/typescript/src/NativeReactNativeSkiaVideo.d.ts.map +1 -0
- package/lib/typescript/src/RNSkiaVideoModule.d.ts +4 -0
- package/lib/typescript/src/RNSkiaVideoModule.d.ts.map +1 -0
- package/lib/typescript/src/canvas.d.ts +4 -0
- package/lib/typescript/src/canvas.d.ts.map +1 -0
- package/lib/typescript/src/exportCache.d.ts +6 -0
- package/lib/typescript/src/exportCache.d.ts.map +1 -0
- package/lib/typescript/src/exportFrames.d.ts +57 -0
- package/lib/typescript/src/exportFrames.d.ts.map +1 -0
- package/lib/typescript/src/exportQueue.d.ts +5 -0
- package/lib/typescript/src/exportQueue.d.ts.map +1 -0
- package/lib/typescript/src/exportTarget.d.ts +28 -0
- package/lib/typescript/src/exportTarget.d.ts.map +1 -0
- package/lib/typescript/src/exportVideoComposition.d.ts +68 -0
- package/lib/typescript/src/exportVideoComposition.d.ts.map +1 -0
- package/lib/typescript/src/frameInterop.d.ts +17 -0
- package/lib/typescript/src/frameInterop.d.ts.map +1 -0
- package/lib/typescript/src/gpu.d.ts +39 -0
- package/lib/typescript/src/gpu.d.ts.map +1 -0
- package/lib/typescript/src/gpuDevice.d.ts +11 -0
- package/lib/typescript/src/gpuDevice.d.ts.map +1 -0
- package/lib/typescript/src/index.d.ts +21 -0
- package/lib/typescript/src/index.d.ts.map +1 -0
- package/lib/typescript/src/memory.d.ts +25 -0
- package/lib/typescript/src/memory.d.ts.map +1 -0
- package/lib/typescript/src/previewLifecycle.d.ts +22 -0
- package/lib/typescript/src/previewLifecycle.d.ts.map +1 -0
- package/lib/typescript/src/runtimeYield.d.ts +4 -0
- package/lib/typescript/src/runtimeYield.d.ts.map +1 -0
- package/lib/typescript/src/types.d.ts +631 -0
- package/lib/typescript/src/types.d.ts.map +1 -0
- package/lib/typescript/src/utils/useEventListener.d.ts +5 -0
- package/lib/typescript/src/utils/useEventListener.d.ts.map +1 -0
- package/lib/typescript/src/videoCompositionPlayer.d.ts +85 -0
- package/lib/typescript/src/videoCompositionPlayer.d.ts.map +1 -0
- package/lib/typescript/src/videoFrameImage.d.ts +60 -0
- package/lib/typescript/src/videoFrameImage.d.ts.map +1 -0
- package/lib/typescript/src/videoPlayer.d.ts +99 -0
- package/lib/typescript/src/videoPlayer.d.ts.map +1 -0
- package/lib/typescript/src/yuvBlit.d.ts +50 -0
- package/lib/typescript/src/yuvBlit.d.ts.map +1 -0
- package/package.json +154 -4
- package/patches/react-native-skia+3.7.0.patch +502 -0
- package/react-native-skia-webgpu-video.podspec +35 -0
- package/scripts/apply-skia-canvas-patch.mjs +48 -0
- package/scripts/skia-canvas-patch.json +291 -0
- package/src/NativeReactNativeSkiaVideo.ts +8 -0
- package/src/RNSkiaVideoModule.ts +27 -0
- package/src/canvas.ts +22 -0
- package/src/exportCache.ts +27 -0
- package/src/exportFrames.ts +421 -0
- package/src/exportQueue.ts +65 -0
- package/src/exportTarget.ts +179 -0
- package/src/exportVideoComposition.ts +718 -0
- package/src/frameInterop.ts +684 -0
- package/src/gpu.ts +290 -0
- package/src/gpuDevice.ts +80 -0
- package/src/index.tsx +45 -0
- package/src/memory.ts +48 -0
- package/src/previewLifecycle.ts +60 -0
- package/src/runtimeYield.ts +6 -0
- package/src/types.ts +661 -0
- package/src/utils/useEventListener.ts +22 -0
- package/src/videoCompositionPlayer.ts +520 -0
- package/src/videoFrameImage.ts +205 -0
- package/src/videoPlayer.ts +318 -0
- package/src/yuvBlit.ts +331 -0
|
@@ -0,0 +1,348 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { getVideoCanvas } from "./canvas.js";
|
|
4
|
+
import { BlendMode, Skia } from "react-native-skia";
|
|
5
|
+
import { useSharedValue, useFrameCallback, runOnUI } from "react-native-reanimated";
|
|
6
|
+
import { useCallback, useEffect, useRef, useState } from "react";
|
|
7
|
+
import RNSkiaVideoModule from "./RNSkiaVideoModule.js";
|
|
8
|
+
import useEventListener from "./utils/useEventListener.js";
|
|
9
|
+
import { PixelRatio } from "react-native";
|
|
10
|
+
import { scheduleOnRN } from "react-native-worklets";
|
|
11
|
+
import { ownVideoFrames, releaseVideoFrameImage } from "./frameInterop.js";
|
|
12
|
+
import { frameByteSize, reserveVideoMemory } from "./memory.js";
|
|
13
|
+
import { disposePreviewResources } from "./previewLifecycle.js";
|
|
14
|
+
/**
|
|
15
|
+
* A hook that creates a video composition player.
|
|
16
|
+
*/
|
|
17
|
+
export const useVideoComposition = ({
|
|
18
|
+
composition,
|
|
19
|
+
drawFrame,
|
|
20
|
+
beforeDrawFrame,
|
|
21
|
+
afterDrawFrame,
|
|
22
|
+
width,
|
|
23
|
+
height,
|
|
24
|
+
autoPlay = false,
|
|
25
|
+
isLooping = false,
|
|
26
|
+
drawWhenPaused = false,
|
|
27
|
+
onReadyToPlay,
|
|
28
|
+
onComplete,
|
|
29
|
+
onError
|
|
30
|
+
}) => {
|
|
31
|
+
const [failedComposition, setFailedComposition] = useState(null);
|
|
32
|
+
const isErrored = composition !== null && failedComposition === composition;
|
|
33
|
+
const [session, setSession] = useState(null);
|
|
34
|
+
const framesExtractor = session?.extractor ?? null;
|
|
35
|
+
const generation = session?.generation ?? 0;
|
|
36
|
+
const nextGeneration = useRef(0);
|
|
37
|
+
const activeOnRN = useRef(0);
|
|
38
|
+
// HostObject JS wrappers are recreated across runtimes; compare numbers.
|
|
39
|
+
const activeGeneration = useSharedValue(0);
|
|
40
|
+
const frameGeneration = useSharedValue(0);
|
|
41
|
+
const sourcesGeneration = useSharedValue(0);
|
|
42
|
+
const currentFrame = useSharedValue(null);
|
|
43
|
+
const pendingSnapshot = useSharedValue(null);
|
|
44
|
+
// Reanimated interprets a function assigned to `.value` as an animation
|
|
45
|
+
// factory. Keep the teardown callback inside an ordinary value instead.
|
|
46
|
+
const pendingAfterDraw = useSharedValue(null);
|
|
47
|
+
const previousSources = useSharedValue({});
|
|
48
|
+
const onCreationError = useRef(onError);
|
|
49
|
+
onCreationError.current = onError;
|
|
50
|
+
useEffect(() => {
|
|
51
|
+
if (!composition || isErrored) {
|
|
52
|
+
setSession(null);
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
let created;
|
|
56
|
+
try {
|
|
57
|
+
created = RNSkiaVideoModule.createVideoCompositionFramesExtractor(composition);
|
|
58
|
+
} catch (error) {
|
|
59
|
+
setFailedComposition(composition);
|
|
60
|
+
onCreationError.current?.(error, () => setFailedComposition(null));
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
const createdGeneration = ++nextGeneration.current;
|
|
64
|
+
activeOnRN.current = createdGeneration;
|
|
65
|
+
activeGeneration.value = createdGeneration;
|
|
66
|
+
setSession({
|
|
67
|
+
extractor: created,
|
|
68
|
+
generation: createdGeneration,
|
|
69
|
+
composition
|
|
70
|
+
});
|
|
71
|
+
return () => {
|
|
72
|
+
if (activeOnRN.current === createdGeneration) {
|
|
73
|
+
activeOnRN.current = 0;
|
|
74
|
+
activeGeneration.value = 0;
|
|
75
|
+
}
|
|
76
|
+
runOnUI(() => {
|
|
77
|
+
"worklet";
|
|
78
|
+
|
|
79
|
+
if (frameGeneration.value === createdGeneration || sourcesGeneration.value === createdGeneration) releasePreview(created);else {
|
|
80
|
+
const failure = disposePreviewResources({
|
|
81
|
+
native: created
|
|
82
|
+
});
|
|
83
|
+
if (failure.failed) console.warn("Video preview cleanup failed; resources remain accounted until native runtime teardown", failure.error);
|
|
84
|
+
}
|
|
85
|
+
})();
|
|
86
|
+
};
|
|
87
|
+
}, [composition, isErrored, activeGeneration, currentFrame, previousSources, frameGeneration, sourcesGeneration, pendingSnapshot, pendingAfterDraw]);
|
|
88
|
+
const retry = useCallback(() => {
|
|
89
|
+
setFailedComposition(null);
|
|
90
|
+
}, []);
|
|
91
|
+
const errorHandler = useCallback(error => {
|
|
92
|
+
if (generation !== activeOnRN.current) return;
|
|
93
|
+
activeOnRN.current = 0;
|
|
94
|
+
activeGeneration.value = 0;
|
|
95
|
+
setFailedComposition(session.composition);
|
|
96
|
+
onCreationError.current?.(error, retry);
|
|
97
|
+
}, [retry, generation, activeGeneration, session]);
|
|
98
|
+
useEffect(() => {
|
|
99
|
+
if (framesExtractor) {
|
|
100
|
+
framesExtractor.isLooping = isLooping;
|
|
101
|
+
}
|
|
102
|
+
}, [framesExtractor, isLooping]);
|
|
103
|
+
const isCurrentSession = useCallback(() => generation !== 0 && generation === activeOnRN.current, [generation]);
|
|
104
|
+
useEventListener(framesExtractor, "ready", onReadyToPlay, isCurrentSession);
|
|
105
|
+
useEventListener(framesExtractor, "complete", onComplete, isCurrentSession);
|
|
106
|
+
useEventListener(framesExtractor, "error", errorHandler, isCurrentSession);
|
|
107
|
+
useEffect(() => {
|
|
108
|
+
if (!framesExtractor) return;
|
|
109
|
+
runOnUI(() => {
|
|
110
|
+
"worklet";
|
|
111
|
+
|
|
112
|
+
if (activeGeneration.value !== generation) return;
|
|
113
|
+
try {
|
|
114
|
+
framesExtractor.prepare();
|
|
115
|
+
} catch (error) {
|
|
116
|
+
activeGeneration.value = 0;
|
|
117
|
+
scheduleOnRN(errorHandler, error);
|
|
118
|
+
}
|
|
119
|
+
})();
|
|
120
|
+
}, [framesExtractor, activeGeneration, generation, errorHandler]);
|
|
121
|
+
useEffect(() => {
|
|
122
|
+
if (autoPlay) {
|
|
123
|
+
framesExtractor?.play();
|
|
124
|
+
}
|
|
125
|
+
}, [framesExtractor, autoPlay]);
|
|
126
|
+
const surfaceSharedValue = useSharedValue(null);
|
|
127
|
+
const canvasSharedValue = useSharedValue(null);
|
|
128
|
+
const surfaceReservation = useSharedValue(0);
|
|
129
|
+
const surfaceWidth = useSharedValue(0);
|
|
130
|
+
const surfaceHeight = useSharedValue(0);
|
|
131
|
+
const releasePreview = native => {
|
|
132
|
+
"worklet";
|
|
133
|
+
|
|
134
|
+
const resources = {
|
|
135
|
+
surface: surfaceSharedValue.value,
|
|
136
|
+
canvas: canvasSharedValue.value,
|
|
137
|
+
images: [currentFrame.value, pendingSnapshot.value],
|
|
138
|
+
frames: Object.values(previousSources.value),
|
|
139
|
+
reservation: surfaceReservation.value,
|
|
140
|
+
afterDraw: pendingAfterDraw.value?.run,
|
|
141
|
+
native
|
|
142
|
+
};
|
|
143
|
+
// Remove consumers before attempting a drain. A thrown drain must never
|
|
144
|
+
// leave teardown callbacks able to recycle these same resources later.
|
|
145
|
+
currentFrame.value = null;
|
|
146
|
+
pendingSnapshot.value = null;
|
|
147
|
+
pendingAfterDraw.value = null;
|
|
148
|
+
frameGeneration.value = 0;
|
|
149
|
+
previousSources.value = {};
|
|
150
|
+
sourcesGeneration.value = 0;
|
|
151
|
+
surfaceSharedValue.value = null;
|
|
152
|
+
canvasSharedValue.value = null;
|
|
153
|
+
surfaceReservation.value = 0;
|
|
154
|
+
surfaceWidth.value = 0;
|
|
155
|
+
surfaceHeight.value = 0;
|
|
156
|
+
const failure = disposePreviewResources(resources);
|
|
157
|
+
if (failure.failed) console.warn("Video preview cleanup failed; resources remain accounted until native runtime teardown", failure.error);
|
|
158
|
+
};
|
|
159
|
+
// Frames version and composition time of the last drawn image, to skip
|
|
160
|
+
// redrawing an unchanged picture while paused.
|
|
161
|
+
const lastDrawnFramesVersion = useSharedValue(-1);
|
|
162
|
+
const lastDrawnTime = useSharedValue(-1);
|
|
163
|
+
const lastDrawnInputs = useSharedValue(null);
|
|
164
|
+
// A new drawFrame can draw something else from the same time and frames.
|
|
165
|
+
useEffect(() => {
|
|
166
|
+
lastDrawnTime.value = -1;
|
|
167
|
+
}, [drawFrame, lastDrawnTime]);
|
|
168
|
+
const pixelRatio = PixelRatio.get();
|
|
169
|
+
|
|
170
|
+
// Release the offscreen surface with the hook that made it. Without this a
|
|
171
|
+
// caller that mounts and unmounts the player repeatedly — a player inside a
|
|
172
|
+
// modal, say — leaks a full size texture per cycle. runOnUI because this
|
|
173
|
+
// effect is declared before the frame callback below, and so its cleanup runs
|
|
174
|
+
// before the callback is unregistered.
|
|
175
|
+
useEffect(() => () => {
|
|
176
|
+
runOnUI(() => {
|
|
177
|
+
"worklet";
|
|
178
|
+
|
|
179
|
+
releasePreview();
|
|
180
|
+
})();
|
|
181
|
+
}, [surfaceSharedValue, canvasSharedValue, surfaceReservation, surfaceWidth, surfaceHeight, currentFrame, pendingSnapshot, pendingAfterDraw, frameGeneration, previousSources, sourcesGeneration]);
|
|
182
|
+
useFrameCallback(() => {
|
|
183
|
+
"worklet";
|
|
184
|
+
|
|
185
|
+
if (!framesExtractor || activeGeneration.value !== generation) {
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
try {
|
|
189
|
+
const pixelWidth = Math.floor(width * pixelRatio);
|
|
190
|
+
const pixelHeight = Math.floor(height * pixelRatio);
|
|
191
|
+
|
|
192
|
+
// Layout can report zero or NaN before the player is measured. Avoid
|
|
193
|
+
// native surface allocation until the dimensions are valid.
|
|
194
|
+
if (!(pixelWidth > 0) || !(pixelHeight > 0) || !isFinite(pixelWidth) || !isFinite(pixelHeight)) {
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
// Pull the frames decoded since the last vsync first: it is cheap when
|
|
199
|
+
// nothing new arrived, and it is what lets a paused player pick up the
|
|
200
|
+
// frame of a seek.
|
|
201
|
+
const frames = ownVideoFrames(framesExtractor.decodeCompositionFrames());
|
|
202
|
+
for (const [key, previous] of Object.entries(previousSources.value)) {
|
|
203
|
+
if (!frames[key] || frames[key].producerId !== previous.producerId) releaseVideoFrameImage(previous);
|
|
204
|
+
}
|
|
205
|
+
previousSources.value = frames;
|
|
206
|
+
sourcesGeneration.value = generation;
|
|
207
|
+
const currentTime = framesExtractor.currentTime;
|
|
208
|
+
const framesVersion = framesExtractor.framesVersion;
|
|
209
|
+
const inputs = Array.isArray(drawWhenPaused) ? drawWhenPaused : null;
|
|
210
|
+
let inputsSame = true;
|
|
211
|
+
if (inputs) {
|
|
212
|
+
const last = lastDrawnInputs.value;
|
|
213
|
+
if (!last || last.length !== inputs.length) inputsSame = false;else {
|
|
214
|
+
for (let i = 0; i < inputs.length; i++) {
|
|
215
|
+
if (inputs[i].value !== last[i]) {
|
|
216
|
+
inputsSame = false;
|
|
217
|
+
break;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
|
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
|
|
224
|
+
// redrawing it at every vsync would only burn GPU time and battery.
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
let surface = surfaceSharedValue.value;
|
|
228
|
+
if (!surface || surfaceWidth.value !== pixelWidth || surfaceHeight.value !== pixelHeight) {
|
|
229
|
+
// width and height can change while the player stays mounted — laying the
|
|
230
|
+
// stage out for a different aspect ratio calls the hook with new
|
|
231
|
+
// dimensions and the same surface. Drawing the new size into the old
|
|
232
|
+
// texture and then declaring the result to be the new size stretches the
|
|
233
|
+
// picture by the ratio between them, so the surface is re-keyed on its
|
|
234
|
+
// dimensions the way exportVideoComposition already re-keys its own.
|
|
235
|
+
const retired = {
|
|
236
|
+
images: [currentFrame.value, pendingSnapshot.value],
|
|
237
|
+
surface,
|
|
238
|
+
canvas: canvasSharedValue.value,
|
|
239
|
+
reservation: surfaceReservation.value,
|
|
240
|
+
afterDraw: pendingAfterDraw.value?.run
|
|
241
|
+
};
|
|
242
|
+
currentFrame.value = null;
|
|
243
|
+
pendingSnapshot.value = null;
|
|
244
|
+
pendingAfterDraw.value = null;
|
|
245
|
+
canvasSharedValue.value = null;
|
|
246
|
+
surfaceSharedValue.value = null;
|
|
247
|
+
surfaceReservation.value = 0;
|
|
248
|
+
const retiredFailure = disposePreviewResources(retired);
|
|
249
|
+
if (retiredFailure.failed) throw retiredFailure.error;
|
|
250
|
+
// Surface + immutable snapshot/COW backing while replacing the preview.
|
|
251
|
+
const reservation = reserveVideoMemory(frameByteSize(pixelWidth, pixelHeight) * 2, "composition preview");
|
|
252
|
+
surfaceReservation.value = reservation;
|
|
253
|
+
try {
|
|
254
|
+
surface = Skia.Surface.MakeOffscreen(pixelWidth, pixelHeight);
|
|
255
|
+
surfaceSharedValue.value = surface;
|
|
256
|
+
if (!surface) throw new Error("Cannot allocate preview surface");
|
|
257
|
+
canvasSharedValue.value = getVideoCanvas(surface);
|
|
258
|
+
surfaceWidth.value = pixelWidth;
|
|
259
|
+
surfaceHeight.value = pixelHeight;
|
|
260
|
+
} catch (error) {
|
|
261
|
+
// The ordinary session cleanup owns partial allocation state too.
|
|
262
|
+
// Preserve the setup error and keep its reservation reachable.
|
|
263
|
+
throw error;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
if (!surface) {
|
|
267
|
+
console.warn("Failed to create surface");
|
|
268
|
+
return;
|
|
269
|
+
}
|
|
270
|
+
const canvas = canvasSharedValue.value;
|
|
271
|
+
// Cleared as the export clears it: a drawFrame that leaves part of the
|
|
272
|
+
// canvas alone showed the previous frames there, and not in the export.
|
|
273
|
+
canvas.drawColor(Skia.Color("#00000000"), BlendMode.Clear);
|
|
274
|
+
const context = beforeDrawFrame?.();
|
|
275
|
+
const drawn = {
|
|
276
|
+
submitted: false,
|
|
277
|
+
failed: false,
|
|
278
|
+
error: undefined
|
|
279
|
+
};
|
|
280
|
+
const releaseContext = () => {
|
|
281
|
+
"worklet";
|
|
282
|
+
|
|
283
|
+
afterDrawFrame?.(context);
|
|
284
|
+
};
|
|
285
|
+
pendingAfterDraw.value = {
|
|
286
|
+
run: releaseContext
|
|
287
|
+
};
|
|
288
|
+
try {
|
|
289
|
+
drawFrame({
|
|
290
|
+
canvas,
|
|
291
|
+
context,
|
|
292
|
+
videoComposition: composition,
|
|
293
|
+
currentTime,
|
|
294
|
+
frames,
|
|
295
|
+
width: pixelWidth,
|
|
296
|
+
height: pixelHeight
|
|
297
|
+
});
|
|
298
|
+
const previous = currentFrame.value;
|
|
299
|
+
const next = surface.makeImageSnapshot(undefined, previous ?? undefined);
|
|
300
|
+
if (next !== previous) pendingSnapshot.value = next;
|
|
301
|
+
surface.flush(true);
|
|
302
|
+
drawn.submitted = true;
|
|
303
|
+
frameGeneration.value = generation;
|
|
304
|
+
if (next === previous) currentFrame.modify(undefined, true);else {
|
|
305
|
+
currentFrame.value = next;
|
|
306
|
+
previous?.dispose();
|
|
307
|
+
}
|
|
308
|
+
pendingSnapshot.value = null;
|
|
309
|
+
} catch (error) {
|
|
310
|
+
drawn.failed = true;
|
|
311
|
+
drawn.error = error;
|
|
312
|
+
} finally {
|
|
313
|
+
// A drawer can throw after recording commands that sample resources
|
|
314
|
+
// from context. Submit and wait before the caller releases them.
|
|
315
|
+
if (!drawn.submitted) {
|
|
316
|
+
try {
|
|
317
|
+
surface.flush(true);
|
|
318
|
+
drawn.submitted = true;
|
|
319
|
+
} catch (error) {
|
|
320
|
+
if (!drawn.failed) drawn.error = error;
|
|
321
|
+
drawn.failed = true;
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
if (drawn.submitted) {
|
|
325
|
+
pendingAfterDraw.value = null;
|
|
326
|
+
try {
|
|
327
|
+
releaseContext();
|
|
328
|
+
} catch (error) {
|
|
329
|
+
if (!drawn.failed) drawn.error = error;
|
|
330
|
+
drawn.failed = true;
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
if (drawn.failed) throw drawn.error;
|
|
335
|
+
lastDrawnFramesVersion.value = framesVersion;
|
|
336
|
+
lastDrawnTime.value = currentTime;
|
|
337
|
+
if (inputs) lastDrawnInputs.value = inputs.map(input => input.value);
|
|
338
|
+
} catch (error) {
|
|
339
|
+
activeGeneration.value = 0;
|
|
340
|
+
scheduleOnRN(errorHandler, error);
|
|
341
|
+
}
|
|
342
|
+
}, true);
|
|
343
|
+
return {
|
|
344
|
+
currentFrame,
|
|
345
|
+
player: framesExtractor
|
|
346
|
+
};
|
|
347
|
+
};
|
|
348
|
+
//# sourceMappingURL=videoCompositionPlayer.js.map
|
|
@@ -0,0 +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":[]}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { Skia } from "react-native-skia";
|
|
4
|
+
import { imageFromVideoFrame } from "./frameInterop.js";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* A frame as a Skia image, with what it takes to show its picture: the part of
|
|
8
|
+
* the image that is the picture, and the rotation that shows it upright.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* How the picture fills the destination of {@link drawVideoFrame}.
|
|
13
|
+
*
|
|
14
|
+
* - `fill`: all of it, stretched to the destination.
|
|
15
|
+
* - `cover`: the middle of it with the destination's aspect, all of the
|
|
16
|
+
* destination.
|
|
17
|
+
* - `contain`: all of it with its own aspect, in the middle of the destination.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Wraps a frame's texture in a Skia image, and says which part of it to draw
|
|
22
|
+
* and how to turn it. Works with every frame, whatever the platform and the
|
|
23
|
+
* texture mode: iOS frames and Android `direct` frames come as decoded, with
|
|
24
|
+
* a rotation, and Android `direct` frames are larger than their picture.
|
|
25
|
+
*
|
|
26
|
+
* @param frame the frame, drawn in the tick it was handed out in
|
|
27
|
+
* @param output an image returned for a previous frame, recycled rather than
|
|
28
|
+
* allocating a new wrapper. Accepted for compatibility; owned snapshots are used in v3
|
|
29
|
+
* @returns the image and its picture, or null when the frame has no texture
|
|
30
|
+
*/
|
|
31
|
+
export const makeVideoFrameImage = (frame, _output) => {
|
|
32
|
+
"worklet";
|
|
33
|
+
|
|
34
|
+
const image = imageFromVideoFrame(frame);
|
|
35
|
+
if (!image) {
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
const crop = frame.crop ?? {
|
|
39
|
+
x: 0,
|
|
40
|
+
y: 0,
|
|
41
|
+
width: frame.width,
|
|
42
|
+
height: frame.height
|
|
43
|
+
};
|
|
44
|
+
const rotation = (Math.round(frame.rotation / 90) * 90 % 360 + 360) % 360;
|
|
45
|
+
const quarter = rotation === 90 || rotation === 270;
|
|
46
|
+
return {
|
|
47
|
+
image,
|
|
48
|
+
rect: {
|
|
49
|
+
x: crop.x,
|
|
50
|
+
y: crop.y,
|
|
51
|
+
width: crop.width,
|
|
52
|
+
height: crop.height
|
|
53
|
+
},
|
|
54
|
+
rotation,
|
|
55
|
+
width: quarter ? crop.height : crop.width,
|
|
56
|
+
height: quarter ? crop.width : crop.height
|
|
57
|
+
};
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* The part of the texture that shows a rectangle of the upright picture.
|
|
62
|
+
*/
|
|
63
|
+
const textureRectOf = (rect, rotation, upright) => {
|
|
64
|
+
"worklet";
|
|
65
|
+
|
|
66
|
+
const u0 = upright.x;
|
|
67
|
+
const u1 = upright.x + upright.width;
|
|
68
|
+
const v0 = upright.y;
|
|
69
|
+
const v1 = upright.y + upright.height;
|
|
70
|
+
switch (rotation) {
|
|
71
|
+
case 90:
|
|
72
|
+
// Turned clockwise: the texture's left edge is the picture's top.
|
|
73
|
+
return {
|
|
74
|
+
x: rect.x + v0,
|
|
75
|
+
y: rect.y + rect.height - u1,
|
|
76
|
+
width: v1 - v0,
|
|
77
|
+
height: u1 - u0
|
|
78
|
+
};
|
|
79
|
+
case 180:
|
|
80
|
+
return {
|
|
81
|
+
x: rect.x + rect.width - u1,
|
|
82
|
+
y: rect.y + rect.height - v1,
|
|
83
|
+
width: u1 - u0,
|
|
84
|
+
height: v1 - v0
|
|
85
|
+
};
|
|
86
|
+
case 270:
|
|
87
|
+
return {
|
|
88
|
+
x: rect.x + rect.width - v1,
|
|
89
|
+
y: rect.y + u0,
|
|
90
|
+
width: v1 - v0,
|
|
91
|
+
height: u1 - u0
|
|
92
|
+
};
|
|
93
|
+
default:
|
|
94
|
+
return {
|
|
95
|
+
x: rect.x + u0,
|
|
96
|
+
y: rect.y + v0,
|
|
97
|
+
width: u1 - u0,
|
|
98
|
+
height: v1 - v0
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Draws a frame's picture, upright, into a rectangle of the canvas.
|
|
105
|
+
*
|
|
106
|
+
* @param canvas the canvas to draw on
|
|
107
|
+
* @param frame the frame, drawn in the tick it was handed out in
|
|
108
|
+
* @param dst where to draw the picture
|
|
109
|
+
* @param options.paint the paint to draw with, for an opacity say
|
|
110
|
+
* @param options.fit how the picture fills `dst`, `fill` by default
|
|
111
|
+
* @param options.output an image returned by a previous call, recycled
|
|
112
|
+
* @returns the image drawn, to pass back as `output` next time, or null when
|
|
113
|
+
* the frame has no texture
|
|
114
|
+
*/
|
|
115
|
+
export const drawVideoFrame = (canvas, frame, dst, options) => {
|
|
116
|
+
"worklet";
|
|
117
|
+
|
|
118
|
+
const frameImage = makeVideoFrameImage(frame, options?.output);
|
|
119
|
+
if (!frameImage) {
|
|
120
|
+
return null;
|
|
121
|
+
}
|
|
122
|
+
const {
|
|
123
|
+
image,
|
|
124
|
+
rect,
|
|
125
|
+
rotation,
|
|
126
|
+
width,
|
|
127
|
+
height
|
|
128
|
+
} = frameImage;
|
|
129
|
+
const fit = options?.fit ?? "fill";
|
|
130
|
+
// What of the upright picture is drawn, and where.
|
|
131
|
+
let picture = {
|
|
132
|
+
x: 0,
|
|
133
|
+
y: 0,
|
|
134
|
+
width,
|
|
135
|
+
height
|
|
136
|
+
};
|
|
137
|
+
let target = dst;
|
|
138
|
+
if (fit === "cover") {
|
|
139
|
+
const scale = Math.max(dst.width / width, dst.height / height);
|
|
140
|
+
const visibleWidth = dst.width / scale;
|
|
141
|
+
const visibleHeight = dst.height / scale;
|
|
142
|
+
picture = {
|
|
143
|
+
x: (width - visibleWidth) / 2,
|
|
144
|
+
y: (height - visibleHeight) / 2,
|
|
145
|
+
width: visibleWidth,
|
|
146
|
+
height: visibleHeight
|
|
147
|
+
};
|
|
148
|
+
} else if (fit === "contain") {
|
|
149
|
+
const scale = Math.min(dst.width / width, dst.height / height);
|
|
150
|
+
target = {
|
|
151
|
+
x: dst.x + (dst.width - width * scale) / 2,
|
|
152
|
+
y: dst.y + (dst.height - height * scale) / 2,
|
|
153
|
+
width: width * scale,
|
|
154
|
+
height: height * scale
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
const src = textureRectOf(rect, rotation, picture);
|
|
158
|
+
const paint = options?.paint ?? Skia.Paint();
|
|
159
|
+
try {
|
|
160
|
+
if (rotation === 0) {
|
|
161
|
+
canvas.drawImageRect(image, src, target, paint);
|
|
162
|
+
return image;
|
|
163
|
+
}
|
|
164
|
+
const quarter = rotation === 90 || rotation === 270;
|
|
165
|
+
const turnedWidth = quarter ? target.height : target.width;
|
|
166
|
+
const turnedHeight = quarter ? target.width : target.height;
|
|
167
|
+
canvas.save();
|
|
168
|
+
try {
|
|
169
|
+
canvas.translate(target.x + target.width / 2, target.y + target.height / 2);
|
|
170
|
+
canvas.rotate(rotation, 0, 0);
|
|
171
|
+
canvas.drawImageRect(image, src, {
|
|
172
|
+
x: -turnedWidth / 2,
|
|
173
|
+
y: -turnedHeight / 2,
|
|
174
|
+
width: turnedWidth,
|
|
175
|
+
height: turnedHeight
|
|
176
|
+
}, paint);
|
|
177
|
+
} finally {
|
|
178
|
+
canvas.restore();
|
|
179
|
+
}
|
|
180
|
+
return image;
|
|
181
|
+
} finally {
|
|
182
|
+
if (!options?.paint) paint.dispose();
|
|
183
|
+
}
|
|
184
|
+
};
|
|
185
|
+
//# sourceMappingURL=videoFrameImage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["Skia","imageFromVideoFrame","makeVideoFrameImage","frame","_output","image","crop","x","y","width","height","rotation","Math","round","quarter","rect","textureRectOf","upright","u0","u1","v0","v1","drawVideoFrame","canvas","dst","options","frameImage","output","fit","picture","target","scale","max","visibleWidth","visibleHeight","min","src","paint","Paint","drawImageRect","turnedWidth","turnedHeight","save","translate","rotate","restore","dispose"],"sourceRoot":"../../src","sources":["videoFrameImage.ts"],"mappings":"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","ignoreList":[]}
|