From: Joshua Colp Date: Wed, 26 Apr 2017 10:38:31 +0000 (+0000) Subject: frame: Better handle interpolated frames. X-Git-Tag: 13.16.0-rc1~24^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ae696132a27238b432cfd532e14e5b7aa2c0f247;p=thirdparty%2Fasterisk.git frame: Better handle interpolated frames. Interpolated frames are frames which contain a number of samples but have no actual data. Audiohooks did not handle this case when translating an incoming frame into signed linear. It assumed that a frame would always contain media when it may not. If this occurs audiohooks will now immediately return and not act on the frame. As well for users of ast_trans_frameout the function has been changed to be a bit more sane and ensure that the data pointer on a frame is set to NULL if no data is actually on the frame. This allows the various spots in Asterisk that check for an interpolated frame based on the presence of a data pointer to work as expected. ASTERISK-26926 Change-Id: I7fa22f631fa28d540722ed789ce28e84c7f8662b --- diff --git a/main/audiohook.c b/main/audiohook.c index 0a2f6c2f7c..869cb750e8 100644 --- a/main/audiohook.c +++ b/main/audiohook.c @@ -942,6 +942,15 @@ static struct ast_frame *audio_audiohook_write_list(struct ast_channel *chan, st if (!(middle_frame = audiohook_list_translate_to_slin(audiohook_list, direction, start_frame))) { return frame; } + + /* If the translation resulted in an interpolated frame then immediately return as audiohooks + * rely on actual media being present to do things. + */ + if (!middle_frame->data.ptr) { + ast_frfree(middle_frame); + return start_frame; + } + samples = middle_frame->samples; /* diff --git a/main/translate.c b/main/translate.c index 73e03a82e0..e1a7d9f416 100644 --- a/main/translate.c +++ b/main/translate.c @@ -444,8 +444,14 @@ struct ast_frame *ast_trans_frameout(struct ast_trans_pvt *pvt, } if (datalen) { f->datalen = datalen; + f->data.ptr = pvt->outbuf.c; } else { f->datalen = pvt->datalen; + if (!f->datalen) { + f->data.ptr = NULL; + } else { + f->data.ptr = pvt->outbuf.c; + } pvt->datalen = 0; }