Files
go-astiav/packet_side_data.go
2024-08-15 10:31:36 +02:00

51 lines
1.1 KiB
Go

package astiav
//#cgo pkg-config: libavcodec
//#include <libavcodec/avcodec.h>
import "C"
import (
"errors"
"unsafe"
)
// https://github.com/FFmpeg/FFmpeg/blob/n6.1.1/libavcodec/packet.h#L342
type PacketSideData struct {
sd **C.struct_AVPacketSideData
size *C.int
}
func newPacketSideDataFromC(sd **C.struct_AVPacketSideData, size *C.int) *PacketSideData {
return &PacketSideData{
sd: sd,
size: size,
}
}
func (d *PacketSideData) Add(t PacketSideDataType, b []byte) error {
if len(b) == 0 {
return nil
}
sd := C.av_packet_side_data_new(d.sd, d.size, (C.enum_AVPacketSideDataType)(t), C.size_t(len(b)), 0)
if sd == nil {
return errors.New("astiav: nil pointer")
}
C.memcpy(unsafe.Pointer(sd.data), unsafe.Pointer(&b[0]), C.size_t(len(b)))
return nil
}
func (d *PacketSideData) Get(t PacketSideDataType) []byte {
return bytesFromC(func(size *C.size_t) *C.uint8_t {
if d.sd == nil || d.size == nil {
return nil
}
sd := C.av_packet_side_data_get(*d.sd, *d.size, (C.enum_AVPacketSideDataType)(t))
if sd == nil {
return nil
}
*size = sd.size
return sd.data
})
}