toxcore/toxav/toxav.h

402 lines
10 KiB
C
Raw Normal View History

2014-02-10 06:06:44 +08:00
/** toxav.h
2014-02-17 09:01:30 +08:00
*
2014-02-10 06:06:44 +08:00
* 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 <http://www.gnu.org/licenses/>.
*
*/
#ifndef __TOXAV
#define __TOXAV
#include <inttypes.h>
2014-06-19 05:52:34 +08:00
#ifdef __cplusplus
extern "C" {
#endif
2014-02-16 03:44:33 +08:00
/* vpx_image_t */
#include <vpx/vpx_image.h>
2014-05-17 01:56:40 +08:00
typedef void ( *ToxAVCallback ) ( int32_t, void *arg );
2014-02-10 06:06:44 +08:00
typedef struct _ToxAv ToxAv;
#ifndef __TOX_DEFINED__
#define __TOX_DEFINED__
typedef struct Tox Tox;
#endif
2014-02-16 03:44:33 +08:00
#define RTP_PAYLOAD_SIZE 65535
2014-02-10 06:06:44 +08:00
2014-02-17 09:01:30 +08:00
/**
2014-02-16 04:29:41 +08:00
* @brief Callbacks ids that handle the call states.
2014-02-10 06:06:44 +08:00
*/
typedef enum {
/* Requests */
av_OnInvite,
av_OnStart,
av_OnCancel,
av_OnReject,
av_OnEnd,
2014-02-17 09:01:30 +08:00
2014-02-10 06:06:44 +08:00
/* Responses */
av_OnRinging,
av_OnStarting,
av_OnEnding,
2014-02-17 09:01:30 +08:00
2014-02-10 06:06:44 +08:00
/* Protocol */
av_OnError,
2014-03-15 06:10:10 +08:00
av_OnRequestTimeout,
av_OnPeerTimeout
2014-02-10 06:06:44 +08:00
} ToxAvCallbackID;
/**
* @brief Call type identifier.
*/
typedef enum {
2014-05-24 22:02:01 +08:00
TypeAudio = 192,
2014-02-10 06:06:44 +08:00
TypeVideo
} ToxAvCallType;
2014-07-05 00:16:53 +08:00
typedef enum {
av_CallNonExistant = -1,
av_CallInviting, /* when sending call invite */
av_CallStarting, /* when getting call invite */
av_CallActive,
av_CallHold,
av_CallHanged_up
} ToxAvCallState;
2014-02-16 04:29:41 +08:00
/**
* @brief Error indicators.
*/
2014-02-10 06:06:44 +08:00
typedef enum {
ErrorNone = 0,
ErrorInternal = -1, /* Internal error */
ErrorAlreadyInCall = -2, /* Already has an active call */
ErrorNoCall = -3, /* Trying to perform call action while not in a call */
ErrorInvalidState = -4, /* Trying to perform call action while in invalid state*/
ErrorNoRtpSession = -5, /* Trying to perform rtp action on invalid session */
ErrorAudioPacketLost = -6, /* Indicating packet loss */
ErrorStartingAudioRtp = -7, /* Error in toxav_prepare_transmission() */
ErrorStartingVideoRtp = -8 , /* Error in toxav_prepare_transmission() */
ErrorTerminatingAudioRtp = -9, /* Returned in toxav_kill_transmission() */
ErrorTerminatingVideoRtp = -10, /* Returned in toxav_kill_transmission() */
2014-05-03 07:46:03 +08:00
ErrorPacketTooLarge = -11, /* Buffer exceeds size while encoding */
2014-06-21 07:58:55 +08:00
ErrorInvalidCodecState = -12, /* Codec state not initialized */
2014-02-17 09:01:30 +08:00
2014-02-10 06:06:44 +08:00
} ToxAvError;
/**
* @brief Locally supported capabilities.
*/
typedef enum {
AudioEncoding = 1 << 0,
AudioDecoding = 1 << 1,
VideoEncoding = 1 << 2,
VideoDecoding = 1 << 3
} ToxAvCapabilities;
2014-04-07 05:59:18 +08:00
/**
* @brief Encoding settings.
*/
typedef struct _ToxAvCodecSettings {
uint32_t video_bitrate; /* In kbits/s */
2014-04-07 05:59:18 +08:00
uint16_t video_width; /* In px */
uint16_t video_height; /* In px */
2014-04-07 05:59:18 +08:00
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;
uint32_t audio_VAD_tolerance; /* In ms */
2014-04-07 05:59:18 +08:00
uint32_t jbuf_capacity; /* Size of jitter buffer */
} ToxAvCodecSettings;
2014-04-28 01:21:26 +08:00
extern const ToxAvCodecSettings av_DefaultSettings;
2014-04-07 05:59:18 +08:00
2014-02-16 04:29:41 +08:00
/**
* @brief Start new A/V session. There can only be one session at the time. If you register more
* it will result in undefined behaviour.
2014-02-17 09:01:30 +08:00
*
2014-02-16 04:29:41 +08:00
* @param messenger The messenger handle.
* @param userdata The agent handling A/V session (i.e. phone).
2014-02-16 04:29:41 +08:00
* @param video_width Width of video frame.
* @param video_height Height of video frame.
* @return ToxAv*
* @retval NULL On error.
*/
2014-05-17 01:56:40 +08:00
ToxAv *toxav_new(Tox *messenger, int32_t max_calls);
2014-02-16 04:29:41 +08:00
/**
* @brief Remove A/V session.
2014-02-17 09:01:30 +08:00
*
2014-02-16 04:29:41 +08:00
* @param av Handler.
* @return void
*/
2014-02-17 09:01:30 +08:00
void toxav_kill(ToxAv *av);
2014-02-10 06:06:44 +08:00
2014-02-16 04:29:41 +08:00
/**
* @brief Register callback for call state.
2014-02-17 09:01:30 +08:00
*
2014-02-16 04:29:41 +08:00
* @param callback The callback
* @param id One of the ToxAvCallbackID values
* @return void
*/
void toxav_register_callstate_callback (ToxAVCallback callback, ToxAvCallbackID id, void *userdata);
2014-02-10 06:06:44 +08:00
2014-02-16 04:29:41 +08:00
/**
* @brief Call user. Use its friend_id.
2014-02-17 09:01:30 +08:00
*
2014-02-16 04:29:41 +08:00
* @param av Handler.
* @param user The user.
* @param call_type Call type.
* @param ringing_seconds Ringing timeout.
* @return int
* @retval 0 Success.
* @retval ToxAvError On error.
*/
int toxav_call(ToxAv *av, int32_t *call_index, int user, ToxAvCallType call_type, int ringing_seconds);
2014-02-16 04:29:41 +08:00
/**
* @brief Hangup active call.
2014-02-17 09:01:30 +08:00
*
2014-02-16 04:29:41 +08:00
* @param av Handler.
* @return int
* @retval 0 Success.
* @retval ToxAvError On error.
*/
2014-05-17 01:56:40 +08:00
int toxav_hangup(ToxAv *av, int32_t call_index);
2014-02-16 04:29:41 +08:00
/**
* @brief Answer incomming call.
2014-02-17 09:01:30 +08:00
*
2014-02-16 04:29:41 +08:00
* @param av Handler.
* @param call_type Answer with...
* @return int
* @retval 0 Success.
* @retval ToxAvError On error.
*/
2014-05-17 01:56:40 +08:00
int toxav_answer(ToxAv *av, int32_t call_index, ToxAvCallType call_type );
2014-02-16 04:29:41 +08:00
/**
* @brief Reject incomming call.
2014-02-17 09:01:30 +08:00
*
2014-02-16 04:29:41 +08:00
* @param av Handler.
* @param reason Optional reason. Set NULL if none.
* @return int
* @retval 0 Success.
* @retval ToxAvError On error.
*/
2014-05-17 01:56:40 +08:00
int toxav_reject(ToxAv *av, int32_t call_index, const char *reason);
2014-02-16 04:29:41 +08:00
/**
* @brief Cancel outgoing request.
2014-02-17 09:01:30 +08:00
*
2014-02-16 04:29:41 +08:00
* @param av Handler.
* @param reason Optional reason.
2014-03-23 02:33:56 +08:00
* @param peer_id peer friend_id
2014-02-16 04:29:41 +08:00
* @return int
* @retval 0 Success.
* @retval ToxAvError On error.
*/
int toxav_cancel(ToxAv *av, int32_t call_index, int peer_id, const char *reason);
2014-02-16 04:29:41 +08:00
/**
* @brief Terminate transmission. Note that transmission will be terminated without informing remote peer.
2014-02-17 09:01:30 +08:00
*
2014-02-16 04:29:41 +08:00
* @param av Handler.
* @return int
* @retval 0 Success.
* @retval ToxAvError On error.
*/
2014-05-17 01:56:40 +08:00
int toxav_stop_call(ToxAv *av, int32_t call_index);
2014-02-10 06:06:44 +08:00
2014-02-16 04:29:41 +08:00
/**
* @brief Must be call before any RTP transmission occurs.
2014-02-17 09:01:30 +08:00
*
2014-02-16 04:29:41 +08:00
* @param av Handler.
* @param support_video Is video supported ? 1 : 0
2014-02-16 04:29:41 +08:00
* @return int
* @retval 0 Success.
* @retval ToxAvError On error.
*/
int toxav_prepare_transmission(ToxAv *av, int32_t call_index, ToxAvCodecSettings *codec_settings, int support_video);
2014-02-10 06:06:44 +08:00
2014-02-16 04:29:41 +08:00
/**
* @brief Call this at the end of the transmission.
2014-02-17 09:01:30 +08:00
*
2014-02-16 04:29:41 +08:00
* @param av Handler.
* @return int
* @retval 0 Success.
* @retval ToxAvError On error.
2014-02-10 06:06:44 +08:00
*/
int toxav_kill_transmission(ToxAv *av, int32_t call_index);
2014-02-10 06:06:44 +08:00
2014-02-16 04:29:41 +08:00
/**
* @brief Receive decoded video packet.
2014-02-17 09:01:30 +08:00
*
2014-02-16 04:29:41 +08:00
* @param av Handler.
* @param output Storage.
2014-02-17 09:01:30 +08:00
* @return int
2014-02-16 04:29:41 +08:00
* @retval 0 Success.
* @retval ToxAvError On Error.
*/
int toxav_recv_video ( ToxAv *av, int32_t call_index, vpx_image_t **output);
2014-02-10 06:06:44 +08:00
2014-02-16 04:29:41 +08:00
/**
* @brief Receive decoded audio frame.
2014-02-17 09:01:30 +08:00
*
2014-02-16 04:29:41 +08:00
* @param av Handler.
* @param frame_size The size of dest in frames/samples (one frame/sample is 16 bits or 2 bytes
* and corresponds to one sample of audio.)
* @param dest Destination of the raw audio (16 bit signed pcm with AUDIO_CHANNELS channels).
* Make sure it has enough space for frame_size frames/samples.
2014-02-16 04:29:41 +08:00
* @return int
* @retval >=0 Size of received data in frames/samples.
2014-02-16 04:29:41 +08:00
* @retval ToxAvError On error.
*/
int toxav_recv_audio( ToxAv *av, int32_t call_index, int frame_size, int16_t *dest );
2014-02-10 06:06:44 +08:00
2014-02-16 04:29:41 +08:00
/**
* @brief Encode and send video packet.
2014-02-17 09:01:30 +08:00
*
2014-02-16 04:29:41 +08:00
* @param av Handler.
2014-05-11 00:00:49 +08:00
* @param frame The encoded frame.
* @param frame_size The size of the encoded frame.
2014-02-16 04:29:41 +08:00
* @return int
* @retval 0 Success.
* @retval ToxAvError On error.
*/
int toxav_send_video ( ToxAv *av, int32_t call_index, const uint8_t *frame, int frame_size);
2014-02-10 06:06:44 +08:00
2014-02-16 04:29:41 +08:00
/**
2014-05-03 07:46:03 +08:00
* @brief Send audio frame.
2014-02-17 09:01:30 +08:00
*
2014-02-16 04:29:41 +08:00
* @param av Handler.
* @param frame The frame (raw 16 bit signed pcm with AUDIO_CHANNELS channels audio.)
* @param frame_size Its size in number of frames/samples (one frame/sample is 16 bits or 2 bytes)
* frame size should be AUDIO_FRAME_SIZE.
2014-02-16 04:29:41 +08:00
* @return int
* @retval 0 Success.
* @retval ToxAvError On error.
*/
int toxav_send_audio ( ToxAv *av, int32_t call_index, const uint8_t *frame, int frame_size);
2014-02-10 06:06:44 +08:00
2014-05-11 00:00:49 +08:00
/**
* @brief Encode video frame
*
2014-05-11 00:00:49 +08:00
* @param av Handler
* @param dest Where to
* @param dest_max Max size
* @param input What to encode
* @return int
* @retval ToxAvError On error.
* @retval >0 On success
*/
int toxav_prepare_video_frame ( ToxAv *av, int32_t call_index, uint8_t *dest, int dest_max, vpx_image_t *input );
2014-05-03 07:46:03 +08:00
/**
* @brief Encode audio frame
*
2014-05-03 07:46:03 +08:00
* @param av Handler
* @param dest dest
* @param dest_max Max dest size
* @param frame The frame
* @param frame_size The frame size
* @return int
* @retval ToxAvError On error.
* @retval >0 On success
*/
int toxav_prepare_audio_frame ( ToxAv *av, int32_t call_index, uint8_t *dest, int dest_max, const int16_t *frame,
int frame_size);
2014-02-10 06:06:44 +08:00
2014-02-16 04:29:41 +08:00
/**
* @brief Get peer transmission type. It can either be audio or video.
2014-02-17 09:01:30 +08:00
*
2014-02-16 04:29:41 +08:00
* @param av Handler.
* @param peer The peer
* @return int
* @retval ToxAvCallType On success.
* @retval ToxAvError On error.
*/
int toxav_get_peer_transmission_type ( ToxAv *av, int32_t call_index, int peer );
2014-02-16 04:29:41 +08:00
/**
* @brief Get id of peer participating in conversation
*
* @param av Handler
* @param peer peer index
* @return int
* @retval ToxAvError No peer id
*/
int toxav_get_peer_id ( ToxAv *av, int32_t call_index, int peer );
2014-07-05 00:16:53 +08:00
/**
* @brief Get current call state
*
* @param av Handler
* @param call_index What call
* @return int
* @retval ToxAvCallState State id
*/
ToxAvCallState toxav_get_call_state ( ToxAv *av, int32_t call_index );
2014-02-16 04:29:41 +08:00
/**
* @brief Is certain capability supported
*
* @param av Handler
* @return int
* @retval 1 Yes.
* @retval 0 No.
*/
int toxav_capability_supported ( ToxAv *av, int32_t call_index, ToxAvCapabilities capability );
/**
2014-05-03 07:46:03 +08:00
* @brief Set queue limit
*
2014-05-03 07:46:03 +08:00
* @param av Handler
* @param call_index index
* @param limit the limit
* @return void
*/
int toxav_set_audio_queue_limit ( ToxAv *av, int32_t call_index, uint64_t limit );
2014-05-03 07:46:03 +08:00
/**
* @brief Set queue limit
*
2014-05-03 07:46:03 +08:00
* @param av Handler
* @param call_index index
* @param limit the limit
* @return void
*/
int toxav_set_video_queue_limit ( ToxAv *av, int32_t call_index, uint64_t limit );
Tox *toxav_get_tox(ToxAv *av);
2014-06-19 05:52:34 +08:00
int toxav_has_activity ( ToxAv *av, int32_t call_index, int16_t *PCM, uint16_t frame_size, float ref_energy );
2014-06-21 07:58:55 +08:00
2014-06-19 05:52:34 +08:00
#ifdef __cplusplus
}
#endif
2014-02-10 06:06:44 +08:00
#endif /* __TOXAV */