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

Reply via email to