Browse Source

TT#50652 keep existing SSRC context when starting another playback

Change-Id: Ia4e64c39f870d0481847a67dd9c8dac1531e822d
changes/61/27761/2
Richard Fuchs 7 years ago
parent
commit
7e85d1a935
2 changed files with 15 additions and 8 deletions
  1. +6
    -2
      daemon/codec.c
  2. +9
    -6
      daemon/media_player.c

+ 6
- 2
daemon/codec.c View File

@ -65,6 +65,7 @@ struct codec_ssrc_handler {
struct timeval first_send; struct timeval first_send;
unsigned long first_send_ts; unsigned long first_send_ts;
GString *sample_buffer; GString *sample_buffer;
int rtp_mark:1;
}; };
struct transcode_packet { struct transcode_packet {
seq_packet_t p; // must be first seq_packet_t p; // must be first
@ -189,7 +190,9 @@ struct codec_handler *codec_handler_make_playback(struct rtp_payload_type *src_p
handler->dest_pt = *dst_pt; handler->dest_pt = *dst_pt;
handler->func = handler_func_playback; handler->func = handler_func_playback;
handler->ssrc_handler = (void *) __ssrc_handler_transcode_new(handler); handler->ssrc_handler = (void *) __ssrc_handler_transcode_new(handler);
handler->ssrc_handler->first_ts = random();
while (handler->ssrc_handler->first_ts == 0)
handler->ssrc_handler->first_ts = random();
handler->ssrc_handler->rtp_mark = 1;
ilog(LOG_DEBUG, "Created media playback context for " STR_FORMAT " -> " STR_FORMAT "", ilog(LOG_DEBUG, "Created media playback context for " STR_FORMAT " -> " STR_FORMAT "",
STR_FMT(&src_pt->encoding_with_params), STR_FMT(&src_pt->encoding_with_params),
@ -1070,8 +1073,9 @@ static int __packet_encoded(encoder_t *enc, void *u1, void *u2) {
ilog(LOG_DEBUG, "Received packet of %i bytes from packetizer", inout.len); ilog(LOG_DEBUG, "Received packet of %i bytes from packetizer", inout.len);
__output_rtp(mp, ch, ch->handler, buf, inout.len, ch->first_ts __output_rtp(mp, ch, ch->handler, buf, inout.len, ch->first_ts
+ enc->avpkt.pts / enc->def->clockrate_mult, + enc->avpkt.pts / enc->def->clockrate_mult,
0, -1, seq_off);
ch->rtp_mark ? 1 : 0, -1, seq_off);
mp->iter++; mp->iter++;
ch->rtp_mark = 0;
if (ret == 0) { if (ret == 0) {
// no more to go // no more to go


+ 9
- 6
daemon/media_player.c View File

@ -40,9 +40,6 @@ static void media_player_shutdown(struct media_player *mp) {
if (mp->handler) if (mp->handler)
codec_handler_free(mp->handler); codec_handler_free(mp->handler);
mp->handler = NULL; mp->handler = NULL;
if (mp->ssrc_out)
obj_put(&mp->ssrc_out->parent->h);
mp->ssrc_out = NULL;
if (mp->avioctx) { if (mp->avioctx) {
if (mp->avioctx->buffer) if (mp->avioctx->buffer)
av_freep(&mp->avioctx->buffer); av_freep(&mp->avioctx->buffer);
@ -70,6 +67,9 @@ static void __media_player_free(void *p) {
ilog(LOG_DEBUG, "freeing media_player"); ilog(LOG_DEBUG, "freeing media_player");
media_player_shutdown(mp); media_player_shutdown(mp);
if (mp->ssrc_out)
obj_put(&mp->ssrc_out->parent->h);
mp->ssrc_out = NULL;
mutex_destroy(&mp->lock); mutex_destroy(&mp->lock);
obj_put(mp->call); obj_put(mp->call);
} }
@ -81,6 +81,11 @@ struct media_player *media_player_new(struct call_monologue *ml) {
#ifdef WITH_TRANSCODING #ifdef WITH_TRANSCODING
ilog(LOG_DEBUG, "creating media_player"); ilog(LOG_DEBUG, "creating media_player");
uint32_t ssrc = 0;
while (ssrc == 0)
ssrc = random();
struct ssrc_ctx *ssrc_ctx = get_ssrc_ctx(ssrc, ml->call->ssrc_hash, SSRC_DIR_OUTPUT);
struct media_player *mp = obj_alloc0("media_player", sizeof(*mp), __media_player_free); struct media_player *mp = obj_alloc0("media_player", sizeof(*mp), __media_player_free);
mp->tt_obj.tt = &media_player_thread; mp->tt_obj.tt = &media_player_thread;
@ -88,6 +93,7 @@ struct media_player *media_player_new(struct call_monologue *ml) {
mp->call = obj_get(ml->call); mp->call = obj_get(ml->call);
mp->ml = ml; mp->ml = ml;
mp->seq = random(); mp->seq = random();
mp->ssrc_out = ssrc_ctx;
av_init_packet(&mp->pkt); av_init_packet(&mp->pkt);
mp->pkt.data = NULL; mp->pkt.data = NULL;
@ -216,9 +222,6 @@ found:
mp->handler = codec_handler_make_playback(&src_pt, dst_pt); mp->handler = codec_handler_make_playback(&src_pt, dst_pt);
if (!mp->handler) if (!mp->handler)
return -1; return -1;
mp->ssrc_out = get_ssrc_ctx(random(), mp->call->ssrc_hash, SSRC_DIR_OUTPUT);
if (!mp->ssrc_out)
return -1;
mp->duration = avs->duration * 1000 * avs->time_base.num / avs->time_base.den; mp->duration = avs->duration * 1000 * avs->time_base.num / avs->time_base.den;


Loading…
Cancel
Save