static void v4l_detect(MSWebCamManager *obj){ struct video_capability cap; const char *devname="/dev/video0"; int fd=open(devname,O_RDWR); if (fd!=-1){ if (ioctl (fd, VIDIOCGCAP, &cap)==0) { /* is a V4Lv1 */ MSWebCam *cam=ms_web_cam_new(&v4l_desc); cam->name=ms_strdup(devname); ms_web_cam_manager_add_cam(obj,cam); } close(fd); } devname="/dev/video1"; fd=open(devname,O_RDWR); if (fd!=-1){ if (ioctl (fd, VIDIOCGCAP, &cap)==0) { /* is a V4Lv1 */ MSWebCam *cam=ms_web_cam_new(&v4l_desc); cam->name=ms_strdup(devname); ms_web_cam_manager_add_cam(obj,cam); } close(fd); } }
static void video_capture_detect(MSWebCamManager *obj){ ms_message("Detecting Android VIDEO cards"); JNIEnv *env = ms_get_jni_env(); jclass helperClass = getHelperClassGlobalRef(env); // create 3 int arrays - assuming 2 webcams at most jintArray indexes = (jintArray)env->NewIntArray(2); jintArray frontFacing = (jintArray)env->NewIntArray(2); jintArray orientation = (jintArray)env->NewIntArray(2); jmethodID method = env->GetStaticMethodID(helperClass,"detectCameras", "([I[I[I)I"); int count = env->CallStaticIntMethod(helperClass, method, indexes, frontFacing, orientation); ms_message("%d cards detected", count); for(int i=0; i<count; i++) { MSWebCam *cam = ms_web_cam_new(&ms_android_video_capture_desc); AndroidWebcamConfig* c = new AndroidWebcamConfig(); env->GetIntArrayRegion(indexes, i, 1, &c->id); env->GetIntArrayRegion(frontFacing, i, 1, &c->frontFacing); env->GetIntArrayRegion(orientation, i, 1, &c->orientation); cam->data = c; cam->name = ms_strdup("Android video name"); char* idstring = (char*) malloc(15); snprintf(idstring, 15, "Android%d", c->id); cam->id = idstring; ms_web_cam_manager_add_cam(obj,cam); ms_message("camera created: id=%d frontFacing=%d orientation=%d [msid:%s]\n", c->id, c->frontFacing, c->orientation, idstring); } env->DeleteGlobalRef(helperClass); ms_message("Detection of Android VIDEO cards done"); }
static void msv4l2_detect(MSWebCamManager *obj){ struct v4l2_capability cap; char devname[32]; int i; for(i=0;i<10;++i){ int fd; snprintf(devname,sizeof(devname),"/dev/video%i",i); fd=open(devname,O_RDWR); if (fd!=-1){ if (v4l2_ioctl (fd, VIDIOC_QUERYCAP, &cap)==0) { /* is a V4LV2 */ uint32_t camera_caps = cap.capabilities; #ifdef V4L2_CAP_DEVICE_CAPS if (cap.capabilities & V4L2_CAP_DEVICE_CAPS) { camera_caps = cap.device_caps; } #endif if (((camera_caps & V4L2_CAP_VIDEO_CAPTURE) #ifdef V4L2_CAP_VIDEO_CAPTURE_MPLANE || (camera_caps & V4L2_CAP_VIDEO_CAPTURE_MPLANE) #endif ) && !((camera_caps & V4L2_CAP_VIDEO_OUTPUT) #ifdef V4L2_CAP_VIDEO_OUTPUT_MPLANE || (camera_caps & V4L2_CAP_VIDEO_OUTPUT_MPLANE) #endif )) { MSWebCam *cam=ms_web_cam_new(&v4l2_card_desc); cam->name=ms_strdup(devname); ms_web_cam_manager_add_cam(obj,cam); } } close(fd); } } }
static void mire_detect(MSWebCamManager *obj) { char *debug=getenv("DEBUG"); if (debug && atoi(debug)==1) { MSWebCam *cam=ms_web_cam_new(&ms_mire_webcam_desc); ms_web_cam_manager_add_cam(obj,cam); } }
static void video_capture_detect(MSWebCamManager *obj){ // Only creates one camera object whatever the real number of cameras. ms_message("Detecting Android VIDEO cards"); MSWebCam *cam=ms_web_cam_new(&ms_android_video_capture_desc); ms_web_cam_manager_add_cam(obj,cam); ms_message("Detection of Android VIDEO cards done"); }
static void mire_detect(MSWebCamManager *obj){ char *debug = NULL; #ifndef MS2_WINDOWS_UNIVERSAL debug = getenv("DEBUG"); #endif if (debug && atoi(debug)==1){ MSWebCam *cam=ms_web_cam_new(&ms_mire_webcam_desc); ms_web_cam_manager_add_cam(obj,cam); } }
static void bb10camera_detect(MSWebCamManager *obj) { camera_error_t error; camera_handle_t handle; error = camera_open(CAMERA_UNIT_FRONT, CAMERA_MODE_RW, &handle); if (error == CAMERA_EOK) { if (camera_has_feature(handle, CAMERA_FEATURE_VIDEO)) { if (camera_can_feature(handle, CAMERA_FEATURE_VIDEO)) { MSWebCam *cam = ms_web_cam_new(&ms_bb10_camera_desc); cam->name = ms_strdup("BB10 Front Camera"); ms_message("[bb10_capture] camera added: %s", cam->name); ms_web_cam_manager_add_cam(obj, cam); camera_close(handle); } else { ms_warning("[bb10_capture] front camera has video feature but can't do it..."); } } else { ms_warning("[bb10_capture] front camera doesn't have video feature"); } } else { ms_warning("[bb10_capture] Can't open front camera: %s", error_to_string(error)); } error = camera_open(CAMERA_UNIT_REAR, CAMERA_MODE_RW, &handle); if (error == CAMERA_EOK) { if (camera_has_feature(handle, CAMERA_FEATURE_VIDEO)) { if (camera_can_feature(handle, CAMERA_FEATURE_VIDEO)) { MSWebCam *cam = ms_web_cam_new(&ms_bb10_camera_desc); cam->name = ms_strdup("BB10 Rear Camera"); ms_message("[bb10_capture] camera added: %s", cam->name); ms_web_cam_manager_add_cam(obj, cam); camera_close(handle); } else { ms_warning("[bb10_capture] rear camera has video feature but can't do it..."); } } else { ms_warning("[bb10_capture] rear camera doesn't have video feature"); } } else { ms_warning("[bb10_capture] Can't open rear camera: %s", error_to_string(error)); } }
static void ms_vfw_detect(MSWebCamManager *obj){ int i; MSWebCam *cam; for (i = 0; i < VFW_ENGINE_MAX_INSTANCES; i++){ VfwEngine *eng; if ((eng=vfw_engine_new(i))!=NULL){ cam=ms_web_cam_new(&ms_vfw_cam_desc); cam->data=(void*)eng;/*store the engine */ cam->name=ms_strdup(eng->dev); ms_web_cam_manager_add_cam(obj,cam); } } atexit(vfw_engines_free); }
MSWebCam* mediastreamer2_tester_get_mire_webcam(MSWebCamManager *mgr) { MSWebCam *cam; cam = ms_web_cam_manager_get_cam(mgr, "Mire: Mire (synthetic moving picture)"); if (cam == NULL) { MSWebCamDesc *desc = ms_mire_webcam_desc_get(); if (desc){ cam=ms_web_cam_new(desc); ms_web_cam_manager_add_cam(mgr,cam); } } return cam; }
static void msv4l2_detect(MSWebCamManager *obj){ struct v4l2_capability cap; char devname[32]; int i; for(i=0;i<10;++i){ int fd; snprintf(devname,sizeof(devname),"/dev/video%i",i); fd=open(devname,O_RDWR); if (fd!=-1){ if (v4l2_ioctl (fd, VIDIOC_QUERYCAP, &cap)==0) { /* is a V4LV2 */ MSWebCam *cam=ms_web_cam_new(&v4l2_card_desc); cam->name=ms_strdup(devname); ms_web_cam_manager_add_cam(obj,cam); } close(fd); } } }
int main(int argc, char *argv[]){ LinphoneCoreVTable vtable={0}; LinphoneCore *lc; LinphoneVideoPolicy policy; int i; LinphoneAddress *addr=NULL; LCSipTransports tp; char * tmp = NULL; LpConfig * lp_config = lp_config_new(NULL); int max_call_duration=3600; static const char *media_file = NULL; policy.automatically_accept=TRUE; signal(SIGINT,stop); #ifndef _WIN32 signal(SIGUSR1,stats); signal(SIGUSR2,dump_call_logs); #endif for(i = 1; i < argc; ++i) { if (strcmp(argv[i], "--verbose") == 0) { linphone_core_set_log_level_mask(ORTP_MESSAGE|ORTP_WARNING|ORTP_ERROR|ORTP_FATAL); } else if (strcmp(argv[i], "--max-call-duration") == 0){ max_call_duration = atoi(argv[++i]); } else if (strcmp(argv[i], "--listening-uri") == 0){ addr = linphone_address_new(argv[++i]); if (!addr) { printf("Error, bad sip uri"); helper(argv[0]); } /* switch(linphone_address_get_transport(addr)) { case LinphoneTransportUdp: case LinphoneTransportTcp: break; default: ms_error("Error, bad sip uri [%s] transport, should be udp | tcp",argv[i]); helper(); break; }*/ } else if (strcmp(argv[i], "--media-file") == 0){ i++; if (i<argc){ media_file = argv[i]; }else helper(argv[0]); } else { helper(argv[0]); } } if (!addr) { addr = linphone_address_new("sip:[email protected]:5060"); } lp_config_set_string(lp_config,"sip","bind_address",linphone_address_get_domain(addr)); lp_config_set_string(lp_config,"rtp","bind_address",linphone_address_get_domain(addr)); lp_config_set_int(lp_config,"misc","history_max_size",100000); vtable.call_state_changed=call_state_changed; lc=linphone_core_new_with_config(&vtable,lp_config,NULL); linphone_core_enable_video_capture(lc,TRUE); linphone_core_enable_video_display(lc,FALSE); linphone_core_set_video_policy(lc,&policy); linphone_core_enable_keep_alive(lc,FALSE); /*instead of using sound capture card, a file is played to the calling party*/ linphone_core_set_use_files(lc,TRUE); linphone_core_enable_echo_cancellation(lc, FALSE); /*no need for local echo cancellation when playing files*/ if (!media_file){ linphone_core_set_play_file(lc,PACKAGE_DATA_DIR "/sounds/linphone/hello16000.wav"); linphone_core_set_preferred_framerate(lc,5); }else{ PayloadType *pt = linphone_core_find_payload_type(lc, "opus", 48000, -1); /*if opus is present, give it a bitrate for good quality with music, and stereo enabled*/ if (pt){ linphone_core_set_payload_type_bitrate(lc, pt, 150); payload_type_set_send_fmtp(pt, "stereo=1"); payload_type_set_recv_fmtp(pt, "stereo=1"); } linphone_core_set_play_file(lc, media_file); linphone_core_set_preferred_video_size_by_name(lc, "720p"); } { MSWebCamDesc *desc = ms_mire_webcam_desc_get(); if (desc){ ms_web_cam_manager_add_cam(ms_factory_get_web_cam_manager(linphone_core_get_ms_factory(lc)),ms_web_cam_new(desc)); linphone_core_set_video_device(lc,"Mire: Mire (synthetic moving picture)"); } } memset(&tp,0,sizeof(LCSipTransports)); tp.udp_port = linphone_address_get_port(addr); tp.tcp_port = linphone_address_get_port(addr); linphone_core_set_sip_transports(lc,&tp); linphone_core_set_audio_port_range(lc,1024,65000); linphone_core_set_video_port_range(lc,1024,65000); linphone_core_set_primary_contact(lc,tmp=linphone_address_as_string(addr)); ms_free(tmp); /* main loop for receiving notifications and doing background linphonecore work: */ while(running){ const bctbx_list_t * iterator; linphone_core_iterate(lc); ms_usleep(50000); if (print_stats) { ms_message("*********************************"); ms_message("*Current number of calls [%10u] *", (unsigned int)bctbx_list_size(linphone_core_get_calls(lc))); ms_message("*Number of calls until now [%10u] *", (unsigned int)bctbx_list_size(linphone_core_get_call_logs(lc))); ms_message("*********************************"); print_stats=FALSE; } if (dump_stats) { ms_message("*********************************"); for (iterator=linphone_core_get_call_logs(lc);iterator!=NULL;iterator=iterator->next) { LinphoneCallLog *call_log=(LinphoneCallLog *)iterator->data; char * tmp_str = linphone_call_log_to_str(call_log); ms_message("\n%s",tmp_str); ms_free(tmp_str); } dump_stats=FALSE; ms_message("*********************************"); } for (iterator=linphone_core_get_calls(lc);iterator!=NULL;iterator=iterator->next) { LinphoneCall *call=(LinphoneCall *)iterator->data; if (linphone_call_get_duration(call) > max_call_duration) { ms_message("Terminating call [%p] after [%i] s",call,linphone_call_get_duration(call)); linphone_core_terminate_call(lc,call); break; } } } ms_message("Shutting down...\n"); linphone_core_destroy(lc); ms_message("Exited\n"); return 0; }
LinphoneCoreManager* linphone_core_manager_init(const char* rc_file) { LinphoneCoreManager* mgr= ms_new0(LinphoneCoreManager,1); char *rc_path = NULL; mgr->number_of_cunit_error_at_creation = CU_get_number_of_failures(); mgr->v_table.registration_state_changed=registration_state_changed; mgr->v_table.auth_info_requested=auth_info_requested; mgr->v_table.call_state_changed=call_state_changed; mgr->v_table.text_received=text_message_received; mgr->v_table.message_received=message_received; mgr->v_table.is_composing_received=is_composing_received; mgr->v_table.new_subscription_requested=new_subscription_requested; mgr->v_table.notify_presence_received=notify_presence_received; mgr->v_table.transfer_state_changed=linphone_transfer_state_changed; mgr->v_table.info_received=info_message_received; mgr->v_table.subscription_state_changed=linphone_subscription_state_change; mgr->v_table.notify_received=linphone_notify_received; mgr->v_table.publish_state_changed=linphone_publish_state_changed; mgr->v_table.configuring_status=linphone_configuration_status; mgr->v_table.call_encryption_changed=linphone_call_encryption_changed; mgr->v_table.network_reachable=network_reachable; mgr->v_table.dtmf_received=dtmf_received; mgr->v_table.call_stats_updated=call_stats_updated; reset_counters(&mgr->stat); if (rc_file) rc_path = ms_strdup_printf("rcfiles/%s", rc_file); mgr->lc=configure_lc_from(&mgr->v_table, bc_tester_read_dir_prefix, rc_path, mgr); linphone_core_manager_check_accounts(mgr); manager_count++; #if TARGET_OS_IPHONE linphone_core_set_ringer_device( mgr->lc, "AQ: Audio Queue Device"); linphone_core_set_ringback(mgr->lc, NULL); #endif #ifdef VIDEO_ENABLED { MSWebCam *cam; cam = ms_web_cam_manager_get_cam(ms_web_cam_manager_get(), "Mire: Mire (synthetic moving picture)"); if (cam == NULL) { MSWebCamDesc *desc = ms_mire_webcam_desc_get(); if (desc){ cam=ms_web_cam_new(desc); ms_web_cam_manager_add_cam(ms_web_cam_manager_get(), cam); } } } #endif if( manager_count >= 2){ char hellopath[512]; char *recordpath = ms_strdup_printf("%s/record_for_lc_%p.wav",bc_tester_writable_dir_prefix,mgr->lc); ms_message("Manager for '%s' using files", rc_file ? rc_file : "--"); linphone_core_use_files(mgr->lc, TRUE); snprintf(hellopath,sizeof(hellopath), "%s/sounds/hello8000.wav", bc_tester_read_dir_prefix); linphone_core_set_play_file(mgr->lc,hellopath); linphone_core_set_record_file(mgr->lc,recordpath); ms_free(recordpath); } linphone_core_set_user_certificates_path(mgr->lc,bc_tester_writable_dir_prefix); if (rc_path) ms_free(rc_path); return mgr; }
static void static_image_detect(MSWebCamManager *obj){ MSWebCam *cam=ms_web_cam_new(&static_image_desc); ms_web_cam_manager_add_cam(obj,cam); }
void linphone_core_manager_init(LinphoneCoreManager *mgr, const char* rc_file) { char *rc_path = NULL; char *hellopath = bc_tester_res("sounds/hello8000.wav"); mgr->number_of_cunit_error_at_creation = bc_get_number_of_failures(); mgr->v_table.registration_state_changed=registration_state_changed; mgr->v_table.auth_info_requested=auth_info_requested; mgr->v_table.call_state_changed=call_state_changed; mgr->v_table.text_received=text_message_received; mgr->v_table.message_received=message_received; mgr->v_table.is_composing_received=is_composing_received; mgr->v_table.new_subscription_requested=new_subscription_requested; mgr->v_table.notify_presence_received=notify_presence_received; mgr->v_table.transfer_state_changed=linphone_transfer_state_changed; mgr->v_table.info_received=info_message_received; mgr->v_table.subscription_state_changed=linphone_subscription_state_change; mgr->v_table.notify_received=linphone_notify_received; mgr->v_table.publish_state_changed=linphone_publish_state_changed; mgr->v_table.configuring_status=linphone_configuration_status; mgr->v_table.call_encryption_changed=linphone_call_encryption_changed; mgr->v_table.network_reachable=network_reachable; mgr->v_table.dtmf_received=dtmf_received; mgr->v_table.call_stats_updated=call_stats_updated; reset_counters(&mgr->stat); if (rc_file) rc_path = ms_strdup_printf("rcfiles/%s", rc_file); mgr->lc=configure_lc_from(&mgr->v_table, bc_tester_get_resource_dir_prefix(), rc_path, mgr); linphone_core_manager_check_accounts(mgr); manager_count++; #if TARGET_OS_IPHONE linphone_core_set_ringer_device( mgr->lc, "AQ: Audio Queue Device"); linphone_core_set_ringback(mgr->lc, NULL); #elif __QNX__ linphone_core_set_playback_device(mgr->lc, "QSA: voice"); #endif #ifdef VIDEO_ENABLED { MSWebCam *cam; cam = ms_web_cam_manager_get_cam(ms_factory_get_web_cam_manager(mgr->lc->factory), "Mire: Mire (synthetic moving picture)"); if (cam == NULL) { MSWebCamDesc *desc = ms_mire_webcam_desc_get(); if (desc){ cam=ms_web_cam_new(desc); ms_web_cam_manager_add_cam(ms_factory_get_web_cam_manager(mgr->lc->factory), cam); } } } #endif linphone_core_set_play_file(mgr->lc,hellopath); /*is also used when in pause*/ ms_free(hellopath); if( manager_count >= 2){ char *recordpath = ms_strdup_printf("%s/record_for_lc_%p.wav",bc_tester_get_writable_dir_prefix(),mgr->lc); ms_message("Manager for '%s' using files", rc_file ? rc_file : "--"); linphone_core_set_use_files(mgr->lc, TRUE); linphone_core_set_record_file(mgr->lc,recordpath); ms_free(recordpath); } linphone_core_set_user_certificates_path(mgr->lc,bc_tester_get_writable_dir_prefix()); /*for now, we need the periodical updates facility to compute bandwidth measurements correctly during tests*/ lp_config_set_int(linphone_core_get_config(mgr->lc), "misc", "send_call_stats_periodical_updates", 1); if (rc_path) ms_free(rc_path); }
static void vfw_detect(MSWebCamManager *obj) { ICreateDevEnum *pCreateDevEnum = NULL; IEnumMoniker *pEnumMoniker = NULL; IMoniker *pMoniker = NULL; HRESULT hr; ULONG nFetched = 0; // Initialize COM CoInitialize(NULL); hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER, IID_ICreateDevEnum, (PVOID *)&pCreateDevEnum); if(FAILED(hr)) { CoUninitialize(); return ; } hr = pCreateDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pEnumMoniker, 0); if (FAILED(hr) || pEnumMoniker == NULL) { //printf("no device\n"); CoUninitialize(); return ; } pEnumMoniker->Reset(); int pos=0; while(S_OK == pEnumMoniker->Next(1, &pMoniker, &nFetched) ) { IPropertyBag *pBag; hr = pMoniker->BindToStorage( 0, 0, IID_IPropertyBag, (void**) &pBag ); if( hr != S_OK ) continue; VARIANT var; VariantInit(&var); hr = pBag->Read( L"FriendlyName", &var, NULL ); if( hr != S_OK ) { pMoniker->Release(); continue; } //USES_CONVERSION; char szName[256]; WideCharToMultiByte(CP_UTF8,0,var.bstrVal,-1,szName,256,0,0); VariantClear(&var); IBaseFilter *m_pDeviceFilter; hr = pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void**)&m_pDeviceFilter ); if(SUCCEEDED(hr)) { GUID pPinCategory; int fmt_supported = 0; dump_format(m_pDeviceFilter); //basic testing for the device. if (try_format(m_pDeviceFilter,MS_YUV420P, &pPinCategory)==0) fmt_supported = 1; else if (try_format(m_pDeviceFilter,MS_YUY2, &pPinCategory)==0) fmt_supported = 1; else if (try_format(m_pDeviceFilter,MS_YUYV, &pPinCategory)==0) fmt_supported = 1; else if (try_format(m_pDeviceFilter,MS_UYVY, &pPinCategory)==0) fmt_supported = 1; else if (try_format(m_pDeviceFilter,MS_RGB24, &pPinCategory)==0) fmt_supported = 1; else { ms_warning("Unsupported video pixel format/refuse camera (%s).", szName); } if (fmt_supported==1) { MSWebCam *cam=ms_web_cam_new(&ms_directx_cam_desc); cam->name=ms_strdup(szName); ms_web_cam_manager_add_cam(obj,cam); } m_pDeviceFilter->Release(); m_pDeviceFilter=NULL; } pMoniker->Release(); pBag->Release(); pMoniker=NULL; pBag=NULL; } pEnumMoniker->Release(); pCreateDevEnum->Release(); CoUninitialize(); }