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

📄 mddemo.c

📁 海康威视视频采集卡linux开发包4.22版
💻 C
📖 第 1 页 / 共 3 页
字号:
		Clientinfo.m_sUserPassword = "userpassword1234567890";
		Clientinfo.m_bUserCheck = 0;
		Clientinfo.subshow_x = 0;
		Clientinfo.subshow_y = 0;
		Clientinfo.subshow_uWidth = 0;
		Clientinfo.subshow_uHeight = 0;
		Clientinfo.m_bSendMode = PTOPTCPMODE;				

		for(i=0;i<TotalChannel;i++)
		{
			Clientinfo.m_bRemoteChannel = atoi(serverchan[i]);
			Clientinfo.m_sIPAddress = serverip[i];
			fprintf(stderr,"<demo_info>chan%d to connect the server:%s!chan %d\n",i, Clientinfo.m_sIPAddress, Clientinfo.m_bRemoteChannel);
			clienthandle[i] = MP4_ClientStart(&Clientinfo, ReadDataCallBack);		
			if(clienthandle[i]==-1){
				fprintf(stderr,"<demo_info> clientstart error:%x\n",MP4_ClientGetLastErrorNum());
				MP4_ClientCleanup();
				gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w_decodestream), FALSE);
				return;
			}
			datasum[i] = 0;
			header_len = 0;
			fprintf(stderr,"<demo_info> to start capture!\n");
			MP4_ClientStartCaptureEx(clienthandle[i], streamheader, &header_len);
			if(header_len == 0)
			{
				fprintf(stderr,"<demo_info> have not get the stream header!\n");
				gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w_decodestream), FALSE);
				return;
			}
			fprintf(stderr,"<demo_info> get the stream header!len:%d\n", header_len);
		}
		g_timer_start(count_timer);
		

		for(i=0;i<TotalChannel;i++)
		{
			if(HW_OpenStream(ChannelHandle[i], streamheader, header_len) < 0)
			{
				fprintf(stderr,"<demo_info> open stream failed for decode!\n");
		        	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w_decodestream), FALSE);
				return;
			}
			if(HW_Play(ChannelHandle[i])<0)
				fprintf(stderr,"<demo_info>in decode stream, play failed!\n");
			sem_post(&beginSem[i]);
			fprintf(stderr,"<demo_info> to start the display chan%d!flag is %d\n", i, bDisplayOpen[i]);
		}

		streamopenok = 1;
	    hik_set_sensitive("b_DecodeFile", 0);
		hik_set_sensitive("b_videoaudioout", 1);
		fprintf(stderr,"<demo_info> md start stream decode ok!\n");
	}else{
		stopstreamdecode();
		hik_set_sensitive("b_DecodeFile", 1);
		hik_set_sensitive("b_videoaudioout", 0);
		gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w_videoout), FALSE);
		g_timer_stop(count_timer);
		for(i=0;i<TotalChannel;i++)
			datasum[i] = 0;
	}
	return;
}
	
void process_buttons(GtkWidget *widget, gpointer data)
{
	int i, port;

	int retval = 0;
		
	i = GPOINTER_TO_INT(data);
	switch(i){
		case 2:	//exit
			demo_exit();
			break;
		default:
			break;
	}	
			
}

int PtInRect(SDL_Rect rect, int x, int y)
{
	if((x > (full_win.x + rect.x)) && (x < (full_win.x + rect.x + rect.w)) && (y > (full_win.y + rect.y)) && (y < (full_win.y + rect.y + rect.h))) 
		return 1; /* point in rect */
	return 0;
}

int GetPort()
{
	int port = -1;
	int x, y, i;
	
	gdk_window_get_pointer(w_full_area->window, &x, &y, NULL);
	x += full_win.x;
	y += full_win.y;

	for(i = 0; i< TotalChannel; i++)	
	{
		if(PtInRect(dstRect[i], x, y))
		{
			port = i;
			break;
		}
	}
	return port;
}

