/** toxav.h
*
* Copyright (C) 2013 Tox project All Rights Reserved.
*
* This file is part of Tox.
*
* Tox is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Tox is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Tox. If not, see .
*
*/
#ifndef __TOXAV
#define __TOXAV
#ifdef __cplusplus
extern "C" {
#endif
typedef struct _ToxAv ToxAv;
/* vpx_image_t */
#include
typedef void ( *ToxAVCallback ) ( void *agent, int32_t call_idx, void *arg );
typedef void ( *ToxAvAudioCallback ) (void *agent, int32_t call_idx, const int16_t *PCM, uint16_t size, void *data);
typedef void ( *ToxAvVideoCallback ) (void *agent, int32_t call_idx, const vpx_image_t *img, void *data);
#ifndef TOX_DEFINED
#define TOX_DEFINED
typedef struct Tox Tox;
#endif
#define RTP_PAYLOAD_SIZE 65535
/**
* Callbacks ids that handle the call states.
*/
typedef enum {
av_OnInvite, /* Incoming call */
av_OnRinging, /* When peer is ready to accept/reject the call */
av_OnStart, /* Call (RTP transmission) started */
av_OnCancel, /* The side that initiated call canceled invite */
av_OnReject, /* The side that was invited rejected the call */
av_OnEnd, /* Call that was active ended */
av_OnRequestTimeout, /* When the requested action didn't get response in specified time */
av_OnPeerTimeout, /* Peer timed out; stop the call */
av_OnPeerCSChange, /* Peer changing Csettings. Prepare for changed AV */
av_OnSelfCSChange /* Csettings change confirmation. Once triggered peer is ready to recv changed AV */
} ToxAvCallbackID;
/**
* Call type identifier.
*/
typedef enum {
av_TypeAudio = 192,
av_TypeVideo
} ToxAvCallType;
typedef enum {
av_CallNonExistent = -1,
av_CallInviting, /* when sending call invite */
av_CallStarting, /* when getting call invite */
av_CallActive,
av_CallHold,
av_CallHungUp
} ToxAvCallState;
/**
* Error indicators. Values under -20 are reserved for toxcore.
*/
typedef enum {
av_ErrorNone = 0,
av_ErrorUnknown = -1, /* Unknown error */
av_ErrorNoCall = -20, /* Trying to perform call action while not in a call */
av_ErrorInvalidState = -21, /* Trying to perform call action while in invalid state*/
av_ErrorAlreadyInCallWithPeer = -22, /* Trying to call peer when already in a call with peer */
av_ErrorReachedCallLimit = -23, /* Cannot handle more calls */
av_ErrorInitializingCodecs = -30, /* Failed creating CSSession */
av_ErrorSettingVideoResolution = -31, /* Error setting resolution */
av_ErrorSettingVideoBitrate = -32, /* Error setting bitrate */
av_ErrorSplittingVideoPayload = -33, /* Error splitting video payload */
av_ErrorEncodingVideo = -34, /* vpx_codec_encode failed */
av_ErrorEncodingAudio = -35, /* opus_encode failed */
av_ErrorSendingPayload = -40, /* Sending lossy packet failed */
av_ErrorCreatingRtpSessions = -41, /* One of the rtp sessions failed to initialize */
av_ErrorNoRtpSession = -50, /* Trying to perform rtp action on invalid session */
av_ErrorInvalidCodecState = -51, /* Codec state not initialized */
av_ErrorPacketTooLarge = -52, /* Split packet exceeds it's limit */
} ToxAvError;
/**
* Locally supported capabilities.
*/
typedef enum {
av_AudioEncoding = 1 << 0,
av_AudioDecoding = 1 << 1,
av_VideoEncoding = 1 << 2,
av_VideoDecoding = 1 << 3
} ToxAvCapabilities;
/**
* Encoding settings.
*/
typedef struct _ToxAvCSettings {
ToxAvCallType call_type;
uint32_t video_bitrate; /* In kbits/s */
uint16_t max_video_width; /* In px */
uint16_t max_video_height; /* In px */
uint32_t audio_bitrate; /* In bits/s */
uint16_t audio_frame_duration; /* In ms */
uint32_t audio_sample_rate; /* In Hz */
uint32_t audio_channels;
} ToxAvCSettings;
extern const ToxAvCSettings av_DefaultSettings;
/**
* Start new A/V session. There can only be one session at the time.
*/
ToxAv *toxav_new(Tox *messenger, int32_t max_calls);
/**
* Remove A/V session.
*/
void toxav_kill(ToxAv *av);
/**
* Returns the interval in milliseconds when the next toxav_do() should be called.
* If no call is active at the moment returns 200.
*/
uint32_t toxav_do_interval(ToxAv *av);
/**
* Main loop for the session. Best called right after tox_do();
*/
void toxav_do(ToxAv *av);
/**
* Register callback for call state.
*/
void toxav_register_callstate_callback (ToxAv *av, ToxAVCallback cb, ToxAvCallbackID id, void *userdata);
/**
* Register callback for audio data.
*/
void toxav_register_audio_callback (ToxAv *av, ToxAvAudioCallback cb, void *userdata);
/**
* Register callback for video data.
*/
void toxav_register_video_callback (ToxAv *av, ToxAvVideoCallback cb, void *userdata);
/**
* Call user. Use its friend_id.
*/
int toxav_call(ToxAv *av,
int32_t *call_index,
int friend_id,
const ToxAvCSettings *csettings,
int ringing_seconds);
/**
* Hangup active call.
*/
int toxav_hangup(ToxAv *av, int32_t call_index);
/**
* Answer incoming call. Pass the csettings that you will use.
*/
int toxav_answer(ToxAv *av, int32_t call_index, const ToxAvCSettings *csettings );
/**
* Reject incoming call.
*/
int toxav_reject(ToxAv *av, int32_t call_index, const char *reason);
/**
* Cancel outgoing request.
*/
int toxav_cancel(ToxAv *av, int32_t call_index, int peer_id, const char *reason);
/**
* Notify peer that we are changing codec settings.
*/
int toxav_change_settings(ToxAv *av, int32_t call_index, const ToxAvCSettings *csettings);
/**
* Terminate transmission. Note that transmission will be
* terminated without informing remote peer. Usually called when we can't inform peer.
*/
int toxav_stop_call(ToxAv *av, int32_t call_index);
/**
* Allocates transmission data. Must be call before calling toxav_prepare_* and toxav_send_*.
* Also, it must be called when call is started
*/
int toxav_prepare_transmission(ToxAv *av, int32_t call_index, int support_video);
/**
* Clears transmission data. Call this at the end of the transmission.
*/
int toxav_kill_transmission(ToxAv *av, int32_t call_index);
/**
* Encode video frame.
*/
int toxav_prepare_video_frame ( ToxAv *av,
int32_t call_index,
uint8_t *dest,
int dest_max,
vpx_image_t *input);
/**
* Send encoded video packet.
*/
int toxav_send_video ( ToxAv *av, int32_t call_index, const uint8_t *frame, uint32_t frame_size);
/**
* Encode audio frame.
*/
int toxav_prepare_audio_frame ( ToxAv *av,
int32_t call_index,
uint8_t *dest,
int dest_max,
const int16_t *frame,
int frame_size);
/**
* Send encoded audio frame.
*/
int toxav_send_audio ( ToxAv *av, int32_t call_index, const uint8_t *frame, unsigned int size);
/**
* Get codec settings from the peer. These were exchanged during call initialization
* or when peer send us new csettings.
*/
int toxav_get_peer_csettings ( ToxAv *av, int32_t call_index, int peer, ToxAvCSettings *dest );
/**
* Get friend id of peer participating in conversation.
*/
int toxav_get_peer_id ( ToxAv *av, int32_t call_index, int peer );
/**
* Get current call state.
*/
ToxAvCallState toxav_get_call_state ( ToxAv *av, int32_t call_index );
/**
* Is certain capability supported. Used to determine if encoding/decoding is ready.
*/
int toxav_capability_supported ( ToxAv *av, int32_t call_index, ToxAvCapabilities capability );
/**
* Returns tox reference.
*/
Tox *toxav_get_tox (ToxAv *av);
/**
* Returns number of active calls or -1 on error.
*/
int toxav_get_active_count (ToxAv *av);
/* Create a new toxav group.
*
* return group number on success.
* return -1 on failure.
*
* Audio data callback format:
* audio_callback(Tox *tox, int groupnumber, int peernumber, const int16_t *pcm, unsigned int samples, uint8_t channels, unsigned int sample_rate, void *userdata)
*
* Note that total size of pcm in bytes is equal to (samples * channels * sizeof(int16_t)).
*/
int toxav_add_av_groupchat(Tox *tox, void (*audio_callback)(Tox *, int, int, const int16_t *, unsigned int, uint8_t,
unsigned int, void *), void *userdata);
/* Join a AV group (you need to have been invited first.)
*
* returns group number on success
* returns -1 on failure.
*
* Audio data callback format (same as the one for toxav_add_av_groupchat()):
* audio_callback(Tox *tox, int groupnumber, int peernumber, const int16_t *pcm, unsigned int samples, uint8_t channels, unsigned int sample_rate, void *userdata)
*
* Note that total size of pcm in bytes is equal to (samples * channels * sizeof(int16_t)).
*/
int toxav_join_av_groupchat(Tox *tox, int32_t friendnumber, const uint8_t *data, uint16_t length,
void (*audio_callback)(Tox *, int, int, const int16_t *, unsigned int, uint8_t, unsigned int, void *), void *userdata);
/* Send audio to the group chat.
*
* return 0 on success.
* return -1 on failure.
*
* Note that total size of pcm in bytes is equal to (samples * channels * sizeof(int16_t)).
*
* Valid number of samples are ((sample rate) * (audio length (Valid ones are: 2.5, 5, 10, 20, 40 or 60 ms)) / 1000)
* Valid number of channels are 1 or 2.
* Valid sample rates are 8000, 12000, 16000, 24000, or 48000.
*
* Recommended values are: samples = 960, channels = 1, sample_rate = 48000
*/
int toxav_group_send_audio(Tox *tox, int groupnumber, const int16_t *pcm, unsigned int samples, uint8_t channels,
unsigned int sample_rate);
#ifdef __cplusplus
}
#endif
#endif /* __TOXAV */