Skip to content

Commit eb5b51c

Browse files
committed
drivers: video: common: optimizations for video_closest_frmival()
In video_closest_frmival(), immediately stop searching when an exact match is found, as a small performance optimization. Variables that could be computed only once were moved further outside. Signed-off-by: Josuah Demangeon <me@josuah.net>
1 parent 426cefd commit eb5b51c

File tree

1 file changed

+12
-6
lines changed

1 file changed

+12
-6
lines changed

drivers/video/video_common.c

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -128,16 +128,17 @@ void video_closest_frmival_stepwise(const struct video_frmival_stepwise *stepwis
128128
void video_closest_frmival(const struct device *dev, enum video_endpoint_id ep,
129129
struct video_frmival_enum *match)
130130
{
131-
uint64_t best_diff_nsec = INT32_MAX;
132131
struct video_frmival desired = match->discrete;
133132
struct video_frmival_enum fie = {.format = match->format};
133+
uint64_t best_diff_nsec = INT32_MAX;
134+
uint64_t goal_nsec = video_frmival_nsec(&desired);
134135

135136
__ASSERT(match->type != VIDEO_FRMIVAL_TYPE_STEPWISE,
136137
"cannot find range matching the range, only a value matching the range");
137138

138139
for (fie.index = 0; video_enum_frmival(dev, ep, &fie) == 0; fie.index++) {
139140
struct video_frmival tmp = {0};
140-
uint64_t diff_nsec = 0, a, b;
141+
uint64_t diff_nsec = 0, tmp_nsec;
141142

142143
switch (fie.type) {
143144
case VIDEO_FRMIVAL_TYPE_DISCRETE:
@@ -150,13 +151,18 @@ void video_closest_frmival(const struct device *dev, enum video_endpoint_id ep,
150151
__ASSERT(false, "invalid answer from the queried video device");
151152
}
152153

153-
a = video_frmival_nsec(&desired);
154-
b = video_frmival_nsec(&tmp);
155-
diff_nsec = a > b ? a - b : b - a;
154+
tmp = video_frmival_nsec(&tmp);
155+
diff_nsec = tmp_nsec > goal_nsec ? tmp_nsec - goal_nsec : goal_nsec - tmp_nsec;
156+
156157
if (diff_nsec < best_diff_nsec) {
157158
best_diff_nsec = diff_nsec;
158159
match->index = fie.index;
159-
memcpy(&match->discrete, &tmp, sizeof(tmp));
160+
match->discrete = tmp;
161+
}
162+
163+
if (diff_nsec == 0) {
164+
/* Exact match, stop searching a better match */
165+
break;
160166
}
161167
}
162168
}

0 commit comments

Comments
 (0)