react-native-skia-webgpu-video 0.0.0-stage → 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.
- 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/DisplayVsyncPeriod.java +72 -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 +43 -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 +114 -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 +779 -0
- package/android/src/main/java/com/azzapp/rnskv/VideoCompositionFramesExtractor.java +463 -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 +368 -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 +105 -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 +155 -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 +568 -0
- package/src/videoFrameImage.ts +205 -0
- package/src/videoPlayer.ts +318 -0
- package/src/yuvBlit.ts +331 -0
|
@@ -0,0 +1,492 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { assertExportRecorderCacheSupport, trimExportRecorderCache } from "./exportCache.js";
|
|
4
|
+
import { getVideoCanvas } from "./canvas.js";
|
|
5
|
+
import { createWorkletRuntime, createSynchronizable, runOnRuntime, scheduleOnRN } from "react-native-worklets";
|
|
6
|
+
import { AlphaType, BlendMode, ColorType, Skia } from "react-native-skia";
|
|
7
|
+
import { Platform } from "react-native";
|
|
8
|
+
import RNSkiaVideoModule from "./RNSkiaVideoModule.js";
|
|
9
|
+
import { clearVideoFrameImages, ownVideoFrames, releaseVideoFrameImage } from "./frameInterop.js";
|
|
10
|
+
import { frameByteSize, releaseVideoMemory, reserveVideoMemory } from "./memory.js";
|
|
11
|
+
import { enqueueExport, exportAbortError } from "./exportQueue.js";
|
|
12
|
+
import { acquireEncoderTarget, closeEncoderTarget, probeEncoderTarget, supportsEncoderTargets } from "./exportTarget.js";
|
|
13
|
+
import { yieldToRuntime } from "./runtimeYield.js";
|
|
14
|
+
import { createExportFrameImports, ownExportFrames, releaseExportFrames } from "./exportFrames.js";
|
|
15
|
+
|
|
16
|
+
/** Optional per-export GPU, 3D or ML adapter. Construct resources on the
|
|
17
|
+
* export runtime; the legacy draw callback stays synchronous. */
|
|
18
|
+
|
|
19
|
+
/** Cumulative wall-clock milliseconds per export stage, measured on the
|
|
20
|
+
* export runtime. Stages are sequential, so they add up to `totalMs`. */
|
|
21
|
+
|
|
22
|
+
// Native Skia 3.4.4 accepts destination/stride in readPixels; its
|
|
23
|
+
// published Canvas type currently omits these arguments. Use only a private,
|
|
24
|
+
// full-length, zero-offset Uint8Array (the native implementation ignores offsets).
|
|
25
|
+
|
|
26
|
+
let exportRuntime = null;
|
|
27
|
+
const getExportRuntime = () => {
|
|
28
|
+
if (!exportRuntime) exportRuntime = createWorkletRuntime({
|
|
29
|
+
name: "RNSkiaWebGPUVideoExport"
|
|
30
|
+
});
|
|
31
|
+
return exportRuntime;
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
// The persistent worklet thread does not drain Apple autoreleased objects.
|
|
35
|
+
// Scope synchronous native/Skia work only: an async callback would return its
|
|
36
|
+
// Promise before that work finishes, so its later continuation needs its own
|
|
37
|
+
// synchronous scope.
|
|
38
|
+
const runWithVideoAutoreleasePool = fn => {
|
|
39
|
+
"worklet";
|
|
40
|
+
|
|
41
|
+
return (RNSkiaVideoModule.runWithAutoreleasePool ?? (body => body()))(fn);
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
/** Public drawing/timing contract preserved; one step is submitted at a time.
|
|
45
|
+
* Native input and output queues, the shared budget and serialized exports
|
|
46
|
+
* prevent slow GPU/codec/ML consumers from growing an unbounded frame backlog. */
|
|
47
|
+
export const exportVideoComposition = args => enqueueExport(() => executeExport(args), args.abortSignal);
|
|
48
|
+
const executeExport = args => new Promise((resolve, reject) => {
|
|
49
|
+
const {
|
|
50
|
+
videoComposition,
|
|
51
|
+
drawFrame,
|
|
52
|
+
beforeDrawFrame,
|
|
53
|
+
afterDrawFrame,
|
|
54
|
+
onProgress,
|
|
55
|
+
abortSignal,
|
|
56
|
+
createFrameProcessor,
|
|
57
|
+
onProfile,
|
|
58
|
+
...options
|
|
59
|
+
} = args;
|
|
60
|
+
if (abortSignal?.aborted) {
|
|
61
|
+
reject(exportAbortError(abortSignal));
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
let bytes;
|
|
65
|
+
let nbFrames;
|
|
66
|
+
try {
|
|
67
|
+
bytes = frameByteSize(options.width, options.height);
|
|
68
|
+
if (!Number.isFinite(options.frameRate) || options.frameRate <= 0 || !Number.isFinite(videoComposition.duration) || videoComposition.duration <= 0 || !Number.isFinite(options.bitRate) || options.bitRate <= 0 || !options.outPath) {
|
|
69
|
+
throw new Error("Invalid video export options");
|
|
70
|
+
}
|
|
71
|
+
nbFrames = Math.ceil(videoComposition.duration * options.frameRate - 1e-6);
|
|
72
|
+
if (!Number.isSafeInteger(nbFrames) || nbFrames <= 0) throw new Error("Invalid export frame count");
|
|
73
|
+
} catch (error) {
|
|
74
|
+
reject(error);
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
const cancelled = createSynchronizable(false);
|
|
78
|
+
const onAbort = () => cancelled.setBlocking(true);
|
|
79
|
+
abortSignal?.addEventListener("abort", onAbort);
|
|
80
|
+
// Cancellation is observed in the worklet. Rejection happens after draining
|
|
81
|
+
// and cleanup, so the caller may immediately retry/reuse its output path.
|
|
82
|
+
const settle = (error, aborted, failed = error !== null) => {
|
|
83
|
+
abortSignal?.removeEventListener("abort", onAbort);
|
|
84
|
+
if (aborted) reject(exportAbortError(abortSignal));else if (failed) reject(error);else resolve();
|
|
85
|
+
};
|
|
86
|
+
let runtime;
|
|
87
|
+
try {
|
|
88
|
+
runtime = getExportRuntime();
|
|
89
|
+
} catch (error) {
|
|
90
|
+
settle(error, cancelled.getBlocking(), true);
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
const bgra = Platform.OS === "ios";
|
|
94
|
+
// iOS always; Android when its AHardwareBuffer interop is negotiated.
|
|
95
|
+
const gpuExport = RNSkiaVideoModule.getBackendInfo?.()?.gpuDirectExport === true;
|
|
96
|
+
// Keep the export closure identity stable across frames. Recreating this
|
|
97
|
+
// worklet per image makes Worklets reconstruct its entire captured graph
|
|
98
|
+
// on the persistent runtime, including nested drawing/native functions.
|
|
99
|
+
const step = () => {
|
|
100
|
+
try {
|
|
101
|
+
runOnRuntime(runtime, frameWorklet)();
|
|
102
|
+
} catch (error) {
|
|
103
|
+
settle(error, cancelled.getBlocking(), true);
|
|
104
|
+
}
|
|
105
|
+
};
|
|
106
|
+
const frameWorklet = () => {
|
|
107
|
+
"worklet";
|
|
108
|
+
|
|
109
|
+
const storage = globalThis;
|
|
110
|
+
const state = storage.__rnskwgpuExport;
|
|
111
|
+
if (!state) {
|
|
112
|
+
scheduleOnRN(settle, new Error("Export state unavailable"), false);
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
const isCancelled = () => {
|
|
116
|
+
"worklet";
|
|
117
|
+
|
|
118
|
+
return cancelled.getBlocking();
|
|
119
|
+
};
|
|
120
|
+
// Per session: this worklet runs once and loops over every frame.
|
|
121
|
+
const profile = onProfile ? {
|
|
122
|
+
frames: 0,
|
|
123
|
+
totalMs: 0,
|
|
124
|
+
decodeMs: 0,
|
|
125
|
+
importMs: 0,
|
|
126
|
+
prepareMs: 0,
|
|
127
|
+
targetMs: 0,
|
|
128
|
+
drawMs: 0,
|
|
129
|
+
gpuMs: 0,
|
|
130
|
+
encodeMs: 0,
|
|
131
|
+
yieldMs: 0
|
|
132
|
+
} : null;
|
|
133
|
+
const clock = {
|
|
134
|
+
last: -1
|
|
135
|
+
};
|
|
136
|
+
/** Charges the time since the previous lap to one stage. */
|
|
137
|
+
const lap = stage => {
|
|
138
|
+
"worklet";
|
|
139
|
+
|
|
140
|
+
if (!profile) return;
|
|
141
|
+
const now = performance.now();
|
|
142
|
+
if (clock.last >= 0) profile[stage] += now - clock.last;
|
|
143
|
+
clock.last = now;
|
|
144
|
+
};
|
|
145
|
+
const finish = async (error, aborted = false, failed = false) => {
|
|
146
|
+
"worklet";
|
|
147
|
+
|
|
148
|
+
const cleanup = {
|
|
149
|
+
failure: error,
|
|
150
|
+
failed,
|
|
151
|
+
safeToRelease: true
|
|
152
|
+
};
|
|
153
|
+
// A rejected adapter drain cannot prove that it stopped reading
|
|
154
|
+
// our pixels. Retain/account that session instead of recycling them.
|
|
155
|
+
const clean = fn => {
|
|
156
|
+
"worklet";
|
|
157
|
+
|
|
158
|
+
try {
|
|
159
|
+
runWithVideoAutoreleasePool(fn);
|
|
160
|
+
return true;
|
|
161
|
+
} catch (e) {
|
|
162
|
+
if (!cleanup.failed) cleanup.failure = e;
|
|
163
|
+
cleanup.failed = true;
|
|
164
|
+
cleanup.safeToRelease = false;
|
|
165
|
+
return false;
|
|
166
|
+
}
|
|
167
|
+
};
|
|
168
|
+
// Submit any recording left by a drawing exception before an
|
|
169
|
+
// adapter is allowed to destroy textures referenced by that canvas.
|
|
170
|
+
clean(() => state.surface?.flush(true));
|
|
171
|
+
clean(() => state.target?.surface?.flush(true));
|
|
172
|
+
if (cleanup.safeToRelease && state.pendingAfterDraw) {
|
|
173
|
+
if (clean(state.pendingAfterDraw)) state.pendingAfterDraw = null;
|
|
174
|
+
}
|
|
175
|
+
if (cleanup.safeToRelease) {
|
|
176
|
+
try {
|
|
177
|
+
await state.processor?.dispose();
|
|
178
|
+
state.processor = null;
|
|
179
|
+
} catch (e) {
|
|
180
|
+
if (!cleanup.failed) cleanup.failure = e;
|
|
181
|
+
cleanup.failed = true;
|
|
182
|
+
cleanup.safeToRelease = false;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
if (clean(() => state.extractor?.dispose())) state.extractor = null;
|
|
186
|
+
if (clean(() => state.encoder?.dispose())) state.encoder = null;
|
|
187
|
+
if (cleanup.safeToRelease) {
|
|
188
|
+
clean(() => state.surface?.flush(true));
|
|
189
|
+
clean(() => state.target?.surface?.flush(true));
|
|
190
|
+
if (cleanup.safeToRelease) {
|
|
191
|
+
for (const frame of Object.values(state.frames)) clean(() => frame.dispose?.());
|
|
192
|
+
const imports = state.imports;
|
|
193
|
+
if (imports && clean(() => releaseExportFrames(imports))) state.imports = null;
|
|
194
|
+
clean(() => clearVideoFrameImages(true));
|
|
195
|
+
}
|
|
196
|
+
if (cleanup.safeToRelease && clean(() => state.canvas?.dispose())) state.canvas = null;
|
|
197
|
+
if (cleanup.safeToRelease && clean(() => state.surface?.dispose())) state.surface = null;
|
|
198
|
+
const target = state.target;
|
|
199
|
+
if (cleanup.safeToRelease && target) {
|
|
200
|
+
if (clean(() => closeEncoderTarget(target))) state.target = null;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
// The export runtime is private and serialized. Its unused cache
|
|
204
|
+
// need not survive a completed session; leave the shared Context
|
|
205
|
+
// and the UI/runtime caches alone. A failed drain stays quarantined.
|
|
206
|
+
if (cleanup.safeToRelease && state.hasRecorder) {
|
|
207
|
+
if (clean(trimExportRecorderCache)) state.hasRecorder = false;
|
|
208
|
+
}
|
|
209
|
+
if (cleanup.safeToRelease) {
|
|
210
|
+
for (let i = state.reservations.length - 1; i >= 0; i--) {
|
|
211
|
+
if (clean(() => releaseVideoMemory(state.reservations[i]))) state.reservations.splice(i, 1);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
if (cleanup.safeToRelease) {
|
|
215
|
+
state.frames = {};
|
|
216
|
+
state.readback = null;
|
|
217
|
+
delete storage.__rnskwgpuExport;
|
|
218
|
+
} else {
|
|
219
|
+
// One retained session at most; subsequent exports fail before
|
|
220
|
+
// allocating anything. Runtime teardown is the recovery boundary.
|
|
221
|
+
state.poisoned = true;
|
|
222
|
+
state.setupError = cleanup.failure;
|
|
223
|
+
}
|
|
224
|
+
scheduleOnRN(settle, cleanup.failure, aborted || isCancelled(), cleanup.failed);
|
|
225
|
+
};
|
|
226
|
+
// One frame per call; true when another frame follows.
|
|
227
|
+
const work = async () => {
|
|
228
|
+
"worklet";
|
|
229
|
+
|
|
230
|
+
try {
|
|
231
|
+
if ("setupError" in state) throw state.setupError;
|
|
232
|
+
lap("yieldMs");
|
|
233
|
+
if (isCancelled()) {
|
|
234
|
+
await finish(null, true);
|
|
235
|
+
return false;
|
|
236
|
+
}
|
|
237
|
+
const time = state.index / options.frameRate;
|
|
238
|
+
// Purge ended/closed producer images, including lazily opened clips.
|
|
239
|
+
const owned = runWithVideoAutoreleasePool(() => {
|
|
240
|
+
const decoded = state.extractor.decodeCompositionFrames(time);
|
|
241
|
+
lap("decodeMs");
|
|
242
|
+
const imports = state.imports;
|
|
243
|
+
// In place, a producer's frame is released by its next import.
|
|
244
|
+
const imported = imports ? ownExportFrames(imports, decoded, ownVideoFrames) : ownVideoFrames(decoded);
|
|
245
|
+
for (const [key, previous] of Object.entries(state.frames)) {
|
|
246
|
+
if (imports?.producers.has(previous.producerId ?? -1)) continue;
|
|
247
|
+
if (!imported[key] || imported[key].producerId !== previous.producerId) releaseVideoFrameImage(previous);
|
|
248
|
+
}
|
|
249
|
+
return imported;
|
|
250
|
+
});
|
|
251
|
+
lap("importMs");
|
|
252
|
+
state.frames = owned;
|
|
253
|
+
await state.processor?.prepareFrame({
|
|
254
|
+
frames: owned,
|
|
255
|
+
currentTime: time,
|
|
256
|
+
videoComposition,
|
|
257
|
+
width: options.width,
|
|
258
|
+
height: options.height,
|
|
259
|
+
isCancelled
|
|
260
|
+
});
|
|
261
|
+
lap("prepareMs");
|
|
262
|
+
if (isCancelled()) {
|
|
263
|
+
await finish(null, true);
|
|
264
|
+
return false;
|
|
265
|
+
}
|
|
266
|
+
const draw = () => {
|
|
267
|
+
"worklet";
|
|
268
|
+
|
|
269
|
+
if (state.gpu) state.target = acquireEncoderTarget(state.encoder, options.width, options.height);
|
|
270
|
+
lap("targetMs");
|
|
271
|
+
const target = state.target;
|
|
272
|
+
const surface = target ? target.surface : state.surface;
|
|
273
|
+
const canvas = target ? target.canvas : state.canvas;
|
|
274
|
+
canvas.drawColor(Skia.Color("#00000000"), BlendMode.Clear);
|
|
275
|
+
const context = beforeDrawFrame?.();
|
|
276
|
+
const drawn = {
|
|
277
|
+
failed: false,
|
|
278
|
+
failure: undefined,
|
|
279
|
+
drained: false
|
|
280
|
+
};
|
|
281
|
+
try {
|
|
282
|
+
drawFrame({
|
|
283
|
+
canvas,
|
|
284
|
+
context,
|
|
285
|
+
videoComposition,
|
|
286
|
+
currentTime: time,
|
|
287
|
+
frames: owned,
|
|
288
|
+
width: options.width,
|
|
289
|
+
height: options.height
|
|
290
|
+
});
|
|
291
|
+
lap("drawMs");
|
|
292
|
+
surface.flush(true);
|
|
293
|
+
drawn.drained = true;
|
|
294
|
+
lap("gpuMs");
|
|
295
|
+
if (target) {
|
|
296
|
+
closeEncoderTarget(target, true);
|
|
297
|
+
state.target = null;
|
|
298
|
+
state.encoder.encodeFrame({
|
|
299
|
+
kind: "native-buffer",
|
|
300
|
+
nativeBuffer: target.pointer,
|
|
301
|
+
fences: target.fences
|
|
302
|
+
}, time);
|
|
303
|
+
} else {
|
|
304
|
+
const readbackCanvas = canvas;
|
|
305
|
+
const pixels = readbackCanvas.readPixels(0, 0, {
|
|
306
|
+
width: options.width,
|
|
307
|
+
height: options.height,
|
|
308
|
+
colorType: bgra ? ColorType.BGRA_8888 : ColorType.RGBA_8888,
|
|
309
|
+
alphaType: AlphaType.Premul
|
|
310
|
+
}, state.readback, options.width * 4);
|
|
311
|
+
if (!(pixels instanceof Uint8Array) || pixels.byteLength !== bytes || pixels.byteOffset !== 0 || pixels.buffer !== state.readback.buffer) {
|
|
312
|
+
throw new Error("Video export pixel readback failed");
|
|
313
|
+
}
|
|
314
|
+
// Fallback: consumed synchronously by the bounded native pool.
|
|
315
|
+
const storage = pixels.byteOffset === 0 && pixels.buffer.byteLength === pixels.byteLength ? pixels.buffer : pixels.buffer.slice(pixels.byteOffset, pixels.byteOffset + pixels.byteLength);
|
|
316
|
+
state.encoder.encodeFrame({
|
|
317
|
+
kind: bgra ? "bgra" : "rgba",
|
|
318
|
+
data: storage,
|
|
319
|
+
width: options.width,
|
|
320
|
+
height: options.height,
|
|
321
|
+
bytesPerRow: options.width * 4
|
|
322
|
+
}, time);
|
|
323
|
+
}
|
|
324
|
+
lap("encodeMs");
|
|
325
|
+
} catch (error) {
|
|
326
|
+
drawn.failed = true;
|
|
327
|
+
drawn.failure = error;
|
|
328
|
+
} finally {
|
|
329
|
+
if (afterDrawFrame) {
|
|
330
|
+
// The context may own a texture referenced by a recording
|
|
331
|
+
// left behind by a thrown draw. Submit it before its owner
|
|
332
|
+
// can destroy it; keep the callback/context if draining fails.
|
|
333
|
+
if (!drawn.drained) {
|
|
334
|
+
try {
|
|
335
|
+
surface.flush(true);
|
|
336
|
+
drawn.drained = true;
|
|
337
|
+
} catch (error) {
|
|
338
|
+
if (!drawn.failed) drawn.failure = error;
|
|
339
|
+
drawn.failed = true;
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
const releaseContext = () => {
|
|
343
|
+
"worklet";
|
|
344
|
+
|
|
345
|
+
afterDrawFrame(context);
|
|
346
|
+
};
|
|
347
|
+
if (drawn.drained) {
|
|
348
|
+
try {
|
|
349
|
+
releaseContext();
|
|
350
|
+
} catch (error) {
|
|
351
|
+
if (!drawn.failed) drawn.failure = error;
|
|
352
|
+
drawn.failed = true;
|
|
353
|
+
}
|
|
354
|
+
} else state.pendingAfterDraw = releaseContext;
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
if (drawn.failed) throw drawn.failure;
|
|
358
|
+
};
|
|
359
|
+
runWithVideoAutoreleasePool(draw);
|
|
360
|
+
state.index++;
|
|
361
|
+
if (onProgress) scheduleOnRN(onProgress, {
|
|
362
|
+
framesCompleted: state.index,
|
|
363
|
+
nbFrames
|
|
364
|
+
});
|
|
365
|
+
lap("drawMs");
|
|
366
|
+
if (isCancelled()) {
|
|
367
|
+
await finish(null, true);
|
|
368
|
+
return false;
|
|
369
|
+
}
|
|
370
|
+
if (state.index === nbFrames) {
|
|
371
|
+
runWithVideoAutoreleasePool(() => state.encoder.finishWriting());
|
|
372
|
+
lap("encodeMs");
|
|
373
|
+
if (profile && onProfile) {
|
|
374
|
+
profile.frames = state.index;
|
|
375
|
+
profile.totalMs = profile.decodeMs + profile.importMs + profile.prepareMs + profile.targetMs + profile.drawMs + profile.gpuMs + profile.encodeMs + profile.yieldMs;
|
|
376
|
+
// Scheduled before the settlement, so it runs first.
|
|
377
|
+
scheduleOnRN(onProfile, {
|
|
378
|
+
...profile
|
|
379
|
+
});
|
|
380
|
+
}
|
|
381
|
+
await finish(null);
|
|
382
|
+
return false;
|
|
383
|
+
}
|
|
384
|
+
return true;
|
|
385
|
+
} catch (error) {
|
|
386
|
+
await finish(error, false, true);
|
|
387
|
+
return false;
|
|
388
|
+
}
|
|
389
|
+
};
|
|
390
|
+
const run = async () => {
|
|
391
|
+
"worklet";
|
|
392
|
+
|
|
393
|
+
// Yield on this runtime between frames: GPU/ML promises still settle,
|
|
394
|
+
// and a busy RN thread no longer paces the export.
|
|
395
|
+
while (await work()) await new Promise(resolve => yieldToRuntime(resolve));
|
|
396
|
+
};
|
|
397
|
+
void run();
|
|
398
|
+
};
|
|
399
|
+
try {
|
|
400
|
+
runOnRuntime(runtime, () => {
|
|
401
|
+
"worklet";
|
|
402
|
+
|
|
403
|
+
const storage = globalThis;
|
|
404
|
+
if (storage.__rnskwgpuExport) {
|
|
405
|
+
scheduleOnRN(settle, new Error("Previous export cleanup failed; resources remain accounted. Restart the native runtime before exporting again."), false);
|
|
406
|
+
return;
|
|
407
|
+
}
|
|
408
|
+
const state = {
|
|
409
|
+
encoder: null,
|
|
410
|
+
extractor: null,
|
|
411
|
+
surface: null,
|
|
412
|
+
canvas: null,
|
|
413
|
+
readback: null,
|
|
414
|
+
gpu: false,
|
|
415
|
+
target: null,
|
|
416
|
+
imports: null,
|
|
417
|
+
frames: {},
|
|
418
|
+
processor: null,
|
|
419
|
+
pendingAfterDraw: null,
|
|
420
|
+
reservations: [],
|
|
421
|
+
index: 0
|
|
422
|
+
};
|
|
423
|
+
storage.__rnskwgpuExport = state;
|
|
424
|
+
const setup = async () => {
|
|
425
|
+
"worklet";
|
|
426
|
+
|
|
427
|
+
try {
|
|
428
|
+
if (cancelled.getBlocking()) {
|
|
429
|
+
scheduleOnRN(step);
|
|
430
|
+
return;
|
|
431
|
+
}
|
|
432
|
+
runWithVideoAutoreleasePool(() => {
|
|
433
|
+
assertExportRecorderCacheSupport();
|
|
434
|
+
const allocateReadback = () => {
|
|
435
|
+
// Render target + transient full-frame CPU readback. Native decoder
|
|
436
|
+
// and encoder reservations are additional entries in the same budget.
|
|
437
|
+
state.reservations.push(reserveVideoMemory(bytes, "export render target"));
|
|
438
|
+
state.reservations.push(reserveVideoMemory(bytes * 2, "export reusable readback and transient raster"));
|
|
439
|
+
state.readback = new Uint8Array(bytes);
|
|
440
|
+
state.hasRecorder = true;
|
|
441
|
+
state.surface = Skia.Surface.MakeOffscreen(options.width, options.height);
|
|
442
|
+
if (!state.surface) throw new Error("Cannot allocate export surface");
|
|
443
|
+
state.canvas = getVideoCanvas(state.surface);
|
|
444
|
+
};
|
|
445
|
+
if (!gpuExport) allocateReadback();
|
|
446
|
+
state.encoder = RNSkiaVideoModule.createVideoEncoder({
|
|
447
|
+
...options,
|
|
448
|
+
audioBitRate: options.audioBitRate ?? 128000,
|
|
449
|
+
audioSampleRate: options.audioSampleRate ?? 44100,
|
|
450
|
+
audioChannelCount: options.audioChannelCount ?? 2
|
|
451
|
+
}, videoComposition);
|
|
452
|
+
state.encoder.prepare();
|
|
453
|
+
if (gpuExport) {
|
|
454
|
+
// Skia draws straight into the encoder's buffers; the probe
|
|
455
|
+
// keeps devices without IOSurface interop on the readback path.
|
|
456
|
+
state.hasRecorder = true;
|
|
457
|
+
const failure = supportsEncoderTargets(state.encoder) ? probeEncoderTarget(state.encoder, options.width, options.height) : new Error("Encoder cannot lend frame buffers");
|
|
458
|
+
state.gpu = failure === null;
|
|
459
|
+
// Decoded frames are sampled in place too: on iOS through the
|
|
460
|
+
// same IOSurface import, on Android once converted from YUV.
|
|
461
|
+
if (state.gpu) state.imports = createExportFrameImports();
|
|
462
|
+
if (!state.gpu) {
|
|
463
|
+
console.warn("[react-native-skia-webgpu-video] GPU export unavailable, using CPU readback:", String(failure));
|
|
464
|
+
allocateReadback();
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
state.extractor = RNSkiaVideoModule.createVideoCompositionFramesExtractorSync(videoComposition);
|
|
468
|
+
state.extractor.start();
|
|
469
|
+
});
|
|
470
|
+
state.processor = (await createFrameProcessor?.({
|
|
471
|
+
width: options.width,
|
|
472
|
+
height: options.height,
|
|
473
|
+
videoComposition,
|
|
474
|
+
isCancelled: () => {
|
|
475
|
+
"worklet";
|
|
476
|
+
|
|
477
|
+
return cancelled.getBlocking();
|
|
478
|
+
}
|
|
479
|
+
})) ?? null;
|
|
480
|
+
} catch (error) {
|
|
481
|
+
// Reuse the ordinary cleanup step, retaining the original error.
|
|
482
|
+
state.setupError = error;
|
|
483
|
+
}
|
|
484
|
+
scheduleOnRN(step);
|
|
485
|
+
};
|
|
486
|
+
void setup();
|
|
487
|
+
})();
|
|
488
|
+
} catch (error) {
|
|
489
|
+
settle(error, cancelled.getBlocking(), true);
|
|
490
|
+
}
|
|
491
|
+
});
|
|
492
|
+
//# sourceMappingURL=exportVideoComposition.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["assertExportRecorderCacheSupport","trimExportRecorderCache","getVideoCanvas","createWorkletRuntime","createSynchronizable","runOnRuntime","scheduleOnRN","AlphaType","BlendMode","ColorType","Skia","Platform","RNSkiaVideoModule","clearVideoFrameImages","ownVideoFrames","releaseVideoFrameImage","frameByteSize","releaseVideoMemory","reserveVideoMemory","enqueueExport","exportAbortError","acquireEncoderTarget","closeEncoderTarget","probeEncoderTarget","supportsEncoderTargets","yieldToRuntime","createExportFrameImports","ownExportFrames","releaseExportFrames","exportRuntime","getExportRuntime","name","runWithVideoAutoreleasePool","fn","runWithAutoreleasePool","body","exportVideoComposition","args","executeExport","abortSignal","Promise","resolve","reject","videoComposition","drawFrame","beforeDrawFrame","afterDrawFrame","onProgress","createFrameProcessor","onProfile","options","aborted","bytes","nbFrames","width","height","Number","isFinite","frameRate","duration","bitRate","outPath","Error","Math","ceil","isSafeInteger","error","cancelled","onAbort","setBlocking","addEventListener","settle","failed","removeEventListener","runtime","getBlocking","bgra","OS","gpuExport","getBackendInfo","gpuDirectExport","step","frameWorklet","storage","globalThis","state","__rnskwgpuExport","isCancelled","profile","frames","totalMs","decodeMs","importMs","prepareMs","targetMs","drawMs","gpuMs","encodeMs","yieldMs","clock","last","lap","stage","now","performance","finish","cleanup","failure","safeToRelease","clean","e","surface","flush","target","pendingAfterDraw","processor","dispose","extractor","encoder","frame","Object","values","imports","canvas","hasRecorder","i","reservations","length","splice","readback","poisoned","setupError","work","time","index","owned","decoded","decodeCompositionFrames","imported","key","previous","entries","producers","has","producerId","prepareFrame","currentTime","draw","gpu","drawColor","Color","Clear","context","drawn","undefined","drained","encodeFrame","kind","nativeBuffer","pointer","fences","readbackCanvas","pixels","readPixels","colorType","BGRA_8888","RGBA_8888","alphaType","Premul","Uint8Array","byteLength","byteOffset","buffer","slice","data","bytesPerRow","releaseContext","framesCompleted","finishWriting","run","setup","allocateReadback","push","Surface","MakeOffscreen","createVideoEncoder","audioBitRate","audioSampleRate","audioChannelCount","prepare","console","warn","String","createVideoCompositionFramesExtractorSync","start"],"sourceRoot":"../../src","sources":["exportVideoComposition.ts"],"mappings":"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","ignoreList":[]}
|