mirror of
https://github.com/asticode/go-astiav.git
synced 2024-05-28 13:53:18 +08:00
Removed pointer on ChannelLayout + now cloning channel layouts in getters
This commit is contained in:
parent
63a083bcad
commit
7048b09f25
@ -75,15 +75,15 @@ type ChannelLayout struct {
|
||||
c *C.struct_AVChannelLayout
|
||||
}
|
||||
|
||||
func newChannelLayoutFromC(c *C.struct_AVChannelLayout) *ChannelLayout {
|
||||
return &ChannelLayout{c: c}
|
||||
func newChannelLayoutFromC(c *C.struct_AVChannelLayout) ChannelLayout {
|
||||
return ChannelLayout{c: c}
|
||||
}
|
||||
|
||||
func (l *ChannelLayout) NbChannels() int {
|
||||
func (l ChannelLayout) NbChannels() int {
|
||||
return int(l.c.nb_channels)
|
||||
}
|
||||
|
||||
func (l *ChannelLayout) String() string {
|
||||
func (l ChannelLayout) String() string {
|
||||
b := make([]byte, 1024)
|
||||
n, err := l.Describe(b)
|
||||
if err != nil {
|
||||
@ -92,7 +92,7 @@ func (l *ChannelLayout) String() string {
|
||||
return string(b[:n])
|
||||
}
|
||||
|
||||
func (l *ChannelLayout) Describe(b []byte) (int, error) {
|
||||
func (l ChannelLayout) Describe(b []byte) (int, error) {
|
||||
ret := C.av_channel_layout_describe(l.c, (*C.char)(unsafe.Pointer(&b[0])), cUlong(len(b)))
|
||||
if ret < 0 {
|
||||
return 0, newError(ret)
|
||||
@ -100,11 +100,11 @@ func (l *ChannelLayout) Describe(b []byte) (int, error) {
|
||||
return int(ret), nil
|
||||
}
|
||||
|
||||
func (l *ChannelLayout) Valid() bool {
|
||||
func (l ChannelLayout) Valid() bool {
|
||||
return C.av_channel_layout_check(l.c) > 0
|
||||
}
|
||||
|
||||
func (l *ChannelLayout) Compare(l2 *ChannelLayout) (equal bool, err error) {
|
||||
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)
|
||||
@ -112,11 +112,19 @@ func (l *ChannelLayout) Compare(l2 *ChannelLayout) (equal bool, err error) {
|
||||
return ret == 0, nil
|
||||
}
|
||||
|
||||
func (l *ChannelLayout) Equal(l2 *ChannelLayout) bool {
|
||||
func (l ChannelLayout) Equal(l2 ChannelLayout) bool {
|
||||
v, _ := l.Compare(l2)
|
||||
return v
|
||||
}
|
||||
|
||||
func (l *ChannelLayout) copy(dst *C.struct_AVChannelLayout) error {
|
||||
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) {
|
||||
// TODO Should it be freed?
|
||||
cl := C.struct_AVChannelLayout{}
|
||||
err := l.copy(&cl)
|
||||
dst := newChannelLayoutFromC(&cl)
|
||||
return dst, err
|
||||
}
|
||||
|
4
codec.go
4
codec.go
@ -28,13 +28,13 @@ func (c *Codec) String() string {
|
||||
return c.Name()
|
||||
}
|
||||
|
||||
func (c *Codec) ChannelLayouts() (o []*ChannelLayout) {
|
||||
func (c *Codec) ChannelLayouts() (o []ChannelLayout) {
|
||||
if c.c.ch_layouts == nil {
|
||||
return nil
|
||||
}
|
||||
size := unsafe.Sizeof(*c.c.ch_layouts)
|
||||
for i := 0; ; i++ {
|
||||
v := newChannelLayoutFromC((*C.struct_AVChannelLayout)(unsafe.Pointer(uintptr(unsafe.Pointer(c.c.ch_layouts)) + uintptr(i)*size)))
|
||||
v, _ := newChannelLayoutFromC((*C.struct_AVChannelLayout)(unsafe.Pointer(uintptr(unsafe.Pointer(c.c.ch_layouts)) + uintptr(i)*size))).clone()
|
||||
if !v.Valid() {
|
||||
break
|
||||
}
|
||||
|
@ -53,11 +53,12 @@ func (cc *CodecContext) SetChannels(channels int) {
|
||||
cc.c.channels = C.int(channels)
|
||||
}
|
||||
|
||||
func (cc *CodecContext) ChannelLayout() *ChannelLayout {
|
||||
return newChannelLayoutFromC(&cc.c.ch_layout)
|
||||
func (cc *CodecContext) ChannelLayout() ChannelLayout {
|
||||
l, _ := newChannelLayoutFromC(&cc.c.ch_layout).clone()
|
||||
return l
|
||||
}
|
||||
|
||||
func (cc *CodecContext) SetChannelLayout(l *ChannelLayout) {
|
||||
func (cc *CodecContext) SetChannelLayout(l ChannelLayout) {
|
||||
l.copy(&cc.c.ch_layout) //nolint: errcheck
|
||||
}
|
||||
|
||||
|
@ -28,11 +28,12 @@ func (cp *CodecParameters) BitRate() int64 {
|
||||
return int64(cp.c.bit_rate)
|
||||
}
|
||||
|
||||
func (cp *CodecParameters) ChannelLayout() *ChannelLayout {
|
||||
return newChannelLayoutFromC(&cp.c.ch_layout)
|
||||
func (cp *CodecParameters) ChannelLayout() ChannelLayout {
|
||||
l, _ := newChannelLayoutFromC(&cp.c.ch_layout).clone()
|
||||
return l
|
||||
}
|
||||
|
||||
func (cp *CodecParameters) SetChannelLayout(l *ChannelLayout) {
|
||||
func (cp *CodecParameters) SetChannelLayout(l ChannelLayout) {
|
||||
l.copy(&cp.c.ch_layout) //nolint: errcheck
|
||||
}
|
||||
|
||||
|
@ -20,7 +20,7 @@ func TestCodec(t *testing.T) {
|
||||
|
||||
c = astiav.FindDecoderByName("aac")
|
||||
require.NotNil(t, c)
|
||||
els := []*astiav.ChannelLayout{
|
||||
els := []astiav.ChannelLayout{
|
||||
astiav.ChannelLayoutMono,
|
||||
astiav.ChannelLayoutStereo,
|
||||
astiav.ChannelLayoutSurround,
|
||||
|
7
frame.go
7
frame.go
@ -38,11 +38,12 @@ func (f *Frame) AllocSamples(align int) error {
|
||||
return newError(C.av_samples_alloc(&f.c.data[0], &f.c.linesize[0], f.c.ch_layout.nb_channels, f.c.nb_samples, (C.enum_AVSampleFormat)(f.c.format), C.int(align)))
|
||||
}
|
||||
|
||||
func (f *Frame) ChannelLayout() *ChannelLayout {
|
||||
return newChannelLayoutFromC(&f.c.ch_layout)
|
||||
func (f *Frame) ChannelLayout() ChannelLayout {
|
||||
l, _ := newChannelLayoutFromC(&f.c.ch_layout).clone()
|
||||
return l
|
||||
}
|
||||
|
||||
func (f *Frame) SetChannelLayout(l *ChannelLayout) {
|
||||
func (f *Frame) SetChannelLayout(l ChannelLayout) {
|
||||
l.copy(&f.c.ch_layout) //nolint: errcheck
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user