Fri Feb 10 06:36:13 2012

Asterisk developer's documentation


frame.h File Reference

Asterisk internal frame definitions. More...

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

Include dependency graph for frame.h:

Go to the source code of this file.

Data Structures

struct  ast_control_read_action_payload
struct  ast_control_t38_parameters
struct  ast_frame
 Data structure associated with a single frame of data. More...
union  ast_frame_subclass
struct  ast_option_header
struct  oprmode

AST_Smoother

#define ast_smoother_feed(s, f)   __ast_smoother_feed(s, f, 0)
#define ast_smoother_feed_be(s, f)   __ast_smoother_feed(s, f, 0)
#define ast_smoother_feed_le(s, f)   __ast_smoother_feed(s, f, 1)
int __ast_smoother_feed (struct ast_smoother *s, struct ast_frame *f, int swap)
void ast_smoother_free (struct ast_smoother *s)
int ast_smoother_get_flags (struct ast_smoother *smoother)
struct ast_smootherast_smoother_new (int bytes)
struct ast_frameast_smoother_read (struct ast_smoother *s)
void ast_smoother_reconfigure (struct ast_smoother *s, int bytes)
 Reconfigure an existing smoother to output a different number of bytes per frame.
void ast_smoother_reset (struct ast_smoother *s, int bytes)
void ast_smoother_set_flags (struct ast_smoother *smoother, int flags)
int ast_smoother_test_flag (struct ast_smoother *s, int flag)

Defines

#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
#define AST_FRAME_SET_BUFFER(fr, _base, _ofs, _datalen)
#define ast_frfree(fr)   ast_frame_free(fr, 1)
#define AST_FRIENDLY_OFFSET   64
 Offset into a frame's data buffer.
#define AST_HTML_BEGIN   4
#define AST_HTML_DATA   2
#define AST_HTML_END   8
#define AST_HTML_LDCOMPLETE   16
#define AST_HTML_LINKREJECT   20
#define AST_HTML_LINKURL   18
#define AST_HTML_NOSUPPORT   17
#define AST_HTML_UNLINK   19
#define AST_HTML_URL   1
#define AST_MALLOCD_DATA   (1 << 1)
#define AST_MALLOCD_HDR   (1 << 0)
#define AST_MALLOCD_SRC   (1 << 2)
#define AST_MIN_OFFSET   32
#define AST_MODEM_T38   1
#define AST_MODEM_V150   2
#define AST_OPTION_AUDIO_MODE   4
#define AST_OPTION_CC_AGENT_TYPE   17
#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.
#define AST_OPTION_DEVICE_NAME   16
#define AST_OPTION_DIGIT_DETECT   14
#define AST_OPTION_ECHOCAN   8
#define AST_OPTION_FAX_DETECT   15
#define AST_OPTION_FLAG_ACCEPT   1
#define AST_OPTION_FLAG_ANSWER   5
#define AST_OPTION_FLAG_QUERY   4
#define AST_OPTION_FLAG_REJECT   2
#define AST_OPTION_FLAG_REQUEST   0
#define AST_OPTION_FLAG_WTF   6
#define AST_OPTION_FORMAT_READ   11
#define AST_OPTION_FORMAT_WRITE   12
#define AST_OPTION_MAKE_COMPATIBLE   13
#define AST_OPTION_OPRMODE   7
#define AST_OPTION_RELAXDTMF   3
#define AST_OPTION_RXGAIN   6
#define AST_OPTION_SECURE_MEDIA   19
#define AST_OPTION_SECURE_SIGNALING   18
#define AST_OPTION_T38_STATE   10
#define AST_OPTION_TDD   2
#define AST_OPTION_TONE_VERIFY   1
#define AST_OPTION_TXGAIN   5
#define AST_SMOOTHER_FLAG_BE   (1 << 1)
#define AST_SMOOTHER_FLAG_G729   (1 << 0)

Enumerations

