Browse Source

TT#146201 obsolete TRANSCODE flag entirely

Transcoding is flow-specific, so it doesn't make sense to have a flag
for it in a call_media section. Instead we use the transcoding flag set
on the call_subscription objects (on subscribers), and set/unset a flag
on the monologue struct, depending on whether any media flows (going to
subscribers) have transcoding enabled.

Change-Id: Id671d56e56a22eaa8e56f6d449770b0c7b086cea
pull/1682/head
Richard Fuchs 3 years ago
parent
commit
196e874c65
6 changed files with 22 additions and 8 deletions
  1. +18
    -1
      daemon/call.c
  2. +0
    -1
      daemon/call_interfaces.c
  3. +0
    -2
      daemon/codec.c
  4. +1
    -1
      include/call.h
  5. +2
    -2
      t/auto-daemon-tests-redis.pl
  6. +1
    -1
      t/test-transcode.c

+ 18
- 1
daemon/call.c View File

@ -228,7 +228,7 @@ next:
media_update_stats(media); media_update_stats(media);
ssrc_collect_metrics(media); ssrc_collect_metrics(media);
} }
if (MEDIA_ISSET(media, TRANSCODE))
if (media->monologue->transcoding)
hlp->transcoded_media++; hlp->transcoded_media++;
} }
@ -2739,6 +2739,19 @@ unsigned int proto_num_ports(unsigned int sp_ports, struct call_media *media, st
return sp_ports; return sp_ports;
} }
static int __sub_is_transcoding(gconstpointer p, gconstpointer dummy) {
const struct call_subscription *cs = p;
return cs->attrs.transcoding ? 0 : 1;
}
// set transcoding flag if any media flows are transcoding, otherwise unset it
static void set_monologue_flags_per_subscribers(struct call_monologue *ml) {
ml->transcoding = 0;
if (g_queue_find_custom(&ml->subscribers, __sub_is_transcoding, NULL))
ml->transcoding = 1;
}
/* called with call->master_lock held in W */ /* called with call->master_lock held in W */
int monologue_offer_answer(struct call_subscription *dialogue[2], GQueue *streams, int monologue_offer_answer(struct call_subscription *dialogue[2], GQueue *streams,
struct sdp_ng_flags *flags) struct sdp_ng_flags *flags)
@ -2878,6 +2891,9 @@ int monologue_offer_answer(struct call_subscription *dialogue[2], GQueue *stream
} }
} }
set_monologue_flags_per_subscribers(monologue);
set_monologue_flags_per_subscribers(other_ml);
__update_init_subscribers(other_ml, streams, flags, flags ? flags->opmode : OP_OFFER); __update_init_subscribers(other_ml, streams, flags, flags ? flags->opmode : OP_OFFER);
__update_init_subscribers(monologue, NULL, NULL, flags ? flags->opmode : OP_OFFER); __update_init_subscribers(monologue, NULL, NULL, flags ? flags->opmode : OP_OFFER);
@ -3255,6 +3271,7 @@ int monologue_subscribe_answer(struct call_monologue *dst_ml, struct sdp_ng_flag
for (GList *l = dst_ml->subscriptions.head; l; l = l->next) { for (GList *l = dst_ml->subscriptions.head; l; l = l->next) {
struct call_subscription *cs = l->data; struct call_subscription *cs = l->data;
struct call_monologue *src_ml = cs->monologue; struct call_monologue *src_ml = cs->monologue;
set_monologue_flags_per_subscribers(src_ml);
__update_init_subscribers(src_ml, NULL, NULL, flags->opmode); __update_init_subscribers(src_ml, NULL, NULL, flags->opmode);
dialogue_unkernelize(src_ml, "subscribe answer event"); dialogue_unkernelize(src_ml, "subscribe answer event");
} }


+ 0
- 1
daemon/call_interfaces.c View File

@ -2290,7 +2290,6 @@ static void ng_stats_media(bencode_item_t *list, const struct call_media *m,
BF_M("ICE-lite peer", ICE_LITE_PEER); BF_M("ICE-lite peer", ICE_LITE_PEER);
BF_M("unidirectional", UNIDIRECTIONAL); BF_M("unidirectional", UNIDIRECTIONAL);
BF_M("loop check", LOOP_CHECK); BF_M("loop check", LOOP_CHECK);
BF_M("transcoding", TRANSCODE);
BF_M("generator/sink", GENERATOR); BF_M("generator/sink", GENERATOR);
stats: stats:


+ 0
- 2
daemon/codec.c View File

@ -1010,7 +1010,6 @@ void codec_handlers_update(struct call_media *receiver, struct call_media *sink,
if (sub) if (sub)
sub->attrs.transcoding = 0; sub->attrs.transcoding = 0;
MEDIA_CLEAR(receiver, TRANSCODE);
MEDIA_CLEAR(receiver, GENERATOR); MEDIA_CLEAR(receiver, GENERATOR);
MEDIA_CLEAR(sink, GENERATOR); MEDIA_CLEAR(sink, GENERATOR);
@ -1388,7 +1387,6 @@ next:
if (is_transcoding) { if (is_transcoding) {
if (sub) if (sub)
sub->attrs.transcoding = 1; sub->attrs.transcoding = 1;
MEDIA_SET(receiver, TRANSCODE);
if (!use_audio_player) { if (!use_audio_player) {
// we have to translate RTCP packets // we have to translate RTCP packets


+ 1
- 1
include/call.h View File

@ -179,7 +179,6 @@ enum {
#define MEDIA_FLAG_ICE_LITE_PEER SHARED_FLAG_ICE_LITE_PEER #define MEDIA_FLAG_ICE_LITE_PEER SHARED_FLAG_ICE_LITE_PEER
#define MEDIA_FLAG_ICE_CONTROLLING 0x00200000 #define MEDIA_FLAG_ICE_CONTROLLING 0x00200000
#define MEDIA_FLAG_LOOP_CHECK 0x00400000 #define MEDIA_FLAG_LOOP_CHECK 0x00400000
#define MEDIA_FLAG_TRANSCODE 0x00800000
#define MEDIA_FLAG_PTIME_OVERRIDE 0x01000000 #define MEDIA_FLAG_PTIME_OVERRIDE 0x01000000
#define MEDIA_FLAG_RTCP_FB SHARED_FLAG_RTCP_FB #define MEDIA_FLAG_RTCP_FB SHARED_FLAG_RTCP_FB
#define MEDIA_FLAG_GENERATOR 0x02000000 #define MEDIA_FLAG_GENERATOR 0x02000000
@ -541,6 +540,7 @@ struct call_monologue {
unsigned int dtmf_injection_active:1; unsigned int dtmf_injection_active:1;
unsigned int detect_dtmf:1; unsigned int detect_dtmf:1;
unsigned int no_recording:1; unsigned int no_recording:1;
unsigned int transcoding:1;
}; };
struct call_iterator_list { struct call_iterator_list {


+ 2
- 2
t/auto-daemon-tests-redis.pl View File

@ -1579,8 +1579,8 @@ a=rtcp:PORT
SDP SDP
$json_exp->{'media-0'}{media_flags} = '10682380';
$json_exp->{'media-1'}{media_flags} = '8454156';
$json_exp->{'media-0'}{media_flags} = '2293772';
$json_exp->{'media-1'}{media_flags} = '65548';
$json_exp->{'media-2'}{format_str} = '8'; $json_exp->{'media-2'}{format_str} = '8';
$json_exp->{'media-2'}{media_flags} = '2162692'; $json_exp->{'media-2'}{media_flags} = '2162692';
$json_exp->{'media-3'}{format_str} = '8'; $json_exp->{'media-3'}{format_str} = '8';


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

@ -260,7 +260,7 @@ static void __packet_seq_ts(const char *file, int line, struct call_media *media
.sfd = &sfd, .sfd = &sfd,
}; };
// from __stream_ssrc() // from __stream_ssrc()
if (!MEDIA_ISSET(media, TRANSCODE))
if (!media->monologue->transcoding)
mp.ssrc_in->ssrc_map_out = ntohl(ssrc); mp.ssrc_in->ssrc_map_out = ntohl(ssrc);
mp.ssrc_out = get_ssrc_ctx(mp.ssrc_in->ssrc_map_out, other_media->monologue->ssrc_hash, SSRC_DIR_OUTPUT, NULL); mp.ssrc_out = get_ssrc_ctx(mp.ssrc_in->ssrc_map_out, other_media->monologue->ssrc_hash, SSRC_DIR_OUTPUT, NULL);
payload_tracker_add(&mp.ssrc_in->tracker, pt_in & 0x7f); payload_tracker_add(&mp.ssrc_in->tracker, pt_in & 0x7f);


Loading…
Cancel
Save