Skip to content

Commit

Permalink
enable typechecking, expose types to users
Browse files Browse the repository at this point in the history
replicates:
medooze/audio-codecs-node#4
medooze/media-server-node#229

plus these followups:

medooze/audio-codecs-node@9f1de91
medooze/audio-codecs-node@ea62f68
medooze/audio-codecs-node@beed5bd

the following files were nearly identical to
audio-codecs and were simply copied from there,
thus do NOT require manual review:

- Properties.js (completely identical)
- VideoEncoderIncomingStreamTrack.js (only difference
  is replacing "audio" with "video" preserving case)
  • Loading branch information
mildsunrise committed Aug 6, 2024
1 parent 18dbb69 commit eb5c545
Show file tree
Hide file tree
Showing 10 changed files with 230 additions and 106 deletions.
11 changes: 11 additions & 0 deletions index.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
export * from "./build/types/VideoCodecs";

export type VideoDecoder = import("./build/types/VideoDecoder");
export type VideoEncoder = import("./build/types/VideoEncoder");
export type { CodecParams } from "./build/types/VideoEncoder";
export type VideoEncoderIncomingStreamTrack = import("./build/types/VideoEncoderIncomingStreamTrack");

export type {
ActiveEncodingInfo, ActiveLayersInfo,
EncodingStats, LayerStats, MediaStats, PacketWaitTime, TrackStats,
} from "./build/types/VideoEncoderIncomingStreamTrack";
3 changes: 2 additions & 1 deletion lib/Native.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,11 @@ const SharedPointer = require("./SharedPointer");
try
{
//We try first to load it via dlopen on Node 9
//@ts-expect-error
process.dlopen(module,path.resolve(path.dirname(module.filename), "../build/Release/medooze-video-codecs.node"), os.constants.dlopen.RTLD_NOW )//| os.constants.dlopen.RTLD_DEEPBIND);
} catch (e) {
//old one
module.exports = require("../build/Release/medooze-video-codecs");
module.exports = require(/** @type {any} */ ("../build/Release/medooze-video-codecs"));
}

SharedPointer.wrapNativeModule(module);
File renamed without changes.
14 changes: 11 additions & 3 deletions lib/Properties.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,17 @@
const Native = require("./Native");

function fromObject(object)
/**
* @typedef {unknown} Properties
* Plain JSON object representing codec properties.
* See Properties C++ class and fromObject below.
*/

