Browse Source

MT#55283 separate destination PT determination

Split out the logic to determine the destination payload type into a
separate functions. This makes it possible to supply a different, or
pre-determined, payload type instead.

Change-Id: I9b67b29cafc0c6ce4e18eede64dea3d1973f8b63
pull/1592/head
Richard Fuchs 3 years ago
parent
commit
70ef2f1a02
3 changed files with 24 additions and 11 deletions
  1. +21
    -9
      daemon/media_player.c
  2. +1
    -1
      daemon/t38.c
  3. +2
    -1
      include/media_player.h

+ 21
- 9
daemon/media_player.c View File

@ -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;


+ 1
- 1
daemon/t38.c View File

@ -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


+ 2
- 1
include/media_player.h View File

@ -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);


Loading…
Cancel
Save