enum  { AST_FRFLAG_HAS_TIMING_INFO = (1 << 0) }
enum  ast_control_frame_type {
  AST_CONTROL_HANGUP = 1, AST_CONTROL_RING = 2, AST_CONTROL_RINGING = 3, AST_CONTROL_ANSWER = 4,
  AST_CONTROL_BUSY = 5, AST_CONTROL_TAKEOFFHOOK = 6, AST_CONTROL_OFFHOOK = 7, AST_CONTROL_CONGESTION = 8,
  AST_CONTROL_FLASH = 9, AST_CONTROL_WINK = 10, AST_CONTROL_OPTION = 11, AST_CONTROL_RADIO_KEY = 12,
  AST_CONTROL_RADIO_UNKEY = 13, AST_CONTROL_PROGRESS = 14, AST_CONTROL_PROCEEDING = 15, AST_CONTROL_HOLD = 16,
  AST_CONTROL_UNHOLD = 17, AST_CONTROL_VIDUPDATE = 18, _XXX_AST_CONTROL_T38 = 19, AST_CONTROL_SRCUPDATE = 20,
  AST_CONTROL_TRANSFER = 21, AST_CONTROL_CONNECTED_LINE = 22, AST_CONTROL_REDIRECTING = 23, AST_CONTROL_T38_PARAMETERS = 24,
  AST_CONTROL_CC = 25, AST_CONTROL_SRCCHANGE = 26, AST_CONTROL_READ_ACTION = 27, AST_CONTROL_AOC = 28,
  AST_CONTROL_END_OF_Q = 29, AST_CONTROL_INCOMPLETE = 30, AST_CONTROL_MCID = 31, AST_CONTROL_UPDATE_RTP_PEER = 32
}
enum  ast_control_t38 {
  AST_T38_REQUEST_NEGOTIATE = 1, AST_T38_REQUEST_TERMINATE, AST_T38_NEGOTIATED, AST_T38_TERMINATED,
  AST_T38_REFUSED, AST_T38_REQUEST_PARMS
}
enum  ast_control_t38_rate {
  AST_T38_RATE_2400 = 0, AST_T38_RATE_4800, AST_T38_RATE_7200, AST_T38_RATE_9600,
  AST_T38_RATE_12000, AST_T38_RATE_14400
}
enum  ast_control_t38_rate_management { AST_T38_RATE_MANAGEMENT_TRANSFERRED_TCF = 0, AST_T38_RATE_MANAGEMENT_LOCAL_TCF }
enum  ast_control_transfer { AST_TRANSFER_SUCCESS = 0, AST_TRANSFER_FAILED }
enum  ast_frame_read_action { AST_FRAME_READ_ACTION_CONNECTED_LINE_MACRO }
enum  ast_frame_type {
  AST_FRAME_DTMF_END = 1, AST_FRAME_VOICE, AST_FRAME_VIDEO, AST_FRAME_CONTROL,
  AST_FRAME_NULL, AST_FRAME_IAX, AST_FRAME_TEXT, AST_FRAME_IMAGE,
  AST_FRAME_HTML, AST_FRAME_CNG, AST_FRAME_MODEM, AST_FRAME_DTMF_BEGIN
}
 Frame types. More...

Functions

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.
int ast_codec_get_samples (struct ast_frame *f)
 Returns the number of samples contained in the frame.
static int ast_codec_interp_len (struct ast_format *format)
 Gets duration in ms of interpolation frame for a format.
int ast_frame_adjust_volume (struct ast_frame *f, int adjustment)
 Adjusts the volume of the audio samples contained in a frame.
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.
void ast_frame_dump (const char *name, struct ast_frame *f, char *prefix)
struct ast_frameast_frame_enqueue (struct ast_frame *head, struct ast_frame *f, int maxlen, int dupe)
 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.
int ast_frame_slinear_sum (struct ast_frame *f1, struct ast_frame *f2)
 Sums two frames of audio samples.
struct ast_frameast_frdup (const struct ast_frame *fr)
 Copies a frame.
struct ast_frameast_frisolate (struct ast_frame *fr)
 Makes a frame independent of any static storage.
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.
void ast_swapcopy_samples (void *dst, const void *src, int samples)

Variables

struct ast_frame ast_null_frame


Detailed Description

Asterisk internal frame definitions.

Definition in file frame.h.


Define Documentation

#define ast_frame_byteswap_be ( fr   )     do { ; } while(0)

Definition at line 499 of file frame.h.

Referenced by ast_rtp_read(), and socket_process().

#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)

Definition at line 498 of file frame.h.

Referenced by phone_read().

#define AST_FRAME_DTMF   AST_FRAME_DTMF_END

#define AST_FRAME_SET_BUFFER ( fr,
_base,
_ofs,
_datalen   ) 

Value:

{              \
   (fr)->data.ptr = (char *)_base + (_ofs);  \
   (fr)->offset = (_ofs);        \
   (fr)->datalen = (_datalen);      \
   }
Set the various field of a frame to point to a buffer. Typically you set the base address of the buffer, the offset as AST_FRIENDLY_OFFSET, and the datalen as the amount of bytes queued. The remaining things (to be done manually) is set the number of samples, which cannot be derived from the datalen unless you know the number of bits per sample.

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

Beginning frame

Definition at line 222 of file frame.h.

Referenced by ast_frame_dump().

#define AST_HTML_DATA   2

Data frame

Definition at line 220 of file frame.h.

Referenced by ast_frame_dump().

#define AST_HTML_END   8

End frame

Definition at line 224 of file frame.h.

Referenced by ast_frame_dump().

#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

Reject link request

Definition at line 234 of file frame.h.

Referenced by ast_frame_dump().

#define AST_HTML_LINKURL   18

Send URL, and track

Definition at line 230 of file frame.h.

Referenced by ast_frame_dump().

#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

No more HTML linkage

Definition at line 232 of file frame.h.

Referenced by ast_frame_dump().

#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

Definition at line 201 of file frame.h.

Referenced by __ast_smoother_feed().

#define AST_MODEM_T38   1

#define AST_MODEM_V150   2

V.150 Modem-over-IP

Definition at line 214 of file frame.h.

Referenced by ast_frame_dump().

