--- main/format_cap.c (Asterisk 13.5.0) +++ main/format_cap.c (working copy) @@ -469,6 +469,7 @@ if (result && result->framing) { framing = result->framing; + ast_format_set_current_ms(result->format, framing); } return framing; --- main/format.c (Asterisk 13.5.0) +++ main/format.c (working copy) @@ -51,6 +51,8 @@ void *attribute_data; /*! \brief Pointer to the optional format interface */ const struct ast_format_interface *interface; + /*! \brief Current length of media that can be carried (in milliseconds) in a frame; for example the negotiated ptime in SIP/SDP */ + unsigned int current_ms; }; /*! \brief Structure used when registering a format interface */ @@ -371,6 +373,21 @@ return format->codec->maximum_ms; } +unsigned int ast_format_frame_blocks(const struct ast_format *format) +{ + if (format->current_ms) { + /* ceil (without double), required by Speex (RFC 5574 section 5.4) */ + return (format->current_ms + ast_format_get_minimum_ms(format) - 1) / ast_format_get_minimum_ms(format); + } + return (ast_format_get_default_ms(format) / ast_format_get_minimum_ms(format)); +} + +void ast_format_set_current_ms(struct ast_format *format, const unsigned int ms) +{ + //ast_log(LOG_NOTICE, "%u, %s\n", ms, ast_format_get_name(format)); + format->current_ms = ms; +} + unsigned int ast_format_get_minimum_bytes(const struct ast_format *format) { return format->codec->minimum_bytes; --- include/asterisk/format.h (Asterisk 13.5.0) +++ include/asterisk/format.h (working copy) @@ -358,6 +358,8 @@ * \return minimum expected bytes in a frame for this format */ unsigned int ast_format_get_minimum_bytes(const struct ast_format *format); +unsigned int ast_format_frame_blocks(const struct ast_format *format); +void ast_format_set_current_ms(struct ast_format *format, const unsigned int ms); /*! * \brief Get the sample rate of a media format