aboutsummaryrefslogtreecommitdiff
path: root/lvc/src/diff.rs
blob: fbb6b0a46198322c77aa5b25e40c6a9c2f004af7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
use crate::{Frame, Pixel, Ref, View, P2};

// 4ms
pub fn diff([frame1, frame2]: [&Frame; 2], view: View, rp: Ref) -> u32 {
    let mut k = 0;
    for y in view.a.y..view.b.y {
        for x in view.a.x..view.b.x {
            let pos = P2 { x, y };
            let p1 = frame1[pos + rp.pos_off] + rp.color_off;
            let p2 = frame2[pos];
            k += pixel_diff(p1, p2)
        }
    }
    k
}

#[inline(always)]
pub fn pixel_diff(p1: Pixel, p2: Pixel) -> u32 {
    p1.r.abs_diff(p2.r) as u32 + p1.g.abs_diff(p2.g) as u32 + p1.b.abs_diff(p2.b) as u32
}

// pub fn fast_diff([frame1, frame2]: [&Frame; 2], view: View, rp: Ref) -> u32 {
//     assert!(view.size().x % 5 == 0);

//     let mut diff_lanes = i32x16::from_array([0; 16]);
//     let mut k1 = [0; 32];
//     let mut k2 = [0; 32];

//     let next_line = frame1.size.x as usize - view.size().x as usize;
//     let index_start = view.a.x as usize + view.a.y as usize * frame1.size.x as usize;
//     let index_end = view.b.x as usize + (view.b.y as usize - 1) * frame1.size.x as usize;

//     let mut i = index_start;
//     let mut x = view.a.x;

//     while i < index_end {

//         let f1: &[u8] =
//             unsafe { std::slice::from_raw_parts(frame1.pixels[sl_start..].as_ptr() as *mut u8, sl_size) };
//         let f2: &[u8] =
//             unsafe { std::slice::from_raw_parts(frame2.pixels[sl_start..].as_ptr() as *mut u8, sl_size) };

//         for i in 0..15 {
//             k1[i] = f1[i] as i32;
//             k2[i] = f2[i] as i32;
//         }

//         // for j in 0..5 {
//         //     let j3 = j * 3;
//         //     k1[j3] = frame1.pixels[i + j].r as i32;
//         //     k2[j3] = frame2.pixels[i + j].r as i32;
//         //     k1[j3 + 1] = frame1.pixels[i + j].g as i32;
//         //     k2[j3 + 1] = frame2.pixels[i + j].g as i32;
//         //     k1[j3 + 2] = frame1.pixels[i + j].b as i32;
//         //     k2[j3 + 2] = frame2.pixels[i + j].b as i32;
//         // }
//         let pl1 = i16x32::from_array(k1);
//         let pl2 = i16x32::from_array(k2);
//         diff_lanes += (pl1 - pl2).abs();

//         i += 5;
//         x += 5;
//         if x > view.b.x {
//             i += next_line;
//             x = view.a.x
//         }
//     }

//     return diff_lanes.reduce_sum() as u32;
// }

// pub fn fast_diff([frame1, frame2]: [&Frame; 2], view: View, rp: Ref) -> u32 {
//     let mut diff_lanes = i32x16::from_array([0; 16]);
//     let mut k1 = [0; 16];
//     let mut k2 = [0; 16];

//     let next_line = frame1.size.x as usize - view.size().x as usize;
//     let index_start = view.a.x as usize + view.a.y as usize * frame1.size.x as usize;
//     let index_end = view.b.x as usize + (view.b.y as usize - 1) * frame1.size.x as usize;

//     let mut i = index_start;
//     let mut x = view.a.x;
//     let mut kfill = 0;

//     while i < index_end {
//         k1[kfill] = frame1.pixels[i].r as i32;
//         k2[kfill] = frame2.pixels[i].r as i32;
//         kfill += 1;
//         k1[kfill] = frame1.pixels[i].g as i32;
//         k2[kfill] = frame2.pixels[i].g as i32;
//         kfill += 1;
//         k1[kfill] = frame1.pixels[i].b as i32;
//         k2[kfill] = frame2.pixels[i].b as i32;
//         kfill += 1;

//         i += 1;
//         x += 1;
//         if x > view.b.x {
//             i += next_line;
//             x = view.a.x
//         }

//         if kfill == 15 {
//             let pl1 = i32x16::from_array(k1);
//             let pl2 = i32x16::from_array(k2);
//             diff_lanes += (pl1 - pl2).abs();
//             kfill = 0;
//         }
//     }

//     return diff_lanes.reduce_sum() as u32;
// }