Browse Source

MT#55283 convert packets_out to iqueue

Change-Id: Iff72ab45cd3d4f6579180b5ed121a1779ee8285b
pull/2025/head
Richard Fuchs 4 weeks ago
parent
commit
ef8967dafe
7 changed files with 18 additions and 25 deletions
  1. +2
    -6
      daemon/codec.c
  2. +1
    -1
      daemon/media_player.c
  3. +7
    -11
      daemon/media_socket.c
  4. +5
    -1
      include/codec.h
  5. +1
    -1
      include/media_socket.h
  6. +1
    -3
      include/types.h
  7. +1
    -2
      t/test-transcode.c

+ 2
- 6
daemon/codec.c View File

@ -2143,12 +2143,11 @@ static void codec_add_raw_packet_common(struct media_packet *mp, unsigned int cl
if (!p->rtp)
p->rtp = mp->rtp;
}
t_queue_push_tail_link(&mp->packets_out, &p->link);
i_queue_push_tail(&mp->packets_out, p);
}
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
// or for RTP header extensions
@ -2177,7 +2176,6 @@ void codec_add_raw_packet(struct media_packet *mp, unsigned int 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);
@ -2483,7 +2481,6 @@ void codec_output_rtp(struct media_packet *mp, struct codec_scheduler *csch,
// add to output queue
struct codec_packet *p = g_new0(__typeof(*p), 1);
p->link.data = p;
p->s.s = buf;
p->s.len = payload_len + sizeof(struct rtp_header) + ext_len;
payload_tracker_add(&ssrc_out->tracker, handler->dest_pt.payload_type);
@ -2563,7 +2560,7 @@ send:
p->ttq_entry.when / 1000000,
p->ttq_entry.when % 1000000);
t_queue_push_tail_link(&mp->packets_out, &p->link);
i_queue_push_tail(&mp->packets_out, p);
}
// returns new reference
@ -2923,7 +2920,6 @@ bool codec_packet_copy(struct codec_packet *p) {
struct codec_packet *codec_packet_dup(struct codec_packet *p) {
struct codec_packet *dup = g_new(__typeof(*p), 1);
*dup = *p;
dup->link.data = dup; // XXX obsolete this
codec_packet_copy(dup);
if (dup->ssrc_out)
ssrc_entry_hold(dup->ssrc_out);


+ 1
- 1
daemon/media_player.c View File

@ -1073,7 +1073,7 @@ void media_player_add_packet(struct media_player *mp, char *buf, size_t len,
// keep track of RTP timestamps and real clock. look at the last packet we received
// and update our sync TS.
if (packet.packets_out.head) {
struct codec_packet *p = packet.packets_out.head->data;
struct codec_packet *p = packet.packets_out.head;
if (p->rtp) {
mp->sync_ts = ntohl(p->rtp->timestamp);
mp->sync_ts_tv = p->ttq_entry.when;


+ 7
- 11
daemon/media_socket.c View File

@ -3063,8 +3063,7 @@ int media_packet_encrypt(rewrite_func encrypt_func, struct packet_stream *out, s
LOCK(&out->lock);
for (__auto_type l = mp->packets_out.head; l; l = l->next) {
struct codec_packet *p = l->data;
IQUEUE_FOREACH(&mp->packets_out, p) {
if (mp->call->recording && rtpe_config.rec_egress && CALL_ISSET(mp->call, RECORDING_ON)) {
p->plain = STR_LEN(bufferpool_alloc(media_bufferpool, p->s.len), p->s.len);
memcpy(p->plain.s, p->s.s, p->s.len);
@ -3355,8 +3354,7 @@ static int do_rtcp_output(struct packet_handler_ctx *phc) {
// only frees the output queue if no `sink` is given
int media_socket_dequeue(struct media_packet *mp, struct packet_stream *sink) {
while (mp->packets_out.length) {
codec_packet_list *link = t_queue_pop_head_link(&mp->packets_out);
__auto_type p = link->data;
__auto_type p = i_queue_pop_head(&mp->packets_out);
if (sink && sink->send_timer)
send_timer_push(sink->send_timer, p);
else
@ -3367,7 +3365,7 @@ int media_socket_dequeue(struct media_packet *mp, struct packet_stream *sink) {
void media_packet_copy(struct media_packet *dst, const struct media_packet *src) {
*dst = *src;
t_queue_init(&dst->packets_out);
i_queue_init(&dst->packets_out);
if (dst->sfd)
obj_hold(dst->sfd);
if (dst->ssrc_in)
@ -3393,8 +3391,7 @@ void media_packet_release(struct media_packet *mp) {
static int media_packet_queue_dup(codec_packet_q *q) {
for (__auto_type l = q->head; l; l = l->next) {
struct codec_packet *p = l->data;
IQUEUE_FOREACH(q, p) {
if (p->free_func) // nothing to do, already private
continue;
if (!codec_packet_copy(p))
@ -3645,7 +3642,7 @@ static int stream_packet(struct packet_handler_ctx *phc) {
{
struct packet_handler_ctx mirror_phc = *phc;
mirror_phc.mp.ssrc_out = NULL;
t_queue_init(&mirror_phc.mp.packets_out);
i_queue_init(&mirror_phc.mp.packets_out);
struct sink_handler *mirror_sh = mirror_link->data;
struct packet_stream *mirror_sink = mirror_sh->sink;
@ -3654,10 +3651,9 @@ static int stream_packet(struct packet_handler_ctx *phc) {
media_packet_rtp_out(&mirror_phc, mirror_sh);
media_packet_set_encrypt(&mirror_phc, mirror_sh);
for (__auto_type pack = phc->mp.packets_out.head; pack; pack = pack->next) {
struct codec_packet *p = pack->data;
IQUEUE_FOREACH(&phc->mp.packets_out, p) {
__auto_type dup = codec_packet_dup(p);
t_queue_push_tail_link(&mirror_phc.mp.packets_out, &dup->link);
i_queue_push_tail(&mirror_phc.mp.packets_out, dup);
}
ret = __media_packet_encrypt(&mirror_phc, mirror_sh);


+ 5
- 1
include/codec.h View File

@ -12,6 +12,7 @@
#include "timerthread.h"
#include "types.h"
#include "ssrc.h"
#include "iqueue.h"
struct call_media;
struct codec_handler;
@ -89,7 +90,7 @@ struct codec_handler {
struct codec_packet {
struct timerthread_queue_entry ttq_entry;
codec_packet_list link;
IQUEUE_LINK link;
str s;
str plain;
struct rtp_header *rtp;
@ -100,6 +101,9 @@ struct codec_packet {
void (*plain_free_func)(void *);
};
typedef IQUEUE_TYPE(struct codec_packet, link) codec_packet_q;
struct codec_scheduler {
unsigned long first_ts; // for output TS scaling
unsigned long last_ts; // to detect input lag and handle lost packets


+ 1
- 1
include/media_socket.h View File

@ -12,7 +12,7 @@
#include "crypto.h"
#include "socket.h"
#include "containers.h"
#include "types.h"
#include "codec.h"
#include "xt_RTPENGINE.h"
#include "common_stats.h"


+ 1
- 3
include/types.h View File

@ -56,6 +56,7 @@ typedef union {
} parser_arg __attribute__ ((__transparent_union__));
#include "containers.h"
#include "iqueue.h"
struct sdp_session;
TYPED_GQUEUE(sdp_sessions, struct sdp_session)
@ -79,9 +80,6 @@ struct codec_pipeline_index;
TYPED_GHASHTABLE_PROTO(transcode_config_ht, struct codec_pipeline_index, struct transcode_config)
TYPED_GQUEUE(transcode_config, struct transcode_config)
struct codec_packet;
TYPED_GQUEUE(codec_packet, struct codec_packet)
struct packet_stream;
TYPED_GQUEUE(packet_stream, struct packet_stream)


+ 1
- 2
t/test-transcode.c View File

@ -313,8 +313,7 @@ static void __packet_seq_ts(const char *file, int line, struct call_media *media
printf("no packet\n");
abort();
}
__auto_type link = t_queue_pop_head_link(&mp.packets_out);
__auto_type cp = link->data;
__auto_type cp = i_queue_pop_head(&mp.packets_out);
str cp_s = cp->s;
rtp = (void *) cp_s.s;
if (rtp->m_pt != (unsigned char) pt_out) {


Loading…
Cancel
Save