summaryrefslogtreecommitdiff
path: root/protocols/Tox/include/toxav.h
diff options
context:
space:
mode:
authorAlexander Lantsev <aunsane@gmail.com>2015-01-03 08:12:27 +0000
committerAlexander Lantsev <aunsane@gmail.com>2015-01-03 08:12:27 +0000
commitf1f8a71bd4df7f239e28a9625b82ee02428c3f3f (patch)
tree9bfbccff9826c0cb530805eec4373a1365122201 /protocols/Tox/include/toxav.h
parentc42d4e21629ebefaf5a720c5270e77187edfc720 (diff)
Tox: work commit
- removed *.lib and lib generator - disabled profile encryption and import - loading tox profile on connection - project reordering - http proxy support git-svn-id: http://svn.miranda-ng.org/main/trunk@11730 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c
Diffstat (limited to 'protocols/Tox/include/toxav.h')
-rw-r--r--protocols/Tox/include/toxav.h329
1 files changed, 329 insertions, 0 deletions
diff --git a/protocols/Tox/include/toxav.h b/protocols/Tox/include/toxav.h
new file mode 100644
index 0000000000..3696f96199
--- /dev/null
+++ b/protocols/Tox/include/toxav.h
@@ -0,0 +1,329 @@
+/** 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 <http://www.gnu.org/licenses/>.
+ *
+ */
+
+
+#ifndef __TOXAV
+#define __TOXAV
+#include <inttypes.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct _ToxAv ToxAv;
+
+/* vpx_image_t */
+#include <vpx/vpx_image.h>
+
+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 */