Files
monibuca/plugin/mp4/pkg/memory_file.go
2025-02-06 14:47:47 +08:00

82 lines
1.5 KiB
Go

package mp4
import (
"bytes"
"io"
"os"
)
type MemoryFile struct {
*bytes.Buffer
pos int64
}
func NewMemoryFile(buf *bytes.Buffer) *MemoryFile {
if buf == nil {
buf = bytes.NewBuffer(nil)
}
return &MemoryFile{Buffer: buf}
}
func (m *MemoryFile) Seek(offset int64, whence int) (int64, error) {
var newPos int64
switch whence {
case io.SeekStart:
newPos = offset
case io.SeekCurrent:
newPos = m.pos + offset
case io.SeekEnd:
newPos = int64(m.Buffer.Len()) + offset
default:
return 0, os.ErrInvalid
}
if newPos < 0 {
return 0, os.ErrInvalid
}
if newPos > int64(m.Buffer.Len()) {
// Extend buffer if seeking beyond end
m.Buffer.Write(make([]byte, newPos-int64(m.Buffer.Len())))
}
m.pos = newPos
return m.pos, nil
}
func (m *MemoryFile) Read(p []byte) (n int, err error) {
if m.pos >= int64(m.Buffer.Len()) {
return 0, io.EOF
}
n = copy(p, m.Buffer.Bytes()[m.pos:])
m.pos += int64(n)
if n < len(p) {
err = io.EOF
}
return
}
func (m *MemoryFile) Write(p []byte) (n int, err error) {
// If writing beyond current size, extend the buffer
if m.pos > int64(m.Buffer.Len()) {
m.Buffer.Write(make([]byte, m.pos-int64(m.Buffer.Len())))
}
// If writing at the end, use Buffer.Write
if m.pos == int64(m.Buffer.Len()) {
n, err = m.Buffer.Write(p)
m.pos += int64(n)
return
}
// Otherwise, copy data at the current position
n = copy(m.Buffer.Bytes()[m.pos:], p)
if n < len(p) {
// If we need more space, extend the buffer
m.Buffer.Write(p[n:])
n = len(p)
}
m.pos += int64(n)
return
}