refactor(ffmpeg): cleanup callbacks and increased coverage
This commit is contained in:
parent
5ff3407305
commit
7367cc4750
6 changed files with 86 additions and 61 deletions
|
|
@ -1,13 +1,14 @@
|
|||
package ffmpeg
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"github.com/cshum/imagor/vips"
|
||||
"github.com/cshum/imagor/vips/pointer"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
"go.uber.org/zap"
|
||||
"io"
|
||||
"os"
|
||||
"reflect"
|
||||
"strings"
|
||||
|
|
@ -53,29 +54,28 @@ func TestAVContext(t *testing.T) {
|
|||
require.NoError(t, os.MkdirAll(baseDir+"golden/export", 0755))
|
||||
t.Parallel()
|
||||
for _, filename := range files {
|
||||
for _, frame := range []int{-1, 5, 10, 9999, 99999} {
|
||||
for _, n := range []int{-1, 5, 10, 9999, 99999} {
|
||||
name := filename
|
||||
if frame > -1 {
|
||||
name = fmt.Sprintf("%s-%d", filename, frame)
|
||||
if n > -1 {
|
||||
name = fmt.Sprintf("%s-%d", filename, n)
|
||||
}
|
||||
t.Run(name, func(t *testing.T) {
|
||||
ctx := context.Background()
|
||||
path := baseDir + filename
|
||||
reader, err := os.Open(path)
|
||||
require.NoError(t, err)
|
||||
stats, err := os.Stat(path)
|
||||
require.NoError(t, err)
|
||||
av, err := LoadAVContext(ctx, reader, stats.Size())
|
||||
av, err := LoadAVContext(reader, stats.Size())
|
||||
require.NoError(t, err)
|
||||
defer av.Close()
|
||||
if frame == 10 {
|
||||
require.NoError(t, av.ProcessFrames(frame))
|
||||
if n == 10 {
|
||||
require.NoError(t, av.ProcessFrames(n))
|
||||
} else {
|
||||
if frame == 9999 {
|
||||
if n == 9999 {
|
||||
require.NoError(t, av.ProcessFrames(-1))
|
||||
}
|
||||
if frame > -1 {
|
||||
require.NoError(t, av.SelectFrame(frame))
|
||||
if n > -1 {
|
||||
require.NoError(t, av.SelectFrame(n))
|
||||
}
|
||||
}
|
||||
meta := av.Metadata()
|
||||
|
|
@ -88,8 +88,14 @@ func TestAVContext(t *testing.T) {
|
|||
require.NoError(t, os.WriteFile(goldenFile, metaBuf, 0666))
|
||||
}
|
||||
bands := 4
|
||||
if n == 99999 {
|
||||
bands = 999
|
||||
}
|
||||
buf, err := av.Export(bands)
|
||||
require.NoError(t, err)
|
||||
if bands > 4 {
|
||||
bands = 4
|
||||
}
|
||||
img, err := vips.LoadImageFromMemory(buf, meta.Width, meta.Height, bands)
|
||||
require.NoError(t, err)
|
||||
buf, err = img.ExportJpeg(nil)
|
||||
|
|
@ -109,29 +115,70 @@ func TestNoVideo(t *testing.T) {
|
|||
require.NoError(t, os.MkdirAll(baseDir+"golden/meta", 0755))
|
||||
require.NoError(t, os.MkdirAll(baseDir+"golden/export", 0755))
|
||||
for _, filename := range noVideo {
|
||||
t.Run(filename, func(t *testing.T) {
|
||||
ctx := context.Background()
|
||||
path := baseDir + filename
|
||||
reader, err := os.Open(path)
|
||||
require.NoError(t, err)
|
||||
stats, err := os.Stat(path)
|
||||
require.NoError(t, err)
|
||||
av, err := LoadAVContext(ctx, reader, stats.Size())
|
||||
require.NoError(t, err)
|
||||
defer av.Close()
|
||||
require.Equal(t, ErrDecoderNotFound, av.ProcessFrames(-1))
|
||||
meta := av.Metadata()
|
||||
metaBuf, err := json.Marshal(meta)
|
||||
require.NoError(t, err)
|
||||
goldenFile := baseDir + "golden/meta/" + filename + ".meta.json"
|
||||
if curr, err := os.ReadFile(goldenFile); err == nil {
|
||||
assert.Equal(t, string(curr), string(metaBuf))
|
||||
} else {
|
||||
require.NoError(t, os.WriteFile(goldenFile, metaBuf, 0666))
|
||||
}
|
||||
buf, err := av.Export(3)
|
||||
require.Empty(t, buf)
|
||||
require.Equal(t, ErrDecoderNotFound, err)
|
||||
})
|
||||
for i := 0; i < 2; i++ {
|
||||
t.Run(fmt.Sprintf("%s-%d", filename, i), func(t *testing.T) {
|
||||
path := baseDir + filename
|
||||
reader, err := os.Open(path)
|
||||
require.NoError(t, err)
|
||||
stats, err := os.Stat(path)
|
||||
require.NoError(t, err)
|
||||
av, err := LoadAVContext(reader, stats.Size())
|
||||
require.NoError(t, err)
|
||||
defer av.Close()
|
||||
require.Equal(t, ErrDecoderNotFound, av.ProcessFrames(-1))
|
||||
meta := av.Metadata()
|
||||
metaBuf, err := json.Marshal(meta)
|
||||
require.NoError(t, err)
|
||||
goldenFile := baseDir + "golden/meta/" + filename + ".meta.json"
|
||||
if curr, err := os.ReadFile(goldenFile); err == nil {
|
||||
assert.Equal(t, string(curr), string(metaBuf))
|
||||
} else {
|
||||
require.NoError(t, os.WriteFile(goldenFile, metaBuf, 0666))
|
||||
}
|
||||
if i == 0 {
|
||||
buf, err := av.Export(3)
|
||||
require.Empty(t, buf)
|
||||
assert.Equal(t, ErrDecoderNotFound, err)
|
||||
} else {
|
||||
assert.Equal(t, ErrDecoderNotFound, av.SelectFrame(1))
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestCorrupted(t *testing.T) {
|
||||
filename := "macabre.mp4"
|
||||
path := baseDir + filename
|
||||
file, err := os.Open(path)
|
||||
require.NoError(t, err)
|
||||
reader := &readCloser{
|
||||
Reader: io.LimitReader(file, 1024),
|
||||
Closer: file,
|
||||
}
|
||||
stats, err := os.Stat(path)
|
||||
require.NoError(t, err)
|
||||
av, err := LoadAVContext(reader, stats.Size())
|
||||
require.Equal(t, ErrInvalidData, err)
|
||||
require.Empty(t, av)
|
||||
}
|
||||
|
||||
func TestCorruptedOpaque(t *testing.T) {
|
||||
filename := "macabre.mp4"
|
||||
path := baseDir + filename
|
||||
reader, err := os.Open(path)
|
||||
require.NoError(t, err)
|
||||
stats, err := os.Stat(path)
|
||||
require.NoError(t, err)
|
||||
av, err := LoadAVContext(reader, stats.Size())
|
||||
require.NoError(t, err)
|
||||
defer av.Close()
|
||||
pointer.Unref(av.opaque)
|
||||
err = av.ProcessFrames(-1)
|
||||
assert.Equal(t, ErrUnknown, err)
|
||||
}
|
||||
|
||||
type readCloser struct {
|
||||
io.Reader
|
||||
io.Closer
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue