bare-ffmpeg 1.0.0-15 → 1.0.0-17

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 (55) hide show
  1. package/binding.cc +765 -17
  2. package/index.d.ts +46 -0
  3. package/index.js +5 -3
  4. package/lib/audio-fifo.d.ts +20 -0
  5. package/lib/channel-layout.d.ts +9 -0
  6. package/lib/channel-layout.js +11 -0
  7. package/lib/codec-context.d.ts +34 -0
  8. package/lib/codec-context.js +43 -1
  9. package/lib/codec-parameters.d.ts +20 -0
  10. package/lib/codec-parameters.js +38 -0
  11. package/lib/codec.d.ts +20 -0
  12. package/lib/codec.js +14 -0
  13. package/lib/constants.d.ts +74 -0
  14. package/lib/constants.js +49 -3
  15. package/lib/decoder.d.ts +7 -0
  16. package/lib/dictionary.d.ts +11 -0
  17. package/lib/dictionary.js +2 -0
  18. package/lib/encoder.d.ts +7 -0
  19. package/lib/format-context.d.ts +43 -0
  20. package/lib/format-context.js +28 -5
  21. package/lib/frame.d.ts +28 -0
  22. package/lib/frame.js +46 -0
  23. package/lib/image.d.ts +30 -0
  24. package/lib/input-format.d.ts +5 -0
  25. package/lib/input-format.js +4 -0
  26. package/lib/io-context.d.ts +10 -0
  27. package/lib/io-context.js +24 -6
  28. package/lib/log.js +16 -0
  29. package/lib/output-format.d.ts +5 -0
  30. package/lib/output-format.js +4 -0
  31. package/lib/packet.d.ts +16 -0
  32. package/lib/packet.js +77 -0
  33. package/lib/rational.d.ts +8 -0
  34. package/lib/rational.js +27 -1
  35. package/lib/resampler.d.ts +26 -0
  36. package/lib/resampler.js +2 -2
  37. package/lib/samples.d.ts +16 -0
  38. package/lib/scaler.d.ts +26 -0
  39. package/lib/scaler.js +2 -2
  40. package/lib/stream.d.ts +18 -0
  41. package/lib/stream.js +38 -5
  42. package/package.json +17 -3
  43. package/prebuilds/android-arm/bare-ffmpeg.bare +0 -0
  44. package/prebuilds/android-arm64/bare-ffmpeg.bare +0 -0
  45. package/prebuilds/android-ia32/bare-ffmpeg.bare +0 -0
  46. package/prebuilds/android-x64/bare-ffmpeg.bare +0 -0
  47. package/prebuilds/darwin-arm64/bare-ffmpeg.bare +0 -0
  48. package/prebuilds/darwin-x64/bare-ffmpeg.bare +0 -0
  49. package/prebuilds/ios-arm64/bare-ffmpeg.bare +0 -0
  50. package/prebuilds/ios-arm64-simulator/bare-ffmpeg.bare +0 -0
  51. package/prebuilds/ios-x64-simulator/bare-ffmpeg.bare +0 -0
  52. package/prebuilds/linux-arm64/bare-ffmpeg.bare +0 -0
  53. package/prebuilds/linux-x64/bare-ffmpeg.bare +0 -0
  54. package/prebuilds/win32-arm64/bare-ffmpeg.bare +0 -0
  55. package/prebuilds/win32-x64/bare-ffmpeg.bare +0 -0
package/binding.cc CHANGED
@@ -1,4 +1,5 @@
1
1
  #include <assert.h>
2
+ #include <cstdint>
2
3
  #include <stddef.h>
3
4
  #include <stdint.h>
4
5
  #include <string.h>
@@ -31,8 +32,13 @@ extern "C" {
31
32
  #include <libswscale/swscale.h>
32
33
  }
33
34
 
35
+ using bare_ffmpeg_io_context_on_write_cb_t = js_function_t<void, js_arraybuffer_t>;
36
+
34
37
  typedef struct {
35
38
  AVIOContext *handle;
39
+
40
+ js_env_t *env;
41
+ js_persistent_t<bare_ffmpeg_io_context_on_write_cb_t> on_write;
36
42
  } bare_ffmpeg_io_context_t;
37
43
 
