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 | .type = AVMEDIA_TYPE_VIDEO, | 116 | .type = AVMEDIA_TYPE_VIDEO, |
| 117 | .filter_frame = filter_frame, | 117 | .filter_frame = filter_frame, |
| 118 | }, | 118 | }, |
| 119 | { NULL } | ||
| 120 | }; | 119 | }; |
| 121 | 120 | ||
| 122 | const AVFilter ff_vf_split = { | 121 | const AVFilter ff_vf_split = { |
| @@ -126,7 +125,7 @@ const AVFilter ff_vf_split = { · 3 unmodified lines | |||
| 126 | .priv_class = &split_class, | 125 | .priv_class = &split_class, |
| 127 | .init = split_init, | 126 | .init = split_init, |
| 128 | .uninit = split_uninit, | 127 | .uninit = split_uninit, |
| 129 | .inputs = avfilter_vf_split_inputs, | 128 | FILTER_INPUTS(avfilter_vf_split_inputs), |
| 130 | .outputs = NULL, | 129 | .outputs = NULL, |
| 131 | .flags = AVFILTER_FLAG_DYNAMIC_OUTPUTS, | 130 | .flags = AVFILTER_FLAG_DYNAMIC_OUTPUTS, |
| 132 | }; | 131 | }; |
| @@ -137,7 +136,6 @@ static const AVFilterPad avfilter_af_asplit_inputs[] = { · 4 unmodified lines | |||
| 137 | .type = AVMEDIA_TYPE_AUDIO, | 136 | .type = AVMEDIA_TYPE_AUDIO, |
| 138 | .filter_frame = filter_frame, | 137 | .filter_frame = filter_frame, |
| 139 | }, | 138 | }, |
| 140 | { NULL } | ||
| 141 | }; | 139 | }; |
| 142 | 140 | ||
| 143 | const AVFilter ff_af_asplit = { | 141 | const AVFilter ff_af_asplit = { |
| @@ -147,7 +145,7 @@ const AVFilter ff_af_asplit = { · 3 unmodified lines | |||
| 147 | .priv_class = &asplit_class, | 145 | .priv_class = &asplit_class, |
| 148 | .init = split_init, | 146 | .init = split_init, |
| 149 | .uninit = split_uninit, | 147 | .uninit = split_uninit, |
| 150 | .inputs = avfilter_af_asplit_inputs, | 148 | FILTER_INPUTS(avfilter_af_asplit_inputs), |
| 151 | .outputs = NULL, | 149 | .outputs = NULL, |
| 152 | .flags = AVFILTER_FLAG_DYNAMIC_OUTPUTS, | 150 | .flags = AVFILTER_FLAG_DYNAMIC_OUTPUTS, |
| 153 | }; | 151 | }; |