#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.

Note:
This option should never be passed over the network.

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

Note:
This option appears to be unused in the code. It is handled, but never set or queried.

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_ACCEPT   1

Definition at line 332 of file frame.h.

#define AST_OPTION_FLAG_ANSWER   5

Definition at line 335 of file frame.h.

#define AST_OPTION_FLAG_QUERY   4

Definition at line 334 of file frame.h.

#define AST_OPTION_FLAG_REJECT   2

Definition at line 333 of file frame.h.

#define AST_OPTION_FLAG_REQUEST   0

Definition at line 331 of file frame.h.

Referenced by ast_bridge_call(), and iax2_setoption().

#define AST_OPTION_FLAG_WTF   6

Definition at line 336 of file frame.h.

#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

Note:
This option should never be passed over the network

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

#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_feed ( s,
f   )     __ast_smoother_feed(s, f, 0)

Definition at line 545 of file frame.h.

Referenced by ast_rtp_write(), and generic_fax_exec().

#define ast_smoother_feed_be ( s,
f   )     __ast_smoother_feed(s, f, 0)

Definition at line 550 of file frame.h.

Referenced by ast_rtp_write().

#define ast_smoother_feed_le ( s,
f   )     __ast_smoother_feed(s, f, 1)

Definition at line 551 of file frame.h.

#define AST_SMOOTHER_FLAG_BE   (1 << 1)

Definition at line 328 of file frame.h.

Referenced by ast_rtp_write(), and format_list_init().

#define AST_SMOOTHER_FLAG_G729   (1 << 0)


Enumeration Type Documentation

anonymous enum

Enumerator:
AST_FRFLAG_HAS_TIMING_INFO  This frame contains valid timing information

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

Enumerator:
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
Deprecated:
This is no longer supported. Use AST_CONTROL_T38_PARAMETERS instead.
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 };

Enumerator:
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 };

Enumerator:
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.

Enumerator:
AST_T38_RATE_MANAGEMENT_TRANSFERRED_TCF 
AST_T38_RATE_MANAGEMENT_LOCAL_TCF 

Definition at line 306 of file frame.h.

Enumerator:
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 };

Enumerator:
AST_FRAME_READ_ACTION_CONNECTED_LINE_MACRO 

Definition at line 271 of file frame.h.

Frame types.

Note:
It is important that the values of each frame type are never changed, because it will break backwards compatability with older versions. This is because these constants are transmitted directly over IAX2.
Enumerator:
AST_FRAME_DTMF_END  DTMF end event, subclass is the digit
AST_FRAME_VOICE  Voice data, subclass is AST_FORMAT_*
AST_FRAME_VIDEO  Video frame, maybe?? :)
AST_FRAME_CONTROL  A control frame, subclass is AST_CONTROL_*
AST_FRAME_NULL  An empty, useless frame
AST_FRAME_IAX  Inter Asterisk Exchange private frame type
AST_FRAME_TEXT  Text messages
AST_FRAME_IMAGE  Image Frames
AST_FRAME_HTML  HTML Frame
AST_FRAME_CNG  Comfort Noise frame (subclass is level of CNG in -dBov), body may include zero or more 8-bit quantization coefficients
AST_FRAME_MODEM  Modem-over-IP data streams
AST_FRAME_DTMF_BEGIN  DTMF begin event, subclass is the digit

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


Function Documentation

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.

Parameters:
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.
Returns:
0 for success, non-zero for an error

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.

Parameters:
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
Frees a frame or list of frames
Parameters:
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 }

int ast_frame_slinear_sum ( struct ast_frame f1,
struct ast_frame f2 
)

Sums two frames of audio samples.

Parameters:
f1 The first frame (which will contain the result)
f2 The second frame
Returns:
0 for success, non-zero for an error
The frames must be AST_FRAME_VOICE and must contain AST_FORMAT_SLINEAR samples, and must contain the same number of samples.

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 }

struct ast_frame* ast_frdup ( const struct ast_frame fr  )  [read]

Copies a frame.

Parameters:
fr frame to copy Duplicates a frame -- should only rarely be used, typically frisolate is good enough
Returns:
Returns a frame on success, NULL on error

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 }

struct ast_frame* ast_frisolate ( struct ast_frame fr  )  [read]

Makes a frame independent of any static storage.

Parameters:
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.
Returns:
Returns a frame on success, NULL on error
Note:
This function may modify the frame passed to it, so you must not assume the frame will be intact after the isolated frame has been produced. In other words, calling this function on a frame should be the last operation you do with that frame before freeing it (or exiting the block, if the frame is on the stack.)

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.

Returns:
Returns number of errors encountered during parsing

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  ) 

Definition at line 157 of file frame.c.

References ast_smoother::flags.

00158 {
00159    return s->flags;
00160 }

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.

Parameters:
s the smoother to reconfigure
bytes the desired number of bytes per output frame
Returns:
nothing

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 }


Variable Documentation


Generated on Fri Feb 10 06:36:13 2012 for Asterisk - The Open Source Telephony Project by  doxygen 1.5.6