/** codec.h * * Copyright (C) 2013-2015 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 CODEC_H #define CODEC_H #include "toxav.h" #include "rtp.h" #include #include #include #include #include #include #include #include #define VIDEO_CODEC_DECODER_INTERFACE (vpx_codec_vp8_dx()) #define VIDEO_CODEC_ENCODER_INTERFACE (vpx_codec_vp8_cx()) /* Audio encoding/decoding */ #include #define PAIR(TYPE1__, TYPE2__) struct { TYPE1__ first; TYPE2__ second; } typedef void (*CSAudioCallback) (void *agent, int32_t call_idx, const int16_t *PCM, uint16_t size, void *data); typedef void (*CSVideoCallback) (void *agent, int32_t call_idx, const vpx_image_t *img, void *data); /** * Codec capabilities */ typedef enum { cs_AudioEncoding = 1 << 0, cs_AudioDecoding = 1 << 1, cs_VideoEncoding = 1 << 2, cs_VideoDecoding = 1 << 3 } CSCapabilities; /** * Codec errors. */ typedef enum { cs_ErrorSettingVideoResolution = -30, cs_ErrorSettingVideoBitrate = -31, cs_ErrorSplittingVideoPayload = -32, } CSError; /** * Codec session - controling codec */ typedef struct CSSession_s { /* VIDEO * * */ /* video encoding */ vpx_codec_ctx_t v_encoder[1]; bool v_encoding; uint32_t frame_counter; /* video decoding */ vpx_codec_ctx_t v_decoder[1]; bool v_decoding; void *vbuf_raw; /* Un-decoded data */ /* Data handling */ uint8_t *frame_buf; /* buffer for split video payloads */ uint32_t frame_size; /* largest address written to in frame_buf for current input frame */ uint8_t frameid_in, frameid_out; /* id of input and output video frame */ uint32_t last_timestamp; /* calculating cycles */ /* Limits */ uint32_t peer_video_frame_piece_size; /* Splitting */ uint8_t *split_video_frame; const uint8_t *processing_video_frame; uint16_t processing_video_frame_size; /* AUDIO * * */ /* audio encoding */ OpusEncoder *audio_encoder; int32_t encoder_channels; int32_t encoder_sample_rate; /* audio decoding */ OpusDecoder *audio_decoder; int32_t decoder_channels; int32_t decoder_sample_rate; int32_t last_pack_channels; int32_t last_packet_sampling_rate; int32_t last_packet_frame_duration; struct JitterBuffer_s *j_buf; /* Voice activity detection */ uint32_t EVAD_tolerance; /* In frames */ uint32_t EVAD_tolerance_cr; /* OTHER * * */ void *agent; /* Pointer to ToxAV TODO make this pointer to ToxAV*/ int32_t friend_id; PAIR(toxav_receive_audio_frame_cb *, void *) acb; /* Audio frame receive callback */ PAIR(toxav_receive_video_frame_cb *, void *) vcb; /* Video frame receive callback */ pthread_mutex_t queue_mutex[1]; } CSSession; /** * Generic */ void cs_do(CSSession *cs); /* Make sure to be called BEFORE corresponding rtp_new */ CSSession *cs_new(uint32_t peer_mvfpsz); /* Make sure to be called AFTER corresponding rtp_kill */ void cs_kill(CSSession *cs); /** * VIDEO HANDLING */ void cs_init_video_splitter_cycle(CSSession *cs); int cs_update_video_splitter_cycle(CSSession* cs, const uint8_t* payload, uint16_t length); const uint8_t *cs_iterate_split_video_frame(CSSession *cs, uint16_t *size); int cs_set_sending_video_resolution(CSSession *cs, uint16_t width, uint16_t height); int cs_set_sending_video_bitrate(CSSession *cs, uint32_t bitrate); int cs_enable_video_sending(CSSession* cs, uint32_t bitrate); int cs_enable_video_receiving(CSSession* cs); void cs_disable_video_sending(CSSession* cs); void cs_disable_video_receiving(CSSession* cs); /** * AUDIO HANDLING */ int cs_set_sending_audio_bitrate(CSSession* cs, int32_t rate); int cs_set_sending_audio_sampling_rate(CSSession* cs, int32_t rate); int cs_set_sending_audio_channels(CSSession* cs, int32_t count); int cs_enable_audio_sending(CSSession* cs, uint32_t bitrate, int channels); int cs_enable_audio_receiving(CSSession* cs); void cs_disable_audio_sending(CSSession* cs); void cs_disable_audio_receiving(CSSession* cs); /* Internal. Called from rtp_handle_message */ void queue_message(RTPSession *session, RTPMessage *msg); #endif /* CODEC_H */