mirror of
https://github.com/asticode/go-astiav.git
synced 2025-10-17 05:31:25 +08:00
Added some setters + missing display matrix methods
This commit is contained in:
@@ -81,6 +81,10 @@ func (cp *CodecParameters) ColorRange() ColorRange {
|
|||||||
return ColorRange(cp.c.color_range)
|
return ColorRange(cp.c.color_range)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (cp *CodecParameters) SetColorRange(r ColorRange) {
|
||||||
|
cp.c.color_range = C.enum_AVColorRange(r)
|
||||||
|
}
|
||||||
|
|
||||||
func (cp *CodecParameters) ColorSpace() ColorSpace {
|
func (cp *CodecParameters) ColorSpace() ColorSpace {
|
||||||
return ColorSpace(cp.c.color_space)
|
return ColorSpace(cp.c.color_space)
|
||||||
}
|
}
|
||||||
@@ -93,6 +97,10 @@ func (cp *CodecParameters) FrameSize() int {
|
|||||||
return int(cp.c.frame_size)
|
return int(cp.c.frame_size)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (cp *CodecParameters) SetFrameSize(i int) {
|
||||||
|
cp.c.frame_size = C.int(i)
|
||||||
|
}
|
||||||
|
|
||||||
func (cp *CodecParameters) Height() int {
|
func (cp *CodecParameters) Height() int {
|
||||||
return int(cp.c.height)
|
return int(cp.c.height)
|
||||||
}
|
}
|
||||||
@@ -109,6 +117,10 @@ func (cp *CodecParameters) MediaType() MediaType {
|
|||||||
return MediaType(cp.c.codec_type)
|
return MediaType(cp.c.codec_type)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (cp *CodecParameters) SetMediaType(t MediaType) {
|
||||||
|
cp.c.codec_type = C.enum_AVMediaType(t)
|
||||||
|
}
|
||||||
|
|
||||||
func (cp *CodecParameters) PixelFormat() PixelFormat {
|
func (cp *CodecParameters) PixelFormat() PixelFormat {
|
||||||
return PixelFormat(cp.c.format)
|
return PixelFormat(cp.c.format)
|
||||||
}
|
}
|
||||||
|
@@ -75,10 +75,16 @@ func TestCodecParameters(t *testing.T) {
|
|||||||
require.Equal(t, CodecIDRawvideo, cp6.CodecID())
|
require.Equal(t, CodecIDRawvideo, cp6.CodecID())
|
||||||
cp6.SetCodecTag(CodecTag(2))
|
cp6.SetCodecTag(CodecTag(2))
|
||||||
require.Equal(t, CodecTag(2), cp6.CodecTag())
|
require.Equal(t, CodecTag(2), cp6.CodecTag())
|
||||||
|
cp6.SetColorRange(ColorRangeJpeg)
|
||||||
|
require.Equal(t, ColorRangeJpeg, cp6.ColorRange())
|
||||||
cp6.SetCodecType(MediaTypeAudio)
|
cp6.SetCodecType(MediaTypeAudio)
|
||||||
require.Equal(t, MediaTypeAudio, cp6.CodecType())
|
require.Equal(t, MediaTypeAudio, cp6.CodecType())
|
||||||
|
cp6.SetFrameSize(1)
|
||||||
|
require.Equal(t, 1, cp6.FrameSize())
|
||||||
cp6.SetHeight(1)
|
cp6.SetHeight(1)
|
||||||
require.Equal(t, 1, cp6.Height())
|
require.Equal(t, 1, cp6.Height())
|
||||||
|
cp6.SetMediaType(MediaTypeAudio)
|
||||||
|
require.Equal(t, MediaTypeAudio, cp6.MediaType())
|
||||||
cp6.SetPixelFormat(PixelFormat0Bgr)
|
cp6.SetPixelFormat(PixelFormat0Bgr)
|
||||||
require.Equal(t, PixelFormat0Bgr, cp6.PixelFormat())
|
require.Equal(t, PixelFormat0Bgr, cp6.PixelFormat())
|
||||||
cp6.SetSampleAspectRatio(NewRational(1, 2))
|
cp6.SetSampleAspectRatio(NewRational(1, 2))
|
||||||
|
@@ -28,6 +28,21 @@ func NewDisplayMatrixFromBytes(b []byte) (m *DisplayMatrix, err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m DisplayMatrix) Rotation() float64 {
|
func NewDisplayMatrixFromRotation(angle float64) *DisplayMatrix {
|
||||||
return float64(C.av_display_rotation_get((*C.int32_t)(unsafe.Pointer(&m[0]))))
|
m := &DisplayMatrix{}
|
||||||
|
C.av_display_rotation_set((*C.int32_t)(unsafe.Pointer(&m[0])), C.double(angle))
|
||||||
|
return m
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m DisplayMatrix) Bytes() []byte {
|
||||||
|
b := make([]byte, 0, 36)
|
||||||
|
for _, v := range m {
|
||||||
|
b = binary.LittleEndian.AppendUint32(b, v)
|
||||||
|
}
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
|
||||||
|
// Rotation is a clockwise angle
|
||||||
|
func (m DisplayMatrix) Rotation() float64 {
|
||||||
|
return -float64(C.av_display_rotation_get((*C.int32_t)(unsafe.Pointer(&m[0]))))
|
||||||
}
|
}
|
||||||
|
@@ -9,12 +9,16 @@ import (
|
|||||||
func TestDisplayMatrix(t *testing.T) {
|
func TestDisplayMatrix(t *testing.T) {
|
||||||
_, err := NewDisplayMatrixFromBytes([]byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0})
|
_, err := NewDisplayMatrixFromBytes([]byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0})
|
||||||
require.Error(t, err)
|
require.Error(t, err)
|
||||||
dm, err := NewDisplayMatrixFromBytes([]byte{0, 0, 0, 0, 0, 0, 255, 255, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64})
|
b := []byte{0, 0, 0, 0, 0, 0, 255, 255, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64}
|
||||||
|
dm, err := NewDisplayMatrixFromBytes(b)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.Equal(t, DisplayMatrix{0x0, 0xffff0000, 0x0, 0x10000, 0x0, 0x0, 0x0, 0x0, 0x40000000}, *dm)
|
require.Equal(t, DisplayMatrix{0x0, 0xffff0000, 0x0, 0x10000, 0x0, 0x0, 0x0, 0x0, 0x40000000}, *dm)
|
||||||
require.Equal(t, float64(90), dm.Rotation())
|
require.Equal(t, -90.0, dm.Rotation())
|
||||||
|
require.Equal(t, b, dm.Bytes())
|
||||||
|
dm = NewDisplayMatrixFromRotation(-90)
|
||||||
|
require.Equal(t, -90.0, dm.Rotation())
|
||||||
dm, err = NewDisplayMatrixFromBytes([]byte{0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64})
|
dm, err = NewDisplayMatrixFromBytes([]byte{0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64})
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.Equal(t, DisplayMatrix{0x0, 0x10000, 0x0, 0xffff0000, 0x0, 0x0, 0x0, 0x0, 0x40000000}, *dm)
|
require.Equal(t, DisplayMatrix{0x0, 0x10000, 0x0, 0xffff0000, 0x0, 0x0, 0x0, 0x0, 0x40000000}, *dm)
|
||||||
require.Equal(t, float64(-90), dm.Rotation())
|
require.Equal(t, 90.0, dm.Rotation())
|
||||||
}
|
}
|
||||||
|
38
stream.go
38
stream.go
@@ -3,6 +3,10 @@ package astiav
|
|||||||
//#cgo pkg-config: libavformat
|
//#cgo pkg-config: libavformat
|
||||||
//#include <libavformat/avformat.h>
|
//#include <libavformat/avformat.h>
|
||||||
import "C"
|
import "C"
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"unsafe"
|
||||||
|
)
|
||||||
|
|
||||||
// https://github.com/FFmpeg/FFmpeg/blob/n5.0/libavformat/avformat.h#L937
|
// https://github.com/FFmpeg/FFmpeg/blob/n5.0/libavformat/avformat.h#L937
|
||||||
type Stream struct {
|
type Stream struct {
|
||||||
@@ -20,6 +24,10 @@ func (s *Stream) AvgFrameRate() Rational {
|
|||||||
return newRationalFromC(s.c.avg_frame_rate)
|
return newRationalFromC(s.c.avg_frame_rate)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *Stream) SetAvgFrameRate(r Rational) {
|
||||||
|
s.c.avg_frame_rate = r.c
|
||||||
|
}
|
||||||
|
|
||||||
func (s *Stream) CodecParameters() *CodecParameters {
|
func (s *Stream) CodecParameters() *CodecParameters {
|
||||||
return newCodecParametersFromC(s.c.codecpar)
|
return newCodecParametersFromC(s.c.codecpar)
|
||||||
}
|
}
|
||||||
@@ -36,10 +44,18 @@ func (s *Stream) ID() int {
|
|||||||
return int(s.c.id)
|
return int(s.c.id)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *Stream) SetID(i int) {
|
||||||
|
s.c.id = C.int(i)
|
||||||
|
}
|
||||||
|
|
||||||
func (s *Stream) Index() int {
|
func (s *Stream) Index() int {
|
||||||
return int(s.c.index)
|
return int(s.c.index)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *Stream) SetIndex(i int) {
|
||||||
|
s.c.index = C.int(i)
|
||||||
|
}
|
||||||
|
|
||||||
func (s *Stream) Metadata() *Dictionary {
|
func (s *Stream) Metadata() *Dictionary {
|
||||||
return newDictionaryFromC(s.c.metadata)
|
return newDictionaryFromC(s.c.metadata)
|
||||||
}
|
}
|
||||||
@@ -52,16 +68,38 @@ func (s *Stream) RFrameRate() Rational {
|
|||||||
return newRationalFromC(s.c.r_frame_rate)
|
return newRationalFromC(s.c.r_frame_rate)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *Stream) SetRFrameRate(r Rational) {
|
||||||
|
s.c.r_frame_rate = r.c
|
||||||
|
}
|
||||||
|
|
||||||
func (s *Stream) SampleAspectRatio() Rational {
|
func (s *Stream) SampleAspectRatio() Rational {
|
||||||
return newRationalFromC(s.c.sample_aspect_ratio)
|
return newRationalFromC(s.c.sample_aspect_ratio)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *Stream) SetSampleAspectRatio(r Rational) {
|
||||||
|
s.c.sample_aspect_ratio = r.c
|
||||||
|
}
|
||||||
|
|
||||||
func (s *Stream) SideData(t PacketSideDataType) []byte {
|
func (s *Stream) SideData(t PacketSideDataType) []byte {
|
||||||
return bytesFromC(func(size *cUlong) *C.uint8_t {
|
return bytesFromC(func(size *cUlong) *C.uint8_t {
|
||||||
return C.av_stream_get_side_data(s.c, (C.enum_AVPacketSideDataType)(t), size)
|
return C.av_stream_get_side_data(s.c, (C.enum_AVPacketSideDataType)(t), size)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *Stream) AddSideData(t PacketSideDataType, d []byte) error {
|
||||||
|
if len(d) == 0 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
ptr := C.av_stream_new_side_data(s.c, (C.enum_AVPacketSideDataType)(t), cUlong(len(d)))
|
||||||
|
if ptr == nil {
|
||||||
|
return errors.New("astiav: nil pointer")
|
||||||
|
}
|
||||||
|
|
||||||
|
C.memcpy(unsafe.Pointer(ptr), unsafe.Pointer(&d[0]), cUlong(len(d)))
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func (s *Stream) StartTime() int64 {
|
func (s *Stream) StartTime() int64 {
|
||||||
return int64(s.c.start_time)
|
return int64(s.c.start_time)
|
||||||
}
|
}
|
||||||
|
@@ -34,6 +34,18 @@ func TestStream(t *testing.T) {
|
|||||||
require.Equal(t, int64(0), s2.StartTime())
|
require.Equal(t, int64(0), s2.StartTime())
|
||||||
require.Equal(t, NewRational(1, 48000), s2.TimeBase())
|
require.Equal(t, NewRational(1, 48000), s2.TimeBase())
|
||||||
|
|
||||||
|
s1.SetAvgFrameRate(NewRational(2, 1))
|
||||||
|
require.Equal(t, NewRational(2, 1), s1.AvgFrameRate())
|
||||||
|
s1.SetID(2)
|
||||||
|
require.Equal(t, 2, s1.ID())
|
||||||
|
s1.SetIndex(1)
|
||||||
|
require.Equal(t, 1, s1.Index())
|
||||||
|
s1.SetRFrameRate(NewRational(2, 1))
|
||||||
|
require.Equal(t, NewRational(2, 1), s1.RFrameRate())
|
||||||
|
s1.SetSampleAspectRatio(NewRational(2, 1))
|
||||||
|
require.Equal(t, NewRational(2, 1), s1.SampleAspectRatio())
|
||||||
|
require.NoError(t, s1.AddSideData(PacketSideDataTypeEncryptionInfo, []byte("test")))
|
||||||
|
require.Equal(t, []byte("test"), s1.SideData(PacketSideDataTypeEncryptionInfo))
|
||||||
s1.SetTimeBase(NewRational(1, 1))
|
s1.SetTimeBase(NewRational(1, 1))
|
||||||
require.Equal(t, NewRational(1, 1), s1.TimeBase())
|
require.Equal(t, NewRational(1, 1), s1.TimeBase())
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user