TT#58659 always use the correct codec handler per packet

In case of out-of-sequence queued-up packets, the codec handler in use
was the one from the last packet delivered to the sequencer, which might
be a different one from the one needed for each packet coming out of the
sequencer.

Change-Id: Id7fb21328f7d181244a9be2ae5ff13cb6bad31b7
changes/88/29588/5
Richard Fuchs 6 years ago
parent eb602892b0
commit 5acbf1ec87

@ -71,7 +71,7 @@ struct transcode_packet {
seq_packet_t p; // must be first seq_packet_t p; // must be first
unsigned long ts; unsigned long ts;
str *payload; str *payload;
struct codec_handler *handler; // optional different handler (for DTMF) struct codec_handler *handler;
int marker:1, int marker:1,
ignore_seq:1; ignore_seq:1;
int (*func)(struct codec_ssrc_handler *, struct transcode_packet *, struct media_packet *); int (*func)(struct codec_ssrc_handler *, struct transcode_packet *, struct media_packet *);
@ -586,17 +586,15 @@ static int handler_func_passthrough(struct codec_handler *h, struct media_packet
} }
#ifdef WITH_TRANSCODING #ifdef WITH_TRANSCODING
static int __handler_func_sequencer(struct codec_handler *h, struct media_packet *mp, static int __handler_func_sequencer(struct media_packet *mp, struct transcode_packet *packet)
struct transcode_packet *packet)
{ {
struct codec_handler *h = packet->handler;
if (G_UNLIKELY(!h->ssrc_hash)) { if (G_UNLIKELY(!h->ssrc_hash)) {
if (!packet->func || !packet->handler || !packet->handler->ssrc_hash) { if (!packet->func || !packet->handler || !packet->handler->ssrc_hash) {
h->func(h, mp); h->func(h, mp);
return 0; return 0;
} }
// DTMF handler with implicit (not negotiated) primary payload type
h = packet->handler;
/// fall through
} }
struct ssrc_ctx *ssrc_in = mp->ssrc_in; struct ssrc_ctx *ssrc_in = mp->ssrc_in;
@ -659,6 +657,11 @@ static int __handler_func_sequencer(struct codec_handler *h, struct media_packet
if (G_UNLIKELY(!packet)) if (G_UNLIKELY(!packet))
break; break;
h = packet->handler;
ch = get_ssrc(ssrc_in_p->h.ssrc, h->ssrc_hash);
if (G_UNLIKELY(!ch))
goto next;
atomic64_set(&ssrc_in->packets_lost, ssrc_in_p->sequencer.lost_count); atomic64_set(&ssrc_in->packets_lost, ssrc_in_p->sequencer.lost_count);
atomic64_set(&ssrc_in->last_seq, ssrc_in_p->sequencer.ext_seq); atomic64_set(&ssrc_in->last_seq, ssrc_in_p->sequencer.ext_seq);
@ -676,6 +679,7 @@ static int __handler_func_sequencer(struct codec_handler *h, struct media_packet
if (packet->func(ch, packet, mp)) if (packet->func(ch, packet, mp))
ilog(LOG_WARN, "Decoder error while processing RTP packet"); ilog(LOG_WARN, "Decoder error while processing RTP packet");
next:
__transcode_packet_free(packet); __transcode_packet_free(packet);
} }
@ -821,7 +825,7 @@ static int handler_func_dtmf(struct codec_handler *h, struct media_packet *mp) {
struct transcode_packet *packet = g_slice_alloc0(sizeof(*packet)); struct transcode_packet *packet = g_slice_alloc0(sizeof(*packet));
packet->func = packet_dtmf; packet->func = packet_dtmf;
packet->dup_func = packet_dtmf_dup; packet->dup_func = packet_dtmf_dup;
packet->handler = h; // original handler for output RTP options (payload type) packet->handler = h;
packet->rtp = *mp->rtp; packet->rtp = *mp->rtp;
if (sequencer_h->kernelize) { if (sequencer_h->kernelize) {
@ -831,7 +835,7 @@ static int handler_func_dtmf(struct codec_handler *h, struct media_packet *mp) {
packet->ignore_seq = 1; packet->ignore_seq = 1;
} }
return __handler_func_sequencer(sequencer_h, mp, packet); return __handler_func_sequencer(mp, packet);
} }
#endif #endif
@ -1141,8 +1145,9 @@ static int handler_func_transcode(struct codec_handler *h, struct media_packet *
struct transcode_packet *packet = g_slice_alloc0(sizeof(*packet)); struct transcode_packet *packet = g_slice_alloc0(sizeof(*packet));
packet->func = packet_decode; packet->func = packet_decode;
packet->rtp = *mp->rtp; packet->rtp = *mp->rtp;
packet->handler = h;
int ret = __handler_func_sequencer(h, mp, packet); int ret = __handler_func_sequencer(mp, packet);
//ilog(LOG_DEBUG, "tc iters: in %u out %u", mp->iter_in, mp->iter_out); //ilog(LOG_DEBUG, "tc iters: in %u out %u", mp->iter_in, mp->iter_out);

Loading…
Cancel
Save