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(¤t_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; }