[gnome-sound-recorder/wip/cdavis/typescript] Initial port to TypeScript




commit cfd0d4e9a9ab2ef9d1c814eaa5f751fbed56e0a6
Author: Christopher Davis <christopherdavis gnome org>
Date:   Mon Aug 8 03:10:53 2022 -0400

    Initial port to TypeScript
    
    Move from checked JavaScript to TypeScript. For now this
    uses the regular TypeScript settings.
    
    NOTE: The flatpak manifest does not work yet. Please use
    `toolbox` or your host OS to build and test.

 docs.json                                          |   15 +
 src/{application.js => application.ts}             |   18 +-
 src/{main.js => main.ts}                           |    2 +-
 src/meson.build                                    |   14 +-
 src/{recorder.js => recorder.ts}                   |   63 +-
 src/{recorderWidget.js => recorderWidget.ts}       |  108 +-
 src/{recording.js => recording.ts}                 |   76 +-
 src/{recordingList.js => recordingList.ts}         |   44 +-
 ...cordingListWidget.js => recordingListWidget.ts} |   46 +-
 src/{row.js => row.ts}                             |  147 +-
 src/{utils.js => utils.ts}                         |   10 +-
 src/{waveform.js => waveform.ts}                   |   51 +-
 src/{window.js => window.ts}                       |  111 +-
 tsconfig.json                                      |    3 -
 types/ambient.d.ts                                 |   23 +
 types/gmodule.d.ts                                 |   52 +
 types/graphene.d.ts                                |  722 ++++++
 types/gsk.d.ts                                     | 1008 ++++++++
 types/gstaudio.d.ts                                |    1 +
 types/gstbase.d.ts                                 | 1106 +++++++++
 types/gstvideo.d.ts                                | 2520 ++++++++++++++++++++
 21 files changed, 5812 insertions(+), 328 deletions(-)
---
diff --git a/docs.json b/docs.json
index 1e0ddbf..aa58fb7 100644
--- a/docs.json
+++ b/docs.json
@@ -16,9 +16,18 @@
         "Gio": [
             "2.0"
         ],
+        "GModule": [
+            "2.0"
+        ],
         "Gdk": [
             "4.0"
         ],
+        "Graphene": [
+            "1.0"
+        ],
+        "Gsk": [
+            "4.0"
+        ],
         "Gtk": [
             "4.0"
         ],
@@ -28,6 +37,9 @@
         "Gst": [
             "1.0"
         ],
+        "GstBase": [
+            "1.0"
+        ],
         "GstAudio": [
             "1.0"
         ],
@@ -37,6 +49,9 @@
         "GstPbutils": [
             "1.0"
         ],
+        "GstVideo": [
+            "1.0"
+        ],
         "HarfBuzz": [
             "0.0"
         ],
