Loading app/src/main/java/net/sourceforge/opencamera/HDRProcessor.java +38 −5 Original line number Diff line number Diff line Loading @@ -1856,6 +1856,14 @@ public class HDRProcessor { sort_cb.sortOrder(sort_order); } } /*{ // test for(int i = 0; i < luminanceInfos.length-1; i++) { if( luminanceInfos[i].compareTo(luminanceInfos[i+1]) == 0 ) { throw new RuntimeException("this: " + luminanceInfos[i] + " , that: " + luminanceInfos[i+1]); } } }*/ int median_brightness = -1; if( use_mtb ) { Loading Loading @@ -2174,18 +2182,20 @@ public class HDRProcessor { public static class LuminanceInfo implements Comparable<LuminanceInfo> { final int min_value; final int median_value; final int hi_value; final boolean noisy; public LuminanceInfo(int min_value, int median_value, boolean noisy) { public LuminanceInfo(int min_value, int median_value, int hi_value, boolean noisy) { this.min_value = min_value; this.median_value = median_value; this.hi_value = hi_value; this.noisy = noisy; } @Override @NonNull public String toString() { return "min: " + min_value + " , median: " + median_value + " , noisy: " + noisy; return "min: " + min_value + " , median: " + median_value + " , hi: " + hi_value + " , noisy: " + noisy; } @Override Loading @@ -2195,6 +2205,10 @@ public class HDRProcessor { // fall back to using min_value value = this.min_value - o.min_value; } if( value == 0 ) { // fall back to using hi_value value = this.hi_value - o.hi_value; } return value; } } Loading Loading @@ -2243,7 +2257,26 @@ public class HDRProcessor { int middle = total/2; int count = 0; boolean noisy = false; int min_value = -1; int min_value = -1, hi_value = -1; // first count backwards to get hi_value for(int i=255;i>=0;i--) { /*if( histo[i] > 0 ) { if( MyDebug.LOG ) Log.d(TAG, "max luminance " + i); max_value = i; break; }*/ count += histo[i]; if( count >= total/10 ) { if( MyDebug.LOG ) Log.d(TAG, "hi luminance " + i); hi_value = i; break; } } // then count forwards to get min and median values count = 0; for(int i=0;i<256;i++) { count += histo[i]; if( min_value == -1 && histo[i] > 0 ) { Loading Loading @@ -2278,11 +2311,11 @@ public class HDRProcessor { Log.d(TAG, "too dark/noisy"); noisy = true; } return new LuminanceInfo(min_value, i, noisy); return new LuminanceInfo(min_value, i, hi_value, noisy); } } Log.e(TAG, "computeMedianLuminance failed"); return new LuminanceInfo(min_value, 127, true); return new LuminanceInfo(min_value, 127, hi_value, true); } @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) Loading app/src/test/java/net/sourceforge/opencamera/test/UnitTest.java +34 −15 Original line number Diff line number Diff line Loading @@ -881,9 +881,9 @@ public class UnitTest { List<HDRProcessor.LuminanceInfo> luminanceInfosSorted; luminanceInfos.clear(); luminanceInfos.add(new HDRProcessor.LuminanceInfo(0, 64, false)); luminanceInfos.add(new HDRProcessor.LuminanceInfo(16, 80, false)); luminanceInfos.add(new HDRProcessor.LuminanceInfo(33, 116, false)); luminanceInfos.add(new HDRProcessor.LuminanceInfo(0, 64, 255, false)); luminanceInfos.add(new HDRProcessor.LuminanceInfo(16, 80, 255, false)); luminanceInfos.add(new HDRProcessor.LuminanceInfo(33, 116, 255, false)); luminanceInfosSorted = new ArrayList<>(luminanceInfos); Collections.sort(luminanceInfosSorted); assertEquals(luminanceInfos.size(), luminanceInfosSorted.size()); Loading @@ -892,9 +892,9 @@ public class UnitTest { assertEquals(luminanceInfos.get(2), luminanceInfosSorted.get(2)); luminanceInfos.clear(); luminanceInfos.add(new HDRProcessor.LuminanceInfo(16, 80, false)); luminanceInfos.add(new HDRProcessor.LuminanceInfo(0, 64, false)); luminanceInfos.add(new HDRProcessor.LuminanceInfo(33, 116, false)); luminanceInfos.add(new HDRProcessor.LuminanceInfo(16, 80,255, false)); luminanceInfos.add(new HDRProcessor.LuminanceInfo(0, 64, 255, false)); luminanceInfos.add(new HDRProcessor.LuminanceInfo(33, 116, 255, false)); luminanceInfosSorted = new ArrayList<>(luminanceInfos); Collections.sort(luminanceInfosSorted); assertEquals(luminanceInfos.size(), luminanceInfosSorted.size()); Loading @@ -903,9 +903,9 @@ public class UnitTest { assertEquals(luminanceInfos.get(2), luminanceInfosSorted.get(2)); luminanceInfos.clear(); luminanceInfos.add(new HDRProcessor.LuminanceInfo(33, 116, false)); luminanceInfos.add(new HDRProcessor.LuminanceInfo(0, 64, false)); luminanceInfos.add(new HDRProcessor.LuminanceInfo(16, 80, false)); luminanceInfos.add(new HDRProcessor.LuminanceInfo(33, 116, 255, false)); luminanceInfos.add(new HDRProcessor.LuminanceInfo(0, 64, 255, false)); luminanceInfos.add(new HDRProcessor.LuminanceInfo(16, 80, 255, false)); luminanceInfosSorted = new ArrayList<>(luminanceInfos); Collections.sort(luminanceInfosSorted); assertEquals(luminanceInfos.size(), luminanceInfosSorted.size()); Loading @@ -915,9 +915,9 @@ public class UnitTest { // case that requires using min value as well as median value luminanceInfos.clear(); luminanceInfos.add(new HDRProcessor.LuminanceInfo(93, 255, false)); luminanceInfos.add(new HDRProcessor.LuminanceInfo(68, 255, false)); luminanceInfos.add(new HDRProcessor.LuminanceInfo(17, 193, false)); luminanceInfos.add(new HDRProcessor.LuminanceInfo(93, 255, 255, false)); luminanceInfos.add(new HDRProcessor.LuminanceInfo(68, 255, 255, false)); luminanceInfos.add(new HDRProcessor.LuminanceInfo(17, 193, 255, false)); luminanceInfosSorted = new ArrayList<>(luminanceInfos); Collections.sort(luminanceInfosSorted); assertEquals(luminanceInfos.size(), luminanceInfosSorted.size()); Loading @@ -927,14 +927,33 @@ public class UnitTest { // case that should never use min value luminanceInfos.clear(); luminanceInfos.add(new HDRProcessor.LuminanceInfo(60, 255, false)); luminanceInfos.add(new HDRProcessor.LuminanceInfo(70, 240, false)); luminanceInfos.add(new HDRProcessor.LuminanceInfo(80, 95, false)); luminanceInfos.add(new HDRProcessor.LuminanceInfo(60, 255, 255, false)); luminanceInfos.add(new HDRProcessor.LuminanceInfo(70, 240, 255, false)); luminanceInfos.add(new HDRProcessor.LuminanceInfo(80, 95, 255, false)); luminanceInfosSorted = new ArrayList<>(luminanceInfos); Collections.sort(luminanceInfosSorted); assertEquals(luminanceInfos.size(), luminanceInfosSorted.size()); assertEquals(luminanceInfos.get(2), luminanceInfosSorted.get(0)); assertEquals(luminanceInfos.get(1), luminanceInfosSorted.get(1)); assertEquals(luminanceInfos.get(0), luminanceInfosSorted.get(2)); // case that requires using hi value as well as median and min values luminanceInfos.clear(); luminanceInfos.add(new HDRProcessor.LuminanceInfo(17, 31, 100, false)); luminanceInfos.add(new HDRProcessor.LuminanceInfo(34, 127, 255, false)); luminanceInfos.add(new HDRProcessor.LuminanceInfo(93, 255, 255, false)); luminanceInfos.add(new HDRProcessor.LuminanceInfo(68, 255, 255, false)); luminanceInfos.add(new HDRProcessor.LuminanceInfo(0, 0, 90, false)); luminanceInfos.add(new HDRProcessor.LuminanceInfo(0, 0, 80, false)); luminanceInfosSorted = new ArrayList<>(luminanceInfos); Collections.sort(luminanceInfosSorted); assertEquals(luminanceInfos.size(), luminanceInfosSorted.size()); assertEquals(luminanceInfos.get(5), luminanceInfosSorted.get(0)); assertEquals(luminanceInfos.get(4), luminanceInfosSorted.get(1)); assertEquals(luminanceInfos.get(0), luminanceInfosSorted.get(2)); assertEquals(luminanceInfos.get(1), luminanceInfosSorted.get(3)); assertEquals(luminanceInfos.get(3), luminanceInfosSorted.get(4)); assertEquals(luminanceInfos.get(2), luminanceInfosSorted.get(5)); } } Loading
app/src/main/java/net/sourceforge/opencamera/HDRProcessor.java +38 −5 Original line number Diff line number Diff line Loading @@ -1856,6 +1856,14 @@ public class HDRProcessor { sort_cb.sortOrder(sort_order); } } /*{ // test for(int i = 0; i < luminanceInfos.length-1; i++) { if( luminanceInfos[i].compareTo(luminanceInfos[i+1]) == 0 ) { throw new RuntimeException("this: " + luminanceInfos[i] + " , that: " + luminanceInfos[i+1]); } } }*/ int median_brightness = -1; if( use_mtb ) { Loading Loading @@ -2174,18 +2182,20 @@ public class HDRProcessor { public static class LuminanceInfo implements Comparable<LuminanceInfo> { final int min_value; final int median_value; final int hi_value; final boolean noisy; public LuminanceInfo(int min_value, int median_value, boolean noisy) { public LuminanceInfo(int min_value, int median_value, int hi_value, boolean noisy) { this.min_value = min_value; this.median_value = median_value; this.hi_value = hi_value; this.noisy = noisy; } @Override @NonNull public String toString() { return "min: " + min_value + " , median: " + median_value + " , noisy: " + noisy; return "min: " + min_value + " , median: " + median_value + " , hi: " + hi_value + " , noisy: " + noisy; } @Override Loading @@ -2195,6 +2205,10 @@ public class HDRProcessor { // fall back to using min_value value = this.min_value - o.min_value; } if( value == 0 ) { // fall back to using hi_value value = this.hi_value - o.hi_value; } return value; } } Loading Loading @@ -2243,7 +2257,26 @@ public class HDRProcessor { int middle = total/2; int count = 0; boolean noisy = false; int min_value = -1; int min_value = -1, hi_value = -1; // first count backwards to get hi_value for(int i=255;i>=0;i--) { /*if( histo[i] > 0 ) { if( MyDebug.LOG ) Log.d(TAG, "max luminance " + i); max_value = i; break; }*/ count += histo[i]; if( count >= total/10 ) { if( MyDebug.LOG ) Log.d(TAG, "hi luminance " + i); hi_value = i; break; } } // then count forwards to get min and median values count = 0; for(int i=0;i<256;i++) { count += histo[i]; if( min_value == -1 && histo[i] > 0 ) { Loading Loading @@ -2278,11 +2311,11 @@ public class HDRProcessor { Log.d(TAG, "too dark/noisy"); noisy = true; } return new LuminanceInfo(min_value, i, noisy); return new LuminanceInfo(min_value, i, hi_value, noisy); } } Log.e(TAG, "computeMedianLuminance failed"); return new LuminanceInfo(min_value, 127, true); return new LuminanceInfo(min_value, 127, hi_value, true); } @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) Loading
app/src/test/java/net/sourceforge/opencamera/test/UnitTest.java +34 −15 Original line number Diff line number Diff line Loading @@ -881,9 +881,9 @@ public class UnitTest { List<HDRProcessor.LuminanceInfo> luminanceInfosSorted; luminanceInfos.clear(); luminanceInfos.add(new HDRProcessor.LuminanceInfo(0, 64, false)); luminanceInfos.add(new HDRProcessor.LuminanceInfo(16, 80, false)); luminanceInfos.add(new HDRProcessor.LuminanceInfo(33, 116, false)); luminanceInfos.add(new HDRProcessor.LuminanceInfo(0, 64, 255, false)); luminanceInfos.add(new HDRProcessor.LuminanceInfo(16, 80, 255, false)); luminanceInfos.add(new HDRProcessor.LuminanceInfo(33, 116, 255, false)); luminanceInfosSorted = new ArrayList<>(luminanceInfos); Collections.sort(luminanceInfosSorted); assertEquals(luminanceInfos.size(), luminanceInfosSorted.size()); Loading @@ -892,9 +892,9 @@ public class UnitTest { assertEquals(luminanceInfos.get(2), luminanceInfosSorted.get(2)); luminanceInfos.clear(); luminanceInfos.add(new HDRProcessor.LuminanceInfo(16, 80, false)); luminanceInfos.add(new HDRProcessor.LuminanceInfo(0, 64, false)); luminanceInfos.add(new HDRProcessor.LuminanceInfo(33, 116, false)); luminanceInfos.add(new HDRProcessor.LuminanceInfo(16, 80,255, false)); luminanceInfos.add(new HDRProcessor.LuminanceInfo(0, 64, 255, false)); luminanceInfos.add(new HDRProcessor.LuminanceInfo(33, 116, 255, false)); luminanceInfosSorted = new ArrayList<>(luminanceInfos); Collections.sort(luminanceInfosSorted); assertEquals(luminanceInfos.size(), luminanceInfosSorted.size()); Loading @@ -903,9 +903,9 @@ public class UnitTest { assertEquals(luminanceInfos.get(2), luminanceInfosSorted.get(2)); luminanceInfos.clear(); luminanceInfos.add(new HDRProcessor.LuminanceInfo(33, 116, false)); luminanceInfos.add(new HDRProcessor.LuminanceInfo(0, 64, false)); luminanceInfos.add(new HDRProcessor.LuminanceInfo(16, 80, false)); luminanceInfos.add(new HDRProcessor.LuminanceInfo(33, 116, 255, false)); luminanceInfos.add(new HDRProcessor.LuminanceInfo(0, 64, 255, false)); luminanceInfos.add(new HDRProcessor.LuminanceInfo(16, 80, 255, false)); luminanceInfosSorted = new ArrayList<>(luminanceInfos); Collections.sort(luminanceInfosSorted); assertEquals(luminanceInfos.size(), luminanceInfosSorted.size()); Loading @@ -915,9 +915,9 @@ public class UnitTest { // case that requires using min value as well as median value luminanceInfos.clear(); luminanceInfos.add(new HDRProcessor.LuminanceInfo(93, 255, false)); luminanceInfos.add(new HDRProcessor.LuminanceInfo(68, 255, false)); luminanceInfos.add(new HDRProcessor.LuminanceInfo(17, 193, false)); luminanceInfos.add(new HDRProcessor.LuminanceInfo(93, 255, 255, false)); luminanceInfos.add(new HDRProcessor.LuminanceInfo(68, 255, 255, false)); luminanceInfos.add(new HDRProcessor.LuminanceInfo(17, 193, 255, false)); luminanceInfosSorted = new ArrayList<>(luminanceInfos); Collections.sort(luminanceInfosSorted); assertEquals(luminanceInfos.size(), luminanceInfosSorted.size()); Loading @@ -927,14 +927,33 @@ public class UnitTest { // case that should never use min value luminanceInfos.clear(); luminanceInfos.add(new HDRProcessor.LuminanceInfo(60, 255, false)); luminanceInfos.add(new HDRProcessor.LuminanceInfo(70, 240, false)); luminanceInfos.add(new HDRProcessor.LuminanceInfo(80, 95, false)); luminanceInfos.add(new HDRProcessor.LuminanceInfo(60, 255, 255, false)); luminanceInfos.add(new HDRProcessor.LuminanceInfo(70, 240, 255, false)); luminanceInfos.add(new HDRProcessor.LuminanceInfo(80, 95, 255, false)); luminanceInfosSorted = new ArrayList<>(luminanceInfos); Collections.sort(luminanceInfosSorted); assertEquals(luminanceInfos.size(), luminanceInfosSorted.size()); assertEquals(luminanceInfos.get(2), luminanceInfosSorted.get(0)); assertEquals(luminanceInfos.get(1), luminanceInfosSorted.get(1)); assertEquals(luminanceInfos.get(0), luminanceInfosSorted.get(2)); // case that requires using hi value as well as median and min values luminanceInfos.clear(); luminanceInfos.add(new HDRProcessor.LuminanceInfo(17, 31, 100, false)); luminanceInfos.add(new HDRProcessor.LuminanceInfo(34, 127, 255, false)); luminanceInfos.add(new HDRProcessor.LuminanceInfo(93, 255, 255, false)); luminanceInfos.add(new HDRProcessor.LuminanceInfo(68, 255, 255, false)); luminanceInfos.add(new HDRProcessor.LuminanceInfo(0, 0, 90, false)); luminanceInfos.add(new HDRProcessor.LuminanceInfo(0, 0, 80, false)); luminanceInfosSorted = new ArrayList<>(luminanceInfos); Collections.sort(luminanceInfosSorted); assertEquals(luminanceInfos.size(), luminanceInfosSorted.size()); assertEquals(luminanceInfos.get(5), luminanceInfosSorted.get(0)); assertEquals(luminanceInfos.get(4), luminanceInfosSorted.get(1)); assertEquals(luminanceInfos.get(0), luminanceInfosSorted.get(2)); assertEquals(luminanceInfos.get(1), luminanceInfosSorted.get(3)); assertEquals(luminanceInfos.get(3), luminanceInfosSorted.get(4)); assertEquals(luminanceInfos.get(2), luminanceInfosSorted.get(5)); } }