#ifndef _MEDIA_DB_H_ #define _MEDIA_DB_H_ #include "arraylist.h" #include "mediadb.inc" #include "filexml.inc" #include "bcwindowbase.inc" #include "file.inc" #include "linklist.h" #include "../db/tdb.h" #include #include #include #include #include #include void write_pbm(uint8_t *tp, int w, int h, const char *fmt, ...); void write_pgm(uint8_t *tp, int w, int h, const char *fmt, ...); void pbm_diff(uint8_t *ap, uint8_t *bp, int w, int h, const char *fmt, ...); class Scale { int rx, ry, rw, rh, iw, ih; int ix0, ix1, iy0, iy1, rsh; double xf0, xf1, yf0, yf1, pw; uint8_t *idat, *odat; uint8_t *row(int y) { return idat + (iw<>rsh); } inline double scalex(uint8_t *rp, double v, double yw) { int x = ix0; rp += x; double vv = xf0 * *rp++; int iv = 0; while( ++x < ix1 ) iv += *rp++; vv += iv + xf1 * *rp; return v += vv * yw; } inline double scalexy() { double yw, v = 0; int y = iy0; if( (yw = pw * yf0) > 0 ) v = scalex(row(y), v, yw); while( ++y < iy1 ) v = scalex(row(y), v, pw); if( (yw = pw * yf1) > 0 ) v = scalex(row(y), v, yw); return v; } public: Scale(uint8_t *idata, int type, int iw, int ih, int rx, int ry, int rw, int rh) { rsh = type ? 1 : 0; this->idat = idata + ry*iw + rx; this->iw = iw; this->ih = ih; this->rx = rx; this->ry = ry; this->rw = rw; this->rh = rh; } void scale(uint8_t *odata, int ow, int oh, int sx, int sy, int sw, int sh); }; enum { DEL_START, // always the first mark DEL_MARK, // boundary between cur/next media deletion DEL_SKIP, // skip media in current deletion region DEL_OOPS, // ignore previous mark }; // definition: // dele: n. A sign indicating that something is to be removed from class Dele : public ListItem { public: double time; int action; Dele(double t, int a) : time(t), action(a) {} ~Dele() {} }; class Deletions: public List { int save(FileXML &xml); int load(FileXML &xml); public: int pid; char filepath[BCTEXTLEN]; const char *file_path() { return filepath; } bool empty() { return !first; } int write_dels(const char *filename); static Deletions *read_dels(const char *filename); Deletions(int pid, const char *fn); ~Deletions(); }; class Clip : public ListItem { public: int clip_id; int votes, index, groups, cycle, muted; double start, end, best; Clip(int clip_id, double start, double end, int index); ~Clip(); }; class Clips : public List { public: int pid, count, cycle; Clip *current; Clip *locate(int id, double start, double end); int get_clip(int idx, int &id, double &start, double &end); virtual Clip *new_clip(int clip_id, double start, double end, int index); int check(int clip_id, double start, double end, int group, double err); int save(FileXML &xml); int load(FileXML &xml); Clips(int pid=0); ~Clips(); }; class Snip : public Clip { public: ArrayList weights; ArrayList positions; Snip(int clip_id, double start, double end, int index); ~Snip(); }; class Snips : public Clips { public: Clip *new_clip(int clip_id, double start, double end, int index); Snips(); ~Snips(); }; class MediaDb { theDb *db; int opened; uint8_t frm[SFRM_SZ]; double position, error_limit; int lid, nid, distance, group_mask; double fmean, fsd, fcx, fcy, fmoment; int64_t lerr, pixlmt; Db::pgRef clip_id_loc; int get_key(Clips *clips, Db::rKey &prev_rkey, Db::rKey &next_rkey); int64_t key_compare(Clips *clips, Db::ObjectLoc &loc); static double mean(uint8_t *dat, int n, int stride=1); static double variance(uint8_t *dat, double mn, int n, int stride=1); static double std_dev(uint8_t *dat, double mn, int n, int stride=1) { return sqrt(variance(dat, mn, n, stride)); } static double centroid(uint8_t *dat, int n, int stride=1); static void centroid(uint8_t *dat, int w, int h, double &xx, double &yy); static void deviation(uint8_t *a, uint8_t *b, int sz, int margin, double &dev, int &ofs, int stride=1); static int64_t cmpr(uint8_t *ap, uint8_t *bp, int sz); static int64_t diff(uint8_t *a, uint8_t *b, int w, int h, int dx, int dy, int bias); static void fit(int *dat, int n, double &a, double &b); static void eq(uint8_t *sp, uint8_t *dp, int len); static void eq(uint8_t *p, int len) { eq(p, p, len); } public: int newDb(); int openDb(int rw=0); int resetDb(int rw=0); void closeDb(); void commitDb(); void undoDb(); int attachDb(int rw=0); int detachDb(); int is_open(); int transaction(); static void hist_eq(uint8_t *dp, int len); static void scale(uint8_t *idata,int iw,int ih,int rx,int ry,int rw,int rh, uint8_t *odata,int ow,int oh,int sx,int sy,int sw,int sh); int new_clip_set(const char *title, const char *asset_path, double position, double framerate, int frames, int prefix_size, int suffix_size, int64_t creation_time, int64_t system_time); int new_clip_view(int clip_id, int64_t access_time); int access_clip(int clip_id, int64_t access_time=0); int del_clip_set(int clip_id); int new_frame(int clip_id, uint8_t *dat, int no, int group, double offset); int get_timeline_by_frame_id(int fid); int get_timelines(int frame_id); int next_timelines(); int get_sequences(int clip_id, int seq_no=0); int next_sequences(); int get_image(int id, uint8_t *dat, int &w, int &h); int get_frame_key(uint8_t *dat, int &fid, Clips *clips=0, double pos=0, int mask=~0); int get_media_key(uint8_t *key, int &fid, int dist, double errlmt, Clips *clips=0, double pos=0, int mask=~0); int add_timelines(Clips *clips, int fid, double err); // clip_set accessors int clip_id(int id); int clip_id(); int clips_first_id(); int clips_next_id(); const char *clip_title(); const char *clip_path(); double clip_position(); double clip_framerate(); double clip_average_weight(); void clip_average_weight(double avg_wt); double clip_length(); int clip_frames(); int clip_prefix_size(); int clip_suffix_size(); int clip_size(); double *clip_weights(); int64_t clip_creation_time(); int64_t clip_system_time(); // timeline accessors int timeline_id(int id); int timeline_id(); int timeline_clip_id(); int timeline_sequence_no(); int timeline_frame_id(); int timeline_group(); double timeline_offset(); // clip_views accessors int views_id(int id); int views_id(); int views_clip_id(int id); int views_clip_id(); int64_t views_access_time(); int views_access_count(); MediaDb(); ~MediaDb(); }; #endif