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

📄 dsdemo.c

📁 海康威视视频采集卡linux开发包4.22版
💻 C
📖 第 1 页 / 共 5 页
字号:
	}
#ifdef PREVIEWOPEN
        if(previewtimer){
                gtk_timeout_remove(previewtimer);
                previewtimer = 0;
        }
#endif

	if(imagetimer){
		gtk_timeout_remove(imagetimer);
		imagetimer = 0;
	}

	if(logoptr)
		free(logoptr);
		
	if(GTK_TOGGLE_BUTTON(w_audio_preview)->active){
		SetAudioPreview(ChannelHandle[audiopreviewport], 0); /*  port audio preview */
	}
	
#ifdef PREVIEWOPEN 
	g_bPreviewStart = 0;
	memset(bPreviewOpen, 0, sizeof(bPreviewOpen));
	for(port=0;port<totalport;port++)
	{

#ifndef	USE_PREVIEW_TIMER
		sem_post(previewconf[port].SyncSem);   //for the sem_wait is a block wait
                bPreviewThreadRun[port] = 3;
                while(bPreviewThreadRun[port] == 3)
			usleep(100);
#endif
	}
	memset(bPreviewThreadRun,0,sizeof(bPreviewThreadRun));

		
	if(GTK_TOGGLE_BUTTON(w_preview)->active){
		if(full_win_flag){
			if(StopVideoPreview(ChannelHandle[clickport]) < 0)
				printf("StopVideopreview(port %d) failed, error 0x%x\n", clickport, GetLastErrorNum());
			if(pOverlaySurface[clickport]!=NULL)
			{
				SDL_FreeYUVOverlay(pOverlaySurface[clickport]);
				pOverlaySurface[clickport] = NULL;
			}
		}
		else{
			//yxq test the preview
			for(port = 0; port < totalport; port++)
			{
				if(StopVideoPreview(ChannelHandle[port]) < 0)
					printf("StopVideopreview(port %d) failed, error 0x%x\n", port, GetLastErrorNum());
				if(pOverlaySurface[port]!=NULL)
				{
					SDL_FreeYUVOverlay(pOverlaySurface[port]);
					pOverlaySurface[port] = NULL;
				}
			}
		}
	}
	for(port=0;port<totalport;port++)
		sem_destroy(previewconf[port].SyncSem);

#endif
	for(port = 0; port < totalport; port++)
	{
	        StopMotionDetection(ChannelHandle[port]);
		end_record(port);
		if((record_flag[port]) && (StopVideoCapture(ChannelHandle[port]) < 0)){
			printf("StopVideoCapture(port %d) failed, error 0x%x\n", port, GetLastErrorNum());
			record_flag[port] = 0;
		}

		ChannelClose(ChannelHandle[port]);
	}

	memset(motion_data, 0, sizeof(motion_data));
	
#ifdef	RAWSTREAM
	if(imagefile_fd)
		close(imagefile_fd); 
#endif

	gdk_flush();	
	SDL_Quit();/* yxq add at 2004.8.27*/
	gtk_main_quit();
	printf("ok\n");
}


