|
|
|
@ -34,6 +34,49 @@ extern position_2d video_enterdata_pos;
|
|
|
|
|
extern detect_movement detectedpos_data;
|
|
|
|
|
extern Configuration config;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* stop video recording
|
|
|
|
|
*/
|
|
|
|
|
void video_stoprecord() {
|
|
|
|
|
GtkWidget *btnstart = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "btn-video-rec"));
|
|
|
|
|
GtkWidget *btnstop = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "btn-video-stop"));
|
|
|
|
|
|
|
|
|
|
if (videodev == NULL) return;
|
|
|
|
|
|
|
|
|
|
videodev->Stop();
|
|
|
|
|
gtk_widget_set_sensitive(btnstart, true);
|
|
|
|
|
gtk_widget_set_sensitive(btnstop, false);
|
|
|
|
|
|
|
|
|
|
if (videodev_thread != NULL) g_thread_join (videodev_thread);
|
|
|
|
|
videodev_thread = NULL;
|
|
|
|
|
|
|
|
|
|
delete videodev;
|
|
|
|
|
videodev = NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* return selected driver and device from GUI
|
|
|
|
|
*/
|
|
|
|
|
void video_get_driverdevice(std::string *driver, std::string *device) {
|
|
|
|
|
GtkWidget *cbox = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "cb-videodev"));
|
|
|
|
|
GtkWidget *cbdevice = gtk_bin_get_child(GTK_BIN(cbox));
|
|
|
|
|
|
|
|
|
|
if (driver == NULL || device == NULL) return;
|
|
|
|
|
|
|
|
|
|
// read values from GUI elements, and start videodev with the correct driver
|
|
|
|
|
int i;
|
|
|
|
|
*device = gtk_entry_get_text(GTK_ENTRY(cbdevice));
|
|
|
|
|
|
|
|
|
|
i = device->find(' ');
|
|
|
|
|
*driver = device->substr (0, i);
|
|
|
|
|
*device = device->substr (i+1, std::string::npos);
|
|
|
|
|
*device = device->substr (0, device->find(' '));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
gboolean videoctrl_update(gpointer data) {
|
|
|
|
|
GtkWidget *grid = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "vidctrl-grid"));
|
|
|
|
|
GtkWidget *scale = NULL;
|
|
|
|
@ -242,6 +285,7 @@ void cb_videoda_draw(GtkWidget *area, cairo_t *cr, int w, int h, gpointer data)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// fixme: refresh format list.
|
|
|
|
|
/*
|
|
|
|
|
* refresh the possible devices
|
|
|
|
|
*/
|
|
|
|
@ -291,43 +335,25 @@ gpointer videodev_threadprocess_wrapper (gpointer data) {
|
|
|
|
|
* with all elements. Also connect the signals to the callback functions.
|
|
|
|
|
*/
|
|
|
|
|
void cb_video_btnrec (GtkWidget *widget, gpointer data) {
|
|
|
|
|
GtkWidget *cbox = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "cb-videodev"));
|
|
|
|
|
GtkWidget *cbdevice = gtk_bin_get_child(GTK_BIN(cbox));
|
|
|
|
|
GtkWidget *cbres = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "cb-videores"));
|
|
|
|
|
GtkWidget *cbresentry = gtk_bin_get_child(GTK_BIN(cbres));
|
|
|
|
|
GtkWidget *cbfmt = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "cb-videofmt"));
|
|
|
|
|
GtkWidget *cbfmtentry = gtk_bin_get_child(GTK_BIN(cbfmt));
|
|
|
|
|
GtkWidget *btnstart = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "btn-video-rec"));
|
|
|
|
|
GtkWidget *btnstop = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "btn-video-stop"));
|
|
|
|
|
int i, w, h;
|
|
|
|
|
int w, h;
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// read values from GUI elements, and start videodev with the correct driver
|
|
|
|
|
std::string device = gtk_entry_get_text(GTK_ENTRY(cbdevice));
|
|
|
|
|
std::string driver;
|
|
|
|
|
// get device and driver information
|
|
|
|
|
std::string device, driver;
|
|
|
|
|
std::string parameter;
|
|
|
|
|
video_get_driverdevice(&driver, &device);
|
|
|
|
|
|
|
|
|
|
i = device.find(' ');
|
|
|
|
|
driver = device.substr (0, i);
|
|
|
|
|
device = device.substr (i+1, std::string::npos);
|
|
|
|
|
device = device.substr (0, device.find(' '));
|
|
|
|
|
|
|
|
|
|
if (videodev != NULL) {
|
|
|
|
|
//
|
|
|
|
|
// before we can delete this object we must stop the thread.
|
|
|
|
|
//
|
|
|
|
|
videodev->Stop();
|
|
|
|
|
if (videodev_thread != NULL) g_thread_join (videodev_thread);
|
|
|
|
|
videodev_thread = NULL;
|
|
|
|
|
|
|
|
|
|
delete videodev;
|
|
|
|
|
videodev = NULL;
|
|
|
|
|
}
|
|
|
|
|
// stop recording
|
|
|
|
|
video_stoprecord();
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// load the selected driver
|
|
|
|
|
if (driver.compare("V4L2") == 0) videodev = new VideoDev_V4L2;
|
|
|
|
|
|
|
|
|
|
#ifdef USE_SVBONY
|
|
|
|
|
else if (driver.compare("SVBCAM") == 0) videodev = new VideoDev_SVBCam;
|
|
|
|
|
#endif
|
|
|
|
@ -431,21 +457,8 @@ void video_refreshctrls () {
|
|
|
|
|
* we need to wait for the thread to complete and then we can delete this object.
|
|
|
|
|
*/
|
|
|
|
|
void cb_video_btnstop (GtkWidget *widget, gpointer data) {
|
|
|
|
|
GtkWidget *btnstart = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "btn-video-rec"));
|
|
|
|
|
GtkWidget *btnstop = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "btn-video-stop"));
|
|
|
|
|
|
|
|
|
|
printf ("%s:%d %s\n", __FILE__, __LINE__, __FUNCTION__);
|
|
|
|
|
if (videodev == NULL) return;
|
|
|
|
|
|
|
|
|
|
videodev->Stop();
|
|
|
|
|
gtk_widget_set_sensitive(btnstart, true);
|
|
|
|
|
gtk_widget_set_sensitive(btnstop, false);
|
|
|
|
|
|
|
|
|
|
if (videodev_thread != NULL) g_thread_join (videodev_thread);
|
|
|
|
|
videodev_thread = NULL;
|
|
|
|
|
|
|
|
|
|
delete videodev;
|
|
|
|
|
videodev = NULL;
|
|
|
|
|
video_stoprecord();
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -459,9 +472,14 @@ gboolean cb_thread_video (gpointer data) {
|
|
|
|
|
VideoDevThreadData *cbdata = (VideoDevThreadData*) data;
|
|
|
|
|
VideoFrame *vf = NULL;
|
|
|
|
|
|
|
|
|
|
// printf ("%s:%d %s\n", __FILE__, __LINE__, __FUNCTION__);
|
|
|
|
|
|
|
|
|
|
if (cbdata != NULL) {
|
|
|
|
|
vf = &cbdata->vf;
|
|
|
|
|
if (cbdata->running == 1) video_refreshctrls();
|
|
|
|
|
if (cbdata->running == 1) {
|
|
|
|
|
video_refreshctrls();
|
|
|
|
|
cbdata->running = 2;
|
|
|
|
|
}
|
|
|
|
|
if (vf->w <= 0 || vf->h <= 0 || vf->data == NULL) vf = NULL;
|
|
|
|
|
}
|
|
|
|
|
if (videodev == NULL) return false;
|
|
|
|
@ -616,6 +634,7 @@ struct {
|
|
|
|
|
struct timeval tv;
|
|
|
|
|
guint timer;
|
|
|
|
|
} presetbtn;
|
|
|
|
|
|
|
|
|
|
void cb_video_pre_click (GtkWidget *widget, gpointer data) {
|
|
|
|
|
float pushtime = get_cycletime(&presetbtn.tv);
|
|
|
|
|
std::string s;
|
|
|
|
@ -702,3 +721,63 @@ gboolean video_pre_long(gpointer data) {
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* videodevice changed
|
|
|
|
|
*/
|
|
|
|
|
void cb_video_cbox_videodev (GtkWidget *widget, gpointer data) {
|
|
|
|
|
|
|
|
|
|
// GtkWidget *cbres = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "cb-videores"));
|
|
|
|
|
// GtkWidget *cbresentry = gtk_bin_get_child(GTK_BIN(cbres));
|
|
|
|
|
GtkWidget *cbfmt = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "cb-videofmt"));
|
|
|
|
|
GtkWidget *cbfmtentry = gtk_bin_get_child(GTK_BIN(cbfmt));
|
|
|
|
|
GtkListStore *model;
|
|
|
|
|
std::list<string> lst_format;
|
|
|
|
|
std::list<string> lst_resolution;
|
|
|
|
|
std::list<string>::iterator iter;
|
|
|
|
|
std::string device, driver;
|
|
|
|
|
std::string parameter;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
printf ("%s:%d %s\n", __FILE__, __LINE__, __FUNCTION__);
|
|
|
|
|
|
|
|
|
|
video_stoprecord();
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// open device
|
|
|
|
|
video_get_driverdevice(&driver, &device);
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// load the selected driver
|
|
|
|
|
if (driver.compare("V4L2") == 0) videodev = new VideoDev_V4L2;
|
|
|
|
|
#ifdef USE_SVBONY
|
|
|
|
|
else if (driver.compare("SVBCAM") == 0) videodev = new VideoDev_SVBCam;
|
|
|
|
|
#endif
|
|
|
|
|
else if (driver.compare("DUMMY") == 0) videodev = new VideoDev;
|
|
|
|
|
else videodev = new VideoDev;
|
|
|
|
|
|
|
|
|
|
videodev->GetDeviceFormats(device, &lst_format);
|
|
|
|
|
model = GTK_LIST_STORE(gtk_combo_box_get_model(GTK_COMBO_BOX(cbfmt)));
|
|
|
|
|
gtk_list_store_clear(GTK_LIST_STORE(model));
|
|
|
|
|
gtk_entry_set_text (GTK_ENTRY(cbfmtentry), "");
|
|
|
|
|
for (iter = lst_format.begin(); iter != lst_format.end(); iter++) {
|
|
|
|
|
gtk_list_store_insert_with_values(GTK_LIST_STORE(model), NULL, -1,
|
|
|
|
|
0, iter->c_str(),
|
|
|
|
|
-1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
videodev->GetDeviceResolutions(device, &lst_format);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// get resolution
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// get controls
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// close device
|
|
|
|
|
|
|
|
|
|
delete videodev;
|
|
|
|
|
videodev = NULL;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|