pjmedia 시리즈 의 미디어 터미널 pjmediaendpt

4024 단어 pjproject
simpleua. c 는 미디어 관련 초기 화 를 진행 할 때 먼저 미디어 노드 를 만 들 고 미디어 노드 의 데이터 구조 와 생 성 절 차 를 봅 니 다.
#if PJ_HAS_THREADS
    status = pjmedia_endpt_create(&cp.factory, NULL, 1, &g_med_endpt);
#else
    status = pjmedia_endpt_create(&cp.factory, 
				  pjsip_endpt_get_ioqueue(g_endpt), 
				  0, &g_med_endpt);
#endif

pjmedia_endpt 구조 체
/** Concrete declaration of media endpoint. */
struct pjmedia_endpt
{
    /** Pool. */
    pj_pool_t		 *pool;

    /** Pool factory. */
    pj_pool_factory	 *pf;

    /** Codec manager. */
    pjmedia_codec_mgr	  codec_mgr;

    /** IOqueue instance. */
    pj_ioqueue_t 	 *ioqueue;

    /** Do we own the ioqueue? */
    pj_bool_t		  own_ioqueue;

    /** Number of threads. */
    unsigned		  thread_cnt;

    /** IOqueue polling thread, if any. */
    pj_thread_t		 *thread[MAX_THREADS];

    /** To signal polling thread to quit. */
    pj_bool_t		  quit_flag;

    /** Is telephone-event enable */
    pj_bool_t		  has_telephone_event;

    /** List of exit callback. */
    exit_cb		  exit_cb_list;
};

ioqueue: socket 을 연결 한 다음 에 비동기 로 데 이 터 를 받 습 니 다.
thread []: 스 레 드 배열, 작업 스 레 드 저장.
codec_mgr: codec 관리자
exit_cb_list: 종료 시 리 턴 링크
quit_flag: 위 치 를 설정 하면 작업 스 레 드 가 모두 종 료 됩 니 다.
터미널 만 들 기
/**
 * 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;


    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;


    /* 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;

    }

    /* Create worker threads if asked. */
    for (i=0; ipool, "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; ithread_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;
}

1. 메모리 풀 med - ept 만 들 기
2. 미디어 터미널 구조 체 메모 리 를 신청 하고 외부 ioqueue 주 소 를 구조 체 endpt - > ioqueue = ioqueue 에 저장 합 니 다.
3. 인 코더 관리자 pjmedia 초기 화codec_mgr_init(&endpt->codec_mgr, endpt->pf)
4. 처음 들 어 온 ioqueue 가 비어 있 으 면 새로운 ioqueue 를 만 듭 니 다.
5. 작업 스 레 드 그룹 을 만 듭 니 다. 스 레 드 함 수 는 worker 입 니 다.proc
작업 라인
/**
 * Worker thread proc.
 */
static int PJ_THREAD_FUNC worker_proc(void *arg)
{
    pjmedia_endpt *endpt = (pjmedia_endpt*) arg;

    while (!endpt->quit_flag) {
	pj_time_val timeout = { 0, 500 };
	pj_ioqueue_poll(endpt->ioqueue, &timeout);
    }

    return 0;
}

작업 스 레 드 는 500 ms 마다 pj 를 호출 합 니 다.ioqueue_pool。미디어 터미널 을 만 들 었 을 때 ioquue 는 아직 socket 을 등록 하지 않 았 기 때문에 데 이 터 를 감시 하지 않 습 니 다.

좋은 웹페이지 즐겨찾기