TT#66650 fix some SSRC refcount leaks

closes #841
closes #838

Change-Id: If96a3295ecc504c5e94eb113063cc20da7fb541e
changes/65/33165/2
Richard Fuchs 6 years ago
parent 7b60ca8e35
commit 65fb99b31d

@ -894,6 +894,7 @@ static int __handler_func_sequencer(struct media_packet *mp, struct transcode_pa
break;
h = packet->handler;
obj_put(&ch->h);
ch = get_ssrc(ssrc_in_p->h.ssrc, h->ssrc_hash);
if (G_UNLIKELY(!ch))
goto next;
@ -995,10 +996,13 @@ static void __output_rtp(struct media_packet *mp, struct codec_ssrc_handler *ch,
atomic64_set(&ssrc_out->last_ts, ts);
}
// returns new reference
static struct codec_ssrc_handler *__output_ssrc_handler(struct codec_ssrc_handler *ch, struct media_packet *mp) {
struct codec_handler *handler = ch->handler;
if (handler->output_handler == handler)
if (handler->output_handler == handler) {
obj_get(&ch->h);
return ch;
}
// our encoder is in a different codec handler
ilog(LOG_DEBUG, "Switching context from decoder to encoder");
@ -1006,6 +1010,7 @@ static struct codec_ssrc_handler *__output_ssrc_handler(struct codec_ssrc_handle
struct codec_ssrc_handler *new_ch = get_ssrc(mp->ssrc_in->parent->h.ssrc, handler->ssrc_hash);
if (G_UNLIKELY(!new_ch)) {
ilog(LOG_ERR, "Switched from input to output codec context, but no codec handler present");
obj_get(&ch->h);
return ch;
}
@ -1058,6 +1063,7 @@ static void packet_dtmf_fwd(struct codec_ssrc_handler *ch, struct transcode_pack
ch->last_dtmf_event_ts = duration;
}
payload_type = ch->handler->dtmf_payload_type;
obj_put(&output_ch->h);
}
char *buf = malloc(packet->payload->len + sizeof(struct rtp_header) + RTP_BUFFER_TAIL_ROOM);
@ -1546,6 +1552,7 @@ static int __packet_decoded(decoder_t *decoder, AVFrame *frame, void *u1, void *
discard:
av_frame_free(&frame);
//mp->iter_out++;
obj_put(&new_ch->h);
return 0;
}
@ -1599,6 +1606,7 @@ static int handler_func_inject_dtmf(struct codec_handler *h, struct media_packet
struct codec_ssrc_handler *ch = get_ssrc(mp->ssrc_in->parent->h.ssrc, h->ssrc_hash);
decoder_input_data(ch->decoder, &mp->payload, mp->rtp->timestamp,
__packet_decoded, ch, mp);
obj_put(&ch->h);
return 0;
}

@ -175,6 +175,7 @@ static char dtmf_code_to_char(int code) {
return codes[code];
}
// takes over the csh reference
static const char *dtmf_inject_pcm(struct call_media *media, struct call_monologue *monologue,
struct packet_stream *ps, struct ssrc_ctx *ssrc_in, struct codec_handler *ch,
struct codec_ssrc_handler *csh,
@ -224,6 +225,7 @@ static const char *dtmf_inject_pcm(struct call_media *media, struct call_monolog
media_socket_dequeue(&packet, packet_stream_sink(ps));
obj_put_o((struct obj *) csh);
return 0;
}
@ -271,6 +273,7 @@ const char *dtmf_inject(struct call_media *media, int code, int volume, int dura
codec_add_dtmf_event(csh, dtmf_code_to_char(code), volume, codec_encoder_pts(csh));
codec_add_dtmf_event(csh, 0, 0, codec_encoder_pts(csh) + num_samples);
obj_put_o((struct obj *) csh);
return NULL;
}

Loading…
Cancel
Save