diff --git a/daemon/jitter_buffer.c b/daemon/jitter_buffer.c index 7d8d9e377..dcff122bd 100644 --- a/daemon/jitter_buffer.c +++ b/daemon/jitter_buffer.c @@ -284,7 +284,7 @@ static void check_buffered_packets(struct jitter_buffer *jb) { } } -// jb is locked +// jb is locked and call is locked static int queue_packet(struct media_packet *mp, struct jb_packet *p) { struct jitter_buffer *jb = mp->stream->jb; unsigned long ts = ntohl(mp->rtp->timestamp); @@ -346,6 +346,7 @@ static int queue_packet(struct media_packet *mp, struct jb_packet *p) { return 0; } +// jb is locked and call is locked static int handle_clock_drift(struct media_packet *mp) { ilog(LOG_DEBUG, "handle_clock_drift"); struct jitter_buffer *jb = mp->stream->jb; @@ -512,6 +513,7 @@ static void decrement_buffer(struct jitter_buffer *jb) { jb->buffer_len--; } +// jb and call are unlocked static void set_jitter_values(struct media_packet *mp) { struct jitter_buffer *jb = mp->stream->jb; if(!jb || !mp->rtp) @@ -519,12 +521,16 @@ static void set_jitter_values(struct media_packet *mp) { int curr_seq = ntohs(mp->rtp->seq_num); int payload_type = (mp->rtp->m_pt & 0x7f); int dtmf = 0; + + call_t *call = mp->call; + RWLOCK_R(&call->master_lock); const rtp_payload_type *rtp_pt = codec_rtp_pt(mp, payload_type); if(rtp_pt) { if(rtp_pt->codec_def && rtp_pt->codec_def->dtmf) dtmf = 1; } - mutex_lock(&jb->lock); + + LOCK(&jb->lock); if(jb->next_exp_seq && !dtmf) { if(curr_seq > jb->next_exp_seq) { int marker = (mp->rtp->m_pt & 0x80) ? 1 : 0; @@ -554,7 +560,6 @@ static void set_jitter_values(struct media_packet *mp) { } if(curr_seq >= jb->next_exp_seq) jb->next_exp_seq = curr_seq + 1; - mutex_unlock(&jb->lock); } static void __jb_send_later(struct timerthread_queue *ttq, void *p) {