diff --git a/daemon/media_player.c b/daemon/media_player.c index 7b91b11bf..aa22b4d3e 100644 --- a/daemon/media_player.c +++ b/daemon/media_player.c @@ -284,23 +284,32 @@ void send_timer_push(struct send_timer *st, struct codec_packet *cp) { -int media_player_setup(struct media_player *mp, const struct rtp_payload_type *src_pt) { - // find suitable output payload type - struct rtp_payload_type *dst_pt; +// find suitable output payload type +static struct rtp_payload_type *media_player_get_dst_pt(struct media_player *mp) { + struct rtp_payload_type *dst_pt = NULL; for (GList *l = mp->media->codecs.codec_prefs.head; l; l = l->next) { dst_pt = l->data; ensure_codec_def(dst_pt, mp->media); if (dst_pt->codec_def && !dst_pt->codec_def->supplemental) goto found; } - dst_pt = NULL; -found: if (!dst_pt) { ilog(LOG_ERR, "No supported output codec found in SDP"); - return -1; + return NULL; } +found: ilog(LOG_DEBUG, "Output codec for media playback is " STR_FORMAT, STR_FMT(&dst_pt->encoding_with_params)); + return dst_pt; +} + +int media_player_setup(struct media_player *mp, const struct rtp_payload_type *src_pt, + const struct rtp_payload_type *dst_pt) +{ + if (!dst_pt) + dst_pt = media_player_get_dst_pt(mp); + if (!dst_pt) + return -1; // if we played anything before, scale our sync TS according to the time // that has passed @@ -332,7 +341,7 @@ found: #define CODECPAR codec #endif -static int __ensure_codec_handler(struct media_player *mp, AVStream *avs) { +static int __ensure_codec_handler(struct media_player *mp, AVStream *avs, const struct rtp_payload_type *dst_pt) { if (mp->handler) return 0; @@ -348,7 +357,7 @@ static int __ensure_codec_handler(struct media_player *mp, AVStream *avs) { src_pt.clock_rate = avs->CODECPAR->sample_rate; codec_init_payload_type(&src_pt, MT_AUDIO); - if (media_player_setup(mp, &src_pt)) + if (media_player_setup(mp, &src_pt, dst_pt)) return -1; mp->duration = avs->duration * 1000 * avs->time_base.num / avs->time_base.den; @@ -524,7 +533,10 @@ static void media_player_play_start(struct media_player *mp, long long repeat, l ilog(LOG_ERR, "No AVStream present in format context"); return; } - if (__ensure_codec_handler(mp, avs)) + const struct rtp_payload_type *dst_pt = media_player_get_dst_pt(mp); + if (!dst_pt) + return; + if (__ensure_codec_handler(mp, avs, dst_pt)) return; mp->next_run = rtpe_now; diff --git a/daemon/t38.c b/daemon/t38.c index 20eb61428..3185c136a 100644 --- a/daemon/t38.c +++ b/daemon/t38.c @@ -459,7 +459,7 @@ void t38_gateway_start(struct t38_gateway *tg) { // set up our player first media_player_set_media(tg->pcm_player, tg->pcm_media); - if (media_player_setup(tg->pcm_player, &tg->pcm_pt)) + if (media_player_setup(tg->pcm_player, &tg->pcm_pt, NULL)) return; // now start our player if we can or should diff --git a/include/media_player.h b/include/media_player.h index 61947ca11..60e42e09b 100644 --- a/include/media_player.h +++ b/include/media_player.h @@ -92,7 +92,8 @@ int media_player_play_blob(struct media_player *, const str *, long long, long l int media_player_play_db(struct media_player *, long long, long long, long long); long long media_player_stop(struct media_player *); -int media_player_setup(struct media_player *mp, const struct rtp_payload_type *src_pt); +int media_player_setup(struct media_player *mp, const struct rtp_payload_type *src_pt, + const struct rtp_payload_type *dst_pt); void media_player_set_media(struct media_player *mp, struct call_media *media); void media_player_add_packet(struct media_player *mp, char *buf, size_t len, long long us_dur, unsigned long long pts);