⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gui_main.cpp

📁 网络MPEG4IP流媒体开发源代码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
/* * The contents of this file are subject to the Mozilla Public * License Version 1.1 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of * the License at http://www.mozilla.org/MPL/ *  * Software distributed under the License is distributed on an "AS * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or * implied. See the License for the specific language governing * rights and limitations under the License. *  * The Original Code is MPEG4IP. *  * The Initial Developer of the Original Code is Cisco Systems Inc. * Portions created by Cisco Systems Inc. are * Copyright (C) Cisco Systems Inc. 2001.  All Rights Reserved. *  * Contributor(s):  *		Dave Mackie		dmackie@cisco.com *		Bill May 		wmay@cisco.com *//* * gui_main.cpp - Contains the gtk based gui  */#define __STDC_LIMIT_MACROS#include "mp4live.h"#include "mp4live_gui.h"#include "preview_flow.h"#include "gdk/gdkx.h"CLiveConfig* MyConfig;CPreviewAVMediaFlow* AVFlow;/* Local variables */static bool started = false;static GtkWidget *main_window;static GtkWidget *main_hbox;static GtkWidget *main_vbox1;static GtkWidget *main_vbox2;static GtkWidget *video_preview;static GtkWidget *video_enabled_button;static GSList	 *video_preview_radio_group;static GtkWidget *video_none_preview_button;static GtkWidget *video_raw_preview_button;static GtkWidget *video_encoded_preview_button;static GtkWidget *video_settings_label1;static GtkWidget *video_settings_label2;static GtkWidget *video_settings_label3;static GtkWidget *video_settings_button;static GtkWidget *picture_settings_button;static GtkWidget *audio_enabled_button;static GtkWidget *audio_mute_button;static GtkWidget *audio_settings_label1;static GtkWidget *audio_settings_label2;static GtkWidget *audio_settings_label3;static GtkWidget *audio_settings_button;static GtkWidget *record_enabled_button;static GtkWidget *record_settings_label;static GtkWidget *record_settings_button;static GtkWidget *transmit_enabled_button;static GtkWidget *transmit_settings_label;static GtkWidget *transmit_settings_button;static GtkWidget *start_button;static GtkWidget *start_button_label;static GtkWidget *duration_spinner;static GtkWidget *duration_units_menu;static GtkWidget *config_file_entry;static GtkWidget *load_config_button;static GtkWidget *save_config_button;static u_int32_t durationUnitsValues[] = {	1, 60, 3600, 3600*24, 3600*24*365};static char* durationUnitsNames[] = {	"Seconds", "Minutes", "Hours", "Days", "Years"};static u_int8_t durationUnitsIndex = 1;static GtkWidget *media_source_label;static GtkWidget *media_source;static GtkWidget *start_time_label;static GtkWidget *start_time;static GtkWidget *start_time_units;static GtkWidget *duration_label;static GtkWidget *duration;static GtkWidget *duration_units;static GtkWidget *current_time_label;static GtkWidget *current_time;static GtkWidget *current_time_units;static GtkWidget *finish_time_label;static GtkWidget *finish_time;static GtkWidget *finish_time_units;static GtkWidget *current_size_label;static GtkWidget *current_size;static GtkWidget *current_size_units;static GtkWidget *final_size_label;static GtkWidget *final_size;static GtkWidget *final_size_units;static GtkWidget *actual_fps_label;static GtkWidget *actual_fps;static GtkWidget *actual_fps_units;static Timestamp StartTime;static Timestamp StopTime;static Duration FlowDuration;static u_int32_t StartEncodedFrameNumber;static u_int64_t StartFileSize;static u_int64_t StopFileSize;/* * delete_event - called when window closed */static void delete_event (GtkWidget *widget, gpointer *data){	gtk_main_quit();}void NewVideoWindow(){	// We use the Gtk Preview widget to get the right type of window created	// and then hand it over to SDL to actually do the blitting	if (video_preview != NULL) {		gtk_container_remove(GTK_CONTAINER(main_vbox1), 			GTK_WIDGET(video_preview));		video_preview = NULL;	}	video_preview = gtk_preview_new(GTK_PREVIEW_COLOR);	gtk_preview_size(GTK_PREVIEW(video_preview), 		MyConfig->m_videoWidth, MyConfig->m_videoHeight);	gtk_widget_show(video_preview);	gtk_box_pack_start(GTK_BOX(main_vbox1), video_preview, FALSE, FALSE, 5);	// Let video source know which window to draw into	gtk_widget_realize(video_preview);	// so XCreateWindow() is called	if (video_preview->window) {		MyConfig->m_videoPreviewWindowId = 			GDK_WINDOW_XWINDOW(video_preview->window);	}}void DisplayVideoSettings(void){	char buffer[256];	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(video_enabled_button),		MyConfig->GetBoolValue(CONFIG_VIDEO_ENABLE));  	gtk_widget_set_sensitive(GTK_WIDGET(picture_settings_button),		MyConfig->IsCaptureVideoSource());  	gtk_toggle_button_set_active(		GTK_TOGGLE_BUTTON(video_none_preview_button), 		!MyConfig->GetBoolValue(CONFIG_VIDEO_PREVIEW));	gtk_toggle_button_set_active(		GTK_TOGGLE_BUTTON(video_raw_preview_button), 		MyConfig->GetBoolValue(CONFIG_VIDEO_PREVIEW)		&& MyConfig->GetBoolValue(CONFIG_VIDEO_RAW_PREVIEW));	gtk_toggle_button_set_active(		GTK_TOGGLE_BUTTON(video_encoded_preview_button), 		MyConfig->GetBoolValue(CONFIG_VIDEO_PREVIEW)		&& MyConfig->GetBoolValue(CONFIG_VIDEO_ENCODED_PREVIEW));	snprintf(buffer, sizeof(buffer), " %s at %u kbps",		 MyConfig->GetStringValue(CONFIG_VIDEO_ENCODING),		 MyConfig->GetIntegerValue(CONFIG_VIDEO_BIT_RATE));	gtk_label_set_text(GTK_LABEL(video_settings_label1), buffer);	gtk_widget_show(video_settings_label1);	snprintf(buffer, sizeof(buffer), " %u x %u @ %.2f fps", 		MyConfig->m_videoWidth,		MyConfig->m_videoHeight,		MyConfig->GetFloatValue(CONFIG_VIDEO_FRAME_RATE));	gtk_label_set_text(GTK_LABEL(video_settings_label2), buffer);	gtk_widget_show(video_settings_label2);}void DisplayAudioSettings(void){	char buffer[256]; 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(audio_enabled_button),		MyConfig->GetBoolValue(CONFIG_AUDIO_ENABLE));  	snprintf(buffer, sizeof(buffer), " %s at %u bps",		 MyConfig->GetStringValue(CONFIG_AUDIO_ENCODING),		MyConfig->GetIntegerValue(CONFIG_AUDIO_BIT_RATE));	gtk_label_set_text(GTK_LABEL(audio_settings_label1), buffer);	gtk_widget_show(audio_settings_label1);	snprintf(buffer, sizeof(buffer), " %s @ %u Hz",		(MyConfig->GetIntegerValue(CONFIG_AUDIO_CHANNELS) == 2			? "Stereo" : "Mono"),		MyConfig->GetIntegerValue(CONFIG_AUDIO_SAMPLE_RATE));	gtk_label_set_text(GTK_LABEL(audio_settings_label2), buffer);	gtk_widget_show(audio_settings_label2);}void DisplayTransmitSettings (void){	char buffer[256];	const char *addr = MyConfig->GetStringValue(CONFIG_RTP_DEST_ADDRESS);	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(transmit_enabled_button),		MyConfig->GetBoolValue(CONFIG_RTP_ENABLE));  	if (addr == NULL) {		gtk_label_set_text(GTK_LABEL(transmit_settings_label), 			"RTP/UDP to <Automatic Multicast>");	} else {		snprintf(buffer, sizeof(buffer), " RTP/UDP to %s", addr); 		gtk_label_set_text(GTK_LABEL(transmit_settings_label), buffer);	}	gtk_widget_show(transmit_settings_label);}void DisplayRecordingSettings(void){	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(record_enabled_button),		MyConfig->GetBoolValue(CONFIG_RECORD_ENABLE));	char* fileName = strrchr(		MyConfig->GetStringValue(CONFIG_RECORD_MP4_FILE_NAME), '/');	if (!fileName) {		fileName = MyConfig->GetStringValue(CONFIG_RECORD_MP4_FILE_NAME);	} else {		fileName++;	}	char buffer[256];    snprintf(buffer, sizeof(buffer), " %s", fileName);	gtk_label_set_text(GTK_LABEL(record_settings_label), buffer);	gtk_widget_show(record_settings_label);}void DisplayControlSettings(void){	// duration	gtk_spin_button_set_value(		GTK_SPIN_BUTTON(duration_spinner),		(gfloat)MyConfig->GetIntegerValue(CONFIG_APP_DURATION));	// duration units	for (u_int8_t i = 0; 	  i < sizeof(durationUnitsValues) / sizeof(*durationUnitsValues); i++) {		if (MyConfig->GetIntegerValue(CONFIG_APP_DURATION_UNITS) 		  == durationUnitsValues[i]) {			durationUnitsIndex = i;			break;		}	}	gtk_option_menu_set_history(		GTK_OPTION_MENU(duration_units_menu), 		durationUnitsIndex);	gtk_widget_show(duration_units_menu);}void DisplayStatusSettings(void){	// media source	char buffer[128];	buffer[0] = '\0';	if (MyConfig->GetBoolValue(CONFIG_VIDEO_ENABLE)	  && MyConfig->GetBoolValue(CONFIG_AUDIO_ENABLE)	  && strcmp(MyConfig->GetStringValue(CONFIG_VIDEO_SOURCE_NAME),		MyConfig->GetStringValue(CONFIG_AUDIO_SOURCE_NAME))) {		snprintf(buffer, sizeof(buffer), "%s & %s",			MyConfig->GetStringValue(CONFIG_VIDEO_SOURCE_NAME),			MyConfig->GetStringValue(CONFIG_AUDIO_SOURCE_NAME));		gtk_label_set_text(GTK_LABEL(media_source), buffer);	} else if (MyConfig->GetBoolValue(CONFIG_VIDEO_ENABLE)) {		gtk_label_set_text(GTK_LABEL(media_source),			MyConfig->GetStringValue(CONFIG_VIDEO_SOURCE_NAME));	} else if (MyConfig->GetBoolValue(CONFIG_AUDIO_ENABLE)) {		gtk_label_set_text(GTK_LABEL(media_source),			MyConfig->GetStringValue(CONFIG_AUDIO_SOURCE_NAME));	}}void DisplayAllSettings(){	DisplayVideoSettings();	DisplayAudioSettings();	DisplayRecordingSettings();	DisplayTransmitSettings();	DisplayControlSettings();	DisplayStatusSettings();}void DisplayFinishTime(Timestamp t){	time_t secs;	const struct tm *local;	char buffer[128];	secs = (time_t)GetSecsFromTimestamp(t);	local = localtime(&secs);	strftime(buffer, sizeof(buffer), "%l:%M:%S", local);	gtk_label_set_text(GTK_LABEL(finish_time), buffer);	gtk_widget_show(finish_time);	strftime(buffer, sizeof(buffer), "%p", local);	gtk_label_set_text(GTK_LABEL(finish_time_units), buffer);	gtk_widget_show(finish_time_units);}static void on_video_enabled_button (GtkWidget *widget, gpointer *data){	MyConfig->SetBoolValue(CONFIG_VIDEO_ENABLE,		gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)));	if (MyConfig->GetBoolValue(CONFIG_VIDEO_ENABLE)) {		AVFlow->StartVideoPreview();	} else {		AVFlow->StopVideoPreview();	}}static void on_video_preview_button (GtkWidget *widget, gpointer *data){	MyConfig->SetBoolValue(CONFIG_VIDEO_PREVIEW,		!gtk_toggle_button_get_active(			GTK_TOGGLE_BUTTON(video_none_preview_button)));	MyConfig->SetBoolValue(CONFIG_VIDEO_RAW_PREVIEW,		gtk_toggle_button_get_active(			GTK_TOGGLE_BUTTON(video_raw_preview_button)));	MyConfig->SetBoolValue(CONFIG_VIDEO_ENCODED_PREVIEW,		gtk_toggle_button_get_active(			GTK_TOGGLE_BUTTON(video_encoded_preview_button)));	MyConfig->UpdateVideo();}static void on_video_settings_button (GtkWidget *widget, gpointer *data){	CreateVideoDialog();}static void on_picture_settings_button (GtkWidget *widget, gpointer *data){	CreatePictureDialog();}static void on_audio_enabled_button (GtkWidget *widget, gpointer *data){	MyConfig->SetBoolValue(CONFIG_AUDIO_ENABLE,		gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)));}static void on_audio_mute_button (GtkWidget *widget, gpointer *data){	AVFlow->SetAudioOutput(		gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)));}static void on_audio_settings_button (GtkWidget *widget, gpointer *data){	CreateAudioDialog();}static void on_record_enabled_button (GtkWidget *widget, gpointer *data){	MyConfig->SetBoolValue(CONFIG_RECORD_ENABLE,		gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)));}static void on_record_settings_button (GtkWidget *widget, gpointer *data){	CreateRecordingDialog();}static void on_transmit_enabled_button (GtkWidget *widget, gpointer *data){	MyConfig->SetBoolValue(CONFIG_RTP_ENABLE, 		gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)));}static void on_transmit_settings_button (GtkWidget *widget, gpointer *data){	CreateTransmitDialog();}static void LockoutChanges(bool lockout){	gtk_widget_set_sensitive(GTK_WIDGET(video_enabled_button), !lockout);	gtk_widget_set_sensitive(GTK_WIDGET(video_settings_button), !lockout);	gtk_widget_set_sensitive(GTK_WIDGET(audio_enabled_button), !lockout);	gtk_widget_set_sensitive(GTK_WIDGET(audio_settings_button), !lockout);	gtk_widget_set_sensitive(GTK_WIDGET(record_enabled_button), !lockout);	gtk_widget_set_sensitive(GTK_WIDGET(record_settings_button), !lockout);	gtk_widget_set_sensitive(GTK_WIDGET(transmit_enabled_button), !lockout);	gtk_widget_set_sensitive(GTK_WIDGET(transmit_settings_button), !lockout);	gtk_widget_set_sensitive(GTK_WIDGET(duration_spinner), !lockout);	gtk_widget_set_sensitive(GTK_WIDGET(duration_units_menu), !lockout);	gtk_widget_set_sensitive(GTK_WIDGET(config_file_entry), !lockout);	gtk_widget_set_sensitive(GTK_WIDGET(load_config_button), !lockout);	gtk_widget_set_sensitive(GTK_WIDGET(save_config_button), !lockout);}static guint status_timer_id;// forward declarationstatic void on_start_button (GtkWidget *widget, gpointer *data);static void status_start(){	time_t secs;	const struct tm *local;	char buffer[128];	// start time	secs = (time_t)GetSecsFromTimestamp(StartTime);	local = localtime(&secs);	strftime(buffer, sizeof(buffer), "%l:%M:%S", local);	gtk_label_set_text(GTK_LABEL(start_time), buffer);	gtk_widget_show(start_time);	strftime(buffer, sizeof(buffer), "%p", local);	gtk_label_set_text(GTK_LABEL(start_time_units), buffer);	gtk_widget_show(start_time_units);	// finish time	if (StopTime) {		DisplayFinishTime(StopTime);	}	// file size	StartFileSize = 0;	StopFileSize = 0;	if (MyConfig->GetBoolValue(CONFIG_RECORD_ENABLE)) {		if (!MyConfig->GetBoolValue(CONFIG_RECORD_MP4_OVERWRITE)) {			struct stat stats;			stat(MyConfig->GetStringValue(CONFIG_RECORD_MP4_FILE_NAME), &stats);			StartFileSize = stats.st_size;		}		snprintf(buffer, sizeof(buffer), " %llu",			StartFileSize / 1000000LLU);		gtk_label_set_text(GTK_LABEL(current_size), buffer);		gtk_widget_show(current_size);		gtk_label_set_text(GTK_LABEL(current_size_units), "MB");		gtk_widget_show(current_size_units);		StopFileSize = MyConfig->m_recordEstFileSize;		snprintf(buffer, sizeof(buffer), " %llu",			StopFileSize / 1000000LLU);		gtk_label_set_text(GTK_LABEL(final_size), buffer);		gtk_widget_show(final_size);		gtk_label_set_text(GTK_LABEL(final_size_units), "MB");		gtk_widget_show(final_size_units);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -