node-av 1.1.0 → 1.3.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 (166) hide show
  1. package/README.md +51 -59
  2. package/dist/api/bitstream-filter.d.ts +183 -123
  3. package/dist/api/bitstream-filter.js +185 -127
  4. package/dist/api/bitstream-filter.js.map +1 -1
  5. package/dist/api/decoder.d.ts +282 -130
  6. package/dist/api/decoder.js +290 -142
  7. package/dist/api/decoder.js.map +1 -1
  8. package/dist/api/encoder.d.ts +249 -160
  9. package/dist/api/encoder.js +276 -207
  10. package/dist/api/encoder.js.map +1 -1
  11. package/dist/api/filter-presets.d.ts +1944 -96
  12. package/dist/api/filter-presets.js +2059 -105
  13. package/dist/api/filter-presets.js.map +1 -1
  14. package/dist/api/filter.d.ts +264 -200
  15. package/dist/api/filter.js +269 -231
  16. package/dist/api/filter.js.map +1 -1
  17. package/dist/api/hardware.d.ts +246 -117
  18. package/dist/api/hardware.js +440 -217
  19. package/dist/api/hardware.js.map +1 -1
  20. package/dist/api/index.d.ts +3 -3
  21. package/dist/api/index.js +1 -1
  22. package/dist/api/index.js.map +1 -1
  23. package/dist/api/io-stream.d.ts +65 -55
  24. package/dist/api/io-stream.js +43 -40
  25. package/dist/api/io-stream.js.map +1 -1
  26. package/dist/api/media-input.d.ts +242 -139
  27. package/dist/api/media-input.js +205 -103
  28. package/dist/api/media-input.js.map +1 -1
  29. package/dist/api/media-output.d.ts +208 -126
  30. package/dist/api/media-output.js +212 -126
  31. package/dist/api/media-output.js.map +1 -1
  32. package/dist/api/pipeline.d.ts +361 -38
  33. package/dist/api/pipeline.js +255 -14
  34. package/dist/api/pipeline.js.map +1 -1
  35. package/dist/api/types.d.ts +26 -187
  36. package/dist/api/utilities/audio-sample.d.ts +0 -8
  37. package/dist/api/utilities/audio-sample.js +0 -8
  38. package/dist/api/utilities/audio-sample.js.map +1 -1
  39. package/dist/api/utilities/channel-layout.d.ts +0 -8
  40. package/dist/api/utilities/channel-layout.js +0 -8
  41. package/dist/api/utilities/channel-layout.js.map +1 -1
  42. package/dist/api/utilities/image.d.ts +0 -8
  43. package/dist/api/utilities/image.js +0 -8
  44. package/dist/api/utilities/image.js.map +1 -1
  45. package/dist/api/utilities/index.d.ts +3 -3
  46. package/dist/api/utilities/index.js +3 -3
  47. package/dist/api/utilities/index.js.map +1 -1
  48. package/dist/api/utilities/media-type.d.ts +1 -9
  49. package/dist/api/utilities/media-type.js +1 -9
  50. package/dist/api/utilities/media-type.js.map +1 -1
  51. package/dist/api/utilities/pixel-format.d.ts +1 -9
  52. package/dist/api/utilities/pixel-format.js +1 -9
  53. package/dist/api/utilities/pixel-format.js.map +1 -1
  54. package/dist/api/utilities/sample-format.d.ts +1 -9
  55. package/dist/api/utilities/sample-format.js +1 -9
  56. package/dist/api/utilities/sample-format.js.map +1 -1
  57. package/dist/api/utilities/streaming.d.ts +0 -8
  58. package/dist/api/utilities/streaming.js +0 -8
  59. package/dist/api/utilities/streaming.js.map +1 -1
  60. package/dist/api/utilities/timestamp.d.ts +0 -8
  61. package/dist/api/utilities/timestamp.js +0 -8
  62. package/dist/api/utilities/timestamp.js.map +1 -1
  63. package/dist/api/utils.d.ts +1 -2
  64. package/dist/api/utils.js +11 -0
  65. package/dist/api/utils.js.map +1 -1
  66. package/dist/constants/constants.d.ts +1 -1
  67. package/dist/constants/constants.js +2 -0
  68. package/dist/constants/constants.js.map +1 -1
  69. package/dist/lib/audio-fifo.d.ts +127 -170
  70. package/dist/lib/audio-fifo.js +130 -173
  71. package/dist/lib/audio-fifo.js.map +1 -1
  72. package/dist/lib/binding.d.ts +1 -0
  73. package/dist/lib/binding.js +7 -0
  74. package/dist/lib/binding.js.map +1 -1
  75. package/dist/lib/bitstream-filter-context.d.ts +139 -184
  76. package/dist/lib/bitstream-filter-context.js +139 -188
  77. package/dist/lib/bitstream-filter-context.js.map +1 -1
  78. package/dist/lib/bitstream-filter.d.ts +68 -54
  79. package/dist/lib/bitstream-filter.js +68 -54
  80. package/dist/lib/bitstream-filter.js.map +1 -1
  81. package/dist/lib/codec-context.d.ts +316 -380
  82. package/dist/lib/codec-context.js +316 -381
  83. package/dist/lib/codec-context.js.map +1 -1
  84. package/dist/lib/codec-parameters.d.ts +160 -170
  85. package/dist/lib/codec-parameters.js +162 -172
  86. package/dist/lib/codec-parameters.js.map +1 -1
  87. package/dist/lib/codec-parser.d.ts +91 -104
  88. package/dist/lib/codec-parser.js +92 -103
  89. package/dist/lib/codec-parser.js.map +1 -1
  90. package/dist/lib/codec.d.ts +266 -283
  91. package/dist/lib/codec.js +270 -287
  92. package/dist/lib/codec.js.map +1 -1
  93. package/dist/lib/dictionary.d.ts +149 -203
  94. package/dist/lib/dictionary.js +158 -212
  95. package/dist/lib/dictionary.js.map +1 -1
  96. package/dist/lib/error.d.ts +96 -130
  97. package/dist/lib/error.js +98 -128
  98. package/dist/lib/error.js.map +1 -1
  99. package/dist/lib/filter-context.d.ts +284 -218
  100. package/dist/lib/filter-context.js +290 -227
  101. package/dist/lib/filter-context.js.map +1 -1
  102. package/dist/lib/filter-graph.d.ts +251 -292
  103. package/dist/lib/filter-graph.js +253 -294
  104. package/dist/lib/filter-graph.js.map +1 -1
  105. package/dist/lib/filter-inout.d.ts +87 -95
  106. package/dist/lib/filter-inout.js +87 -95
  107. package/dist/lib/filter-inout.js.map +1 -1
  108. package/dist/lib/filter.d.ts +93 -111
  109. package/dist/lib/filter.js +93 -111
  110. package/dist/lib/filter.js.map +1 -1
  111. package/dist/lib/format-context.d.ts +320 -428
  112. package/dist/lib/format-context.js +313 -385
  113. package/dist/lib/format-context.js.map +1 -1
  114. package/dist/lib/frame.d.ts +262 -405
  115. package/dist/lib/frame.js +263 -408
  116. package/dist/lib/frame.js.map +1 -1
  117. package/dist/lib/hardware-device-context.d.ts +149 -203
  118. package/dist/lib/hardware-device-context.js +149 -203
  119. package/dist/lib/hardware-device-context.js.map +1 -1
  120. package/dist/lib/hardware-frames-context.d.ts +170 -180
  121. package/dist/lib/hardware-frames-context.js +171 -181
  122. package/dist/lib/hardware-frames-context.js.map +1 -1
  123. package/dist/lib/index.d.ts +3 -2
  124. package/dist/lib/index.js +3 -3
  125. package/dist/lib/index.js.map +1 -1
  126. package/dist/lib/input-format.d.ts +89 -117
  127. package/dist/lib/input-format.js +89 -117
  128. package/dist/lib/input-format.js.map +1 -1
  129. package/dist/lib/io-context.d.ts +209 -241
  130. package/dist/lib/io-context.js +220 -252
  131. package/dist/lib/io-context.js.map +1 -1
  132. package/dist/lib/log.d.ts +85 -119
  133. package/dist/lib/log.js +85 -122
  134. package/dist/lib/log.js.map +1 -1
  135. package/dist/lib/native-types.d.ts +118 -106
  136. package/dist/lib/native-types.js +0 -7
  137. package/dist/lib/native-types.js.map +1 -1
  138. package/dist/lib/option.d.ts +437 -218
  139. package/dist/lib/option.js +462 -226
  140. package/dist/lib/option.js.map +1 -1
  141. package/dist/lib/output-format.d.ts +77 -101
  142. package/dist/lib/output-format.js +77 -101
  143. package/dist/lib/output-format.js.map +1 -1
  144. package/dist/lib/packet.d.ts +172 -240
  145. package/dist/lib/packet.js +172 -241
  146. package/dist/lib/packet.js.map +1 -1
  147. package/dist/lib/rational.d.ts +0 -2
  148. package/dist/lib/rational.js +0 -2
  149. package/dist/lib/rational.js.map +1 -1
  150. package/dist/lib/software-resample-context.d.ts +241 -325
  151. package/dist/lib/software-resample-context.js +242 -326
  152. package/dist/lib/software-resample-context.js.map +1 -1
  153. package/dist/lib/software-scale-context.d.ts +129 -173
  154. package/dist/lib/software-scale-context.js +131 -175
  155. package/dist/lib/software-scale-context.js.map +1 -1
  156. package/dist/lib/stream.d.ts +87 -197
  157. package/dist/lib/stream.js +87 -197
  158. package/dist/lib/stream.js.map +1 -1
  159. package/dist/lib/utilities.d.ts +435 -181
  160. package/dist/lib/utilities.js +438 -182
  161. package/dist/lib/utilities.js.map +1 -1
  162. package/install/check.js +0 -1
  163. package/install/ffmpeg.js +0 -11
  164. package/package.json +25 -18
  165. package/release_notes.md +24 -59
  166. package/CHANGELOG.md +0 -8
