bare-ffmpeg 1.0.0-15 → 1.0.0-16

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 +755 -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 +23 -0
  22. package/lib/frame.js +42 -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;
@@ -1091,6 +1448,83 @@ bare_ffmpeg_frame_get_pict_type(
1091
1448
  return frame->handle->pict_type;
1092
1449
  }
1093
1450
 
1451
+ static int64_t
1452
+ bare_ffmpeg_frame_get_pts(
1453
+ js_env_t *env,
1454
+ js_receiver_t,
1455
+ js_arraybuffer_span_of_t<bare_ffmpeg_frame_t, 1> frame
1456
+ ) {
1457
+ int64_t ts = frame->handle->pts;
1458
+
1459
+ if (ts == AV_NOPTS_VALUE) return -1;
1460
+
1461
+ return ts;
1462
+ }
1463
+
1464
+ static void
1465
+ bare_ffmpeg_frame_set_pts(
1466
+ js_env_t *,
1467
+ js_receiver_t,
1468
+ js_arraybuffer_span_of_t<bare_ffmpeg_frame_t, 1> frame,
1469
+ int64_t value
1470
+ ) {
1471
+ frame->handle->pts = value;
1472
+ }
1473
+
1474
+ static int64_t
1475
+ bare_ffmpeg_frame_get_pkt_dts(
1476
+ js_env_t *env,
1477
+ js_receiver_t,
1478
+ js_arraybuffer_span_of_t<bare_ffmpeg_frame_t, 1> frame
1479
+ ) {
1480
+ int64_t ts = frame->handle->pkt_dts;
1481
+
1482
+ if (ts == AV_NOPTS_VALUE) return -1;
1483
+
1484
+ return ts;
1485
+ }
1486
+
1487
+ static void
1488
+ bare_ffmpeg_frame_set_pkt_dts(
1489
+ js_env_t *,
1490
+ js_receiver_t,
1491
+ js_arraybuffer_span_of_t<bare_ffmpeg_frame_t, 1> frame,
1492
+ int64_t value
1493
+ ) {
1494
+ frame->handle->pkt_dts = value;
1495
+ }
1496
+
1497
+ static js_arraybuffer_t
1498
+ bare_ffmpeg_frame_get_time_base(
1499
+ js_env_t *env,
1500
+ js_receiver_t,
1501
+ js_arraybuffer_span_of_t<bare_ffmpeg_frame_t, 1> frame
1502
+ ) {
1503
+ int err;
1504
+
1505
+ js_arraybuffer_t result;
1506
+
1507
+ int32_t *data;
1508
+ err = js_create_arraybuffer(env, 2, data, result);
1509
+ assert(err == 0);
1510
+
1511
+ data[0] = frame->handle->time_base.num;
1512
+ data[1] = frame->handle->time_base.den;
1513
+
1514
+ return result;
1515
+ }
1516
+ static void
1517
+ bare_ffmpeg_frame_set_time_base(
1518
+ js_env_t *env,
1519
+ js_receiver_t,
1520
+ js_arraybuffer_span_of_t<bare_ffmpeg_frame_t, 1> frame,
1521
+ int num,
1522
+ int den
1523
+ ) {
1524
+ frame->handle->time_base.num = num;
1525
+ frame->handle->time_base.den = den;
1526
+ }
1527
+
1094
1528
  static void