function fromObject(/** @type {Properties} */ object)
{
function convert(properties, object, preffix = "")
function convert(
/** @type {Native.Properties} */ properties,
/** @type {Properties} */ object,
preffix = "")
{
if (object)
//For each pro
Expand Down Expand Up @@ -34,4 +43,3 @@ function fromObject(object)
module.exports = {
fromObject
}

36 changes: 14 additions & 22 deletions lib/VideoCodecs.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,13 @@ const LFSR = require('lfsr');
const defaultSeed = new LFSR(8, 92914);

//Replace default seeed
LFSR.prototype._defaultSeed = function(n) {
LFSR.prototype._defaultSeed = function(/** @type {number} */ n) {
if (!n) throw new Error('n is required');
return defaultSeed.seq(n);
};

/** @typedef {import("./Properties").Properties} Properties */

/** @namespace */
const VideoCodecs = {};

Expand All @@ -29,15 +31,8 @@ VideoCodecs.terminate = function()
/**
* Create a new VideoEnocder
* @memberof VideoCodecs
* @param {String} codec Codec name
* @param {Object} params Codec params
* @param {Number} params.width
* @param {Number} params.height
* @param {Number} params.fps
* @param {Number} params.bitrate
* @param {Number} params.intraPeriod
* @param {Object} params.properties Codec specific properties
* @returns {VideoEnocder} The new created encoder
* @param {String} codec Codec name
* @param {VideoEncoder.CodecParams} params Codec params
*/
VideoCodecs.createVideoEncoder = function(codec,params)
{
Expand All @@ -55,23 +50,20 @@ VideoCodecs.createVideoDecoder = function()
return new VideoDecoder();
};

/**
* @param {string} encoderCodec encoder name
* @param {string} codec decoder name
* @param {Uint8Array} buffer input buffer
* @returns {Promise<Buffer>} output buffer
*/
VideoCodecs.generateThumbnail = function(encoderCodec, codec, buffer)
{
return new Promise((resolve, reject) =>
{

return new Promise((resolve, reject) => {
//New task
const task = new Native.ThumbnailGeneratorTask({
resolve : (a)=>{
resolve(a)
},
reject : (e)=>{
reject(new Error(e));
}
});
const task = new Native.ThumbnailGeneratorTask({ resolve, reject });
//Execute it
task.Run(encoderCodec, codec, buffer);
});
}).catch(e => Promise.reject(new Error(e)));
};


Expand Down
20 changes: 10 additions & 10 deletions lib/VideoDecoder.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,13 @@
const Native = require("./Native");
const SharedPointer = require("./SharedPointer");
const Emitter = require("medooze-event-emitter");

/**
* @typedef {Object} VideoDecoderEvents
* @property {(self: VideoDecoder) => void} stopped
*/

/** @extends {Emitter<VideoDecoderEvents>} */
class VideoDecoder extends Emitter
{
/**
Expand All @@ -14,7 +21,7 @@ class VideoDecoder extends Emitter
super();

//Create decoder
this.decoder = new Native.VideoDecoderWorkerShared();
this.decoder = SharedPointer(new Native.VideoDecoderWorkerShared());

//Start decoder
this.decoder.Start();
Expand Down Expand Up @@ -71,7 +78,7 @@ class VideoDecoder extends Emitter
this.attached = null;
}

attachTo(track)
attachTo(/** @type {import("./VideoEncoderIncomingStreamTrack") | undefined} */ track)
{
//Detach first
this.detach();
Expand Down Expand Up @@ -99,20 +106,13 @@ class VideoDecoder extends Emitter
//Stop decoder
this.decoder.Stop();

/**
* VideoDecoder stopped event
*
* @name stopped
* @memberof VideoDecoder
* @kind event
* @argument {VideoDecoder} decoder
*/
this.emit("stopped", this);

//Stop emitter
super.stop();

//Remove native refs
//@ts-expect-error
this.decoder = null;
}
};
Expand Down
52 changes: 40 additions & 12 deletions lib/VideoEncoder.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,40 @@ const Properties = require("./Properties")
const LFSR = require("lfsr");
const VideoEncoderIncomingStreamTrack = require("./VideoEncoderIncomingStreamTrack");

//@ts-expect-error
const parseInt = /** @type {(x: number) => number} */ (global.parseInt);
//@ts-expect-error
const parseFloat = /** @type {(x: number) => number} */ (global.parseFloat);

/**
* @typedef {Object} CodecParams
* @property {number} [width] (integer)
* @property {number} [height] (integer)
* @property {number} fps (integer)
* @property {number} bitrate (integer)
* @property {number} [intraPeriod] (integer)
* @property {number} [scaleResolutionDownBy] (float)
* @property {number} [scaleResolutionToHeight] (integer)
* @property {boolean} [allowSameHeight]
* @property {Properties} properties
*/

/**
* @typedef {Object} VideoEncoderEvents
* @property {(self: VideoEncoder) => void} stopped
*/

/** @extends {Emitter<VideoEncoderEvents>} */
class VideoEncoder extends Emitter
{
/**
* @ignore
* @hideconstructor
* private constructor
*/
constructor(codec,params)
constructor(
/** @type {string} */ codec,
/** @type {CodecParams} */ params)
{
//Init emitter
super();
Expand All @@ -37,7 +63,7 @@ class VideoEncoder extends Emitter
//And audio pipe
this.pipe = new Native.VideoPipe();
//Init pipe
this.pipe.Init(scaleResolutionDownBy, scaleResolutionToHeight, allowedDownScaling);
this.pipe.Init(scaleResolutionDownBy, scaleResolutionToHeight, /** @type {Native.VideoPipeAllowedDownScaling} */ (allowedDownScaling));
//Set it in encoder
this.encoder.Init(this.pipe);
//Start encoding
Expand All @@ -50,6 +76,9 @@ class VideoEncoder extends Emitter
this.tracks = new Map();
}

/**
* @param {number} delayms delay in milliseconds
*/
setMaxDelay(delayms)
{
this.pipe.SetMaxDelay(delayms);
Expand Down Expand Up @@ -82,10 +111,15 @@ class VideoEncoder extends Emitter
};
}

/**
* @param {string} trackId (unused. FIXME: please remove)
* @param {Native.FrameDispatchCoordinatorShared} frameDispatchCoordinator
* @returns
*/
createIncomingStreamTrack(trackId, frameDispatchCoordinator)
{
//Create the source
const bridge = new Native.MediaFrameListenerBridgeShared(this.encoder.GetTimeService(), this.lfsr.seq(31));
const bridge = SharedPointer(new Native.MediaFrameListenerBridgeShared(this.encoder.GetTimeService(), this.lfsr.seq(31)));
if (frameDispatchCoordinator)
bridge.SetFrameDispatchCoordinator(frameDispatchCoordinator);

Expand Down Expand Up @@ -118,7 +152,7 @@ class VideoEncoder extends Emitter
}


attachTo(decoder)
attachTo(/** @type {import("./VideoDecoder") | undefined} */decoder)
{
//Detach first
this.detach();
Expand Down Expand Up @@ -157,14 +191,6 @@ class VideoEncoder extends Emitter
//Stop it
track.stop();

/**
* VideoEncoder stopped event
*
* @name stopped
* @memberof VideoEncoder
* @kind event
* @argument {VideoEncoder} encoder
*/
this.emit("stopped", this);

//Stop emitter
Expand All @@ -176,7 +202,9 @@ class VideoEncoder extends Emitter
this.pipe.End();

//Remove brdige reference, so destructor is called on GC
//@ts-expect-error
this.pipe = null;
//@ts-expect-error
this.encoder = null;
}
};
Expand Down
Loading

0 comments on commit eb5c545

Please sign in to comment.