Merge CV, ver=5.1; ops/methods from HV, and interface from CV where possible
[goodguy/history.git] / cinelerra-5.1 / cinelerra / mediadb.h
diff --git a/cinelerra-5.1/cinelerra/mediadb.h b/cinelerra-5.1/cinelerra/mediadb.h
new file mode 100644 (file)
index 0000000..9bb970e
--- /dev/null
@@ -0,0 +1,241 @@
+#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 <stdint.h>
+#include <stdlib.h>
+#include <math.h>
+#include <semaphore.h>
+#include <sys/ipc.h>
+#include <sys/shm.h>
+
+
+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) * (y>>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 <media>
+
+class Dele : public ListItem<Dele>
+{
+public:
+        double time;
+       int action;
+
+       Dele(double t, int a) : time(t), action(a) {}
+       ~Dele() {}
+};
+
+class Deletions: public List<Dele>
+{
+       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<Clip> {
+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<Clip> {
+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<double> weights;
+       ArrayList<double> 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