Files
go-astiav/channel_layout.go
2024-09-19 15:47:15 +02:00

120 lines
4.7 KiB
Go

package astiav
//#include "channel_layout.h"
import "C"
import (
"unsafe"
)
// https://github.com/FFmpeg/FFmpeg/blob/n5.0/libavutil/channel_layout.h#L90
var (
ChannelLayoutMono = newChannelLayoutFromC(C.astiavChannelLayoutMono)
ChannelLayoutStereo = newChannelLayoutFromC(C.astiavChannelLayoutStereo)
ChannelLayout2Point1 = newChannelLayoutFromC(C.astiavChannelLayout2Point1)
ChannelLayout21 = newChannelLayoutFromC(C.astiavChannelLayout21)
ChannelLayoutSurround = newChannelLayoutFromC(C.astiavChannelLayoutSurround)
ChannelLayout3Point1 = newChannelLayoutFromC(C.astiavChannelLayout3Point1)
ChannelLayout4Point0 = newChannelLayoutFromC(C.astiavChannelLayout4Point0)
ChannelLayout4Point1 = newChannelLayoutFromC(C.astiavChannelLayout4Point1)
ChannelLayout22 = newChannelLayoutFromC(C.astiavChannelLayout22)
ChannelLayoutQuad = newChannelLayoutFromC(C.astiavChannelLayoutQuad)
ChannelLayout5Point0 = newChannelLayoutFromC(C.astiavChannelLayout5Point0)
ChannelLayout5Point1 = newChannelLayoutFromC(C.astiavChannelLayout5Point1)
ChannelLayout5Point0Back = newChannelLayoutFromC(C.astiavChannelLayout5Point0Back)
ChannelLayout5Point1Back = newChannelLayoutFromC(C.astiavChannelLayout5Point1Back)
ChannelLayout6Point0 = newChannelLayoutFromC(C.astiavChannelLayout6Point0)
ChannelLayout6Point0Front = newChannelLayoutFromC(C.astiavChannelLayout6Point0Front)
ChannelLayoutHexagonal = newChannelLayoutFromC(C.astiavChannelLayoutHexagonal)
ChannelLayout3Point1Point2 = newChannelLayoutFromC(C.astiavChannelLayout3Point1Point2)
ChannelLayout6Point1 = newChannelLayoutFromC(C.astiavChannelLayout6Point1)
ChannelLayout6Point1Back = newChannelLayoutFromC(C.astiavChannelLayout6Point1Back)
ChannelLayout6Point1Front = newChannelLayoutFromC(C.astiavChannelLayout6Point1Front)
ChannelLayout7Point0 = newChannelLayoutFromC(C.astiavChannelLayout7Point0)
ChannelLayout7Point0Front = newChannelLayoutFromC(C.astiavChannelLayout7Point0Front)
ChannelLayout7Point1 = newChannelLayoutFromC(C.astiavChannelLayout7Point1)
ChannelLayout7Point1Wide = newChannelLayoutFromC(C.astiavChannelLayout7Point1Wide)
ChannelLayout7Point1WideBack = newChannelLayoutFromC(C.astiavChannelLayout7Point1WideBack)
ChannelLayout5Point1Point2Back = newChannelLayoutFromC(C.astiavChannelLayout5Point1Point2Back)
ChannelLayoutOctagonal = newChannelLayoutFromC(C.astiavChannelLayoutOctagonal)
ChannelLayoutCube = newChannelLayoutFromC(C.astiavChannelLayoutCube)
ChannelLayout5Point1Point4Back = newChannelLayoutFromC(C.astiavChannelLayout5Point1Point4Back)
ChannelLayout7Point1Point2 = newChannelLayoutFromC(C.astiavChannelLayout7Point1Point2)
ChannelLayout7Point1Point4Back = newChannelLayoutFromC(C.astiavChannelLayout7Point1Point4Back)
ChannelLayoutHexadecagonal = newChannelLayoutFromC(C.astiavChannelLayoutHexadecagonal)
ChannelLayoutStereoDownmix = newChannelLayoutFromC(C.astiavChannelLayoutStereoDownmix)
ChannelLayout22Point2 = newChannelLayoutFromC(C.astiavChannelLayout22Point2)
ChannelLayout7Point1TopBack = newChannelLayoutFromC(C.astiavChannelLayout7Point1TopBack)
)
type ChannelLayout struct {
c *C.AVChannelLayout
}
func newChannelLayoutFromC(c *C.AVChannelLayout) ChannelLayout {
return ChannelLayout{c: c}
}
func (l ChannelLayout) Channels() int {
if l.c == nil {
return 0
}
return int(l.c.nb_channels)
}
func (l ChannelLayout) String() string {
b := make([]byte, 1024)
n, err := l.Describe(b)
if err != nil {
return ""
}
return string(b[:n])
}
func (l ChannelLayout) Describe(b []byte) (int, error) {
if l.c == nil {
return 0, nil
}
ret := C.av_channel_layout_describe(l.c, (*C.char)(unsafe.Pointer(&b[0])), C.size_t(len(b)))
if err := newError(ret); err != nil {
return 0, err
}
if ret > 0 && b[ret-1] == '\x00' {
ret -= 1
}
return int(ret), nil
}
func (l ChannelLayout) Valid() bool {
if l.c == nil {
return false
}
return C.av_channel_layout_check(l.c) > 0
}
func (l ChannelLayout) Compare(l2 ChannelLayout) (equal bool, err error) {
if l.c == nil || l2.c == nil {
return l.c == nil && l2.c == nil, nil
}
ret := C.av_channel_layout_compare(l.c, l2.c)
if err := newError(ret); err != nil {
return false, err
}
return ret == 0, nil
}
func (l ChannelLayout) Equal(l2 ChannelLayout) bool {
v, _ := l.Compare(l2)
return v
}
func (l ChannelLayout) copy(dst *C.AVChannelLayout) error {
return newError(C.av_channel_layout_copy(dst, l.c))
}
func (l ChannelLayout) clone() (ChannelLayout, error) {
var cl C.AVChannelLayout
err := l.copy(&cl)
dst := newChannelLayoutFromC(&cl)
return dst, err
}