I am facing some kind of issues that I am having difficulties to solve. I am 
getting the following error during runtime:
    
    
    Traceback (most recent call last)
    /home/jose/src/VapourSynth.nim/src/filters/modifyframe.nim(9) modifyframe
    /home/jose/src/VapourSynth.nim/src/output.nim(115) Savey4m
    /home/jose/src/VapourSynth.nim/src/output.nim(83) writeY4mFrames
    /home/jose/src/VapourSynth.nim/src/vsframe.nim(114) getFrame
    /home/jose/src/VapourSynth.nim/src/filters/DrawFrame.nim(24) 
DrawFrameGetFrame
    /home/jose/src/VapourSynth.nim/src/filters/kernel.nim(12) apply_kernel
    /home/jose/src/VapourSynth.nim/src/vsframe.nim(184) []
    /home/jose/src/VapourSynth.nim/src/vsframe.nim(166) getPlane
    /home/jose/.choosenim/toolchains/nim-1.0.6/lib/system/gc.nim(439) newObj
    SIGSEGV: Illegal storage access. (Attempt to read from nil?)

The function that is failing is the following:
    
    
    proc getPlane*(frame:ptr VSFrameRef, plane:Natural):Plane =
    if frame == nil:
        raise newException(ValueError, "called with nil pointer")
    let frameFormat = getFrameFormat(frame)
    #echo "FRAME FORMAT------------> ", repr frameFormat
    #echo frameFormat.bytesPerSample
    #let format = frameFormat.toFormat
    if plane > frameFormat.numPlanes-1:
        raise newException(ValueError, "the plane requested is above the number 
of planes available")
    
    let width  = getFrameWidth( frame, plane )
    let height = getFrameHeight( frame, plane )
    let stride = getStride(frame, plane )
    let planeptr = getReadPtr(frame, plane)  # Plane pointer
    let planeptrW = getWritePtr(frame, plane)
    let ssW = if plane > 0: frameFormat.subSamplingW else: 0
    let ssH = if plane > 0: frameFormat.subSamplingH else: 0
    let bytesPerSample = frameFormat.bytesPerSample.int
    # TODO: to deal with bigger bytes per sample
    var rowPointers:seq[ptr UncheckedArray[uint8]]
    newSeq(rowPointers, height)
    let ini = cast[int](planeptrW)
    #echo "INI: ", ini, "    STRIDE: ", stride
    for row in 0..<height:
        #echo "   value: ", ini + row*stride
        rowPointers[row] = cast[ptr UncheckedArray[uint8]]( ini + row * stride )
        #echo "   row: ", row
    echo "ok"
    echo &"Width: {width}   bytesPerSample: {bytesPerSample} "
    #echo bytesPerSample
    let rowSize = width * bytesPerSample
    Plane( width:width,
            height:height,
            idx:plane,
            ptrIniRead:planeptr,
            ptrCurRead:planeptr,
            ptrIniWrite:planeptrW,
            ptrCurWrite:planeptrW,
            rowSize: rowSize,
            stride:stride,
            subSamplingW:ssW,
            subSamplingH:ssH,
            bytesPerSample: bytesPerSample,
            rows:rowPointers )
    
    Run

The function works fine, but after some time it fails when I first use width:
    
    
    echo &"Width: {width}   bytesPerSample: {bytesPerSample} "
    
    Run

surprisingly it doesn't fail when I do:
    
    
    let width  = getFrameWidth( frame, plane )
    
    Run

Just for information, getFrameWidth is defined as:
    
    
    proc getFrameWidth*(frame:ptr VSFrameRef, plane:int):int =
      ## Returns the width of a plane of a given frame, in pixels. The width 
depends on the plane number because of the possible chroma subsampling.
      return API.getFrameWidth(frame, plane.cint).int
    
    Run

which calls a C function defined as:
    
    
    type
      VSAPI* {.bycopy.} = object
        ....
        getFrameWidth*: proc (f: ptr VSFrameRef; plane: cint): cint {.cdecl.}
        ....
    
    Run

(this struct defines the VapourSynth's API; defined by means of c2nim)

Any clue about what I can do?

Reply via email to