3 * @author marc-olivier.dzeukou@parrot.com
6 * @author stephane.piskorski@parrot.com
8 * ihm vision source file
15 #include <ardrone_api.h>
17 # include <Vision/vision_tracker_engine.h>
20 #include "ihm/ihm_vision.h"
22 #include "common/mobile_config.h"
23 #include "ihm/ihm_stages_o_gtk.h"
25 #include <ardrone_tool/ardrone_tool_configuration.h>
27 #include <VP_Os/vp_os_print.h>
28 #include <VP_Os/vp_os_malloc.h>
29 #include <VP_Api/vp_api_supervisor.h>
30 #include <ardrone_tool/Video/video_stage_recorder.h>
31 #include <VLIB/video_codec.h>
35 TRACKING_PARAMETERS_FRAME,
36 TRACKING_OPTION_FRAME,
37 COMPUTING_OPTION_FRAME,
44 TRACKING_PARAM_HBOX1=0,
48 COMPUTING_OPTION_HBOX,
69 UPDATE_VISION_PARAMS_BUTTON = 0,
74 PROJ_OVERSCENE_BUTTON,
88 NB_VIDEO_STREAM_WIDGET
91 char ihm_ImageTitle[128] = "VISION : Image" ;
92 char *ihm_ImageFrameCaption[NB_IMAGES_FRAMES] = {"Vision states","Tracking parameters","Tracking options","Computing options","Video Stream","Video Display"};
93 char *ihm_ImageEntryCaption[NB_IMAGES_ENTRIES] = { " CS ",
103 char *ihm_ImageButtonCaption[NB_IMAGES_BUTTONS] = { "Update\nvision\nparams",
112 "Record Video\non local disk",
114 " GTK Full Screen "};
115 char *ihm_ImageVideoStreamCaption[NB_VIDEO_STREAM_WIDGET] = {" Codec type "," Bitrate control mode ", " Manual target bitrate "};
118 GtkWidget *ihm_ImageVBox, *ihm_ImageVBoxPT, *ihm_ImageHBox[NB_IMAGES_H_BOXES], *displayvbox,*ihm_ImageButton[NB_IMAGES_BUTTONS], *ihm_ImageLabel[NB_IMAGES_ENTRIES], *ihm_ImageFrames[NB_IMAGES_FRAMES], *ihm_VideoStreamLabel[NB_VIDEO_STREAM_WIDGET];
120 extern GtkWidget *button_show_image,*button_show_image2;
121 extern mobile_config_t *pcfg;
122 extern PIPELINE_HANDLE pipeline_handle;
123 /* Vision image var */
124 GtkLabel *label_vision_values=NULL;
125 GtkWidget *ihm_ImageWin=NULL, *ihm_ImageEntry[NB_IMAGES_ENTRIES], *ihm_VideoStream_VBox=NULL;
127 /* For fullscreen video display */
128 GtkWidget *fullscreen_window = NULL;
129 GtkWidget *fullscreen_eventbox = NULL;
130 GtkImage *fullscreen_image = NULL;
131 GdkScreen *fullscreen = NULL;
132 GtkWidget *ihm_fullScreenButton[4], *ihm_fullScreenHBox;
133 GtkWidget *ihm_fullScreenFixedContainer;
135 int flag_timer_is_active = 0;
136 int timer_counter = 0;
138 GtkWidget* video_bitrateEntry;
139 GtkWidget* video_bitrateModeList;
140 GtkWidget * video_codecList;
141 GtkWidget *video_bitrateButton;
142 int tab_vision_config_params[10];
143 int vision_config_options;
144 int image_vision_window_status, image_vision_window_view;
145 char label_vision_state_value[32];
146 extern GtkImage *image;
148 static void ihm_sendVisionConfigParams(GtkWidget *widget, gpointer data) {
149 api_vision_tracker_params_t params;
151 params.coarse_scale = tab_vision_config_params[0]; // scale of current picture with respect to original picture
152 params.nb_pair = tab_vision_config_params[1]; // number of searched pairs in each direction
153 params.loss_per = tab_vision_config_params[2]; // authorized lost pairs percentage for tracking
154 params.nb_tracker_width = tab_vision_config_params[3]; // number of trackers in width of current picture
155 params.nb_tracker_height = tab_vision_config_params[4]; // number of trackers in height of current picture
156 params.scale = tab_vision_config_params[5]; // distance between two pixels in a pair
157 params.trans_max = tab_vision_config_params[6]; // largest value of trackers translation between two adjacent pictures
158 params.max_pair_dist = tab_vision_config_params[7]; // largest distance of pairs research from tracker location
159 params.noise = tab_vision_config_params[8]; // threshold of significative contrast
161 ardrone_at_set_vision_track_params( ¶ms );
163 DEBUG_PRINT_SDK("CS %04d NB_P %04d Lossp %04d NB_Tlg %04d NB_TH %04d Scale %04d Dist_Max %04d Max_Dist %04d Noise %04d\n",
164 tab_vision_config_params[0],
165 tab_vision_config_params[1],
166 tab_vision_config_params[2],
167 tab_vision_config_params[3],
168 tab_vision_config_params[4],
169 tab_vision_config_params[5],
170 tab_vision_config_params[6],
171 tab_vision_config_params[7],
172 tab_vision_config_params[8] );
176 void ihm_video_recording_callback(video_stage_recorder_config_t * cfg) {
177 printf("Started recording %s\n", cfg->video_filename);
180 static void ihm_RAWCapture(GtkWidget *widget, gpointer data) {
181 static int is_recording = 0;
183 DEBUG_PRINT_SDK(" RAW video capture\n");
188 // Sending AT command to drone.
189 ardrone_at_start_raw_capture();
192 * Tells the Raw capture stage to start dumping YUV frames from
193 * the pipeline to a disk file.
196 dest.pipeline = pipeline_handle;
197 vp_api_post_message(dest, PIPELINE_MSG_START, ihm_video_recording_callback, NULL);
199 /* Tells the FFMPEG recorder stage to start dumping the video in a
203 vp_api_post_message(dest, PIPELINE_MSG_START, NULL, NULL);
206 gtk_button_set_label((GtkButton*) ihm_ImageButton[RAW_CAPTURE_BUTTON], (const gchar*) "Recording...\n(click again to stop)");
207 gtk_button_set_label((GtkButton*) ihm_fullScreenButton[0], (const gchar*) "Recording...\n(click again to stop)");
210 gtk_button_set_label((GtkButton*) ihm_ImageButton[RAW_CAPTURE_BUTTON], (const gchar*) "Recording stopped.\nClick again to start a new video");
211 gtk_button_set_label((GtkButton*) ihm_fullScreenButton[0], (const gchar*) "Recording stopped.\nClick again to start a new video");
216 static void ihm_Zapper(GtkWidget *widget, gpointer data) {
217 int32_t channel = ZAP_CHANNEL_NEXT;
219 ARDRONE_TOOL_CONFIGURATION_ADDEVENT(video_channel, &channel, NULL);
222 static void ihm_VideoFullScreenStop(GtkWidget *widget, gpointer data) {
223 printf("Quitting fullscreen.\n");
225 fullscreen_image = NULL;
226 fullscreen_window = NULL;
229 gboolean hide_fullscreen_buttons(gpointer pData) {
231 if (timer_counter <= 0) {
232 if (GTK_IS_WIDGET(ihm_fullScreenHBox))
233 gtk_widget_hide(ihm_fullScreenHBox);
239 void ihm_VideoFullScreenMouseMove(GtkWidget *widget, gpointer data) {
241 if (GTK_IS_WIDGET(ihm_fullScreenHBox)) {
242 gtk_widget_show(ihm_fullScreenHBox);
246 static void ihm_QuitFullscreenRequest(GtkWidget *widget, gpointer data) {
247 gtk_widget_destroy(fullscreen_window);
250 static void ihm_VideoFullScreen(GtkWidget *widget, gpointer data) {
253 if (fullscreen != NULL) {
254 printf(" Already fullscreen\n");
257 printf(" Go Fullscreen\n");
259 /* Builds the image */
260 fullscreen_image = (GtkImage*) gtk_image_new();
261 fullscreen_eventbox = gtk_event_box_new();
262 //align = gtk_alignment_new(0.5f,0.5f,0.0f,0.0f);
265 /* Add three buttons on the fullscreen window */
266 ihm_fullScreenHBox = gtk_hbox_new(FALSE, 0);
268 ihm_fullScreenButton[0] = gtk_button_new_with_label(ihm_ImageButtonCaption[RAW_CAPTURE_BUTTON]);
269 g_signal_connect(G_OBJECT(ihm_fullScreenButton[0]), "clicked", (GCallback) ihm_RAWCapture, NULL);
270 gtk_container_add(GTK_CONTAINER(ihm_fullScreenHBox), ihm_fullScreenButton[0]);
272 ihm_fullScreenButton[1] = gtk_button_new_with_label(ihm_ImageButtonCaption[ZAPPER_BUTTON]);
273 g_signal_connect(G_OBJECT(ihm_fullScreenButton[1]), "clicked", (GCallback) ihm_Zapper, NULL);
274 gtk_container_add(GTK_CONTAINER(ihm_fullScreenHBox), ihm_fullScreenButton[1]);
276 ihm_fullScreenButton[2] = gtk_button_new_with_label("Quit Fullscreen");
277 g_signal_connect(G_OBJECT(ihm_fullScreenButton[2]), "clicked", (GCallback) ihm_QuitFullscreenRequest, NULL);
278 gtk_container_add(GTK_CONTAINER(ihm_fullScreenHBox), ihm_fullScreenButton[2]);
280 //ihm_fullScreenButton[3] = gtk_button_new(); // Fake button
282 //gtk_container_add(GTK_CONTAINER (align),ihm_fullScreenHBox);
284 /* Create window (full screen) */
285 fullscreen_window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
288 fullscreen = gtk_window_get_screen(GTK_WINDOW(fullscreen_window));
289 w = gdk_screen_get_width(fullscreen);
290 h = gdk_screen_get_height(fullscreen);
291 gtk_widget_set_size_request(GTK_WIDGET(fullscreen_window), w, h);
293 /* The fixed container */
294 ihm_fullScreenFixedContainer = gtk_fixed_new();
295 gtk_fixed_put((GtkFixed*) (ihm_fullScreenFixedContainer), GTK_WIDGET(fullscreen_image), 0, 0);
296 gtk_fixed_put((GtkFixed*) (ihm_fullScreenFixedContainer), GTK_WIDGET(ihm_fullScreenHBox), 0, 0);
298 /* Build the fullscreen window with the fixed container */
299 gtk_container_add(GTK_CONTAINER(fullscreen_eventbox), ihm_fullScreenFixedContainer);
300 gtk_container_add(GTK_CONTAINER(fullscreen_window), fullscreen_eventbox);
302 gtk_window_set_decorated(GTK_WINDOW(fullscreen_window), FALSE);
303 gtk_window_set_resizable(GTK_WINDOW(fullscreen_window), FALSE);
305 printf("Fullscreen size : %ix%i\n", w, h);
307 g_signal_connect(G_OBJECT(fullscreen_window), "destroy", (GCallback) ihm_VideoFullScreenStop, NULL);
308 g_signal_connect(fullscreen_eventbox, "motion_notify_event", (GCallback) ihm_VideoFullScreenMouseMove, NULL);
309 gtk_widget_add_events(fullscreen_eventbox, GDK_POINTER_MOTION_MASK);
311 gtk_window_fullscreen(GTK_WINDOW(fullscreen_window));
312 gtk_widget_show_all(GTK_WIDGET(fullscreen_window));
313 gtk_widget_hide(ihm_fullScreenHBox);
314 //gtk_widget_get_size_request(ihm_fullScreenHBox,&w2,&h2);
315 //printf("Fullscreen size2 : %ix%i %ix%i\n",w,h,w2,h2);
317 //gtk_fixed_put(ihm_fullScreenFixedContainer,ihm_fullScreenHBox,0,h-30);
319 if (!flag_timer_is_active) {
320 g_timeout_add(1000, (GtkFunction) hide_fullscreen_buttons, NULL);
321 flag_timer_is_active = 1;
327 static void ihm_ImageButtonCB(GtkWidget *widget, gpointer data) {
328 int button = (int) data;
330 printf(" Button clicked No: %d\n", button);
332 ardrone_at_set_vision_update_options(button);
335 // void ihm_ImageWinDestroy ( void )
336 void ihm_ImageWinDestroy(GtkWidget *widget, gpointer data) {
337 image_vision_window_status = WINDOW_CLOSED;
338 printf("Destroying the Video window.\n");
339 if (fullscreen != NULL) {
340 ihm_VideoFullScreenStop(NULL, NULL);
342 ihm_VideoStream_VBox = NULL; /* this var. is tested by stage Gtk */
346 gint ihm_ImageWinDelete(GtkWidget *widget, GdkEvent *event, gpointer data) {
347 image_vision_window_status = WINDOW_CLOSED;
348 printf("Deleting the Video window.\n");
349 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button_show_image), FALSE);
353 static void ihm_showImage(gpointer pData) {
354 GtkWidget* widget = (GtkWidget*) pData;
356 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))) {
357 if (!GTK_IS_WIDGET(ihm_ImageWin)) {
358 create_image_window(); // Recreate window if it has been killed
360 gtk_widget_show_all(ihm_ImageWin);
361 image_vision_window_view = WINDOW_VISIBLE;
364 if (GTK_IS_WIDGET(ihm_ImageWin)) {
365 gtk_widget_hide_all(ihm_ImageWin);
366 image_vision_window_view = WINDOW_HIDE;
371 static void ihm_send_VideoBitrate(GtkWidget *widget, gpointer data) {
372 int32_t bitrateValue = atoi(gtk_entry_get_text(GTK_ENTRY(video_bitrateEntry)));
373 ARDRONE_TOOL_CONFIGURATION_ADDEVENT(bitrate, &bitrateValue, NULL);
376 static void ihm_send_VideoCodec(GtkComboBox *widget, gpointer data) {
379 pos = gtk_combo_box_get_active( widget );
380 codec = (pos == 0) ? UVLC_CODEC : P264_CODEC;
381 ARDRONE_TOOL_CONFIGURATION_ADDEVENT(video_codec, &codec, NULL);
384 static void ihm_send_VideoBitrateMode(GtkComboBox *widget, gpointer data) {
386 pos = (int32_t)gtk_combo_box_get_active( widget );
387 ARDRONE_TOOL_CONFIGURATION_ADDEVENT(bitrate_ctrl_mode, &pos, NULL);
390 void update_vision( void )
392 if (ihm_ImageWin != NULL && GTK_IS_WIDGET(ihm_ImageWin)) {
393 if (image_vision_window_view == WINDOW_VISIBLE) {
395 // Vision state refresh
396 if (label_vision_values != NULL && GTK_IS_LABEL(label_vision_values))
397 gtk_label_set_label(label_vision_values, label_vision_state_value);
398 if (ihm_ImageWin != NULL && GTK_IS_WIDGET(ihm_ImageWin))
399 gtk_widget_show_all(ihm_ImageWin);
404 void create_image_window( void )
406 /* Image display main window */
407 /* ------------------------- */
410 printf("Creating the Video window.\n");
413 ihm_ImageWin = gtk_window_new( GTK_WINDOW_TOPLEVEL);
414 gtk_container_set_border_width(GTK_CONTAINER(ihm_ImageWin), 10);
415 gtk_window_set_title(GTK_WINDOW(ihm_ImageWin), ihm_ImageTitle);
416 gtk_signal_connect(GTK_OBJECT(ihm_ImageWin), "destroy", G_CALLBACK(ihm_ImageWinDestroy), NULL );
419 ihm_ImageVBox = gtk_vbox_new(FALSE, 0);
420 ihm_VideoStream_VBox = gtk_vbox_new(FALSE, 0);
421 ihm_ImageVBoxPT = gtk_vbox_new(FALSE, 0);
423 //hBox_vision_state = gtk_hbox_new(FALSE, 0);
424 for (k=0; k<NB_IMAGES_H_BOXES; k++) ihm_ImageHBox[k] = gtk_hbox_new(FALSE, 0);
426 for (k=0; k<NB_IMAGES_FRAMES; k++) ihm_ImageFrames[k] = gtk_frame_new( ihm_ImageFrameCaption[k] );
428 for (k=0; k<NB_IMAGES_ENTRIES; k++) {
429 ihm_ImageEntry[k] = gtk_entry_new();
430 gtk_widget_set_size_request(ihm_ImageEntry[k], 80, 20);
434 for (k=0; k<NB_VIDEO_STREAM_WIDGET; k++) ihm_VideoStreamLabel[k] = gtk_label_new( ihm_ImageVideoStreamCaption[k] );
436 video_bitrateEntry = gtk_entry_new();
437 gtk_widget_set_size_request(video_bitrateEntry, 150, 20);
439 video_codecList = gtk_combo_box_new_text();
440 gtk_combo_box_insert_text( (GtkComboBox*)video_codecList, 0, (const gchar*)"UVLC");
441 gtk_combo_box_insert_text( (GtkComboBox*)video_codecList, 1, (const gchar*)"P264");
442 gtk_widget_set_size_request(video_codecList, 150, 20);
444 video_bitrateModeList = gtk_combo_box_new_text();
445 gtk_combo_box_insert_text( (GtkComboBox*)video_bitrateModeList, 0, (const gchar*)"None");
446 gtk_combo_box_insert_text( (GtkComboBox*)video_bitrateModeList, 1, (const gchar*)"Adaptative");
447 gtk_combo_box_insert_text( (GtkComboBox*)video_bitrateModeList, 2, (const gchar*)"Manual");
448 gtk_widget_set_size_request(video_codecList, 150, 20);
450 for (k=0; k<NB_IMAGES_ENTRIES; k++) ihm_ImageLabel[k] = gtk_label_new( ihm_ImageEntryCaption[k] );
452 /* Creates buttons and links them to callbacks */
453 for (k=0; k<NB_IMAGES_BUTTONS; k++)
455 ihm_ImageButton[k] = gtk_button_new();// ihm_ImageButtonCaption[k] );
456 gtk_button_set_label((GtkButton*)ihm_ImageButton[k] ,ihm_ImageButtonCaption[k]);
460 case UPDATE_VISION_PARAMS_BUTTON:
461 g_signal_connect( G_OBJECT(ihm_ImageButton[k]), "clicked", G_CALLBACK(ihm_sendVisionConfigParams), (gpointer)k );
463 case RAW_CAPTURE_BUTTON:
464 g_signal_connect( G_OBJECT(ihm_ImageButton[k]), "clicked", G_CALLBACK(ihm_RAWCapture), (gpointer)k );
467 g_signal_connect( G_OBJECT(ihm_ImageButton[k]), "clicked", G_CALLBACK(ihm_Zapper), (gpointer)k );
469 case FULLSCREEN_BUTTON:
470 g_signal_connect( G_OBJECT(ihm_ImageButton[k]), "clicked", G_CALLBACK(ihm_VideoFullScreen), (gpointer)k );
473 g_signal_connect( G_OBJECT(ihm_ImageButton[k]), "clicked", G_CALLBACK(ihm_ImageButtonCB), (gpointer)k );
478 gdk_color_parse ("red", &color);
479 gtk_widget_modify_text (ihm_ImageLabel[RAW_CAPTURE_BUTTON], GTK_STATE_NORMAL, &color);
481 video_bitrateButton = gtk_button_new_with_label( "Send" );
482 g_signal_connect(G_OBJECT(video_bitrateButton), "clicked", G_CALLBACK(ihm_send_VideoBitrate), 0 );
483 g_signal_connect(G_OBJECT(video_codecList), "changed", G_CALLBACK(ihm_send_VideoCodec), 0 );
484 g_signal_connect(G_OBJECT(video_bitrateModeList), "changed", G_CALLBACK(ihm_send_VideoBitrateMode), 0 );
486 /* Creates input boxes (aka. entries) */
487 char label_vision_default_val[NB_IMAGES_ENTRIES] ;
488 tab_vision_config_params[0] = DEFAULT_CS;
489 tab_vision_config_params[1] = DEFAULT_NB_PAIRS;
490 tab_vision_config_params[2] = DEFAULT_LOSS_PER;
491 tab_vision_config_params[3] = DEFAULT_NB_TRACKERS_WIDTH;
492 tab_vision_config_params[4] = DEFAULT_NB_TRACKERS_HEIGHT;
493 tab_vision_config_params[5] = DEFAULT_SCALE;
494 tab_vision_config_params[6] = DEFAULT_TRANSLATION_MAX;
495 tab_vision_config_params[7] = DEFAULT_MAX_PAIR_DIST;
496 tab_vision_config_params[8] = DEFAULT_NOISE;
498 for (k=0; k<NB_IMAGES_ENTRIES; k++) {
499 if (k==FAKE_ENTRY) continue;
500 sprintf(label_vision_default_val, "%d", tab_vision_config_params[k]);
501 gtk_entry_set_text( GTK_ENTRY(ihm_ImageEntry[k]), label_vision_default_val);
503 gtk_entry_set_text( GTK_ENTRY(video_bitrateEntry), "frame size (bytes)");
505 /* Builds the vision state frame */
506 vp_os_memset(label_vision_state_value, 0, sizeof(label_vision_state_value));
507 strcat(label_vision_state_value, "Not Connected");
508 label_vision_values = (GtkLabel*) gtk_label_new(label_vision_state_value);
510 gtk_container_add( GTK_CONTAINER(ihm_ImageFrames[STATE_FRAME]), (GtkWidget*) label_vision_values );
512 /* Builds the vision parameters frame */
514 /* First line of parameters */
515 for (k=CS_ENTRY; k<NB_TH_ENTRY; k++) {
516 gtk_box_pack_start(GTK_BOX(ihm_ImageHBox[TRACKING_PARAM_HBOX1]), ihm_ImageLabel[k], FALSE , FALSE, 0);
517 gtk_box_pack_start(GTK_BOX(ihm_ImageHBox[TRACKING_PARAM_HBOX1]), ihm_ImageEntry[k], FALSE , FALSE, 0);
519 /* Second line of parameters */
520 for (k=NB_TH_ENTRY; k<NB_IMAGES_ENTRIES; k++) {
521 if (k==FAKE_ENTRY) continue;
522 gtk_box_pack_start(GTK_BOX(ihm_ImageHBox[TRACKING_PARAM_HBOX2]), ihm_ImageLabel[k], FALSE , FALSE, 0);
523 gtk_box_pack_start(GTK_BOX(ihm_ImageHBox[TRACKING_PARAM_HBOX2]), ihm_ImageEntry[k], FALSE , FALSE, 0);
526 gtk_box_pack_start(GTK_BOX(ihm_ImageHBox[TRACKING_PARAM_HBOX2]), ihm_ImageLabel[FAKE_ENTRY], FALSE , FALSE, 0); // To fill space
527 /* Fuses the two line in a single VBox */
528 gtk_box_pack_start(GTK_BOX(ihm_ImageVBoxPT), ihm_ImageHBox[TRACKING_PARAM_HBOX1], FALSE , FALSE, 0);
529 gtk_box_pack_start(GTK_BOX(ihm_ImageVBoxPT), ihm_ImageHBox[TRACKING_PARAM_HBOX2], FALSE , FALSE, 0);
531 /* Builds the whole parameter block */
532 gtk_container_add(GTK_CONTAINER(ihm_ImageFrames[TRACKING_PARAMETERS_FRAME]), ihm_ImageVBoxPT );
533 gtk_box_pack_start(GTK_BOX(ihm_ImageHBox[TRACKING_PARAMS_HBOX]), ihm_ImageFrames[TRACKING_PARAMETERS_FRAME], FALSE , FALSE, 0);
534 gtk_box_pack_start(GTK_BOX(ihm_ImageHBox[TRACKING_PARAMS_HBOX]), ihm_ImageButton[UPDATE_VISION_PARAMS_BUTTON], TRUE , FALSE, 5);
536 for (k=TZ_KNOWN_BUTTON; k<=SE3_BUTTON; k++)
537 gtk_box_pack_start(GTK_BOX( ihm_ImageHBox[TRACKING_OPTION_HBOX]), ihm_ImageButton[k], TRUE , FALSE, 0);
538 for (k=PROJ_OVERSCENE_BUTTON; k<=FLAT_GROUND_BUTTON; k++)
539 gtk_box_pack_start(GTK_BOX( ihm_ImageHBox[COMPUTING_OPTION_HBOX]), ihm_ImageButton[k], TRUE , FALSE, 0);
542 gtk_box_pack_start(GTK_BOX( ihm_ImageHBox[VIDEO_STREAM_HBOX]), ihm_VideoStreamLabel[CODEC_TYPE_LIST], FALSE , FALSE, 0);
543 gtk_box_pack_start(GTK_BOX( ihm_ImageHBox[VIDEO_STREAM_HBOX]), video_codecList, TRUE , FALSE, 0);
544 gtk_box_pack_start(GTK_BOX( ihm_ImageHBox[VIDEO_STREAM_HBOX]), ihm_VideoStreamLabel[BITRATE_MODE_LIST], FALSE , FALSE, 0);
545 gtk_box_pack_start(GTK_BOX( ihm_ImageHBox[VIDEO_STREAM_HBOX]), video_bitrateModeList, TRUE , FALSE, 0);
546 gtk_box_pack_start(GTK_BOX( ihm_ImageHBox[VIDEO_STREAM_HBOX]), ihm_VideoStreamLabel[MANUAL_BITRATE_ENTRY], FALSE , FALSE, 0);
547 gtk_box_pack_start(GTK_BOX( ihm_ImageHBox[VIDEO_STREAM_HBOX]), video_bitrateEntry, TRUE , FALSE, 0);
548 gtk_box_pack_start(GTK_BOX( ihm_ImageHBox[VIDEO_STREAM_HBOX]), video_bitrateButton, TRUE , FALSE, 0);
551 gtk_container_add(GTK_CONTAINER( ihm_ImageFrames[TRACKING_OPTION_FRAME]) , ihm_ImageHBox[TRACKING_OPTION_HBOX] );
552 gtk_container_add(GTK_CONTAINER( ihm_ImageFrames[COMPUTING_OPTION_FRAME]), ihm_ImageHBox[COMPUTING_OPTION_HBOX] );
553 gtk_container_add(GTK_CONTAINER( ihm_ImageFrames[VIDEO_STREAM_FRAME]) , ihm_ImageHBox[VIDEO_STREAM_HBOX] );
555 /* Frame where to show buttons controlling how the drone video is displayed */
556 displayvbox = gtk_vbox_new(FALSE,0);
558 gtk_box_pack_start(GTK_BOX(displayvbox), ihm_ImageButton[RAW_CAPTURE_BUTTON], FALSE , FALSE, 5);
559 gtk_box_pack_start(GTK_BOX(displayvbox), ihm_ImageButton[ZAPPER_BUTTON], FALSE , FALSE, 5);
560 gtk_box_pack_start(GTK_BOX(displayvbox), ihm_ImageButton[FULLSCREEN_BUTTON], FALSE , FALSE, 5);
562 gtk_box_pack_start(GTK_BOX(ihm_ImageHBox[VIDEO_DISPLAY_HBOX]),ihm_VideoStream_VBox,FALSE,FALSE,5);
563 gtk_box_pack_start(GTK_BOX(ihm_ImageHBox[VIDEO_DISPLAY_HBOX]),displayvbox,FALSE,FALSE,5);
565 gtk_container_add(GTK_CONTAINER( ihm_ImageFrames[VIDEO_DISPLAY_FRAME]) , ihm_ImageHBox[VIDEO_DISPLAY_HBOX] );
567 /* Builds the final window */
568 gtk_box_pack_start(GTK_BOX(ihm_ImageVBox), ihm_ImageFrames[VIDEO_DISPLAY_FRAME], FALSE, FALSE, 5);
569 gtk_box_pack_start(GTK_BOX(ihm_ImageVBox), ihm_ImageFrames[STATE_FRAME], FALSE, FALSE, 5);
570 gtk_box_pack_start(GTK_BOX(ihm_ImageVBox), ihm_ImageHBox[TRACKING_PARAMS_HBOX], FALSE, FALSE, 5);
571 gtk_box_pack_start(GTK_BOX(ihm_ImageVBox), ihm_ImageFrames[TRACKING_OPTION_FRAME], FALSE, FALSE, 5);
572 gtk_box_pack_start(GTK_BOX(ihm_ImageVBox), ihm_ImageFrames[COMPUTING_OPTION_FRAME], FALSE, FALSE, 5);
573 gtk_box_pack_start(GTK_BOX(ihm_ImageVBox), ihm_ImageFrames[VIDEO_STREAM_FRAME], FALSE, FALSE, 5);
575 gtk_container_add(GTK_CONTAINER(ihm_ImageWin), ihm_ImageVBox);
576 image_vision_window_view = WINDOW_HIDE;
577 image_vision_window_status = WINDOW_OPENED;
579 /* Set the callback for the checkbox inside the main application window */
580 g_signal_connect(G_OBJECT(button_show_image), "clicked", G_CALLBACK(ihm_showImage), (gpointer) ihm_ImageWin);
581 g_signal_connect(G_OBJECT(button_show_image2), "clicked", G_CALLBACK(ihm_showImage), (gpointer) ihm_ImageWin);