|
|
|
@ -42,16 +42,29 @@ gboolean cb_thread_output (gpointer data) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void input_getdestandsufix (std::string *sdir, std::string *ssufix) {
|
|
|
|
|
GtkWidget *inputdest = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "input_entry_destpath"));
|
|
|
|
|
GtkWidget *inputsufix = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "btn_input_filesufix"));
|
|
|
|
|
if (sdir != NULL) *sdir = gtk_entry_get_text(GTK_ENTRY(inputdest));
|
|
|
|
|
if (ssufix != NULL) *ssufix = gtk_entry_get_text(GTK_ENTRY(inputsufix));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void cb_input_btncapture (GtkWidget *widget, gpointer data) {
|
|
|
|
|
std::string sdir, ssufix;
|
|
|
|
|
|
|
|
|
|
printf ("%s:%d %s\n", __FILE__, __LINE__, __FUNCTION__);
|
|
|
|
|
GtkWidget *inputdest = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "input_entry_destpath"));
|
|
|
|
|
std::string s = gtk_entry_get_text(GTK_ENTRY(inputdest));
|
|
|
|
|
output.SERStart(s);
|
|
|
|
|
input_getdestandsufix(&sdir, &ssufix);
|
|
|
|
|
output.SERStart(sdir, ssufix);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void cb_input_btnsnapshot (GtkWidget *widget, gpointer data) {
|
|
|
|
|
std::string sdir, ssufix;
|
|
|
|
|
|
|
|
|
|
printf ("%s:%d %s\n", __FILE__, __LINE__, __FUNCTION__);
|
|
|
|
|
input_getdestandsufix(&sdir, &ssufix);
|
|
|
|
|
// output.Capture(sdir, ssufix);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
void cb_input_btnstop (GtkWidget *widget, gpointer data) {
|
|
|
|
@ -76,15 +89,17 @@ gpointer _OutputThread (gpointer data) {
|
|
|
|
|
Output::Output() { // @suppress("Class members should be properly initialized")
|
|
|
|
|
printf ("%s:%d %s\n", __FILE__, __LINE__, __FUNCTION__);
|
|
|
|
|
|
|
|
|
|
outputser = NULL;
|
|
|
|
|
g_mutex_init (&mutexin);
|
|
|
|
|
g_mutex_init (&muteximage);
|
|
|
|
|
g_mutex_init (&mutextmp);
|
|
|
|
|
g_mutex_init (&mutex);
|
|
|
|
|
running = 1;
|
|
|
|
|
inFrame.Delete();
|
|
|
|
|
mode = 0;
|
|
|
|
|
|
|
|
|
|
thread = NULL;
|
|
|
|
|
thread = g_thread_new("Output", _OutputThread, NULL);
|
|
|
|
|
mode = 0;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -95,12 +110,23 @@ void Output::NotifyGTK () {
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* open output file and set mode flag
|
|
|
|
|
* all the other SER stuff will be set with the first frame
|
|
|
|
|
*/
|
|
|
|
|
void Output::SERStart (std::string destpath) {
|
|
|
|
|
printf ("%s:%d SERStart Destination Folder: %s\n", __FILE__, __LINE__, destpath.c_str());
|
|
|
|
|
void Output::SERStart (std::string destpath, std::string sufix) {
|
|
|
|
|
time_t t = time(NULL);
|
|
|
|
|
struct tm *tmptr;
|
|
|
|
|
char fname[LEN_FILENAME];
|
|
|
|
|
char fullfname[LEN_FULLFILENAME];
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// check to create file, if not possible try creating the directory and create the file again
|
|
|
|
|
tmptr = localtime(&t);
|
|
|
|
|
strftime(fname, LEN_FILENAME, "%Y%m%d-%H%M%S", tmptr);
|
|
|
|
|
snprintf (fullfname, LEN_FULLFILENAME, "%s/%s-%s.ser", destpath.c_str(), fname, sufix.c_str());
|
|
|
|
|
outputfilename = fullfname;
|
|
|
|
|
printf ("%s:%d SERStart Destination File: %s\n", __FILE__, __LINE__, outputfilename.c_str());
|
|
|
|
|
|
|
|
|
|
mode |= OUTPUT_MODE_SER_STARTED;
|
|
|
|
|
// start SER output
|
|
|
|
|
NotifyGTK();
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
@ -110,7 +136,11 @@ void Output::SERStart (std::string destpath) {
|
|
|
|
|
*/
|
|
|
|
|
void Output::SERStop () {
|
|
|
|
|
mode &= ~(OUTPUT_MODE_SER_STARTED);
|
|
|
|
|
// stop SER output
|
|
|
|
|
if (outputser) {
|
|
|
|
|
// close SER and delete object --> deleting the object should also rewrite the write the header
|
|
|
|
|
delete outputser;
|
|
|
|
|
outputser = NULL;
|
|
|
|
|
}
|
|
|
|
|
NotifyGTK();
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
@ -128,7 +158,7 @@ Output::~Output() {
|
|
|
|
|
int Output::NewFrame(VideoFrameRaw *rawframe) {
|
|
|
|
|
if (rawframe == NULL) return -1;
|
|
|
|
|
|
|
|
|
|
// printf ("%s:%d Output::NewFrame Frame Raw: %d x %d Type: %s\n", __FILE__, __LINE__, rawframe->w, rawframe->h, convert_from_pixelformat(rawframe->pixfmt).c_str());
|
|
|
|
|
// printf ("%s:%d Output::NewFrame Frame Raw: %d x %d Type: %s\n", __FILE__, __LINE__, rawframe->w, rawframe->h, convert_from_pixelformat(rawframe->pixfmt).c_str());
|
|
|
|
|
if (inFrameNew) {
|
|
|
|
|
printf ("%s:%d Output::NewFrame truncating one frame.\n", __FILE__, __LINE__);
|
|
|
|
|
}
|
|
|
|
@ -151,9 +181,50 @@ void Output::Thread() {
|
|
|
|
|
|
|
|
|
|
if (inFrameNew == 1) {
|
|
|
|
|
if (mode & OUTPUT_MODE_SER_STARTED) {
|
|
|
|
|
// for now display error message
|
|
|
|
|
errormessage_display((char*)"windows-main", (char*)"Error", (char*)"Writing SER files is not finished yet.");
|
|
|
|
|
SERStop();
|
|
|
|
|
if (outputser == NULL) { // first frame of ser output
|
|
|
|
|
int pixsize;
|
|
|
|
|
int serformat;
|
|
|
|
|
outputserw = inFrame.w;
|
|
|
|
|
outputserh = inFrame.h;
|
|
|
|
|
outputserfmt = inFrame.pixfmt;
|
|
|
|
|
|
|
|
|
|
if (!ser_convert_type_to_ser(outputserfmt, &pixsize, &serformat)) {
|
|
|
|
|
errormessage_display((char*)"windows-main", (char*)"Error", (char*)"Pixelformat [%s] not supported.", convert_from_pixelformat(outputserfmt).c_str());
|
|
|
|
|
SERStop();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
outputser = new SER();
|
|
|
|
|
outputser->setWidth(outputserw);
|
|
|
|
|
outputser->setHeight(outputserh);
|
|
|
|
|
outputser->setColorID(serformat);
|
|
|
|
|
outputser->setPixelDepth(pixsize);
|
|
|
|
|
if (outputser->setFile((char *)outputfilename.c_str()) == -1) {
|
|
|
|
|
errormessage_display((char*)"windows-main", (char*)"Error", (char*)"Could not set output file [%s]. Error: %s", outputfilename.c_str(), strerror(errno));
|
|
|
|
|
SERStop();
|
|
|
|
|
}
|
|
|
|
|
outputser->setObserver((char *)"FIXME:read username from OS");
|
|
|
|
|
outputser->setTelescope((char *)"FIXME:not implemented yet");
|
|
|
|
|
outputser->setInstrument((char *)"FIXME:just read device from dirver");
|
|
|
|
|
outputser->setNumberOfFrames(0);
|
|
|
|
|
outputser->writeHeader();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
else {
|
|
|
|
|
//
|
|
|
|
|
// check if the frame type or size changed
|
|
|
|
|
if (outputserw != inFrame.w || outputserh != inFrame.h || outputserfmt != inFrame.pixfmt) {
|
|
|
|
|
errormessage_display((char*)"windows-main", (char*)"Error", (char*)"Frame format or dimensions changed.\n(%s @ %d x %d) != (%s @ %d x %d)\n",
|
|
|
|
|
convert_from_pixelformat(outputserfmt).c_str(), outputserw, outputserh,
|
|
|
|
|
convert_from_pixelformat(inFrame.pixfmt).c_str(), inFrame.w, inFrame.h);
|
|
|
|
|
SERStop();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (outputser != NULL) { // we need to check in case outputser got deleted.
|
|
|
|
|
//
|
|
|
|
|
// write frame
|
|
|
|
|
outputser->appendFrame(inFrame.data);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
inFrameNew = 0;
|
|
|
|
|
}
|
|
|
|
|