bare-ffmpeg 1.0.0-0 → 1.0.0-1

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.c CHANGED
@@ -6,14 +6,17 @@
6
6
  #include <libavcodec/codec_id.h>
7
7
  #include <libavcodec/codec_par.h>
8
8
  #include <libavcodec/packet.h>
9
+ #include <libavdevice/avdevice.h>
9
10
  #include <libavformat/avformat.h>
10
11
  #include <libavformat/avio.h>
12
+ #include <libavutil/dict.h>
11
13
  #include <libavutil/error.h>
12
14
  #include <libavutil/frame.h>
13
15
  #include <libavutil/imgutils.h>
14
16
  #include <libavutil/log.h>
15
17
  #include <libavutil/mem.h>
16
18
  #include <libavutil/pixfmt.h>
19
+ #include <libavutil/rational.h>
17
20
  #include <libswscale/swscale.h>
18
21
  #include <stddef.h>
19
22
  #include <stdint.h>
@@ -23,6 +26,14 @@ typedef struct {
23
26
  AVIOContext *handle;
24
27
  } bare_ffmpeg_io_context_t;
25
28
 
29
+ typedef struct {
30
+ const AVOutputFormat *handle;
31
+ } bare_ffmpeg_output_format_t;
32
+
33
+ typedef struct {
34
+ const AVInputFormat *handle;
35
+ } bare_ffmpeg_input_format_t;
36
+
26
37
  typedef struct {
27
38
  AVFormatContext *handle;
28
39
  } bare_ffmpeg_format_context_t;
@@ -55,11 +66,16 @@ typedef struct {
55
66
  struct SwsContext *handle;
56
67
  } bare_ffmpeg_scaler_t;
57
68
 
69
+ typedef struct {
70
+ struct AVDictionary *handle;
71
+ } bare_ffmpeg_dictionary_t;
72
+
58
73
  static uv_once_t bare_ffmpeg__init_guard = UV_ONCE_INIT;
59
74
 
60
75
  static void
61
76
  bare_ffmpeg__on_init(void) {
62
77
  av_log_set_level(AV_LOG_ERROR);
78
+ avdevice_register_all();
63
79
  }
64
80
 
65
81
  static js_value_t *
@@ -125,7 +141,95 @@ bare_ffmpeg_io_context_destroy(js_env_t *env, js_callback_info_t *info) {
125
141
  }
126
142
 
127
143
  static js_value_t *
