mirror of
https://github.com/langhuihui/monibuca.git
synced 2025-12-24 13:48:04 +08:00
82 lines
1.5 KiB
Go
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
|
|
}
|