Beispiel #1
0
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 counter=0;
	int ch_count = 0;
	long channel;
	char data;
	int i2c_instance = 0; 
	int i2c_device_type = 0; 
	uint16_t i2c_device_addr = 0x20;
	uint16_t chip_id_reg = 0xff;
	uint16_t chip_id_reg_value = 0x40;
	int handle;
	uint32_t read_len = 0;
	uint16_t width, hight;
	int framerate = 0;
	int goplen = 0;
	int audio_threshold = 20;
	int current_audio_intensity = 0;
	uint16_t regval = 0;

	fd_aud = NULL;
	
	//initialize audio part **************************
	ret = mxuvc_audio_init("alsa","device = Condor");
	if(ret<0)
		goto error;

	ret = mxuvc_alert_init();
	if(ret < 0)
		goto error;
	
	ret = mxuvc_audio_register_cb(AUD_CH2,(mxuvc_audio_cb_t) audio_cb, NULL);
	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: %ld\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;
	}

	/***** 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;
	}
	
	if (audio_threshold > 0){
		ret = mxuvc_alert_audio_set_threshold(audio_threshold);
		if (ret){
		    printf("mxuvc_alert_audio_set_threshold() failed\n");
		    goto error;
		}
		ret = mxuvc_alert_audio_register_cb(&aalarm_callback, (void *)&data);
		if (ret){
			printf("mxuvc_alert_audio_register_callback() failed\n");
			goto error;
		}

		ret = mxuvc_alert_audio_enable();
		if (ret){
			printf("mxuvc_alert_audio_enable() failed\n");
			goto error;
		}

	}
	
	//sleep
	usleep(5000);

	//start i2c notification
	handle = mxuvc_i2c_open(i2c_instance, i2c_device_type, i2c_device_addr, 
			chip_id_reg, chip_id_reg_value);
	if(handle <= 0){
		printf("err: mxuvc_i2c_open failed\n");
		goto error;	
	}
#if 0			
	ret = mxuvc_i2c_notification_read_register(handle, 0x10, &regval, 1);
	if(ret < 0){
		printf("err: mxuvc_i2c_notification_read_register failed\n");
		goto error;	
	}
	printf("regval %x\n",regval);

	ret = mxuvc_i2c_notification_write_register(handle, 0x10, 0x2, 1);
	if(ret < 0){
		printf("err: mxuvc_i2c_notification_write_register failed\n");
		goto error;	
	}
	ret = mxuvc_i2c_notification_read_register(handle, 0x10, &regval, 1);
	if(ret < 0){
		printf("err: mxuvc_i2c_notification_read_register failed\n");
		goto error;	
	}
	printf("regval %x\n",regval);
#endif
	//sleep(1);
	read_len = 1; //max 2 bytes can be read together
	ret = mxuvc_i2c_register_notification_callback(
					handle,
					i2c_notify_cb,
					2000, //polling time
					chip_id_reg,
					read_len);
	if(ret < 0){
		printf("err: mxuvc_i2c_register_notification_callback failed\n");
		goto error;	
	}
	ret = mxuvc_i2c_notification_add_threshold(
					handle,
					0x10,
					0x20);
	if(ret < 0){
		printf("err: mxuvc_i2c_notification_add_threshold failed\n");
		goto error;	
	}
	ret = mxuvc_i2c_notification_add_threshold(
					handle,
					0x50,
					0x60);
	if(ret < 0){
		printf("err: mxuvc_i2c_notification_add_threshold failed\n");
		goto error;	
	}
	/* 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);

		if(counter==10){
			ret = mxuvc_i2c_notification_remove_threshold(
				handle,
				0x10,
				0x20);
			if(ret < 0){
				printf("err: mxuvc_i2c_notification_remove_threshold failed\n");
				goto error;	
			}	
		}

		fflush(stdout);
		sleep(1);
	}
	
	if (audio_threshold > 0){
		mxuvc_alert_audio_disable();
		sleep(1);
	}
	ret = mxuvc_i2c_close(handle);	

	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_alert_deinit();
	mxuvc_audio_deinit();
	mxuvc_video_deinit();
	mxuvc_custom_control_deinit();

	close_fds();	

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