Skip to content

Commit

Permalink
add fmp4/seekablebuffer
Browse files Browse the repository at this point in the history
  • Loading branch information
aler9 committed Jan 14, 2024
1 parent 1e7cfdf commit d286fa2
Show file tree
Hide file tree
Showing 7 changed files with 149 additions and 11 deletions.
1 change: 0 additions & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ go 1.19

require (
github.com/abema/go-mp4 v1.1.1
github.com/aler9/writerseeker v1.1.0
github.com/asticode/go-astits v1.13.0
github.com/stretchr/testify v1.8.4
)
Expand Down
2 changes: 0 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
github.com/abema/go-mp4 v1.1.1 h1:OfzkdMO6SWTBR1ltNSVwlTHatrAK9I3iYLQfkdEMMuc=
github.com/abema/go-mp4 v1.1.1/go.mod h1:vPl9t5ZK7K0x68jh12/+ECWBCXoWuIDtNgPtU2f04ws=
github.com/aler9/writerseeker v1.1.0 h1:t+Sm3tjp8scNlqyoa8obpeqwciMNOvdvsxjxEb3Sx3g=
github.com/aler9/writerseeker v1.1.0/go.mod h1:QNCcjSKnLsYoTfMmXkEEfgbz6nNXWxKSaBY+hGJGWDA=
github.com/asticode/go-astikit v0.30.0 h1:DkBkRQRIxYcknlaU7W7ksNfn4gMFsB0tqMJflxkRsZA=
github.com/asticode/go-astikit v0.30.0/go.mod h1:h4ly7idim1tNhaVkdVBeXQZEE3L0xblP7fCWbgwipF0=
github.com/asticode/go-astits v1.13.0 h1:XOgkaadfZODnyZRR5Y0/DWkA9vrkLLPLeeOvDwfKZ1c=
Expand Down
10 changes: 5 additions & 5 deletions pkg/formats/fmp4/init_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@ import (
"bytes"
"testing"

"github.com/aler9/writerseeker"
"github.com/stretchr/testify/require"

"github.com/bluenviron/mediacommon/pkg/codecs/mpeg4audio"
"github.com/bluenviron/mediacommon/pkg/formats/fmp4/seekablebuffer"
)

