@@ -259,6 +259,69 @@ std::vector<std::vector<LuminanceInfo>> splitMonotonics(const std::vector<Lumina
259259 return splitted;
260260 }
261261
262+ // Check the specific case of 2 items per group without outlier
263+ if (luminanceInfos.size () % 2 == 0 )
264+ {
265+ float exp0 = luminanceInfos[0 ].mexposure ;
266+ float exp1 = luminanceInfos[1 ].mexposure ;
267+ if (exp0 != exp1)
268+ {
269+ int idx = 2 ;
270+ bool ok = true ;
271+ while (ok && idx < luminanceInfos.size ())
272+ {
273+ ok = ok && luminanceInfos[idx].mexposure == exp0 && luminanceInfos[idx+1 ].mexposure == exp1;
274+ idx += 2 ;
275+ }
276+ if (idx == luminanceInfos.size ())
277+ {
278+ std::vector<LuminanceInfo> current;
279+ for (int i = 0 ; i < luminanceInfos.size (); i++)
280+ {
281+ current.push_back (luminanceInfos[i]);
282+ if (i % 2 == 1 )
283+ {
284+ splitted.push_back (current);
285+ current.clear ();
286+ }
287+ }
288+ return splitted;
289+ }
290+ }
291+ }
292+
293+ // Check the corner case of 3 items per group ordered with middle exposure first and without outlier
294+ if (luminanceInfos.size () % 3 == 0 )
295+ {
296+ float exp0 = luminanceInfos[0 ].mexposure ;
297+ float exp1 = luminanceInfos[1 ].mexposure ;
298+ float exp2 = luminanceInfos[2 ].mexposure ;
299+ if (exp0 > exp1 && exp0 < exp2 || exp0 < exp1 && exp0 > exp2)
300+ {
301+ int idx = 3 ;
302+ bool ok = true ;
303+ while (ok && idx < luminanceInfos.size ())
304+ {
305+ ok = ok && luminanceInfos[idx].mexposure == exp0 && luminanceInfos[idx+1 ].mexposure == exp1 && luminanceInfos[idx+2 ].mexposure == exp2;
306+ idx += 3 ;
307+ }
308+ if (idx == luminanceInfos.size ())
309+ {
310+ std::vector<LuminanceInfo> current;
311+ for (int i = 0 ; i < luminanceInfos.size (); i++)
312+ {
313+ current.push_back (luminanceInfos[i]);
314+ if (i % 3 == 2 )
315+ {
316+ splitted.push_back (current);
317+ current.clear ();
318+ }
319+ }
320+ return splitted;
321+ }
322+ }
323+ }
324+
262325 // Split the luminanceInfos into groups which have monotonic values
263326 // (either increasing or decreasing)
264327 std::vector<LuminanceInfo> current;
0 commit comments