38
44
  typedef struct {
@@ -93,6 +99,12 @@ typedef struct {
93
99
 
94
100
  static uv_once_t bare_ffmpeg__init_guard = UV_ONCE_INIT;
95
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
+
96
108
  static void
97
109
  bare_ffmpeg__on_init(void) {
98
110
  av_log_set_level(AV_LOG_ERROR);
@@ -100,13 +112,45 @@ bare_ffmpeg__on_init(void) {
100
112
  avdevice_register_all();
101
113
  }
102
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
+
103
146
  static js_arraybuffer_t
104
147
  bare_ffmpeg_io_context_init(
105
148
  js_env_t *env,
106
149
  js_receiver_t,
107
- js_arraybuffer_span_t data,
150
+ std::optional<js_arraybuffer_span_t> data,
108
151
  uint64_t offset,
109
- uint64_t len
152
+ uint64_t len,
153
+ std::optional<bare_ffmpeg_io_context_on_write_cb_t> on_write
110
154
  ) {
111
155
  int err;
112
156
 
@@ -116,18 +160,39 @@ bare_ffmpeg_io_context_init(
116
160
  err = js_create_arraybuffer(env, context, handle);
117
161
  assert(err == 0);
118
162
 
119
- uint8_t *io;
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
+
120
172
  size_t size = static_cast<size_t>(len);
121
173
 
122
- if (len == 0) io = NULL;
123
- else {
174
+ uint8_t *io = NULL;
175
+
176
+ if (size) {
124
177
  io = reinterpret_cast<uint8_t *>(av_malloc(size));
178
+ }
125
179
 
126
- memcpy(io, &data[static_cast<size_t>(offset)], size);
180
+ if (data) {
181
+ memcpy(io, &data.value()[static_cast<size_t>(offset)], size);
127
182
  }
128
183
 
129
- context->handle = avio_alloc_context(io, static_cast<int>(len), 0, NULL, NULL, NULL, NULL);
130
- context->handle->opaque = (void *) context;
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);
131
196
 
132
197
  return handle;
133
198
  }
@@ -141,6 +206,7 @@ bare_ffmpeg_io_context_destroy(
141
206
  av_free(context->handle->buffer);
142
207
 
143
208
  avio_context_free(&context->handle);
209
+ context->on_write.reset();
144
210
  }
145
211
 
146
212
  static js_arraybuffer_t
@@ -167,6 +233,15 @@ bare_ffmpeg_output_format_init(js_env_t *env, js_receiver_t, std::string name) {
167
233
  return handle;
168
234
  }
169
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
+
170
245
  static js_arraybuffer_t
171
246
  bare_ffmpeg_input_format_init(js_env_t *env, js_receiver_t, std::string name) {
172
247
  int err;
@@ -191,6 +266,15 @@ bare_ffmpeg_input_format_init(js_env_t *env, js_receiver_t, std::string name) {
191
266
  return handle;
192
267
  }
193
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
+
194
278
  static js_arraybuffer_t
195
279
  bare_ffmpeg_format_context_open_input_with_io(
196
280
  js_env_t *env,
@@ -369,8 +453,7 @@ static js_arraybuffer_t
369
453
  bare_ffmpeg_format_context_create_stream(
370
454
  js_env_t *env,
371
455
  js_receiver_t,
372
- js_arraybuffer_span_of_t<bare_ffmpeg_format_context_t, 1> context,
373
- js_arraybuffer_span_of_t<bare_ffmpeg_codec_t, 1> codec
456
+ js_arraybuffer_span_of_t<bare_ffmpeg_format_context_t, 1> context
374
457
  ) {
375
458
  int err;
376
459
 
@@ -380,7 +463,7 @@ bare_ffmpeg_format_context_create_stream(
380
463
  err = js_create_arraybuffer(env, stream, handle);
381
464
  assert(err == 0);
382
465
 
383
- stream->handle = avformat_new_stream(context->handle, codec->handle);
466
+ stream->handle = avformat_new_stream(context->handle, NULL);
384
467
 
385
468
  return handle;
386
469
  }
@@ -407,13 +490,175 @@ bare_ffmpeg_format_context_read_frame(
407
490
  return err == 0;
408
491
  }
409
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
+
410
581
  static int32_t
411
- bare_ffmpeg_stream_get_codec(
582
+ bare_ffmpeg_stream_get_id(
412
583
  js_env_t *env,
413
584
  js_receiver_t,
414
585
  js_arraybuffer_span_of_t<bare_ffmpeg_stream_t, 1> stream
415
586
  ) {
416
- return stream->handle->codecpar->codec_id;
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;
417
662
  }
418
663
 
419
664
  static js_arraybuffer_t
@@ -483,6 +728,13 @@ bare_ffmpeg_find_encoder_by_id(js_env_t *env, js_receiver_t, uint32_t id) {
483
728
  return handle;
484
729
  }
485
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
+
486
738
  static js_arraybuffer_t
487
739
  bare_ffmpeg_codec_context_init(
488
740
  js_env_t *env,
@@ -521,6 +773,7 @@ bare_ffmpeg_codec_context_open(
521
773
  int err;
522
774
 
523
775
  err = avcodec_open2(context->handle, context->handle->codec, NULL);
776
+
524
777
  if (err < 0) {
525
778
  err = js_throw_error(env, NULL, av_err2str(err));
526
779
  assert(err == 0);
@@ -531,6 +784,25 @@ bare_ffmpeg_codec_context_open(
531
784
  return err == 0;
532
785
  }
533
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
+
534
806
  static int64_t
535
807
  bare_ffmpeg_frame_get_format(
536
808
  js_env_t *env,
@@ -782,6 +1054,38 @@ bare_ffmpeg_codec_context_set_gop_size(
782
1054
  context->handle->gop_size = gop_size;
783
1055
  }
784
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
+
785
1089
  static bool
786
1090
  bare_ffmpeg_codec_context_send_packet(
787
1091
  js_env_t *env,
@@ -827,11 +1131,16 @@ bare_ffmpeg_codec_context_send_frame(
827
1131
  js_env_t *env,
828
1132
  js_receiver_t,
829
1133
  js_arraybuffer_span_of_t<bare_ffmpeg_codec_context_t, 1> context,
830
- js_arraybuffer_span_of_t<bare_ffmpeg_frame_t, 1> frame
1134
+ std::optional<js_arraybuffer_span_of_t<bare_ffmpeg_frame_t, 1>> frame
831
1135
  ) {
832
1136
  int err;
833
1137
 
834
- err = avcodec_send_frame(context->handle, frame->handle);
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
+
835
1144
  if (err < 0 && err != AVERROR(EAGAIN) && err != AVERROR_EOF) {
836
1145
  err = js_throw_error(env, NULL, av_err2str(err));
837
1146
  assert(err == 0);
@@ -872,6 +1181,7 @@ bare_ffmpeg_codec_parameters_from_context(
872
1181
  int err;
873
1182
 
874
1183
  err = avcodec_parameters_from_context(parameters->handle, context->handle);
1184
+
875
1185
  if (err < 0) {
876
1186
  err = js_throw_error(env, NULL, av_err2str(err));
877
1187
  assert(err == 0);
@@ -961,6 +1271,15 @@ bare_ffmpeg_codec_parameters_get_codec_type(
961
1271
  return parameters->handle->codec_type;
962
1272
  }
963
1273
 
1274
+ static int32_t
1275
+ bare_ffmpeg_codec_parameters_get_codec_id(
1276
+ js_env_t *env,
1277
+ js_receiver_t,
1278
+ js_arraybuffer_span_of_t<bare_ffmpeg_codec_parameters_t, 1> parameters
1279
+ ) {
1280
+ return parameters->handle->codec_id;
1281
+ }
1282
+
964
1283
  static js_arraybuffer_t
965
1284
  bare_ffmpeg_codec_parameters_get_channel_layout(
966
1285
  js_env_t *env,
@@ -981,6 +1300,44 @@ bare_ffmpeg_codec_parameters_get_channel_layout(
981
1300
  return result;
982
1301
  }
983
1302
 
1303
+ static int32_t
1304
+ bare_ffmpeg_codec_parameters_get_width(
1305
+ js_env_t *env,
1306
+ js_receiver_t,
1307
+ js_arraybuffer_span_of_t<bare_ffmpeg_codec_parameters_t, 1> parameters
1308
+ ) {
1309
+ return parameters->handle->width;
1310
+ }
1311
+
1312
+ static int32_t
1313
+ bare_ffmpeg_codec_parameters_get_height(
1314
+ js_env_t *env,
1315
+ js_receiver_t,
1316
+ js_arraybuffer_span_of_t<bare_ffmpeg_codec_parameters_t, 1> parameters
1317
+ ) {
1318
+ return parameters->handle->height;
1319
+ }
1320
+
1321
+ static js_arraybuffer_t
1322
+ bare_ffmpeg_codec_parameters_get_framerate(
1323
+ js_env_t *env,
1324
+ js_receiver_t,
1325
+ js_arraybuffer_span_of_t<bare_ffmpeg_codec_parameters_t, 1> parameters
1326
+ ) {
1327
+ int err;
1328
+
1329
+ js_arraybuffer_t result;
1330
+
1331
+ int32_t *data;
1332
+ err = js_create_arraybuffer(env, 2, data, result);
1333
+ assert(err == 0);
1334
+
1335
+ data[0] = parameters->handle->framerate.num;
1336
+ data[1] = parameters->handle->framerate.den;
1337
+
1338
+ return result;
1339
+ }
1340
+
984
1341
  static js_arraybuffer_t
985
1342
  bare_ffmpeg_frame_init(js_env_t *env, js_receiver_t) {
986
1343
  int err;
@@ -997,6 +1354,15 @@ bare_ffmpeg_frame_init(js_env_t *env, js_receiver_t) {
997
1354
  return handle;
998
1355
  }
999
1356
 
1357
+ static void
1358
+ bare_ffmpeg_frame_unref(
1359
+ js_env_t *env,
1360
+ js_receiver_t,
1361
+ js_arraybuffer_span_of_t<bare_ffmpeg_frame_t, 1> frame
1362
+ ) {
1363
+ av_frame_unref(frame->handle);
1364
+ }
1365
+
1000
1366
  static void
1001
1367
  bare_ffmpeg_frame_destroy(
1002
1368
  js_env_t *env,
@@ -1091,6 +1457,83 @@ bare_ffmpeg_frame_get_pict_type(
1091
1457
  return frame->handle->pict_type;
1092
1458
  }
1093
1459
 
1460
+ static int64_t
1461
+ bare_ffmpeg_frame_get_pts(
1462
+ js_env_t *env,
1463
+ js_receiver_t,
1464
+ js_arraybuffer_span_of_t<bare_ffmpeg_frame_t, 1> frame
1465
+ ) {
1466
+ int64_t ts = frame->handle->pts;
1467
+
1468
+ if (ts == AV_NOPTS_VALUE) return -1;
1469
+
1470
+ return ts;
1471
+ }
1472
+
1473
+ static void
1474
+ bare_ffmpeg_frame_set_pts(
1475
+ js_env_t *,
1476
+ js_receiver_t,
1477
+ js_arraybuffer_span_of_t<bare_ffmpeg_frame_t, 1> frame,
1478
+ int64_t value
1479
+ ) {
1480
+ frame->handle->pts = value;
1481
+ }
1482
+
1483
+ static int64_t
1484
+ bare_ffmpeg_frame_get_pkt_dts(
1485
+ js_env_t *env,
1486
+ js_receiver_t,
1487
+ js_arraybuffer_span_of_t<bare_ffmpeg_frame_t, 1> frame
1488
+ ) {
1489
+ int64_t ts = frame->handle->pkt_dts;
1490
+
1491
+ if (ts == AV_NOPTS_VALUE) return -1;
1492
+
1493
+ return ts;
1494
+ }
1495
+
1496
+ static void
1497
+ bare_ffmpeg_frame_set_pkt_dts(
1498
+ js_env_t *,
1499
+ js_receiver_t,
1500
+ js_arraybuffer_span_of_t<bare_ffmpeg_frame_t, 1> frame,
1501
+ int64_t value
1502
+ ) {
1503
+ frame->handle->pkt_dts = value;
1504
+ }
1505
+
1506
+ static js_arraybuffer_t
1507
+ bare_ffmpeg_frame_get_time_base(
1508
+ js_env_t *env,
1509
+ js_receiver_t,
1510
+ js_arraybuffer_span_of_t<bare_ffmpeg_frame_t, 1> frame
1511
+ ) {
1512
+ int err;
1513
+
1514
+ js_arraybuffer_t result;
1515
+
1516
+ int32_t *data;
1517
+ err = js_create_arraybuffer(env, 2, data, result);
1518
+ assert(err == 0);
1519
+
1520
+ data[0] = frame->handle->time_base.num;
1521
+ data[1] = frame->handle->time_base.den;
1522
+
1523
+ return result;
1524
+ }
1525
+ static void
1526
+ bare_ffmpeg_frame_set_time_base(
1527
+ js_env_t *env,
1528
+ js_receiver_t,
1529
+ js_arraybuffer_span_of_t<bare_ffmpeg_frame_t, 1> frame,
1530
+ int num,
1531
+ int den
1532
+ ) {
1533
+ frame->handle->time_base.num = num;
1534
+ frame->handle->time_base.den = den;
1535
+ }
1536
+
1094
1537
  static void
1095
1538
  bare_ffmpeg_frame_alloc(
1096
1539
  js_env_t *env,
@@ -1353,6 +1796,16 @@ bare_ffmpeg_packet_get_stream_index(
1353
1796
  return packet->handle->stream_index;
1354
1797
  }
1355
1798
 
1799
+ static void
1800
+ bare_ffmpeg_packet_set_stream_index(
1801
+ js_env_t *env,
1802
+ js_receiver_t,
1803
+ js_arraybuffer_span_of_t<bare_ffmpeg_packet_t, 1> packet,
1804
+ int32_t value
1805
+ ) {
1806
+ packet->handle->stream_index = value;
1807
+ }
1808
+
1356
1809
  static js_arraybuffer_t
1357
1810
  bare_ffmpeg_packet_get_data(
1358
1811
  js_env_t *env,
@@ -1374,6 +1827,26 @@ bare_ffmpeg_packet_get_data(
1374
1827
  return handle;
1375
1828
  }
1376
1829
 
1830
+ static void
1831
+ bare_ffmpeg_packet_set_data(
1832
+ js_env_t *env,
1833
+ js_receiver_t,
1834
+ js_arraybuffer_span_of_t<bare_ffmpeg_packet_t, 1> packet,
1835
+ js_arraybuffer_span_t data,
1836
+ uint32_t offset,
1837
+ uint32_t len
1838
+ ) {
1839
+ int err;
1840
+ assert(offset + len <= data.size());
1841
+
1842
+ av_packet_unref(packet->handle);
1843
+
1844
+ err = av_new_packet(packet->handle, static_cast<int>(len));
1845
+ assert(err == 0);
1846
+
1847
+ memcpy(packet->handle->data, &data[offset], len);
1848
+ }
1849
+
1377
1850
  static bool
1378
1851
  bare_ffmpeg_packet_is_keyframe(
1379
1852
  js_env_t *,
@@ -1383,6 +1856,148 @@ bare_ffmpeg_packet_is_keyframe(
1383
1856
  return packet->handle->flags & AV_PKT_FLAG_KEY;
1384
1857
  }
1385
1858
 
1859
+ static int64_t
1860
+ bare_ffmpeg_packet_get_dts(
1861
+ js_env_t *env,
1862
+ js_receiver_t,
1863
+ js_arraybuffer_span_of_t<bare_ffmpeg_packet_t, 1> packet
1864
+ ) {
1865
+ int64_t ts = packet->handle->dts;
1866
+
1867
+ if (ts == AV_NOPTS_VALUE) return -1;
1868
+
1869
+ return ts;
1870
+ }
1871
+
1872
+ static void
1873
+ bare_ffmpeg_packet_set_dts(
1874
+ js_env_t *env,
1875
+ js_receiver_t,
1876
+ js_arraybuffer_span_of_t<bare_ffmpeg_packet_t, 1> packet,
1877
+ int64_t value
1878
+ ) {
1879
+ packet->handle->dts = value;
1880
+ }
1881
+
1882
+ static int64_t
1883
+ bare_ffmpeg_packet_get_pts(
1884
+ js_env_t *env,
1885
+ js_receiver_t,
1886
+ js_arraybuffer_span_of_t<bare_ffmpeg_packet_t, 1> packet
1887
+ ) {
1888
+ int64_t ts = packet->handle->pts;
1889
+
1890
+ if (ts == AV_NOPTS_VALUE) return -1;
1891
+
1892
+ return ts;
1893
+ }
1894
+
1895
+ static void
1896
+ bare_ffmpeg_packet_set_pts(
1897
+ js_env_t *env,
1898
+ js_receiver_t,
1899
+ js_arraybuffer_span_of_t<bare_ffmpeg_packet_t, 1> packet,
1900
+ int64_t value
1901
+ ) {
1902
+ packet->handle->pts = value;
1903
+ }
1904
+
1905
+ static js_arraybuffer_t
1906
+ bare_ffmpeg_packet_get_time_base(
1907
+ js_env_t *env,
1908
+ js_receiver_t,
1909
+ js_arraybuffer_span_of_t<bare_ffmpeg_packet_t, 1> packet
1910
+ ) {
1911
+ int err;
1912
+
1913
+ js_arraybuffer_t result;
1914
+
1915
+ int32_t *data;
1916
+ err = js_create_arraybuffer(env, 2, data, result);
1917
+ assert(err == 0);
1918
+
1919
+ data[0] = packet->handle->time_base.num;
1920
+ data[1] = packet->handle->time_base.den;
1921
+
1922
+ return result;
1923
+ }
1924
+
1925
+ static void
1926
+ bare_ffmpeg_packet_set_time_base(
1927
+ js_env_t *env,
1928
+ js_receiver_t,
1929
+ js_arraybuffer_span_of_t<bare_ffmpeg_packet_t, 1> packet,
1930
+ int num,
1931
+ int den
1932
+ ) {
1933
+ packet->handle->time_base.num = num;
1934
+ packet->handle->time_base.den = den;
1935
+ }
1936
+
1937
+ static int64_t
1938
+ bare_ffmpeg_packet_rescale_ts(
1939
+ js_env_t *env,
1940
+ js_arraybuffer_span_of_t<bare_ffmpeg_packet_t, 1> packet,
1941
+ int32_t num,
1942
+ int32_t den
1943
+ ) {
1944
+ AVRational src = packet->handle->time_base;
1945
+ AVRational dst = {.num = num, .den = den};
1946
+
1947
+ if (
1948
+ bad_timebase(src) ||
1949
+ bad_timebase(dst) ||
1950
+ packet->handle->dts == AV_NOPTS_VALUE ||
1951
+ packet->handle->pts == AV_NOPTS_VALUE
1952
+ ) {
1953
+ return false;
1954
+ }
1955
+
1956
+ av_packet_rescale_ts(packet->handle, src, dst);
1957
+
1958
+ packet->handle->time_base = dst;
1959
+
1960
+ return true;
1961
+ }
1962
+
1963
+ static int64_t
1964
+ bare_ffmpeg_packet_get_duration(
1965
+ js_env_t *env,
1966
+ js_receiver_t,
1967
+ js_arraybuffer_span_of_t<bare_ffmpeg_packet_t, 1> packet
1968
+ ) {
1969
+ return packet->handle->duration;
1970
+ }
1971
+
1972
+ static void
1973
+ bare_ffmpeg_packet_set_duration(
1974
+ js_env_t *env,
1975
+ js_receiver_t,
1976
+ js_arraybuffer_span_of_t<bare_ffmpeg_packet_t, 1> packet,
1977
+ int64_t value
1978
+ ) {
1979
+ packet->handle->duration = value;
1980
+ }
1981
+
1982
+ static int32_t
1983
+ bare_ffmpeg_packet_get_flags(
1984
+ js_env_t *env,
1985
+ js_receiver_t,
1986
+ js_arraybuffer_span_of_t<bare_ffmpeg_packet_t, 1> packet
1987
+ ) {
1988
+ return packet->handle->flags;
1989
+ }
1990
+
1991
+ static void
1992
+ bare_ffmpeg_packet_set_flags(
1993
+ js_env_t *env,
1994
+ js_receiver_t,
1995
+ js_arraybuffer_span_of_t<bare_ffmpeg_packet_t, 1> packet,
1996
+ int32_t value
1997
+ ) {
1998
+ packet->handle->flags = value;
1999
+ }
2000
+
1386
2001
  static js_arraybuffer_t
1387
2002
  bare_ffmpeg_scaler_init(
1388
2003
  js_env_t *env,
@@ -1437,6 +2052,9 @@ bare_ffmpeg_scaler_scale(
1437
2052
  int height,
1438
2053
  js_arraybuffer_span_of_t<bare_ffmpeg_frame_t, 1> target
1439
2054
  ) {
2055
+ int err = av_frame_copy_props(target->handle, source->handle);
2056
+ assert(err == 0);
2057
+
1440
2058
  return sws_scale(
1441
2059
  scaler->handle,
1442
2060
  reinterpret_cast<const uint8_t *const *>(source->handle->data),
@@ -1667,6 +2285,15 @@ bare_ffmpeg_channel_layout_get_nb_channels(
1667
2285
  return layout->handle.nb_channels;
1668
2286
  }
1669
2287
 
2288
+ static uint64_t
2289
+ bare_ffmpeg_channel_layout_get_mask(
2290
+ js_env_t *env,
2291
+ js_receiver_t,
2292
+ js_arraybuffer_span_of_t<bare_ffmpeg_channel_layout_t, 1> layout
2293
+ ) {
2294
+ return layout->handle.u.mask;
2295
+ }
2296
+
1670
2297
  static js_arraybuffer_t
1671
2298
  bare_ffmpeg_channel_layout_from_mask(
1672
2299
  js_env_t *env,
@@ -1830,6 +2457,30 @@ bare_ffmpeg_audio_fifo_space(
1830
2457
  return av_audio_fifo_space(fifo->handle);
1831
2458
  }
1832
2459
 
2460
+ static js_arraybuffer_t
2461
+ bare_ffmpeg_rational_d2q(
2462
+ js_env_t *env,
2463
+ js_receiver_t,
2464
+ double num
2465
+ ) {
2466
+ constexpr int safe_max = 1 << 26;
2467
+
2468
+ auto rational = av_d2q(num, safe_max);
2469
+
2470
+ int err;
2471
+
2472
+ js_arraybuffer_t result;
2473
+
2474
+ int32_t *data;
2475
+ err = js_create_arraybuffer(env, 2, data, result);
2476
+ assert(err == 0);
2477
+
2478
+ data[0] = rational.num;
2479
+ data[1] = rational.den;
2480
+
2481
+ return result;
2482
+ }
2483
+
1833
2484
  static js_value_t *
1834
2485
  bare_ffmpeg_exports(js_env_t *env, js_value_t *exports) {
1835
2486
  uv_once(&bare_ffmpeg__init_guard, bare_ffmpeg__on_init);
@@ -1840,11 +2491,16 @@ bare_ffmpeg_exports(js_env_t *env, js_value_t *exports) {
1840
2491
  err = js_set_property<fn>(env, exports, name); \
1841
2492
  assert(err == 0);
1842
2493
 
2494
+ V("getLogLevel", bare_ffmpeg_log_get_level);
2495
+ V("setLogLevel", bare_ffmpeg_log_set_level);
2496
+
1843
2497
  V("initIOContext", bare_ffmpeg_io_context_init)
1844
2498
  V("destroyIOContext", bare_ffmpeg_io_context_destroy)
1845
2499
 
1846
2500
  V("initOutputFormat", bare_ffmpeg_output_format_init)
1847
2501
  V("initInputFormat", bare_ffmpeg_input_format_init)
2502
+ V("getOutputFormatFlags", bare_ffmpeg_output_format_get_flags)
2503
+ V("getInputFormatFlags", bare_ffmpeg_input_format_get_flags)
1848
2504
 
1849
2505
  V("openInputFormatContextWithIO", bare_ffmpeg_format_context_open_input_with_io)
1850
2506
  V("openInputFormatContextWithFormat", bare_ffmpeg_format_context_open_input_with_format)
@@ -1855,17 +2511,30 @@ bare_ffmpeg_exports(js_env_t *env, js_value_t *exports) {
1855
2511
  V("getFormatContextBestStreamIndex", bare_ffmpeg_format_context_get_best_stream_index)
1856
2512
  V("createFormatContextStream", bare_ffmpeg_format_context_create_stream)
1857
2513
  V("readFormatContextFrame", bare_ffmpeg_format_context_read_frame)
1858
-
1859
- V("getStreamCodec", bare_ffmpeg_stream_get_codec)
2514
+ V("writeFormatContextHeader", bare_ffmpeg_format_context_write_header)
2515
+ V("writeFormatContextFrame", bare_ffmpeg_format_context_write_frame)
2516
+ V("writeFormatContextTrailer", bare_ffmpeg_format_context_write_trailer)
2517
+ V("dumpFormatContext", bare_ffmpeg_format_context_dump)
2518
+
2519
+ V("getStreamIndex", bare_ffmpeg_stream_get_index)
2520
+ V("getStreamId", bare_ffmpeg_stream_get_id)
2521
+ V("setStreamId", bare_ffmpeg_stream_set_id)
2522
+ V("getStreamTimeBase", bare_ffmpeg_stream_get_time_base)
2523
+ V("setStreamTimeBase", bare_ffmpeg_stream_set_time_base)
2524
+ V("getStreamAverageFramerate", bare_ffmpeg_stream_get_avg_framerate)
2525
+ V("setStreamAverageFramerate", bare_ffmpeg_stream_set_avg_framerate)
1860
2526
  V("getStreamCodecParameters", bare_ffmpeg_stream_get_codec_parameters)
1861
2527
 
1862
2528
  V("findDecoderByID", bare_ffmpeg_find_decoder_by_id)
1863
2529
  V("findEncoderByID", bare_ffmpeg_find_encoder_by_id)
2530
+ V("getCodecNameByID", bare_ffmpeg_get_codec_name_by_id)
1864
2531
 
1865
2532
  V("initCodecContext", bare_ffmpeg_codec_context_init)
1866
2533
  V("destroyCodecContext", bare_ffmpeg_codec_context_destroy)
1867
2534
  V("openCodecContext", bare_ffmpeg_codec_context_open)
1868
2535
  V("openCodecContextWithOptions", bare_ffmpeg_codec_context_open_with_options)
2536
+ V("getCodecContextFlags", bare_ffmpeg_codec_context_get_flags)
2537
+ V("setCodecContextFlags", bare_ffmpeg_codec_context_set_flags)
1869
2538
  V("getCodecContextPixelFormat", bare_ffmpeg_codec_context_get_pixel_format)
1870
2539
  V("setCodecContextPixelFormat", bare_ffmpeg_codec_context_set_pixel_format)
1871
2540
  V("getCodecContextWidth", bare_ffmpeg_codec_context_get_width)
@@ -1882,6 +2551,8 @@ bare_ffmpeg_exports(js_env_t *env, js_value_t *exports) {
1882
2551
  V("setCodecContextSampleRate", bare_ffmpeg_codec_context_set_sample_rate);
1883
2552
  V("getCodecContextGOPSize", bare_ffmpeg_codec_context_get_gop_size)
1884
2553
  V("setCodecContextGOPSize", bare_ffmpeg_codec_context_set_gop_size)
2554
+ V("getCodecContextFramerate", bare_ffmpeg_codec_context_get_framerate)
2555
+ V("setCodecContextFramerate", bare_ffmpeg_codec_context_set_framerate)
1885
2556
 
1886
2557
  V("sendCodecContextPacket", bare_ffmpeg_codec_context_send_packet)
1887
2558
  V("receiveCodecContextPacket", bare_ffmpeg_codec_context_receive_packet)
@@ -1897,10 +2568,15 @@ bare_ffmpeg_exports(js_env_t *env, js_value_t *exports) {
1897
2568
  V("getCodecParametersSampleRate", bare_ffmpeg_codec_parameters_get_sample_rate)
1898
2569
  V("getCodecParametersNbChannels", bare_ffmpeg_codec_parameters_get_nb_channels)
1899
2570
  V("getCodecParametersCodecType", bare_ffmpeg_codec_parameters_get_codec_type)
2571
+ V("getCodecParametersCodecId", bare_ffmpeg_codec_parameters_get_codec_id)
1900
2572
  V("getCodecParametersChannelLayout", bare_ffmpeg_codec_parameters_get_channel_layout)
2573
+ V("getCodecParametersWidth", bare_ffmpeg_codec_parameters_get_width)
2574
+ V("getCodecParametersHeight", bare_ffmpeg_codec_parameters_get_height)
2575
+ V("getCodecParametersFramerate", bare_ffmpeg_codec_parameters_get_framerate)
1901
2576
 
1902
2577
  V("initFrame", bare_ffmpeg_frame_init)
1903
2578
  V("destroyFrame", bare_ffmpeg_frame_destroy)
2579
+ V("unrefFrame", bare_ffmpeg_frame_unref)
1904
2580
  V("getFrameWidth", bare_ffmpeg_frame_get_width)
1905
2581
  V("setFrameWidth", bare_ffmpeg_frame_set_width)
1906
2582
  V("getFrameHeight", bare_ffmpeg_frame_get_height)
@@ -1914,6 +2590,12 @@ bare_ffmpeg_exports(js_env_t *env, js_value_t *exports) {
1914
2590
  V("getFrameNbSamples", bare_ffmpeg_frame_get_nb_samples)
1915
2591
  V("setFrameNbSamples", bare_ffmpeg_frame_set_nb_samples)
1916
2592
  V("getFramePictType", bare_ffmpeg_frame_get_pict_type)
2593
+ V("getFramePTS", bare_ffmpeg_frame_get_pts)
2594
+ V("setFramePTS", bare_ffmpeg_frame_set_pts)
2595
+ V("getFramePacketDTS", bare_ffmpeg_frame_get_pkt_dts)
2596
+ V("setFramePacketDTS", bare_ffmpeg_frame_set_pkt_dts)
2597
+ V("getFrameTimeBase", bare_ffmpeg_frame_get_time_base)
2598
+ V("setFrameTimeBase", bare_ffmpeg_frame_set_time_base)
1917
2599
  V("allocFrame", bare_ffmpeg_frame_alloc)
1918
2600
 
1919
2601
  V("initImage", bare_ffmpeg_image_init)
@@ -1928,8 +2610,21 @@ bare_ffmpeg_exports(js_env_t *env, js_value_t *exports) {
1928
2610
  V("initPacketFromBuffer", bare_ffmpeg_packet_init_from_buffer)
1929
2611
  V("unrefPacket", bare_ffmpeg_packet_unref)
1930
2612
  V("getPacketStreamIndex", bare_ffmpeg_packet_get_stream_index)
2613
+ V("setPacketStreamIndex", bare_ffmpeg_packet_set_stream_index)
1931
2614
  V("getPacketData", bare_ffmpeg_packet_get_data)
2615
+ V("setPacketData", bare_ffmpeg_packet_set_data)
1932
2616
  V("isPacketKeyframe", bare_ffmpeg_packet_is_keyframe)
2617
+ V("getPacketDTS", bare_ffmpeg_packet_get_dts)
2618
+ V("setPacketDTS", bare_ffmpeg_packet_set_dts)
2619
+ V("getPacketPTS", bare_ffmpeg_packet_get_pts)
2620
+ V("setPacketPTS", bare_ffmpeg_packet_set_pts)
2621
+ V("getPacketTimeBase", bare_ffmpeg_packet_get_time_base)
2622
+ V("setPacketTimeBase", bare_ffmpeg_packet_set_time_base)
2623
+ V("rescalePacketTimestamps", bare_ffmpeg_packet_rescale_ts)
2624
+ V("getPacketDuration", bare_ffmpeg_packet_get_duration)
2625
+ V("setPacketDuration", bare_ffmpeg_packet_set_duration)
2626
+ V("getPacketFlags", bare_ffmpeg_packet_get_flags)
2627
+ V("setPacketFlags", bare_ffmpeg_packet_set_flags)
1933
2628
 
1934
2629
  V("initScaler", bare_ffmpeg_scaler_init)
1935
2630
  V("destroyScaler", bare_ffmpeg_scaler_destroy)
@@ -1948,6 +2643,7 @@ bare_ffmpeg_exports(js_env_t *env, js_value_t *exports) {
1948
2643
 
1949
2644
  V("copyChannelLayout", bare_ffmpeg_channel_layout_copy)
1950
2645
  V("getChannelLayoutNbChannels", bare_ffmpeg_channel_layout_get_nb_channels)
2646
+ V("getChannelLayoutMask", bare_ffmpeg_channel_layout_get_mask)
1951
2647
  V("channelLayoutFromMask", bare_ffmpeg_channel_layout_from_mask)
1952
2648
 
1953
2649
  V("initAudioFifo", bare_ffmpeg_audio_fifo_init)
@@ -1959,6 +2655,8 @@ bare_ffmpeg_exports(js_env_t *env, js_value_t *exports) {
1959
2655
  V("resetAudioFifo", bare_ffmpeg_audio_fifo_reset)
1960
2656
  V("getAudioFifoSize", bare_ffmpeg_audio_fifo_size)
1961
2657
  V("getAudioFifoSpace", bare_ffmpeg_audio_fifo_space)
2658
+
2659
+ V("rationalD2Q", bare_ffmpeg_rational_d2q)
1962
2660
  #undef V
1963
2661
 
1964
2662
  #define V(name) \
@@ -1970,11 +2668,38 @@ bare_ffmpeg_exports(js_env_t *env, js_value_t *exports) {
1970
2668
  assert(err == 0); \
1971
2669
  }
1972
2670
 
2671
+ V(AV_LOG_QUIET)
2672
+ V(AV_LOG_PANIC)
2673
+ V(AV_LOG_FATAL)
2674
+ V(AV_LOG_ERROR)
2675
+ V(AV_LOG_WARNING)
2676
+ V(AV_LOG_INFO)
2677
+ V(AV_LOG_VERBOSE)
2678
+ V(AV_LOG_DEBUG)
2679
+ V(AV_LOG_TRACE)
2680
+
1973
2681
  V(AV_CODEC_ID_MJPEG)
1974
2682
  V(AV_CODEC_ID_H264)
1975
2683
  V(AV_CODEC_ID_AAC)
1976
2684
  V(AV_CODEC_ID_OPUS)
1977
2685
  V(AV_CODEC_ID_AV1)
2686
+ V(AV_CODEC_ID_FLAC)
2687
+ V(AV_CODEC_ID_MP3)
2688
+
2689
+ V(AV_CODEC_FLAG_COPY_OPAQUE)
2690
+ V(AV_CODEC_FLAG_FRAME_DURATION)
2691
+ V(AV_CODEC_FLAG_PASS1)
2692
+ V(AV_CODEC_FLAG_PASS2)
2693
+ V(AV_CODEC_FLAG_LOOP_FILTER)
2694
+ V(AV_CODEC_FLAG_GRAY)
2695
+ V(AV_CODEC_FLAG_PSNR)
2696
+ V(AV_CODEC_FLAG_INTERLACED_DCT)
2697
+ V(AV_CODEC_FLAG_LOW_DELAY)
2698
+ V(AV_CODEC_FLAG_GLOBAL_HEADER)
2699
+ V(AV_CODEC_FLAG_BITEXACT)
2700
+ V(AV_CODEC_FLAG_AC_PRED)
2701
+ V(AV_CODEC_FLAG_INTERLACED_ME)
2702
+ V(AV_CODEC_FLAG_CLOSED_GOP)
1978
2703
 
1979
2704
  V(AV_PIX_FMT_RGBA)
1980
2705
  V(AV_PIX_FMT_RGB24)
@@ -2022,6 +2747,29 @@ bare_ffmpeg_exports(js_env_t *env, js_value_t *exports) {
2022
2747
  V(AV_PICTURE_TYPE_SI)
2023
2748
  V(AV_PICTURE_TYPE_SP)
2024
2749
  V(AV_PICTURE_TYPE_BI)
2750
+
2751
+ // InputFormat flags
2752
+ V(AVFMT_SHOW_IDS)
2753
+ V(AVFMT_GENERIC_INDEX)
2754
+ V(AVFMT_TS_DISCONT)
2755
+ V(AVFMT_NOBINSEARCH)
2756
+ V(AVFMT_NOGENSEARCH)
2757
+ V(AVFMT_NO_BYTE_SEEK)
2758
+ V(AVFMT_SEEK_TO_PTS)
2759
+
2760
+ // OutputFormat flags
2761
+ V(AVFMT_GLOBALHEADER)
2762
+ V(AVFMT_VARIABLE_FPS)
2763
+ V(AVFMT_NODIMENSIONS)
2764
+ V(AVFMT_NOSTREAMS)
2765
+ V(AVFMT_TS_NONSTRICT)
2766
+ V(AVFMT_TS_NEGATIVE)
2767
+
2768
+ // Common format flags
2769
+ V(AVFMT_NOFILE)
2770
+ V(AVFMT_NEEDNUMBER)
2771
+ V(AVFMT_NOTIMESTAMPS)
2772
+
2025
2773
  #undef V
2026
2774
 
2027
2775
  return exports;