bare-ffmpeg 1.0.0-2 → 1.0.0-20

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 (47) hide show
  1. package/CMakeLists.txt +10 -3
  2. package/README.md +990 -0
  3. package/binding.cc +3150 -0
  4. package/cmake/ports/ffmpeg/port.cmake +513 -0
  5. package/cmake/ports/opus/patches/01-windows-clang.patch +52 -0
  6. package/cmake/ports/opus/port.cmake +42 -0
  7. package/cmake/ports/svt-av1/port.cmake +42 -0
  8. package/cmake/ports/x264/patches/01-windows-clang.patch +33 -0
  9. package/cmake/ports/x264/port.cmake +157 -0
  10. package/index.js +14 -4
  11. package/lib/audio-fifo.js +47 -0
  12. package/lib/channel-layout.js +35 -0
  13. package/lib/codec-context.js +92 -15
  14. package/lib/codec-parameters.js +154 -8
  15. package/lib/codec.js +19 -0
  16. package/lib/constants.js +163 -8
  17. package/lib/dictionary.js +10 -15
  18. package/lib/errors.js +38 -0
  19. package/lib/format-context.js +62 -31
  20. package/lib/frame.js +87 -16
  21. package/lib/image.js +22 -0
  22. package/lib/input-format.js +8 -3
  23. package/lib/io-context.js +29 -6
  24. package/lib/log.js +16 -0
  25. package/lib/output-format.js +4 -0
  26. package/lib/packet.js +88 -13
  27. package/lib/rational.js +35 -1
  28. package/lib/resampler.js +63 -0
  29. package/lib/samples.js +49 -0
  30. package/lib/scaler.js +8 -7
  31. package/lib/stream.js +37 -12
  32. package/package.json +7 -4
  33. package/prebuilds/android-arm/bare-ffmpeg.bare +0 -0
  34. package/prebuilds/android-arm64/bare-ffmpeg.bare +0 -0
  35. package/prebuilds/android-ia32/bare-ffmpeg.bare +0 -0
  36. package/prebuilds/android-x64/bare-ffmpeg.bare +0 -0
  37. package/prebuilds/darwin-arm64/bare-ffmpeg.bare +0 -0
  38. package/prebuilds/darwin-x64/bare-ffmpeg.bare +0 -0
  39. package/prebuilds/ios-arm64/bare-ffmpeg.bare +0 -0
  40. package/prebuilds/ios-arm64-simulator/bare-ffmpeg.bare +0 -0
  41. package/prebuilds/ios-x64-simulator/bare-ffmpeg.bare +0 -0
  42. package/prebuilds/linux-arm64/bare-ffmpeg.bare +0 -0
  43. package/prebuilds/linux-x64/bare-ffmpeg.bare +0 -0
  44. package/prebuilds/win32-arm64/bare-ffmpeg.bare +0 -0
  45. package/prebuilds/win32-x64/bare-ffmpeg.bare +0 -0
  46. package/binding.c +0 -2128
  47. package/lib/reference-counted.js +0 -39
