node-av 0.0.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.
Files changed (175) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/LICENSE.md +22 -0
  3. package/README.md +377 -0
  4. package/binding.gyp +78 -0
  5. package/dist/api/bitstream-filter.d.ts +246 -0
  6. package/dist/api/bitstream-filter.js +369 -0
  7. package/dist/api/bitstream-filter.js.map +1 -0
  8. package/dist/api/decoder.d.ts +257 -0
  9. package/dist/api/decoder.js +424 -0
  10. package/dist/api/decoder.js.map +1 -0
  11. package/dist/api/encoder.d.ts +298 -0
  12. package/dist/api/encoder.js +574 -0
  13. package/dist/api/encoder.js.map +1 -0
  14. package/dist/api/filter.d.ts +457 -0
  15. package/dist/api/filter.js +876 -0
  16. package/dist/api/filter.js.map +1 -0
  17. package/dist/api/hardware.d.ts +318 -0
  18. package/dist/api/hardware.js +558 -0
  19. package/dist/api/hardware.js.map +1 -0
  20. package/dist/api/index.d.ts +12 -0
  21. package/dist/api/index.js +20 -0
  22. package/dist/api/index.js.map +1 -0
  23. package/dist/api/io-stream.d.ts +109 -0
  24. package/dist/api/io-stream.js +124 -0
  25. package/dist/api/io-stream.js.map +1 -0
  26. package/dist/api/media-input.d.ts +295 -0
  27. package/dist/api/media-input.js +456 -0
  28. package/dist/api/media-input.js.map +1 -0
  29. package/dist/api/media-output.d.ts +274 -0
  30. package/dist/api/media-output.js +486 -0
  31. package/dist/api/media-output.js.map +1 -0
  32. package/dist/api/pipeline.d.ts +117 -0
  33. package/dist/api/pipeline.js +836 -0
  34. package/dist/api/pipeline.js.map +1 -0
  35. package/dist/api/types.d.ts +440 -0
  36. package/dist/api/types.js +2 -0
  37. package/dist/api/types.js.map +1 -0
  38. package/dist/api/utilities/audio-sample.d.ts +115 -0
  39. package/dist/api/utilities/audio-sample.js +110 -0
  40. package/dist/api/utilities/audio-sample.js.map +1 -0
  41. package/dist/api/utilities/channel-layout.d.ts +83 -0
  42. package/dist/api/utilities/channel-layout.js +87 -0
  43. package/dist/api/utilities/channel-layout.js.map +1 -0
  44. package/dist/api/utilities/image.d.ts +177 -0
  45. package/dist/api/utilities/image.js +183 -0
  46. package/dist/api/utilities/image.js.map +1 -0
  47. package/dist/api/utilities/index.d.ts +8 -0
  48. package/dist/api/utilities/index.js +17 -0
  49. package/dist/api/utilities/index.js.map +1 -0
  50. package/dist/api/utilities/media-type.d.ts +56 -0
  51. package/dist/api/utilities/media-type.js +60 -0
  52. package/dist/api/utilities/media-type.js.map +1 -0
  53. package/dist/api/utilities/pixel-format.d.ts +94 -0
  54. package/dist/api/utilities/pixel-format.js +102 -0
  55. package/dist/api/utilities/pixel-format.js.map +1 -0
  56. package/dist/api/utilities/sample-format.d.ts +132 -0
  57. package/dist/api/utilities/sample-format.js +144 -0
  58. package/dist/api/utilities/sample-format.js.map +1 -0
  59. package/dist/api/utilities/streaming.d.ts +104 -0
  60. package/dist/api/utilities/streaming.js +137 -0
  61. package/dist/api/utilities/streaming.js.map +1 -0
  62. package/dist/api/utilities/timestamp.d.ts +187 -0
  63. package/dist/api/utilities/timestamp.js +200 -0
  64. package/dist/api/utilities/timestamp.js.map +1 -0
  65. package/dist/api/utils.d.ts +61 -0
  66. package/dist/api/utils.js +330 -0
  67. package/dist/api/utils.js.map +1 -0
  68. package/dist/index.d.ts +2 -0
  69. package/dist/index.js +5 -0
  70. package/dist/index.js.map +1 -0
  71. package/dist/lib/audio-fifo.d.ts +339 -0
  72. package/dist/lib/audio-fifo.js +365 -0
  73. package/dist/lib/audio-fifo.js.map +1 -0
  74. package/dist/lib/binding.d.ts +192 -0
  75. package/dist/lib/binding.js +70 -0
  76. package/dist/lib/binding.js.map +1 -0
  77. package/dist/lib/bitstream-filter-context.d.ts +345 -0
  78. package/dist/lib/bitstream-filter-context.js +407 -0
  79. package/dist/lib/bitstream-filter-context.js.map +1 -0
  80. package/dist/lib/bitstream-filter.d.ts +124 -0
  81. package/dist/lib/bitstream-filter.js +138 -0
  82. package/dist/lib/bitstream-filter.js.map +1 -0
  83. package/dist/lib/channel-layouts.d.ts +51 -0
  84. package/dist/lib/channel-layouts.js +55 -0
  85. package/dist/lib/channel-layouts.js.map +1 -0
  86. package/dist/lib/codec-context.d.ts +763 -0
  87. package/dist/lib/codec-context.js +974 -0
  88. package/dist/lib/codec-context.js.map +1 -0
  89. package/dist/lib/codec-parameters.d.ts +362 -0
  90. package/dist/lib/codec-parameters.js +460 -0
  91. package/dist/lib/codec-parameters.js.map +1 -0
  92. package/dist/lib/codec-parser.d.ts +185 -0
  93. package/dist/lib/codec-parser.js +193 -0
  94. package/dist/lib/codec-parser.js.map +1 -0
  95. package/dist/lib/codec.d.ts +432 -0
  96. package/dist/lib/codec.js +492 -0
  97. package/dist/lib/codec.js.map +1 -0
  98. package/dist/lib/constants.d.ts +2037 -0
  99. package/dist/lib/constants.js +1659 -0
  100. package/dist/lib/constants.js.map +1 -0
  101. package/dist/lib/dictionary.d.ts +371 -0
  102. package/dist/lib/dictionary.js +406 -0
  103. package/dist/lib/dictionary.js.map +1 -0
  104. package/dist/lib/error.d.ts +216 -0
  105. package/dist/lib/error.js +254 -0
  106. package/dist/lib/error.js.map +1 -0
  107. package/dist/lib/filter-context.d.ts +445 -0
  108. package/dist/lib/filter-context.js +505 -0
  109. package/dist/lib/filter-context.js.map +1 -0
  110. package/dist/lib/filter-graph.d.ts +556 -0
  111. package/dist/lib/filter-graph.js +608 -0
  112. package/dist/lib/filter-graph.js.map +1 -0
  113. package/dist/lib/filter-inout.d.ts +205 -0
  114. package/dist/lib/filter-inout.js +264 -0
  115. package/dist/lib/filter-inout.js.map +1 -0
  116. package/dist/lib/filter.d.ts +231 -0
  117. package/dist/lib/filter.js +260 -0
  118. package/dist/lib/filter.js.map +1 -0
  119. package/dist/lib/format-context.d.ts +798 -0
  120. package/dist/lib/format-context.js +845 -0
  121. package/dist/lib/format-context.js.map +1 -0
  122. package/dist/lib/frame.d.ts +784 -0
  123. package/dist/lib/frame.js +933 -0
  124. package/dist/lib/frame.js.map +1 -0
  125. package/dist/lib/hardware-device-context.d.ts +407 -0
  126. package/dist/lib/hardware-device-context.js +429 -0
  127. package/dist/lib/hardware-device-context.js.map +1 -0
  128. package/dist/lib/hardware-frames-context.d.ts +374 -0
  129. package/dist/lib/hardware-frames-context.js +430 -0
  130. package/dist/lib/hardware-frames-context.js.map +1 -0
  131. package/dist/lib/index.d.ts +31 -0
  132. package/dist/lib/index.js +54 -0
  133. package/dist/lib/index.js.map +1 -0
  134. package/dist/lib/input-format.d.ts +216 -0
  135. package/dist/lib/input-format.js +246 -0
  136. package/dist/lib/input-format.js.map +1 -0
  137. package/dist/lib/io-context.d.ts +495 -0
  138. package/dist/lib/io-context.js +550 -0
  139. package/dist/lib/io-context.js.map +1 -0
  140. package/dist/lib/log.d.ts +201 -0
  141. package/dist/lib/log.js +219 -0
  142. package/dist/lib/log.js.map +1 -0
  143. package/dist/lib/native-types.d.ts +719 -0
  144. package/dist/lib/native-types.js +2 -0
  145. package/dist/lib/native-types.js.map +1 -0
  146. package/dist/lib/option.d.ts +589 -0
  147. package/dist/lib/option.js +853 -0
  148. package/dist/lib/option.js.map +1 -0
  149. package/dist/lib/output-format.d.ts +179 -0
  150. package/dist/lib/output-format.js +205 -0
  151. package/dist/lib/output-format.js.map +1 -0
  152. package/dist/lib/packet.d.ts +487 -0
  153. package/dist/lib/packet.js +558 -0
  154. package/dist/lib/packet.js.map +1 -0
  155. package/dist/lib/rational.d.ts +210 -0
  156. package/dist/lib/rational.js +233 -0
  157. package/dist/lib/rational.js.map +1 -0
  158. package/dist/lib/software-resample-context.d.ts +572 -0
  159. package/dist/lib/software-resample-context.js +610 -0
  160. package/dist/lib/software-resample-context.js.map +1 -0
  161. package/dist/lib/software-scale-context.d.ts +290 -0
  162. package/dist/lib/software-scale-context.js +308 -0
  163. package/dist/lib/software-scale-context.js.map +1 -0
  164. package/dist/lib/stream.d.ts +322 -0
  165. package/dist/lib/stream.js +408 -0
  166. package/dist/lib/stream.js.map +1 -0
  167. package/dist/lib/types.d.ts +59 -0
  168. package/dist/lib/types.js +8 -0
  169. package/dist/lib/types.js.map +1 -0
  170. package/dist/lib/utilities.d.ts +346 -0
  171. package/dist/lib/utilities.js +424 -0
  172. package/dist/lib/utilities.js.map +1 -0
  173. package/install/check.js +113 -0
  174. package/install/ffmpeg.js +163 -0
  175. package/package.json +107 -0
