Up until now, an AVFilter's lists of input and output AVFilterPads were terminated by a sentinel and the only way to get the length of these lists was by using avfilter_pad_count(). This has two drawbacks: first, sizeof(AVFilterPad) is not negligible (i.e. 64B on 64bit systems); second, getting the size involves a function call instead of just reading the data. This commit therefore changes this. The sentinels are removed and new private fields nb_inputs and nb_outputs are added to AVFilter that contain the number of elements of the respective AVFilterPad array. Given that AVFilter.(in|out)puts are the only arrays of zero-terminated AVFilterPads an API user has access to (AVFilterContext.(in|out)put_pads are not zero-terminated and they already have a size field) the argument to avfilter_pad_count() is always one of these lists, so it just has to find the filter the list belongs to and read said number. This is slower than before, but a replacement function that just reads the internal numbers that users are expected to switch to will be added soon; and furthermore, avfilter_pad_count() is probably never called in hot loops anyway. This saves about 49KiB from the binary; notice that these sentinels are not in .bss despite being zeroed: they are in .data.rel.ro due to the non-sentinels.
Showing the changes to libavfilter/split.c (1 of 389 files). Show all
Unified · Split
| @@ -116,7 +116,6 @@ static const AVFilterPad avfilter_vf_split_inputs[] = { · 115 unmodified lines | ||
| 116 | 116 | .type = AVMEDIA_TYPE_VIDEO, |
| 117 | 117 | .filter_frame = filter_frame, |
| 118 | 118 | }, |
| 119 | − { NULL } | |
| 120 | 119 | }; |
| 121 | 120 | |
| 122 | 121 | const AVFilter ff_vf_split = { |
| @@ -126,7 +125,7 @@ const AVFilter ff_vf_split = { · 3 unmodified lines | ||
| 126 | 125 | .priv_class = &split_class, |
| 127 | 126 | .init = split_init, |
| 128 | 127 | .uninit = split_uninit, |
| 129 | − .inputs = avfilter_vf_split_inputs, | |
| 128 | + FILTER_INPUTS(avfilter_vf_split_inputs), | |
| 130 | 129 | .outputs = NULL, |
| 131 | 130 | .flags = AVFILTER_FLAG_DYNAMIC_OUTPUTS, |
| 132 | 131 | }; |
| @@ -137,7 +136,6 @@ static const AVFilterPad avfilter_af_asplit_inputs[] = { · 4 unmodified lines | ||
| 137 | 136 | .type = AVMEDIA_TYPE_AUDIO, |
| 138 | 137 | .filter_frame = filter_frame, |
| 139 | 138 | }, |
| 140 | − { NULL } | |
| 141 | 139 | }; |
| 142 | 140 | |
| 143 | 141 | const AVFilter ff_af_asplit = { |
| @@ -147,7 +145,7 @@ const AVFilter ff_af_asplit = { · 3 unmodified lines | ||
| 147 | 145 | .priv_class = &asplit_class, |
| 148 | 146 | .init = split_init, |
| 149 | 147 | .uninit = split_uninit, |
| 150 | − .inputs = avfilter_af_asplit_inputs, | |
| 148 | + FILTER_INPUTS(avfilter_af_asplit_inputs), | |
| 151 | 149 | .outputs = NULL, |
| 152 | 150 | .flags = AVFILTER_FLAG_DYNAMIC_OUTPUTS, |
| 153 | 151 | }; |