Skip to content

Commit e73687e

Browse files
committed
refactor(custom): extract generic helper for FFmpeg iterator functions
- Add iterateFFmpeg[T any] helper to consolidate duplicate iteration pattern across six functions - Refactor AVMuxerIterate, AVDemuxerIterate, AVParserIterate, AVCodecIterate, AVFilterIterate, AVBSFIterate to use the helper - Centralise nil-check and type wrapping logic for easier maintenance
1 parent 6ca5591 commit e73687e

1 file changed

Lines changed: 53 additions & 30 deletions

File tree

custom.go

Lines changed: 53 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -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
4253
func 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
5770
func 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
7287
func 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
87104
func 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
102121
func 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
117138
func 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

Comments
 (0)