1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
|
#ifndef GRAPH_H
#define GRAPH_H
#include "Poco/StringTokenizer.h"
#include "rotor.h"
#include "nodes_audio_analysis.h"
/*------------------------
Graph is an instance of a rotor renderer
-------------------------*/
namespace Rotor {
class Graph{
public:
Graph(){duration=20.0f;loaded = false;outW=640;outH=360;};
Graph(const string& _uid,const string& _desc){
init(_uid,_desc);
audio_loaded=false;
bitRate=1000000;
};
void init(const string& _uid,const string& _desc){
uid=_uid;
description=_desc;
duration=20.0f;
framerate=25.0f;
cancelled=false;
};
~Graph(){ clear(); };
void clear(){
for (auto n: nodes) {
delete n.second;
}
nodes.clear();
loaded=false;
}
string uid; //every version of a graph has a UUID, no particular need to actually read its data(?)
//?? is it faster than using strings??
string description;
std::unordered_map<string,Node*> nodes;
vector<Node*> find_nodes(const string &type); //could be a way of finding a set based on capabilities?
Node* find_node(const string &type);
bool signal_render(string &signal_xml,const float framerate);
bool video_render(const string &output_filename,const float framerate);
bool load(string data,string media_path);
bool loadFile(string &filename,string media_path);
bool parseXml(string media_path);
bool parseJson(string &data,string &media_path);
bool set_resolution(int w,int h);
bool preview(xmlIO &XML,string &node,string &format,int frame,int w,int h);
bool check_audio(string audio,string path);
bool print_features(xmlIO &XML,string &node);
bool load_audio(const string &filename,vector<Audio_processor*> processors);
bool load_video(const string &nodeID,const string &filename);//can be performance or clip
bool set_bitrate(int b){
if (b>64000){
bitRate=b;
return true;
}
else return false;
}
bool loaded;
float duration;
float framerate;
const string graphToString();
xmlIO xml;
bool audio_loaded;
string audio_filename;
bool cancelled;
float progress;
int bitRate;
private:
int outW,outH;
};
class Thumbnailer{
public:
bool make(const string &inputfilename,int w,int h,const string &outputfilename) {
if (player.open(inputfilename)){
if (player.fetch_frame(w,h,player.get_number_frames()/4)) {
Image i;
i.setup_fromRGB(w,h,player.frame->Data[0],player.frame->Linesize[0]-(w*3));
cv::Mat cp;
cvtColor(i.rgb,cp,CV_RGB2BGR);
cv::imwrite(outputfilename.c_str(),cp);
return true;
}
}
return false;
}
private:
libav::video_decoder player;
};
}
#endif
|