package astiav //#cgo pkg-config: libavcodec libavutil //#include //#include import "C" import ( "unsafe" ) // https://github.com/FFmpeg/FFmpeg/blob/n5.0/libavcodec/codec.h#L202 type Codec struct { c *C.struct_AVCodec } func newCodecFromC(c *C.struct_AVCodec) *Codec { if c == nil { return nil } return &Codec{c: c} } func (c *Codec) Name() string { return C.GoString(c.c.name) } func (c *Codec) String() string { return c.Name() } 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))) if !v.Valid() { break } o = append(o, v) } return } func (c *Codec) IsDecoder() bool { return int(C.av_codec_is_decoder(c.c)) != 0 } func (c *Codec) IsEncoder() bool { return int(C.av_codec_is_encoder(c.c)) != 0 } func (c *Codec) PixelFormats() (o []PixelFormat) { if c.c.pix_fmts == nil { return nil } size := unsafe.Sizeof(*c.c.pix_fmts) for i := 0; ; i++ { p := *(*C.int)(unsafe.Pointer(uintptr(unsafe.Pointer(c.c.pix_fmts)) + uintptr(i)*size)) if p == C.AV_PIX_FMT_NONE { break } o = append(o, PixelFormat(p)) } return } func (c *Codec) SampleFormats() (o []SampleFormat) { if c.c.sample_fmts == nil { return nil } size := unsafe.Sizeof(*c.c.sample_fmts) for i := 0; ; i++ { p := *(*C.int)(unsafe.Pointer(uintptr(unsafe.Pointer(c.c.sample_fmts)) + uintptr(i)*size)) if p == C.AV_SAMPLE_FMT_NONE { break } o = append(o, SampleFormat(p)) } return } func FindDecoder(id CodecID) *Codec { return newCodecFromC(C.avcodec_find_decoder((C.enum_AVCodecID)(id))) } func FindDecoderByName(n string) *Codec { cn := C.CString(n) defer C.free(unsafe.Pointer(cn)) return newCodecFromC(C.avcodec_find_decoder_by_name(cn)) } func FindEncoder(id CodecID) *Codec { return newCodecFromC(C.avcodec_find_encoder((C.enum_AVCodecID)(id))) } func FindEncoderByName(n string) *Codec { cn := C.CString(n) defer C.free(unsafe.Pointer(cn)) return newCodecFromC(C.avcodec_find_encoder_by_name(cn)) }