diff -urN rt_v41/cg.py rt_v42/cg.py --- rt_v41/cg.py 2018-05-17 11:49:32.000000000 +0900 +++ rt_v42/cg.py 2018-05-30 02:56:18.000000000 +0900 @@ -65,7 +65,7 @@ fn = name + '.mp4' # ! if ut.exists(fn) and ut.get_size(fn) > 3*1024*1024: - img.video_to_d1v3M(fn) + img.video_to_div3M(fn) if n > 1 and (w,h,cnt.fps) != (640,480,30): est_hour = cnt.get_total_sec() * (640.0 / w) * (480.0 / h) * (30.0 / cnt.fps) / 60 / 60 diff -urN rt_v41/img.c rt_v42/img.c --- rt_v41/img.c 2018-05-12 01:57:58.000000000 +0900 +++ rt_v42/img.c 2018-05-29 21:41:28.000000000 +0900 @@ -28,6 +28,9 @@ #define IMG_WH 0 #define IMG_COL 1 +#define IMG_FRN 2 +#define IMG_FPS 3 +#define IMG_COL_WH 4 static int fd_img = -1; @@ -72,6 +75,132 @@ sock_cli_call(fd, cmd, args_sz, args_buf, &rets_sz, (char *)ret_col); } +int +img_frn(int fn) +{ + int cmd = IMG_FRN; + int frn; + int rets_sz = sizeof(frn); + int fd = img_conn(); + sock_cli_call(fd, cmd, sizeof(fn), (char *)&fn, &rets_sz, (char *)&frn); + return frn; +} + +double +img_fps(int fn) +{ + int cmd = IMG_FPS; + double fps; + int rets_sz = sizeof(fps); + int fd = img_conn(); + sock_cli_call(fd, cmd, sizeof(fn), (char *)&fn, &rets_sz, (char *)&fps); + return fps; +} + +unsigned char * +img_col_wh(int fn, double sec, int *rets_sz) +{ + int cmd = IMG_COL_WH; + int args_sz = sizeof(fn) + sizeof(sec); + char args_buf[ args_sz ], *bp = args_buf, *rets; + int n; + unsigned char *img; + int fd = img_conn(); + + bp = COPY_TO_BP(bp, fn); + bp = COPY_TO_BP(bp, sec); + + rets = sock_cli_call(fd, cmd, args_sz, args_buf, rets_sz, NULL); + bp = rets; + bp = COPY_FROM_BP(bp, n); + + img = malloc(n); + memcpy(img, bp, n); + free(rets); + + return img; /* need free */ +} + +static struct ut_cache_tbl cache_tbl = { + 256, NULL, ut_cache_geti_int, +}; + +struct img_col_cache_inf{ + int w, h, frn; + double fps; + struct ut_cache_tbl img_tbl; +}; + +void +rep_xy(int *px, int *py, int w, int h, int rep_x, int rep_y) +{ + int x = *px, y = *py; + if(rep_x && !in_range(x, w)){ + x = x > 0 ? x % w : w - (-x % w); + } + if(rep_y && !in_range(y, h)){ + y = y > 0 ? y % h : h - (-y % h); + } + *px = x; + *py = y; +} + +void +img_col_cache(int fn, double sec, int x, int y, int *def_col, int rep_x, int rep_y, int *ret_col) +{ + void *k = &fn; + int ksz = sizeof(fn); + struct img_col_cache_inf *inf; + int i; + unsigned char *img; + + if(!cache_tbl.tbl){ + ut_cache_alloc(&cache_tbl); + } + + inf = ut_cache_get(&cache_tbl, k, ksz); + if(!inf){ + int wh[2]; + + inf = malloc( sizeof(*inf) ); + img_wh(fn, wh); + inf->w = wh[0]; + inf->h = wh[1]; + inf->frn = img_frn(fn); + inf->fps = img_fps(fn); + + inf->img_tbl.n = inf->frn; + inf->img_tbl.tbl = NULL; + inf->img_tbl.geti = ut_cache_geti_int; + ut_cache_alloc(&inf->img_tbl); + + ut_cache_set(&cache_tbl, k, ksz, inf); + } + + if(!in_wh(x, y, inf->w, inf->h)){ + if(!rep_x && !rep_y){ + memcpy(ret_col, def_col, sizeof(*ret_col)*3); + return; + } + rep_xy(&x, &y, inf->w, inf->h, rep_x, rep_y); + img_col_cache(fn, sec, x, y, def_col, rep_x, rep_y, ret_col); + return; + } + + i = (int)(inf->fps * sec) % inf->frn; + + img = ut_cache_get(&inf->img_tbl, &i, sizeof(i)); + if(!img){ + img = img_col_wh(fn, sec, NULL); + ut_cache_set(&inf->img_tbl, &i, sizeof(i), img); + } + + i = (y * inf->w + x) * 3; + *ret_col++ = img[i++]; + *ret_col++ = img[i++]; + *ret_col++ = img[i++]; +} + /**/ #define VWT_OPEN 0 diff -urN rt_v41/img.h rt_v42/img.h --- rt_v41/img.h 2018-05-12 01:46:27.000000000 +0900 +++ rt_v42/img.h 2018-05-29 21:41:28.000000000 +0900 @@ -8,6 +8,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); +int img_frn(int fn); +double img_fps(int fn); +unsigned char *img_col_wh(int fn, double sec, int *rets_sz); + +void rep_xy(int *px, int *py, int w, int h, int rep_x, int rep_y); +void img_col_cache(int fn, double sec, int x, int y, int *def_col, int rep_x, int rep_y, int *ret_col); /**/ diff -urN rt_v41/img.py rt_v42/img.py --- rt_v41/img.py 2018-05-12 21:31:38.000000000 +0900 +++ rt_v42/img.py 2018-05-29 21:41:28.000000000 +0900 @@ -4,6 +4,7 @@ import numpy as np import cv2 import ut +import bin import sock import val @@ -57,6 +58,8 @@ return col(k, x, y, def_col) e.col = col + e.col_wh = lambda k: bin.pack_np64( e.get(k) ) + return e imgs = new_imgs() @@ -135,15 +138,25 @@ e.fps = lambda k: get(k).get('fps') e.frn = lambda k: get(k).get('frn') - def col(k, sec, x, y, def_col=[128,128,128], rep=(0,0)): - i = sec_to_i( e.fps(k), sec ) + def set_imgs(k, sec): + i = sec_to_i( e.fps(k), sec ) % e.frn(k) ki = (k, i) if not imgs.has(ki): img = read_video( get(k), i ) imgs.set(ki, img) + return ki + e.set_imgs = set_imgs + + def col(k, sec, x, y, def_col=[128,128,128], rep=(0,0)): + ki = set_imgs(k, sec) return imgs.col(ki, x, y, def_col, rep) e.col = col + def col_wh(k, sec): + ki = set_imgs(k, sec) + return imgs.col_wh(ki) + e.col_wh = col_wh + return e videos = new_videos() @@ -416,10 +429,16 @@ wh = lambda id: videos.wh( val.cli.gets(id) ) col = lambda id, sec, x, y, def_col, rep: videos.col( val.cli.gets(id), sec, x, y, def_col, rep ) +frn = lambda id: videos.frn( val.cli.gets(id) ) +fps = lambda id: videos.fps( val.cli.gets(id) ) +col_wh = lambda id, sec: videos.col_wh( val.cli.gets(id), sec ) 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': 'frn', 'func': frn, 'args': '(i4)', 'rets': 'i4' }, + { 'cmd': 'fps', 'func': fps, 'args': '(i4)', 'rets': 'f8' }, + { 'cmd': 'col_wh', 'func': col_wh, 'args': '(i4,f8)', 'rets': 'bytes' }, ] cmd_infs_vwt = [ diff -urN rt_v41/rt.c rt_v42/rt.c --- rt_v41/rt.c 2018-05-16 23:42:46.000000000 +0900 +++ rt_v42/rt.c 2018-05-29 21:41:28.000000000 +0900 @@ -71,7 +71,7 @@ x = p[0]; y = p[1]; - img_col(fn, sec, (int)x, (int)y, no_col, m->rep_x, m->rep_y, col); + img_col_cache(fn, sec, (int)x, (int)y, no_col, m->rep_x, m->rep_y, col); if(is_no_col(col)){ continue; } diff -urN rt_v41/sock.c rt_v42/sock.c --- rt_v41/sock.c 2018-05-16 23:38:55.000000000 +0900 +++ rt_v42/sock.c 2018-05-29 21:42:12.000000000 +0900 @@ -216,7 +216,7 @@ return buf; /* - need free_or_stk(buf, rets_sz) + need free_or_stk(buf, rets) */ } diff -urN rt_v41/ut.c rt_v42/ut.c --- rt_v41/ut.c 2018-05-06 20:40:22.000000000 +0900 +++ rt_v42/ut.c 2018-05-29 21:41:28.000000000 +0900 @@ -54,4 +54,118 @@ return 0<=i && itbl = malloc( sizeof(*t->tbl) * t->n ); + for(i=0; in; i++){ + t->tbl[i] = NULL; + } +} + +struct ut_cache ** +ut_cache_get_pptr(struct ut_cache_tbl *t, void *k, int ksz) +{ + int i = (*t->geti)(k, ksz) % t->n; + struct ut_cache **pp = &t->tbl[i]; + while(*pp){ + struct ut_cache *p = *pp; + if(p->ksz == ksz && memcmp(p->k, k, ksz) == 0){ + return pp; + } + pp = &p->next; + } + return NULL; +} + +struct ut_cache * +ut_cache_get_ptr(struct ut_cache_tbl *t, void *k, int ksz) +{ + struct ut_cache **pp = ut_cache_get_pptr(t, k, ksz); + return pp ? *pp : NULL; +} + +void * +ut_cache_get(struct ut_cache_tbl *t, void *k, int ksz) +{ + struct ut_cache *p = ut_cache_get_ptr(t, k, ksz); + return p ? p->v : NULL; +} + +void +ut_cache_set(struct ut_cache_tbl *t, void *k, int ksz, void *v) +{ + int i = (*t->geti)(k, ksz) % t->n; + struct ut_cache *p = malloc( sizeof(*p) ); + p->k = k; + p->ksz = ksz; + p->v = v; + p->next = t->tbl[i]; + t->tbl[i] = p; +} + +void +ut_cache_del(struct ut_cache_tbl *t, void *k, int ksz) +{ + struct ut_cache **pp = ut_cache_get_pptr(t, k, ksz); + if(pp){ + struct ut_cache *p = *pp; + *pp = p->next; + free(p); + } +} + +void +ut_cache_free(struct ut_cache_tbl *t) +{ + if(t->tbl){ + int i; + for(i=0; in; i++){ + struct ut_cache *p = t->tbl[i]; + while(p){ + struct ut_cache *n = p->next; + free(p); + p = n; + } + } + free(t->tbl); + t->tbl = NULL; + } +} + +int +ut_cache_geti_int(void *k, int ksz) +{ + int i; + memcpy(&i, k, sizeof(i)); + return i; +} + +int +ut_cache_geti_str(void *k, int ksz) +{ + char *p = k; + int i = 0, j; + for(j=0; j