📄 video_dialog.cpp
字号:
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;
char* channelName = gtk_entry_get_text(GTK_ENTRY(entry));
struct CHANNEL_LIST* pChannelList =
ListOfChannelLists[signalIndex];
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);
gtk_container_set_resize_mode(GTK_CONTAINER(dialog), GTK_RESIZE_IMMEDIATE);
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;
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 < sizeof(sizeWidthValues) / sizeof(u_int16_t); 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 + -