@@ -1,11 +1,12 @@
1
1
  import type { NativeFilter, NativeWrapper } from './native-types.js';
2
2
  import type { FilterPad } from './types.js';
3
3
  /**
4
- * Filter definition for media processing.
4
+ * Filter descriptor for video/audio processing.
5
5
  *
6
- * Represents a static filter definition (immutable template).
7
- * Defines the filter's capabilities, inputs, outputs, and properties.
8
- * Actual filtering operations are performed through FilterContext instances.
6
+ * Represents a filter that can be used in filter graphs for processing
7
+ * audio and video frames. Filters can be sources (no inputs), sinks (no outputs),
8
+ * or processors (with both inputs and outputs). Each filter has specific
9
+ * capabilities and pad configurations.
9
10
  *
10
11
  * Direct mapping to FFmpeg's AVFilter.
11
12
  *
@@ -13,219 +14,200 @@ import type { FilterPad } from './types.js';
13
14
  * ```typescript
14
15
  * import { Filter } from 'node-av';
15
16
  *
16
- * // Find a filter by name
17
+ * // Get a specific filter
17
18
  * const scaleFilter = Filter.getByName('scale');
18
- * if (!scaleFilter) throw new Error('Scale filter not found');
19
+ * if (scaleFilter) {
20
+ * console.log(`Filter: ${scaleFilter.name}`);
21
+ * console.log(`Description: ${scaleFilter.description}`);
22
+ * console.log(`Inputs: ${scaleFilter.inputs.length}`);
23
+ * console.log(`Outputs: ${scaleFilter.outputs.length}`);
24
+ * }
19
25
  *
20
- * // Check filter properties
21
- * console.log(`Filter: ${scaleFilter.name}`);
22
- * console.log(`Description: ${scaleFilter.description}`);
23
- * console.log(`Inputs: ${scaleFilter.inputs.length}`);
24
- * console.log(`Outputs: ${scaleFilter.outputs.length}`);
25
- *
26
- * // Get all video filters
27
- * const allFilters = Filter.getList();
28
- * const videoFilters = allFilters.filter(f => f.isVideo());
26
+ * // List all video filters
27
+ * const filters = Filter.getList();
28
+ * const videoFilters = filters.filter(f => f.isVideo());
29
29
  * console.log(`Found ${videoFilters.length} video filters`);
30
30
  * ```
31
+ *
32
+ * @see [AVFilter](https://ffmpeg.org/doxygen/trunk/structAVFilter.html) - FFmpeg Doxygen
33
+ * @see {@link FilterContext} For using filters in graphs
34
+ * @see {@link FilterGraph} For building filter pipelines
31
35
  */