128
- bare_ffmpeg_format_context_init(js_env_t *env, js_callback_info_t *info) {
144
+ bare_ffmpeg_output_format_init(js_env_t *env, js_callback_info_t *info) {
145
+ int err;
146
+
147
+ size_t argc = 1;
148
+ js_value_t *argv[1];
149
+
150
+ err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
151
+ assert(err == 0);
152
+
153
+ assert(argc == 1);
154
+
155
+ size_t len;
156
+ err = js_get_value_string_utf8(env, argv[0], NULL, 0, &len);
157
+ assert(err == 0);
158
+
159
+ len += +1 /* NULL */;
160
+
161
+ utf8_t *name = malloc(len);
162
+ err = js_get_value_string_utf8(env, argv[0], name, len, NULL);
163
+ assert(err == 0);
164
+
165
+ const AVOutputFormat *format = av_guess_format((const char *) name, NULL, NULL);
166
+
167
+ if (format == NULL) {
168
+ err = js_throw_errorf(env, NULL, "No output format found for name '%s'", name);
169
+ assert(err == 0);
170
+ free(name);
171
+
172
+ return NULL;
173
+ }
174
+ free(name);
175
+
176
+ js_value_t *handle;
177
+
178
+ bare_ffmpeg_output_format_t *context;
179
+ err = js_create_arraybuffer(env, sizeof(bare_ffmpeg_output_format_t), (void **) &context, &handle);
180
+ assert(err == 0);
181
+
182
+ context->handle = format;
183
+
184
+ return handle;
185
+ }
186
+
187
+ static js_value_t *
188
+ bare_ffmpeg_input_format_init(js_env_t *env, js_callback_info_t *info) {
189
+ int err;
190
+
191
+ size_t argc = 1;
192
+ js_value_t *argv[1];
193
+
194
+ err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
195
+ assert(err == 0);
196
+
197
+ assert(argc == 1);
198
+
199
+ size_t len;
200
+ err = js_get_value_string_utf8(env, argv[0], NULL, 0, &len);
201
+ assert(err == 0);
202
+
203
+ len += +1 /* NULL */;
204
+
205
+ utf8_t *name = malloc(len);
206
+ err = js_get_value_string_utf8(env, argv[0], name, len, NULL);
207
+ assert(err == 0);
208
+
209
+ const AVInputFormat *format = av_find_input_format((const char *) name);
210
+
211
+ if (format == NULL) {
212
+ err = js_throw_errorf(env, NULL, "No input format found for name '%s'", name);
213
+ assert(err == 0);
214
+ free(name);
215
+
216
+ return NULL;
217
+ }
218
+ free(name);
219
+
220
+ js_value_t *handle;
221
+
222
+ bare_ffmpeg_input_format_t *context;
223
+ err = js_create_arraybuffer(env, sizeof(bare_ffmpeg_input_format_t), (void **) &context, &handle);
224
+ assert(err == 0);
225
+
226
+ context->handle = format;
227
+
228
+ return handle;
229
+ }
230
+
231
+ static js_value_t *
232
+ bare_ffmpeg_format_context_open_input(js_env_t *env, js_callback_info_t *info) {
129
233
  int err;
130
234
 
131
235
  size_t argc = 1;
@@ -177,7 +281,7 @@ bare_ffmpeg_format_context_init(js_env_t *env, js_callback_info_t *info) {
177
281
  }
178
282
 
179
283
  static js_value_t *
180
- bare_ffmpeg_format_context_destroy(js_env_t *env, js_callback_info_t *info) {
284
+ bare_ffmpeg_format_context_close_input(js_env_t *env, js_callback_info_t *info) {
181
285
  int err;
182
286
 
183
287
  size_t argc = 1;
@@ -197,6 +301,68 @@ bare_ffmpeg_format_context_destroy(js_env_t *env, js_callback_info_t *info) {
197
301
  return NULL;
198
302
  }
199
303
 
304
+ static js_value_t *
305
+ bare_ffmpeg_format_context_open_output(js_env_t *env, js_callback_info_t *info) {
306
+ int err;
307
+
308
+ size_t argc = 2;
309
+ js_value_t *argv[2];
310
+
311
+ err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
312
+ assert(err == 0);
313
+
314
+ assert(argc == 2);
315
+
316
+ bare_ffmpeg_output_format_t *format;
317
+ err = js_get_arraybuffer_info(env, argv[0], (void **) &format, NULL);
318
+ assert(err == 0);
319
+
320
+ bare_ffmpeg_io_context_t *io;
321
+ err = js_get_arraybuffer_info(env, argv[1], (void **) &io, NULL);
322
+ assert(err == 0);
323
+
324
+ js_value_t *handle;
325
+
326
+ bare_ffmpeg_format_context_t *context;
327
+ err = js_create_arraybuffer(env, sizeof(bare_ffmpeg_format_context_t), (void **) &context, &handle);
328
+ assert(err == 0);
329
+
330
+ err = avformat_alloc_output_context2(&context->handle, format->handle, NULL, NULL);
331
+
332
+ if (err < 0) {
333
+ err = js_throw_error(env, NULL, av_err2str(err));
334
+ assert(err == 0);
335
+
336
+ return NULL;
337
+ }
338
+
339
+ context->handle->pb = io->handle;
340
+ context->handle->opaque = (void *) context;
341
+
342
+ return handle;
343
+ }
344
+
345
+ static js_value_t *
346
+ bare_ffmpeg_format_context_close_output(js_env_t *env, js_callback_info_t *info) {
347
+ int err;
348
+
349
+ size_t argc = 1;
350
+ js_value_t *argv[1];
351
+
352
+ err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
353
+ assert(err == 0);
354
+
355
+ assert(argc == 1);
356
+
357
+ bare_ffmpeg_format_context_t *context;
358
+ err = js_get_arraybuffer_info(env, argv[0], (void **) &context, NULL);
359
+ assert(err == 0);
360
+
361
+ avformat_free_context(context->handle);
362
+
363
+ return NULL;
364
+ }
365
+
200
366
  static js_value_t *
201
367
  bare_ffmpeg_format_context_get_streams(js_env_t *env, js_callback_info_t *info) {
202
368
  int err;
@@ -235,6 +401,44 @@ bare_ffmpeg_format_context_get_streams(js_env_t *env, js_callback_info_t *info)
235
401
  return result;
236
402
  }
237
403
 
404
+ static js_value_t *
405
+ bare_ffmpeg_format_context_create_stream(js_env_t *env, js_callback_info_t *info) {
406
+ int err;
407
+
408
+ size_t argc = 2;
409
+ js_value_t *argv[2];
410
+
411
+ err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
412
+ assert(err == 0);
413
+
414
+ assert(argc == 2);
415
+
416
+ bare_ffmpeg_format_context_t *context;
417
+ err = js_get_arraybuffer_info(env, argv[0], (void **) &context, NULL);
418
+ assert(err == 0);
419
+
420
+ bare_ffmpeg_codec_t *codec;
421
+ err = js_get_arraybuffer_info(env, argv[1], (void **) &codec, NULL);
422
+ assert(err == 0);
423
+
424
+ js_value_t *handle;
425
+
426
+ bare_ffmpeg_stream_t *stream;
427
+ err = js_create_arraybuffer(env, sizeof(bare_ffmpeg_stream_t), (void **) &stream, &handle);
428
+ assert(err == 0);
429
+
430
+ stream->handle = avformat_new_stream(context->handle, codec->handle);
431
+
432
+ if (stream->handle == NULL) {
433
+ err = js_throw_error(env, NULL, av_err2str(err));
434
+ assert(err == 0);
435
+
436
+ return NULL;
437
+ }
438
+
439
+ return handle;
440
+ }
441
+
238
442
  static js_value_t *
239
443
  bare_ffmpeg_format_context_read_frame(js_env_t *env, js_callback_info_t *info) {
240
444
  int err;
@@ -259,12 +463,16 @@ bare_ffmpeg_format_context_read_frame(js_env_t *env, js_callback_info_t *info) {
259
463
 
260
464
  err = av_read_frame(context->handle, &packet->handle);
261
465
 
262
- if (err < 0) {
466
+ if (err < 0 && err != AVERROR(EAGAIN) && err != AVERROR_EOF) {
263
467
  err = js_throw_error(env, NULL, av_err2str(err));
264
468
  assert(err == 0);
265
469
  }
266
470
 
267
- return NULL;
471
+ js_value_t *result;
472
+ err = js_get_boolean(env, err == 0, &result);
473
+ assert(err == 0);
474
+
475
+ return result;
268
476
  }
269
477
 
270
478
  static js_value_t *
@@ -393,22 +601,18 @@ static js_value_t *
393
601
  bare_ffmpeg_codec_context_init(js_env_t *env, js_callback_info_t *info) {
394
602
  int err;
395
603
 
396
- size_t argc = 2;
397
- js_value_t *argv[2];
604
+ size_t argc = 1;
605
+ js_value_t *argv[1];
398
606
 
399
607
  err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
400
608
  assert(err == 0);
401
609
 
402
- assert(argc == 2);
610
+ assert(argc == 1);
403
611
 
404
612
  bare_ffmpeg_codec_t *codec;
405
613
  err = js_get_arraybuffer_info(env, argv[0], (void **) &codec, NULL);
406
614
  assert(err == 0);
407
615
 
408
- bare_ffmpeg_codec_parameters_t *parameters;
409
- err = js_get_arraybuffer_info(env, argv[1], (void **) &parameters, NULL);
410
- assert(err == 0);
411
-
412
616
  js_value_t *handle;
413
617
 
414
618
  bare_ffmpeg_codec_context_t *context;
@@ -419,33 +623,32 @@ bare_ffmpeg_codec_context_init(js_env_t *env, js_callback_info_t *info) {
419
623
 
420
624
  context->handle->opaque = (void *) context;
421
625
 
422
- err = avcodec_parameters_to_context(context->handle, parameters->handle);
423
-
424
- if (err < 0) {
425
- avcodec_free_context(&context->handle);
626
+ return handle;
627
+ }
426
628
 
427
- err = js_throw_error(env, NULL, av_err2str(err));
428
- assert(err == 0);
629
+ static js_value_t *
630
+ bare_ffmpeg_codec_context_destroy(js_env_t *env, js_callback_info_t *info) {
631
+ int err;
429
632
 
430
- return NULL;
431
- }
633
+ size_t argc = 1;
634
+ js_value_t *argv[1];
432
635
 
433
- err = avcodec_open2(context->handle, codec->handle, NULL);
636
+ err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
637
+ assert(err == 0);
434
638
 
435
- if (err < 0) {
436
- avcodec_free_context(&context->handle);
639
+ assert(argc == 1);
437
640
 
438
- err = js_throw_error(env, NULL, av_err2str(err));
439
- assert(err == 0);
641
+ bare_ffmpeg_codec_context_t *context;
642
+ err = js_get_arraybuffer_info(env, argv[0], (void **) &context, NULL);
643
+ assert(err == 0);
440
644
 
441
- return NULL;
442
- }
645
+ avcodec_free_context(&context->handle);
443
646
 
444
- return handle;
647
+ return NULL;
445
648
  }
446
649
 
447
650
  static js_value_t *
448
- bare_ffmpeg_codec_context_destroy(js_env_t *env, js_callback_info_t *info) {
651
+ bare_ffmpeg_codec_context_open(js_env_t *env, js_callback_info_t *info) {
449
652
  int err;
450
653
 
451
654
  size_t argc = 1;
@@ -460,7 +663,12 @@ bare_ffmpeg_codec_context_destroy(js_env_t *env, js_callback_info_t *info) {
460
663
  err = js_get_arraybuffer_info(env, argv[0], (void **) &context, NULL);
461
664
  assert(err == 0);
462
665
 
463
- avcodec_free_context(&context->handle);
666
+ err = avcodec_open2(context->handle, context->handle->codec, NULL);
667
+
668
+ if (err < 0) {
669
+ err = js_throw_error(env, NULL, av_err2str(err));
670
+ assert(err == 0);
671
+ }
464
672
 
465
673
  return NULL;
466
674
  }
@@ -489,30 +697,32 @@ bare_ffmpeg_codec_context_get_pixel_format(js_env_t *env, js_callback_info_t *in
489
697
  }
490
698
 
491
699
  static js_value_t *
492
- bare_ffmpeg_codec_context_get_width(js_env_t *env, js_callback_info_t *info) {
700
+ bare_ffmpeg_codec_context_set_pixel_format(js_env_t *env, js_callback_info_t *info) {
493
701
  int err;
494
702
 
495
- size_t argc = 1;
496
- js_value_t *argv[1];
703
+ size_t argc = 2;
704
+ js_value_t *argv[2];
497
705
 
498
706
  err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
499
707
  assert(err == 0);
500
708
 
501
- assert(argc == 1);
709
+ assert(argc == 2);
502
710
 
503
711
  bare_ffmpeg_codec_context_t *context;
504
712
  err = js_get_arraybuffer_info(env, argv[0], (void **) &context, NULL);
505
713
  assert(err == 0);
506
714
 
507
- js_value_t *result;
508
- err = js_create_int64(env, context->handle->width, &result);
715
+ int64_t value;
716
+ err = js_get_value_int64(env, argv[1], &value);
509
717
  assert(err == 0);
510
718
 
511
- return result;
719
+ context->handle->pix_fmt = value;
720
+
721
+ return NULL;
512
722
  }
513
723
 
514
724
  static js_value_t *
515
- bare_ffmpeg_codec_context_get_height(js_env_t *env, js_callback_info_t *info) {
725
+ bare_ffmpeg_codec_context_get_width(js_env_t *env, js_callback_info_t *info) {
516
726
  int err;
517
727
 
518
728
  size_t argc = 1;
@@ -528,14 +738,14 @@ bare_ffmpeg_codec_context_get_height(js_env_t *env, js_callback_info_t *info) {
528
738
  assert(err == 0);
529
739
 
530
740
  js_value_t *result;
531
- err = js_create_int64(env, context->handle->height, &result);
741
+ err = js_create_int64(env, context->handle->width, &result);
532
742
  assert(err == 0);
533
743
 
534
744
  return result;
535
745
  }
536
746
 
537
747
  static js_value_t *
538
- bare_ffmpeg_codec_context_send_packet(js_env_t *env, js_callback_info_t *info) {
748
+ bare_ffmpeg_codec_context_set_width(js_env_t *env, js_callback_info_t *info) {
539
749
  int err;
540
750
 
541
751
  size_t argc = 2;
@@ -550,69 +760,460 @@ bare_ffmpeg_codec_context_send_packet(js_env_t *env, js_callback_info_t *info) {
550
760
  err = js_get_arraybuffer_info(env, argv[0], (void **) &context, NULL);
551
761
  assert(err == 0);
552
762
 
553
- bare_ffmpeg_packet_t *packet;
554
- err = js_get_arraybuffer_info(env, argv[1], (void **) &packet, NULL);
763
+ int64_t value;
764
+ err = js_get_value_int64(env, argv[1], &value);
555
765
  assert(err == 0);
556
766
 
557
- err = avcodec_send_packet(context->handle, &packet->handle);
558
-
559
- if (err < 0) {
560
- err = js_throw_error(env, NULL, av_err2str(err));
561
- assert(err == 0);
562
- }
767
+ context->handle->width = value;
563
768
 
564
769
  return NULL;
565
770
  }
566
771
 
567
772
  static js_value_t *
568
- bare_ffmpeg_codec_context_receive_frame(js_env_t *env, js_callback_info_t *info) {
773
+ bare_ffmpeg_codec_context_get_height(js_env_t *env, js_callback_info_t *info) {
569
774
  int err;
570
775
 
571
- size_t argc = 2;
572
- js_value_t *argv[2];
776
+ size_t argc = 1;
777
+ js_value_t *argv[1];
573
778
 
574
779
  err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
575
780
  assert(err == 0);
576
781
 
577
- assert(argc == 2);
782
+ assert(argc == 1);
578
783
 
579
784
  bare_ffmpeg_codec_context_t *context;
580
785
  err = js_get_arraybuffer_info(env, argv[0], (void **) &context, NULL);
581
786
  assert(err == 0);
582
787
 
583
- bare_ffmpeg_frame_t *frame;
584
- err = js_get_arraybuffer_info(env, argv[1], (void **) &frame, NULL);
788
+ js_value_t *result;
789
+ err = js_create_int64(env, context->handle->height, &result);
585
790
  assert(err == 0);
586
791
 
587
- err = avcodec_receive_frame(context->handle, frame->handle);
588
-
589
- if (err < 0) {
590
- err = js_throw_error(env, NULL, av_err2str(err));
591
- assert(err == 0);
592
- }
593
-
594
- return NULL;
792
+ return result;
595
793
  }
596
794
 
597
795
  static js_value_t *
598
- bare_ffmpeg_frame_init(js_env_t *env, js_callback_info_t *info) {
796
+ bare_ffmpeg_codec_context_set_height(js_env_t *env, js_callback_info_t *info) {
599
797
  int err;
600
798
 
601
- js_value_t *handle;
602
-
799
+ size_t argc = 2;
800
+ js_value_t *argv[2];
801
+
802
+ err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
803
+ assert(err == 0);
804
+
805
+ assert(argc == 2);
806
+
807
+ bare_ffmpeg_codec_context_t *context;
808
+ err = js_get_arraybuffer_info(env, argv[0], (void **) &context, NULL);
809
+ assert(err == 0);
810
+
811
+ int64_t value;
812
+ err = js_get_value_int64(env, argv[1], &value);
813
+ assert(err == 0);
814
+
815
+ context->handle->height = value;
816
+
817
+ return NULL;
818
+ }
819
+
820
+ static js_value_t *
821
+ bare_ffmpeg_codec_context_get_time_base(js_env_t *env, js_callback_info_t *info) {
822
+ int err;
823
+
824
+ size_t argc = 1;
825
+ js_value_t *argv[1];
826
+
827
+ err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
828
+ assert(err == 0);
829
+
830
+ assert(argc == 1);
831
+
832
+ bare_ffmpeg_codec_context_t *context;
833
+ err = js_get_arraybuffer_info(env, argv[0], (void **) &context, NULL);
834
+ assert(err == 0);
835
+
836
+ js_value_t *result;
837
+
838
+ int32_t *data;
839
+ err = js_create_arraybuffer(env, 2 * sizeof(int32_t), (void **) &data, &result);
840
+ assert(err == 0);
841
+
842
+ data[0] = context->handle->time_base.num;
843
+ data[1] = context->handle->time_base.den;
844
+
845
+ return result;
846
+ }
847
+
848
+ static js_value_t *
849
+ bare_ffmpeg_codec_context_set_time_base(js_env_t *env, js_callback_info_t *info) {
850
+ int err;
851
+
852
+ size_t argc = 2;
853
+ js_value_t *argv[2];
854
+
855
+ err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
856
+ assert(err == 0);
857
+
858
+ assert(argc == 2);
859
+
860
+ bare_ffmpeg_codec_context_t *context;
861
+ err = js_get_arraybuffer_info(env, argv[0], (void **) &context, NULL);
862
+ assert(err == 0);
863
+
864
+ int32_t *value;
865
+ err = js_get_arraybuffer_info(env, argv[1], (void **) &value, NULL);
866
+ assert(err == 0);
867
+
868
+ context->handle->time_base.num = value[0];
869
+ context->handle->time_base.den = value[1];
870
+
871
+ return NULL;
872
+ }
873
+
874
+ static js_value_t *
875
+ bare_ffmpeg_codec_context_send_packet(js_env_t *env, js_callback_info_t *info) {
876
+ int err;
877
+
878
+ size_t argc = 2;
879
+ js_value_t *argv[2];
880
+
881
+ err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
882
+ assert(err == 0);
883
+
884
+ assert(argc == 2);
885
+
886
+ bare_ffmpeg_codec_context_t *context;
887
+ err = js_get_arraybuffer_info(env, argv[0], (void **) &context, NULL);
888
+ assert(err == 0);
889
+
890
+ bare_ffmpeg_packet_t *packet;
891
+ err = js_get_arraybuffer_info(env, argv[1], (void **) &packet, NULL);
892
+ assert(err == 0);
893
+
894
+ err = avcodec_send_packet(context->handle, &packet->handle);
895
+
896
+ if (err < 0) {
897
+ err = js_throw_error(env, NULL, av_err2str(err));
898
+ assert(err == 0);
899
+ }
900
+
901
+ return NULL;
902
+ }
903
+
904
+ static js_value_t *
905
+ bare_ffmpeg_codec_context_receive_frame(js_env_t *env, js_callback_info_t *info) {
906
+ int err;
907
+
908
+ size_t argc = 2;
909
+ js_value_t *argv[2];
910
+
911
+ err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
912
+ assert(err == 0);
913
+
914
+ assert(argc == 2);
915
+
916
+ bare_ffmpeg_codec_context_t *context;
917
+ err = js_get_arraybuffer_info(env, argv[0], (void **) &context, NULL);
918
+ assert(err == 0);
919
+
920
+ bare_ffmpeg_frame_t *frame;
921
+ err = js_get_arraybuffer_info(env, argv[1], (void **) &frame, NULL);
922
+ assert(err == 0);
923
+
924
+ err = avcodec_receive_frame(context->handle, frame->handle);
925
+
926
+ if (err < 0 && err != AVERROR(EAGAIN) && err != AVERROR_EOF) {
927
+ err = js_throw_error(env, NULL, av_err2str(err));
928
+ assert(err == 0);
929
+
930
+ return NULL;
931
+ }
932
+
933
+ js_value_t *result;
934
+ err = js_get_boolean(env, err == 0, &result);
935
+ assert(err == 0);
936
+
937
+ return result;
938
+ }
939
+
940
+ static js_value_t *
941
+ bare_ffmpeg_codec_parameters_from_context(js_env_t *env, js_callback_info_t *info) {
942
+ int err;
943
+
944
+ size_t argc = 2;
945
+ js_value_t *argv[2];
946
+
947
+ err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
948
+ assert(err == 0);
949
+
950
+ assert(argc == 2);
951
+
952
+ bare_ffmpeg_codec_parameters_t *parameters;
953
+ err = js_get_arraybuffer_info(env, argv[0], (void **) &parameters, NULL);
954
+ assert(err == 0);
955
+
956
+ bare_ffmpeg_codec_context_t *context;
957
+ err = js_get_arraybuffer_info(env, argv[1], (void **) &context, NULL);
958
+ assert(err == 0);
959
+
960
+ err = avcodec_parameters_from_context(parameters->handle, context->handle);
961
+
962
+ if (err < 0) {
963
+ err = js_throw_error(env, NULL, av_err2str(err));
964
+ assert(err == 0);
965
+
966
+ return NULL;
967
+ }
968
+
969
+ return NULL;
970
+ }
971
+
972
+ static js_value_t *
973
+ bare_ffmpeg_codec_parameters_to_context(js_env_t *env, js_callback_info_t *info) {
974
+ int err;
975
+
976
+ size_t argc = 2;
977
+ js_value_t *argv[2];
978
+
979
+ err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
980
+ assert(err == 0);
981
+
982
+ assert(argc == 2);
983
+
984
+ bare_ffmpeg_codec_context_t *context;
985
+ err = js_get_arraybuffer_info(env, argv[0], (void **) &context, NULL);
986
+ assert(err == 0);
987
+
988
+ bare_ffmpeg_codec_parameters_t *parameters;
989
+ err = js_get_arraybuffer_info(env, argv[1], (void **) &parameters, NULL);
990
+ assert(err == 0);
991
+
992
+ err = avcodec_parameters_to_context(context->handle, parameters->handle);
993
+
994
+ if (err < 0) {
995
+ err = js_throw_error(env, NULL, av_err2str(err));
996
+ assert(err == 0);
997
+
998
+ return NULL;
999
+ }
1000
+
1001
+ return NULL;
1002
+ }
1003
+
1004
+ static js_value_t *
1005
+ bare_ffmpeg_codec_parameters_get_bit_rate(js_env_t *env, js_callback_info_t *info) {
1006
+ int err;
1007
+
1008
+ size_t argc = 1;
1009
+ js_value_t *argv[1];
1010
+
1011
+ err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
1012
+ assert(err == 0);
1013
+
1014
+ assert(argc == 1);
1015
+
1016
+ bare_ffmpeg_codec_parameters_t *parameters;
1017
+ err = js_get_arraybuffer_info(env, argv[0], (void **) &parameters, NULL);
1018
+ assert(err == 0);
1019
+
1020
+ js_value_t *result;
1021
+ err = js_create_int64(env, parameters->handle->bit_rate, &result);
1022
+ assert(err == 0);
1023
+
1024
+ return result;
1025
+ }
1026
+
1027
+ static js_value_t *
1028
+ bare_ffmpeg_codec_parameters_get_bits_per_coded_sample(js_env_t *env, js_callback_info_t *info) {
1029
+ int err;
1030
+
1031
+ size_t argc = 1;
1032
+ js_value_t *argv[1];
1033
+
1034
+ err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
1035
+ assert(err == 0);
1036
+
1037
+ assert(argc == 1);
1038
+
1039
+ bare_ffmpeg_codec_parameters_t *parameters;
1040
+ err = js_get_arraybuffer_info(env, argv[0], (void **) &parameters, NULL);
1041
+ assert(err == 0);
1042
+
1043
+ js_value_t *result;
1044
+ err = js_create_int64(env, parameters->handle->bits_per_coded_sample, &result);
1045
+ assert(err == 0);
1046
+
1047
+ return result;
1048
+ }
1049
+
1050
+ static js_value_t *
1051
+ bare_ffmpeg_codec_parameters_get_bits_per_raw_sample(js_env_t *env, js_callback_info_t *info) {
1052
+ int err;
1053
+
1054
+ size_t argc = 1;
1055
+ js_value_t *argv[1];
1056
+
1057
+ err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
1058
+ assert(err == 0);
1059
+
1060
+ assert(argc == 1);
1061
+
1062
+ bare_ffmpeg_codec_parameters_t *parameters;
1063
+ err = js_get_arraybuffer_info(env, argv[0], (void **) &parameters, NULL);
1064
+ assert(err == 0);
1065
+
1066
+ js_value_t *result;
1067
+ err = js_create_int64(env, parameters->handle->bits_per_raw_sample, &result);
1068
+ assert(err == 0);
1069
+
1070
+ return result;
1071
+ }
1072
+
1073
+ static js_value_t *
1074
+ bare_ffmpeg_codec_parameters_get_sample_rate(js_env_t *env, js_callback_info_t *info) {
1075
+ int err;
1076
+
1077
+ size_t argc = 1;
1078
+ js_value_t *argv[1];
1079
+
1080
+ err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
1081
+ assert(err == 0);
1082
+
1083
+ assert(argc == 1);
1084
+
1085
+ bare_ffmpeg_codec_parameters_t *parameters;
1086
+ err = js_get_arraybuffer_info(env, argv[0], (void **) &parameters, NULL);
1087
+ assert(err == 0);
1088
+
1089
+ js_value_t *result;
1090
+ err = js_create_int64(env, parameters->handle->sample_rate, &result);
1091
+ assert(err == 0);
1092
+
1093
+ return result;
1094
+ }
1095
+
1096
+ static js_value_t *
1097
+ bare_ffmpeg_frame_init(js_env_t *env, js_callback_info_t *info) {
1098
+ int err;
1099
+
1100
+ js_value_t *handle;
1101
+
1102
+ bare_ffmpeg_frame_t *frame;
1103
+ err = js_create_arraybuffer(env, sizeof(bare_ffmpeg_frame_t), (void **) &frame, &handle);
1104
+ assert(err == 0);
1105
+
1106
+ frame->handle = av_frame_alloc();
1107
+
1108
+ frame->handle->opaque = (void *) frame;
1109
+
1110
+ return handle;
1111
+ }
1112
+
1113
+ static js_value_t *
1114
+ bare_ffmpeg_frame_destroy(js_env_t *env, js_callback_info_t *info) {
1115
+ int err;
1116
+
1117
+ size_t argc = 1;
1118
+ js_value_t *argv[1];
1119
+
1120
+ err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
1121
+ assert(err == 0);
1122
+
1123
+ assert(argc == 1);
1124
+
603
1125
  bare_ffmpeg_frame_t *frame;
604
- err = js_create_arraybuffer(env, sizeof(bare_ffmpeg_frame_t), (void **) &frame, &handle);
1126
+ err = js_get_arraybuffer_info(env, argv[0], (void **) &frame, NULL);
605
1127
  assert(err == 0);
606
1128
 
607
- frame->handle = av_frame_alloc();
1129
+ av_frame_free(&frame->handle);
608
1130
 
609
- frame->handle->opaque = (void *) frame;
1131
+ return NULL;
1132
+ }
610
1133
 
611
- return handle;
1134
+ static js_value_t *
1135
+ bare_ffmpeg_frame_get_channel(js_env_t *env, js_callback_info_t *info) {
1136
+ int err;
1137
+
1138
+ size_t argc = 2;
1139
+ js_value_t *argv[2];
1140
+
1141
+ err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
1142
+ assert(err == 0);
1143
+
1144
+ assert(argc == 2);
1145
+
1146
+ bare_ffmpeg_frame_t *frame;
1147
+ err = js_get_arraybuffer_info(env, argv[0], (void **) &frame, NULL);
1148
+ assert(err == 0);
1149
+
1150
+ uint32_t i;
1151
+ err = js_get_value_uint32(env, argv[1], &i);
1152
+ assert(err == 0);
1153
+
1154
+ assert(i < AV_NUM_DATA_POINTERS);
1155
+
1156
+ js_value_t *result;
1157
+
1158
+ size_t len = frame->handle->linesize[i];
1159
+
1160
+ void *data;
1161
+ err = js_create_unsafe_arraybuffer(env, len, &data, &result);
1162
+ assert(err == 0);
1163
+
1164
+ memcpy(data, frame->handle->data[i], len);
1165
+
1166
+ return result;
612
1167
  }
613
1168
 
614
1169
  static js_value_t *
615
- bare_ffmpeg_frame_destroy(js_env_t *env, js_callback_info_t *info) {
1170
+ bare_ffmpeg_frame_get_width(js_env_t *env, js_callback_info_t *info) {
1171
+ int err;
1172
+
1173
+ size_t argc = 1;
1174
+ js_value_t *argv[1];
1175
+
1176
+ err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
1177
+ assert(err == 0);
1178
+ assert(argc == 1);
1179
+
1180
+ bare_ffmpeg_frame_t *frame;
1181
+ err = js_get_arraybuffer_info(env, argv[0], (void **) &frame, NULL);
1182
+ assert(err == 0);
1183
+
1184
+ js_value_t *result;
1185
+ err = js_create_int32(env, frame->handle->width, &result);
1186
+ assert(err == 0);
1187
+
1188
+ return result;
1189
+ }
1190
+
1191
+ static js_value_t *
1192
+ bare_ffmpeg_frame_set_width(js_env_t *env, js_callback_info_t *info) {
1193
+ int err;
1194
+
1195
+ size_t argc = 2;
1196
+ js_value_t *argv[2];
1197
+
1198
+ err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
1199
+ assert(err == 0);
1200
+ assert(argc == 2);
1201
+
1202
+ bare_ffmpeg_frame_t *frame;
1203
+ err = js_get_arraybuffer_info(env, argv[0], (void **) &frame, NULL);
1204
+ assert(err == 0);
1205
+
1206
+ int32_t width;
1207
+ err = js_get_value_int32(env, argv[1], &width);
1208
+ assert(err == 0);
1209
+
1210
+ frame->handle->width = width;
1211
+
1212
+ return NULL;
1213
+ }
1214
+
1215
+ static js_value_t *
1216
+ bare_ffmpeg_frame_get_height(js_env_t *env, js_callback_info_t *info) {
616
1217
  int err;
617
1218
 
618
1219
  size_t argc = 1;
@@ -620,14 +1221,116 @@ bare_ffmpeg_frame_destroy(js_env_t *env, js_callback_info_t *info) {
620
1221
 
621
1222
  err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
622
1223
  assert(err == 0);
1224
+ assert(argc == 1);
1225
+
1226
+ bare_ffmpeg_frame_t *frame;
1227
+ err = js_get_arraybuffer_info(env, argv[0], (void **) &frame, NULL);
1228
+ assert(err == 0);
1229
+
1230
+ js_value_t *result;
1231
+ err = js_create_int32(env, frame->handle->height, &result);
1232
+ assert(err == 0);
1233
+
1234
+ return result;
1235
+ }
1236
+
1237
+ static js_value_t *
1238
+ bare_ffmpeg_frame_set_height(js_env_t *env, js_callback_info_t *info) {
1239
+ int err;
1240
+
1241
+ size_t argc = 2;
1242
+ js_value_t *argv[2];
1243
+
1244
+ err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
1245
+ assert(err == 0);
1246
+ assert(argc == 2);
1247
+
1248
+ bare_ffmpeg_frame_t *frame;
1249
+ err = js_get_arraybuffer_info(env, argv[0], (void **) &frame, NULL);
1250
+ assert(err == 0);
1251
+
1252
+ int32_t height;
1253
+ err = js_get_value_int32(env, argv[1], &height);
1254
+ assert(err == 0);
623
1255
 
1256
+ frame->handle->height = height;
1257
+
1258
+ return NULL;
1259
+ }
1260
+
1261
+ static js_value_t *
1262
+ bare_ffmpeg_frame_get_pixel_format(js_env_t *env, js_callback_info_t *info) {
1263
+ int err;
1264
+
1265
+ size_t argc = 1;
1266
+ js_value_t *argv[1];
1267
+
1268
+ err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
1269
+ assert(err == 0);
624
1270
  assert(argc == 1);
625
1271
 
626
1272
  bare_ffmpeg_frame_t *frame;
627
1273
  err = js_get_arraybuffer_info(env, argv[0], (void **) &frame, NULL);
628
1274
  assert(err == 0);
629
1275
 
630
- av_frame_free(&frame->handle);
1276
+ js_value_t *result;
1277
+ err = js_create_int64(env, frame->handle->format, &result);
1278
+ assert(err == 0);
1279
+
1280
+ return result;
1281
+ }
1282
+
1283
+ static js_value_t *
1284
+ bare_ffmpeg_frame_set_pixel_format(js_env_t *env, js_callback_info_t *info) {
1285
+ int err;
1286
+
1287
+ size_t argc = 2;
1288
+ js_value_t *argv[2];
1289
+
1290
+ err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
1291
+ assert(err == 0);
1292
+ assert(argc == 2);
1293
+
1294
+ bare_ffmpeg_frame_t *frame;
1295
+ err = js_get_arraybuffer_info(env, argv[0], (void **) &frame, NULL);
1296
+ assert(err == 0);
1297
+
1298
+ int64_t pixel_format;
1299
+ err = js_get_value_int64(env, argv[1], &pixel_format);
1300
+ assert(err == 0);
1301
+
1302
+ frame->handle->format = (enum AVPixelFormat) pixel_format;
1303
+
1304
+ return NULL;
1305
+ }
1306
+
1307
+ static js_value_t *
1308
+ bare_ffmpeg_frame_alloc(js_env_t *env, js_callback_info_t *info) {
1309
+ int err;
1310
+
1311
+ size_t argc = 2;
1312
+ js_value_t *argv[2];
1313
+
1314
+ err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
1315
+ assert(err == 0);
1316
+ assert(argc == 2);
1317
+
1318
+ bare_ffmpeg_frame_t *frame;
1319
+ err = js_get_arraybuffer_info(env, argv[0], (void **) &frame, NULL);
1320
+ assert(err == 0);
1321
+ assert(frame->handle != NULL);
1322
+
1323
+ int align;
1324
+ err = js_get_value_int32(env, argv[1], &align);
1325
+ assert(err == 0);
1326
+ assert(frame->handle != NULL);
1327
+
1328
+ err = av_frame_get_buffer(frame->handle, align);
1329
+ if (err < 0) {
1330
+ err = js_throw_error(env, NULL, av_err2str(err));
1331
+ assert(err == 0);
1332
+ return NULL;
1333
+ }
631
1334
 
632
1335
  return NULL;
633
1336
  }
@@ -892,6 +1595,124 @@ bare_ffmpeg_scaler_scale(js_env_t *env, js_callback_info_t *info) {
892
1595
  return result;
893
1596
  }
894
1597
 
1598
+ static js_value_t *
1599
+ bare_ffmpeg_dictionary_init(js_env_t *env, js_callback_info_t *info) {
1600
+ int err;
1601
+ js_value_t *handle;
1602
+
1603
+ bare_ffmpeg_dictionary_t *dict;
1604
+ err = js_create_arraybuffer(env, sizeof(bare_ffmpeg_dictionary_t), (void **) &dict, &handle);
1605
+ assert(err == 0);
1606
+
1607
+ dict->handle = NULL;
1608
+
1609
+ return handle;
1610
+ }
1611
+
1612
+ static js_value_t *
1613
+ bare_ffmpeg_dictionary_destroy(js_env_t *env, js_callback_info_t *info) {
1614
+ int err;
1615
+
1616
+ size_t argc = 1;
1617
+ js_value_t *argv[1];
1618
+
1619
+ err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
1620
+ assert(err == 0);
1621
+ assert(argc == 1);
1622
+
1623
+ bare_ffmpeg_dictionary_t *dict;
1624
+ err = js_get_arraybuffer_info(env, argv[0], (void **) &dict, NULL);
1625
+ assert(err == 0);
1626
+
1627
+ av_dict_free(&dict->handle);
1628
+
1629
+ return NULL;
1630
+ }
1631
+
1632
+ static js_value_t *
1633
+ bare_ffmpeg_dictionary_set_entry(js_env_t *env, js_callback_info_t *info) {
1634
+ int err;
1635
+
1636
+ size_t argc = 3;
1637
+ js_value_t *argv[3];
1638
+
1639
+ err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
1640
+ assert(err == 0);
1641
+ assert(argc == 3);
1642
+
1643
+ bare_ffmpeg_dictionary_t *dict;
1644
+ err = js_get_arraybuffer_info(env, argv[0], (void **) &dict, NULL);
1645
+ assert(err == 0);
1646
+
1647
+ size_t len;
1648
+ err = js_get_value_string_utf8(env, argv[1], NULL, 0, &len);
1649
+ assert(err == 0);
1650
+
1651
+ len += +1 /* NULL */;
1652
+
1653
+ utf8_t *key = malloc(len);
1654
+ err = js_get_value_string_utf8(env, argv[1], key, len, NULL);
1655
+ assert(err == 0);
1656
+
1657
+ err = js_get_value_string_utf8(env, argv[2], NULL, 0, &len);
1658
+ assert(err == 0);
1659
+
1660
+ len += +1 /* NULL */;
1661
+
1662
+ utf8_t *value = malloc(len);
1663
+ err = js_get_value_string_utf8(env, argv[2], value, len, NULL);
1664
+ assert(err == 0);
1665
+
1666
+ err = av_dict_set(&dict->handle, (const char *) key, (const char *) value, 0);
1667
+ assert(err == 0);
1668
+ free(key);
1669
+ free(value);
1670
+
1671
+ return NULL;
1672
+ }
1673
+
1674
+ static js_value_t *
1675
+ bare_ffmpeg_dictionary_get_entry(js_env_t *env, js_callback_info_t *info) {
1676
+ int err;
1677
+
1678
+ size_t argc = 2;
1679
+ js_value_t *argv[2];
1680
+
1681
+ err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
1682
+ assert(err == 0);
1683
+ assert(argc == 2);
1684
+
1685
+ bare_ffmpeg_dictionary_t *dict;
1686
+ err = js_get_arraybuffer_info(env, argv[0], (void **) &dict, NULL);
1687
+ assert(err == 0);
1688
+
1689
+ size_t len;
1690
+ err = js_get_value_string_utf8(env, argv[1], NULL, 0, &len);
1691
+ assert(err == 0);
1692
+
1693
+ len += +1 /* NULL */;
1694
+
1695
+ utf8_t *key = malloc(len);
1696
+ err = js_get_value_string_utf8(env, argv[1], key, len, NULL);
1697
+ assert(err == 0);
1698
+
1699
+ AVDictionaryEntry *entry = av_dict_get(dict->handle, (const char *) key, NULL, 0);
1700
+ free(key);
1701
+
1702
+ if (entry == NULL) {
1703
+ js_value_t *result;
1704
+ err = js_get_null(env, &result);
1705
+ assert(err == 0);
1706
+ return result;
1707
+ }
1708
+
1709
+ js_value_t *result;
1710
+ err = js_create_string_utf8(env, (const utf8_t *) entry->value, -1, &result);
1711
+ assert(err == 0);
1712
+
1713
+ return result;
1714
+ }
1715
+
895
1716
  static js_value_t *
896
1717
  bare_ffmpeg_exports(js_env_t *env, js_value_t *exports) {
897
1718
  uv_once(&bare_ffmpeg__init_guard, bare_ffmpeg__on_init);
@@ -910,9 +1731,15 @@ bare_ffmpeg_exports(js_env_t *env, js_value_t *exports) {
910
1731
  V("initIOContext", bare_ffmpeg_io_context_init)
911
1732
  V("destroyIOContext", bare_ffmpeg_io_context_destroy)
912
1733
 
913
- V("initFormatContext", bare_ffmpeg_format_context_init)
914
- V("destroyFormatContext", bare_ffmpeg_format_context_destroy)
1734
+ V("initOutputFormat", bare_ffmpeg_output_format_init)
1735
+ V("initInputFormat", bare_ffmpeg_input_format_init)
1736
+
1737
+ V("openInputFormatContext", bare_ffmpeg_format_context_open_input)
1738
+ V("closeInputFormatContext", bare_ffmpeg_format_context_close_input)
1739
+ V("openOutputFormatContext", bare_ffmpeg_format_context_open_output)
1740
+ V("closeOutputFormatContext", bare_ffmpeg_format_context_close_output)
915
1741
  V("getFormatContextStreams", bare_ffmpeg_format_context_get_streams)
1742
+ V("createFormatContextStream", bare_ffmpeg_format_context_create_stream)
916
1743
  V("readFormatContextFrame", bare_ffmpeg_format_context_read_frame)
917
1744
 
918
1745
  V("getStreamCodec", bare_ffmpeg_stream_get_codec)
@@ -923,14 +1750,35 @@ bare_ffmpeg_exports(js_env_t *env, js_value_t *exports) {
923
1750
 
924
1751
  V("initCodecContext", bare_ffmpeg_codec_context_init)
925
1752
  V("destroyCodecContext", bare_ffmpeg_codec_context_destroy)
1753
+ V("openCodecContext", bare_ffmpeg_codec_context_open)
926
1754
  V("getCodecContextPixelFormat", bare_ffmpeg_codec_context_get_pixel_format)
1755
+ V("setCodecContextPixelFormat", bare_ffmpeg_codec_context_set_pixel_format)
927
1756
  V("getCodecContextWidth", bare_ffmpeg_codec_context_get_width)
1757
+ V("setCodecContextWidth", bare_ffmpeg_codec_context_set_width)
928
1758
  V("getCodecContextHeight", bare_ffmpeg_codec_context_get_height)
1759
+ V("setCodecContextHeight", bare_ffmpeg_codec_context_set_height)
1760
+ V("getCodecContextTimeBase", bare_ffmpeg_codec_context_get_time_base)
1761
+ V("setCodecContextTimeBase", bare_ffmpeg_codec_context_set_time_base)
929
1762
  V("sendCodecContextPacket", bare_ffmpeg_codec_context_send_packet)
930
1763
  V("receiveCodecContextFrame", bare_ffmpeg_codec_context_receive_frame)
931
1764
 
1765
+ V("codecParametersFromContext", bare_ffmpeg_codec_parameters_from_context)
1766
+ V("codecParametersToContext", bare_ffmpeg_codec_parameters_to_context)
1767
+ V("getCodecParametersBitRate", bare_ffmpeg_codec_parameters_get_bit_rate)
1768
+ V("getCodecParametersBitsPerCodedSample", bare_ffmpeg_codec_parameters_get_bits_per_coded_sample)
1769
+ V("getCodecParametersBitsPerRawSample", bare_ffmpeg_codec_parameters_get_bits_per_raw_sample)
1770
+ V("getCodecParametersSampleRate", bare_ffmpeg_codec_parameters_get_sample_rate)
1771
+
932
1772
  V("initFrame", bare_ffmpeg_frame_init)
933
1773
  V("destroyFrame", bare_ffmpeg_frame_destroy)
1774
+ V("getFrameChannel", bare_ffmpeg_frame_get_channel)
1775
+ V("getFrameWidth", bare_ffmpeg_frame_get_width)
1776
+ V("setFrameWidth", bare_ffmpeg_frame_set_width)
1777
+ V("getFrameHeight", bare_ffmpeg_frame_get_height)
1778
+ V("setFrameHeight", bare_ffmpeg_frame_set_height)
1779
+ V("getFramePixelFormat", bare_ffmpeg_frame_get_pixel_format)
1780
+ V("setFramePixelFormat", bare_ffmpeg_frame_set_pixel_format)
1781
+ V("allocFrame", bare_ffmpeg_frame_alloc)
934
1782
 
935
1783
  V("initImage", bare_ffmpeg_image_init)
936
1784
  V("fillImage", bare_ffmpeg_image_fill)
@@ -942,6 +1790,11 @@ bare_ffmpeg_exports(js_env_t *env, js_value_t *exports) {
942
1790
  V("initScaler", bare_ffmpeg_scaler_init)
943
1791
  V("destroyScaler", bare_ffmpeg_scaler_destroy)
944
1792
  V("scaleScaler", bare_ffmpeg_scaler_scale)
1793
+
1794
+ V("initDictionary", bare_ffmpeg_dictionary_init)
1795
+ V("destroyDictionary", bare_ffmpeg_dictionary_destroy)
1796
+ V("getDictionaryEntry", bare_ffmpeg_dictionary_get_entry)
1797
+ V("setDictionaryEntry", bare_ffmpeg_dictionary_set_entry)
945
1798
  #undef V
946
1799
 
947
1800
  #define V(name) \
@@ -953,7 +1806,11 @@ bare_ffmpeg_exports(js_env_t *env, js_value_t *exports) {
953
1806
  assert(err == 0); \
954
1807
  }
955
1808
 
1809
+ V(AV_CODEC_ID_MJPEG)
1810
+
956
1811
  V(AV_PIX_FMT_RGBA)
1812
+ V(AV_PIX_FMT_YUVJ420P)
1813
+ V(AV_PIX_FMT_YUV420P)
957
1814
  #undef V
958
1815
 
959
1816
  return exports;