@scrypted/libav 1.0.136 → 1.0.137

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.
@@ -9,7 +9,7 @@
9
9
  "type": "node",
10
10
  "request": "launch",
11
11
  "args": [
12
- "${workspaceRoot}/test/decode-opencl-filter.ts"
12
+ "${workspaceRoot}/test/read-receive-send-receive.ts"
13
13
  ],
14
14
  "preLaunchTask": "npm: build",
15
15
  "runtimeArgs": [
@@ -24,6 +24,7 @@
24
24
  "queue": "cpp",
25
25
  "stack": "cpp",
26
26
  "scale_eval.h": "c",
27
- "filters.h": "c"
27
+ "filters.h": "c",
28
+ "ratio": "cpp"
28
29
  }
29
30
  }
package/binding.gyp CHANGED
@@ -3,6 +3,7 @@
3
3
  {
4
4
  "target_name": "addon",
5
5
  "sources": [
6
+ "src/bsf.cpp",
6
7
  "src/formatcontext.cpp",
7
8
  "src/codeccontext.cpp",
8
9
  "src/packet.cpp",
package/lib/index.d.ts CHANGED
@@ -10,6 +10,8 @@ export interface AVFrame extends AVTimeBase {
10
10
  readonly pixelFormat: string;
11
11
  readonly hardwareDeviceType: string;
12
12
  readonly softwareFormat: string;
13
+ pictType: number;
14
+ flags: number;
13
15
  timeBaseNum: number;
14
16
  timeBaseDen: number;
15
17
  pts: number;
@@ -25,6 +27,8 @@ export interface AVFrame extends AVTimeBase {
25
27
  opts?: {
26
28
  [key: string]: string | number;
27
29
  };
30
+ gopSize?: number;
31
+ keyIntMin?: number;
28
32
  }): AVCodecContext;
29
33
  }
30
34
  export interface AVFilter {
@@ -34,9 +38,17 @@ export interface AVFilter {
34
38
  addFrame(frame: AVFrame, index?: number): void;
35
39
  getFrame(index?: number): AVFrame;
36
40
  }
41
+ export interface AVBitstreamFilter {
42
+ [Symbol.dispose](): void;
43
+ destroy(): void;
44
+ setOption(name: string, value: string): void;
45
+ sendPacket(packet: AVPacket): void;
46
+ receivePacket(): AVPacket;
47
+ copyParameters(formatContext: AVFormatContext, streamIndex: number): void;
48
+ }
37
49
  export interface AVPacket {
38
50
  readonly streamIndex: number;
39
- readonly isKeyFrame: boolean;
51
+ flags: number;
40
52
  readonly size: number;
41
53
  readonly pts: number;
42
54
  readonly dts: number;
@@ -54,6 +66,8 @@ export interface AVCodecContext extends AVTimeBase {
54
66
  readonly pixelFormat: string;
55
67
  readonly hardwarePixelFormat: string;
56
68
  readonly vendorInfo: Record<string, any>;
69
+ keyIntMin: number;
70
+ gopSize: number;
57
71
  [Symbol.dispose](): void;
58
72
  destroy(): void;
59
73
  sendPacket(packet: AVPacket): Promise<boolean>;
@@ -101,6 +115,7 @@ export declare function createAVFilter(options: {
101
115
  outCount?: number;
102
116
  }): AVFilter;
103
117
  export declare function createAVFrame(width: number, height: number, pixelFormat: string, fillBlack?: boolean): AVFrame;
118
+ export declare function createAVBitstreamFilter(filter: string): AVBitstreamFilter;
104
119
  export declare function getBinaryUrl(): string;
105
120
  export declare function toJpeg(frame: AVFrame, quality: number): Promise<Buffer<ArrayBufferLike>>;
106
121
  export declare function toBuffer(frame: AVFrame): Promise<Buffer<ArrayBufferLike>>;
package/lib/index.js CHANGED
@@ -66,6 +66,7 @@ exports.setAVLogLevel = setAVLogLevel;
66
66
  exports.createAVFormatContext = createAVFormatContext;
67
67
  exports.createAVFilter = createAVFilter;
68
68
  exports.createAVFrame = createAVFrame;
69
+ exports.createAVBitstreamFilter = createAVBitstreamFilter;
69
70
  exports.getBinaryUrl = getBinaryUrl;
70
71
  exports.toJpeg = toJpeg;
71
72
  exports.toBuffer = toBuffer;
@@ -166,6 +167,9 @@ function createAVFilter(options) {
166
167
  function createAVFrame(width, height, pixelFormat, fillBlack = true) {
167
168
  return new (loadAddon().AVFrame)(width, height, pixelFormat, fillBlack);
168
169
  }
170
+ function createAVBitstreamFilter(filter) {
171
+ return new (loadAddon().AVBitstreamFilter)(filter);
172
+ }
169
173
  function getBinaryUrl() {
170
174
  const libc = process.env.LIBC || process.env.npm_config_libc ||
171
175
  (detect_libc_1.default.isNonGlibcLinuxSync() && detect_libc_1.default.familySync()) || '';
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAWA,4BAEC;AAOD,oCAEC;AAED,sCAEC;AAED,8BAKC;AAGD,0BAgCC;AAED,sCA2BC;AA+GD,sCAEC;AAED,sDAEC;AAED,wCAcC;AAED,sCAOC;AAED,0DAEC;AAED,oCAeC;AA4BD,wBA2BC;AAED,4BAqBC;AAlVD,8DAAqC;AACrC,mCAA8B;AAC9B,uDAAyC;AACzC,4CAAoB;AAEpB,gDAAwB;AACxB,6BAAgC;AAChC,mEAA0C;AAE1C,IAAI,KAAU,CAAC;AAEf,SAAgB,QAAQ;IACpB,OAAO,CAAC,CAAC,KAAK,CAAC;AACnB,CAAC;AAED,SAAS,cAAc,CAAC,WAAmB;IACvC,OAAO,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,WAAW,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;AAC/C,SAAgB,YAAY,CAAC,WAAW,GAAG,WAAW;IAClD,OAAO,cAAI,CAAC,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,YAAY,CAAC,CAAC;AAChE,CAAC;AAED,SAAgB,aAAa,CAAC,WAAW,GAAG,WAAW;IACnD,OAAO,cAAI,CAAC,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;AAC1G,CAAC;AAED,SAAgB,SAAS,CAAC,SAAS,GAAG,YAAY,EAAE,EAAE,KAAkB,OAAO;IAC3E,IAAI,QAAQ,EAAE;QACV,OAAO,KAAK,CAAC;IACjB,KAAK,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IACtB,OAAO,KAAK,CAAC;AACjB,CAAC;AAED,IAAI,UAAqC,CAAC;AACnC,KAAK,UAAU,OAAO,CAAC,WAAW,GAAG,WAAW,EAAE,KAAyB,OAAO;IACrF,MAAM,SAAS,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;IAC5C,IAAI,CAAC,EAAE,EAAE,CAAC;QACN,IAAI,YAAE,CAAC,UAAU,CAAC,SAAS,CAAC;YACxB,OAAO;IACf,CAAC;SACI,CAAC;QACF,IAAI,QAAQ,EAAE;YACV,OAAO;QAEX,IAAI,UAAU;YACV,OAAO,UAAU,CAAC;QAEtB,IAAI,CAAC;YACD,SAAS,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;YACzB,OAAO;QACX,CAAC;QACD,OAAO,CAAC,EAAE,CAAC;QACX,CAAC;IACL,CAAC;IAED,UAAU,GAAG,CAAC,KAAK,IAAI,EAAE;QACrB,MAAM,aAAa,CAAC,WAAW,CAAC,CAAC;QACjC,IAAI,CAAC,EAAE;YACH,OAAO;QACX,SAAS,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IAC7B,CAAC,CAAC,EAAE;SACC,OAAO,CAAC,GAAG,EAAE;QACV,UAAU,GAAG,SAAS,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEP,OAAO,UAAU,CAAC;AACtB,CAAC;AAEM,KAAK,UAAU,aAAa,CAAC,WAAoB;IACpD,MAAM,GAAG,GAAG,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACzC,MAAM,YAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAClD,MAAM,SAAS,GAAG,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAC1C,MAAM,WAAW,GAAG,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IAC/C,IAAI,CAAC;QACD,MAAM,YAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACxE,CAAC;IACD,OAAO,CAAC,EAAE,CAAC;QACP,MAAM,cAAc,GAAG,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;QACtD,YAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACjE,MAAM,YAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;IAC1D,CAAC;IACD,MAAM,YAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,MAAM,YAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAClE,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;IACjC,MAAM,CAAC,GAAG,wBAAK,CAAC,GAAG,CAAC,SAAS,EAAE;QAC3B,MAAM,EAAE,CAAC;KACZ,CAAC,CAAC;IACH,MAAM,CAAC,QAAQ,CAAC,GAAG,MAAM,IAAA,aAAI,EAAC,CAAC,EAAE,UAAU,CAAsB,CAAC;IAClE,IAAI,CAAC,QAAQ,CAAC,UAAU,IAAI,CAAC,QAAQ,CAAC,UAAU,GAAG,GAAG,IAAI,QAAQ,CAAC,UAAU,IAAI,GAAG,CAAC;QACjF,MAAM,IAAI,KAAK,CAAC,oCAAoC,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;IAC/E,MAAM,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAA,OAAI,EAAC;QACzB,GAAG,EAAE,WAAW;KACnB,CAAC,CAAC,CAAC;IACJ,MAAM,IAAA,aAAI,EAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IACrB,MAAM,YAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,EAAE,SAAS,CAAC,CAAC;AACzE,CAAC;AA+GD,SAAgB,aAAa,CAAC,KAAiG;IAC3H,SAAS,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;AACnC,CAAC;AAED,SAAgB,qBAAqB;IACjC,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC,eAAe,CAAC,EAAE,CAAC;AAC/C,CAAC;AAED,SAAgB,cAAc,CAAC,OAY9B;IACG,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC;AAC/C,CAAC;AAED,SAAgB,aAAa,CACzB,KAAa,EACb,MAAc,EACd,WAAmB,EACnB,SAAS,GAAG,IAAI;IAEhB,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;AAC5E,CAAC;AAED,SAAgB,uBAAuB,CAAC,MAAc;IAClD,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC;AACvD,CAAC;AAED,SAAgB,YAAY;IACxB,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe;QACxD,CAAC,qBAAU,CAAC,mBAAmB,EAAE,IAAI,qBAAU,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,CAAA;IAEvE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,sBAAW,CAAC;IACtC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,uBAAuB,EAAE,EAAE,CAAC,CAAA;IAE5D,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;IACrC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,MAAM,CAAC;IACzD,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;IACnC,MAAM,WAAW,GAAG,GAAG,UAAU,KAAK,OAAO,IAAI,OAAO,KAAK,GAAG,IAAI,QAAQ,GAAG,IAAI,IAAI,IAAI,SAAS,CAAC;IAErG,MAAM,GAAG,GAAG,2DAA2D,OAAO,IAAI,WAAW,EAAE,CAAC;IAEhG,OAAO,GAAG,CAAC;AACf,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,aAAsB,EAAE,OAAe;;;QAC7D,MAAM,OAAO,kCAAG,aAAa,CAAC,aAAa,CAAC;YACxC,OAAO,EAAE,OAAO;YAChB,OAAO,EAAE,OAAO;YAChB,QAAQ,EAAE;gBACN,WAAW,EAAE,CAAC;gBACd,WAAW,EAAE,EAAE;aAClB;YACD,IAAI,EAAE;gBACF,OAAO;gBACP,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,OAAO;aAChB;SACJ,CAAC,QAAA,CAAC;QAEH,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QACpD,IAAI,CAAC,IAAI;YACL,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;QAExC,MAAM,eAAe,kCAAG,MAAM,OAAO,CAAC,aAAa,EAAE,QAAA,CAAC;QACtD,IAAI,CAAC,eAAe;YAChB,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;QAEvD,OAAO,eAAe,CAAC,OAAO,EAAE,CAAC;;;;;;;;;CACpC;AAEM,KAAK,UAAU,MAAM,CAAC,KAAc,EAAE,OAAe;;;QACxD,IAAI,KAAK,CAAC,WAAW,KAAK,UAAU;YAChC,OAAO,MAAM,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAE5C,IAAI,YAAY,GAAG,uBAAuB,CAAC;QAC3C,IAAI,KAAK,CAAC,kBAAkB;YACxB,YAAY,GAAG,qBAAqB,KAAK,CAAC,cAAc,IAAI,YAAY,EAAE,CAAC;QAE/E,MAAM,MAAM,kCAAG,cAAc,CAAC;YAC1B,MAAM,EAAE,YAAY;YACpB,MAAM,EAAE;gBACJ;oBACI,KAAK;oBACL,QAAQ,EAAE;wBACN,WAAW,EAAE,CAAC;wBACd,WAAW,EAAE,EAAE;qBAClB;iBACJ;aACJ;SACJ,CAAC,QAAA,CAAC;QAEH,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACvB,MAAM,aAAa,kCAAG,MAAM,CAAC,QAAQ,EAAE,QAAA,CAAC;QACxC,aAAa,CAAC,GAAG,GAAG,CAAC,CAAC;QACtB,aAAa,CAAC,GAAG,GAAG,CAAC,CAAC;QAEtB,OAAO,MAAM,UAAU,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;;;;;;;;;CACnD;AAEM,KAAK,UAAU,QAAQ,CAAC,KAAc;;;QACzC,IAAI,CAAC,KAAK,CAAC,kBAAkB;YACzB,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC;QAE5B,MAAM,YAAY,GAAG,qBAAqB,KAAK,CAAC,cAAc,EAAE,CAAC;QACjE,MAAM,MAAM,kCAAG,cAAc,CAAC;YAC1B,MAAM,EAAE,YAAY;YACpB,MAAM,EAAE;gBACJ;oBACI,KAAK;oBACL,QAAQ,EAAE;wBACN,WAAW,EAAE,CAAC;wBACd,WAAW,EAAE,EAAE;qBAClB;iBACJ;aACJ;SACJ,CAAC,QAAA,CAAC;QAEH,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACvB,MAAM,aAAa,kCAAG,MAAM,CAAC,QAAQ,EAAE,QAAA,CAAC;QACxC,OAAO,aAAa,CAAC,QAAQ,EAAE,CAAC;;;;;;;;;CACnC;AAEY,QAAA,OAAO,GAAW,sBAAW,CAAC,OAAO,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@scrypted/libav",
3
- "version": "1.0.136",
3
+ "version": "1.0.137",
4
4
  "dependencies": {
5
5
  "detect-libc": "^2.0.3",
6
6
  "follow-redirects": "^1.15.9",
package/src/bsf.cpp ADDED
@@ -0,0 +1,205 @@
1
+ #include "bsf.h"
2
+ #include "packet.h"
3
+ #include "formatcontext.h"
4
+
5
+ Napi::FunctionReference AVBitstreamFilter::constructor;
6
+
7
+ Napi::Object AVBitstreamFilter::Init(Napi::Env env, Napi::Object exports)
8
+ {
9
+ Napi::HandleScope scope(env);
10
+
11
+ Napi::Function func = DefineClass(env, "AVBitstreamFilter", {
12
+
13
+ InstanceMethod(Napi::Symbol::WellKnown(env, "dispose"), &AVBitstreamFilter::Destroy),
14
+
15
+ InstanceMethod("destroy", &AVBitstreamFilter::Destroy),
16
+
17
+ InstanceMethod("setOption", &AVBitstreamFilter::SetOption),
18
+
19
+ InstanceMethod("sendPacket", &AVBitstreamFilter::SendPacket),
20
+
21
+ InstanceMethod("copyParameters", &AVBitstreamFilter::CopyParameters),
22
+
23
+ InstanceMethod("receivePacket", &AVBitstreamFilter::ReceivePacket)});
24
+
25
+ constructor = Napi::Persistent(func);
26
+ constructor.SuppressDestruct();
27
+
28
+ exports.Set("AVBitstreamFilter", func);
29
+
30
+ return exports;
31
+ }
32
+
33
+ AVBitstreamFilter::AVBitstreamFilter(const Napi::CallbackInfo &info)
34
+ : Napi::ObjectWrap<AVBitstreamFilter>(info), bsfContext(nullptr)
35
+ {
36
+ bsfContext = nullptr;
37
+
38
+ Napi::Env env = info.Env();
39
+
40
+ if (info.Length() < 1 || !info[0].IsString())
41
+ {
42
+ Napi::TypeError::New(env, "String expected for argument 0: filter name").ThrowAsJavaScriptException();
43
+ return;
44
+ }
45
+
46
+ std::string filterName = info[0].As<Napi::String>().Utf8Value();
47
+
48
+ const AVBitStreamFilter *filter = av_bsf_get_by_name(filterName.c_str());
49
+ if (!filter)
50
+ {
51
+ Napi::Error::New(env, "Bitstream filter not found").ThrowAsJavaScriptException();
52
+ return;
53
+ }
54
+
55
+ int ret = av_bsf_alloc(filter, &bsfContext);
56
+ if (ret < 0)
57
+ {
58
+ Napi::Error::New(env, AVErrorString(ret)).ThrowAsJavaScriptException();
59
+ return;
60
+ }
61
+ }
62
+
63
+ AVBitstreamFilter::~AVBitstreamFilter()
64
+ {
65
+ }
66
+
67
+ Napi::Object AVBitstreamFilter::NewInstance(Napi::Env env, AVBSFContext *bsfContext)
68
+ {
69
+ Napi::EscapableHandleScope scope(env);
70
+ Napi::Object obj = constructor.New({});
71
+ AVBitstreamFilter *instance = Napi::ObjectWrap<AVBitstreamFilter>::Unwrap(obj);
72
+ instance->bsfContext = bsfContext;
73
+ return scope.Escape(napi_value(obj)).ToObject();
74
+ }
75
+
76
+ Napi::Value AVBitstreamFilter::SendPacket(const Napi::CallbackInfo &info)
77
+ {
78
+ if (info.Length() < 1 || !info[0].IsObject())
79
+ {
80
+ Napi::TypeError::New(info.Env(), "Packet object expected").ThrowAsJavaScriptException();
81
+ return info.Env().Undefined();
82
+ }
83
+
84
+ AVPacketObject *packetObject = Napi::ObjectWrap<AVPacketObject>::Unwrap(info[0].As<Napi::Object>());
85
+
86
+ int ret = av_bsf_send_packet(bsfContext, packetObject->packet);
87
+ if (ret < 0)
88
+ {
89
+ Napi::Error::New(info.Env(), AVErrorString(ret)).ThrowAsJavaScriptException();
90
+ return info.Env().Undefined();
91
+ }
92
+
93
+ return info.Env().Undefined();
94
+ }
95
+
96
+ Napi::Value AVBitstreamFilter::ReceivePacket(const Napi::CallbackInfo &info)
97
+ {
98
+ AVPacket *packet = av_packet_alloc();
99
+ if (!packet)
100
+ {
101
+ Napi::Error::New(info.Env(), "Could not allocate packet").ThrowAsJavaScriptException();
102
+ return info.Env().Undefined();
103
+ }
104
+
105
+ int ret = av_bsf_receive_packet(bsfContext, packet);
106
+ if (ret == AVERROR(EAGAIN))
107
+ {
108
+ av_packet_free(&packet);
109
+ return info.Env().Undefined();
110
+ }
111
+ if (ret < 0)
112
+ {
113
+ av_packet_free(&packet);
114
+ Napi::Error::New(info.Env(), AVErrorString(ret)).ThrowAsJavaScriptException();
115
+ return info.Env().Undefined();
116
+ }
117
+
118
+ Napi::Object packetObject = AVPacketObject::NewInstance(info.Env(), packet);
119
+ return packetObject;
120
+ }
121
+
122
+ Napi::Value AVBitstreamFilter::SetOption(const Napi::CallbackInfo &info)
123
+ {
124
+ if (!bsfContext)
125
+ {
126
+ Napi::TypeError::New(info.Env(), "Bitstream Filter object is null").ThrowAsJavaScriptException();
127
+ return info.Env().Undefined();
128
+ }
129
+
130
+ Napi::Env env = info.Env();
131
+
132
+ if (info.Length() < 1 || !info[0].IsObject())
133
+ {
134
+ Napi::TypeError::New(env, "Object expected for argument 0: options").ThrowAsJavaScriptException();
135
+ return info.Env().Undefined();
136
+ }
137
+
138
+ Napi::Object options = info[0].As<Napi::Object>();
139
+
140
+ // convert this options to a AVDictionary
141
+ AVDictionary *optionsDict = nullptr;
142
+
143
+ Napi::Array keys = options.GetPropertyNames();
144
+ for (unsigned int i = 0; i < keys.Length(); i++)
145
+ {
146
+ Napi::Value key = keys.Get(i);
147
+ Napi::Value value = options.Get(key.ToString());
148
+
149
+ if (value.IsString())
150
+ {
151
+ std::string keyStr = key.ToString();
152
+ std::string valueStr = value.ToString();
153
+
154
+ av_dict_set(&optionsDict, keyStr.c_str(), valueStr.c_str(), 0);
155
+ }
156
+ }
157
+
158
+ int ret = av_opt_set_dict2(bsfContext, &optionsDict, AV_OPT_SEARCH_CHILDREN);
159
+ if (ret < 0)
160
+ {
161
+ Napi::Error::New(env, AVErrorString(ret)).ThrowAsJavaScriptException();
162
+ return info.Env().Undefined();
163
+ }
164
+
165
+ return info.Env().Undefined();
166
+ }
167
+
168
+ Napi::Value AVBitstreamFilter::Destroy(const Napi::CallbackInfo &info)
169
+ {
170
+ if (bsfContext)
171
+ {
172
+ av_bsf_free(&bsfContext);
173
+ bsfContext = nullptr;
174
+ }
175
+ return info.Env().Undefined();
176
+ }
177
+
178
+ Napi::Value AVBitstreamFilter::CopyParameters(const Napi::CallbackInfo &info)
179
+ {
180
+ if (!bsfContext)
181
+ {
182
+ Napi::TypeError::New(info.Env(), "Bitstream Filter object is null").ThrowAsJavaScriptException();
183
+ return info.Env().Undefined();
184
+ }
185
+
186
+ // get the AVFormatContext object and stream index
187
+ if (info.Length() < 2 || !info[0].IsObject() || !info[1].IsNumber())
188
+ {
189
+ Napi::TypeError::New(info.Env(), "Object expected for argument 0: formatContext and Number expected for argument 1: streamIndex").ThrowAsJavaScriptException();
190
+ return info.Env().Undefined();
191
+ }
192
+
193
+ AVFormatContextObject *formatContextObject = Napi::ObjectWrap<AVFormatContextObject>::Unwrap(info[0].As<Napi::Object>());
194
+ int streamIndex = info[1].As<Napi::Number>().Int32Value();
195
+
196
+ AVStream *stream = formatContextObject->fmt_ctx_->streams[streamIndex];
197
+
198
+ int ret = avcodec_parameters_copy(bsfContext->par_in, stream->codecpar);
199
+ if (ret < 0)
200
+ {
201
+ Napi::Error::New(info.Env(), AVErrorString(ret)).ThrowAsJavaScriptException();
202
+ return info.Env().Undefined();
203
+ }
204
+ return info.Env().Undefined();
205
+ }
package/src/bsf.h ADDED
@@ -0,0 +1,35 @@
1
+ #pragma once
2
+
3
+ #include <napi.h>
4
+
5
+ extern "C"
6
+ {
7
+ #include <libavfilter/avfilter.h>
8
+ #include <libavfilter/buffersrc.h>
9
+ #include <libavfilter/buffersink.h>
10
+ #include <libavutil/opt.h>
11
+ #include <libavcodec/bsf.h>
12
+ }
13
+
14
+ #include "error.h"
15
+
16
+ class AVBitstreamFilter : public Napi::ObjectWrap<AVBitstreamFilter>
17
+ {
18
+ public:
19
+ static Napi::Object Init(Napi::Env env, Napi::Object exports);
20
+
21
+ AVBitstreamFilter(const Napi::CallbackInfo &info);
22
+ ~AVBitstreamFilter();
23
+
24
+ static Napi::Object NewInstance(Napi::Env env, AVBSFContext *bsfContext);
25
+ AVBSFContext *bsfContext;
26
+
27
+ private:
28
+ static Napi::FunctionReference constructor;
29
+
30
+ Napi::Value Destroy(const Napi::CallbackInfo &info);
31
+ Napi::Value SetOption(const Napi::CallbackInfo &info);
32
+ Napi::Value SendPacket(const Napi::CallbackInfo &info);
33
+ Napi::Value ReceivePacket(const Napi::CallbackInfo &info);
34
+ Napi::Value CopyParameters(const Napi::CallbackInfo &info);
35
+ };
@@ -67,6 +67,10 @@ Napi::Object AVCodecContextObject::Init(Napi::Env env, Napi::Object exports)
67
67
 
68
68
  AVCodecContextObject::InstanceAccessor("vendorInfo", &AVCodecContextObject::GetVendorInfo, nullptr),
69
69
 
70
+ AVCodecContextObject::InstanceAccessor("keyIntMin", &AVCodecContextObject::GetKeyIntMin, &AVCodecContextObject::SetKeyIntMin),
71
+
72
+ AVCodecContextObject::InstanceAccessor("gopSize", &AVCodecContextObject::GetGopSize, &AVCodecContextObject::SetGopSize),
73
+
70
74
  InstanceMethod(Napi::Symbol::WellKnown(env, "dispose"), &AVCodecContextObject::Destroy),
71
75
 
72
76
  InstanceMethod("destroy", &AVCodecContextObject::Destroy),
@@ -532,3 +536,63 @@ Napi::Value AVCodecContextObject::GetVendorInfo(const Napi::CallbackInfo &info)
532
536
  return obj;
533
537
  #endif
534
538
  }
539
+
540
+ Napi::Value AVCodecContextObject::GetKeyIntMin(const Napi::CallbackInfo &info)
541
+ {
542
+ Napi::Env env = info.Env();
543
+
544
+ if (!codecContext)
545
+ {
546
+ return env.Undefined();
547
+ }
548
+
549
+ return Napi::Number::New(env, codecContext->keyint_min);
550
+ }
551
+
552
+ void AVCodecContextObject::SetKeyIntMin(const Napi::CallbackInfo &info, const Napi::Value &value)
553
+ {
554
+ Napi::Env env = info.Env();
555
+
556
+ if (!codecContext)
557
+ {
558
+ return;
559
+ }
560
+
561
+ if (!value.IsNumber())
562
+ {
563
+ Napi::TypeError::New(env, "keyIntMin must be a number").ThrowAsJavaScriptException();
564
+ return;
565
+ }
566
+
567
+ codecContext->keyint_min = value.As<Napi::Number>().Int32Value();
568
+ }
569
+
570
+ Napi::Value AVCodecContextObject::GetGopSize(const Napi::CallbackInfo &info)
571
+ {
572
+ Napi::Env env = info.Env();
573
+
574
+ if (!codecContext)
575
+ {
576
+ return env.Undefined();
577
+ }
578
+
579
+ return Napi::Number::New(env, codecContext->gop_size);
580
+ }
581
+
582
+ void AVCodecContextObject::SetGopSize(const Napi::CallbackInfo &info, const Napi::Value &value)
583
+ {
584
+ Napi::Env env = info.Env();
585
+
586
+ if (!codecContext)
587
+ {
588
+ return;
589
+ }
590
+
591
+ if (!value.IsNumber())
592
+ {
593
+ Napi::TypeError::New(env, "gopSize must be a number").ThrowAsJavaScriptException();
594
+ return;
595
+ }
596
+
597
+ codecContext->gop_size = value.As<Napi::Number>().Int32Value();
598
+ }
@@ -32,6 +32,10 @@ public:
32
32
  enum AVHWDeviceType hw_device_value;
33
33
 
34
34
  private:
35
+ Napi::Value GetKeyIntMin(const Napi::CallbackInfo &info);
36
+ void SetKeyIntMin(const Napi::CallbackInfo &info, const Napi::Value &value);
37
+ Napi::Value GetGopSize(const Napi::CallbackInfo &info);
38
+ void SetGopSize(const Napi::CallbackInfo &info, const Napi::Value &value);
35
39
  Napi::Value GetTimeBaseNum(const Napi::CallbackInfo &info);
36
40
  Napi::Value GetTimeBaseDen(const Napi::CallbackInfo &info);
37
41
  Napi::Value GetHardwareDevice(const Napi::CallbackInfo &info);
@@ -23,9 +23,11 @@ extern "C"
23
23
  #include <thread>
24
24
  #include <v8.h>
25
25
 
26
+ #include "formatcontext.h"
26
27
  #include "filter.h"
27
28
  #include "codeccontext.h"
28
29
  #include "packet.h"
30
+ #include "bsf.h"
29
31
 
30
32
  static Napi::FunctionReference logCallbackRef;
31
33
 
@@ -99,30 +101,6 @@ void printAVError(int errnum)
99
101
  printf("Error: %s\n", errbuf);
100
102
  }
101
103
 
102
- class AVFormatContextObject : public Napi::ObjectWrap<AVFormatContextObject>
103
- {
104
- public:
105
- static Napi::Object Init(Napi::Env env, Napi::Object exports);
106
- AVFormatContextObject(const Napi::CallbackInfo &info);
107
- ~AVFormatContextObject(); // Explicitly declare the destructor
108
- static Napi::FunctionReference constructor;
109
- AVFormatContext *fmt_ctx_;
110
- Napi::ThreadSafeFunction callbackRef;
111
-
112
- private:
113
- Napi::Value Open(const Napi::CallbackInfo &info);
114
- Napi::Value Close(const Napi::CallbackInfo &info);
115
- Napi::Value CreateDecoder(const Napi::CallbackInfo &info);
116
- Napi::Value GetMetadata(const Napi::CallbackInfo &info);
117
- Napi::Value ReadFrame(const Napi::CallbackInfo &info);
118
- Napi::Value ReceiveFrame(const Napi::CallbackInfo &info);
119
- Napi::Value Create(const Napi::CallbackInfo &info);
120
- Napi::Value NewStream(const Napi::CallbackInfo &info);
121
- Napi::Value WriteFrame(const Napi::CallbackInfo &info);
122
- Napi::Value GetStreams(const Napi::CallbackInfo &info);
123
- Napi::Value CreateSDP(const Napi::CallbackInfo &info);
124
- };
125
-
126
104
  class ReadFrameWorker : public Napi::AsyncWorker
127
105
  {
128
106
  public:
@@ -818,6 +796,7 @@ Napi::Object Init(Napi::Env env, Napi::Object exports)
818
796
  AVFrameObject::Init(env, exports);
819
797
  AVCodecContextObject::Init(env, exports);
820
798
  AVFormatContextObject::Init(env, exports);
799
+ AVBitstreamFilter::Init(env, exports);
821
800
 
822
801
  exports.Set(Napi::String::New(env, "setLogLevel"), Napi::Function::New(env, setLogLevel));
823
802
  return exports;
@@ -0,0 +1,45 @@
1
+ #include <napi.h>
2
+ extern "C"
3
+ {
4
+ #include <libavcodec/avcodec.h>
5
+ #include <libavformat/avformat.h>
6
+ #include <libavutil/hwcontext.h>
7
+ #include <libavutil/frame.h>
8
+ #include <libavfilter/buffersink.h>
9
+ #include <libavfilter/buffersrc.h>
10
+ #include <libavfilter/avfilter.h>
11
+ #include <libavutil/opt.h>
12
+ #include <libavutil/avutil.h>
13
+ // rtpenc.h header uses a weird restrict keyword
14
+ #ifndef restrict
15
+ #define restrict
16
+ #include <libavformat/rtpenc.h>
17
+ #undef restrict
18
+ #else
19
+ #include <libavformat/rtpenc.h>
20
+ #endif
21
+ }
22
+
23
+ class AVFormatContextObject : public Napi::ObjectWrap<AVFormatContextObject>
24
+ {
25
+ public:
26
+ static Napi::Object Init(Napi::Env env, Napi::Object exports);
27
+ AVFormatContextObject(const Napi::CallbackInfo &info);
28
+ ~AVFormatContextObject(); // Explicitly declare the destructor
29
+ static Napi::FunctionReference constructor;
30
+ AVFormatContext *fmt_ctx_;
31
+ Napi::ThreadSafeFunction callbackRef;
32
+
33
+ private:
34
+ Napi::Value Open(const Napi::CallbackInfo &info);
35
+ Napi::Value Close(const Napi::CallbackInfo &info);
36
+ Napi::Value CreateDecoder(const Napi::CallbackInfo &info);
37
+ Napi::Value GetMetadata(const Napi::CallbackInfo &info);
38
+ Napi::Value ReadFrame(const Napi::CallbackInfo &info);
39
+ Napi::Value ReceiveFrame(const Napi::CallbackInfo &info);
40
+ Napi::Value Create(const Napi::CallbackInfo &info);
41
+ Napi::Value NewStream(const Napi::CallbackInfo &info);
42
+ Napi::Value WriteFrame(const Napi::CallbackInfo &info);
43
+ Napi::Value GetStreams(const Napi::CallbackInfo &info);
44
+ Napi::Value CreateSDP(const Napi::CallbackInfo &info);
45
+ };
package/src/frame.cpp CHANGED
@@ -46,6 +46,10 @@ Napi::Object AVFrameObject::Init(Napi::Env env, Napi::Object exports)
46
46
 
47
47
  AVFrameObject::InstanceAccessor("softwareFormat", &AVFrameObject::GetSoftware, NULL),
48
48
 
49
+ AVFrameObject::InstanceAccessor("flags", &AVFrameObject::GetFlags, &AVFrameObject::SetFlags),
50
+
51
+ AVFrameObject::InstanceAccessor("pictType", &AVFrameObject::GetPictType, &AVFrameObject::SetPictType),
52
+
49
53
  InstanceMethod(Napi::Symbol::WellKnown(env, "dispose"), &AVFrameObject::Destroy),
50
54
 
51
55
  InstanceMethod("destroy", &AVFrameObject::Destroy),
@@ -227,6 +231,17 @@ Napi::Value AVFrameObject::CreateEncoder(const Napi::CallbackInfo &info)
227
231
  c->time_base.num = timeBaseNum;
228
232
  c->time_base.den = timeBaseDen;
229
233
 
234
+ Napi::Value gopSizeValue = options.Get("gopSize");
235
+ if (gopSizeValue.IsNumber()) {
236
+ c->gop_size = gopSizeValue.As<Napi::Number>().Int32Value();
237
+ }
238
+
239
+ Napi::Value keyintMinValue = options.Get("keyIntMin");
240
+ if (keyintMinValue.IsNumber()) {
241
+ c->keyint_min = keyintMinValue.As<Napi::Number>().Int32Value();
242
+ }
243
+
244
+
230
245
  Napi::Value opts = options.Get("opts");
231
246
  if (opts.IsObject())
232
247
  {
@@ -535,6 +550,7 @@ Napi::Value AVFrameObject::GetSoftware(const Napi::CallbackInfo &info)
535
550
  {
536
551
  return env.Undefined();
537
552
  }
553
+
538
554
  if (frame_->hw_frames_ctx)
539
555
  {
540
556
  AVHWFramesContext *frames_ctx = (AVHWFramesContext *)(frame_->hw_frames_ctx->data);
@@ -542,4 +558,56 @@ Napi::Value AVFrameObject::GetSoftware(const Napi::CallbackInfo &info)
542
558
  return Napi::String::New(env, format.c_str());
543
559
  }
544
560
  return env.Null();
545
- }
561
+ }
562
+
563
+ Napi::Value AVFrameObject::GetFlags(const Napi::CallbackInfo &info)
564
+ {
565
+ Napi::Env env = info.Env();
566
+ if (!frame_)
567
+ {
568
+ return env.Undefined();
569
+ }
570
+ return Napi::Number::New(env, frame_->flags);
571
+ }
572
+
573
+ void AVFrameObject::SetFlags(const Napi::CallbackInfo &info, const Napi::Value &value)
574
+ {
575
+ Napi::Env env = info.Env();
576
+ if (!frame_)
577
+ {
578
+ Napi::Error::New(env, "Frame object is null").ThrowAsJavaScriptException();
579
+ return;
580
+ }
581
+ if (!value.IsNumber())
582
+ {
583
+ Napi::TypeError::New(env, "Number expected").ThrowAsJavaScriptException();
584
+ return;
585
+ }
586
+ frame_->flags = value.As<Napi::Number>().Int32Value();
587
+ }
588
+
589
+ Napi::Value AVFrameObject::GetPictType(const Napi::CallbackInfo &info)
590
+ {
591
+ Napi::Env env = info.Env();
592
+ if (!frame_)
593
+ {
594
+ return env.Undefined();
595
+ }
596
+ return Napi::Number::New(env, frame_->pict_type);
597
+ }
598
+
599
+ void AVFrameObject::SetPictType(const Napi::CallbackInfo &info, const Napi::Value &value)
600
+ {
601
+ Napi::Env env = info.Env();
602
+ if (!frame_)
603
+ {
604
+ Napi::Error::New(env, "Frame object is null").ThrowAsJavaScriptException();
605
+ return;
606
+ }
607
+ if (!value.IsNumber())
608
+ {
609
+ Napi::TypeError::New(env, "Number expected").ThrowAsJavaScriptException();
610
+ return;
611
+ }
612
+ frame_->pict_type = (enum AVPictureType)value.As<Napi::Number>().Int32Value();
613
+ }
package/src/frame.h CHANGED
@@ -43,9 +43,13 @@ private:
43
43
  void SetDTS(const Napi::CallbackInfo &info, const Napi::Value &value);
44
44
  Napi::Value GetHardware(const Napi::CallbackInfo &info);
45
45
  Napi::Value GetSoftware(const Napi::CallbackInfo &info);
46
+ Napi::Value GetFlags(const Napi::CallbackInfo &info);
47
+ void SetFlags(const Napi::CallbackInfo &info, const Napi::Value &value);
48
+ Napi::Value GetPictType(const Napi::CallbackInfo &info);
49
+ void SetPictType(const Napi::CallbackInfo &info, const Napi::Value &value);
46
50
 
47
51
  Napi::Value Destroy(const Napi::CallbackInfo &info);
48
52
  Napi::Value CreateEncoder(const Napi::CallbackInfo &info);
49
53
  Napi::Value ToBuffer(const Napi::CallbackInfo &info);
50
54
  Napi::Value FromBuffer(const Napi::CallbackInfo &info);
51
- };
55
+ };
package/src/index.ts CHANGED
@@ -103,7 +103,9 @@ export interface AVFrame extends AVTimeBase {
103
103
  readonly pixelFormat: string;
104
104
  readonly hardwareDeviceType: string;
105
105
  readonly softwareFormat: string;
106
+ pictType: number;
106
107
 
108
+ flags: number;
107
109
  timeBaseNum: number;
108
110
  timeBaseDen: number;
109
111
  pts: number;
@@ -120,6 +122,8 @@ export interface AVFrame extends AVTimeBase {
120
122
  opts?: {
121
123
  [key: string]: string | number,
122
124
  },
125
+ gopSize?: number;
126
+ keyIntMin?: number;
123
127
  }): AVCodecContext;
124
128
  }
125
129
 
@@ -131,9 +135,18 @@ export interface AVFilter {
131
135
  getFrame(index?: number): AVFrame;
132
136
  }
133
137
 
138
+ export interface AVBitstreamFilter {
139
+ [Symbol.dispose](): void;
140
+ destroy(): void;
141
+ setOption(name: string, value: string): void;
142
+ sendPacket(packet: AVPacket): void;
143
+ receivePacket(): AVPacket;
144
+ copyParameters(formatContext: AVFormatContext, streamIndex: number): void;
145
+ }
146
+
134
147
  export interface AVPacket {
135
148
  readonly streamIndex: number;
136
- readonly isKeyFrame: boolean;
149
+ flags: number;
137
150
  readonly size: number;
138
151
  readonly pts: number;
139
152
  readonly dts: number;
@@ -153,6 +166,8 @@ export interface AVCodecContext extends AVTimeBase {
153
166
  readonly pixelFormat: string;
154
167
  readonly hardwarePixelFormat: string;
155
168
  readonly vendorInfo: Record<string, any>;
169
+ keyIntMin: number;
170
+ gopSize: number;
156
171
 
157
172
  [Symbol.dispose](): void;
158
173
  destroy(): void;
@@ -224,6 +239,10 @@ export function createAVFrame(
224
239
  return new (loadAddon().AVFrame)(width, height, pixelFormat, fillBlack);
225
240
  }
226
241
 
242
+ export function createAVBitstreamFilter(filter: string): AVBitstreamFilter {
243
+ return new (loadAddon().AVBitstreamFilter)(filter);
244
+ }
245
+
227
246
  export function getBinaryUrl() {
228
247
  const libc = process.env.LIBC || process.env.npm_config_libc ||
229
248
  (detectLibc.isNonGlibcLinuxSync() && detectLibc.familySync()) || ''
package/src/packet.cpp CHANGED
@@ -23,27 +23,16 @@ Napi::Object AVPacketObject::Init(Napi::Env env, Napi::Object exports)
23
23
  Napi::HandleScope scope(env);
24
24
 
25
25
  Napi::Function func = DefineClass(env, "AVPacketObject", {
26
-
27
- AVPacketObject::InstanceAccessor("isKeyFrame", &AVPacketObject::GetIsKeyFrame, nullptr),
28
-
26
+ AVPacketObject::InstanceAccessor("flags", &AVPacketObject::GetFlags, &AVPacketObject::SetFlags),
29
27
  AVPacketObject::InstanceAccessor("pts", &AVPacketObject::GetPTS, nullptr),
30
-
31
28
  AVPacketObject::InstanceAccessor("dts", &AVPacketObject::GetDTS, nullptr),
32
-
33
29
  AVPacketObject::InstanceAccessor("duration", &AVPacketObject::GetDuration, nullptr),
34
-
35
30
  AVPacketObject::InstanceAccessor("size", &AVPacketObject::GetSize, nullptr),
36
-
37
31
  AVPacketObject::InstanceAccessor("streamIndex", &AVPacketObject::GetStreamIndex, nullptr),
38
-
39
32
  InstanceMethod(Napi::Symbol::WellKnown(env, "dispose"), &AVPacketObject::Destroy),
40
-
41
33
  InstanceMethod("clone", &AVPacketObject::Clone),
42
-
43
34
  InstanceMethod("destroy", &AVPacketObject::Destroy),
44
-
45
35
  InstanceMethod("getData", &AVPacketObject::GetData),
46
-
47
36
  });
48
37
 
49
38
  constructor = Napi::Persistent(func);
@@ -104,11 +93,25 @@ Napi::Value AVPacketObject::Destroy(const Napi::CallbackInfo &info)
104
93
 
105
94
  return info.Env().Undefined();
106
95
  }
96
+ Napi::Value AVPacketObject::GetFlags(const Napi::CallbackInfo &info)
97
+ {
98
+ return Napi::Number::New(info.Env(), packet ? packet->flags : 0);
99
+ }
107
100
 
108
- Napi::Value AVPacketObject::GetIsKeyFrame(const Napi::CallbackInfo &info)
101
+ void AVPacketObject::SetFlags(const Napi::CallbackInfo &info, const Napi::Value &value)
109
102
  {
110
- bool keyFrame = packet ? packet->flags & AV_PKT_FLAG_KEY : false;
111
- return Napi::Boolean::New(info.Env(), keyFrame);
103
+ if (!packet)
104
+ {
105
+ return;
106
+ }
107
+
108
+ if (!value.IsNumber())
109
+ {
110
+ Napi::TypeError::New(info.Env(), "Number expected for flags").ThrowAsJavaScriptException();
111
+ return;
112
+ }
113
+
114
+ packet->flags = value.As<Napi::Number>().Int32Value();
112
115
  }
113
116
 
114
117
  Napi::Value AVPacketObject::GetPTS(const Napi::CallbackInfo &info)
package/src/packet.h CHANGED
@@ -27,7 +27,8 @@ public:
27
27
  ~AVPacketObject();
28
28
  Napi::Value Clone(const Napi::CallbackInfo &info);
29
29
  Napi::Value Destroy(const Napi::CallbackInfo &info);
30
- Napi::Value GetIsKeyFrame(const Napi::CallbackInfo &info);
30
+ Napi::Value GetFlags(const Napi::CallbackInfo &info);
31
+ void SetFlags(const Napi::CallbackInfo &info, const Napi::Value &value);
31
32
  Napi::Value GetPTS(const Napi::CallbackInfo &info);
32
33
  Napi::Value GetDTS(const Napi::CallbackInfo &info);
33
34
  Napi::Value GetDuration(const Napi::CallbackInfo &info);