32
36
  export declare class Filter implements NativeWrapper<NativeFilter> {
33
37
  private native;
34
38
  /**
35
- * Constructor is internal - use static factory methods.
36
- *
37
- * Filters are global immutable objects managed by FFmpeg.
38
- * Use the static factory methods to obtain filter instances.
39
- *
39
+ * @param native - The native filter instance
40
40
  * @internal
41
- *
42
- * @param native - Native AVFilter to wrap
43
- *
44
- * @example
45
- * ```typescript
46
- * import { Filter } from 'node-av';
47
- *
48
- * // Don't use constructor directly
49
- * // const filter = new Filter(); // Wrong
50
- *
51
- * // Use static factory methods instead
52
- * const filter = Filter.getByName('scale'); // Correct
53
- * const filters = Filter.getList(); // Correct
54
- * ```
55
41
  */
56
42
  constructor(native: NativeFilter);
57
43
  /**
58
- * Find a filter by name.
44
+ * Get a filter by name.
59
45
  *
60
- * Searches for a filter by its exact name.
61
- * Returns the filter definition if found.
46
+ * Retrieves a specific filter descriptor by its name.
47
+ * Common filter names include 'scale', 'crop', 'overlay', 'aformat', etc.
62
48
  *
63
- * Direct mapping to avfilter_get_by_name()
49
+ * Direct mapping to avfilter_get_by_name().
64
50
  *
65
- * @param name - Filter name (e.g., "scale", "overlay", "volume")
66
- *
67
- * @returns The filter if found, null otherwise
51
+ * @param name - Name of the filter
52
+ * @returns Filter instance if found, null otherwise
68
53
  *
69
54
  * @example
70
55
  * ```typescript
71
- * import { Filter } from 'node-av';
72
- *
73
- * // Find the scale filter
74
- * const scaleFilter = Filter.getByName('scale');
75
- * if (!scaleFilter) {
56
+ * // Get video scaling filter
57
+ * const scale = Filter.getByName('scale');
58
+ * if (!scale) {
76
59
  * throw new Error('Scale filter not available');
77
60
  * }
78
61
  *
79
- * // Find audio volume filter
80
- * const volumeFilter = Filter.getByName('volume');
81
- * if (!volumeFilter) {
82
- * throw new Error('Volume filter not available');
83
- * }
62
+ * // Get audio format filter
63
+ * const aformat = Filter.getByName('aformat');
84
64
  * ```
85
65
  *
86
- * @see {@link getList} To get all available filters
66
+ * @see {@link getList} To list all available filters
87
67
  */
88
68
  static getByName(name: string): Filter | null;
89
69
  /**
90
70
  * Get list of all available filters.
91
71
  *
92
- * Returns all registered filters in the system.
93
- * Internally uses avfilter_iterate() to collect all filters.
94
- *
95
- * Direct mapping to avfilter_iterate()
72
+ * Returns an array of all registered filters in FFmpeg.
73
+ * Useful for discovering available filters or building filter lists.
96
74
  *
97
- * @returns Array of all registered filters
75
+ * @returns Array of all available filters
98
76
  *
99
77
  * @example
100
78
  * ```typescript
101
- * import { Filter } from 'node-av';
102
- *
103
- * // Get all video filters
104
- * const allFilters = Filter.getList();
105
- * const videoFilters = allFilters.filter(f => f.isVideo());
106
- * console.log(`Found ${videoFilters.length} video filters`);
107
- *
108
- * // Find all source filters
109
- * const sourceFilters = allFilters.filter(f => f.isSource());
110
- * sourceFilters.forEach(f => {
111
- * console.log(`Source filter: ${f.name}`);
112
- * });
79
+ * // List all filters
80
+ * const filters = Filter.getList();
81
+ * console.log(`Total filters: ${filters.length}`);
82
+ *
83
+ * // Find all source filters (generators)
84
+ * const sources = filters.filter(f => f.isSource());
85
+ * console.log(`Source filters: ${sources.length}`);
86
+ *
87
+ * // Find all sink filters (outputs)
88
+ * const sinks = filters.filter(f => f.isSink());
89
+ * console.log(`Sink filters: ${sinks.length}`);
113
90
  * ```
114
91
  *
115
- * @see {@link getByName} To find a specific filter
92
+ * @see {@link getByName} To get a specific filter
116
93
  */
117
94
  static getList(): Filter[];
118
95
  /**
119
96
  * Filter name.
120
97
  *
121
- * Direct mapping to AVFilter->name
98
+ * Unique identifier for the filter (e.g., 'scale', 'overlay').
122
99
  *
123
- * The short name of the filter (e.g., "scale", "overlay", "volume").
100
+ * Direct mapping to AVFilter->name.
124
101
  */
125
102
  get name(): string | null;
126
103
  /**
127
104
  * Filter description.
128
105
  *
129
- * Direct mapping to AVFilter->description
130
- *
131
106
  * Human-readable description of what the filter does.
107
+ *
108
+ * Direct mapping to AVFilter->description.
132
109
  */
133
110
  get description(): string | null;
134
111
  /**
135
112
  * Input pads.
136
113
  *
137
- * Direct mapping to AVFilter->inputs
138
- *
139
- * Array of input connection points for the filter.
114
+ * Array of input pad descriptors.
140
115
  * Empty array for source filters.
116
+ *
117
+ * Direct mapping to AVFilter->inputs.
141
118
  */
142
119
  get inputs(): FilterPad[];
143
120
  /**
144
121
  * Output pads.
145
122
  *
146
- * Direct mapping to AVFilter->outputs
147
- *
148
- * Array of output connection points for the filter.
123
+ * Array of output pad descriptors.
149
124
  * Empty array for sink filters.
125
+ *
126
+ * Direct mapping to AVFilter->outputs.
150
127
  */
151
128
  get outputs(): FilterPad[];
152
129
  /**
153
130
  * Filter flags.
154
131
  *
155
- * Direct mapping to AVFilter->flags
132
+ * Combination of AVFILTER_FLAG_* values indicating filter capabilities.
156
133
  *
157
- * Bitwise flags indicating filter capabilities (AVFILTER_FLAG_*).
134
+ * Direct mapping to AVFilter->flags.
158
135
  */
159
136
  get flags(): number;
160
137
  /**
161
- * Check if this is a source filter.
138
+ * Check if filter is a source.
162
139
  *
163
- * Source filters have no inputs and generate data.
140
+ * Source filters generate frames without input
141
+ * (e.g., 'testsrc', 'color', 'anullsrc').
164
142
  *
165
- * @returns true if the filter has no input pads, false otherwise
143
+ * @returns True if filter has no inputs
166
144
  *
167
145
  * @example
168
146
  * ```typescript
169
- * const filter = Filter.getByName('buffer');
170
- * if (filter && filter.isSource()) {
147
+ * const filter = Filter.getByName('testsrc');
148
+ * if (filter?.isSource()) {
171
149
  * console.log('This is a source filter');
172
150
  * }
173
151
  * ```
152
+ *
153
+ * @see {@link isSink} To check for sink filters
174
154
  */
175
155
  isSource(): boolean;
176
156
  /**
177
- * Check if this is a sink filter.
157
+ * Check if filter is a sink.
178
158
  *
179
- * Sink filters have no outputs and consume data.
159
+ * Sink filters consume frames without output
160
+ * (e.g., 'nullsink', 'buffersink').
180
161
  *
181
- * @returns true if the filter has no output pads, false otherwise
162
+ * @returns True if filter has no outputs
182
163
  *
183
164
  * @example
184
165
  * ```typescript
185
- * const filter = Filter.getByName('buffersink');
186
- * if (filter && filter.isSink()) {
166
+ * const filter = Filter.getByName('nullsink');
167
+ * if (filter?.isSink()) {
187
168
  * console.log('This is a sink filter');
188
169
  * }
189
170
  * ```
171
+ *
172
+ * @see {@link isSource} To check for source filters
190
173
  */
191
174
  isSink(): boolean;
192
175
  /**
193
- * Check if this is a video filter.
176
+ * Check if filter processes video.
194
177
  *
195
- * Checks if any input or output pad handles video data.
196
- *
197
- * @returns true if the filter processes video data, false otherwise
178
+ * @returns True if filter has video inputs or outputs
198
179
  *
199
180
  * @example
200
181
  * ```typescript
201
- * const filter = Filter.getByName('scale');
202
- * if (filter && filter.isVideo()) {
203
- * console.log('This filter processes video');
204
- * }
182
+ * const filters = Filter.getList();
183
+ * const videoFilters = filters.filter(f => f.isVideo());
184
+ * console.log(`Video filters: ${videoFilters.length}`);
205
185
  * ```
186
+ *
187
+ * @see {@link isAudio} To check for audio filters
206
188
  */
207
189
  isVideo(): boolean;
208
190
  /**
209
- * Check if this is an audio filter.
210
- *
211
- * Checks if any input or output pad handles audio data.
191
+ * Check if filter processes audio.
212
192
  *
213
- * @returns true if the filter processes audio data, false otherwise
193
+ * @returns True if filter has audio inputs or outputs
214
194
  *
215
195
  * @example
216
196
  * ```typescript
217
- * const filter = Filter.getByName('volume');
218
- * if (filter && filter.isAudio()) {
219
- * console.log('This filter processes audio');
220
- * }
197
+ * const filters = Filter.getList();
198
+ * const audioFilters = filters.filter(f => f.isAudio());
199
+ * console.log(`Audio filters: ${audioFilters.length}`);
221
200
  * ```
201
+ *
202
+ * @see {@link isVideo} To check for video filters
222
203
  */
223
204
  isAudio(): boolean;
224
205
  /**
225
- * Get the native FFmpeg AVFilter pointer.
206
+ * Get the underlying native Filter object.
226
207
  *
227
- * @internal For use by other wrapper classes
228
- * @returns The underlying native filter object
208
+ * @returns The native Filter binding object
209
+ *
210
+ * @internal
229
211
  */
230
212
  getNative(): NativeFilter;
231
213
  }
