|
|
|
@ -214,7 +214,7 @@ struct codec_ssrc_handler { |
|
|
|
char *buf, // bufferpool_alloc'd, room for rtp_header + filled-in payload |
|
|
|
unsigned int payload_len, |
|
|
|
unsigned long payload_ts, |
|
|
|
int marker, int payload_type, |
|
|
|
struct rtp_markers, int payload_type, |
|
|
|
unsigned long ts_delay); |
|
|
|
|
|
|
|
// DTMF DSP stuff |
|
|
|
@ -236,15 +236,15 @@ struct codec_ssrc_handler { |
|
|
|
|
|
|
|
uint64_t skip_pts; |
|
|
|
|
|
|
|
unsigned int rtp_mark:1; |
|
|
|
bool rtp_mark:1; |
|
|
|
}; |
|
|
|
struct transcode_packet { |
|
|
|
seq_packet_t p; // must be first |
|
|
|
unsigned long ts; |
|
|
|
str *payload; |
|
|
|
struct codec_handler *handler; |
|
|
|
unsigned int marker:1, |
|
|
|
bypass_seq:1; |
|
|
|
bool marker:1, |
|
|
|
bypass_seq:1; |
|
|
|
tc_code (*packet_func)(struct codec_ssrc_handler *, struct codec_ssrc_handler *, struct transcode_packet *, |
|
|
|
struct media_packet *); |
|
|
|
int (*dup_func)(struct codec_ssrc_handler *, struct codec_ssrc_handler *, struct transcode_packet *, |
|
|
|
@ -294,7 +294,7 @@ static void codec_output_rtp_seq_passthrough(struct media_packet *mp, struct cod |
|
|
|
char *buf, // bufferpool_alloc'd, room for rtp_header + filled-in payload |
|
|
|
unsigned int payload_len, |
|
|
|
unsigned long payload_ts, |
|
|
|
int marker, int payload_type, |
|
|
|
struct rtp_markers, int payload_type, |
|
|
|
unsigned long ts_delay); |
|
|
|
|
|
|
|
static void codec_output_rtp_seq_own(struct media_packet *mp, struct codec_scheduler *csch, |
|
|
|
@ -302,7 +302,7 @@ static void codec_output_rtp_seq_own(struct media_packet *mp, struct codec_sched |
|
|
|
char *buf, // bufferpool_alloc'd, room for rtp_header + filled-in payload |
|
|
|
unsigned int payload_len, |
|
|
|
unsigned long payload_ts, |
|
|
|
int marker, int payload_type, |
|
|
|
struct rtp_markers, int payload_type, |
|
|
|
unsigned long ts_delay); |
|
|
|
|
|
|
|
|
|
|
|
@ -921,7 +921,7 @@ struct codec_handler *codec_handler_make_playback(const rtp_payload_type *src_pt |
|
|
|
handler->ssrc_handler->h.ssrc = ssrc; |
|
|
|
while (handler->ssrc_handler->csch.first_ts == 0) |
|
|
|
handler->ssrc_handler->csch.first_ts = ssl_random(); |
|
|
|
handler->ssrc_handler->rtp_mark = 1; |
|
|
|
handler->ssrc_handler->rtp_mark = true; |
|
|
|
|
|
|
|
ilogs(codec, LOG_DEBUG, "Created media playback context for " STR_FORMAT "/" STR_FORMAT |
|
|
|
" -> " STR_FORMAT "/" STR_FORMAT "/%d", |
|
|
|
@ -2254,7 +2254,7 @@ static int __handler_func_sequencer(struct media_packet *mp, struct transcode_pa |
|
|
|
packet->payload = str_dup(&mp->payload); |
|
|
|
uint32_t packet_ts = ntohl(mp->rtp->timestamp); |
|
|
|
packet->ts = packet_ts; |
|
|
|
packet->marker = (mp->rtp->m_pt & 0x80) ? 1 : 0; |
|
|
|
packet->marker = (mp->rtp->m_pt & 0x80) ? true : false; |
|
|
|
|
|
|
|
atomic64_inc_na(&ssrc_in->stats->packets); |
|
|
|
atomic64_add_na(&ssrc_in->stats->bytes, mp->payload.len); |
|
|
|
@ -2441,7 +2441,7 @@ void codec_output_rtp(struct media_packet *mp, struct codec_scheduler *csch, |
|
|
|
char *buf, // bufferpool_alloc'd, room for rtp_header + filled-in payload |
|
|
|
size_t payload_len, |
|
|
|
unsigned long payload_ts, |
|
|
|
int marker, int seq, int seq_inc, int payload_type, |
|
|
|
struct rtp_markers marks, int seq, int seq_inc, int payload_type, |
|
|
|
unsigned long ts_delay) |
|
|
|
{ |
|
|
|
struct rtp_header *rh = (void *) buf; |
|
|
|
@ -2452,7 +2452,7 @@ void codec_output_rtp(struct media_packet *mp, struct codec_scheduler *csch, |
|
|
|
rh->v_p_x_cc = 0x80; |
|
|
|
if (payload_type == -1) |
|
|
|
payload_type = handler->dest_pt.payload_type; |
|
|
|
rh->m_pt = payload_type | (marker ? 0x80 : 0); |
|
|
|
rh->m_pt = payload_type | (marks.marker ? 0x80 : 0); |
|
|
|
if (seq != -1) |
|
|
|
rh->seq_num = htons(seq); |
|
|
|
else |
|
|
|
@ -2641,10 +2641,12 @@ skip: |
|
|
|
memcpy(buf + sizeof(struct rtp_header), packet->payload->s, packet->payload->len); |
|
|
|
if (packet->bypass_seq) // inject original seq |
|
|
|
codec_output_rtp(mp, &ch->csch, packet->handler ? : h, buf, packet->payload->len, packet->ts, |
|
|
|
packet->marker, packet->p.seq, -1, payload_type, ts_delay); |
|
|
|
(struct rtp_markers) { .marker = packet->marker }, |
|
|
|
packet->p.seq, -1, payload_type, ts_delay); |
|
|
|
else // use our own sequencing |
|
|
|
input_ch->codec_output_rtp_seq(mp, &ch->csch, packet->handler ? : h, buf, packet->payload->len, packet->ts, |
|
|
|
packet->marker, payload_type, ts_delay); |
|
|
|
(struct rtp_markers) { .marker = packet->marker }, |
|
|
|
payload_type, ts_delay); |
|
|
|
mp->ssrc_out->seq_diff++; |
|
|
|
|
|
|
|
return 0; |
|
|
|
@ -2763,10 +2765,10 @@ static tc_code packet_dtmf(struct codec_ssrc_handler *ch, struct codec_ssrc_hand |
|
|
|
*dup = *packet; |
|
|
|
dup->payload = str_dup(&ev_pl); |
|
|
|
dup->rtp = r; |
|
|
|
dup->bypass_seq = 0; |
|
|
|
dup->bypass_seq = false; |
|
|
|
dup->ts = ts; |
|
|
|
if (is_dtmf == 1) |
|
|
|
dup->marker = 1; |
|
|
|
dup->marker = true; |
|
|
|
|
|
|
|
tc_code ret = TCC_OK; |
|
|
|
|
|
|
|
@ -2855,7 +2857,7 @@ static int __handler_func_supplemental(struct codec_handler *h, struct media_pac |
|
|
|
|
|
|
|
if (sequencer_h->passthrough || sequencer_h->kernelize) { |
|
|
|
// bypass sequencer, directly pass it to forwarding function |
|
|
|
packet->bypass_seq = 1; |
|
|
|
packet->bypass_seq = true; |
|
|
|
} |
|
|
|
|
|
|
|
return __handler_func_sequencer(mp, packet); |
|
|
|
@ -4584,7 +4586,7 @@ static void codec_output_rtp_seq_passthrough(struct media_packet *mp, struct cod |
|
|
|
char *buf, // bufferpool_alloc'd, room for rtp_header + filled-in payload |
|
|
|
unsigned int payload_len, |
|
|
|
unsigned long payload_ts, |
|
|
|
int marker, int payload_type, |
|
|
|
struct rtp_markers marker, int payload_type, |
|
|
|
unsigned long ts_delay) |
|
|
|
{ |
|
|
|
codec_output_rtp(mp, csch, handler, buf, payload_len, payload_ts, marker, -1, 0, payload_type, ts_delay); |
|
|
|
@ -4595,7 +4597,7 @@ static void codec_output_rtp_seq_own(struct media_packet *mp, struct codec_sched |
|
|
|
char *buf, // bufferpool_alloc'd, room for rtp_header + filled-in payload |
|
|
|
unsigned int payload_len, |
|
|
|
unsigned long payload_ts, |
|
|
|
int marker, int payload_type, |
|
|
|
struct rtp_markers marker, int payload_type, |
|
|
|
unsigned long ts_delay) |
|
|
|
{ |
|
|
|
// XXX this bypasses the send timer |
|
|
|
@ -4623,7 +4625,7 @@ static void packet_encoded_tx(struct codec_ssrc_handler *ch, struct media_packet |
|
|
|
if (is_dtmf) { |
|
|
|
payload_type = dtmf_pt; |
|
|
|
if (is_dtmf == 1) |
|
|
|
ch->rtp_mark = 1; // DTMF start event |
|
|
|
ch->rtp_mark = true; // DTMF start event |
|
|
|
else if (is_dtmf == 3) |
|
|
|
repeats = 2; // DTMF end event |
|
|
|
// we need to pass a ts_delay to codec_output_rtp to ensure the calculated time |
|
|
|
@ -4649,10 +4651,10 @@ static void packet_encoded_tx(struct codec_ssrc_handler *ch, struct media_packet |
|
|
|
} |
|
|
|
ch->codec_output_rtp_seq(mp, &ch->csch, ch->handler, send_buf, inout->len, ch->csch.first_ts |
|
|
|
+ fraction_divl(pts, cr_fact), |
|
|
|
ch->rtp_mark ? 1 : 0, |
|
|
|
(struct rtp_markers) { .marker = ch->rtp_mark }, |
|
|
|
payload_type, ts_delay); |
|
|
|
mp->ssrc_out->seq_diff++; |
|
|
|
ch->rtp_mark = 0; |
|
|
|
ch->rtp_mark = false; |
|
|
|
if (!repeats) |
|
|
|
break; |
|
|
|
} while (repeats--); |
|
|
|
|