int click2(GtkWidget *widget, GdkEventButton *event, gpointer data)
{
	int port, i;
	UINT	useSyncSem = 1;
	
	
	port = GetPort();

	if(port >= 0)
	{
		selectport = port;		
		gtk_entry_set_text(GTK_ENTRY(w_set_serverip), serverip[selectport]);
		gtk_entry_set_text(GTK_ENTRY(w_set_serverchan), serverchan[selectport]);		
	}

	if((!GTK_TOGGLE_BUTTON(w_decodefile_flag)->active)&&(!GTK_TOGGLE_BUTTON(w_decodestream)->active))	
		return 0;
	
	fprintf(stderr,"<demo_info> enter the click2, the port is %d!\n", port);
	if(event->type != GDK_2BUTTON_PRESS)
		return TRUE;
	if(clickflag)
	{
		if(port < 0)
			return TRUE;
		for(i = 0; i< TotalChannel; i++)	
		{
			bDisplayOpen[i] = 0;			
			sem_post(&displaySem[i]);   /* fixed at 2005.10.8 */
			fprintf(stderr,"<demo_info> in click2  stop the display %d!\n", i);
			//sometimes, the channel is not realy stop the display, so do a delay. 
			//of cause there have other more effective ways to do the wait that display stoped
			//usleep(1000);   
			while(!bDisplayClose[i])
				usleep(10);
		}
		clickport = port;
		
		memcpy(&tmpRect, &dstRect[port], sizeof(SDL_Rect));
		memcpy(&dstRect[port], &full_rect, sizeof(SDL_Rect));
		
		sem_post(&beginSem[port]);

	}
	else 
	{
		bDisplayOpen[clickport] = 0;
		sem_post(&displaySem[clickport]);   /* fixed at 2005.10.8 */
		while(!bDisplayClose[clickport])
				usleep(10);
		memcpy(&dstRect[clickport], &tmpRect, sizeof(SDL_Rect));
		/* generate expose event */
		gdk_window_hide(w_full_area->window);
		usleep(1000);
		gdk_window_show(w_full_area->window);
		
		gdk_window_clear(w_full_area->window);
		for(i = 0; i < TotalChannel; i++){
			sem_post(&beginSem[i]);				
		}

	}
	clickflag ^= 1;

	return 0;
}

gint expose_ev( GtkWidget *widget,
                   GdkEvent  *event,
                   gpointer   data )
{
	char *str1 = "DS-400xMD demo:";
	GdkFont *font = NULL;
	GdkColor color;
	char title_str[160];
	char tmpstr[] = " ";
	

	sprintf(title_str, "%sThere have %d decode channels. %20s Start Time: %s", str1,TotalChannel, tmpstr, starttime);
		
	camp = gdk_colormap_get_system();
	gc1 = gdk_gc_new(title->window);	//get GC
	
	//title expose
	if(widget->window == title->window)
	{
		//set title background
		color.red = 0;
		color.green = 0;
		color.blue = 0xffff;
		if(!gdk_color_alloc(camp, &color)){
			g_error("Cannot allocate color\n");
		}
		gdk_window_set_background(widget->window, &color);

		//set foreground
		
		color.red = 0xffff;
		color.green = 0xffff;
		color.blue = 0xffff;
		if(!gdk_color_alloc(camp, &color)){
			g_error("Cannot allocate color\n");
		}
		gdk_gc_set_foreground(gc1, &color);
		gdk_window_clear(widget->window);

		//font = gdk_fontset_load("7x14,hanzigb16fs");
		font = gdk_fontset_load("-*-*-*-*-normal--15-*-*-*-*-*-*");
		if(font != NULL){
			gdk_draw_text(widget->window, font, gc1, 10, 20, title_str, strlen(title_str));
			gdk_font_unref(font);
		}
		
		return(TRUE);
	}

	//video_area expose
	//allocte color
	gc2 = gdk_gc_new(w_full_area->window);	//get GC
	if(gdk_color_parse("black", &color))
	{
		if( !gdk_colormap_alloc_color(camp, &color,FALSE, TRUE)){
			g_error("Cannot allocate color\n");
		}
	}
		
	gdk_window_set_background(widget->window, &color);	//set background color	
	
	/* set foreground to sign motion block */
	color.red = 0;
	color.green = 0xffff;
	color.blue = 0;
	if(!gdk_color_alloc(camp, &color)){
		g_error("Cannot allocate color\n");
	}
	gdk_gc_set_foreground(gc2, &color);
	gdk_window_clear(widget->window);
		
	return(TRUE);
}