@@ -1,11 +1,12 @@
1
1
  import { AVMEDIA_TYPE_AUDIO, AVMEDIA_TYPE_VIDEO } from '../constants/constants.js';
2
2
  import { bindings } from './binding.js';
3
3
  /**
4
- * Filter definition for media processing.
4
+ * Filter descriptor for video/audio processing.
5
5
  *
6
- * Represents a static filter definition (immutable template).
7
- * Defines the filter's capabilities, inputs, outputs, and properties.
8
- * Actual filtering operations are performed through FilterContext instances.
6
+ * Represents a filter that can be used in filter graphs for processing
7
+ * audio and video frames. Filters can be sources (no inputs), sinks (no outputs),
8
+ * or processors (with both inputs and outputs). Each filter has specific
9
+ * capabilities and pad configurations.
9
10
  *
10
11
  * Direct mapping to FFmpeg's AVFilter.
11
12
  *
@@ -13,79 +14,58 @@ import { bindings } from './binding.js';
13
14
  * ```typescript
14
15
  * import { Filter } from 'node-av';
15
16
  *
16
- * // Find a filter by name
17
+ * // Get a specific filter
17
18
  * const scaleFilter = Filter.getByName('scale');
18
- * if (!scaleFilter) throw new Error('Scale filter not found');
19
+ * if (scaleFilter) {
20
+ * console.log(`Filter: ${scaleFilter.name}`);
21
+ * console.log(`Description: ${scaleFilter.description}`);
22
+ * console.log(`Inputs: ${scaleFilter.inputs.length}`);
23
+ * console.log(`Outputs: ${scaleFilter.outputs.length}`);
24
+ * }
19
25
  *
20
- * // Check filter properties
21
- * console.log(`Filter: ${scaleFilter.name}`);
22
- * console.log(`Description: ${scaleFilter.description}`);
23
- * console.log(`Inputs: ${scaleFilter.inputs.length}`);
24
- * console.log(`Outputs: ${scaleFilter.outputs.length}`);
25
- *
26
- * // Get all video filters
27
- * const allFilters = Filter.getList();
28
- * const videoFilters = allFilters.filter(f => f.isVideo());
26
+ * // List all video filters
27
+ * const filters = Filter.getList();
28
+ * const videoFilters = filters.filter(f => f.isVideo());
29
29
  * console.log(`Found ${videoFilters.length} video filters`);
30
30
  * ```
31
+ *
32
+ * @see [AVFilter](https://ffmpeg.org/doxygen/trunk/structAVFilter.html) - FFmpeg Doxygen
33
+ * @see {@link FilterContext} For using filters in graphs
34
+ * @see {@link FilterGraph} For building filter pipelines
31
35
  */
