Esempio n. 1
0
File: alert.c Progetto: grpascal/GEO
int main(int argc, char **argv)
{
	int ret;
	int counter=0;
	int count=0;
	video_format_t fmt;
	int ch_count = 0, channel;
	uint16_t hight;
	int framerate = 0;
	int goplen = 0;
	video_channel_info_t info;
	int audio_threshold = 70;
	int current_audio_intensity = 0;
	int reg_id;	/* region number; used when alert is generated */
	int x_offt;	/* starting x offset */
	int y_offt;	/* starting y offset */
	int width;	/* width of region */
	int height;	/* height of region */
	int sensitivity;	/* threshold for motion detection for a macroblock */
	int trigger_percentage;	/* % of macroblocks to be in motion for alert to be generated */
	char adata;
	char mdata;
	
	//initialize audio part **************************
	ret = mxuvc_audio_init("alsa","device = MAX64380");
	if(ret<0)
		goto error;

	ret = mxuvc_audio_register_cb(AUD_CH2, audio_cb, NULL);
	if(ret < 0)
		goto error;
	
	//TBD
	ret = mxuvc_audio_set_format(AUD_CH2, AUD_FORMAT_AAC_RAW);
	if(ret < 0)
		goto error;
	
	ret = mxuvc_audio_set_samplerate(AUD_CH2, SAMP_FREQ);
	if(ret < 0)
		goto error;

	mxuvc_audio_set_volume(100);

	//initialize video part **************************
	ret = mxuvc_video_init("v4l2","dev_offset=0");

	if(ret < 0)
		return 1;

	/* Register callback functions */
	ret = mxuvc_video_register_cb(CH1, ch_cb, (void*)CH1);
	if(ret < 0)
		goto error;
	
	printf("\n");
	//get channel count of MUX channel
	ret = mxuvc_video_get_channel_count(&ch_count);
	printf("Total Channel count: %d\n",ch_count);
	//remove raw channel from count
	ch_count = ch_count - 1;

	for(channel=CH2 ; channel<ch_count; channel++)
	{
		ret = mxuvc_video_register_cb(channel, ch_cb, (void*)channel);
		if(ret < 0)
			goto error;
	}

	/*** enquire every channel capabilities ****/
	for(channel=CH1; channel<ch_count ; channel++)
	{
		mxuvc_video_get_channel_info(channel, &info);
		printf("\nCH%d Channel Config:\n",channel+1);
		print_format(info.format);
		printf("width %d height %d\n",info.width,info.height);
		printf("framerate %dfps\n",info.framerate);
		
		if(info.format == VID_FORMAT_H264_RAW || 
				info.format == VID_FORMAT_H264_TS)
		{
			printf("gop length %d\n",info.goplen);	
			printf("setting gop length to 30\n");
			ret = mxuvc_video_set_goplen(channel, 30);
			if(ret < 0)
				goto error;
			ret = mxuvc_video_get_goplen(channel, &goplen);
			if(ret < 0)
				goto error;
			printf("gop length %d\n",goplen);
			printf("profile %d\n",info.profile);
			printf("bitrate %d\n",info.bitrate);
		}
	
	}

	printf("\n");
	video_profile_t profile;
	ret = mxuvc_video_get_profile(CH1, &profile);
	if(ret < 0)
		goto error;
	printf("CH1 profile %d\n",profile);
	ret = mxuvc_video_set_profile(CH1, PROFILE_BASELINE);
	if(ret < 0)
		goto error;
	printf("changed profile to PROFILE_BASELINE\n");
	ret = mxuvc_video_get_profile(CH1, &profile);
	if(ret < 0)
		goto error;
	printf("CH1 profile %d\n",profile);
	
	/***** Start audio  streaming ************/
	ret = mxuvc_audio_start(AUD_CH2);
	if(ret < 0)
		goto error;
	/***** Start video streaming ************/
	for(channel=CH1; channel<ch_count ; channel++){
		/* Start streaming */
		ret = mxuvc_video_start(channel);
		if(ret < 0)
			goto error;
	}

	/***** alert ************/
	if (audio_threshold > 0){
		//init audio alarm 
		ret = mxuvc_alert_init();
		if(ret < 0)
			goto error;
		ret = mxuvc_alert_audio_enable(	aalarm_callback, (void *)&adata);

		if (ret){
			printf("mxuvc_alert_audio_enable() failed\n");
			goto error;
		}
		//motion alert
		ret = mxuvc_alert_motion_enable(malarm_callback, (void *)&mdata);
		if (ret){
			printf("mxuvc_alert_motion_enable() failed\n");
			goto error;
		}
		//set region
		reg_id = 0;
		x_offt = 0;
		y_offt = 0;
		width = 80;
		height = 45;
		sensitivity = 50;
		trigger_percentage = 100;
		ret = mxuvc_alert_motion_add_region(reg_id, x_offt, y_offt, width, 
						height);
		if (ret){
			printf("mxuvc_alert_motion_add_region() failed\n");
			goto error;
		}
		ret =  mxuvc_alert_motion_sensitivity_and_level(reg_id,sensitivity,
		        trigger_percentage);
		if (ret){
		    printf("mxuvc_alert_motion_sensitivity_and_level() failed\n");
		    goto error;
		}

		//enable audio alert again to test
		ret = mxuvc_alert_audio_set_threshold(50);

		if (ret){
		    printf("mxuvc_alert_audio_set_threshold() failed\n");
		    goto error;
		}
	}
	
	//sleep
	usleep(50000);

	/* Main 'loop' */
	if (argc > 1){
		counter = atoi(argv[1]);
	} else
		counter = 15;

	while(counter--) {
		if (!mxuvc_audio_alive() || !mxuvc_video_alive())
			goto error;
		printf("\r%i secs left", counter+1);

		//video_testing(counter);
		//get current audio intensity
		ret = mxuvc_get_current_audio_intensity(&current_audio_intensity);
		if(ret){
			printf("mxuvc_get_current_audio_intensity() failed\n");
			goto error;
		}else
			printf("Current audio intensity %ddB\n",current_audio_intensity);

		if(counter == 10){
			mxuvc_alert_audio_disable();
		}
		if(counter == 9)
			mxuvc_alert_motion_disable();

		if(counter == 8){
			ret = mxuvc_alert_audio_set_threshold(audio_threshold);
			if (ret){
			    printf("mxuvc_alert_audio_set_threshold() failed\n");
			    goto error;
			}
			ret = mxuvc_alert_audio_enable(	aalarm_callback, (void *)&adata);

			if (ret){
			    printf("mxuvc_alert_audio_enable() failed\n");
			    goto error;
			}
		}
		if(counter == 7){
			ret = mxuvc_alert_motion_enable(malarm_callback, (void *)&mdata);
			if (ret){
				printf("mxuvc_alert_motion_enable() failed\n");
				goto error;
			}
		}
		fflush(stdout);
		sleep(1);
	}	

	if (audio_threshold > 0){
		ret = mxuvc_alert_motion_remove_region(reg_id);
		if (ret){
			printf("mxuvc_alert_motion_remove_region() failed\n");
			goto error;
		}
		mxuvc_alert_audio_disable();
		mxuvc_alert_motion_disable();
		sleep(1);
	}
	mxuvc_alert_deinit();

	/* Stop audio streaming */
	ret = mxuvc_audio_stop(AUD_CH2);
	if(ret < 0)
		goto error;

	mxuvc_audio_deinit();
	
	/* Stop video streaming */
	for(channel=CH1; channel<ch_count ; channel++)
	{	
		/* Stop streaming */
		ret = mxuvc_video_stop(channel);
		if(ret < 0)
			goto error;
	}
	/* Deinitialize and exit */
	mxuvc_video_deinit();
	
	close_fds();
	
	return 0;

error:
	mxuvc_audio_deinit();

	close_fds();	

	printf("Failed\n");
	return 1;
}
int main(int argc, char **argv)
{
	int ret;
	int i, counter=0;
	int count=0;
	video_format_t fmt;
	int ch_count = 0;
	long channel;
	uint16_t hight;
	int framerate = 0;
	int goplen = 0;
	video_channel_info_t info;
        int timer = 0;
        int frame_num = 0;
	char adata;
	char mdata;
	char *file = NULL;
	int font_size;
        time_t curtime;
        struct tm *loc_time;
        char szDate[16] = {0};

        if ( argc < 2 ){
                printf("USAGE: sudo overlay_text <path to font file> <size of font> [enable timer 0/1(default 0)] [enable frame numbering 0/1(default 0)\n");
                return 0;
        }

	//initialize video part **************************
	ret = mxuvc_video_init("v4l2","dev_offset=0");

	if(ret < 0)
		return 1;
	/* Main 'loop' */
	if (argc > 1){
		file = argv[1];
	}

	if (argc > 2){
		font_size = atoi(argv[2]);	
	} else
		font_size = 8;
	

	if (argc > 3){
		timer = atoi(argv[3]);	
	} else
		timer = 0;

	if (argc > 4){
		frame_num = atoi(argv[4]);	
	} else
		frame_num = 0;

        printf("YOUR CONFIGURATION timer %d and frame number %d\n",timer,frame_num);

        curtime = time (NULL);
        loc_time = localtime (&curtime); 
        printf("%s", asctime (loc_time));

	snprintf(szDate, 11, "%04d-%02d-%02d ", (loc_time->tm_year+1900), (loc_time->tm_mon+1), loc_time->tm_mday);
	printf("Date = %s\n", szDate);

	ret = mxuvc_overlay_init();

    /* Register callback functions */
	ret = mxuvc_video_register_cb(CH1, ch_cb, (void*)CH1);
	if(ret < 0)
		goto error;
	
	printf("\n");
	//get channel count of MUX channel
	ret = mxuvc_video_get_channel_count(&ch_count);
	printf("Total Channel count: %d\n",ch_count);
	//remove raw channel from count
	ch_count = ch_count - 1;

	for(channel=CH2 ; channel<ch_count; channel++)
	{
		ret = mxuvc_video_register_cb(channel, ch_cb, (void*)channel);
		if(ret < 0)
			goto error;
	}
	for(channel=CH1; channel<ch_count ; channel++)
    { 
    	ret = mxuvc_overlay_load_font(channel, font_size, file);	
		if(ret < 0)
	  		return 1;
		printf("overlay init done for ch %ld\n", channel);
	}

	/*** enquire every channel capabilities ****/
	for(channel=CH1; channel<ch_count ; channel++)
	{
		mxuvc_video_get_channel_info(channel, &info);
		printf("\nCH%ld Channel Config:\n",channel+1);
		print_format(info.format);
		printf("width %d height %d\n",info.width,info.height);
		printf("framerate %dfps\n",info.framerate);
		
		if(info.format == VID_FORMAT_H264_RAW || 
				info.format == VID_FORMAT_H264_TS)
		{
			//printf("gop length %d\n",info.goplen);	
			//printf("setting gop length to 30\n");
			ret = mxuvc_video_set_goplen(channel, 30);
			if(ret < 0)
				goto error;
			ret = mxuvc_video_get_goplen(channel, &goplen);
			if(ret < 0)
				goto error;
			//printf("gop length %d\n",goplen);
			//printf("profile %d\n",info.profile);
			//printf("bitrate %d\n",info.bitrate);
		}
	
	}

	printf("\n");
	video_profile_t profile;
	ret = mxuvc_video_get_profile(CH1, &profile);
	if(ret < 0)
		goto error;
	printf("CH1 profile %d\n",profile);
	ret = mxuvc_video_set_profile(CH1, PROFILE_BASELINE);
	if(ret < 0)
		goto error;
	printf("changed profile to PROFILE_BASELINE\n");
	ret = mxuvc_video_get_profile(CH1, &profile);
	if(ret < 0)
		goto error;
	printf("CH1 profile %d\n",profile);

	/***** Start video streaming ************/
	for(channel=CH1; channel<ch_count ; channel++){
		/* Start streaming */
		ret = mxuvc_video_start(channel);
		if(ret < 0)
			goto error;
	}

	//sleep
	usleep(5000);
	counter = 20;
	overlay_text_params_t ovtext[NUM_MUX_VID_CHANNELS][NUM_OVERLAY_TEXT_IDX];
	overlay_text_params_t ovtime;
	overlay_time_t btime;

	for(i = 0; i < sizeof(ovtext)/sizeof(overlay_text_params_t); i++) {
		memset(&ovtext[0][i], 0x00, sizeof(overlay_text_params_t));
	}

	memset(&ovtime, 0x00, sizeof(overlay_text_params_t));

	while(counter--) {
		if (!mxuvc_video_alive())
			goto error;
		printf("%i secs left\n", counter+1);

		if(counter == 18)
		{
                
			for(channel=CH1; channel < ch_count; channel++)
			{
				int ch = channel;

				memset(&btime,   0x00, sizeof(overlay_time_t));

				ovtext[ch][0].xoff = 0;
				ovtext[ch][0].yoff = 0;
				ovtext[ch][0].idx = 0;
				ret = mxuvc_overlay_add_text(channel, &ovtext[ch][0], szText0, strlen(szText0));
					if(ret < 0)
						goto error;

				ovtext[ch][1].xoff = 0;
				ovtext[ch][1].yoff = 100; 
				ovtext[ch][1].idx = 1;
				ret = mxuvc_overlay_add_text(channel, &ovtext[ch][1], szText1, strlen(szText1));
					if(ret < 0)
						goto error;

				ovtext[ch][2].xoff = 0;
				ovtext[ch][2].yoff = 200;
				ovtext[ch][2].idx = 2;

				ret = mxuvc_overlay_add_text(channel, &ovtext[ch][2], szDate, strlen(szDate));
					if(ret < 0)
						goto error;

				ovtext[ch][3].xoff = 0;
				ovtext[ch][3].yoff = 300;
				ovtext[ch][3].idx = 3;

				ret = mxuvc_overlay_add_text(channel, &ovtext[ch][3], szText2, strlen(szText2));
					if(ret < 0)
						goto error;

				ovtext[ch][4].xoff = 0;
				ovtext[ch][4].yoff = 400;
				ovtext[ch][4].idx = 4;

				ret = mxuvc_overlay_add_text(channel, &ovtext[ch][4], szText2, strlen(szText2));
					if(ret < 0)
						goto error;

			}
		}

		if(counter == 15 && timer == 1 )
		{
		
			for(channel=CH1; channel < ch_count; channel++)
			{
				int ch = channel;
			
				ovtime.xoff = 0;
				ovtime.yoff = 500;

				btime.hh = loc_time->tm_hour;
				btime.mm = loc_time->tm_min;
				btime.ss = loc_time->tm_sec;
				btime.frame_num_enable = frame_num;

				ret = mxuvc_overlay_set_time(channel, &ovtime, &btime);
				if(ret < 0)
					goto error;
				ret = mxuvc_overlay_show_time(channel);
				if(ret < 0)
					goto error;
			}
		}


		if(counter == 5)
		{
			printf("Removing text\n");

			for(channel=CH1; channel<ch_count ; channel++)
			{

				int ch = channel;		
				printf("from ch: %d\n",ch);
				ret = mxuvc_overlay_remove_text(channel, ovtext[ch][0].idx);
				if(ret < 0)
					goto error;

				ret = mxuvc_overlay_remove_text(channel, ovtext[ch][1].idx);
				if(ret < 0)
					goto error;

				ret = mxuvc_overlay_remove_text(channel, ovtext[ch][2].idx);
				if(ret < 0)
					goto error;

				ret = mxuvc_overlay_remove_text(channel, ovtext[ch][3].idx);
				if(ret < 0)
					goto error;

				ret = mxuvc_overlay_remove_text(channel, ovtext[ch][4].idx);
				if(ret < 0)
					goto error;

				ret = mxuvc_overlay_hide_time(channel);
				if(ret < 0)
					goto error;
			}
		}

		fflush(stdout);
		sleep(1);
	}	
	ret = mxuvc_overlay_deinit();	
	if(ret < 0)
		goto error;

	/* Stop video streaming */
	for(channel=CH1; channel<ch_count ; channel++)
	{	
		/* Stop streaming */
		ret = mxuvc_video_stop(channel);
		if(ret < 0)
			goto error;
	}
	/* Deinitialize and exit */
	mxuvc_video_deinit();
	
	close_fds();
	
	return 0;

error:
	//mxuvc_audio_deinit();
	mxuvc_video_deinit();

	close_fds();	

	printf("Failed\n");
	return 1;
}