1095
1529
  bare_ffmpeg_frame_alloc(
1096
1530
  js_env_t *env,
@@ -1353,6 +1787,16 @@ bare_ffmpeg_packet_get_stream_index(
1353
1787
  return packet->handle->stream_index;
1354
1788
  }
1355
1789
 
1790
+ static void
1791
+ bare_ffmpeg_packet_set_stream_index(
1792
+ js_env_t *env,
1793
+ js_receiver_t,
1794
+ js_arraybuffer_span_of_t<bare_ffmpeg_packet_t, 1> packet,
1795
+ int32_t value
1796
+ ) {
1797
+ packet->handle->stream_index = value;
1798
+ }
1799
+
1356
1800
  static js_arraybuffer_t
1357
1801
  bare_ffmpeg_packet_get_data(
1358
1802
  js_env_t *env,
@@ -1374,6 +1818,26 @@ bare_ffmpeg_packet_get_data(
1374
1818
  return handle;
1375
1819
  }
1376
1820
 
1821
+ static void
1822
+ bare_ffmpeg_packet_set_data(
1823
+ js_env_t *env,
1824
+ js_receiver_t,
1825
+ js_arraybuffer_span_of_t<bare_ffmpeg_packet_t, 1> packet,
1826
+ js_arraybuffer_span_t data,
1827
+ uint32_t offset,
1828
+ uint32_t len
1829
+ ) {
1830
+ int err;
1831
+ assert(offset + len <= data.size());
1832
+
1833
+ av_packet_unref(packet->handle);
1834
+
1835
+ err = av_new_packet(packet->handle, static_cast<int>(len));
1836
+ assert(err == 0);
1837
+
1838
+ memcpy(packet->handle->data, &data[offset], len);
1839
+ }
1840
+
1377
1841
  static bool
1378
1842
  bare_ffmpeg_packet_is_keyframe(
1379
1843
  js_env_t *,
@@ -1383,6 +1847,148 @@ bare_ffmpeg_packet_is_keyframe(
1383
1847
  return packet->handle->flags & AV_PKT_FLAG_KEY;
1384
1848
  }
1385
1849
 
1850
+ static int64_t
1851
+ bare_ffmpeg_packet_get_dts(
1852
+ js_env_t *env,
1853
+ js_receiver_t,
1854
+ js_arraybuffer_span_of_t<bare_ffmpeg_packet_t, 1> packet
1855
+ ) {
1856
+ int64_t ts = packet->handle->dts;
1857
+
1858
+ if (ts == AV_NOPTS_VALUE) return -1;
1859
+
1860
+ return ts;
1861
+ }
1862
+
1863
+ static void
1864
+ bare_ffmpeg_packet_set_dts(
1865
+ js_env_t *env,
1866
+ js_receiver_t,
1867
+ js_arraybuffer_span_of_t<bare_ffmpeg_packet_t, 1> packet,
1868
+ int64_t value
1869
+ ) {
1870
+ packet->handle->dts = value;
1871
+ }
1872
+
1873
+ static int64_t
1874
+ bare_ffmpeg_packet_get_pts(
1875
+ js_env_t *env,
1876
+ js_receiver_t,
1877
+ js_arraybuffer_span_of_t<bare_ffmpeg_packet_t, 1> packet
1878
+ ) {
1879
+ int64_t ts = packet->handle->pts;
1880
+
1881
+ if (ts == AV_NOPTS_VALUE) return -1;
1882
+
1883
+ return ts;
1884
+ }
1885
+
1886
+ static void
1887
+ bare_ffmpeg_packet_set_pts(
1888
+ js_env_t *env,
1889
+ js_receiver_t,
1890
+ js_arraybuffer_span_of_t<bare_ffmpeg_packet_t, 1> packet,
1891
+ int64_t value
1892
+ ) {
1893
+ packet->handle->pts = value;
1894
+ }
1895
+
1896
+ static js_arraybuffer_t
1897
+ bare_ffmpeg_packet_get_time_base(
1898
+ js_env_t *env,
1899
+ js_receiver_t,
1900
+ js_arraybuffer_span_of_t<bare_ffmpeg_packet_t, 1> packet
1901
+ ) {
1902
+ int err;
1903
+
1904
+ js_arraybuffer_t result;
1905
+
1906
+ int32_t *data;
1907
+ err = js_create_arraybuffer(env, 2, data, result);
1908
+ assert(err == 0);
1909
+
1910
+ data[0] = packet->handle->time_base.num;
1911
+ data[1] = packet->handle->time_base.den;
1912
+
1913
+ return result;
1914
+ }
1915
+
1916
+ static void
1917
+ bare_ffmpeg_packet_set_time_base(
1918
+ js_env_t *env,
1919
+ js_receiver_t,
1920
+ js_arraybuffer_span_of_t<bare_ffmpeg_packet_t, 1> packet,
1921
+ int num,
1922
+ int den
1923
+ ) {
1924
+ packet->handle->time_base.num = num;
1925
+ packet->handle->time_base.den = den;
1926
+ }
1927
+
1928
+ static int64_t
1929
+ bare_ffmpeg_packet_rescale_ts(
1930
+ js_env_t *env,
1931
+ js_arraybuffer_span_of_t<bare_ffmpeg_packet_t, 1> packet,
1932
+ int32_t num,
1933
+ int32_t den
1934
+ ) {
1935
+ AVRational src = packet->handle->time_base;
1936
+ AVRational dst = {.num = num, .den = den};
1937
+
1938
+ if (
1939
+ bad_timebase(src) ||
1940
+ bad_timebase(dst) ||
1941
+ packet->handle->dts == AV_NOPTS_VALUE ||
1942
+ packet->handle->pts == AV_NOPTS_VALUE
1943
+ ) {
1944
+ return false;
1945
+ }
1946
+
1947
+ av_packet_rescale_ts(packet->handle, src, dst);
1948
+
1949
+ packet->handle->time_base = dst;
1950
+
1951
+ return true;
1952
+ }
1953
+
1954
+ static int64_t
1955
+ bare_ffmpeg_packet_get_duration(
1956
+ js_env_t *env,
1957
+ js_receiver_t,
1958
+ js_arraybuffer_span_of_t<bare_ffmpeg_packet_t, 1> packet
1959
+ ) {
1960
+ return packet->handle->duration;
1961
+ }
1962
+
1963
+ static void
1964
+ bare_ffmpeg_packet_set_duration(
1965
+ js_env_t *env,
1966
+ js_receiver_t,
1967
+ js_arraybuffer_span_of_t<bare_ffmpeg_packet_t, 1> packet,
1968
+ int64_t value
1969
+ ) {
1970
+ packet->handle->duration = value;
1971
+ }
1972
+
1973
+ static int32_t
1974
+ bare_ffmpeg_packet_get_flags(
1975
+ js_env_t *env,
1976
+ js_receiver_t,
1977
+ js_arraybuffer_span_of_t<bare_ffmpeg_packet_t, 1> packet
1978
+ ) {
1979
+ return packet->handle->flags;
1980
+ }
1981
+
1982
+ static void
1983
+ bare_ffmpeg_packet_set_flags(
1984
+ js_env_t *env,
1985
+ js_receiver_t,
1986
+ js_arraybuffer_span_of_t<bare_ffmpeg_packet_t, 1> packet,
1987
+ int32_t value
1988
+ ) {
1989
+ packet->handle->flags = value;
1990
+ }
1991
+
1386
1992
  static js_arraybuffer_t
1387
1993
  bare_ffmpeg_scaler_init(
1388
1994
  js_env_t *env,
@@ -1437,6 +2043,9 @@ bare_ffmpeg_scaler_scale(
1437
2043
  int height,
1438
2044
  js_arraybuffer_span_of_t<bare_ffmpeg_frame_t, 1> target
1439
2045
  ) {
2046
+ int err = av_frame_copy_props(target->handle, source->handle);
2047
+ assert(err == 0);
2048
+
1440
2049
  return sws_scale(
1441
2050
  scaler->handle,
1442
2051
  reinterpret_cast<const uint8_t *const *>(source->handle->data),
@@ -1667,6 +2276,15 @@ bare_ffmpeg_channel_layout_get_nb_channels(
1667
2276
  return layout->handle.nb_channels;
1668
2277
  }
1669
2278
 
2279
+ static uint64_t
2280
+ bare_ffmpeg_channel_layout_get_mask(
2281
+ js_env_t *env,
2282
+ js_receiver_t,
2283
+ js_arraybuffer_span_of_t<bare_ffmpeg_channel_layout_t, 1> layout
2284
+ ) {
2285
+ return layout->handle.u.mask;
2286
+ }
2287
+
1670
2288
  static js_arraybuffer_t
1671
2289
  bare_ffmpeg_channel_layout_from_mask(
1672
2290
  js_env_t *env,
@@ -1830,6 +2448,30 @@ bare_ffmpeg_audio_fifo_space(
1830
2448
  return av_audio_fifo_space(fifo->handle);
1831
2449
  }
1832
2450
 
2451
+ static js_arraybuffer_t
2452
+ bare_ffmpeg_rational_d2q(
2453
+ js_env_t *env,
2454
+ js_receiver_t,
2455
+ double num
2456
+ ) {
2457
+ constexpr int safe_max = 1 << 26;
2458
+
2459
+ auto rational = av_d2q(num, safe_max);
2460
+
2461
+ int err;
2462
+
2463
+ js_arraybuffer_t result;
2464
+
2465
+ int32_t *data;
2466
+ err = js_create_arraybuffer(env, 2, data, result);
2467
+ assert(err == 0);
2468
+
2469
+ data[0] = rational.num;
2470
+ data[1] = rational.den;
2471
+
2472
+ return result;
2473
+ }
2474
+
1833
2475
  static js_value_t *
1834
2476
  bare_ffmpeg_exports(js_env_t *env, js_value_t *exports) {
1835
2477
  uv_once(&bare_ffmpeg__init_guard, bare_ffmpeg__on_init);
@@ -1840,11 +2482,16 @@ bare_ffmpeg_exports(js_env_t *env, js_value_t *exports) {
1840
2482
  err = js_set_property<fn>(env, exports, name); \
1841
2483
  assert(err == 0);
1842
2484
 
2485
+ V("getLogLevel", bare_ffmpeg_log_get_level);
2486
+ V("setLogLevel", bare_ffmpeg_log_set_level);
2487
+
1843
2488
  V("initIOContext", bare_ffmpeg_io_context_init)
1844
2489
  V("destroyIOContext", bare_ffmpeg_io_context_destroy)
1845
2490
 
1846
2491
  V("initOutputFormat", bare_ffmpeg_output_format_init)
1847
2492
  V("initInputFormat", bare_ffmpeg_input_format_init)
2493
+ V("getOutputFormatFlags", bare_ffmpeg_output_format_get_flags)
2494
+ V("getInputFormatFlags", bare_ffmpeg_input_format_get_flags)
1848
2495
 
1849
2496
  V("openInputFormatContextWithIO", bare_ffmpeg_format_context_open_input_with_io)
1850
2497
  V("openInputFormatContextWithFormat", bare_ffmpeg_format_context_open_input_with_format)
@@ -1855,17 +2502,30 @@ bare_ffmpeg_exports(js_env_t *env, js_value_t *exports) {
1855
2502
  V("getFormatContextBestStreamIndex", bare_ffmpeg_format_context_get_best_stream_index)
1856
2503
  V("createFormatContextStream", bare_ffmpeg_format_context_create_stream)
1857
2504
  V("readFormatContextFrame", bare_ffmpeg_format_context_read_frame)
1858
-
1859
- V("getStreamCodec", bare_ffmpeg_stream_get_codec)
2505
+ V("writeFormatContextHeader", bare_ffmpeg_format_context_write_header)
2506
+ V("writeFormatContextFrame", bare_ffmpeg_format_context_write_frame)
2507
+ V("writeFormatContextTrailer", bare_ffmpeg_format_context_write_trailer)
2508
+ V("dumpFormatContext", bare_ffmpeg_format_context_dump)
2509
+
2510
+ V("getStreamIndex", bare_ffmpeg_stream_get_index)
2511
+ V("getStreamId", bare_ffmpeg_stream_get_id)
2512
+ V("setStreamId", bare_ffmpeg_stream_set_id)
2513
+ V("getStreamTimeBase", bare_ffmpeg_stream_get_time_base)
2514
+ V("setStreamTimeBase", bare_ffmpeg_stream_set_time_base)
2515
+ V("getStreamAverageFramerate", bare_ffmpeg_stream_get_avg_framerate)
2516
+ V("setStreamAverageFramerate", bare_ffmpeg_stream_set_avg_framerate)
1860
2517
  V("getStreamCodecParameters", bare_ffmpeg_stream_get_codec_parameters)
1861
2518
 
1862
2519
  V("findDecoderByID", bare_ffmpeg_find_decoder_by_id)
1863
2520
  V("findEncoderByID", bare_ffmpeg_find_encoder_by_id)
2521
+ V("getCodecNameByID", bare_ffmpeg_get_codec_name_by_id)
1864
2522
 
1865
2523
  V("initCodecContext", bare_ffmpeg_codec_context_init)
1866
2524
  V("destroyCodecContext", bare_ffmpeg_codec_context_destroy)
1867
2525
  V("openCodecContext", bare_ffmpeg_codec_context_open)
1868
2526
  V("openCodecContextWithOptions", bare_ffmpeg_codec_context_open_with_options)
2527
+ V("getCodecContextFlags", bare_ffmpeg_codec_context_get_flags)
2528
+ V("setCodecContextFlags", bare_ffmpeg_codec_context_set_flags)
1869
2529
  V("getCodecContextPixelFormat", bare_ffmpeg_codec_context_get_pixel_format)
1870
2530
  V("setCodecContextPixelFormat", bare_ffmpeg_codec_context_set_pixel_format)
1871
2531
  V("getCodecContextWidth", bare_ffmpeg_codec_context_get_width)
@@ -1882,6 +2542,8 @@ bare_ffmpeg_exports(js_env_t *env, js_value_t *exports) {
1882
2542
  V("setCodecContextSampleRate", bare_ffmpeg_codec_context_set_sample_rate);
1883
2543
  V("getCodecContextGOPSize", bare_ffmpeg_codec_context_get_gop_size)
1884
2544
  V("setCodecContextGOPSize", bare_ffmpeg_codec_context_set_gop_size)
2545
+ V("getCodecContextFramerate", bare_ffmpeg_codec_context_get_framerate)
2546
+ V("setCodecContextFramerate", bare_ffmpeg_codec_context_set_framerate)
1885
2547
 
1886
2548
  V("sendCodecContextPacket", bare_ffmpeg_codec_context_send_packet)
1887
2549
  V("receiveCodecContextPacket", bare_ffmpeg_codec_context_receive_packet)
@@ -1897,7 +2559,11 @@ bare_ffmpeg_exports(js_env_t *env, js_value_t *exports) {
1897
2559
  V("getCodecParametersSampleRate", bare_ffmpeg_codec_parameters_get_sample_rate)
1898
2560
  V("getCodecParametersNbChannels", bare_ffmpeg_codec_parameters_get_nb_channels)
1899
2561
  V("getCodecParametersCodecType", bare_ffmpeg_codec_parameters_get_codec_type)
2562
+ V("getCodecParametersCodecId", bare_ffmpeg_codec_parameters_get_codec_id)
1900
2563
  V("getCodecParametersChannelLayout", bare_ffmpeg_codec_parameters_get_channel_layout)
2564
+ V("getCodecParametersWidth", bare_ffmpeg_codec_parameters_get_width)
2565
+ V("getCodecParametersHeight", bare_ffmpeg_codec_parameters_get_height)
2566
+ V("getCodecParametersFramerate", bare_ffmpeg_codec_parameters_get_framerate)
1901
2567
 
1902
2568
  V("initFrame", bare_ffmpeg_frame_init)
1903
2569
  V("destroyFrame", bare_ffmpeg_frame_destroy)
@@ -1914,6 +2580,12 @@ bare_ffmpeg_exports(js_env_t *env, js_value_t *exports) {
1914
2580
  V("getFrameNbSamples", bare_ffmpeg_frame_get_nb_samples)
1915
2581
  V("setFrameNbSamples", bare_ffmpeg_frame_set_nb_samples)
1916
2582
  V("getFramePictType", bare_ffmpeg_frame_get_pict_type)
2583
+ V("getFramePTS", bare_ffmpeg_frame_get_pts)
2584
+ V("setFramePTS", bare_ffmpeg_frame_set_pts)
2585
+ V("getFramePacketDTS", bare_ffmpeg_frame_get_pkt_dts)
2586
+ V("setFramePacketDTS", bare_ffmpeg_frame_set_pkt_dts)
2587
+ V("getFrameTimeBase", bare_ffmpeg_frame_get_time_base)
2588
+ V("setFrameTimeBase", bare_ffmpeg_frame_set_time_base)
1917
2589
  V("allocFrame", bare_ffmpeg_frame_alloc)
1918
2590
 
1919
2591
  V("initImage", bare_ffmpeg_image_init)
@@ -1928,8 +2600,21 @@ bare_ffmpeg_exports(js_env_t *env, js_value_t *exports) {
1928
2600
  V("initPacketFromBuffer", bare_ffmpeg_packet_init_from_buffer)
1929
2601
  V("unrefPacket", bare_ffmpeg_packet_unref)
1930
2602
  V("getPacketStreamIndex", bare_ffmpeg_packet_get_stream_index)
2603
+ V("setPacketStreamIndex", bare_ffmpeg_packet_set_stream_index)
1931
2604
  V("getPacketData", bare_ffmpeg_packet_get_data)
2605
+ V("setPacketData", bare_ffmpeg_packet_set_data)
1932
2606
  V("isPacketKeyframe", bare_ffmpeg_packet_is_keyframe)
2607
+ V("getPacketDTS", bare_ffmpeg_packet_get_dts)
2608
+ V("setPacketDTS", bare_ffmpeg_packet_set_dts)
2609
+ V("getPacketPTS", bare_ffmpeg_packet_get_pts)
2610
+ V("setPacketPTS", bare_ffmpeg_packet_set_pts)
2611
+ V("getPacketTimeBase", bare_ffmpeg_packet_get_time_base)
2612
+ V("setPacketTimeBase", bare_ffmpeg_packet_set_time_base)
2613
+ V("rescalePacketTimestamps", bare_ffmpeg_packet_rescale_ts)
2614
+ V("getPacketDuration", bare_ffmpeg_packet_get_duration)
2615
+ V("setPacketDuration", bare_ffmpeg_packet_set_duration)
2616
+ V("getPacketFlags", bare_ffmpeg_packet_get_flags)
2617
+ V("setPacketFlags", bare_ffmpeg_packet_set_flags)
1933
2618
 
1934
2619
  V("initScaler", bare_ffmpeg_scaler_init)
1935
2620
  V("destroyScaler", bare_ffmpeg_scaler_destroy)
@@ -1948,6 +2633,7 @@ bare_ffmpeg_exports(js_env_t *env, js_value_t *exports) {
1948
2633
 
1949
2634
  V("copyChannelLayout", bare_ffmpeg_channel_layout_copy)
1950
2635
  V("getChannelLayoutNbChannels", bare_ffmpeg_channel_layout_get_nb_channels)
2636
+ V("getChannelLayoutMask", bare_ffmpeg_channel_layout_get_mask)
1951
2637
  V("channelLayoutFromMask", bare_ffmpeg_channel_layout_from_mask)
1952
2638
 
1953
2639
  V("initAudioFifo", bare_ffmpeg_audio_fifo_init)
@@ -1959,6 +2645,8 @@ bare_ffmpeg_exports(js_env_t *env, js_value_t *exports) {
1959
2645
  V("resetAudioFifo", bare_ffmpeg_audio_fifo_reset)
1960
2646
  V("getAudioFifoSize", bare_ffmpeg_audio_fifo_size)
1961
2647
  V("getAudioFifoSpace", bare_ffmpeg_audio_fifo_space)
2648
+
2649
+ V("rationalD2Q", bare_ffmpeg_rational_d2q)
1962
2650
  #undef V
1963
2651
 
1964
2652
  #define V(name) \
@@ -1970,11 +2658,38 @@ bare_ffmpeg_exports(js_env_t *env, js_value_t *exports) {
1970
2658
  assert(err == 0); \
1971
2659
  }
1972
2660
 
2661
+ V(AV_LOG_QUIET)
2662
+ V(AV_LOG_PANIC)
2663
+ V(AV_LOG_FATAL)
2664
+ V(AV_LOG_ERROR)
2665
+ V(AV_LOG_WARNING)
2666
+ V(AV_LOG_INFO)
2667
+ V(AV_LOG_VERBOSE)
2668
+ V(AV_LOG_DEBUG)
2669
+ V(AV_LOG_TRACE)
2670
+
1973
2671
  V(AV_CODEC_ID_MJPEG)
1974
2672
  V(AV_CODEC_ID_H264)
1975
2673
  V(AV_CODEC_ID_AAC)
1976
2674
  V(AV_CODEC_ID_OPUS)
1977
2675
  V(AV_CODEC_ID_AV1)
2676
+ V(AV_CODEC_ID_FLAC)
2677
+ V(AV_CODEC_ID_MP3)
2678
+
2679
+ V(AV_CODEC_FLAG_COPY_OPAQUE)
2680
+ V(AV_CODEC_FLAG_FRAME_DURATION)
2681
+ V(AV_CODEC_FLAG_PASS1)
2682
+ V(AV_CODEC_FLAG_PASS2)
2683
+ V(AV_CODEC_FLAG_LOOP_FILTER)
2684
+ V(AV_CODEC_FLAG_GRAY)
2685
+ V(AV_CODEC_FLAG_PSNR)
2686
+ V(AV_CODEC_FLAG_INTERLACED_DCT)
2687
+ V(AV_CODEC_FLAG_LOW_DELAY)
2688
+ V(AV_CODEC_FLAG_GLOBAL_HEADER)
2689
+ V(AV_CODEC_FLAG_BITEXACT)
2690
+ V(AV_CODEC_FLAG_AC_PRED)
2691
+ V(AV_CODEC_FLAG_INTERLACED_ME)
2692
+ V(AV_CODEC_FLAG_CLOSED_GOP)
1978
2693
 
1979
2694
  V(AV_PIX_FMT_RGBA)
1980
2695
  V(AV_PIX_FMT_RGB24)
@@ -2022,6 +2737,29 @@ bare_ffmpeg_exports(js_env_t *env, js_value_t *exports) {
2022
2737
  V(AV_PICTURE_TYPE_SI)
2023
2738
  V(AV_PICTURE_TYPE_SP)
2024
2739
  V(AV_PICTURE_TYPE_BI)
2740
+
2741
+ // InputFormat flags
2742
+ V(AVFMT_SHOW_IDS)
2743
+ V(AVFMT_GENERIC_INDEX)
2744
+ V(AVFMT_TS_DISCONT)
2745
+ V(AVFMT_NOBINSEARCH)
2746
+ V(AVFMT_NOGENSEARCH)
2747
+ V(AVFMT_NO_BYTE_SEEK)
2748
+ V(AVFMT_SEEK_TO_PTS)
2749
+
2750
+ // OutputFormat flags
2751
+ V(AVFMT_GLOBALHEADER)
2752
+ V(AVFMT_VARIABLE_FPS)
2753
+ V(AVFMT_NODIMENSIONS)
2754
+ V(AVFMT_NOSTREAMS)
2755
+ V(AVFMT_TS_NONSTRICT)
2756
+ V(AVFMT_TS_NEGATIVE)
2757
+
2758
+ // Common format flags
2759
+ V(AVFMT_NOFILE)
2760
+ V(AVFMT_NEEDNUMBER)
2761
+ V(AVFMT_NOTIMESTAMPS)
2762
+
2025
2763
  #undef V
2026
2764
 
2027
2765
  return exports;