int streamxmit_close(STREAM_RTP_DEST_T *pDest, int lock) { int rc = 0; STREAM_XMIT_QUEUE_T *pAsyncQ; if(!pDest) { return -1; } pAsyncQ = &pDest->asyncQ; if(lock) { pthread_mutex_lock(&pDest->pRtpMulti->mtx); } if(pAsyncQ->pQ) { pktqueue_destroy(pAsyncQ->pQ); pAsyncQ->doAsyncXmit = 0; pAsyncQ->doRtcpNack = 0; pAsyncQ->pQ = NULL; pthread_mutex_destroy(&pAsyncQ->mtx); } burstmeter_close(&pAsyncQ->retransmissionMeter); if(lock) { pthread_mutex_unlock(&pDest->pRtpMulti->mtx); } return rc; }
int stream_stats_destroy(STREAM_STATS_T **ppStats, pthread_mutex_t *pmtx) { unsigned int idx; unsigned int throughputIdx; if(pmtx) { pthread_mutex_lock(pmtx); } if(!ppStats || !(*ppStats)) { if(pmtx) { pthread_mutex_unlock(pmtx); } return -1; } pthread_mutex_lock(&(*ppStats)->mtx); (*ppStats)->active = 0; // // Automatically detach from monitor linked list // if((*ppStats)->pMonitor) { stream_monitor_detach( (*ppStats)->pMonitor, *ppStats); } for(idx = 0; idx < THROUGHPUT_STATS_BURSTRATES_MAX; idx++) { for(throughputIdx = 0; throughputIdx < 2; throughputIdx++) { burstmeter_close(&(*ppStats)->throughput_rt[throughputIdx].bitratesWr[idx]); burstmeter_close(&(*ppStats)->throughput_rt[throughputIdx].bitratesRd[idx]); } } pthread_mutex_unlock(&(*ppStats)->mtx); pthread_mutex_destroy(&(*ppStats)->mtx); avc_free((void **) ppStats); if(pmtx) { pthread_mutex_unlock(pmtx); } return 0; }