@scrypted/libav 1.0.136 → 1.0.138
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/.vscode/launch.json +1 -1
- package/.vscode/settings.json +2 -1
- package/binding.gyp +1 -0
- package/lib/flags.d.ts +14 -0
- package/lib/flags.js +20 -0
- package/lib/flags.js.map +1 -0
- package/lib/index.d.ts +17 -1
- package/lib/index.js +19 -0
- package/lib/index.js.map +1 -1
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/bsf.cpp +205 -0
- package/src/bsf.h +35 -0
- package/src/codeccontext.cpp +64 -0
- package/src/codeccontext.h +4 -0
- package/src/flags.ts +15 -0
- package/src/formatcontext.cpp +3 -24
- package/src/formatcontext.h +45 -0
- package/src/frame.cpp +69 -1
- package/src/frame.h +5 -1
- package/src/index.ts +21 -1
- package/src/packet.cpp +18 -15
- package/src/packet.h +2 -1
package/.vscode/launch.json
CHANGED
package/.vscode/settings.json
CHANGED
package/binding.gyp
CHANGED
package/lib/flags.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export declare enum AVPacketFlags {
|
|
2
|
+
AV_PKT_FLAG_KEY = 1,
|
|
3
|
+
AV_PKT_FLAG_CORRUPT = 2,
|
|
4
|
+
AV_PKT_FLAG_DISCARD = 4,
|
|
5
|
+
AV_PKT_FLAG_TRUSTED = 8,
|
|
6
|
+
AV_PKT_FLAG_DISPOSABLE = 16
|
|
7
|
+
}
|
|
8
|
+
export declare enum AVFrameFlags {
|
|
9
|
+
AV_FRAME_FLAG_KEY = 1,
|
|
10
|
+
AV_FRAME_FLAG_CORRUPT = 2,
|
|
11
|
+
AV_FRAME_FLAG_DISCARD = 4,
|
|
12
|
+
AV_FRAME_FLAG_TRUSTED = 8,
|
|
13
|
+
AV_FRAME_FLAG_DISPOSABLE = 16
|
|
14
|
+
}
|
package/lib/flags.js
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AVFrameFlags = exports.AVPacketFlags = void 0;
|
|
4
|
+
var AVPacketFlags;
|
|
5
|
+
(function (AVPacketFlags) {
|
|
6
|
+
AVPacketFlags[AVPacketFlags["AV_PKT_FLAG_KEY"] = 1] = "AV_PKT_FLAG_KEY";
|
|
7
|
+
AVPacketFlags[AVPacketFlags["AV_PKT_FLAG_CORRUPT"] = 2] = "AV_PKT_FLAG_CORRUPT";
|
|
8
|
+
AVPacketFlags[AVPacketFlags["AV_PKT_FLAG_DISCARD"] = 4] = "AV_PKT_FLAG_DISCARD";
|
|
9
|
+
AVPacketFlags[AVPacketFlags["AV_PKT_FLAG_TRUSTED"] = 8] = "AV_PKT_FLAG_TRUSTED";
|
|
10
|
+
AVPacketFlags[AVPacketFlags["AV_PKT_FLAG_DISPOSABLE"] = 16] = "AV_PKT_FLAG_DISPOSABLE";
|
|
11
|
+
})(AVPacketFlags || (exports.AVPacketFlags = AVPacketFlags = {}));
|
|
12
|
+
var AVFrameFlags;
|
|
13
|
+
(function (AVFrameFlags) {
|
|
14
|
+
AVFrameFlags[AVFrameFlags["AV_FRAME_FLAG_KEY"] = 1] = "AV_FRAME_FLAG_KEY";
|
|
15
|
+
AVFrameFlags[AVFrameFlags["AV_FRAME_FLAG_CORRUPT"] = 2] = "AV_FRAME_FLAG_CORRUPT";
|
|
16
|
+
AVFrameFlags[AVFrameFlags["AV_FRAME_FLAG_DISCARD"] = 4] = "AV_FRAME_FLAG_DISCARD";
|
|
17
|
+
AVFrameFlags[AVFrameFlags["AV_FRAME_FLAG_TRUSTED"] = 8] = "AV_FRAME_FLAG_TRUSTED";
|
|
18
|
+
AVFrameFlags[AVFrameFlags["AV_FRAME_FLAG_DISPOSABLE"] = 16] = "AV_FRAME_FLAG_DISPOSABLE";
|
|
19
|
+
})(AVFrameFlags || (exports.AVFrameFlags = AVFrameFlags = {}));
|
|
20
|
+
//# sourceMappingURL=flags.js.map
|
package/lib/flags.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flags.js","sourceRoot":"","sources":["../src/flags.ts"],"names":[],"mappings":";;;AAAA,IAAY,aAMX;AAND,WAAY,aAAa;IACvB,uEAAwB,CAAA;IACxB,+EAA4B,CAAA;IAC5B,+EAA4B,CAAA;IAC5B,+EAA4B,CAAA;IAC5B,sFAA+B,CAAA;AACjC,CAAC,EANW,aAAa,6BAAb,aAAa,QAMxB;AAED,IAAY,YAMX;AAND,WAAY,YAAY;IACtB,yEAA0B,CAAA;IAC1B,iFAA8B,CAAA;IAC9B,iFAA8B,CAAA;IAC9B,iFAA8B,CAAA;IAC9B,wFAAiC,CAAA;AACnC,CAAC,EANW,YAAY,4BAAZ,YAAY,QAMvB"}
|
package/lib/index.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
export * from './flags';
|
|
1
2
|
export declare function isLoaded(): boolean;
|
|
2
3
|
export declare function getAddonPath(installPath?: string): string;
|
|
3
4
|
export declare function getFFmpegPath(installPath?: string): string;
|
|
@@ -10,6 +11,8 @@ export interface AVFrame extends AVTimeBase {
|
|
|
10
11
|
readonly pixelFormat: string;
|
|
11
12
|
readonly hardwareDeviceType: string;
|
|
12
13
|
readonly softwareFormat: string;
|
|
14
|
+
pictType: number;
|
|
15
|
+
flags: number;
|
|
13
16
|
timeBaseNum: number;
|
|
14
17
|
timeBaseDen: number;
|
|
15
18
|
pts: number;
|
|
@@ -25,6 +28,8 @@ export interface AVFrame extends AVTimeBase {
|
|
|
25
28
|
opts?: {
|
|
26
29
|
[key: string]: string | number;
|
|
27
30
|
};
|
|
31
|
+
gopSize?: number;
|
|
32
|
+
keyIntMin?: number;
|
|
28
33
|
}): AVCodecContext;
|
|
29
34
|
}
|
|
30
35
|
export interface AVFilter {
|
|
@@ -34,9 +39,17 @@ export interface AVFilter {
|
|
|
34
39
|
addFrame(frame: AVFrame, index?: number): void;
|
|
35
40
|
getFrame(index?: number): AVFrame;
|
|
36
41
|
}
|
|
42
|
+
export interface AVBitstreamFilter {
|
|
43
|
+
[Symbol.dispose](): void;
|
|
44
|
+
destroy(): void;
|
|
45
|
+
setOption(name: string, value: string): void;
|
|
46
|
+
sendPacket(packet: AVPacket): void;
|
|
47
|
+
receivePacket(): AVPacket;
|
|
48
|
+
copyParameters(formatContext: AVFormatContext, streamIndex: number): void;
|
|
49
|
+
}
|
|
37
50
|
export interface AVPacket {
|
|
38
51
|
readonly streamIndex: number;
|
|
39
|
-
|
|
52
|
+
flags: number;
|
|
40
53
|
readonly size: number;
|
|
41
54
|
readonly pts: number;
|
|
42
55
|
readonly dts: number;
|
|
@@ -54,6 +67,8 @@ export interface AVCodecContext extends AVTimeBase {
|
|
|
54
67
|
readonly pixelFormat: string;
|
|
55
68
|
readonly hardwarePixelFormat: string;
|
|
56
69
|
readonly vendorInfo: Record<string, any>;
|
|
70
|
+
keyIntMin: number;
|
|
71
|
+
gopSize: number;
|
|
57
72
|
[Symbol.dispose](): void;
|
|
58
73
|
destroy(): void;
|
|
59
74
|
sendPacket(packet: AVPacket): Promise<boolean>;
|
|
@@ -101,6 +116,7 @@ export declare function createAVFilter(options: {
|
|
|
101
116
|
outCount?: number;
|
|
102
117
|
}): AVFilter;
|
|
103
118
|
export declare function createAVFrame(width: number, height: number, pixelFormat: string, fillBlack?: boolean): AVFrame;
|
|
119
|
+
export declare function createAVBitstreamFilter(filter: string): AVBitstreamFilter;
|
|
104
120
|
export declare function getBinaryUrl(): string;
|
|
105
121
|
export declare function toJpeg(frame: AVFrame, quality: number): Promise<Buffer<ArrayBufferLike>>;
|
|
106
122
|
export declare function toBuffer(frame: AVFrame): Promise<Buffer<ArrayBufferLike>>;
|
package/lib/index.js
CHANGED
|
@@ -1,4 +1,18 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
2
16
|
var __addDisposableResource = (this && this.__addDisposableResource) || function (env, value, async) {
|
|
3
17
|
if (value !== null && value !== void 0) {
|
|
4
18
|
if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
|
|
@@ -66,6 +80,7 @@ exports.setAVLogLevel = setAVLogLevel;
|
|
|
66
80
|
exports.createAVFormatContext = createAVFormatContext;
|
|
67
81
|
exports.createAVFilter = createAVFilter;
|
|
68
82
|
exports.createAVFrame = createAVFrame;
|
|
83
|
+
exports.createAVBitstreamFilter = createAVBitstreamFilter;
|
|
69
84
|
exports.getBinaryUrl = getBinaryUrl;
|
|
70
85
|
exports.toJpeg = toJpeg;
|
|
71
86
|
exports.toBuffer = toBuffer;
|
|
@@ -76,6 +91,7 @@ const fs_1 = __importDefault(require("fs"));
|
|
|
76
91
|
const path_1 = __importDefault(require("path"));
|
|
77
92
|
const tar_1 = require("tar");
|
|
78
93
|
const package_json_1 = __importDefault(require("../package.json"));
|
|
94
|
+
__exportStar(require("./flags"), exports);
|
|
79
95
|
let addon;
|
|
80
96
|
function isLoaded() {
|
|
81
97
|
return !!addon;
|
|
@@ -166,6 +182,9 @@ function createAVFilter(options) {
|
|
|
166
182
|
function createAVFrame(width, height, pixelFormat, fillBlack = true) {
|
|
167
183
|
return new (loadAddon().AVFrame)(width, height, pixelFormat, fillBlack);
|
|
168
184
|
}
|
|
185
|
+
function createAVBitstreamFilter(filter) {
|
|
186
|
+
return new (loadAddon().AVBitstreamFilter)(filter);
|
|
187
|
+
}
|
|
169
188
|
function getBinaryUrl() {
|
|
170
189
|
const libc = process.env.LIBC || process.env.npm_config_libc ||
|
|
171
190
|
(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":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/lib/tsconfig.tsbuildinfo
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"root":["../src/index.ts"],"version":"5.8.2"}
|
|
1
|
+
{"root":["../src/flags.ts","../src/index.ts"],"version":"5.8.2"}
|
package/package.json
CHANGED
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
|
+
};
|
package/src/codeccontext.cpp
CHANGED
|
@@ -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
|
+
}
|
package/src/codeccontext.h
CHANGED
|
@@ -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);
|
package/src/flags.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export enum AVPacketFlags {
|
|
2
|
+
AV_PKT_FLAG_KEY = 0x0001,
|
|
3
|
+
AV_PKT_FLAG_CORRUPT = 0x0002,
|
|
4
|
+
AV_PKT_FLAG_DISCARD = 0x0004,
|
|
5
|
+
AV_PKT_FLAG_TRUSTED = 0x0008,
|
|
6
|
+
AV_PKT_FLAG_DISPOSABLE = 0x0010,
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export enum AVFrameFlags {
|
|
10
|
+
AV_FRAME_FLAG_KEY = 0x0001,
|
|
11
|
+
AV_FRAME_FLAG_CORRUPT = 0x0002,
|
|
12
|
+
AV_FRAME_FLAG_DISCARD = 0x0004,
|
|
13
|
+
AV_FRAME_FLAG_TRUSTED = 0x0008,
|
|
14
|
+
AV_FRAME_FLAG_DISPOSABLE = 0x0010,
|
|
15
|
+
}
|
package/src/formatcontext.cpp
CHANGED
|
@@ -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
|
@@ -6,6 +6,7 @@ import { IncomingMessage } from 'http';
|
|
|
6
6
|
import path from 'path';
|
|
7
7
|
import { x as tarx } from 'tar';
|
|
8
8
|
import packageJson from '../package.json';
|
|
9
|
+
export * from './flags';
|
|
9
10
|
|
|
10
11
|
let addon: any;
|
|
11
12
|
|
|
@@ -103,7 +104,9 @@ export interface AVFrame extends AVTimeBase {
|
|
|
103
104
|
readonly pixelFormat: string;
|
|
104
105
|
readonly hardwareDeviceType: string;
|
|
105
106
|
readonly softwareFormat: string;
|
|
107
|
+
pictType: number;
|
|
106
108
|
|
|
109
|
+
flags: number;
|
|
107
110
|
timeBaseNum: number;
|
|
108
111
|
timeBaseDen: number;
|
|
109
112
|
pts: number;
|
|
@@ -120,6 +123,8 @@ export interface AVFrame extends AVTimeBase {
|
|
|
120
123
|
opts?: {
|
|
121
124
|
[key: string]: string | number,
|
|
122
125
|
},
|
|
126
|
+
gopSize?: number;
|
|
127
|
+
keyIntMin?: number;
|
|
123
128
|
}): AVCodecContext;
|
|
124
129
|
}
|
|
125
130
|
|
|
@@ -131,9 +136,18 @@ export interface AVFilter {
|
|
|
131
136
|
getFrame(index?: number): AVFrame;
|
|
132
137
|
}
|
|
133
138
|
|
|
139
|
+
export interface AVBitstreamFilter {
|
|
140
|
+
[Symbol.dispose](): void;
|
|
141
|
+
destroy(): void;
|
|
142
|
+
setOption(name: string, value: string): void;
|
|
143
|
+
sendPacket(packet: AVPacket): void;
|
|
144
|
+
receivePacket(): AVPacket;
|
|
145
|
+
copyParameters(formatContext: AVFormatContext, streamIndex: number): void;
|
|
146
|
+
}
|
|
147
|
+
|
|
134
148
|
export interface AVPacket {
|
|
135
149
|
readonly streamIndex: number;
|
|
136
|
-
|
|
150
|
+
flags: number;
|
|
137
151
|
readonly size: number;
|
|
138
152
|
readonly pts: number;
|
|
139
153
|
readonly dts: number;
|
|
@@ -153,6 +167,8 @@ export interface AVCodecContext extends AVTimeBase {
|
|
|
153
167
|
readonly pixelFormat: string;
|
|
154
168
|
readonly hardwarePixelFormat: string;
|
|
155
169
|
readonly vendorInfo: Record<string, any>;
|
|
170
|
+
keyIntMin: number;
|
|
171
|
+
gopSize: number;
|
|
156
172
|
|
|
157
173
|
[Symbol.dispose](): void;
|
|
158
174
|
destroy(): void;
|
|
@@ -224,6 +240,10 @@ export function createAVFrame(
|
|
|
224
240
|
return new (loadAddon().AVFrame)(width, height, pixelFormat, fillBlack);
|
|
225
241
|
}
|
|
226
242
|
|
|
243
|
+
export function createAVBitstreamFilter(filter: string): AVBitstreamFilter {
|
|
244
|
+
return new (loadAddon().AVBitstreamFilter)(filter);
|
|
245
|
+
}
|
|
246
|
+
|
|
227
247
|
export function getBinaryUrl() {
|
|
228
248
|
const libc = process.env.LIBC || process.env.npm_config_libc ||
|
|
229
249
|
(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
|
-
|
|
101
|
+
void AVPacketObject::SetFlags(const Napi::CallbackInfo &info, const Napi::Value &value)
|
|
109
102
|
{
|
|
110
|
-
|
|
111
|
-
|
|
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
|
|
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);
|