int process_time(gpointer data)
{
	char buf[100];
	char tmp[] = "%";
	int freespace;	
	unsigned long framerate;
	unsigned long DecFrameNum;
	FRAMES_STATISTICS frame_statistics;
	int usercount;
	int i;
	int bit_rate;
	static int timecount = 0;	
	
	now = time(NULL);
	tm = localtime(&now);
	strftime(timebuf, sizeof(timebuf), "%Y-%m-%d", tm);

	gtk_text_buffer_set_text(w_status_buffer[0], timebuf, strlen(timebuf)); 
	gtk_text_view_set_buffer(GTK_TEXT_VIEW(w_status[0]), w_status_buffer[0]); 
	//gtk_text_backward_delete(GTK_TEXT_VIEW(w_status[0]), strlen(timebuf));
	//gtk_text_insert(GTK_TEXT_VIEW(w_status[0]), NULL, NULL, NULL, timebuf, -1);

	strftime(timebuf, sizeof(timebuf), "%T", tm);
	gtk_text_buffer_set_text(w_status_buffer[1], timebuf, strlen(timebuf)); 
	gtk_text_view_set_buffer(GTK_TEXT_VIEW(w_status[1]), w_status_buffer[1]); 
//	gtk_text_backward_delete(GTK_TEXT(w_status[1]), strlen(timebuf));
//	gtk_text_insert(GTK_TEXT(w_status[1]), NULL, NULL, NULL, timebuf, -1);

	if(statfs(savepath, &bbuf) < 0){
		printf("statsfs() faied, error: %d\n",  errno);
		//printf("savepath = %s, bbuf,f_bavail = %d, bbuf.f_blocks = %d\n", savepath, bbuf.f_bavail, bbuf.f_blocks);
	}
	else{
		freespace = (100*bbuf.f_bavail)/bbuf.f_blocks;
		sprintf(buf,"%3d%s", freespace, tmp);
	}
	//printf("total block = %d, availble block = %d, block size = %d\n", bbuf.f_blocks, bbuf.f_bavail, bbuf.f_bsize);
	//printf("total block = %d, availble block = %d, block size = %d\n", bbuf.f_blocks, bbuf.f_bavail, bbuf.f_bsize);
	
	gtk_text_buffer_set_text(w_status_buffer[2], buf, strlen(buf)); 
	gtk_text_view_set_buffer(GTK_TEXT_VIEW(w_status[2]), w_status_buffer[2]); 
//	gtk_text_backward_delete(GTK_TEXT_VIEW(w_status[2]), strlen(buf));
//	gtk_text_insert(GTK_TEXT_VIEW(w_status[2]), NULL, NULL, NULL, buf, -1);

	sprintf(buf, "%9d", selectport);
	gtk_text_buffer_set_text(w_channel_buffer, buf, strlen(buf)); 
	gtk_text_view_set_buffer(GTK_TEXT_VIEW(w_channel), w_channel_buffer); 
//	gtk_text_backward_delete(GTK_TEXT_VIEW(w_channel), strlen(buf));
//	gtk_text_insert(GTK_TEXT_VIEW(w_channel), NULL, NULL, NULL, buf, -1);

	//bit rate
	elapse_time = g_timer_elapsed(count_timer,NULL);
	bit_rate = (datasum[selectport] * 8)/elapse_time;
	sprintf(buf, "%10d", bit_rate);
	gtk_text_buffer_set_text(w_bit_rate_buffer, buf, strlen(buf)); 
	gtk_text_view_set_buffer(GTK_TEXT_VIEW(w_bit_rate), w_bit_rate_buffer);
//gtk_text_backward_delete(GTK_TEXT_VIEW(w_bit_rate), strlen(buf));
//gtk_text_insert(GTK_TEXT_VIEW(w_bit_rate), NULL, NULL, NULL, buf, -1);

	/* frame information */
	HW_GetCurrentFrameRate(ChannelHandle[selectport], &framerate);
	sprintf(buf, "%10d", framerate);
	gtk_text_buffer_set_text(w_decode_framerate_buffer, buf, strlen(buf)); 
	gtk_text_view_set_buffer(GTK_TEXT_VIEW(w_decode_framerate), w_decode_framerate_buffer);
//	gtk_text_backward_delete(GTK_TEXT(w_decode_framerate), strlen(buf));
//	gtk_text_insert(GTK_TEXT(w_decode_framerate), NULL, NULL, NULL, buf, -1);

	HW_GetPlayedFrames(ChannelHandle[selectport], &DecFrameNum);	
	sprintf(buf, "%10d", DecFrameNum);
	gtk_text_buffer_set_text(w_totalframe_buffer, buf, strlen(buf)); 
	gtk_text_view_set_buffer(GTK_TEXT_VIEW(w_totalframe), w_totalframe_buffer);
//	gtk_text_backward_delete(GTK_TEXT(w_totalframe), strlen(buf));
//	gtk_text_insert(GTK_TEXT(w_totalframe), NULL, NULL, NULL, buf, -1);
	
	return TRUE;	//if return 0, will never call this func.
}