int process_time_loop(gpointer data)
{
	int port;
		
	/* If no enough space, reset count*/
	if(fullflag)
	{
		for(port = 0; port < totalport; port++)
		{
			if(old_count[port] < count[port])
			{
				memcpy(old_count, count, sizeof(count));
				memset(count, -1, sizeof(count));
				break;
			}
		}
	}
	
 	else	
	{
		if((bbuf.f_bavail * (bbuf.f_bsize/1024)) <= limitsize) /* count in 1KB */
		{
			printf("No enough space.avialable blocks = %ld\n", bbuf.f_bavail);
			memcpy(old_count, count, sizeof(count));
			
			memset(count, -1, sizeof(count));
			fullflag = 1;
		}
	}
	
	/*add at 2002.4.1 */
	for(port = 0; port < totalport; port++)
	{
		int retval;
		
		if(record_flag[port] == 0)
			continue;
		
		end_record(port);
		count[port] ++;
			
#ifdef WRITE_FILE
		sprintf(filename[port], "%s/test%02d%d.mp4", savepath, port, count[port]); /* modify at 2002.4.1 */
		if((retval = open(filename[port], O_WRONLY | O_CREAT |O_TRUNC, S_IRWXU|S_IRWXG|S_IRWXO)) < 0)
			perror(">>> open");
		else{ 
			ftruncate(retval, 0);
			write(retval, file_head[port], 40);
			record_fd[port] = retval;
		}
		sprintf(filename[port], "%s/test%02d%d.dat", savepath, port, count[port]); /*test the index at 2005.6.2 */
		if((retval = open(filename[port], O_WRONLY | O_CREAT |O_TRUNC, S_IRWXU|S_IRWXG|S_IRWXO)) < 0)
			perror(">>> open");
		else{ 
			ftruncate(retval, 0);
			index_fd[port] = retval;
                        nodeinfo[port].FilePos = 40;
                        nodeinfo[port].FrameNum = 0;
		}
		if(cifqcif_flag[port])
		{
			sprintf(filename[port], "%s/test%02d%d_1.mp4", savepath, port, count[port]); /* modify at 2002.4.1 */
			if((retval = open(filename[port], O_WRONLY | O_CREAT |O_TRUNC, S_IRWXU|S_IRWXG|S_IRWXO)) < 0)
				perror(">>> open");
			else{ 
				ftruncate(retval, 0);
				write(retval, cifqciffile_head[port], 40);
				cifqcif_fd[port] = retval;
			}
		}
#endif			
			
	}
	
	return TRUE;	//if return 0, will never call this func.
}

int process_time(gpointer data)
{
/*
	time_t now;
	struct tm *tm;
	*/
	char buf[100];
	char tmp[] = "%";
	//struct statfs bbuf;
	int freespace;
	static int totalframe;
	float audioframerate,videoframerate;
	FRAMES_STATISTICS frame_statistics;
	int usercount;
	int i;
	int bit_rate,tmptime;
	static int timecount = 0;	
	
	
	//printf("%ld\n", SDL_GetTicks());
	
	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_VIEW(w_status[1]), strlen(timebuf));
//	gtk_text_insert(GTK_TEXT_VIEW(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);
	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);

	
	/* frame information */
	elapse_time = g_timer_elapsed(count_timer,NULL);
	GetFramesStatistics(ChannelHandle[selectport], &frame_statistics); 
	audioframerate = frame_statistics.AudioFrames/elapse_time;
	
	sprintf(buf, "%8.1f", audioframerate);
	gtk_text_buffer_set_text(w_audio_framerate_buffer, buf, strlen(buf)); 
	gtk_text_view_set_buffer(GTK_TEXT_VIEW(w_audio_framerate), w_audio_framerate_buffer); 
//	gtk_text_backward_delete(GTK_TEXT_VIEW(w_audio_framerate), strlen(buf));
//	gtk_text_insert(GTK_TEXT_VIEW(w_audio_framerate), NULL, NULL, NULL, buf, -1);

	videoframerate = frame_statistics.VideoFrames/elapse_time;
	sprintf(buf, "%8.1f", videoframerate);
	gtk_text_buffer_set_text(w_video_framerate_buffer, buf, strlen(buf)); 
	gtk_text_view_set_buffer(GTK_TEXT_VIEW(w_video_framerate), w_video_framerate_buffer); 
//	gtk_text_backward_delete(GTK_TEXT_VIEW(w_video_framerate), strlen(buf));
//	gtk_text_insert(GTK_TEXT_VIEW(w_video_framerate), NULL, NULL, NULL, buf, -1);
	
	//bit rate
	tmptime = elapse_time - bit_rate_time[selectport];
	if(tmptime>0){
		bit_rate = (bit_rate_size[selectport] * 8)/(elapse_time - bit_rate_time[selectport]);
		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);
	}

	totalframe = frame_statistics.VideoFrames + frame_statistics.AudioFrames;
	sprintf(buf, "%10d", totalframe);
	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_VIEW(w_totalframe), strlen(buf));
