diff --git a/codec.go b/codec.go index 704ed41..e1eee1f 100644 --- a/codec.go +++ b/codec.go @@ -28,6 +28,10 @@ func (c *Codec) String() string { return c.Name() } +func (c *Codec) ID() CodecID { + return CodecID(c.c.id) +} + func (c *Codec) ChannelLayouts() (o []ChannelLayout) { if c.c.ch_layouts == nil { return nil @@ -101,7 +105,7 @@ func FindEncoderByName(n string) *Codec { return newCodecFromC(C.avcodec_find_encoder_by_name(cn)) } -func (c *Codec) HardwareConfigs(dt HardwareDeviceType) (configs []CodecHardwareConfig) { +func (c *Codec) HardwareConfigs() (configs []CodecHardwareConfig) { var i int for { config := C.avcodec_get_hw_config(c.c, C.int(i)) @@ -113,3 +117,18 @@ func (c *Codec) HardwareConfigs(dt HardwareDeviceType) (configs []CodecHardwareC } return } + +func Codecs() []*Codec { + var opq *C.void = nil + var codecs []*Codec + for { + c := C.av_codec_iterate((*unsafe.Pointer)(unsafe.Pointer(&opq))) + if c == nil { + break + } + + codec := newCodecFromC(c) + codecs = append(codecs, codec) + } + return codecs +} diff --git a/codec_test.go b/codec_test.go index 21db460..8dc5ae5 100644 --- a/codec_test.go +++ b/codec_test.go @@ -10,6 +10,7 @@ import ( func TestCodec(t *testing.T) { c := astiav.FindDecoder(astiav.CodecIDMp3) require.NotNil(t, c) + require.Equal(t, c.ID(), astiav.CodecIDMp3) require.Nil(t, c.ChannelLayouts()) require.True(t, c.IsDecoder()) require.False(t, c.IsEncoder()) @@ -66,4 +67,12 @@ func TestCodec(t *testing.T) { c = astiav.FindDecoderByName("invalid") require.Nil(t, c) + + var found bool + for _, c := range astiav.Codecs() { + if c.ID() == astiav.CodecIDMjpeg { + found = true + } + } + require.True(t, found) } diff --git a/examples/hardware_decoding/main.go b/examples/hardware_decoding/main.go index c277afa..0056570 100644 --- a/examples/hardware_decoding/main.go +++ b/examples/hardware_decoding/main.go @@ -107,7 +107,7 @@ func main() { defer s.decCodecContext.Free() // Loop through codec hardware configs - for _, p := range s.decCodec.HardwareConfigs(hardwareDeviceType) { + for _, p := range s.decCodec.HardwareConfigs() { // Valid hardware config if p.MethodFlags().Has(astiav.CodecHardwareConfigMethodFlagHwDeviceCtx) && p.HardwareDeviceType() == hardwareDeviceType { s.hardwarePixelFormat = p.PixelFormat()