Binary files rt_v33/.DS_Store and rt_v34/.DS_Store differ diff -urN rt_v33/cg.py rt_v34/cg.py --- rt_v33/cg.py 2018-05-06 14:01:24.000000000 +0900 +++ rt_v34/cg.py 2018-05-09 00:38:57.000000000 +0900 @@ -11,6 +11,7 @@ import way import wf import rt +import val import dat import img import srvs @@ -36,7 +37,7 @@ ut.mkdir_if_not(name) codec = ut.arg_s('codec', 'H264') - video = img.new_video(codec, name+'.mp4', cnt.fps, w, h, zm) + img.cli.v_open(name, cnt.fps, w, h, zm) eye_f = way.liss_eye() wh2eye = lstx.opt( [ ax.wh_map(w, h), fcx.new(dz), ax.zoom_z(-1), ax.rot_x(90) ] ) @@ -50,14 +51,12 @@ f = rt.draw if 'wf' in sys.argv: f = wf.draw - f(eye2g, wh2eye, sc_sz, video) + f(eye2g, wh2eye, sc_sz) - video.add_img() - fn = ( name if n == 1 else name+'0000{}'.format(i)[-5:] ) + '.jpg' - video.write(fn) + img.cli.v_add_img() if 'no_show' not in sys.argv: wsec = max( cnt.wait_sec(), 0 ) if n > 1 else -1 - video.show_zm('', wsec) - video.clear() - video.fin() + fn_img = val.cli.get_prop('saved_fn_img') + img.show(fn_img, '', wsec, zm) + img.cli.v_close() # EOF diff -urN rt_v33/cmd.py rt_v34/cmd.py --- rt_v33/cmd.py 2018-05-07 22:58:17.000000000 +0900 +++ rt_v34/cmd.py 2018-05-08 20:47:52.000000000 +0900 @@ -34,6 +34,7 @@ host = '' # all port = arg_i('port', 55510) sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sock.bind((host, port)) sock.listen(5) diff -urN rt_v33/cmd_send.py rt_v34/cmd_send.py --- rt_v33/cmd_send.py 2018-05-03 17:43:01.000000000 +0900 +++ rt_v34/cmd_send.py 2018-05-08 20:47:52.000000000 +0900 @@ -7,17 +7,31 @@ def get_port(base, i): return srvs.base_port + base + i +lcl_base = 10 + +port_cp = get_port(lcl_base, 9) + +def rmt_call(rmt_base, cmd): + cmd = 'echo "{}" | nc localhost {}'.format( cmd, get_port(rmt_base, 0) ) + print('cmd={}'.format(cmd)) + return ut.cmd_exec(cmd) + if __name__ == "__main__": - cmd = 0 - exp_lst = [1,2] # val, img - fwd_lst = [0] + list( range(3,10) ) + rmt_base = ut.arg_i('base', 20) + + if 'call' in sys.argv: + i = sys.argv.index('call') + cmd = ' '.join( sys.argv[i+1:] ) + print( rmt_call(rmt_base, cmd) ) + sys.exit(0) + + exp_lst = [1,2,9] # val, img, copy + fwd_lst = [0] + list( range(3,9) ) - lcl_base = 10 rmt_host = ut.arg_s('host', '') if not rmt_host: print('host=?') sys.exit(1) - rmt_base = ut.arg_i('base', 20) f_exp = lambda i: '-R{}:localhost:{}'.format( get_port(lcl_base, i), get_port(lcl_base, i) ) opt_exp = ' '.join( map(f_exp, exp_lst) ) @@ -25,8 +39,12 @@ f_fwd = lambda i: '-L{}:localhost:{}'.format( get_port(rmt_base, i), get_port(lcl_base, i) ) opt_fwd = ' '.join( map(f_fwd, fwd_lst) ) - rmt_cmd = 'cd /tmp ; tar xf - ; ./cmd.py port={}'.format( get_port(lcl_base, cmd) ) - cmd = 'tar cf - cmd.py | ssh {} {} {} "{}"'.format(opt_exp, opt_fwd, rmt_host, rmt_cmd) - print('cmd="{}"'.format(cmd)) + cmd = 'tar cf - cmd.py | nc -l {}'.format(port_cp) + print('cmd={}'.format(cmd)) + ut.th_start(ut.cmd_exec, cmd) + + rmt_cmd = 'export LANG=C ; cd /tmp/ ; ( nc localhost {} | tar xvf - ) ; ./cmd.py'.format(port_cp) + cmd = 'ssh {} {} {} "{}"'.format(opt_exp, opt_fwd, rmt_host, rmt_cmd) + print('cmd={}'.format(cmd)) ut.cmd_exec(cmd) # EOF diff -urN rt_v33/img.c rt_v34/img.c --- rt_v33/img.c 2018-05-04 00:01:26.000000000 +0900 +++ rt_v34/img.c 2018-05-09 00:10:25.000000000 +0900 @@ -3,6 +3,14 @@ #define IMG_WH 0 #define IMG_COL 1 +#define IMG_V_OPEN 2 +#define IMG_V_CLOSE 3 +#define IMG_V_SET 4 +#define IMG_V_LINE 5 +#define IMG_V_ADD_IMG 6 +#define IMG_V_CUR_SEC 7 + + static int fd = -1; void @@ -44,6 +52,7 @@ { int cmd = IMG_COL; int args_sz = sizeof(fn) + sizeof(sec) + sizeof(x) + sizeof(y) + sizeof(*def_col)*3 + sizeof(rep_x) + sizeof(rep_y); + int rets_sz = sizeof(*ret_col)*3; char args_buf[ args_sz ], *bp = args_buf; img_conn(); @@ -56,7 +65,93 @@ bp = COPY_TO_BP(bp, rep_x); bp = COPY_TO_BP(bp, rep_y); - sock_cli_call(fd, cmd, args_sz, args_buf, &args_sz, (char *)ret_col); + sock_cli_call(fd, cmd, args_sz, args_buf, &rets_sz, (char *)ret_col); +} + +/**/ + +void +v_open(char *name, double fps, int w, int h, double zm) +{ + int cmd = IMG_V_OPEN; + int name_sz = strlen(name); + int args_sz = sizeof(name_sz) + name_sz + sizeof(fps) + sizeof(w) + sizeof(h) + sizeof(zm); + char args_buf[ args_sz ], *bp = args_buf; + + img_conn(); + + bp = COPY_TO_BP(bp, name_sz); + bp = COPY_SZ_TO_BP(bp, name, name_sz); + bp = COPY_TO_BP(bp, fps); + bp = COPY_TO_BP(bp, w); + bp = COPY_TO_BP(bp, h); + bp = COPY_TO_BP(bp, zm); + + sock_cli_call(fd, cmd, args_sz, args_buf, NULL, NULL); +} + +void +v_close(void) +{ + int cmd = IMG_V_CLOSE; + + img_conn(); + sock_cli_call(fd, cmd, 0, NULL, NULL, NULL); +} + +void +v_set_xy(int x, int y, int *col) +{ + int cmd = IMG_V_SET; + int args_sz = sizeof(x) + sizeof(y) + sizeof(*col)*3; + char args_buf[ args_sz ], *bp = args_buf; + + img_conn(); + + bp = COPY_TO_BP(bp, x); + bp = COPY_TO_BP(bp, y); + bp = COPY_SZ_TO_BP(bp, col, sizeof(*col)*3); + + sock_cli_call(fd, cmd, args_sz, args_buf, NULL, NULL); +} + +void +v_line(int sx, int sy, int ex, int ey, int *col) +{ + int cmd = IMG_V_LINE; + int args_sz = sizeof(sx) + sizeof(sy) + sizeof(ex) + sizeof(ey) + sizeof(*col)*3; + char args_buf[ args_sz ], *bp = args_buf; + + img_conn(); + + bp = COPY_TO_BP(bp, sx); + bp = COPY_TO_BP(bp, sy); + bp = COPY_TO_BP(bp, ex); + bp = COPY_TO_BP(bp, ey); + bp = COPY_SZ_TO_BP(bp, col, sizeof(*col)*3); + + sock_cli_call(fd, cmd, args_sz, args_buf, NULL, NULL); +} + +void +v_add_img(void) +{ + int cmd = IMG_V_ADD_IMG; + + img_conn(); + sock_cli_call(fd, cmd, 0, NULL, NULL, NULL); +} + +double +v_cur_sec(void) +{ + int cmd = IMG_V_CUR_SEC; + double sec = 0; + int rets_sz = sizeof(sec); + + img_conn(); + sock_cli_call(fd, cmd, 0, NULL, &rets_sz, (char *)&sec); + return sec; } /* EOF */ diff -urN rt_v33/img.h rt_v34/img.h --- rt_v33/img.h 2018-05-01 00:09:19.000000000 +0900 +++ rt_v34/img.h 2018-05-09 00:09:37.000000000 +0900 @@ -9,5 +9,12 @@ void img_wh(int fn, int *wh); void img_col(int fn, double sec, int x, int y, int *def_col, int rep_x, int rep_y, int *ret_col); +void v_open(char *name, double fps, int w, int h, double zm); +void v_close(void); +void v_set_xy(int x, int y, int *col); /* named for v.h */ +void v_line(int sx, int sy, int ex, int ey, int *col); +void v_add_img(void); +double v_cur_sec(void); + #endif diff -urN rt_v33/img.py rt_v34/img.py --- rt_v33/img.py 2018-05-06 14:01:24.000000000 +0900 +++ rt_v34/img.py 2018-05-09 02:33:46.000000000 +0900 @@ -150,6 +150,16 @@ ### +def show_img(img, title='', sec=-1, zm=1): + if zm != 1: + (w, h) = img_wh(img) + img = resize( img, int(w*zm), int(h*zm) ) + cv2.imshow(title, img) + msec = 0 if sec < 0 else max( 1, int(sec * 1000) ) + cv2.waitKey(msec) + +show = lambda fn_img, title='', sec=-1, zm=1: show_img( cv2.imread(fn_img), title, sec, zm ) + def new_wimg(w, h, def_col=[0,0,0]): e = ut.Empty() e.img = np.empty( (h, w, 3), dtype=np.uint8 ) @@ -168,15 +178,7 @@ e.col = lambda x, y: e.img[y, x] if e.in_img(x, y) else def_col e.write = lambda fn: cv2.imwrite(fn, e.img) - - def show(title='', sec=-1, zm=1): - img = e.img - if zm != 1: - img = resize( img, int(w*zm), int(h*zm) ) - cv2.imshow(title, img) - msec = 0 if sec < 0 else max( 1, int(sec * 1000) ) - cv2.waitKey(msec) - e.show = show + e.show = lambda title='', sec=-1, zm=1: show_img(e.img, title, sec, zm) def line(sx, sy, ex, ey, col): r_d = lambda s, e: ( e < s, abs(e - s) ) @@ -211,11 +213,61 @@ e.add_img = add_img e.show_zm = lambda title='', sec=-1: e.show(title, sec, zm) - e.fin = lambda : writer.release() + + def fin(): + writer.release() + cv2.destroyAllWindows() + e.fin = fin + e.i = 0 e.cur_sec = lambda : float(e.i) / fps return e +### + +def new_v_funcs(): + e = ut.Empty() + e.v = None + e.name = '' + + def open(name, fps, w, h, zm): + if e.v: + close() + e.name = name + codec = 'H264' + fn = e.name + '.mp4' + e.v = new_video(codec, fn, fps, w, h, zm) + e.open = open + + def close(): + if e.v: + e.v.fin() + e.v = None + e.name = '' + e.close = close + + e.set = lambda x, y, col: e.v.set(x, y, col) if e.v else None + + e.line = lambda sx, sy, ex, ey, col: e.v.line(sx, sy, ex, ey, col) if e.v else None + + def add_img(): + if e.v: + e.v.add_img() + i = e.v.i + fn_img = e.name + '0000{}'.format(i)[-5:] + '.jpg' + e.v.write(fn_img) + val.cli.set_prop('saved_fn_img', 'str', fn_img) # ! + e.v.clear() + e.add_img = add_img + + e.cur_sec = lambda : e.v.cur_sec() if e.v else 0 + + return e + +v_funcs = new_v_funcs() + +### + def imgs_to_video(img_name, video_name, fps, zm): cmd = 'ls {}[0-9]*.jpg'.format(img_name) lst = ut.cmd_exec(cmd).decode().strip().split('\n') @@ -236,12 +288,12 @@ fn = video_name if fn_typ(fn) != 'v': fn += '.mp4' - n = videos.n(fn) - imgs = videos.imgs(fn) + n = videos.frn(fn) ut.mkdir_if_not(img_name) for i in range(n): - fn = ( img_name+'0000{}'.format(i)[-5:] ) + '.jpg' - cv2.imwrite(fn, imgs[i] ) + img = read_video( videos.get(fn), i ) + fn_i = ( img_name+'0000{}'.format(i)[-5:] ) + '.jpg' + cv2.imwrite(fn_i, img) def video_play(fn): if fn_typ(fn) != 'v': @@ -255,6 +307,27 @@ msec = max( 1, int(sec * 1000) ) cv2.waitKey(msec) +def video_to_3M(video_name): + wk = '/tmp/img_wk' + ut.cmd_exec('rm -rf {} ; mkdir -p {}'.format(wk, wk)) + video_to_imgs('{}/img'.format(wk), video_name) + s = ut.cmd_exec('ls {} | wc -l'.format(wk)).decode().strip() + n = int(s) + print('n={}'.format(n)) + + imgs_to_video('{}/img'.format(wk), '{}/v'.format(wk), 30, 1.0) + sz = ut.get_size('{}/v.mp4'.format(wk)) + print('sz={}'.format(sz)) + + while sz > 3*1024*1024: + n -= 1 + ut.cmd_exec('rm {}'.format(wk) + '/img' + '0000{}'.format(n)[-5:] + '.jpg' ) + imgs_to_video('{}/img'.format(wk), '{}/v'.format(wk), 30, 1.0) + sz = ut.get_size('{}/v.mp4'.format(wk)) + print('sz={}'.format(sz)) + ut.cmd_exec('mv {}/v.mp4 ./'.format(wk)) + print('./v.mp4') + ### wh = lambda id: videos.wh( val.cli.gets(id) ) @@ -262,7 +335,14 @@ cmd_infs = [ { 'cmd': 'wh', 'func': wh, 'args': '(i4)', 'rets': '(i4,i4)' }, - { 'cmd': 'col', 'func': col, 'args':'(i4,f8,i4,i4,col,(i4,i4))', 'rets':'col' }, + { 'cmd': 'col', 'func': col, 'args': '(i4,f8,i4,i4,col,(i4,i4))', 'rets': 'col' }, + + { 'cmd': 'v_open', 'func': v_funcs.open, 'args': '(str,f8,i4,i4,f8)' }, + { 'cmd': 'v_close', 'func': v_funcs.close }, + { 'cmd': 'v_set', 'func': v_funcs.set, 'args': '(i4,i4,col)' }, + { 'cmd': 'v_line', 'func': v_funcs.line, 'args': '(i4,i4,i4,i4,col)' }, + { 'cmd': 'v_add_img', 'func': v_funcs.add_img }, + { 'cmd': 'v_cur_sec', 'func': v_funcs.cur_sec, 'rets': 'f8' }, ] cli = sock.new_client('srv.img', cmd_infs) @@ -292,4 +372,6 @@ video_to_imgs(img_name, video_name) elif cmd == 'play': video_play(video_name) + elif cmd == '3M': + video_to_3M(video_name) # EOF diff -urN rt_v33/rt.c rt_v34/rt.c --- rt_v33/rt.c 2018-05-06 21:09:49.000000000 +0900 +++ rt_v34/rt.c 2018-05-08 20:47:52.000000000 +0900 @@ -353,11 +353,12 @@ if(arg_is(ac, av, 1, "boot")){ char *name = arg_s(ac, av, "name", "srv.rt"); - char *buf = get_prop(name, NULL), *bp = buf; - int port; - - bp = COPY_FROM_BP(bp, port); - free(buf); + int port = arg_i(ac, av, "port", -1); + if(port < 0){ + char *buf = get_prop(name, NULL), *bp = buf; + bp = COPY_FROM_BP(bp, port); + free(buf); + } sock_srv_main_loop(port, sizeof(funcs)/sizeof(*funcs), funcs); } return 0; diff -urN rt_v33/rt.py rt_v34/rt.py --- rt_v33/rt.py 2018-05-06 21:28:39.000000000 +0900 +++ rt_v34/rt.py 2018-05-09 00:41:21.000000000 +0900 @@ -150,11 +150,11 @@ return col -def draw(eye2g, wh2eye, sc_sz, video): +def draw(eye2g, wh2eye, sc_sz): (w, h, d_) = sc_sz wh2g = lstx.opt( wh2eye + [ eye2g ] ) cnt = ut.new_cnt_wh(w, h, 'wh') - sec = video.cur_sec() + ut.arg_f('init_sec', 0.0) + sec = img.cli.v_cur_sec() + ut.arg_f('init_sec', 0.0) show = '-quiet' not in sys.argv lock = threading.Lock() @@ -175,9 +175,7 @@ if col != []: col = np.fmin( col, 255 ) - lock.acquire() - video.set(ix, iy, col) - lock.release() + img.cli.v_set(ix, iy, col) ths = list( map( lambda cli: ut.th_start( func, cli ), clis ) ) for th in ths: @@ -199,12 +197,14 @@ #names = [ 'srv.rt', 'srv.rt-2' ] #names = [ 'srv.rt' ] +#names = [ 'srv.rt-2', 'srv.rt-3', 'srv.rt-4', 'srv.rt-5' ] clis = list( map( new_client, names ) ) if __name__ == "__main__": if ut.arg_is(1, 'boot'): name = ut.arg_s('name', 'srv.rt') - sock.server(name, cmd_infs) + port = ut.arg_i('port', -1) + sock.server(name, cmd_infs, port) sys.exit(0) # EOF diff -urN rt_v33/sock.c rt_v34/sock.c --- rt_v33/sock.c 2018-05-07 22:54:54.000000000 +0900 +++ rt_v34/sock.c 2018-05-08 20:47:52.000000000 +0900 @@ -127,16 +127,18 @@ read(fd, &sz, sizeof(sz)); buf = rets; - if(rets == NULL || rets_sz == NULL || *rets_sz < sz){ - //buf = malloc(sz); - buf = sock_alloc(sz, "sock_cli_call"); - } + if(sz > 0){ + if(rets == NULL || rets_sz == NULL || *rets_sz < sz){ + buf = sock_alloc(sz, "sock_cli_call"); + } - read(fd, buf, sz); + read(fd, buf, sz); - if(rets && rets_sz && sz <= *rets_sz){ - memcpy(rets, buf, *rets_sz); /* best effort */ + if(rets && rets_sz && sz <= *rets_sz && rets != buf){ + memcpy(rets, buf, *rets_sz); /* best effort */ + } } + if(rets_sz){ *rets_sz = sz; } diff -urN rt_v33/sock.py rt_v34/sock.py --- rt_v33/sock.py 2018-05-07 22:47:44.000000000 +0900 +++ rt_v34/sock.py 2018-05-08 20:47:52.000000000 +0900 @@ -157,13 +157,14 @@ sock.shutdown(socket.SHUT_RDWR) sock.close() -def server(name, cmd_infs): +def server(name, cmd_infs, port=-1): import srvs lock = threading.Lock() cmd_infs = cmd_infs_copy(cmd_infs, 'server') - port = srvs.get_port(name) + if port < 0: + port = srvs.get_port(name) sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sock.bind(('localhost', port)) diff -urN rt_v33/src_send.py rt_v34/src_send.py --- rt_v33/src_send.py 2018-05-07 23:17:07.000000000 +0900 +++ rt_v34/src_send.py 2018-05-08 20:47:52.000000000 +0900 @@ -4,44 +4,30 @@ import os import srvs import ut - -def get_port(base, i): - return srvs.base_port + base + i - -def rmt_call(rmt_cmd): - cmd = 'echo "{}" | nc localhost {}'.format( rmt_cmd, get_port(rmt_base, 0) ) - print('rmt_call cmd={}'.format(cmd)) - r = ut.cmd_exec(cmd) - print( r.decode() ) +import cmd_send if __name__ == "__main__": lcl_base = 10 rmt_base = ut.arg_i('base', 20) - path = ut.arg_s('path', '') - if not path: - print('path=?') - sys.exit(1) + path = ut.cmd_exec('pwd').decode().strip() + path = ut.arg_s('path', path) (d, n) = os.path.split(path) if not d: d = './' print('d={} n={}'.format(d, n)) - rmt_cmd = "nc -l {}