package/binding.cc ADDED
@@ -0,0 +1,3150 @@
1
+ #include <assert.h>
2
+ #include <cstdint>
3
+ #include <stddef.h>
4
+ #include <stdint.h>
5
+ #include <string.h>
6
+
7
+ #include <bare.h>
8
+ #include <js.h>
9
+ #include <jstl.h>
10
+
11
+ extern "C" {
12
+ #include <libavcodec/avcodec.h>
13
+ #include <libavcodec/codec.h>
14
+ #include <libavcodec/codec_id.h>
15
+ #include <libavcodec/codec_par.h>
16
+ #include <libavcodec/packet.h>
17
+ #include <libavdevice/avdevice.h>
18
+ #include <libavformat/avformat.h>
19
+ #include <libavformat/avio.h>
20
+ #include <libavutil/audio_fifo.h>
21
+ #include <libavutil/channel_layout.h>
22
+ #include <libavutil/dict.h>
23
+ #include <libavutil/error.h>
24
+ #include <libavutil/frame.h>
25
+ #include <libavutil/imgutils.h>
26
+ #include <libavutil/log.h>
27
+ #include <libavutil/mem.h>
28
+ #include <libavutil/pixfmt.h>
29
+ #include <libavutil/rational.h>
30
+ #include <libavutil/samplefmt.h>
31
+ #include <libswresample/swresample.h>
32
+ #include <libswscale/swscale.h>
33
+ }
34
+
35
+ using bare_ffmpeg_io_context_on_write_cb_t = js_function_t<void, js_arraybuffer_t>;
36
+
37
+ typedef struct {
38
+ AVIOContext *handle;
39
+
40
+ js_env_t *env;
41
+ js_persistent_t<bare_ffmpeg_io_context_on_write_cb_t> on_write;
42
+ } bare_ffmpeg_io_context_t;
43
+
44
+ typedef struct {
45
+ const AVOutputFormat *handle;
46
+ } bare_ffmpeg_output_format_t;
47
+
48
+ typedef struct {
49
+ const AVInputFormat *handle;
50
+ } bare_ffmpeg_input_format_t;
51
+
52
+ typedef struct {
53
+ AVFormatContext *handle;
54
+ } bare_ffmpeg_format_context_t;
55
+
56
+ typedef struct {
57
+ AVStream *handle;
58
+ } bare_ffmpeg_stream_t;
59
+
60
+ typedef struct {
61
+ const AVCodec *handle;
62
+ } bare_ffmpeg_codec_t;
63
+
64
+ typedef struct {
65
+ AVCodecParameters *handle;
66
+ } bare_ffmpeg_codec_parameters_t;
67
+
68
+ typedef struct {
69
+ AVCodecContext *handle;
70
+ } bare_ffmpeg_codec_context_t;
71
+
72
+ typedef struct {
73
+ AVChannelLayout handle;
74
+ } bare_ffmpeg_channel_layout_t;
75
+
76
+ typedef struct {
77
+ AVFrame *handle;
78
+ } bare_ffmpeg_frame_t;
79
+
80
+ typedef struct {
81
+ AVPacket *handle;
82
+ } bare_ffmpeg_packet_t;
83
+
84
+ typedef struct {
85
+ struct SwsContext *handle;
86
+ } bare_ffmpeg_scaler_t;
87
+
88
+ typedef struct {
89
+ struct AVDictionary *handle;
90
+ } bare_ffmpeg_dictionary_t;
91
+
92
+ typedef struct {
93
+ struct SwrContext *handle;
94
+ } bare_ffmpeg_resampler_t;
95
+
96
+ typedef struct {
97
+ AVAudioFifo *handle;
98
+ } bare_ffmpeg_audio_fifo_t;
99
+
100
+ static uv_once_t bare_ffmpeg__init_guard = UV_ONCE_INIT;
101
+
102
+ static inline bool
103
+ bad_timebase(const AVRational r) {
104
+ return r.den < 1 || // invalid denominator
105
+ av_q2d(r) == 0; // detect initial state: (0 / 1)
106
+ }
107
+
108
+ static void
109
+ bare_ffmpeg__on_init(void) {
110
+ av_log_set_level(AV_LOG_ERROR);
111
+
112
+ avdevice_register_all();
113
+ }
114
+
115
+ static int32_t
116
+ bare_ffmpeg_log_get_level(js_env_t *) {
117
+ return av_log_get_level();
118
+ }
119
+
120
+ static void
121
+ bare_ffmpeg_log_set_level(js_env_t *, int32_t level) {
122
+ av_log_set_level(level);
123
+ }
124
+
125
+ static int
126
+ io_context_write_packet(void *opaque, const uint8_t *chunk, int len) {
127
+ auto context = reinterpret_cast<bare_ffmpeg_io_context_t *>(opaque);
128
+ auto env = context->env;
129
+
130
+ bare_ffmpeg_io_context_on_write_cb_t callback;
131
+
132
+ int err = js_get_reference_value(env, context->on_write, callback);
133
+ assert(err == 0);
134
+
135
+ js_arraybuffer_t data;
136
+ err = js_create_arraybuffer(env, chunk, static_cast<size_t>(len), data);
137
+
138
+ assert(err == 0);
139
+
140
+ // TODO: running on js-stack during avformat_write_header()
141
+ // trace other invocations, pray singlethread.
142
+ err = js_call_function(env, callback, data);
143
+ return err;
144
+ }
145
+
146
+ static js_arraybuffer_t
147
+ bare_ffmpeg_io_context_init(
148
+ js_env_t *env,
149
+ js_receiver_t,
150
+ std::optional<js_arraybuffer_span_t> data,
151
+ uint64_t offset,
152
+ uint64_t len,
153
+ std::optional<bare_ffmpeg_io_context_on_write_cb_t> on_write
154
+ ) {
155
+ int err;
156
+
157
+ js_arraybuffer_t handle;
158
+
159
+ bare_ffmpeg_io_context_t *context;
160
+ err = js_create_arraybuffer(env, context, handle);
161
+ assert(err == 0);
162
+
163
+ context->env = env;
164
+
165
+ int write_flag = 0;
166
+ if (on_write) {
167
+ write_flag = 1;
168
+ err = js_create_reference(env, *on_write, context->on_write);
169
+ assert(err == 0);
170
+ }
171
+
172
+ size_t size = static_cast<size_t>(len);
173
+
174
+ uint8_t *io = NULL;
175
+
176
+ if (size) {
177
+ io = reinterpret_cast<uint8_t *>(av_malloc(size));
178
+ }
179
+
180
+ if (data) {
181
+ memcpy(io, &data.value()[static_cast<size_t>(offset)], size);
182
+ }
183
+
184
+ // TODO: for stream read support provide read/seek callbacks
185
+
186
+ context->handle = avio_alloc_context(
187
+ io,
188
+ static_cast<int>(len),
189
+ write_flag,
190
+ context,
191
+ NULL, // io_context_read_packet
192
+ io_context_write_packet,
193
+ NULL // io_context_seek
194
+ );
195
+ assert(context->handle->opaque == context);
196
+
197
+ return handle;
198
+ }
199
+
200
+ static void
201
+ bare_ffmpeg_io_context_destroy(
202
+ js_env_t *env,
203
+ js_receiver_t,
204
+ js_arraybuffer_span_of_t<bare_ffmpeg_io_context_t, 1> context
205
+ ) {
206
+ av_free(context->handle->buffer);
207
+
208
+ avio_context_free(&context->handle);
209
+ context->on_write.reset();
210
+ }
211
+
212
+ static js_arraybuffer_t
213
+ bare_ffmpeg_output_format_init(js_env_t *env, js_receiver_t, std::string name) {
214
+ int err;
215
+
216
+ const AVOutputFormat *format = av_guess_format(name.c_str(), NULL, NULL);
217
+
218
+ if (format == NULL) {
219
+ err = js_throw_errorf(env, NULL, "No output format found for name '%s'", name.c_str());
220
+ assert(err == 0);
221
+
222
+ throw js_pending_exception;
223
+ }
224
+
225
+ js_arraybuffer_t handle;
226
+
227
+ bare_ffmpeg_output_format_t *context;
228
+ err = js_create_arraybuffer(env, context, handle);
229
+ assert(err == 0);
230
+
231
+ context->handle = format;
232
+
233
+ return handle;
234
+ }
235
+
236
+ static int32_t
237
+ bare_ffmpeg_output_format_get_flags(
238
+ js_env_t *,
239
+ js_receiver_t,
240
+ js_arraybuffer_span_of_t<bare_ffmpeg_output_format_t, 1> format
241
+ ) {
242
+ return format->handle->flags;
243
+ }
244
+
245
+ static js_arraybuffer_t
246
+ bare_ffmpeg_input_format_init(js_env_t *env, js_receiver_t, std::string name) {
247
+ int err;
248
+
249
+ const AVInputFormat *format = av_find_input_format(name.c_str());
250
+
251
+ if (format == NULL) {
252
+ err = js_throw_errorf(env, NULL, "No input format found for name '%s'", name.c_str());
253
+ assert(err == 0);
254
+
255
+ throw js_pending_exception;
256
+ }
257
+
258
+ js_arraybuffer_t handle;
259
+
260
+ bare_ffmpeg_input_format_t *context;
261
+ err = js_create_arraybuffer(env, context, handle);
262
+ assert(err == 0);
263
+
264
+ context->handle = format;
265
+
266
+ return handle;
267
+ }
268
+
269
+ static int32_t
270
+ bare_ffmpeg_input_format_get_flags(
271
+ js_env_t *,
272
+ js_receiver_t,
273
+ js_arraybuffer_span_of_t<bare_ffmpeg_input_format_t, 1> format
274
+ ) {
275
+ return format->handle->flags;
276
+ }
277
+
278
+ static js_arraybuffer_t
279
+ bare_ffmpeg_format_context_open_input_with_io(
280
+ js_env_t *env,
281
+ js_receiver_t,
282
+ js_arraybuffer_span_of_t<bare_ffmpeg_io_context_t, 1> io
283
+ ) {
284
+ int err;
285
+
286
+ js_arraybuffer_t handle;
287
+
288
+ bare_ffmpeg_format_context_t *context;
289
+ err = js_create_arraybuffer(env, context, handle);
290
+ assert(err == 0);
291
+
292
+ context->handle = avformat_alloc_context();
293
+ context->handle->pb = io->handle;
294
+ context->handle->opaque = (void *) context;
295
+
296
+ err = avformat_open_input(&context->handle, NULL, NULL, NULL);
297
+ if (err < 0) {
298
+ avformat_free_context(context->handle);
299
+
300
+ err = js_throw_error(env, NULL, av_err2str(err));
301
+ assert(err == 0);
302
+
303
+ throw js_pending_exception;
304
+ }
305
+
306
+ err = avformat_find_stream_info(context->handle, NULL);
307
+ if (err < 0) {
308
+ avformat_close_input(&context->handle);
309
+
310
+ err = js_throw_error(env, NULL, av_err2str(err));
311
+ assert(err == 0);
312
+
313
+ throw js_pending_exception;
314
+ }
315
+
316
+ return handle;
317
+ }
318
+
319
+ static js_arraybuffer_t
320
+ bare_ffmpeg_format_context_open_input_with_format(
321
+ js_env_t *env,
322
+ js_receiver_t,
323
+ js_arraybuffer_span_of_t<bare_ffmpeg_input_format_t, 1> format,
324
+ js_arraybuffer_span_of_t<bare_ffmpeg_dictionary_t, 1> options,
325
+ std::string url
326
+ ) {
327
+ int err;
328
+
329
+ js_arraybuffer_t handle;
330
+
331
+ bare_ffmpeg_format_context_t *context;
332
+ err = js_create_arraybuffer(env, context, handle);
333
+ assert(err == 0);
334
+
335
+ context->handle = avformat_alloc_context();
336
+ context->handle->opaque = (void *) context;
337
+
338
+ err = avformat_open_input(&context->handle, url.c_str(), format->handle, &options->handle);
339
+ if (err < 0) {
340
+ avformat_free_context(context->handle);
341
+
342
+ err = js_throw_error(env, NULL, av_err2str(err));
343
+ assert(err == 0);
344
+
345
+ throw js_pending_exception;
346
+ }
347
+
348
+ err = avformat_find_stream_info(context->handle, NULL);
349
+ if (err < 0) {
350
+ avformat_close_input(&context->handle);
351
+
352
+ err = js_throw_error(env, NULL, av_err2str(err));
353
+ assert(err == 0);
354
+
355
+ throw js_pending_exception;
356
+ }
357
+
358
+ return handle;
359
+ }
360
+
361
+ static void
362
+ bare_ffmpeg_format_context_close_input(
363
+ js_env_t *env,
364
+ js_receiver_t,
365
+ js_arraybuffer_span_of_t<bare_ffmpeg_format_context_t, 1> context
366
+ ) {
367
+ avformat_close_input(&context->handle);
368
+ }
369
+
370
+ static js_arraybuffer_t
371
+ bare_ffmpeg_format_context_open_output(
372
+ js_env_t *env,
373
+ js_receiver_t,
374
+ js_arraybuffer_span_of_t<bare_ffmpeg_output_format_t, 1> format,
375
+ js_arraybuffer_span_of_t<bare_ffmpeg_io_context_t, 1> io
376
+ ) {
377
+ int err;
378
+
379
+ js_arraybuffer_t handle;
380
+
381
+ bare_ffmpeg_format_context_t *context;
382
+ err = js_create_arraybuffer(env, context, handle);
383
+ assert(err == 0);
384
+
385
+ err = avformat_alloc_output_context2(&context->handle, format->handle, NULL, NULL);
386
+ if (err < 0) {
387
+ err = js_throw_error(env, NULL, av_err2str(err));
388
+ assert(err == 0);
389
+
390
+ throw js_pending_exception;
391
+ }
392
+
393
+ context->handle->pb = io->handle;
394
+ context->handle->opaque = (void *) context;
395
+
396
+ return handle;
397
+ }
398
+
399
+ static void
400
+ bare_ffmpeg_format_context_close_output(
401
+ js_env_t *env,
402
+ js_receiver_t,
403
+ js_arraybuffer_span_of_t<bare_ffmpeg_format_context_t, 1> context
404
+ ) {
405
+ avformat_free_context(context->handle);
406
+ }
407
+
408
+ static js_array_t
409
+ bare_ffmpeg_format_context_get_streams(
410
+ js_env_t *env,
411
+ js_receiver_t,
412
+ js_arraybuffer_span_of_t<bare_ffmpeg_format_context_t, 1> context
413
+ ) {
414
+ int err;
415
+
416
+ uint32_t len = context->handle->nb_streams;
417
+
418
+ js_array_t result;
419
+ err = js_create_array(env, len, result);
420
+ assert(err == 0);
421
+
422
+ for (uint32_t i = 0; i < len; i++) {
423
+ js_arraybuffer_t handle;
424
+
425
+ bare_ffmpeg_stream_t *stream;
426
+ err = js_create_arraybuffer(env, stream, handle);
427
+ assert(err == 0);
428
+
429
+ stream->handle = context->handle->streams[i];
430
+
431
+ err = js_set_element(env, result, i, handle);
432
+ assert(err == 0);
433
+ }
434
+
435
+ return result;
436
+ }
437
+
438
+ static int
439
+ bare_ffmpeg_format_context_get_best_stream_index(
440
+ js_env_t *env,
441
+ js_receiver_t,
442
+ js_arraybuffer_span_of_t<bare_ffmpeg_format_context_t, 1> context,
443
+ int32_t type
444
+ ) {
445
+ auto i = av_find_best_stream(context->handle, static_cast<AVMediaType>(type), -1, -1, NULL, 0);
446
+
447
+ if (i < 0) i = -1;
448
+
449
+ return i;
450
+ }
451
+
452
+ static js_arraybuffer_t
453
+ bare_ffmpeg_format_context_create_stream(
454
+ js_env_t *env,
455
+ js_receiver_t,
456
+ js_arraybuffer_span_of_t<bare_ffmpeg_format_context_t, 1> context
457
+ ) {
458
+ int err;
459
+
460
+ js_arraybuffer_t handle;
461
+
462
+ bare_ffmpeg_stream_t *stream;
463
+ err = js_create_arraybuffer(env, stream, handle);
464
+ assert(err == 0);
465
+
466
+ stream->handle = avformat_new_stream(context->handle, NULL);
467
+
468
+ return handle;
469
+ }
470
+
471
+ static bool
472
+ bare_ffmpeg_format_context_read_frame(
473
+ js_env_t *env,
474
+ js_receiver_t,
475
+ js_arraybuffer_span_of_t<bare_ffmpeg_format_context_t, 1> context,
476
+ js_arraybuffer_span_of_t<bare_ffmpeg_packet_t, 1> packet
477
+ ) {
478
+ int err;
479
+
480
+ av_packet_unref(packet->handle);
481
+
482
+ err = av_read_frame(context->handle, packet->handle);
483
+ if (err < 0 && err != AVERROR(EAGAIN) && err != AVERROR_EOF) {
484
+ err = js_throw_error(env, NULL, av_err2str(err));
485
+ assert(err == 0);
486
+
487
+ throw js_pending_exception;
488
+ }
489
+
490
+ return err == 0;
491
+ }
492
+
493
+ static bool
494
+ bare_ffmpeg_format_context_write_header(
495
+ js_env_t *env,
496
+ js_receiver_t,
497
+ js_arraybuffer_span_of_t<bare_ffmpeg_format_context_t, 1> context,
498
+ std::optional<js_arraybuffer_span_of_t<bare_ffmpeg_dictionary_t, 1>> muxer_options
499
+ ) {
500
+ int err;
501
+
502
+ if (!muxer_options) {
503
+ err = avformat_write_header(context->handle, NULL);
504
+ } else {
505
+ auto dict = *muxer_options;
506
+ err = avformat_write_header(context->handle, &dict->handle);
507
+
508
+ const AVDictionaryEntry *option = NULL;
509
+ while ((option = av_dict_iterate(dict->handle, option))) {
510
+ av_log(context->handle, AV_LOG_WARNING, "Ignored option key='%s' value='%s'\n", option->key, option->value);
511
+ }
512
+ }
513
+
514
+ if (err < 0) {
515
+ err = js_throw_error(env, NULL, av_err2str(err));
516
+ assert(err == 0);
517
+
518
+ throw js_pending_exception;
519
+ }
520
+
521
+ return err;
522
+ }
523
+ static void
524
+ bare_ffmpeg_format_context_write_frame(
525
+ js_env_t *env,
526
+ js_receiver_t,
527
+ js_arraybuffer_span_of_t<bare_ffmpeg_format_context_t, 1> context,
528
+ js_arraybuffer_span_of_t<bare_ffmpeg_packet_t, 1> packet
529
+ ) {
530
+ int err = av_interleaved_write_frame(context->handle, packet->handle);
531
+
532
+ if (err < 0) {
533
+ err = js_throw_error(env, NULL, av_err2str(err));
534
+ assert(err == 0);
535
+
536
+ throw js_pending_exception;
537
+ }
538
+ }
539
+
540
+ static void
541
+ bare_ffmpeg_format_context_write_trailer(
542
+ js_env_t *env,
543
+ js_receiver_t,
544
+ js_arraybuffer_span_of_t<bare_ffmpeg_format_context_t, 1> context
545
+ ) {
546
+ int err = av_write_trailer(context->handle);
547
+ if (err < 0) {
548
+ err = js_throw_error(env, NULL, av_err2str(err));
549
+ assert(err == 0);
550
+
551
+ throw js_pending_exception;
552
+ }
553
+ }
554
+
555
+ static void
556
+ bare_ffmpeg_format_context_dump(
557
+ js_env_t *env,
558
+ js_receiver_t,
559
+ js_arraybuffer_span_of_t<bare_ffmpeg_format_context_t, 1> context,
560
+ bool is_output,
561
+ int32_t index,
562
+ std::string url
563
+ ) {
564
+ av_dump_format(context->handle, index, url.c_str(), is_output);
565
+
566
+ for (int i = 0; i < context->handle->nb_streams; i++) {
567
+ auto stream = context->handle->streams[i];
568
+ av_log(NULL, AV_LOG_INFO, " - stream=%i timebase=(%i / %i)\n", i, stream->time_base.num, stream->time_base.den);
569
+ }
570
+ }
571
+
572
+ static int32_t
573
+ bare_ffmpeg_stream_get_index(
574
+ js_env_t *env,
575
+ js_receiver_t,
576
+ js_arraybuffer_span_of_t<bare_ffmpeg_stream_t, 1> stream
577
+ ) {
578
+ return stream->handle->index;
579
+ }
580
+
581
+ static int32_t
582
+ bare_ffmpeg_stream_get_id(
583
+ js_env_t *env,
584
+ js_receiver_t,
585
+ js_arraybuffer_span_of_t<bare_ffmpeg_stream_t, 1> stream
586
+ ) {
587
+ return stream->handle->id;
588
+ }
589
+
590
+ static void
591
+ bare_ffmpeg_stream_set_id(
592
+ js_env_t *env,
593
+ js_receiver_t,
594
+ js_arraybuffer_span_of_t<bare_ffmpeg_stream_t, 1> stream,
595
+ int32_t id
596
+ ) {
597
+ stream->handle->id = id;
598
+ }
599
+
600
+ static js_arraybuffer_t
601
+ bare_ffmpeg_stream_get_time_base(
602
+ js_env_t *env,
603
+ js_receiver_t,
604
+ js_arraybuffer_span_of_t<bare_ffmpeg_stream_t, 1> stream
605
+ ) {
606
+ int err;
607
+
608
+ js_arraybuffer_t result;
609
+
610
+ int32_t *data;
611
+ err = js_create_arraybuffer(env, 2, data, result);
612
+ assert(err == 0);
613
+
614
+ data[0] = stream->handle->time_base.num;
615
+ data[1] = stream->handle->time_base.den;
616
+
617
+ return result;
618
+ }
619
+
620
+ static void
621
+ bare_ffmpeg_stream_set_time_base(
622
+ js_env_t *env,
623
+ js_receiver_t,
624
+ js_arraybuffer_span_of_t<bare_ffmpeg_stream_t, 1> stream,
625
+ int num,
626
+ int den
627
+ ) {
628
+ stream->handle->time_base.num = num;
629
+ stream->handle->time_base.den = den;
630
+ }
631
+
632
+ static js_arraybuffer_t
633
+ bare_ffmpeg_stream_get_avg_framerate(
634
+ js_env_t *env,
635
+ js_receiver_t,
636
+ js_arraybuffer_span_of_t<bare_ffmpeg_stream_t, 1> stream
637
+ ) {
638
+ int err;
639
+
640
+ js_arraybuffer_t result;
641
+
642
+ int32_t *data;
643
+ err = js_create_arraybuffer(env, 2, data, result);
644
+ assert(err == 0);
645
+
646
+ data[0] = stream->handle->avg_frame_rate.num;
647
+ data[1] = stream->handle->avg_frame_rate.den;
648
+
649
+ return result;
650
+ }
651
+
652
+ static void
653
+ bare_ffmpeg_stream_set_avg_framerate(
654
+ js_env_t *env,
655
+ js_receiver_t,
656
+ js_arraybuffer_span_of_t<bare_ffmpeg_stream_t, 1> stream,
657
+ int num,
658
+ int den
659
+ ) {
660
+ stream->handle->avg_frame_rate.num = num;
661
+ stream->handle->avg_frame_rate.den = den;
662
+ }
663
+
664
+ static js_arraybuffer_t
665
+ bare_ffmpeg_stream_get_codec_parameters(
666
+ js_env_t *env,
667
+ js_receiver_t,
668
+ js_arraybuffer_span_of_t<bare_ffmpeg_stream_t, 1> stream
669
+ ) {
670
+ int err;
671
+
672
+ js_arraybuffer_t handle;
673
+
674
+ bare_ffmpeg_codec_parameters_t *parameters;
675
+ err = js_create_arraybuffer(env, parameters, handle);
676
+ assert(err == 0);
677
+
678
+ parameters->handle = stream->handle->codecpar;
679
+
680
+ return handle;
681
+ }
682
+
683
+ static js_arraybuffer_t
684
+ bare_ffmpeg_find_decoder_by_id(js_env_t *env, js_receiver_t, uint32_t id) {
685
+ int err;
686
+
687
+ const AVCodec *decoder = avcodec_find_decoder((enum AVCodecID) id);
688
+
689
+ if (decoder == NULL) {
690
+ err = js_throw_errorf(env, NULL, "No decoder found for codec '%d'", id);
691
+ assert(err == 0);
692
+
693
+ throw js_pending_exception;
694
+ }
695
+
696
+ js_arraybuffer_t handle;
697
+
698
+ bare_ffmpeg_codec_t *context;
699
+ err = js_create_arraybuffer(env, context, handle);
700
+ assert(err == 0);
701
+
702
+ context->handle = decoder;
703
+
704
+ return handle;
705
+ }
706
+
707
+ static js_arraybuffer_t
708
+ bare_ffmpeg_find_encoder_by_id(js_env_t *env, js_receiver_t, uint32_t id) {
709
+ int err;
710
+
711
+ const AVCodec *encoder = avcodec_find_encoder((enum AVCodecID) id);
712
+
713
+ if (encoder == NULL) {
714
+ err = js_throw_errorf(env, NULL, "No encoder found for codec '%d'", id);
715
+ assert(err == 0);
716
+
717
+ throw js_pending_exception;
718
+ }
719
+
720
+ js_arraybuffer_t handle;
721
+
722
+ bare_ffmpeg_codec_t *context;
723
+ err = js_create_arraybuffer(env, context, handle);
724
+ assert(err == 0);
725
+
726
+ context->handle = encoder;
727
+
728
+ return handle;
729
+ }
730
+
731
+ static std::string
732
+ bare_ffmpeg_get_codec_name_by_id(js_env_t *env, js_receiver_t, uint32_t id) {
733
+ auto name = avcodec_get_name((enum AVCodecID) id);
734
+
735
+ return std::string(name);
736
+ }
737
+
738
+ static js_arraybuffer_t
739
+ bare_ffmpeg_codec_context_init(
740
+ js_env_t *env,
741
+ js_receiver_t,
742
+ js_arraybuffer_span_of_t<bare_ffmpeg_codec_t, 1> codec
743
+ ) {
744
+ int err;
745
+
746
+ js_arraybuffer_t handle;
747
+
748
+ bare_ffmpeg_codec_context_t *context;
749
+ err = js_create_arraybuffer(env, context, handle);
750
+ assert(err == 0);
751
+
752
+ context->handle = avcodec_alloc_context3(codec->handle);
753
+ context->handle->opaque = (void *) context;
754
+
755
+ return handle;
756
+ }
757
+
758
+ static void
759
+ bare_ffmpeg_codec_context_destroy(
760
+ js_env_t *env,
761
+ js_receiver_t,
762
+ js_arraybuffer_span_of_t<bare_ffmpeg_codec_context_t, 1> context
763
+ ) {
764
+ avcodec_free_context(&context->handle);
765
+ }
766
+
767
+ static bool
768
+ bare_ffmpeg_codec_context_open(
769
+ js_env_t *env,
770
+ js_receiver_t,
771
+ js_arraybuffer_span_of_t<bare_ffmpeg_codec_context_t, 1> context
772
+ ) {
773
+ int err;
774
+
775
+ err = avcodec_open2(context->handle, context->handle->codec, NULL);
776
+
777
+ if (err < 0) {
778
+ err = js_throw_error(env, NULL, av_err2str(err));
779
+ assert(err == 0);
780
+
781
+ throw js_pending_exception;
782
+ }
783
+
784
+ return err == 0;
785
+ }
786
+
787
+ static int32_t
788
+ bare_ffmpeg_codec_context_get_flags(
789
+ js_env_t *env,
790
+ js_receiver_t,
791
+ js_arraybuffer_span_of_t<bare_ffmpeg_codec_context_t, 1> context
792
+ ) {
793
+ return context->handle->flags;
794
+ }
795
+
796
+ static void
797
+ bare_ffmpeg_codec_context_set_flags(
798
+ js_env_t *env,
799
+ js_receiver_t,
800
+ js_arraybuffer_span_of_t<bare_ffmpeg_codec_context_t, 1> context,
801
+ int32_t value
802
+ ) {
803
+ context->handle->flags = value;
804
+ }
805
+
806
+ static int64_t
807
+ bare_ffmpeg_frame_get_format(
808
+ js_env_t *env,
809
+ js_receiver_t,
810
+ js_arraybuffer_span_of_t<bare_ffmpeg_frame_t, 1> frame
811
+ ) {
812
+ return frame->handle->format;
813
+ }
814
+
815
+ static void
816
+ bare_ffmpeg_frame_set_format(
817
+ js_env_t *env,
818
+ js_receiver_t,
819
+ js_arraybuffer_span_of_t<bare_ffmpeg_frame_t, 1> frame,
820
+ int format
821
+ ) {
822
+ frame->handle->format = format;
823
+ }
824
+
825
+ static js_arraybuffer_t
826
+ bare_ffmpeg_frame_get_channel_layout(
827
+ js_env_t *env,
828
+ js_receiver_t,
829
+ js_arraybuffer_span_of_t<bare_ffmpeg_frame_t, 1> frame
830
+ ) {
831
+ int err;
832
+
833
+ js_arraybuffer_t result;
834
+
835
+ bare_ffmpeg_channel_layout_t *layout;
836
+ err = js_create_arraybuffer(env, layout, result);
837
+ assert(err == 0);
838
+
839
+ err = av_channel_layout_copy(&layout->handle, &frame->handle->ch_layout);
840
+ assert(err == 0);
841
+
842
+ return result;
843
+ }
844
+
845
+ static void
846
+ bare_ffmpeg_frame_set_channel_layout(
847
+ js_env_t *env,
848
+ js_receiver_t,
849
+ js_arraybuffer_span_of_t<bare_ffmpeg_frame_t, 1> frame,
850
+ js_arraybuffer_span_of_t<bare_ffmpeg_channel_layout_t, 1> layout
851
+ ) {
852
+ int err;
853
+
854
+ err = av_channel_layout_copy(&frame->handle->ch_layout, &layout->handle);
855
+ assert(err == 0);
856
+ }
857
+
858
+ static bool
859
+ bare_ffmpeg_codec_context_open_with_options(
860
+ js_env_t *env,
861
+ js_receiver_t,
862
+ js_arraybuffer_span_of_t<bare_ffmpeg_codec_context_t, 1> context,
863
+ js_arraybuffer_span_of_t<bare_ffmpeg_dictionary_t, 1> options
864
+ ) {
865
+ int err;
866
+
867
+ err = avcodec_open2(context->handle, context->handle->codec, &options->handle);
868
+ if (err < 0) {
869
+ err = js_throw_error(env, NULL, av_err2str(err));
870
+ assert(err == 0);
871
+
872
+ throw js_pending_exception;
873
+ }
874
+
875
+ return err == 0;
876
+ }
877
+
878
+ static int64_t
879
+ bare_ffmpeg_codec_context_get_pixel_format(
880
+ js_env_t *env,
881
+ js_receiver_t,
882
+ js_arraybuffer_span_of_t<bare_ffmpeg_codec_context_t, 1> context
883
+ ) {
884
+ return context->handle->pix_fmt;
885
+ }
886
+
887
+ static void
888
+ bare_ffmpeg_codec_context_set_pixel_format(
889
+ js_env_t *env,
890
+ js_receiver_t,
891
+ js_arraybuffer_span_of_t<bare_ffmpeg_codec_context_t, 1> context,
892
+ int32_t value
893
+ ) {
894
+ context->handle->pix_fmt = static_cast<AVPixelFormat>(value);
895
+ }
896
+
897
+ static int64_t
898
+ bare_ffmpeg_codec_context_get_width(
899
+ js_env_t *env,
900
+ js_receiver_t,
901
+ js_arraybuffer_span_of_t<bare_ffmpeg_codec_context_t, 1> context
902
+ ) {
903
+ return context->handle->width;
904
+ }
905
+
906
+ static void
907
+ bare_ffmpeg_codec_context_set_width(
908
+ js_env_t *env,
909
+ js_receiver_t,
910
+ js_arraybuffer_span_of_t<bare_ffmpeg_codec_context_t, 1> context,
911
+ int value
912
+ ) {
913
+ context->handle->width = value;
914
+ }
915
+
916
+ static int64_t
917
+ bare_ffmpeg_codec_context_get_height(
918
+ js_env_t *env,
919
+ js_receiver_t,
920
+ js_arraybuffer_span_of_t<bare_ffmpeg_codec_context_t, 1> context
921
+ ) {
922
+ return context->handle->height;
923
+ }
924
+
925
+ static void
926
+ bare_ffmpeg_codec_context_set_height(
927
+ js_env_t *env,
928
+ js_receiver_t,
929
+ js_arraybuffer_span_of_t<bare_ffmpeg_codec_context_t, 1> context,
930
+ int value
931
+ ) {
932
+ context->handle->height = value;
933
+ }
934
+
935
+ static int64_t
936
+ bare_ffmpeg_codec_context_get_sample_format(
937
+ js_env_t *env,
938
+ js_receiver_t,
939
+ js_arraybuffer_span_of_t<bare_ffmpeg_codec_context_t, 1> context
940
+ ) {
941
+ return context->handle->sample_fmt;
942
+ }
943
+
944
+ static void
945
+ bare_ffmpeg_codec_context_set_sample_format(
946
+ js_env_t *env,
947
+ js_receiver_t,
948
+ js_arraybuffer_span_of_t<bare_ffmpeg_codec_context_t, 1> context,
949
+ int32_t value
950
+ ) {
951
+ context->handle->sample_fmt = static_cast<AVSampleFormat>(value);
952
+ }
953
+
954
+ static js_arraybuffer_t
955
+ bare_ffmpeg_codec_context_get_time_base(
956
+ js_env_t *env,
957
+ js_receiver_t,
958
+ js_arraybuffer_span_of_t<bare_ffmpeg_codec_context_t, 1> context
959
+ ) {
960
+ int err;
961
+
962
+ js_arraybuffer_t result;
963
+
964
+ int32_t *data;
965
+ err = js_create_arraybuffer(env, 2, data, result);
966
+ assert(err == 0);
967
+
968
+ data[0] = context->handle->time_base.num;
969
+ data[1] = context->handle->time_base.den;
970
+
971
+ return result;
972
+ }
973
+
974
+ static void
975
+ bare_ffmpeg_codec_context_set_time_base(
976
+ js_env_t *env,
977
+ js_receiver_t,
978
+ js_arraybuffer_span_of_t<bare_ffmpeg_codec_context_t, 1> context,
979
+ int num,
980
+ int den
981
+ ) {
982
+ context->handle->time_base.num = num;
983
+ context->handle->time_base.den = den;
984
+ }
985
+
986
+ static js_arraybuffer_t
987
+ bare_ffmpeg_codec_context_get_channel_layout(
988
+ js_env_t *env,
989
+ js_receiver_t,
990
+ js_arraybuffer_span_of_t<bare_ffmpeg_codec_context_t, 1> context
991
+ ) {
992
+ int err;
993
+
994
+ js_arraybuffer_t result;
995
+
996
+ bare_ffmpeg_channel_layout_t *layout;
997
+ err = js_create_arraybuffer(env, layout, result);
998
+ assert(err == 0);
999
+
1000
+ err = av_channel_layout_copy(&layout->handle, &context->handle->ch_layout);
1001
+ assert(err == 0);
1002
+
1003
+ return result;
1004
+ }
1005
+
1006
+ static void
1007
+ bare_ffmpeg_codec_context_set_channel_layout(
1008
+ js_env_t *env,
1009
+ js_receiver_t,
1010
+ js_arraybuffer_span_of_t<bare_ffmpeg_codec_context_t, 1> context,
1011
+ js_arraybuffer_span_of_t<bare_ffmpeg_channel_layout_t, 1> layout
1012
+ ) {
1013
+ int err;
1014
+
1015
+ err = av_channel_layout_copy(&context->handle->ch_layout, &layout->handle);
1016
+ assert(err == 0);
1017
+ }
1018
+
1019
+ static int
1020
+ bare_ffmpeg_codec_context_get_sample_rate(
1021
+ js_env_t *env,
1022
+ js_receiver_t,
1023
+ js_arraybuffer_span_of_t<bare_ffmpeg_codec_context_t, 1> context
1024
+ ) {
1025
+ return context->handle->sample_rate;
1026
+ }
1027
+
1028
+ static void
1029
+ bare_ffmpeg_codec_context_set_sample_rate(
1030
+ js_env_t *env,
1031
+ js_receiver_t,
1032
+ js_arraybuffer_span_of_t<bare_ffmpeg_codec_context_t, 1> context,
1033
+ int32_t sample_rate
1034
+ ) {
1035
+ context->handle->sample_rate = sample_rate;
1036
+ }
1037
+
1038
+ static int
1039
+ bare_ffmpeg_codec_context_get_gop_size(
1040
+ js_env_t *env,
1041
+ js_receiver_t,
1042
+ js_arraybuffer_span_of_t<bare_ffmpeg_codec_context_t, 1> context
1043
+ ) {
1044
+ return context->handle->gop_size;
1045
+ }
1046
+
1047
+ static void
1048
+ bare_ffmpeg_codec_context_set_gop_size(
1049
+ js_env_t *env,
1050
+ js_receiver_t,
1051
+ js_arraybuffer_span_of_t<bare_ffmpeg_codec_context_t, 1> context,
1052
+ int32_t gop_size
1053
+ ) {
1054
+ context->handle->gop_size = gop_size;
1055
+ }
1056
+
1057
+ static js_arraybuffer_t
1058
+ bare_ffmpeg_codec_context_get_framerate(
1059
+ js_env_t *env,
1060
+ js_receiver_t,
1061
+ js_arraybuffer_span_of_t<bare_ffmpeg_codec_context_t, 1> context
1062
+ ) {
1063
+ int err;
1064
+
1065
+ js_arraybuffer_t result;
1066
+
1067
+ int32_t *data;
1068
+ err = js_create_arraybuffer(env, 2, data, result);
1069
+ assert(err == 0);
1070
+
1071
+ data[0] = context->handle->framerate.num;
1072
+ data[1] = context->handle->framerate.den;
1073
+
1074
+ return result;
1075
+ }
1076
+
1077
+ static void
1078
+ bare_ffmpeg_codec_context_set_framerate(
1079
+ js_env_t *env,
1080
+ js_receiver_t,
1081
+ js_arraybuffer_span_of_t<bare_ffmpeg_codec_context_t, 1> context,
1082
+ int num,
1083
+ int den
1084
+ ) {
1085
+ context->handle->framerate.num = num;
1086
+ context->handle->framerate.den = den;
1087
+ }
1088
+
1089
+ static bool
1090
+ bare_ffmpeg_codec_context_send_packet(
1091
+ js_env_t *env,
1092
+ js_receiver_t,
1093
+ js_arraybuffer_span_of_t<bare_ffmpeg_codec_context_t, 1> context,
1094
+ js_arraybuffer_span_of_t<bare_ffmpeg_packet_t, 1> packet
1095
+ ) {
1096
+ int err;
1097
+
1098
+ err = avcodec_send_packet(context->handle, packet->handle);
1099
+ if (err < 0 && err != AVERROR(EAGAIN) && err != AVERROR_EOF) {
1100
+ err = js_throw_error(env, NULL, av_err2str(err));
1101
+ assert(err == 0);
1102
+
1103
+ throw js_pending_exception;
1104
+ }
1105
+
1106
+ return err == 0;
1107
+ }
1108
+
1109
+ static bool
1110
+ bare_ffmpeg_codec_context_receive_packet(
1111
+ js_env_t *env,
1112
+ js_receiver_t,
1113
+ js_arraybuffer_span_of_t<bare_ffmpeg_codec_context_t, 1> context,
1114
+ js_arraybuffer_span_of_t<bare_ffmpeg_packet_t, 1> packet
1115
+ ) {
1116
+ int err;
1117
+
1118
+ err = avcodec_receive_packet(context->handle, packet->handle);
1119
+ if (err < 0 && err != AVERROR(EAGAIN) && err != AVERROR_EOF) {
1120
+ err = js_throw_error(env, NULL, av_err2str(err));
1121
+ assert(err == 0);
1122
+
1123
+ throw js_pending_exception;
1124
+ }
1125
+
1126
+ return err == 0;
1127
+ }
1128
+
1129
+ static bool
1130
+ bare_ffmpeg_codec_context_send_frame(
1131
+ js_env_t *env,
1132
+ js_receiver_t,
1133
+ js_arraybuffer_span_of_t<bare_ffmpeg_codec_context_t, 1> context,
1134
+ std::optional<js_arraybuffer_span_of_t<bare_ffmpeg_frame_t, 1>> frame
1135
+ ) {
1136
+ int err;
1137
+
1138
+ if (frame) {
1139
+ err = avcodec_send_frame(context->handle, (*frame)->handle);
1140
+ } else {
1141
+ err = avcodec_send_frame(context->handle, NULL); // End of stream
1142
+ }
1143
+
1144
+ if (err < 0 && err != AVERROR(EAGAIN) && err != AVERROR_EOF) {
1145
+ err = js_throw_error(env, NULL, av_err2str(err));
1146
+ assert(err == 0);
1147
+
1148
+ throw js_pending_exception;
1149
+ }
1150
+
1151
+ return err == 0;
1152
+ }
1153
+
1154
+ static bool
1155
+ bare_ffmpeg_codec_context_receive_frame(
1156
+ js_env_t *env,
1157
+ js_receiver_t,
1158
+ js_arraybuffer_span_of_t<bare_ffmpeg_codec_context_t, 1> context,
1159
+ js_arraybuffer_span_of_t<bare_ffmpeg_frame_t, 1> frame
1160
+ ) {
1161
+ int err;
1162
+
1163
+ err = avcodec_receive_frame(context->handle, frame->handle);
1164
+ if (err < 0 && err != AVERROR(EAGAIN) && err != AVERROR_EOF) {
1165
+ err = js_throw_error(env, NULL, av_err2str(err));
1166
+ assert(err == 0);
1167
+
1168
+ throw js_pending_exception;
1169
+ }
1170
+
1171
+ return err == 0;
1172
+ }
1173
+
1174
+ static void
1175
+ bare_ffmpeg_codec_parameters_from_context(
1176
+ js_env_t *env,
1177
+ js_receiver_t,
1178
+ js_arraybuffer_span_of_t<bare_ffmpeg_codec_parameters_t, 1> parameters,
1179
+ js_arraybuffer_span_of_t<bare_ffmpeg_codec_context_t, 1> context
1180
+ ) {
1181
+ int err;
1182
+
1183
+ err = avcodec_parameters_from_context(parameters->handle, context->handle);
1184
+
1185
+ if (err < 0) {
1186
+ err = js_throw_error(env, NULL, av_err2str(err));
1187
+ assert(err == 0);
1188
+
1189
+ throw js_pending_exception;
1190
+ }
1191
+ }
1192
+
1193
+ static void
1194
+ bare_ffmpeg_codec_parameters_to_context(
1195
+ js_env_t *env,
1196
+ js_receiver_t,
1197
+ js_arraybuffer_span_of_t<bare_ffmpeg_codec_context_t, 1> context,
1198
+ js_arraybuffer_span_of_t<bare_ffmpeg_codec_parameters_t, 1> parameters
1199
+ ) {
1200
+ int err;
1201
+
1202
+ err = avcodec_parameters_to_context(context->handle, parameters->handle);
1203
+ if (err < 0) {
1204
+ err = js_throw_error(env, NULL, av_err2str(err));
1205
+ assert(err == 0);
1206
+
1207
+ throw js_pending_exception;
1208
+ }
1209
+ }
1210
+
1211
+ static int64_t
1212
+ bare_ffmpeg_codec_parameters_get_bit_rate(
1213
+ js_env_t *env,
1214
+ js_receiver_t,
1215
+ js_arraybuffer_span_of_t<bare_ffmpeg_codec_parameters_t, 1> parameters
1216
+ ) {
1217
+ return parameters->handle->bit_rate;
1218
+ }
1219
+
1220
+ static void
1221
+ bare_ffmpeg_codec_parameters_set_bit_rate(
1222
+ js_env_t *env,
1223
+ js_receiver_t,
1224
+ js_arraybuffer_span_of_t<bare_ffmpeg_codec_parameters_t, 1> parameters,
1225
+ int64_t bit_rate
1226
+ ) {
1227
+ parameters->handle->bit_rate = bit_rate;
1228
+ }
1229
+
1230
+ static int
1231
+ bare_ffmpeg_codec_parameters_get_bits_per_coded_sample(
1232
+ js_env_t *env,
1233
+ js_receiver_t,
1234
+ js_arraybuffer_span_of_t<bare_ffmpeg_codec_parameters_t, 1> parameters
1235
+ ) {
1236
+ return parameters->handle->bits_per_coded_sample;
1237
+ }
1238
+
1239
+ static void
1240
+ bare_ffmpeg_codec_parameters_set_bits_per_coded_sample(
1241
+ js_env_t *env,
1242
+ js_receiver_t,
1243
+ js_arraybuffer_span_of_t<bare_ffmpeg_codec_parameters_t, 1> parameters,
1244
+ int bits
1245
+ ) {
1246
+ parameters->handle->bits_per_coded_sample = bits;
1247
+ }
1248
+
1249
+ static int
1250
+ bare_ffmpeg_codec_parameters_get_bits_per_raw_sample(
1251
+ js_env_t *env,
1252
+ js_receiver_t,
1253
+ js_arraybuffer_span_of_t<bare_ffmpeg_codec_parameters_t, 1> parameters
1254
+ ) {
1255
+ return parameters->handle->bits_per_raw_sample;
1256
+ }
1257
+
1258
+ static void
1259
+ bare_ffmpeg_codec_parameters_set_bits_per_raw_sample(
1260
+ js_env_t *env,
1261
+ js_receiver_t,
1262
+ js_arraybuffer_span_of_t<bare_ffmpeg_codec_parameters_t, 1> parameters,
1263
+ int bits
1264
+ ) {
1265
+ parameters->handle->bits_per_raw_sample = bits;
1266
+ }
1267
+
1268
+ static int
1269
+ bare_ffmpeg_codec_parameters_get_sample_rate(
1270
+ js_env_t *env,
1271
+ js_receiver_t,
1272
+ js_arraybuffer_span_of_t<bare_ffmpeg_codec_parameters_t, 1> parameters
1273
+ ) {
1274
+ return parameters->handle->sample_rate;
1275
+ }
1276
+
1277
+ static void
1278
+ bare_ffmpeg_codec_parameters_set_sample_rate(
1279
+ js_env_t *env,
1280
+ js_receiver_t,
1281
+ js_arraybuffer_span_of_t<bare_ffmpeg_codec_parameters_t, 1> parameters,
1282
+ int rate
1283
+ ) {
1284
+ parameters->handle->sample_rate = rate;
1285
+ }
1286
+
1287
+ static int
1288
+ bare_ffmpeg_codec_parameters_get_nb_channels(
1289
+ js_env_t *env,
1290
+ js_receiver_t,
1291
+ js_arraybuffer_span_of_t<bare_ffmpeg_codec_parameters_t, 1> parameters
1292
+ ) {
1293
+ return parameters->handle->ch_layout.nb_channels;
1294
+ }
1295
+
1296
+ static void
1297
+ bare_ffmpeg_codec_parameters_set_nb_channels(
1298
+ js_env_t *env,
1299
+ js_receiver_t,
1300
+ js_arraybuffer_span_of_t<bare_ffmpeg_codec_parameters_t, 1> parameters,
1301
+ int nb_channels
1302
+ ) {
1303
+ parameters->handle->ch_layout.nb_channels = nb_channels;
1304
+ }
1305
+
1306
+ static int64_t
1307
+ bare_ffmpeg_codec_parameters_get_type(
1308
+ js_env_t *env,
1309
+ js_receiver_t,
1310
+ js_arraybuffer_span_of_t<bare_ffmpeg_codec_parameters_t, 1> parameters
1311
+ ) {
1312
+ return parameters->handle->codec_type;
1313
+ }
1314
+
1315
+ static void
1316
+ bare_ffmpeg_codec_parameters_set_type(
1317
+ js_env_t *env,
1318
+ js_receiver_t,
1319
+ js_arraybuffer_span_of_t<bare_ffmpeg_codec_parameters_t, 1> parameters,
1320
+ int type
1321
+ ) {
1322
+ parameters->handle->codec_type = static_cast<AVMediaType>(type);
1323
+ }
1324
+
1325
+ static uint32_t
1326
+ bare_ffmpeg_codec_parameters_get_tag(
1327
+ js_env_t *env,
1328
+ js_receiver_t,
1329
+ js_arraybuffer_span_of_t<bare_ffmpeg_codec_parameters_t, 1> parameters
1330
+ ) {
1331
+ return parameters->handle->codec_tag;
1332
+ }
1333
+
1334
+ static void
1335
+ bare_ffmpeg_codec_parameters_set_tag(
1336
+ js_env_t *env,
1337
+ js_receiver_t,
1338
+ js_arraybuffer_span_of_t<bare_ffmpeg_codec_parameters_t, 1> parameters,
1339
+ uint32_t codec_tag
1340
+ ) {
1341
+ parameters->handle->codec_tag = codec_tag;
1342
+ }
1343
+
1344
+ static int32_t
1345
+ bare_ffmpeg_codec_parameters_get_id(
1346
+ js_env_t *env,
1347
+ js_receiver_t,
1348
+ js_arraybuffer_span_of_t<bare_ffmpeg_codec_parameters_t, 1> parameters
1349
+ ) {
1350
+ return parameters->handle->codec_id;
1351
+ }
1352
+
1353
+ static void
1354
+ bare_ffmpeg_codec_parameters_set_id(
1355
+ js_env_t *env,
1356
+ js_receiver_t,
1357
+ js_arraybuffer_span_of_t<bare_ffmpeg_codec_parameters_t, 1> parameters,
1358
+ uint32_t codec_id
1359
+ ) {
1360
+ parameters->handle->codec_id = static_cast<AVCodecID>(codec_id);
1361
+ }
1362
+
1363
+ static int
1364
+ bare_ffmpeg_codec_parameters_get_level(
1365
+ js_env_t *env,
1366
+ js_receiver_t,
1367
+ js_arraybuffer_span_of_t<bare_ffmpeg_codec_parameters_t, 1> parameters
1368
+ ) {
1369
+ return parameters->handle->level;
1370
+ }
1371
+
1372
+ static void
1373
+ bare_ffmpeg_codec_parameters_set_level(
1374
+ js_env_t *env,
1375
+ js_receiver_t,
1376
+ js_arraybuffer_span_of_t<bare_ffmpeg_codec_parameters_t, 1> parameters,
1377
+ int level
1378
+ ) {
1379
+ parameters->handle->level = level;
1380
+ }
1381
+
1382
+ static int
1383
+ bare_ffmpeg_codec_parameters_get_profile(
1384
+ js_env_t *env,
1385
+ js_receiver_t,
1386
+ js_arraybuffer_span_of_t<bare_ffmpeg_codec_parameters_t, 1> parameters
1387
+ ) {
1388
+ return parameters->handle->profile;
1389
+ }
1390
+
1391
+ static void
1392
+ bare_ffmpeg_codec_parameters_set_profile(
1393
+ js_env_t *env,
1394
+ js_receiver_t,
1395
+ js_arraybuffer_span_of_t<bare_ffmpeg_codec_parameters_t, 1> parameters,
1396
+ int profile
1397
+ ) {
1398
+ parameters->handle->profile = profile;
1399
+ }
1400
+
1401
+ static int
1402
+ bare_ffmpeg_codec_parameters_get_format(
1403
+ js_env_t *env,
1404
+ js_receiver_t,
1405
+ js_arraybuffer_span_of_t<bare_ffmpeg_codec_parameters_t, 1> parameters
1406
+ ) {
1407
+ return parameters->handle->format;
1408
+ }
1409
+
1410
+ static void
1411
+ bare_ffmpeg_codec_parameters_set_format(
1412
+ js_env_t *env,
1413
+ js_receiver_t,
1414
+ js_arraybuffer_span_of_t<bare_ffmpeg_codec_parameters_t, 1> parameters,
1415
+ int format
1416
+ ) {
1417
+ parameters->handle->format = format;
1418
+ }
1419
+
1420
+ static js_arraybuffer_t
1421
+ bare_ffmpeg_codec_parameters_get_channel_layout(
1422
+ js_env_t *env,
1423
+ js_receiver_t,
1424
+ js_arraybuffer_span_of_t<bare_ffmpeg_codec_parameters_t, 1> parameters
1425
+ ) {
1426
+ int err;
1427
+
1428
+ js_arraybuffer_t result;
1429
+
1430
+ bare_ffmpeg_channel_layout_t *layout;
1431
+ err = js_create_arraybuffer(env, layout, result);
1432
+ assert(err == 0);
1433
+
1434
+ err = av_channel_layout_copy(&layout->handle, &parameters->handle->ch_layout);
1435
+ assert(err == 0);
1436
+
1437
+ return result;
1438
+ }
1439
+
1440
+ static void
1441
+ bare_ffmpeg_codec_parameters_set_channel_layout(
1442
+ js_env_t *env,
1443
+ js_receiver_t,
1444
+ js_arraybuffer_span_of_t<bare_ffmpeg_codec_parameters_t, 1> parameters,
1445
+ js_arraybuffer_span_of_t<bare_ffmpeg_channel_layout_t, 1> layout
1446
+ ) {
1447
+ int err;
1448
+
1449
+ err = av_channel_layout_copy(&parameters->handle->ch_layout, &layout->handle);
1450
+ assert(err == 0);
1451
+ }
1452
+
1453
+ static int
1454
+ bare_ffmpeg_codec_parameters_get_width(
1455
+ js_env_t *env,
1456
+ js_receiver_t,
1457
+ js_arraybuffer_span_of_t<bare_ffmpeg_codec_parameters_t, 1> parameters
1458
+ ) {
1459
+ return parameters->handle->width;
1460
+ }
1461
+
1462
+ static void
1463
+ bare_ffmpeg_codec_parameters_set_width(
1464
+ js_env_t *env,
1465
+ js_receiver_t,
1466
+ js_arraybuffer_span_of_t<bare_ffmpeg_codec_parameters_t, 1> parameters,
1467
+ int width
1468
+ ) {
1469
+ parameters->handle->width = width;
1470
+ }
1471
+
1472
+ static int32_t
1473
+ bare_ffmpeg_codec_parameters_get_height(
1474
+ js_env_t *env,
1475
+ js_receiver_t,
1476
+ js_arraybuffer_span_of_t<bare_ffmpeg_codec_parameters_t, 1> parameters
1477
+ ) {
1478
+ return parameters->handle->height;
1479
+ }
1480
+
1481
+ static void
1482
+ bare_ffmpeg_codec_parameters_set_height(
1483
+ js_env_t *env,
1484
+ js_receiver_t,
1485
+ js_arraybuffer_span_of_t<bare_ffmpeg_codec_parameters_t, 1> parameters,
1486
+ int height
1487
+ ) {
1488
+ parameters->handle->height = height;
1489
+ }
1490
+
1491
+ static js_arraybuffer_t
1492
+ bare_ffmpeg_codec_parameters_get_framerate(
1493
+ js_env_t *env,
1494
+ js_receiver_t,
1495
+ js_arraybuffer_span_of_t<bare_ffmpeg_codec_parameters_t, 1> parameters
1496
+ ) {
1497
+ int err;
1498
+
1499
+ js_arraybuffer_t result;
1500
+
1501
+ int32_t *data;
1502
+ err = js_create_arraybuffer(env, 2, data, result);
1503
+ assert(err == 0);
1504
+
1505
+ data[0] = parameters->handle->framerate.num;
1506
+ data[1] = parameters->handle->framerate.den;
1507
+
1508
+ return result;
1509
+ }
1510
+
1511
+ static void
1512
+ bare_ffmpeg_codec_parameters_set_framerate(
1513
+ js_env_t *env,
1514
+ js_receiver_t,
1515
+ js_arraybuffer_span_of_t<bare_ffmpeg_codec_parameters_t, 1> parameters,
1516
+ int numerator,
1517
+ int denominator
1518
+ ) {
1519
+ parameters->handle->framerate.num = numerator;
1520
+ parameters->handle->framerate.den = denominator;
1521
+ }
1522
+
1523
+ static js_arraybuffer_t
1524
+ bare_ffmpeg_codec_parameters_get_extra_data(
1525
+ js_env_t *env,
1526
+ js_receiver_t,
1527
+ js_arraybuffer_span_of_t<bare_ffmpeg_codec_parameters_t, 1> parameters
1528
+ ) {
1529
+ int err;
1530
+
1531
+ js_arraybuffer_t buffer;
1532
+
1533
+ assert(parameters->handle->extradata_size >= 0);
1534
+
1535
+ err = js_create_arraybuffer(
1536
+ env,
1537
+ parameters->handle->extradata,
1538
+ static_cast<size_t>(parameters->handle->extradata_size),
1539
+ buffer
1540
+ );
1541
+ assert(err == 0);
1542
+
1543
+ return buffer;
1544
+ }
1545
+
1546
+ void
1547
+ bare_ffmpeg_codec_parameters_set_extra_data(
1548
+ js_env_t *env,
1549
+ js_receiver_t,
1550
+ js_arraybuffer_span_of_t<bare_ffmpeg_codec_parameters_t, 1> parameters,
1551
+ js_arraybuffer_t buffer,
1552
+ uint32_t offset,
1553
+ uint32_t len
1554
+ ) {
1555
+ int err;
1556
+
1557
+ std::span<uint8_t> view;
1558
+
1559
+ err = js_get_arraybuffer_info(env, buffer, view);
1560
+ assert(err == 0);
1561
+
1562
+ if (parameters->handle->extradata_size) {
1563
+ assert(parameters->handle->extradata_size > 0);
1564
+ assert(parameters->handle->extradata);
1565
+
1566
+ av_free(parameters->handle->extradata);
1567
+ }
1568
+
1569
+ size_t min_size = len + AV_INPUT_BUFFER_PADDING_SIZE;
1570
+
1571
+ parameters->handle->extradata = reinterpret_cast<uint8_t *>(av_malloc(min_size));
1572
+ memset(&parameters->handle->extradata[len], 0, AV_INPUT_BUFFER_PADDING_SIZE);
1573
+
1574
+ memcpy(parameters->handle->extradata, &view[offset], len);
1575
+
1576
+ parameters->handle->extradata_size = static_cast<int>(len);
1577
+ }
1578
+
1579
+ static js_arraybuffer_t
1580
+ bare_ffmpeg_frame_init(js_env_t *env, js_receiver_t) {
1581
+ int err;
1582
+
1583
+ js_arraybuffer_t handle;
1584
+
1585
+ bare_ffmpeg_frame_t *frame;
1586
+ err = js_create_arraybuffer(env, frame, handle);
1587
+ assert(err == 0);
1588
+
1589
+ frame->handle = av_frame_alloc();
1590
+ frame->handle->opaque = (void *) frame;
1591
+
1592
+ return handle;
1593
+ }
1594
+
1595
+ static void
1596
+ bare_ffmpeg_frame_unref(
1597
+ js_env_t *env,
1598
+ js_receiver_t,
1599
+ js_arraybuffer_span_of_t<bare_ffmpeg_frame_t, 1> frame
1600
+ ) {
1601
+ av_frame_unref(frame->handle);
1602
+ }
1603
+
1604
+ static void
1605
+ bare_ffmpeg_frame_destroy(
1606
+ js_env_t *env,
1607
+ js_receiver_t,
1608
+ js_arraybuffer_span_of_t<bare_ffmpeg_frame_t, 1> frame
1609
+ ) {
1610
+ av_frame_free(&frame->handle);
1611
+ }
1612
+
1613
+ static int32_t
1614
+ bare_ffmpeg_frame_get_width(
1615
+ js_env_t *env,
1616
+ js_receiver_t,
1617
+ js_arraybuffer_span_of_t<bare_ffmpeg_frame_t, 1> frame
1618
+ ) {
1619
+ return frame->handle->width;
1620
+ }
1621
+
1622
+ static void
1623
+ bare_ffmpeg_frame_set_width(
1624
+ js_env_t *env,
1625
+ js_receiver_t,
1626
+ js_arraybuffer_span_of_t<bare_ffmpeg_frame_t, 1> frame,
1627
+ int32_t width
1628
+ ) {
1629
+ frame->handle->width = width;
1630
+ }
1631
+
1632
+ static int32_t
1633
+ bare_ffmpeg_frame_get_height(
1634
+ js_env_t *env,
1635
+ js_receiver_t,
1636
+ js_arraybuffer_span_of_t<bare_ffmpeg_frame_t, 1> frame
1637
+ ) {
1638
+ return frame->handle->height;
1639
+ }
1640
+
1641
+ static void
1642
+ bare_ffmpeg_frame_set_height(
1643
+ js_env_t *env,
1644
+ js_receiver_t,
1645
+ js_arraybuffer_span_of_t<bare_ffmpeg_frame_t, 1> frame,
1646
+ int32_t height
1647
+ ) {
1648
+ frame->handle->height = height;
1649
+ }
1650
+
1651
+ static int64_t
1652
+ bare_ffmpeg_frame_get_pixel_format(
1653
+ js_env_t *env,
1654
+ js_receiver_t,
1655
+ js_arraybuffer_span_of_t<bare_ffmpeg_frame_t, 1> frame
1656
+ ) {
1657
+ return frame->handle->format;
1658
+ }
1659
+
1660
+ static void
1661
+ bare_ffmpeg_frame_set_pixel_format(
1662
+ js_env_t *env,
1663
+ js_receiver_t,
1664
+ js_arraybuffer_span_of_t<bare_ffmpeg_frame_t, 1> frame,
1665
+ int32_t format
1666
+ ) {
1667
+ frame->handle->format = static_cast<AVPixelFormat>(format);
1668
+ }
1669
+
1670
+ static int32_t
1671
+ bare_ffmpeg_frame_get_nb_samples(
1672
+ js_env_t *env,
1673
+ js_receiver_t,
1674
+ js_arraybuffer_span_of_t<bare_ffmpeg_frame_t, 1> frame
1675
+ ) {
1676
+ return frame->handle->nb_samples;
1677
+ }
1678
+
1679
+ static void
1680
+ bare_ffmpeg_frame_set_nb_samples(
1681
+ js_env_t *env,
1682
+ js_receiver_t,
1683
+ js_arraybuffer_span_of_t<bare_ffmpeg_frame_t, 1> frame,
1684
+ int32_t nb_samples
1685
+ ) {
1686
+ frame->handle->nb_samples = nb_samples;
1687
+ }
1688
+
1689
+ static int32_t
1690
+ bare_ffmpeg_frame_get_pict_type(
1691
+ js_env_t *env,
1692
+ js_receiver_t,
1693
+ js_arraybuffer_span_of_t<bare_ffmpeg_frame_t, 1> frame
1694
+ ) {
1695
+ return frame->handle->pict_type;
1696
+ }
1697
+
1698
+ static int64_t
1699
+ bare_ffmpeg_frame_get_pts(
1700
+ js_env_t *env,
1701
+ js_receiver_t,
1702
+ js_arraybuffer_span_of_t<bare_ffmpeg_frame_t, 1> frame
1703
+ ) {
1704
+ int64_t ts = frame->handle->pts;
1705
+
1706
+ if (ts == AV_NOPTS_VALUE) return -1;
1707
+
1708
+ return ts;
1709
+ }
1710
+
1711
+ static void
1712
+ bare_ffmpeg_frame_set_pts(
1713
+ js_env_t *,
1714
+ js_receiver_t,
1715
+ js_arraybuffer_span_of_t<bare_ffmpeg_frame_t, 1> frame,
1716
+ int64_t value
1717
+ ) {
1718
+ frame->handle->pts = value;
1719
+ }
1720
+
1721
+ static int64_t
1722
+ bare_ffmpeg_frame_get_pkt_dts(
1723
+ js_env_t *env,
1724
+ js_receiver_t,
1725
+ js_arraybuffer_span_of_t<bare_ffmpeg_frame_t, 1> frame
1726
+ ) {
1727
+ int64_t ts = frame->handle->pkt_dts;
1728
+
1729
+ if (ts == AV_NOPTS_VALUE) return -1;
1730
+
1731
+ return ts;
1732
+ }
1733
+
1734
+ static void
1735
+ bare_ffmpeg_frame_set_pkt_dts(
1736
+ js_env_t *,
1737
+ js_receiver_t,
1738
+ js_arraybuffer_span_of_t<bare_ffmpeg_frame_t, 1> frame,
1739
+ int64_t value
1740
+ ) {
1741
+ frame->handle->pkt_dts = value;
1742
+ }
1743
+
1744
+ static js_arraybuffer_t
1745
+ bare_ffmpeg_frame_get_time_base(
1746
+ js_env_t *env,
1747
+ js_receiver_t,
1748
+ js_arraybuffer_span_of_t<bare_ffmpeg_frame_t, 1> frame
1749
+ ) {
1750
+ int err;
1751
+
1752
+ js_arraybuffer_t result;
1753
+
1754
+ int32_t *data;
1755
+ err = js_create_arraybuffer(env, 2, data, result);
1756
+ assert(err == 0);
1757
+
1758
+ data[0] = frame->handle->time_base.num;
1759
+ data[1] = frame->handle->time_base.den;
1760
+
1761
+ return result;
1762
+ }
1763
+ static void
1764
+ bare_ffmpeg_frame_set_time_base(
1765
+ js_env_t *env,
1766
+ js_receiver_t,
1767
+ js_arraybuffer_span_of_t<bare_ffmpeg_frame_t, 1> frame,
1768
+ int num,
1769
+ int den
1770
+ ) {
1771
+ frame->handle->time_base.num = num;
1772
+ frame->handle->time_base.den = den;
1773
+ }
1774
+
1775
+ static void
1776
+ bare_ffmpeg_frame_alloc(
1777
+ js_env_t *env,
1778
+ js_receiver_t,
1779
+ js_arraybuffer_span_of_t<bare_ffmpeg_frame_t, 1> frame,
1780
+ int align
1781
+ ) {
1782
+ int err;
1783
+
1784
+ err = av_frame_get_buffer(frame->handle, align);
1785
+ if (err < 0) {
1786
+ err = js_throw_error(env, NULL, av_err2str(err));
1787
+ assert(err == 0);
1788
+
1789
+ throw js_pending_exception;
1790
+ }
1791
+ }
1792
+
1793
+ static js_arraybuffer_t
1794
+ bare_ffmpeg_image_init(
1795
+ js_env_t *env,
1796
+ js_receiver_t,
1797
+ int32_t pixel_format,
1798
+ int32_t width,
1799
+ int32_t height,
1800
+ int32_t align
1801
+ ) {
1802
+ int err;
1803
+
1804
+ auto len = av_image_get_buffer_size(
1805
+ static_cast<AVPixelFormat>(pixel_format),
1806
+ width,
1807
+ height,
1808
+ align
1809
+ );
1810
+
1811
+ if (len < 0) {
1812
+ err = js_throw_error(env, NULL, av_err2str(len));
1813
+ assert(err == 0);
1814
+
1815
+ throw js_pending_exception;
1816
+ }
1817
+
1818
+ js_arraybuffer_t handle;
1819
+ err = js_create_arraybuffer(env, static_cast<size_t>(len), handle);
1820
+ assert(err == 0);
1821
+
1822
+ return handle;
1823
+ }
1824
+
1825
+ static void
1826
+ bare_ffmpeg_image_fill(
1827
+ js_env_t *env,
1828
+ js_receiver_t,
1829
+ int32_t pixel_format,
1830
+ int32_t width,
1831
+ int32_t height,
1832
+ int32_t align,
1833
+ js_arraybuffer_span_t data,
1834
+ uint64_t offset,
1835
+ js_arraybuffer_span_of_t<bare_ffmpeg_frame_t, 1> frame
1836
+ ) {
1837
+ int err;
1838
+
1839
+ auto len = av_image_fill_arrays(
1840
+ frame->handle->data,
1841
+ frame->handle->linesize,
1842
+ &data[static_cast<size_t>(offset)],
1843
+ static_cast<AVPixelFormat>(pixel_format),
1844
+ width,
1845
+ height,
1846
+ align
1847
+ );
1848
+
1849
+ if (len < 0) {
1850
+ err = js_throw_error(env, NULL, av_err2str(len));
1851
+ assert(err == 0);
1852
+
1853
+ throw js_pending_exception;
1854
+ }
1855
+ }
1856
+
1857
+ static void
1858
+ bare_ffmpeg_image_read(
1859
+ js_env_t *env,
1860
+ js_receiver_t,
1861
+ int32_t pixel_format,
1862
+ int32_t width,
1863
+ int32_t height,
1864
+ int32_t align,
1865
+ js_arraybuffer_span_t data,
1866
+ uint64_t offset,
1867
+ js_arraybuffer_span_of_t<bare_ffmpeg_frame_t, 1> frame
1868
+ ) {
1869
+ uint8_t *dst_data[4];
1870
+ int dst_linesize[4];
1871
+
1872
+ int err = av_image_fill_arrays(
1873
+ dst_data,
1874
+ dst_linesize,
1875
+ &data[offset],
1876
+ static_cast<AVPixelFormat>(pixel_format),
1877
+ width,
1878
+ height,
1879
+ align
1880
+ );
1881
+ assert(err >= 0);
1882
+
1883
+ av_image_copy(
1884
+ dst_data,
1885
+ dst_linesize,
1886
+ frame->handle->data,
1887
+ frame->handle->linesize,
1888
+ static_cast<AVPixelFormat>(pixel_format),
1889
+ width,
1890
+ height
1891
+ );
1892
+ }
1893
+
1894
+ static int
1895
+ bare_ffmpeg_image_get_line_size(
1896
+ js_env_t *env,
1897
+ js_receiver_t,
1898
+ int32_t pixel_format,
1899
+ int32_t width,
1900
+ int32_t plane
1901
+ ) {
1902
+ return av_image_get_linesize(
1903
+ static_cast<AVPixelFormat>(pixel_format),
1904
+ width,
1905
+ plane
1906
+ );
1907
+ }
1908
+
1909
+ static js_arraybuffer_t
1910
+ bare_ffmpeg_samples_init(
1911
+ js_env_t *env,
1912
+ js_receiver_t,
1913
+ int32_t sample_format,
1914
+ int32_t nb_channels,
1915
+ int32_t nb_samples,
1916
+ int32_t align
1917
+ ) {
1918
+ int err;
1919
+
1920
+ auto len = av_samples_get_buffer_size(
1921
+ NULL,
1922
+ nb_channels,
1923
+ nb_samples,
1924
+ static_cast<AVSampleFormat>(sample_format),
1925
+ align
1926
+ );
1927
+
1928
+ if (len < 0) {
1929
+ err = js_throw_error(env, NULL, av_err2str(len));
1930
+ assert(err == 0);
1931
+
1932
+ throw js_pending_exception;
1933
+ }
1934
+
1935
+ js_arraybuffer_t handle;
1936
+ err = js_create_arraybuffer(env, static_cast<size_t>(len), handle);
1937
+ assert(err == 0);
1938
+
1939
+ return handle;
1940
+ }
1941
+
1942
+ static int
1943
+ bare_ffmpeg_samples_fill(
1944
+ js_env_t *env,
1945
+ js_receiver_t,
1946
+ int32_t sample_format,
1947
+ int32_t nb_channels,
1948
+ int32_t nb_samples,
1949
+ int32_t align,
1950
+ js_arraybuffer_span_t data,
1951
+ uint64_t offset,
1952
+ js_arraybuffer_span_of_t<bare_ffmpeg_frame_t, 1> frame
1953
+ ) {
1954
+ int err;
1955
+
1956
+ auto len = av_samples_fill_arrays(
1957
+ frame->handle->data,
1958
+ frame->handle->linesize,
1959
+ &data[static_cast<size_t>(offset)],
1960
+ nb_channels,
1961
+ nb_samples,
1962
+ static_cast<AVSampleFormat>(sample_format),
1963
+ align
1964
+ );
1965
+
1966
+ if (len < 0) {
1967
+ err = js_throw_error(env, NULL, av_err2str(len));
1968
+ assert(err == 0);
1969
+
1970
+ throw js_pending_exception;
1971
+ }
1972
+
1973
+ return len;
1974
+ }
1975
+
1976
+ static js_arraybuffer_t
1977
+ bare_ffmpeg_packet_init(js_env_t *env, js_receiver_t) {
1978
+ int err;
1979
+
1980
+ js_arraybuffer_t handle;
1981
+
1982
+ bare_ffmpeg_packet_t *packet;
1983
+ err = js_create_arraybuffer(env, packet, handle);
1984
+ assert(err == 0);
1985
+
1986
+ packet->handle = av_packet_alloc();
1987
+
1988
+ return handle;
1989
+ }
1990
+
1991
+ static js_arraybuffer_t
1992
+ bare_ffmpeg_packet_init_from_buffer(
1993
+ js_env_t *env,
1994
+ js_receiver_t,
1995
+ js_arraybuffer_span_t data,
1996
+ uint64_t offset,
1997
+ uint64_t len
1998
+ ) {
1999
+ int err;
2000
+
2001
+ AVPacket *pkt = av_packet_alloc();
2002
+
2003
+ err = av_new_packet(pkt, static_cast<int>(len));
2004
+ assert(err == 0);
2005
+
2006
+ memcpy(pkt->data, &data[static_cast<size_t>(offset)], static_cast<size_t>(len));
2007
+
2008
+ js_arraybuffer_t handle;
2009
+
2010
+ bare_ffmpeg_packet_t *packet;
2011
+ err = js_create_arraybuffer(env, packet, handle);
2012
+ assert(err == 0);
2013
+
2014
+ packet->handle = pkt;
2015
+
2016
+ return handle;
2017
+ }
2018
+
2019
+ static void
2020
+ bare_ffmpeg_packet_unref(
2021
+ js_env_t *env,
2022
+ js_receiver_t,
2023
+ js_arraybuffer_span_of_t<bare_ffmpeg_packet_t, 1> packet
2024
+ ) {
2025
+ av_packet_unref(packet->handle);
2026
+ }
2027
+
2028
+ static int32_t
2029
+ bare_ffmpeg_packet_get_stream_index(
2030
+ js_env_t *env,
2031
+ js_receiver_t,
2032
+ js_arraybuffer_span_of_t<bare_ffmpeg_packet_t, 1> packet
2033
+ ) {
2034
+ return packet->handle->stream_index;
2035
+ }
2036
+
2037
+ static void
2038
+ bare_ffmpeg_packet_set_stream_index(
2039
+ js_env_t *env,
2040
+ js_receiver_t,
2041
+ js_arraybuffer_span_of_t<bare_ffmpeg_packet_t, 1> packet,
2042
+ int32_t value
2043
+ ) {
2044
+ packet->handle->stream_index = value;
2045
+ }
2046
+
2047
+ static js_arraybuffer_t
2048
+ bare_ffmpeg_packet_get_data(
2049
+ js_env_t *env,
2050
+ js_receiver_t,
2051
+ js_arraybuffer_span_of_t<bare_ffmpeg_packet_t, 1> packet
2052
+ ) {
2053
+ int err;
2054
+
2055
+ auto size = static_cast<size_t>(packet->handle->size);
2056
+
2057
+ js_arraybuffer_t handle;
2058
+
2059
+ uint8_t *data;
2060
+ err = js_create_arraybuffer(env, size, data, handle);
2061
+ assert(err == 0);
2062
+
2063
+ memcpy(data, packet->handle->data, size);
2064
+
2065
+ return handle;
2066
+ }
2067
+
2068
+ static void
2069
+ bare_ffmpeg_packet_set_data(
2070
+ js_env_t *env,
2071
+ js_receiver_t,
2072
+ js_arraybuffer_span_of_t<bare_ffmpeg_packet_t, 1> packet,
2073
+ js_arraybuffer_span_t data,
2074
+ uint32_t offset,
2075
+ uint32_t len
2076
+ ) {
2077
+ int err;
2078
+ assert(offset + len <= data.size());
2079
+
2080
+ av_packet_unref(packet->handle);
2081
+
2082
+ err = av_new_packet(packet->handle, static_cast<int>(len));
2083
+ assert(err == 0);
2084
+
2085
+ memcpy(packet->handle->data, &data[offset], len);
2086
+ }
2087
+
2088
+ static bool
2089
+ bare_ffmpeg_packet_is_keyframe(
2090
+ js_env_t *,
2091
+ js_receiver_t,
2092
+ js_arraybuffer_span_of_t<bare_ffmpeg_packet_t, 1> packet
2093
+ ) {
2094
+ return packet->handle->flags & AV_PKT_FLAG_KEY;
2095
+ }
2096
+
2097
+ static int64_t
2098
+ bare_ffmpeg_packet_get_dts(
2099
+ js_env_t *env,
2100
+ js_receiver_t,
2101
+ js_arraybuffer_span_of_t<bare_ffmpeg_packet_t, 1> packet
2102
+ ) {
2103
+ int64_t ts = packet->handle->dts;
2104
+
2105
+ if (ts == AV_NOPTS_VALUE) return -1;
2106
+
2107
+ return ts;
2108
+ }
2109
+
2110
+ static void
2111
+ bare_ffmpeg_packet_set_dts(
2112
+ js_env_t *env,
2113
+ js_receiver_t,
2114
+ js_arraybuffer_span_of_t<bare_ffmpeg_packet_t, 1> packet,
2115
+ int64_t value
2116
+ ) {
2117
+ packet->handle->dts = value;
2118
+ }
2119
+
2120
+ static int64_t
2121
+ bare_ffmpeg_packet_get_pts(
2122
+ js_env_t *env,
2123
+ js_receiver_t,
2124
+ js_arraybuffer_span_of_t<bare_ffmpeg_packet_t, 1> packet
2125
+ ) {
2126
+ int64_t ts = packet->handle->pts;
2127
+
2128
+ if (ts == AV_NOPTS_VALUE) return -1;
2129
+
2130
+ return ts;
2131
+ }
2132
+
2133
+ static void
2134
+ bare_ffmpeg_packet_set_pts(
2135
+ js_env_t *env,
2136
+ js_receiver_t,
2137
+ js_arraybuffer_span_of_t<bare_ffmpeg_packet_t, 1> packet,
2138
+ int64_t value
2139
+ ) {
2140
+ packet->handle->pts = value;
2141
+ }
2142
+
2143
+ static js_arraybuffer_t
2144
+ bare_ffmpeg_packet_get_time_base(
2145
+ js_env_t *env,
2146
+ js_receiver_t,
2147
+ js_arraybuffer_span_of_t<bare_ffmpeg_packet_t, 1> packet
2148
+ ) {
2149
+ int err;
2150
+
2151
+ js_arraybuffer_t result;
2152
+
2153
+ int32_t *data;
2154
+ err = js_create_arraybuffer(env, 2, data, result);
2155
+ assert(err == 0);
2156
+
2157
+ data[0] = packet->handle->time_base.num;
2158
+ data[1] = packet->handle->time_base.den;
2159
+
2160
+ return result;
2161
+ }
2162
+
2163
+ static void
2164
+ bare_ffmpeg_packet_set_time_base(
2165
+ js_env_t *env,
2166
+ js_receiver_t,
2167
+ js_arraybuffer_span_of_t<bare_ffmpeg_packet_t, 1> packet,
2168
+ int num,
2169
+ int den
2170
+ ) {
2171
+ packet->handle->time_base.num = num;
2172
+ packet->handle->time_base.den = den;
2173
+ }
2174
+
2175
+ static int64_t
2176
+ bare_ffmpeg_packet_rescale_ts(
2177
+ js_env_t *env,
2178
+ js_arraybuffer_span_of_t<bare_ffmpeg_packet_t, 1> packet,
2179
+ int32_t num,
2180
+ int32_t den
2181
+ ) {
2182
+ AVRational src = packet->handle->time_base;
2183
+ AVRational dst = {.num = num, .den = den};
2184
+
2185
+ if (
2186
+ bad_timebase(src) ||
2187
+ bad_timebase(dst) ||
2188
+ packet->handle->dts == AV_NOPTS_VALUE ||
2189
+ packet->handle->pts == AV_NOPTS_VALUE
2190
+ ) {
2191
+ return false;
2192
+ }
2193
+
2194
+ av_packet_rescale_ts(packet->handle, src, dst);
2195
+
2196
+ packet->handle->time_base = dst;
2197
+
2198
+ return true;
2199
+ }
2200
+
2201
+ static int64_t
2202
+ bare_ffmpeg_packet_get_duration(
2203
+ js_env_t *env,
2204
+ js_receiver_t,
2205
+ js_arraybuffer_span_of_t<bare_ffmpeg_packet_t, 1> packet
2206
+ ) {
2207
+ return packet->handle->duration;
2208
+ }
2209
+
2210
+ static void
2211
+ bare_ffmpeg_packet_set_duration(
2212
+ js_env_t *env,
2213
+ js_receiver_t,
2214
+ js_arraybuffer_span_of_t<bare_ffmpeg_packet_t, 1> packet,
2215
+ int64_t value
2216
+ ) {
2217
+ packet->handle->duration = value;
2218
+ }
2219
+
2220
+ static int32_t
2221
+ bare_ffmpeg_packet_get_flags(
2222
+ js_env_t *env,
2223
+ js_receiver_t,
2224
+ js_arraybuffer_span_of_t<bare_ffmpeg_packet_t, 1> packet
2225
+ ) {
2226
+ return packet->handle->flags;
2227
+ }
2228
+
2229
+ static void
2230
+ bare_ffmpeg_packet_set_flags(
2231
+ js_env_t *env,
2232
+ js_receiver_t,
2233
+ js_arraybuffer_span_of_t<bare_ffmpeg_packet_t, 1> packet,
2234
+ int32_t value
2235
+ ) {
2236
+ packet->handle->flags = value;
2237
+ }
2238
+
2239
+ static js_arraybuffer_t
2240
+ bare_ffmpeg_scaler_init(
2241
+ js_env_t *env,
2242
+ js_receiver_t,
2243
+ int64_t source_format,
2244
+ int32_t source_width,
2245
+ int32_t source_height,
2246
+ int64_t target_format,
2247
+ int32_t target_width,
2248
+ int32_t target_height
2249
+ ) {
2250
+ int err;
2251
+
2252
+ js_arraybuffer_t handle;
2253
+
2254
+ bare_ffmpeg_scaler_t *scaler;
2255
+ err = js_create_arraybuffer(env, scaler, handle);
2256
+ assert(err == 0);
2257
+
2258
+ scaler->handle = sws_getContext(
2259
+ source_width,
2260
+ source_height,
2261
+ static_cast<AVPixelFormat>(source_format),
2262
+ target_width,
2263
+ target_height,
2264
+ static_cast<AVPixelFormat>(target_format),
2265
+ SWS_BICUBIC,
2266
+ NULL,
2267
+ NULL,
2268
+ NULL
2269
+ );
2270
+
2271
+ return handle;
2272
+ }
2273
+
2274
+ static void
2275
+ bare_ffmpeg_scaler_destroy(
2276
+ js_env_t *env,
2277
+ js_receiver_t,
2278
+ js_arraybuffer_span_of_t<bare_ffmpeg_scaler_t, 1> scaler
2279
+ ) {
2280
+ sws_freeContext(scaler->handle);
2281
+ }
2282
+
2283
+ static int
2284
+ bare_ffmpeg_scaler_scale(
2285
+ js_env_t *env,
2286
+ js_receiver_t,
2287
+ js_arraybuffer_span_of_t<bare_ffmpeg_scaler_t, 1> scaler,
2288
+ js_arraybuffer_span_of_t<bare_ffmpeg_frame_t, 1> source,
2289
+ int y,
2290
+ int height,
2291
+ js_arraybuffer_span_of_t<bare_ffmpeg_frame_t, 1> target
2292
+ ) {
2293
+ int err = av_frame_copy_props(target->handle, source->handle);
2294
+ assert(err == 0);
2295
+
2296
+ return sws_scale(
2297
+ scaler->handle,
2298
+ reinterpret_cast<const uint8_t *const *>(source->handle->data),
2299
+ source->handle->linesize,
2300
+ y,
2301
+ height,
2302
+ target->handle->data,
2303
+ target->handle->linesize
2304
+ );
2305
+ }
2306
+
2307
+ static js_arraybuffer_t
2308
+ bare_ffmpeg_dictionary_init(
2309
+ js_env_t *env,
2310
+ js_receiver_t
2311
+ ) {
2312
+ int err;
2313
+
2314
+ js_arraybuffer_t handle;
2315
+
2316
+ bare_ffmpeg_dictionary_t *dict;
2317
+ err = js_create_arraybuffer(env, dict, handle);
2318
+ assert(err == 0);
2319
+
2320
+ dict->handle = NULL;
2321
+
2322
+ return handle;
2323
+ }
2324
+
2325
+ static void
2326
+ bare_ffmpeg_dictionary_destroy(
2327
+ js_env_t *env,
2328
+ js_receiver_t,
2329
+ js_arraybuffer_span_of_t<bare_ffmpeg_dictionary_t, 1> dict
2330
+ ) {
2331
+ av_dict_free(&dict->handle);
2332
+ }
2333
+
2334
+ static void
2335
+ bare_ffmpeg_dictionary_set_entry(
2336
+ js_env_t *env,
2337
+ js_receiver_t,
2338
+ js_arraybuffer_span_of_t<bare_ffmpeg_dictionary_t, 1> dict,
2339
+ std::string key,
2340
+ std::string value
2341
+ ) {
2342
+ int err;
2343
+
2344
+ err = av_dict_set(&dict->handle, key.c_str(), value.c_str(), 0);
2345
+ assert(err == 0);
2346
+ }
2347
+
2348
+ static std::optional<std::string>
2349
+ bare_ffmpeg_dictionary_get_entry(
2350
+ js_env_t *env,
2351
+ js_receiver_t,
2352
+ js_arraybuffer_span_of_t<bare_ffmpeg_dictionary_t, 1> dict,
2353
+ std::string key
2354
+ ) {
2355
+ AVDictionaryEntry *entry = av_dict_get(dict->handle, key.c_str(), NULL, 0);
2356
+
2357
+ if (entry == NULL) {
2358
+ return std::nullopt;
2359
+ }
2360
+
2361
+ return std::string{entry->value};
2362
+ }
2363
+
2364
+ static js_arraybuffer_t
2365
+ bare_ffmpeg_resampler_init(
2366
+ js_env_t *env,
2367
+ js_receiver_t,
2368
+ int32_t in_rate,
2369
+ int32_t in_fmt,
2370
+ js_arraybuffer_span_of_t<bare_ffmpeg_channel_layout_t, 1> in_layout,
2371
+ int32_t out_rate,
2372
+ int32_t out_fmt,
2373
+ js_arraybuffer_span_of_t<bare_ffmpeg_channel_layout_t, 1> out_layout
2374
+ ) {
2375
+ int err;
2376
+
2377
+ js_arraybuffer_t handle;
2378
+
2379
+ bare_ffmpeg_resampler_t *resampler;
2380
+ err = js_create_arraybuffer(env, resampler, handle);
2381
+ assert(err == 0);
2382
+
2383
+ resampler->handle = swr_alloc();
2384
+
2385
+ err = swr_alloc_set_opts2(
2386
+ &resampler->handle,
2387
+ &out_layout->handle,
2388
+ static_cast<AVSampleFormat>(out_fmt),
2389
+ out_rate,
2390
+ &in_layout->handle,
2391
+ static_cast<AVSampleFormat>(in_fmt),
2392
+ in_rate,
2393
+ 0,
2394
+ NULL
2395
+ );
2396
+
2397
+ if (err < 0) {
2398
+ swr_free(&resampler->handle);
2399
+
2400
+ err = js_throw_error(env, NULL, av_err2str(err));
2401
+ assert(err == 0);
2402
+
2403
+ throw js_pending_exception;
2404
+ }
2405
+
2406
+ err = swr_init(resampler->handle);
2407
+ if (err < 0) {
2408
+ swr_free(&resampler->handle);
2409
+
2410
+ err = js_throw_error(env, NULL, av_err2str(err));
2411
+ assert(err == 0);
2412
+
2413
+ throw js_pending_exception;
2414
+ }
2415
+
2416
+ return handle;
2417
+ }
2418
+
2419
+ static int64_t
2420
+ bare_ffmpeg_resampler_convert_frames(
2421
+ js_env_t *env,
2422
+ js_receiver_t,
2423
+ js_arraybuffer_span_of_t<bare_ffmpeg_resampler_t, 1> resampler,
2424
+ js_arraybuffer_span_of_t<bare_ffmpeg_frame_t, 1> in_frame,
2425
+ js_arraybuffer_span_of_t<bare_ffmpeg_frame_t, 1> out_frame
2426
+ ) {
2427
+ int err;
2428
+
2429
+ auto result = swr_convert(
2430
+ resampler->handle,
2431
+ (uint8_t **) out_frame->handle->data,
2432
+ out_frame->handle->nb_samples,
2433
+ (const uint8_t **) in_frame->handle->data,
2434
+ in_frame->handle->nb_samples
2435
+ );
2436
+
2437
+ if (result < 0) {
2438
+ err = js_throw_error(env, NULL, av_err2str(result));
2439
+ assert(err == 0);
2440
+
2441
+ throw js_pending_exception;
2442
+ }
2443
+
2444
+ out_frame->handle->nb_samples = result;
2445
+
2446
+ return result;
2447
+ }
2448
+
2449
+ static int64_t
2450
+ bare_ffmpeg_resampler_get_delay(
2451
+ js_env_t *env,
2452
+ js_receiver_t,
2453
+ js_arraybuffer_span_of_t<bare_ffmpeg_resampler_t, 1> resampler,
2454
+ int64_t base
2455
+ ) {
2456
+ return swr_get_delay(resampler->handle, base);
2457
+ }
2458
+
2459
+ static int64_t
2460
+ bare_ffmpeg_resampler_flush(
2461
+ js_env_t *env,
2462
+ js_receiver_t,
2463
+ js_arraybuffer_span_of_t<bare_ffmpeg_resampler_t, 1> resampler,
2464
+ js_arraybuffer_span_of_t<bare_ffmpeg_frame_t, 1> out_frame
2465
+ ) {
2466
+ int err;
2467
+
2468
+ auto result = swr_convert(
2469
+ resampler->handle,
2470
+ out_frame->handle->data,
2471
+ out_frame->handle->nb_samples,
2472
+ NULL,
2473
+ 0
2474
+ );
2475
+
2476
+ if (result < 0) {
2477
+ err = js_throw_error(env, NULL, av_err2str(result));
2478
+ assert(err == 0);
2479
+
2480
+ throw js_pending_exception;
2481
+ }
2482
+
2483
+ out_frame->handle->nb_samples = result;
2484
+
2485
+ return result;
2486
+ }
2487
+
2488
+ static void
2489
+ bare_ffmpeg_resampler_destroy(
2490
+ js_env_t *env,
2491
+ js_receiver_t,
2492
+ js_arraybuffer_span_of_t<bare_ffmpeg_resampler_t, 1> resampler
2493
+ ) {
2494
+ swr_free(&resampler->handle);
2495
+ }
2496
+
2497
+ static js_arraybuffer_t
2498
+ bare_ffmpeg_channel_layout_copy(
2499
+ js_env_t *env,
2500
+ js_receiver_t,
2501
+ js_arraybuffer_span_of_t<bare_ffmpeg_channel_layout_t, 1> layout
2502
+ ) {
2503
+ int err;
2504
+
2505
+ js_arraybuffer_t result;
2506
+
2507
+ bare_ffmpeg_channel_layout_t *copy;
2508
+ err = js_create_arraybuffer(env, copy, result);
2509
+ assert(err == 0);
2510
+
2511
+ err = av_channel_layout_copy(&copy->handle, &layout->handle);
2512
+ assert(err == 0);
2513
+
2514
+ return result;
2515
+ }
2516
+
2517
+ static int
2518
+ bare_ffmpeg_channel_layout_get_nb_channels(
2519
+ js_env_t *env,
2520
+ js_receiver_t,
2521
+ js_arraybuffer_span_of_t<bare_ffmpeg_channel_layout_t, 1> layout
2522
+ ) {
2523
+ return layout->handle.nb_channels;
2524
+ }
2525
+
2526
+ static uint64_t
2527
+ bare_ffmpeg_channel_layout_get_mask(
2528
+ js_env_t *env,
2529
+ js_receiver_t,
2530
+ js_arraybuffer_span_of_t<bare_ffmpeg_channel_layout_t, 1> layout
2531
+ ) {
2532
+ return layout->handle.u.mask;
2533
+ }
2534
+
2535
+ static js_arraybuffer_t
2536
+ bare_ffmpeg_channel_layout_from_mask(
2537
+ js_env_t *env,
2538
+ js_receiver_t,
2539
+ uint64_t mask
2540
+ ) {
2541
+ int err;
2542
+
2543
+ js_arraybuffer_t result;
2544
+
2545
+ bare_ffmpeg_channel_layout_t *layout;
2546
+ err = js_create_arraybuffer(env, layout, result);
2547
+ assert(err == 0);
2548
+
2549
+ err = av_channel_layout_from_mask(&layout->handle, mask);
2550
+ assert(err == 0);
2551
+
2552
+ return result;
2553
+ }
2554
+
2555
+ static js_arraybuffer_t
2556
+ bare_ffmpeg_audio_fifo_init(
2557
+ js_env_t *env,
2558
+ js_receiver_t,
2559
+ int32_t sample_fmt,
2560
+ int32_t channels,
2561
+ int32_t nb_samples
2562
+ ) {
2563
+ int err;
2564
+
2565
+ js_arraybuffer_t handle;
2566
+
2567
+ bare_ffmpeg_audio_fifo_t *fifo;
2568
+ err = js_create_arraybuffer(env, fifo, handle);
2569
+ assert(err == 0);
2570
+
2571
+ fifo->handle = av_audio_fifo_alloc(
2572
+ static_cast<AVSampleFormat>(sample_fmt),
2573
+ channels,
2574
+ nb_samples
2575
+ );
2576
+
2577
+ return handle;
2578
+ }
2579
+
2580
+ static void
2581
+ bare_ffmpeg_audio_fifo_destroy(
2582
+ js_env_t *env,
2583
+ js_receiver_t,
2584
+ js_arraybuffer_span_of_t<bare_ffmpeg_audio_fifo_t, 1> fifo
2585
+ ) {
2586
+ av_audio_fifo_free(fifo->handle);
2587
+ }
2588
+
2589
+ static int
2590
+ bare_ffmpeg_audio_fifo_write(
2591
+ js_env_t *env,
2592
+ js_receiver_t,
2593
+ js_arraybuffer_span_of_t<bare_ffmpeg_audio_fifo_t, 1> fifo,
2594
+ js_arraybuffer_span_of_t<bare_ffmpeg_frame_t, 1> frame
2595
+ ) {
2596
+ int err;
2597
+
2598
+ int len = av_audio_fifo_write(fifo->handle, (void **) frame->handle->data, frame->handle->nb_samples);
2599
+
2600
+ if (len < 0) {
2601
+ err = js_throw_error(env, NULL, av_err2str(len));
2602
+ assert(err == 0);
2603
+ throw js_pending_exception;
2604
+ }
2605
+
2606
+ return len;
2607
+ }
2608
+
2609
+ static int
2610
+ bare_ffmpeg_audio_fifo_read(
2611
+ js_env_t *env,
2612
+ js_receiver_t,
2613
+ js_arraybuffer_span_of_t<bare_ffmpeg_audio_fifo_t, 1> fifo,
2614
+ js_arraybuffer_span_of_t<bare_ffmpeg_frame_t, 1> frame,
2615
+ int32_t nb_samples
2616
+ ) {
2617
+ int err;
2618
+
2619
+ int len = av_audio_fifo_read(fifo->handle, (void **) frame->handle->data, nb_samples);
2620
+
2621
+ if (len < 0) {
2622
+ err = js_throw_error(env, NULL, av_err2str(len));
2623
+ assert(err == 0);
2624
+ throw js_pending_exception;
2625
+ }
2626
+
2627
+ return len;
2628
+ }
2629
+
2630
+ static int
2631
+ bare_ffmpeg_audio_fifo_peek(
2632
+ js_env_t *env,
2633
+ js_receiver_t,
2634
+ js_arraybuffer_span_of_t<bare_ffmpeg_audio_fifo_t, 1> fifo,
2635
+ js_arraybuffer_span_of_t<bare_ffmpeg_frame_t, 1> frame,
2636
+ int32_t nb_samples
2637
+ ) {
2638
+ int err;
2639
+
2640
+ int len = av_audio_fifo_peek(fifo->handle, (void **) frame->handle->data, nb_samples);
2641
+
2642
+ if (len < 0) {
2643
+ err = js_throw_error(env, NULL, av_err2str(len));
2644
+ assert(err == 0);
2645
+ throw js_pending_exception;
2646
+ }
2647
+
2648
+ return len;
2649
+ }
2650
+
2651
+ static int
2652
+ bare_ffmpeg_audio_fifo_drain(
2653
+ js_env_t *env,
2654
+ js_receiver_t,
2655
+ js_arraybuffer_span_of_t<bare_ffmpeg_audio_fifo_t, 1> fifo,
2656
+ int32_t nb_samples
2657
+ ) {
2658
+ int err;
2659
+
2660
+ int len = av_audio_fifo_drain(fifo->handle, nb_samples);
2661
+
2662
+ if (len < 0) {
2663
+ err = js_throw_error(env, NULL, av_err2str(len));
2664
+ assert(err == 0);
2665
+ throw js_pending_exception;
2666
+ }
2667
+
2668
+ return len;
2669
+ }
2670
+
2671
+ static void
2672
+ bare_ffmpeg_audio_fifo_reset(
2673
+ js_env_t *env,
2674
+ js_receiver_t,
2675
+ js_arraybuffer_span_of_t<bare_ffmpeg_audio_fifo_t, 1> fifo
2676
+ ) {
2677
+ av_audio_fifo_reset(fifo->handle);
2678
+ }
2679
+
2680
+ static int
2681
+ bare_ffmpeg_audio_fifo_size(
2682
+ js_env_t *env,
2683
+ js_receiver_t,
2684
+ js_arraybuffer_span_of_t<bare_ffmpeg_audio_fifo_t, 1> fifo
2685
+ ) {
2686
+ return av_audio_fifo_size(fifo->handle);
2687
+ }
2688
+
2689
+ static int
2690
+ bare_ffmpeg_audio_fifo_space(
2691
+ js_env_t *env,
2692
+ js_receiver_t,
2693
+ js_arraybuffer_span_of_t<bare_ffmpeg_audio_fifo_t, 1> fifo
2694
+ ) {
2695
+ return av_audio_fifo_space(fifo->handle);
2696
+ }
2697
+
2698
+ static js_arraybuffer_t
2699
+ bare_ffmpeg_rational_d2q(
2700
+ js_env_t *env,
2701
+ js_receiver_t,
2702
+ double num
2703
+ ) {
2704
+ constexpr int safe_max = 1 << 26;
2705
+
2706
+ auto rational = av_d2q(num, safe_max);
2707
+
2708
+ int err;
2709
+
2710
+ js_arraybuffer_t result;
2711
+
2712
+ int32_t *data;
2713
+ err = js_create_arraybuffer(env, 2, data, result);
2714
+ assert(err == 0);
2715
+
2716
+ data[0] = rational.num;
2717
+ data[1] = rational.den;
2718
+
2719
+ return result;
2720
+ }
2721
+
2722
+ static js_value_t *
2723
+ bare_ffmpeg_exports(js_env_t *env, js_value_t *exports) {
2724
+ uv_once(&bare_ffmpeg__init_guard, bare_ffmpeg__on_init);
2725
+
2726
+ int err;
2727
+
2728
+ #define V(name, fn) \
2729
+ err = js_set_property<fn>(env, exports, name); \
2730
+ assert(err == 0);
2731
+
2732
+ V("getLogLevel", bare_ffmpeg_log_get_level);
2733
+ V("setLogLevel", bare_ffmpeg_log_set_level);
2734
+
2735
+ V("initIOContext", bare_ffmpeg_io_context_init)
2736
+ V("destroyIOContext", bare_ffmpeg_io_context_destroy)
2737
+
2738
+ V("initOutputFormat", bare_ffmpeg_output_format_init)
2739
+ V("initInputFormat", bare_ffmpeg_input_format_init)
2740
+ V("getOutputFormatFlags", bare_ffmpeg_output_format_get_flags)
2741
+ V("getInputFormatFlags", bare_ffmpeg_input_format_get_flags)
2742
+
2743
+ V("openInputFormatContextWithIO", bare_ffmpeg_format_context_open_input_with_io)
2744
+ V("openInputFormatContextWithFormat", bare_ffmpeg_format_context_open_input_with_format)
2745
+ V("closeInputFormatContext", bare_ffmpeg_format_context_close_input)
2746
+ V("openOutputFormatContext", bare_ffmpeg_format_context_open_output)
2747
+ V("closeOutputFormatContext", bare_ffmpeg_format_context_close_output)
2748
+ V("getFormatContextStreams", bare_ffmpeg_format_context_get_streams)
2749
+ V("getFormatContextBestStreamIndex", bare_ffmpeg_format_context_get_best_stream_index)
2750
+ V("createFormatContextStream", bare_ffmpeg_format_context_create_stream)
2751
+ V("readFormatContextFrame", bare_ffmpeg_format_context_read_frame)
2752
+ V("writeFormatContextHeader", bare_ffmpeg_format_context_write_header)
2753
+ V("writeFormatContextFrame", bare_ffmpeg_format_context_write_frame)
2754
+ V("writeFormatContextTrailer", bare_ffmpeg_format_context_write_trailer)
2755
+ V("dumpFormatContext", bare_ffmpeg_format_context_dump)
2756
+
2757
+ V("getStreamIndex", bare_ffmpeg_stream_get_index)
2758
+ V("getStreamId", bare_ffmpeg_stream_get_id)
2759
+ V("setStreamId", bare_ffmpeg_stream_set_id)
2760
+ V("getStreamTimeBase", bare_ffmpeg_stream_get_time_base)
2761
+ V("setStreamTimeBase", bare_ffmpeg_stream_set_time_base)
2762
+ V("getStreamAverageFramerate", bare_ffmpeg_stream_get_avg_framerate)
2763
+ V("setStreamAverageFramerate", bare_ffmpeg_stream_set_avg_framerate)
2764
+ V("getStreamCodecParameters", bare_ffmpeg_stream_get_codec_parameters)
2765
+
2766
+ V("findDecoderByID", bare_ffmpeg_find_decoder_by_id)
2767
+ V("findEncoderByID", bare_ffmpeg_find_encoder_by_id)
2768
+ V("getCodecNameByID", bare_ffmpeg_get_codec_name_by_id)
2769
+
2770
+ V("initCodecContext", bare_ffmpeg_codec_context_init)
2771
+ V("destroyCodecContext", bare_ffmpeg_codec_context_destroy)
2772
+ V("openCodecContext", bare_ffmpeg_codec_context_open)
2773
+ V("openCodecContextWithOptions", bare_ffmpeg_codec_context_open_with_options)
2774
+ V("getCodecContextFlags", bare_ffmpeg_codec_context_get_flags)
2775
+ V("setCodecContextFlags", bare_ffmpeg_codec_context_set_flags)
2776
+ V("getCodecContextPixelFormat", bare_ffmpeg_codec_context_get_pixel_format)
2777
+ V("setCodecContextPixelFormat", bare_ffmpeg_codec_context_set_pixel_format)
2778
+ V("getCodecContextWidth", bare_ffmpeg_codec_context_get_width)
2779
+ V("setCodecContextWidth", bare_ffmpeg_codec_context_set_width)
2780
+ V("getCodecContextHeight", bare_ffmpeg_codec_context_get_height)
2781
+ V("setCodecContextHeight", bare_ffmpeg_codec_context_set_height)
2782
+ V("getCodecContextSampleFormat", bare_ffmpeg_codec_context_get_sample_format)
2783
+ V("setCodecContextSampleFormat", bare_ffmpeg_codec_context_set_sample_format)
2784
+ V("getCodecContextTimeBase", bare_ffmpeg_codec_context_get_time_base)
2785
+ V("setCodecContextTimeBase", bare_ffmpeg_codec_context_set_time_base)
2786
+ V("getCodecContextChannelLayout", bare_ffmpeg_codec_context_get_channel_layout);
2787
+ V("setCodecContextChannelLayout", bare_ffmpeg_codec_context_set_channel_layout);
2788
+ V("getCodecContextSampleRate", bare_ffmpeg_codec_context_get_sample_rate);
2789
+ V("setCodecContextSampleRate", bare_ffmpeg_codec_context_set_sample_rate);
2790
+ V("getCodecContextGOPSize", bare_ffmpeg_codec_context_get_gop_size)
2791
+ V("setCodecContextGOPSize", bare_ffmpeg_codec_context_set_gop_size)
2792
+ V("getCodecContextFramerate", bare_ffmpeg_codec_context_get_framerate)
2793
+ V("setCodecContextFramerate", bare_ffmpeg_codec_context_set_framerate)
2794
+
2795
+ V("sendCodecContextPacket", bare_ffmpeg_codec_context_send_packet)
2796
+ V("receiveCodecContextPacket", bare_ffmpeg_codec_context_receive_packet)
2797
+ V("sendCodecContextFrame", bare_ffmpeg_codec_context_send_frame)
2798
+ V("receiveCodecContextFrame", bare_ffmpeg_codec_context_receive_frame)
2799
+
2800
+ V("codecParametersFromContext", bare_ffmpeg_codec_parameters_from_context)
2801
+ V("codecParametersToContext", bare_ffmpeg_codec_parameters_to_context)
2802
+ V("getCodecParametersBitRate", bare_ffmpeg_codec_parameters_get_bit_rate)
2803
+ V("setCodecParametersBitRate", bare_ffmpeg_codec_parameters_set_bit_rate)
2804
+ V("getCodecParametersBitsPerCodedSample", bare_ffmpeg_codec_parameters_get_bits_per_coded_sample)
2805
+ V("setCodecParametersBitsPerCodedSample", bare_ffmpeg_codec_parameters_set_bits_per_coded_sample)
2806
+ V("getCodecParametersBitsPerRawSample", bare_ffmpeg_codec_parameters_get_bits_per_raw_sample)
2807
+ V("setCodecParametersBitsPerRawSample", bare_ffmpeg_codec_parameters_set_bits_per_raw_sample)
2808
+ V("getCodecParametersSampleRate", bare_ffmpeg_codec_parameters_get_sample_rate)
2809
+ V("setCodecParametersSampleRate", bare_ffmpeg_codec_parameters_set_sample_rate)
2810
+ V("getCodecParametersFramerate", bare_ffmpeg_codec_parameters_get_framerate)
2811
+ V("setCodecParametersFramerate", bare_ffmpeg_codec_parameters_set_framerate)
2812
+ V("getCodecParametersNbChannels", bare_ffmpeg_codec_parameters_get_nb_channels)
2813
+ V("setCodecParametersNbChannels", bare_ffmpeg_codec_parameters_set_nb_channels)
2814
+ V("getCodecParametersType", bare_ffmpeg_codec_parameters_get_type)
2815
+ V("setCodecParametersType", bare_ffmpeg_codec_parameters_set_type)
2816
+ V("getCodecParametersTag", bare_ffmpeg_codec_parameters_get_tag)
2817
+ V("setCodecParametersTag", bare_ffmpeg_codec_parameters_set_tag)
2818
+ V("getCodecParametersId", bare_ffmpeg_codec_parameters_get_id)
2819
+ V("setCodecParametersId", bare_ffmpeg_codec_parameters_set_id)
2820
+ V("getCodecParametersLevel", bare_ffmpeg_codec_parameters_get_level)
2821
+ V("setCodecParametersLevel", bare_ffmpeg_codec_parameters_set_level)
2822
+ V("getCodecParametersProfile", bare_ffmpeg_codec_parameters_get_profile)
2823
+ V("setCodecParametersProfile", bare_ffmpeg_codec_parameters_set_profile)
2824
+ V("getCodecParametersFormat", bare_ffmpeg_codec_parameters_get_format)
2825
+ V("setCodecParametersFormat", bare_ffmpeg_codec_parameters_set_format)
2826
+ V("getCodecParametersChannelLayout", bare_ffmpeg_codec_parameters_get_channel_layout)
2827
+ V("setCodecParametersChannelLayout", bare_ffmpeg_codec_parameters_set_channel_layout)
2828
+ V("getCodecParametersWidth", bare_ffmpeg_codec_parameters_get_width)
2829
+ V("setCodecParametersWidth", bare_ffmpeg_codec_parameters_set_width)
2830
+ V("getCodecParametersHeight", bare_ffmpeg_codec_parameters_get_height)
2831
+ V("setCodecParametersHeight", bare_ffmpeg_codec_parameters_set_height)
2832
+ V("getCodecParametersExtraData", bare_ffmpeg_codec_parameters_get_extra_data)
2833
+ V("setCodecParametersExtraData", bare_ffmpeg_codec_parameters_set_extra_data)
2834
+
2835
+ V("initFrame", bare_ffmpeg_frame_init)
2836
+ V("destroyFrame", bare_ffmpeg_frame_destroy)
2837
+ V("unrefFrame", bare_ffmpeg_frame_unref)
2838
+ V("getFrameWidth", bare_ffmpeg_frame_get_width)
2839
+ V("setFrameWidth", bare_ffmpeg_frame_set_width)
2840
+ V("getFrameHeight", bare_ffmpeg_frame_get_height)
2841
+ V("setFrameHeight", bare_ffmpeg_frame_set_height)
2842
+ V("getFramePixelFormat", bare_ffmpeg_frame_get_pixel_format)
2843
+ V("setFramePixelFormat", bare_ffmpeg_frame_set_pixel_format)
2844
+ V("getFrameFormat", bare_ffmpeg_frame_get_format)
2845
+ V("setFrameFormat", bare_ffmpeg_frame_set_format)
2846
+ V("getFrameChannelLayout", bare_ffmpeg_frame_get_channel_layout)
2847
+ V("setFrameChannelLayout", bare_ffmpeg_frame_set_channel_layout)
2848
+ V("getFrameNbSamples", bare_ffmpeg_frame_get_nb_samples)
2849
+ V("setFrameNbSamples", bare_ffmpeg_frame_set_nb_samples)
2850
+ V("getFramePictType", bare_ffmpeg_frame_get_pict_type)
2851
+ V("getFramePTS", bare_ffmpeg_frame_get_pts)
2852
+ V("setFramePTS", bare_ffmpeg_frame_set_pts)
2853
+ V("getFramePacketDTS", bare_ffmpeg_frame_get_pkt_dts)
2854
+ V("setFramePacketDTS", bare_ffmpeg_frame_set_pkt_dts)
2855
+ V("getFrameTimeBase", bare_ffmpeg_frame_get_time_base)
2856
+ V("setFrameTimeBase", bare_ffmpeg_frame_set_time_base)
2857
+ V("allocFrame", bare_ffmpeg_frame_alloc)
2858
+
2859
+ V("initImage", bare_ffmpeg_image_init)
2860
+ V("fillImage", bare_ffmpeg_image_fill)
2861
+ V("readImage", bare_ffmpeg_image_read)
2862
+ V("getImageLineSize", bare_ffmpeg_image_get_line_size)
2863
+
2864
+ V("initSamples", bare_ffmpeg_samples_init)
2865
+ V("fillSamples", bare_ffmpeg_samples_fill)
2866
+
2867
+ V("initPacket", bare_ffmpeg_packet_init)
2868
+ V("initPacketFromBuffer", bare_ffmpeg_packet_init_from_buffer)
2869
+ V("unrefPacket", bare_ffmpeg_packet_unref)
2870
+ V("getPacketStreamIndex", bare_ffmpeg_packet_get_stream_index)
2871
+ V("setPacketStreamIndex", bare_ffmpeg_packet_set_stream_index)
2872
+ V("getPacketData", bare_ffmpeg_packet_get_data)
2873
+ V("setPacketData", bare_ffmpeg_packet_set_data)
2874
+ V("isPacketKeyframe", bare_ffmpeg_packet_is_keyframe)
2875
+ V("getPacketDTS", bare_ffmpeg_packet_get_dts)
2876
+ V("setPacketDTS", bare_ffmpeg_packet_set_dts)
2877
+ V("getPacketPTS", bare_ffmpeg_packet_get_pts)
2878
+ V("setPacketPTS", bare_ffmpeg_packet_set_pts)
2879
+ V("getPacketTimeBase", bare_ffmpeg_packet_get_time_base)
2880
+ V("setPacketTimeBase", bare_ffmpeg_packet_set_time_base)
2881
+ V("rescalePacketTimestamps", bare_ffmpeg_packet_rescale_ts)
2882
+ V("getPacketDuration", bare_ffmpeg_packet_get_duration)
2883
+ V("setPacketDuration", bare_ffmpeg_packet_set_duration)
2884
+ V("getPacketFlags", bare_ffmpeg_packet_get_flags)
2885
+ V("setPacketFlags", bare_ffmpeg_packet_set_flags)
2886
+
2887
+ V("initScaler", bare_ffmpeg_scaler_init)
2888
+ V("destroyScaler", bare_ffmpeg_scaler_destroy)
2889
+ V("scaleScaler", bare_ffmpeg_scaler_scale)
2890
+
2891
+ V("initDictionary", bare_ffmpeg_dictionary_init)
2892
+ V("destroyDictionary", bare_ffmpeg_dictionary_destroy)
2893
+ V("getDictionaryEntry", bare_ffmpeg_dictionary_get_entry)
2894
+ V("setDictionaryEntry", bare_ffmpeg_dictionary_set_entry)
2895
+
2896
+ V("initResampler", bare_ffmpeg_resampler_init)
2897
+ V("destroyResampler", bare_ffmpeg_resampler_destroy)
2898
+ V("convertResampler", bare_ffmpeg_resampler_convert_frames)
2899
+ V("getResamplerDelay", bare_ffmpeg_resampler_get_delay)
2900
+ V("flushResampler", bare_ffmpeg_resampler_flush)
2901
+
2902
+ V("copyChannelLayout", bare_ffmpeg_channel_layout_copy)
2903
+ V("getChannelLayoutNbChannels", bare_ffmpeg_channel_layout_get_nb_channels)
2904
+ V("getChannelLayoutMask", bare_ffmpeg_channel_layout_get_mask)
2905
+ V("channelLayoutFromMask", bare_ffmpeg_channel_layout_from_mask)
2906
+
2907
+ V("initAudioFifo", bare_ffmpeg_audio_fifo_init)
2908
+ V("destroyAudioFifo", bare_ffmpeg_audio_fifo_destroy)
2909
+ V("writeAudioFifo", bare_ffmpeg_audio_fifo_write)
2910
+ V("readAudioFifo", bare_ffmpeg_audio_fifo_read)
2911
+ V("peekAudioFifo", bare_ffmpeg_audio_fifo_peek)
2912
+ V("drainAudioFifo", bare_ffmpeg_audio_fifo_drain)
2913
+ V("resetAudioFifo", bare_ffmpeg_audio_fifo_reset)
2914
+ V("getAudioFifoSize", bare_ffmpeg_audio_fifo_size)
2915
+ V("getAudioFifoSpace", bare_ffmpeg_audio_fifo_space)
2916
+
2917
+ V("rationalD2Q", bare_ffmpeg_rational_d2q)
2918
+ #undef V
2919
+
2920
+ #define V(name) \
2921
+ { \
2922
+ js_value_t *val; \
2923
+ err = js_create_int64(env, name, &val); \
2924
+ assert(err == 0); \
2925
+ err = js_set_named_property(env, exports, #name, val); \
2926
+ assert(err == 0); \
2927
+ }
2928
+
2929
+ V(AV_LOG_QUIET)
2930
+ V(AV_LOG_PANIC)
2931
+ V(AV_LOG_FATAL)
2932
+ V(AV_LOG_ERROR)
2933
+ V(AV_LOG_WARNING)
2934
+ V(AV_LOG_INFO)
2935
+ V(AV_LOG_VERBOSE)
2936
+ V(AV_LOG_DEBUG)
2937
+ V(AV_LOG_TRACE)
2938
+
2939
+ V(AV_CODEC_ID_MJPEG)
2940
+ V(AV_CODEC_ID_H264)
2941
+ V(AV_CODEC_ID_AAC)
2942
+ V(AV_CODEC_ID_OPUS)
2943
+ V(AV_CODEC_ID_AV1)
2944
+ V(AV_CODEC_ID_FLAC)
2945
+ V(AV_CODEC_ID_MP3)
2946
+
2947
+ V(AV_CODEC_FLAG_COPY_OPAQUE)
2948
+ V(AV_CODEC_FLAG_FRAME_DURATION)
2949
+ V(AV_CODEC_FLAG_PASS1)
2950
+ V(AV_CODEC_FLAG_PASS2)
2951
+ V(AV_CODEC_FLAG_LOOP_FILTER)
2952
+ V(AV_CODEC_FLAG_GRAY)
2953
+ V(AV_CODEC_FLAG_PSNR)
2954
+ V(AV_CODEC_FLAG_INTERLACED_DCT)
2955
+ V(AV_CODEC_FLAG_LOW_DELAY)
2956
+ V(AV_CODEC_FLAG_GLOBAL_HEADER)
2957
+ V(AV_CODEC_FLAG_BITEXACT)
2958
+ V(AV_CODEC_FLAG_AC_PRED)
2959
+ V(AV_CODEC_FLAG_INTERLACED_ME)
2960
+ V(AV_CODEC_FLAG_CLOSED_GOP)
2961
+
2962
+ V(AV_PIX_FMT_RGBA)
2963
+ V(AV_PIX_FMT_RGB24)
2964
+ V(AV_PIX_FMT_YUVJ420P)
2965
+ V(AV_PIX_FMT_YUV420P)
2966
+ V(AV_PIX_FMT_UYVY422)
2967
+
2968
+ V(AVMEDIA_TYPE_UNKNOWN)
2969
+ V(AVMEDIA_TYPE_VIDEO)
2970
+ V(AVMEDIA_TYPE_AUDIO)
2971
+ V(AVMEDIA_TYPE_DATA)
2972
+ V(AVMEDIA_TYPE_SUBTITLE)
2973
+ V(AVMEDIA_TYPE_ATTACHMENT)
2974
+ V(AVMEDIA_TYPE_NB)
2975
+
2976
+ V(AV_SAMPLE_FMT_NONE)
2977
+ V(AV_SAMPLE_FMT_U8)
2978
+ V(AV_SAMPLE_FMT_S16)
2979
+ V(AV_SAMPLE_FMT_S32)
2980
+ V(AV_SAMPLE_FMT_FLT)
2981
+ V(AV_SAMPLE_FMT_DBL)
2982
+ V(AV_SAMPLE_FMT_U8P)
2983
+ V(AV_SAMPLE_FMT_S16P)
2984
+ V(AV_SAMPLE_FMT_S32P)
2985
+ V(AV_SAMPLE_FMT_FLTP)
2986
+ V(AV_SAMPLE_FMT_DBLP)
2987
+ V(AV_SAMPLE_FMT_S64)
2988
+ V(AV_SAMPLE_FMT_S64P)
2989
+ V(AV_SAMPLE_FMT_NB)
2990
+
2991
+ V(AV_CH_LAYOUT_MONO)
2992
+ V(AV_CH_LAYOUT_STEREO)
2993
+ V(AV_CH_LAYOUT_QUAD)
2994
+ V(AV_CH_LAYOUT_SURROUND)
2995
+ V(AV_CH_LAYOUT_2POINT1)
2996
+ V(AV_CH_LAYOUT_5POINT0)
2997
+ V(AV_CH_LAYOUT_5POINT1)
2998
+ V(AV_CH_LAYOUT_7POINT1)
2999
+
3000
+ V(AV_PICTURE_TYPE_NONE)
3001
+ V(AV_PICTURE_TYPE_I)
3002
+ V(AV_PICTURE_TYPE_P)
3003
+ V(AV_PICTURE_TYPE_B)
3004
+ V(AV_PICTURE_TYPE_S)
3005
+ V(AV_PICTURE_TYPE_SI)
3006
+ V(AV_PICTURE_TYPE_SP)
3007
+ V(AV_PICTURE_TYPE_BI)
3008
+
3009
+ // InputFormat flags
3010
+ V(AVFMT_SHOW_IDS)
3011
+ V(AVFMT_GENERIC_INDEX)
3012
+ V(AVFMT_TS_DISCONT)
3013
+ V(AVFMT_NOBINSEARCH)
3014
+ V(AVFMT_NOGENSEARCH)
3015
+ V(AVFMT_NO_BYTE_SEEK)
3016
+ V(AVFMT_SEEK_TO_PTS)
3017
+
3018
+ // OutputFormat flags
3019
+ V(AVFMT_GLOBALHEADER)
3020
+ V(AVFMT_VARIABLE_FPS)
3021
+ V(AVFMT_NODIMENSIONS)
3022
+ V(AVFMT_NOSTREAMS)
3023
+ V(AVFMT_TS_NONSTRICT)
3024
+ V(AVFMT_TS_NEGATIVE)
3025
+
3026
+ // Common format flags
3027
+ V(AVFMT_NOFILE)
3028
+ V(AVFMT_NEEDNUMBER)
3029
+ V(AVFMT_NOTIMESTAMPS)
3030
+
3031
+ // Profile
3032
+ V(AV_PROFILE_UNKNOWN)
3033
+ V(AV_PROFILE_RESERVED)
3034
+ V(AV_PROFILE_AAC_MAIN)
3035
+ V(AV_PROFILE_AAC_LOW)
3036
+ V(AV_PROFILE_AAC_SSR)
3037
+ V(AV_PROFILE_AAC_LTP)
3038
+ V(AV_PROFILE_AAC_HE)
3039
+ V(AV_PROFILE_AAC_HE_V2)
3040
+ V(AV_PROFILE_AAC_LD)
3041
+ V(AV_PROFILE_AAC_ELD)
3042
+ V(AV_PROFILE_AAC_USAC)
3043
+ V(AV_PROFILE_MPEG2_AAC_LOW)
3044
+ V(AV_PROFILE_MPEG2_AAC_HE)
3045
+ V(AV_PROFILE_DNXHD)
3046
+ V(AV_PROFILE_DNXHR_LB)
3047
+ V(AV_PROFILE_DNXHR_SQ)
3048
+ V(AV_PROFILE_DNXHR_HQ)
3049
+ V(AV_PROFILE_DNXHR_HQX)
3050
+ V(AV_PROFILE_DNXHR_444)
3051
+ V(AV_PROFILE_DTS)
3052
+ V(AV_PROFILE_DTS_ES)
3053
+ V(AV_PROFILE_DTS_96_24)
3054
+ V(AV_PROFILE_DTS_HD_HRA)
3055
+ V(AV_PROFILE_DTS_HD_MA)
3056
+ V(AV_PROFILE_DTS_EXPRESS)
3057
+ V(AV_PROFILE_DTS_HD_MA_X)
3058
+ V(AV_PROFILE_DTS_HD_MA_X_IMAX)
3059
+ V(AV_PROFILE_EAC3_DDP_ATMOS)
3060
+ V(AV_PROFILE_TRUEHD_ATMOS)
3061
+ V(AV_PROFILE_MPEG2_422)
3062
+ V(AV_PROFILE_MPEG2_HIGH)
3063
+ V(AV_PROFILE_MPEG2_SS)
3064
+ V(AV_PROFILE_MPEG2_SNR_SCALABLE)
3065
+ V(AV_PROFILE_MPEG2_MAIN)
3066
+ V(AV_PROFILE_MPEG2_SIMPLE)
3067
+ V(AV_PROFILE_H264_CONSTRAINED)
3068
+ V(AV_PROFILE_H264_INTRA)
3069
+ V(AV_PROFILE_H264_BASELINE)
3070
+ V(AV_PROFILE_H264_CONSTRAINED_BASELINE)
3071
+ V(AV_PROFILE_H264_MAIN)
3072
+ V(AV_PROFILE_H264_EXTENDED)
3073
+ V(AV_PROFILE_H264_HIGH)
3074
+ V(AV_PROFILE_H264_HIGH_10)
3075
+ V(AV_PROFILE_H264_HIGH_10_INTRA)
3076
+ V(AV_PROFILE_H264_MULTIVIEW_HIGH)
3077
+ V(AV_PROFILE_H264_HIGH_422)
3078
+ V(AV_PROFILE_H264_HIGH_422_INTRA)
3079
+ V(AV_PROFILE_H264_STEREO_HIGH)
3080
+ V(AV_PROFILE_H264_HIGH_444)
3081
+ V(AV_PROFILE_H264_HIGH_444_PREDICTIVE)
3082
+ V(AV_PROFILE_H264_HIGH_444_INTRA)
3083
+ V(AV_PROFILE_H264_CAVLC_444)
3084
+ V(AV_PROFILE_VC1_SIMPLE)
3085
+ V(AV_PROFILE_VC1_MAIN)
3086
+ V(AV_PROFILE_VC1_COMPLEX)
3087
+ V(AV_PROFILE_VC1_ADVANCED)
3088
+ V(AV_PROFILE_MPEG4_SIMPLE)
3089
+ V(AV_PROFILE_MPEG4_SIMPLE_SCALABLE)
3090
+ V(AV_PROFILE_MPEG4_CORE)
3091
+ V(AV_PROFILE_MPEG4_MAIN)
3092
+ V(AV_PROFILE_MPEG4_N_BIT)
3093
+ V(AV_PROFILE_MPEG4_SCALABLE_TEXTURE)
3094
+ V(AV_PROFILE_MPEG4_SIMPLE_FACE_ANIMATION)
3095
+ V(AV_PROFILE_MPEG4_BASIC_ANIMATED_TEXTURE)
3096
+ V(AV_PROFILE_MPEG4_HYBRID)
3097
+ V(AV_PROFILE_MPEG4_ADVANCED_REAL_TIME)
3098
+ V(AV_PROFILE_MPEG4_CORE_SCALABLE)
3099
+ V(AV_PROFILE_MPEG4_ADVANCED_CODING)
3100
+ V(AV_PROFILE_MPEG4_ADVANCED_CORE)
3101
+ V(AV_PROFILE_MPEG4_ADVANCED_SCALABLE_TEXTURE)
3102
+ V(AV_PROFILE_MPEG4_SIMPLE_STUDIO)
3103
+ V(AV_PROFILE_MPEG4_ADVANCED_SIMPLE)
3104
+ V(AV_PROFILE_JPEG2000_CSTREAM_RESTRICTION_0)
3105
+ V(AV_PROFILE_JPEG2000_CSTREAM_RESTRICTION_1)
3106
+ V(AV_PROFILE_JPEG2000_CSTREAM_NO_RESTRICTION)
3107
+ V(AV_PROFILE_JPEG2000_DCINEMA_2K)
3108
+ V(AV_PROFILE_JPEG2000_DCINEMA_4K)
3109
+ V(AV_PROFILE_VP9_0)
3110
+ V(AV_PROFILE_VP9_1)
3111
+ V(AV_PROFILE_VP9_2)
3112
+ V(AV_PROFILE_VP9_3)
3113
+ V(AV_PROFILE_HEVC_MAIN)
3114
+ V(AV_PROFILE_HEVC_MAIN_10)
3115
+ V(AV_PROFILE_HEVC_MAIN_STILL_PICTURE)
3116
+ V(AV_PROFILE_HEVC_REXT)
3117
+ V(AV_PROFILE_HEVC_MULTIVIEW_MAIN)
3118
+ V(AV_PROFILE_HEVC_SCC)
3119
+ V(AV_PROFILE_VVC_MAIN_10)
3120
+ V(AV_PROFILE_VVC_MAIN_10_444)
3121
+ V(AV_PROFILE_AV1_MAIN)
3122
+ V(AV_PROFILE_AV1_HIGH)
3123
+ V(AV_PROFILE_AV1_PROFESSIONAL)
3124
+ V(AV_PROFILE_MJPEG_HUFFMAN_BASELINE_DCT)
3125
+ V(AV_PROFILE_MJPEG_HUFFMAN_EXTENDED_SEQUENTIAL_DCT)
3126
+ V(AV_PROFILE_MJPEG_HUFFMAN_PROGRESSIVE_DCT)
3127
+ V(AV_PROFILE_MJPEG_HUFFMAN_LOSSLESS)
3128
+ V(AV_PROFILE_MJPEG_JPEG_LS)
3129
+ V(AV_PROFILE_SBC_MSBC)
3130
+ V(AV_PROFILE_PRORES_PROXY)
3131
+ V(AV_PROFILE_PRORES_LT)
3132
+ V(AV_PROFILE_PRORES_STANDARD)
3133
+ V(AV_PROFILE_PRORES_HQ)
3134
+ V(AV_PROFILE_PRORES_4444)
3135
+ V(AV_PROFILE_PRORES_XQ)
3136
+ V(AV_PROFILE_ARIB_PROFILE_A)
3137
+ V(AV_PROFILE_ARIB_PROFILE_C)
3138
+ V(AV_PROFILE_KLVA_SYNC)
3139
+ V(AV_PROFILE_KLVA_ASYNC)
3140
+ V(AV_PROFILE_EVC_BASELINE)
3141
+ V(AV_PROFILE_EVC_MAIN)
3142
+
3143
+ // Levels
3144
+ V(AV_LEVEL_UNKNOWN)
3145
+ #undef V
3146
+
3147
+ return exports;
3148
+ }
3149
+
3150
+ BARE_MODULE(bare_ffmpeg, bare_ffmpeg_exports)