FFMpeg custom io vb.net

Апи: vb.net

Public Delegate Function d_avio_alloc_context(ByVal buffer As IntPtr, ByVal buffer_size As Int32, ByVal write_flag As Int32, ByVal opaque As IntPtr, ByVal read_packet As d_av_read_function_callback, ByVal write_packet As d_av_write_function_callback, ByVal seek As d_av_seek_function) As IntPtr
Public Shared avio_alloc_context As d_avio_alloc_context = Nothing

<UnmanagedFunctionPointer(CallingConvention.Cdecl)>
Public Delegate Function d_av_read_function_callback(ByVal opaque As IntPtr, ByVal buf As IntPtr, ByVal bufSize As Int32) As Int32

<UnmanagedFunctionPointer(CallingConvention.Cdecl)>
Public Delegate Function d_av_write_function_callback(ByVal opaque As IntPtr, ByVal buf As IntPtr, ByVal bufSize As Int32) As Int32

<UnmanagedFunctionPointer(CallingConvention.Cdecl)>
Public Delegate Function d_av_seek_function(ByVal opaque As IntPtr, ByVal offset As Int64, ByVal whence As Int32) As Int64

Функция читающая память: vb.net

Private Function Read_Packet(ByVal opaque As IntPtr, ByVal buf As IntPtr, ByVal bufSize As Int32) As Int32

        Dim bd As sBufferdata = New sBufferdata(opaque)

        Dim file_length As Int32 = bd.Lenght
        Dim read_offset As Int32 = bd.Read_Position

        Dim ex_length As Int32 = (file_length - read_offset)

        If (ex_length > 0) Then

            Dim ptr As IntPtr = New IntPtr(bd.Data.ToInt32 + read_offset)

            If (ex_length >= bufSize) Then

                StructureHelper.CopyMemory(buf, ptr, bufSize) 'memcp
                bd.Read_Position = (read_offset + bufSize)

                Return bufSize

            Else

                StructureHelper.CopyMemory(buf, ptr, ex_length) 'memcp
                bd.Read_Position = (read_offset + ex_length)

                Return ex_length

            End If

        Else

            Return -1

        End If

    End Function

Создаю контекст так: vb.net

        Me.io_buffer = Marshal.AllocHGlobal(IO_Buffer_Size) 'Marshal.AllocHGlobal(IO_Buffer_Size)
        Me.io_context = avio_alloc_context.Invoke(Me.io_buffer, IO_Buffer_Size, 0, Me.file.ptr, AddressOf Me.Read_Packet, Nothing, Nothing)

При любых действиях и модификациях получаю "System.AccessViolationException". Однако, если не читать из памяти, а создать из файла проблем нет, нормально конвертирует аудио и видео. Приму любую помощь.


Ответы (0 шт):