📄 video_dialog.cpp
字号:
CreateSizeMenu(); // change max frame rate spinner if (signalIndex == 1) { // NTSC gtk_spin_button_set_adjustment(GTK_SPIN_BUTTON(frame_rate_spinner), GTK_ADJUSTMENT(frame_rate_ntsc_adjustment)); } else { // PAL or SECAM float frameRate = gtk_spin_button_get_value_as_float( GTK_SPIN_BUTTON(frame_rate_spinner)); if (frameRate > VIDEO_PAL_FRAME_RATE) { gtk_spin_button_set_value(GTK_SPIN_BUTTON(frame_rate_spinner), VIDEO_PAL_FRAME_RATE); } gtk_spin_button_set_adjustment(GTK_SPIN_BUTTON(frame_rate_spinner), GTK_ADJUSTMENT(frame_rate_pal_adjustment)); }}static void on_signal_menu_activate(GtkWidget *widget, gpointer data){ ChangeSignal(((unsigned int)data) & 0xFF);}static void SetAvailableSignals(void){ GSList* item = signal_menu_items; u_int8_t i = 0; u_int8_t validSignalIndex = 0xFF; // for all menu items in the signal menu while (item != NULL) { // all signals are enabled bool enabled = true; // unless input is a tuner if (pVideoCaps != NULL && pVideoCaps->m_inputHasTuners[inputIndex]) { // this signal type is valid for this tuner if (pVideoCaps->m_inputTunerSignalTypes[inputIndex] & (1 << i)) { // remember first valid signal type for this tuner if (validSignalIndex == 0xFF) { validSignalIndex = i; } } else { // this signal type is invalid for this tuner // so disable this menu item enabled = false; // check if our current signal type is invalid for this tuner if (signalIndex == i) { signalIndex = 0xFF; } } } gtk_widget_set_sensitive(GTK_WIDGET(item->data), enabled); item = item->next; i++; } // try to choose a valid signal type if we don't have one if (signalIndex == 0xFF) { if (validSignalIndex == 0xFF) { // we're in trouble debug_message("SetAvailableSignals: no valid signal type!"); signalIndex = 0; } else { signalIndex = validSignalIndex; } // cause the displayed value to be updated gtk_option_menu_set_history(GTK_OPTION_MENU(signal_menu), signalIndex); // TBD check that signal activate is called here }}static void on_aspect_menu_activate(GtkWidget *widget, gpointer data){ aspectIndex = ((unsigned int)data) & 0xFF;}static bool ValidateAndSave(void){ // if source has been modified if (source_modified) { // validate it ChangeSource(); // can't validate if (source_modified) { return false; } } // if previewing, stop video source AVFlow->StopVideoPreview(); // copy new values to config MyConfig->SetStringValue(CONFIG_VIDEO_SOURCE_TYPE, source_type); MyConfig->SetStringValue(CONFIG_VIDEO_SOURCE_NAME, gtk_entry_get_text(GTK_ENTRY(source_entry))); MyConfig->UpdateFileHistory( gtk_entry_get_text(GTK_ENTRY(source_entry))); if (MyConfig->m_videoCapabilities != pVideoCaps) { delete MyConfig->m_videoCapabilities; MyConfig->m_videoCapabilities = pVideoCaps; pVideoCaps = NULL; } if (strcasecmp(source_type, VIDEO_SOURCE_V4L) && default_file_audio_source >= 0) { MyConfig->SetStringValue(CONFIG_AUDIO_SOURCE_TYPE, source_type); MyConfig->SetStringValue(CONFIG_AUDIO_SOURCE_NAME, gtk_entry_get_text(GTK_ENTRY(source_entry))); MyConfig->SetIntegerValue(CONFIG_AUDIO_SOURCE_TRACK, default_file_audio_source); } MyConfig->SetIntegerValue(CONFIG_VIDEO_INPUT, inputIndex); MyConfig->SetIntegerValue(CONFIG_VIDEO_SIGNAL, signalIndex); MyConfig->SetIntegerValue(CONFIG_VIDEO_CHANNEL_LIST_INDEX, channelListIndex); // extract channel index out of combo (not so simple) GtkWidget* entry = GTK_COMBO(channel_combo)->entry; const char* channelName = gtk_entry_get_text(GTK_ENTRY(entry)); struct CHANLISTS* pChannelList = chanlists; for (int i = 0; i < pChannelList[channelListIndex].count; i++) { if (!strcmp(channelName, pChannelList[channelListIndex].list[i].name)) { channelIndex = i; break; } } MyConfig->SetIntegerValue(CONFIG_VIDEO_CHANNEL_INDEX, channelIndex); MyConfig->SetIntegerValue(CONFIG_VIDEO_SOURCE_TRACK, trackValues ? trackValues[trackIndex] : 0); MyConfig->SetIntegerValue(CONFIG_VIDEO_RAW_WIDTH, sizeWidthValues[sizeIndex]); MyConfig->SetIntegerValue(CONFIG_VIDEO_RAW_HEIGHT, sizeHeightValues[sizeIndex]); MyConfig->SetFloatValue(CONFIG_VIDEO_ASPECT_RATIO, aspectValues[aspectIndex]); MyConfig->SetFloatValue(CONFIG_VIDEO_FRAME_RATE, gtk_spin_button_get_value_as_float( GTK_SPIN_BUTTON(frame_rate_spinner))); MyConfig->SetIntegerValue(CONFIG_VIDEO_BIT_RATE, gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(bit_rate_spinner))); // now put the new configuration into effect MyConfig->Update(); NewVideoWindow(); // restart video source if (MyConfig->GetBoolValue(CONFIG_VIDEO_ENABLE)) { AVFlow->StartVideoPreview(); } // refresh display of settings in main window DisplayVideoSettings(); DisplayStatusSettings(); return true;}static void on_ok_button (GtkWidget *widget, gpointer *data){ // check and save values if (!ValidateAndSave()) { return; } on_destroy_dialog(NULL, NULL);}static void on_cancel_button (GtkWidget *widget, gpointer *data){ on_destroy_dialog(NULL, NULL);}void CreateVideoDialog (void) { GtkWidget* hbox; GtkWidget* vbox; GtkWidget* hbox2; GtkWidget* label; GtkWidget* button; GtkObject* adjustment; pVideoCaps = MyConfig->m_videoCapabilities; default_file_audio_source = -1; dialog = gtk_dialog_new(); gtk_signal_connect(GTK_OBJECT(dialog), "destroy", GTK_SIGNAL_FUNC(on_destroy_dialog), &dialog); gtk_window_set_title(GTK_WINDOW(dialog), "Video Settings"); gtk_window_set_modal(GTK_WINDOW(dialog), TRUE);#ifndef HAVE_GTK_2_0 gtk_container_set_resize_mode(GTK_CONTAINER(dialog), GTK_RESIZE_IMMEDIATE);#endif hbox = gtk_hbox_new(FALSE, 1); gtk_widget_show(hbox); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), hbox, FALSE, FALSE, 5); vbox = gtk_vbox_new(TRUE, 1); gtk_widget_show(vbox); gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 5); label = gtk_label_new(" Source:"); gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); gtk_widget_show(label); input_label = gtk_label_new(" Port:"); gtk_misc_set_alignment(GTK_MISC(input_label), 0.0, 0.5); gtk_box_pack_start(GTK_BOX(vbox), input_label, FALSE, FALSE, 0); signal_label = gtk_label_new(" Signal:"); gtk_misc_set_alignment(GTK_MISC(signal_label), 0.0, 0.5); gtk_box_pack_start(GTK_BOX(vbox), signal_label, FALSE, FALSE, 0); channel_list_label = gtk_label_new(" Channel List:"); gtk_misc_set_alignment(GTK_MISC(channel_list_label), 0.0, 0.5); gtk_box_pack_start(GTK_BOX(vbox), channel_list_label, FALSE, FALSE, 0); channel_label = gtk_label_new(" Channel:"); gtk_misc_set_alignment(GTK_MISC(channel_label), 0.0, 0.5); gtk_box_pack_start(GTK_BOX(vbox), channel_label, FALSE, FALSE, 0); track_label = gtk_label_new(" Track:"); gtk_misc_set_alignment(GTK_MISC(track_label), 0.0, 0.5); gtk_box_pack_start(GTK_BOX(vbox), track_label, FALSE, FALSE, 0); label = gtk_label_new(" Output:"); gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); gtk_widget_show(label); gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); label = gtk_label_new(" Size:"); gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); gtk_widget_show(label); gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); label = gtk_label_new(" Aspect Ratio:"); gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); gtk_widget_show(label); gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); label = gtk_label_new(" Frame Rate (fps):"); gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); gtk_widget_show(label); gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); label = gtk_label_new(" Bit Rate (kbps):"); gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); gtk_widget_show(label); gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); vbox = gtk_vbox_new(TRUE, 1); gtk_widget_show(vbox); gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 5); hbox2 = gtk_hbox_new(FALSE, 1); gtk_widget_show(hbox2); gtk_box_pack_start(GTK_BOX(vbox), hbox2, FALSE, FALSE, 0); source_type = MyConfig->GetStringValue(CONFIG_VIDEO_SOURCE_TYPE); // source entry free(source_name); source_name = stralloc(MyConfig->GetStringValue(CONFIG_VIDEO_SOURCE_NAME)); source_modified = false; source_combo = CreateFileCombo(source_name); source_entry = GTK_COMBO(source_combo)->entry; source_list = GTK_COMBO(source_combo)->list; gtk_signal_connect(GTK_OBJECT(source_list), "select_child", GTK_SIGNAL_FUNC(on_source_list_changed), NULL); SetEntryValidator(GTK_OBJECT(source_entry), GTK_SIGNAL_FUNC(on_source_entry_changed), GTK_SIGNAL_FUNC(on_source_leave)); gtk_widget_show(source_combo); gtk_box_pack_start(GTK_BOX(hbox2), source_combo, TRUE, TRUE, 0); // browse button browse_button = gtk_button_new_with_label(" Browse... "); gtk_signal_connect(GTK_OBJECT(browse_button), "clicked", GTK_SIGNAL_FUNC(on_source_browse_button), NULL); gtk_widget_show(browse_button); gtk_box_pack_start(GTK_BOX(hbox2), browse_button, FALSE, FALSE, 5); // N.B. because of the dependencies of // input, signal, channel list, channel, and sizes // order of operations is important here channelIndex = MyConfig->GetIntegerValue(CONFIG_VIDEO_CHANNEL_INDEX); channelListIndex = MyConfig->GetIntegerValue(CONFIG_VIDEO_CHANNEL_LIST_INDEX); signalIndex = MyConfig->GetIntegerValue(CONFIG_VIDEO_SIGNAL); inputIndex = MyConfig->GetIntegerValue(CONFIG_VIDEO_INPUT); channel_combo = NULL; channel_combo = gtk_combo_new(); CreateChannelCombo(); channel_list_menu = NULL; CreateChannelListMenu(); track_menu = NULL; track_menu = CreateTrackMenu( track_menu, 'V', gtk_entry_get_text(GTK_ENTRY(source_entry)), &trackIndex, &trackNumber, &trackValues); trackIndex = 0; for (u_int8_t i = 0; i < trackNumber; i++) { if (MyConfig->GetIntegerValue(CONFIG_VIDEO_SOURCE_TRACK) == trackValues[i]) { trackIndex = i; break; } } sizeIndex = 0; for (u_int8_t i = 0; i < sizeWidthValueCnt; i++) { if (MyConfig->GetIntegerValue(CONFIG_VIDEO_RAW_WIDTH) == sizeWidthValues[i] && MyConfig->GetIntegerValue(CONFIG_VIDEO_RAW_HEIGHT) == sizeHeightValues[i]) { sizeIndex = i; break; } } size_menu = NULL; CreateSizeMenu(); signal_menu = CreateOptionMenu( NULL, signalNames, sizeof(signalNames) / sizeof(char*), signalIndex, GTK_SIGNAL_FUNC(on_signal_menu_activate), &signal_menu_items); input_menu = NULL; CreateInputMenu(pVideoCaps); ChangeInput(inputIndex); gtk_box_pack_start(GTK_BOX(vbox), input_menu, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), signal_menu, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), channel_list_menu, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), channel_combo, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), track_menu, FALSE, FALSE, 0); // spacer label = gtk_label_new(" "); gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); gtk_widget_show(label); gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), size_menu, FALSE, FALSE, 0); aspectIndex = 0; for (u_int8_t i = 0; i < sizeof(aspectValues) / sizeof(float); i++) { if (MyConfig->GetFloatValue(CONFIG_VIDEO_ASPECT_RATIO) == aspectValues[i]) { aspectIndex = i; break; } } aspect_menu = CreateOptionMenu( NULL, aspectNames, sizeof(aspectNames) / sizeof(char*), aspectIndex, GTK_SIGNAL_FUNC(on_aspect_menu_activate)); gtk_box_pack_start(GTK_BOX(vbox), aspect_menu, FALSE, FALSE, 0); frame_rate_pal_adjustment = gtk_adjustment_new( MyConfig->GetFloatValue(CONFIG_VIDEO_FRAME_RATE), 1, VIDEO_PAL_FRAME_RATE, 1, 0, 0); gtk_object_ref(frame_rate_pal_adjustment); frame_rate_ntsc_adjustment = gtk_adjustment_new( MyConfig->GetFloatValue(CONFIG_VIDEO_FRAME_RATE), 1, VIDEO_NTSC_FRAME_RATE, 1, 0, 0); gtk_object_ref(frame_rate_ntsc_adjustment); if (signalIndex == 1) { frame_rate_spinner = gtk_spin_button_new( GTK_ADJUSTMENT(frame_rate_ntsc_adjustment), 1, 2); } else { frame_rate_spinner = gtk_spin_button_new( GTK_ADJUSTMENT(frame_rate_pal_adjustment), 1, 2); } gtk_widget_show(frame_rate_spinner); gtk_box_pack_start(GTK_BOX(vbox), frame_rate_spinner, FALSE, FALSE, 0); adjustment = gtk_adjustment_new( MyConfig->GetIntegerValue(CONFIG_VIDEO_BIT_RATE), 25, 4000, 50, 0, 0); bit_rate_spinner = gtk_spin_button_new(GTK_ADJUSTMENT(adjustment), 50, 0); gtk_widget_show(bit_rate_spinner); gtk_box_pack_start(GTK_BOX(vbox), bit_rate_spinner, FALSE, FALSE, 0); // Add standard buttons at bottom button = AddButtonToDialog(dialog, " OK ", GTK_SIGNAL_FUNC(on_ok_button)); GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT); AddButtonToDialog(dialog, " Cancel ", GTK_SIGNAL_FUNC(on_cancel_button)); ShowSourceSpecificSettings(); gtk_widget_show(dialog);}/* end video_dialog.cpp */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -