@shopify/react-native-skia 1.3.2 → 1.3.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (53) hide show
  1. package/android/cpp/rnskia-android/RNSkAndroidVideo.cpp +59 -1
  2. package/android/cpp/rnskia-android/RNSkAndroidVideo.h +4 -0
  3. package/android/src/main/java/com/shopify/reactnative/skia/RNSkVideo.java +80 -7
  4. package/cpp/api/JsiVideo.h +32 -7
  5. package/cpp/rnskia/RNSkVideo.h +4 -0
  6. package/ios/RNSkia-iOS/RNSkiOSVideo.h +13 -4
  7. package/ios/RNSkia-iOS/RNSkiOSVideo.mm +65 -67
  8. package/lib/commonjs/dom/nodes/datatypes/Fitting.js +42 -30
  9. package/lib/commonjs/dom/nodes/datatypes/Fitting.js.map +1 -1
  10. package/lib/commonjs/external/reanimated/useVideo.d.ts +16 -4
  11. package/lib/commonjs/external/reanimated/useVideo.js +76 -14
  12. package/lib/commonjs/external/reanimated/useVideo.js.map +1 -1
  13. package/lib/commonjs/renderer/components/shapes/FitBox.d.ts +2 -10
  14. package/lib/commonjs/renderer/components/shapes/FitBox.js +32 -3
  15. package/lib/commonjs/renderer/components/shapes/FitBox.js.map +1 -1
  16. package/lib/commonjs/skia/core/Matrix.js +5 -1
  17. package/lib/commonjs/skia/core/Matrix.js.map +1 -1
  18. package/lib/commonjs/skia/types/Matrix.js +2 -0
  19. package/lib/commonjs/skia/types/Matrix.js.map +1 -1
  20. package/lib/commonjs/skia/types/Video/Video.d.ts +9 -1
  21. package/lib/commonjs/skia/types/Video/Video.js.map +1 -1
  22. package/lib/module/dom/nodes/datatypes/Fitting.js +41 -29
  23. package/lib/module/dom/nodes/datatypes/Fitting.js.map +1 -1
  24. package/lib/module/external/reanimated/useVideo.d.ts +16 -4
  25. package/lib/module/external/reanimated/useVideo.js +76 -14
  26. package/lib/module/external/reanimated/useVideo.js.map +1 -1
  27. package/lib/module/renderer/components/shapes/FitBox.d.ts +2 -10
  28. package/lib/module/renderer/components/shapes/FitBox.js +32 -3
  29. package/lib/module/renderer/components/shapes/FitBox.js.map +1 -1
  30. package/lib/module/skia/core/Matrix.js +5 -1
  31. package/lib/module/skia/core/Matrix.js.map +1 -1
  32. package/lib/module/skia/types/Matrix.js +2 -0
  33. package/lib/module/skia/types/Matrix.js.map +1 -1
  34. package/lib/module/skia/types/Video/Video.d.ts +9 -1
  35. package/lib/module/skia/types/Video/Video.js.map +1 -1
  36. package/lib/typescript/src/external/reanimated/useVideo.d.ts +16 -4
  37. package/lib/typescript/src/renderer/components/shapes/FitBox.d.ts +2 -10
  38. package/lib/typescript/src/skia/types/Video/Video.d.ts +9 -1
  39. package/package.json +1 -1
  40. package/src/dom/nodes/datatypes/Fitting.ts +28 -21
  41. package/src/external/reanimated/useVideo.ts +90 -29
  42. package/src/renderer/components/shapes/FitBox.tsx +38 -4
  43. package/src/skia/core/Matrix.ts +4 -2
  44. package/src/skia/types/Matrix.ts +1 -0
  45. package/src/skia/types/Video/Video.ts +7 -1
  46. package/lib/commonjs/external/reanimated/video.d.ts +0 -16
  47. package/lib/commonjs/external/reanimated/video.js +0 -54
  48. package/lib/commonjs/external/reanimated/video.js.map +0 -1
  49. package/lib/module/external/reanimated/video.d.ts +0 -16
  50. package/lib/module/external/reanimated/video.js +0 -46
  51. package/lib/module/external/reanimated/video.js.map +0 -1
  52. package/lib/typescript/src/external/reanimated/video.d.ts +0 -16
  53. package/src/external/reanimated/video.ts +0 -82