diff --git a/src/application.js b/src/application.ts
similarity index 95%
rename from src/application.js
rename to src/application.ts
index 7164ddc..63bad2e 100644
--- a/src/application.js
+++ b/src/application.ts
@@ -31,10 +31,12 @@ export const RecordingsDir = Gio.file_new_for_path(GLib.build_filenamev([GLib.ge
 export const CacheDir = Gio.file_new_for_path(GLib.build_filenamev([GLib.get_user_cache_dir(), pkg.name]));
 export const Settings = new Gio.Settings({ schema: pkg.name });
 
-import { Window } from './window.js';
+import { Window, WindowClass } from './window.js';
 
 export const Application = GObject.registerClass(class Application extends Adw.Application {
-    _init() {
+    private window: WindowClass;
+
+    _init(): void {
         super._init({ application_id: pkg.name, resource_base_path: '/org/gnome/SoundRecorder/' });
         GLib.set_application_name(_('Sound Recorder'));
         GLib.setenv('PULSE_PROP_media.role', 'production', true);
@@ -45,7 +47,6 @@ export const Application = GObject.registerClass(class Application extends Adw.A
 
         this.connect('handle-local-options', (app, options) => {
             if (options.contains('version')) {
-                // @ts-expect-error
                 print(pkg.version);
                 /* quit the invoked process after printing the version number
                  * leaving the running instance unaffected
@@ -56,7 +57,7 @@ export const Application = GObject.registerClass(class Application extends Adw.A
         });
     }
 
-    _initAppMenu() {
+    _initAppMenu(): void {
         const profileAction = Settings.create_action('audio-profile');
         this.add_action(profileAction);
 
@@ -91,11 +92,9 @@ export const Application = GObject.registerClass(class Application extends Adw.A
         this.set_accels_for_action('recording.export', ['<Primary>s']);
     }
 
-    vfunc_startup() {
+    vfunc_startup(): void {
         super.vfunc_startup();
-        // @ts-expect-error
         log('Sound Recorder (%s)'.format(pkg.name));
-        // @ts-expect-error
         log('Version: %s'.format(pkg.version));
 
         Gst.init(null);
@@ -105,21 +104,20 @@ export const Application = GObject.registerClass(class Application extends Adw.A
             RecordingsDir.make_directory_with_parents(null);
         } catch (e) {
             if (!e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.EXISTS))
-                // @ts-expect-error
                 console.error(`Failed to create directory ${e}`);
 
         }
         this._initAppMenu();
     }
 
-    vfunc_activate() {
+    vfunc_activate(): void {
         this.window = new Window({ application: this });
         if (pkg.name.endsWith('Devel'))
             this.window.add_css_class('devel');
         this.window.show();
     }
 
-    _showAbout() {
+    _showAbout(): void {
         let aboutDialog = new Gtk.AboutDialog({
             artists: ['Reda Lazri <the red shortcut gmail com>',
                 'Garrett LeSage <garrettl gmail com>',
diff --git a/src/main.js b/src/main.ts
similarity index 97%
rename from src/main.js
rename to src/main.ts
index 72dee8d..f01ff96 100644
--- a/src/main.js
+++ b/src/main.ts
@@ -28,6 +28,6 @@
 
 import { Application } from './application.js';
 
-export function main(argv) {
+export function main(argv: string[]): number {
     return new Application().run(argv);
 }
diff --git a/src/meson.build b/src/meson.build
index f5a2bb2..df60098 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -14,6 +14,17 @@ app = configure_file(
   configuration: app_conf
 )
 
+tsc = find_program('tsc', required: true)
+tsc_out = meson.project_build_root() / 'tsc-out'
+
+typescript = custom_target(
+  'typescript-compile',
+  build_by_default: true,
+  build_always_stale: true,
+  command: [ tsc, '--outDir', tsc_out ],
+  output: ['tsc-output'],
+)
+
 source_res_conf = configuration_data()
 source_res_conf.set('profile', profile)
 src_res = gnome.compile_resources(
@@ -23,7 +34,8 @@ src_res = gnome.compile_resources(
        output: '@BASENAME@',
        configuration: source_res_conf
   ),
-  source_dir: '.',
+  dependencies: typescript,
+  source_dir: tsc_out,
   gresource_bundle: true,
   install: true,
   install_dir: sound_recorder_pkgdatadir
diff --git a/src/recorder.js b/src/recorder.ts
similarity index 87%
rename from src/recorder.js
rename to src/recorder.ts
index 36f5575..84d17e0 100644
--- a/src/recorder.js
+++ b/src/recorder.ts
@@ -20,11 +20,12 @@
 
 import GLib from 'gi://GLib';
 import GObject from 'gi://GObject';
+import Gio from 'gi://Gio';
 import Gst from 'gi://Gst';
 import GstPbutils from 'gi://GstPbutils';
 
 import { RecordingsDir, Settings } from './application.js';
-import { Recording } from './recording.js';
+import { Recording, RecordingClass } from './recording.js';
 
 // All supported encoding profiles.
 export const EncodingProfiles = [
@@ -64,6 +65,8 @@ var AudioChannels = {
     1: { name: 'mono', channels: 1 },
 };
 
+export type RecorderClass = InstanceType<typeof Recorder>;
+
 export const Recorder = GObject.registerClass({
     Properties: {
         'duration': GObject.ParamSpec.int(
@@ -78,11 +81,26 @@ export const Recorder = GObject.registerClass({
             0.0, 1.0, 0.0),
     },
 }, class Recorder extends GObject.Object {
-    _init() {
+    _peaks: number[];
+
+    _duration!: number;
+    _current_peak!: number;
+
+    pipeline: Gst.Pipeline;
+    level: Gst.Element;
+    ebin: Gst.Element;
+    filesink: Gst.Element;
+    recordBus: Gst.Bus;
+    handlerId: number;
+    file: Gio.File;
+    timeout: number;
+    _pipeState: Gst.State;
+
+    _init(): void {
         this._peaks = [];
         super._init({});
 
-        let srcElement, audioConvert, caps;
+        let srcElement: Gst.Element, audioConvert: Gst.Element, caps: Gst.Caps;
         try {
             this.pipeline = new Gst.Pipeline({ name: 'pipe' });
             srcElement = Gst.ElementFactory.make('pulsesrc', 'srcElement');
@@ -92,7 +110,6 @@ export const Recorder = GObject.registerClass({
             this.ebin = Gst.ElementFactory.make('encodebin', 'ebin');
             this.filesink = Gst.ElementFactory.make('filesink', 'filesink');
         } catch (error) {
-            // @ts-expect-error
             log(`Not all elements could be created.\n${error}`);
         }
 
@@ -103,7 +120,6 @@ export const Recorder = GObject.registerClass({
             this.pipeline.add(this.ebin);
             this.pipeline.add(this.filesink);
         } catch (error) {
-            // @ts-expect-error
             log(`Not all elements could be addded.\n${error}`);
         }
 
@@ -111,19 +127,18 @@ export const Recorder = GObject.registerClass({
         audioConvert.link_filtered(this.level, caps);
     }
 
-    start() {
+    start(): void {
         let index = 1;
 
         do {
             /* Translators: ""Recording %d"" is the default name assigned to a file created
             by the application (for example, "Recording 1"). */
-            // @ts-expect-error
             this.file = RecordingsDir.get_child_for_display_name(_('Recording %d').format(index++));
         } while (this.file.query_exists(null));
 
         this.recordBus = this.pipeline.get_bus();
         this.recordBus.add_signal_watch();
-        this.handlerId = this.recordBus.connect('message', (_, message) => {
+        this.handlerId = this.recordBus.connect('message', (_, message: Gst.Message) => {
             if (message !== null)
                 this._onMessageReceived(message);
         });
@@ -144,16 +159,16 @@ export const Recorder = GObject.registerClass({
         });
     }
 
-    pause() {
+    pause(): void {
         this.state = Gst.State.PAUSED;
     }
 
-    resume() {
+    resume(): void {
         if (this.state === Gst.State.PAUSED)
             this.state = Gst.State.PLAYING;
     }
 
-    stop() {
+    stop(): RecordingClass {
         this.state = Gst.State.NULL;
         this.duration = 0;
         if (this.timeout) {
@@ -178,23 +193,22 @@ export const Recorder = GObject.registerClass({
         return null;
     }
 
-    _onMessageReceived(message) {
+    _onMessageReceived(message: Gst.Message): void {
         switch (message.type) {
         case Gst.MessageType.ELEMENT: {
             if (GstPbutils.is_missing_plugin_message(message)) {
                 let detail = GstPbutils.missing_plugin_message_get_installer_detail(message);
                 let description = GstPbutils.missing_plugin_message_get_description(message);
-                // @ts-expect-error
                 log(`Detail: ${detail}\nDescription: ${description}`);
                 break;
             }
 
             let s = message.get_structure();
             if (s && s.has_name('level')) {
-                const peakVal = s.get_value('peak');
+                const peakVal = s.get_value('peak') as unknown as GObject.ValueArray;
 
                 if (peakVal)
-                    this.current_peak = peakVal.get_nth(0);
+                    this.current_peak = peakVal.get_nth(0) as number;
             }
             break;
         }
@@ -203,22 +217,20 @@ export const Recorder = GObject.registerClass({
             this.stop();
             break;
         case Gst.MessageType.WARNING:
-            // @ts-expect-error
             log(message.parse_warning()[0].toString());
             break;
         case Gst.MessageType.ERROR:
-            // @ts-expect-error
             log(message.parse_error().toString());
             break;
         }
     }
 
-    _getChannel() {
+    _getChannel(): number {
         let channelIndex = Settings.get_enum('audio-channel');
         return AudioChannels[channelIndex].channels;
     }
 
-    _getProfile() {
+    _getProfile(): GstPbutils.EncodingContainerProfile {
         let profileIndex = Settings.get_enum('audio-profile');
         const profile = EncodingProfiles[profileIndex];
 
@@ -233,17 +245,17 @@ export const Recorder = GObject.registerClass({
         return containerProfile;
     }
 
-    get duration() {
+    get duration(): number {
         return this._duration;
     }
 
     // eslint-disable-next-line camelcase
-    get current_peak() {
+    get current_peak(): number {
         return this._current_peak;
     }
 
     // eslint-disable-next-line camelcase
-    set current_peak(peak) {
+    set current_peak(peak: number) {
         if (peak > 0)
             peak = 0;
 
@@ -252,21 +264,20 @@ export const Recorder = GObject.registerClass({
         this.notify('current-peak');
     }
 
-    set duration(val) {
+    set duration(val: number) {
         this._duration = val;
         this.notify('duration');
     }
 
-    get state() {
+    get state(): Gst.State {
         return this._pipeState;
     }
 
-    set state(s) {
+    set state(s: Gst.State) {
         this._pipeState = s;
         const ret = this.pipeline.set_state(this._pipeState);
 
         if (ret === Gst.StateChangeReturn.FAILURE)
-            // @ts-expect-error
             log('Unable to update the recorder pipeline state');
     }
 
diff --git a/src/recorderWidget.js b/src/recorderWidget.ts
similarity index 64%
rename from src/recorderWidget.js
rename to src/recorderWidget.ts
index f493595..dd3da79 100644
--- a/src/recorderWidget.js
+++ b/src/recorderWidget.ts
@@ -4,14 +4,17 @@ import GObject from 'gi://GObject';
 import Gtk from 'gi://Gtk?version=4.0';
 
 import { formatTime } from './utils.js';
-import { WaveForm, WaveType } from  './waveform.js';
+import { WaveForm, WaveFormClass, WaveType } from  './waveform.js';
+import { RecorderClass } from './recorder.js';
 
-var RecorderState = {
-    RECORDING: 0,
-    PAUSED: 1,
-    STOPPED: 2,
+enum RecorderState {
+    Recording,
+    Paused,
+    Stopped,
 };
 
+export type RecorderWidgetClass = InstanceType<typeof RecorderWidget>;
+
 export const RecorderWidget = GObject.registerClass({
     Template: 'resource:///org/gnome/SoundRecorder/ui/recorder.ui',
     InternalChildren: [
@@ -26,25 +29,24 @@ export const RecorderWidget = GObject.registerClass({
         'stopped': { param_types: [GObject.TYPE_OBJECT] },
     },
 }, class RecorderWidget extends Gtk.Box {
-    // @ts-ignore
-    /** @type {Gtk.Box} */ _recorderBox = this._recorderBox;
-    // @ts-ignore
-    /** @type {Gtk.Stack} */ _playbackStack = this._playbackStack;
-    // @ts-ignore
-    /** @type {Gtk.Label} */ _recorderTime = this._recorderTime;
-    // @ts-ignore
-    /** @type {Gtk.Button} */ _pauseBtn = this._pauseBtn;
-    // @ts-ignore
-    /** @type {Gtk.Button} */ _resumeBtn = this._resumeBtn;
-
-    _init(recorder) {
+    _recorderBox!: Gtk.Box;
+    _playbackStack!: Gtk.Stack;
+    _recorderTime!: Gtk.Label;
+    _pauseBtn!: Gtk.Button;
+    _resumeBtn!: Gtk.Button;
+
+    recorder: RecorderClass;
+    waveform: WaveFormClass;
+    actionsGroup: Gio.SimpleActionGroup;
+
+    _init(recorder: RecorderClass): void {
         super._init({});
         this.recorder = recorder;
 
         this.waveform = new WaveForm({
             vexpand: true,
             valign: Gtk.Align.FILL,
-        }, WaveType.RECORDER);
+        }, WaveType.Recorder);
         this._recorderBox.prepend(this.waveform);
 
         this.recorder.bind_property('current-peak', this.waveform, 'peak', GObject.BindingFlags.SYNC_CREATE 
| GObject.BindingFlags.DEFAULT);
@@ -74,31 +76,31 @@ export const RecorderWidget = GObject.registerClass({
         startAction.bind_property('enabled', cancelAction, 'enabled', GObject.BindingFlags.INVERT_BOOLEAN);
     }
 
-    onPause() {
+    onPause(): void {
         this._playbackStack.visible_child_name = 'recorder-start';
-        this.state = RecorderState.PAUSED;
+        this.state = RecorderState.Paused;
 
         this.recorder.pause();
         this.emit('paused');
     }
 
-    onResume() {
+    onResume(): void {
         this._playbackStack.visible_child_name = 'recorder-pause';
-        this.state = RecorderState.RECORDING;
+        this.state = RecorderState.Recording;
 
         this.recorder.resume();
         this.emit('resumed');
     }
 
-    onStart() {
+    onStart(): void {
         this._playbackStack.visible_child_name = 'recorder-pause';
-        this.state = RecorderState.RECORDING;
+        this.state = RecorderState.Recording;
 
         this.recorder.start();
         this.emit('started');
     }
 
-    onCancel() {
+    onCancel(): void {
         this.onPause();
         let dialog = new Gtk.MessageDialog({
             modal: true,
@@ -114,14 +116,12 @@ export const RecorderWidget = GObject.registerClass({
         dialog.add_button(_('Delete'), Gtk.ResponseType.YES)
             .add_css_class('destructive-action');
         
-        // @ts-expect-error
-        dialog.set_transient_for(Gio.Application.get_default().get_active_window());
-        dialog.connect('response', (_, response) => {
+        dialog.set_transient_for(this.root as Gtk.Window);
+        dialog.connect('response', (_, response: number) => {
             switch (response) {
             case Gtk.ResponseType.YES: {
                 const recording = this.recorder.stop();
-                this.state = RecorderState.STOPPED;
-                this.waveform.destroy();
+                this.state = RecorderState.Stopped;
 
                 recording.delete();
                 this.emit('canceled');
@@ -138,45 +138,39 @@ export const RecorderWidget = GObject.registerClass({
         dialog.show();
     }
 
-    onStop() {
-        this.state = RecorderState.STOPPED;
+    onStop(): void {
+        this.state = RecorderState.Stopped;
         const recording = this.recorder.stop();
         this.waveform.destroy();
         this.emit('stopped', recording);
     }
 
-    // @ts-ignore
-    set state(recorderState) {
+    set state(recorderState: RecorderState) {
+        let pauseAction = this.actionsGroup.lookup('pause') as Gio.SimpleAction;
+        let resumeAction = this.actionsGroup.lookup('resume') as Gio.SimpleAction;
+        let startAction = this.actionsGroup.lookup('start') as Gio.SimpleAction;
+        let stopAction = this.actionsGroup.lookup('stop') as Gio.SimpleAction;
+
         switch (recorderState) {
-        case RecorderState.PAUSED:
-            // @ts-expect-error
-            this.actionsGroup.lookup('pause').enabled = false;
-            // @ts-expect-error
-            this.actionsGroup.lookup('resume').enabled = true;
+        case RecorderState.Paused:
+            pauseAction.enabled = false;
+            resumeAction.enabled = true;
             this._resumeBtn.grab_focus();
             this._recorderTime.add_css_class('paused');
             break;
-        case RecorderState.RECORDING:
-            // @ts-expect-error
-            this.actionsGroup.lookup('start').enabled = false;
-            // @ts-expect-error
-            this.actionsGroup.lookup('stop').enabled = true;
-            // @ts-expect-error
-            this.actionsGroup.lookup('resume').enabled = false;
-            // @ts-expect-error
-            this.actionsGroup.lookup('pause').enabled = true;
+        case RecorderState.Recording:
+            startAction.enabled = false;
+            stopAction.enabled = true;
+            resumeAction.enabled = false;
+            pauseAction.enabled = true;
             this._pauseBtn.grab_focus();
             this._recorderTime.remove_css_class('paused');
             break;
-        case RecorderState.STOPPED:
-            // @ts-expect-error
-            this.actionsGroup.lookup('start').enabled = true;
-            // @ts-expect-error
-            this.actionsGroup.lookup('stop').enabled = false;
-            // @ts-expect-error
-            this.actionsGroup.lookup('pause').enabled = false;
-            // @ts-expect-error
-            this.actionsGroup.lookup('resume').enabled = false;
+        case RecorderState.Stopped:
+            startAction.enabled = true;
+            stopAction.enabled = false;
+            pauseAction.enabled = false;
+            resumeAction.enabled = false;
             break;
         }
     }
diff --git a/src/recording.js b/src/recording.ts
similarity index 77%
rename from src/recording.js
rename to src/recording.ts
index 91ec940..9df4ace 100644
--- a/src/recording.js
+++ b/src/recording.ts
@@ -5,9 +5,11 @@ import GObject from 'gi://GObject';
 import Gst from 'gi://Gst';
 import GstPbutils from 'gi://GstPbutils';
 
-import { CacheDir } from './application.js';
+import { CacheDir } from './application.js'
 import { EncodingProfiles } from './recorder.js';
 
+export type RecordingClass = InstanceType<typeof Recording>;
+
 export const Recording = GObject.registerClass({
     Signals: {
         'peaks-updated': {},
@@ -26,9 +28,19 @@ export const Recording = GObject.registerClass({
             null),
     },
 }, class Recording extends GObject.Object {
-    _init(file) {
+    _file: Gio.File;
+    _peaks: number[];
+    _loadedPeaks: number[];
+    _extension: string;
+    _timeModified: GLib.DateTime;
+    _timeCreated: GLib.DateTime;
+    _duration: number;
+
+    pipeline: Gst.Bin;
+
+    _init(file: Gio.File): void {
         this._file = file;
-        this._peaks = [];
+        this._peaks = []
         this._loadedPeaks = [];
         super._init({});
 
@@ -58,91 +70,88 @@ export const Recording = GObject.registerClass({
         discoverer.discover_uri_async(this.uri);
     }
 
-    get name() {
+    get name(): string {
         return this._file.get_basename();
     }
 
-    set name(filename) {
+    set name(filename: string) {
         if (filename && filename !== this.name) {
             this._file = this._file.set_display_name(filename, null);
             this.notify('name');
         }
     }
 
-    get extension() {
+    get extension(): string {
         return this._extension;
     }
 
-    get timeModified() {
+    get timeModified(): GLib.DateTime {
         return this._timeModified;
     }
 
-    get timeCreated() {
+    get timeCreated(): GLib.DateTime {
         return this._timeCreated;
     }
 
-    get duration() {
+    get duration(): number {
         if (this._duration)
             return this._duration;
         else
             return 0;
     }
 
-    get file() {
+    get file(): Gio.File {
         return this._file;
     }
 
-    get uri() {
+    get uri(): string {
         return this._file.get_uri();
     }
 
     // eslint-disable-next-line camelcase
-    set peaks(data) {
+    set peaks(data: number[]) {
         if (data.length > 0) {
             this._peaks = data;
             this.emit('peaks-updated');
-            // @ts-expect-error
-            const buffer = new GLib.Bytes(JSON.stringify(data));
-            this.waveformCache.replace_contents_bytes_async(buffer, null, false, 
Gio.FileCreateFlags.REPLACE_DESTINATION, null, (obj, res) => {
+            let enc = new TextEncoder();
+            const buffer = new GLib.Bytes(enc.encode(JSON.stringify(data)));
+            this.waveformCache.replace_contents_bytes_async(buffer, null, false, 
Gio.FileCreateFlags.REPLACE_DESTINATION, null, (obj: Gio.File, res: Gio.AsyncResult) => {
                 obj.replace_contents_finish(res);
             });
         }
     }
 
     // eslint-disable-next-line camelcase
-    get peaks() {
+    get peaks(): number[] {
         return this._peaks;
     }
 
-    delete() {
+    delete(): void {
         this._file.trash_async(GLib.PRIORITY_HIGH, null, null);
         this.waveformCache.trash_async(GLib.PRIORITY_DEFAULT, null, null);
     }
 
-    save(dest) {
-        this.file.copy_async(dest,
-            Gio.FileCreateFlags.NONE, GLib.PRIORITY_DEFAULT, null, null, (obj, res) => {
+    save(dest: Gio.File): void {
+        this.file.copy_async(dest, // @ts-expect-error
+            Gio.FileCreateFlags.NONE, GLib.PRIORITY_DEFAULT, null, null, (obj: Gio.File, res: 
Gio.AsyncResult) => {
                 if (obj.copy_finish(res))
-                    // @ts-expect-error
                     log('Exporting file: done');
             });
     }
 
-    get waveformCache() {
+    get waveformCache(): Gio.File {
         return CacheDir.get_child(`${this.name}_data`);
     }
 
-    loadPeaks() {
+    loadPeaks(): void {
         if (this.waveformCache.query_exists(null)) {
-            this.waveformCache.load_bytes_async(null, (obj, res) => {
+            this.waveformCache.load_bytes_async(null, (obj: Gio.File, res: Gio.AsyncResult) => {
                 const bytes = obj.load_bytes_finish(res)[0];
                 try {
-                    // @ts-expect-error
                     let decoder = new TextDecoder('utf-8');
                     this._peaks = JSON.parse(decoder.decode(bytes.get_data()));
                     this.emit('peaks-updated');
                 } catch (error) {
-                    // @ts-expect-error
                     log(`Error reading waveform data file: ${this.name}_data`);
                 }
             });
@@ -152,15 +161,13 @@ export const Recording = GObject.registerClass({
         }
     }
 
-    generatePeaks() {
-        this.pipeline = Gst.parse_launch('uridecodebin name=uridecodebin ! audioconvert ! 
audio/x-raw,channels=1 ! level name=level ! fakesink name=faked');
+    generatePeaks(): void {
+        this.pipeline = Gst.parse_launch('uridecodebin name=uridecodebin ! audioconvert ! 
audio/x-raw,channels=1 ! level name=level ! fakesink name=faked') as Gst.Bin;
 
 
-        // @ts-expect-error
         let uridecodebin = this.pipeline.get_by_name('uridecodebin');
         uridecodebin.set_property('uri', this.uri);
 
-        // @ts-expect-error
         let fakesink = this.pipeline.get_by_name('faked');
         fakesink.set_property('qos', false);
         fakesink.set_property('sync', true);
@@ -169,17 +176,16 @@ export const Recording = GObject.registerClass({
         this.pipeline.set_state(Gst.State.PLAYING);
         bus.add_signal_watch();
 
-        bus.connect('message', (_bus, message) => {
-            let s;
+        bus.connect('message', (_bus: Gst.Bus, message: Gst.Message) => {
+            let s: Gst.Structure;
             switch (message.type) {
             case Gst.MessageType.ELEMENT:
                 s = message.get_structure();
                 if (s && s.has_name('level')) {
-                    const peakVal = s.get_value('peak');
+                    const peakVal = s.get_value('peak') as unknown as GObject.ValueArray;
 
                     if (peakVal) {
-                        // @ts-expect-error
-                        const peak = peakVal.get_nth(0);
+                        const peak = peakVal.get_nth(0) as number;
                         this._loadedPeaks.push(Math.pow(10, peak / 20));
                     }
                 }
diff --git a/src/recordingList.js b/src/recordingList.ts
similarity index 84%
rename from src/recordingList.js
rename to src/recordingList.ts
index d590782..5a3d614 100644
--- a/src/recordingList.js
+++ b/src/recordingList.ts
@@ -4,10 +4,17 @@ import GLib from 'gi://GLib';
 import GObject from 'gi://GObject';
 
 import { RecordingsDir } from './application.js';
-import { Recording } from './recording.js';
+import { Recording, RecordingClass } from './recording.js';
+
+export type RecordingListClass = InstanceType<typeof RecordingList>;
 
 export const RecordingList = GObject.registerClass(class RecordingList extends Gio.ListStore {
-    _init() {
+    _enumerator: Gio.FileEnumerator;
+
+    cancellable: Gio.Cancellable;
+    dirMonitor: Gio.FileMonitor;
+
+    _init(): void {
         super._init({ });
 
         this.cancellable = new Gio.Cancellable();
@@ -38,7 +45,7 @@ export const RecordingList = GObject.registerClass(class RecordingList extends G
         this.copyOldFiles();
     }
 
-    copyOldFiles() {
+    copyOldFiles(): void {
         // Necessary code to move old recordings into the new location for few releases
         // FIXME: Remove by 3.40/3.42
         const oldDir = Gio.file_new_for_path(GLib.build_filenamev([GLib.get_home_dir(), _('Recordings')]));
@@ -49,29 +56,26 @@ export const RecordingList = GObject.registerClass(class RecordingList extends G
         const fileEnumerator = oldDir.enumerate_children('standard::name', 
Gio.FileQueryInfoFlags.NOFOLLOW_SYMLINKS, this.cancellable);
         let allCopied = true;
 
-        const copyFiles = function (obj, res) {
+        const copyFiles = function (obj: Gio.FileEnumerator, res: Gio.AsyncResult) {
             try {
                 const fileInfos = obj.next_files_finish(res);
                 if (fileInfos.length) {
-                    fileInfos.forEach(info => {
+                    fileInfos.forEach((info: Gio.FileInfo) => {
                         const name = info.get_name();
                         const src = oldDir.get_child(name);
                         /* Translators: ""%s (Old)"" is the new name assigned to a file moved from
                             the old recordings location */
-                        // @ts-expect-error
                         const dest = RecordingsDir.get_child(_('%s (Old)').format(name));
 
                         // @ts-expect-error
-                        src.copy_async(dest, Gio.FileCopyFlags.OVERWRITE, GLib.PRIORITY_LOW, 
this.cancellable, null, (objCopy, resCopy) => {
+                        src.copy_async(dest, Gio.FileCopyFlags.OVERWRITE, GLib.PRIORITY_LOW, 
this.cancellable, null, (objCopy: Gio.File, resCopy: Gio.AsyncResult) => {
                             try {
                                 objCopy.copy_finish(resCopy);
                                 objCopy.trash_async(GLib.PRIORITY_LOW, this.cancellable, null);
                                 this.dirMonitor.emit_event(dest, src, Gio.FileMonitorEvent.MOVED_IN);
                             } catch (e) {
                                 if (!e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED)) {
-                                    // @ts-expect-error
                                     console.error(`Failed to copy recording ${name} to the new location`);
-                                    // @ts-expect-error
                                     log(e);
                                 }
                                 allCopied = false;
@@ -83,13 +87,11 @@ export const RecordingList = GObject.registerClass(class RecordingList extends G
                 } else {
                     fileEnumerator.close(this.cancellable);
                     if (allCopied) {
-                        oldDir.delete_async(GLib.PRIORITY_LOW, this.cancellable, (objDelete, resDelete) => {
+                        oldDir.delete_async(GLib.PRIORITY_LOW, this.cancellable, (objDelete: Gio.File, 
resDelete: Gio.AsyncResult) => {
                             try {
                                 objDelete.delete_finish(resDelete);
                             } catch (e) {
-                                // @ts-expect-error
                                 log('Failed to remove the old Recordings directory. Ignore if you\'re using 
flatpak');
-                                // @ts-expect-error
                                 log(e);
                             }
                         });
@@ -97,7 +99,6 @@ export const RecordingList = GObject.registerClass(class RecordingList extends G
                 }
             } catch (e) {
                 if (!e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED))
-                    // @ts-expect-error
                     console.error(`Failed to copy old  recordings ${e}`);
 
             }
@@ -105,17 +106,16 @@ export const RecordingList = GObject.registerClass(class RecordingList extends G
         fileEnumerator.next_files_async(5, GLib.PRIORITY_LOW, this.cancellable, copyFiles);
     }
 
-    _enumerateDirectory(obj, res) {
+    _enumerateDirectory(obj: Gio.File, res: Gio.AsyncResult): void {
         this._enumerator = obj.enumerate_children_finish(res);
         if (this._enumerator === null) {
-            // @ts-expect-error
             log('The contents of the Recordings directory were not indexed.');
             return;
         }
         this._enumerator.next_files_async(5, GLib.PRIORITY_LOW, this.cancellable, 
this._onNextFiles.bind(this));
     }
 
-    _onNextFiles(obj, res) {
+    _onNextFiles(obj: Gio.FileEnumerator, res: Gio.AsyncResult): void {
         try {
             let fileInfos = obj.next_files_finish(res);
             if (fileInfos.length) {
@@ -130,27 +130,25 @@ export const RecordingList = GObject.registerClass(class RecordingList extends G
             }
         } catch (e) {
             if (!e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED))
-                // @ts-expect-error
                 console.error(`Failed to load recordings ${e}`);
 
         }
     }
 
-    getIndex(file) {
+    getIndex(file: Gio.File): number {
         for (let i = 0; i < this.get_n_items(); i++) {
-            // @ts-expect-error
-            if (this.get_item(i).uri === file.get_uri())
+            let item = this.get_item(i) as RecordingClass;
+            if (item.uri === file.get_uri())
                 return i;
         }
         return -1;
     }
 
-    sortedInsert(recording) {
+    sortedInsert(recording: RecordingClass): void {
         let added = false;
 
         for (let i = 0; i < this.get_n_items(); i++) {
-            const curr = this.get_item(i);
-            // @ts-expect-error
+            const curr = this.get_item(i) as RecordingClass;
             if (curr.timeModified.difference(recording.timeModified) <= 0) {
                 this.insert(i, recording);
                 added = true;
diff --git a/src/recordingListWidget.js b/src/recordingListWidget.ts
similarity index 76%
rename from src/recordingListWidget.js
rename to src/recordingListWidget.ts
index 7166d8d..b8a40ac 100644
--- a/src/recordingListWidget.js
+++ b/src/recordingListWidget.ts
@@ -4,15 +4,24 @@ import GObject from 'gi://GObject'
 import Gst from 'gi://Gst'
 import GstPlayer from 'gi://GstPlayer'
 import Gtk from 'gi://Gtk?version=4.0'
+import Gio from 'gi://Gio';
 
-import { Row, RowState } from './row.js';
+import { Row, RowClass, RowState } from './row.js';
+import { RecordingClass } from './recording.js';
+
+export type RecordingsListWidgetClass = InstanceType<typeof RecordingsListWidget>;
 
 export const RecordingsListWidget = GObject.registerClass({
     Signals: {
         'row-deleted': { param_types: [GObject.TYPE_OBJECT, GObject.TYPE_INT] },
     },
 }, class RecordingsListWidget extends Adw.Bin {
-    _init(model, player) {
+    _player: GstPlayer.Player;
+    list: Gtk.ListBox;
+    activeRow: RowClass;
+    activePlayingRow: RowClass;
+
+    _init(model: Gio.ListModel, player: GstPlayer.Player): void {
         super._init();
         this.list = Gtk.ListBox.new();
         this.list.valign = Gtk.Align.START;
@@ -26,21 +35,23 @@ export const RecordingsListWidget = GObject.registerClass({
         this.set_child(this.list);
 
         this._player = player;
-        this._player.connect('state-changed', (_player, state) => {
+        this._player.connect('state-changed', (_player: GstPlayer.Player, state: GstPlayer.PlayerState) => {
             if (state === GstPlayer.PlayerState.STOPPED && this.activePlayingRow) {
-                this.activePlayingRow.state = RowState.PAUSED;
+                this.activePlayingRow.state = RowState.Paused;
                 this.activePlayingRow.waveform.position = 0.0;
             } else if (state === GstPlayer.PlayerState.PLAYING) {
-                this.activePlayingRow.state = RowState.PLAYING;
+                this.activePlayingRow.state = RowState.Playing;
             }
         });
 
-        this._player.connect('position-updated', (_player, pos) => {
-            const duration = this.activePlayingRow._recording.duration;
-            this.activePlayingRow.waveform.position = pos / duration;
+        this._player.connect('position-updated', (_player: GstPlayer.Player, pos: number) => {
+            if (this.activePlayingRow) {
+                const duration = this.activePlayingRow._recording.duration;
+                this.activePlayingRow.waveform.position = pos / duration;
+            }
         });
 
-        this.list.bind_model(model, recording => {
+        this.list.bind_model(model, (recording: RecordingClass) => {
             let row = new Row(recording);
 
             row.waveform.connect('gesture-pressed', _ => {
@@ -50,7 +61,6 @@ export const RecordingsListWidget = GObject.registerClass({
                         this.activePlayingRow.waveform.position = 0.0;
 
                     this.activePlayingRow = row;
-                    // @ts-expect-error
                     this._player.set_uri(recording.uri);
                 }
             });
@@ -59,16 +69,14 @@ export const RecordingsListWidget = GObject.registerClass({
                 this._player.seek(_position * row._recording.duration);
             });
 
-            row.connect('play', _row => {
+            row.connect('play', (_row: RowClass) => {
                 if (this.activePlayingRow) {
                     if (this.activePlayingRow !== _row) {
-                        this.activePlayingRow.state = RowState.PAUSED;
+                        this.activePlayingRow.state = RowState.Paused;
                         this.activePlayingRow.waveform.position = 0.0;
-                        // @ts-expect-error
                         this._player.set_uri(recording.uri);
                     }
                 } else {
-                    // @ts-expect-error
                     this._player.set_uri(recording.uri);
                 }
 
@@ -76,16 +84,16 @@ export const RecordingsListWidget = GObject.registerClass({
                 this._player.play();
             });
 
-            row.connect('pause', _row => {
+            row.connect('pause', (_row: RowClass) => {
                 this._player.pause();
             });
 
-            row.connect('seek-backward', _row => {
+            row.connect('seek-backward', (_row: RowClass) => {
                 let position = this._player.position - 10 * Gst.SECOND;
                 position = position < 0 || position > _row._recording.duration ? 0 : position;
                 this._player.seek(position);
             });
-            row.connect('seek-forward', _row => {
+            row.connect('seek-forward', (_row: RowClass) => {
                 let position = this._player.position + 10 * Gst.SECOND;
                 position = position < 0 || position > _row._recording.duration ? 0 : position;
                 this._player.seek(position);
@@ -111,7 +119,7 @@ export const RecordingsListWidget = GObject.registerClass({
         this.list.connect('row-activated', this.rowActivated.bind(this));
     }
 
-    rowActivated(list, row) {
+    rowActivated(_list: Gtk.ListBox, row: RowClass): void {
         if (row.editMode && row.expanded || this.activeRow && this.activeRow.editMode && 
this.activeRow.expanded)
             return;
 
@@ -125,7 +133,7 @@ export const RecordingsListWidget = GObject.registerClass({
         this.activeRow = row;
     }
 
-    isolateAt(index, expanded) {
+    isolateAt(index: number, expanded: boolean): void {
         const before = this.list.get_row_at_index(index - 1);
         const current = this.list.get_row_at_index(index);
         const after = this.list.get_row_at_index(index + 1);
diff --git a/src/row.js b/src/row.ts
similarity index 69%
rename from src/row.js
rename to src/row.ts
index 18e928a..4ab6cc1 100644
--- a/src/row.js
+++ b/src/row.ts
@@ -4,14 +4,17 @@ import Gio from 'gi://Gio'
 import GObject from 'gi://GObject'
 import Gtk from 'gi://Gtk?version=4.0'
 
+import { RecordingClass } from './recording.js';
 import { displayDateTime, formatTime } from './utils.js';
-import { WaveForm, WaveType } from './waveform.js';
+import { WaveForm, WaveFormClass, WaveType } from './waveform.js';
 
-export const RowState = {
-    PLAYING: 0,
-    PAUSED: 1,
+export enum RowState {
+    Playing,
+    Paused,
 };
 
+export type RowClass = InstanceType<typeof Row>;
+
 export const Row = GObject.registerClass({
     Template: 'resource:///org/gnome/SoundRecorder/ui/row.ui',
     InternalChildren: [
@@ -34,34 +37,36 @@ export const Row = GObject.registerClass({
             false),
     },
 }, class Row extends Gtk.ListBoxRow {
-    // @ts-ignore
-    /** @type {Gtk.Stack} */ _playbackStack = this._playbackStack;
-    // @ts-ignore
-    /** @type {Gtk.Stack} */ _mainStack = this._mainStack;
-    // @ts-ignore
-    /** @type {Gtk.Stack} */ _waveformStack = this._waveformStack;
-    // @ts-ignore
-    /** @type {Gtk.Stack} */ _rightStack = this._rightStack;
-    // @ts-ignore
-    /** @type {Gtk.Label} */ _name = this._name;
-    // @ts-ignore
-    /** @type {Gtk.Entry} */ _entry = this._entry;
-    // @ts-ignore
-    /** @type {Gtk.Label} */ _date = this._date;
-    // @ts-ignore
-    /** @type {Gtk.Label} */ _duration = this._duration;
-    // @ts-ignore
-    /** @type {Gtk.Revealer} */ _revealer = this._revealer;
-    // @ts-ignore
-    /** @type {Gtk.Box} */ _playbackControls = this._playbackControls;
-    // @ts-ignore
-    /** @type {Gtk.Button} */ _saveBtn = this._saveBtn;
-    // @ts-ignore
-    /** @type {Gtk.Button} */ _playBtn = this._playBtn;
-    // @ts-ignore
-    /** @type {Gtk.Button} */ _pauseBtn= this._pauseBtn;
-
-    _init(recording) {
+    _playbackStack!: Gtk.Stack;
+    _mainStack!: Gtk.Stack;
+    _waveformStack!: Gtk.Stack;
+    _rightStack!: Gtk.Stack;
+    _name!: Gtk.Label;
+    _entry!: Gtk.Entry;
+    _date: Gtk.Label;
+    _duration: Gtk.Label;
+    _revealer: Gtk.Revealer;
+    _playbackControls: Gtk.Box;
+    _saveBtn: Gtk.Button;
+    _playBtn: Gtk.Button;
+    _pauseBtn: Gtk.Button;
+
+    _recording: RecordingClass;
+    _expanded: boolean;
+    _editMode: boolean;
+    _state: RowState;
+
+    waveform: WaveFormClass;
+    actionGroup: Gio.SimpleActionGroup;
+    exportDialog: Gtk.FileChooserNative;
+
+    saveRenameAction: Gio.SimpleAction;
+    renameAction: Gio.SimpleAction;
+    pauseAction: Gio.SimpleAction;
+    playAction: Gio.SimpleAction;
+    keyController: Gtk.EventControllerKey;
+
+    _init(recording: RecordingClass): void {
         this._recording = recording;
         this._expanded = false;
         this._editMode = false;
@@ -71,7 +76,7 @@ export const Row = GObject.registerClass({
         this.waveform = new WaveForm({
             margin_top: 18,
             height_request: 60,
-        }, WaveType.PLAYER);
+        }, WaveType.Player);
         this._waveformStack.add_named(this.waveform, 'wave');
 
         if (this._recording._peaks.length > 0) {
@@ -81,10 +86,10 @@ export const Row = GObject.registerClass({
             this._recording.loadPeaks();
         }
 
-        if (recording.timeCreated > 0)
-            this._date.label = displayDateTime(recording.timeCreated);
-        else
+        if (recording.timeModified !== null && !recording.timeModified.equal(recording.timeCreated))
             this._date.label = displayDateTime(recording.timeModified);
+        else
+            this._date.label = displayDateTime(recording.timeCreated);
 
         recording.bind_property('name', this._name, 'label', GObject.BindingFlags.SYNC_CREATE | 
GObject.BindingFlags.DEFAULT);
         recording.bind_property('name', this._entry, 'text', GObject.BindingFlags.SYNC_CREATE | 
GObject.BindingFlags.DEFAULT);
@@ -94,11 +99,10 @@ export const Row = GObject.registerClass({
 
         let exportAction = new Gio.SimpleAction({ name: 'export' });
         exportAction.connect('activate', () => {
-            // @ts-expect-error
-            const window = Gio.Application.get_default().get_active_window();
+            const window = this.root as Gtk.Window;
             this.exportDialog = Gtk.FileChooserNative.new(_('Export Recording'), window, 
Gtk.FileChooserAction.SAVE, _('_Export'), _('_Cancel'));
             this.exportDialog.set_current_name(`${this._recording.name}.${this._recording.extension}`);
-            this.exportDialog.connect('response', (_dialog, response) => {
+            this.exportDialog.connect('response', (_dialog: Gtk.FileChooserNative, response: number) => {
                 if (response === Gtk.ResponseType.ACCEPT) {
                     const dest = this.exportDialog.get_file();
                     this._recording.save(dest);
@@ -115,26 +119,26 @@ export const Row = GObject.registerClass({
         this.actionGroup.add_action(this.saveRenameAction);
 
         this.renameAction = new Gio.SimpleAction({ name: 'rename', enabled: true });
-        this.renameAction.connect('activate', action => {
+        this.renameAction.connect('activate', (action: Gio.SimpleAction) => {
             this.editMode = true;
             action.enabled = false;
         });
         this.renameAction.bind_property('enabled', this.saveRenameAction, 'enabled', 
GObject.BindingFlags.INVERT_BOOLEAN);
         this.actionGroup.add_action(this.renameAction);
 
-        let pauseAction = new Gio.SimpleAction({ name: 'pause', enabled: false });
-        pauseAction.connect('activate', () => {
+        this.pauseAction = new Gio.SimpleAction({ name: 'pause', enabled: false });
+        this.pauseAction.connect('activate', () => {
             this.emit('pause');
-            this.state = RowState.PAUSED;
+            this.state = RowState.Paused;
         });
-        this.actionGroup.add_action(pauseAction);
+        this.actionGroup.add_action(this.pauseAction);
 
-        let playAction = new Gio.SimpleAction({ name: 'play', enabled: true });
-        playAction.connect('activate', () => {
+        this.playAction = new Gio.SimpleAction({ name: 'play', enabled: true });
+        this.playAction.connect('activate', () => {
             this.emit('play', this._recording.uri);
-            this.state = RowState.PLAYING;
+            this.state = RowState.Playing;
         });
-        this.actionGroup.add_action(playAction);
+        this.actionGroup.add_action(this.playAction);
 
         let deleteAction = new Gio.SimpleAction({ name: 'delete' });
         deleteAction.connect('activate', () => {
@@ -143,8 +147,7 @@ export const Row = GObject.registerClass({
         this.actionGroup.add_action(deleteAction);
 
         let seekBackAction = new Gio.SimpleAction({ name: 'seek-backward' });
-        seekBackAction.connect('activate', () => {
-            this.emit('seek-backward');
+        seekBackAction.connect('activate', () => {    _state: RowState;
         });
         this.actionGroup.add_action(seekBackAction);
 
@@ -157,12 +160,11 @@ export const Row = GObject.registerClass({
         this.insert_action_group('recording', this.actionGroup);
 
         this.waveform.connect('gesture-pressed', _ => {
-            pauseAction.activate(null);
+            this.pauseAction.activate(null);
         });
 
         this.keyController = Gtk.EventControllerKey.new();
-        // @ts-ignore
-        this.keyController.connect('key-pressed', (controller, key, _code, _state) => {
+        this.keyController.connect('key-pressed', (_controller: Gtk.EventControllerKey, key: number, _code: 
number, _state: Gdk.ModifierType) => {
             this._entry.remove_css_class('error');
 
             if (key === Gdk.KEY_Escape)
@@ -174,7 +176,7 @@ export const Row = GObject.registerClass({
             this.saveRenameAction.activate(null);
         });
 
-        this._recording.connect('peaks-updated', _recording => {
+        this._recording.connect('peaks-updated', (_recording: RecordingClass) => {
             this._waveformStack.visible_child_name = 'wave';
             this.waveform.peaks = _recording.peaks;
         });
@@ -194,7 +196,7 @@ export const Row = GObject.registerClass({
         });
     }
 
-    onRenameRecording() {
+    onRenameRecording(): void {
         try {
             if (this._name.label !== this._entry.text)
                 this._recording.name = this._entry.text;
@@ -207,7 +209,7 @@ export const Row = GObject.registerClass({
         }
     }
 
-    set editMode(state) {
+    set editMode(state: boolean) {
         this._mainStack.visible_child_name = state ? 'edit' : 'display';
         this._editMode = state;
 
@@ -223,49 +225,46 @@ export const Row = GObject.registerClass({
         }
 
         for (const action of this.actionGroup.list_actions()) {
-            if (action !== 'save')
-                // @ts-expect-error
-                this.actionGroup.lookup(action).enabled = !state;
+            if (action !== 'save') {
+                let someAction = this.actionGroup.lookup(action) as Gio.SimpleAction;
+                someAction.enabled = !state;
+            }
         }
     }
 
-    get editMode() {
+    get editMode(): boolean {
         return this._editMode;
     }
 
-    set expanded(state) {
+    set expanded(state: boolean) {
         this._expanded = state;
         this.notify('expanded');
     }
 
-    get expanded() {
+    get expanded(): boolean {
         return this._expanded;
     }
 
-    set state(rowState) {
+    set state(rowState: RowState) {
         this._state = rowState;
 
         switch (rowState) {
-        case RowState.PLAYING:
-            // @ts-expect-error
-            this.actionGroup.lookup('play').enabled = false;
-            // @ts-expect-error
-            this.actionGroup.lookup('pause').enabled = true;
+        case RowState.Playing:
+            this.playAction.enabled = false;
+            this.pauseAction.enabled = true;
             this._playbackStack.visible_child_name = 'pause';
             this._pauseBtn.grab_focus();
             break;
-        case RowState.PAUSED:
-            // @ts-expect-error
-            this.actionGroup.lookup('play').enabled = true;
-            // @ts-expect-error
-            this.actionGroup.lookup('pause').enabled = false;
+        case RowState.Paused:
+            this.playAction.enabled = true;
+            this.pauseAction.enabled = false;
             this._playbackStack.visible_child_name = 'play';
             this._playBtn.grab_focus();
             break;
         }
     }
 
-    get state() {
+    get state(): RowState {
         return this._state;
     }
 });
diff --git a/src/utils.js b/src/utils.ts
similarity index 89%
rename from src/utils.js
rename to src/utils.ts
index 468040a..3fb7d5a 100644
--- a/src/utils.js
+++ b/src/utils.ts
@@ -22,12 +22,10 @@ import Gettext from 'gettext'
 import GLib from 'gi://GLib'
 import Gst from 'gi://Gst'
 
-export const formatTime = nanoSeconds => {
-    // @ts-expect-error
-    const time = new Date(0, 0, 0, 0, 0, 0, parseInt(nanoSeconds / Gst.MSECOND));
+export const formatTime = (nanoSeconds: number) => {
+    const time = new Date(0, 0, 0, 0, 0, 0, nanoSeconds / Gst.MSECOND);
 
-    // @ts-expect-error
-    const miliseconds = parseInt(time.getMilliseconds() / 100).toString();
+    const miliseconds = (time.getMilliseconds() / 100).toString();
     const seconds = time.getSeconds().toString().padStart(2, '0');
     const minutes = time.getMinutes().toString().padStart(2, '0');
     const hours = time.getHours().toString().padStart(2, '0');
@@ -36,7 +34,7 @@ export const formatTime = nanoSeconds => {
     return `${hours} ∶ ${minutes} ∶ ${seconds} . <small>${miliseconds}</small>`;
 };
 
-export const displayDateTime = time => {
+export const displayDateTime = (time: GLib.DateTime) => {
     const DAY = 86400000000;
     const now = GLib.DateTime.new_now_local();
     const difference = now.difference(time);
diff --git a/src/waveform.js b/src/waveform.ts
similarity index 82%
rename from src/waveform.js
rename to src/waveform.ts
index c4976e5..e1cc860 100644
--- a/src/waveform.js
+++ b/src/waveform.ts
@@ -25,16 +25,20 @@
 
 import Adw from 'gi://Adw';
 import GObject from 'gi://GObject';
+import Gdk from 'gi://Gdk?version=4.0';
 import Gtk from 'gi://Gtk?version=4.0';
-import * as Cairo from 'cairo';
+// @ts-expect-error
+import Cairo from 'cairo';
 
-export const WaveType = {
-    RECORDER: 0,
-    PLAYER: 1,
+export enum WaveType {
+    Recorder,
+    Player,
 };
 
 const GUTTER = 4;
 
+export type WaveFormClass = InstanceType<typeof WaveForm>;
+
 export const WaveForm = GObject.registerClass({
     Properties: {
         'position': GObject.ParamSpec.float(
@@ -53,14 +57,23 @@ export const WaveForm = GObject.registerClass({
         'gesture-pressed': {},
     },
 }, class WaveForm extends Gtk.DrawingArea {
-    _init(params, type) {
+    _peaks: number[];
+    _position: number;
+    _dragGesture: Gtk.GestureDrag;
+    _hcId: number;
+    _lastX: number;
+
+    lastPosition: number;
+    waveType: WaveType;
+
+    _init(params, type: WaveType): void {
         this._peaks = [];
         this._position = 0;
         this.lastPosition = 0;
         this.waveType = type;
         super._init(params);
 
-        if (this.waveType === WaveType.PLAYER) {
+        if (this.waveType === WaveType.Player) {
             this._dragGesture = Gtk.GestureDrag.new();
             this._dragGesture.connect('drag-begin', this.dragBegin.bind(this));
             this._dragGesture.connect('drag-update', this.dragUpdate.bind(this));
@@ -75,22 +88,22 @@ export const WaveForm = GObject.registerClass({
         this.set_draw_func(this.drawFunc);
     }
 
-    dragBegin(gesture, _) {
+    dragBegin(gesture: Gtk.GestureDrag): void {
         gesture.set_state(Gtk.EventSequenceState.CLAIMED);
         this.emit('gesture-pressed');
     }
 
-    dragUpdate(_, offsetX) {
+    dragUpdate(_gesture: Gtk.GestureDrag, offsetX: number): void {
         this._position = this._clamped(offsetX + this._lastX);
         this.queue_draw();
     }
 
-    dragEnd() {
+    dragEnd(): void {
         this._lastX = this._position;
         this.emit('position-changed', this.position);
     }
 
-    drawFunc(da, ctx) {
+    drawFunc(da: WaveFormClass, ctx: Cairo.Context) {
         const maxHeight = da.get_allocated_height();
         const vertiCenter = maxHeight / 2;
         const horizCenter = da.get_allocated_width() / 2;
@@ -102,7 +115,7 @@ export const WaveForm = GObject.registerClass({
 
         const [_, rightColor] = styleContext.lookup_color('dimmed_color');
 
-        const dividerName = da.waveType === WaveType.PLAYER ? 'accent_color' : 'destructive_color';
+        const dividerName = da.waveType === WaveType.Player ? 'accent_color' : 'destructive_color';
         let [ok, dividerColor] = styleContext.lookup_color(dividerName);
         if (!ok)
             dividerColor = styleContext.get_color();
@@ -119,7 +132,7 @@ export const WaveForm = GObject.registerClass({
         ctx.setLineWidth(1);
 
         da._peaks.forEach(peak => {
-            if (da.waveType === WaveType.PLAYER && pointer > horizCenter)
+            if (da.waveType === WaveType.Player && pointer > horizCenter)
                 da._setSourceRGBA(ctx, rightColor);
             else
                 da._setSourceRGBA(ctx, leftColor);
@@ -128,7 +141,7 @@ export const WaveForm = GObject.registerClass({
             ctx.lineTo(pointer, vertiCenter - peak * maxHeight);
             ctx.stroke();
 
-            if (da.waveType === WaveType.PLAYER)
+            if (da.waveType === WaveType.Player)
                 pointer += GUTTER;
             else
                 pointer -= GUTTER;
@@ -143,23 +156,23 @@ export const WaveForm = GObject.registerClass({
         this.queue_draw();
     }
 
-    set peaks(p) {
+    set peaks(p: number[]) {
         this._peaks = p;
         this.queue_draw();
     }
 
-    set position(pos) {
+    set position(pos: number) {
         this._position = this._clamped(-pos * this._peaks.length * GUTTER);
         this._lastX = this._position;
         this.queue_draw();
         this.notify('position');
     }
 
-    get position() {
+    get position(): number {
         return -this._position / (this._peaks.length * GUTTER);
     }
 
-    _clamped(position) {
+    _clamped(position: number): number {
         if (position > 0)
             position = 0;
         else if (position < -this._peaks.length * GUTTER)
@@ -168,11 +181,11 @@ export const WaveForm = GObject.registerClass({
         return position;
     }
 
-    _setSourceRGBA(cr, rgba) {
+    _setSourceRGBA(cr: Cairo.Context, rgba: Gdk.RGBA): void {
         cr.setSourceRGBA(rgba.red, rgba.green, rgba.blue, rgba.alpha);
     }
 
-    destroy() {
+    destroy(): void {
         Adw.StyleManager.get_default().disconnect(this._hcId);
         this._peaks.length = 0;
         this.queue_draw();
diff --git a/src/window.js b/src/window.ts
similarity index 70%
rename from src/window.js
rename to src/window.ts
index e5df6b3..534581f 100644
--- a/src/window.js
+++ b/src/window.ts
@@ -18,8 +18,6 @@
 *
 */
 
-/// <reference path="../types/soundrecorder.d.ts" />
-
 import Adw from 'gi://Adw'
 import Gio from 'gi://Gio'
 import GLib from 'gi://GLib'
@@ -28,16 +26,20 @@ import Gst from 'gi://Gst'
 import GstPlayer from 'gi://GstPlayer'
 import Gtk from 'gi://Gtk?version=4.0'
 
-import { Recorder } from './recorder.js';
-import { RecordingList } from './recordingList.js';
-import { RecordingsListWidget } from './recordingListWidget.js';
-import { RecorderWidget } from './recorderWidget.js';
+import { Recorder, RecorderClass } from './recorder.js';
+import { RecordingList, RecordingListClass } from './recordingList.js';
+import { RecordingsListWidget, RecordingsListWidgetClass } from './recordingListWidget.js';
+import { RecorderWidget, RecorderWidgetClass } from './recorderWidget.js';
+import { RecordingClass } from './recording.js'
+import { RowClass } from './row.js'
+
+enum WindowState {
+    Empty,
+    List,
+    Recorder,
+}
 
-var WindowState = {
-    EMPTY: 0,
-    LIST: 1,
-    RECORDER: 2,
-};
+export type WindowClass = InstanceType<typeof Window>;
 
 export const Window = GObject.registerClass({
     Template: 'resource:///org/gnome/SoundRecorder/ui/window.ui',
@@ -45,19 +47,26 @@ export const Window = GObject.registerClass({
         'mainStack', 'emptyPage', 'column', 'headerRevealer', 'toastOverlay',
     ],
 }, class Window extends Adw.ApplicationWindow {
-    // We have to do this so that TypeScript knows that the field exists
-    // @ts-ignore
-    /** @type {Gtk.Stack} */ _mainStack = this._mainStack;
-    // @ts-ignore
-    /** @type {Adw.StatusPage} */ _emptyPage = this._emptyPage;
-    // @ts-ignore
-    /** @type {Adw.Clamp} */ _column = this._column;
-    // @ts-ignore
-    /** @type {Gtk.Revealer} */ _headerRevealer = this._headerRevealer;
-    // @ts-ignore
-    /** @type {Adw.ToastOverlay} */ _toastOverlay = this._toastOverlay;
-
-    _init(params) {
+    _mainStack!: Gtk.Stack;
+    _emptyPage!: Adw.StatusPage;
+    _column!: Adw.Clamp;
+    _headerRevealer!: Gtk.Revealer;
+    _toastOverlay!: Adw.ToastOverlay;
+
+    recorder: RecorderClass;
+    recorderWidget: RecorderWidgetClass;
+    player: GstPlayer.Player;
+    _recordingList: RecordingListClass;
+    itemsSignalId: number;
+    _recordingListWidget: RecordingsListWidgetClass;
+
+    toastUndo: boolean;
+    undoSignalID: number;
+    undoAction: Gio.SimpleAction;
+
+    _state: WindowState;
+
+    _init(params): void {
         super._init(Object.assign({
             icon_name: pkg.name,
         }, params));
@@ -73,24 +82,23 @@ export const Window = GObject.registerClass({
 
         this._recordingList = new RecordingList();
         this.itemsSignalId = this._recordingList.connect('items-changed', _ => {
-            if (this.state !== WindowState.RECORDER) {
+            if (this.state !== WindowState.Recorder) {
                 if (this._recordingList.get_n_items() === 0)
-                    this.state = WindowState.EMPTY;
+                    this.state = WindowState.Empty;
                 else
-                    this.state = WindowState.LIST;
+                    this.state = WindowState.List;
             }
         });
 
         this._recordingListWidget = new RecordingsListWidget(this._recordingList, this.player);
 
-        this._recordingListWidget.connect('row-deleted', (_listBox, recording, index) => {
+        this._recordingListWidget.connect('row-deleted', (_listBox: Gtk.ListBox, recording: RecordingClass, 
index: number) => {
             this._recordingList.remove(index);
-            // @ts-expect-error
             this.sendNotification(_('"%s" deleted').format(recording.name), recording, index);
         });
 
         const builder = Gtk.Builder.new_from_resource('/org/gnome/SoundRecorder/gtk/help-overlay.ui');
-        /** @type {Gtk.ShortcutsWindow} */const dialog = builder.get_object('help_overlay');
+        const dialog: Gtk.ShortcutsWindow = builder.get_object('help_overlay');
         this.set_help_overlay(dialog);
 
         this.toastUndo = false;
@@ -113,16 +121,14 @@ export const Window = GObject.registerClass({
         this._emptyPage.icon_name = `${pkg.name}-symbolic`;
     }
 
-    vfunc_close_request() {
+    vfunc_close_request(): boolean {
         this._recordingList.cancellable.cancel();
         if (this.itemsSignalId)
             this._recordingList.disconnect(this.itemsSignalId);
 
         for (let i = 0; i < this._recordingList.get_n_items(); i++) {
-            const recording = this._recordingList.get_item(i);
-            // @ts-expect-error
+            const recording = this._recordingList.get_item(i) as RecordingClass;
             if (recording.pipeline)
-                // @ts-expect-error
                 recording.pipeline.set_state(Gst.State.NULL);
         }
 
@@ -131,32 +137,31 @@ export const Window = GObject.registerClass({
         return true;
     }
 
-    onRecorderStarted() {
+    onRecorderStarted(): void {
         this.player.stop();
 
         const activeRow = this._recordingListWidget.activeRow;
         if (activeRow && activeRow.editMode)
             activeRow.editMode = false;
 
-        this.state = WindowState.RECORDER;
+        this.state = WindowState.Recorder;
     }
 
-    onRecorderCanceled() {
+    onRecorderCanceled(): void {
         if (this._recordingList.get_n_items() === 0)
-            this.state = WindowState.EMPTY;
+            this.state = WindowState.Empty;
         else
-            this.state = WindowState.LIST;
+            this.state = WindowState.List;
     }
 
-    // @ts-ignore
-    onRecorderStopped(widget, recording) {
+    onRecorderStopped(_widget: RecorderWidgetClass, recording: RecordingClass): void {
         this._recordingList.insert(0, recording);
-        // @ts-expect-error
-        this._recordingListWidget.list.get_row_at_index(0).editMode = true;
-        this.state = WindowState.LIST;
+        let row = this._recordingListWidget.list.get_row_at_index(0) as RowClass;
+        row.editMode = true;
+        this.state = WindowState.List;
     }
 
-    sendNotification(message, recording, index) {
+    sendNotification(message: string, recording: RecordingClass, index: number): void {
         const toast = Adw.Toast.new(message);
         toast.connect('dismissed', () => {
             if (!this.toastUndo)
@@ -178,22 +183,20 @@ export const Window = GObject.registerClass({
         this._toastOverlay.add_toast(toast);
     }
 
-    set state(state) {
-        let visibleChild;
-        let isHeaderVisible;
+    set state(state: WindowState) {
+        let visibleChild: string;
+        let isHeaderVisible = true;
 
         switch (state) {
-            case WindowState.RECORDER:
+            case WindowState.Recorder:
                 visibleChild = 'recorder';
                 isHeaderVisible = false;
                 break;
-            case WindowState.LIST:
+            case WindowState.List:
                 visibleChild = 'recordings';
-                isHeaderVisible = true;
                 break;
-            case WindowState.EMPTY:
+            case WindowState.Empty:
                 visibleChild = 'empty';
-                isHeaderVisible = true;
                 break;
         }
 
@@ -202,7 +205,7 @@ export const Window = GObject.registerClass({
         this._state = state;
     }
 
-    get state() {
+    get state(): WindowState {
         return this._state;
     }
 });
diff --git a/tsconfig.json b/tsconfig.json
index 0c9ffd4..03e46be 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -1,9 +1,6 @@
 {
     "compilerOptions": {
-        "allowJs": true,
-        "checkJs": true,
         "experimentalDecorators": true,
-        "noEmit": true,
         "paths": {
             "*": [
                 "*",
diff --git a/types/ambient.d.ts b/types/ambient.d.ts
index 29b03ff..ba0bd11 100644
--- a/types/ambient.d.ts
+++ b/types/ambient.d.ts
@@ -1,11 +1,20 @@
 /// <reference path="./gtk.d.ts" />
 
 declare function _(id: string): string;
+declare function print(args: string): void;
+declare function log(obj: object, others?: object[]): void;
+declare function log(msg: string, subsitutions?: any[]): void;
+
 declare const pkg: {
   version: string;
   name: string;
 };
 
+declare module console {
+  export function error(obj: object, others?: object[]): void;
+  export function error(msg: string, subsitutions?: any[]): void;
+}
+
 declare module "gi://GObject" {
   export * as default from "gobject";
 }
@@ -41,4 +50,18 @@ declare module "gi://GstPbutils" {
 }
 declare module "gi://GstPlayer" {
   export * as default from "gstplayer";
+}
+
+declare class TextDecoder {
+  constructor(format: string);
+  decode(buffer: ArrayBuffer): string;
+}
+declare class TextEncoder {
+  constructor();
+  encode(str: string): Uint8Array;
+}
+
+declare interface String {
+  format(...replacements: string[]): string;
+  format(...replacements: number[]): string;
 }
\ No newline at end of file
diff --git a/types/gmodule.d.ts b/types/gmodule.d.ts
new file mode 100644
index 0000000..f300a2f
--- /dev/null
+++ b/types/gmodule.d.ts
@@ -0,0 +1,52 @@
+/**
+ * GModule 2.0
+ *
+ * Generated from 2.0
+ */
+
+import * as GLib from "glib";
+import * as GObject from "gobject";
+
+export function module_build_path(directory: string | null, module_name: string): string;
+export function module_error(): string;
+export function module_error_quark(): GLib.Quark;
+export function module_supported(): boolean;
+export type ModuleCheckInit = (module: Module) => string;
+export type ModuleUnload = (module: Module) => void;
+
+export class ModuleError extends GLib.Error {
+    static $gtype: GObject.GType<ModuleError>;
+
+    constructor(options: { message: string; code: number });
+    constructor(copy: ModuleError);
+
+    // Fields
+    static FAILED: number;
+    static CHECK_FAILED: number;
+}
+
+export namespace ModuleFlags {
+    export const $gtype: GObject.GType<ModuleFlags>;
+}
+
+export enum ModuleFlags {
+    LAZY = 1,
+    LOCAL = 2,
+    MASK = 3,
+}
+
+export class Module {
+    static $gtype: GObject.GType<Module>;
+
+    constructor(copy: Module);
+
+    // Members
+    close(): boolean;
+    make_resident(): void;
+    name(): string;
+    symbol(symbol_name: string): [boolean, any];
+    static build_path(directory: string | null, module_name: string): string;
+    static error(): string;
+    static error_quark(): GLib.Quark;
+    static supported(): boolean;
+}
diff --git a/types/graphene.d.ts b/types/graphene.d.ts
new file mode 100644
index 0000000..9ff6629
--- /dev/null
+++ b/types/graphene.d.ts
@@ -0,0 +1,722 @@
+/**
+ * Graphene 1.0
+ *
+ * Generated from 1.0
+ */
+
+import * as GObject from "gobject";
+
+export const PI: number;
+export const PI_2: number;
+export const VEC2_LEN: number;
+export const VEC3_LEN: number;
+export const VEC4_LEN: number;
+export function box_empty(): Box;
+export function box_infinite(): Box;
+export function box_minus_one(): Box;
+export function box_one(): Box;
+export function box_one_minus_one(): Box;
+export function box_zero(): Box;
+export function point3d_zero(): Point3D;
+export function point_zero(): Point;
+export function rect_alloc(): Rect;
+export function rect_zero(): Rect;
+export function size_zero(): Size;
+export function vec2_one(): Vec2;
+export function vec2_x_axis(): Vec2;
+export function vec2_y_axis(): Vec2;
+export function vec2_zero(): Vec2;
+export function vec3_one(): Vec3;
+export function vec3_x_axis(): Vec3;
+export function vec3_y_axis(): Vec3;
+export function vec3_z_axis(): Vec3;
+export function vec3_zero(): Vec3;
+export function vec4_one(): Vec4;
+export function vec4_w_axis(): Vec4;
+export function vec4_x_axis(): Vec4;
+export function vec4_y_axis(): Vec4;
+export function vec4_z_axis(): Vec4;
+export function vec4_zero(): Vec4;
+
+export namespace EulerOrder {
+    export const $gtype: GObject.GType<EulerOrder>;
+}
+
+export enum EulerOrder {
+    DEFAULT = -1,
+    XYZ = 0,
+    YZX = 1,
+    ZXY = 2,
+    XZY = 3,
+    YXZ = 4,
+    ZYX = 5,
+    SXYZ = 6,
+    SXYX = 7,
+    SXZY = 8,
+    SXZX = 9,
+    SYZX = 10,
+    SYZY = 11,
+    SYXZ = 12,
+    SYXY = 13,
+    SZXY = 14,
+    SZXZ = 15,
+    SZYX = 16,
+    SZYZ = 17,
+    RZYX = 18,
+    RXYX = 19,
+    RYZX = 20,
+    RXZX = 21,
+    RXZY = 22,
+    RYZY = 23,
+    RZXY = 24,
+    RYXY = 25,
+    RYXZ = 26,
+    RZXZ = 27,
+    RXYZ = 28,
+    RZYZ = 29,
+}
+
+export namespace RayIntersectionKind {
+    export const $gtype: GObject.GType<RayIntersectionKind>;
+}
+
+export enum RayIntersectionKind {
+    NONE = 0,
+    ENTER = 1,
+    LEAVE = 2,
+}
+
+export class Box {
+    static $gtype: GObject.GType<Box>;
+
+    constructor();
+    constructor(properties?: Partial<{}>);
+    constructor(copy: Box);
+
+    // Constructors
+    static alloc(): Box;
+
+    // Members
+    contains_box(b: Box): boolean;
+    contains_point(point: Point3D): boolean;
+    equal(b: Box): boolean;
+    expand(point: Point3D): Box;
+    expand_scalar(scalar: number): Box;
+    expand_vec3(vec: Vec3): Box;
+    free(): void;
+    get_bounding_sphere(): Sphere;
+    get_center(): Point3D;
+    get_depth(): number;
+    get_height(): number;
+    get_max(): Point3D;
+    get_min(): Point3D;
+    get_size(): Vec3;
+    get_vertices(): Vec3[];
+    get_width(): number;
+    init(min?: Point3D | null, max?: Point3D | null): Box;
+    init_from_box(src: Box): Box;
+    init_from_points(points: Point3D[]): Box;
+    init_from_vec3(min?: Vec3 | null, max?: Vec3 | null): Box;
+    init_from_vectors(vectors: Vec3[]): Box;
+    intersection(b: Box): [boolean, Box | null];
+    union(b: Box): Box;
+    static empty(): Box;
+    static infinite(): Box;
+    static minus_one(): Box;
+    static one(): Box;
+    static one_minus_one(): Box;
+    static zero(): Box;
+}
+
+export class Euler {
+    static $gtype: GObject.GType<Euler>;
+
+    constructor();
+    constructor(properties?: Partial<{}>);
+    constructor(copy: Euler);
+
+    // Constructors
+    static alloc(): Euler;
+
+    // Members
+    equal(b: Euler): boolean;
+    free(): void;
+    get_alpha(): number;
+    get_beta(): number;
+    get_gamma(): number;
+    get_order(): EulerOrder;
+    get_x(): number;
+    get_y(): number;
+    get_z(): number;
+    init(x: number, y: number, z: number): Euler;
+    init_from_euler(src?: Euler | null): Euler;
+    init_from_matrix(m: Matrix | null, order: EulerOrder): Euler;
+    init_from_quaternion(q: Quaternion | null, order: EulerOrder): Euler;
+    init_from_radians(x: number, y: number, z: number, order: EulerOrder): Euler;
+    init_from_vec3(v: Vec3 | null, order: EulerOrder): Euler;
+    init_with_order(x: number, y: number, z: number, order: EulerOrder): Euler;
+    reorder(order: EulerOrder): Euler;
+    to_matrix(): Matrix;
+    to_quaternion(): Quaternion;
+    to_vec3(): Vec3;
+}
+
+export class Frustum {
+    static $gtype: GObject.GType<Frustum>;
+
+    constructor();
+    constructor(properties?: Partial<{}>);
+    constructor(copy: Frustum);
+
+    // Constructors
+    static alloc(): Frustum;
+
+    // Members
+    contains_point(point: Point3D): boolean;
+    equal(b: Frustum): boolean;
+    free(): void;
+    get_planes(): Plane[];
+    init(p0: Plane, p1: Plane, p2: Plane, p3: Plane, p4: Plane, p5: Plane): Frustum;
+    init_from_frustum(src: Frustum): Frustum;
+    init_from_matrix(matrix: Matrix): Frustum;
+    intersects_box(box: Box): boolean;
+    intersects_sphere(sphere: Sphere): boolean;
+}
+
+export class Matrix {
+    static $gtype: GObject.GType<Matrix>;
+
+    constructor();
+    constructor(properties?: Partial<{}>);
+    constructor(copy: Matrix);
+
+    // Constructors
+    static alloc(): Matrix;
+
+    // Members
+    decompose(): [boolean, Vec3, Vec3, Quaternion, Vec3, Vec4];
+    determinant(): number;
+    equal(b: Matrix): boolean;
+    equal_fast(b: Matrix): boolean;
+    free(): void;
+    get_row(index_: number): Vec4;
+    get_value(row: number, col: number): number;
+    get_x_scale(): number;
+    get_x_translation(): number;
+    get_y_scale(): number;
+    get_y_translation(): number;
+    get_z_scale(): number;
+    get_z_translation(): number;
+    init_from_2d(xx: number, yx: number, xy: number, yy: number, x_0: number, y_0: number): Matrix;
+    init_from_float(v: number[]): Matrix;
+    init_from_matrix(src: Matrix): Matrix;
+    init_from_vec4(v0: Vec4, v1: Vec4, v2: Vec4, v3: Vec4): Matrix;
+    init_frustum(left: number, right: number, bottom: number, top: number, z_near: number, z_far: number): 
Matrix;
+    init_identity(): Matrix;
+    init_look_at(eye: Vec3, center: Vec3, up: Vec3): Matrix;
+    init_ortho(left: number, right: number, top: number, bottom: number, z_near: number, z_far: number): 
Matrix;
+    init_perspective(fovy: number, aspect: number, z_near: number, z_far: number): Matrix;
+    init_rotate(angle: number, axis: Vec3): Matrix;
+    init_scale(x: number, y: number, z: number): Matrix;
+    init_skew(x_skew: number, y_skew: number): Matrix;
+    init_translate(p: Point3D): Matrix;
+    interpolate(b: Matrix, factor: number): Matrix;
+    inverse(): [boolean, Matrix];
+    is_2d(): boolean;
+    is_backface_visible(): boolean;
+    is_identity(): boolean;
+    is_singular(): boolean;
+    multiply(b: Matrix): Matrix;
+    near(b: Matrix, epsilon: number): boolean;
+    normalize(): Matrix;
+    perspective(depth: number): Matrix;
+    print(): void;
+    project_point(p: Point): Point;
+    project_rect(r: Rect): Quad;
+    project_rect_bounds(r: Rect): Rect;
+    rotate(angle: number, axis: Vec3): void;
+    rotate_euler(e: Euler): void;
+    rotate_quaternion(q: Quaternion): void;
+    rotate_x(angle: number): void;
+    rotate_y(angle: number): void;
+    rotate_z(angle: number): void;
+    scale(factor_x: number, factor_y: number, factor_z: number): void;
+    skew_xy(factor: number): void;
+    skew_xz(factor: number): void;
+    skew_yz(factor: number): void;
+    to_2d(): [boolean, number, number, number, number, number, number];
+    to_float(): number[];
+    transform_bounds(r: Rect): Rect;
+    transform_box(b: Box): Box;
+    transform_point(p: Point): Point;
+    transform_point3d(p: Point3D): Point3D;
+    transform_ray(r: Ray): Ray;
+    transform_rect(r: Rect): Quad;
+    transform_sphere(s: Sphere): Sphere;
+    transform_vec3(v: Vec3): Vec3;
+    transform_vec4(v: Vec4): Vec4;
+    translate(pos: Point3D): void;
+    transpose(): Matrix;
+    unproject_point3d(modelview: Matrix, point: Point3D): Point3D;
+    untransform_bounds(r: Rect, bounds: Rect): Rect;
+    untransform_point(p: Point, bounds: Rect): [boolean, Point];
+}
+
+export class Plane {
+    static $gtype: GObject.GType<Plane>;
+
+    constructor();
+    constructor(properties?: Partial<{}>);
+    constructor(copy: Plane);
+
+    // Constructors
+    static alloc(): Plane;
+
+    // Members
+    distance(point: Point3D): number;
+    equal(b: Plane): boolean;
+    free(): void;
+    get_constant(): number;
+    get_normal(): Vec3;
+    init(normal: Vec3 | null, constant: number): Plane;
+    init_from_plane(src: Plane): Plane;
+    init_from_point(normal: Vec3, point: Point3D): Plane;
+    init_from_points(a: Point3D, b: Point3D, c: Point3D): Plane;
+    init_from_vec4(src: Vec4): Plane;
+    negate(): Plane;
+    normalize(): Plane;
+    transform(matrix: Matrix, normal_matrix: Matrix | null): Plane;
+}
+
+export class Point {
+    static $gtype: GObject.GType<Point>;
+
+    constructor();
+    constructor(
+        properties?: Partial<{
+            x?: number;
+            y?: number;
+        }>
+    );
+    constructor(copy: Point);
+
+    // Fields
+    x: number;
+    y: number;
+
+    // Constructors
+    static alloc(): Point;
+
+    // Members
+    distance(b: Point): [number, number, number];
+    equal(b: Point): boolean;
+    free(): void;
+    init(x: number, y: number): Point;
+    init_from_point(src: Point): Point;
+    init_from_vec2(src: Vec2): Point;
+    interpolate(b: Point, factor: number): Point;
+    near(b: Point, epsilon: number): boolean;
+    to_vec2(): Vec2;
+    static zero(): Point;
+}
+
+export class Point3D {
+    static $gtype: GObject.GType<Point3D>;
+
+    constructor();
+    constructor(
+        properties?: Partial<{
+            x?: number;
+            y?: number;
+            z?: number;
+        }>
+    );
+    constructor(copy: Point3D);
+
+    // Fields
+    x: number;
+    y: number;
+    z: number;
+
+    // Constructors
+    static alloc(): Point3D;
+
+    // Members
+    cross(b: Point3D): Point3D;
+    distance(b: Point3D): [number, Vec3 | null];
+    dot(b: Point3D): number;
+    equal(b: Point3D): boolean;
+    free(): void;
+    init(x: number, y: number, z: number): Point3D;
+    init_from_point(src: Point3D): Point3D;
+    init_from_vec3(v: Vec3): Point3D;
+    interpolate(b: Point3D, factor: number): Point3D;
+    length(): number;
+    near(b: Point3D, epsilon: number): boolean;
+    normalize(): Point3D;
+    normalize_viewport(viewport: Rect, z_near: number, z_far: number): Point3D;
+    scale(factor: number): Point3D;
+    to_vec3(): Vec3;
+    static zero(): Point3D;
+}
+
+export class Quad {
+    static $gtype: GObject.GType<Quad>;
+
+    constructor();
+    constructor(properties?: Partial<{}>);
+    constructor(copy: Quad);
+
+    // Constructors
+    static alloc(): Quad;
+
+    // Members
+    bounds(): Rect;
+    contains(p: Point): boolean;
+    free(): void;
+    get_point(index_: number): Point;
+    init(p1: Point, p2: Point, p3: Point, p4: Point): Quad;
+    init_from_points(points: Point[]): Quad;
+    init_from_rect(r: Rect): Quad;
+}
+
+export class Quaternion {
+    static $gtype: GObject.GType<Quaternion>;
+
+    constructor();
+    constructor(properties?: Partial<{}>);
+    constructor(copy: Quaternion);
+
+    // Constructors
+    static alloc(): Quaternion;
+
+    // Members
+    add(b: Quaternion): Quaternion;
+    dot(b: Quaternion): number;
+    equal(b: Quaternion): boolean;
+    free(): void;
+    init(x: number, y: number, z: number, w: number): Quaternion;
+    init_from_angle_vec3(angle: number, axis: Vec3): Quaternion;
+    init_from_angles(deg_x: number, deg_y: number, deg_z: number): Quaternion;
+    init_from_euler(e: Euler): Quaternion;
+    init_from_matrix(m: Matrix): Quaternion;
+    init_from_quaternion(src: Quaternion): Quaternion;
+    init_from_radians(rad_x: number, rad_y: number, rad_z: number): Quaternion;
+    init_from_vec4(src: Vec4): Quaternion;
+    init_identity(): Quaternion;
+    invert(): Quaternion;
+    multiply(b: Quaternion): Quaternion;
+    normalize(): Quaternion;
+    scale(factor: number): Quaternion;
+    slerp(b: Quaternion, factor: number): Quaternion;
+    to_angle_vec3(): [number, Vec3];
+    to_angles(): [number, number, number];
+    to_matrix(): Matrix;
+    to_radians(): [number, number, number];
+    to_vec4(): Vec4;
+}
+
+export class Ray {
+    static $gtype: GObject.GType<Ray>;
+
+    constructor();
+    constructor(properties?: Partial<{}>);
+    constructor(copy: Ray);
+
+    // Constructors
+    static alloc(): Ray;
+
+    // Members
+    equal(b: Ray): boolean;
+    free(): void;
+    get_closest_point_to_point(p: Point3D): Point3D;
+    get_direction(): Vec3;
+    get_distance_to_plane(p: Plane): number;
+    get_distance_to_point(p: Point3D): number;
+    get_origin(): Point3D;
+    get_position_at(t: number): Point3D;
+    init(origin?: Point3D | null, direction?: Vec3 | null): Ray;
+    init_from_ray(src: Ray): Ray;
+    init_from_vec3(origin?: Vec3 | null, direction?: Vec3 | null): Ray;
+    intersect_box(b: Box): [RayIntersectionKind, number];
+    intersect_sphere(s: Sphere): [RayIntersectionKind, number];
+    intersect_triangle(t: Triangle): [RayIntersectionKind, number];
+    intersects_box(b: Box): boolean;
+    intersects_sphere(s: Sphere): boolean;
+    intersects_triangle(t: Triangle): boolean;
+}
+
+export class Rect {
+    static $gtype: GObject.GType<Rect>;
+
+    constructor(
+        properties?: Partial<{
+            origin?: Point;
+            size?: Size;
+        }>
+    );
+    constructor(copy: Rect);
+
+    // Fields
+    origin: Point;
+    size: Size;
+
+    // Members
+    contains_point(p: Point): boolean;
+    contains_rect(b: Rect): boolean;
+    equal(b: Rect): boolean;
+    expand(p: Point): Rect;
+    free(): void;
+    get_area(): number;
+    get_bottom_left(): Point;
+    get_bottom_right(): Point;
+    get_center(): Point;
+    get_height(): number;
+    get_top_left(): Point;
+    get_top_right(): Point;
+    get_vertices(): Vec2[];
+    get_width(): number;
+    get_x(): number;
+    get_y(): number;
+    init(x: number, y: number, width: number, height: number): Rect;
+    init_from_rect(src: Rect): Rect;
+    inset(d_x: number, d_y: number): Rect;
+    inset_r(d_x: number, d_y: number): Rect;
+    interpolate(b: Rect, factor: number): Rect;
+    intersection(b: Rect): [boolean, Rect | null];
+    normalize(): Rect;
+    normalize_r(): Rect;
+    offset(d_x: number, d_y: number): Rect;
+    offset_r(d_x: number, d_y: number): Rect;
+    round(): Rect;
+    round_extents(): Rect;
+    round_to_pixel(): Rect;
+    scale(s_h: number, s_v: number): Rect;
+    union(b: Rect): Rect;
+    static alloc(): Rect;
+    static zero(): Rect;
+}
+
+export class Simd4F {
+    static $gtype: GObject.GType<Simd4F>;
+
+    constructor(copy: Simd4F);
+}
+
+export class Simd4X4F {
+    static $gtype: GObject.GType<Simd4X4F>;
+
+    constructor(copy: Simd4X4F);
+}
+
+export class Size {
+    static $gtype: GObject.GType<Size>;
+
+    constructor();
+    constructor(
+        properties?: Partial<{
+            width?: number;
+            height?: number;
+        }>
+    );
+    constructor(copy: Size);
+
+    // Fields
+    width: number;
+    height: number;
+
+    // Constructors
+    static alloc(): Size;
+
+    // Members
+    equal(b: Size): boolean;
+    free(): void;
+    init(width: number, height: number): Size;
+    init_from_size(src: Size): Size;
+    interpolate(b: Size, factor: number): Size;
+    scale(factor: number): Size;
+    static zero(): Size;
+}
+
+export class Sphere {
+    static $gtype: GObject.GType<Sphere>;
+
+    constructor();
+    constructor(properties?: Partial<{}>);
+    constructor(copy: Sphere);
+
+    // Constructors
+    static alloc(): Sphere;
+
+    // Members
+    contains_point(point: Point3D): boolean;
+    distance(point: Point3D): number;
+    equal(b: Sphere): boolean;
+    free(): void;
+    get_bounding_box(): Box;
+    get_center(): Point3D;
+    get_radius(): number;
+    init(center: Point3D | null, radius: number): Sphere;
+    init_from_points(points: Point3D[], center?: Point3D | null): Sphere;
+    init_from_vectors(vectors: Vec3[], center?: Point3D | null): Sphere;
+    is_empty(): boolean;
+    translate(point: Point3D): Sphere;
+}
+
+export class Triangle {
+    static $gtype: GObject.GType<Triangle>;
+
+    constructor();
+    constructor(properties?: Partial<{}>);
+    constructor(copy: Triangle);
+
+    // Constructors
+    static alloc(): Triangle;
+
+    // Members
+    contains_point(p: Point3D): boolean;
+    equal(b: Triangle): boolean;
+    free(): void;
+    get_area(): number;
+    get_barycoords(p: Point3D | null): [boolean, Vec2];
+    get_bounding_box(): Box;
+    get_midpoint(): Point3D;
+    get_normal(): Vec3;
+    get_plane(): Plane;
+    get_points(): [Point3D | null, Point3D | null, Point3D | null];
+    get_uv(p: Point3D | null, uv_a: Vec2, uv_b: Vec2, uv_c: Vec2): [boolean, Vec2];
+    get_vertices(): [Vec3 | null, Vec3 | null, Vec3 | null];
+    init_from_float(a: number[], b: number[], c: number[]): Triangle;
+    init_from_point3d(a?: Point3D | null, b?: Point3D | null, c?: Point3D | null): Triangle;
+    init_from_vec3(a?: Vec3 | null, b?: Vec3 | null, c?: Vec3 | null): Triangle;
+}
+
+export class Vec2 {
+    static $gtype: GObject.GType<Vec2>;
+
+    constructor();
+    constructor(properties?: Partial<{}>);
+    constructor(copy: Vec2);
+
+    // Constructors
+    static alloc(): Vec2;
+
+    // Members
+    add(b: Vec2): Vec2;
+    divide(b: Vec2): Vec2;
+    dot(b: Vec2): number;
+    equal(v2: Vec2): boolean;
+    free(): void;
+    get_x(): number;
+    get_y(): number;
+    init(x: number, y: number): Vec2;
+    init_from_float(src: number[]): Vec2;
+    init_from_vec2(src: Vec2): Vec2;
+    interpolate(v2: Vec2, factor: number): Vec2;
+    length(): number;
+    max(b: Vec2): Vec2;
+    min(b: Vec2): Vec2;
+    multiply(b: Vec2): Vec2;
+    near(v2: Vec2, epsilon: number): boolean;
+    negate(): Vec2;
+    normalize(): Vec2;
+    scale(factor: number): Vec2;
+    subtract(b: Vec2): Vec2;
+    to_float(): number[];
+    static one(): Vec2;
+    static x_axis(): Vec2;
+    static y_axis(): Vec2;
+    static zero(): Vec2;
+}
+
+export class Vec3 {
+    static $gtype: GObject.GType<Vec3>;
+
+    constructor();
+    constructor(properties?: Partial<{}>);
+    constructor(copy: Vec3);
+
+    // Constructors
+    static alloc(): Vec3;
+
+    // Members
+    add(b: Vec3): Vec3;
+    cross(b: Vec3): Vec3;
+    divide(b: Vec3): Vec3;
+    dot(b: Vec3): number;
+    equal(v2: Vec3): boolean;
+    free(): void;
+    get_x(): number;
+    get_xy(): Vec2;
+    get_xy0(): Vec3;
+    get_xyz0(): Vec4;
+    get_xyz1(): Vec4;
+    get_xyzw(w: number): Vec4;
+    get_y(): number;
+    get_z(): number;
+    init(x: number, y: number, z: number): Vec3;
+    init_from_float(src: number[]): Vec3;
+    init_from_vec3(src: Vec3): Vec3;
+    interpolate(v2: Vec3, factor: number): Vec3;
+    length(): number;
+    max(b: Vec3): Vec3;
+    min(b: Vec3): Vec3;
+    multiply(b: Vec3): Vec3;
+    near(v2: Vec3, epsilon: number): boolean;
+    negate(): Vec3;
+    normalize(): Vec3;
+    scale(factor: number): Vec3;
+    subtract(b: Vec3): Vec3;
+    to_float(): number[];
+    static one(): Vec3;
+    static x_axis(): Vec3;
+    static y_axis(): Vec3;
+    static z_axis(): Vec3;
+    static zero(): Vec3;
+}
+
+export class Vec4 {
+    static $gtype: GObject.GType<Vec4>;
+
+    constructor();
+    constructor(properties?: Partial<{}>);
+    constructor(copy: Vec4);
+
+    // Constructors
+    static alloc(): Vec4;
+
+    // Members
+    add(b: Vec4): Vec4;
+    divide(b: Vec4): Vec4;
+    dot(b: Vec4): number;
+    equal(v2: Vec4): boolean;
+    free(): void;
+    get_w(): number;
+    get_x(): number;
+    get_xy(): Vec2;
+    get_xyz(): Vec3;
+    get_y(): number;
+    get_z(): number;
+    init(x: number, y: number, z: number, w: number): Vec4;
+    init_from_float(src: number[]): Vec4;
+    init_from_vec2(src: Vec2, z: number, w: number): Vec4;
+    init_from_vec3(src: Vec3, w: number): Vec4;
+    init_from_vec4(src: Vec4): Vec4;
+    interpolate(v2: Vec4, factor: number): Vec4;
+    length(): number;
+    max(b: Vec4): Vec4;
+    min(b: Vec4): Vec4;
+    multiply(b: Vec4): Vec4;
+    near(v2: Vec4, epsilon: number): boolean;
+    negate(): Vec4;
+    normalize(): Vec4;
+    scale(factor: number): Vec4;
+    subtract(b: Vec4): Vec4;
+    to_float(): number[];
+    static one(): Vec4;
+    static w_axis(): Vec4;
+    static x_axis(): Vec4;
+    static y_axis(): Vec4;
+    static z_axis(): Vec4;
+    static zero(): Vec4;
+}
diff --git a/types/gsk.d.ts b/types/gsk.d.ts
new file mode 100644
index 0000000..7541d9d
--- /dev/null
+++ b/types/gsk.d.ts
@@ -0,0 +1,1008 @@
+/**
+ * Gsk 4.0
+ *
+ * Generated from 4.0
+ */
+
+import * as Gdk from "gdk";
+import * as GObject from "gobject";
+import * as Graphene from "graphene";
+import * as GLib from "glib";
+import * as cairo from "cairo";
+import * as Pango from "pango";
+
+export function serialization_error_quark(): GLib.Quark;
+export function transform_parse(string: string): [boolean, Transform];
+export function value_dup_render_node(value: GObject.Value | any): RenderNode | null;
+export function value_get_render_node(value: GObject.Value | any): RenderNode | null;
+export function value_set_render_node(value: GObject.Value | any, node: RenderNode): void;
+export function value_take_render_node(value: GObject.Value | any, node?: RenderNode | null): void;
+export type ParseErrorFunc = (start: ParseLocation, end: ParseLocation, error: GLib.Error) => void;
+
+export namespace BlendMode {
+    export const $gtype: GObject.GType<BlendMode>;
+}
+
+export enum BlendMode {
+    DEFAULT = 0,
+    MULTIPLY = 1,
+    SCREEN = 2,
+    OVERLAY = 3,
+    DARKEN = 4,
+    LIGHTEN = 5,
+    COLOR_DODGE = 6,
+    COLOR_BURN = 7,
+    HARD_LIGHT = 8,
+    SOFT_LIGHT = 9,
+    DIFFERENCE = 10,
+    EXCLUSION = 11,
+    COLOR = 12,
+    HUE = 13,
+    SATURATION = 14,
+    LUMINOSITY = 15,
+}
+
+export namespace Corner {
+    export const $gtype: GObject.GType<Corner>;
+}
+
+export enum Corner {
+    TOP_LEFT = 0,
+    TOP_RIGHT = 1,
+    BOTTOM_RIGHT = 2,
+    BOTTOM_LEFT = 3,
+}
+
+export namespace GLUniformType {
+    export const $gtype: GObject.GType<GLUniformType>;
+}
+
+export enum GLUniformType {
+    NONE = 0,
+    FLOAT = 1,
+    INT = 2,
+    UINT = 3,
+    BOOL = 4,
+    VEC2 = 5,
+    VEC3 = 6,
+    VEC4 = 7,
+}
+
+export namespace RenderNodeType {
+    export const $gtype: GObject.GType<RenderNodeType>;
+}
+
+export enum RenderNodeType {
+    NOT_A_RENDER_NODE = 0,
+    CONTAINER_NODE = 1,
+    CAIRO_NODE = 2,
+    COLOR_NODE = 3,
+    LINEAR_GRADIENT_NODE = 4,
+    REPEATING_LINEAR_GRADIENT_NODE = 5,
+    RADIAL_GRADIENT_NODE = 6,
+    REPEATING_RADIAL_GRADIENT_NODE = 7,
+    CONIC_GRADIENT_NODE = 8,
+    BORDER_NODE = 9,
+    TEXTURE_NODE = 10,
+    INSET_SHADOW_NODE = 11,
+    OUTSET_SHADOW_NODE = 12,
+    TRANSFORM_NODE = 13,
+    OPACITY_NODE = 14,
+    COLOR_MATRIX_NODE = 15,
+    REPEAT_NODE = 16,
+    CLIP_NODE = 17,
+    ROUNDED_CLIP_NODE = 18,
+    SHADOW_NODE = 19,
+    BLEND_NODE = 20,
+    CROSS_FADE_NODE = 21,
+    TEXT_NODE = 22,
+    BLUR_NODE = 23,
+    DEBUG_NODE = 24,
+    GL_SHADER_NODE = 25,
+}
+
+export namespace ScalingFilter {
+    export const $gtype: GObject.GType<ScalingFilter>;
+}
+
+export enum ScalingFilter {
+    LINEAR = 0,
+    NEAREST = 1,
+    TRILINEAR = 2,
+}
+
+export class SerializationError extends GLib.Error {
+    static $gtype: GObject.GType<SerializationError>;
+
+    constructor(options: { message: string; code: number });
+    constructor(copy: SerializationError);
+
+    // Fields
+    static UNSUPPORTED_FORMAT: number;
+    static UNSUPPORTED_VERSION: number;
+    static INVALID_DATA: number;
+
+    // Members
+    static quark(): GLib.Quark;
+}
+
+export namespace TransformCategory {
+    export const $gtype: GObject.GType<TransformCategory>;
+}
+
+export enum TransformCategory {
+    UNKNOWN = 0,
+    ANY = 1,
+    "3D" = 2,
+    "2D" = 3,
+    "2D_AFFINE" = 4,
+    "2D_TRANSLATE" = 5,
+    IDENTITY = 6,
+}
+export module BlendNode {
+    export interface ConstructorProperties extends RenderNode.ConstructorProperties {
+        [key: string]: any;
+    }
+}
+export class BlendNode extends RenderNode {
+    static $gtype: GObject.GType<BlendNode>;
+
+    constructor(properties?: Partial<BlendNode.ConstructorProperties>, ...args: any[]);
+    _init(properties?: Partial<BlendNode.ConstructorProperties>, ...args: any[]): void;
+
+    // Constructors
+
+    static ["new"](bottom: RenderNode, top: RenderNode, blend_mode: BlendMode): BlendNode;
+
+    // Members
+
+    get_blend_mode(): BlendMode;
+    get_bottom_child(): RenderNode;
+    get_top_child(): RenderNode;
+}
+export module BlurNode {
+    export interface ConstructorProperties extends RenderNode.ConstructorProperties {
+        [key: string]: any;
+    }
+}
+export class BlurNode extends RenderNode {
+    static $gtype: GObject.GType<BlurNode>;
+
+    constructor(properties?: Partial<BlurNode.ConstructorProperties>, ...args: any[]);
+    _init(properties?: Partial<BlurNode.ConstructorProperties>, ...args: any[]): void;
+
+    // Constructors
+
+    static ["new"](child: RenderNode, radius: number): BlurNode;
+
+    // Members
+
+    get_child(): RenderNode;
+    get_radius(): number;
+}
+export module BorderNode {
+    export interface ConstructorProperties extends RenderNode.ConstructorProperties {
+        [key: string]: any;
+    }
+}
+export class BorderNode extends RenderNode {
+    static $gtype: GObject.GType<BorderNode>;
+
+    constructor(properties?: Partial<BorderNode.ConstructorProperties>, ...args: any[]);
+    _init(properties?: Partial<BorderNode.ConstructorProperties>, ...args: any[]): void;
+
+    // Constructors
+
+    static ["new"](outline: RoundedRect, border_width: number[], border_color: Gdk.RGBA[]): BorderNode;
+
+    // Members
+
+    get_colors(): Gdk.RGBA;
+    get_outline(): RoundedRect;
+    get_widths(): number[];
+}
+export module BroadwayRenderer {
+    export interface ConstructorProperties extends Renderer.ConstructorProperties {
+        [key: string]: any;
+    }
+}
+export class BroadwayRenderer extends Renderer {
+    static $gtype: GObject.GType<BroadwayRenderer>;
+
+    constructor(properties?: Partial<BroadwayRenderer.ConstructorProperties>, ...args: any[]);
+    _init(properties?: Partial<BroadwayRenderer.ConstructorProperties>, ...args: any[]): void;
+
+    // Constructors
+
+    static ["new"](): BroadwayRenderer;
+}
+export module CairoNode {
+    export interface ConstructorProperties extends RenderNode.ConstructorProperties {
+        [key: string]: any;
+    }
+}
+export class CairoNode extends RenderNode {
+    static $gtype: GObject.GType<CairoNode>;
+
+    constructor(properties?: Partial<CairoNode.ConstructorProperties>, ...args: any[]);
+    _init(properties?: Partial<CairoNode.ConstructorProperties>, ...args: any[]): void;
+
+    // Constructors
+
+    static ["new"](bounds: Graphene.Rect): CairoNode;
+
+    // Members
+
+    get_draw_context(): cairo.Context;
+    get_surface(): cairo.Surface;
+}
+export module CairoRenderer {
+    export interface ConstructorProperties extends Renderer.ConstructorProperties {
+        [key: string]: any;
+    }
+}
+export class CairoRenderer extends Renderer {
+    static $gtype: GObject.GType<CairoRenderer>;
+
+    constructor(properties?: Partial<CairoRenderer.ConstructorProperties>, ...args: any[]);
+    _init(properties?: Partial<CairoRenderer.ConstructorProperties>, ...args: any[]): void;
+
+    // Constructors
+
+    static ["new"](): CairoRenderer;
+}
+export module ClipNode {
+    export interface ConstructorProperties extends RenderNode.ConstructorProperties {
+        [key: string]: any;
+    }
+}
+export class ClipNode extends RenderNode {
+    static $gtype: GObject.GType<ClipNode>;
+
+    constructor(properties?: Partial<ClipNode.ConstructorProperties>, ...args: any[]);
+    _init(properties?: Partial<ClipNode.ConstructorProperties>, ...args: any[]): void;
+
+    // Constructors
+
+    static ["new"](child: RenderNode, clip: Graphene.Rect): ClipNode;
+
+    // Members
+
+    get_child(): RenderNode;
+    get_clip(): Graphene.Rect;
+}
+export module ColorMatrixNode {
+    export interface ConstructorProperties extends RenderNode.ConstructorProperties {
+        [key: string]: any;
+    }
+}
+export class ColorMatrixNode extends RenderNode {
+    static $gtype: GObject.GType<ColorMatrixNode>;
+
+    constructor(properties?: Partial<ColorMatrixNode.ConstructorProperties>, ...args: any[]);
+    _init(properties?: Partial<ColorMatrixNode.ConstructorProperties>, ...args: any[]): void;
+
+    // Constructors
+
+    static ["new"](child: RenderNode, color_matrix: Graphene.Matrix, color_offset: Graphene.Vec4): 
ColorMatrixNode;
+
+    // Members
+
+    get_child(): RenderNode;
+    get_color_matrix(): Graphene.Matrix;
+    get_color_offset(): Graphene.Vec4;
+}
+export module ColorNode {
+    export interface ConstructorProperties extends RenderNode.ConstructorProperties {
+        [key: string]: any;
+    }
+}
+export class ColorNode extends RenderNode {
+    static $gtype: GObject.GType<ColorNode>;
+
+    constructor(properties?: Partial<ColorNode.ConstructorProperties>, ...args: any[]);
+    _init(properties?: Partial<ColorNode.ConstructorProperties>, ...args: any[]): void;
+
+    // Constructors
+
+    static ["new"](rgba: Gdk.RGBA, bounds: Graphene.Rect): ColorNode;
+
+    // Members
+
+    get_color(): Gdk.RGBA;
+}
+export module ConicGradientNode {
+    export interface ConstructorProperties extends RenderNode.ConstructorProperties {
+        [key: string]: any;
+    }
+}
+export class ConicGradientNode extends RenderNode {
+    static $gtype: GObject.GType<ConicGradientNode>;
+
+    constructor(properties?: Partial<ConicGradientNode.ConstructorProperties>, ...args: any[]);
+    _init(properties?: Partial<ConicGradientNode.ConstructorProperties>, ...args: any[]): void;
+
+    // Constructors
+
+    static ["new"](
+        bounds: Graphene.Rect,
+        center: Graphene.Point,
+        rotation: number,
+        color_stops: ColorStop[]
+    ): ConicGradientNode;
+
+    // Members
+
+    get_angle(): number;
+    get_center(): Graphene.Point;
+    get_color_stops(): ColorStop[];
+    get_n_color_stops(): number;
+    get_rotation(): number;
+}
+export module ContainerNode {
+    export interface ConstructorProperties extends RenderNode.ConstructorProperties {
+        [key: string]: any;
+    }
+}
+export class ContainerNode extends RenderNode {
+    static $gtype: GObject.GType<ContainerNode>;
+
+    constructor(properties?: Partial<ContainerNode.ConstructorProperties>, ...args: any[]);
+    _init(properties?: Partial<ContainerNode.ConstructorProperties>, ...args: any[]): void;
+
+    // Constructors
+
+    static ["new"](children: RenderNode[]): ContainerNode;
+
+    // Members
+
+    get_child(idx: number): RenderNode;
+    get_n_children(): number;
+}
+export module CrossFadeNode {
+    export interface ConstructorProperties extends RenderNode.ConstructorProperties {
+        [key: string]: any;
+    }
+}
+export class CrossFadeNode extends RenderNode {
+    static $gtype: GObject.GType<CrossFadeNode>;
+
+    constructor(properties?: Partial<CrossFadeNode.ConstructorProperties>, ...args: any[]);
+    _init(properties?: Partial<CrossFadeNode.ConstructorProperties>, ...args: any[]): void;
+
+    // Constructors
+
+    static ["new"](start: RenderNode, end: RenderNode, progress: number): CrossFadeNode;
+
+    // Members
+
+    get_end_child(): RenderNode;
+    get_progress(): number;
+    get_start_child(): RenderNode;
+}
+export module DebugNode {
+    export interface ConstructorProperties extends RenderNode.ConstructorProperties {
+        [key: string]: any;
+    }
+}
+export class DebugNode extends RenderNode {
+    static $gtype: GObject.GType<DebugNode>;
+
+    constructor(properties?: Partial<DebugNode.ConstructorProperties>, ...args: any[]);
+    _init(properties?: Partial<DebugNode.ConstructorProperties>, ...args: any[]): void;
+
+    // Constructors
+
+    static ["new"](child: RenderNode, message: string): DebugNode;
+
+    // Members
+
+    get_child(): RenderNode;
+    get_message(): string;
+}
+export module GLRenderer {
+    export interface ConstructorProperties extends Renderer.ConstructorProperties {
+        [key: string]: any;
+    }
+}
+export class GLRenderer extends Renderer {
+    static $gtype: GObject.GType<GLRenderer>;
+
+    constructor(properties?: Partial<GLRenderer.ConstructorProperties>, ...args: any[]);
+    _init(properties?: Partial<GLRenderer.ConstructorProperties>, ...args: any[]): void;
+
+    // Constructors
+
+    static ["new"](): GLRenderer;
+}
+export module GLShader {
+    export interface ConstructorProperties extends GObject.Object.ConstructorProperties {
+        [key: string]: any;
+        resource: string;
+        source: GLib.Bytes;
+    }
+}
+export class GLShader extends GObject.Object {
+    static $gtype: GObject.GType<GLShader>;
+
+    constructor(properties?: Partial<GLShader.ConstructorProperties>, ...args: any[]);
+    _init(properties?: Partial<GLShader.ConstructorProperties>, ...args: any[]): void;
+
+    // Properties
+    get resource(): string;
+    get source(): GLib.Bytes;
+
+    // Constructors
+
+    static new_from_bytes(sourcecode: GLib.Bytes | Uint8Array): GLShader;
+    static new_from_resource(resource_path: string): GLShader;
+
+    // Members
+
+    compile(renderer: Renderer): boolean;
+    find_uniform_by_name(name: string): number;
+    get_arg_bool(args: GLib.Bytes | Uint8Array, idx: number): boolean;
+    get_arg_float(args: GLib.Bytes | Uint8Array, idx: number): number;
+    get_arg_int(args: GLib.Bytes | Uint8Array, idx: number): number;
+    get_arg_uint(args: GLib.Bytes | Uint8Array, idx: number): number;
+    get_arg_vec2(args: GLib.Bytes | Uint8Array, idx: number, out_value: Graphene.Vec2): void;
+    get_arg_vec3(args: GLib.Bytes | Uint8Array, idx: number, out_value: Graphene.Vec3): void;
+    get_arg_vec4(args: GLib.Bytes | Uint8Array, idx: number, out_value: Graphene.Vec4): void;
+    get_args_size(): number;
+    get_n_textures(): number;
+    get_n_uniforms(): number;
+    get_resource(): string | null;
+    get_source(): GLib.Bytes;
+    get_uniform_name(idx: number): string;
+    get_uniform_offset(idx: number): number;
+    get_uniform_type(idx: number): GLUniformType;
+}
+export module GLShaderNode {
+    export interface ConstructorProperties extends RenderNode.ConstructorProperties {
+        [key: string]: any;
+    }
+}
+export class GLShaderNode extends RenderNode {
+    static $gtype: GObject.GType<GLShaderNode>;
+
+    constructor(properties?: Partial<GLShaderNode.ConstructorProperties>, ...args: any[]);
+    _init(properties?: Partial<GLShaderNode.ConstructorProperties>, ...args: any[]): void;
+
+    // Constructors
+
+    static ["new"](
+        shader: GLShader,
+        bounds: Graphene.Rect,
+        args: GLib.Bytes | Uint8Array,
+        children?: RenderNode[] | null
+    ): GLShaderNode;
+
+    // Members
+
+    get_args(): GLib.Bytes;
+    get_child(idx: number): RenderNode;
+    get_n_children(): number;
+    get_shader(): GLShader;
+}
+export module InsetShadowNode {
+    export interface ConstructorProperties extends RenderNode.ConstructorProperties {
+        [key: string]: any;
+    }
+}
+export class InsetShadowNode extends RenderNode {
+    static $gtype: GObject.GType<InsetShadowNode>;
+
+    constructor(properties?: Partial<InsetShadowNode.ConstructorProperties>, ...args: any[]);
+    _init(properties?: Partial<InsetShadowNode.ConstructorProperties>, ...args: any[]): void;
+
+    // Constructors
+
+    static ["new"](
+        outline: RoundedRect,
+        color: Gdk.RGBA,
+        dx: number,
+        dy: number,
+        spread: number,
+        blur_radius: number
+    ): InsetShadowNode;
+
+    // Members
+
+    get_blur_radius(): number;
+    get_color(): Gdk.RGBA;
+    get_dx(): number;
+    get_dy(): number;
+    get_outline(): RoundedRect;
+    get_spread(): number;
+}
+export module LinearGradientNode {
+    export interface ConstructorProperties extends RenderNode.ConstructorProperties {
+        [key: string]: any;
+    }
+}
+export class LinearGradientNode extends RenderNode {
+    static $gtype: GObject.GType<LinearGradientNode>;
+
+    constructor(properties?: Partial<LinearGradientNode.ConstructorProperties>, ...args: any[]);
+    _init(properties?: Partial<LinearGradientNode.ConstructorProperties>, ...args: any[]): void;
+
+    // Constructors
+
+    static ["new"](
+        bounds: Graphene.Rect,
+        start: Graphene.Point,
+        end: Graphene.Point,
+        color_stops: ColorStop[]
+    ): LinearGradientNode;
+
+    // Members
+
+    get_color_stops(): ColorStop[];
+    get_end(): Graphene.Point;
+    get_n_color_stops(): number;
+    get_start(): Graphene.Point;
+}
+export module NglRenderer {
+    export interface ConstructorProperties extends Renderer.ConstructorProperties {
+        [key: string]: any;
+    }
+}
+export class NglRenderer extends Renderer {
+    static $gtype: GObject.GType<NglRenderer>;
+
+    constructor(properties?: Partial<NglRenderer.ConstructorProperties>, ...args: any[]);
+    _init(properties?: Partial<NglRenderer.ConstructorProperties>, ...args: any[]): void;
+
+    // Constructors
+
+    static ["new"](): NglRenderer;
+}
+export module OpacityNode {
+    export interface ConstructorProperties extends RenderNode.ConstructorProperties {
+        [key: string]: any;
+    }
+}
+export class OpacityNode extends RenderNode {
+    static $gtype: GObject.GType<OpacityNode>;
+
+    constructor(properties?: Partial<OpacityNode.ConstructorProperties>, ...args: any[]);
+    _init(properties?: Partial<OpacityNode.ConstructorProperties>, ...args: any[]): void;
+
+    // Constructors
+
+    static ["new"](child: RenderNode, opacity: number): OpacityNode;
+
+    // Members
+
+    get_child(): RenderNode;
+    get_opacity(): number;
+}
+export module OutsetShadowNode {
+    export interface ConstructorProperties extends RenderNode.ConstructorProperties {
+        [key: string]: any;
+    }
+}
+export class OutsetShadowNode extends RenderNode {
+    static $gtype: GObject.GType<OutsetShadowNode>;
+
+    constructor(properties?: Partial<OutsetShadowNode.ConstructorProperties>, ...args: any[]);
+    _init(properties?: Partial<OutsetShadowNode.ConstructorProperties>, ...args: any[]): void;
+
+    // Constructors
+
+    static ["new"](
+        outline: RoundedRect,
+        color: Gdk.RGBA,
+        dx: number,
+        dy: number,
+        spread: number,
+        blur_radius: number
+    ): OutsetShadowNode;
+
+    // Members
+
+    get_blur_radius(): number;
+    get_color(): Gdk.RGBA;
+    get_dx(): number;
+    get_dy(): number;
+    get_outline(): RoundedRect;
+    get_spread(): number;
+}
+export module RadialGradientNode {
+    export interface ConstructorProperties extends RenderNode.ConstructorProperties {
+        [key: string]: any;
+    }
+}
+export class RadialGradientNode extends RenderNode {
+    static $gtype: GObject.GType<RadialGradientNode>;
+
+    constructor(properties?: Partial<RadialGradientNode.ConstructorProperties>, ...args: any[]);
+    _init(properties?: Partial<RadialGradientNode.ConstructorProperties>, ...args: any[]): void;
+
+    // Constructors
+
+    static ["new"](
+        bounds: Graphene.Rect,
+        center: Graphene.Point,
+        hradius: number,
+        vradius: number,
+        start: number,
+        end: number,
+        color_stops: ColorStop[]
+    ): RadialGradientNode;
+
+    // Members
+
+    get_center(): Graphene.Point;
+    get_color_stops(): ColorStop[];
+    get_end(): number;
+    get_hradius(): number;
+    get_n_color_stops(): number;
+    get_start(): number;
+    get_vradius(): number;
+}
+export module RenderNode {
+    export interface ConstructorProperties {
+        [key: string]: any;
+    }
+}
+export abstract class RenderNode {
+    static $gtype: GObject.GType<RenderNode>;
+
+    constructor(properties?: Partial<RenderNode.ConstructorProperties>, ...args: any[]);
+    _init(properties?: Partial<RenderNode.ConstructorProperties>, ...args: any[]): void;
+
+    // Members
+
+    draw(cr: cairo.Context): void;
+    get_bounds(): Graphene.Rect;
+    get_node_type(): RenderNodeType;
+    ref(): RenderNode;
+    serialize(): GLib.Bytes;
+    unref(): void;
+    write_to_file(filename: string): boolean;
+    static deserialize(bytes: GLib.Bytes | Uint8Array): RenderNode | null;
+}
+export module Renderer {
+    export interface ConstructorProperties extends GObject.Object.ConstructorProperties {
+        [key: string]: any;
+        realized: boolean;
+        surface: Gdk.Surface;
+    }
+}
+export abstract class Renderer extends GObject.Object {
+    static $gtype: GObject.GType<Renderer>;
+
+    constructor(properties?: Partial<Renderer.ConstructorProperties>, ...args: any[]);
+    _init(properties?: Partial<Renderer.ConstructorProperties>, ...args: any[]): void;
+
+    // Properties
+    get realized(): boolean;
+    get surface(): Gdk.Surface;
+
+    // Constructors
+
+    static new_for_surface(surface: Gdk.Surface): Renderer;
+
+    // Members
+
+    get_surface(): Gdk.Surface | null;
+    is_realized(): boolean;
+    realize(surface?: Gdk.Surface | null): boolean;
+    render(root: RenderNode, region?: cairo.Region | null): void;
+    render_texture(root: RenderNode, viewport?: Graphene.Rect | null): Gdk.Texture;
+    unrealize(): void;
+}
+export module RepeatNode {
+    export interface ConstructorProperties extends RenderNode.ConstructorProperties {
+        [key: string]: any;
+    }
+}
+export class RepeatNode extends RenderNode {
+    static $gtype: GObject.GType<RepeatNode>;
+
+    constructor(properties?: Partial<RepeatNode.ConstructorProperties>, ...args: any[]);
+    _init(properties?: Partial<RepeatNode.ConstructorProperties>, ...args: any[]): void;
+
+    // Constructors
+
+    static ["new"](bounds: Graphene.Rect, child: RenderNode, child_bounds?: Graphene.Rect | null): 
RepeatNode;
+
+    // Members
+
+    get_child(): RenderNode;
+    get_child_bounds(): Graphene.Rect;
+}
+export module RepeatingLinearGradientNode {
+    export interface ConstructorProperties extends RenderNode.ConstructorProperties {
+        [key: string]: any;
+    }
+}
+export class RepeatingLinearGradientNode extends RenderNode {
+    static $gtype: GObject.GType<RepeatingLinearGradientNode>;
+
+    constructor(properties?: Partial<RepeatingLinearGradientNode.ConstructorProperties>, ...args: any[]);
+    _init(properties?: Partial<RepeatingLinearGradientNode.ConstructorProperties>, ...args: any[]): void;
+
+    // Constructors
+
+    static ["new"](
+        bounds: Graphene.Rect,
+        start: Graphene.Point,
+        end: Graphene.Point,
+        color_stops: ColorStop[]
+    ): RepeatingLinearGradientNode;
+}
+export module RepeatingRadialGradientNode {
+    export interface ConstructorProperties extends RenderNode.ConstructorProperties {
+        [key: string]: any;
+    }
+}
+export class RepeatingRadialGradientNode extends RenderNode {
+    static $gtype: GObject.GType<RepeatingRadialGradientNode>;
+
+    constructor(properties?: Partial<RepeatingRadialGradientNode.ConstructorProperties>, ...args: any[]);
+    _init(properties?: Partial<RepeatingRadialGradientNode.ConstructorProperties>, ...args: any[]): void;
+
+    // Constructors
+
+    static ["new"](
+        bounds: Graphene.Rect,
+        center: Graphene.Point,
+        hradius: number,
+        vradius: number,
+        start: number,
+        end: number,
+        color_stops: ColorStop[]
+    ): RepeatingRadialGradientNode;
+}
+export module RoundedClipNode {
+    export interface ConstructorProperties extends RenderNode.ConstructorProperties {
+        [key: string]: any;
+    }
+}
+export class RoundedClipNode extends RenderNode {
+    static $gtype: GObject.GType<RoundedClipNode>;
+
+    constructor(properties?: Partial<RoundedClipNode.ConstructorProperties>, ...args: any[]);
+    _init(properties?: Partial<RoundedClipNode.ConstructorProperties>, ...args: any[]): void;
+
+    // Constructors
+
+    static ["new"](child: RenderNode, clip: RoundedRect): RoundedClipNode;
+
+    // Members
+
+    get_child(): RenderNode;
+    get_clip(): RoundedRect;
+}
+export module ShadowNode {
+    export interface ConstructorProperties extends RenderNode.ConstructorProperties {
+        [key: string]: any;
+    }
+}
+export class ShadowNode extends RenderNode {
+    static $gtype: GObject.GType<ShadowNode>;
+
+    constructor(properties?: Partial<ShadowNode.ConstructorProperties>, ...args: any[]);
+    _init(properties?: Partial<ShadowNode.ConstructorProperties>, ...args: any[]): void;
+
+    // Constructors
+
+    static ["new"](child: RenderNode, shadows: Shadow[]): ShadowNode;
+
+    // Members
+
+    get_child(): RenderNode;
+    get_n_shadows(): number;
+    get_shadow(i: number): Shadow;
+}
+export module TextNode {
+    export interface ConstructorProperties extends RenderNode.ConstructorProperties {
+        [key: string]: any;
+    }
+}
+export class TextNode extends RenderNode {
+    static $gtype: GObject.GType<TextNode>;
+
+    constructor(properties?: Partial<TextNode.ConstructorProperties>, ...args: any[]);
+    _init(properties?: Partial<TextNode.ConstructorProperties>, ...args: any[]): void;
+
+    // Constructors
+
+    static ["new"](font: Pango.Font, glyphs: Pango.GlyphString, color: Gdk.RGBA, offset: Graphene.Point): 
TextNode;
+
+    // Members
+
+    get_color(): Gdk.RGBA;
+    get_font(): Pango.Font;
+    get_glyphs(): Pango.GlyphInfo[];
+    get_num_glyphs(): number;
+    get_offset(): Graphene.Point;
+    has_color_glyphs(): boolean;
+}
+export module TextureNode {
+    export interface ConstructorProperties extends RenderNode.ConstructorProperties {
+        [key: string]: any;
+    }
+}
+export class TextureNode extends RenderNode {
+    static $gtype: GObject.GType<TextureNode>;
+
+    constructor(properties?: Partial<TextureNode.ConstructorProperties>, ...args: any[]);
+    _init(properties?: Partial<TextureNode.ConstructorProperties>, ...args: any[]): void;
+
+    // Constructors
+
+    static ["new"](texture: Gdk.Texture, bounds: Graphene.Rect): TextureNode;
+
+    // Members
+
+    get_texture(): Gdk.Texture;
+}
+export module TransformNode {
+    export interface ConstructorProperties extends RenderNode.ConstructorProperties {
+        [key: string]: any;
+    }
+}
+export class TransformNode extends RenderNode {
+    static $gtype: GObject.GType<TransformNode>;
+
+    constructor(properties?: Partial<TransformNode.ConstructorProperties>, ...args: any[]);
+    _init(properties?: Partial<TransformNode.ConstructorProperties>, ...args: any[]): void;
+
+    // Constructors
+
+    static ["new"](child: RenderNode, transform: Transform): TransformNode;
+
+    // Members
+
+    get_child(): RenderNode;
+    get_transform(): Transform;
+}
+
+export class ColorStop {
+    static $gtype: GObject.GType<ColorStop>;
+
+    constructor(
+        properties?: Partial<{
+            offset?: number;
+            color?: Gdk.RGBA;
+        }>
+    );
+    constructor(copy: ColorStop);
+
+    // Fields
+    offset: number;
+    color: Gdk.RGBA;
+}
+
+export class ParseLocation {
+    static $gtype: GObject.GType<ParseLocation>;
+
+    constructor(
+        properties?: Partial<{
+            bytes?: number;
+            chars?: number;
+            lines?: number;
+            line_bytes?: number;
+            line_chars?: number;
+        }>
+    );
+    constructor(copy: ParseLocation);
+
+    // Fields
+    bytes: number;
+    chars: number;
+    lines: number;
+    line_bytes: number;
+    line_chars: number;
+}
+
+export class RoundedRect {
+    static $gtype: GObject.GType<RoundedRect>;
+
+    constructor(copy: RoundedRect);
+
+    // Fields
+    bounds: Graphene.Rect;
+    corner: Graphene.Size[];
+
+    // Members
+    contains_point(point: Graphene.Point): boolean;
+    contains_rect(rect: Graphene.Rect): boolean;
+    init(
+        bounds: Graphene.Rect,
+        top_left: Graphene.Size,
+        top_right: Graphene.Size,
+        bottom_right: Graphene.Size,
+        bottom_left: Graphene.Size
+    ): RoundedRect;
+    init_copy(src: RoundedRect): RoundedRect;
+    init_from_rect(bounds: Graphene.Rect, radius: number): RoundedRect;
+    intersects_rect(rect: Graphene.Rect): boolean;
+    is_rectilinear(): boolean;
+    normalize(): RoundedRect;
+    offset(dx: number, dy: number): RoundedRect;
+    shrink(top: number, right: number, bottom: number, left: number): RoundedRect;
+}
+
+export class ShaderArgsBuilder {
+    static $gtype: GObject.GType<ShaderArgsBuilder>;
+
+    constructor(shader: GLShader, initial_values?: GLib.Bytes | null);
+    constructor(copy: ShaderArgsBuilder);
+
+    // Constructors
+    static ["new"](shader: GLShader, initial_values?: GLib.Bytes | null): ShaderArgsBuilder;
+
+    // Members
+    ref(): ShaderArgsBuilder;
+    set_bool(idx: number, value: boolean): void;
+    set_float(idx: number, value: number): void;
+    set_int(idx: number, value: number): void;
+    set_uint(idx: number, value: number): void;
+    set_vec2(idx: number, value: Graphene.Vec2): void;
+    set_vec3(idx: number, value: Graphene.Vec3): void;
+    set_vec4(idx: number, value: Graphene.Vec4): void;
+    to_args(): GLib.Bytes;
+    unref(): void;
+}
+
+export class Shadow {
+    static $gtype: GObject.GType<Shadow>;
+
+    constructor(
+        properties?: Partial<{
+            color?: Gdk.RGBA;
+            dx?: number;
+            dy?: number;
+            radius?: number;
+        }>
+    );
+    constructor(copy: Shadow);
+
+    // Fields
+    color: Gdk.RGBA;
+    dx: number;
+    dy: number;
+    radius: number;
+}
+
+export class Transform {
+    static $gtype: GObject.GType<Transform>;
+
+    constructor();
+    constructor(properties?: Partial<{}>);
+    constructor(copy: Transform);
+
+    // Constructors
+    static ["new"](): Transform;
+
+    // Members
+    equal(second?: Transform | null): boolean;
+    get_category(): TransformCategory;
+    invert(): Transform | null;
+    matrix(matrix: Graphene.Matrix): Transform;
+    perspective(depth: number): Transform;
+    print(string: GLib.String): void;
+    ref(): Transform | null;
+    rotate(angle: number): Transform | null;
+    rotate_3d(angle: number, axis: Graphene.Vec3): Transform | null;
+    scale(factor_x: number, factor_y: number): Transform | null;
+    scale_3d(factor_x: number, factor_y: number, factor_z: number): Transform | null;
+    skew(skew_x: number, skew_y: number): Transform | null;
+    to_2d(): [number, number, number, number, number, number];
+    to_2d_components(): [number, number, number, number, number, number, number];
+    to_affine(): [number, number, number, number];
+    to_matrix(): Graphene.Matrix;
+    to_string(): string;
+    to_translate(): [number, number];
+    transform(other?: Transform | null): Transform | null;
+    transform_bounds(rect: Graphene.Rect): Graphene.Rect;
+    transform_point(point: Graphene.Point): Graphene.Point;
+    translate(point: Graphene.Point): Transform | null;
+    translate_3d(point: Graphene.Point3D): Transform | null;
+    unref(): void;
+    static parse(string: string): [boolean, Transform];
+}
diff --git a/types/gstaudio.d.ts b/types/gstaudio.d.ts
index c9e92ac..e5d3aa2 100644
--- a/types/gstaudio.d.ts
+++ b/types/gstaudio.d.ts
@@ -1,3 +1,4 @@
+// @ts-nocheck
 /**
  * GstAudio 1.0
  *
diff --git a/types/gstbase.d.ts b/types/gstbase.d.ts
new file mode 100644
index 0000000..81aac0c
--- /dev/null
+++ b/types/gstbase.d.ts
@@ -0,0 +1,1106 @@
+/**
+ * GstBase 1.0
+ *
+ * Generated from 1.0
+ */
+
+import * as Gst from "gst";
+import * as GLib from "glib";
+import * as GObject from "gobject";
+
+export const BASE_PARSE_FLAG_DRAINING: number;
+export const BASE_PARSE_FLAG_LOST_SYNC: number;
+export const BASE_TRANSFORM_SINK_NAME: string;
+export const BASE_TRANSFORM_SRC_NAME: string;
+export function type_find_helper(src: Gst.Pad, size: number): Gst.Caps | null;
+export function type_find_helper_for_buffer(
+    obj: Gst.Object | null,
+    buf: Gst.Buffer
+): [Gst.Caps | null, Gst.TypeFindProbability | null];
+export function type_find_helper_for_buffer_with_extension(
+    obj: Gst.Object | null,
+    buf: Gst.Buffer,
+    extension?: string | null
+): [Gst.Caps | null, Gst.TypeFindProbability | null];
+export function type_find_helper_for_data(
+    obj: Gst.Object | null,
+    data: Uint8Array | string
+): [Gst.Caps | null, Gst.TypeFindProbability | null];
+export function type_find_helper_for_data_with_extension(
+    obj: Gst.Object | null,
+    data: Uint8Array | string,
+    extension?: string | null
+): [Gst.Caps | null, Gst.TypeFindProbability | null];
+export function type_find_helper_for_extension(obj: Gst.Object | null, extension: string): Gst.Caps | null;
+export function type_find_helper_get_range(
+    obj: Gst.Object,
+    parent: Gst.Object | null,
+    func: TypeFindHelperGetRangeFunction,
+    size: number,
+    extension?: string | null
+): [Gst.Caps | null, Gst.TypeFindProbability | null];
+export function type_find_helper_get_range_full(
+    obj: Gst.Object,
+    parent: Gst.Object | null,
+    func: TypeFindHelperGetRangeFunction,
+    size: number,
+    extension: string | null
+): [Gst.FlowReturn, Gst.Caps, Gst.TypeFindProbability | null];
+export type CollectDataDestroyNotify = (data: CollectData) => void;
+export type CollectPadsBufferFunction = (pads: CollectPads, data: CollectData, buffer: Gst.Buffer) => 
Gst.FlowReturn;
+export type CollectPadsClipFunction = (pads: CollectPads, data: CollectData, inbuffer: Gst.Buffer) => 
Gst.FlowReturn;
+export type CollectPadsCompareFunction = (
+    pads: CollectPads,
+    data1: CollectData,
+    timestamp1: Gst.ClockTime,
+    data2: CollectData,
+    timestamp2: Gst.ClockTime
+) => number;
+export type CollectPadsEventFunction = (pads: CollectPads, pad: CollectData, event: Gst.Event) => boolean;
+export type CollectPadsFlushFunction = (pads: CollectPads) => void;
+export type CollectPadsFunction = (pads: CollectPads) => Gst.FlowReturn;
+export type CollectPadsQueryFunction = (pads: CollectPads, pad: CollectData, query: Gst.Query) => boolean;
+export type DataQueueEmptyCallback = (queue: DataQueue, checkdata?: any | null) => void;
+export type DataQueueFullCallback = (queue: DataQueue, checkdata?: any | null) => void;
+export type TypeFindHelperGetRangeFunction = (
+    obj: Gst.Object,
+    parent: Gst.Object | null,
+    offset: number,
+    length: number
+) => Gst.FlowReturn;
+
+export namespace AggregatorStartTimeSelection {
+    export const $gtype: GObject.GType<AggregatorStartTimeSelection>;
+}
+
+export enum AggregatorStartTimeSelection {
+    ZERO = 0,
+    FIRST = 1,
+    SET = 2,
+}
+
+export namespace BaseParseFrameFlags {
+    export const $gtype: GObject.GType<BaseParseFrameFlags>;
+}
+
+export enum BaseParseFrameFlags {
+    NONE = 0,
+    NEW_FRAME = 1,
+    NO_FRAME = 2,
+    CLIP = 4,
+    DROP = 8,
+    QUEUE = 16,
+}
+
+export namespace BaseSrcFlags {
+    export const $gtype: GObject.GType<BaseSrcFlags>;
+}
+
+export enum BaseSrcFlags {
+    STARTING = 16384,
+    STARTED = 32768,
+    LAST = 1048576,
+}
+
+export namespace CollectPadsStateFlags {
+    export const $gtype: GObject.GType<CollectPadsStateFlags>;
+}
+
+export enum CollectPadsStateFlags {
+    EOS = 1,
+    FLUSHING = 2,
+    NEW_SEGMENT = 4,
+    WAITING = 8,
+    LOCKED = 16,
+}
+export module Adapter {
+    export interface ConstructorProperties extends GObject.Object.ConstructorProperties {
+        [key: string]: any;
+    }
+}
+export class Adapter extends GObject.Object {
+    static $gtype: GObject.GType<Adapter>;
+
+    constructor(properties?: Partial<Adapter.ConstructorProperties>, ...args: any[]);
+    _init(properties?: Partial<Adapter.ConstructorProperties>, ...args: any[]): void;
+
+    // Constructors
+
+    static ["new"](): Adapter;
+
+    // Members
+
+    available(): number;
+    available_fast(): number;
+    clear(): void;
+    copy(offset: number, size: number): GLib.Bytes;
+    distance_from_discont(): number;
+    dts_at_discont(): Gst.ClockTime;
+    flush(flush: number): void;
+    get_buffer(nbytes: number): Gst.Buffer | null;
+    get_buffer_fast(nbytes: number): Gst.Buffer | null;
+    get_buffer_list(nbytes: number): Gst.BufferList | null;
+    get_list(nbytes: number): Gst.Buffer[] | null;
+    map(): Uint8Array | null;
+    masked_scan_uint32(mask: number, pattern: number, offset: number, size: number): number;
+    masked_scan_uint32_peek(mask: number, pattern: number, offset: number, size: number): [number, number];
+    offset_at_discont(): number;
+    prev_dts(): [Gst.ClockTime, number];
+    prev_dts_at_offset(offset: number): [Gst.ClockTime, number];
+    prev_offset(): [number, number];
+    prev_pts(): [Gst.ClockTime, number];
+    prev_pts_at_offset(offset: number): [Gst.ClockTime, number];
+    pts_at_discont(): Gst.ClockTime;
+    push(buf: Gst.Buffer): void;
+    take(): Uint8Array | null;
+    take_buffer(nbytes: number): Gst.Buffer | null;
+    take_buffer_fast(nbytes: number): Gst.Buffer | null;
+    take_buffer_list(nbytes: number): Gst.BufferList | null;
+    take_list(nbytes: number): Gst.Buffer[] | null;
+    unmap(): void;
+}
+export module Aggregator {
+    export interface ConstructorProperties extends Gst.Element.ConstructorProperties {
+        [key: string]: any;
+        emit_signals: boolean;
+        emitSignals: boolean;
+        latency: number;
+        min_upstream_latency: number;
+        minUpstreamLatency: number;
+        start_time: number | any;
+        startTime: number;
+        start_time_selection: AggregatorStartTimeSelection;
+        startTimeSelection: AggregatorStartTimeSelection;
+    }
+}
+export abstract class Aggregator extends Gst.Element {
+    static $gtype: GObject.GType<Aggregator>;
+
+    constructor(properties?: Partial<Aggregator.ConstructorProperties>, ...args: any[]);
+    _init(properties?: Partial<Aggregator.ConstructorProperties>, ...args: any[]): void;
+
+    // Properties
+    get emit_signals(): boolean;
+    set emit_signals(val: boolean);
+    get emitSignals(): boolean;
+    set emitSignals(val: boolean);
+    get latency(): number;
+    set latency(val: number);
+    get min_upstream_latency(): number;
+    set min_upstream_latency(val: number);
+    get minUpstreamLatency(): number;
+    set minUpstreamLatency(val: number);
+    // This accessor conflicts with a property, field, or function name in a parent class or interface.
+    // @ts-expect-error
+    get start_time(): number;
+    set start_time(val: number);
+    get startTime(): number;
+    set startTime(val: number);
+    get start_time_selection(): AggregatorStartTimeSelection;
+    set start_time_selection(val: AggregatorStartTimeSelection);
+    get startTimeSelection(): AggregatorStartTimeSelection;
+    set startTimeSelection(val: AggregatorStartTimeSelection);
+
+    // Fields
+    srcpad: Gst.Pad;
+
+    // Signals
+
+    connect(id: string, callback: (...args: any[]) => any): number;
+    connect_after(id: string, callback: (...args: any[]) => any): number;
+    emit(id: string, ...args: any[]): void;
+    connect(
+        signal: "samples-selected",
+        callback: (
+            _source: this,
+            segment: Gst.Segment,
+            pts: number,
+            dts: number,
+            duration: number,
+            info: Gst.Structure | null
+        ) => void
+    ): number;
+    connect_after(
+        signal: "samples-selected",
+        callback: (
+            _source: this,
+            segment: Gst.Segment,
+            pts: number,
+            dts: number,
+            duration: number,
+            info: Gst.Structure | null
+        ) => void
+    ): number;
+    emit(
+        signal: "samples-selected",
+        segment: Gst.Segment,
+        pts: number,
+        dts: number,
+        duration: number,
+        info: Gst.Structure | null
+    ): void;
+
+    // Members
+
+    finish_buffer(buffer: Gst.Buffer): Gst.FlowReturn;
+    finish_buffer_list(bufferlist: Gst.BufferList): Gst.FlowReturn;
+    get_allocator(): [Gst.Allocator | null, Gst.AllocationParams | null];
+    get_buffer_pool(): Gst.BufferPool | null;
+    get_ignore_inactive_pads(): boolean;
+    get_latency(): Gst.ClockTime;
+    negotiate(): boolean;
+    peek_next_sample(pad: AggregatorPad): Gst.Sample | null;
+    selected_samples(
+        pts: Gst.ClockTime,
+        dts: Gst.ClockTime,
+        duration: Gst.ClockTime,
+        info?: Gst.Structure | null
+    ): void;
+    set_ignore_inactive_pads(ignore: boolean): void;
+    set_latency(min_latency: Gst.ClockTime, max_latency: Gst.ClockTime): void;
+    set_src_caps(caps: Gst.Caps): void;
+    simple_get_next_time(): Gst.ClockTime;
+    update_segment(segment: Gst.Segment): void;
+    vfunc_aggregate(timeout: boolean): Gst.FlowReturn;
+    vfunc_clip(aggregator_pad: AggregatorPad, buf: Gst.Buffer): Gst.Buffer;
+    vfunc_decide_allocation(query: Gst.Query): boolean;
+    vfunc_finish_buffer(buffer: Gst.Buffer): Gst.FlowReturn;
+    vfunc_finish_buffer_list(bufferlist: Gst.BufferList): Gst.FlowReturn;
+    vfunc_fixate_src_caps(caps: Gst.Caps): Gst.Caps;
+    vfunc_flush(): Gst.FlowReturn;
+    vfunc_get_next_time(): Gst.ClockTime;
+    vfunc_negotiate(): boolean;
+    vfunc_negotiated_src_caps(caps: Gst.Caps): boolean;
+    vfunc_peek_next_sample(aggregator_pad: AggregatorPad): Gst.Sample | null;
+    vfunc_propose_allocation(pad: AggregatorPad, decide_query: Gst.Query, query: Gst.Query): boolean;
+    vfunc_sink_event(aggregator_pad: AggregatorPad, event: Gst.Event): boolean;
+    vfunc_sink_event_pre_queue(aggregator_pad: AggregatorPad, event: Gst.Event): Gst.FlowReturn;
+    vfunc_sink_query(aggregator_pad: AggregatorPad, query: Gst.Query): boolean;
+    vfunc_sink_query_pre_queue(aggregator_pad: AggregatorPad, query: Gst.Query): boolean;
+    vfunc_src_activate(mode: Gst.PadMode, active: boolean): boolean;
+    vfunc_src_event(event: Gst.Event): boolean;
+    vfunc_src_query(query: Gst.Query): boolean;
+    vfunc_start(): boolean;
+    vfunc_stop(): boolean;
+    vfunc_update_src_caps(caps: Gst.Caps): [Gst.FlowReturn, Gst.Caps | null];
+}
+export module AggregatorPad {
+    export interface ConstructorProperties extends Gst.Pad.ConstructorProperties {
+        [key: string]: any;
+        emit_signals: boolean;
+        emitSignals: boolean;
+    }
+}
+export class AggregatorPad extends Gst.Pad {
+    static $gtype: GObject.GType<AggregatorPad>;
+
+    constructor(properties?: Partial<AggregatorPad.ConstructorProperties>, ...args: any[]);
+    _init(properties?: Partial<AggregatorPad.ConstructorProperties>, ...args: any[]): void;
+
+    // Properties
+    get emit_signals(): boolean;
+    set emit_signals(val: boolean);
+    get emitSignals(): boolean;
+    set emitSignals(val: boolean);
+
+    // Fields
+    segment: Gst.Segment;
+
+    // Signals
+
+    connect(id: string, callback: (...args: any[]) => any): number;
+    connect_after(id: string, callback: (...args: any[]) => any): number;
+    emit(id: string, ...args: any[]): void;
+    connect(signal: "buffer-consumed", callback: (_source: this, object: Gst.Buffer) => void): number;
+    connect_after(signal: "buffer-consumed", callback: (_source: this, object: Gst.Buffer) => void): number;
+    emit(signal: "buffer-consumed", object: Gst.Buffer): void;
+
+    // Members
+
+    drop_buffer(): boolean;
+    has_buffer(): boolean;
+    is_eos(): boolean;
+    is_inactive(): boolean;
+    peek_buffer(): Gst.Buffer | null;
+    pop_buffer(): Gst.Buffer | null;
+    vfunc_flush(aggregator: Aggregator): Gst.FlowReturn;
+    vfunc_skip_buffer(aggregator: Aggregator, buffer: Gst.Buffer): boolean;
+}
+export module BaseParse {
+    export interface ConstructorProperties extends Gst.Element.ConstructorProperties {
+        [key: string]: any;
+        disable_passthrough: boolean;
+        disablePassthrough: boolean;
+    }
+}
+export abstract class BaseParse extends Gst.Element {
+    static $gtype: GObject.GType<BaseParse>;
+
+    constructor(properties?: Partial<BaseParse.ConstructorProperties>, ...args: any[]);
+    _init(properties?: Partial<BaseParse.ConstructorProperties>, ...args: any[]): void;
+
+    // Properties
+    get disable_passthrough(): boolean;
+    set disable_passthrough(val: boolean);
+    get disablePassthrough(): boolean;
+    set disablePassthrough(val: boolean);
+
+    // Fields
+    element: Gst.Element;
+    sinkpad: Gst.Pad;
+    srcpad: Gst.Pad;
+    flags: number;
+    segment: Gst.Segment;
+
+    // Members
+
+    add_index_entry(offset: number, ts: Gst.ClockTime, key: boolean, force: boolean): boolean;
+    convert_default(src_format: Gst.Format, src_value: number, dest_format: Gst.Format): [boolean, number];
+    drain(): void;
+    finish_frame(frame: BaseParseFrame, size: number): Gst.FlowReturn;
+    merge_tags(tags: Gst.TagList | null, mode: Gst.TagMergeMode): void;
+    push_frame(frame: BaseParseFrame): Gst.FlowReturn;
+    set_average_bitrate(bitrate: number): void;
+    set_duration(fmt: Gst.Format, duration: number, interval: number): void;
+    set_frame_rate(fps_num: number, fps_den: number, lead_in: number, lead_out: number): void;
+    set_has_timing_info(has_timing: boolean): void;
+    set_infer_ts(infer_ts: boolean): void;
+    set_latency(min_latency: Gst.ClockTime, max_latency: Gst.ClockTime): void;
+    set_min_frame_size(min_size: number): void;
+    set_passthrough(passthrough: boolean): void;
+    set_pts_interpolation(pts_interpolate: boolean): void;
+    set_syncable(syncable: boolean): void;
+    set_ts_at_offset(offset: number): void;
+    vfunc_convert(src_format: Gst.Format, src_value: number, dest_format: Gst.Format, dest_value: number): 
boolean;
+    vfunc_detect(buffer: Gst.Buffer): Gst.FlowReturn;
+    vfunc_get_sink_caps(filter: Gst.Caps): Gst.Caps;
+    vfunc_handle_frame(frame: BaseParseFrame): [Gst.FlowReturn, number];
+    vfunc_pre_push_frame(frame: BaseParseFrame): Gst.FlowReturn;
+    vfunc_set_sink_caps(caps: Gst.Caps): boolean;
+    vfunc_sink_event(event: Gst.Event): boolean;
+    vfunc_sink_query(query: Gst.Query): boolean;
+    vfunc_src_event(event: Gst.Event): boolean;
+    vfunc_src_query(query: Gst.Query): boolean;
+    vfunc_start(): boolean;
+    vfunc_stop(): boolean;
+}
+export module BaseSink {
+    export interface ConstructorProperties extends Gst.Element.ConstructorProperties {
+        [key: string]: any;
+        async: boolean;
+        blocksize: number;
+        enable_last_sample: boolean;
+        enableLastSample: boolean;
+        last_sample: Gst.Sample;
+        lastSample: Gst.Sample;
+        max_bitrate: number;
+        maxBitrate: number;
+        max_lateness: number;
+        maxLateness: number;
+        processing_deadline: number;
+        processingDeadline: number;
+        qos: boolean;
+        render_delay: number;
+        renderDelay: number;
+        stats: Gst.Structure;
+        sync: boolean;
+        throttle_time: number;
+        throttleTime: number;
+        ts_offset: number;
+        tsOffset: number;
+    }
+}
+export abstract class BaseSink extends Gst.Element {
+    static $gtype: GObject.GType<BaseSink>;
+
+    constructor(properties?: Partial<BaseSink.ConstructorProperties>, ...args: any[]);
+    _init(properties?: Partial<BaseSink.ConstructorProperties>, ...args: any[]): void;
+
+    // Properties
+    get async(): boolean;
+    set async(val: boolean);
+    get blocksize(): number;
+    set blocksize(val: number);
+    get enable_last_sample(): boolean;
+    set enable_last_sample(val: boolean);
+    get enableLastSample(): boolean;
+    set enableLastSample(val: boolean);
+    get last_sample(): Gst.Sample;
+    get lastSample(): Gst.Sample;
+    get max_bitrate(): number;
+    set max_bitrate(val: number);
+    get maxBitrate(): number;
+    set maxBitrate(val: number);
+    get max_lateness(): number;
+    set max_lateness(val: number);
+    get maxLateness(): number;
+    set maxLateness(val: number);
+    get processing_deadline(): number;
+    set processing_deadline(val: number);
+    get processingDeadline(): number;
+    set processingDeadline(val: number);
+    get qos(): boolean;
+    set qos(val: boolean);
+    get render_delay(): number;
+    set render_delay(val: number);
+    get renderDelay(): number;
+    set renderDelay(val: number);
+    get stats(): Gst.Structure;
+    get sync(): boolean;
+    set sync(val: boolean);
+    get throttle_time(): number;
+    set throttle_time(val: number);
+    get throttleTime(): number;
+    set throttleTime(val: number);
+    get ts_offset(): number;
+    set ts_offset(val: number);
+    get tsOffset(): number;
+    set tsOffset(val: number);
+
+    // Fields
+    element: Gst.Element;
+    sinkpad: Gst.Pad;
+    pad_mode: Gst.PadMode;
+    offset: number;
+    can_activate_pull: boolean;
+    can_activate_push: boolean;
+    preroll_lock: GLib.Mutex;
+    preroll_cond: GLib.Cond;
+    eos: boolean;
+    need_preroll: boolean;
+    have_preroll: boolean;
+    playing_async: boolean;
+    have_newsegment: boolean;
+    segment: Gst.Segment;
+
+    // Members
+
+    do_preroll(obj: Gst.MiniObject): Gst.FlowReturn;
+    get_blocksize(): number;
+    get_drop_out_of_segment(): boolean;
+    get_last_sample(): Gst.Sample | null;
+    get_latency(): Gst.ClockTime;
+    get_max_bitrate(): number;
+    get_max_lateness(): number;
+    get_processing_deadline(): Gst.ClockTime;
+    get_render_delay(): Gst.ClockTime;
+    get_stats(): Gst.Structure;
+    get_sync(): boolean;
+    get_throttle_time(): number;
+    get_ts_offset(): Gst.ClockTimeDiff;
+    is_async_enabled(): boolean;
+    is_last_sample_enabled(): boolean;
+    is_qos_enabled(): boolean;
+    query_latency(): [boolean, boolean, boolean, Gst.ClockTime | null, Gst.ClockTime | null];
+    set_async_enabled(enabled: boolean): void;
+    set_blocksize(blocksize: number): void;
+    set_drop_out_of_segment(drop_out_of_segment: boolean): void;
+    set_last_sample_enabled(enabled: boolean): void;
+    set_max_bitrate(max_bitrate: number): void;
+    set_max_lateness(max_lateness: number): void;
+    set_processing_deadline(processing_deadline: Gst.ClockTime): void;
+    set_qos_enabled(enabled: boolean): void;
+    set_render_delay(delay: Gst.ClockTime): void;
+    set_sync(sync: boolean): void;
+    set_throttle_time(throttle: number): void;
+    set_ts_offset(offset: Gst.ClockTimeDiff): void;
+    wait(time: Gst.ClockTime): [Gst.FlowReturn, Gst.ClockTimeDiff | null];
+    wait_clock(time: Gst.ClockTime): [Gst.ClockReturn, Gst.ClockTimeDiff | null];
+    wait_preroll(): Gst.FlowReturn;
+    vfunc_activate_pull(active: boolean): boolean;
+    vfunc_event(event: Gst.Event): boolean;
+    vfunc_fixate(caps: Gst.Caps): Gst.Caps;
+    vfunc_get_caps(filter: Gst.Caps): Gst.Caps;
+    vfunc_get_times(buffer: Gst.Buffer, start: Gst.ClockTime, end: Gst.ClockTime): void;
+    vfunc_prepare(buffer: Gst.Buffer): Gst.FlowReturn;
+    vfunc_prepare_list(buffer_list: Gst.BufferList): Gst.FlowReturn;
+    vfunc_preroll(buffer: Gst.Buffer): Gst.FlowReturn;
+    vfunc_propose_allocation(query: Gst.Query): boolean;
+    vfunc_query(query: Gst.Query): boolean;
+    vfunc_render(buffer: Gst.Buffer): Gst.FlowReturn;
+    vfunc_render_list(buffer_list: Gst.BufferList): Gst.FlowReturn;
+    vfunc_set_caps(caps: Gst.Caps): boolean;
+    vfunc_start(): boolean;
+    vfunc_stop(): boolean;
+    vfunc_unlock(): boolean;
+    vfunc_unlock_stop(): boolean;
+    vfunc_wait_event(event: Gst.Event): Gst.FlowReturn;
+}
+export module BaseSrc {
+    export interface ConstructorProperties extends Gst.Element.ConstructorProperties {
+        [key: string]: any;
+        blocksize: number;
+        do_timestamp: boolean;
+        doTimestamp: boolean;
+        num_buffers: number;
+        numBuffers: number;
+        typefind: boolean;
+    }
+}
+export abstract class BaseSrc extends Gst.Element {
+    static $gtype: GObject.GType<BaseSrc>;
+
+    constructor(properties?: Partial<BaseSrc.ConstructorProperties>, ...args: any[]);
+    _init(properties?: Partial<BaseSrc.ConstructorProperties>, ...args: any[]): void;
+
+    // Properties
+    get blocksize(): number;
+    set blocksize(val: number);
+    get do_timestamp(): boolean;
+    set do_timestamp(val: boolean);
+    get doTimestamp(): boolean;
+    set doTimestamp(val: boolean);
+    get num_buffers(): number;
+    set num_buffers(val: number);
+    get numBuffers(): number;
+    set numBuffers(val: number);
+    get typefind(): boolean;
+    set typefind(val: boolean);
+
+    // Fields
+    element: Gst.Element;
+    srcpad: Gst.Pad;
+    live_lock: GLib.Mutex;
+    live_cond: GLib.Cond;
+    live_running: boolean;
+    can_activate_push: boolean;
+    random_access: boolean;
+    clock_id: Gst.ClockID;
+    segment: Gst.Segment;
+    need_newsegment: boolean;
+    num_buffers_left: number;
+    running: boolean;
+    pending_seek: Gst.Event;
+    priv: BaseSrcPrivate;
+
+    // Members
+
+    get_allocator(): [Gst.Allocator | null, Gst.AllocationParams | null];
+    get_blocksize(): number;
+    get_buffer_pool(): Gst.BufferPool | null;
+    get_do_timestamp(): boolean;
+    is_async(): boolean;
+    is_live(): boolean;
+    negotiate(): boolean;
+    new_seamless_segment(start: number, stop: number, time: number): boolean;
+    new_segment(segment: Gst.Segment): boolean;
+    query_latency(): [boolean, boolean, Gst.ClockTime | null, Gst.ClockTime | null];
+    set_async(async: boolean): void;
+    set_automatic_eos(automatic_eos: boolean): void;
+    set_blocksize(blocksize: number): void;
+    set_caps(caps: Gst.Caps): boolean;
+    set_do_timestamp(timestamp: boolean): void;
+    set_dynamic_size(dynamic: boolean): void;
+    set_format(format: Gst.Format): void;
+    set_live(live: boolean): void;
+    start_complete(ret: Gst.FlowReturn): void;
+    start_wait(): Gst.FlowReturn;
+    submit_buffer_list(buffer_list: Gst.BufferList): void;
+    wait_playing(): Gst.FlowReturn;
+    vfunc_alloc(offset: number, size: number): [Gst.FlowReturn, Gst.Buffer];
+    vfunc_create(offset: number, size: number, buf: Gst.Buffer): [Gst.FlowReturn, Gst.Buffer];
+    vfunc_decide_allocation(query: Gst.Query): boolean;
+    vfunc_do_seek(segment: Gst.Segment): boolean;
+    vfunc_event(event: Gst.Event): boolean;
+    vfunc_fill(offset: number, size: number, buf: Gst.Buffer): Gst.FlowReturn;
+    vfunc_fixate(caps: Gst.Caps): Gst.Caps;
+    vfunc_get_caps(filter?: Gst.Caps | null): Gst.Caps;
+    vfunc_get_size(): [boolean, number];
+    vfunc_get_times(buffer: Gst.Buffer): [Gst.ClockTime, Gst.ClockTime];
+    vfunc_is_seekable(): boolean;
+    vfunc_negotiate(): boolean;
+    vfunc_prepare_seek_segment(seek: Gst.Event, segment: Gst.Segment): boolean;
+    vfunc_query(query: Gst.Query): boolean;
+    vfunc_set_caps(caps: Gst.Caps): boolean;
+    vfunc_start(): boolean;
+    vfunc_stop(): boolean;
+    vfunc_unlock(): boolean;
+    vfunc_unlock_stop(): boolean;
+}
+export module BaseTransform {
+    export interface ConstructorProperties extends Gst.Element.ConstructorProperties {
+        [key: string]: any;
+        qos: boolean;
+    }
+}
+export abstract class BaseTransform extends Gst.Element {
+    static $gtype: GObject.GType<BaseTransform>;
+
+    constructor(properties?: Partial<BaseTransform.ConstructorProperties>, ...args: any[]);
+    _init(properties?: Partial<BaseTransform.ConstructorProperties>, ...args: any[]): void;
+
+    // Properties
+    get qos(): boolean;
+    set qos(val: boolean);
+
+    // Fields
+    element: Gst.Element;
+    sinkpad: Gst.Pad;
+    srcpad: Gst.Pad;
+    have_segment: boolean;
+    segment: Gst.Segment;
+    queued_buf: Gst.Buffer;
+
+    // Members
+
+    get_allocator(): [Gst.Allocator | null, Gst.AllocationParams | null];
+    get_buffer_pool(): Gst.BufferPool | null;
+    is_in_place(): boolean;
+    is_passthrough(): boolean;
+    is_qos_enabled(): boolean;
+    reconfigure(): boolean;
+    reconfigure_sink(): void;
+    reconfigure_src(): void;
+    set_gap_aware(gap_aware: boolean): void;
+    set_in_place(in_place: boolean): void;
+    set_passthrough(passthrough: boolean): void;
+    set_prefer_passthrough(prefer_passthrough: boolean): void;
+    set_qos_enabled(enabled: boolean): void;
+    update_qos(proportion: number, diff: Gst.ClockTimeDiff, timestamp: Gst.ClockTime): void;
+    update_src_caps(updated_caps: Gst.Caps): boolean;
+    vfunc_accept_caps(direction: Gst.PadDirection, caps: Gst.Caps): boolean;
+    vfunc_before_transform(buffer: Gst.Buffer): void;
+    vfunc_copy_metadata(input: Gst.Buffer, outbuf: Gst.Buffer): boolean;
+    vfunc_decide_allocation(query: Gst.Query): boolean;
+    vfunc_filter_meta(query: Gst.Query, api: GObject.GType, params: Gst.Structure): boolean;
+    vfunc_fixate_caps(direction: Gst.PadDirection, caps: Gst.Caps, othercaps: Gst.Caps): Gst.Caps;
+    vfunc_generate_output(): [Gst.FlowReturn, Gst.Buffer];
+    vfunc_get_unit_size(caps: Gst.Caps): [boolean, number];
+    vfunc_prepare_output_buffer(input: Gst.Buffer): [Gst.FlowReturn, Gst.Buffer];
+    vfunc_propose_allocation(decide_query: Gst.Query, query: Gst.Query): boolean;
+    vfunc_query(direction: Gst.PadDirection, query: Gst.Query): boolean;
+    // Conflicted with Gst.Element.vfunc_query
+    vfunc_query(...args: never[]): any;
+    vfunc_set_caps(incaps: Gst.Caps, outcaps: Gst.Caps): boolean;
+    vfunc_sink_event(event: Gst.Event): boolean;
+    vfunc_src_event(event: Gst.Event): boolean;
+    vfunc_start(): boolean;
+    vfunc_stop(): boolean;
+    vfunc_submit_input_buffer(is_discont: boolean, input: Gst.Buffer): Gst.FlowReturn;
+    vfunc_transform(inbuf: Gst.Buffer, outbuf: Gst.Buffer): Gst.FlowReturn;
+    vfunc_transform_caps(direction: Gst.PadDirection, caps: Gst.Caps, filter: Gst.Caps): Gst.Caps;
+    vfunc_transform_ip(buf: Gst.Buffer): Gst.FlowReturn;
+    vfunc_transform_meta(outbuf: Gst.Buffer, meta: Gst.Meta, inbuf: Gst.Buffer): boolean;
+    vfunc_transform_size(
+        direction: Gst.PadDirection,
+        caps: Gst.Caps,
+        size: number,
+        othercaps: Gst.Caps
+    ): [boolean, number];
+}
+export module CollectPads {
+    export interface ConstructorProperties extends Gst.Object.ConstructorProperties {
+        [key: string]: any;
+    }
+}
+export class CollectPads extends Gst.Object {
+    static $gtype: GObject.GType<CollectPads>;
+
+    constructor(properties?: Partial<CollectPads.ConstructorProperties>, ...args: any[]);
+    _init(properties?: Partial<CollectPads.ConstructorProperties>, ...args: any[]): void;
+
+    // Fields
+    object: Gst.Object;
+    data: CollectData[];
+
+    // Constructors
+
+    static ["new"](): CollectPads;
+
+    // Members
+
+    add_pad(pad: Gst.Pad, size: number, destroy_notify: CollectDataDestroyNotify, lock: boolean): 
CollectData | null;
+    available(): number;
+    clip_running_time(cdata: CollectData, buf: Gst.Buffer, user_data?: any | null): [Gst.FlowReturn, 
Gst.Buffer | null];
+    event_default(data: CollectData, event: Gst.Event, discard: boolean): boolean;
+    flush(data: CollectData, size: number): number;
+    peek(data: CollectData): Gst.Buffer | null;
+    pop(data: CollectData): Gst.Buffer | null;
+    query_default(data: CollectData, query: Gst.Query, discard: boolean): boolean;
+    read_buffer(data: CollectData, size: number): Gst.Buffer | null;
+    remove_pad(pad: Gst.Pad): boolean;
+    set_buffer_function(func: CollectPadsBufferFunction): void;
+    set_clip_function(clipfunc: CollectPadsClipFunction): void;
+    set_compare_function(func: CollectPadsCompareFunction): void;
+    set_event_function(func: CollectPadsEventFunction): void;
+    set_flush_function(func: CollectPadsFlushFunction): void;
+    set_flushing(flushing: boolean): void;
+    set_function(func: CollectPadsFunction): void;
+    set_query_function(func: CollectPadsQueryFunction): void;
+    set_waiting(data: CollectData, waiting: boolean): void;
+    src_event_default(pad: Gst.Pad, event: Gst.Event): boolean;
+    start(): void;
+    stop(): void;
+    take_buffer(data: CollectData, size: number): Gst.Buffer | null;
+}
+export module DataQueue {
+    export interface ConstructorProperties extends GObject.Object.ConstructorProperties {
+        [key: string]: any;
+        current_level_bytes: number;
+        currentLevelBytes: number;
+        current_level_time: number;
+        currentLevelTime: number;
+        current_level_visible: number;
+        currentLevelVisible: number;
+    }
+}
+export class DataQueue extends GObject.Object {
+    static $gtype: GObject.GType<DataQueue>;
+
+    constructor(properties?: Partial<DataQueue.ConstructorProperties>, ...args: any[]);
+    _init(properties?: Partial<DataQueue.ConstructorProperties>, ...args: any[]): void;
+
+    // Properties
+    get current_level_bytes(): number;
+    get currentLevelBytes(): number;
+    get current_level_time(): number;
+    get currentLevelTime(): number;
+    get current_level_visible(): number;
+    get currentLevelVisible(): number;
+
+    // Fields
+    object: GObject.Object;
+
+    // Signals
+
+    connect(id: string, callback: (...args: any[]) => any): number;
+    connect_after(id: string, callback: (...args: any[]) => any): number;
+    emit(id: string, ...args: any[]): void;
+    connect(signal: "empty", callback: (_source: this) => void): number;
+    connect_after(signal: "empty", callback: (_source: this) => void): number;
+    emit(signal: "empty"): void;
+    connect(signal: "full", callback: (_source: this) => void): number;
+    connect_after(signal: "full", callback: (_source: this) => void): number;
+    emit(signal: "full"): void;
+
+    // Members
+
+    vfunc_empty(): void;
+    vfunc_full(): void;
+}
+export module PushSrc {
+    export interface ConstructorProperties extends BaseSrc.ConstructorProperties {
+        [key: string]: any;
+    }
+}
+export class PushSrc extends BaseSrc {
+    static $gtype: GObject.GType<PushSrc>;
+
+    constructor(properties?: Partial<PushSrc.ConstructorProperties>, ...args: any[]);
+    _init(properties?: Partial<PushSrc.ConstructorProperties>, ...args: any[]): void;
+
+    // Members
+
+    vfunc_alloc(): [Gst.FlowReturn, Gst.Buffer];
+    vfunc_create(buf: Gst.Buffer): [Gst.FlowReturn, Gst.Buffer];
+    // Conflicted with GstBase.BaseSrc.vfunc_create
+    vfunc_create(...args: never[]): any;
+    vfunc_fill(buf: Gst.Buffer): Gst.FlowReturn;
+    // Conflicted with GstBase.BaseSrc.vfunc_fill
+    vfunc_fill(...args: never[]): any;
+}
+
+export class AggregatorPadPrivate {
+    static $gtype: GObject.GType<AggregatorPadPrivate>;
+
+    constructor(copy: AggregatorPadPrivate);
+}
+
+export class AggregatorPrivate {
+    static $gtype: GObject.GType<AggregatorPrivate>;
+
+    constructor(copy: AggregatorPrivate);
+}
+
+export class BaseParseFrame {
+    static $gtype: GObject.GType<BaseParseFrame>;
+
+    constructor(buffer: Gst.Buffer, flags: BaseParseFrameFlags, overhead: number);
+    constructor(copy: BaseParseFrame);
+
+    // Fields
+    buffer: Gst.Buffer;
+    out_buffer: Gst.Buffer;
+    flags: number;
+    offset: number;
+    overhead: number;
+
+    // Constructors
+    static ["new"](buffer: Gst.Buffer, flags: BaseParseFrameFlags, overhead: number): BaseParseFrame;
+
+    // Members
+    copy(): BaseParseFrame;
+    free(): void;
+    init(): void;
+}
+
+export class BaseParsePrivate {
+    static $gtype: GObject.GType<BaseParsePrivate>;
+
+    constructor(copy: BaseParsePrivate);
+}
+
+export class BaseSinkPrivate {
+    static $gtype: GObject.GType<BaseSinkPrivate>;
+
+    constructor(copy: BaseSinkPrivate);
+}
+
+export class BaseSrcPrivate {
+    static $gtype: GObject.GType<BaseSrcPrivate>;
+
+    constructor(copy: BaseSrcPrivate);
+}
+
+export class BaseTransformPrivate {
+    static $gtype: GObject.GType<BaseTransformPrivate>;
+
+    constructor(copy: BaseTransformPrivate);
+}
+
+export class BitReader {
+    static $gtype: GObject.GType<BitReader>;
+
+    constructor(copy: BitReader);
+
+    // Fields
+    data: Uint8Array;
+    size: number;
+    "byte": number;
+    bit: number;
+
+    // Members
+    free(): void;
+    get_bits_uint16(nbits: number): [boolean, number];
+    get_bits_uint32(nbits: number): [boolean, number];
+    get_bits_uint64(nbits: number): [boolean, number];
+    get_bits_uint8(nbits: number): [boolean, number];
+    get_pos(): number;
+    get_remaining(): number;
+    get_size(): number;
+    init(data: Uint8Array | string): void;
+    peek_bits_uint16(nbits: number): [boolean, number];
+    peek_bits_uint32(nbits: number): [boolean, number];
+    peek_bits_uint64(nbits: number): [boolean, number];
+    peek_bits_uint8(nbits: number): [boolean, number];
+    set_pos(pos: number): boolean;
+    skip(nbits: number): boolean;
+    skip_to_byte(): boolean;
+}
+
+export class BitWriter {
+    static $gtype: GObject.GType<BitWriter>;
+
+    constructor(
+        properties?: Partial<{
+            data?: number;
+            bit_size?: number;
+        }>
+    );
+    constructor(copy: BitWriter);
+
+    // Fields
+    data: number;
+    bit_size: number;
+
+    // Members
+    align_bytes(trailing_bit: number): boolean;
+    free(): void;
+    free_and_get_buffer(): Gst.Buffer;
+    free_and_get_data(): Uint8Array;
+    get_data(): Uint8Array;
+    get_remaining(): number;
+    get_size(): number;
+    put_bits_uint16(value: number, nbits: number): boolean;
+    put_bits_uint32(value: number, nbits: number): boolean;
+    put_bits_uint64(value: number, nbits: number): boolean;
+    put_bits_uint8(value: number, nbits: number): boolean;
+    put_bytes(data: Uint8Array | string, nbytes: number): boolean;
+    reset(): void;
+    reset_and_get_buffer(): Gst.Buffer;
+    reset_and_get_data(): Uint8Array;
+    set_pos(pos: number): boolean;
+}
+
+export class ByteReader {
+    static $gtype: GObject.GType<ByteReader>;
+
+    constructor(copy: ByteReader);
+
+    // Fields
+    data: Uint8Array;
+    size: number;
+    "byte": number;
+
+    // Members
+    dup_data(): [boolean, Uint8Array];
+    dup_string_utf16(): [boolean, number[]];
+    dup_string_utf32(): [boolean, number[]];
+    dup_string_utf8(): [boolean, string[]];
+    free(): void;
+    get_data(): [boolean, Uint8Array];
+    get_float32_be(): [boolean, number];
+    get_float32_le(): [boolean, number];
+    get_float64_be(): [boolean, number];
+    get_float64_le(): [boolean, number];
+    get_int16_be(): [boolean, number];
+    get_int16_le(): [boolean, number];
+    get_int24_be(): [boolean, number];
+    get_int24_le(): [boolean, number];
+    get_int32_be(): [boolean, number];
+    get_int32_le(): [boolean, number];
+    get_int64_be(): [boolean, number];
+    get_int64_le(): [boolean, number];
+    get_int8(): [boolean, number];
+    get_pos(): number;
+    get_remaining(): number;
+    get_size(): number;
+    get_string_utf8(): [boolean, string[]];
+    get_uint16_be(): [boolean, number];
+    get_uint16_le(): [boolean, number];
+    get_uint24_be(): [boolean, number];
+    get_uint24_le(): [boolean, number];
+    get_uint32_be(): [boolean, number];
+    get_uint32_le(): [boolean, number];
+    get_uint64_be(): [boolean, number];
+    get_uint64_le(): [boolean, number];
+    get_uint8(): [boolean, number];
+    init(data: Uint8Array | string): void;
+    masked_scan_uint32(mask: number, pattern: number, offset: number, size: number): number;
+    masked_scan_uint32_peek(mask: number, pattern: number, offset: number, size: number): [number, number];
+    peek_data(): [boolean, Uint8Array];
+    peek_float32_be(): [boolean, number];
+    peek_float32_le(): [boolean, number];
+    peek_float64_be(): [boolean, number];
+    peek_float64_le(): [boolean, number];
+    peek_int16_be(): [boolean, number];
+    peek_int16_le(): [boolean, number];
+    peek_int24_be(): [boolean, number];
+    peek_int24_le(): [boolean, number];
+    peek_int32_be(): [boolean, number];
+    peek_int32_le(): [boolean, number];
+    peek_int64_be(): [boolean, number];
+    peek_int64_le(): [boolean, number];
+    peek_int8(): [boolean, number];
+    peek_string_utf8(): [boolean, string[]];
+    peek_uint16_be(): [boolean, number];
+    peek_uint16_le(): [boolean, number];
+    peek_uint24_be(): [boolean, number];
+    peek_uint24_le(): [boolean, number];
+    peek_uint32_be(): [boolean, number];
+    peek_uint32_le(): [boolean, number];
+    peek_uint64_be(): [boolean, number];
+    peek_uint64_le(): [boolean, number];
+    peek_uint8(): [boolean, number];
+    set_pos(pos: number): boolean;
+    skip(nbytes: number): boolean;
+    skip_string_utf16(): boolean;
+    skip_string_utf32(): boolean;
+    skip_string_utf8(): boolean;
+}
+
+export class ByteWriter {
+    static $gtype: GObject.GType<ByteWriter>;
+
+    constructor(copy: ByteWriter);
+
+    // Fields
+    parent: ByteReader;
+    alloc_size: number;
+    fixed: boolean;
+    owned: boolean;
+
+    // Members
+    ensure_free_space(size: number): boolean;
+    fill(value: number, size: number): boolean;
+    free(): void;
+    free_and_get_buffer(): Gst.Buffer;
+    free_and_get_data(): number;
+    get_remaining(): number;
+    init(): void;
+    init_with_data(data: Uint8Array | string, initialized: boolean): void;
+    init_with_size(size: number, fixed: boolean): void;
+    put_buffer(buffer: Gst.Buffer, offset: number, size: number): boolean;
+    put_data(data: Uint8Array | string): boolean;
+    put_float32_be(val: number): boolean;
+    put_float32_le(val: number): boolean;
+    put_float64_be(val: number): boolean;
+    put_float64_le(val: number): boolean;
+    put_int16_be(val: number): boolean;
+    put_int16_le(val: number): boolean;
+    put_int24_be(val: number): boolean;
+    put_int24_le(val: number): boolean;
+    put_int32_be(val: number): boolean;
+    put_int32_le(val: number): boolean;
+    put_int64_be(val: number): boolean;
+    put_int64_le(val: number): boolean;
+    put_int8(val: number): boolean;
+    put_string_utf16(data: number[]): boolean;
+    put_string_utf32(data: number[]): boolean;
+    put_string_utf8(data: string): boolean;
+    put_uint16_be(val: number): boolean;
+    put_uint16_le(val: number): boolean;
+    put_uint24_be(val: number): boolean;
+    put_uint24_le(val: number): boolean;
+    put_uint32_be(val: number): boolean;
+    put_uint32_le(val: number): boolean;
+    put_uint64_be(val: number): boolean;
+    put_uint64_le(val: number): boolean;
+    put_uint8(val: number): boolean;
+    reset(): void;
+    reset_and_get_buffer(): Gst.Buffer;
+    reset_and_get_data(): Uint8Array;
+}
+
+export class CollectData {
+    static $gtype: GObject.GType<CollectData>;
+
+    constructor(copy: CollectData);
+
+    // Fields
+    collect: CollectPads;
+    pad: Gst.Pad;
+    buffer: Gst.Buffer;
+    pos: number;
+    segment: Gst.Segment;
+}
+
+export class CollectDataPrivate {
+    static $gtype: GObject.GType<CollectDataPrivate>;
+
+    constructor(copy: CollectDataPrivate);
+}
+
+export class CollectPadsPrivate {
+    static $gtype: GObject.GType<CollectPadsPrivate>;
+
+    constructor(copy: CollectPadsPrivate);
+}
+
+export class DataQueuePrivate {
+    static $gtype: GObject.GType<DataQueuePrivate>;
+
+    constructor(copy: DataQueuePrivate);
+}
+
+export class FlowCombiner {
+    static $gtype: GObject.GType<FlowCombiner>;
+
+    constructor();
+    constructor(properties?: Partial<{}>);
+    constructor(copy: FlowCombiner);
+
+    // Constructors
+    static ["new"](): FlowCombiner;
+
+    // Members
+    add_pad(pad: Gst.Pad): void;
+    clear(): void;
+    free(): void;
+    ref(): FlowCombiner;
+    remove_pad(pad: Gst.Pad): void;
+    reset(): void;
+    unref(): void;
+    update_flow(fret: Gst.FlowReturn): Gst.FlowReturn;
+    update_pad_flow(pad: Gst.Pad, fret: Gst.FlowReturn): Gst.FlowReturn;
+}
diff --git a/types/gstvideo.d.ts b/types/gstvideo.d.ts
new file mode 100644
index 0000000..d9110f1
--- /dev/null
+++ b/types/gstvideo.d.ts
@@ -0,0 +1,2520 @@
+/**
+ * GstVideo 1.0
+ *
+ * Generated from 1.0
+ */
+
+import * as GObject from "gobject";
+import * as GstBase from "gstbase";
+import * as Gst from "gst";
+import * as GLib from "glib";
+
+export const BUFFER_POOL_OPTION_VIDEO_AFFINE_TRANSFORMATION_META: string;
+export const BUFFER_POOL_OPTION_VIDEO_ALIGNMENT: string;
+export const BUFFER_POOL_OPTION_VIDEO_GL_TEXTURE_UPLOAD_META: string;
+export const BUFFER_POOL_OPTION_VIDEO_META: string;
+export const CAPS_FEATURE_FORMAT_INTERLACED: string;
+export const CAPS_FEATURE_META_GST_VIDEO_AFFINE_TRANSFORMATION_META: string;
+export const CAPS_FEATURE_META_GST_VIDEO_GL_TEXTURE_UPLOAD_META: string;
+export const CAPS_FEATURE_META_GST_VIDEO_META: string;
+export const CAPS_FEATURE_META_GST_VIDEO_OVERLAY_COMPOSITION: string;
+export const META_TAG_VIDEO_COLORSPACE_STR: string;
+export const META_TAG_VIDEO_ORIENTATION_STR: string;
+export const META_TAG_VIDEO_SIZE_STR: string;
+export const META_TAG_VIDEO_STR: string;
+export const VIDEO_COLORIMETRY_BT2020: string;
+export const VIDEO_COLORIMETRY_BT2020_10: string;
+export const VIDEO_COLORIMETRY_BT2100_HLG: string;
+export const VIDEO_COLORIMETRY_BT2100_PQ: string;
+export const VIDEO_COLORIMETRY_BT601: string;
+export const VIDEO_COLORIMETRY_BT709: string;
+export const VIDEO_COLORIMETRY_SMPTE240M: string;
+export const VIDEO_COLORIMETRY_SRGB: string;
+export const VIDEO_COMP_A: number;
+export const VIDEO_COMP_B: number;
+export const VIDEO_COMP_G: number;
+export const VIDEO_COMP_INDEX: number;
+export const VIDEO_COMP_PALETTE: number;
+export const VIDEO_COMP_R: number;
+export const VIDEO_COMP_U: number;
+export const VIDEO_COMP_V: number;
+export const VIDEO_COMP_Y: number;
+export const VIDEO_CONVERTER_OPT_ALPHA_MODE: string;
+export const VIDEO_CONVERTER_OPT_ALPHA_VALUE: string;
+export const VIDEO_CONVERTER_OPT_ASYNC_TASKS: string;
+export const VIDEO_CONVERTER_OPT_BORDER_ARGB: string;
+export const VIDEO_CONVERTER_OPT_CHROMA_MODE: string;
+export const VIDEO_CONVERTER_OPT_CHROMA_RESAMPLER_METHOD: string;
+export const VIDEO_CONVERTER_OPT_DEST_HEIGHT: string;
+export const VIDEO_CONVERTER_OPT_DEST_WIDTH: string;
+export const VIDEO_CONVERTER_OPT_DEST_X: string;
+export const VIDEO_CONVERTER_OPT_DEST_Y: string;
+export const VIDEO_CONVERTER_OPT_DITHER_METHOD: string;
+export const VIDEO_CONVERTER_OPT_DITHER_QUANTIZATION: string;
+export const VIDEO_CONVERTER_OPT_FILL_BORDER: string;
+export const VIDEO_CONVERTER_OPT_GAMMA_MODE: string;
+export const VIDEO_CONVERTER_OPT_MATRIX_MODE: string;
+export const VIDEO_CONVERTER_OPT_PRIMARIES_MODE: string;
+export const VIDEO_CONVERTER_OPT_RESAMPLER_METHOD: string;
+export const VIDEO_CONVERTER_OPT_RESAMPLER_TAPS: string;
+export const VIDEO_CONVERTER_OPT_SRC_HEIGHT: string;
+export const VIDEO_CONVERTER_OPT_SRC_WIDTH: string;
+export const VIDEO_CONVERTER_OPT_SRC_X: string;
+export const VIDEO_CONVERTER_OPT_SRC_Y: string;
+export const VIDEO_CONVERTER_OPT_THREADS: string;
+export const VIDEO_DECODER_MAX_ERRORS: number;
+export const VIDEO_DECODER_SINK_NAME: string;
+export const VIDEO_DECODER_SRC_NAME: string;
+export const VIDEO_ENCODER_SINK_NAME: string;
+export const VIDEO_ENCODER_SRC_NAME: string;
+export const VIDEO_FORMATS_ALL: string;
+export const VIDEO_FPS_RANGE: string;
+export const VIDEO_MAX_COMPONENTS: number;
+export const VIDEO_MAX_PLANES: number;
+export const VIDEO_RESAMPLER_OPT_CUBIC_B: string;
+export const VIDEO_RESAMPLER_OPT_CUBIC_C: string;
+export const VIDEO_RESAMPLER_OPT_ENVELOPE: string;
+export const VIDEO_RESAMPLER_OPT_MAX_TAPS: string;
+export const VIDEO_RESAMPLER_OPT_SHARPEN: string;
+export const VIDEO_RESAMPLER_OPT_SHARPNESS: string;
+export const VIDEO_SCALER_OPT_DITHER_METHOD: string;
+export const VIDEO_SIZE_RANGE: string;
+export const VIDEO_TILE_TYPE_MASK: number;
+export const VIDEO_TILE_TYPE_SHIFT: number;
+export const VIDEO_TILE_X_TILES_MASK: number;
+export const VIDEO_TILE_Y_TILES_SHIFT: number;
+export function buffer_add_video_afd_meta(
+    buffer: Gst.Buffer,
+    field: number,
+    spec: VideoAFDSpec,
+    afd: VideoAFDValue
+): VideoAFDMeta;
+export function buffer_add_video_affine_transformation_meta(buffer: Gst.Buffer): 
VideoAffineTransformationMeta;
+export function buffer_add_video_bar_meta(
+    buffer: Gst.Buffer,
+    field: number,
+    is_letterbox: boolean,
+    bar_data1: number,
+    bar_data2: number
+): VideoBarMeta;
+export function buffer_add_video_caption_meta(
+    buffer: Gst.Buffer,
+    caption_type: VideoCaptionType,
+    data: Uint8Array | string
+): VideoCaptionMeta;
+export function buffer_add_video_codec_alpha_meta(buffer: Gst.Buffer, alpha_buffer: Gst.Buffer): 
VideoCodecAlphaMeta;
+export function buffer_add_video_gl_texture_upload_meta(
+    buffer: Gst.Buffer,
+    texture_orientation: VideoGLTextureOrientation,
+    n_textures: number,
+    texture_type: VideoGLTextureType,
+    upload: VideoGLTextureUpload,
+    user_data_copy: GObject.BoxedCopyFunc,
+    user_data_free: GObject.BoxedFreeFunc
+): VideoGLTextureUploadMeta;
+export function buffer_add_video_meta(
+    buffer: Gst.Buffer,
+    flags: VideoFrameFlags,
+    format: VideoFormat,
+    width: number,
+    height: number
+): VideoMeta;
+export function buffer_add_video_meta_full(
+    buffer: Gst.Buffer,
+    flags: VideoFrameFlags,
+    format: VideoFormat,
+    width: number,
+    height: number,
+    n_planes: number,
+    offset: number[],
+    stride: number[]
+): VideoMeta;
+export function buffer_add_video_overlay_composition_meta(
+    buf: Gst.Buffer,
+    comp?: VideoOverlayComposition | null
+): VideoOverlayCompositionMeta;
+export function buffer_add_video_region_of_interest_meta(
+    buffer: Gst.Buffer,
+    roi_type: string,
+    x: number,
+    y: number,
+    w: number,
+    h: number
+): VideoRegionOfInterestMeta;
+export function buffer_add_video_region_of_interest_meta_id(
+    buffer: Gst.Buffer,
+    roi_type: GLib.Quark,
+    x: number,
+    y: number,
+    w: number,
+    h: number
+): VideoRegionOfInterestMeta;
+export function buffer_add_video_time_code_meta(buffer: Gst.Buffer, tc: VideoTimeCode): VideoTimeCodeMeta | 
null;
+export function buffer_add_video_time_code_meta_full(
+    buffer: Gst.Buffer,
+    fps_n: number,
+    fps_d: number,
+    latest_daily_jam: GLib.DateTime,
+    flags: VideoTimeCodeFlags,
+    hours: number,
+    minutes: number,
+    seconds: number,
+    frames: number,
+    field_count: number
+): VideoTimeCodeMeta;
+export function buffer_get_video_meta(buffer: Gst.Buffer): VideoMeta;
+export function buffer_get_video_meta_id(buffer: Gst.Buffer, id: number): VideoMeta;
+export function buffer_get_video_region_of_interest_meta_id(buffer: Gst.Buffer, id: number): 
VideoRegionOfInterestMeta;
+export function buffer_pool_config_get_video_alignment(config: Gst.Structure, align: VideoAlignment): 
boolean;
+export function buffer_pool_config_set_video_alignment(config: Gst.Structure, align: VideoAlignment): void;
+export function is_video_overlay_prepare_window_handle_message(msg: Gst.Message): boolean;
+export function navigation_event_get_type(event: Gst.Event): NavigationEventType;
+export function navigation_event_parse_command(event: Gst.Event): [boolean, NavigationCommand | null];
+export function navigation_event_parse_key_event(event: Gst.Event): [boolean, string];
+export function navigation_event_parse_mouse_button_event(event: Gst.Event): [boolean, number, number, 
number];
+export function navigation_event_parse_mouse_move_event(event: Gst.Event): [boolean, number, number];
+export function navigation_event_parse_mouse_scroll_event(event: Gst.Event): [boolean, number, number, 
number, number];
+export function navigation_message_get_type(message: Gst.Message): NavigationMessageType;
+export function navigation_message_new_angles_changed(
+    src: Gst.Object,
+    cur_angle: number,
+    n_angles: number
+): Gst.Message;
+export function navigation_message_new_commands_changed(src: Gst.Object): Gst.Message;
+export function navigation_message_new_event(src: Gst.Object, event: Gst.Event): Gst.Message;
+export function navigation_message_new_mouse_over(src: Gst.Object, active: boolean): Gst.Message;
+export function navigation_message_parse_angles_changed(message: Gst.Message): [boolean, number, number];
+export function navigation_message_parse_event(message: Gst.Message): [boolean, Gst.Event | null];
+export function navigation_message_parse_mouse_over(message: Gst.Message): [boolean, boolean];
+export function navigation_query_get_type(query: Gst.Query): NavigationQueryType;
+export function navigation_query_new_angles(): Gst.Query;
+export function navigation_query_new_commands(): Gst.Query;
+export function navigation_query_parse_angles(query: Gst.Query): [boolean, number, number];
+export function navigation_query_parse_commands_length(query: Gst.Query): [boolean, number];
+export function navigation_query_parse_commands_nth(query: Gst.Query, nth: number): [boolean, 
NavigationCommand | null];
+export function navigation_query_set_angles(query: Gst.Query, cur_angle: number, n_angles: number): void;
+export function navigation_query_set_commandsv(query: Gst.Query, cmds: NavigationCommand[]): void;
+export function video_afd_meta_api_get_type(): GObject.GType;
+export function video_afd_meta_get_info(): Gst.MetaInfo;
+export function video_affine_transformation_meta_api_get_type(): GObject.GType;
+export function video_affine_transformation_meta_get_info(): Gst.MetaInfo;
+export function video_bar_meta_api_get_type(): GObject.GType;
+export function video_bar_meta_get_info(): Gst.MetaInfo;
+export function video_blend(dest: VideoFrame, src: VideoFrame, x: number, y: number, global_alpha: number): 
boolean;
+export function video_blend_scale_linear_RGBA(
+    src: VideoInfo,
+    src_buffer: Gst.Buffer,
+    dest_height: number,
+    dest_width: number
+): [VideoInfo, Gst.Buffer];
+export function video_calculate_display_ratio(
+    video_width: number,
+    video_height: number,
+    video_par_n: number,
+    video_par_d: number,
+    display_par_n: number,
+    display_par_d: number
+): [boolean, number, number];
+export function video_caption_meta_api_get_type(): GObject.GType;
+export function video_caption_meta_get_info(): Gst.MetaInfo;
+export function video_caption_type_from_caps(caps: Gst.Caps): VideoCaptionType;
+export function video_caption_type_to_caps(type: VideoCaptionType): Gst.Caps;
+export function video_center_rect(src: VideoRectangle, dst: VideoRectangle, scaling: boolean): 
VideoRectangle;
+export function video_chroma_from_string(s: string): VideoChromaSite;
+export function video_chroma_resample(resample: VideoChromaResample, lines: any | null, width: number): void;
+export function video_chroma_site_from_string(s: string): VideoChromaSite;
+export function video_chroma_site_to_string(site: VideoChromaSite): string | null;
+export function video_chroma_to_string(site: VideoChromaSite): string;
+export function video_codec_alpha_meta_api_get_type(): GObject.GType;
+export function video_codec_alpha_meta_get_info(): Gst.MetaInfo;
+export function video_color_matrix_from_iso(value: number): VideoColorMatrix;
+export function video_color_matrix_get_Kr_Kb(matrix: VideoColorMatrix): [boolean, number, number];
+export function video_color_matrix_to_iso(matrix: VideoColorMatrix): number;
+export function video_color_primaries_from_iso(value: number): VideoColorPrimaries;
+export function video_color_primaries_get_info(primaries: VideoColorPrimaries): VideoColorPrimariesInfo;
+export function video_color_primaries_to_iso(primaries: VideoColorPrimaries): number;
+export function video_color_range_offsets(range: VideoColorRange, info: VideoFormatInfo): [number[], 
number[]];
+export function video_color_transfer_decode(func: VideoTransferFunction, val: number): number;
+export function video_color_transfer_encode(func: VideoTransferFunction, val: number): number;
+export function video_convert_sample(sample: Gst.Sample, to_caps: Gst.Caps, timeout: Gst.ClockTime): 
Gst.Sample;
+export function video_convert_sample_async(
+    sample: Gst.Sample,
+    to_caps: Gst.Caps,
+    timeout: Gst.ClockTime,
+    callback: VideoConvertSampleCallback
+): void;
+export function video_crop_meta_api_get_type(): GObject.GType;
+export function video_crop_meta_get_info(): Gst.MetaInfo;
+export function video_event_is_force_key_unit(event: Gst.Event): boolean;
+export function video_event_new_downstream_force_key_unit(
+    timestamp: Gst.ClockTime,
+    stream_time: Gst.ClockTime,
+    running_time: Gst.ClockTime,
+    all_headers: boolean,
+    count: number
+): Gst.Event;
+export function video_event_new_still_frame(in_still: boolean): Gst.Event;
+export function video_event_new_upstream_force_key_unit(
+    running_time: Gst.ClockTime,
+    all_headers: boolean,
+    count: number
+): Gst.Event;
+export function video_event_parse_downstream_force_key_unit(
+    event: Gst.Event
+): [boolean, Gst.ClockTime, Gst.ClockTime, Gst.ClockTime, boolean, number];
+export function video_event_parse_still_frame(event: Gst.Event): [boolean, boolean];
+export function video_event_parse_upstream_force_key_unit(event: Gst.Event): [boolean, Gst.ClockTime, 
boolean, number];
+export function video_field_order_from_string(order: string): VideoFieldOrder;
+export function video_field_order_to_string(order: VideoFieldOrder): string;
+export function video_format_from_fourcc(fourcc: number): VideoFormat;
+export function video_format_from_masks(
+    depth: number,
+    bpp: number,
+    endianness: number,
+    red_mask: number,
+    green_mask: number,
+    blue_mask: number,
+    alpha_mask: number
+): VideoFormat;
+export function video_format_from_string(format: string): VideoFormat;
+export function video_format_get_info(format: VideoFormat): VideoFormatInfo;
+export function video_format_get_palette(format: VideoFormat): [any | null, number];
+export function video_format_to_fourcc(format: VideoFormat): number;
+export function video_format_to_string(format: VideoFormat): string;
+export function video_formats_raw(): VideoFormat[];
+export function video_frame_map(info: VideoInfo, buffer: Gst.Buffer, flags: Gst.MapFlags): [boolean, 
VideoFrame];
+export function video_frame_map_id(
+    info: VideoInfo,
+    buffer: Gst.Buffer,
+    id: number,
+    flags: Gst.MapFlags
+): [boolean, VideoFrame];
+export function video_gl_texture_upload_meta_api_get_type(): GObject.GType;
+export function video_gl_texture_upload_meta_get_info(): Gst.MetaInfo;
+export function video_guess_framerate(duration: Gst.ClockTime): [boolean, number, number];
+export function video_info_from_caps(caps: Gst.Caps): [boolean, VideoInfo];
+export function video_info_init(): VideoInfo;
+export function video_interlace_mode_from_string(mode: string): VideoInterlaceMode;
+export function video_interlace_mode_to_string(mode: VideoInterlaceMode): string;
+export function video_make_raw_caps(formats?: VideoFormat[] | null): Gst.Caps;
+export function video_make_raw_caps_with_features(
+    formats?: VideoFormat[] | null,
+    features?: Gst.CapsFeatures | null
+): Gst.Caps;
+export function video_mastering_display_info_from_string(mastering: string): [boolean, 
VideoMasteringDisplayInfo];
+export function video_meta_api_get_type(): GObject.GType;
+export function video_meta_get_info(): Gst.MetaInfo;
+export function video_meta_transform_scale_get_quark(): GLib.Quark;
+export function video_multiview_get_doubled_height_modes(): unknown;
+export function video_multiview_get_doubled_size_modes(): unknown;
+export function video_multiview_get_doubled_width_modes(): unknown;
+export function video_multiview_get_mono_modes(): unknown;
+export function video_multiview_get_unpacked_modes(): unknown;
+export function video_multiview_guess_half_aspect(
+    mv_mode: VideoMultiviewMode,
+    width: number,
+    height: number,
+    par_n: number,
+    par_d: number
+): boolean;
+export function video_multiview_mode_from_caps_string(caps_mview_mode: string): VideoMultiviewMode;
+export function video_multiview_mode_to_caps_string(mview_mode: VideoMultiviewMode): string;
+export function video_multiview_video_info_change_mode(
+    info: VideoInfo,
+    out_mview_mode: VideoMultiviewMode,
+    out_mview_flags: VideoMultiviewFlags
+): void;
+export function video_orientation_from_tag(taglist: Gst.TagList): [boolean, VideoOrientationMethod];
+export function video_overlay_composition_meta_api_get_type(): GObject.GType;
+export function video_overlay_composition_meta_get_info(): Gst.MetaInfo;
+export function video_overlay_install_properties(oclass: GObject.Object, last_prop_id: number): void;
+export function video_overlay_set_property(
+    object: GObject.Object,
+    last_prop_id: number,
+    property_id: number,
+    value: GObject.Value | any
+): boolean;
+export function video_region_of_interest_meta_api_get_type(): GObject.GType;
+export function video_region_of_interest_meta_get_info(): Gst.MetaInfo;
+export function video_tile_get_index(
+    mode: VideoTileMode,
+    x: number,
+    y: number,
+    x_tiles: number,
+    y_tiles: number
+): number;
+export function video_time_code_meta_api_get_type(): GObject.GType;
+export function video_time_code_meta_get_info(): Gst.MetaInfo;
+export function video_transfer_function_decode(func: VideoTransferFunction, val: number): number;
+export function video_transfer_function_encode(func: VideoTransferFunction, val: number): number;
+export function video_transfer_function_from_iso(value: number): VideoTransferFunction;
+export function video_transfer_function_is_equivalent(
+    from_func: VideoTransferFunction,
+    from_bpp: number,
+    to_func: VideoTransferFunction,
+    to_bpp: number
+): boolean;
+export function video_transfer_function_to_iso(func: VideoTransferFunction): number;
+export type VideoAffineTransformationGetMatrix = (meta: VideoAffineTransformationMeta, matrix: number) => 
boolean;
+export type VideoConvertSampleCallback = (sample: Gst.Sample, error: GLib.Error) => void;
+export type VideoFormatPack = (
+    info: VideoFormatInfo,
+    flags: VideoPackFlags,
+    src: any | null,
+    sstride: number,
+    data: any | null,
+    stride: number,
+    chroma_site: VideoChromaSite,
+    y: number,
+    width: number
+) => void;
+export type VideoFormatUnpack = (
+    info: VideoFormatInfo,
+    flags: VideoPackFlags,
+    dest: any | null,
+    data: any | null,
+    stride: number,
+    x: number,
+    y: number,
+    width: number
+) => void;
+export type VideoGLTextureUpload = (meta: VideoGLTextureUploadMeta, texture_id: number) => boolean;
+
+export namespace ColorBalanceType {
+    export const $gtype: GObject.GType<ColorBalanceType>;
+}
+
+export enum ColorBalanceType {
+    HARDWARE = 0,
+    SOFTWARE = 1,
+}
+
+export namespace NavigationCommand {
+    export const $gtype: GObject.GType<NavigationCommand>;
+}
+
+export enum NavigationCommand {
+    INVALID = 0,
+    MENU1 = 1,
+    MENU2 = 2,
+    MENU3 = 3,
+    MENU4 = 4,
+    MENU5 = 5,
+    MENU6 = 6,
+    MENU7 = 7,
+    LEFT = 20,
+    RIGHT = 21,
+    UP = 22,
+    DOWN = 23,
+    ACTIVATE = 24,
+    PREV_ANGLE = 30,
+    NEXT_ANGLE = 31,
+}
+
+export namespace NavigationEventType {
+    export const $gtype: GObject.GType<NavigationEventType>;
+}
+
+export enum NavigationEventType {
+    INVALID = 0,
+    KEY_PRESS = 1,
+    KEY_RELEASE = 2,
+    MOUSE_BUTTON_PRESS = 3,
+    MOUSE_BUTTON_RELEASE = 4,
+    MOUSE_MOVE = 5,
+    COMMAND = 6,
+    MOUSE_SCROLL = 7,
+}
+
+export namespace NavigationMessageType {
+    export const $gtype: GObject.GType<NavigationMessageType>;
+}
+
+export enum NavigationMessageType {
+    INVALID = 0,
+    MOUSE_OVER = 1,
+    COMMANDS_CHANGED = 2,
+    ANGLES_CHANGED = 3,
+    EVENT = 4,
+}
+
+export namespace NavigationQueryType {
+    export const $gtype: GObject.GType<NavigationQueryType>;
+}
+
+export enum NavigationQueryType {
+    INVALID = 0,
+    COMMANDS = 1,
+    ANGLES = 2,
+}
+
+export namespace VideoAFDSpec {
+    export const $gtype: GObject.GType<VideoAFDSpec>;
+}
+
+export enum VideoAFDSpec {
+    DVB_ETSI = 0,
+    ATSC_A53 = 1,
+    SMPTE_ST2016_1 = 2,
+}
+
+export namespace VideoAFDValue {
+    export const $gtype: GObject.GType<VideoAFDValue>;
+}
+
+export enum VideoAFDValue {
+    UNAVAILABLE = 0,
+    "16_9_TOP_ALIGNED" = 2,
+    "14_9_TOP_ALIGNED" = 3,
+    GREATER_THAN_16_9 = 4,
+    "4_3_FULL_16_9_FULL" = 8,
+    "4_3_FULL_4_3_PILLAR" = 9,
+    "16_9_LETTER_16_9_FULL" = 10,
+    "14_9_LETTER_14_9_PILLAR" = 11,
+    "4_3_FULL_14_9_CENTER" = 13,
+    "16_9_LETTER_14_9_CENTER" = 14,
+    "16_9_LETTER_4_3_CENTER" = 15,
+}
+
+export namespace VideoAlphaMode {
+    export const $gtype: GObject.GType<VideoAlphaMode>;
+}
+
+export enum VideoAlphaMode {
+    COPY = 0,
+    SET = 1,
+    MULT = 2,
+}
+
+export namespace VideoAncillaryDID {
+    export const $gtype: GObject.GType<VideoAncillaryDID>;
+}
+
+export enum VideoAncillaryDID {
+    UNDEFINED = 0,
+    DELETION = 128,
+    HANC_3G_AUDIO_DATA_FIRST = 160,
+    HANC_3G_AUDIO_DATA_LAST = 167,
+    HANC_HDTV_AUDIO_DATA_FIRST = 224,
+    HANC_HDTV_AUDIO_DATA_LAST = 231,
+    HANC_SDTV_AUDIO_DATA_1_FIRST = 236,
+    HANC_SDTV_AUDIO_DATA_1_LAST = 239,
+    CAMERA_POSITION = 240,
+    HANC_ERROR_DETECTION = 244,
+    HANC_SDTV_AUDIO_DATA_2_FIRST = 248,
+    HANC_SDTV_AUDIO_DATA_2_LAST = 255,
+}
+
+export namespace VideoAncillaryDID16 {
+    export const $gtype: GObject.GType<VideoAncillaryDID16>;
+}
+
+export enum VideoAncillaryDID16 {
+    S334_EIA_708 = 24833,
+    S334_EIA_608 = 24834,
+    S2016_3_AFD_BAR = 16645,
+}
+
+export namespace VideoCaptionType {
+    export const $gtype: GObject.GType<VideoCaptionType>;
+}
+
+export enum VideoCaptionType {
+    UNKNOWN = 0,
+    CEA608_RAW = 1,
+    CEA608_S334_1A = 2,
+    CEA708_RAW = 3,
+    CEA708_CDP = 4,
+}
+
+export namespace VideoChromaMethod {
+    export const $gtype: GObject.GType<VideoChromaMethod>;
+}
+
+export enum VideoChromaMethod {
+    NEAREST = 0,
+    LINEAR = 1,
+}
+
+export namespace VideoChromaMode {
+    export const $gtype: GObject.GType<VideoChromaMode>;
+}
+
+export enum VideoChromaMode {
+    FULL = 0,
+    UPSAMPLE_ONLY = 1,
+    DOWNSAMPLE_ONLY = 2,
+    NONE = 3,
+}
+
+export namespace VideoColorMatrix {
+    export const $gtype: GObject.GType<VideoColorMatrix>;
+}
+
+export enum VideoColorMatrix {
+    UNKNOWN = 0,
+    RGB = 1,
+    FCC = 2,
+    BT709 = 3,
+    BT601 = 4,
+    SMPTE240M = 5,
+    BT2020 = 6,
+}
+
+export namespace VideoColorPrimaries {
+    export const $gtype: GObject.GType<VideoColorPrimaries>;
+}
+
+export enum VideoColorPrimaries {
+    UNKNOWN = 0,
+    BT709 = 1,
+    BT470M = 2,
+    BT470BG = 3,
+    SMPTE170M = 4,
+    SMPTE240M = 5,
+    FILM = 6,
+    BT2020 = 7,
+    ADOBERGB = 8,
+    SMPTEST428 = 9,
+    SMPTERP431 = 10,
+    SMPTEEG432 = 11,
+    EBU3213 = 12,
+}
+
+export namespace VideoColorRange {
+    export const $gtype: GObject.GType<VideoColorRange>;
+}
+
+export enum VideoColorRange {
+    UNKNOWN = 0,
+    "0_255" = 1,
+    "16_235" = 2,
+}
+
+export namespace VideoDitherMethod {
+    export const $gtype: GObject.GType<VideoDitherMethod>;
+}
+
+export enum VideoDitherMethod {
+    NONE = 0,
+    VERTERR = 1,
+    FLOYD_STEINBERG = 2,
+    SIERRA_LITE = 3,
+    BAYER = 4,
+}
+
+export namespace VideoFieldOrder {
+    export const $gtype: GObject.GType<VideoFieldOrder>;
+}
+
+export enum VideoFieldOrder {
+    UNKNOWN = 0,
+    TOP_FIELD_FIRST = 1,
+    BOTTOM_FIELD_FIRST = 2,
+}
+
+export namespace VideoFormat {
+    export const $gtype: GObject.GType<VideoFormat>;
+}
+
+export enum VideoFormat {
+    UNKNOWN = 0,
+    ENCODED = 1,
+    I420 = 2,
+    YV12 = 3,
+    YUY2 = 4,
+    UYVY = 5,
+    AYUV = 6,
+    RGBX = 7,
+    BGRX = 8,
+    XRGB = 9,
+    XBGR = 10,
+    RGBA = 11,
+    BGRA = 12,
+    ARGB = 13,
+    ABGR = 14,
+    RGB = 15,
+    BGR = 16,
+    Y41B = 17,
+    Y42B = 18,
+    YVYU = 19,
+    Y444 = 20,
+    V210 = 21,
+    V216 = 22,
+    NV12 = 23,
+    NV21 = 24,
+    GRAY8 = 25,
+    GRAY16_BE = 26,
+    GRAY16_LE = 27,
+    V308 = 28,
+    RGB16 = 29,
+    BGR16 = 30,
+    RGB15 = 31,
+    BGR15 = 32,
+    UYVP = 33,
+    A420 = 34,
+    RGB8P = 35,
+    YUV9 = 36,
+    YVU9 = 37,
+    IYU1 = 38,
+    ARGB64 = 39,
+    AYUV64 = 40,
+    R210 = 41,
+    I420_10BE = 42,
+    I420_10LE = 43,
+    I422_10BE = 44,
+    I422_10LE = 45,
+    Y444_10BE = 46,
+    Y444_10LE = 47,
+    GBR = 48,
+    GBR_10BE = 49,
+    GBR_10LE = 50,
+    NV16 = 51,
+    NV24 = 52,
+    NV12_64Z32 = 53,
+    A420_10BE = 54,
+    A420_10LE = 55,
+    A422_10BE = 56,
+    A422_10LE = 57,
+    A444_10BE = 58,
+    A444_10LE = 59,
+    NV61 = 60,
+    P010_10BE = 61,
+    P010_10LE = 62,
+    IYU2 = 63,
+    VYUY = 64,
+    GBRA = 65,
+    GBRA_10BE = 66,
+    GBRA_10LE = 67,
+    GBR_12BE = 68,
+    GBR_12LE = 69,
+    GBRA_12BE = 70,
+    GBRA_12LE = 71,
+    I420_12BE = 72,
+    I420_12LE = 73,
+    I422_12BE = 74,
+    I422_12LE = 75,
+    Y444_12BE = 76,
+    Y444_12LE = 77,
+    GRAY10_LE32 = 78,
+    NV12_10LE32 = 79,
+    NV16_10LE32 = 80,
+    NV12_10LE40 = 81,
+    Y210 = 82,
+    Y410 = 83,
+    VUYA = 84,
+    BGR10A2_LE = 85,
+    RGB10A2_LE = 86,
+    Y444_16BE = 87,
+    Y444_16LE = 88,
+    P016_BE = 89,
+    P016_LE = 90,
+    P012_BE = 91,
+    P012_LE = 92,
+    Y212_BE = 93,
+    Y212_LE = 94,
+    Y412_BE = 95,
+    Y412_LE = 96,
+    NV12_4L4 = 97,
+    NV12_32L32 = 98,
+    RGBP = 99,
+    BGRP = 100,
+    AV12 = 101,
+    ARGB64_LE = 102,
+    ARGB64_BE = 103,
+    RGBA64_LE = 104,
+    RGBA64_BE = 105,
+    BGRA64_LE = 106,
+    BGRA64_BE = 107,
+    ABGR64_LE = 108,
+    ABGR64_BE = 109,
+}
+
+export namespace VideoGLTextureOrientation {
+    export const $gtype: GObject.GType<VideoGLTextureOrientation>;
+}
+
+export enum VideoGLTextureOrientation {
+    NORMAL_Y_NORMAL = 0,
+    NORMAL_Y_FLIP = 1,
+    FLIP_Y_NORMAL = 2,
+    FLIP_Y_FLIP = 3,
+}
+
+export namespace VideoGLTextureType {
+    export const $gtype: GObject.GType<VideoGLTextureType>;
+}
+
+export enum VideoGLTextureType {
+    LUMINANCE = 0,
+    LUMINANCE_ALPHA = 1,
+    RGB16 = 2,
+    RGB = 3,
+    RGBA = 4,
+    R = 5,
+    RG = 6,
+}
+
+export namespace VideoGammaMode {
+    export const $gtype: GObject.GType<VideoGammaMode>;
+}
+
+export enum VideoGammaMode {
+    NONE = 0,
+    REMAP = 1,
+}
+
+export namespace VideoInterlaceMode {
+    export const $gtype: GObject.GType<VideoInterlaceMode>;
+}
+
+export enum VideoInterlaceMode {
+    PROGRESSIVE = 0,
+    INTERLEAVED = 1,
+    MIXED = 2,
+    FIELDS = 3,
+    ALTERNATE = 4,
+}
+
+export namespace VideoMatrixMode {
+    export const $gtype: GObject.GType<VideoMatrixMode>;
+}
+
+export enum VideoMatrixMode {
+    FULL = 0,
+    INPUT_ONLY = 1,
+    OUTPUT_ONLY = 2,
+    NONE = 3,
+}
+
+export namespace VideoMultiviewFramePacking {
+    export const $gtype: GObject.GType<VideoMultiviewFramePacking>;
+}
+
+export enum VideoMultiviewFramePacking {
+    NONE = -1,
+    MONO = 0,
+    LEFT = 1,
+    RIGHT = 2,
+    SIDE_BY_SIDE = 3,
+    SIDE_BY_SIDE_QUINCUNX = 4,
+    COLUMN_INTERLEAVED = 5,
+    ROW_INTERLEAVED = 6,
+    TOP_BOTTOM = 7,
+    CHECKERBOARD = 8,
+}
+
+export namespace VideoMultiviewMode {
+    export const $gtype: GObject.GType<VideoMultiviewMode>;
+}
+
+export enum VideoMultiviewMode {
+    NONE = -1,
+    MONO = 0,
+    LEFT = 1,
+    RIGHT = 2,
+    SIDE_BY_SIDE = 3,
+    SIDE_BY_SIDE_QUINCUNX = 4,
+    COLUMN_INTERLEAVED = 5,
+    ROW_INTERLEAVED = 6,
+    TOP_BOTTOM = 7,
+    CHECKERBOARD = 8,
+    FRAME_BY_FRAME = 32,
+    MULTIVIEW_FRAME_BY_FRAME = 33,
+    SEPARATED = 34,
+}
+
+export class VideoOrientationMethod {
+    static $gtype: GObject.GType<VideoOrientationMethod>;
+
+    constructor(copy: VideoOrientationMethod);
+
+    // Fields
+    static IDENTITY: number;
+    static "90R": number;
+    static "180": number;
+    static "90L": number;
+    static HORIZ: number;
+    static VERT: number;
+    static UL_LR: number;
+    static UR_LL: number;
+    static AUTO: number;
+    static CUSTOM: number;
+}
+
+export namespace VideoPrimariesMode {
+    export const $gtype: GObject.GType<VideoPrimariesMode>;
+}
+
+export enum VideoPrimariesMode {
+    NONE = 0,
+    MERGE_ONLY = 1,
+    FAST = 2,
+}
+
+export namespace VideoResamplerMethod {
+    export const $gtype: GObject.GType<VideoResamplerMethod>;
+}
+
+export enum VideoResamplerMethod {
+    NEAREST = 0,
+    LINEAR = 1,
+    CUBIC = 2,
+    SINC = 3,
+    LANCZOS = 4,
+}
+
+export namespace VideoTileMode {
+    export const $gtype: GObject.GType<VideoTileMode>;
+}
+
+export enum VideoTileMode {
+    UNKNOWN = 0,
+    ZFLIPZ_2X2 = 65536,
+    LINEAR = 131072,
+}
+
+export namespace VideoTileType {
+    export const $gtype: GObject.GType<VideoTileType>;
+}
+
+export enum VideoTileType {
+    INDEXED = 0,
+}
+
+export namespace VideoTransferFunction {
+    export const $gtype: GObject.GType<VideoTransferFunction>;
+}
+
+export enum VideoTransferFunction {
+    UNKNOWN = 0,
+    GAMMA10 = 1,
+    GAMMA18 = 2,
+    GAMMA20 = 3,
+    GAMMA22 = 4,
+    BT709 = 5,
+    SMPTE240M = 6,
+    SRGB = 7,
+    GAMMA28 = 8,
+    LOG100 = 9,
+    LOG316 = 10,
+    BT2020_12 = 11,
+    ADOBERGB = 12,
+    BT2020_10 = 13,
+    SMPTE2084 = 14,
+    ARIB_STD_B67 = 15,
+    BT601 = 16,
+}
+
+export namespace VideoVBIParserResult {
+    export const $gtype: GObject.GType<VideoVBIParserResult>;
+}
+
+export enum VideoVBIParserResult {
+    DONE = 0,
+    OK = 1,
+    ERROR = 2,
+}
+
+export namespace VideoBufferFlags {
+    export const $gtype: GObject.GType<VideoBufferFlags>;
+}
+
+export enum VideoBufferFlags {
+    INTERLACED = 1048576,
+    TFF = 2097152,
+    RFF = 4194304,
+    ONEFIELD = 8388608,
+    MULTIPLE_VIEW = 16777216,
+    FIRST_IN_BUNDLE = 33554432,
+    TOP_FIELD = 10485760,
+    BOTTOM_FIELD = 8388608,
+    MARKER = 512,
+    LAST = 268435456,
+}
+
+export namespace VideoChromaFlags {
+    export const $gtype: GObject.GType<VideoChromaFlags>;
+}
+
+export enum VideoChromaFlags {
+    NONE = 0,
+    INTERLACED = 1,
+}
+
+export namespace VideoChromaSite {
+    export const $gtype: GObject.GType<VideoChromaSite>;
+}
+
+export enum VideoChromaSite {
+    UNKNOWN = 0,
+    NONE = 1,
+    H_COSITED = 2,
+    V_COSITED = 4,
+    ALT_LINE = 8,
+    COSITED = 6,
+    JPEG = 1,
+    MPEG2 = 2,
+    DV = 14,
+}
+
+export namespace VideoCodecFrameFlags {
+    export const $gtype: GObject.GType<VideoCodecFrameFlags>;
+}
+
+export enum VideoCodecFrameFlags {
+    DECODE_ONLY = 1,
+    SYNC_POINT = 2,
+    FORCE_KEYFRAME = 4,
+    FORCE_KEYFRAME_HEADERS = 8,
+    CORRUPTED = 16,
+}
+
+export namespace VideoDecoderRequestSyncPointFlags {
+    export const $gtype: GObject.GType<VideoDecoderRequestSyncPointFlags>;
+}
+
+export enum VideoDecoderRequestSyncPointFlags {
+    DISCARD_INPUT = 1,
+    CORRUPT_OUTPUT = 2,
+}
+
+export namespace VideoDitherFlags {
+    export const $gtype: GObject.GType<VideoDitherFlags>;
+}
+
+export enum VideoDitherFlags {
+    NONE = 0,
+    INTERLACED = 1,
+    QUANTIZE = 2,
+}
+
+export namespace VideoFlags {
+    export const $gtype: GObject.GType<VideoFlags>;
+}
+
+export enum VideoFlags {
+    NONE = 0,
+    VARIABLE_FPS = 1,
+    PREMULTIPLIED_ALPHA = 2,
+}
+
+export namespace VideoFormatFlags {
+    export const $gtype: GObject.GType<VideoFormatFlags>;
+}
+
+export enum VideoFormatFlags {
+    YUV = 1,
+    RGB = 2,
+    GRAY = 4,
+    ALPHA = 8,
+    LE = 16,
+    PALETTE = 32,
+    COMPLEX = 64,
+    UNPACK = 128,
+    TILED = 256,
+}
+
+export namespace VideoFrameFlags {
+    export const $gtype: GObject.GType<VideoFrameFlags>;
+}
+
+export enum VideoFrameFlags {
+    NONE = 0,
+    INTERLACED = 1,
+    TFF = 2,
+    RFF = 4,
+    ONEFIELD = 8,
+    MULTIPLE_VIEW = 16,
+    FIRST_IN_BUNDLE = 32,
+    TOP_FIELD = 10,
+    BOTTOM_FIELD = 8,
+}
+
+export namespace VideoFrameMapFlags {
+    export const $gtype: GObject.GType<VideoFrameMapFlags>;
+}
+
+export enum VideoFrameMapFlags {
+    NO_REF = 65536,
+    LAST = 16777216,
+}
+
+export namespace VideoMultiviewFlags {
+    export const $gtype: GObject.GType<VideoMultiviewFlags>;
+}
+
+export enum VideoMultiviewFlags {
+    NONE = 0,
+    RIGHT_VIEW_FIRST = 1,
+    LEFT_FLIPPED = 2,
+    LEFT_FLOPPED = 4,
+    RIGHT_FLIPPED = 8,
+    RIGHT_FLOPPED = 16,
+    HALF_ASPECT = 16384,
+    MIXED_MONO = 32768,
+}
+
+export namespace VideoOverlayFormatFlags {
+    export const $gtype: GObject.GType<VideoOverlayFormatFlags>;
+}
+
+export enum VideoOverlayFormatFlags {
+    NONE = 0,
+    PREMULTIPLIED_ALPHA = 1,
+    GLOBAL_ALPHA = 2,
+}
+
+export namespace VideoPackFlags {
+    export const $gtype: GObject.GType<VideoPackFlags>;
+}
+
+export enum VideoPackFlags {
+    NONE = 0,
+    TRUNCATE_RANGE = 1,
+    INTERLACED = 2,
+}
+
+export namespace VideoResamplerFlags {
+    export const $gtype: GObject.GType<VideoResamplerFlags>;
+}
+
+export enum VideoResamplerFlags {
+    NONE = 0,
+    HALF_TAPS = 1,
+}
+
+export namespace VideoScalerFlags {
+    export const $gtype: GObject.GType<VideoScalerFlags>;
+}
+
+export enum VideoScalerFlags {
+    NONE = 0,
+    INTERLACED = 1,
+}
+
+export namespace VideoTimeCodeFlags {
+    export const $gtype: GObject.GType<VideoTimeCodeFlags>;
+}
+
+export enum VideoTimeCodeFlags {
+    NONE = 0,
+    DROP_FRAME = 1,
+    INTERLACED = 2,
+}
+export module ColorBalanceChannel {
+    export interface ConstructorProperties extends GObject.Object.ConstructorProperties {
+        [key: string]: any;
+    }
+}
+export class ColorBalanceChannel extends GObject.Object {
+    static $gtype: GObject.GType<ColorBalanceChannel>;
+
+    constructor(properties?: Partial<ColorBalanceChannel.ConstructorProperties>, ...args: any[]);
+    _init(properties?: Partial<ColorBalanceChannel.ConstructorProperties>, ...args: any[]): void;
+
+    // Fields
+    label: string;
+    min_value: number;
+    max_value: number;
+
+    // Signals
+
+    connect(id: string, callback: (...args: any[]) => any): number;
+    connect_after(id: string, callback: (...args: any[]) => any): number;
+    emit(id: string, ...args: any[]): void;
+    connect(signal: "value-changed", callback: (_source: this, value: number) => void): number;
+    connect_after(signal: "value-changed", callback: (_source: this, value: number) => void): number;
+    emit(signal: "value-changed", value: number): void;
+
+    // Members
+
+    vfunc_value_changed(value: number): void;
+}
+export module VideoAggregator {
+    export interface ConstructorProperties extends GstBase.Aggregator.ConstructorProperties {
+        [key: string]: any;
+    }
+}
+export abstract class VideoAggregator extends GstBase.Aggregator {
+    static $gtype: GObject.GType<VideoAggregator>;
+
+    constructor(properties?: Partial<VideoAggregator.ConstructorProperties>, ...args: any[]);
+    _init(properties?: Partial<VideoAggregator.ConstructorProperties>, ...args: any[]): void;
+
+    // Fields
+    aggregator: GstBase.Aggregator;
+    info: VideoInfo;
+
+    // Members
+
+    get_execution_task_pool(): Gst.TaskPool;
+    vfunc_aggregate_frames(outbuffer: Gst.Buffer): Gst.FlowReturn;
+    vfunc_create_output_buffer(outbuffer: Gst.Buffer): Gst.FlowReturn;
+    vfunc_find_best_format(downstream_caps: Gst.Caps, best_info: VideoInfo, at_least_one_alpha: boolean): 
void;
+    vfunc_update_caps(caps: Gst.Caps): Gst.Caps;
+}
+export module VideoAggregatorConvertPad {
+    export interface ConstructorProperties extends VideoAggregatorPad.ConstructorProperties {
+        [key: string]: any;
+        converter_config: Gst.Structure;
+        converterConfig: Gst.Structure;
+    }
+}
+export class VideoAggregatorConvertPad extends VideoAggregatorPad {
+    static $gtype: GObject.GType<VideoAggregatorConvertPad>;
+
+    constructor(properties?: Partial<VideoAggregatorConvertPad.ConstructorProperties>, ...args: any[]);
+    _init(properties?: Partial<VideoAggregatorConvertPad.ConstructorProperties>, ...args: any[]): void;
+
+    // Properties
+    get converter_config(): Gst.Structure;
+    set converter_config(val: Gst.Structure);
+    get converterConfig(): Gst.Structure;
+    set converterConfig(val: Gst.Structure);
+
+    // Members
+
+    update_conversion_info(): void;
+    vfunc_create_conversion_info(agg: VideoAggregator, conversion_info: VideoInfo): void;
+}
+export module VideoAggregatorPad {
+    export interface ConstructorProperties extends GstBase.AggregatorPad.ConstructorProperties {
+        [key: string]: any;
+        max_last_buffer_repeat: number;
+        maxLastBufferRepeat: number;
+        repeat_after_eos: boolean;
+        repeatAfterEos: boolean;
+        zorder: number;
+    }
+}
+export class VideoAggregatorPad extends GstBase.AggregatorPad {
+    static $gtype: GObject.GType<VideoAggregatorPad>;
+
+    constructor(properties?: Partial<VideoAggregatorPad.ConstructorProperties>, ...args: any[]);
+    _init(properties?: Partial<VideoAggregatorPad.ConstructorProperties>, ...args: any[]): void;
+
+    // Properties
+    get max_last_buffer_repeat(): number;
+    set max_last_buffer_repeat(val: number);
+    get maxLastBufferRepeat(): number;
+    set maxLastBufferRepeat(val: number);
+    get repeat_after_eos(): boolean;
+    set repeat_after_eos(val: boolean);
+    get repeatAfterEos(): boolean;
+    set repeatAfterEos(val: boolean);
+    get zorder(): number;
+    set zorder(val: number);
+
+    // Fields
+    info: VideoInfo;
+
+    // Members
+
+    get_current_buffer(): Gst.Buffer;
+    get_prepared_frame(): VideoFrame;
+    has_current_buffer(): boolean;
+    set_needs_alpha(needs_alpha: boolean): void;
+    vfunc_clean_frame(videoaggregator: VideoAggregator, prepared_frame: VideoFrame): void;
+    vfunc_prepare_frame(videoaggregator: VideoAggregator, buffer: Gst.Buffer, prepared_frame: VideoFrame): 
boolean;
+    vfunc_prepare_frame_finish(videoaggregator: VideoAggregator, prepared_frame: VideoFrame): void;
+    vfunc_prepare_frame_start(videoaggregator: VideoAggregator, buffer: Gst.Buffer, prepared_frame: 
VideoFrame): void;
+    vfunc_update_conversion_info(): void;
+}
+export module VideoAggregatorParallelConvertPad {
+    export interface ConstructorProperties extends VideoAggregatorConvertPad.ConstructorProperties {
+        [key: string]: any;
+    }
+}
+export class VideoAggregatorParallelConvertPad extends VideoAggregatorConvertPad {
+    static $gtype: GObject.GType<VideoAggregatorParallelConvertPad>;
+
+    constructor(properties?: Partial<VideoAggregatorParallelConvertPad.ConstructorProperties>, ...args: 
any[]);
+    _init(properties?: Partial<VideoAggregatorParallelConvertPad.ConstructorProperties>, ...args: any[]): 
void;
+}
+export module VideoBufferPool {
+    export interface ConstructorProperties extends Gst.BufferPool.ConstructorProperties {
+        [key: string]: any;
+    }
+}
+export class VideoBufferPool extends Gst.BufferPool {
+    static $gtype: GObject.GType<VideoBufferPool>;
+
+    constructor(properties?: Partial<VideoBufferPool.ConstructorProperties>, ...args: any[]);
+    _init(properties?: Partial<VideoBufferPool.ConstructorProperties>, ...args: any[]): void;
+
+    // Fields
+    bufferpool: Gst.BufferPool;
+    priv: VideoBufferPoolPrivate;
+
+    // Constructors
+
+    static ["new"](): VideoBufferPool;
+}
+export module VideoDecoder {
+    export interface ConstructorProperties extends Gst.Element.ConstructorProperties {
+        [key: string]: any;
+        automatic_request_sync_point_flags: VideoDecoderRequestSyncPointFlags;
+        automaticRequestSyncPointFlags: VideoDecoderRequestSyncPointFlags;
+        automatic_request_sync_points: boolean;
+        automaticRequestSyncPoints: boolean;
+        discard_corrupted_frames: boolean;
+        discardCorruptedFrames: boolean;
+        max_errors: number;
+        maxErrors: number;
+        min_force_key_unit_interval: number;
+        minForceKeyUnitInterval: number;
+        qos: boolean;
+    }
+}
+export abstract class VideoDecoder extends Gst.Element {
+    static $gtype: GObject.GType<VideoDecoder>;
+
+    constructor(properties?: Partial<VideoDecoder.ConstructorProperties>, ...args: any[]);
+    _init(properties?: Partial<VideoDecoder.ConstructorProperties>, ...args: any[]): void;
+
+    // Properties
+    get automatic_request_sync_point_flags(): VideoDecoderRequestSyncPointFlags;
+    set automatic_request_sync_point_flags(val: VideoDecoderRequestSyncPointFlags);
+    get automaticRequestSyncPointFlags(): VideoDecoderRequestSyncPointFlags;
+    set automaticRequestSyncPointFlags(val: VideoDecoderRequestSyncPointFlags);
+    get automatic_request_sync_points(): boolean;
+    set automatic_request_sync_points(val: boolean);
+    get automaticRequestSyncPoints(): boolean;
+    set automaticRequestSyncPoints(val: boolean);
+    get discard_corrupted_frames(): boolean;
+    set discard_corrupted_frames(val: boolean);
+    get discardCorruptedFrames(): boolean;
+    set discardCorruptedFrames(val: boolean);
+    get max_errors(): number;
+    set max_errors(val: number);
+    get maxErrors(): number;
+    set maxErrors(val: number);
+    get min_force_key_unit_interval(): number;
+    set min_force_key_unit_interval(val: number);
+    get minForceKeyUnitInterval(): number;
+    set minForceKeyUnitInterval(val: number);
+    get qos(): boolean;
+    set qos(val: boolean);
+
+    // Members
+
+    add_to_frame(n_bytes: number): void;
+    allocate_output_buffer(): Gst.Buffer;
+    allocate_output_frame(frame: VideoCodecFrame): Gst.FlowReturn;
+    allocate_output_frame_with_params(frame: VideoCodecFrame, params: Gst.BufferPoolAcquireParams): 
Gst.FlowReturn;
+    drop_frame(frame: VideoCodecFrame): Gst.FlowReturn;
+    drop_subframe(frame: VideoCodecFrame): Gst.FlowReturn;
+    finish_frame(frame: VideoCodecFrame): Gst.FlowReturn;
+    finish_subframe(frame: VideoCodecFrame): Gst.FlowReturn;
+    get_allocator(): [Gst.Allocator | null, Gst.AllocationParams | null];
+    get_buffer_pool(): Gst.BufferPool;
+    get_estimate_rate(): number;
+    get_frame(frame_number: number): VideoCodecFrame;
+    get_frames(): VideoCodecFrame[];
+    get_input_subframe_index(frame: VideoCodecFrame): number;
+    get_latency(): [Gst.ClockTime | null, Gst.ClockTime | null];
+    get_max_decode_time(frame: VideoCodecFrame): Gst.ClockTimeDiff;
+    get_max_errors(): number;
+    get_needs_format(): boolean;
+    get_needs_sync_point(): boolean;
+    get_oldest_frame(): VideoCodecFrame;
+    get_output_state(): VideoCodecState;
+    get_packetized(): boolean;
+    get_pending_frame_size(): number;
+    get_processed_subframe_index(frame: VideoCodecFrame): number;
+    get_qos_proportion(): number;
+    get_subframe_mode(): boolean;
+    have_frame(): Gst.FlowReturn;
+    have_last_subframe(frame: VideoCodecFrame): Gst.FlowReturn;
+    merge_tags(tags: Gst.TagList | null, mode: Gst.TagMergeMode): void;
+    negotiate(): boolean;
+    proxy_getcaps(caps?: Gst.Caps | null, filter?: Gst.Caps | null): Gst.Caps;
+    release_frame(frame: VideoCodecFrame): void;
+    request_sync_point(frame: VideoCodecFrame, flags: VideoDecoderRequestSyncPointFlags): void;
+    set_estimate_rate(enabled: boolean): void;
+    set_interlaced_output_state(
+        fmt: VideoFormat,
+        interlace_mode: VideoInterlaceMode,
+        width: number,
+        height: number,
+        reference?: VideoCodecState | null
+    ): VideoCodecState;
+    set_latency(min_latency: Gst.ClockTime, max_latency: Gst.ClockTime): void;
+    set_max_errors(num: number): void;
+    set_needs_format(enabled: boolean): void;
+    set_needs_sync_point(enabled: boolean): void;
+    set_output_state(
+        fmt: VideoFormat,
+        width: number,
+        height: number,
+        reference?: VideoCodecState | null
+    ): VideoCodecState;
+    set_packetized(packetized: boolean): void;
+    set_subframe_mode(subframe_mode: boolean): void;
+    set_use_default_pad_acceptcaps(use: boolean): void;
+    vfunc_close(): boolean;
+    vfunc_decide_allocation(query: Gst.Query): boolean;
+    vfunc_drain(): Gst.FlowReturn;
+    vfunc_finish(): Gst.FlowReturn;
+    vfunc_flush(): boolean;
+    vfunc_getcaps(filter: Gst.Caps): Gst.Caps;
+    vfunc_handle_frame(frame: VideoCodecFrame): Gst.FlowReturn;
+    vfunc_handle_missing_data(timestamp: Gst.ClockTime, duration: Gst.ClockTime): boolean;
+    vfunc_negotiate(): boolean;
+    vfunc_open(): boolean;
+    vfunc_parse(frame: VideoCodecFrame, adapter: GstBase.Adapter, at_eos: boolean): Gst.FlowReturn;
+    vfunc_propose_allocation(query: Gst.Query): boolean;
+    vfunc_reset(hard: boolean): boolean;
+    vfunc_set_format(state: VideoCodecState): boolean;
+    vfunc_sink_event(event: Gst.Event): boolean;
+    vfunc_sink_query(query: Gst.Query): boolean;
+    vfunc_src_event(event: Gst.Event): boolean;
+    vfunc_src_query(query: Gst.Query): boolean;
+    vfunc_start(): boolean;
+    vfunc_stop(): boolean;
+    vfunc_transform_meta(frame: VideoCodecFrame, meta: Gst.Meta): boolean;
+}
+export module VideoEncoder {
+    export interface ConstructorProperties extends Gst.Element.ConstructorProperties {
+        [key: string]: any;
+        min_force_key_unit_interval: number;
+        minForceKeyUnitInterval: number;
+        qos: boolean;
+    }
+}
+export abstract class VideoEncoder extends Gst.Element implements Gst.Preset {
+    static $gtype: GObject.GType<VideoEncoder>;
+
+    constructor(properties?: Partial<VideoEncoder.ConstructorProperties>, ...args: any[]);
+    _init(properties?: Partial<VideoEncoder.ConstructorProperties>, ...args: any[]): void;
+
+    // Properties
+    get min_force_key_unit_interval(): number;
+    set min_force_key_unit_interval(val: number);
+    get minForceKeyUnitInterval(): number;
+    set minForceKeyUnitInterval(val: number);
+    get qos(): boolean;
+    set qos(val: boolean);
+
+    // Members
+
+    allocate_output_buffer(size: number): Gst.Buffer;
+    allocate_output_frame(frame: VideoCodecFrame, size: number): Gst.FlowReturn;
+    finish_frame(frame: VideoCodecFrame): Gst.FlowReturn;
+    finish_subframe(frame: VideoCodecFrame): Gst.FlowReturn;
+    get_allocator(): [Gst.Allocator | null, Gst.AllocationParams | null];
+    get_frame(frame_number: number): VideoCodecFrame;
+    get_frames(): VideoCodecFrame[];
+    get_latency(): [Gst.ClockTime | null, Gst.ClockTime | null];
+    get_max_encode_time(frame: VideoCodecFrame): Gst.ClockTimeDiff;
+    get_min_force_key_unit_interval(): Gst.ClockTime;
+    get_oldest_frame(): VideoCodecFrame;
+    get_output_state(): VideoCodecState;
+    is_qos_enabled(): boolean;
+    merge_tags(tags: Gst.TagList | null, mode: Gst.TagMergeMode): void;
+    negotiate(): boolean;
+    proxy_getcaps(caps?: Gst.Caps | null, filter?: Gst.Caps | null): Gst.Caps;
+    set_headers(headers: Gst.Buffer[]): void;
+    set_latency(min_latency: Gst.ClockTime, max_latency: Gst.ClockTime): void;
+    set_min_force_key_unit_interval(interval: Gst.ClockTime): void;
+    set_min_pts(min_pts: Gst.ClockTime): void;
+    set_output_state(caps: Gst.Caps, reference?: VideoCodecState | null): VideoCodecState;
+    set_qos_enabled(enabled: boolean): void;
+    vfunc_close(): boolean;
+    vfunc_decide_allocation(query: Gst.Query): boolean;
+    vfunc_finish(): Gst.FlowReturn;
+    vfunc_flush(): boolean;
+    vfunc_getcaps(filter: Gst.Caps): Gst.Caps;
+    vfunc_handle_frame(frame: VideoCodecFrame): Gst.FlowReturn;
+    vfunc_negotiate(): boolean;
+    vfunc_open(): boolean;
+    vfunc_pre_push(frame: VideoCodecFrame): Gst.FlowReturn;
+    vfunc_propose_allocation(query: Gst.Query): boolean;
+    vfunc_reset(hard: boolean): boolean;
+    vfunc_set_format(state: VideoCodecState): boolean;
+    vfunc_sink_event(event: Gst.Event): boolean;
+    vfunc_sink_query(query: Gst.Query): boolean;
+    vfunc_src_event(event: Gst.Event): boolean;
+    vfunc_src_query(query: Gst.Query): boolean;
+    vfunc_start(): boolean;
+    vfunc_stop(): boolean;
+    vfunc_transform_meta(frame: VideoCodecFrame, meta: Gst.Meta): boolean;
+
+    // Implemented Members
+
+    delete_preset(name: string): boolean;
+    get_meta(name: string, tag: string): [boolean, string];
+    get_preset_names(): string[];
+    get_property_names(): string[];
+    is_editable(): boolean;
+    load_preset(name: string): boolean;
+    rename_preset(old_name: string, new_name: string): boolean;
+    save_preset(name: string): boolean;
+    set_meta(name: string, tag: string, value?: string | null): boolean;
+    vfunc_delete_preset(name: string): boolean;
+    vfunc_get_meta(name: string, tag: string): [boolean, string];
+    vfunc_get_preset_names(): string[];
+    vfunc_get_property_names(): string[];
+    vfunc_load_preset(name: string): boolean;
+    vfunc_rename_preset(old_name: string, new_name: string): boolean;
+    vfunc_save_preset(name: string): boolean;
+    vfunc_set_meta(name: string, tag: string, value?: string | null): boolean;
+}
+export module VideoFilter {
+    export interface ConstructorProperties extends GstBase.BaseTransform.ConstructorProperties {
+        [key: string]: any;
+    }
+}
+export abstract class VideoFilter extends GstBase.BaseTransform {
+    static $gtype: GObject.GType<VideoFilter>;
+
+    constructor(properties?: Partial<VideoFilter.ConstructorProperties>, ...args: any[]);
+    _init(properties?: Partial<VideoFilter.ConstructorProperties>, ...args: any[]): void;
+
+    // Fields
+    element: GstBase.BaseTransform;
+    negotiated: boolean;
+    in_info: VideoInfo;
+    out_info: VideoInfo;
+
+    // Members
+
+    vfunc_set_info(incaps: Gst.Caps, in_info: VideoInfo, outcaps: Gst.Caps, out_info: VideoInfo): boolean;
+    vfunc_transform_frame(inframe: VideoFrame, outframe: VideoFrame): Gst.FlowReturn;
+    vfunc_transform_frame_ip(frame: VideoFrame): Gst.FlowReturn;
+}
+export module VideoMultiviewFlagsSet {
+    export interface ConstructorProperties extends Gst.FlagSet.ConstructorProperties {
+        [key: string]: any;
+    }
+}
+export class VideoMultiviewFlagsSet extends Gst.FlagSet {
+    static $gtype: GObject.GType<VideoMultiviewFlagsSet>;
+
+    constructor(properties?: Partial<VideoMultiviewFlagsSet.ConstructorProperties>, ...args: any[]);
+    _init(properties?: Partial<VideoMultiviewFlagsSet.ConstructorProperties>, ...args: any[]): void;
+}
+export module VideoSink {
+    export interface ConstructorProperties extends GstBase.BaseSink.ConstructorProperties {
+        [key: string]: any;
+        show_preroll_frame: boolean;
+        showPrerollFrame: boolean;
+    }
+}
+export class VideoSink extends GstBase.BaseSink {
+    static $gtype: GObject.GType<VideoSink>;
+
+    constructor(properties?: Partial<VideoSink.ConstructorProperties>, ...args: any[]);
+    _init(properties?: Partial<VideoSink.ConstructorProperties>, ...args: any[]): void;
+
+    // Properties
+    get show_preroll_frame(): boolean;
+    set show_preroll_frame(val: boolean);
+    get showPrerollFrame(): boolean;
+    set showPrerollFrame(val: boolean);
+
+    // Fields
+    element: GstBase.BaseSink;
+    width: number;
+    height: number;
+
+    // Members
+
+    vfunc_set_info(caps: Gst.Caps, info: VideoInfo): boolean;
+    vfunc_show_frame(buf: Gst.Buffer): Gst.FlowReturn;
+    static center_rect(src: VideoRectangle, dst: VideoRectangle, scaling: boolean): VideoRectangle;
+}
+
+export class VideoAFDMeta {
+    static $gtype: GObject.GType<VideoAFDMeta>;
+
+    constructor(copy: VideoAFDMeta);
+
+    // Fields
+    meta: Gst.Meta;
+    field: number;
+    spec: VideoAFDSpec;
+    afd: VideoAFDValue;
+
+    // Members
+    static get_info(): Gst.MetaInfo;
+}
+
+export class VideoAffineTransformationMeta {
+    static $gtype: GObject.GType<VideoAffineTransformationMeta>;
+
+    constructor(copy: VideoAffineTransformationMeta);
+
+    // Fields
+    meta: Gst.Meta;
+    matrix: number[];
+
+    // Members
+    apply_matrix(matrix: number[]): void;
+    static get_info(): Gst.MetaInfo;
+}
+
+export class VideoAggregatorConvertPadPrivate {
+    static $gtype: GObject.GType<VideoAggregatorConvertPadPrivate>;
+
+    constructor(copy: VideoAggregatorConvertPadPrivate);
+}
+
+export class VideoAggregatorPadPrivate {
+    static $gtype: GObject.GType<VideoAggregatorPadPrivate>;
+
+    constructor(copy: VideoAggregatorPadPrivate);
+}
+
+export class VideoAggregatorPrivate {
+    static $gtype: GObject.GType<VideoAggregatorPrivate>;
+
+    constructor(copy: VideoAggregatorPrivate);
+}
+
+export class VideoAlignment {
+    static $gtype: GObject.GType<VideoAlignment>;
+
+    constructor(copy: VideoAlignment);
+
+    // Fields
+    padding_top: number;
+    padding_bottom: number;
+    padding_left: number;
+    padding_right: number;
+    stride_align: number[];
+
+    // Members
+    reset(): void;
+}
+
+export class VideoAncillary {
+    static $gtype: GObject.GType<VideoAncillary>;
+
+    constructor(copy: VideoAncillary);
+
+    // Fields
+    DID: number;
+    SDID_block_number: number;
+    data_count: number;
+    data: Uint8Array;
+}
+
+export class VideoBarMeta {
+    static $gtype: GObject.GType<VideoBarMeta>;
+
+    constructor(copy: VideoBarMeta);
+
+    // Fields
+    meta: Gst.Meta;
+    field: number;
+    is_letterbox: boolean;
+    bar_data1: number;
+    bar_data2: number;
+
+    // Members
+    static get_info(): Gst.MetaInfo;
+}
+
+export class VideoBufferPoolPrivate {
+    static $gtype: GObject.GType<VideoBufferPoolPrivate>;
+
+    constructor(copy: VideoBufferPoolPrivate);
+}
+
+export class VideoCaptionMeta {
+    static $gtype: GObject.GType<VideoCaptionMeta>;
+
+    constructor(copy: VideoCaptionMeta);
+
+    // Fields
+    meta: Gst.Meta;
+    caption_type: VideoCaptionType;
+    data: Uint8Array;
+    size: number;
+
+    // Members
+    static get_info(): Gst.MetaInfo;
+}
+
+export class VideoChromaResample {
+    static $gtype: GObject.GType<VideoChromaResample>;
+
+    constructor(copy: VideoChromaResample);
+
+    // Members
+    free(): void;
+    get_info(n_lines: number, offset: number): void;
+}
+
+export class VideoCodecAlphaMeta {
+    static $gtype: GObject.GType<VideoCodecAlphaMeta>;
+
+    constructor(copy: VideoCodecAlphaMeta);
+
+    // Fields
+    meta: Gst.Meta;
+    buffer: Gst.Buffer;
+
+    // Members
+    static get_info(): Gst.MetaInfo;
+}
+
+export class VideoCodecFrame {
+    static $gtype: GObject.GType<VideoCodecFrame>;
+
+    constructor(copy: VideoCodecFrame);
+
+    // Fields
+    system_frame_number: number;
+    dts: Gst.ClockTime;
+    pts: Gst.ClockTime;
+    duration: Gst.ClockTime;
+    distance_from_sync: number;
+    input_buffer: Gst.Buffer;
+    output_buffer: Gst.Buffer;
+    deadline: Gst.ClockTime;
+
+    // Members
+    get_user_data(): any | null;
+    ref(): VideoCodecFrame;
+    set_user_data(notify: GLib.DestroyNotify): void;
+    unref(): void;
+}
+
+export class VideoCodecState {
+    static $gtype: GObject.GType<VideoCodecState>;
+
+    constructor(copy: VideoCodecState);
+
+    // Fields
+    info: VideoInfo;
+    caps: Gst.Caps;
+    codec_data: Gst.Buffer;
+    allocation_caps: Gst.Caps;
+    mastering_display_info: VideoMasteringDisplayInfo;
+    content_light_level: VideoContentLightLevel;
+
+    // Members
+    ref(): VideoCodecState;
+    unref(): void;
+}
+
+export class VideoColorPrimariesInfo {
+    static $gtype: GObject.GType<VideoColorPrimariesInfo>;
+
+    constructor(copy: VideoColorPrimariesInfo);
+
+    // Fields
+    primaries: VideoColorPrimaries;
+    Wx: number;
+    Wy: number;
+    Rx: number;
+    Ry: number;
+    Gx: number;
+    Gy: number;
+    Bx: number;
+    By: number;
+}
+
+export class VideoColorimetry {
+    static $gtype: GObject.GType<VideoColorimetry>;
+
+    constructor(copy: VideoColorimetry);
+
+    // Fields
+    range: VideoColorRange;
+    matrix: VideoColorMatrix;
+    transfer: VideoTransferFunction;
+    primaries: VideoColorPrimaries;
+
+    // Members
+    from_string(color: string): boolean;
+    is_equal(other: VideoColorimetry): boolean;
+    matches(color: string): boolean;
+    to_string(): string | null;
+}
+
+export class VideoContentLightLevel {
+    static $gtype: GObject.GType<VideoContentLightLevel>;
+
+    constructor(
+        properties?: Partial<{
+            max_content_light_level?: number;
+            max_frame_average_light_level?: number;
+        }>
+    );
+    constructor(copy: VideoContentLightLevel);
+
+    // Fields
+    max_content_light_level: number;
+    max_frame_average_light_level: number;
+
+    // Members
+    add_to_caps(caps: Gst.Caps): boolean;
+    from_caps(caps: Gst.Caps): boolean;
+    from_string(level: string): boolean;
+    init(): void;
+    is_equal(other: VideoContentLightLevel): boolean;
+    to_string(): string;
+}
+
+export class VideoConverter {
+    static $gtype: GObject.GType<VideoConverter>;
+
+    constructor(copy: VideoConverter);
+
+    // Members
+    frame(src: VideoFrame, dest: VideoFrame): void;
+    frame_finish(): void;
+    free(): void;
+    get_config(): Gst.Structure;
+    set_config(config: Gst.Structure): boolean;
+}
+
+export class VideoCropMeta {
+    static $gtype: GObject.GType<VideoCropMeta>;
+
+    constructor(copy: VideoCropMeta);
+
+    // Fields
+    meta: Gst.Meta;
+    x: number;
+    y: number;
+    width: number;
+    height: number;
+
+    // Members
+    static get_info(): Gst.MetaInfo;
+}
+
+export class VideoDecoderPrivate {
+    static $gtype: GObject.GType<VideoDecoderPrivate>;
+
+    constructor(copy: VideoDecoderPrivate);
+}
+
+export class VideoDither {
+    static $gtype: GObject.GType<VideoDither>;
+
+    constructor(copy: VideoDither);
+
+    // Members
+    free(): void;
+    line(line: any | null, x: number, y: number, width: number): void;
+}
+
+export class VideoEncoderPrivate {
+    static $gtype: GObject.GType<VideoEncoderPrivate>;
+
+    constructor(copy: VideoEncoderPrivate);
+}
+
+export class VideoFormatInfo {
+    static $gtype: GObject.GType<VideoFormatInfo>;
+
+    constructor(copy: VideoFormatInfo);
+
+    // Fields
+    format: VideoFormat;
+    name: string;
+    description: string;
+    flags: VideoFormatFlags;
+    bits: number;
+    n_components: number;
+    shift: number[];
+    depth: number[];
+    pixel_stride: number[];
+    n_planes: number;
+    plane: number[];
+    poffset: number[];
+    w_sub: number[];
+    h_sub: number[];
+    unpack_format: VideoFormat;
+    unpack_func: VideoFormatUnpack;
+    pack_lines: number;
+    pack_func: VideoFormatPack;
+    tile_mode: VideoTileMode;
+    tile_ws: number;
+    tile_hs: number;
+
+    // Members
+    component(plane: number): number;
+}
+
+export class VideoFrame {
+    static $gtype: GObject.GType<VideoFrame>;
+
+    constructor(copy: VideoFrame);
+
+    // Fields
+    info: VideoInfo;
+    flags: VideoFrameFlags;
+    buffer: Gst.Buffer;
+    meta: any;
+    id: number;
+    data: any[];
+
+    // Members
+    copy(src: VideoFrame): boolean;
+    copy_plane(src: VideoFrame, plane: number): boolean;
+    unmap(): void;
+    static map(info: VideoInfo, buffer: Gst.Buffer, flags: Gst.MapFlags): [boolean, VideoFrame];
+    static map_id(info: VideoInfo, buffer: Gst.Buffer, id: number, flags: Gst.MapFlags): [boolean, 
VideoFrame];
+}
+
+export class VideoGLTextureUploadMeta {
+    static $gtype: GObject.GType<VideoGLTextureUploadMeta>;
+
+    constructor(copy: VideoGLTextureUploadMeta);
+
+    // Fields
+    meta: Gst.Meta;
+    texture_orientation: VideoGLTextureOrientation;
+    n_textures: number;
+    texture_type: VideoGLTextureType[];
+
+    // Members
+    upload(texture_id: number): boolean;
+    static get_info(): Gst.MetaInfo;
+}
+
+export class VideoInfo {
+    static $gtype: GObject.GType<VideoInfo>;
+
+    constructor();
+    constructor(
+        properties?: Partial<{
+            finfo?: VideoFormatInfo;
+            interlace_mode?: VideoInterlaceMode;
+            flags?: VideoFlags;
+            width?: number;
+            height?: number;
+            size?: number;
+            views?: number;
+            chroma_site?: VideoChromaSite;
+            colorimetry?: VideoColorimetry;
+            par_n?: number;
+            par_d?: number;
+            fps_n?: number;
+            fps_d?: number;
+            offset?: number[];
+            stride?: number[];
+        }>
+    );
+    constructor(copy: VideoInfo);
+
+    // Fields
+    finfo: VideoFormatInfo;
+    interlace_mode: VideoInterlaceMode;
+    flags: VideoFlags;
+    width: number;
+    height: number;
+    size: number;
+    views: number;
+    chroma_site: VideoChromaSite;
+    colorimetry: VideoColorimetry;
+    par_n: number;
+    par_d: number;
+    fps_n: number;
+    fps_d: number;
+    offset: number[];
+    stride: number[];
+
+    // Constructors
+    static ["new"](): VideoInfo;
+    static new_from_caps(caps: Gst.Caps): VideoInfo;
+
+    // Members
+    align(align: VideoAlignment): boolean;
+    align_full(align: VideoAlignment): [boolean, number];
+    convert(src_format: Gst.Format, src_value: number, dest_format: Gst.Format): [boolean, number];
+    copy(): VideoInfo;
+    free(): void;
+    is_equal(other: VideoInfo): boolean;
+    set_format(format: VideoFormat, width: number, height: number): boolean;
+    set_interlaced_format(format: VideoFormat, mode: VideoInterlaceMode, width: number, height: number): 
boolean;
+    to_caps(): Gst.Caps;
+    static from_caps(caps: Gst.Caps): [boolean, VideoInfo];
+    static init(): VideoInfo;
+}
+
+export class VideoMasteringDisplayInfo {
+    static $gtype: GObject.GType<VideoMasteringDisplayInfo>;
+
+    constructor(copy: VideoMasteringDisplayInfo);
+
+    // Fields
+    display_primaries: VideoMasteringDisplayInfoCoordinates[];
+    white_point: VideoMasteringDisplayInfoCoordinates;
+    max_display_mastering_luminance: number;
+    min_display_mastering_luminance: number;
+
+    // Members
+    add_to_caps(caps: Gst.Caps): boolean;
+    from_caps(caps: Gst.Caps): boolean;
+    init(): void;
+    is_equal(other: VideoMasteringDisplayInfo): boolean;
+    to_string(): string;
+    static from_string(mastering: string): [boolean, VideoMasteringDisplayInfo];
+}
+
+export class VideoMasteringDisplayInfoCoordinates {
+    static $gtype: GObject.GType<VideoMasteringDisplayInfoCoordinates>;
+
+    constructor(
+        properties?: Partial<{
+            x?: number;
+            y?: number;
+        }>
+    );
+    constructor(copy: VideoMasteringDisplayInfoCoordinates);
+
+    // Fields
+    x: number;
+    y: number;
+}
+
+export class VideoMeta {
+    static $gtype: GObject.GType<VideoMeta>;
+
+    constructor(copy: VideoMeta);
+
+    // Fields
+    meta: Gst.Meta;
+    buffer: Gst.Buffer;
+    flags: VideoFrameFlags;
+    format: VideoFormat;
+    id: number;
+    width: number;
+    height: number;
+    n_planes: number;
+    offset: number[];
+    stride: number[];
+    alignment: VideoAlignment;
+
+    // Members
+    get_plane_height(): [boolean, number[]];
+    get_plane_size(): [boolean, number[]];
+    map(plane: number, info: Gst.MapInfo, flags: Gst.MapFlags): [boolean, any, number];
+    set_alignment(alignment: VideoAlignment): boolean;
+    unmap(plane: number, info: Gst.MapInfo): boolean;
+    static get_info(): Gst.MetaInfo;
+}
+
+export class VideoMetaTransform {
+    static $gtype: GObject.GType<VideoMetaTransform>;
+
+    constructor(copy: VideoMetaTransform);
+
+    // Fields
+    in_info: VideoInfo;
+    out_info: VideoInfo;
+
+    // Members
+    static scale_get_quark(): GLib.Quark;
+}
+
+export class VideoOverlayComposition {
+    static $gtype: GObject.GType<VideoOverlayComposition>;
+
+    constructor(rectangle?: VideoOverlayRectangle | null);
+    constructor(copy: VideoOverlayComposition);
+
+    // Constructors
+    static ["new"](rectangle?: VideoOverlayRectangle | null): VideoOverlayComposition;
+
+    // Members
+    add_rectangle(rectangle: VideoOverlayRectangle): void;
+    blend(video_buf: VideoFrame): boolean;
+    copy(): VideoOverlayComposition;
+    get_rectangle(n: number): VideoOverlayRectangle;
+    get_seqnum(): number;
+    make_writable(): VideoOverlayComposition;
+    n_rectangles(): number;
+}
+
+export class VideoOverlayCompositionMeta {
+    static $gtype: GObject.GType<VideoOverlayCompositionMeta>;
+
+    constructor(copy: VideoOverlayCompositionMeta);
+
+    // Fields
+    meta: Gst.Meta;
+    overlay: VideoOverlayComposition;
+
+    // Members
+    static get_info(): Gst.MetaInfo;
+}
+
+export class VideoOverlayRectangle {
+    static $gtype: GObject.GType<VideoOverlayRectangle>;
+
+    constructor(
+        pixels: Gst.Buffer,
+        render_x: number,
+        render_y: number,
+        render_width: number,
+        render_height: number,
+        flags: VideoOverlayFormatFlags
+    );
+    constructor(copy: VideoOverlayRectangle);
+
+    // Constructors
+    static new_raw(
+        pixels: Gst.Buffer,
+        render_x: number,
+        render_y: number,
+        render_width: number,
+        render_height: number,
+        flags: VideoOverlayFormatFlags
+    ): VideoOverlayRectangle;
+
+    // Members
+    copy(): VideoOverlayRectangle;
+    get_flags(): VideoOverlayFormatFlags;
+    get_global_alpha(): number;
+    get_pixels_argb(flags: VideoOverlayFormatFlags): Gst.Buffer;
+    get_pixels_ayuv(flags: VideoOverlayFormatFlags): Gst.Buffer;
+    get_pixels_raw(flags: VideoOverlayFormatFlags): Gst.Buffer;
+    get_pixels_unscaled_argb(flags: VideoOverlayFormatFlags): Gst.Buffer;
+    get_pixels_unscaled_ayuv(flags: VideoOverlayFormatFlags): Gst.Buffer;
+    get_pixels_unscaled_raw(flags: VideoOverlayFormatFlags): Gst.Buffer;
+    get_render_rectangle(): [boolean, number, number, number, number];
+    get_seqnum(): number;
+    set_global_alpha(global_alpha: number): void;
+    set_render_rectangle(render_x: number, render_y: number, render_width: number, render_height: number): 
void;
+}
+
+export class VideoRectangle {
+    static $gtype: GObject.GType<VideoRectangle>;
+
+    constructor(
+        properties?: Partial<{
+            x?: number;
+            y?: number;
+            w?: number;
+            h?: number;
+        }>
+    );
+    constructor(copy: VideoRectangle);
+
+    // Fields
+    x: number;
+    y: number;
+    w: number;
+    h: number;
+}
+
+export class VideoRegionOfInterestMeta {
+    static $gtype: GObject.GType<VideoRegionOfInterestMeta>;
+
+    constructor(copy: VideoRegionOfInterestMeta);
+
+    // Fields
+    meta: Gst.Meta;
+    roi_type: GLib.Quark;
+    id: number;
+    parent_id: number;
+    x: number;
+    y: number;
+    w: number;
+    h: number;
+    params: any[];
+
+    // Members
+    add_param(s: Gst.Structure): void;
+    get_param(name: string): Gst.Structure | null;
+    static get_info(): Gst.MetaInfo;
+}
+
+export class VideoResampler {
+    static $gtype: GObject.GType<VideoResampler>;
+
+    constructor(
+        properties?: Partial<{
+            in_size?: number;
+            out_size?: number;
+            max_taps?: number;
+            n_phases?: number;
+            offset?: number;
+            phase?: number;
+            n_taps?: number;
+            taps?: number;
+        }>
+    );
+    constructor(copy: VideoResampler);
+
+    // Fields
+    in_size: number;
+    out_size: number;
+    max_taps: number;
+    n_phases: number;
+    offset: number;
+    phase: number;
+    n_taps: number;
+    taps: number;
+
+    // Members
+    clear(): void;
+    init(
+        method: VideoResamplerMethod,
+        flags: VideoResamplerFlags,
+        n_phases: number,
+        n_taps: number,
+        shift: number,
+        in_size: number,
+        out_size: number,
+        options: Gst.Structure
+    ): boolean;
+}
+
+export class VideoScaler {
+    static $gtype: GObject.GType<VideoScaler>;
+
+    constructor(copy: VideoScaler);
+
+    // Members
+    ["2d"](
+        vscale: VideoScaler,
+        format: VideoFormat,
+        src: any | null,
+        src_stride: number,
+        dest: any | null,
+        dest_stride: number,
+        x: number,
+        y: number,
+        width: number,
+        height: number
+    ): void;
+    free(): void;
+    get_coeff(out_offset: number, in_offset: number, n_taps: number): number;
+    get_max_taps(): number;
+    horizontal(format: VideoFormat, src: any | null, dest: any | null, dest_offset: number, width: number): 
void;
+    vertical(format: VideoFormat, src_lines: any | null, dest: any | null, dest_offset: number, width: 
number): void;
+}
+
+export class VideoSinkPrivate {
+    static $gtype: GObject.GType<VideoSinkPrivate>;
+
+    constructor(copy: VideoSinkPrivate);
+}
+
+export class VideoTimeCode {
+    static $gtype: GObject.GType<VideoTimeCode>;
+
+    constructor();
+    constructor(
+        properties?: Partial<{
+            config?: VideoTimeCodeConfig;
+            hours?: number;
+            minutes?: number;
+            seconds?: number;
+            frames?: number;
+            field_count?: number;
+        }>
+    );
+    constructor(copy: VideoTimeCode);
+
+    // Fields
+    config: VideoTimeCodeConfig;
+    hours: number;
+    minutes: number;
+    seconds: number;
+    frames: number;
+    field_count: number;
+
+    // Constructors
+    static ["new"](
+        fps_n: number,
+        fps_d: number,
+        latest_daily_jam: GLib.DateTime,
+        flags: VideoTimeCodeFlags,
+        hours: number,
+        minutes: number,
+        seconds: number,
+        frames: number,
+        field_count: number
+    ): VideoTimeCode;
+    static new_empty(): VideoTimeCode;
+    static new_from_date_time(
+        fps_n: number,
+        fps_d: number,
+        dt: GLib.DateTime,
+        flags: VideoTimeCodeFlags,
+        field_count: number
+    ): VideoTimeCode;
+    static new_from_date_time_full(
+        fps_n: number,
+        fps_d: number,
+        dt: GLib.DateTime,
+        flags: VideoTimeCodeFlags,
+        field_count: number
+    ): VideoTimeCode;
+    static new_from_string(tc_str: string): VideoTimeCode;
+
+    // Members
+    add_frames(frames: number): void;
+    add_interval(tc_inter: VideoTimeCodeInterval): VideoTimeCode | null;
+    clear(): void;
+    compare(tc2: VideoTimeCode): number;
+    copy(): VideoTimeCode;
+    frames_since_daily_jam(): number;
+    free(): void;
+    increment_frame(): void;
+    init(
+        fps_n: number,
+        fps_d: number,
+        latest_daily_jam: GLib.DateTime | null,
+        flags: VideoTimeCodeFlags,
+        hours: number,
+        minutes: number,
+        seconds: number,
+        frames: number,
+        field_count: number
+    ): void;
+    init_from_date_time(
+        fps_n: number,
+        fps_d: number,
+        dt: GLib.DateTime,
+        flags: VideoTimeCodeFlags,
+        field_count: number
+    ): void;
+    init_from_date_time_full(
+        fps_n: number,
+        fps_d: number,
+        dt: GLib.DateTime,
+        flags: VideoTimeCodeFlags,
+        field_count: number
+    ): boolean;
+    is_valid(): boolean;
+    nsec_since_daily_jam(): number;
+    to_date_time(): GLib.DateTime | null;
+    to_string(): string;
+}
+
+export class VideoTimeCodeConfig {
+    static $gtype: GObject.GType<VideoTimeCodeConfig>;
+
+    constructor(copy: VideoTimeCodeConfig);
+
+    // Fields
+    fps_n: number;
+    fps_d: number;
+    flags: VideoTimeCodeFlags;
+    latest_daily_jam: GLib.DateTime;
+}
+
+export class VideoTimeCodeInterval {
+    static $gtype: GObject.GType<VideoTimeCodeInterval>;
+
+    constructor(
+        properties?: Partial<{
+            hours?: number;
+            minutes?: number;
+            seconds?: number;
+            frames?: number;
+        }>
+    );
+    constructor(copy: VideoTimeCodeInterval);
+
+    // Fields
+    hours: number;
+    minutes: number;
+    seconds: number;
+    frames: number;
+
+    // Constructors
+    static ["new"](hours: number, minutes: number, seconds: number, frames: number): VideoTimeCodeInterval;
+    static new_from_string(tc_inter_str: string): VideoTimeCodeInterval;
+
+    // Members
+    clear(): void;
+    copy(): VideoTimeCodeInterval;
+    free(): void;
+    init(hours: number, minutes: number, seconds: number, frames: number): void;
+}
+
+export class VideoTimeCodeMeta {
+    static $gtype: GObject.GType<VideoTimeCodeMeta>;
+
+    constructor(copy: VideoTimeCodeMeta);
+
+    // Fields
+    meta: Gst.Meta;
+    tc: VideoTimeCode;
+
+    // Members
+    static get_info(): Gst.MetaInfo;
+}
+
+export class VideoVBIEncoder {
+    static $gtype: GObject.GType<VideoVBIEncoder>;
+
+    constructor(format: VideoFormat, pixel_width: number);
+    constructor(copy: VideoVBIEncoder);
+
+    // Constructors
+    static ["new"](format: VideoFormat, pixel_width: number): VideoVBIEncoder;
+
+    // Members
+    add_ancillary(composite: boolean, DID: number, SDID_block_number: number, data: Uint8Array | string): 
boolean;
+    copy(): VideoVBIEncoder;
+    free(): void;
+    write_line(data: number): void;
+}
+
+export class VideoVBIParser {
+    static $gtype: GObject.GType<VideoVBIParser>;
+
+    constructor(format: VideoFormat, pixel_width: number);
+    constructor(copy: VideoVBIParser);
+
+    // Constructors
+    static ["new"](format: VideoFormat, pixel_width: number): VideoVBIParser;
+
+    // Members
+    add_line(data: Uint8Array | string): void;
+    copy(): VideoVBIParser;
+    free(): void;
+    get_ancillary(): [VideoVBIParserResult, VideoAncillary];
+}
+
+export interface ColorBalanceNamespace {
+    $gtype: GObject.GType<ColorBalance>;
+    prototype: ColorBalancePrototype;
+}
+export type ColorBalance = ColorBalancePrototype;
+export interface ColorBalancePrototype extends GObject.Object {
+    // Members
+
+    get_balance_type(): ColorBalanceType;
+    get_value(channel: ColorBalanceChannel): number;
+    list_channels(): ColorBalanceChannel[];
+    set_value(channel: ColorBalanceChannel, value: number): void;
+    value_changed(channel: ColorBalanceChannel, value: number): void;
+    vfunc_get_balance_type(): ColorBalanceType;
+    vfunc_get_value(channel: ColorBalanceChannel): number;
+    vfunc_list_channels(): ColorBalanceChannel[];
+    vfunc_set_value(channel: ColorBalanceChannel, value: number): void;
+    vfunc_value_changed(channel: ColorBalanceChannel, value: number): void;
+}
+
+export const ColorBalance: ColorBalanceNamespace;
+
+export interface NavigationNamespace {
+    $gtype: GObject.GType<Navigation>;
+    prototype: NavigationPrototype;
+
+    event_get_type(event: Gst.Event): NavigationEventType;
+    event_parse_command(event: Gst.Event): [boolean, NavigationCommand | null];
+    event_parse_key_event(event: Gst.Event): [boolean, string];
+    event_parse_mouse_button_event(event: Gst.Event): [boolean, number, number, number];
+    event_parse_mouse_move_event(event: Gst.Event): [boolean, number, number];
+    event_parse_mouse_scroll_event(event: Gst.Event): [boolean, number, number, number, number];
+    message_get_type(message: Gst.Message): NavigationMessageType;
+    message_new_angles_changed(src: Gst.Object, cur_angle: number, n_angles: number): Gst.Message;
+    message_new_commands_changed(src: Gst.Object): Gst.Message;
+    message_new_event(src: Gst.Object, event: Gst.Event): Gst.Message;
+    message_new_mouse_over(src: Gst.Object, active: boolean): Gst.Message;
+    message_parse_angles_changed(message: Gst.Message): [boolean, number, number];
+    message_parse_event(message: Gst.Message): [boolean, Gst.Event | null];
+    message_parse_mouse_over(message: Gst.Message): [boolean, boolean];
+    query_get_type(query: Gst.Query): NavigationQueryType;
+    query_new_angles(): Gst.Query;
+    query_new_commands(): Gst.Query;
+    query_parse_angles(query: Gst.Query): [boolean, number, number];
+    query_parse_commands_length(query: Gst.Query): [boolean, number];
+    query_parse_commands_nth(query: Gst.Query, nth: number): [boolean, NavigationCommand | null];
+    query_set_angles(query: Gst.Query, cur_angle: number, n_angles: number): void;
+    query_set_commandsv(query: Gst.Query, cmds: NavigationCommand[]): void;
+}
+export type Navigation = NavigationPrototype;
+export interface NavigationPrototype extends GObject.Object {
+    // Members
+
+    send_command(command: NavigationCommand): void;
+    send_event(structure: Gst.Structure): void;
+    send_key_event(event: string, key: string): void;
+    send_mouse_event(event: string, button: number, x: number, y: number): void;
+    send_mouse_scroll_event(x: number, y: number, delta_x: number, delta_y: number): void;
+    vfunc_send_event(structure: Gst.Structure): void;
+}
+
+export const Navigation: NavigationNamespace;
+
+export interface VideoDirectionNamespace {
+    $gtype: GObject.GType<VideoDirection>;
+    prototype: VideoDirectionPrototype;
+}
+export type VideoDirection = VideoDirectionPrototype;
+export interface VideoDirectionPrototype extends GObject.Object {
+    // Properties
+    video_direction: VideoOrientationMethod;
+    videoDirection: VideoOrientationMethod;
+}
+
+export const VideoDirection: VideoDirectionNamespace;
+
+export interface VideoOrientationNamespace {
+    $gtype: GObject.GType<VideoOrientation>;
+    prototype: VideoOrientationPrototype;
+
+    from_tag(taglist: Gst.TagList): [boolean, VideoOrientationMethod];
+}
+export type VideoOrientation = VideoOrientationPrototype;
+export interface VideoOrientationPrototype extends GObject.Object {
+    // Members
+
+    get_hcenter(): [boolean, number];
+    get_hflip(): [boolean, boolean];
+    get_vcenter(): [boolean, number];
+    get_vflip(): [boolean, boolean];
+    set_hcenter(center: number): boolean;
+    set_hflip(flip: boolean): boolean;
+    set_vcenter(center: number): boolean;
+    set_vflip(flip: boolean): boolean;
+    vfunc_get_hcenter(): [boolean, number];
+    vfunc_get_hflip(): [boolean, boolean];
+    vfunc_get_vcenter(): [boolean, number];
+    vfunc_get_vflip(): [boolean, boolean];
+    vfunc_set_hcenter(center: number): boolean;
+    vfunc_set_hflip(flip: boolean): boolean;
+    vfunc_set_vcenter(center: number): boolean;
+    vfunc_set_vflip(flip: boolean): boolean;
+}
+
+export const VideoOrientation: VideoOrientationNamespace;
+
+export interface VideoOverlayNamespace {
+    $gtype: GObject.GType<VideoOverlay>;
+    prototype: VideoOverlayPrototype;
+
+    install_properties(oclass: GObject.Object, last_prop_id: number): void;
+    // Conflicted with GObject.Object.install_properties
+    install_properties(...args: never[]): any;
+    set_property(
+        object: GObject.Object,
+        last_prop_id: number,
+        property_id: number,
+        value: GObject.Value | any
+    ): boolean;
+}
+export type VideoOverlay = VideoOverlayPrototype;
+export interface VideoOverlayPrototype extends GObject.Object {
+    // Members
+
+    expose(): void;
+    got_window_handle(handle: never): void;
+    handle_events(handle_events: boolean): void;
+    prepare_window_handle(): void;
+    set_render_rectangle(x: number, y: number, width: number, height: number): boolean;
+    set_window_handle(handle: never): void;
+    vfunc_expose(): void;
+    vfunc_handle_events(handle_events: boolean): void;
+    vfunc_set_render_rectangle(x: number, y: number, width: number, height: number): void;
+    vfunc_set_window_handle(handle: never): void;
+}
+
+export const VideoOverlay: VideoOverlayNamespace;


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]