PJ_DEF(pj_status_t) pjnath_init(void) { pj_status_t status; status = pj_register_strerror(PJNATH_ERRNO_START, 299, &pjnath_strerror); if (status != PJ_SUCCESS) return status; status = pj_register_strerror(PJ_STATUS_FROM_STUN_CODE(300), 699 - 300, &pjnath_strerror2); return status; }
/* API: Initialize the video device subsystem. */ PJ_DEF(pj_status_t) pjmedia_vid_dev_subsys_init(pj_pool_factory *pf) { unsigned i; pj_status_t status = PJ_SUCCESS; /* Allow init() to be called multiple times as long as there is matching * number of shutdown(). */ if (vid_subsys.init_count++ != 0) { return PJ_SUCCESS; } /* Register error subsystem */ pj_register_strerror(PJMEDIA_VIDEODEV_ERRNO_START, PJ_ERRNO_SPACE_SIZE, &pjmedia_videodev_strerror); /* Init */ vid_subsys.pf = pf; vid_subsys.drv_cnt = 0; vid_subsys.dev_cnt = 0; /* Register creation functions */ #if PJMEDIA_VIDEO_DEV_HAS_ANDROID_CAPTURE vid_subsys.drv[vid_subsys.drv_cnt++].create = &pjmedia_android_cam_factory; #endif #if PJMEDIA_VIDEO_DEV_HAS_V4L2 vid_subsys.drv[vid_subsys.drv_cnt++].create = &pjmedia_v4l2_factory; #endif #if PJMEDIA_VIDEO_DEV_HAS_QT vid_subsys.drv[vid_subsys.drv_cnt++].create = &pjmedia_qt_factory; #endif #if PJMEDIA_VIDEO_DEV_HAS_IOS vid_subsys.drv[vid_subsys.drv_cnt++].create = &pjmedia_ios_factory; #endif #if PJMEDIA_VIDEO_DEV_HAS_DSHOW vid_subsys.drv[vid_subsys.drv_cnt++].create = &pjmedia_dshow_factory; #endif #if PJMEDIA_VIDEO_DEV_HAS_FFMPEG vid_subsys.drv[vid_subsys.drv_cnt++].create = &pjmedia_ffmpeg_factory; #endif #if PJMEDIA_VIDEO_DEV_HAS_CBAR_SRC vid_subsys.drv[vid_subsys.drv_cnt++].create = &pjmedia_cbar_factory; #endif #if PJMEDIA_VIDEO_DEV_HAS_SDL vid_subsys.drv[vid_subsys.drv_cnt++].create = &pjmedia_sdl_factory; #endif /* Initialize each factory and build the device ID list */ for (i=0; i<vid_subsys.drv_cnt; ++i) { status = init_driver(i, PJ_FALSE); if (status != PJ_SUCCESS) { deinit_driver(i); continue; } } return vid_subsys.dev_cnt ? PJ_SUCCESS : status; }
PJ_DEF(pj_status_t) pjlib_util_init(void) { pj_status_t status; status = pj_register_strerror(PJLIB_UTIL_ERRNO_START, PJ_ERRNO_SPACE_SIZE, &pjlib_util_strerror); pj_assert(status == PJ_SUCCESS); return PJ_SUCCESS; }
/* API: Initialize the audio subsystem. */ PJ_DEF(pj_status_t) pjmedia_aud_subsys_init(pj_pool_factory *pf) { unsigned i; pj_status_t status = PJ_SUCCESS; /* Allow init() to be called multiple times as long as there is matching * number of shutdown(). */ if (aud_subsys.init_count++ != 0) { return PJ_SUCCESS; } /* Register error subsystem */ pj_register_strerror(PJMEDIA_AUDIODEV_ERRNO_START, PJ_ERRNO_SPACE_SIZE, &pjmedia_audiodev_strerror); /* Init */ aud_subsys.pf = pf; aud_subsys.drv_cnt = 0; aud_subsys.dev_cnt = 0; /* Register creation functions */ #if PJMEDIA_AUDIO_DEV_HAS_PORTAUDIO aud_subsys.drv[aud_subsys.drv_cnt++].create = &pjmedia_pa_factory; #endif #if PJMEDIA_AUDIO_DEV_HAS_WMME aud_subsys.drv[aud_subsys.drv_cnt++].create = &pjmedia_wmme_factory; #endif #if PJMEDIA_AUDIO_DEV_HAS_SYMB_VAS aud_subsys.drv[aud_subsys.drv_cnt++].create = &pjmedia_symb_vas_factory; #endif #if PJMEDIA_AUDIO_DEV_HAS_SYMB_APS aud_subsys.drv[aud_subsys.drv_cnt++].create = &pjmedia_aps_factory; #endif #if PJMEDIA_AUDIO_DEV_HAS_SYMB_MDA aud_subsys.drv[aud_subsys.drv_cnt++].create = &pjmedia_symb_mda_factory; #endif /* Initialize each factory and build the device ID list */ for (i=0; i<aud_subsys.drv_cnt; ++i) { status = init_driver(i); if (status != PJ_SUCCESS) { deinit_driver(i); continue; } } return aud_subsys.dev_cnt ? PJ_SUCCESS : status; }
/** * Initialize and get the instance of media endpoint. */ PJ_DEF(pj_status_t) pjmedia_endpt_create(pj_pool_factory *pf, pj_ioqueue_t *ioqueue, unsigned worker_cnt, pjmedia_endpt **p_endpt) { pj_pool_t *pool; pjmedia_endpt *endpt; unsigned i; pj_status_t status; if (!error_subsys_registered) { pj_register_strerror(PJMEDIA_ERRNO_START, PJ_ERRNO_SPACE_SIZE, &pjmedia_strerror); error_subsys_registered = 1; } PJ_ASSERT_RETURN(pf && p_endpt, PJ_EINVAL); PJ_ASSERT_RETURN(worker_cnt <= MAX_THREADS, PJ_EINVAL); pool = pj_pool_create(pf, "med-ept", 512, 512, NULL); if (!pool) return PJ_ENOMEM; endpt = PJ_POOL_ZALLOC_T(pool, struct pjmedia_endpt); endpt->pool = pool; endpt->pf = pf; endpt->ioqueue = ioqueue; endpt->thread_cnt = worker_cnt; /* Sound */ status = pjmedia_aud_subsys_init(pf); if (status != PJ_SUCCESS) goto on_error; /* Init codec manager. */ status = pjmedia_codec_mgr_init(&endpt->codec_mgr); if (status != PJ_SUCCESS) goto on_error; /* Create ioqueue if none is specified. */ if (endpt->ioqueue == NULL) { endpt->own_ioqueue = PJ_TRUE; status = pj_ioqueue_create( endpt->pool, PJ_IOQUEUE_MAX_HANDLES, &endpt->ioqueue); if (status != PJ_SUCCESS) goto on_error; if (worker_cnt == 0) { PJ_LOG(4,(THIS_FILE, "Warning: no worker thread is created in" "media endpoint for internal ioqueue")); } } /* Create worker threads if asked. */ for (i=0; i<worker_cnt; ++i) { status = pj_thread_create( endpt->pool, "media", &worker_proc, endpt, 0, 0, &endpt->thread[i]); if (status != PJ_SUCCESS) goto on_error; } *p_endpt = endpt; return PJ_SUCCESS; on_error: /* Destroy threads */ for (i=0; i<endpt->thread_cnt; ++i) { if (endpt->thread[i]) { pj_thread_destroy(endpt->thread[i]); } } /* Destroy internal ioqueue */ if (endpt->ioqueue && endpt->own_ioqueue) pj_ioqueue_destroy(endpt->ioqueue); pjmedia_aud_subsys_shutdown(); pj_pool_release(pool); return status; }
/* * main() */ int main(int argc, char *argv[]) { enum { NSAMPLES = 160, COUNT=100 }; pj_caching_pool cp; pj_pool_t *pool; pjmedia_port *wav; pj_status_t status; /* Verify cmd line arguments. */ if (argc != 2) { puts("Error: missing argument(s)"); puts("Usage: latency REV.WAV"); return 1; } pj_log_set_level(0); status = pj_init(); PJ_ASSERT_RETURN(status == PJ_SUCCESS, 1); pj_caching_pool_init(&cp, &pj_pool_factory_default_policy, 0); pool = pj_pool_create( &cp.factory, /* pool factory */ "wav", /* pool name. */ 4000, /* init size */ 4000, /* increment size */ NULL /* callback on error */ ); status = pj_register_strerror(PJMEDIA_ERRNO_START, PJ_ERRNO_SPACE_SIZE, &pjmedia_strerror); pj_assert(status == PJ_SUCCESS); /* Wav */ status = pjmedia_wav_player_port_create( pool, /* memory pool */ argv[1], /* file to play */ 0, /* use default ptime*/ 0, /* flags */ 0, /* default buffer */ &wav /* returned port */ ); if (status != PJ_SUCCESS) { app_perror(THIS_FILE, argv[1], status); return 1; } status = calculate_latency(pool, wav); if (status != PJ_SUCCESS) return 1; status = pjmedia_port_destroy( wav ); PJ_ASSERT_RETURN(status == PJ_SUCCESS, 1); pj_pool_release( pool ); pj_caching_pool_destroy( &cp ); pj_shutdown(); /* Done. */ return 0; }
PJ_DEF(pj_status_t) pjlib_util_init(void) { return pj_register_strerror(PJLIB_UTIL_ERRNO_START, PJ_ERRNO_SPACE_SIZE, &pjlib_util_strerror); }
/* API: Initialize the audio subsystem. */ PJ_DEF(pj_status_t) pjmedia_aud_subsys_init(pj_pool_factory *pf) { unsigned i; pj_status_t status; /* Allow init() to be called multiple times as long as there is matching * number of shutdown(). */ if (aud_subsys.init_count++ != 0) { return PJ_SUCCESS; } /* Register error subsystem */ status = pj_register_strerror(PJMEDIA_AUDIODEV_ERRNO_START, PJ_ERRNO_SPACE_SIZE, &pjmedia_audiodev_strerror); pj_assert(status == PJ_SUCCESS); /* Init */ aud_subsys.pf = pf; aud_subsys.drv_cnt = 0; aud_subsys.dev_cnt = 0; /* Register creation functions */ #if PJMEDIA_AUDIO_DEV_HAS_OPENSL aud_subsys.drv[aud_subsys.drv_cnt++].create = &pjmedia_opensl_factory; #endif #if PJMEDIA_AUDIO_DEV_HAS_ANDROID_JNI aud_subsys.drv[aud_subsys.drv_cnt++].create = &pjmedia_android_factory; #endif #if PJMEDIA_AUDIO_DEV_HAS_BB10 aud_subsys.drv[aud_subsys.drv_cnt++].create = &pjmedia_bb10_factory; #endif #if PJMEDIA_AUDIO_DEV_HAS_ALSA aud_subsys.drv[aud_subsys.drv_cnt++].create = &pjmedia_alsa_factory; #endif #if PJMEDIA_AUDIO_DEV_HAS_COREAUDIO aud_subsys.drv[aud_subsys.drv_cnt++].create = &pjmedia_coreaudio_factory; #endif #if PJMEDIA_AUDIO_DEV_HAS_WMME aud_subsys.drv[aud_subsys.drv_cnt++].create = &pjmedia_wmme_factory; #endif #if PJMEDIA_AUDIO_DEV_HAS_BDIMAD aud_subsys.drv[aud_subsys.drv_cnt++].create = &pjmedia_bdimad_factory; #endif #if PJMEDIA_AUDIO_DEV_HAS_SYMB_VAS aud_subsys.drv[aud_subsys.drv_cnt++].create = &pjmedia_symb_vas_factory; #endif #if PJMEDIA_AUDIO_DEV_HAS_SYMB_APS aud_subsys.drv[aud_subsys.drv_cnt++].create = &pjmedia_aps_factory; #endif #if PJMEDIA_AUDIO_DEV_HAS_SYMB_MDA aud_subsys.drv[aud_subsys.drv_cnt++].create = &pjmedia_symb_mda_factory; #endif #if PJMEDIA_AUDIO_DEV_HAS_NULL_AUDIO aud_subsys.drv[aud_subsys.drv_cnt++].create = &pjmedia_null_audio_factory; #endif /* Initialize audio device observer objects */ pj_status_t st; aud_subsys.dev_observer.pool = pj_pool_create(pf, "aud_dev_observer_pool", 512, 512, NULL); if (!aud_subsys.dev_observer.pool) { return PJ_ENOMEM; } st = pj_mutex_create_simple(aud_subsys.dev_observer.pool, "aud_dev_observer_lock", &aud_subsys.dev_observer.lock); if (st != PJ_SUCCESS) { return st; } aud_subsys.dev_observer.cb = NULL; /* Initialize each factory and build the device ID list */ for (i=0; i<aud_subsys.drv_cnt; ++i) { status = init_driver(i, PJ_FALSE); if (status != PJ_SUCCESS) { deinit_driver(i); continue; } } return aud_subsys.dev_cnt ? PJ_SUCCESS : status; }
/** * Initialize and get the instance of media endpoint. */ PJ_DEF(pj_status_t) pjmedia_endpt_create2(pj_pool_factory *pf, pj_ioqueue_t *ioqueue, unsigned worker_cnt, pjmedia_endpt **p_endpt) { pj_pool_t *pool; pjmedia_endpt *endpt; unsigned i; pj_status_t status; status = pj_register_strerror(PJMEDIA_ERRNO_START, PJ_ERRNO_SPACE_SIZE, &pjmedia_strerror); pj_assert(status == PJ_SUCCESS); PJ_ASSERT_RETURN(pf && p_endpt, PJ_EINVAL); PJ_ASSERT_RETURN(worker_cnt <= MAX_THREADS, PJ_EINVAL); pool = pj_pool_create(pf, "med-ept", 512, 512, NULL); if (!pool) return PJ_ENOMEM; endpt = PJ_POOL_ZALLOC_T(pool, struct pjmedia_endpt); endpt->pool = pool; endpt->pf = pf; endpt->ioqueue = ioqueue; endpt->thread_cnt = worker_cnt; endpt->has_telephone_event = PJ_TRUE; /* Initialize audio subsystem. * To avoid pjmedia's dependendy on pjmedia-audiodev, the initialization * (and shutdown) of audio subsystem will be done in the application * level instead, when it calls inline functions pjmedia_endpt_create() * and pjmedia_endpt_destroy(). */ //status = pjmedia_aud_subsys_init(pf); //if (status != PJ_SUCCESS) // goto on_error; /* Init codec manager. */ status = pjmedia_codec_mgr_init(&endpt->codec_mgr, endpt->pf); if (status != PJ_SUCCESS) goto on_error; /* Initialize exit callback list. */ pj_list_init(&endpt->exit_cb_list); /* Create ioqueue if none is specified. */ if (endpt->ioqueue == NULL) { endpt->own_ioqueue = PJ_TRUE; status = pj_ioqueue_create( endpt->pool, PJ_IOQUEUE_MAX_HANDLES, &endpt->ioqueue); if (status != PJ_SUCCESS) goto on_error; if (worker_cnt == 0) { PJ_LOG(4,(THIS_FILE, "Warning: no worker thread is created in" "media endpoint for internal ioqueue")); } } /* Create worker threads if asked. */ for (i=0; i<worker_cnt; ++i) { status = pj_thread_create( endpt->pool, "media", &worker_proc, endpt, 0, 0, &endpt->thread[i]); if (status != PJ_SUCCESS) goto on_error; } *p_endpt = endpt; return PJ_SUCCESS; on_error: /* Destroy threads */ for (i=0; i<endpt->thread_cnt; ++i) { if (endpt->thread[i]) { pj_thread_destroy(endpt->thread[i]); } } /* Destroy internal ioqueue */ if (endpt->ioqueue && endpt->own_ioqueue) pj_ioqueue_destroy(endpt->ioqueue); pjmedia_codec_mgr_destroy(&endpt->codec_mgr); //pjmedia_aud_subsys_shutdown(); pj_pool_release(pool); return status; }
/* API: Initialize the video device subsystem. */ PJ_DEF(pj_status_t) pjmedia_vid_dev_subsys_init(pj_pool_factory *pf) { unsigned i; pj_status_t status = PJ_SUCCESS; pjmedia_vid_subsys *vid_subsys = pjmedia_get_vid_subsys(); /* Allow init() to be called multiple times as long as there is matching * number of shutdown(). */ if (vid_subsys->init_count++ != 0) { return PJ_SUCCESS; } /* Register error subsystem */ pj_register_strerror(PJMEDIA_VIDEODEV_ERRNO_START, PJ_ERRNO_SPACE_SIZE, &pjmedia_videodev_strerror); /* Init */ vid_subsys->pf = pf; vid_subsys->drv_cnt = 0; vid_subsys->dev_cnt = 0; /* Register creation functions */ #if PJMEDIA_VIDEO_DEV_HAS_V4L2 vid_subsys->drv[vid_subsys->drv_cnt++].create = &pjmedia_v4l2_factory; #endif #if PJMEDIA_VIDEO_DEV_HAS_QT vid_subsys->drv[vid_subsys->drv_cnt++].create = &pjmedia_qt_factory; #endif #if PJMEDIA_VIDEO_DEV_HAS_OPENGL vid_subsys->drv[vid_subsys->drv_cnt++].create = &pjmedia_opengl_factory; #endif #if PJMEDIA_VIDEO_DEV_HAS_IOS vid_subsys->drv[vid_subsys->drv_cnt++].create = &pjmedia_ios_factory; #endif #if PJMEDIA_VIDEO_DEV_HAS_DSHOW vid_subsys->drv[vid_subsys->drv_cnt++].create = &pjmedia_dshow_factory; #endif #if PJMEDIA_VIDEO_DEV_HAS_FFMPEG vid_subsys->drv[vid_subsys->drv_cnt++].create = &pjmedia_ffmpeg_factory; #endif #if PJMEDIA_VIDEO_DEV_HAS_SDL vid_subsys->drv[vid_subsys->drv_cnt++].create = &pjmedia_sdl_factory; #endif #if PJMEDIA_VIDEO_DEV_HAS_ANDROID vid_subsys->drv[vid_subsys->drv_cnt++].create = &pjmedia_and_factory; #endif #if PJMEDIA_VIDEO_DEV_HAS_CBAR_SRC /* Better put colorbar at the last, so the default capturer will be * a real capturer, if any. */ vid_subsys->drv[vid_subsys->drv_cnt++].create = &pjmedia_cbar_factory; #endif /* Initialize each factory and build the device ID list */ for (i=0; i<vid_subsys->drv_cnt; ++i) { status = pjmedia_vid_driver_init(i, PJ_FALSE); if (status != PJ_SUCCESS) { pjmedia_vid_driver_deinit(i); continue; } } return vid_subsys->dev_cnt ? PJ_SUCCESS : status; }