
1. Introduce image UUIDs, so nodes may check for source updates. 2. Flip over design. Now, CHiPubNodes contain private data, instead of CHiPubNodes being contained within private data. Each node must cache its source data if it wants to conditionally run.
303 lines
7.3 KiB
C
303 lines
7.3 KiB
C
#ifndef _NODE_H
|
|
#define _NODE_H
|
|
|
|
#include<stdint.h>
|
|
#include<stddef.h>
|
|
#include<stdbool.h>
|
|
|
|
#include<pthread.h>
|
|
|
|
#include"defs.h"
|
|
|
|
#include"bs.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
|
|
#define CUTIHI_T(a, b) ((((uint64_t) __builtin_bswap32(b)) << 32) | __builtin_bswap32(a))
|
|
#else
|
|
#define CUTIHI_T(a, b) ((((uint64_t) b) << 32) | a
|
|
#endif
|
|
|
|
struct EBMLWriter;
|
|
struct CHiPubNode;
|
|
|
|
typedef size_t(*CHiSaveWriter)(void *ud, const void *data, size_t len);
|
|
typedef void(*CHiSaveCustomNodeData)(void *ud, struct EBMLWriter*, struct CHiPubNode*);
|
|
|
|
typedef size_t(*CHiLoadReader)(void *ud, void *data, size_t len);
|
|
typedef void(*CHiLoadCustomNodeData)(void *ud, uint64_t nodeIdx, uint64_t elId, const void *buf, size_t length);
|
|
|
|
typedef enum {
|
|
CUTIHI_VAL_NONE = 0,
|
|
// CUTIHI_VAL_LINKED = 1,
|
|
CUTIHI_VAL_KEYED = 2,
|
|
CUTIHI_VAL_SAMPLE = 3,
|
|
CUTIHI_VAL_TEXT = 4,
|
|
CUTIHI_VAL_VEC4 = 5,
|
|
CUTIHI_VAL_WEAK_PTR = 6,
|
|
|
|
CUTIHI_VAL_VP8BS = 666,
|
|
CUTIHI_VAL_VP9BS = 667,
|
|
CUTIHI_VAL_OPUSBS = 668,
|
|
CUTIHI_VAL_H264BS = 669,
|
|
CUTIHI_VAL_AACBS = 670,
|
|
} CHiValType;
|
|
|
|
struct CHiImage;
|
|
|
|
struct CHiPubNode;
|
|
|
|
struct CHiKeyframes;
|
|
|
|
typedef union {
|
|
struct CHiImage *sample;
|
|
char *text;
|
|
float vec4[4];
|
|
CHiBSFrames *bitstream;
|
|
struct CHiKeyframes* keyed;
|
|
uintptr_t weakptr;
|
|
} CHiValueRaw;
|
|
|
|
typedef struct {
|
|
CHiValType type;
|
|
struct {
|
|
struct CHiPubNode *to;
|
|
uint8_t idx;
|
|
} linked;
|
|
CHiValueRaw data;
|
|
} CHiValue;
|
|
|
|
#define CUTIHI_ERR_SIZE 16
|
|
#define CUTIHI_MAX_ERRORS 4
|
|
typedef struct {
|
|
bool activeLast[CUTIHI_MAX_ERRORS];
|
|
bool active[CUTIHI_MAX_ERRORS];
|
|
char code[CUTIHI_MAX_ERRORS][CUTIHI_ERR_SIZE];
|
|
int sink[CUTIHI_MAX_ERRORS];
|
|
} CHiErrors;
|
|
|
|
typedef struct CHiPubNode {
|
|
uint64_t type;
|
|
|
|
uint32_t flags;
|
|
|
|
int (*Perform)(struct CHiPubNode *node);
|
|
int (*Start)(struct CHiPubNode *node);
|
|
int (*Stop)(struct CHiPubNode *node);
|
|
|
|
void (*Destroy)(struct CHiPubNode *node);
|
|
|
|
int (*Save)(struct CHiPubNode *node, void *ud, CHiSaveWriter writer);
|
|
|
|
size_t sinkCount;
|
|
CHiValue *sinks;
|
|
|
|
size_t sourceCount;
|
|
CHiValue *sources;
|
|
|
|
struct CHiNodeGraph *ng;
|
|
|
|
CHiErrors errors;
|
|
|
|
struct {
|
|
float start;
|
|
float end;
|
|
} lifespan;
|
|
|
|
char _dfsmark;
|
|
|
|
uint8_t impl[];
|
|
} CHiPubNode;
|
|
|
|
typedef enum {
|
|
CUTIHI_COMP_READY,
|
|
CUTIHI_COMP_RUNNING,
|
|
CUTIHI_COMP_KILL_YOURSELF
|
|
} CHiCompilationStatus;
|
|
|
|
typedef CHiPubNode *CHiAdjacency[2];
|
|
|
|
typedef enum {
|
|
CUTIHI_EXTRAPOLATION_NONE = 0, CUTIHI_EXTRAPOLATION_CONSTANT = 1
|
|
} CHiExtrapolationMode;
|
|
|
|
typedef struct CHiKeyframes {
|
|
CHiValType type;
|
|
|
|
size_t count;
|
|
|
|
float *times;
|
|
CHiValueRaw *values;
|
|
|
|
CHiValue current;
|
|
|
|
CHiPubNode *node;
|
|
|
|
CHiExtrapolationMode extrapolationMode;
|
|
float extrapolationParameter[4];
|
|
} CHiKeyframes;
|
|
|
|
typedef struct CHiKeyframesList {
|
|
size_t count;
|
|
CHiKeyframes **keyframes;
|
|
} CHiKeyframesList;
|
|
|
|
typedef struct CHiNodeGraph {
|
|
size_t capacity;
|
|
size_t count;
|
|
CHiPubNode **nodes;
|
|
|
|
float duration;
|
|
|
|
void *ud;
|
|
void(*eventOnStopComplete)(struct CHiNodeGraph*);
|
|
void(*eventOnFrameComplete)(struct CHiNodeGraph*);
|
|
void(*eventOnError)(struct CHiNodeGraph*, CHiPubNode*);
|
|
|
|
CHiCompilationStatus compilationStatus;
|
|
|
|
size_t adjacencyCount, adjacencyCapacity;
|
|
CHiAdjacency *adjacencies;
|
|
|
|
CHiKeyframesList keyframesList;
|
|
|
|
float time;
|
|
float timedelta;
|
|
|
|
// This is necessary for live changes of the node graph
|
|
pthread_mutex_t mut;
|
|
} CHiNodeGraph;
|
|
|
|
CUTIVIS CHiNodeGraph *CHi_NewNodeGraph();
|
|
CUTIVIS CHiNodeGraph *CHi_NodeGraphReset(CHiNodeGraph *ng);
|
|
CUTIVIS int CHi_NodeGraphSave(CHiNodeGraph *ng, CHiSaveWriter, CHiSaveCustomNodeData, void *ud);
|
|
CUTIVIS int CHi_NodeGraphLoad(CHiNodeGraph *ng, CHiLoadReader, CHiLoadCustomNodeData, void *ud);
|
|
|
|
CUTIVIS void CHi_RegisterNode(CHiNodeGraph*, CHiPubNode*);
|
|
CUTIVIS void CHi_MakeDirty(CHiNodeGraph*, CHiPubNode*);
|
|
CUTIVIS int CHi_ConfigureSink(CHiPubNode*, size_t, CHiValue);
|
|
|
|
CUTIVIS void CHi_MakeKeyframe(CHiNodeGraph *ng, CHiPubNode *n, size_t idx);
|
|
CUTIVIS size_t CHi_MoveKeyframe(CHiNodeGraph *ng, CHiKeyframes *kfs, size_t idx, float to);
|
|
CUTIVIS size_t CHi_MoveKeyframeBy(CHiNodeGraph *ng, CHiKeyframes *kfs, size_t idx, float dt);
|
|
CUTIVIS size_t CHi_GetClosestKeyframe(CHiNodeGraph *ng, CHiKeyframes *kfs, float t);
|
|
CUTIVIS void CHi_SetExtrapolationMode(CHiNodeGraph *ng, CHiPubNode *n, size_t sinkIdx, CHiExtrapolationMode mode, float* params);
|
|
CUTIVIS void CHi_DeleteKeyframe(CHiNodeGraph *ng, CHiKeyframes *kfs, size_t idx);
|
|
|
|
CUTIVIS int CHi_Hysteresis(CHiNodeGraph*);
|
|
|
|
CUTIVIS void CHi_SetDuration(CHiNodeGraph *ng, float);
|
|
CUTIVIS void CHi_BeginCompilation(CHiNodeGraph *ng);
|
|
CUTIVIS void CHi_StopCompilation(CHiNodeGraph *ng);
|
|
|
|
#define CUTIHI_IMAGE_IN_FILE 0
|
|
#define CUTIHI_IMAGE_OUT_SAMPLE 0
|
|
CUTIVIS CHiPubNode *CHi_Image();
|
|
|
|
#define CUTIHI_EMBED_OUT_MAIN 0
|
|
#define CUTIHI_EMBED_MAX_SMALLS 3
|
|
CUTIVIS CHiPubNode *CHi_Embed();
|
|
|
|
#define CUTIHI_CONSTANTSAMPLE_IN_COLOR 0
|
|
#define CUTIHI_CONSTANTSAMPLE_IN_SIZE 1
|
|
#define CUTIHI_CONSTANTSAMPLE_OUT_SAMPLE 1
|
|
CUTIVIS CHiPubNode *CHi_ConstantSample();
|
|
|
|
#define CUTIHI_MODULATE_IN_SAMPLE 0
|
|
#define CUTIHI_MODULATE_BRIGHTNESS 1
|
|
#define CUTIHI_MODULATE_CONTAST 2
|
|
#define CUTIHI_MODULATE_HUE 3
|
|
#define CUTIHI_MODULATE_OUT_SAMPLE 4
|
|
CUTIVIS CHiPubNode *CHi_Modulate();
|
|
|
|
#define CUTIHI_MOVIE_IN_FILE 0
|
|
#define CUTIHI_MOVIE_IN_TIME 1
|
|
#define CUTIHI_MOVIE_IN_DELAY 2
|
|
#define CUTIHI_MOVIE_OUT_SAMPLE 2
|
|
CUTIVIS CHiPubNode *CHi_Movie();
|
|
|
|
#define CUTIHI_TIME_OUT 0
|
|
CUTIVIS void CHi_Time_Set(CHiNodeGraph *ng, float);
|
|
CUTIVIS float CHi_Time_Get(CHiNodeGraph *ng);
|
|
CUTIVIS float CHi_Time_GetDelta(CHiNodeGraph *ng);
|
|
CUTIVIS CHiPubNode *CHi_Time();
|
|
|
|
#define CUTIHI_ENCODEVP9_IN_SAMPLE 0
|
|
#define CUTIHI_ENCODEVP9_IN_BITRATE 1
|
|
#define CUTIHI_ENCODEVP9_IN_BITRATE 1
|
|
#define CUTIHI_ENCODEVP9_OUT_BITSTREAM 0
|
|
#define CUTIHI_NODE_ENCODEVP8 17
|
|
CUTIVIS CHiPubNode *CHi_EncodeVP9();
|
|
CUTIVIS CHiPubNode *CHi_EncodeVP8();
|
|
CUTIVIS int CHi_EncodeVP9_Start(CHiPubNode*);
|
|
CUTIVIS int CHi_EncodeVP9_Stop(CHiPubNode*);
|
|
|
|
#define CUTIHI_MUXWEBM_IN_BITSTREAM 0
|
|
#define CUTIHI_MUXWEBM_IN_AUDIOBITSTREAM 1
|
|
#define CUTIHI_MUXWEBM_IN_FILENAME 2
|
|
CUTIVIS CHiPubNode *CHi_MuxWebm();
|
|
CUTIVIS int CHi_MuxWebm_Start(CHiPubNode*);
|
|
CUTIVIS int CHi_MuxWebm_Stop(CHiPubNode*);
|
|
|
|
#define CUTIHI_WINDOW_IN_WINDOWNAME 0
|
|
#define CUTIHI_WINDOW_OUT_SAMPLE 1
|
|
CUTIVIS CHiPubNode *CHi_Window();
|
|
|
|
CUTIVIS size_t CHi_Window_GetList(void **buf);
|
|
CUTIVIS const char *CHi_Window_GetName(void *buf, size_t i);
|
|
CUTIVIS size_t CHi_Window_GetHandle(void *buf, size_t i);
|
|
CUTIVIS void CHi_Window_FreeList(void *buf);
|
|
|
|
#define CUTIHI_MICROPHONE_IN_NAME 0
|
|
#define CUTIHI_MICROPHONE_OUT_AUDIO 1
|
|
CUTIVIS CHiPubNode *CHi_Microphone();
|
|
|
|
#define CUTIHI_TEXT_IN_TEXT 0
|
|
#define CUTIHI_TEXT_OUT_SAMPLE 0
|
|
CUTIVIS CHiPubNode *CHi_Text();
|
|
|
|
CUTIVIS CHiPubNode *CHi_ExportWav();
|
|
|
|
CUTIVIS CHiPubNode *CHi_EncodeOpus();
|
|
|
|
CUTIVIS CHiPubNode *CHi_Camera();
|
|
|
|
CUTIVIS CHiPubNode *CHi_Preview();
|
|
|
|
CUTIVIS CHiPubNode *CHi_ComponentScale();
|
|
|
|
CUTIVIS CHiPubNode *CHi_Keyhook();
|
|
|
|
CUTIVIS CHiPubNode *CHi_Mixer();
|
|
|
|
CUTIVIS CHiPubNode *CHi_ChromaKey();
|
|
|
|
CUTIVIS CHiPubNode *CHi_EncodeH264();
|
|
|
|
CUTIVIS CHiPubNode *CHi_StreamRTMP();
|
|
|
|
CUTIVIS CHiPubNode *CHi_EncodeAAC();
|
|
|
|
CUTIVIS CHiPubNode *CHi_MuxMatroska();
|
|
|
|
CUTIVIS CHiValue *CHi_Crawl(CHiValue*);
|
|
|
|
//CUTIVIS void CHi_Save(CHiNodeGraph *ng);
|
|
|
|
CUTIVIS bool CHi_Node_Active(CHiPubNode*);
|
|
|
|
CUTIVIS void CHi_Node_Destroy(CHiPubNode*);
|
|
|
|
CUTIVIS void CHi_AddError(CHiPubNode*, const char *err, size_t sink);
|
|
|
|
CUTIVIS CHiPubNode *CHi_AllocNode(uint64_t type, size_t sinkCount, size_t sourceCount, size_t implSize);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif
|