@@ -3,7 +3,7 @@ import React, { useMemo } from "react";
3
3
 
4
4
  import type { Fit } from "../../../dom/nodes";
5
5
  import { fitRects, rect2rect } from "../../../dom/nodes";
6
- import type { SkRect } from "../../../skia/types";
6
+ import type { SkRect, Transforms3d } from "../../../skia/types";
7
7
  import { Group } from "../Group";
8
8
 
9
9
  interface FitProps {
@@ -13,9 +13,43 @@ interface FitProps {
13
13
  children: ReactNode | ReactNode[];
14
14
  }
15
15
 
16
- export const fitbox = (fit: Fit, src: SkRect, dst: SkRect) => {
17
- const rects = fitRects(fit, src, dst);
18
- return rect2rect(rects.src, rects.dst);
16
+ export const fitbox = (
17
+ fit: Fit,
18
+ src: SkRect,
19
+ dst: SkRect,
20
+ rotation: 0 | 90 | 180 | 270 = 0
21
+ ) => {
22
+ "worklet";
23
+ const rects = fitRects(
24
+ fit,
25
+ rotation === 90 || rotation === 270
26
+ ? { x: 0, y: 0, width: src.height, height: src.width }
27
+ : src,
28
+ dst
29
+ );
30
+ const result = rect2rect(rects.src, rects.dst);
31
+ if (rotation === 90) {
32
+ return [
33
+ ...result,
34
+ { translate: [src.height, 0] },
35
+ { rotate: Math.PI / 2 },
36
+ ] as Transforms3d;
37
+ }
38
+ if (rotation === 180) {
39
+ return [
40
+ ...result,
41
+ { translate: [src.width, src.height] },
42
+ { rotate: Math.PI },
43
+ ] as Transforms3d;
44
+ }
45
+ if (rotation === 270) {
46
+ return [
47
+ ...result,
48
+ { translate: [0, src.width] },
49
+ { rotate: -Math.PI / 2 },
50
+ ] as Transforms3d;
51
+ }
52
+ return result;
19
53
  };
20
54
 
21
55
  export const FitBox = ({ fit = "contain", src, dst, children }: FitProps) => {
@@ -2,5 +2,7 @@ import { Skia } from "../Skia";
2
2
  import type { Transforms3d } from "../types";
3
3
  import { processTransform } from "../types";
4
4
 
5
- export const processTransform2d = (transforms: Transforms3d) =>
6
- processTransform(Skia.Matrix(), transforms);
5
+ export const processTransform2d = (transforms: Transforms3d) => {
6
+ "worklet";
7
+ return processTransform(Skia.Matrix(), transforms);
8
+ };
@@ -30,6 +30,7 @@ export const processTransform = <T extends SkMatrix | SkCanvas>(
30
30
  m: T,
31
31
  transforms: Transforms3d
32
32
  ) => {
33
+ "worklet";
33
34
  const m3 = processTransform3d(transforms);
34
35
  m.concat(m3);
35
36
  return m;
@@ -1,10 +1,16 @@
1
1
  import type { SkImage } from "../Image";
2
2
  import type { SkJSIInstance } from "../JsiInstance";
3
3
 
4
+ export type VideoRotation = 0 | 90 | 180 | 270;
5
+
4
6
  export interface Video extends SkJSIInstance<"Video"> {
5
7
  duration(): number;
6
8
  framerate(): number;
7
9
  nextImage(): SkImage | null;
8
10
  seek(time: number): void;
9
- getRotationInDegrees(): number;
11
+ rotation(): VideoRotation;
12
+ size(): { width: number; height: number };
13
+ pause(): void;
14
+ play(): void;
15
+ setVolume(volume: number): void;
10
16
  }
@@ -1,16 +0,0 @@
1
- import type { SharedValue } from "react-native-reanimated";
2
- import type { SkImage, Video } from "../../skia/types";
3
- export type Animated<T> = SharedValue<T> | T;
4
- export interface PlaybackOptions {
5
- playbackSpeed: Animated<number>;
6
- looping: Animated<boolean>;
7
- paused: Animated<boolean>;
8
- seek: Animated<number | null>;
9
- }
10
- type Materialized<T> = {
11
- [K in keyof T]: T[K] extends Animated<infer U> ? U : T[K];
12
- };
13
- export type MaterializedPlaybackOptions = Materialized<Omit<PlaybackOptions, "seek">>;
14
- export declare const setFrame: (video: Video, currentFrame: SharedValue<SkImage | null>) => void;
15
- export declare const processVideoState: (video: Video | null, duration: number, framerate: number, currentTimestamp: number, options: Materialized<Omit<PlaybackOptions, "seek">>, currentTime: SharedValue<number>, currentFrame: SharedValue<SkImage | null>, lastTimestamp: SharedValue<number>, seek: SharedValue<number | null>) => void;
16
- export {};
@@ -1,54 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.setFrame = exports.processVideoState = void 0;
7
- var _Platform = require("../../Platform");
8
- const setFrame = (video, currentFrame) => {
9
- "worklet";
10
-
11
- const img = video.nextImage();
12
- if (img) {
13
- if (currentFrame.value) {
14
- currentFrame.value.dispose();
15
- }
16
- if (_Platform.Platform.OS === "android") {
17
- currentFrame.value = img.makeNonTextureImage();
18
- } else {
19
- currentFrame.value = img;
20
- }
21
- }
22
- };
23
- exports.setFrame = setFrame;
24
- const processVideoState = (video, duration, framerate, currentTimestamp, options, currentTime, currentFrame, lastTimestamp, seek) => {
25
- "worklet";
26
-
27
- if (!video) {
28
- return;
29
- }
30
- if (options.paused) {
31
- return;
32
- }
33
- const delta = currentTimestamp - lastTimestamp.value;
34
- const frameDuration = 1000 / framerate;
35
- const currentFrameDuration = Math.floor(frameDuration / options.playbackSpeed);
36
- if (currentTime.value + delta >= duration && options.looping) {
37
- seek.value = 0;
38
- }
39
- if (seek.value !== null) {
40
- video.seek(seek.value);
41
- currentTime.value = seek.value;
42
- setFrame(video, currentFrame);
43
- lastTimestamp.value = currentTimestamp;
44
- seek.value = null;
45
- return;
46
- }
47
- if (delta >= currentFrameDuration) {
48
- setFrame(video, currentFrame);
49
- currentTime.value += delta;
50
- lastTimestamp.value = currentTimestamp;
51
- }
52
- };
53
- exports.processVideoState = processVideoState;
54
- //# sourceMappingURL=video.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["_Platform","require","setFrame","video","currentFrame","img","nextImage","value","dispose","Platform","OS","makeNonTextureImage","exports","processVideoState","duration","framerate","currentTimestamp","options","currentTime","lastTimestamp","seek","paused","delta","frameDuration","currentFrameDuration","Math","floor","playbackSpeed","looping"],"sources":["video.ts"],"sourcesContent":["import type { SharedValue } from \"react-native-reanimated\";\n\nimport type { SkImage, Video } from \"../../skia/types\";\nimport { Platform } from \"../../Platform\";\n\nexport type Animated<T> = SharedValue<T> | T;\n\nexport interface PlaybackOptions {\n playbackSpeed: Animated<number>;\n looping: Animated<boolean>;\n paused: Animated<boolean>;\n seek: Animated<number | null>;\n}\n\ntype Materialized<T> = {\n [K in keyof T]: T[K] extends Animated<infer U> ? U : T[K];\n};\n\nexport type MaterializedPlaybackOptions = Materialized<\n Omit<PlaybackOptions, \"seek\">\n>;\n\nexport const setFrame = (\n video: Video,\n currentFrame: SharedValue<SkImage | null>\n) => {\n \"worklet\";\n const img = video.nextImage();\n if (img) {\n if (currentFrame.value) {\n currentFrame.value.dispose();\n }\n if (Platform.OS === \"android\") {\n currentFrame.value = img.makeNonTextureImage();\n } else {\n currentFrame.value = img;\n }\n }\n};\n\nexport const processVideoState = (\n video: Video | null,\n duration: number,\n framerate: number,\n currentTimestamp: number,\n options: Materialized<Omit<PlaybackOptions, \"seek\">>,\n currentTime: SharedValue<number>,\n currentFrame: SharedValue<SkImage | null>,\n lastTimestamp: SharedValue<number>,\n seek: SharedValue<number | null>\n) => {\n \"worklet\";\n if (!video) {\n return;\n }\n if (options.paused) {\n return;\n }\n const delta = currentTimestamp - lastTimestamp.value;\n\n const frameDuration = 1000 / framerate;\n const currentFrameDuration = Math.floor(\n frameDuration / options.playbackSpeed\n );\n if (currentTime.value + delta >= duration && options.looping) {\n seek.value = 0;\n }\n if (seek.value !== null) {\n video.seek(seek.value);\n currentTime.value = seek.value;\n setFrame(video, currentFrame);\n lastTimestamp.value = currentTimestamp;\n seek.value = null;\n return;\n }\n\n if (delta >= currentFrameDuration) {\n setFrame(video, currentFrame);\n currentTime.value += delta;\n lastTimestamp.value = currentTimestamp;\n }\n};\n"],"mappings":";;;;;;AAGA,IAAAA,SAAA,GAAAC,OAAA;AAmBO,MAAMC,QAAQ,GAAGA,CACtBC,KAAY,EACZC,YAAyC,KACtC;EACH,SAAS;;EACT,MAAMC,GAAG,GAAGF,KAAK,CAACG,SAAS,CAAC,CAAC;EAC7B,IAAID,GAAG,EAAE;IACP,IAAID,YAAY,CAACG,KAAK,EAAE;MACtBH,YAAY,CAACG,KAAK,CAACC,OAAO,CAAC,CAAC;IAC9B;IACA,IAAIC,kBAAQ,CAACC,EAAE,KAAK,SAAS,EAAE;MAC7BN,YAAY,CAACG,KAAK,GAAGF,GAAG,CAACM,mBAAmB,CAAC,CAAC;IAChD,CAAC,MAAM;MACLP,YAAY,CAACG,KAAK,GAAGF,GAAG;IAC1B;EACF;AACF,CAAC;AAACO,OAAA,CAAAV,QAAA,GAAAA,QAAA;AAEK,MAAMW,iBAAiB,GAAGA,CAC/BV,KAAmB,EACnBW,QAAgB,EAChBC,SAAiB,EACjBC,gBAAwB,EACxBC,OAAoD,EACpDC,WAAgC,EAChCd,YAAyC,EACzCe,aAAkC,EAClCC,IAAgC,KAC7B;EACH,SAAS;;EACT,IAAI,CAACjB,KAAK,EAAE;IACV;EACF;EACA,IAAIc,OAAO,CAACI,MAAM,EAAE;IAClB;EACF;EACA,MAAMC,KAAK,GAAGN,gBAAgB,GAAGG,aAAa,CAACZ,KAAK;EAEpD,MAAMgB,aAAa,GAAG,IAAI,GAAGR,SAAS;EACtC,MAAMS,oBAAoB,GAAGC,IAAI,CAACC,KAAK,CACrCH,aAAa,GAAGN,OAAO,CAACU,aAC1B,CAAC;EACD,IAAIT,WAAW,CAACX,KAAK,GAAGe,KAAK,IAAIR,QAAQ,IAAIG,OAAO,CAACW,OAAO,EAAE;IAC5DR,IAAI,CAACb,KAAK,GAAG,CAAC;EAChB;EACA,IAAIa,IAAI,CAACb,KAAK,KAAK,IAAI,EAAE;IACvBJ,KAAK,CAACiB,IAAI,CAACA,IAAI,CAACb,KAAK,CAAC;IACtBW,WAAW,CAACX,KAAK,GAAGa,IAAI,CAACb,KAAK;IAC9BL,QAAQ,CAACC,KAAK,EAAEC,YAAY,CAAC;IAC7Be,aAAa,CAACZ,KAAK,GAAGS,gBAAgB;IACtCI,IAAI,CAACb,KAAK,GAAG,IAAI;IACjB;EACF;EAEA,IAAIe,KAAK,IAAIE,oBAAoB,EAAE;IACjCtB,QAAQ,CAACC,KAAK,EAAEC,YAAY,CAAC;IAC7Bc,WAAW,CAACX,KAAK,IAAIe,KAAK;IAC1BH,aAAa,CAACZ,KAAK,GAAGS,gBAAgB;EACxC;AACF,CAAC;AAACJ,OAAA,CAAAC,iBAAA,GAAAA,iBAAA"}
@@ -1,16 +0,0 @@
1
- import type { SharedValue } from "react-native-reanimated";
2
- import type { SkImage, Video } from "../../skia/types";
3
- export type Animated<T> = SharedValue<T> | T;
4
- export interface PlaybackOptions {
5
- playbackSpeed: Animated<number>;
6
- looping: Animated<boolean>;
7
- paused: Animated<boolean>;
8
- seek: Animated<number | null>;
9
- }
10
- type Materialized<T> = {
11
- [K in keyof T]: T[K] extends Animated<infer U> ? U : T[K];
12
- };
13
- export type MaterializedPlaybackOptions = Materialized<Omit<PlaybackOptions, "seek">>;
14
- export declare const setFrame: (video: Video, currentFrame: SharedValue<SkImage | null>) => void;
15
- export declare const processVideoState: (video: Video | null, duration: number, framerate: number, currentTimestamp: number, options: Materialized<Omit<PlaybackOptions, "seek">>, currentTime: SharedValue<number>, currentFrame: SharedValue<SkImage | null>, lastTimestamp: SharedValue<number>, seek: SharedValue<number | null>) => void;
16
- export {};
@@ -1,46 +0,0 @@
1
- import { Platform } from "../../Platform";
2
- export const setFrame = (video, currentFrame) => {
3
- "worklet";
4
-
5
- const img = video.nextImage();
6
- if (img) {
7
- if (currentFrame.value) {
8
- currentFrame.value.dispose();
9
- }
10
- if (Platform.OS === "android") {
11
- currentFrame.value = img.makeNonTextureImage();
12
- } else {
13
- currentFrame.value = img;
14
- }
15
- }
16
- };
17
- export const processVideoState = (video, duration, framerate, currentTimestamp, options, currentTime, currentFrame, lastTimestamp, seek) => {
18
- "worklet";
19
-
20
- if (!video) {
21
- return;
22
- }
23
- if (options.paused) {
24
- return;
25
- }
26
- const delta = currentTimestamp - lastTimestamp.value;
27
- const frameDuration = 1000 / framerate;
28
- const currentFrameDuration = Math.floor(frameDuration / options.playbackSpeed);
29
- if (currentTime.value + delta >= duration && options.looping) {
30
- seek.value = 0;
31
- }
32
- if (seek.value !== null) {
33
- video.seek(seek.value);
34
- currentTime.value = seek.value;
35
- setFrame(video, currentFrame);
36
- lastTimestamp.value = currentTimestamp;
37
- seek.value = null;
38
- return;
39
- }
40
- if (delta >= currentFrameDuration) {
41
- setFrame(video, currentFrame);
42
- currentTime.value += delta;
43
- lastTimestamp.value = currentTimestamp;
44
- }
45
- };
46
- //# sourceMappingURL=video.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["Platform","setFrame","video","currentFrame","img","nextImage","value","dispose","OS","makeNonTextureImage","processVideoState","duration","framerate","currentTimestamp","options","currentTime","lastTimestamp","seek","paused","delta","frameDuration","currentFrameDuration","Math","floor","playbackSpeed","looping"],"sources":["video.ts"],"sourcesContent":["import type { SharedValue } from \"react-native-reanimated\";\n\nimport type { SkImage, Video } from \"../../skia/types\";\nimport { Platform } from \"../../Platform\";\n\nexport type Animated<T> = SharedValue<T> | T;\n\nexport interface PlaybackOptions {\n playbackSpeed: Animated<number>;\n looping: Animated<boolean>;\n paused: Animated<boolean>;\n seek: Animated<number | null>;\n}\n\ntype Materialized<T> = {\n [K in keyof T]: T[K] extends Animated<infer U> ? U : T[K];\n};\n\nexport type MaterializedPlaybackOptions = Materialized<\n Omit<PlaybackOptions, \"seek\">\n>;\n\nexport const setFrame = (\n video: Video,\n currentFrame: SharedValue<SkImage | null>\n) => {\n \"worklet\";\n const img = video.nextImage();\n if (img) {\n if (currentFrame.value) {\n currentFrame.value.dispose();\n }\n if (Platform.OS === \"android\") {\n currentFrame.value = img.makeNonTextureImage();\n } else {\n currentFrame.value = img;\n }\n }\n};\n\nexport const processVideoState = (\n video: Video | null,\n duration: number,\n framerate: number,\n currentTimestamp: number,\n options: Materialized<Omit<PlaybackOptions, \"seek\">>,\n currentTime: SharedValue<number>,\n currentFrame: SharedValue<SkImage | null>,\n lastTimestamp: SharedValue<number>,\n seek: SharedValue<number | null>\n) => {\n \"worklet\";\n if (!video) {\n return;\n }\n if (options.paused) {\n return;\n }\n const delta = currentTimestamp - lastTimestamp.value;\n\n const frameDuration = 1000 / framerate;\n const currentFrameDuration = Math.floor(\n frameDuration / options.playbackSpeed\n );\n if (currentTime.value + delta >= duration && options.looping) {\n seek.value = 0;\n }\n if (seek.value !== null) {\n video.seek(seek.value);\n currentTime.value = seek.value;\n setFrame(video, currentFrame);\n lastTimestamp.value = currentTimestamp;\n seek.value = null;\n return;\n }\n\n if (delta >= currentFrameDuration) {\n setFrame(video, currentFrame);\n currentTime.value += delta;\n lastTimestamp.value = currentTimestamp;\n }\n};\n"],"mappings":"AAGA,SAASA,QAAQ,QAAQ,gBAAgB;AAmBzC,OAAO,MAAMC,QAAQ,GAAGA,CACtBC,KAAY,EACZC,YAAyC,KACtC;EACH,SAAS;;EACT,MAAMC,GAAG,GAAGF,KAAK,CAACG,SAAS,CAAC,CAAC;EAC7B,IAAID,GAAG,EAAE;IACP,IAAID,YAAY,CAACG,KAAK,EAAE;MACtBH,YAAY,CAACG,KAAK,CAACC,OAAO,CAAC,CAAC;IAC9B;IACA,IAAIP,QAAQ,CAACQ,EAAE,KAAK,SAAS,EAAE;MAC7BL,YAAY,CAACG,KAAK,GAAGF,GAAG,CAACK,mBAAmB,CAAC,CAAC;IAChD,CAAC,MAAM;MACLN,YAAY,CAACG,KAAK,GAAGF,GAAG;IAC1B;EACF;AACF,CAAC;AAED,OAAO,MAAMM,iBAAiB,GAAGA,CAC/BR,KAAmB,EACnBS,QAAgB,EAChBC,SAAiB,EACjBC,gBAAwB,EACxBC,OAAoD,EACpDC,WAAgC,EAChCZ,YAAyC,EACzCa,aAAkC,EAClCC,IAAgC,KAC7B;EACH,SAAS;;EACT,IAAI,CAACf,KAAK,EAAE;IACV;EACF;EACA,IAAIY,OAAO,CAACI,MAAM,EAAE;IAClB;EACF;EACA,MAAMC,KAAK,GAAGN,gBAAgB,GAAGG,aAAa,CAACV,KAAK;EAEpD,MAAMc,aAAa,GAAG,IAAI,GAAGR,SAAS;EACtC,MAAMS,oBAAoB,GAAGC,IAAI,CAACC,KAAK,CACrCH,aAAa,GAAGN,OAAO,CAACU,aAC1B,CAAC;EACD,IAAIT,WAAW,CAACT,KAAK,GAAGa,KAAK,IAAIR,QAAQ,IAAIG,OAAO,CAACW,OAAO,EAAE;IAC5DR,IAAI,CAACX,KAAK,GAAG,CAAC;EAChB;EACA,IAAIW,IAAI,CAACX,KAAK,KAAK,IAAI,EAAE;IACvBJ,KAAK,CAACe,IAAI,CAACA,IAAI,CAACX,KAAK,CAAC;IACtBS,WAAW,CAACT,KAAK,GAAGW,IAAI,CAACX,KAAK;IAC9BL,QAAQ,CAACC,KAAK,EAAEC,YAAY,CAAC;IAC7Ba,aAAa,CAACV,KAAK,GAAGO,gBAAgB;IACtCI,IAAI,CAACX,KAAK,GAAG,IAAI;IACjB;EACF;EAEA,IAAIa,KAAK,IAAIE,oBAAoB,EAAE;IACjCpB,QAAQ,CAACC,KAAK,EAAEC,YAAY,CAAC;IAC7BY,WAAW,CAACT,KAAK,IAAIa,KAAK;IAC1BH,aAAa,CAACV,KAAK,GAAGO,gBAAgB;EACxC;AACF,CAAC"}
@@ -1,16 +0,0 @@
1
- import type { SharedValue } from "react-native-reanimated";
2
- import type { SkImage, Video } from "../../skia/types";
3
- export type Animated<T> = SharedValue<T> | T;
4
- export interface PlaybackOptions {
5
- playbackSpeed: Animated<number>;
6
- looping: Animated<boolean>;
7
- paused: Animated<boolean>;
8
- seek: Animated<number | null>;
9
- }
10
- type Materialized<T> = {
11
- [K in keyof T]: T[K] extends Animated<infer U> ? U : T[K];
12
- };
13
- export type MaterializedPlaybackOptions = Materialized<Omit<PlaybackOptions, "seek">>;
14
- export declare const setFrame: (video: Video, currentFrame: SharedValue<SkImage | null>) => void;
15
- export declare const processVideoState: (video: Video | null, duration: number, framerate: number, currentTimestamp: number, options: Materialized<Omit<PlaybackOptions, "seek">>, currentTime: SharedValue<number>, currentFrame: SharedValue<SkImage | null>, lastTimestamp: SharedValue<number>, seek: SharedValue<number | null>) => void;
16
- export {};
@@ -1,82 +0,0 @@
1
- import type { SharedValue } from "react-native-reanimated";
2
-
3
- import type { SkImage, Video } from "../../skia/types";
4
- import { Platform } from "../../Platform";
5
-
6
- export type Animated<T> = SharedValue<T> | T;
7
-
8
- export interface PlaybackOptions {
9
- playbackSpeed: Animated<number>;
10
- looping: Animated<boolean>;
11
- paused: Animated<boolean>;
12
- seek: Animated<number | null>;
13
- }
14
-
15
- type Materialized<T> = {
16
- [K in keyof T]: T[K] extends Animated<infer U> ? U : T[K];
17
- };
18
-
19
- export type MaterializedPlaybackOptions = Materialized<
20
- Omit<PlaybackOptions, "seek">
21
- >;
22
-
23
- export const setFrame = (
24
- video: Video,
25
- currentFrame: SharedValue<SkImage | null>
26
- ) => {
27
- "worklet";
28
- const img = video.nextImage();
29
- if (img) {
30
- if (currentFrame.value) {
31
- currentFrame.value.dispose();
32
- }
33
- if (Platform.OS === "android") {
34
- currentFrame.value = img.makeNonTextureImage();
35
- } else {
36
- currentFrame.value = img;
37
- }
38
- }
39
- };
40
-
41
- export const processVideoState = (
42
- video: Video | null,
43
- duration: number,
44
- framerate: number,
45
- currentTimestamp: number,
46
- options: Materialized<Omit<PlaybackOptions, "seek">>,
47
- currentTime: SharedValue<number>,
48
- currentFrame: SharedValue<SkImage | null>,
49
- lastTimestamp: SharedValue<number>,
50
- seek: SharedValue<number | null>
51
- ) => {
52
- "worklet";
53
- if (!video) {
54
- return;
55
- }
56
- if (options.paused) {
57
- return;
58
- }
59
- const delta = currentTimestamp - lastTimestamp.value;
60
-
61
- const frameDuration = 1000 / framerate;
62
- const currentFrameDuration = Math.floor(
63
- frameDuration / options.playbackSpeed
64
- );
65
- if (currentTime.value + delta >= duration && options.looping) {
66
- seek.value = 0;
67
- }
68
- if (seek.value !== null) {
69
- video.seek(seek.value);
70
- currentTime.value = seek.value;
71
- setFrame(video, currentFrame);
72
- lastTimestamp.value = currentTimestamp;
73
- seek.value = null;
74
- return;
75
- }
76
-
77
- if (delta >= currentFrameDuration) {
78
- setFrame(video, currentFrame);
79
- currentTime.value += delta;
80
- lastTimestamp.value = currentTimestamp;
81
- }
82
- };