/** media.h * * Audio and video codec intitialization, encoding/decoding and playback * * 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 _CODEC_H_ #define _CODEC_H_ #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 typedef enum _Capabilities { none, a_encoding = 1 << 0, a_decoding = 1 << 1, v_encoding = 1 << 2, v_decoding = 1 << 3 } Capabilities; extern const uint16_t min_jbuf_size; typedef struct _CodecState { /* video encoding */ vpx_codec_ctx_t v_encoder; uint32_t frame_counter; /* video decoding */ vpx_codec_ctx_t v_decoder; /* audio encoding */ OpusEncoder *audio_encoder; int audio_bitrate; int audio_sample_rate; /* audio decoding */ OpusDecoder *audio_decoder; uint64_t capabilities; /* supports*/ /* Voice activity detection */ uint32_t EVAD_tolerance; /* In frames */ uint32_t EVAD_tolerance_cr; } CodecState; typedef struct _JitterBuffer { RTPMessage **queue; uint16_t capacity; uint16_t size; uint16_t front; uint16_t rear; uint8_t queue_ready; uint16_t current_id; uint32_t current_ts; uint8_t id_set; } JitterBuffer; JitterBuffer *create_queue(int capacity); void terminate_queue(JitterBuffer *q); void queue(JitterBuffer *q, RTPMessage *pk); RTPMessage *dequeue(JitterBuffer *q, int *success); CodecState *codec_init_session ( uint32_t audio_bitrate, uint16_t audio_frame_duration, uint32_t audio_sample_rate, uint32_t audio_channels, uint32_t audio_VAD_tolerance_ms, uint16_t video_width, uint16_t video_height, uint32_t video_bitrate); void codec_terminate_session(CodecState *cs); /* Calculate energy and return 1 if has voice, 0 if not */ int energy_VAD(CodecState *cs, int16_t* PCM, uint16_t frame_size, float energy); #endif /* _CODEC_H_ */