#include <sys/time.h>
#include "asterisk/format_pref.h"
#include "asterisk/format.h"
#include "asterisk/endian.h"
#include "asterisk/linkedlists.h"

Go to the source code of this file.
Definition in file frame.h.
| #define ast_frame_byteswap_be | ( | fr | ) | do { ; } while(0) |
| #define ast_frame_byteswap_le | ( | fr | ) | do { struct ast_frame *__f = (fr); ast_swapcopy_samples(__f->data.ptr, __f->data.ptr, __f->samples); } while(0) |
| #define AST_FRAME_DTMF AST_FRAME_DTMF_END |
Definition at line 124 of file frame.h.
Referenced by __adsi_transmit_messages(), __analog_ss_thread(), __ast_play_and_record(), action_atxfer(), action_dahdidialoffhook(), agent_ack_sleep(), analog_ss_thread(), ast_audiohook_write_list(), ast_dsp_process(), ast_generic_bridge(), ast_jb_put(), background_detect_exec(), cb_events(), channel_spy(), cli_console_dial(), conf_run(), console_dial(), dictate_exec(), disa_exec(), do_immediate_setup(), echo_exec(), eivr_comm(), fax_detect_framehook(), feature_request_and_dial(), gtalk_handle_dtmf(), handle_recordfile(), handle_request(), handle_request_info(), handle_speechrecognize(), iax2_bridge(), jingle_handle_dtmf(), mgcp_rtp_read(), misdn_bridge(), mp3_exec(), NBScat_exec(), oh323_rtp_read(), phone_exception(), process_ast_dsp(), receive_dtmf_digits(), record_exec(), rpt(), rpt_call(), rpt_exec(), send_waveform_to_channel(), sip_rtp_read(), speech_background(), unistim_do_senddigit(), unistim_senddigit_end(), volume_callback(), wait_for_answer(), and wait_for_winner().
| #define AST_FRAME_SET_BUFFER | ( | fr, | |||
| _base, | |||||
| _ofs, | |||||
| _datalen | ) |
Value:
{ \
(fr)->data.ptr = (char *)_base + (_ofs); \
(fr)->offset = (_ofs); \
(fr)->datalen = (_datalen); \
}
Definition at line 179 of file frame.h.
Referenced by fax_generator_generate(), g719read(), g723_read(), g726_read(), g729_read(), generic_read(), gsm_read(), h263_read(), h264_read(), ilbc_read(), ogg_vorbis_read(), pcm_read(), siren14read(), siren7read(), spandsp_fax_gw_t30_gen(), spandsp_fax_read(), t38_tx_packet_handler(), vox_read(), and wav_read().
| #define ast_frfree | ( | fr | ) | ast_frame_free(fr, 1) |
Definition at line 466 of file frame.h.
Referenced by __adsi_transmit_messages(), __analog_ss_thread(), __ast_answer(), __ast_play_and_record(), __ast_queue_frame(), __ast_read(), __ast_request_and_dial(), adsi_careful_send(), agent_ack_sleep(), agent_read(), analog_ss_thread(), ast_autoservice_stop(), ast_bridge_call(), ast_bridge_handle_trip(), ast_channel_clear_softhangup(), ast_channel_destructor(), ast_dsp_process(), ast_framehook_attach(), ast_generic_bridge(), ast_indicate_data(), ast_jb_destroy(), ast_jb_put(), ast_queue_cc_frame(), ast_readaudio_callback(), ast_readvideo_callback(), ast_recvtext(), ast_rtp_write(), ast_safe_sleep_conditional(), ast_send_image(), ast_slinfactory_destroy(), ast_slinfactory_feed(), ast_slinfactory_flush(), ast_slinfactory_read(), ast_tonepair(), ast_transfer(), ast_translate(), ast_udptl_bridge(), ast_waitfordigit_full(), ast_write(), ast_writestream(), async_agi_read_frame(), async_wait(), audio_audiohook_write_list(), audiohook_read_frame_helper(), autoservice_run(), background_detect_exec(), bridge_handle_dtmf(), channel_spy(), conf_flush(), conf_free(), conf_run(), create_jb(), dahdi_bridge(), dial_exec_full(), dictate_exec(), disa_exec(), disable_t38(), do_waiting(), echo_exec(), eivr_comm(), fax_detect_framehook(), fax_gateway_framehook(), feature_request_and_dial(), find_cache(), framehook_detach_and_destroy(), gen_generate(), generate_computational_cost(), generic_fax_exec(), handle_cli_file_convert(), handle_recordfile(), handle_speechrecognize(), hook_event_cb(), iax2_bridge(), ices_exec(), isAnsweringMachine(), jack_exec(), jb_empty_and_reset_adaptive(), jb_empty_and_reset_fixed(), jb_framedata_destroy(), jb_get_and_deliver(), local_bridge_loop(), manage_parked_call(), measurenoise(), moh_files_generator(), monitor_dial(), mp3_exec(), multicast_rtp_write(), NBScat_exec(), read_frame(), receive_dtmf_digits(), receivefax_t38_init(), record_exec(), recordthread(), remote_bridge_loop(), rpt(), rpt_exec(), run_agi(), send_tone_burst(), send_waveform_to_channel(), sendfax_t38_init(), sendurl_exec(), session_destroy(), softmix_translate_helper_cleanup(), softmix_translate_helper_free_entry(), spandsp_fax_gw_t30_gen(), speech_background(), spy_generate(), t38_tx_packet_handler(), transmit_audio(), transmit_t38(), wait_for_answer(), wait_for_hangup(), wait_for_winner(), waitforring_exec(), and waitstream_core().
| #define AST_FRIENDLY_OFFSET 64 |
Offset into a frame's data buffer.
By providing some "empty" space prior to the actual data of an ast_frame, this gives any consumer of the frame ample space to prepend other necessary information without having to create a new buffer.
As an example, RTP can use the data from an ast_frame and simply prepend the RTP header information into the space provided by AST_FRIENDLY_OFFSET instead of having to create a new buffer with the necessary space allocated.
Definition at line 200 of file frame.h.
Referenced by __get_from_jb(), adjust_frame_for_plc(), alsa_read(), ast_frdup(), ast_frisolate(), ast_prod(), ast_rtcp_read(), ast_rtp_read(), ast_smoother_read(), ast_trans_frameout(), ast_udptl_read(), conf_run(), dahdi_decoder_frameout(), dahdi_encoder_frameout(), dahdi_read(), fax_generator_generate(), g719read(), g723_read(), g726_read(), g729_read(), generic_read(), gsm_read(), h263_read(), h264_read(), hook_event_cb(), iax_frame_wrap(), ilbc_read(), jb_get_and_deliver(), linear_generator(), milliwatt_generate(), moh_generate(), mohalloc(), mp3_exec(), NBScat_exec(), newpvt(), ogg_vorbis_read(), oss_read(), pcm_read(), phone_read(), playtones_generator(), process_cn_rfc3389(), send_tone_burst(), send_waveform_to_channel(), siren14read(), siren7read(), sms_generate(), spandsp_fax_gw_t30_gen(), spandsp_fax_read(), tonepair_generator(), usbradio_read(), vox_read(), and wav_read().
| #define AST_HTML_BEGIN 4 |
| #define AST_HTML_DATA 2 |
| #define AST_HTML_END 8 |
| #define AST_HTML_LDCOMPLETE 16 |
Load is complete
Definition at line 226 of file frame.h.
Referenced by ast_frame_dump(), and sendurl_exec().
| #define AST_HTML_LINKREJECT 20 |
| #define AST_HTML_LINKURL 18 |
| #define AST_HTML_NOSUPPORT 17 |
Peer is unable to support HTML
Definition at line 228 of file frame.h.
Referenced by ast_frame_dump(), and sendurl_exec().
| #define AST_HTML_UNLINK 19 |
| #define AST_HTML_URL 1 |
Sending a URL
Definition at line 218 of file frame.h.
Referenced by ast_channel_sendurl(), ast_frame_dump(), and sip_sendhtml().
| #define AST_MALLOCD_DATA (1 << 1) |
Need the data be free'd?
Definition at line 206 of file frame.h.
Referenced by __frame_free(), ast_cc_build_frame(), ast_frisolate(), ast_sendtext(), and create_video_frame().
| #define AST_MALLOCD_HDR (1 << 0) |
Need the header be free'd?
Definition at line 204 of file frame.h.
Referenced by __frame_free(), ast_frame_header_new(), ast_frdup(), ast_frisolate(), and create_video_frame().
| #define AST_MALLOCD_SRC (1 << 2) |
Need the source be free'd? (haha!)
Definition at line 208 of file frame.h.
Referenced by __frame_free(), ast_frisolate(), and speex_callback().
| #define AST_MIN_OFFSET 32 |
| #define AST_MODEM_T38 1 |
T.38 Fax-over-IP
Definition at line 212 of file frame.h.
Referenced by ast_frame_dump(), ast_udptl_write(), fax_gateway_framehook(), generic_fax_exec(), spandsp_fax_gateway_process(), t38_tx_packet_handler(), transmit_t38(), and udptl_rx_packet().
| #define AST_MODEM_V150 2 |
| #define AST_OPTION_AUDIO_MODE 4 |
Set (or clear) Audio (Not-Clear) Mode Option data is a single signed char value 0 or 1
Definition at line 353 of file frame.h.
Referenced by ast_bridge_call(), dahdi_hangup(), dahdi_setoption(), and iax2_setoption().
| #define AST_OPTION_CC_AGENT_TYPE 17 |
Get the CC agent type from the channel (Read only) Option data is a character buffer of suitable length
Definition at line 420 of file frame.h.
Referenced by ast_channel_get_cc_agent_type(), and dahdi_queryoption().
| #define AST_OPTION_CHANNEL_WRITE 9 |
Handle channel write data If a channel needs to process the data from a func_channel write operation after func_channel_write executes, it can define the setoption callback and process this option. A pointer to an ast_chan_write_info_t will be passed.
Definition at line 384 of file frame.h.
Referenced by func_channel_write(), and local_setoption().
| #define AST_OPTION_DEVICE_NAME 16 |
Get the device name from the channel (Read only) Option data is a character buffer of suitable length
Definition at line 416 of file frame.h.
Referenced by ast_channel_get_device_name(), and sip_queryoption().
| #define AST_OPTION_DIGIT_DETECT 14 |
Get or set the digit detection state of the channel Option data is a single signed char value 0 or 1
Definition at line 408 of file frame.h.
Referenced by ast_bridge_call(), dahdi_queryoption(), dahdi_setoption(), iax2_setoption(), rcvfax_exec(), sip_queryoption(), sip_setoption(), and sndfax_exec().
| #define AST_OPTION_ECHOCAN 8 |
Explicitly enable or disable echo cancelation for the given channel Option data is a single signed char value 0 or 1
Definition at line 376 of file frame.h.
Referenced by dahdi_setoption().
| #define AST_OPTION_FAX_DETECT 15 |
Get or set the fax tone detection state of the channel Option data is a single signed char value 0 or 1
Definition at line 412 of file frame.h.
Referenced by ast_bridge_call(), dahdi_queryoption(), dahdi_setoption(), iax2_setoption(), rcvfax_exec(), and sndfax_exec().
| #define AST_OPTION_FLAG_REQUEST 0 |
| #define AST_OPTION_FORMAT_READ 11 |
Request that the channel driver deliver frames in a specific format Option data is a format_t
Definition at line 394 of file frame.h.
Referenced by set_format(), and sip_setoption().
| #define AST_OPTION_FORMAT_WRITE 12 |
Request that the channel driver be prepared to accept frames in a specific format Option data is a format_t
Definition at line 398 of file frame.h.
Referenced by set_format(), and sip_setoption().
| #define AST_OPTION_MAKE_COMPATIBLE 13 |
Request that the channel driver make two channels of the same tech type compatible if possible Option data is an ast_channel
Definition at line 404 of file frame.h.
Referenced by ast_channel_make_compatible_helper(), and sip_setoption().
| #define AST_OPTION_OPRMODE 7 |
Definition at line 369 of file frame.h.
Referenced by dahdi_setoption(), dial_exec_full(), and iax2_setoption().
| #define AST_OPTION_RELAXDTMF 3 |
Relax the parameters for DTMF reception (mainly for radio use) Option data is a single signed char value 0 or 1
Definition at line 349 of file frame.h.
Referenced by ast_bridge_call(), dahdi_setoption(), iax2_setoption(), and rpt().
| #define AST_OPTION_RXGAIN 6 |
Set channel receive gain Option data is a single signed char representing number of decibels (dB) to set gain to (on top of any gain specified in channel driver)
Definition at line 363 of file frame.h.
Referenced by dahdi_setoption(), func_channel_write_real(), iax2_setoption(), play_record_review(), reset_volumes(), set_talk_volume(), and vm_forwardoptions().
| #define AST_OPTION_SECURE_MEDIA 19 |
Definition at line 425 of file frame.h.
Referenced by iax2_queryoption(), iax2_setoption(), set_security_requirements(), sip_queryoption(), and sip_setoption().
| #define AST_OPTION_SECURE_SIGNALING 18 |
Get or set the security options on a channel Option data is an integer value of 0 or 1
Definition at line 424 of file frame.h.
Referenced by iax2_queryoption(), iax2_setoption(), set_security_requirements(), sip_queryoption(), and sip_setoption().
| #define AST_OPTION_T38_STATE 10 |
Definition at line 390 of file frame.h.
Referenced by ast_channel_get_t38_state(), local_queryoption(), and sip_queryoption().
| #define AST_OPTION_TDD 2 |
Put a compatible channel into TDD (TTY for the hearing-impared) mode Option data is a single signed char value 0 or 1
Definition at line 345 of file frame.h.
Referenced by analog_hangup(), ast_bridge_call(), dahdi_hangup(), dahdi_setoption(), handle_tddmode(), and iax2_setoption().
| #define AST_OPTION_TONE_VERIFY 1 |
Verify touchtones by muting audio transmission (and reception) and verify the tone is still present Option data is a single signed char value 0 or 1
Definition at line 341 of file frame.h.
Referenced by analog_hangup(), ast_bridge_call(), conf_run(), dahdi_hangup(), dahdi_setoption(), iax2_setoption(), rpt(), rpt_exec(), and try_calling().
| #define AST_OPTION_TXGAIN 5 |
Set channel transmit gain Option data is a single signed char representing number of decibels (dB) to set gain to (on top of any gain specified in channel driver)
Definition at line 358 of file frame.h.
Referenced by common_exec(), dahdi_setoption(), func_channel_write_real(), iax2_setoption(), reset_volumes(), and set_listen_volume().
| #define AST_SMOOTHER_FLAG_BE (1 << 1) |
| #define AST_SMOOTHER_FLAG_G729 (1 << 0) |
Definition at line 327 of file frame.h.
Referenced by __ast_smoother_feed(), ast_smoother_read(), format_list_init(), and smoother_frame_feed().
| anonymous enum |
Definition at line 126 of file frame.h.
00126 { 00127 /*! This frame contains valid timing information */ 00128 AST_FRFLAG_HAS_TIMING_INFO = (1 << 0), 00129 };
| AST_CONTROL_HANGUP | Other end has hungup |
| AST_CONTROL_RING | Local ring |
| AST_CONTROL_RINGING | Remote end is ringing |
| AST_CONTROL_ANSWER | Remote end has answered |
| AST_CONTROL_BUSY | Remote end is busy |
| AST_CONTROL_TAKEOFFHOOK | Make it go off hook |
| AST_CONTROL_OFFHOOK | Line is off hook |
| AST_CONTROL_CONGESTION | Congestion (circuits busy) |
| AST_CONTROL_FLASH | Flash hook |
| AST_CONTROL_WINK | Wink |
| AST_CONTROL_OPTION | Set a low-level option |
| AST_CONTROL_RADIO_KEY | Key Radio |
| AST_CONTROL_RADIO_UNKEY | Un-Key Radio |
| AST_CONTROL_PROGRESS | Indicate PROGRESS |
| AST_CONTROL_PROCEEDING | Indicate CALL PROCEEDING |
| AST_CONTROL_HOLD | Indicate call is placed on hold |
| AST_CONTROL_UNHOLD | Indicate call is left from hold |
| AST_CONTROL_VIDUPDATE | Indicate video frame update |
| _XXX_AST_CONTROL_T38 |
T38 state change request/notification
|
| AST_CONTROL_SRCUPDATE | Indicate source of media has changed |
| AST_CONTROL_TRANSFER | Indicate status of a transfer request |
| AST_CONTROL_CONNECTED_LINE | Indicate connected line has changed |
| AST_CONTROL_REDIRECTING | Indicate redirecting id has changed |
| AST_CONTROL_T38_PARAMETERS | T38 state change request/notification with parameters |
| AST_CONTROL_CC | Indication that Call completion service is possible |
| AST_CONTROL_SRCCHANGE | Media source has changed and requires a new RTP SSRC |
| AST_CONTROL_READ_ACTION | Tell ast_read to take a specific action |
| AST_CONTROL_AOC | Advice of Charge with encoded generic AOC payload |
| AST_CONTROL_END_OF_Q | Indicate that this position was the end of the channel queue for a softhangup. |
| AST_CONTROL_INCOMPLETE | Indication that the extension dialed is incomplete |
| AST_CONTROL_MCID | Indicate that the caller is being malicious. |
| AST_CONTROL_UPDATE_RTP_PEER | Interrupt the bridge and have it update the peer |
Definition at line 236 of file frame.h.
00236 { 00237 AST_CONTROL_HANGUP = 1, /*!< Other end has hungup */ 00238 AST_CONTROL_RING = 2, /*!< Local ring */ 00239 AST_CONTROL_RINGING = 3, /*!< Remote end is ringing */ 00240 AST_CONTROL_ANSWER = 4, /*!< Remote end has answered */ 00241 AST_CONTROL_BUSY = 5, /*!< Remote end is busy */ 00242 AST_CONTROL_TAKEOFFHOOK = 6, /*!< Make it go off hook */ 00243 AST_CONTROL_OFFHOOK = 7, /*!< Line is off hook */ 00244 AST_CONTROL_CONGESTION = 8, /*!< Congestion (circuits busy) */ 00245 AST_CONTROL_FLASH = 9, /*!< Flash hook */ 00246 AST_CONTROL_WINK = 10, /*!< Wink */ 00247 AST_CONTROL_OPTION = 11, /*!< Set a low-level option */ 00248 AST_CONTROL_RADIO_KEY = 12, /*!< Key Radio */ 00249 AST_CONTROL_RADIO_UNKEY = 13, /*!< Un-Key Radio */ 00250 AST_CONTROL_PROGRESS = 14, /*!< Indicate PROGRESS */ 00251 AST_CONTROL_PROCEEDING = 15, /*!< Indicate CALL PROCEEDING */ 00252 AST_CONTROL_HOLD = 16, /*!< Indicate call is placed on hold */ 00253 AST_CONTROL_UNHOLD = 17, /*!< Indicate call is left from hold */ 00254 AST_CONTROL_VIDUPDATE = 18, /*!< Indicate video frame update */ 00255 _XXX_AST_CONTROL_T38 = 19, /*!< T38 state change request/notification \deprecated This is no longer supported. Use AST_CONTROL_T38_PARAMETERS instead. */ 00256 AST_CONTROL_SRCUPDATE = 20, /*!< Indicate source of media has changed */ 00257 AST_CONTROL_TRANSFER = 21, /*!< Indicate status of a transfer request */ 00258 AST_CONTROL_CONNECTED_LINE = 22,/*!< Indicate connected line has changed */ 00259 AST_CONTROL_REDIRECTING = 23, /*!< Indicate redirecting id has changed */ 00260 AST_CONTROL_T38_PARAMETERS = 24,/*!< T38 state change request/notification with parameters */ 00261 AST_CONTROL_CC = 25, /*!< Indication that Call completion service is possible */ 00262 AST_CONTROL_SRCCHANGE = 26, /*!< Media source has changed and requires a new RTP SSRC */ 00263 AST_CONTROL_READ_ACTION = 27, /*!< Tell ast_read to take a specific action */ 00264 AST_CONTROL_AOC = 28, /*!< Advice of Charge with encoded generic AOC payload */ 00265 AST_CONTROL_END_OF_Q = 29, /*!< Indicate that this position was the end of the channel queue for a softhangup. */ 00266 AST_CONTROL_INCOMPLETE = 30, /*!< Indication that the extension dialed is incomplete */ 00267 AST_CONTROL_MCID = 31, /*!< Indicate that the caller is being malicious. */ 00268 AST_CONTROL_UPDATE_RTP_PEER = 32, /*!< Interrupt the bridge and have it update the peer */ 00269 };
| enum ast_control_t38 |
| AST_T38_REQUEST_NEGOTIATE | Request T38 on a channel (voice to fax) |
| AST_T38_REQUEST_TERMINATE | Terminate T38 on a channel (fax to voice) |
| AST_T38_NEGOTIATED | T38 negotiated (fax mode) |
| AST_T38_TERMINATED | T38 terminated (back to voice) |
| AST_T38_REFUSED | T38 refused for some reason (usually rejected by remote end) |
| AST_T38_REQUEST_PARMS | request far end T.38 parameters for a channel in 'negotiating' state |
Definition at line 288 of file frame.h.
00288 { 00289 AST_T38_REQUEST_NEGOTIATE = 1, /*!< Request T38 on a channel (voice to fax) */ 00290 AST_T38_REQUEST_TERMINATE, /*!< Terminate T38 on a channel (fax to voice) */ 00291 AST_T38_NEGOTIATED, /*!< T38 negotiated (fax mode) */ 00292 AST_T38_TERMINATED, /*!< T38 terminated (back to voice) */ 00293 AST_T38_REFUSED, /*!< T38 refused for some reason (usually rejected by remote end) */ 00294 AST_T38_REQUEST_PARMS, /*!< request far end T.38 parameters for a channel in 'negotiating' state */ 00295 };
| enum ast_control_t38_rate |
| AST_T38_RATE_2400 | |
| AST_T38_RATE_4800 | |
| AST_T38_RATE_7200 | |
| AST_T38_RATE_9600 | |
| AST_T38_RATE_12000 | |
| AST_T38_RATE_14400 |
Definition at line 297 of file frame.h.
00297 { 00298 AST_T38_RATE_2400 = 0, 00299 AST_T38_RATE_4800, 00300 AST_T38_RATE_7200, 00301 AST_T38_RATE_9600, 00302 AST_T38_RATE_12000, 00303 AST_T38_RATE_14400, 00304 };
Definition at line 306 of file frame.h.
00306 { 00307 AST_T38_RATE_MANAGEMENT_TRANSFERRED_TCF = 0, 00308 AST_T38_RATE_MANAGEMENT_LOCAL_TCF, 00309 };
| enum ast_control_transfer |
| AST_TRANSFER_SUCCESS | Transfer request on the channel worked |
| AST_TRANSFER_FAILED | Transfer request on the channel failed |
Definition at line 322 of file frame.h.
00322 { 00323 AST_TRANSFER_SUCCESS = 0, /*!< Transfer request on the channel worked */ 00324 AST_TRANSFER_FAILED, /*!< Transfer request on the channel failed */ 00325 };
Definition at line 271 of file frame.h.
00271 { 00272 AST_FRAME_READ_ACTION_CONNECTED_LINE_MACRO, 00273 };
| enum ast_frame_type |
Frame types.
Definition at line 97 of file frame.h.
00097 { 00098 /*! DTMF end event, subclass is the digit */ 00099 AST_FRAME_DTMF_END = 1, 00100 /*! Voice data, subclass is AST_FORMAT_* */ 00101 AST_FRAME_VOICE, 00102 /*! Video frame, maybe?? :) */ 00103 AST_FRAME_VIDEO, 00104 /*! A control frame, subclass is AST_CONTROL_* */ 00105 AST_FRAME_CONTROL, 00106 /*! An empty, useless frame */ 00107 AST_FRAME_NULL, 00108 /*! Inter Asterisk Exchange private frame type */ 00109 AST_FRAME_IAX, 00110 /*! Text messages */ 00111 AST_FRAME_TEXT, 00112 /*! Image Frames */ 00113 AST_FRAME_IMAGE, 00114 /*! HTML Frame */ 00115 AST_FRAME_HTML, 00116 /*! Comfort Noise frame (subclass is level of CNG in -dBov), 00117 body may include zero or more 8-bit quantization coefficients */ 00118 AST_FRAME_CNG, 00119 /*! Modem-over-IP data streams */ 00120 AST_FRAME_MODEM, 00121 /*! DTMF begin event, subclass is the digit */ 00122 AST_FRAME_DTMF_BEGIN, 00123 };
| int __ast_smoother_feed | ( | struct ast_smoother * | s, | |
| struct ast_frame * | f, | |||
| int | swap | |||
| ) |
Definition at line 172 of file frame.c.
References ast_format_cmp(), AST_FORMAT_CMP_NOT_EQUAL, ast_format_copy(), AST_FRAME_VOICE, ast_getformatname(), ast_log(), AST_MIN_OFFSET, AST_SMOOTHER_FLAG_G729, ast_swapcopy_samples(), ast_frame::data, ast_frame::datalen, ast_smoother::flags, ast_frame_subclass::format, ast_smoother::format, ast_frame::frametype, ast_format::id, ast_smoother::len, LOG_WARNING, ast_frame::offset, ast_smoother::opt, ast_smoother::opt_needs_swap, ast_frame::ptr, ast_frame::samples, ast_smoother::samplesperbyte, ast_smoother::size, smoother_frame_feed(), SMOOTHER_SIZE, and ast_frame::subclass.
00173 { 00174 if (f->frametype != AST_FRAME_VOICE) { 00175 ast_log(LOG_WARNING, "Huh? Can't smooth a non-voice frame!\n"); 00176 return -1; 00177 } 00178 if (!s->format.id) { 00179 ast_format_copy(&s->format, &f->subclass.format); 00180 s->samplesperbyte = (float)f->samples / (float)f->datalen; 00181 } else if (ast_format_cmp(&s->format, &f->subclass.format) == AST_FORMAT_CMP_NOT_EQUAL) { 00182 ast_log(LOG_WARNING, "Smoother was working on %s format frames, now trying to feed %s?\n", 00183 ast_getformatname(&s->format), ast_getformatname(&f->subclass.format)); 00184 return -1; 00185 } 00186 if (s->len + f->datalen > SMOOTHER_SIZE) { 00187 ast_log(LOG_WARNING, "Out of smoother space\n"); 00188 return -1; 00189 } 00190 if (((f->datalen == s->size) || 00191 ((f->datalen < 10) && (s->flags & AST_SMOOTHER_FLAG_G729))) && 00192 !s->opt && 00193 !s->len && 00194 (f->offset >= AST_MIN_OFFSET)) { 00195 /* Optimize by sending the frame we just got 00196 on the next read, thus eliminating the douple 00197 copy */ 00198 if (swap) 00199 ast_swapcopy_samples(f->data.ptr, f->data.ptr, f->samples); 00200 s->opt = f; 00201 s->opt_needs_swap = swap ? 1 : 0; 00202 return 0; 00203 } 00204 00205 return smoother_frame_feed(s, f, swap); 00206 }
| int ast_codec_get_len | ( | struct ast_format * | format, | |
| int | samples | |||
| ) |
Returns the number of bytes for the number of samples of the given format.
Definition at line 1029 of file frame.c.
References AST_FORMAT_ADPCM, AST_FORMAT_ALAW, AST_FORMAT_G719, AST_FORMAT_G722, AST_FORMAT_G723_1, AST_FORMAT_G726, AST_FORMAT_G726_AAL2, AST_FORMAT_G729A, AST_FORMAT_GSM, AST_FORMAT_ILBC, AST_FORMAT_SIREN14, AST_FORMAT_SIREN7, AST_FORMAT_SLINEAR, AST_FORMAT_SLINEAR16, AST_FORMAT_TESTLAW, AST_FORMAT_ULAW, ast_getformatname(), ast_log(), ast_format::id, len(), and LOG_WARNING.
Referenced by moh_generate(), and monmp3thread().
01030 { 01031 int len = 0; 01032 01033 /* XXX Still need speex, and lpc10 XXX */ 01034 switch(format->id) { 01035 case AST_FORMAT_G723_1: 01036 len = (samples / 240) * 20; 01037 break; 01038 case AST_FORMAT_ILBC: 01039 len = (samples / 240) * 50; 01040 break; 01041 case AST_FORMAT_GSM: 01042 len = (samples / 160) * 33; 01043 break; 01044 case AST_FORMAT_G729A: 01045 len = samples / 8; 01046 break; 01047 case AST_FORMAT_SLINEAR: 01048 case AST_FORMAT_SLINEAR16: 01049 len = samples * 2; 01050 break; 01051 case AST_FORMAT_ULAW: 01052 case AST_FORMAT_ALAW: 01053 case AST_FORMAT_TESTLAW: 01054 len = samples; 01055 break; 01056 case AST_FORMAT_G722: 01057 case AST_FORMAT_ADPCM: 01058 case AST_FORMAT_G726: 01059 case AST_FORMAT_G726_AAL2: 01060 len = samples / 2; 01061 break; 01062 case AST_FORMAT_SIREN7: 01063 /* 16,000 samples per second at 32kbps is 4,000 bytes per second */ 01064 len = samples / (16000 / 4000); 01065 break; 01066 case AST_FORMAT_SIREN14: 01067 /* 32,000 samples per second at 48kbps is 6,000 bytes per second */ 01068 len = (int) samples / ((float) 32000 / 6000); 01069 break; 01070 case AST_FORMAT_G719: 01071 /* 48,000 samples per second at 64kbps is 8,000 bytes per second */ 01072 len = (int) samples / ((float) 48000 / 8000); 01073 break; 01074 default: 01075 ast_log(LOG_WARNING, "Unable to calculate sample length for format %s\n", ast_getformatname(format)); 01076 } 01077 01078 return len; 01079 }
| int ast_codec_get_samples | ( | struct ast_frame * | f | ) |
Returns the number of samples contained in the frame.
Definition at line 942 of file frame.c.
References AST_FORMAT_ADPCM, AST_FORMAT_ALAW, AST_FORMAT_ATTR_END, AST_FORMAT_CELT, AST_FORMAT_G719, AST_FORMAT_G722, AST_FORMAT_G723_1, AST_FORMAT_G726, AST_FORMAT_G726_AAL2, AST_FORMAT_G729A, AST_FORMAT_GSM, AST_FORMAT_ILBC, ast_format_isset(), AST_FORMAT_LPC10, ast_format_rate(), AST_FORMAT_SILK, AST_FORMAT_SIREN14, AST_FORMAT_SIREN7, AST_FORMAT_SLINEAR, AST_FORMAT_SLINEAR16, AST_FORMAT_SPEEX, AST_FORMAT_SPEEX16, AST_FORMAT_SPEEX32, AST_FORMAT_TESTLAW, AST_FORMAT_ULAW, ast_getformatname(), ast_log(), ast_frame::data, ast_frame::datalen, ast_frame_subclass::format, g723_samples(), ast_format::id, LOG_WARNING, ast_frame::ptr, SILK_ATTR_KEY_SAMP_RATE, SILK_ATTR_VAL_SAMP_12KHZ, SILK_ATTR_VAL_SAMP_16KHZ, SILK_ATTR_VAL_SAMP_24KHZ, speex_samples(), and ast_frame::subclass.
Referenced by ast_rtp_read(), isAnsweringMachine(), moh_generate(), schedule_delivery(), socket_process(), and socket_process_meta().
00943 { 00944 int samples = 0; 00945 00946 switch (f->subclass.format.id) { 00947 case AST_FORMAT_SPEEX: 00948 samples = speex_samples(f->data.ptr, f->datalen); 00949 break; 00950 case AST_FORMAT_SPEEX16: 00951 samples = 2 * speex_samples(f->data.ptr, f->datalen); 00952 break; 00953 case AST_FORMAT_SPEEX32: 00954 samples = 4 * speex_samples(f->data.ptr, f->datalen); 00955 break; 00956 case AST_FORMAT_G723_1: 00957 samples = g723_samples(f->data.ptr, f->datalen); 00958 break; 00959 case AST_FORMAT_ILBC: 00960 samples = 240 * (f->datalen / 50); 00961 break; 00962 case AST_FORMAT_GSM: 00963 samples = 160 * (f->datalen / 33); 00964 break; 00965 case AST_FORMAT_G729A: 00966 samples = f->datalen * 8; 00967 break; 00968 case AST_FORMAT_SLINEAR: 00969 case AST_FORMAT_SLINEAR16: 00970 samples = f->datalen / 2; 00971 break; 00972 case AST_FORMAT_LPC10: 00973 /* assumes that the RTP packet contains one LPC10 frame */ 00974 samples = 22 * 8; 00975 samples += (((char *)(f->data.ptr))[7] & 0x1) * 8; 00976 break; 00977 case AST_FORMAT_ULAW: 00978 case AST_FORMAT_ALAW: 00979 case AST_FORMAT_TESTLAW: 00980 samples = f->datalen; 00981 break; 00982 case AST_FORMAT_G722: 00983 case AST_FORMAT_ADPCM: 00984 case AST_FORMAT_G726: 00985 case AST_FORMAT_G726_AAL2: 00986 samples = f->datalen * 2; 00987 break; 00988 case AST_FORMAT_SIREN7: 00989 /* 16,000 samples per second at 32kbps is 4,000 bytes per second */ 00990 samples = f->datalen * (16000 / 4000); 00991 break; 00992 case AST_FORMAT_SIREN14: 00993 /* 32,000 samples per second at 48kbps is 6,000 bytes per second */ 00994 samples = (int) f->datalen * ((float) 32000 / 6000); 00995 break; 00996 case AST_FORMAT_G719: 00997 /* 48,000 samples per second at 64kbps is 8,000 bytes per second */ 00998 samples = (int) f->datalen * ((float) 48000 / 8000); 00999 break; 01000 case AST_FORMAT_SILK: 01001 if (!(ast_format_isset(&f->subclass.format, 01002 SILK_ATTR_KEY_SAMP_RATE, 01003 SILK_ATTR_VAL_SAMP_24KHZ, 01004 AST_FORMAT_ATTR_END))) { 01005 return 480; 01006 } else if (!(ast_format_isset(&f->subclass.format, 01007 SILK_ATTR_KEY_SAMP_RATE, 01008 SILK_ATTR_VAL_SAMP_16KHZ, 01009 AST_FORMAT_ATTR_END))) { 01010 return 320; 01011 } else if (!(ast_format_isset(&f->subclass.format, 01012 SILK_ATTR_KEY_SAMP_RATE, 01013 SILK_ATTR_VAL_SAMP_12KHZ, 01014 AST_FORMAT_ATTR_END))) { 01015 return 240; 01016 } else { 01017 return 160; 01018 } 01019 case AST_FORMAT_CELT: 01020 /* TODO The assumes 20ms delivery right now, which is incorrect */ 01021 samples = ast_format_rate(&f->subclass.format) / 50; 01022 break; 01023 default: 01024 ast_log(LOG_WARNING, "Unable to calculate samples for format %s\n", ast_getformatname(&f->subclass.format)); 01025 } 01026 return samples; 01027 }
| static int ast_codec_interp_len | ( | struct ast_format * | format | ) | [inline, static] |
Gets duration in ms of interpolation frame for a format.
Definition at line 568 of file frame.h.
References AST_FORMAT_ILBC, and ast_format::id.
Referenced by __get_from_jb(), and jb_get_and_deliver().
00569 { 00570 return (format->id == AST_FORMAT_ILBC) ? 30 : 20; 00571 }
| int ast_frame_adjust_volume | ( | struct ast_frame * | f, | |
| int | adjustment | |||
| ) |
Adjusts the volume of the audio samples contained in a frame.
| f | The frame containing the samples (must be AST_FRAME_VOICE and AST_FORMAT_SLINEAR) | |
| adjustment | The number of dB to adjust up or down. |
Definition at line 1081 of file frame.c.
References ast_format_is_slinear(), AST_FRAME_VOICE, ast_slinear_saturated_divide(), ast_slinear_saturated_multiply(), ast_frame::data, ast_frame_subclass::format, ast_frame::frametype, ast_frame::ptr, ast_frame::samples, and ast_frame::subclass.
Referenced by audiohook_read_frame_single(), audiohook_volume_callback(), conf_run(), and volume_callback().
01082 { 01083 int count; 01084 short *fdata = f->data.ptr; 01085 short adjust_value = abs(adjustment); 01086 01087 if ((f->frametype != AST_FRAME_VOICE) || !(ast_format_is_slinear(&f->subclass.format))) { 01088 return -1; 01089 } 01090 01091 if (!adjustment) { 01092 return 0; 01093 } 01094 01095 for (count = 0; count < f->samples; count++) { 01096 if (adjustment > 0) { 01097 ast_slinear_saturated_multiply(&fdata[count], &adjust_value); 01098 } else if (adjustment < 0) { 01099 ast_slinear_saturated_divide(&fdata[count], &adjust_value); 01100 } 01101 } 01102 01103 return 0; 01104 }
| int ast_frame_clear | ( | struct ast_frame * | frame | ) |
Clear all audio samples from an ast_frame. The frame must be AST_FRAME_VOICE and AST_FORMAT_SLINEAR.
Definition at line 1128 of file frame.c.
References AST_LIST_NEXT, ast_frame::data, ast_frame::datalen, ast_frame::next, and ast_frame::ptr.
Referenced by ast_audiohook_write_frame(), and mute_callback().
01129 { 01130 struct ast_frame *next; 01131 01132 for (next = AST_LIST_NEXT(frame, frame_list); 01133 frame; 01134 frame = next, next = frame ? AST_LIST_NEXT(frame, frame_list) : NULL) { 01135 memset(frame->data.ptr, 0, frame->datalen); 01136 } 01137 return 0; 01138 }
| void ast_frame_dump | ( | const char * | name, | |
| struct ast_frame * | f, | |||
| char * | prefix | |||
| ) |
Dump a frame for debugging purposes
Definition at line 526 of file frame.c.
References AST_CONTROL_ANSWER, AST_CONTROL_BUSY, AST_CONTROL_CONGESTION, AST_CONTROL_FLASH, AST_CONTROL_HANGUP, AST_CONTROL_HOLD, AST_CONTROL_OFFHOOK, AST_CONTROL_OPTION, AST_CONTROL_RADIO_KEY, AST_CONTROL_RADIO_UNKEY, AST_CONTROL_RING, AST_CONTROL_RINGING, AST_CONTROL_T38_PARAMETERS, AST_CONTROL_TAKEOFFHOOK, AST_CONTROL_UNHOLD, AST_CONTROL_WINK, ast_copy_string(), AST_FRAME_CONTROL, AST_FRAME_DTMF_BEGIN, AST_FRAME_DTMF_END, AST_FRAME_HTML, AST_FRAME_IAX, AST_FRAME_IMAGE, AST_FRAME_MODEM, AST_FRAME_NULL, AST_FRAME_TEXT, AST_FRAME_VIDEO, AST_FRAME_VOICE, ast_getformatname(), AST_HTML_BEGIN, AST_HTML_DATA, AST_HTML_END, AST_HTML_LDCOMPLETE, AST_HTML_LINKREJECT, AST_HTML_LINKURL, AST_HTML_NOSUPPORT, AST_HTML_UNLINK, AST_HTML_URL, AST_MODEM_T38, AST_MODEM_V150, ast_strlen_zero(), AST_T38_NEGOTIATED, AST_T38_REFUSED, AST_T38_REQUEST_NEGOTIATE, AST_T38_REQUEST_TERMINATE, AST_T38_TERMINATED, ast_verbose, COLOR_BLACK, COLOR_BRCYAN, COLOR_BRGREEN, COLOR_BRMAGENTA, COLOR_BRRED, COLOR_YELLOW, ast_frame::data, ast_frame::datalen, ast_frame_subclass::format, ast_frame::frametype, ast_frame_subclass::integer, ast_frame::ptr, ast_control_t38_parameters::request_response, ast_frame::subclass, and term_color().
Referenced by __ast_read(), and ast_write().
00527 { 00528 const char noname[] = "unknown"; 00529 char ftype[40] = "Unknown Frametype"; 00530 char cft[80]; 00531 char subclass[40] = "Unknown Subclass"; 00532 char csub[80]; 00533 char moreinfo[40] = ""; 00534 char cn[60]; 00535 char cp[40]; 00536 char cmn[40]; 00537 const char *message = "Unknown"; 00538 00539 if (!name) 00540 name = noname; 00541 00542 00543 if (!f) { 00544 ast_verbose("%s [ %s (NULL) ] [%s]\n", 00545 term_color(cp, prefix, COLOR_BRMAGENTA, COLOR_BLACK, sizeof(cp)), 00546 term_color(cft, "HANGUP", COLOR_BRRED, COLOR_BLACK, sizeof(cft)), 00547 term_color(cn, name, COLOR_YELLOW, COLOR_BLACK, sizeof(cn))); 00548 return; 00549 } 00550 /* XXX We should probably print one each of voice and video when the format changes XXX */ 00551 if (f->frametype == AST_FRAME_VOICE) 00552 return; 00553 if (f->frametype == AST_FRAME_VIDEO) 00554 return; 00555 switch(f->frametype) { 00556 case AST_FRAME_DTMF_BEGIN: 00557 strcpy(ftype, "DTMF Begin"); 00558 subclass[0] = f->subclass.integer; 00559 subclass[1] = '\0'; 00560 break; 00561 case AST_FRAME_DTMF_END: 00562 strcpy(ftype, "DTMF End"); 00563 subclass[0] = f->subclass.integer; 00564 subclass[1] = '\0'; 00565 break; 00566 case AST_FRAME_CONTROL: 00567 strcpy(ftype, "Control"); 00568 switch (f->subclass.integer) { 00569 case AST_CONTROL_HANGUP: 00570 strcpy(subclass, "Hangup"); 00571 break; 00572 case AST_CONTROL_RING: 00573 strcpy(subclass, "Ring"); 00574 break; 00575 case AST_CONTROL_RINGING: 00576 strcpy(subclass, "Ringing"); 00577 break; 00578 case AST_CONTROL_ANSWER: 00579 strcpy(subclass, "Answer"); 00580 break; 00581 case AST_CONTROL_BUSY: 00582 strcpy(subclass, "Busy"); 00583 break; 00584 case AST_CONTROL_TAKEOFFHOOK: 00585 strcpy(subclass, "Take Off Hook"); 00586 break; 00587 case AST_CONTROL_OFFHOOK: 00588 strcpy(subclass, "Line Off Hook"); 00589 break; 00590 case AST_CONTROL_CONGESTION: 00591 strcpy(subclass, "Congestion"); 00592 break; 00593 case AST_CONTROL_FLASH: 00594 strcpy(subclass, "Flash"); 00595 break; 00596 case AST_CONTROL_WINK: 00597 strcpy(subclass, "Wink"); 00598 break; 00599 case AST_CONTROL_OPTION: 00600 strcpy(subclass, "Option"); 00601 break; 00602 case AST_CONTROL_RADIO_KEY: 00603 strcpy(subclass, "Key Radio"); 00604 break; 00605 case AST_CONTROL_RADIO_UNKEY: 00606 strcpy(subclass, "Unkey Radio"); 00607 break; 00608 case AST_CONTROL_HOLD: 00609 strcpy(subclass, "Hold"); 00610 break; 00611 case AST_CONTROL_UNHOLD: 00612 strcpy(subclass, "Unhold"); 00613 break; 00614 case AST_CONTROL_T38_PARAMETERS: 00615 if (f->datalen != sizeof(struct ast_control_t38_parameters)) { 00616 message = "Invalid"; 00617 } else { 00618 struct ast_control_t38_parameters *parameters = f->data.ptr; 00619 enum ast_control_t38 state = parameters->request_response; 00620 if (state == AST_T38_REQUEST_NEGOTIATE) 00621 message = "Negotiation Requested"; 00622 else if (state == AST_T38_REQUEST_TERMINATE) 00623 message = "Negotiation Request Terminated"; 00624 else if (state == AST_T38_NEGOTIATED) 00625 message = "Negotiated"; 00626 else if (state == AST_T38_TERMINATED) 00627 message = "Terminated"; 00628 else if (state == AST_T38_REFUSED) 00629 message = "Refused"; 00630 } 00631 snprintf(subclass, sizeof(subclass), "T38_Parameters/%s", message); 00632 break; 00633 case -1: 00634 strcpy(subclass, "Stop generators"); 00635 break; 00636 default: 00637 snprintf(subclass, sizeof(subclass), "Unknown control '%d'", f->subclass.integer); 00638 } 00639 break; 00640 case AST_FRAME_NULL: 00641 strcpy(ftype, "Null Frame"); 00642 strcpy(subclass, "N/A"); 00643 break; 00644 case AST_FRAME_IAX: 00645 /* Should never happen */ 00646 strcpy(ftype, "IAX Specific"); 00647 snprintf(subclass, sizeof(subclass), "IAX Frametype %d", f->subclass.integer); 00648 break; 00649 case AST_FRAME_TEXT: 00650 strcpy(ftype, "Text"); 00651 strcpy(subclass, "N/A"); 00652 ast_copy_string(moreinfo, f->data.ptr, sizeof(moreinfo)); 00653 break; 00654 case AST_FRAME_IMAGE: 00655 strcpy(ftype, "Image"); 00656 snprintf(subclass, sizeof(subclass), "Image format %s\n", ast_getformatname(&f->subclass.format)); 00657 break; 00658 case AST_FRAME_HTML: 00659 strcpy(ftype, "HTML"); 00660 switch (f->subclass.integer) { 00661 case AST_HTML_URL: 00662 strcpy(subclass, "URL"); 00663 ast_copy_string(moreinfo, f->data.ptr, sizeof(moreinfo)); 00664 break; 00665 case AST_HTML_DATA: 00666 strcpy(subclass, "Data"); 00667 break; 00668 case AST_HTML_BEGIN: 00669 strcpy(subclass, "Begin"); 00670 break; 00671 case AST_HTML_END: 00672 strcpy(subclass, "End"); 00673 break; 00674 case AST_HTML_LDCOMPLETE: 00675 strcpy(subclass, "Load Complete"); 00676 break; 00677 case AST_HTML_NOSUPPORT: 00678 strcpy(subclass, "No Support"); 00679 break; 00680 case AST_HTML_LINKURL: 00681 strcpy(subclass, "Link URL"); 00682 ast_copy_string(moreinfo, f->data.ptr, sizeof(moreinfo)); 00683 break; 00684 case AST_HTML_UNLINK: 00685 strcpy(subclass, "Unlink"); 00686 break; 00687 case AST_HTML_LINKREJECT: 00688 strcpy(subclass, "Link Reject"); 00689 break; 00690 default: 00691 snprintf(subclass, sizeof(subclass), "Unknown HTML frame '%d'\n", f->subclass.integer); 00692 break; 00693 } 00694 break; 00695 case AST_FRAME_MODEM: 00696 strcpy(ftype, "Modem"); 00697 switch (f->subclass.integer) { 00698 case AST_MODEM_T38: 00699 strcpy(subclass, "T.38"); 00700 break; 00701 case AST_MODEM_V150: 00702 strcpy(subclass, "V.150"); 00703 break; 00704 default: 00705 snprintf(subclass, sizeof(subclass), "Unknown MODEM frame '%d'\n", f->subclass.integer); 00706 break; 00707 } 00708 break; 00709 default: 00710 snprintf(ftype, sizeof(ftype), "Unknown Frametype '%d'", f->frametype); 00711 } 00712 if (!ast_strlen_zero(moreinfo)) 00713 ast_verbose("%s [ TYPE: %s (%d) SUBCLASS: %s (%d) '%s' ] [%s]\n", 00714 term_color(cp, prefix, COLOR_BRMAGENTA, COLOR_BLACK, sizeof(cp)), 00715 term_color(cft, ftype, COLOR_BRRED, COLOR_BLACK, sizeof(cft)), 00716 f->frametype, 00717 term_color(csub, subclass, COLOR_BRCYAN, COLOR_BLACK, sizeof(csub)), 00718 f->subclass.integer, 00719 term_color(cmn, moreinfo, COLOR_BRGREEN, COLOR_BLACK, sizeof(cmn)), 00720 term_color(cn, name, COLOR_YELLOW, COLOR_BLACK, sizeof(cn))); 00721 else 00722 ast_verbose("%s [ TYPE: %s (%d) SUBCLASS: %s (%d) ] [%s]\n", 00723 term_color(cp, prefix, COLOR_BRMAGENTA, COLOR_BLACK, sizeof(cp)), 00724 term_color(cft, ftype, COLOR_BRRED, COLOR_BLACK, sizeof(cft)), 00725 f->frametype, 00726 term_color(csub, subclass, COLOR_BRCYAN, COLOR_BLACK, sizeof(csub)), 00727 f->subclass.integer, 00728 term_color(cn, name, COLOR_YELLOW, COLOR_BLACK, sizeof(cn))); 00729 }
| struct ast_frame* ast_frame_enqueue | ( | struct ast_frame * | head, | |
| struct ast_frame * | f, | |||
| int | maxlen, | |||
| int | dupe | |||
| ) | [read] |
Appends a frame to the end of a list of frames, truncating the maximum length of the list.
| void ast_frame_free | ( | struct ast_frame * | fr, | |
| int | cache | |||
| ) |
Requests a frame to be allocated.
| source | Request a frame be allocated. source is an optional source of the frame, len is the requested length, or "0" if the caller will supply the buffer |
| fr | Frame to free, or head of list to free | |
| cache | Whether to consider this frame for frame caching |
Definition at line 339 of file frame.c.
References __frame_free(), AST_LIST_NEXT, and ast_frame::next.
Referenced by mixmonitor_thread().
00340 { 00341 struct ast_frame *next; 00342 00343 for (next = AST_LIST_NEXT(frame, frame_list); 00344 frame; 00345 frame = next, next = frame ? AST_LIST_NEXT(frame, frame_list) : NULL) { 00346 __frame_free(frame, cache); 00347 } 00348 }
Sums two frames of audio samples.
| f1 | The first frame (which will contain the result) | |
| f2 | The second frame |
Definition at line 1106 of file frame.c.
References AST_FORMAT_SLINEAR, AST_FRAME_VOICE, ast_slinear_saturated_add(), ast_frame::data, ast_frame_subclass::format, ast_frame::frametype, ast_format::id, ast_frame::ptr, ast_frame::samples, and ast_frame::subclass.
01107 { 01108 int count; 01109 short *data1, *data2; 01110 01111 if ((f1->frametype != AST_FRAME_VOICE) || (f1->subclass.format.id != AST_FORMAT_SLINEAR)) 01112 return -1; 01113 01114 if ((f2->frametype != AST_FRAME_VOICE) || (f2->subclass.format.id != AST_FORMAT_SLINEAR)) 01115 return -1; 01116 01117 if (f1->samples != f2->samples) 01118 return -1; 01119 01120 for (count = 0, data1 = f1->data.ptr, data2 = f2->data.ptr; 01121 count < f1->samples; 01122 count++, data1++, data2++) 01123 ast_slinear_saturated_add(data1, data2); 01124 01125 return 0; 01126 }
Copies a frame.
| fr | frame to copy Duplicates a frame -- should only rarely be used, typically frisolate is good enough |
Definition at line 438 of file frame.c.
References ast_calloc_cache, ast_copy_flags, AST_FLAGS_ALL, ast_format_copy(), AST_FRIENDLY_OFFSET, AST_LIST_REMOVE_CURRENT, AST_LIST_TRAVERSE_SAFE_BEGIN, AST_LIST_TRAVERSE_SAFE_END, AST_MALLOCD_HDR, ast_threadstorage_get(), ast_frame::data, ast_frame::datalen, ast_frame::delivery, ast_frame_subclass::format, frame_cache, frames, ast_frame::frametype, ast_frame::len, len(), ast_frame_cache::list, ast_frame::mallocd, ast_frame::mallocd_hdr_len, ast_frame::offset, ast_frame::ptr, ast_frame::samples, ast_frame::seqno, ast_frame_cache::size, ast_frame::src, ast_frame::subclass, ast_frame::ts, and ast_frame::uint32.
Referenced by __ast_queue_frame(), ast_frisolate(), ast_indicate_data(), ast_jb_put(), ast_rtp_write(), ast_slinfactory_feed(), audiohook_read_frame_both(), audiohook_read_frame_single(), autoservice_run(), hook_event_cb(), multicast_rtp_write(), process_dtmf_rfc2833(), recordthread(), rpt(), and rpt_exec().
00439 { 00440 struct ast_frame *out = NULL; 00441 int len, srclen = 0; 00442 void *buf = NULL; 00443 00444 #if !defined(LOW_MEMORY) 00445 struct ast_frame_cache *frames; 00446 #endif 00447 00448 /* Start with standard stuff */ 00449 len = sizeof(*out) + AST_FRIENDLY_OFFSET + f->datalen; 00450 /* If we have a source, add space for it */ 00451 /* 00452 * XXX Watch out here - if we receive a src which is not terminated 00453 * properly, we can be easily attacked. Should limit the size we deal with. 00454 */ 00455 if (f->src) 00456 srclen = strlen(f->src); 00457 if (srclen > 0) 00458 len += srclen + 1; 00459 00460 #if !defined(LOW_MEMORY) 00461 if ((frames = ast_threadstorage_get(&frame_cache, sizeof(*frames)))) { 00462 AST_LIST_TRAVERSE_SAFE_BEGIN(&frames->list, out, frame_list) { 00463 if (out->mallocd_hdr_len >= len) { 00464 size_t mallocd_len = out->mallocd_hdr_len; 00465 00466 AST_LIST_REMOVE_CURRENT(frame_list); 00467 memset(out, 0, sizeof(*out)); 00468 out->mallocd_hdr_len = mallocd_len; 00469 buf = out; 00470 frames->size--; 00471 break; 00472 } 00473 } 00474 AST_LIST_TRAVERSE_SAFE_END; 00475 } 00476 #endif 00477 00478 if (!buf) { 00479 if (!(buf = ast_calloc_cache(1, len))) 00480 return NULL; 00481 out = buf; 00482 out->mallocd_hdr_len = len; 00483 } 00484 00485 out->frametype = f->frametype; 00486 ast_format_copy(&out->subclass.format, &f->subclass.format); 00487 out->datalen = f->datalen; 00488 out->samples = f->samples; 00489 out->delivery = f->delivery; 00490 /* Set us as having malloc'd header only, so it will eventually 00491 get freed. */ 00492 out->mallocd = AST_MALLOCD_HDR; 00493 out->offset = AST_FRIENDLY_OFFSET; 00494 if (out->datalen) { 00495 out->data.ptr = buf + sizeof(*out) + AST_FRIENDLY_OFFSET; 00496 memcpy(out->data.ptr, f->data.ptr, out->datalen); 00497 } else { 00498 out->data.uint32 = f->data.uint32; 00499 } 00500 if (srclen > 0) { 00501 /* This may seem a little strange, but it's to avoid a gcc (4.2.4) compiler warning */ 00502 char *src; 00503 out->src = buf + sizeof(*out) + AST_FRIENDLY_OFFSET + f->datalen; 00504 src = (char *) out->src; 00505 /* Must have space since we allocated for it */ 00506 strcpy(src, f->src); 00507 } 00508 ast_copy_flags(out, f, AST_FLAGS_ALL); 00509 out->ts = f->ts; 00510 out->len = f->len; 00511 out->seqno = f->seqno; 00512 return out; 00513 }
Makes a frame independent of any static storage.
| fr | frame to act upon Take a frame, and if it's not been malloc'd, make a malloc'd copy and if the data hasn't been malloced then make the data malloc'd. If you need to store frames, say for queueing, then you should call this function. |
Definition at line 355 of file frame.c.
References ast_copy_flags, AST_FLAGS_ALL, ast_format_copy(), ast_frame_header_new(), ast_frdup(), ast_free, AST_FRFLAG_HAS_TIMING_INFO, AST_FRIENDLY_OFFSET, ast_malloc, AST_MALLOCD_DATA, AST_MALLOCD_HDR, AST_MALLOCD_SRC, ast_strdup, ast_test_flag, ast_frame::data, ast_frame::datalen, ast_frame_subclass::format, ast_frame::frametype, ast_frame::len, ast_frame::mallocd, ast_frame::offset, ast_frame::ptr, ast_frame::samples, ast_frame::seqno, ast_frame::src, ast_frame::subclass, ast_frame::ts, and ast_frame::uint32.
Referenced by __ast_answer(), ast_dsp_process(), ast_rtp_read(), ast_safe_sleep_conditional(), ast_slinfactory_feed(), ast_trans_frameout(), ast_write(), autoservice_run(), dahdi_decoder_frameout(), dahdi_encoder_frameout(), fax_gateway_framehook(), fax_gateway_request_t38(), feature_request_and_dial(), hook_event_cb(), jpeg_read_image(), read_frame(), spandsp_fax_gw_t30_gen(), spandsp_fax_read(), and t38_tx_packet_handler().
00356 { 00357 struct ast_frame *out; 00358 void *newdata; 00359 00360 /* if none of the existing frame is malloc'd, let ast_frdup() do it 00361 since it is more efficient 00362 */ 00363 if (fr->mallocd == 0) { 00364 return ast_frdup(fr); 00365 } 00366 00367 /* if everything is already malloc'd, we are done */ 00368 if ((fr->mallocd & (AST_MALLOCD_HDR | AST_MALLOCD_SRC | AST_MALLOCD_DATA)) == 00369 (AST_MALLOCD_HDR | AST_MALLOCD_SRC | AST_MALLOCD_DATA)) { 00370 return fr; 00371 } 00372 00373 if (!(fr->mallocd & AST_MALLOCD_HDR)) { 00374 /* Allocate a new header if needed */ 00375 if (!(out = ast_frame_header_new())) { 00376 return NULL; 00377 } 00378 out->frametype = fr->frametype; 00379 ast_format_copy(&out->subclass.format, &fr->subclass.format); 00380 out->datalen = fr->datalen; 00381 out->samples = fr->samples; 00382 out->offset = fr->offset; 00383 /* Copy the timing data */ 00384 ast_copy_flags(out, fr, AST_FLAGS_ALL); 00385 if (ast_test_flag(fr, AST_FRFLAG_HAS_TIMING_INFO)) { 00386 out->ts = fr->ts; 00387 out->len = fr->len; 00388 out->seqno = fr->seqno; 00389 } 00390 } else { 00391 out = fr; 00392 } 00393 00394 if (!(fr->mallocd & AST_MALLOCD_SRC) && fr->src) { 00395 if (!(out->src = ast_strdup(fr->src))) { 00396 if (out != fr) { 00397 ast_free(out); 00398 } 00399 return NULL; 00400 } 00401 } else { 00402 out->src = fr->src; 00403 fr->src = NULL; 00404 fr->mallocd &= ~AST_MALLOCD_SRC; 00405 } 00406 00407 if (!(fr->mallocd & AST_MALLOCD_DATA)) { 00408 if (!fr->datalen) { 00409 out->data.uint32 = fr->data.uint32; 00410 out->mallocd = AST_MALLOCD_HDR | AST_MALLOCD_SRC; 00411 return out; 00412 } 00413 if (!(newdata = ast_malloc(fr->datalen + AST_FRIENDLY_OFFSET))) { 00414 if (out->src != fr->src) { 00415 ast_free((void *) out->src); 00416 } 00417 if (out != fr) { 00418 ast_free(out); 00419 } 00420 return NULL; 00421 } 00422 newdata += AST_FRIENDLY_OFFSET; 00423 out->offset = AST_FRIENDLY_OFFSET; 00424 out->datalen = fr->datalen; 00425 memcpy(newdata, fr->data.ptr, fr->datalen); 00426 out->data.ptr = newdata; 00427 } else { 00428 out->data = fr->data; 00429 memset(&fr->data, 0, sizeof(fr->data)); 00430 fr->mallocd &= ~AST_MALLOCD_DATA; 00431 } 00432 00433 out->mallocd = AST_MALLOCD_HDR | AST_MALLOCD_SRC | AST_MALLOCD_DATA; 00434 00435 return out; 00436 }
| int ast_parse_allow_disallow | ( | struct ast_codec_pref * | pref, | |
| struct ast_format_cap * | cap, | |||
| const char * | list, | |||
| int | allowing | |||
| ) |
Parse an "allow" or "deny" line in a channel or device configuration and update the capabilities and pref if provided. Video codecs are not added to codec preference lists, since we can not transcode.
Definition at line 731 of file frame.c.
References ast_codec_pref_append(), ast_codec_pref_remove(), ast_codec_pref_setsize(), ast_debug, ast_format_cap_add(), ast_format_cap_add_all(), ast_format_cap_remove(), ast_format_cap_remove_all(), ast_getformatbyname(), ast_log(), ast_strdupa, LOG_WARNING, parse(), and strsep().
Referenced by action_originate(), apply_outgoing(), build_peer(), config_parse_variables(), gtalk_create_member(), gtalk_load_config(), h323_parse_allow_disallow(), iax2_parse_allow_disallow(), jingle_create_member(), jingle_load_config(), reload_config(), and skinny_unregister().
00732 { 00733 int errors = 0, framems = 0, all = 0, iter_allowing; 00734 char *parse = NULL, *this = NULL, *psize = NULL; 00735 struct ast_format format; 00736 00737 parse = ast_strdupa(list); 00738 while ((this = strsep(&parse, ","))) { 00739 iter_allowing = allowing; 00740 framems = 0; 00741 if (*this == '!') { 00742 this++; 00743 iter_allowing = !allowing; 00744 } 00745 if ((psize = strrchr(this, ':'))) { 00746 *psize++ = '\0'; 00747 ast_debug(1, "Packetization for codec: %s is %s\n", this, psize); 00748 framems = atoi(psize); 00749 if (framems < 0) { 00750 framems = 0; 00751 errors++; 00752 ast_log(LOG_WARNING, "Bad packetization value for codec %s\n", this); 00753 } 00754 } 00755 all = strcasecmp(this, "all") ? 0 : 1; 00756 00757 if (!all && !ast_getformatbyname(this, &format)) { 00758 ast_log(LOG_WARNING, "Cannot %s unknown format '%s'\n", iter_allowing ? "allow" : "disallow", this); 00759 errors++; 00760 continue; 00761 } 00762 00763 if (cap) { 00764 if (iter_allowing) { 00765 if (all) { 00766 ast_format_cap_add_all(cap); 00767 } else { 00768 ast_format_cap_add(cap, &format); 00769 } 00770 } else { 00771 if (all) { 00772 ast_format_cap_remove_all(cap); 00773 } else { 00774 ast_format_cap_remove(cap, &format); 00775 } 00776 } 00777 } 00778 00779 if (pref) { 00780 if (!all) { 00781 if (iter_allowing) { 00782 ast_codec_pref_append(pref, &format); 00783 ast_codec_pref_setsize(pref, &format, framems); 00784 } else { 00785 ast_codec_pref_remove(pref, &format); 00786 } 00787 } else if (!iter_allowing) { 00788 memset(pref, 0, sizeof(*pref)); 00789 } 00790 } 00791 } 00792 return errors; 00793 }
| void ast_smoother_free | ( | struct ast_smoother * | s | ) |
Definition at line 258 of file frame.c.
References ast_free.
Referenced by ast_rtp_destroy(), ast_rtp_write(), destroy_session(), and generic_fax_exec().
00259 { 00260 ast_free(s); 00261 }
| int ast_smoother_get_flags | ( | struct ast_smoother * | smoother | ) |
| struct ast_smoother* ast_smoother_new | ( | int | bytes | ) | [read] |
Definition at line 147 of file frame.c.
References ast_malloc, and ast_smoother_reset().
Referenced by ast_rtp_write(), and generic_fax_exec().
00148 { 00149 struct ast_smoother *s; 00150 if (size < 1) 00151 return NULL; 00152 if ((s = ast_malloc(sizeof(*s)))) 00153 ast_smoother_reset(s, size); 00154 return s; 00155 }
| struct ast_frame* ast_smoother_read | ( | struct ast_smoother * | s | ) | [read] |
Definition at line 208 of file frame.c.
References ast_format_copy(), ast_format_rate(), AST_FRAME_VOICE, AST_FRIENDLY_OFFSET, ast_log(), ast_samp2tv(), AST_SMOOTHER_FLAG_G729, ast_tvadd(), ast_tvzero(), ast_smoother::data, ast_frame::data, ast_frame::datalen, ast_smoother::delivery, ast_frame::delivery, ast_smoother::f, ast_smoother::flags, ast_smoother::format, ast_frame_subclass::format, ast_smoother::framedata, ast_frame::frametype, ast_smoother::len, len(), LOG_WARNING, ast_frame::offset, ast_smoother::opt, ast_frame::ptr, ast_frame::samples, ast_smoother::samplesperbyte, ast_smoother::size, and ast_frame::subclass.
Referenced by ast_rtp_write(), and generic_fax_exec().
00209 { 00210 struct ast_frame *opt; 00211 int len; 00212 00213 /* IF we have an optimization frame, send it */ 00214 if (s->opt) { 00215 if (s->opt->offset < AST_FRIENDLY_OFFSET) 00216 ast_log(LOG_WARNING, "Returning a frame of inappropriate offset (%d).\n", 00217 s->opt->offset); 00218 opt = s->opt; 00219 s->opt = NULL; 00220 return opt; 00221 } 00222 00223 /* Make sure we have enough data */ 00224 if (s->len < s->size) { 00225 /* Or, if this is a G.729 frame with VAD on it, send it immediately anyway */ 00226 if (!((s->flags & AST_SMOOTHER_FLAG_G729) && (s->len % 10))) 00227 return NULL; 00228 } 00229 len = s->size; 00230 if (len > s->len) 00231 len = s->len; 00232 /* Make frame */ 00233 s->f.frametype = AST_FRAME_VOICE; 00234 ast_format_copy(&s->f.subclass.format, &s->format); 00235 s->f.data.ptr = s->framedata + AST_FRIENDLY_OFFSET; 00236 s->f.offset = AST_FRIENDLY_OFFSET; 00237 s->f.datalen = len; 00238 /* Samples will be improper given VAD, but with VAD the concept really doesn't even exist */ 00239 s->f.samples = len * s->samplesperbyte; /* XXX rounding */ 00240 s->f.delivery = s->delivery; 00241 /* Fill Data */ 00242 memcpy(s->f.data.ptr, s->data, len); 00243 s->len -= len; 00244 /* Move remaining data to the front if applicable */ 00245 if (s->len) { 00246 /* In principle this should all be fine because if we are sending 00247 G.729 VAD, the next timestamp will take over anyawy */ 00248 memmove(s->data, s->data + len, s->len); 00249 if (!ast_tvzero(s->delivery)) { 00250 /* If we have delivery time, increment it, otherwise, leave it at 0 */ 00251 s->delivery = ast_tvadd(s->delivery, ast_samp2tv(s->f.samples, ast_format_rate(&s->format))); 00252 } 00253 } 00254 /* Return frame */ 00255 return &s->f; 00256 }
| void ast_smoother_reconfigure | ( | struct ast_smoother * | s, | |
| int | bytes | |||
| ) |
Reconfigure an existing smoother to output a different number of bytes per frame.
| s | the smoother to reconfigure | |
| bytes | the desired number of bytes per output frame |
Definition at line 125 of file frame.c.
References ast_smoother::opt, ast_smoother::opt_needs_swap, ast_smoother::size, and smoother_frame_feed().
00126 { 00127 /* if there is no change, then nothing to do */ 00128 if (s->size == bytes) { 00129 return; 00130 } 00131 /* set the new desired output size */ 00132 s->size = bytes; 00133 /* if there is no 'optimized' frame in the smoother, 00134 * then there is nothing left to do 00135 */ 00136 if (!s->opt) { 00137 return; 00138 } 00139 /* there is an 'optimized' frame here at the old size, 00140 * but it must now be put into the buffer so the data 00141 * can be extracted at the new size 00142 */ 00143 smoother_frame_feed(s, s->opt, s->opt_needs_swap); 00144 s->opt = NULL; 00145 }
| void ast_smoother_reset | ( | struct ast_smoother * | s, | |
| int | bytes | |||
| ) |
Definition at line 119 of file frame.c.
References ast_smoother::size.
Referenced by ast_smoother_new().
00120 { 00121 memset(s, 0, sizeof(*s)); 00122 s->size = bytes; 00123 }
| void ast_smoother_set_flags | ( | struct ast_smoother * | smoother, | |
| int | flags | |||
| ) |
Definition at line 162 of file frame.c.
References ast_smoother::flags.
Referenced by ast_rtp_write().
00163 { 00164 s->flags = flags; 00165 }
| int ast_smoother_test_flag | ( | struct ast_smoother * | s, | |
| int | flag | |||
| ) |
Definition at line 167 of file frame.c.
References ast_smoother::flags.
Referenced by ast_rtp_write().
00168 { 00169 return (s->flags & flag); 00170 }
| void ast_swapcopy_samples | ( | void * | dst, | |
| const void * | src, | |||
| int | samples | |||
| ) |
Definition at line 515 of file frame.c.
Referenced by __ast_smoother_feed(), iax_frame_wrap(), phone_write_buf(), and smoother_frame_feed().
00516 { 00517 int i; 00518 unsigned short *dst_s = dst; 00519 const unsigned short *src_s = src; 00520 00521 for (i = 0; i < samples; i++) 00522 dst_s[i] = (src_s[i]<<8) | (src_s[i]>>8); 00523 }
| struct ast_frame ast_null_frame |
Queueing a null frame is fairly common, so we declare a global null frame object for this purpose instead of having to declare one on the stack
Definition at line 95 of file frame.c.
Referenced by __analog_handle_event(), __ast_channel_masquerade(), __ast_read(), __oh323_rtp_create(), __oh323_update_info(), agent_read(), agent_request(), ast_channel_setwhentohangup_tv(), ast_do_masquerade(), ast_rtcp_read(), ast_rtp_read(), ast_softhangup_nolock(), ast_udptl_read(), bridge_read(), chan_msg_read(), conf_run(), conf_stop_record(), console_read(), create_dtmf_frame(), dahdi_read(), fax_detect_framehook(), fax_gateway_detect_t38(), fax_gateway_framehook(), gtalk_rtp_read(), handle_request_invite(), handle_response_invite(), hook_event_cb(), iax2_read(), jingle_rtp_read(), local_read(), mgcp_rtp_read(), multicast_rtp_read(), oh323_read(), oh323_rtp_read(), process_sdp(), rec_read(), sip_read(), sip_rtp_read(), skinny_rtp_read(), spandsp_fax_read(), unistim_rtp_read(), and wakeup_sub().
1.5.6