" : " p nl) )
153 |
154 | (skip)
155 | (skip) )
156 |
157 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
158 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
159 | ;;;; ;;;;
160 | ;;;; ;;;;
161 | ;;;; ;;;;
162 | ;;;; ;;;;
163 | ;;;; ;;;;
164 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
165 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
166 |
167 | (defun perm-convert (n) net perm-convert)
168 | (defnet perm-convert (n @m)
169 | (deflocal p)
170 |
171 | (set p <_kv "prm">)
172 | (if (= p undef)
173 | then (set @m n)
174 | else (set @m ) ))
175 |
176 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
177 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
178 | ;;;; ;;;;
179 | ;;;; ;;;;
180 | ;;;; ;;;;
181 | ;;;; ;;;;
182 | ;;;; ;;;;
183 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
184 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
185 |
186 |
--------------------------------------------------------------------------------
/project.tin:
--------------------------------------------------------------------------------
1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3 | ;;;; ;;;;
4 | ;;;; ;;;;
5 | ;;;; ;;;;
6 | ;;;; ;;;;
7 | ;;;; ;;;;
8 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
9 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
10 |
11 | (defnet project-open-cb (self)
12 | (opt (project-open-low self)) )
13 |
14 | (defnet project-open-low (self)
15 | (deflocal a i path)
16 |
17 | (set a (cons (queue) (queue)))
18 | (sqlite3-exec-data _db (netptr project-open-cback) a
19 | "SELECT name,path1,path2 FROM projects ORDER BY name" )
20 | (if (= (length (car a)) 0)
21 | then (iup-warning60 self $"There are no valid projects.")
22 | (fail) )
23 | (set i (iup-choose-menu (car a)))
24 | (integerp i)
25 | (set path (car <(cdr a) i>))
26 | (alt (open-common-low 1 path false)
27 | (sound-iup-error60 self (+ "can't open `" path "'")) )
28 | (set path (cdr <(cdr a) i>))
29 | (alt (open-common 2 path)
30 | (sound-iup-error60 self (+ "can't open `" path "'")) )
31 | (gui-report)
32 | (gui-update-image)
33 | (gui-update) )
34 |
35 | (defnet project-open-cback (a name path1 path2)
36 | (if (and (pathexists path1) (pathexists path2))
37 | then (queue-put (car a) name)
38 | (queue-put (cdr a) (cons path1 path2)) ))
39 |
40 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
41 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
42 | ;;;; ;;;;
43 | ;;;; ;;;;
44 | ;;;; ;;;;
45 | ;;;; ;;;;
46 | ;;;; ;;;;
47 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
48 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
49 |
50 | (defnet project-save-cb (self)
51 | (sqlite3-begin _db)
52 | (alt (seq (project-save-low self)
53 | (sqlite3-end _db)
54 | (gui-update) )
55 | (sqlite3-rollback _db) ))
56 |
57 | (defnet project-save-low (self)
58 | (deflocal path1 path2 name newname)
59 |
60 | (set path1 <_kv "path1">)
61 | (stringp path1)
62 | (set path2 <_kv "path2">)
63 | (stringp path2)
64 | (set path1 (sqlite3-escape-strings path1))
65 | (set path2 (sqlite3-escape-strings path2))
66 | (set name <(sqlite3-exec _db
67 | "SELECT name FROM projects WHERE path1='" path1
68 | "' AND path2='" path2 "' LIMIT 1") 0 0> )
69 | (if (stringp name)
70 | then (set newname name)
71 | (iup-edit-string self $"Rename project" $"Project name" newname)
72 | (stringp newname)
73 | (<> newname "")
74 | (<> newname name)
75 | (alt (sqlite3-exec _db undef
76 | "UPDATE projects SET name='" (sqlite3-escape-strings newname)
77 | "' WHERE name='" (sqlite3-escape-strings name) "'" )
78 | (seq (iup-confirm60 self (+ $"Project `" newname $"' exists. Do you want to overwrite it?"))
79 | (sqlite3-exec _db undef
80 | "DELETE FROM projects WHERE name='" (sqlite3-escape-strings newname) "'")
81 | (sqlite3-exec _db undef
82 | "UPDATE projects SET name='" (sqlite3-escape-strings newname)
83 | "' WHERE name='" (sqlite3-escape-strings name) "'" ))
84 | (seq (sound-iup-error60 self "Database error")
85 | (fail) ))
86 | else (iup-edit-string self $"Save project" $"Project name" name)
87 | (stringp name)
88 | (<> name "")
89 | (alt (sqlite3-exec _db undef
90 | "INSERT INTO projects VALUES('" (sqlite3-escape-strings name)
91 | "','" path1
92 | "','" path2
93 | "')" )
94 | (seq (iup-confirm60 self (+ $"Project `" name $"' exists. Do you want to overwrite it?"))
95 | (sqlite3-exec _db undef
96 | "UPDATE projects SET path1='" path1
97 | "',path2='" path2
98 | "' WHERE name='" (sqlite3-escape-strings name) "'" ))
99 | (seq (sound-iup-error60 self "Database error")
100 | (fail) )))
101 | (iup-info60 self $"Project successfully saved.") )
102 |
103 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
104 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
105 | ;;;; ;;;;
106 | ;;;; ;;;;
107 | ;;;; ;;;;
108 | ;;;; ;;;;
109 | ;;;; ;;;;
110 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
111 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
112 |
113 | (defnet project-delete-cb (self)
114 | (opt (project-delete-low self)
115 | (gui-update) ))
116 |
117 | (defnet project-delete-low (self)
118 | (deflocal av1 av2 path1 path2 name)
119 |
120 | (set av1 <_kv "av1">)
121 | (<> av1 undef)
122 | (set av2 <_kv "av2">)
123 | (<> av2 undef)
124 | (set name <(sqlite3-exec _db
125 | "SELECT name FROM projects WHERE path1='" (sqlite3-escape-strings <_kv "path1">)
126 | "' AND path2='" (sqlite3-escape-strings <_kv "path2">) "' LIMIT 1") 0 0> )
127 | (stringp name)
128 | (iup-confirm60 self (+ $"Project `" name $"' will be deleted." ' ' $"Are you sure?"))
129 | (sqlite3-exec _db undef
130 | "DELETE FROM projects WHERE name='" (sqlite3-escape-strings name) "'")
131 | (iup-info60 self $"Project successfully deleted.") )
132 |
133 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
134 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
135 | ;;;; ;;;;
136 | ;;;; ;;;;
137 | ;;;; ;;;;
138 | ;;;; ;;;;
139 | ;;;; ;;;;
140 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
141 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
142 |
143 | (defnet project-export-cb (self)
144 | (opt (project-export-low self)) )
145 |
146 | (defnet project-export-low (self)
147 | (deflocal av1 av2 path1 path2 name1 name2 path db project-name)
148 |
149 | (set av1 <_kv "av1">)
150 | (<> av1 undef)
151 | (set av2 <_kv "av2">)
152 | (<> av2 undef)
153 | (set path1 <_kv "path1">)
154 | (set path2 <_kv "path2">)
155 | (set name1 (fullpath->name path1))
156 | (set name2 (fullpath->name path2))
157 | (set path1 (sqlite3-escape-strings path1))
158 | (set path2 (sqlite3-escape-strings path2))
159 | (set project-name <(sqlite3-exec _db
160 | "SELECT name FROM projects WHERE path1='" path1
161 | "' AND path2='" path2 "' LIMIT 1") 0 0> )
162 |
163 | (set path (cfg-get "save-path"))
164 | (if (not (stringp path))
165 | then (set path (cfg-get "path")) )
166 | (set path (iup-choose-file-save self
167 | $"Export project data as..."
168 | path
169 | (+ (if (stringp project-name) project-name "project-data") ".cfg")
170 | true ))
171 | (stringp path)
172 |
173 | (cfg-set "save-path" path)
174 |
175 | (opt (remove path))
176 | (set db (sqlite3-open path))
177 | (<> db undef)
178 |
179 | (sqlite3-begin db)
180 | (alt (iup-progress
181 | (thread-create (netptr project-export-th) (thread-self) db av1 av2 path1 path2 name1 name2 project-name)
182 | self "Exporting..." true false false false true )
183 | (seq (sqlite3-rollback db)
184 | (close db)
185 | (remove path)
186 | (sound-iup-error60 self "Error.")
187 | (fail) ))
188 | (sqlite3-end db)
189 | (close db)
190 | (iup-info60 self $"Project data successfully exported.") )
191 |
192 | (defnet project-export-th (th db av1 av2 path1 path2 name1 name2 project-name)
193 | (alt (seq (project-export-th-low th db av1 av2 path1 path2 name1 name2 project-name)
194 | (send "q" to th) )
195 | (send "a" to th) ))
196 |
197 | (defnet project-export-th-low (th db av1 av2 path1 path2 name1 name2 project-name)
198 | (deflocal key)
199 |
200 | (sqlite3-exec db undef
201 | "CREATE TABLE config(" \
202 | "key char unique not null," \
203 | "value char not null)" )
204 | (sqlite3-exec db undef
205 | "CREATE TABLE paths(" \
206 | "path char unique not null," \
207 | "name char not null)" )
208 | (sqlite3-exec db undef
209 | "CREATE TABLE projects(" \
210 | "name char unique not null," \
211 | "path1 char not null," \
212 | "path2 char not null)" )
213 |
214 | (sqlite3-exec db undef
215 | "INSERT INTO paths VALUES('"
216 | path1 "','"
217 | (sqlite3-escape-strings name1) "')" )
218 | (sqlite3-exec db undef
219 | "INSERT INTO paths VALUES('"
220 | path2 "','"
221 | (sqlite3-escape-strings name2) "')" )
222 |
223 | (if (stringp project-name)
224 | then (sqlite3-exec db undef
225 | "INSERT INTO projects VALUES('" (sqlite3-escape-strings project-name)
226 | "','" path1
227 | "','" path2
228 | "')" ))
229 |
230 | (set key (key-scd av1 name1))
231 | (cfg-set-low db key (cfg-get key))
232 | (set key (key-scd av2 name2))
233 | (cfg-set-low db key (cfg-get key))
234 | (set key (key-sck av1 av2 name1 name2))
235 | (cfg-set-low db key (cfg-get key))
236 | (set key (key-map av1 av2 name1 name2))
237 | (cfg-set-low db key (cfg-get key))
238 | (set key (key-prm av1 av2 name1 name2))
239 | (cfg-set-low db key (cfg-get key))
240 |
241 | (sqlite3-exec db undef
242 | "CREATE INDEX paths_name ON paths(name)" )
243 | (sqlite3-exec db undef
244 | "CREATE INDEX projects_path1 ON projects(path1)" )
245 | (sqlite3-exec db undef
246 | "CREATE INDEX projects_path2 ON projects(path2)" ))
247 |
248 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
249 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
250 | ;;;; ;;;;
251 | ;;;; ;;;;
252 | ;;;; ;;;;
253 | ;;;; ;;;;
254 | ;;;; ;;;;
255 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
256 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
257 |
258 |
--------------------------------------------------------------------------------
/scdscan.tin:
--------------------------------------------------------------------------------
1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3 | ;;;; ;;;;
4 | ;;;; ;;;;
5 | ;;;; ;;;;
6 | ;;;; ;;;;
7 | ;;;; ;;;;
8 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
9 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
10 |
11 | (defnet scdscan (th-main name av pix default-info which @v)
12 | (deflocal key)
13 |
14 | (pix-wip pix)
15 | (opt (gui-draw-image-th th-main))
16 | (sendbuf 100 (cons "p2" "scanning ") to th-main)
17 | (sendbuf 100 (cons "p2c" (cons (blue) name)) to th-main)
18 | (sendbuf 100 (cons "p2" "...\n") to th-main)
19 | (set key (key-scd av name))
20 | (set @v (cfg-get key))
21 | (if (<> @v undef)
22 | then (set @v <@v 4>)
23 | else (set @v (array default 0 (- (av-approximated-number-of-frames av) 1)))
24 | (if (and (cmingw) (= (csysbits) 32))
25 | then (scdscan-low-alternate th-main name av pix default-info (my-av-par which av) @v)
26 | else (scdscan-low th-main name av pix default-info (my-av-par which av) @v) )
27 | (cfg-set key (list (width av) (height av) (av-approximated-number-of-frames av) name @v)) ))
28 |
29 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
30 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
31 | ;;;; ;;;;
32 | ;;;; ;;;;
33 | ;;;; ;;;;
34 | ;;;; ;;;;
35 | ;;;; ;;;;
36 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
37 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
38 |
39 | (defnet scdscan-low (th-main name av pix default-info par v)
40 | (deflocal path nthreads nframes t d threads th tot msg i)
41 |
42 | (set path (av-path av))
43 | (set nthreads (cfg-get-or-default-num "scd-threads" default-info))
44 | (set nframes (+ (length v) 1))
45 |
46 | (set t (now))
47 |
48 | (repeat (set d (/ (- (length v) 1) nthreads))
49 | until (= nthreads 1)
50 | until (>= d 10)
51 | (dec nthreads) )
52 | (set threads (array nthreads))
53 | (for i in 1 .. nthreads do
54 | (set (thread-create (netptr scdscan-segment-th)
55 | (thread-self)
56 | path
57 | (floor (* d (for-pos)))
58 | (+ (ceil (* d i)) 1) v )))
59 |
60 | (sendbuf 100 (cons "p2" "scanning threads: ") to th-main)
61 | (sendbuf 100 (cons "p2c" (cons (blue) (sprint nthreads nl))) to th-main)
62 |
63 | (set tot 0)
64 |
65 | (while (> (length threads) 0) do
66 | (receive msg from th in threads)
67 | (alt (seq (integerp msg)
68 | (set tot (min (+ tot msg) nframes))
69 | (sendbuf 100 (cons "c1" (+ "frame " tot "/" nframes
70 | " (" (rint (/ tot (- (now) t))) " fps) ("
71 | (rint (/ tot nframes 0.01)) "%)" ))
72 | to th-main ))
73 | (seq (or (= msg "q") (= (car msg) "e"))
74 | (if (= (car msg) "e")
75 | then (if (integerp (cdr msg))
76 | then (sendbuf 100 (cons "p2"
77 | (+ $"frame # " (cdr msg) $" is not recoverable by a seek" nl) )
78 | to th-main )
79 | (sendbuf 100 (cons "p2c" (cons (red)
80 | (+ $"too irregular timestamps not supported\n(more info in the guide)" nl) ))
81 | to th-main ))
82 | (set <_abort 0> true) )
83 | (in th threads i)
84 | (array-remove threads i)
85 | (thread-join th) )
86 | (success) ))
87 |
88 | (not <_abort 0>)
89 | (sendbuf 100 (cons "c1" (+ "frame " nframes "/" nframes
90 | " (" (rint (/ tot (- (now) t))) " fps) (100%)")) to th-main ))
91 |
92 | (defnet scdscan-segment-th (th path beg end v)
93 | (deflocal res)
94 |
95 | (set res (array 1))
96 | (alt (seq (scdscan-segment-low th path beg end v res)
97 | (send "q" to th) )
98 | (send (cons "e" ) to th) ))
99 |
100 | (defnet scdscan-segment-low (th path beg end v res)
101 | (deflocal av frm hst frameno cnt prv)
102 |
103 | (set av (av-avformat-open-input path))
104 | (<> av undef)
105 |
106 | (set frm (pix-create (width av) (height av)))
107 | (pixp frm)
108 |
109 | (set hst (array 2))
110 | (set (raw 256))
111 | (rawp )
112 | (set (raw 256))
113 | (rawp )
114 |
115 | (set end (min end (- (length v) 1)))
116 |
117 | (set frameno beg)
118 | (set cnt 0)
119 | (set prv 0)
120 |
121 | (alt (seq (av-read-frame av frm frameno)
122 | (= (av-frameno av) frameno)
123 | (truep (av-is-frame-recoverable av))
124 | (pix-scd-histogram-set frm ) )
125 | (seq (close av frm )
126 | (set frameno)
127 | (fail) ))
128 |
129 | (while (not <_abort 0>) do
130 | (inc frameno)
131 | until (> frameno end)
132 | (inc cnt)
133 | (alt (seq (av-read-frame av frm frameno)
134 | (= (av-frameno av) frameno)
135 | (truep (av-is-frame-recoverable av))
136 | (pix-scd-histogram-set frm )
137 | (set (pix-scd-histogram-dist ))
138 | (if (= (% cnt 100) 0)
139 | then (sendbuf 30 (- cnt prv) to th)
140 | (set prv cnt) ))
141 | (seq ; hack che rende tollerabile l'illeggibilità
142 | ; di (pochi) ultimi frame
143 | (< (- (length v) frameno) 150)
144 | (set frameno end) )
145 | (seq (close av frm )
146 | (set frameno)
147 | (fail) )))
148 | (close av frm )
149 | (not <_abort 0>)
150 | (if (> cnt prv)
151 | then (send (- cnt prv) to th) ))
152 |
153 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
154 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
155 | ;;;; ;;;;
156 | ;;;; ;;;;
157 | ;;;; ;;;;
158 | ;;;; ;;;;
159 | ;;;; ;;;;
160 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
161 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
162 |
163 | (defnet scdscan-low-alternate (th-main name av pix default-info par v)
164 | (deflocal done abort l l1 hst idx frameno t)
165 |
166 | (av-rewind av)
167 |
168 | (set l1 (length v))
169 | (set l (+ l1 1))
170 |
171 | (set hst (array 2))
172 | (set (raw 256))
173 | (set (raw 256))
174 |
175 | (set t (now))
176 |
177 | (av-read-scd-histogram-set av )
178 | (set idx 1)
179 | (set done false)
180 | (set abort false)
181 | (repeat (alt (av-read-scd-histogram-set av )
182 | (set done true) )
183 | until done
184 | (set frameno (av-frameno av))
185 | until (>= frameno l1)
186 | (if (not (av-is-frame-recoverable av))
187 | then (sendbuf 100 (cons "p2" (+ $"frame # " frameno $" is not recoverable by a seek" nl
188 | $"expected timestamp" ": " (approx4 (av-frameno2ts av frameno)) " s" nl
189 | $"detected timestamp" ": " (approx4 (* (av-ts av) (av-time-base av (av-video-stream-idx av)))) " s"
190 | nl )) to th-main )
191 | (sendbuf 100 (cons "p2c" (cons (red) (+ $"too irregular timestamps not supported\n(more info in the guide)" nl ))) to th-main)
192 | (set abort true) )
193 | (if <_abort 0>
194 | then (set abort true) )
195 | until abort
196 | (set (pix-scd-histogram-dist ))
197 | (if (= (% frameno 100) 0)
198 | then (sendbuf 100 (cons "c1" (+ "frame " frameno "/" l " (" (rint (/ frameno (- (now) t)))
199 | " fps) (" (rint (/ frameno l 0.01)) "%)" ))
200 | to th-main ))
201 | (set idx (- 1 idx)) )
202 |
203 | (close )
204 | (not abort)
205 | (sendbuf 100 (cons "c1" (+ "frame " l "/" l " (" (rint (/ frameno (- (now) t))) " fps) (100%)")) to th-main) )
206 |
207 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
208 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
209 | ;;;; ;;;;
210 | ;;;; ;;;;
211 | ;;;; ;;;;
212 | ;;;; ;;;;
213 | ;;;; ;;;;
214 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
215 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
216 |
217 |
--------------------------------------------------------------------------------
/sift.tin:
--------------------------------------------------------------------------------
1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3 | ;;;; ;;;;
4 | ;;;; ;;;;
5 | ;;;; ;;;;
6 | ;;;; ;;;;
7 | ;;;; ;;;;
8 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
9 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
10 |
11 | (defnet sift-check (alternate m p1 p2 @score)
12 | (deflocal cache key)
13 |
14 | (opt (match-receivenb m))
15 | (not (match-abort m))
16 | (set cache (match-cache m))
17 | (set key (+ (int->str p1 6 '0') (int->str p2 6 '0')))
18 | (set @score )
19 | (if (= @score undef)
20 | then (sift-check-basic alternate m p1 p2 cache key @score) )
21 | (if (booleanp @score)
22 | then (= @score true)
23 | (set @score 0) ))
24 |
25 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
26 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
27 | ;;;; ;;;;
28 | ;;;; ;;;;
29 | ;;;; ;;;;
30 | ;;;; ;;;;
31 | ;;;; ;;;;
32 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
33 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
34 |
35 | (defnet sift-check-basic (alternate m p1 p2 cache key @score)
36 | (deflocal av1 av2 frm1 frm2 dlum filt1 filt2 k1 k2)
37 |
38 | (msg-log m (+ "sift check: " p1 " <-> " p2 nl))
39 | (set av1 (match-av1 m))
40 | (set av2 (match-av2 m))
41 | (set frm1 (match-frm1 m))
42 | (set frm2 (match-frm2 m))
43 | (sift-read-frame m av1 p1 frm1)
44 | (sift-read-frame m av2 (perm-convert p2) frm2)
45 | (if (match-params m "filter-mirror1")
46 | then (pix-hflip frm1) )
47 | (if (match-params m "filter-flip1")
48 | then (pix-vflip frm1) )
49 | (if (match-params m "filter-mirror2")
50 | then (pix-hflip frm2) )
51 | (if (match-params m "filter-flip2")
52 | then (pix-vflip frm2) )
53 | (send frm1 to (match-th-sift1 m))
54 | (send frm2 to (match-th-sift2 m))
55 | (set dlum (/ (- (pix-get-luminance frm1) (pix-get-luminance frm2)) 255))
56 | (pix-copy-frames (match-pix m) frm1 frm2 (match-pix1 m) (match-pix2 m)
57 | (match-params m "filter-gamma1") (match-params m "filter-gamma2") )
58 | (sift-draw-image m)
59 | (receive filt1 from (match-th-sift1 m))
60 | (receive filt2 from (match-th-sift2 m))
61 | (alt (seq (not (match-abort m))
62 | (set k1 (if (= filt1 undef) 0 (length filt1)))
63 | (set k2 (if (= filt2 undef) 0 (length filt2)))
64 | (if (< (min k1 k2) (match-params m "min-keypoints"))
65 | then (if alternate
66 | then (sift-check-too-few-keypoints m p1 p2 filt1 filt2 k1 k2 dlum @score)
67 | else (set @score true) )
68 | else (sift-check-enough-keypoints m filt1 filt2 k1 k2 dlum @score) )
69 | (set @score)
70 | (if (booleanp @score)
71 | then (if @score
72 | then (inc )
73 | else (if (match-params m "sift-draw-lines")
74 | then (sift-draw-x m)
75 | (sift-draw-image m) )))
76 | (not (match-abort m))
77 | (close filt1 filt2) )
78 | (seq (close filt1 filt2)
79 | (fail) )))
80 |
81 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
82 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
83 | ;;;; ;;;;
84 | ;;;; ;;;;
85 | ;;;; ;;;;
86 | ;;;; ;;;;
87 | ;;;; ;;;;
88 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
89 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
90 |
91 | (defnet sift-check-too-few-keypoints (m p1 p2 filt1 filt2 k1 k2 dlum @score)
92 | (if (< (max k1 k2) (match-params m "min-keypoints"))
93 | then (set @score true)
94 | else (if (< 40)
95 | then (msg-log m (+ "delayed (dlum=" (approx3 dlum) ")" nl))
96 | (fail) )
97 | (if (> (abs (- dlum (/