var testSPS = []byte{
Expand Down Expand Up @@ -2069,8 +2069,8 @@ func TestInitUnmarshalExternal(t *testing.T) {
func TestInitMarshal(t *testing.T) {
for _, ca := range casesInit {
t.Run(ca.name, func(t *testing.T) {
buf := &writerseeker.WriterSeeker{}
err := ca.dec.Marshal(buf)
var buf seekablebuffer.Buffer
err := ca.dec.Marshal(&buf)
require.NoError(t, err)
require.Equal(t, ca.enc, buf.Bytes())
})
Expand Down Expand Up @@ -2120,8 +2120,8 @@ func TestInitMarshalEmptyParameters(t *testing.T) {
}},
}

buf := &writerseeker.WriterSeeker{}
err := i.Marshal(buf)
var buf seekablebuffer.Buffer
err := i.Marshal(&buf)
require.Error(t, err)
})
}
Expand Down
6 changes: 6 additions & 0 deletions pkg/formats/fmp4/part.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,13 @@ func (p *Part) Marshal(w io.WriteSeeker) error {
moof
- mfhd
- traf (video)
- tfhd
- tfdt
- trun
- traf (audio)
- tfhd
- tfdt
- trun
mdat
*/

Expand Down
6 changes: 3 additions & 3 deletions pkg/formats/fmp4/parts_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package fmp4
import (
"testing"

"github.com/aler9/writerseeker"
"github.com/bluenviron/mediacommon/pkg/formats/fmp4/seekablebuffer"
"github.com/stretchr/testify/require"
)

Expand Down Expand Up @@ -154,8 +154,8 @@ var casesParts = []struct {
func TestPartsMarshal(t *testing.T) {
for _, ca := range casesParts {
t.Run(ca.name, func(t *testing.T) {
buf := &writerseeker.WriterSeeker{}
err := ca.parts.Marshal(buf)
var buf seekablebuffer.Buffer
err := ca.parts.Marshal(&buf)
require.NoError(t, err)
require.Equal(t, ca.enc, buf.Bytes())
})
Expand Down
74 changes: 74 additions & 0 deletions pkg/formats/fmp4/seekablebuffer/seekablebuffer.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
// Package seekablebuffer contains a bytes.Buffer with an additional Seek() method.
package seekablebuffer

import (
"bytes"
"fmt"
"io"
)

// Buffer is a bytes.Buffer with an additional Seek() method.
type Buffer struct {
bytes.Buffer
pos int64
}

// Write implements io.Writer.
func (b *Buffer) Write(p []byte) (int, error) {
n := 0

if b.pos < int64(b.Len()) {
n = copy(b.Bytes()[b.pos:], p)
p = p[n:]
}

if len(p) > 0 {
// Buffer.Write can't return an error.
nn, _ := b.Buffer.Write(p) //nolint:errcheck
n += nn
}

b.pos += int64(n)
return n, nil
}

// Read implements io.Reader.
func (b *Buffer) Read(_ []byte) (int, error) {
return 0, fmt.Errorf("unimplemented")

Check warning on line 37 in pkg/formats/fmp4/seekablebuffer/seekablebuffer.go

View check run for this annotation

Codecov / codecov/patch

pkg/formats/fmp4/seekablebuffer/seekablebuffer.go#L36-L37

Added lines #L36 - L37 were not covered by tests
}

// Seek implements io.Seeker.
func (b *Buffer) Seek(offset int64, whence int) (int64, error) {
pos2 := int64(0)

switch whence {
case io.SeekStart:
pos2 = offset

case io.SeekCurrent:
pos2 = b.pos + offset

case io.SeekEnd:
pos2 = int64(b.Len()) + offset
}

if pos2 < 0 {
return 0, fmt.Errorf("negative position")
}

b.pos = pos2

diff := b.pos - int64(b.Len())
if diff > 0 {
// Buffer.Write can't return an error.
b.Buffer.Write(make([]byte, diff)) //nolint:errcheck
}

return pos2, nil
}

// Reset resets the buffer state.
func (b *Buffer) Reset() {
b.Buffer.Reset()
b.pos = 0

Check warning on line 73 in pkg/formats/fmp4/seekablebuffer/seekablebuffer.go

View check run for this annotation

Codecov / codecov/patch

pkg/formats/fmp4/seekablebuffer/seekablebuffer.go#L71-L73

Added lines #L71 - L73 were not covered by tests
}
61 changes: 61 additions & 0 deletions pkg/formats/fmp4/seekablebuffer/seekablebuffer_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
package seekablebuffer

import (
"io"
"testing"

"github.com/stretchr/testify/require"
)

func TestBuffer(t *testing.T) {
t.Run("seek start", func(t *testing.T) {
var b Buffer

_, err := b.Seek(-2, io.SeekStart)
require.Error(t, err)

n1, err := b.Seek(0, io.SeekStart)
require.NoError(t, err)
require.Equal(t, int64(0), n1)

n2, err := b.Write([]byte{1, 2, 3, 4})
require.NoError(t, err)
require.Equal(t, 4, n2)
})

t.Run("seek current", func(t *testing.T) {
var b Buffer

n2, err := b.Write([]byte{1, 2, 3, 4})
require.NoError(t, err)
require.Equal(t, 4, n2)

n1, err := b.Seek(-2, io.SeekCurrent)
require.NoError(t, err)
require.Equal(t, int64(2), n1)

n2, err = b.Write([]byte{1, 2, 3, 4})
require.NoError(t, err)
require.Equal(t, 4, n2)

require.Equal(t, []byte{1, 2, 1, 2, 3, 4}, b.Bytes())
})

t.Run("seek end", func(t *testing.T) {
var b Buffer

n2, err := b.Write([]byte{1, 2, 3, 4})
require.NoError(t, err)
require.Equal(t, 4, n2)

n1, err := b.Seek(2, io.SeekEnd)
require.NoError(t, err)
require.Equal(t, int64(6), n1)

n2, err = b.Write([]byte{1, 2, 3, 4})
require.NoError(t, err)
require.Equal(t, 4, n2)

require.Equal(t, []byte{1, 2, 3, 4, 0, 0, 1, 2, 3, 4}, b.Bytes())
})
}

0 comments on commit d286fa2

Please sign in to comment.