Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add ScreenCaptureKit #21

Open
wants to merge 7 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 35 additions & 0 deletions core_media_manual.zig
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
const cv = @import("core_video.zig");

// ------------------------------------------------------------------------------------------------
// Types

pub const TimeValue = i64;
pub const TimeScale = i32;
pub const TimeEpoch = u32;

pub const BlockBufferRef = *BlockBuffer;
pub const BlockBuffer = opaque {};

pub const SampleBufferRef = *SampleBuffer;
pub const SampleBuffer = opaque {
extern fn CMSampleBufferGetDataBuffer(SampleBufferRef) callconv(.C) ?BlockBufferRef;
pub inline fn getDataBuffer(sbuf: *SampleBuffer) ?BlockBufferRef {
return CMSampleBufferGetDataBuffer(sbuf);
}

extern fn CMSampleBufferGetImageBuffer(SampleBufferRef) callconv(.C) ?cv.ImageBufferRef;
pub inline fn getImageBuffer(sbuf: *SampleBuffer) ?cv.ImageBufferRef {
return CMSampleBufferGetImageBuffer(sbuf);
}
};

pub const Time = extern struct {
value: TimeValue,
timescale: TimeScale,
// TODO: need to figure out why the generator doesn't remove "CM" prefix here.
flags: CMTimeFlags,
epoch: TimeEpoch,
};

pub const ClockRef = *OpaqueCMClock;
pub const OpaqueCMClock = extern struct {};
18 changes: 18 additions & 0 deletions core_video_manual.zig
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
// ------------------------------------------------------------------------------------------------
// Types

pub const PixelBufferRef = *PixelBuffer;
pub const PixelBuffer = opaque {
extern fn CVPixelBufferGetBaseAddress(PixelBufferRef) ?*anyopaque;
pub inline fn getBaseAddress(pxl: PixelBufferRef) ?*anyopaque {
return CVPixelBufferGetBaseAddress(pxl);
}

extern fn CVPixelBufferGetBaseAddressOfPlane(PixelBufferRef) ?*anyopaque;
pub inline fn getBaseAddressOfPlane(pxl: PixelBufferRef) ?*anyopaque {
return CVPixelBufferGetBaseAddressOfPlane(pxl);
}
};

pub const ImageBufferRef = *ImageBuffer;
pub const ImageBuffer = opaque {};
43 changes: 43 additions & 0 deletions generator.zig
Original file line number Diff line number Diff line change
Expand Up @@ -2168,6 +2168,40 @@ fn generateAppKit(generator: anytype) !void {
// try generator.addProtocol("NSPreviewRepresentableActivityItem");
}

fn generateScreenCaptureKit(generator: anytype) !void {
generator.namespace = "SC";
generator.allow_methods = &.{};

try generator.addInterface("SCShareableContent");
try generator.addEnum("SCShareableContentStyle");
try generator.addInterface("SCShareableContentInfo");
try generator.addInterface("SCContentFilter");
try generator.addEnum("SCStreamType");
try generator.addEnum("SCCaptureResolutionType");
try generator.addEnum("SCPresenterOverlayAlertSetting");

try generator.addInterface("SCStreamConfiguration");
try generator.addInterface("SCStream");
try generator.addProtocol("SCStreamOutput");
try generator.addEnum("SCStreamOutputType");
try generator.addProtocol("SCStreamDelegate");
try generator.addInterface("SCRunningApplication");
try generator.addInterface("SCDisplay");
try generator.addInterface("SCWindow");
}

fn generateCoreMedia(generator: anytype) !void {
generator.namespace = "CM";
generator.allow_methods = &.{};

try generator.addEnum("CMTimeFlags");
}

fn generateCoreVideo(generator: anytype) !void {
generator.namespace = "CV";
generator.allow_methods = &.{};
}

