diff --git a/display_matrix.go b/display_matrix.go new file mode 100644 index 0000000..0d00248 --- /dev/null +++ b/display_matrix.go @@ -0,0 +1,30 @@ +package astiav + +//#cgo pkg-config: libavutil +//#include +import "C" +import ( + "encoding/binary" + "fmt" + "unsafe" +) + +type DisplayMatrix [9]uint32 + +func NewDisplayMatrixFromBytes(b []byte) (m DisplayMatrix, err error) { + // Check length + if len(b) < 36 { + err = fmt.Errorf("astiav: invalid length %d < 36", len(b)) + return + } + + // Loop + for idx := 0; idx < 9; idx++ { + m[idx] = binary.BigEndian.Uint32(b[idx*4 : (idx+1)*4]) + } + return +} + +func (m DisplayMatrix) Rotation() float64 { + return float64(C.av_display_rotation_get((*C.int32_t)(unsafe.Pointer(&m[0])))) +} diff --git a/display_matrix_test.go b/display_matrix_test.go new file mode 100644 index 0000000..6286cc8 --- /dev/null +++ b/display_matrix_test.go @@ -0,0 +1,16 @@ +package astiav + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +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}) + 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}) + require.NoError(t, err) + require.Equal(t, DisplayMatrix{0x0, 0xffff, 0x0, 0x100, 0x0, 0x0, 0x0, 0x0, 0x40}, dm) + require.Equal(t, float64(-90), dm.Rotation()) +}