aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
Diffstat (limited to 'include')
-rw-r--r--include/asterisk/frame.h13
-rw-r--r--include/asterisk/translate.h23
2 files changed, 33 insertions, 3 deletions
diff --git a/include/asterisk/frame.h b/include/asterisk/frame.h
index 1a66068c3..c4d5832f1 100644
--- a/include/asterisk/frame.h
+++ b/include/asterisk/frame.h
@@ -122,6 +122,15 @@ enum ast_frame_type {
};
#define AST_FRAME_DTMF AST_FRAME_DTMF_END
+enum {
+ /*! This frame contains valid timing information */
+ AST_FRFLAG_HAS_TIMING_INFO = (1 << 0),
+ /*! This frame came from a translator and is still the original frame.
+ * The translator can not be free'd if the frame inside of it still has
+ * this flag set. */
+ AST_FRFLAG_FROM_TRANSLATOR = (1 << 1),
+};
+
/*! \brief Data structure associated with a single frame of data
*/
struct ast_frame {
@@ -147,8 +156,8 @@ struct ast_frame {
struct timeval delivery;
/*! For placing in a linked list */
AST_LIST_ENTRY(ast_frame) frame_list;
- /*! Timing data flag */
- int has_timing_info;
+ /*! Misc. frame flags */
+ unsigned int flags;
/*! Timestamp in milliseconds */
long ts;
/*! Length in milliseconds */
diff --git a/include/asterisk/translate.h b/include/asterisk/translate.h
index 48b5bf091..b1f615f7f 100644
--- a/include/asterisk/translate.h
+++ b/include/asterisk/translate.h
@@ -138,7 +138,14 @@ struct ast_trans_pvt {
struct ast_translator *t;
struct ast_frame f; /*!< used in frameout */
int samples; /*!< samples available in outbuf */
- int datalen; /*!< actual space used in outbuf */
+ /*!
+ * \brief actual space used in outbuf
+ *
+ * Also, for the sake of ABI compatability, a magic value of -1 in this
+ * field means that the pvt has been requested to be destroyed, but is
+ * pending destruction until ast_translate_frame_freed() gets called.
+ */
+ int datalen;
void *pvt; /*!< more private data, if any */
char *outbuf; /*!< the useful portion of the buffer */
plc_state_t *plc; /*!< optional plc pointer */
@@ -250,6 +257,20 @@ unsigned int ast_translate_path_steps(unsigned int dest, unsigned int src);
*/
unsigned int ast_translate_available_formats(unsigned int dest, unsigned int src);
+/*!
+ * \brief Hint that a frame from a translator has been freed
+ *
+ * This is sort of a hack. This function gets called when ast_frame_free() gets
+ * called on a frame that has the AST_FRFLAG_FROM_TRANSLATOR flag set. This is
+ * because it is possible for a translation path to be destroyed while a frame
+ * from a translator is still in use. Specifically, this happens if a masquerade
+ * happens after a call to ast_read() but before the frame is done being processed,
+ * since the frame processing is generally done without the channel lock held.
+ *
+ * \return nothing
+ */
+void ast_translate_frame_freed(struct ast_frame *fr);
+
#if defined(__cplusplus) || defined(c_plusplus)
}
#endif