feat(imagvideo): max_frames(n) filter

* feat: ffmpeg max_frames option in process_frames

* test: update golden files
This commit is contained in:
Adrian Shum 2022-10-13 18:04:00 +08:00 committed by GitHub
parent f1b58fd8da
commit 2ce9e97d3c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
25 changed files with 36 additions and 17 deletions

View file

@ -84,9 +84,9 @@ func LoadAVContext(ctx context.Context, reader io.Reader, size int64) (*AVContex
return av, nil
}
func (av *AVContext) ProcessFrames() (err error) {
func (av *AVContext) ProcessFrames(maxFrames int) (err error) {
if av.thumbContext == nil {
return createThumbContext(av)
return createThumbContext(av, C.int(maxFrames))
}
return
}
@ -101,7 +101,7 @@ func (av *AVContext) SelectFrame(n int) (err error) {
}
func (av *AVContext) Export(bands int) (buf []byte, err error) {
if err = av.ProcessFrames(); err != nil {
if err = av.ProcessFrames(-1); err != nil {
return
}
if bands < 3 || bands > 4 {
@ -245,7 +245,7 @@ func populateHistogram(av *AVContext, frames <-chan *C.AVFrame) <-chan struct{}
return done
}
func createThumbContext(av *AVContext) error {
func createThumbContext(av *AVContext, maxFrames C.int) error {
pkt := C.create_packet()
var frame *C.AVFrame
err := C.obtain_next_frame(av.formatContext, av.codecContext, av.stream.index, &pkt, &frame)
@ -266,6 +266,9 @@ func createThumbContext(av *AVContext) error {
return avError(err)
}
n := av.thumbContext.max_frames
if maxFrames > 0 && n > maxFrames {
n = maxFrames
}
if av.selectedIndex > -1 && n > av.selectedIndex+1 {
n = av.selectedIndex + 1
}

View file

@ -48,7 +48,7 @@ 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, 9999, 99999} {
for _, frame := range []int{-1, 5, 10, 9999, 99999} {
name := filename
if frame > -1 {
name = fmt.Sprintf("%s-%d", filename, frame)
@ -63,14 +63,18 @@ func TestAVContext(t *testing.T) {
av, err := LoadAVContext(ctx, reader, stats.Size())
require.NoError(t, err)
defer av.Close()
if frame == 9999 {
require.NoError(t, av.ProcessFrames())
}
if frame > -1 {
require.NoError(t, av.SelectFrame(frame))
}
if frame != 9999 {
require.NoError(t, av.ProcessFrames())
if frame == 10 {
require.NoError(t, av.ProcessFrames(frame))
} else {
if frame == 9999 {
require.NoError(t, av.ProcessFrames(-1))
}
if frame > -1 {
require.NoError(t, av.SelectFrame(frame))
}
if frame != 9999 {
require.NoError(t, av.ProcessFrames(-1))
}
}
meta := av.Metadata()
metaBuf, err := json.Marshal(meta)