|
|
|
|
@ -2145,27 +2145,36 @@ static void codec_add_raw_packet_common(struct media_packet *mp, unsigned int cl
|
|
|
|
|
}
|
|
|
|
|
t_queue_push_tail_link(&mp->packets_out, &p->link);
|
|
|
|
|
}
|
|
|
|
|
void codec_add_raw_packet(struct media_packet *mp, unsigned int clockrate) {
|
|
|
|
|
struct codec_packet *p = g_new0(__typeof(*p), 1);
|
|
|
|
|
p->link.data = p;
|
|
|
|
|
p->s = mp->raw;
|
|
|
|
|
p->free_func = NULL;
|
|
|
|
|
codec_add_raw_packet_common(mp, clockrate, p);
|
|
|
|
|
}
|
|
|
|
|
#ifdef WITH_TRANSCODING
|
|
|
|
|
|
|
|
|
|
static void codec_add_raw_packet_dup(struct media_packet *mp, unsigned int clockrate) {
|
|
|
|
|
struct codec_packet *p = g_new0(__typeof(*p), 1);
|
|
|
|
|
p->link.data = p;
|
|
|
|
|
// don't just duplicate the string. need to ensure enough room
|
|
|
|
|
// if encryption is enabled on this stream
|
|
|
|
|
p->s.s = bufferpool_alloc(media_bufferpool, mp->raw.len + RTP_BUFFER_TAIL_ROOM);
|
|
|
|
|
// or for RTP header extensions
|
|
|
|
|
size_t ext_len = mp->sink.rtpext->length(mp);
|
|
|
|
|
p->s.s = bufferpool_alloc(media_bufferpool, mp->raw.len + ext_len + RTP_BUFFER_TAIL_ROOM);
|
|
|
|
|
memcpy(p->s.s, mp->raw.s, mp->raw.len);
|
|
|
|
|
p->s.len = mp->raw.len;
|
|
|
|
|
p->free_func = bufferpool_unref;
|
|
|
|
|
p->rtp = (struct rtp_header *) p->s.s;
|
|
|
|
|
codec_add_raw_packet_common(mp, clockrate, p);
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
void codec_add_raw_packet(struct media_packet *mp, unsigned int clockrate) {
|
|
|
|
|
if (!mp->sink.rtpext->may_copy) {
|
|
|
|
|
codec_add_raw_packet_dup(mp, clockrate);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
struct codec_packet *p = g_new0(__typeof(*p), 1);
|
|
|
|
|
p->link.data = p;
|
|
|
|
|
p->s = mp->raw;
|
|
|
|
|
p->free_func = NULL;
|
|
|
|
|
codec_add_raw_packet_common(mp, clockrate, p);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static bool handler_silence_block(struct codec_handler *h, struct media_packet *mp) {
|
|
|
|
|
if (CALL_ISSET(mp->call, BLOCK_MEDIA) || ML_ISSET(mp->media->monologue, BLOCK_MEDIA) || mp->sink.attrs.block_media || MEDIA_ISSET(mp->media_out, BLOCK_EGRESS))
|
|
|
|
|
return false;
|
|
|
|
|
|