int main(int argc, char *argv[])
{
	GtkWidget *frame, *main_box, *hbox, *hbox1, *vbox1, *vbox2, *hbox2;
	GtkWidget *label;
	GdkVisual *visual;
	int win_width, win_height;
	int i, j;
	pthread_attr_t attr;
	char	SDL_windowhack[32];
	/* init the device */
	fprintf(stderr,"<demo_info> Begin init the device!\n");

	//XInitThreads();

	HW_InitDecDevice(&TotalChannel);
	fprintf(stderr,"<demo_info> There have %d channels in the system!\n", TotalChannel);
	if(TotalChannel == 0)
	{
		fprintf(stderr,"<demo_info> There have no md device in this system!\n");
		return -1;
	}
	for(i=0;i<TotalChannel;i++)
	{
		if(HW_ChannelOpen(i, &ChannelHandle[i])<0)
		{
			fprintf(stderr,"<demo_info> Open the decode channle failed!\n");
			HW_ReleaseDecDevice();
		}
	}
	displayChannelCount=GetDisplayChannelCount();
	for(i=0; i<displayChannelCount; i++)
		SetDisplayStandard(i, StandardPAL);

	/* init display */
	gtk_set_locale();
	gtk_init(&argc, &argv);		
	camp = gdk_colormap_get_system();

	//get display size
	win_width  = gdk_screen_width();
	win_height = gdk_screen_height();

  fprintf(stderr,"<demo_info> the screen w:%d h:%d!\n", win_width, win_height);

								
	
	//visual = gdk_visual_get_system();
	
	//create window
	//md_window = gtk_window_new(GTK_WINDOW_POPUP);
	md_window = gtk_window_new(GTK_WINDOW_TOPLEVEL);

	gtk_signal_connect(GTK_OBJECT(md_window),"delete_event",
		GTK_SIGNAL_FUNC(demo_exit),NULL);
	gtk_signal_connect(GTK_OBJECT(md_window),"destroy",
		GTK_SIGNAL_FUNC(demo_exit),NULL);

	gtk_window_set_position(GTK_WINDOW(md_window), GTK_WIN_POS_CENTER);
	gtk_widget_set_usize(md_window, win_width, win_height);
	
	frame = gtk_frame_new(NULL);
	gtk_container_add(GTK_CONTAINER(md_window), frame);

	main_box = gtk_vbox_new(FALSE, 0);
	gtk_container_add(GTK_CONTAINER(frame), main_box);
	
	hbox = gtk_hbox_new(FALSE, 0);
	gtk_container_set_border_width(GTK_CONTAINER(hbox), 0);
	gtk_box_pack_start(GTK_BOX (main_box), hbox, FALSE, /*TRUE*/FALSE, 0);

	/******* title window *******/
	title = gtk_drawing_area_new();
	gtk_widget_set_usize(title, win_width, 30);
			
	gtk_widget_set_events(title, GDK_EXPOSURE_MASK);
	gtk_signal_connect(GTK_OBJECT (title), "expose_event",
			GTK_SIGNAL_FUNC(expose_ev), NULL);
	gtk_box_pack_start(GTK_BOX(hbox), title, FALSE, FALSE, 0);
	/************* end title window ***********/

	hbox = gtk_hbox_new(FALSE, 0);
	gtk_box_pack_start(GTK_BOX(main_box), hbox, FALSE, TRUE, 0);

	/***************** channel window **********************/
	frame = gtk_frame_new(NULL);
	gtk_box_pack_start(GTK_BOX(hbox), frame, FALSE, FALSE, 0);

	full_win.w = WIN_W;

⌨️ 快捷键说明

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