fn usage() void {
std.log.warn(
\\mach-objc-generator [options]
Expand All @@ -2184,6 +2218,9 @@ const Framework = enum {
avf_audio,
core_midi,
app_kit,
screen_capture_kit,
core_media,
core_video,
};

pub fn main() anyerror!void {
Expand All @@ -2209,6 +2246,9 @@ pub fn main() anyerror!void {
if (std.mem.eql(u8, args[i], "AVFAudio")) break :blk .avf_audio;
if (std.mem.eql(u8, args[i], "CoreMIDI")) break :blk .core_midi;
if (std.mem.eql(u8, args[i], "AppKit")) break :blk .app_kit;
if (std.mem.eql(u8, args[i], "ScreenCaptureKit")) break :blk .screen_capture_kit;
if (std.mem.eql(u8, args[i], "CoreMedia")) break :blk .core_media;
if (std.mem.eql(u8, args[i], "CoreVideo")) break :blk .core_video;
usage();
std.process.exit(1);
};
Expand Down Expand Up @@ -2260,6 +2300,9 @@ pub fn main() anyerror!void {
.avf_audio => try generateAVFAudio(&generator),
.core_midi => try generateCoreMIDI(&generator),
.app_kit => try generateAppKit(&generator),
.screen_capture_kit => try generateScreenCaptureKit(&generator),
.core_media => try generateCoreMedia(&generator),
.core_video => try generateCoreVideo(&generator),
}
try generator.generate();
}
Expand Down
13 changes: 13 additions & 0 deletions screen_capture_kit_manual.zig
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
const cf = @import("core_foundation.zig");
const pid_t = @import("std").os.posix.pid_t;
const cm = @import("core_media.zig");
const ns = @import("foundation.zig");
const cg = @import("core_graphics.zig");
const objc = @import("objc.zig");

const size_t = usize;
const OSType = [4]u8;
const CMTime = cm.Time;
const CMClockRef = cm.ClockRef;
pub const CMSampleBufferRef = cm.SampleBufferRef;
pub const dispatch_queue_t = *anyopaque;
43 changes: 43 additions & 0 deletions src/core_media.zig
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
const cv = @import("core_video.zig");

// ------------------------------------------------------------------------------------------------
// Types

pub const TimeValue = i64;
pub const TimeScale = i32;
pub const TimeEpoch = u32;

pub const BlockBufferRef = *BlockBuffer;
pub const BlockBuffer = opaque {};

pub const SampleBufferRef = *SampleBuffer;
pub const SampleBuffer = opaque {
extern fn CMSampleBufferGetDataBuffer(SampleBufferRef) callconv(.C) ?BlockBufferRef;
pub inline fn getDataBuffer(sbuf: *SampleBuffer) ?BlockBufferRef {
return CMSampleBufferGetDataBuffer(sbuf);
}

extern fn CMSampleBufferGetImageBuffer(SampleBufferRef) callconv(.C) ?cv.ImageBufferRef;
pub inline fn getImageBuffer(sbuf: *SampleBuffer) ?cv.ImageBufferRef {
return CMSampleBufferGetImageBuffer(sbuf);
}
};

pub const Time = extern struct {
value: TimeValue,
timescale: TimeScale,
// TODO: need to figure out why the generator doesn't remove "CM" prefix here.
flags: CMTimeFlags,
epoch: TimeEpoch,
};

pub const ClockRef = *OpaqueCMClock;
pub const OpaqueCMClock = extern struct {};

pub const CMTimeFlags = u32;
pub const kCMTimeFlags_Valid: CMTimeFlags = 1;
pub const kCMTimeFlags_HasBeenRounded: CMTimeFlags = 2;
pub const kCMTimeFlags_PositiveInfinity: CMTimeFlags = 4;
pub const kCMTimeFlags_NegativeInfinity: CMTimeFlags = 8;
pub const kCMTimeFlags_Indefinite: CMTimeFlags = 16;
pub const kCMTimeFlags_ImpliedValueFlagsMask: CMTimeFlags = 28;
18 changes: 18 additions & 0 deletions src/core_video.zig
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
// ------------------------------------------------------------------------------------------------
// Types

pub const PixelBufferRef = *PixelBuffer;
pub const PixelBuffer = opaque {
extern fn CVPixelBufferGetBaseAddress(PixelBufferRef) ?*anyopaque;
pub inline fn getBaseAddress(pxl: PixelBufferRef) ?*anyopaque {
return CVPixelBufferGetBaseAddress(pxl);
}

extern fn CVPixelBufferGetBaseAddressOfPlane(PixelBufferRef) ?*anyopaque;
pub inline fn getBaseAddressOfPlane(pxl: PixelBufferRef) ?*anyopaque {
return CVPixelBufferGetBaseAddressOfPlane(pxl);
}
};

pub const ImageBufferRef = *ImageBuffer;
pub const ImageBuffer = opaque {};
2 changes: 1 addition & 1 deletion src/foundation.zig
Original file line number Diff line number Diff line change
Expand Up @@ -165,7 +165,7 @@ pub const Range = extern struct {

pub fn Array(comptime ObjectType: type) type {
return opaque {
pub const InternalInfo = objc.ExternClass("NSArray", @This(), ObjectInterface, .{Copying});
pub const InternalInfo = objc.ExternClass("NSArray", @This(), ObjectInterface, &.{Copying});
pub const as = InternalInfo.as;
pub const retain = InternalInfo.retain;
pub const release = InternalInfo.release;
Expand Down
3 changes: 3 additions & 0 deletions src/main.zig
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,13 @@ pub const objc = @import("objc.zig");
pub const avf_audio = @import("avf_audio.zig");
pub const core_foundation = @import("core_foundation.zig");
pub const core_graphics = @import("core_graphics.zig");
pub const core_media = @import("core_media.zig");
pub const core_video = @import("core_video.zig");
pub const foundation = @import("foundation.zig");
pub const metal = @import("metal.zig");
pub const quartz_core = @import("quartz_core.zig");
pub const app_kit = @import("app_kit.zig");
pub const screen_capture_kit = @import("screen_capture_kit.zig");

pub const mach = struct {
pub const AppDelegate = opaque {
Expand Down
Loading
Loading