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.
Files changed (236) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +303 -2
  3. package/android/BUILD_VALIDATION.md +62 -0
  4. package/android/CMakeLists.txt +99 -0
  5. package/android/build-validation.json +262 -0
  6. package/android/build.gradle +185 -0
  7. package/android/cpp/EncoderTargets.cpp +226 -0
  8. package/android/cpp/EncoderTargets.h +70 -0
  9. package/android/cpp/JNIHelpers.cpp +15 -0
  10. package/android/cpp/JNIHelpers.h +20 -0
  11. package/android/cpp/NativeEventDispatcher.cpp +59 -0
  12. package/android/cpp/NativeEventDispatcher.h +31 -0
  13. package/android/cpp/NativeHardwareBuffer.cpp +397 -0
  14. package/android/cpp/NativeHardwareBuffer.h +34 -0
  15. package/android/cpp/NativeRgbaBuffer.cpp +45 -0
  16. package/android/cpp/NativeRgbaBuffer.h +9 -0
  17. package/android/cpp/ReturnedVideoFrames.h +37 -0
  18. package/android/cpp/RgbaFrameLease.h +53 -0
  19. package/android/cpp/VideoCapabilities.cpp +87 -0
  20. package/android/cpp/VideoCapabilities.h +44 -0
  21. package/android/cpp/VideoComposition.cpp +170 -0
  22. package/android/cpp/VideoComposition.h +36 -0
  23. package/android/cpp/VideoCompositionFramesExtractor.cpp +82 -0
  24. package/android/cpp/VideoCompositionFramesExtractor.h +48 -0
  25. package/android/cpp/VideoCompositionFramesExtractorHostObject.cpp +230 -0
  26. package/android/cpp/VideoCompositionFramesExtractorHostObject.h +42 -0
  27. package/android/cpp/VideoCompositionFramesExtractorSyncHostObject.cpp +133 -0
  28. package/android/cpp/VideoCompositionFramesExtractorSyncHostObject.h +46 -0
  29. package/android/cpp/VideoEncoderHostObject.cpp +318 -0
  30. package/android/cpp/VideoEncoderHostObject.h +76 -0
  31. package/android/cpp/VideoFrame.cpp +293 -0
  32. package/android/cpp/VideoFrame.h +27 -0
  33. package/android/cpp/VideoPlayer.cpp +96 -0
  34. package/android/cpp/VideoPlayer.h +52 -0
  35. package/android/cpp/VideoPlayerHostObject.cpp +225 -0
  36. package/android/cpp/VideoPlayerHostObject.h +43 -0
  37. package/android/cpp/cpp-adapter.cpp +316 -0
  38. package/android/gradle.properties +5 -0
  39. package/android/instrumentation-inventory.json +178 -0
  40. package/android/proguard-rules.pro +4 -0
  41. package/android/src/main/AndroidManifest.xml +2 -0
  42. package/android/src/main/java/com/azzapp/rnskv/AudioCompositionExporter.java +537 -0
  43. package/android/src/main/java/com/azzapp/rnskv/AudioCompositionPlayer.java +321 -0
  44. package/android/src/main/java/com/azzapp/rnskv/BufferLifetime.java +55 -0
  45. package/android/src/main/java/com/azzapp/rnskv/DecodeRequests.java +100 -0
  46. package/android/src/main/java/com/azzapp/rnskv/DecoderWindow.java +55 -0
  47. package/android/src/main/java/com/azzapp/rnskv/EGLResourcesHolder.java +132 -0
  48. package/android/src/main/java/com/azzapp/rnskv/EGLUtils.java +225 -0
  49. package/android/src/main/java/com/azzapp/rnskv/FrameSize.java +50 -0
  50. package/android/src/main/java/com/azzapp/rnskv/GLFrameExtractor.java +510 -0
  51. package/android/src/main/java/com/azzapp/rnskv/JNIHelpers.java +12 -0
  52. package/android/src/main/java/com/azzapp/rnskv/NativeEventDispatcher.java +25 -0
  53. package/android/src/main/java/com/azzapp/rnskv/NativeHardwareBuffer.java +62 -0
  54. package/android/src/main/java/com/azzapp/rnskv/NativeRgbaBuffer.java +35 -0
  55. package/android/src/main/java/com/azzapp/rnskv/ReactNativeSkiaVideoModule.java +45 -0
  56. package/android/src/main/java/com/azzapp/rnskv/ReactNativeSkiaVideoPackage.java +43 -0
  57. package/android/src/main/java/com/azzapp/rnskv/ReactNativeSkiaVideoSpec.java +9 -0
  58. package/android/src/main/java/com/azzapp/rnskv/RgbaBufferAllocator.java +83 -0
  59. package/android/src/main/java/com/azzapp/rnskv/RgbaLayout.java +33 -0
  60. package/android/src/main/java/com/azzapp/rnskv/SurfaceOutputPolicy.java +13 -0
  61. package/android/src/main/java/com/azzapp/rnskv/TextureRenderer.java +150 -0
  62. package/android/src/main/java/com/azzapp/rnskv/TimeHelpers.java +11 -0
  63. package/android/src/main/java/com/azzapp/rnskv/VideoCapabilities.java +354 -0
  64. package/android/src/main/java/com/azzapp/rnskv/VideoComposition.java +147 -0
  65. package/android/src/main/java/com/azzapp/rnskv/VideoCompositionDecoder.java +772 -0
  66. package/android/src/main/java/com/azzapp/rnskv/VideoCompositionFramesExtractor.java +354 -0
  67. package/android/src/main/java/com/azzapp/rnskv/VideoCompositionFramesExtractorSync.java +241 -0
  68. package/android/src/main/java/com/azzapp/rnskv/VideoCompositionItemDecoder.java +492 -0
  69. package/android/src/main/java/com/azzapp/rnskv/VideoEncoder.java +639 -0
  70. package/android/src/main/java/com/azzapp/rnskv/VideoFrame.java +74 -0
  71. package/android/src/main/java/com/azzapp/rnskv/VideoPlayer.java +361 -0
  72. package/cpp/RNSVCheckedSizes.h +54 -0
  73. package/cpp/RNSVEventEmitter.cpp +199 -0
  74. package/cpp/RNSVEventEmitter.h +31 -0
  75. package/cpp/RNSVHostObject.cpp +79 -0
  76. package/cpp/RNSVHostObject.h +67 -0
  77. package/cpp/RNSVMemoryBudget.cpp +68 -0
  78. package/cpp/RNSVMemoryBudget.h +100 -0
  79. package/cpp/RNSVRuntimeLifecycleMonitor.cpp +88 -0
  80. package/cpp/RNSVRuntimeLifecycleMonitor.h +33 -0
  81. package/docs/ANDROID_DEVICE_306.md +95 -0
  82. package/docs/ANDROID_EXPORT_CACHE_306.md +48 -0
  83. package/docs/ANDROID_MEMORY_RETENTION_306.md +67 -0
  84. package/docs/BENCHMARKS.md +368 -0
  85. package/docs/IOS_DEVICE_TESTS.md +115 -0
  86. package/docs/IOS_SIMULATOR_TESTS.md +74 -0
  87. package/docs/MIGRATION.md +82 -0
  88. package/docs/NATIVE_MEMORY_INVESTIGATION_306.md +88 -0
  89. package/docs/PERFORMANCE_AB_IPHONE_303.md +196 -0
  90. package/docs/PERFORMANCE_AB_SIMULATOR.md +135 -0
  91. package/docs/PERFORMANCE_AB_SOAK_SIMULATOR.md +84 -0
  92. package/docs/PERFORMANCE_IPHONE_306_OPTIMIZATION.md +76 -0
  93. package/docs/PERFORMANCE_SIMULATOR.md +89 -0
  94. package/docs/PERFORMANCE_SIMULATOR_INITIAL.md +96 -0
  95. package/docs/PERFORMANCE_SOAK_IPHONE_303.md +41 -0
  96. package/docs/UPSTREAM_NOTES.md +188 -0
  97. package/docs/assets/banner.svg +26 -0
  98. package/examples/webgpu-overlay.ts +147 -0
  99. package/ios/AVAssetTrackUtils.h +24 -0
  100. package/ios/AudioCompositionUtils.h +27 -0
  101. package/ios/AudioCompositionUtils.mm +113 -0
  102. package/ios/DecoderWindow.h +52 -0
  103. package/ios/NativeResourceStats.h +32 -0
  104. package/ios/RNSVColorSpace.h +50 -0
  105. package/ios/RNSVJSIUtils.h +46 -0
  106. package/ios/RNSVScopedPixelBuffer.h +17 -0
  107. package/ios/RNSVVideoPlayer.h +46 -0
  108. package/ios/RNSVVideoPlayer.mm +410 -0
  109. package/ios/ReactNativeSkiaVideo.h +8 -0
  110. package/ios/ReactNativeSkiaVideo.mm +310 -0
  111. package/ios/SeekPolicy.h +27 -0
  112. package/ios/VideoComposition.h +148 -0
  113. package/ios/VideoCompositionFramesExtractorHostObject.h +105 -0
  114. package/ios/VideoCompositionFramesExtractorHostObject.mm +686 -0
  115. package/ios/VideoCompositionFramesExtractorSyncHostObject.h +37 -0
  116. package/ios/VideoCompositionFramesExtractorSyncHostObject.mm +168 -0
  117. package/ios/VideoCompositionItemDecoder.h +60 -0
  118. package/ios/VideoCompositionItemDecoder.mm +480 -0
  119. package/ios/VideoEncoderHostObject.h +83 -0
  120. package/ios/VideoEncoderHostObject.mm +706 -0
  121. package/ios/VideoFrame.h +66 -0
  122. package/ios/VideoFrame.mm +108 -0
  123. package/ios/VideoPlayerHostObject.h +52 -0
  124. package/ios/VideoPlayerHostObject.mm +332 -0
  125. package/lib/module/NativeReactNativeSkiaVideo.js +5 -0
  126. package/lib/module/NativeReactNativeSkiaVideo.js.map +1 -0
  127. package/lib/module/RNSkiaVideoModule.js +20 -0
  128. package/lib/module/RNSkiaVideoModule.js.map +1 -0
  129. package/lib/module/canvas.js +18 -0
  130. package/lib/module/canvas.js.map +1 -0
  131. package/lib/module/exportCache.js +22 -0
  132. package/lib/module/exportCache.js.map +1 -0
  133. package/lib/module/exportFrames.js +338 -0
  134. package/lib/module/exportFrames.js.map +1 -0
  135. package/lib/module/exportQueue.js +52 -0
  136. package/lib/module/exportQueue.js.map +1 -0
  137. package/lib/module/exportTarget.js +137 -0
  138. package/lib/module/exportTarget.js.map +1 -0
  139. package/lib/module/exportVideoComposition.js +492 -0
  140. package/lib/module/exportVideoComposition.js.map +1 -0
  141. package/lib/module/frameInterop.js +532 -0
  142. package/lib/module/frameInterop.js.map +1 -0
  143. package/lib/module/gpu.js +222 -0
  144. package/lib/module/gpu.js.map +1 -0
  145. package/lib/module/gpuDevice.js +54 -0
  146. package/lib/module/gpuDevice.js.map +1 -0
  147. package/lib/module/index.js +36 -0
  148. package/lib/module/index.js.map +1 -0
  149. package/lib/module/memory.js +38 -0
  150. package/lib/module/memory.js.map +1 -0
  151. package/lib/module/package.json +1 -0
  152. package/lib/module/previewLifecycle.js +52 -0
  153. package/lib/module/previewLifecycle.js.map +1 -0
  154. package/lib/module/runtimeYield.js +10 -0
  155. package/lib/module/runtimeYield.js.map +1 -0
  156. package/lib/module/types.js +4 -0
  157. package/lib/module/types.js.map +1 -0
  158. package/lib/module/utils/useEventListener.js +18 -0
  159. package/lib/module/utils/useEventListener.js.map +1 -0
  160. package/lib/module/videoCompositionPlayer.js +348 -0
  161. package/lib/module/videoCompositionPlayer.js.map +1 -0
  162. package/lib/module/videoFrameImage.js +185 -0
  163. package/lib/module/videoFrameImage.js.map +1 -0
  164. package/lib/module/videoPlayer.js +172 -0
  165. package/lib/module/videoPlayer.js.map +1 -0
  166. package/lib/module/yuvBlit.js +299 -0
  167. package/lib/module/yuvBlit.js.map +1 -0
  168. package/lib/typescript/package.json +1 -0
  169. package/lib/typescript/src/NativeReactNativeSkiaVideo.d.ts +7 -0
  170. package/lib/typescript/src/NativeReactNativeSkiaVideo.d.ts.map +1 -0
  171. package/lib/typescript/src/RNSkiaVideoModule.d.ts +4 -0
  172. package/lib/typescript/src/RNSkiaVideoModule.d.ts.map +1 -0
  173. package/lib/typescript/src/canvas.d.ts +4 -0
  174. package/lib/typescript/src/canvas.d.ts.map +1 -0
  175. package/lib/typescript/src/exportCache.d.ts +6 -0
  176. package/lib/typescript/src/exportCache.d.ts.map +1 -0
  177. package/lib/typescript/src/exportFrames.d.ts +57 -0
  178. package/lib/typescript/src/exportFrames.d.ts.map +1 -0
  179. package/lib/typescript/src/exportQueue.d.ts +5 -0
  180. package/lib/typescript/src/exportQueue.d.ts.map +1 -0
  181. package/lib/typescript/src/exportTarget.d.ts +28 -0
  182. package/lib/typescript/src/exportTarget.d.ts.map +1 -0
  183. package/lib/typescript/src/exportVideoComposition.d.ts +68 -0
  184. package/lib/typescript/src/exportVideoComposition.d.ts.map +1 -0
  185. package/lib/typescript/src/frameInterop.d.ts +17 -0
  186. package/lib/typescript/src/frameInterop.d.ts.map +1 -0
  187. package/lib/typescript/src/gpu.d.ts +39 -0
  188. package/lib/typescript/src/gpu.d.ts.map +1 -0
  189. package/lib/typescript/src/gpuDevice.d.ts +11 -0
  190. package/lib/typescript/src/gpuDevice.d.ts.map +1 -0
  191. package/lib/typescript/src/index.d.ts +21 -0
  192. package/lib/typescript/src/index.d.ts.map +1 -0
  193. package/lib/typescript/src/memory.d.ts +25 -0
  194. package/lib/typescript/src/memory.d.ts.map +1 -0
  195. package/lib/typescript/src/previewLifecycle.d.ts +22 -0
  196. package/lib/typescript/src/previewLifecycle.d.ts.map +1 -0
  197. package/lib/typescript/src/runtimeYield.d.ts +4 -0
  198. package/lib/typescript/src/runtimeYield.d.ts.map +1 -0
  199. package/lib/typescript/src/types.d.ts +631 -0
  200. package/lib/typescript/src/types.d.ts.map +1 -0
  201. package/lib/typescript/src/utils/useEventListener.d.ts +5 -0
  202. package/lib/typescript/src/utils/useEventListener.d.ts.map +1 -0
  203. package/lib/typescript/src/videoCompositionPlayer.d.ts +85 -0
  204. package/lib/typescript/src/videoCompositionPlayer.d.ts.map +1 -0
  205. package/lib/typescript/src/videoFrameImage.d.ts +60 -0
  206. package/lib/typescript/src/videoFrameImage.d.ts.map +1 -0
  207. package/lib/typescript/src/videoPlayer.d.ts +99 -0
  208. package/lib/typescript/src/videoPlayer.d.ts.map +1 -0
  209. package/lib/typescript/src/yuvBlit.d.ts +50 -0
  210. package/lib/typescript/src/yuvBlit.d.ts.map +1 -0
  211. package/package.json +154 -4
  212. package/patches/react-native-skia+3.7.0.patch +502 -0
  213. package/react-native-skia-webgpu-video.podspec +35 -0
  214. package/scripts/apply-skia-canvas-patch.mjs +48 -0
  215. package/scripts/skia-canvas-patch.json +291 -0
  216. package/src/NativeReactNativeSkiaVideo.ts +8 -0
  217. package/src/RNSkiaVideoModule.ts +27 -0
  218. package/src/canvas.ts +22 -0
  219. package/src/exportCache.ts +27 -0
  220. package/src/exportFrames.ts +421 -0
  221. package/src/exportQueue.ts +65 -0
  222. package/src/exportTarget.ts +179 -0
  223. package/src/exportVideoComposition.ts +718 -0
  224. package/src/frameInterop.ts +684 -0
  225. package/src/gpu.ts +290 -0
  226. package/src/gpuDevice.ts +80 -0
  227. package/src/index.tsx +45 -0
  228. package/src/memory.ts +48 -0
  229. package/src/previewLifecycle.ts +60 -0
  230. package/src/runtimeYield.ts +6 -0
  231. package/src/types.ts +661 -0
  232. package/src/utils/useEventListener.ts +22 -0
  233. package/src/videoCompositionPlayer.ts +520 -0
  234. package/src/videoFrameImage.ts +205 -0
  235. package/src/videoPlayer.ts +318 -0
  236. 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":[]}