bare-ffmpeg 1.0.0-25 → 1.0.0-27

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.
package/binding.cc CHANGED
@@ -1,3 +1,4 @@
1
+ #include <optional>
1
2
  #include <tuple>
2
3
  #include <vector>
3
4
 
@@ -16,6 +17,9 @@ extern "C" {
16
17
  #include <libavcodec/codec_par.h>
17
18
  #include <libavcodec/packet.h>
18
19
  #include <libavdevice/avdevice.h>
20
+ #include <libavfilter/avfilter.h>
21
+ #include <libavfilter/buffersink.h>
22
+ #include <libavfilter/buffersrc.h>
19
23
  #include <libavformat/avformat.h>
20
24
  #include <libavformat/avio.h>
21
25
  #include <libavutil/audio_fifo.h>
@@ -103,6 +107,26 @@ typedef struct {
103
107
  AVAudioFifo *handle;
104
108
  } bare_ffmpeg_audio_fifo_t;
105
109
 
110
+ typedef struct {
111
+ AVPacketSideData *handle;
112
+ } bare_ffmpeg_side_data_t;
113
+
114
+ typedef struct {
115
+ const AVFilter *handle;
116
+ } bare_ffmpeg_filter_t;
117
+
118
+ typedef struct {
119
+ AVFilterContext *handle;
120
+ } bare_ffmpeg_filter_context_t;
121
+
122
+ typedef struct {
123
+ AVFilterGraph *handle;
124
+ } bare_ffmpeg_filter_graph_t;
125
+
126
+ typedef struct {
127
+ AVFilterInOut *handle;
128
+ } bare_ffmpeg_filter_inout_t;
129
+
106
130
  static uv_once_t bare_ffmpeg__init_guard = UV_ONCE_INIT;
107
131
 
108
132
  static inline bool
@@ -817,6 +841,160 @@ bare_ffmpeg_get_codec_name_by_id(js_env_t *env, js_receiver_t, uint32_t id) {
817
841
  return std::string(name);
818
842
  }
819
843
 
844
+ static std::string
845
+ bare_ffmpeg_get_sample_format_name_by_id(js_env_t *env, js_receiver_t, uint32_t id) {
846
+ return av_get_sample_fmt_name(static_cast<enum AVSampleFormat>(id));
847
+ }
848
+
849
+ static std::vector<int32_t>
850
+ bare_ffmpeg_codec_get_supported_config(
851
+ js_env_t *env,
852
+ js_receiver_t,
853
+ js_arraybuffer_span_of_t<bare_ffmpeg_codec_context_t, 1> context,
854
+ js_arraybuffer_span_of_t<bare_ffmpeg_codec_t, 1> codec,
855
+ int32_t cfg
856
+ ) {
857
+ int err;
858
+
859
+ int count = 0;
860
+ const void *list = nullptr;
861
+
862
+ err = avcodec_get_supported_config(context->handle, codec->handle, static_cast<AVCodecConfig>(cfg), 0, &list, &count);
863
+ if (err < 0) {
864
+ err = js_throw_error(env, NULL, av_err2str(err));
865
+ assert(err == 0);
866
+
867
+ throw js_pending_exception;
868
+ }
869
+
870
+ std::vector<int32_t> values;
871
+
872
+ if (count > 0 && list) {
873
+ const int32_t *int_list = static_cast<const int32_t *>(list);
874
+ for (int i = 0; i < count; i++) {
875
+ values.push_back(int_list[i]);
876
+ }
877
+ return values;
878
+ }
879
+
880
+ switch (static_cast<AVCodecConfig>(cfg)) {
881
+ case AV_CODEC_CONFIG_PIX_FORMAT:
882
+ for (int i = 0; i < AV_PIX_FMT_NB; i++) {
883
+ if (av_pix_fmt_desc_get(static_cast<AVPixelFormat>(i)) != nullptr) {
884
+ values.push_back(i);
885
+ }
886
+ }
887
+ break;
888
+ case AV_CODEC_CONFIG_SAMPLE_FORMAT:
889
+ for (int i = 0; i < AV_SAMPLE_FMT_NB; i++) {
890
+ values.push_back(i);
891
+ }
892
+ break;
893
+ case AV_CODEC_CONFIG_COLOR_RANGE:
894
+ values.push_back(AVCOL_RANGE_UNSPECIFIED);
895
+ values.push_back(AVCOL_RANGE_MPEG);
896
+ values.push_back(AVCOL_RANGE_JPEG);
897
+ break;
898
+ case AV_CODEC_CONFIG_COLOR_SPACE:
899
+ for (int i = 0; i < AVCOL_SPC_NB; i++) {
900
+ values.push_back(i);
901
+ }
902
+ break;
903
+ case AV_CODEC_CONFIG_SAMPLE_RATE:
904
+ values.push_back(0);
905
+ break;
906
+ default:
907
+ break;
908
+ }
909
+
910
+ return values;
911
+ }
912
+
913
+ static std::optional<js_arraybuffer_t>
914
+ bare_ffmpeg_codec_get_supported_frame_rates(
915
+ js_env_t *env,
916
+ js_receiver_t,
917
+ js_arraybuffer_span_of_t<bare_ffmpeg_codec_context_t, 1> context,
918
+ js_arraybuffer_span_of_t<bare_ffmpeg_codec_t, 1> codec
919
+ ) {
920
+ int err;
921
+
922
+ const AVCodecContext *ctx = context->handle;
923
+ const AVCodec *c = codec->handle;
924
+
925
+ int count = 0;
926
+ const void *list = nullptr;
927
+
928
+ err = avcodec_get_supported_config(ctx, c, AV_CODEC_CONFIG_FRAME_RATE, 0, &list, &count);
929
+ if (err < 0) {
930
+ err = js_throw_error(env, NULL, av_err2str(err));
931
+ assert(err == 0);
932
+
933
+ throw js_pending_exception;
934
+ }
935
+
936
+ if (!list || count == 0) {
937
+ return std::nullopt;
938
+ }
939
+
940
+ js_arraybuffer_t result;
941
+ int32_t *data;
942
+ err = js_create_arraybuffer(env, static_cast<size_t>(count * 2), data, result);
943
+ assert(err == 0);
944
+
945
+ const AVRational *rational_list = static_cast<const AVRational *>(list);
946
+ for (int i = 0; i < count; i++) {
947
+ data[i * 2] = rational_list[i].num;
948
+ data[i * 2 + 1] = rational_list[i].den;
949
+ }
950
+
951
+ return result;
952
+ }
953
+
954
+ static std::optional<std::vector<js_arraybuffer_t>>
955
+ bare_ffmpeg_codec_get_supported_channel_layouts(
956
+ js_env_t *env,
957
+ js_receiver_t,
958
+ js_arraybuffer_span_of_t<bare_ffmpeg_codec_context_t, 1> context,
959
+ js_arraybuffer_span_of_t<bare_ffmpeg_codec_t, 1> codec
960
+ ) {
961
+ int err;
962
+ std::vector<js_arraybuffer_t> result;
963
+
964
+ const AVCodecContext *ctx = context->handle;
965
+ const AVCodec *c = codec->handle;
966
+
967
+ int count = 0;
968
+ const void *list = nullptr;
969
+
970
+ err = avcodec_get_supported_config(ctx, c, AV_CODEC_CONFIG_CHANNEL_LAYOUT, 0, &list, &count);
971
+ if (err < 0) {
972
+ err = js_throw_error(env, NULL, av_err2str(err));
973
+ assert(err == 0);
974
+
975
+ throw js_pending_exception;
976
+ }
977
+
978
+ if (!list || count == 0) {
979
+ return std::nullopt;
980
+ }
981
+
982
+ const AVChannelLayout *layout_list = static_cast<const AVChannelLayout *>(list);
983
+ for (int i = 0; i < count; i++) {
984
+ js_arraybuffer_t handle;
985
+ bare_ffmpeg_channel_layout_t *layout;
986
+ err = js_create_arraybuffer(env, layout, handle);
987
+ assert(err == 0);
988
+
989
+ err = av_channel_layout_copy(&layout->handle, &layout_list[i]);
990
+ assert(err >= 0);
991
+
992
+ result.push_back(handle);
993
+ }
994
+
995
+ return result;
996
+ }
997
+
820
998
  static js_arraybuffer_t
821
999
  bare_ffmpeg_codec_context_init(
822
1000
  js_env_t *env,
@@ -884,6 +1062,49 @@ bare_ffmpeg_codec_context_set_flags(
884
1062
  context->handle->flags = value;
885
1063
  }
886
1064
 
1065
+ static js_arraybuffer_t
1066
+ bare_ffmpeg_codec_context_get_extra_data(
1067
+ js_env_t *env,
1068
+ js_receiver_t,
1069
+ js_arraybuffer_span_of_t<bare_ffmpeg_codec_context_t, 1> context
1070
+ ) {
1071
+ js_arraybuffer_t buffer;
1072
+ int err = js_create_arraybuffer(
1073
+ env,
1074
+ context->handle->extradata,
1075
+ static_cast<size_t>(context->handle->extradata_size),
1076
+ buffer
1077
+ );
1078
+ assert(err == 0);
1079
+
1080
+ return buffer;
1081
+ }
1082
+
1083
+ void
1084
+ bare_ffmpeg_codec_context_set_extra_data(
1085
+ js_env_t *env,
1086
+ js_receiver_t,
1087
+ js_arraybuffer_span_of_t<bare_ffmpeg_codec_context_t, 1> context,
1088
+ js_arraybuffer_t buffer,
1089
+ uint32_t offset,
1090
+ uint32_t len
1091
+ ) {
1092
+ std::span<uint8_t> view;
1093
+ int err = js_get_arraybuffer_info(env, buffer, view);
1094
+ assert(err == 0);
1095
+
1096
+ if (context->handle->extradata_size) {
1097
+ av_free(context->handle->extradata);
1098
+ }
1099
+
1100
+ context->handle->extradata = reinterpret_cast<uint8_t *>(av_malloc(len + AV_INPUT_BUFFER_PADDING_SIZE));
1101
+
1102
+ memset(&context->handle->extradata[len], 0, AV_INPUT_BUFFER_PADDING_SIZE);
1103
+ memcpy(context->handle->extradata, &view[offset], len);
1104
+
1105
+ context->handle->extradata_size = static_cast<int>(len);
1106
+ }
1107
+
887
1108
  static int
888
1109
  bare_ffmpeg_frame_get_format(
889
1110
  js_env_t *env,
@@ -1135,6 +1356,24 @@ bare_ffmpeg_codec_context_set_gop_size(
1135
1356
  context->handle->gop_size = gop_size;
1136
1357
  }
1137
1358
 
1359
+ static int
1360
+ bare_ffmpeg_codec_context_get_frame_size(
1361
+ js_env_t *env,
1362
+ js_receiver_t,
1363
+ js_arraybuffer_span_of_t<bare_ffmpeg_codec_context_t, 1> context
1364
+ ) {
1365
+ return context->handle->frame_size;
1366
+ }
1367
+
1368
+ static int64_t
1369
+ bare_ffmpeg_codec_context_get_frame_num(
1370
+ js_env_t *env,
1371
+ js_receiver_t,
1372
+ js_arraybuffer_span_of_t<bare_ffmpeg_codec_context_t, 1> context
1373
+ ) {
1374
+ return context->handle->frame_num;
1375
+ }
1376
+
1138
1377
  static js_arraybuffer_t
1139
1378
  bare_ffmpeg_codec_context_get_framerate(
1140
1379
  js_env_t *env,
@@ -1809,6 +2048,25 @@ bare_ffmpeg_codec_parameters_set_video_delay(
1809
2048
  parameters->handle->video_delay = delay;
1810
2049
  }
1811
2050
 
2051
+ static int
2052
+ bare_ffmpeg_codec_parameters_get_frame_size(
2053
+ js_env_t *env,
2054
+ js_receiver_t,
2055
+ js_arraybuffer_span_of_t<bare_ffmpeg_codec_parameters_t, 1> parameters
2056
+ ) {
2057
+ return parameters->handle->frame_size;
2058
+ }
2059
+
2060
+ static void
2061
+ bare_ffmpeg_codec_parameters_set_frame_size(
2062
+ js_env_t *env,
2063
+ js_receiver_t,
2064
+ js_arraybuffer_span_of_t<bare_ffmpeg_codec_parameters_t, 1> parameters,
2065
+ int frame_size
2066
+ ) {
2067
+ parameters->handle->frame_size = frame_size;
2068
+ }
2069
+
1812
2070
  static js_arraybuffer_t
1813
2071
  bare_ffmpeg_frame_init(js_env_t *env, js_receiver_t) {
1814
2072
  int err;
@@ -2129,71 +2387,60 @@ bare_ffmpeg_image_get_line_size(
2129
2387
  );
2130
2388
  }
2131
2389
 
2132
- static js_arraybuffer_t
2133
- bare_ffmpeg_samples_init(
2390
+ static int
2391
+ bare_ffmpeg_samples_buffer_size(
2134
2392
  js_env_t *env,
2135
2393
  js_receiver_t,
2136
2394
  int32_t sample_format,
2137
2395
  int32_t nb_channels,
2138
2396
  int32_t nb_samples,
2139
- int32_t align
2397
+ bool no_alignment
2140
2398
  ) {
2141
- int err;
2142
-
2143
2399
  auto len = av_samples_get_buffer_size(
2144
2400
  NULL,
2145
2401
  nb_channels,
2146
2402
  nb_samples,
2147
2403
  static_cast<AVSampleFormat>(sample_format),
2148
- align
2404
+ no_alignment
2149
2405
  );
2150
2406
 
2151
2407
  if (len < 0) {
2152
- err = js_throw_error(env, NULL, av_err2str(len));
2408
+ int err = js_throw_error(env, NULL, av_err2str(len));
2153
2409
  assert(err == 0);
2154
2410
 
2155
2411
  throw js_pending_exception;
2156
2412
  }
2157
2413
 
2158
- js_arraybuffer_t handle;
2159
- err = js_create_arraybuffer(env, static_cast<size_t>(len), handle);
2160
- assert(err == 0);
2161
-
2162
- return handle;
2414
+ return len;
2163
2415
  }
2164
2416
 
2165
2417
  static int
2166
2418
  bare_ffmpeg_samples_fill(
2167
2419
  js_env_t *env,
2168
2420
  js_receiver_t,
2169
- int32_t sample_format,
2170
- int32_t nb_channels,
2171
- int32_t nb_samples,
2172
- int32_t align,
2173
- js_arraybuffer_span_t data,
2421
+ js_arraybuffer_span_of_t<bare_ffmpeg_frame_t, 1> frame,
2422
+ js_arraybuffer_span_t target,
2174
2423
  uint64_t offset,
2175
- js_arraybuffer_span_of_t<bare_ffmpeg_frame_t, 1> frame
2424
+ bool no_alignment
2176
2425
  ) {
2177
- int err;
2178
-
2179
- auto len = av_samples_fill_arrays(
2426
+ auto res = av_samples_fill_arrays(
2180
2427
  frame->handle->data,
2181
2428
  frame->handle->linesize,
2182
- &data[static_cast<size_t>(offset)],
2183
- nb_channels,
2184
- nb_samples,
2185
- static_cast<AVSampleFormat>(sample_format),
2186
- align
2429
+ &target[offset],
2430
+ frame->handle->ch_layout.nb_channels,
2431
+ frame->handle->nb_samples,
2432
+ static_cast<AVSampleFormat>(frame->handle->format),
2433
+ no_alignment
2187
2434
  );
2188
2435
 
2189
- if (len < 0) {
2190
- err = js_throw_error(env, NULL, av_err2str(len));
2436
+ if (res < 0) {
2437
+ int err = js_throw_error(env, NULL, av_err2str(res));
2191
2438
  assert(err == 0);
2192
2439
 
2193
2440
  throw js_pending_exception;
2194
2441
  }
2195
2442
 
2196
- return len;
2443
+ return res;
2197
2444
  }
2198
2445
 
2199
2446
  static js_arraybuffer_t
@@ -2318,6 +2565,62 @@ bare_ffmpeg_packet_set_data(
2318
2565
  memcpy(packet->handle->data, &data[offset], len);
2319
2566
  }
2320
2567
 
2568
+ static std::vector<js_arraybuffer_t>
2569
+ bare_ffmpeg_packet_get_side_data(
2570
+ js_env_t *env,
2571
+ js_receiver_t,
2572
+ js_arraybuffer_span_of_t<bare_ffmpeg_packet_t, 1> packet
2573
+ ) {
2574
+ std::vector<js_arraybuffer_t> res{};
2575
+
2576
+ int count = packet->handle->side_data_elems;
2577
+ if (count == 0) return res;
2578
+
2579
+ for (int i = 0; i < count; i++) {
2580
+ js_arraybuffer_t handle;
2581
+ bare_ffmpeg_side_data_t *sd;
2582
+ int err = js_create_arraybuffer(env, sd, handle);
2583
+ assert(err == 0);
2584
+
2585
+ sd->handle = &packet->handle->side_data[i];
2586
+
2587
+ res.push_back(handle);
2588
+ }
2589
+
2590
+ return res;
2591
+ }
2592
+
2593
+ static void
2594
+ bare_ffmpeg_packet_set_side_data(
2595
+ js_env_t *env,
2596
+ js_receiver_t,
2597
+ js_arraybuffer_span_of_t<bare_ffmpeg_packet_t, 1> packet,
2598
+ std::vector<js_object_t> side_data_array
2599
+ ) {
2600
+ for (js_object_t side_data : side_data_array) {
2601
+ int err;
2602
+
2603
+ int32_t type;
2604
+ err = js_get_property(env, side_data, "type", type);
2605
+ assert(err == 0);
2606
+
2607
+ js_arraybuffer_span_t buf;
2608
+ err = js_get_property(env, side_data, "buffer", buf);
2609
+ assert(err == 0);
2610
+
2611
+ int32_t offset;
2612
+ err = js_get_property(env, side_data, "offset", offset);
2613
+ assert(err == 0);
2614
+
2615
+ int32_t len;
2616
+ err = js_get_property(env, side_data, "length", len);
2617
+ assert(err == 0);
2618
+
2619
+ uint8_t *data = av_packet_new_side_data(packet->handle, static_cast<AVPacketSideDataType>(type), static_cast<size_t>(len));
2620
+ memcpy(data, &buf[static_cast<size_t>(offset)], static_cast<size_t>(len));
2621
+ }
2622
+ }
2623
+
2321
2624
  static bool
2322
2625
  bare_ffmpeg_packet_is_keyframe(
2323
2626
  js_env_t *,
@@ -2327,6 +2630,20 @@ bare_ffmpeg_packet_is_keyframe(
2327
2630
  return packet->handle->flags & AV_PKT_FLAG_KEY;
2328
2631
  }
2329
2632
 
2633
+ static void
2634
+ bare_ffmpeg_packet_set_is_keyframe(
2635
+ js_env_t *,
2636
+ js_receiver_t,
2637
+ js_arraybuffer_span_of_t<bare_ffmpeg_packet_t, 1> packet,
2638
+ bool has_key_frame
2639
+ ) {
2640
+ if (has_key_frame) {
2641
+ packet->handle->flags |= AV_PKT_FLAG_KEY;
2642
+ } else {
2643
+ packet->handle->flags &= ~AV_PKT_FLAG_KEY;
2644
+ }
2645
+ }
2646
+
2330
2647
  static int64_t
2331
2648
  bare_ffmpeg_packet_get_dts(
2332
2649
  js_env_t *env,
@@ -2469,6 +2786,58 @@ bare_ffmpeg_packet_set_flags(
2469
2786
  packet->handle->flags = value;
2470
2787
  }
2471
2788
 
2789
+ static void
2790
+ bare_ffmpeg_packet_copy_props(
2791
+ js_env_t *env,
2792
+ js_receiver_t,
2793
+ js_arraybuffer_span_of_t<bare_ffmpeg_packet_t, 1> dst,
2794
+ js_arraybuffer_span_of_t<bare_ffmpeg_packet_t, 1> src
2795
+ ) {
2796
+ int err;
2797
+
2798
+ err = av_packet_copy_props(dst->handle, src->handle);
2799
+ if (err < 0) {
2800
+ err = js_throw_error(env, NULL, av_err2str(err));
2801
+ assert(err == 0);
2802
+
2803
+ throw js_pending_exception;
2804
+ }
2805
+ }
2806
+
2807
+ static int
2808
+ bare_ffmpeg_side_data_get_type(
2809
+ js_env_t *env,
2810
+ js_receiver_t,
2811
+ js_arraybuffer_span_of_t<bare_ffmpeg_side_data_t, 1> side_data
2812
+ ) {
2813
+ return side_data->handle->type;
2814
+ }
2815
+
2816
+ static std::string
2817
+ bare_ffmpeg_side_data_get_name(
2818
+ js_env_t *env,
2819
+ js_receiver_t,
2820
+ js_arraybuffer_span_of_t<bare_ffmpeg_side_data_t, 1> side_data
2821
+ ) {
2822
+ return av_packet_side_data_name(side_data->handle->type);
2823
+ }
2824
+
2825
+ static js_arraybuffer_t
2826
+ bare_ffmpeg_side_data_get_data(
2827
+ js_env_t *env,
2828
+ js_receiver_t,
2829
+ js_arraybuffer_span_of_t<bare_ffmpeg_side_data_t, 1> side_data
2830
+ ) {
2831
+ js_arraybuffer_t handle;
2832
+ uint8_t *buf;
2833
+ int err = js_create_arraybuffer(env, side_data->handle->size, buf, handle);
2834
+ assert(err == 0);
2835
+
2836
+ memcpy(buf, side_data->handle->data, side_data->handle->size);
2837
+
2838
+ return handle;
2839
+ }
2840
+
2472
2841
  static js_arraybuffer_t
2473
2842
  bare_ffmpeg_scaler_init(
2474
2843
  js_env_t *env,
@@ -2693,8 +3062,6 @@ bare_ffmpeg_resampler_convert_frames(
2693
3062
  throw js_pending_exception;
2694
3063
  }
2695
3064
 
2696
- out_frame->handle->nb_samples = result;
2697
-
2698
3065
  return result;
2699
3066
  }
2700
3067
 
@@ -2973,6 +3340,246 @@ bare_ffmpeg_rational_d2q(
2973
3340
  return result;
2974
3341
  }
2975
3342
 
3343
+ static js_arraybuffer_t
3344
+ bare_ffmpeg_filter_get_by_name(
3345
+ js_env_t *env,
3346
+ js_receiver_t,
3347
+ std::string name
3348
+ ) {
3349
+ int err;
3350
+
3351
+ js_arraybuffer_t handle;
3352
+ bare_ffmpeg_filter_t *filter;
3353
+ err = js_create_arraybuffer(env, filter, handle);
3354
+ assert(err == 0);
3355
+
3356
+ filter->handle = avfilter_get_by_name(name.c_str());
3357
+ if (filter->handle == nullptr) {
3358
+ err = js_throw_errorf(env, nullptr, "No Filter found for '%s' name", name.c_str());
3359
+ assert(err == 0);
3360
+
3361
+ throw js_pending_exception;
3362
+ }
3363
+
3364
+ return handle;
3365
+ }
3366
+
3367
+ static js_arraybuffer_t
3368
+ bare_ffmpeg_filter_context_init(
3369
+ js_env_t *env,
3370
+ js_receiver_t
3371
+ ) {
3372
+ js_arraybuffer_t handle;
3373
+ bare_ffmpeg_filter_context_t *filter_ctx;
3374
+ int err = js_create_arraybuffer(env, filter_ctx, handle);
3375
+ assert(err == 0);
3376
+
3377
+ return handle;
3378
+ }
3379
+
3380
+ static js_arraybuffer_t
3381
+ bare_ffmpeg_filter_graph_init(
3382
+ js_env_t *env,
3383
+ js_receiver_t
3384
+ ) {
3385
+ js_arraybuffer_t handle;
3386
+ bare_ffmpeg_filter_graph_t *filter_graph;
3387
+ int err = js_create_arraybuffer(env, filter_graph, handle);
3388
+ assert(err == 0);
3389
+
3390
+ filter_graph->handle = avfilter_graph_alloc();
3391
+ assert(filter_graph->handle != nullptr);
3392
+
3393
+ return handle;
3394
+ }
3395
+
3396
+ static void
3397
+ bare_ffmpeg_filter_graph_destroy(
3398
+ js_env_t *env,
3399
+ js_receiver_t,
3400
+ js_arraybuffer_span_of_t<bare_ffmpeg_filter_graph_t, 1> filter_graph
3401
+ ) {
3402
+ avfilter_graph_free(&filter_graph->handle);
3403
+ }
3404
+
3405
+ static void
3406
+ bare_ffmpeg_filter_graph_create_filter(
3407
+ js_env_t *env,
3408
+ js_receiver_t,
3409
+ js_arraybuffer_span_of_t<bare_ffmpeg_filter_graph_t, 1> graph,
3410
+ js_arraybuffer_span_of_t<bare_ffmpeg_filter_context_t, 1> filter_context,
3411
+ js_arraybuffer_span_of_t<bare_ffmpeg_filter_t, 1> filter,
3412
+ std::string name,
3413
+ std::optional<std::string> args
3414
+ ) {
3415
+ int err = avfilter_graph_create_filter(
3416
+ &filter_context->handle,
3417
+ filter->handle,
3418
+ name.c_str(),
3419
+ args.has_value() ? args.value().c_str() : nullptr,
3420
+ nullptr,
3421
+ graph->handle
3422
+ );
3423
+
3424
+ if (err < 0) {
3425
+ err = js_throw_error(env, nullptr, av_err2str(err));
3426
+ assert(err == 0);
3427
+
3428
+ throw js_pending_exception;
3429
+ }
3430
+ }
3431
+
3432
+ static void
3433
+ bare_ffmpeg_filter_graph_parse(
3434
+ js_env_t *env,
3435
+ js_receiver_t,
3436
+ js_arraybuffer_span_of_t<bare_ffmpeg_filter_graph_t, 1> graph,
3437
+ js_arraybuffer_span_of_t<bare_ffmpeg_filter_inout_t, 1> inputs,
3438
+ js_arraybuffer_span_of_t<bare_ffmpeg_filter_inout_t, 1> outputs,
3439
+ std::string filter_description
3440
+ ) {
3441
+ int err = avfilter_graph_parse(graph->handle, filter_description.c_str(), inputs->handle, outputs->handle, nullptr);
3442
+ if (err < 0) {
3443
+ err = js_throw_error(env, nullptr, av_err2str(err));
3444
+ assert(err == 0);
3445
+
3446
+ throw js_pending_exception;
3447
+ }
3448
+ }
3449
+
3450
+ static void
3451
+ bare_ffmpeg_filter_graph_configure(
3452
+ js_env_t *env,
3453
+ js_receiver_t,
3454
+ js_arraybuffer_span_of_t<bare_ffmpeg_filter_graph_t, 1> graph
3455
+ ) {
3456
+ int err = avfilter_graph_config(graph->handle, nullptr);
3457
+ if (err < 0) {
3458
+ err = js_throw_error(env, nullptr, av_err2str(err));
3459
+ assert(err == 0);
3460
+
3461
+ throw js_pending_exception;
3462
+ }
3463
+ }
3464
+
3465
+ static int
3466
+ bare_ffmpeg_filter_graph_push_frame(
3467
+ js_env_t *env,
3468
+ js_receiver_t,
3469
+ js_arraybuffer_span_of_t<bare_ffmpeg_filter_context_t, 1> ctx,
3470
+ js_arraybuffer_span_of_t<bare_ffmpeg_frame_t, 1> frame
3471
+ ) {
3472
+ return av_buffersrc_add_frame(ctx->handle, frame->handle);
3473
+ }
3474
+
3475
+ static int
3476
+ bare_ffmpeg_filter_graph_pull_frame(
3477
+ js_env_t *env,
3478
+ js_receiver_t,
3479
+ js_arraybuffer_span_of_t<bare_ffmpeg_filter_context_t, 1> ctx,
3480
+ js_arraybuffer_span_of_t<bare_ffmpeg_frame_t, 1> frame
3481
+ ) {
3482
+ return av_buffersink_get_frame(ctx->handle, frame->handle);
3483
+ }
3484
+
3485
+ static js_arraybuffer_t
3486
+ bare_ffmpeg_filter_inout_init(
3487
+ js_env_t *env,
3488
+ js_receiver_t
3489
+ ) {
3490
+ js_arraybuffer_t handle;
3491
+ bare_ffmpeg_filter_inout_t *filter_inout;
3492
+ int err = js_create_arraybuffer(env, filter_inout, handle);
3493
+ assert(err == 0);
3494
+
3495
+ filter_inout->handle = avfilter_inout_alloc();
3496
+ assert(filter_inout->handle);
3497
+
3498
+ return handle;
3499
+ }
3500
+
3501
+ static void
3502
+ bare_ffmpeg_filter_inout_destroy(
3503
+ js_env_t *env,
3504
+ js_receiver_t,
3505
+ js_arraybuffer_span_of_t<bare_ffmpeg_filter_inout_t, 1> filter_inout
3506
+ ) {
3507
+ avfilter_inout_free(&filter_inout->handle);
3508
+ }
3509
+
3510
+ static std::optional<std::string>
3511
+ bare_ffmpeg_filter_inout_get_name(
3512
+ js_env_t *env,
3513
+ js_receiver_t,
3514
+ js_arraybuffer_span_of_t<bare_ffmpeg_filter_inout_t, 1> filter_inout
3515
+ ) {
3516
+ if (!filter_inout->handle->name) return std::nullopt;
3517
+ return filter_inout->handle->name;
3518
+ }
3519
+
3520
+ static void
3521
+ bare_ffmpeg_filter_inout_set_name(
3522
+ js_env_t *env,
3523
+ js_receiver_t,
3524
+ js_arraybuffer_span_of_t<bare_ffmpeg_filter_inout_t, 1> filter_inout,
3525
+ std::string name
3526
+ ) {
3527
+ if (filter_inout->handle->name) {
3528
+ av_free(filter_inout->handle->name);
3529
+ }
3530
+ filter_inout->handle->name = av_strdup(name.c_str());
3531
+ }
3532
+
3533
+ static void
3534
+ bare_ffmpeg_filter_inout_set_filter_context(
3535
+ js_env_t *env,
3536
+ js_receiver_t,
3537
+ js_arraybuffer_span_of_t<bare_ffmpeg_filter_inout_t, 1> filter_inout,
3538
+ js_arraybuffer_span_of_t<bare_ffmpeg_filter_context_t, 1> filter_ctx
3539
+ ) {
3540
+ filter_inout->handle->filter_ctx = filter_ctx->handle;
3541
+ }
3542
+
3543
+ static int
3544
+ bare_ffmpeg_filter_inout_get_pad_idx(
3545
+ js_env_t *env,
3546
+ js_receiver_t,
3547
+ js_arraybuffer_span_of_t<bare_ffmpeg_filter_inout_t, 1> filter_inout
3548
+ ) {
3549
+ return filter_inout->handle->pad_idx;
3550
+ }
3551
+
3552
+ static void
3553
+ bare_ffmpeg_filter_inout_set_pad_idx(
3554
+ js_env_t *env,
3555
+ js_receiver_t,
3556
+ js_arraybuffer_span_of_t<bare_ffmpeg_filter_inout_t, 1> filter_inout,
3557
+ int pad_idx
3558
+ ) {
3559
+ filter_inout->handle->pad_idx = pad_idx;
3560
+ }
3561
+
3562
+ static void
3563
+ bare_ffmpeg_filter_inout_set_next(
3564
+ js_env_t *env,
3565
+ js_receiver_t,
3566
+ js_arraybuffer_span_of_t<bare_ffmpeg_filter_inout_t, 1> filter_inout,
3567
+ js_arraybuffer_span_of_t<bare_ffmpeg_filter_inout_t, 1> next
3568
+ ) {
3569
+ filter_inout->handle->next = next->handle;
3570
+ }
3571
+
3572
+ static int64_t
3573
+ bare_ffmpeg_rational_rescale_q(
3574
+ int64_t ts,
3575
+ int32_t bq_num,
3576
+ int32_t bq_den,
3577
+ int32_t cq_num,
3578
+ int32_t cq_den
3579
+ ) {
3580
+ return av_rescale_q(ts, {bq_num, bq_den}, {cq_num, cq_den});
3581
+ }
3582
+
2976
3583
  static js_value_t *
2977
3584
  bare_ffmpeg_exports(js_env_t *env, js_value_t *exports) {
2978
3585
  uv_once(&bare_ffmpeg__init_guard, bare_ffmpeg__on_init);
@@ -3020,6 +3627,10 @@ bare_ffmpeg_exports(js_env_t *env, js_value_t *exports) {
3020
3627
  V("findDecoderByID", bare_ffmpeg_find_decoder_by_id)
3021
3628
  V("findEncoderByID", bare_ffmpeg_find_encoder_by_id)
3022
3629
  V("getCodecNameByID", bare_ffmpeg_get_codec_name_by_id)
3630
+ V("getSampleFormatNameByID", bare_ffmpeg_get_sample_format_name_by_id)
3631
+ V("getSupportedConfig", bare_ffmpeg_codec_get_supported_config)
3632
+ V("getSupportedFrameRates", bare_ffmpeg_codec_get_supported_frame_rates)
3633
+ V("getSupportedChannelLayouts", bare_ffmpeg_codec_get_supported_channel_layouts)
3023
3634
 
3024
3635
  V("initCodecContext", bare_ffmpeg_codec_context_init)
3025
3636
  V("destroyCodecContext", bare_ffmpeg_codec_context_destroy)
@@ -3045,6 +3656,10 @@ bare_ffmpeg_exports(js_env_t *env, js_value_t *exports) {
3045
3656
  V("setCodecContextGOPSize", bare_ffmpeg_codec_context_set_gop_size)
3046
3657
  V("getCodecContextFramerate", bare_ffmpeg_codec_context_get_framerate)
3047
3658
  V("setCodecContextFramerate", bare_ffmpeg_codec_context_set_framerate)
3659
+ V("getCodecContextExtraData", bare_ffmpeg_codec_context_get_extra_data)
3660
+ V("setCodecContextExtraData", bare_ffmpeg_codec_context_set_extra_data)
3661
+ V("getCodecContextFrameSize", bare_ffmpeg_codec_context_get_frame_size)
3662
+ V("getCodecContextFrameNum", bare_ffmpeg_codec_context_get_frame_num)
3048
3663
 
3049
3664
  V("sendCodecContextPacket", bare_ffmpeg_codec_context_send_packet)
3050
3665
  V("receiveCodecContextPacket", bare_ffmpeg_codec_context_receive_packet)
@@ -3099,6 +3714,8 @@ bare_ffmpeg_exports(js_env_t *env, js_value_t *exports) {
3099
3714
  V("setCodecParametersSampleAspectRatio", bare_ffmpeg_codec_parameters_set_sample_aspect_ratio)
3100
3715
  V("getCodecParametersVideoDelay", bare_ffmpeg_codec_parameters_get_video_delay)
3101
3716
  V("setCodecParametersVideoDelay", bare_ffmpeg_codec_parameters_set_video_delay)
3717
+ V("getCodecParametersFrameSize", bare_ffmpeg_codec_parameters_get_frame_size)
3718
+ V("setCodecParametersFrameSize", bare_ffmpeg_codec_parameters_set_frame_size)
3102
3719
 
3103
3720
  V("initFrame", bare_ffmpeg_frame_init)
3104
3721
  V("destroyFrame", bare_ffmpeg_frame_destroy)
@@ -3127,7 +3744,7 @@ bare_ffmpeg_exports(js_env_t *env, js_value_t *exports) {
3127
3744
  V("readImage", bare_ffmpeg_image_read)
3128
3745
  V("getImageLineSize", bare_ffmpeg_image_get_line_size)
3129
3746
 
3130
- V("initSamples", bare_ffmpeg_samples_init)
3747
+ V("samplesBufferSize", bare_ffmpeg_samples_buffer_size)
3131
3748
  V("fillSamples", bare_ffmpeg_samples_fill)
3132
3749
 
3133
3750
  V("initPacket", bare_ffmpeg_packet_init)
@@ -3138,7 +3755,10 @@ bare_ffmpeg_exports(js_env_t *env, js_value_t *exports) {
3138
3755
  V("setPacketStreamIndex", bare_ffmpeg_packet_set_stream_index)
3139
3756
  V("getPacketData", bare_ffmpeg_packet_get_data)
3140
3757
  V("setPacketData", bare_ffmpeg_packet_set_data)
3758
+ V("getPacketSideData", bare_ffmpeg_packet_get_side_data)
3759
+ V("setPacketSideData", bare_ffmpeg_packet_set_side_data)
3141
3760
  V("isPacketKeyframe", bare_ffmpeg_packet_is_keyframe)
3761
+ V("setPacketIsKeyFrame", bare_ffmpeg_packet_set_is_keyframe)
3142
3762
  V("getPacketDTS", bare_ffmpeg_packet_get_dts)
3143
3763
  V("setPacketDTS", bare_ffmpeg_packet_set_dts)
3144
3764
  V("getPacketPTS", bare_ffmpeg_packet_get_pts)
@@ -3150,6 +3770,11 @@ bare_ffmpeg_exports(js_env_t *env, js_value_t *exports) {
3150
3770
  V("setPacketDuration", bare_ffmpeg_packet_set_duration)
3151
3771
  V("getPacketFlags", bare_ffmpeg_packet_get_flags)
3152
3772
  V("setPacketFlags", bare_ffmpeg_packet_set_flags)
3773
+ V("copyPacketProps", bare_ffmpeg_packet_copy_props)
3774
+
3775
+ V("getSideDataType", bare_ffmpeg_side_data_get_type)
3776
+ V("getSideDataName", bare_ffmpeg_side_data_get_name)
3777
+ V("getSideDataBuffer", bare_ffmpeg_side_data_get_data)
3153
3778
 
3154
3779
  V("initScaler", bare_ffmpeg_scaler_init)
3155
3780
  V("destroyScaler", bare_ffmpeg_scaler_destroy)
@@ -3183,6 +3808,28 @@ bare_ffmpeg_exports(js_env_t *env, js_value_t *exports) {
3183
3808
  V("getAudioFifoSpace", bare_ffmpeg_audio_fifo_space)
3184
3809
 
3185
3810
  V("rationalD2Q", bare_ffmpeg_rational_d2q)
3811
+ V("rationalRescaleQ", bare_ffmpeg_rational_rescale_q)
3812
+
3813
+ V("getFilterByName", bare_ffmpeg_filter_get_by_name)
3814
+
3815
+ V("initFilterContext", bare_ffmpeg_filter_context_init)
3816
+
3817
+ V("initFilterGraph", bare_ffmpeg_filter_graph_init)
3818
+ V("destroyFilterGraph", bare_ffmpeg_filter_graph_destroy)
3819
+ V("createFilterGraphFilter", bare_ffmpeg_filter_graph_create_filter)
3820
+ V("parseFilterGraph", bare_ffmpeg_filter_graph_parse)
3821
+ V("configureFilterGraph", bare_ffmpeg_filter_graph_configure)
3822
+ V("pushFilterGraphFrame", bare_ffmpeg_filter_graph_push_frame)
3823
+ V("pullFilterGraphFrame", bare_ffmpeg_filter_graph_pull_frame)
3824
+
3825
+ V("initFilterInout", bare_ffmpeg_filter_inout_init)
3826
+ V("destroyFilterInOut", bare_ffmpeg_filter_inout_destroy)
3827
+ V("getFilterInOutName", bare_ffmpeg_filter_inout_get_name)
3828
+ V("setFilterInOutName", bare_ffmpeg_filter_inout_set_name)
3829
+ V("setFilterInOutFilterContext", bare_ffmpeg_filter_inout_set_filter_context)
3830
+ V("getFilterInOutPadIdx", bare_ffmpeg_filter_inout_get_pad_idx)
3831
+ V("setFilterInOutPadIdx", bare_ffmpeg_filter_inout_set_pad_idx)
3832
+ V("setFilterInOutNext", bare_ffmpeg_filter_inout_set_next)
3186
3833
  #undef V
3187
3834
 
3188
3835
  #define V(name) \
@@ -3417,6 +4064,57 @@ bare_ffmpeg_exports(js_env_t *env, js_value_t *exports) {
3417
4064
  V(SEEK_CUR)
3418
4065
  V(SEEK_SET)
3419
4066
  V(SEEK_END)
4067
+
4068
+ V(AV_PKT_DATA_PALETTE)
4069
+ V(AV_PKT_DATA_NEW_EXTRADATA)
4070
+ V(AV_PKT_DATA_PARAM_CHANGE)
4071
+ V(AV_PKT_DATA_H263_MB_INFO)
4072
+ V(AV_PKT_DATA_REPLAYGAIN)
4073
+ V(AV_PKT_DATA_DISPLAYMATRIX)
4074
+ V(AV_PKT_DATA_STEREO3D)
4075
+ V(AV_PKT_DATA_AUDIO_SERVICE_TYPE)
4076
+ V(AV_PKT_DATA_QUALITY_STATS)
4077
+ V(AV_PKT_DATA_FALLBACK_TRACK)
4078
+ V(AV_PKT_DATA_CPB_PROPERTIES)
4079
+ V(AV_PKT_DATA_SKIP_SAMPLES)
4080
+ V(AV_PKT_DATA_JP_DUALMONO)
4081
+ V(AV_PKT_DATA_STRINGS_METADATA)
4082
+ V(AV_PKT_DATA_SUBTITLE_POSITION)
4083
+ V(AV_PKT_DATA_MATROSKA_BLOCKADDITIONAL)
4084
+ V(AV_PKT_DATA_WEBVTT_IDENTIFIER)
4085
+ V(AV_PKT_DATA_WEBVTT_SETTINGS)
4086
+ V(AV_PKT_DATA_METADATA_UPDATE)
4087
+ V(AV_PKT_DATA_MPEGTS_STREAM_ID)
4088
+ V(AV_PKT_DATA_MASTERING_DISPLAY_METADATA)
4089
+ V(AV_PKT_DATA_SPHERICAL)
4090
+ V(AV_PKT_DATA_CONTENT_LIGHT_LEVEL)
4091
+ V(AV_PKT_DATA_A53_CC)
4092
+ V(AV_PKT_DATA_ENCRYPTION_INIT_INFO)
4093
+ V(AV_PKT_DATA_ENCRYPTION_INFO)
4094
+ V(AV_PKT_DATA_AFD)
4095
+ V(AV_PKT_DATA_PRFT)
4096
+ V(AV_PKT_DATA_ICC_PROFILE)
4097
+ V(AV_PKT_DATA_DOVI_CONF)
4098
+ V(AV_PKT_DATA_S12M_TIMECODE)
4099
+ V(AV_PKT_DATA_DYNAMIC_HDR10_PLUS)
4100
+ V(AV_PKT_DATA_IAMF_MIX_GAIN_PARAM)
4101
+ V(AV_PKT_DATA_IAMF_DEMIXING_INFO_PARAM)
4102
+ V(AV_PKT_DATA_IAMF_RECON_GAIN_INFO_PARAM)
4103
+ V(AV_PKT_DATA_AMBIENT_VIEWING_ENVIRONMENT)
4104
+ V(AV_PKT_DATA_FRAME_CROPPING)
4105
+ V(AV_PKT_DATA_LCEVC)
4106
+ V(AV_PKT_DATA_3D_REFERENCE_DISPLAYS)
4107
+ V(AV_PKT_DATA_RTCP_SR)
4108
+ V(AV_PKT_DATA_NB)
4109
+
4110
+ V(AV_CODEC_CONFIG_PIX_FORMAT)
4111
+ V(AV_CODEC_CONFIG_FRAME_RATE)
4112
+ V(AV_CODEC_CONFIG_SAMPLE_RATE)
4113
+ V(AV_CODEC_CONFIG_SAMPLE_FORMAT)
4114
+ V(AV_CODEC_CONFIG_CHANNEL_LAYOUT)
4115
+ V(AV_CODEC_CONFIG_COLOR_RANGE)
4116
+ V(AV_CODEC_CONFIG_COLOR_SPACE)
4117
+
3420
4118
  #undef V
3421
4119
 
3422
4120
  return exports;