mirror of
https://github.com/asticode/go-astiav.git
synced 2024-05-28 13:53:18 +08:00
130 lines
6.6 KiB
Go
130 lines
6.6 KiB
Go
package astiav
|
|
|
|
//#cgo pkg-config: libavutil
|
|
//#include <libavutil/channel_layout.h>
|
|
/*
|
|
|
|
// Calling C.AV_CHANNEL_LAYOUT_* in Go gives a "could not determine kind of name for X" error
|
|
// therefore we need to bridge the channel layout values
|
|
AVChannelLayout *c2goChannelLayoutMono = &(AVChannelLayout)AV_CHANNEL_LAYOUT_MONO;
|
|
AVChannelLayout *c2goChannelLayoutStereo = &(AVChannelLayout)AV_CHANNEL_LAYOUT_STEREO;
|
|
AVChannelLayout *c2goChannelLayout2Point1 = &(AVChannelLayout)AV_CHANNEL_LAYOUT_2POINT1;
|
|
AVChannelLayout *c2goChannelLayout21 = &(AVChannelLayout)AV_CHANNEL_LAYOUT_2_1;
|
|
AVChannelLayout *c2goChannelLayoutSurround = &(AVChannelLayout)AV_CHANNEL_LAYOUT_SURROUND;
|
|
AVChannelLayout *c2goChannelLayout3Point1 = &(AVChannelLayout)AV_CHANNEL_LAYOUT_3POINT1;
|
|
AVChannelLayout *c2goChannelLayout4Point0 = &(AVChannelLayout)AV_CHANNEL_LAYOUT_4POINT0;
|
|
AVChannelLayout *c2goChannelLayout4Point1 = &(AVChannelLayout)AV_CHANNEL_LAYOUT_4POINT1;
|
|
AVChannelLayout *c2goChannelLayout22 = &(AVChannelLayout)AV_CHANNEL_LAYOUT_2_2;
|
|
AVChannelLayout *c2goChannelLayoutQuad = &(AVChannelLayout)AV_CHANNEL_LAYOUT_QUAD;
|
|
AVChannelLayout *c2goChannelLayout5Point0 = &(AVChannelLayout)AV_CHANNEL_LAYOUT_5POINT0;
|
|
AVChannelLayout *c2goChannelLayout5Point1 = &(AVChannelLayout)AV_CHANNEL_LAYOUT_5POINT1;
|
|
AVChannelLayout *c2goChannelLayout5Point0Back = &(AVChannelLayout)AV_CHANNEL_LAYOUT_5POINT0_BACK;
|
|
AVChannelLayout *c2goChannelLayout5Point1Back = &(AVChannelLayout)AV_CHANNEL_LAYOUT_5POINT1_BACK;
|
|
AVChannelLayout *c2goChannelLayout6Point0 = &(AVChannelLayout)AV_CHANNEL_LAYOUT_6POINT0;
|
|
AVChannelLayout *c2goChannelLayout6Point0Front = &(AVChannelLayout)AV_CHANNEL_LAYOUT_6POINT0_FRONT;
|
|
AVChannelLayout *c2goChannelLayoutHexagonal = &(AVChannelLayout)AV_CHANNEL_LAYOUT_HEXAGONAL;
|
|
AVChannelLayout *c2goChannelLayout6Point1 = &(AVChannelLayout)AV_CHANNEL_LAYOUT_6POINT1;
|
|
AVChannelLayout *c2goChannelLayout6Point1Back = &(AVChannelLayout)AV_CHANNEL_LAYOUT_6POINT1_BACK;
|
|
AVChannelLayout *c2goChannelLayout6Point1Front = &(AVChannelLayout)AV_CHANNEL_LAYOUT_6POINT1_FRONT;
|
|
AVChannelLayout *c2goChannelLayout7Point0 = &(AVChannelLayout)AV_CHANNEL_LAYOUT_7POINT0;
|
|
AVChannelLayout *c2goChannelLayout7Point0Front = &(AVChannelLayout)AV_CHANNEL_LAYOUT_7POINT0_FRONT;
|
|
AVChannelLayout *c2goChannelLayout7Point1 = &(AVChannelLayout)AV_CHANNEL_LAYOUT_7POINT1;
|
|
AVChannelLayout *c2goChannelLayout7Point1Wide = &(AVChannelLayout)AV_CHANNEL_LAYOUT_7POINT1_WIDE;
|
|
AVChannelLayout *c2goChannelLayout7Point1WideBack = &(AVChannelLayout)AV_CHANNEL_LAYOUT_7POINT1_WIDE_BACK;
|
|
AVChannelLayout *c2goChannelLayoutOctagonal = &(AVChannelLayout)AV_CHANNEL_LAYOUT_OCTAGONAL;
|
|
AVChannelLayout *c2goChannelLayoutHexadecagonal = &(AVChannelLayout)AV_CHANNEL_LAYOUT_HEXADECAGONAL;
|
|
AVChannelLayout *c2goChannelLayoutStereoDownmix = &(AVChannelLayout)AV_CHANNEL_LAYOUT_STEREO_DOWNMIX;
|
|
|
|
*/
|
|
import "C"
|
|
import "unsafe"
|
|
|
|
// https://github.com/FFmpeg/FFmpeg/blob/n5.0/libavutil/channel_layout.h#L90
|
|
var (
|
|
ChannelLayoutMono = newChannelLayoutFromC(C.c2goChannelLayoutMono)
|
|
ChannelLayoutStereo = newChannelLayoutFromC(C.c2goChannelLayoutStereo)
|
|
ChannelLayout2Point1 = newChannelLayoutFromC(C.c2goChannelLayout2Point1)
|
|
ChannelLayout21 = newChannelLayoutFromC(C.c2goChannelLayout21)
|
|
ChannelLayoutSurround = newChannelLayoutFromC(C.c2goChannelLayoutSurround)
|
|
ChannelLayout3Point1 = newChannelLayoutFromC(C.c2goChannelLayout3Point1)
|
|
ChannelLayout4Point0 = newChannelLayoutFromC(C.c2goChannelLayout4Point0)
|
|
ChannelLayout4Point1 = newChannelLayoutFromC(C.c2goChannelLayout4Point1)
|
|
ChannelLayout22 = newChannelLayoutFromC(C.c2goChannelLayout22)
|
|
ChannelLayoutQuad = newChannelLayoutFromC(C.c2goChannelLayoutQuad)
|
|
ChannelLayout5Point0 = newChannelLayoutFromC(C.c2goChannelLayout5Point0)
|
|
ChannelLayout5Point1 = newChannelLayoutFromC(C.c2goChannelLayout5Point1)
|
|
ChannelLayout5Point0Back = newChannelLayoutFromC(C.c2goChannelLayout5Point0Back)
|
|
ChannelLayout5Point1Back = newChannelLayoutFromC(C.c2goChannelLayout5Point1Back)
|
|
ChannelLayout6Point0 = newChannelLayoutFromC(C.c2goChannelLayout6Point0)
|
|
ChannelLayout6Point0Front = newChannelLayoutFromC(C.c2goChannelLayout6Point0Front)
|
|
ChannelLayoutHexagonal = newChannelLayoutFromC(C.c2goChannelLayoutHexagonal)
|
|
ChannelLayout6Point1 = newChannelLayoutFromC(C.c2goChannelLayout6Point1)
|
|
ChannelLayout6Point1Back = newChannelLayoutFromC(C.c2goChannelLayout6Point1Back)
|
|
ChannelLayout6Point1Front = newChannelLayoutFromC(C.c2goChannelLayout6Point1Front)
|
|
ChannelLayout7Point0 = newChannelLayoutFromC(C.c2goChannelLayout7Point0)
|
|
ChannelLayout7Point0Front = newChannelLayoutFromC(C.c2goChannelLayout7Point0Front)
|
|
ChannelLayout7Point1 = newChannelLayoutFromC(C.c2goChannelLayout7Point1)
|
|
ChannelLayout7Point1Wide = newChannelLayoutFromC(C.c2goChannelLayout7Point1Wide)
|
|
ChannelLayout7Point1WideBack = newChannelLayoutFromC(C.c2goChannelLayout7Point1WideBack)
|
|
ChannelLayoutOctagonal = newChannelLayoutFromC(C.c2goChannelLayoutOctagonal)
|
|
ChannelLayoutHexadecagonal = newChannelLayoutFromC(C.c2goChannelLayoutHexadecagonal)
|
|
ChannelLayoutStereoDownmix = newChannelLayoutFromC(C.c2goChannelLayoutStereoDownmix)
|
|
)
|
|
|
|
type ChannelLayout struct {
|
|
c *C.struct_AVChannelLayout
|
|
}
|
|
|
|
func newChannelLayoutFromC(c *C.struct_AVChannelLayout) ChannelLayout {
|
|
return ChannelLayout{c: c}
|
|
}
|
|
|
|
func (l ChannelLayout) NbChannels() int {
|
|
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) {
|
|
ret := C.av_channel_layout_describe(l.c, (*C.char)(unsafe.Pointer(&b[0])), C.size_t(len(b)))
|
|
if ret < 0 {
|
|
return 0, newError(ret)
|
|
}
|
|
return int(ret), nil
|
|
}
|
|
|
|
func (l ChannelLayout) Valid() bool {
|
|
return C.av_channel_layout_check(l.c) > 0
|
|
}
|
|
|
|
func (l ChannelLayout) Compare(l2 ChannelLayout) (equal bool, err error) {
|
|
ret := C.av_channel_layout_compare(l.c, l2.c)
|
|
if ret < 0 {
|
|
return false, newError(ret)
|
|
}
|
|
return ret == 0, nil
|
|
}
|
|
|
|
func (l ChannelLayout) Equal(l2 ChannelLayout) bool {
|
|
v, _ := l.Compare(l2)
|
|
return v
|
|
}
|
|
|
|
func (l ChannelLayout) copy(dst *C.struct_AVChannelLayout) error {
|
|
return newError(C.av_channel_layout_copy(dst, l.c))
|
|
}
|
|
|
|
func (l ChannelLayout) clone() (ChannelLayout, error) {
|
|
var cl C.struct_AVChannelLayout
|
|
err := l.copy(&cl)
|
|
dst := newChannelLayoutFromC(&cl)
|
|
return dst, err
|
|
}
|