refactor(ffmpeg): cleanup callbacks and increased coverage

This commit is contained in:
Adrian Shum 2022-10-15 14:07:55 +08:00 committed by GitHub
parent 5ff3407305
commit 7367cc4750
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 86 additions and 61 deletions

View file

@ -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
}