You can also just declare your proc in Nim, ensure you have {.push
stackTrace:off.} around it like here:
<https://github.com/mratsim/trace-of-radiance/blob/e928285/trace_of_radiance/io/mp4.nim#L115-L151>
proc MP4E_open(
sequential_mod_flag: cint,
enable_fragmentation: cint,
token: pointer,
write_callback: proc(
offset: int64,
buffer: pointer,
size: csize_t,
token: pointer
): cint{.cdecl, gcsafe.}
): ptr MP4E_mux_t {.minimp4, noDecl.}
## Proc coming from C that needs a callback
# Callback proc declared in Nim
{.push stackTrace: off.}
proc writeToFile(
offset: int64,
buffer: pointer,
size: csize_t,
token: pointer
): cint {.cdecl, gcsafe.} =
let file = cast[File](token)
file.setFilePos(offset)
let bytesWritten = file.writeBuffer(buffer, size)
return cint(bytesWritten.csize_t != size)
{.pop.}
proc initialize*(
self: var MP4Muxer,
file: File,
width, height: int32
) =
doAssert self.muxer.isNil, "Already initialized"
doAssert self.writer.isNil, "Already initialized"
self.muxer = MP4E_open(
sequential_mod_flag = 0,
enable_fragmentation = 0,
token = pointer(file),
write_callback = writeToFile
)
self.writer = cast[typeof self.writer](
c_malloc(csize_t sizeof(mp4_h26x_writer_t))
)
let ok = self.writer.mp4_h26x_write_init(
self.muxer,
width.cint, height.cint,
is_hevc = 0
)
doAssert ok == MP4E_STATUS_OK, "error: mp4_h26x_write_init failed"
Run