//	gtk_text_insert(GTK_TEXT_VIEW(w_totalframe), NULL, NULL, NULL, buf, -1);

	usercount = MP4_ServerGetState();
	if(usercount>0)
	{
		sprintf(buf,"%7d", usercount);
		gtk_text_buffer_set_text(w_netusercount_buffer, buf, strlen(buf)); 
		gtk_text_view_set_buffer(GTK_TEXT_VIEW(w_netusercount), w_netusercount_buffer);
//		gtk_text_backward_delete(GTK_TEXT_VIEW(w_netusercount), strlen(buf));
//		gtk_text_insert(GTK_TEXT_VIEW(w_netusercount), NULL, NULL, NULL, buf, -1);
	}
	else{
		sprintf(buf,"       0");
		gtk_text_buffer_set_text(w_netusercount_buffer, buf, strlen(buf)); 
		gtk_text_view_set_buffer(GTK_TEXT_VIEW(w_netusercount), w_netusercount_buffer);
//		gtk_text_backward_delete(GTK_TEXT_VIEW(w_netusercount), strlen(buf));
//		gtk_text_insert(GTK_TEXT_VIEW(w_netusercount), NULL, NULL, NULL, buf, -1);
	}

	return TRUE;	//if return 0, will never call this func.
}
	
	
void process_buttons(GtkWidget *widget, gpointer data)
{
	int i, port;
	//char filename[40];
	int retval = 0;
		
	i = GPOINTER_TO_INT(data);
	switch(i){
		case 2:	//exit
			my_exit();
			break;
		case 3:/* get image */
			{
				static int image_count = 0;
				unsigned char imagebuf[704 * 576 * 2];
				int size; //;= 384 * 288 *2;
				char filename[100];
#ifdef YUVFILE
				int fid;
#endif

				for(port = 0; port < totalport; port++){
					retval = GetOriginalImage(ChannelHandle[port], imagebuf, &size);
#ifdef BMPFILE
					sprintf(filename, "cap%d%d.bmp", port, image_count);
					if(retval < 0){
						printf("GetOriginalImage return %d\n", retval);
						continue;
					}
					else
					{
						printf("GetOriginalImage OK size = %d\n", size);
						
						if(size == 704 * 576 * 2)//PAL 
							SaveYUVToBmpFile(filename, imagebuf, 704, 576);
						if(size == 704 * 480 * 2)//NTSC
							SaveYUVToBmpFile(filename, imagebuf, 704, 480);
					}
#endif
#ifdef YUVFILE
					sprintf(filename, "cap%d.yuv", port);
					fid = open(filename, O_WRONLY | O_CREAT | O_TRUNC , 0777);
					if(fid < 0)
					{
						perror("get image:");
						break;
					}
					size = 0;
					retval = GetOriginalImage(ChannelHandle[port], imagebuf, &size);
					if(retval < 0){
						printf("GetOriginalImage return %d\n", retval);
						continue;
					}
							
					else
					{
						printf("   size = %d\n", size);
						write(fid, imagebuf, size);
					}
					close(fid);
#endif
				}
				image_count ++;
				break;
			}
		case 4://capture I frame
			for(port = 0; port < totalport; port++)
			{
				CaptureIFrame(ChannelHandle[port]);
				break;
			}	
		default:
			break;
	}	
			
}

//video info changed
void ch_bscale(GtkAdjustment *adjust, gpointer   data)
{
	int i, port;
	i = GPOINTER_TO_INT(data);
	switch(i){
		case 0:
			v_info[0].Brightness = (gint)adjust->value;
			break;
		case 1:
			v_info[0].Contrast = (gint)adjust->value;
			break;
		case 2:
			v_info[0].Saturation = (gint)adjust->value;
			break;
		case 3:
			v_info[0].Hue = (gint)adjust->value;
			break;
		default:
			break;
	}

	for(port = 0; port < totalport; port++)
	{
		SetVideoPara(ChannelHandle[port], 
			v_info[0].Brightness, v_info[0].Contrast, v_info[0].Saturation, v_info[0].Hue); 
	
	}
}

/* add 2002.4.10 */
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;

⌨️ 快捷键说明

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