mirror of
https://github.com/asticode/go-astiav.git
synced 2025-10-05 08:06:59 +08:00
111 lines
3.3 KiB
Go
111 lines
3.3 KiB
Go
package astiav_test
|
|
|
|
import (
|
|
"bytes"
|
|
"testing"
|
|
|
|
"github.com/asticode/go-astiav"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestFrame(t *testing.T) {
|
|
f1, err := globalHelper.inputLastFrame("video.mp4", astiav.MediaTypeVideo)
|
|
require.NoError(t, err)
|
|
require.Equal(t, [8]int{384, 192, 192, 0, 0, 0, 0, 0}, f1.Linesize())
|
|
require.Equal(t, int64(60928), f1.PktDts())
|
|
|
|
f2 := astiav.AllocFrame()
|
|
require.NotNil(t, f2)
|
|
defer f2.Free()
|
|
f2.SetChannelLayout(astiav.ChannelLayout21)
|
|
f2.SetColorRange(astiav.ColorRangeJpeg)
|
|
f2.SetHeight(2)
|
|
f2.SetKeyFrame(true)
|
|
f2.SetNbSamples(4)
|
|
f2.SetPictureType(astiav.PictureTypeB)
|
|
f2.SetPixelFormat(astiav.PixelFormat0Bgr)
|
|
require.Equal(t, astiav.PixelFormat0Bgr, f2.PixelFormat()) // Need to test it right away as sample format actually updates the same field
|
|
f2.SetPts(7)
|
|
f2.SetSampleAspectRatio(astiav.NewRational(10, 2))
|
|
f2.SetSampleFormat(astiav.SampleFormatDbl)
|
|
require.Equal(t, astiav.SampleFormatDbl, f2.SampleFormat())
|
|
f2.SetSampleRate(9)
|
|
f2.SetWidth(10)
|
|
require.True(t, f2.ChannelLayout().Equal(astiav.ChannelLayout21))
|
|
require.Equal(t, astiav.ColorRangeJpeg, f2.ColorRange())
|
|
require.Equal(t, 2, f2.Height())
|
|
require.True(t, f2.KeyFrame())
|
|
require.Equal(t, 4, f2.NbSamples())
|
|
require.Equal(t, astiav.PictureTypeB, f2.PictureType())
|
|
require.Equal(t, int64(7), f2.Pts())
|
|
require.Equal(t, astiav.NewRational(10, 2), f2.SampleAspectRatio())
|
|
require.Equal(t, 9, f2.SampleRate())
|
|
require.Equal(t, 10, f2.Width())
|
|
|
|
f3 := f1.Clone()
|
|
require.NotNil(t, f3)
|
|
defer f3.Free()
|
|
require.Equal(t, 180, f3.Height())
|
|
|
|
err = f2.AllocBuffer(0)
|
|
require.NoError(t, err)
|
|
err = f3.Ref(f2)
|
|
require.NoError(t, err)
|
|
require.Equal(t, 2, f3.Height())
|
|
|
|
f3.MoveRef(f1)
|
|
require.Equal(t, 180, f3.Height())
|
|
require.Equal(t, 0, f1.Height())
|
|
|
|
f3.Unref()
|
|
require.Equal(t, 0, f3.Height())
|
|
|
|
f4 := astiav.AllocFrame()
|
|
require.NotNil(t, f4)
|
|
defer f4.Free()
|
|
f4.SetNbSamples(960)
|
|
f4.SetChannelLayout(astiav.ChannelLayoutStereo)
|
|
f4.SetSampleFormat(astiav.SampleFormatS16)
|
|
f4.SetSampleRate(48000)
|
|
err = f4.AllocBuffer(0)
|
|
require.NoError(t, err)
|
|
err = f4.AllocSamples(0)
|
|
require.NoError(t, err)
|
|
|
|
f5 := astiav.AllocFrame()
|
|
require.NotNil(t, f5)
|
|
defer f5.Free()
|
|
sd := f5.NewSideData(astiav.FrameSideDataTypeAudioServiceType, 4)
|
|
require.NotNil(t, sd)
|
|
sd.SetData([]byte{1, 2, 3})
|
|
sd = f5.SideData(astiav.FrameSideDataTypeAudioServiceType)
|
|
require.NotNil(t, sd)
|
|
require.Equal(t, astiav.FrameSideDataTypeAudioServiceType, sd.Type())
|
|
require.True(t, bytes.HasPrefix(sd.Data(), []byte{1, 2, 3}))
|
|
require.Len(t, sd.Data(), 4)
|
|
sd.SetData([]byte{1, 2, 3, 4, 5})
|
|
sd = f5.SideData(astiav.FrameSideDataTypeAudioServiceType)
|
|
require.NotNil(t, sd)
|
|
require.Equal(t, []byte{1, 2, 3, 4}, sd.Data())
|
|
|
|
f6 := astiav.AllocFrame()
|
|
require.NotNil(t, f6)
|
|
defer f6.Free()
|
|
f6.SetColorRange(astiav.ColorRangeUnspecified)
|
|
f6.SetHeight(2)
|
|
f6.SetPixelFormat(astiav.PixelFormatYuv420P)
|
|
f6.SetWidth(4)
|
|
const align = 1
|
|
require.NoError(t, f6.AllocBuffer(align))
|
|
require.NoError(t, f6.AllocImage(align))
|
|
require.NoError(t, f6.ImageFillBlack())
|
|
n, err := f6.ImageBufferSize(align)
|
|
require.NoError(t, err)
|
|
require.Equal(t, 12, n)
|
|
b := make([]byte, n)
|
|
n, err = f6.ImageCopyToBuffer(b, align)
|
|
require.NoError(t, err)
|
|
require.Equal(t, 12, n)
|
|
require.Equal(t, []byte{0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x80, 0x80, 0x80, 0x80}, b)
|
|
}
|