@@ -32,6 +32,17 @@ import (
3232 "unsafe"
3333)
3434
35+ // iterateFFmpeg is a generic helper for FFmpeg iterator functions.
36+ // It handles the common pattern of calling a C iterator, checking for nil,
37+ // and wrapping the result in a Go type.
38+ func iterateFFmpeg [T any ](opaque * unsafe.Pointer , iterate func (* unsafe.Pointer ) unsafe.Pointer , wrap func (unsafe.Pointer ) * T ) * T {
39+ ret := iterate (opaque )
40+ if ret == nil {
41+ return nil
42+ }
43+ return wrap (ret )
44+ }
45+
3546// AVMuxerIterate iterates over all registered muxers.
3647//
3748// @param opaque a pointer where libavformat will store the iteration state. Must
@@ -40,11 +51,13 @@ import (
4051//
4152// @return the next registered muxer or NULL when the iteration is finished
4253func AVMuxerIterate (opaque * unsafe.Pointer ) * AVOutputFormat {
43- ret := C .av_muxer_iterate ((* unsafe .Pointer )(unsafe .Pointer (opaque )))
44- if ret == nil {
45- return nil
46- }
47- return & AVOutputFormat {ptr : ret }
54+ return iterateFFmpeg (opaque ,
55+ func (op * unsafe.Pointer ) unsafe.Pointer {
56+ return unsafe .Pointer (C .av_muxer_iterate ((* unsafe .Pointer )(unsafe .Pointer (op ))))
57+ },
58+ func (p unsafe.Pointer ) * AVOutputFormat {
59+ return & AVOutputFormat {ptr : (* C .AVOutputFormat )(p )}
60+ })
4861}
4962
5063// AVDemuxerIterate iterates over all registered demuxers.
@@ -55,11 +68,13 @@ func AVMuxerIterate(opaque *unsafe.Pointer) *AVOutputFormat {
5568//
5669// @return the next registered demuxer or NULL when the iteration is finished
5770func AVDemuxerIterate (opaque * unsafe.Pointer ) * AVInputFormat {
58- ret := C .av_demuxer_iterate ((* unsafe .Pointer )(unsafe .Pointer (opaque )))
59- if ret == nil {
60- return nil
61- }
62- return & AVInputFormat {ptr : ret }
71+ return iterateFFmpeg (opaque ,
72+ func (op * unsafe.Pointer ) unsafe.Pointer {
73+ return unsafe .Pointer (C .av_demuxer_iterate ((* unsafe .Pointer )(unsafe .Pointer (op ))))
74+ },
75+ func (p unsafe.Pointer ) * AVInputFormat {
76+ return & AVInputFormat {ptr : (* C .AVInputFormat )(p )}
77+ })
6378}
6479
6580// AVParserIterate iterates over all registered codec parsers.
@@ -70,11 +85,13 @@ func AVDemuxerIterate(opaque *unsafe.Pointer) *AVInputFormat {
7085//
7186// @return the next registered parser or NULL when the iteration is finished
7287func AVParserIterate (opaque * unsafe.Pointer ) * AVCodecParser {
73- ret := (* C .AVCodecParser )(C .av_parser_iterate ((* unsafe .Pointer )(unsafe .Pointer (opaque ))))
74- if ret == nil {
75- return nil
76- }
77- return & AVCodecParser {ptr : ret }
88+ return iterateFFmpeg (opaque ,
89+ func (op * unsafe.Pointer ) unsafe.Pointer {
90+ return unsafe .Pointer (C .av_parser_iterate ((* unsafe .Pointer )(unsafe .Pointer (op ))))
91+ },
92+ func (p unsafe.Pointer ) * AVCodecParser {
93+ return & AVCodecParser {ptr : (* C .AVCodecParser )(p )}
94+ })
7895}
7996
8097// AVCodecIterate iterates over all registered codecs.
@@ -85,11 +102,13 @@ func AVParserIterate(opaque *unsafe.Pointer) *AVCodecParser {
85102//
86103// @return the next registered codec or NULL when the iteration is finished
87104func AVCodecIterate (opaque * unsafe.Pointer ) * AVCodec {
88- ret := C .av_codec_iterate ((* unsafe .Pointer )(unsafe .Pointer (opaque )))
89- if ret == nil {
90- return nil
91- }
92- return & AVCodec {ptr : ret }
105+ return iterateFFmpeg (opaque ,
106+ func (op * unsafe.Pointer ) unsafe.Pointer {
107+ return unsafe .Pointer (C .av_codec_iterate ((* unsafe .Pointer )(unsafe .Pointer (op ))))
108+ },
109+ func (p unsafe.Pointer ) * AVCodec {
110+ return & AVCodec {ptr : (* C .AVCodec )(p )}
111+ })
93112}
94113
95114// AVFilterIterate iterates over all registered filters.
@@ -100,11 +119,13 @@ func AVCodecIterate(opaque *unsafe.Pointer) *AVCodec {
100119//
101120// @return the next registered filter or NULL when the iteration is finished
102121func AVFilterIterate (opaque * unsafe.Pointer ) * AVFilter {
103- ret := C .av_filter_iterate ((* unsafe .Pointer )(unsafe .Pointer (opaque )))
104- if ret == nil {
105- return nil
106- }
107- return & AVFilter {ptr : ret }
122+ return iterateFFmpeg (opaque ,
123+ func (op * unsafe.Pointer ) unsafe.Pointer {
124+ return unsafe .Pointer (C .av_filter_iterate ((* unsafe .Pointer )(unsafe .Pointer (op ))))
125+ },
126+ func (p unsafe.Pointer ) * AVFilter {
127+ return & AVFilter {ptr : (* C .AVFilter )(p )}
128+ })
108129}
109130
110131// AVBSFIterate iterates over all registered bitstream filters.
@@ -115,11 +136,13 @@ func AVFilterIterate(opaque *unsafe.Pointer) *AVFilter {
115136//
116137// @return the next registered bitstream filter or NULL when the iteration is finished
117138func AVBSFIterate (opaque * unsafe.Pointer ) * AVBitStreamFilter {
118- ret := C .av_bsf_iterate ((* unsafe .Pointer )(unsafe .Pointer (opaque )))
119- if ret == nil {
120- return nil
121- }
122- return & AVBitStreamFilter {ptr : ret }
139+ return iterateFFmpeg (opaque ,
140+ func (op * unsafe.Pointer ) unsafe.Pointer {
141+ return unsafe .Pointer (C .av_bsf_iterate ((* unsafe .Pointer )(unsafe .Pointer (op ))))
142+ },
143+ func (p unsafe.Pointer ) * AVBitStreamFilter {
144+ return & AVBitStreamFilter {ptr : (* C .AVBitStreamFilter )(p )}
145+ })
123146}
124147
125148// AVIOEnumProtocols iterates through names of available protocols.
0 commit comments