@@ -0,0 +1,163 @@
1
+ // https://github.com/lovell/sharp/blob/main/lib/libvips.js
2
+
3
+ import detectLibc from 'detect-libc';
4
+ import { spawnSync } from 'node:child_process';
5
+ import { readFileSync } from 'node:fs';
6
+ import { dirname, join } from 'node:path';
7
+ import { fileURLToPath } from 'node:url';
8
+ import semverCoerce from 'semver/functions/coerce.js';
9
+ import semverGreaterThanOrEqualTo from 'semver/functions/gte.js';
10
+ import semverSatisfies from 'semver/functions/satisfies.js';
11
+
12
+ const __dirname = dirname(fileURLToPath(import.meta.url));
13
+ const packageJson = JSON.parse(readFileSync(join(__dirname, '../package.json'), 'utf8'));
14
+ const { engines } = packageJson;
15
+
16
+ const spawnSyncOptions = {
17
+ encoding: 'utf8',
18
+ shell: true,
19
+ };
20
+
21
+ // Minimum FFmpeg version required
22
+ export const minimumFFmpegVersion = '7.1.0';
23
+
24
+ // Minimum Python version required for node-gyp
25
+ export const minimumPythonVersion = '3.12.0';
26
+
27
+ export const log = (item) => {
28
+ if (item instanceof Error) {
29
+ console.error(`node-av: Installation error: ${item.message}`);
30
+ } else {
31
+ console.log(`node-av: ${item}`);
32
+ }
33
+ };
34
+
35
+ export const runtimeLibc = () => (detectLibc.isNonGlibcLinuxSync() ? detectLibc.familySync() : '');
36
+
37
+ export const runtimePlatformArch = () => `${process.platform}${runtimeLibc()}-${process.arch}`;
38
+
39
+ export const buildPlatformArch = () => {
40
+ const { npm_config_arch, npm_config_platform, npm_config_libc } = process.env;
41
+ const libc = typeof npm_config_libc === 'string' ? npm_config_libc : runtimeLibc();
42
+ return `${npm_config_platform ?? process.platform}${libc}-${npm_config_arch ?? process.arch}`;
43
+ };
44
+
45
+ export const isUnsupportedNodeRuntime = () => {
46
+ if (process.release?.name === 'node' && process.versions) {
47
+ if (!semverSatisfies(process.versions.node, engines.node)) {
48
+ return { found: process.versions.node, expected: engines.node };
49
+ }
50
+ }
51
+ };
52
+
53
+ export const spawnRebuild = () =>
54
+ spawnSync('node-gyp rebuild', {
55
+ ...spawnSyncOptions,
56
+ stdio: 'inherit',
57
+ }).status;
58
+
59
+ export const globalFFmpegVersion = () => {
60
+ if (process.platform !== 'win32') {
61
+ const ffmpegVersion =
62
+ spawnSync('pkg-config --modversion libavcodec', {
63
+ ...spawnSyncOptions,
64
+ env: {
65
+ ...process.env,
66
+ PKG_CONFIG_PATH: pkgConfigPath(),
67
+ },
68
+ }).stdout || '';
69
+ return ffmpegVersion.trim();
70
+ } else {
71
+ return '';
72
+ }
73
+ };
74
+
75
+ export const getFFmpegLibraryVersions = () => {
76
+ if (process.platform === 'win32') {
77
+ return null;
78
+ }
79
+
80
+ const libraries = [
81
+ { name: 'libavcodec', description: 'codec library' },
82
+ { name: 'libavformat', description: 'format library' },
83
+ { name: 'libavutil', description: 'utility library' },
84
+ { name: 'libswscale', description: 'video scaling library' },
85
+ { name: 'libswresample', description: 'audio resampling library' },
86
+ { name: 'libavfilter', description: 'filter library' },
87
+ { name: 'libavdevice', description: 'device library' },
88
+ { name: 'libpostproc', description: 'post-processing library' },
89
+ ];
90
+
91
+ const versions = [];
92
+
93
+ for (const lib of libraries) {
94
+ const version = spawnSync(`pkg-config --modversion ${lib.name}`, {
95
+ ...spawnSyncOptions,
96
+ env: {
97
+ ...process.env,
98
+ PKG_CONFIG_PATH: pkgConfigPath(),
99
+ },
100
+ }).stdout;
101
+
102
+ if (version && version.trim()) {
103
+ versions.push({
104
+ name: lib.name,
105
+ description: lib.description,
106
+ version: version.trim(),
107
+ });
108
+ }
109
+ }
110
+
111
+ return versions.length > 0 ? versions : null;
112
+ };
113
+
114
+ export const pkgConfigPath = () => {
115
+ if (process.platform !== 'win32') {
116
+ const brewPkgConfigPath = spawnSync('which brew >/dev/null 2>&1 && brew environment --plain | grep PKG_CONFIG_LIBDIR | cut -d" " -f2', spawnSyncOptions).stdout || '';
117
+ return [
118
+ brewPkgConfigPath.trim(),
119
+ process.env.PKG_CONFIG_PATH,
120
+ '/usr/local/lib/pkgconfig',
121
+ '/usr/lib/pkgconfig',
122
+ '/usr/local/libdata/pkgconfig',
123
+ '/usr/libdata/pkgconfig',
124
+ ]
125
+ .filter(Boolean)
126
+ .join(':');
127
+ } else {
128
+ return '';
129
+ }
130
+ };
131
+
132
+ export const useGlobalFFmpeg = (logger) => {
133
+ const globalVersion = globalFFmpegVersion();
134
+ if (!globalVersion) {
135
+ return false;
136
+ }
137
+
138
+ // Check if all required libraries are present
139
+ const requiredLibs = ['libavcodec', 'libavformat', 'libavutil', 'libswscale', 'libswresample'];
140
+ for (const lib of requiredLibs) {
141
+ const version =
142
+ spawnSync(`pkg-config --modversion ${lib}`, {
143
+ ...spawnSyncOptions,
144
+ env: {
145
+ ...process.env,
146
+ PKG_CONFIG_PATH: pkgConfigPath(),
147
+ },
148
+ }).stdout || '';
149
+ if (!version?.trim()) {
150
+ if (logger) {
151
+ logger(`Missing required FFmpeg library: ${lib}`);
152
+ }
153
+ return false;
154
+ }
155
+ }
156
+
157
+ const coercedVersion = semverCoerce(globalVersion);
158
+ if (!coercedVersion) {
159
+ return false;
160
+ }
161
+
162
+ return semverGreaterThanOrEqualTo(coercedVersion.version, minimumFFmpegVersion);
163
+ };
package/package.json ADDED
@@ -0,0 +1,107 @@
1
+ {
2
+ "name": "node-av",
3
+ "version": "0.0.1",
4
+ "description": "FFmpeg bindings for Node.js",
5
+ "author": "seydx (https://github.com/seydx/av)",
6
+ "type": "module",
7
+ "exports": {
8
+ ".": {
9
+ "types": "./dist/index.d.ts",
10
+ "require": "./dist/index.js",
11
+ "default": "./dist/index.js"
12
+ },
13
+ "./api": {
14
+ "types": "./dist/api/index.d.ts",
15
+ "require": "./dist/api/index.js",
16
+ "default": "./dist/api/index.js"
17
+ },
18
+ "./lib": {
19
+ "types": "./dist/lib/index.d.ts",
20
+ "require": "./dist/lib/index.js",
21
+ "default": "./dist/lib/index.js"
22
+ },
23
+ "./constants": {
24
+ "types": "./dist/lib/constants.d.ts",
25
+ "require": "./dist/lib/constants.js",
26
+ "default": "./dist/lib/constants.js"
27
+ },
28
+ "./layouts": {
29
+ "types": "./dist/lib/channel-layouts.d.ts",
30
+ "require": "./dist/lib/channel-layouts.js",
31
+ "default": "./dist/lib/channel-layouts.js"
32
+ }
33
+ },
34
+ "scripts": {
35
+ "build": "npm run build:native && npm run build:tsc",
36
+ "build:all": "npm run build:native && npm run build:tests && npm run build:examples && npm run build:tsc",
37
+ "build:examples": "tsc -p tsconfig.examples.json",
38
+ "build:native": "node-gyp rebuild && cpy --flat build/Release/node-av.node binary/",
39
+ "build:tests": "tsc -p tsconfig.tests.json",
40
+ "build:tsc": "rimraf dist && npm run generate:constants && npm run generate:layouts && tsc -p tsconfig.build.json",
41
+ "clean": "node-gyp clean && rimraf dist",
42
+ "clean:tsc": "npm run format && npm run lint:fix && npm run generate:constants && npm run build:tests && npm run build:examples && npm run build:tsc",
43
+ "format": "prettier --write 'src/' --write 'test/' --write 'scripts/' --write 'examples/' --ignore-unknown --no-error-on-unmatched-pattern",
44
+ "generate:constants": "node scripts/generate-constants.js && prettier --write 'src/lib/constants.ts'",
45
+ "generate:layouts": "node scripts/generate-channel-layouts.js && prettier --write 'src/lib/channel-layouts.ts'",
46
+ "install": "node install/check.js",
47
+ "install-updates": "npm i --save",
48
+ "lint": "eslint .",
49
+ "lint:fix": "eslint --fix .",
50
+ "release:patch": "node scripts/prepare-release.js patch",
51
+ "release:minor": "node scripts/prepare-release.js minor",
52
+ "release:major": "node scripts/prepare-release.js major",
53
+ "test:all": "npm run build:tests && npm run build:tsc && tsx --test test/**/*.test.ts",
54
+ "update": "updates --update ./"
55
+ },
56
+ "dependencies": {
57
+ "detect-libc": "^2.0.4",
58
+ "semver": "^7.7.2"
59
+ },
60
+ "optionalDependencies": {
61
+ "@seydx/node-av-darwin-arm64": "^0.0.1",
62
+ "@seydx/node-av-darwin-x64": "^0.0.1",
63
+ "@seydx/node-av-linux-arm64": "^0.0.1",
64
+ "@seydx/node-av-linux-x64": "^0.0.1",
65
+ "@seydx/node-av-win32-arm64": "^0.0.1",
66
+ "@seydx/node-av-win32-x64": "^0.0.1"
67
+ },
68
+ "devDependencies": {
69
+ "@stylistic/eslint-plugin": "^5.2.3",
70
+ "@types/debug": "^4.1.12",
71
+ "@types/node": "^24.3.0",
72
+ "@types/node-abi": "^3.0.3",
73
+ "@types/pngjs": "^6.0.5",
74
+ "@types/semver": "^7.7.0",
75
+ "@types/unzipper": "^0.10.11",
76
+ "@typescript-eslint/parser": "^8.41.0",
77
+ "concurrently": "^9.2.1",
78
+ "cpy-cli": "^6.0.0",
79
+ "eslint": "^9.34.0",
80
+ "globals": "^16.3.0",
81
+ "node-addon-api": "^8.5.0",
82
+ "node-gyp": "^11.4.2",
83
+ "pngjs": "^7.0.0",
84
+ "prettier": "^3.6.2",
85
+ "rimraf": "^6.0.1",
86
+ "tsx": "^4.20.5",
87
+ "typescript": "^5.9.2",
88
+ "typescript-eslint": "^8.41.0",
89
+ "updates": "^16.6.2"
90
+ },
91
+ "bugs": {
92
+ "url": "https://github.com/seydx/av/issues"
93
+ },
94
+ "homepage": "https://github.com/seydx/av#readme",
95
+ "keywords": [
96
+ "node",
97
+ "ffmpeg",
98
+ "av",
99
+ "libav",
100
+ "bindings"
101
+ ],
102
+ "license": "MIT",
103
+ "repository": {
104
+ "type": "git",
105
+ "url": "git+https://github.com/seydx/av.git"
106
+ }
107
+ }