32
36
  export class Filter {
33
37
  native;
34
38
  /**
35
- * Constructor is internal - use static factory methods.
36
- *
37
- * Filters are global immutable objects managed by FFmpeg.
38
- * Use the static factory methods to obtain filter instances.
39
- *
39
+ * @param native - The native filter instance
40
40
  * @internal
41
- *
42
- * @param native - Native AVFilter to wrap
43
- *
44
- * @example
45
- * ```typescript
46
- * import { Filter } from 'node-av';
47
- *
48
- * // Don't use constructor directly
49
- * // const filter = new Filter(); // Wrong
50
- *
51
- * // Use static factory methods instead
52
- * const filter = Filter.getByName('scale'); // Correct
53
- * const filters = Filter.getList(); // Correct
54
- * ```
55
41
  */
56
42
  constructor(native) {
57
43
  this.native = native;
58
44
  }
59
45
  /**
60
- * Find a filter by name.
46
+ * Get a filter by name.
61
47
  *
62
- * Searches for a filter by its exact name.
63
- * Returns the filter definition if found.
48
+ * Retrieves a specific filter descriptor by its name.
49
+ * Common filter names include 'scale', 'crop', 'overlay', 'aformat', etc.
64
50
  *
65
- * Direct mapping to avfilter_get_by_name()
51
+ * Direct mapping to avfilter_get_by_name().
66
52
  *
67
- * @param name - Filter name (e.g., "scale", "overlay", "volume")
68
- *
69
- * @returns The filter if found, null otherwise
53
+ * @param name - Name of the filter
54
+ * @returns Filter instance if found, null otherwise
70
55
  *
71
56
  * @example
72
57
  * ```typescript
73
- * import { Filter } from 'node-av';
74
- *
75
- * // Find the scale filter
76
- * const scaleFilter = Filter.getByName('scale');
77
- * if (!scaleFilter) {
58
+ * // Get video scaling filter
59
+ * const scale = Filter.getByName('scale');
60
+ * if (!scale) {
78
61
  * throw new Error('Scale filter not available');
79
62
  * }
80
63
  *
81
- * // Find audio volume filter
82
- * const volumeFilter = Filter.getByName('volume');
83
- * if (!volumeFilter) {
84
- * throw new Error('Volume filter not available');
85
- * }
64
+ * // Get audio format filter
65
+ * const aformat = Filter.getByName('aformat');
86
66
  * ```
87
67
  *
88
- * @see {@link getList} To get all available filters
68
+ * @see {@link getList} To list all available filters
89
69
  */
90
70
  static getByName(name) {
91
71
  const native = bindings.Filter.getByName(name);
@@ -94,30 +74,27 @@ export class Filter {
94
74
  /**
95
75
  * Get list of all available filters.
96
76
  *
97
- * Returns all registered filters in the system.
98
- * Internally uses avfilter_iterate() to collect all filters.
99
- *
100
- * Direct mapping to avfilter_iterate()
77
+ * Returns an array of all registered filters in FFmpeg.
78
+ * Useful for discovering available filters or building filter lists.
101
79
  *
102
- * @returns Array of all registered filters
80
+ * @returns Array of all available filters
103
81
  *
104
82
  * @example
105
83
  * ```typescript
106
- * import { Filter } from 'node-av';
107
- *
108
- * // Get all video filters
109
- * const allFilters = Filter.getList();
110
- * const videoFilters = allFilters.filter(f => f.isVideo());
111
- * console.log(`Found ${videoFilters.length} video filters`);
112
- *
113
- * // Find all source filters
114
- * const sourceFilters = allFilters.filter(f => f.isSource());
115
- * sourceFilters.forEach(f => {
116
- * console.log(`Source filter: ${f.name}`);
117
- * });
84
+ * // List all filters
85
+ * const filters = Filter.getList();
86
+ * console.log(`Total filters: ${filters.length}`);
87
+ *
88
+ * // Find all source filters (generators)
89
+ * const sources = filters.filter(f => f.isSource());
90
+ * console.log(`Source filters: ${sources.length}`);
91
+ *
92
+ * // Find all sink filters (outputs)
93
+ * const sinks = filters.filter(f => f.isSink());
94
+ * console.log(`Sink filters: ${sinks.length}`);
118
95
  * ```
119
96
  *
120
- * @see {@link getByName} To find a specific filter
97
+ * @see {@link getByName} To get a specific filter
121
98
  */
122
99
  static getList() {
123
100
  const natives = bindings.Filter.getList();
@@ -126,9 +103,9 @@ export class Filter {
126
103
  /**
127
104
  * Filter name.
128
105
  *
129
- * Direct mapping to AVFilter->name
106
+ * Unique identifier for the filter (e.g., 'scale', 'overlay').
130
107
  *
131
- * The short name of the filter (e.g., "scale", "overlay", "volume").
108
+ * Direct mapping to AVFilter->name.
132
109
  */
133
110
  get name() {
134
111
  return this.native.name;
@@ -136,9 +113,9 @@ export class Filter {
136
113
  /**
137
114
  * Filter description.
138
115
  *
139
- * Direct mapping to AVFilter->description
140
- *
141
116
  * Human-readable description of what the filter does.
117
+ *
118
+ * Direct mapping to AVFilter->description.
142
119
  */
143
120
  get description() {
144
121
  return this.native.description;
@@ -146,10 +123,10 @@ export class Filter {
146
123
  /**
147
124
  * Input pads.
148
125
  *
149
- * Direct mapping to AVFilter->inputs
150
- *
151
- * Array of input connection points for the filter.
126
+ * Array of input pad descriptors.
152
127
  * Empty array for source filters.
128
+ *
129
+ * Direct mapping to AVFilter->inputs.
153
130
  */
154
131
  get inputs() {
155
132
  return this.native.inputs;
@@ -157,10 +134,10 @@ export class Filter {
157
134
  /**
158
135
  * Output pads.
159
136
  *
160
- * Direct mapping to AVFilter->outputs
161
- *
162
- * Array of output connection points for the filter.
137
+ * Array of output pad descriptors.
163
138
  * Empty array for sink filters.
139
+ *
140
+ * Direct mapping to AVFilter->outputs.
164
141
  */
165
142
  get outputs() {
166
143
  return this.native.outputs;
@@ -168,90 +145,95 @@ export class Filter {
168
145
  /**
169
146
  * Filter flags.
170
147
  *
171
- * Direct mapping to AVFilter->flags
148
+ * Combination of AVFILTER_FLAG_* values indicating filter capabilities.
172
149
  *
173
- * Bitwise flags indicating filter capabilities (AVFILTER_FLAG_*).
150
+ * Direct mapping to AVFilter->flags.
174
151
  */
175
152
  get flags() {
176
153
  return this.native.flags;
177
154
  }
178
155
  /**
179
- * Check if this is a source filter.
156
+ * Check if filter is a source.
180
157
  *
181
- * Source filters have no inputs and generate data.
158
+ * Source filters generate frames without input
159
+ * (e.g., 'testsrc', 'color', 'anullsrc').
182
160
  *
183
- * @returns true if the filter has no input pads, false otherwise
161
+ * @returns True if filter has no inputs
184
162
  *
185
163
  * @example
186
164
  * ```typescript
187
- * const filter = Filter.getByName('buffer');
188
- * if (filter && filter.isSource()) {
165
+ * const filter = Filter.getByName('testsrc');
166
+ * if (filter?.isSource()) {
189
167
  * console.log('This is a source filter');
190
168
  * }
191
169
  * ```
170
+ *
171
+ * @see {@link isSink} To check for sink filters
192
172
  */
193
173
  isSource() {
194
174
  return this.inputs.length === 0;
195
175
  }
196
176
  /**
197
- * Check if this is a sink filter.
177
+ * Check if filter is a sink.
198
178
  *
199
- * Sink filters have no outputs and consume data.
179
+ * Sink filters consume frames without output
180
+ * (e.g., 'nullsink', 'buffersink').
200
181
  *
201
- * @returns true if the filter has no output pads, false otherwise
182
+ * @returns True if filter has no outputs
202
183
  *
203
184
  * @example
204
185
  * ```typescript
205
- * const filter = Filter.getByName('buffersink');
206
- * if (filter && filter.isSink()) {
186
+ * const filter = Filter.getByName('nullsink');
187
+ * if (filter?.isSink()) {
207
188
  * console.log('This is a sink filter');
208
189
  * }
209
190
  * ```
191
+ *
192
+ * @see {@link isSource} To check for source filters
210
193
  */
211
194
  isSink() {
212
195
  return this.outputs.length === 0;
213
196
  }
214
197
  /**
215
- * Check if this is a video filter.
198
+ * Check if filter processes video.
216
199
  *
217
- * Checks if any input or output pad handles video data.
218
- *
219
- * @returns true if the filter processes video data, false otherwise
200
+ * @returns True if filter has video inputs or outputs
220
201
  *
221
202
  * @example
222
203
  * ```typescript
223
- * const filter = Filter.getByName('scale');
224
- * if (filter && filter.isVideo()) {
225
- * console.log('This filter processes video');
226
- * }
204
+ * const filters = Filter.getList();
205
+ * const videoFilters = filters.filter(f => f.isVideo());
206
+ * console.log(`Video filters: ${videoFilters.length}`);
227
207
  * ```
208
+ *
209
+ * @see {@link isAudio} To check for audio filters
228
210
  */
229
211
  isVideo() {
230
212
  return this.inputs.some((i) => i.type === AVMEDIA_TYPE_VIDEO) || this.outputs.some((o) => o.type === AVMEDIA_TYPE_VIDEO);
231
213
  }
232
214
  /**
233
- * Check if this is an audio filter.
234
- *
235
- * Checks if any input or output pad handles audio data.
215
+ * Check if filter processes audio.
236
216
  *
237
- * @returns true if the filter processes audio data, false otherwise
217
+ * @returns True if filter has audio inputs or outputs
238
218
  *
239
219
  * @example
240
220
  * ```typescript
241
- * const filter = Filter.getByName('volume');
242
- * if (filter && filter.isAudio()) {
243
- * console.log('This filter processes audio');
244
- * }
221
+ * const filters = Filter.getList();
222
+ * const audioFilters = filters.filter(f => f.isAudio());
223
+ * console.log(`Audio filters: ${audioFilters.length}`);
245
224
  * ```
225
+ *
226
+ * @see {@link isVideo} To check for video filters
246
227
  */
247
228
  isAudio() {
248
229
  return this.inputs.some((i) => i.type === AVMEDIA_TYPE_AUDIO) || this.outputs.some((o) => o.type === AVMEDIA_TYPE_AUDIO);
249
230
  }
250
231
  /**
251
- * Get the native FFmpeg AVFilter pointer.
232
+ * Get the underlying native Filter object.
252
233
  *
253
- * @internal For use by other wrapper classes
254
- * @returns The underlying native filter object
234
+ * @returns The native Filter binding object
235
+ *
236
+ * @internal
255
237
  */
256
238
  getNative() {
257
239
  return this.native;